121 lines
4.6 KiB
PHP
121 lines
4.6 KiB
PHP
<script type="text/javascript">
|
||
(function (window, $) {
|
||
if (window.MmCalendarPersian) {
|
||
return;
|
||
}
|
||
|
||
var jalaliMonthNames = ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'];
|
||
var persianDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
|
||
var arabicDigits = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];
|
||
|
||
function toEnglishDigits(value) {
|
||
value = String(value || '');
|
||
for (var i = 0; i < 10; i++) {
|
||
value = value.replace(new RegExp(persianDigits[i], 'g'), String(i));
|
||
value = value.replace(new RegExp(arabicDigits[i], 'g'), String(i));
|
||
}
|
||
return value;
|
||
}
|
||
|
||
function gregorianToJalaliParts(gy, gm, gd) {
|
||
var gdm = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
|
||
var gy2 = (gm > 2) ? (gy + 1) : gy;
|
||
var days = 355666 + (365 * gy) + Math.floor((gy2 + 3) / 4) - Math.floor((gy2 + 99) / 100) + Math.floor((gy2 + 399) / 400) + gd + gdm[gm - 1];
|
||
var jy = -1595 + (33 * Math.floor(days / 12053));
|
||
days %= 12053;
|
||
jy += 4 * Math.floor(days / 1461);
|
||
days %= 1461;
|
||
if (days > 365) {
|
||
jy += Math.floor((days - 1) / 365);
|
||
days = (days - 1) % 365;
|
||
}
|
||
var jm, jd;
|
||
if (days < 186) {
|
||
jm = 1 + Math.floor(days / 31);
|
||
jd = 1 + (days % 31);
|
||
} else {
|
||
jm = 7 + Math.floor((days - 186) / 30);
|
||
jd = 1 + ((days - 186) % 30);
|
||
}
|
||
return { jy: jy, jm: jm, jd: jd };
|
||
}
|
||
|
||
function jalaliPartsFromMoment(m) {
|
||
return gregorianToJalaliParts(
|
||
parseInt(m.format('YYYY'), 10),
|
||
parseInt(m.format('M'), 10),
|
||
parseInt(m.format('D'), 10)
|
||
);
|
||
}
|
||
|
||
function toPersianDigits(value) {
|
||
if (typeof persian_number === 'function') {
|
||
return persian_number(value);
|
||
}
|
||
return value;
|
||
}
|
||
|
||
function monthName(jm) {
|
||
var idx = parseInt(jm, 10);
|
||
return (idx >= 1 && idx <= 12) ? jalaliMonthNames[idx - 1] : 'ماه';
|
||
}
|
||
|
||
function titleForView($cal, view) {
|
||
var start = view.intervalStart ? view.intervalStart.clone() : view.start.clone();
|
||
var end = view.intervalEnd ? view.intervalEnd.clone().subtract(1, 'day') : view.end.clone().subtract(1, 'day');
|
||
var sj = jalaliPartsFromMoment(start);
|
||
var ej = jalaliPartsFromMoment(end);
|
||
|
||
if (view.name === 'month') {
|
||
var anchor = $cal.fullCalendar('getDate');
|
||
if (anchor && anchor.isValid && anchor.isValid()) {
|
||
sj = jalaliPartsFromMoment(anchor.clone());
|
||
}
|
||
return toPersianDigits(monthName(sj.jm) + ' ' + sj.jy);
|
||
}
|
||
if (view.name === 'agendaWeek') {
|
||
if (sj.jy === ej.jy && sj.jm === ej.jm) {
|
||
return toPersianDigits(sj.jd + ' - ' + ej.jd + ' ' + monthName(ej.jm) + ' ' + ej.jy);
|
||
}
|
||
return toPersianDigits(sj.jd + ' ' + monthName(sj.jm) + ' ' + sj.jy + ' - ' + ej.jd + ' ' + monthName(ej.jm) + ' ' + ej.jy);
|
||
}
|
||
return toPersianDigits(sj.jd + ' ' + monthName(sj.jm) + ' ' + sj.jy);
|
||
}
|
||
|
||
window.MmCalendarPersian = {
|
||
patch: function (selector) {
|
||
var $cal = $(selector);
|
||
if (!$cal.length) return;
|
||
var view = $cal.fullCalendar('getView');
|
||
if (!view) return;
|
||
|
||
var customTitle = titleForView($cal, view);
|
||
if (customTitle) {
|
||
$cal.find('.fc-toolbar .fc-center h2, .fc-center h2').text(customTitle);
|
||
}
|
||
|
||
$cal.find('.fc-day-top[data-date]').each(function () {
|
||
var dateValue = $(this).attr('data-date');
|
||
if (!dateValue) return;
|
||
var m = moment(dateValue, 'YYYY-MM-DD');
|
||
if (!m.isValid()) return;
|
||
var j = jalaliPartsFromMoment(m);
|
||
$(this).find('.fc-day-number').text(toPersianDigits(j.jd));
|
||
});
|
||
},
|
||
bind: function (selector) {
|
||
var $cal = $(selector);
|
||
if (!$cal.length) return;
|
||
|
||
var refresh = function () {
|
||
setTimeout(function () { window.MmCalendarPersian.patch(selector); }, 0);
|
||
};
|
||
|
||
$cal.on('viewRender eventAfterAllRender', refresh);
|
||
$(document).on('click', selector + ' .fc-prev-button, ' + selector + ' .fc-next-button, ' + selector + ' .fc-today-button, ' + selector + ' .fc-month-button, ' + selector + ' .fc-agendaWeek-button', refresh);
|
||
refresh();
|
||
}
|
||
};
|
||
})(window, jQuery);
|
||
</script>
|