/**
* jCalendar 0.5
*
* Some code based on jQuery Date Picker (http://kelvinluck.com/assets/jquery/datePicker/)
*
* Copyright (c) 2007 Theodore Serbinski (http://tedserbinski.com)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*/
jQuery.jcalendar = function() {
var months = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
var days = ['Вс.', 'Пн.', 'Вт.', 'Ср.', 'Чт.', 'Пт.', 'Сб.'];
var navLinks = {t:'Сегодня'};
var _firstDayOfWeek;
var _firstDate;
var _lastDate;
var _drawCalendar = function(dateIn, a, day, month, year) {
var today = new Date();
var d;
var emptyT = '
| ';
var emptyTc = ' | ';
if (dateIn == undefined) {
// start from this month.
d = new Date(today.getFullYear(), today.getMonth(), 1);
}
else {
d = dateIn;
d.setDate(1);
}
// check that date is within allowed limits
if ((d.getMonth() < _firstDate.getMonth() && d.getFullYear() == _firstDate.getFullYear()) || d.getFullYear() < _firstDate.getFullYear()) {
d = new Date(_firstDate.getFullYear(), _firstDate.getMonth(), 1);
}
else if ((d.getMonth() > _lastDate.getMonth() && d.getFullYear() == _lastDate.getFullYear()) || d.getFullYear() > _lastDate.getFullYear()) {
d = new Date(_lastDate.getFullYear(), _lastDate.getMonth(), 1);
}
var firstMonth = true;
var firstDate = _firstDate.getDate();
// create prev and next links
if (!(d.getMonth() == _firstDate.getMonth() && d.getFullYear() == _firstDate.getFullYear())) {
// not in first display month so show a previous link
firstMonth = false;
var prevMonthLinkVal = d.getMonth() ? d.getMonth() - 1 : 11;
var lastMonth = d.getMonth() == 0 ? new Date(d.getFullYear()-1, 11, 1) : new Date(d.getFullYear(), d.getMonth()-1, 1);
var prevLink = jQuery('' + months[prevMonthLinkVal] + ' | ').click(function() {
jQuery.jcalendar.changeMonth(lastMonth, this, day, month, year);
return false;
});
var cPrevYear = prevMonthLinkVal == 11 ? d.getFullYear()-1:d.getFullYear();
if((eventsObj[parseInt(cPrevYear)] == undefined || eventsObj[parseInt(cPrevYear)] != undefined) &&
eventsObj[parseInt(cPrevYear)][parseInt(prevMonthLinkVal+1)] == undefined) {
$('a', prevLink).addClass("notactive");
}
} else {
prevLink = emptyTc;
}
var finalMonth = true;
var lastDate = _lastDate.getDate();
if (!(d.getMonth() == _lastDate.getMonth() && d.getFullYear() == _lastDate.getFullYear())) {
// in the last month - no next link
finalMonth = false;
var nextMonth = new Date(d.getFullYear(), d.getMonth()+1, 1);
var nextMonthLinkVal = (d.getMonth()+1)%12;
var nextLink = jQuery(''+ months[nextMonthLinkVal] + ' | ').click(function() {
jQuery.jcalendar.changeMonth(nextMonth, this, day, month, year);
return false;
});
var cNextYear = nextMonthLinkVal == 0 ? d.getFullYear()+1:d.getFullYear();
if((eventsObj[parseInt(cNextYear)] == undefined || eventsObj[parseInt(cNextYear)] != undefined) &&
eventsObj[parseInt(cNextYear)][parseInt(nextMonthLinkVal+1)] == undefined) {
$('a', nextLink).addClass("notactive");
}
} else {
nextLink = emptyTc;
}
var tBody = jQuery("");
var lastDay = (new Date(d.getFullYear(), d.getMonth()+1, 0)).getDate();
var curDay = _firstDayOfWeek - d.getDay();
if (curDay > 0) curDay -= 7;
var todayDate = today.getDate();
var thisMonth = d.getMonth() == today.getMonth() && d.getFullYear() == today.getFullYear();
do {
var thisRow = jQuery("
");
for (var i=0; i<7; i++) {
var weekday = (_firstDayOfWeek + i) % 7;
var atts = {'class':(weekday == 0 || weekday == 6 ? 'weekend ' : 'weekday ')};
if (curDay < 0 || curDay >= lastDay) {
dayStr = ' ';
}
else if (firstMonth && curDay < firstDate-1) {
dayStr = curDay+1;
atts['class'] += 'inactive';
}
else if (finalMonth && curDay > lastDate-1) {
dayStr = curDay+1;
atts['class'] += 'inactive';
}
else {
d.setDate(curDay+1);
if(eventsObj[parseInt(d.getFullYear())] != undefined &&
eventsObj[parseInt(d.getFullYear())][parseInt(d.getMonth()+1)] != undefined &&
eventsObj[parseInt(d.getFullYear())][parseInt(d.getMonth()+1)][curDay+1] != undefined) {
dayStr = jQuery(''+ (curDay+1) +'');
} else {
dayStr = jQuery(''+ (curDay+1) +'');
}
}
if (thisMonth && curDay+1 == todayDate) {
atts['class'] += 'today';
}
thisRow.append(jQuery(" | ").attr(atts).append(dayStr));
curDay++;
}
thisRow.append(emptyT);
tBody.append(thisRow);
} while (curDay < lastDay);
var todayLinkVal = '' + months[d.getMonth()] +' '+ d.getFullYear();
var tFoot = jQuery("");
var tFootRow = jQuery("
").append(prevLink).append(nextLink);
tFoot.append(tFootRow);
jQuery('div.jcalendar').html('');
jQuery('div.jcalendar .cur-month').append(todayLinkVal);
jQuery('div.jcalendar table').append(tFoot,tBody);
};
return {
show: function(a) {
_firstDate = a._startDate;
_lastDate = a._endDate;
_firstDayOfWeek = a._firstDayOfWeek;
// pass in the selected form date if one was set
var selected;
_drawCalendar(selected, a);
},
changeMonth: function(d, e) {
_drawCalendar(d, e);
},
setLanguageStrings: function(aDays, aMonths, aNavLinks) {
days = aDays;
months = aMonths;
navLinks = aNavLinks;
},
setDateWindow: function(i, w) {
if (w == undefined) w = {};
dateParts = w.startDate.split('-');
i._startDate = new Date(dateParts[2], Number(dateParts[1])-1, Number(dateParts[0]));
dateParts = w.endDate.split('-');
i._endDate = new Date(dateParts[2], Number(dateParts[1])-1, Number(dateParts[0]));
i._firstDayOfWeek = w.firstDayOfWeek == undefined ? 1 : w.firstDayOfWeek;
}
};
}();
jQuery.fn.jcalendar = function(a) {
this.each(function() {
$('div.jcalendar-selects').after('');
jQuery.jcalendar.setDateWindow(this, a);
jQuery.jcalendar.show(this);
});
return this;
};