/*! * FullCalendar * http://arshaw.com/fullcalendar/ * * use fullcalendar.css for basic styling * requires jQuery UI core and draggables ONLY if you plan to do drag & drop * * Copyright (c) 2009 Adam Shaw * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * Date: * Revision: */ (function($) { $.fn.fullCalendar = function(options) { // // Calls methods on a pre-existing instance // if (typeof options == 'string') { var args = Array.prototype.slice.call(arguments, 1); var res; this.each(function() { var r = $.data(this, 'fullCalendar')[options].apply(this, args); if (typeof res == 'undefined') res = r; }); if (typeof res != 'undefined') { return res; } return this; } // // Process options // options = options || {}; var r2l = options.rightToLeft; var dis, dit; // day index sign / translate if (r2l) { dis = -1; dit = 6; this.addClass('r2l'); }else{ dis = 1; dit = 0; } var showTime = typeof options.showTime == 'undefined' ? 'guess' : options.showTime; var bo = typeof options.buttons == 'undefined' ? true : options.buttons; var weekStart = (options.weekStart || 0) % 7; var timeFormat = options.timeFormat || 'gx'; var titleFormat = options.titleFormat || (r2l ? 'Y F' : 'F Y'); // // Rendering bug detection variables // var tdTopBug, trTopBug, tbodyTopBug, sniffBugs = true; this.each(function() { // // Instance variables // var date = options.year ? // holds the year & month of current month new Date(options.year, options.month || 0, 1) : new Date(); var start, end; // first & last VISIBLE dates var today; var numWeeks; var ignoreResizes = false; var events = []; var eventSources = options.eventSources || []; if (options.events) eventSources.push(options.events); // // Month navigation functions // function refreshMonth() { clearEventElements(); render(); } function prevMonth() { addMonths(date, -1); refreshMonth(); } function nextMonth() { addMonths(date, 1); refreshMonth(); } function gotoToday() { date = new Date(); refreshMonth(); } function gotoMonth(year, month) { date = new Date(year, month, 1); refreshMonth(); } function prevYear() { addYears(date, -1); refreshMonth(); } function nextYear() { addYears(date, 1); refreshMonth(); } // // Publicly accessible methods // $.data(this, 'fullCalendar', { refresh: refreshMonth, prevMonth: prevMonth, nextMonth: nextMonth, today: gotoToday, gotoMonth: gotoMonth, prevYear: prevYear, nextYear: nextYear, // // Event CRUD // addEvent: function(event) { events.push(normalizeEvent(event)); clearEventElements(); renderEvents(); }, updateEvent: function(event) { event.start = $.fullCalendar.parseDate(event.start); event.end = $.fullCalendar.parseDate(event.end); var startDelta = event.start - event._start; var msLength = event.end - event.start; event._start = cloneDate(event.start); for (var i=0; i").appendTo(this); if (bo) { // "button options" var buttons = $("
").appendTo(header); if (bo == true || bo.today !== false) { todayButton = $("