/** * 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; };