!(function (t, e, n, a) {
"use strict";
var s = "simpleCalendar",
i = {
months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
days: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
displayYear: !0,
fixedStartDay: !0,
displayEvent: !0,
disableEventDetails: !1,
disableEmptyDetails: !1,
events: [],
onInit: function (t) {},
onMonthChange: function (t, e) {},
onDateSelect: function (t, e) {},
onEventSelect: function () {},
onEventCreate: function (t) {},
onDayCreate: function (t, e, n, a) {},
};
function d(e, n) {
(this.element = e), (this.settings = t.extend({}, i, n)), (this._defaults = i), (this._name = s), (this.currentDate = new Date()), this.init();
}
t.extend(d.prototype, {
init: function () {
var e = t(this.element),
n = this.currentDate,
a = t('
'),
s = t('');
this.updateHeader(n, s), a.append(s), this.buildCalendar(n, a), e.append(a), this.bindEvents(), this.settings.onInit(this);
},
updateHeader: function (t, e) {
var n = this.settings.months[t.getMonth()];
(n += this.settings.displayYear ? ' ' + t.getFullYear() : "
"), e.find(".month").html(n);
},
buildCalendar: function (e, n) {
var a = this;
n.find("table").remove();
var s = t(""),
i = t(""),
d = t(""),
r = e.getFullYear(),
h = e.getMonth(),
o = new Date(r, h, 1),
l = new Date(r, h + 1, 0),
c = o.getDay();
if (!1 !== this.settings.fixedStartDay) {
for (c = !0 === this.settings.fixedStartDay ? 1 : this.settings.fixedStartDay; o.getDay() !== c; ) o.setDate(o.getDate() - 1);
for (; l.getDay() !== (c + 6) % 7; ) l.setDate(l.getDate() + 1);
}
for (var v = c; v < c + 7; v++) i.append(t("" + this.settings.days[v % 7].substring(0, 3) + " | "));
for (var u = o; u <= l; u.setDate(u.getDate())) {
var f = t("
");
for (v = 0; v < 7; v++) {
var g = t('' + u.getDate() + " | "),
D = g.find(".day");
u.toDateString() === new Date().toDateString() && D.addClass("today"), u.getMonth() != e.getMonth() && D.addClass("wrong-month");
var p = a.getDateEvents(u);
p.length && a.settings.displayEvent ? D.addClass(a.settings.disableEventDetails ? "has-event disabled" : "has-event") : D.addClass(a.settings.disableEmptyDetails ? "disabled" : ""),
D.data("todayEvents", p),
this.settings.onDayCreate(D, u.getDate(), h, r),
f.append(g),
u.setDate(u.getDate() + 1);
}
d.append(f);
}
s.append(i), s.append(d);
var y = t('');
n.append(s), n.append(y);
},
changeMonth: function (e) {
this.currentDate.setMonth(this.currentDate.getMonth() + e, 1),
this.buildCalendar(this.currentDate, t(this.element).find(".calendar")),
this.updateHeader(this.currentDate, t(this.element).find(".calendar header")),
this.settings.onMonthChange(this.currentDate.getMonth(), this.currentDate.getFullYear());
},
bindEvents: function () {
var e = this;
t(e.element).off(),
t(e.element).on("click", ".btn-prev", function (t) {
e.changeMonth(-1), t.preventDefault();
}),
t(e.element).on("click", ".btn-next", function (t) {
e.changeMonth(1), t.preventDefault();
}),
t(e.element).on("click", ".day", function (n) {
var a = new Date(t(this).data("date")),
s = e.getDateEvents(a);
t(this).hasClass("disabled") || (e.fillUp(n.pageX, n.pageY), e.displayEvents(s)), e.settings.onDateSelect(a, s);
}),
t(e.element).on("click", ".event-container .close", function (t) {
e.empty(t.pageX, t.pageY);
});
},
displayEvents: function (e) {
var n = this,
a = t(this.element).find(".event-wrapper");
e.forEach(function (e) {
var s = new Date(e.startDate),
i = new Date(e.endDate),
d = t(
' ' +
n.formatDateEvent(s, i) +
'
' +
s.getHours() +
":" +
(s.getMinutes() < 10 ? "0" : "") +
s.getMinutes() +
'
' +
e.summary +
"
"
);
d.data("event", e), d.click(n.settings.onEventSelect), n.settings.onEventCreate(d), a.append(d);
});
},
addEvent: function (e) {
(this.settings.events = [...this.settings.events, e]), this.buildCalendar(this.currentDate, t(this.element).find(".calendar"));
},
setEvents: function (e) {
(this.settings.events = e), this.buildCalendar(this.currentDate, t(this.element).find(".calendar"));
},
fillUp: function (e, n) {
var a = t(this.element),
s = a.offset(),
i = t('');
i.css("left", e - s.left),
i.css("top", n - s.top),
a.find(".calendar").append(i),
i.animate({ width: "300%", height: "300%" }, 500, function () {
a.find(".event-container").show(), i.hide();
});
},
empty: function (e, n) {
var a = t(this.element),
s = (a.offset(), a.find(".filler"));
s.css("width", "300%"),
s.css("height", "300%"),
s.show(),
a.find(".event-container").hide().find(".event").remove(),
s.animate({ width: "0%", height: "0%" }, 500, function () {
s.remove();
});
},
getDateEvents: function (t) {
var e = this;
return e.settings.events.filter(function (n) {
return e.isDayBetween(new Date(t), new Date(n.startDate), new Date(n.endDate));
});
},
isDayBetween: function (t, e, n) {
return e.setHours(0, 0, 0), n.setHours(23, 59, 59, 999), t.setHours(12, 0, 0), e <= t && t <= n;
},
formatDateEvent: function (t, e) {
var n = "";
return (
(n += this.settings.days[t.getDay()] + " - " + t.getDate() + " " + this.settings.months[t.getMonth()].substring(0, 3)),
e.getDate() !== t.getDate() && (n += " to " + e.getDate() + " " + this.settings.months[e.getMonth()].substring(0, 3)),
n
);
},
}),
(t.fn[s] = function (e) {
return this.each(function () {
t.data(this, "plugin_" + s) || t.data(this, "plugin_" + s, new d(this, e));
});
});
})(jQuery, window, document);