From ea04fbf74564c78c0d8df42be68ce6b71ac6b0af Mon Sep 17 00:00:00 2001 From: sean kenny Date: Tue, 9 Sep 2014 11:54:32 +0100 Subject: [PATCH] . --- bower.json | 14 +- build/tasks/generateLanguages.js | 7 +- demos/json/events.json | 61 +- dist/cdnjs/2.1.1/fullcalendar.css | 933 ++ dist/cdnjs/2.1.1/fullcalendar.js | 8399 +++++++++++ dist/cdnjs/2.1.1/fullcalendar.min.css | 5 + dist/cdnjs/2.1.1/fullcalendar.min.js | 8 + dist/cdnjs/2.1.1/fullcalendar.print.css | 201 + dist/cdnjs/2.1.1/gcal.js | 100 + dist/cdnjs/2.1.1/lang-all.js | 3 + dist/cdnjs/2.1.1/lang/ar-ma.js | 1 + dist/cdnjs/2.1.1/lang/ar-sa.js | 1 + dist/cdnjs/2.1.1/lang/ar.js | 1 + dist/cdnjs/2.1.1/lang/bg.js | 1 + dist/cdnjs/2.1.1/lang/ca.js | 1 + dist/cdnjs/2.1.1/lang/cs.js | 1 + dist/cdnjs/2.1.1/lang/da.js | 1 + dist/cdnjs/2.1.1/lang/de-at.js | 1 + dist/cdnjs/2.1.1/lang/de.js | 1 + dist/cdnjs/2.1.1/lang/el.js | 1 + dist/cdnjs/2.1.1/lang/en-au.js | 1 + dist/cdnjs/2.1.1/lang/en-ca.js | 1 + dist/cdnjs/2.1.1/lang/en-gb.js | 1 + dist/cdnjs/2.1.1/lang/es.js | 1 + dist/cdnjs/2.1.1/lang/fa.js | 1 + dist/cdnjs/2.1.1/lang/fi.js | 1 + dist/cdnjs/2.1.1/lang/fr-ca.js | 1 + dist/cdnjs/2.1.1/lang/fr.js | 1 + dist/cdnjs/2.1.1/lang/hi.js | 1 + dist/cdnjs/2.1.1/lang/hr.js | 1 + dist/cdnjs/2.1.1/lang/hu.js | 1 + dist/cdnjs/2.1.1/lang/id.js | 1 + dist/cdnjs/2.1.1/lang/is.js | 1 + dist/cdnjs/2.1.1/lang/it.js | 1 + dist/cdnjs/2.1.1/lang/ja.js | 1 + dist/cdnjs/2.1.1/lang/ko.js | 1 + dist/cdnjs/2.1.1/lang/lt.js | 1 + dist/cdnjs/2.1.1/lang/lv.js | 1 + dist/cdnjs/2.1.1/lang/nl.js | 1 + dist/cdnjs/2.1.1/lang/pl.js | 1 + dist/cdnjs/2.1.1/lang/pt-br.js | 1 + dist/cdnjs/2.1.1/lang/pt.js | 1 + dist/cdnjs/2.1.1/lang/ro.js | 1 + dist/cdnjs/2.1.1/lang/ru.js | 1 + dist/cdnjs/2.1.1/lang/sk.js | 1 + dist/cdnjs/2.1.1/lang/sl.js | 1 + dist/cdnjs/2.1.1/lang/sr-cyrl.js | 1 + dist/cdnjs/2.1.1/lang/sr.js | 1 + dist/cdnjs/2.1.1/lang/sv.js | 1 + dist/cdnjs/2.1.1/lang/th.js | 1 + dist/cdnjs/2.1.1/lang/tr.js | 1 + dist/cdnjs/2.1.1/lang/uk.js | 1 + dist/cdnjs/2.1.1/lang/vi.js | 1 + dist/cdnjs/2.1.1/lang/zh-cn.js | 1 + dist/cdnjs/2.1.1/lang/zh-tw.js | 1 + dist/cdnjs/package.json | 34 + dist/fullcalendar-2.1.1.zip | Bin 0 -> 336134 bytes dist/fullcalendar.css | 1866 +-- dist/fullcalendar.js | 16788 +++++++++++----------- dist/fullcalendar.min.css | 8 +- dist/fullcalendar.min.js | 4 +- dist/fullcalendar.print.css | 402 +- dist/gcal.js | 200 +- dist/lang-all.js | 4 +- dist/lang/ar.js | 2 +- dist/lang/cs.js | 2 +- dist/lang/el.js | 2 +- dist/lang/es.js | 2 +- dist/lang/ko.js | 2 +- dist/lang/pl.js | 2 +- dist/lang/sr-cyrl.js | 2 +- 71 files changed, 19378 insertions(+), 9718 deletions(-) create mode 100644 dist/cdnjs/2.1.1/fullcalendar.css create mode 100644 dist/cdnjs/2.1.1/fullcalendar.js create mode 100644 dist/cdnjs/2.1.1/fullcalendar.min.css create mode 100644 dist/cdnjs/2.1.1/fullcalendar.min.js create mode 100644 dist/cdnjs/2.1.1/fullcalendar.print.css create mode 100644 dist/cdnjs/2.1.1/gcal.js create mode 100644 dist/cdnjs/2.1.1/lang-all.js create mode 100644 dist/cdnjs/2.1.1/lang/ar-ma.js create mode 100644 dist/cdnjs/2.1.1/lang/ar-sa.js create mode 100644 dist/cdnjs/2.1.1/lang/ar.js create mode 100644 dist/cdnjs/2.1.1/lang/bg.js create mode 100644 dist/cdnjs/2.1.1/lang/ca.js create mode 100644 dist/cdnjs/2.1.1/lang/cs.js create mode 100644 dist/cdnjs/2.1.1/lang/da.js create mode 100644 dist/cdnjs/2.1.1/lang/de-at.js create mode 100644 dist/cdnjs/2.1.1/lang/de.js create mode 100644 dist/cdnjs/2.1.1/lang/el.js create mode 100644 dist/cdnjs/2.1.1/lang/en-au.js create mode 100644 dist/cdnjs/2.1.1/lang/en-ca.js create mode 100644 dist/cdnjs/2.1.1/lang/en-gb.js create mode 100644 dist/cdnjs/2.1.1/lang/es.js create mode 100644 dist/cdnjs/2.1.1/lang/fa.js create mode 100644 dist/cdnjs/2.1.1/lang/fi.js create mode 100644 dist/cdnjs/2.1.1/lang/fr-ca.js create mode 100644 dist/cdnjs/2.1.1/lang/fr.js create mode 100644 dist/cdnjs/2.1.1/lang/hi.js create mode 100644 dist/cdnjs/2.1.1/lang/hr.js create mode 100644 dist/cdnjs/2.1.1/lang/hu.js create mode 100644 dist/cdnjs/2.1.1/lang/id.js create mode 100644 dist/cdnjs/2.1.1/lang/is.js create mode 100644 dist/cdnjs/2.1.1/lang/it.js create mode 100644 dist/cdnjs/2.1.1/lang/ja.js create mode 100644 dist/cdnjs/2.1.1/lang/ko.js create mode 100644 dist/cdnjs/2.1.1/lang/lt.js create mode 100644 dist/cdnjs/2.1.1/lang/lv.js create mode 100644 dist/cdnjs/2.1.1/lang/nl.js create mode 100644 dist/cdnjs/2.1.1/lang/pl.js create mode 100644 dist/cdnjs/2.1.1/lang/pt-br.js create mode 100644 dist/cdnjs/2.1.1/lang/pt.js create mode 100644 dist/cdnjs/2.1.1/lang/ro.js create mode 100644 dist/cdnjs/2.1.1/lang/ru.js create mode 100644 dist/cdnjs/2.1.1/lang/sk.js create mode 100644 dist/cdnjs/2.1.1/lang/sl.js create mode 100644 dist/cdnjs/2.1.1/lang/sr-cyrl.js create mode 100644 dist/cdnjs/2.1.1/lang/sr.js create mode 100644 dist/cdnjs/2.1.1/lang/sv.js create mode 100644 dist/cdnjs/2.1.1/lang/th.js create mode 100644 dist/cdnjs/2.1.1/lang/tr.js create mode 100644 dist/cdnjs/2.1.1/lang/uk.js create mode 100644 dist/cdnjs/2.1.1/lang/vi.js create mode 100644 dist/cdnjs/2.1.1/lang/zh-cn.js create mode 100644 dist/cdnjs/2.1.1/lang/zh-tw.js create mode 100644 dist/cdnjs/package.json create mode 100644 dist/fullcalendar-2.1.1.zip diff --git a/bower.json b/bower.json index c68dc85..6278156 100644 --- a/bower.json +++ b/bower.json @@ -1,20 +1,12 @@ { "name": "fullcalendar", "version": "2.1.1", -<<<<<<< HEAD "description": "Full-sized drag & drop event calendar with resources", "keywords": [ "calendar", "event", "full-sized", "Resources" -======= - "description": "Full-sized drag & drop event calendar", - "keywords": [ - "calendar", - "event", - "full-sized" ->>>>>>> upstream/master ], "homepage": "http://arshaw.com/fullcalendar/", "dependencies": { @@ -43,8 +35,4 @@ "!/license.*", "!/readme.*" ] -<<<<<<< HEAD -} -======= -} ->>>>>>> upstream/master +} \ No newline at end of file diff --git a/build/tasks/generateLanguages.js b/build/tasks/generateLanguages.js index d234b0b..e77fa56 100644 --- a/build/tasks/generateLanguages.js +++ b/build/tasks/generateLanguages.js @@ -207,9 +207,4 @@ module.exports = function(grunt) { return js; } - -<<<<<<< HEAD -}; -======= -}; ->>>>>>> upstream/master +}; \ No newline at end of file diff --git a/demos/json/events.json b/demos/json/events.json index 25a2186..b1ff639 100644 --- a/demos/json/events.json +++ b/demos/json/events.json @@ -1,4 +1,3 @@ -<<<<<<< HEAD [{ "title": "R1-R2: Lunch 12.15-14.45", "start": "2014-08-19T12:15:00", @@ -33,62 +32,4 @@ "end": "2014-08-19T17:00:00-05:00", "allDay": false, "resources": "resource2" -}] -======= -[ - { - "title": "All Day Event", - "start": "2014-09-01" - }, - { - "title": "Long Event", - "start": "2014-09-07", - "end": "2014-09-10" - }, - { - "id": "999", - "title": "Repeating Event", - "start": "2014-09-09T16:00:00-05:00" - }, - { - "id": "999", - "title": "Repeating Event", - "start": "2014-09-16T16:00:00-05:00" - }, - { - "title": "Conference", - "start": "2014-09-11", - "end": "2014-09-13" - }, - { - "title": "Meeting", - "start": "2014-09-12T10:30:00-05:00", - "end": "2014-09-12T12:30:00-05:00" - }, - { - "title": "Lunch", - "start": "2014-09-12T12:00:00-05:00" - }, - { - "title": "Meeting", - "start": "2014-09-12T14:30:00-05:00" - }, - { - "title": "Happy Hour", - "start": "2014-09-12T17:30:00-05:00" - }, - { - "title": "Dinner", - "start": "2014-09-12T20:00:00" - }, - { - "title": "Birthday Party", - "start": "2014-09-13T07:00:00-05:00" - }, - { - "title": "Click for Google", - "url": "http://google.com/", - "start": "2014-09-28" - } -] ->>>>>>> upstream/master +}] \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/fullcalendar.css b/dist/cdnjs/2.1.1/fullcalendar.css new file mode 100644 index 0000000..ab8b6e6 --- /dev/null +++ b/dist/cdnjs/2.1.1/fullcalendar.css @@ -0,0 +1,933 @@ +/*! + * FullCalendar v2.1.1 Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + + +.fc { + direction: ltr; + text-align: left; +} + +.fc-rtl { + text-align: right; +} + +body .fc { /* extra precedence to overcome jqui */ + font-size: 1em; +} + + +/* Colors +--------------------------------------------------------------------------------------------------*/ + +.fc-unthemed th, +.fc-unthemed td, +.fc-unthemed hr, +.fc-unthemed thead, +.fc-unthemed tbody, +.fc-unthemed .fc-row, +.fc-unthemed .fc-popover { + border-color: #ddd; +} + +.fc-unthemed .fc-popover { + background-color: #fff; +} + +.fc-unthemed hr, +.fc-unthemed .fc-popover .fc-header { + background: #eee; +} + +.fc-unthemed .fc-popover .fc-header .fc-close { + color: #666; +} + +.fc-unthemed .fc-today { + background: #fcf8e3; +} + +.fc-highlight { /* when user is selecting cells */ + background: #bce8f1; + opacity: .3; + filter: alpha(opacity=30); /* for IE */ +} + + +/* Icons (inline elements with styled text that mock arrow icons) +--------------------------------------------------------------------------------------------------*/ + +.fc-icon { + display: inline-block; + font-size: 2em; + line-height: .5em; + height: .5em; /* will make the total height 1em */ + font-family: "Courier New", Courier, monospace; +} + +.fc-icon-left-single-arrow:after { + content: "\02039"; + font-weight: bold; +} + +.fc-icon-right-single-arrow:after { + content: "\0203A"; + font-weight: bold; +} + +.fc-icon-left-double-arrow:after { + content: "\000AB"; +} + +.fc-icon-right-double-arrow:after { + content: "\000BB"; +} + +.fc-icon-x:after { + content: "\000D7"; +} + + +/* Buttons (styled ' + ) + .click(function() { + // don't process clicks for disabled buttons + if (!button.hasClass(tm + '-state-disabled')) { + + buttonClick(); + + // after the click action, if the button becomes the "active" tab, or disabled, + // it should never have a hover class, so remove it now. + if ( + button.hasClass(tm + '-state-active') || + button.hasClass(tm + '-state-disabled') + ) { + button.removeClass(tm + '-state-hover'); + } + } + }) + .mousedown(function() { + // the *down* effect (mouse pressed in). + // only on buttons that are not the "active" tab, or disabled + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-down'); + }) + .mouseup(function() { + // undo the *down* effect + button.removeClass(tm + '-state-down'); + }) + .hover( + function() { + // the *hover* effect. + // only on buttons that are not the "active" tab, or disabled + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-hover'); + }, + function() { + // undo the *hover* effect + button + .removeClass(tm + '-state-hover') + .removeClass(tm + '-state-down'); // if mouseleave happens before mouseup + } + ); + + groupChildren = groupChildren.add(button); + } + } + }); + + if (isOnlyButtons) { + groupChildren + .first().addClass(tm + '-corner-left').end() + .last().addClass(tm + '-corner-right').end(); + } + + if (groupChildren.length > 1) { + groupEl = $('
'); + if (isOnlyButtons) { + groupEl.addClass('fc-button-group'); + } + groupEl.append(groupChildren); + sectionEl.append(groupEl); + } + else { + sectionEl.append(groupChildren); // 1 or 0 children + } + }); + } + + return sectionEl; + } + + + function updateTitle(text) { + el.find('h2').text(text); + } + + + function activateButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .addClass(tm + '-state-active'); + } + + + function deactivateButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .removeClass(tm + '-state-active'); + } + + + function disableButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .attr('disabled', 'disabled') + .addClass(tm + '-state-disabled'); + } + + + function enableButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .removeAttr('disabled') + .removeClass(tm + '-state-disabled'); + } + + + function getViewsWithButtons() { + return viewsWithButtons; + } + +} + +;; + +fc.sourceNormalizers = []; +fc.sourceFetchers = []; + +var ajaxDefaults = { + dataType: 'json', + cache: false +}; + +var eventGUID = 1; + + +function EventManager(options) { // assumed to be a calendar + var t = this; + + + // exports + t.isFetchNeeded = isFetchNeeded; + t.fetchEvents = fetchEvents; + t.addEventSource = addEventSource; + t.removeEventSource = removeEventSource; + t.updateEvent = updateEvent; + t.renderEvent = renderEvent; + t.removeEvents = removeEvents; + t.clientEvents = clientEvents; + t.mutateEvent = mutateEvent; + + + // imports + var trigger = t.trigger; + var getView = t.getView; + var reportEvents = t.reportEvents; + var getEventEnd = t.getEventEnd; + + + // locals + var stickySource = { events: [] }; + var sources = [ stickySource ]; + var rangeStart, rangeEnd; + var currentFetchID = 0; + var pendingSourceCnt = 0; + var loadingLevel = 0; + var cache = []; + + + $.each( + (options.events ? [ options.events ] : []).concat(options.eventSources || []), + function(i, sourceInput) { + var source = buildEventSource(sourceInput); + if (source) { + sources.push(source); + } + } + ); + + + + /* Fetching + -----------------------------------------------------------------------------*/ + + + function isFetchNeeded(start, end) { + return !rangeStart || // nothing has been fetched yet? + // or, a part of the new range is outside of the old range? (after normalizing) + start.clone().stripZone() < rangeStart.clone().stripZone() || + end.clone().stripZone() > rangeEnd.clone().stripZone(); + } + + + function fetchEvents(start, end) { + rangeStart = start; + rangeEnd = end; + cache = []; + var fetchID = ++currentFetchID; + var len = sources.length; + pendingSourceCnt = len; + for (var i=0; i cells, find the cell with the largest natural width and set the widths of all the +// cells to be that width. +// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline +function matchCellWidths(els) { + var maxInnerWidth = 0; + + els.find('> *').each(function(i, innerEl) { + var innerWidth = $(innerEl).outerWidth(); + if (innerWidth > maxInnerWidth) { + maxInnerWidth = innerWidth; + } + }); + + maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance + + els.width(maxInnerWidth); + + return maxInnerWidth; +} + + +// Turns a container element into a scroller if its contents is taller than the allotted height. +// Returns true if the element is now a scroller, false otherwise. +// NOTE: this method is best because it takes weird zooming dimensions into account +function setPotentialScroller(containerEl, height) { + containerEl.height(height).addClass('fc-scroller'); + + // are scrollbars needed? + if (containerEl[0].scrollHeight - 1 > containerEl[0].clientHeight) { // !!! -1 because IE is often off-by-one :( + return true; + } + + unsetScroller(containerEl); // undo + return false; +} + + +// Takes an element that might have been a scroller, and turns it back into a normal element. +function unsetScroller(containerEl) { + containerEl.height('').removeClass('fc-scroller'); +} + + +/* General DOM Utilities +----------------------------------------------------------------------------------------------------------------------*/ + + +// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51 +function getScrollParent(el) { + var position = el.css('position'), + scrollParent = el.parents().filter(function() { + var parent = $(this); + return (/(auto|scroll)/).test( + parent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x') + ); + }).eq(0); + + return position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent; +} + + +// Given a container element, return an object with the pixel values of the left/right scrollbars. +// Left scrollbars might occur on RTL browsers (IE maybe?) but I have not tested. +// PREREQUISITE: container element must have a single child with display:block +function getScrollbarWidths(container) { + var containerLeft = container.offset().left; + var containerRight = containerLeft + container.width(); + var inner = container.children(); + var innerLeft = inner.offset().left; + var innerRight = innerLeft + inner.outerWidth(); + + return { + left: innerLeft - containerLeft, + right: containerRight - innerRight + }; +} + + +// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac) +function isPrimaryMouseButton(ev) { + return ev.which == 1 && !ev.ctrlKey; +} + + +/* FullCalendar-specific Misc Utilities +----------------------------------------------------------------------------------------------------------------------*/ + + +// Creates a basic segment with the intersection of the two ranges. Returns undefined if no intersection. +// Expects all dates to be normalized to the same timezone beforehand. +function intersectionToSeg(subjectStart, subjectEnd, intervalStart, intervalEnd) { + var segStart, segEnd; + var isStart, isEnd; + + if (subjectEnd > intervalStart && subjectStart < intervalEnd) { // in bounds at all? + + if (subjectStart >= intervalStart) { + segStart = subjectStart.clone(); + isStart = true; + } + else { + segStart = intervalStart.clone(); + isStart = false; + } + + if (subjectEnd <= intervalEnd) { + segEnd = subjectEnd.clone(); + isEnd = true; + } + else { + segEnd = intervalEnd.clone(); + isEnd = false; + } + + return { + start: segStart, + end: segEnd, + isStart: isStart, + isEnd: isEnd + }; + } +} + + +function smartProperty(obj, name) { // get a camel-cased/namespaced property of an object + obj = obj || {}; + if (obj[name] !== undefined) { + return obj[name]; + } + var parts = name.split(/(?=[A-Z])/), + i = parts.length - 1, res; + for (; i>=0; i--) { + res = obj[parts[i].toLowerCase()]; + if (res !== undefined) { + return res; + } + } + return obj['default']; +} + + +/* Date Utilities +----------------------------------------------------------------------------------------------------------------------*/ + +var dayIDs = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ]; + + +// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time. +// Moments will have their timezones normalized. +function dayishDiff(a, b) { + return moment.duration({ + days: a.clone().stripTime().diff(b.clone().stripTime(), 'days'), + ms: a.time() - b.time() + }); +} + + +function isNativeDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date; +} + + +function dateCompare(a, b) { // works with Moments and native Dates + return a - b; +} + + +/* General Utilities +----------------------------------------------------------------------------------------------------------------------*/ + +fc.applyAll = applyAll; // export + + +// Create an object that has the given prototype. Just like Object.create +function createObject(proto) { + var f = function() {}; + f.prototype = proto; + return new f(); +} + + +// Copies specifically-owned (non-protoype) properties of `b` onto `a`. +// FYI, $.extend would copy *all* properties of `b` onto `a`. +function extend(a, b) { + for (var i in b) { + if (b.hasOwnProperty(i)) { + a[i] = b[i]; + } + } +} + + +function applyAll(functions, thisObj, args) { + if ($.isFunction(functions)) { + functions = [ functions ]; + } + if (functions) { + var i; + var ret; + for (i=0; i/g, '>') + .replace(/'/g, ''') + .replace(/"/g, '"') + .replace(/\n/g, '
'); +} + + +function stripHtmlEntities(text) { + return text.replace(/&.*?;/g, ''); +} + + +function capitaliseFirstLetter(str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} + + +// Returns a function, that, as long as it continues to be invoked, will not +// be triggered. The function will be called after it stops being called for +// N milliseconds. +// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714 +function debounce(func, wait) { + var timeoutId; + var args; + var context; + var timestamp; // of most recent call + var later = function() { + var last = +new Date() - timestamp; + if (last < wait && last > 0) { + timeoutId = setTimeout(later, wait - last); + } + else { + timeoutId = null; + func.apply(context, args); + if (!timeoutId) { + context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = +new Date(); + if (!timeoutId) { + timeoutId = setTimeout(later, wait); + } + }; +} + +;; + +var ambigDateOfMonthRegex = /^\s*\d{4}-\d\d$/; +var ambigTimeOrZoneRegex = + /^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/; + + +// Creating +// ------------------------------------------------------------------------------------------------- + +// Creates a new moment, similar to the vanilla moment(...) constructor, but with +// extra features (ambiguous time, enhanced formatting). When gived an existing moment, +// it will function as a clone (and retain the zone of the moment). Anything else will +// result in a moment in the local zone. +fc.moment = function() { + return makeMoment(arguments); +}; + +// Sames as fc.moment, but forces the resulting moment to be in the UTC timezone. +fc.moment.utc = function() { + var mom = makeMoment(arguments, true); + + // Force it into UTC because makeMoment doesn't guarantee it. + if (mom.hasTime()) { // don't give ambiguously-timed moments a UTC zone + mom.utc(); + } + + return mom; +}; + +// Same as fc.moment, but when given an ISO8601 string, the timezone offset is preserved. +// ISO8601 strings with no timezone offset will become ambiguously zoned. +fc.moment.parseZone = function() { + return makeMoment(arguments, true, true); +}; + +// Builds an FCMoment from args. When given an existing moment, it clones. When given a native +// Date, or called with no arguments (the current time), the resulting moment will be local. +// Anything else needs to be "parsed" (a string or an array), and will be affected by: +// parseAsUTC - if there is no zone information, should we parse the input in UTC? +// parseZone - if there is zone information, should we force the zone of the moment? +function makeMoment(args, parseAsUTC, parseZone) { + var input = args[0]; + var isSingleString = args.length == 1 && typeof input === 'string'; + var isAmbigTime; + var isAmbigZone; + var ambigMatch; + var output; // an object with fields for the new FCMoment object + + if (moment.isMoment(input)) { + output = moment.apply(null, args); // clone it + + // the ambig properties have not been preserved in the clone, so reassign them + if (input._ambigTime) { + output._ambigTime = true; + } + if (input._ambigZone) { + output._ambigZone = true; + } + } + else if (isNativeDate(input) || input === undefined) { + output = moment.apply(null, args); // will be local + } + else { // "parsing" is required + isAmbigTime = false; + isAmbigZone = false; + + if (isSingleString) { + if (ambigDateOfMonthRegex.test(input)) { + // accept strings like '2014-05', but convert to the first of the month + input += '-01'; + args = [ input ]; // for when we pass it on to moment's constructor + isAmbigTime = true; + isAmbigZone = true; + } + else if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) { + isAmbigTime = !ambigMatch[5]; // no time part? + isAmbigZone = true; + } + } + else if ($.isArray(input)) { + // arrays have no timezone information, so assume ambiguous zone + isAmbigZone = true; + } + // otherwise, probably a string with a format + + if (parseAsUTC) { + output = moment.utc.apply(moment, args); + } + else { + output = moment.apply(null, args); + } + + if (isAmbigTime) { + output._ambigTime = true; + output._ambigZone = true; // ambiguous time always means ambiguous zone + } + else if (parseZone) { // let's record the inputted zone somehow + if (isAmbigZone) { + output._ambigZone = true; + } + else if (isSingleString) { + output.zone(input); // if not a valid zone, will assign UTC + } + } + } + + return new FCMoment(output); +} + +// Our subclass of Moment. +// Accepts an object with the internal Moment properties that should be copied over to +// `this` object (most likely another Moment object). The values in this data must not +// be referenced by anything else (two moments sharing a Date object for example). +function FCMoment(internalData) { + extend(this, internalData); +} + +// Chain the prototype to Moment's +FCMoment.prototype = createObject(moment.fn); + +// We need this because Moment's implementation won't create an FCMoment, +// nor will it copy over the ambig flags. +FCMoment.prototype.clone = function() { + return makeMoment([ this ]); +}; + + +// Time-of-day +// ------------------------------------------------------------------------------------------------- + +// GETTER +// Returns a Duration with the hours/minutes/seconds/ms values of the moment. +// If the moment has an ambiguous time, a duration of 00:00 will be returned. +// +// SETTER +// You can supply a Duration, a Moment, or a Duration-like argument. +// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous. +FCMoment.prototype.time = function(time) { + if (time == null) { // getter + return moment.duration({ + hours: this.hours(), + minutes: this.minutes(), + seconds: this.seconds(), + milliseconds: this.milliseconds() + }); + } + else { // setter + + delete this._ambigTime; // mark that the moment now has a time + + if (!moment.isDuration(time) && !moment.isMoment(time)) { + time = moment.duration(time); + } + + // The day value should cause overflow (so 24 hours becomes 00:00:00 of next day). + // Only for Duration times, not Moment times. + var dayHours = 0; + if (moment.isDuration(time)) { + dayHours = Math.floor(time.asDays()) * 24; + } + + // We need to set the individual fields. + // Can't use startOf('day') then add duration. In case of DST at start of day. + return this.hours(dayHours + time.hours()) + .minutes(time.minutes()) + .seconds(time.seconds()) + .milliseconds(time.milliseconds()); + } +}; + +// Converts the moment to UTC, stripping out its time-of-day and timezone offset, +// but preserving its YMD. A moment with a stripped time will display no time +// nor timezone offset when .format() is called. +FCMoment.prototype.stripTime = function() { + var a = this.toArray(); // year,month,date,hours,minutes,seconds as an array + + // set the internal UTC flag + moment.fn.utc.call(this); // call the original method, because we don't want to affect _ambigZone + + this.year(a[0]) // TODO: find a way to do this in one shot + .month(a[1]) + .date(a[2]) + .hours(0) + .minutes(0) + .seconds(0) + .milliseconds(0); + + // Mark the time as ambiguous. This needs to happen after the .utc() call, which calls .zone(), which + // clears all ambig flags. Same concept with the .year/month/date calls in the case of moment-timezone. + this._ambigTime = true; + this._ambigZone = true; // if ambiguous time, also ambiguous timezone offset + + return this; // for chaining +}; + +// Returns if the moment has a non-ambiguous time (boolean) +FCMoment.prototype.hasTime = function() { + return !this._ambigTime; +}; + + +// Timezone +// ------------------------------------------------------------------------------------------------- + +// Converts the moment to UTC, stripping out its timezone offset, but preserving its +// YMD and time-of-day. A moment with a stripped timezone offset will display no +// timezone offset when .format() is called. +FCMoment.prototype.stripZone = function() { + var a = this.toArray(); // year,month,date,hours,minutes,seconds as an array + var wasAmbigTime = this._ambigTime; + + moment.fn.utc.call(this); // set the internal UTC flag + + this.year(a[0]) // TODO: find a way to do this in one shot + .month(a[1]) + .date(a[2]) + .hours(a[3]) + .minutes(a[4]) + .seconds(a[5]) + .milliseconds(a[6]); + + if (wasAmbigTime) { + // the above call to .utc()/.zone() unfortunately clears the ambig flags, so reassign + this._ambigTime = true; + } + + // Mark the zone as ambiguous. This needs to happen after the .utc() call, which calls .zone(), which + // clears all ambig flags. Same concept with the .year/month/date calls in the case of moment-timezone. + this._ambigZone = true; + + return this; // for chaining +}; + +// Returns of the moment has a non-ambiguous timezone offset (boolean) +FCMoment.prototype.hasZone = function() { + return !this._ambigZone; +}; + +// this method implicitly marks a zone +FCMoment.prototype.zone = function(tzo) { + + if (tzo != null) { + // FYI, the delete statements need to be before the .zone() call or else chaos ensues + // for reasons I don't understand. + delete this._ambigTime; + delete this._ambigZone; + } + + return moment.fn.zone.apply(this, arguments); +}; + +// this method implicitly marks a zone +FCMoment.prototype.local = function() { + var a = this.toArray(); // year,month,date,hours,minutes,seconds as an array + var wasAmbigZone = this._ambigZone; + + // will happen anyway via .local()/.zone(), but don't want to rely on internal implementation + delete this._ambigTime; + delete this._ambigZone; + + moment.fn.local.apply(this, arguments); + + if (wasAmbigZone) { + // If the moment was ambiguously zoned, the date fields were stored as UTC. + // We want to preserve these, but in local time. + this.year(a[0]) // TODO: find a way to do this in one shot + .month(a[1]) + .date(a[2]) + .hours(a[3]) + .minutes(a[4]) + .seconds(a[5]) + .milliseconds(a[6]); + } + + return this; // for chaining +}; + +// this method implicitly marks a zone +FCMoment.prototype.utc = function() { + + // will happen anyway via .local()/.zone(), but don't want to rely on internal implementation + delete this._ambigTime; + delete this._ambigZone; + + return moment.fn.utc.apply(this, arguments); +}; + + +// Formatting +// ------------------------------------------------------------------------------------------------- + +FCMoment.prototype.format = function() { + if (arguments[0]) { + return formatDate(this, arguments[0]); // our extended formatting + } + if (this._ambigTime) { + return momentFormat(this, 'YYYY-MM-DD'); + } + if (this._ambigZone) { + return momentFormat(this, 'YYYY-MM-DD[T]HH:mm:ss'); + } + return momentFormat(this); // default moment original formatting +}; + +FCMoment.prototype.toISOString = function() { + if (this._ambigTime) { + return momentFormat(this, 'YYYY-MM-DD'); + } + if (this._ambigZone) { + return momentFormat(this, 'YYYY-MM-DD[T]HH:mm:ss'); + } + return moment.fn.toISOString.apply(this, arguments); +}; + + +// Querying +// ------------------------------------------------------------------------------------------------- + +// Is the moment within the specified range? `end` is exclusive. +FCMoment.prototype.isWithin = function(start, end) { + var a = commonlyAmbiguate([ this, start, end ]); + return a[0] >= a[1] && a[0] < a[2]; +}; + +// When isSame is called with units, timezone ambiguity is normalized before the comparison happens. +// If no units are specified, the two moments must be identically the same, with matching ambig flags. +FCMoment.prototype.isSame = function(input, units) { + var a; + + if (units) { + a = commonlyAmbiguate([ this, input ], true); // normalize timezones but don't erase times + return moment.fn.isSame.call(a[0], a[1], units); + } + else { + input = fc.moment.parseZone(input); // normalize input + return moment.fn.isSame.call(this, input) && + Boolean(this._ambigTime) === Boolean(input._ambigTime) && + Boolean(this._ambigZone) === Boolean(input._ambigZone); + } +}; + +// Make these query methods work with ambiguous moments +$.each([ + 'isBefore', + 'isAfter' +], function(i, methodName) { + FCMoment.prototype[methodName] = function(input, units) { + var a = commonlyAmbiguate([ this, input ]); + return moment.fn[methodName].call(a[0], a[1], units); + }; +}); + + +// Misc Internals +// ------------------------------------------------------------------------------------------------- + +// given an array of moment-like inputs, return a parallel array w/ moments similarly ambiguated. +// for example, of one moment has ambig time, but not others, all moments will have their time stripped. +// set `preserveTime` to `true` to keep times, but only normalize zone ambiguity. +function commonlyAmbiguate(inputs, preserveTime) { + var outputs = []; + var anyAmbigTime = false; + var anyAmbigZone = false; + var i; + + for (i=0; i "MMMM D YYYY" + formatStr = localeData.longDateFormat(formatStr) || formatStr; + // BTW, this is not important for `formatDate` because it is impossible to put custom tokens + // or non-zero areas in Moment's localized format strings. + + separator = separator || ' - '; + + return formatRangeWithChunks( + date1, + date2, + getFormatStringChunks(formatStr), + separator, + isRTL + ); +} +fc.formatRange = formatRange; // expose + + +function formatRangeWithChunks(date1, date2, chunks, separator, isRTL) { + var chunkStr; // the rendering of the chunk + var leftI; + var leftStr = ''; + var rightI; + var rightStr = ''; + var middleI; + var middleStr1 = ''; + var middleStr2 = ''; + var middleStr = ''; + + // Start at the leftmost side of the formatting string and continue until you hit a token + // that is not the same between dates. + for (leftI=0; leftIleftI; rightI--) { + chunkStr = formatSimilarChunk(date1, date2, chunks[rightI]); + if (chunkStr === false) { + break; + } + rightStr = chunkStr + rightStr; + } + + // The area in the middle is different for both of the dates. + // Collect them distinctly so we can jam them together later. + for (middleI=leftI; middleI<=rightI; middleI++) { + middleStr1 += formatDateWithChunk(date1, chunks[middleI]); + middleStr2 += formatDateWithChunk(date2, chunks[middleI]); + } + + if (middleStr1 || middleStr2) { + if (isRTL) { + middleStr = middleStr2 + separator + middleStr1; + } + else { + middleStr = middleStr1 + separator + middleStr2; + } + } + + return leftStr + middleStr + rightStr; +} + + +var similarUnitMap = { + Y: 'year', + M: 'month', + D: 'day', // day of month + d: 'day', // day of week + // prevents a separator between anything time-related... + A: 'second', // AM/PM + a: 'second', // am/pm + T: 'second', // A/P + t: 'second', // a/p + H: 'second', // hour (24) + h: 'second', // hour (12) + m: 'second', // minute + s: 'second' // second +}; +// TODO: week maybe? + + +// Given a formatting chunk, and given that both dates are similar in the regard the +// formatting chunk is concerned, format date1 against `chunk`. Otherwise, return `false`. +function formatSimilarChunk(date1, date2, chunk) { + var token; + var unit; + + if (typeof chunk === 'string') { // a literal string + return chunk; + } + else if ((token = chunk.token)) { + unit = similarUnitMap[token.charAt(0)]; + // are the dates the same for this unit of measurement? + if (unit && date1.isSame(date2, unit)) { + return momentFormat(date1, token); // would be the same if we used `date2` + // BTW, don't support custom tokens + } + } + + return false; // the chunk is NOT the same for the two dates + // BTW, don't support splitting on non-zero areas +} + + +// Chunking Utils +// ------------------------------------------------------------------------------------------------- + + +var formatStringChunkCache = {}; + + +function getFormatStringChunks(formatStr) { + if (formatStr in formatStringChunkCache) { + return formatStringChunkCache[formatStr]; + } + return (formatStringChunkCache[formatStr] = chunkFormatString(formatStr)); +} + + +// Break the formatting string into an array of chunks +function chunkFormatString(formatStr) { + var chunks = []; + var chunker = /\[([^\]]*)\]|\(([^\)]*)\)|(LT|(\w)\4*o?)|([^\w\[\(]+)/g; // TODO: more descrimination + var match; + + while ((match = chunker.exec(formatStr))) { + if (match[1]) { // a literal string inside [ ... ] + chunks.push(match[1]); + } + else if (match[2]) { // non-zero formatting inside ( ... ) + chunks.push({ maybe: chunkFormatString(match[2]) }); + } + else if (match[3]) { // a formatting token + chunks.push({ token: match[3] }); + } + else if (match[5]) { // an unenclosed literal string + chunks.push(match[5]); + } + } + + return chunks; +} + +;; + +/* A rectangular panel that is absolutely positioned over other content +------------------------------------------------------------------------------------------------------------------------ +Options: + - className (string) + - content (HTML string or jQuery element set) + - parentEl + - top + - left + - right (the x coord of where the right edge should be. not a "CSS" right) + - autoHide (boolean) + - show (callback) + - hide (callback) +*/ + +function Popover(options) { + this.options = options || {}; +} + + +Popover.prototype = { + + isHidden: true, + options: null, + el: null, // the container element for the popover. generated by this object + documentMousedownProxy: null, // document mousedown handler bound to `this` + margin: 10, // the space required between the popover and the edges of the scroll container + + + // Shows the popover on the specified position. Renders it if not already + show: function() { + if (this.isHidden) { + if (!this.el) { + this.render(); + } + this.el.show(); + this.position(); + this.isHidden = false; + this.trigger('show'); + } + }, + + + // Hides the popover, through CSS, but does not remove it from the DOM + hide: function() { + if (!this.isHidden) { + this.el.hide(); + this.isHidden = true; + this.trigger('hide'); + } + }, + + + // Creates `this.el` and renders content inside of it + render: function() { + var _this = this; + var options = this.options; + + this.el = $('
') + .addClass(options.className || '') + .css({ + // position initially to the top left to avoid creating scrollbars + top: 0, + left: 0 + }) + .append(options.content) + .appendTo(options.parentEl); + + // when a click happens on anything inside with a 'fc-close' className, hide the popover + this.el.on('click', '.fc-close', function() { + _this.hide(); + }); + + if (options.autoHide) { + $(document).on('mousedown', this.documentMousedownProxy = $.proxy(this, 'documentMousedown')); + } + }, + + + // Triggered when the user clicks *anywhere* in the document, for the autoHide feature + documentMousedown: function(ev) { + // only hide the popover if the click happened outside the popover + if (this.el && !$(ev.target).closest(this.el).length) { + this.hide(); + } + }, + + + // Hides and unregisters any handlers + destroy: function() { + this.hide(); + + if (this.el) { + this.el.remove(); + this.el = null; + } + + $(document).off('mousedown', this.documentMousedownProxy); + }, + + + // Positions the popover optimally, using the top/left/right options + position: function() { + var options = this.options; + var origin = this.el.offsetParent().offset(); + var width = this.el.outerWidth(); + var height = this.el.outerHeight(); + var windowEl = $(window); + var viewportEl = getScrollParent(this.el); + var viewportTop; + var viewportLeft; + var viewportOffset; + var top; // the "position" (not "offset") values for the popover + var left; // + + // compute top and left + top = options.top || 0; + if (options.left !== undefined) { + left = options.left; + } + else if (options.right !== undefined) { + left = options.right - width; // derive the left value from the right value + } + else { + left = 0; + } + + if (viewportEl.is(window) || viewportEl.is(document)) { // normalize getScrollParent's result + viewportEl = windowEl; + viewportTop = 0; // the window is always at the top left + viewportLeft = 0; // (and .offset() won't work if called here) + } + else { + viewportOffset = viewportEl.offset(); + viewportTop = viewportOffset.top; + viewportLeft = viewportOffset.left; + } + + // if the window is scrolled, it causes the visible area to be further down + viewportTop += windowEl.scrollTop(); + viewportLeft += windowEl.scrollLeft(); + + // constrain to the view port. if constrained by two edges, give precedence to top/left + if (options.viewportConstrain !== false) { + top = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin); + top = Math.max(top, viewportTop + this.margin); + left = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin); + left = Math.max(left, viewportLeft + this.margin); + } + + this.el.css({ + top: top - origin.top, + left: left - origin.left + }); + }, + + + // Triggers a callback. Calls a function in the option hash of the same name. + // Arguments beyond the first `name` are forwarded on. + // TODO: better code reuse for this. Repeat code + trigger: function(name) { + if (this.options[name]) { + this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); + } + } + +}; + +;; + +/* A "coordinate map" converts pixel coordinates into an associated cell, which has an associated date +------------------------------------------------------------------------------------------------------------------------ +Common interface: + + CoordMap.prototype = { + build: function() {}, + getCell: function(x, y) {} + }; + +*/ + +/* Coordinate map for a grid component +----------------------------------------------------------------------------------------------------------------------*/ + +function GridCoordMap(grid) { + this.grid = grid; +} + + +GridCoordMap.prototype = { + + grid: null, // reference to the Grid + rows: null, // the top-to-bottom y coordinates. including the bottom of the last item + cols: null, // the left-to-right x coordinates. including the right of the last item + + containerEl: null, // container element that all coordinates are constrained to. optionally assigned + minX: null, + maxX: null, // exclusive + minY: null, + maxY: null, // exclusive + + + // Queries the grid for the coordinates of all the cells + build: function() { + this.grid.buildCoords( + this.rows = [], + this.cols = [] + ); + this.computeBounds(); + }, + + + // Given a coordinate of the document, gets the associated cell. If no cell is underneath, returns null + getCell: function(x, y) { + var cell = null; + var rows = this.rows; + var cols = this.cols; + var r = -1; + var c = -1; + var i; + + if (this.inBounds(x, y)) { + + for (i = 0; i < rows.length; i++) { + if (y >= rows[i][0] && y < rows[i][1]) { + r = i; + break; + } + } + + for (i = 0; i < cols.length; i++) { + if (x >= cols[i][0] && x < cols[i][1]) { + c = i; + break; + } + } + + if (r >= 0 && c >= 0) { + cell = { row: r, col: c }; + cell.grid = this.grid; + cell.date = this.grid.getCellDate(cell); + } + } + + return cell; + }, + + + // If there is a containerEl, compute the bounds into min/max values + computeBounds: function() { + var containerOffset; + + if (this.containerEl) { + containerOffset = this.containerEl.offset(); + this.minX = containerOffset.left; + this.maxX = containerOffset.left + this.containerEl.outerWidth(); + this.minY = containerOffset.top; + this.maxY = containerOffset.top + this.containerEl.outerHeight(); + } + }, + + + // Determines if the given coordinates are in bounds. If no `containerEl`, always true + inBounds: function(x, y) { + if (this.containerEl) { + return x >= this.minX && x < this.maxX && y >= this.minY && y < this.maxY; + } + return true; + } + +}; + + +/* Coordinate map that is a combination of multiple other coordinate maps +----------------------------------------------------------------------------------------------------------------------*/ + +function ComboCoordMap(coordMaps) { + this.coordMaps = coordMaps; +} + + +ComboCoordMap.prototype = { + + coordMaps: null, // an array of CoordMaps + + + // Builds all coordMaps + build: function() { + var coordMaps = this.coordMaps; + var i; + + for (i = 0; i < coordMaps.length; i++) { + coordMaps[i].build(); + } + }, + + + // Queries all coordMaps for the cell underneath the given coordinates, returning the first result + getCell: function(x, y) { + var coordMaps = this.coordMaps; + var cell = null; + var i; + + for (i = 0; i < coordMaps.length && !cell; i++) { + cell = coordMaps[i].getCell(x, y); + } + + return cell; + } + +}; +;; + +/* Tracks mouse movements over a CoordMap and raises events about which cell the mouse is over. +----------------------------------------------------------------------------------------------------------------------*/ +// TODO: implement scrolling + +function DragListener(coordMap, options) { + this.coordMap = coordMap; + this.options = options || {}; +} + + +DragListener.prototype = { + + coordMap: null, + options: null, + + isListening: false, + isDragging: false, + + // the cell/date the mouse was over when listening started + origCell: null, + origDate: null, + + // the cell/date the mouse is over + cell: null, + date: null, + + // coordinates of the initial mousedown + mouseX0: null, + mouseY0: null, + + // handler attached to the document, bound to the DragListener's `this` + mousemoveProxy: null, + mouseupProxy: null, + + scrollEl: null, + scrollBounds: null, // { top, bottom, left, right } + scrollTopVel: null, // pixels per second + scrollLeftVel: null, // pixels per second + scrollIntervalId: null, // ID of setTimeout for scrolling animation loop + scrollHandlerProxy: null, // this-scoped function for handling when scrollEl is scrolled + + scrollSensitivity: 30, // pixels from edge for scrolling to start + scrollSpeed: 200, // pixels per second, at maximum speed + scrollIntervalMs: 50, // millisecond wait between scroll increment + + + // Call this when the user does a mousedown. Will probably lead to startListening + mousedown: function(ev) { + if (isPrimaryMouseButton(ev)) { + + ev.preventDefault(); // prevents native selection in most browsers + + this.startListening(ev); + + // start the drag immediately if there is no minimum distance for a drag start + if (!this.options.distance) { + this.startDrag(ev); + } + } + }, + + + // Call this to start tracking mouse movements + startListening: function(ev) { + var scrollParent; + var cell; + + if (!this.isListening) { + + // grab scroll container and attach handler + if (ev && this.options.scroll) { + scrollParent = getScrollParent($(ev.target)); + if (!scrollParent.is(window) && !scrollParent.is(document)) { + this.scrollEl = scrollParent; + + // scope to `this`, and use `debounce` to make sure rapid calls don't happen + this.scrollHandlerProxy = debounce($.proxy(this, 'scrollHandler'), 100); + this.scrollEl.on('scroll', this.scrollHandlerProxy); + } + } + + this.computeCoords(); // relies on `scrollEl` + + // get info on the initial cell, date, and coordinates + if (ev) { + cell = this.getCell(ev); + this.origCell = cell; + this.origDate = cell ? cell.date : null; + + this.mouseX0 = ev.pageX; + this.mouseY0 = ev.pageY; + } + + $(document) + .on('mousemove', this.mousemoveProxy = $.proxy(this, 'mousemove')) + .on('mouseup', this.mouseupProxy = $.proxy(this, 'mouseup')) + .on('selectstart', this.preventDefault); // prevents native selection in IE<=8 + + this.isListening = true; + this.trigger('listenStart', ev); + } + }, + + + // Recomputes the drag-critical positions of elements + computeCoords: function() { + this.coordMap.build(); + this.computeScrollBounds(); + }, + + + // Called when the user moves the mouse + mousemove: function(ev) { + var minDistance; + var distanceSq; // current distance from mouseX0/mouseY0, squared + + if (!this.isDragging) { // if not already dragging... + // then start the drag if the minimum distance criteria is met + minDistance = this.options.distance || 1; + distanceSq = Math.pow(ev.pageX - this.mouseX0, 2) + Math.pow(ev.pageY - this.mouseY0, 2); + if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem + this.startDrag(ev); + } + } + + if (this.isDragging) { + this.drag(ev); // report a drag, even if this mousemove initiated the drag + } + }, + + + // Call this to initiate a legitimate drag. + // This function is called internally from this class, but can also be called explicitly from outside + startDrag: function(ev) { + var cell; + + if (!this.isListening) { // startDrag must have manually initiated + this.startListening(); + } + + if (!this.isDragging) { + this.isDragging = true; + this.trigger('dragStart', ev); + + // report the initial cell the mouse is over + cell = this.getCell(ev); + if (cell) { + this.cellOver(cell, true); + } + } + }, + + + // Called while the mouse is being moved and when we know a legitimate drag is taking place + drag: function(ev) { + var cell; + + if (this.isDragging) { + cell = this.getCell(ev); + + if (!isCellsEqual(cell, this.cell)) { // a different cell than before? + if (this.cell) { + this.cellOut(); + } + if (cell) { + this.cellOver(cell); + } + } + + this.dragScroll(ev); // will possibly cause scrolling + } + }, + + + // Called when a the mouse has just moved over a new cell + cellOver: function(cell) { + this.cell = cell; + this.date = cell.date; + this.trigger('cellOver', cell, cell.date); + }, + + + // Called when the mouse has just moved out of a cell + cellOut: function() { + if (this.cell) { + this.trigger('cellOut', this.cell); + this.cell = null; + this.date = null; + } + }, + + + // Called when the user does a mouseup + mouseup: function(ev) { + this.stopDrag(ev); + this.stopListening(ev); + }, + + + // Called when the drag is over. Will not cause listening to stop however. + // A concluding 'cellOut' event will NOT be triggered. + stopDrag: function(ev) { + if (this.isDragging) { + this.stopScrolling(); + this.trigger('dragStop', ev); + this.isDragging = false; + } + }, + + + // Call this to stop listening to the user's mouse events + stopListening: function(ev) { + if (this.isListening) { + + // remove the scroll handler if there is a scrollEl + if (this.scrollEl) { + this.scrollEl.off('scroll', this.scrollHandlerProxy); + this.scrollHandlerProxy = null; + } + + $(document) + .off('mousemove', this.mousemoveProxy) + .off('mouseup', this.mouseupProxy) + .off('selectstart', this.preventDefault); + + this.mousemoveProxy = null; + this.mouseupProxy = null; + + this.isListening = false; + this.trigger('listenStop', ev); + + this.origCell = this.cell = null; + this.origDate = this.date = null; + } + }, + + + // Gets the cell underneath the coordinates for the given mouse event + getCell: function(ev) { + return this.coordMap.getCell(ev.pageX, ev.pageY); + }, + + + // Triggers a callback. Calls a function in the option hash of the same name. + // Arguments beyond the first `name` are forwarded on. + trigger: function(name) { + if (this.options[name]) { + this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); + } + }, + + + // Stops a given mouse event from doing it's native browser action. In our case, text selection. + preventDefault: function(ev) { + ev.preventDefault(); + }, + + + /* Scrolling + ------------------------------------------------------------------------------------------------------------------*/ + + + // Computes and stores the bounding rectangle of scrollEl + computeScrollBounds: function() { + var el = this.scrollEl; + var offset; + + if (el) { + offset = el.offset(); + this.scrollBounds = { + top: offset.top, + left: offset.left, + bottom: offset.top + el.outerHeight(), + right: offset.left + el.outerWidth() + }; + } + }, + + + // Called when the dragging is in progress and scrolling should be updated + dragScroll: function(ev) { + var sensitivity = this.scrollSensitivity; + var bounds = this.scrollBounds; + var topCloseness, bottomCloseness; + var leftCloseness, rightCloseness; + var topVel = 0; + var leftVel = 0; + + if (bounds) { // only scroll if scrollEl exists + + // compute closeness to edges. valid range is from 0.0 - 1.0 + topCloseness = (sensitivity - (ev.pageY - bounds.top)) / sensitivity; + bottomCloseness = (sensitivity - (bounds.bottom - ev.pageY)) / sensitivity; + leftCloseness = (sensitivity - (ev.pageX - bounds.left)) / sensitivity; + rightCloseness = (sensitivity - (bounds.right - ev.pageX)) / sensitivity; + + // translate vertical closeness into velocity. + // mouse must be completely in bounds for velocity to happen. + if (topCloseness >= 0 && topCloseness <= 1) { + topVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up + } + else if (bottomCloseness >= 0 && bottomCloseness <= 1) { + topVel = bottomCloseness * this.scrollSpeed; + } + + // translate horizontal closeness into velocity + if (leftCloseness >= 0 && leftCloseness <= 1) { + leftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left + } + else if (rightCloseness >= 0 && rightCloseness <= 1) { + leftVel = rightCloseness * this.scrollSpeed; + } + } + + this.setScrollVel(topVel, leftVel); + }, + + + // Sets the speed-of-scrolling for the scrollEl + setScrollVel: function(topVel, leftVel) { + + this.scrollTopVel = topVel; + this.scrollLeftVel = leftVel; + + this.constrainScrollVel(); // massages into realistic values + + // if there is non-zero velocity, and an animation loop hasn't already started, then START + if ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) { + this.scrollIntervalId = setInterval( + $.proxy(this, 'scrollIntervalFunc'), // scope to `this` + this.scrollIntervalMs + ); + } + }, + + + // Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way + constrainScrollVel: function() { + var el = this.scrollEl; + + if (this.scrollTopVel < 0) { // scrolling up? + if (el.scrollTop() <= 0) { // already scrolled all the way up? + this.scrollTopVel = 0; + } + } + else if (this.scrollTopVel > 0) { // scrolling down? + if (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) { // already scrolled all the way down? + this.scrollTopVel = 0; + } + } + + if (this.scrollLeftVel < 0) { // scrolling left? + if (el.scrollLeft() <= 0) { // already scrolled all the left? + this.scrollLeftVel = 0; + } + } + else if (this.scrollLeftVel > 0) { // scrolling right? + if (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) { // already scrolled all the way right? + this.scrollLeftVel = 0; + } + } + }, + + + // This function gets called during every iteration of the scrolling animation loop + scrollIntervalFunc: function() { + var el = this.scrollEl; + var frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by + + // change the value of scrollEl's scroll + if (this.scrollTopVel) { + el.scrollTop(el.scrollTop() + this.scrollTopVel * frac); + } + if (this.scrollLeftVel) { + el.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac); + } + + this.constrainScrollVel(); // since the scroll values changed, recompute the velocities + + // if scrolled all the way, which causes the vels to be zero, stop the animation loop + if (!this.scrollTopVel && !this.scrollLeftVel) { + this.stopScrolling(); + } + }, + + + // Kills any existing scrolling animation loop + stopScrolling: function() { + if (this.scrollIntervalId) { + clearInterval(this.scrollIntervalId); + this.scrollIntervalId = null; + + // when all done with scrolling, recompute positions since they probably changed + this.computeCoords(); + } + }, + + + // Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce) + scrollHandler: function() { + // recompute all coordinates, but *only* if this is *not* part of our scrolling animation + if (!this.scrollIntervalId) { + this.computeCoords(); + } + } + +}; + + +// Returns `true` if the cells are identically equal. `false` otherwise. +// They must have the same row, col, and be from the same grid. +// Two null values will be considered equal, as two "out of the grid" states are the same. +function isCellsEqual(cell1, cell2) { + + if (!cell1 && !cell2) { + return true; + } + + if (cell1 && cell2) { + return cell1.grid === cell2.grid && + cell1.row === cell2.row && + cell1.col === cell2.col; + } + + return false; +} + +;; + +/* Creates a clone of an element and lets it track the mouse as it moves +----------------------------------------------------------------------------------------------------------------------*/ + +function MouseFollower(sourceEl, options) { + this.options = options = options || {}; + this.sourceEl = sourceEl; + this.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent +} + + +MouseFollower.prototype = { + + options: null, + + sourceEl: null, // the element that will be cloned and made to look like it is dragging + el: null, // the clone of `sourceEl` that will track the mouse + parentEl: null, // the element that `el` (the clone) will be attached to + + // the initial position of el, relative to the offset parent. made to match the initial offset of sourceEl + top0: null, + left0: null, + + // the initial position of the mouse + mouseY0: null, + mouseX0: null, + + // the number of pixels the mouse has moved from its initial position + topDelta: null, + leftDelta: null, + + mousemoveProxy: null, // document mousemove handler, bound to the MouseFollower's `this` + + isFollowing: false, + isHidden: false, + isAnimating: false, // doing the revert animation? + + + // Causes the element to start following the mouse + start: function(ev) { + if (!this.isFollowing) { + this.isFollowing = true; + + this.mouseY0 = ev.pageY; + this.mouseX0 = ev.pageX; + this.topDelta = 0; + this.leftDelta = 0; + + if (!this.isHidden) { + this.updatePosition(); + } + + $(document).on('mousemove', this.mousemoveProxy = $.proxy(this, 'mousemove')); + } + }, + + + // Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position. + // `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately. + stop: function(shouldRevert, callback) { + var _this = this; + var revertDuration = this.options.revertDuration; + + function complete() { + this.isAnimating = false; + _this.destroyEl(); + + this.top0 = this.left0 = null; // reset state for future updatePosition calls + + if (callback) { + callback(); + } + } + + if (this.isFollowing && !this.isAnimating) { // disallow more than one stop animation at a time + this.isFollowing = false; + + $(document).off('mousemove', this.mousemoveProxy); + + if (shouldRevert && revertDuration && !this.isHidden) { // do a revert animation? + this.isAnimating = true; + this.el.animate({ + top: this.top0, + left: this.left0 + }, { + duration: revertDuration, + complete: complete + }); + } + else { + complete(); + } + } + }, + + + // Gets the tracking element. Create it if necessary + getEl: function() { + var el = this.el; + + if (!el) { + this.sourceEl.width(); // hack to force IE8 to compute correct bounding box + el = this.el = this.sourceEl.clone() + .css({ + position: 'absolute', + visibility: '', // in case original element was hidden (commonly through hideEvents()) + display: this.isHidden ? 'none' : '', // for when initially hidden + margin: 0, + right: 'auto', // erase and set width instead + bottom: 'auto', // erase and set height instead + width: this.sourceEl.width(), // explicit height in case there was a 'right' value + height: this.sourceEl.height(), // explicit width in case there was a 'bottom' value + opacity: this.options.opacity || '', + zIndex: this.options.zIndex + }) + .appendTo(this.parentEl); + } + + return el; + }, + + + // Removes the tracking element if it has already been created + destroyEl: function() { + if (this.el) { + this.el.remove(); + this.el = null; + } + }, + + + // Update the CSS position of the tracking element + updatePosition: function() { + var sourceOffset; + var origin; + + this.getEl(); // ensure this.el + + // make sure origin info was computed + if (this.top0 === null) { + this.sourceEl.width(); // hack to force IE8 to compute correct bounding box + sourceOffset = this.sourceEl.offset(); + origin = this.el.offsetParent().offset(); + this.top0 = sourceOffset.top - origin.top; + this.left0 = sourceOffset.left - origin.left; + } + + this.el.css({ + top: this.top0 + this.topDelta, + left: this.left0 + this.leftDelta + }); + }, + + + // Gets called when the user moves the mouse + mousemove: function(ev) { + this.topDelta = ev.pageY - this.mouseY0; + this.leftDelta = ev.pageX - this.mouseX0; + + if (!this.isHidden) { + this.updatePosition(); + } + }, + + + // Temporarily makes the tracking element invisible. Can be called before following starts + hide: function() { + if (!this.isHidden) { + this.isHidden = true; + if (this.el) { + this.el.hide(); + } + } + }, + + + // Show the tracking element after it has been temporarily hidden + show: function() { + if (this.isHidden) { + this.isHidden = false; + this.updatePosition(); + this.getEl().show(); + } + } + +}; + +;; + +/* A utility class for rendering rows. +----------------------------------------------------------------------------------------------------------------------*/ +// It leverages methods of the subclass and the View to determine custom rendering behavior for each row "type" +// (such as highlight rows, day rows, helper rows, etc). + +function RowRenderer(view) { + this.view = view; +} + + +RowRenderer.prototype = { + + view: null, // a View object + cellHtml: '', // plain default HTML used for a cell when no other is available + + + // Renders the HTML for a row, leveraging custom cell-HTML-renderers based on the `rowType`. + // Also applies the "intro" and "outro" cells, which are specified by the subclass and views. + // `row` is an optional row number. + rowHtml: function(rowType, row) { + var view = this.view; + var renderCell = this.getHtmlRenderer('cell', rowType); + var cellHtml = ''; + var col; + var date; + + row = row || 0; + + for (col = 0; col < view.colCnt; col++) { + date = view.cellToDate(row, col); + cellHtml += renderCell(row, col, date); + } + + cellHtml = this.bookendCells(cellHtml, rowType, row); // apply intro and outro + + return '' + cellHtml + ''; + }, + + + // Applies the "intro" and "outro" HTML to the given cells. + // Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro. + // `cells` can be an HTML string of 's or a jQuery element + // `row` is an optional row number. + bookendCells: function(cells, rowType, row) { + var view = this.view; + var intro = this.getHtmlRenderer('intro', rowType)(row || 0); + var outro = this.getHtmlRenderer('outro', rowType)(row || 0); + var isRTL = view.opt('isRTL'); + var prependHtml = isRTL ? outro : intro; + var appendHtml = isRTL ? intro : outro; + + if (typeof cells === 'string') { + return prependHtml + cells + appendHtml; + } + else { // a jQuery element + return cells.prepend(prependHtml).append(appendHtml); + } + }, + + + // Returns an HTML-rendering function given a specific `rendererName` (like cell, intro, or outro) and a specific + // `rowType` (like day, eventSkeleton, helperSkeleton), which is optional. + // If a renderer for the specific rowType doesn't exist, it will fall back to a generic renderer. + // We will query the View object first for any custom rendering functions, then the methods of the subclass. + getHtmlRenderer: function(rendererName, rowType) { + var view = this.view; + var generalName; // like "cellHtml" + var specificName; // like "dayCellHtml". based on rowType + var provider; // either the View or the RowRenderer subclass, whichever provided the method + var renderer; + + generalName = rendererName + 'Html'; + if (rowType) { + specificName = rowType + capitaliseFirstLetter(rendererName) + 'Html'; + } + + if (specificName && (renderer = view[specificName])) { + provider = view; + } + else if (specificName && (renderer = this[specificName])) { + provider = this; + } + else if ((renderer = view[generalName])) { + provider = view; + } + else if ((renderer = this[generalName])) { + provider = this; + } + + if (typeof renderer === 'function') { + return function(row) { + return renderer.apply(provider, arguments) || ''; // use correct `this` and always return a string + }; + } + + // the rendered can be a plain string as well. if not specified, always an empty string. + return function() { + return renderer || ''; + }; + } + +}; + +;; + +/* An abstract class comprised of a "grid" of cells that each represent a specific datetime +----------------------------------------------------------------------------------------------------------------------*/ + +function Grid(view) { + RowRenderer.call(this, view); // call the super-constructor + this.coordMap = new GridCoordMap(this); +} + + +Grid.prototype = createObject(RowRenderer.prototype); // declare the super-class +$.extend(Grid.prototype, { + + el: null, // the containing element + coordMap: null, // a GridCoordMap that converts pixel values to datetimes + cellDuration: null, // a cell's duration. subclasses must assign this ASAP + + + // Renders the grid into the `el` element. + // Subclasses should override and call this super-method when done. + render: function() { + this.bindHandlers(); + }, + + + // Called when the grid's resources need to be cleaned up + destroy: function() { + // subclasses can implement + }, + + + /* Coordinates & Cells + ------------------------------------------------------------------------------------------------------------------*/ + + + // Populates the given empty arrays with the y and x coordinates of the cells + buildCoords: function(rows, cols) { + // subclasses must implement + }, + + + // Given a cell object, returns the date for that cell + getCellDate: function(cell) { + // subclasses must implement + }, + + + // Given a cell object, returns the element that represents the cell's whole-day + getCellDayEl: function(cell) { + // subclasses must implement + }, + + + // Converts a range with an inclusive `start` and an exclusive `end` into an array of segment objects + rangeToSegs: function(start, end) { + // subclasses must implement + }, + + + /* Handlers + ------------------------------------------------------------------------------------------------------------------*/ + + + // Attach handlers to `this.el`, using bubbling to listen to all ancestors. + // We don't need to undo any of this in a "destroy" method, because the view will simply remove `this.el` from the + // DOM and jQuery will be smart enough to garbage collect the handlers. + bindHandlers: function() { + var _this = this; + + this.el.on('mousedown', function(ev) { + if ( + !$(ev.target).is('.fc-event-container *, .fc-more') && // not an an event element, or "more.." link + !$(ev.target).closest('.fc-popover').length // not on a popover (like the "more.." events one) + ) { + _this.dayMousedown(ev); + } + }); + + this.bindSegHandlers(); // attach event-element-related handlers. in Grid.events.js + }, + + + // Process a mousedown on an element that represents a day. For day clicking and selecting. + dayMousedown: function(ev) { + var _this = this; + var view = this.view; + var isSelectable = view.opt('selectable'); + var dates = null; // the inclusive dates of the selection. will be null if no selection + var start; // the inclusive start of the selection + var end; // the *exclusive* end of the selection + var dayEl; + + // this listener tracks a mousedown on a day element, and a subsequent drag. + // if the drag ends on the same day, it is a 'dayClick'. + // if 'selectable' is enabled, this listener also detects selections. + var dragListener = new DragListener(this.coordMap, { + //distance: 5, // needs more work if we want dayClick to fire correctly + scroll: view.opt('dragScroll'), + dragStart: function() { + view.unselect(); // since we could be rendering a new selection, we want to clear any old one + }, + cellOver: function(cell, date) { + if (dragListener.origDate) { // click needs to have started on a cell + + dayEl = _this.getCellDayEl(cell); + + dates = [ date, dragListener.origDate ].sort(dateCompare); + start = dates[0]; + end = dates[1].clone().add(_this.cellDuration); + + if (isSelectable) { + _this.renderSelection(start, end); + } + } + }, + cellOut: function(cell, date) { + dates = null; + _this.destroySelection(); + }, + listenStop: function(ev) { + if (dates) { // started and ended on a cell? + if (dates[0].isSame(dates[1])) { + view.trigger('dayClick', dayEl[0], start, ev); + } + if (isSelectable) { + // the selection will already have been rendered. just report it + view.reportSelection(start, end, ev); + } + } + } + }); + + dragListener.mousedown(ev); // start listening, which will eventually initiate a dragStart + }, + + + /* Event Dragging + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a event being dragged over the given date(s). + // `end` can be null, as well as `seg`. See View's documentation on renderDrag for more info. + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(start, end, seg) { + // subclasses must implement + }, + + + // Unrenders a visual indication of an event being dragged + destroyDrag: function() { + // subclasses must implement + }, + + + /* Event Resizing + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being resized. + // `start` and `end` are the updated dates of the event. `seg` is the original segment object involved in the drag. + renderResize: function(start, end, seg) { + // subclasses must implement + }, + + + // Unrenders a visual indication of an event being resized. + destroyResize: function() { + // subclasses must implement + }, + + + /* Event Helper + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a mock event over the given date(s). + // `end` can be null, in which case the mock event that is rendered will have a null end time. + // `sourceSeg` is the internal segment object involved in the drag. If null, something external is dragging. + renderRangeHelper: function(start, end, sourceSeg) { + var view = this.view; + var fakeEvent; + + // compute the end time if forced to do so (this is what EventManager does) + if (!end && view.opt('forceEventDuration')) { + end = view.calendar.getDefaultEventEnd(!start.hasTime(), start); + } + + fakeEvent = sourceSeg ? createObject(sourceSeg.event) : {}; // mask the original event object if possible + fakeEvent.start = start; + fakeEvent.end = end; + fakeEvent.allDay = !(start.hasTime() || (end && end.hasTime())); // freshly compute allDay + + // this extra className will be useful for differentiating real events from mock events in CSS + fakeEvent.className = (fakeEvent.className || []).concat('fc-helper'); + + // if something external is being dragged in, don't render a resizer + if (!sourceSeg) { + fakeEvent.editable = false; + } + + this.renderHelper(fakeEvent, sourceSeg); // do the actual rendering + }, + + + // Renders a mock event + renderHelper: function(event, sourceSeg) { + // subclasses must implement + }, + + + // Unrenders a mock event + destroyHelper: function() { + // subclasses must implement + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection. Will highlight by default but can be overridden by subclasses. + renderSelection: function(start, end) { + this.renderHighlight(start, end); + }, + + + // Unrenders any visual indications of a selection. Will unrender a highlight by default. + destroySelection: function() { + this.destroyHighlight(); + }, + + + /* Highlight + ------------------------------------------------------------------------------------------------------------------*/ + + + // Puts visual emphasis on a certain date range + renderHighlight: function(start, end) { + // subclasses should implement + }, + + + // Removes visual emphasis on a date range + destroyHighlight: function() { + // subclasses should implement + }, + + + + /* Generic rendering utilities for subclasses + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a day-of-week header row + headHtml: function() { + return '' + + '
' + + '' + + '' + + this.rowHtml('head') + // leverages RowRenderer + '' + + '
' + + '
'; + }, + + + // Used by the `headHtml` method, via RowRenderer, for rendering the HTML of a day-of-week header cell + headCellHtml: function(row, col, date) { + var view = this.view; + var calendar = view.calendar; + var colFormat = view.opt('columnFormat'); + + return '' + + '' + + htmlEscape(calendar.formatDate(date, colFormat)) + + ''; + }, + + + // Renders the HTML for a single-day background cell + bgCellHtml: function(row, col, date) { + var view = this.view; + var classes = this.getDayClasses(date); + + classes.unshift('fc-day', view.widgetContentClass); + + return ''; + }, + + + // Computes HTML classNames for a single-day cell + getDayClasses: function(date) { + var view = this.view; + var today = view.calendar.getNow().stripTime(); + var classes = [ 'fc-' + dayIDs[date.day()] ]; + + if ( + view.name === 'month' && + date.month() != view.intervalStart.month() + ) { + classes.push('fc-other-month'); + } + + if (date.isSame(today, 'day')) { + classes.push( + 'fc-today', + view.highlightStateClass + ); + } + else if (date < today) { + classes.push('fc-past'); + } + else { + classes.push('fc-future'); + } + + return classes; + } + +}); + +;; + +/* Event-rendering and event-interaction methods for the abstract Grid class +----------------------------------------------------------------------------------------------------------------------*/ + +$.extend(Grid.prototype, { + + mousedOverSeg: null, // the segment object the user's mouse is over. null if over nothing + isDraggingSeg: false, // is a segment being dragged? boolean + isResizingSeg: false, // is a segment being resized? boolean + + + // Renders the given events onto the grid + renderEvents: function(events) { + // subclasses must implement + }, + + + // Retrieves all rendered segment objects in this grid + getSegs: function() { + // subclasses must implement + }, + + + // Unrenders all events. Subclasses should implement, calling this super-method first. + destroyEvents: function() { + this.triggerSegMouseout(); // trigger an eventMouseout if user's mouse is over an event + }, + + + // Renders a `el` property for each seg, and only returns segments that successfully rendered + renderSegs: function(segs, disableResizing) { + var view = this.view; + var html = ''; + var renderedSegs = []; + var i; + + // build a large concatenation of event segment HTML + for (i = 0; i < segs.length; i++) { + html += this.renderSegHtml(segs[i], disableResizing); + } + + // Grab individual elements from the combined HTML string. Use each as the default rendering. + // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false. + $(html).each(function(i, node) { + var seg = segs[i]; + var el = view.resolveEventEl(seg.event, $(node)); + if (el) { + el.data('fc-seg', seg); // used by handlers + seg.el = el; + renderedSegs.push(seg); + } + }); + + return renderedSegs; + }, + + + // Generates the HTML for the default rendering of a segment + renderSegHtml: function(seg, disableResizing) { + // subclasses must implement + }, + + + // Converts an array of event objects into an array of segment objects + eventsToSegs: function(events, intervalStart, intervalEnd) { + var _this = this; + + return $.map(events, function(event) { + return _this.eventToSegs(event, intervalStart, intervalEnd); // $.map flattens all returned arrays together + }); + }, + + + // Slices a single event into an array of event segments. + // When `intervalStart` and `intervalEnd` are specified, intersect the events with that interval. + // Otherwise, let the subclass decide how it wants to slice the segments over the grid. + eventToSegs: function(event, intervalStart, intervalEnd) { + var eventStart = event.start.clone().stripZone(); // normalize + var eventEnd = this.view.calendar.getEventEnd(event).stripZone(); // compute (if necessary) and normalize + var segs; + var i, seg; + + if (intervalStart && intervalEnd) { + seg = intersectionToSeg(eventStart, eventEnd, intervalStart, intervalEnd); + segs = seg ? [ seg ] : []; + } + else { + segs = this.rangeToSegs(eventStart, eventEnd); // defined by the subclass + } + + // assign extra event-related properties to the segment objects + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + seg.event = event; + seg.eventStartMS = +eventStart; + seg.eventDurationMS = eventEnd - eventStart; + } + + return segs; + }, + + + /* Handlers + ------------------------------------------------------------------------------------------------------------------*/ + + + // Attaches event-element-related handlers to the container element and leverage bubbling + bindSegHandlers: function() { + var _this = this; + var view = this.view; + + $.each( + { + mouseenter: function(seg, ev) { + _this.triggerSegMouseover(seg, ev); + }, + mouseleave: function(seg, ev) { + _this.triggerSegMouseout(seg, ev); + }, + click: function(seg, ev) { + return view.trigger('eventClick', this, seg.event, ev); // can return `false` to cancel + }, + mousedown: function(seg, ev) { + if ($(ev.target).is('.fc-resizer') && view.isEventResizable(seg.event)) { + _this.segResizeMousedown(seg, ev); + } + else if (view.isEventDraggable(seg.event)) { + _this.segDragMousedown(seg, ev); + } + } + }, + function(name, func) { + // attach the handler to the container element and only listen for real event elements via bubbling + _this.el.on(name, '.fc-event-container > *', function(ev) { + var seg = $(this).data('fc-seg'); // grab segment data. put there by View::renderEvents + + // only call the handlers if there is not a drag/resize in progress + if (seg && !_this.isDraggingSeg && !_this.isResizingSeg) { + return func.call(this, seg, ev); // `this` will be the event element + } + }); + } + ); + }, + + + // Updates internal state and triggers handlers for when an event element is moused over + triggerSegMouseover: function(seg, ev) { + if (!this.mousedOverSeg) { + this.mousedOverSeg = seg; + this.view.trigger('eventMouseover', seg.el[0], seg.event, ev); + } + }, + + + // Updates internal state and triggers handlers for when an event element is moused out. + // Can be given no arguments, in which case it will mouseout the segment that was previously moused over. + triggerSegMouseout: function(seg, ev) { + ev = ev || {}; // if given no args, make a mock mouse event + + if (this.mousedOverSeg) { + seg = seg || this.mousedOverSeg; // if given no args, use the currently moused-over segment + this.mousedOverSeg = null; + this.view.trigger('eventMouseout', seg.el[0], seg.event, ev); + } + }, + + + /* Dragging + ------------------------------------------------------------------------------------------------------------------*/ + + + // Called when the user does a mousedown on an event, which might lead to dragging. + // Generic enough to work with any type of Grid. + segDragMousedown: function(seg, ev) { + var _this = this; + var view = this.view; + var el = seg.el; + var event = seg.event; + var newStart, newEnd; + + // A clone of the original element that will move with the mouse + var mouseFollower = new MouseFollower(seg.el, { + parentEl: view.el, + opacity: view.opt('dragOpacity'), + revertDuration: view.opt('dragRevertDuration'), + zIndex: 2 // one above the .fc-view + }); + + // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents + // of the view. + var dragListener = new DragListener(view.coordMap, { + distance: 5, + scroll: view.opt('dragScroll'), + listenStart: function(ev) { + mouseFollower.hide(); // don't show until we know this is a real drag + mouseFollower.start(ev); + }, + dragStart: function(ev) { + _this.triggerSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported + _this.isDraggingSeg = true; + view.hideEvent(event); // hide all event segments. our mouseFollower will take over + view.trigger('eventDragStart', el[0], event, ev, {}); // last argument is jqui dummy + }, + cellOver: function(cell, date) { + var origDate = seg.cellDate || dragListener.origDate; + var res = _this.computeDraggedEventDates(seg, origDate, date); + newStart = res.start; + newEnd = res.end; + + if (view.renderDrag(newStart, newEnd, seg)) { // have the view render a visual indication + mouseFollower.hide(); // if the view is already using a mock event "helper", hide our own + } + else { + mouseFollower.show(); + } + }, + cellOut: function() { // called before mouse moves to a different cell OR moved out of all cells + newStart = null; + view.destroyDrag(); // unrender whatever was done in view.renderDrag + mouseFollower.show(); // show in case we are moving out of all cells + }, + dragStop: function(ev) { + var hasChanged = newStart && !newStart.isSame(event.start); + + // do revert animation if hasn't changed. calls a callback when finished (whether animation or not) + mouseFollower.stop(!hasChanged, function() { + _this.isDraggingSeg = false; + view.destroyDrag(); + view.showEvent(event); + view.trigger('eventDragStop', el[0], event, ev, {}); // last argument is jqui dummy + + if (hasChanged) { + view.eventDrop(el[0], event, newStart, ev); // will rerender all events... + } + }); + }, + listenStop: function() { + mouseFollower.stop(); // put in listenStop in case there was a mousedown but the drag never started + } + }); + + dragListener.mousedown(ev); // start listening, which will eventually lead to a dragStart + }, + + + // Given a segment, the dates where a drag began and ended, calculates the Event Object's new start and end dates + computeDraggedEventDates: function(seg, dragStartDate, dropDate) { + var view = this.view; + var event = seg.event; + var start = event.start; + var end = view.calendar.getEventEnd(event); + var delta; + var newStart; + var newEnd; + + if (dropDate.hasTime() === dragStartDate.hasTime()) { + delta = dayishDiff(dropDate, dragStartDate); + newStart = start.clone().add(delta); + if (event.end === null) { // do we need to compute an end? + newEnd = null; + } + else { + newEnd = end.clone().add(delta); + } + } + else { + // if switching from day <-> timed, start should be reset to the dropped date, and the end cleared + newStart = dropDate; + newEnd = null; // end should be cleared + } + + return { start: newStart, end: newEnd }; + }, + + + /* Resizing + ------------------------------------------------------------------------------------------------------------------*/ + + + // Called when the user does a mousedown on an event's resizer, which might lead to resizing. + // Generic enough to work with any type of Grid. + segResizeMousedown: function(seg, ev) { + var _this = this; + var view = this.view; + var el = seg.el; + var event = seg.event; + var start = event.start; + var end = view.calendar.getEventEnd(event); + var newEnd = null; + var dragListener; + + function destroy() { // resets the rendering + _this.destroyResize(); + view.showEvent(event); + } + + // Tracks mouse movement over the *grid's* coordinate map + dragListener = new DragListener(this.coordMap, { + distance: 5, + scroll: view.opt('dragScroll'), + dragStart: function(ev) { + _this.triggerSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported + _this.isResizingSeg = true; + view.trigger('eventResizeStart', el[0], event, ev, {}); // last argument is jqui dummy + }, + cellOver: function(cell, date) { + // compute the new end. don't allow it to go before the event's start + if (date.isBefore(start)) { // allows comparing ambig to non-ambig + date = start; + } + newEnd = date.clone().add(_this.cellDuration); // make it an exclusive end + + if (newEnd.isSame(end)) { + newEnd = null; + destroy(); + } + else { + _this.renderResize(start, newEnd, seg); + view.hideEvent(event); + } + }, + cellOut: function() { // called before mouse moves to a different cell OR moved out of all cells + newEnd = null; + destroy(); + }, + dragStop: function(ev) { + _this.isResizingSeg = false; + destroy(); + view.trigger('eventResizeStop', el[0], event, ev, {}); // last argument is jqui dummy + + if (newEnd) { + view.eventResize(el[0], event, newEnd, ev); // will rerender all events... + } + } + }); + + dragListener.mousedown(ev); // start listening, which will eventually lead to a dragStart + }, + + + /* Rendering Utils + ------------------------------------------------------------------------------------------------------------------*/ + + + // Generic utility for generating the HTML classNames for an event segment's element + getSegClasses: function(seg, isDraggable, isResizable) { + var event = seg.event; + var classes = [ + 'fc-event', + seg.isStart ? 'fc-start' : 'fc-not-start', + seg.isEnd ? 'fc-end' : 'fc-not-end' + ].concat( + event.className, + event.source ? event.source.className : [] + ); + + if (isDraggable) { + classes.push('fc-draggable'); + } + if (isResizable) { + classes.push('fc-resizable'); + } + + return classes; + }, + + + // Utility for generating a CSS string with all the event skin-related properties + getEventSkinCss: function(event) { + var view = this.view; + var source = event.source || {}; + var eventColor = event.color; + var sourceColor = source.color; + var optionColor = view.opt('eventColor'); + var backgroundColor = + event.backgroundColor || + eventColor || + source.backgroundColor || + sourceColor || + view.opt('eventBackgroundColor') || + optionColor; + var borderColor = + event.borderColor || + eventColor || + source.borderColor || + sourceColor || + view.opt('eventBorderColor') || + optionColor; + var textColor = + event.textColor || + source.textColor || + view.opt('eventTextColor'); + var statements = []; + if (backgroundColor) { + statements.push('background-color:' + backgroundColor); + } + if (borderColor) { + statements.push('border-color:' + borderColor); + } + if (textColor) { + statements.push('color:' + textColor); + } + return statements.join(';'); + } + +}); + + +/* Event Segment Utilities +----------------------------------------------------------------------------------------------------------------------*/ + + +// A cmp function for determining which segments should take visual priority +function compareSegs(seg1, seg2) { + return seg1.eventStartMS - seg2.eventStartMS || // earlier events go first + seg2.eventDurationMS - seg1.eventDurationMS || // tie? longer events go first + seg2.event.allDay - seg1.event.allDay || // tie? put all-day events first (booleans cast to 0/1) + (seg1.event.title || '').localeCompare(seg2.event.title); // tie? alphabetically by title +} + + +;; + +/* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week. +----------------------------------------------------------------------------------------------------------------------*/ + +function DayGrid(view) { + Grid.call(this, view); // call the super-constructor +} + + +DayGrid.prototype = createObject(Grid.prototype); // declare the super-class +$.extend(DayGrid.prototype, { + + numbersVisible: false, // should render a row for day/week numbers? manually set by the view + cellDuration: moment.duration({ days: 1 }), // required for Grid.event.js. Each cell is always a single day + bottomCoordPadding: 0, // hack for extending the hit area for the last row of the coordinate grid + + rowEls: null, // set of fake row elements + dayEls: null, // set of whole-day elements comprising the row's background + helperEls: null, // set of cell skeleton elements for rendering the mock event "helper" + highlightEls: null, // set of cell skeleton elements for rendering the highlight + + + // Renders the rows and columns into the component's `this.el`, which should already be assigned. + // isRigid determins whether the individual rows should ignore the contents and be a constant height. + // Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient. + render: function(isRigid) { + var view = this.view; + var html = ''; + var row; + + for (row = 0; row < view.rowCnt; row++) { + html += this.dayRowHtml(row, isRigid); + } + this.el.html(html); + + this.rowEls = this.el.find('.fc-row'); + this.dayEls = this.el.find('.fc-day'); + + // run all the day cells through the dayRender callback + this.dayEls.each(function(i, node) { + var date = view.cellToDate(Math.floor(i / view.colCnt), i % view.colCnt); + view.trigger('dayRender', null, date, $(node)); + }); + + Grid.prototype.render.call(this); // call the super-method + }, + + + destroy: function() { + this.destroySegPopover(); + }, + + + // Generates the HTML for a single row. `row` is the row number. + dayRowHtml: function(row, isRigid) { + var view = this.view; + var classes = [ 'fc-row', 'fc-week', view.widgetContentClass ]; + + if (isRigid) { + classes.push('fc-rigid'); + } + + return '' + + '
' + + '
' + + '' + + this.rowHtml('day', row) + // leverages RowRenderer. calls dayCellHtml() + '
' + + '
' + + '
' + + '' + + (this.numbersVisible ? + '' + + this.rowHtml('number', row) + // leverages RowRenderer. View will define render method + '' : + '' + ) + + '
' + + '
' + + '
'; + }, + + + // Renders the HTML for a whole-day cell. Will eventually end up in the day-row's background. + // We go through a 'day' row type instead of just doing a 'bg' row type so that the View can do custom rendering + // specifically for whole-day rows, whereas a 'bg' might also be used for other purposes (TimeGrid bg for example). + dayCellHtml: function(row, col, date) { + return this.bgCellHtml(row, col, date); + }, + + + /* Coordinates & Cells + ------------------------------------------------------------------------------------------------------------------*/ + + + // Populates the empty `rows` and `cols` arrays with coordinates of the cells. For CoordGrid. + buildCoords: function(rows, cols) { + var colCnt = this.view.colCnt; + var e, n, p; + + this.dayEls.slice(0, colCnt).each(function(i, _e) { // iterate the first row of day elements + e = $(_e); + n = e.offset().left; + if (i) { + p[1] = n; + } + p = [ n ]; + cols[i] = p; + }); + p[1] = n + e.outerWidth(); + + this.rowEls.each(function(i, _e) { + e = $(_e); + n = e.offset().top; + if (i) { + p[1] = n; + } + p = [ n ]; + rows[i] = p; + }); + p[1] = n + e.outerHeight() + this.bottomCoordPadding; // hack to extend hit area of last row + }, + + + // Converts a cell to a date + getCellDate: function(cell) { + return this.view.cellToDate(cell); // leverages the View's cell system + }, + + + // Gets the whole-day element associated with the cell + getCellDayEl: function(cell) { + return this.dayEls.eq(cell.row * this.view.colCnt + cell.col); + }, + + + // Converts a range with an inclusive `start` and an exclusive `end` into an array of segment objects + rangeToSegs: function(start, end) { + return this.view.rangeToSegments(start, end); // leverages the View's cell system + }, + + + /* Event Drag Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event hovering over the given date(s). + // `end` can be null, as well as `seg`. See View's documentation on renderDrag for more info. + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(start, end, seg) { + var opacity; + + // always render a highlight underneath + this.renderHighlight( + start, + end || this.view.calendar.getDefaultEventEnd(true, start) + ); + + // if a segment from the same calendar but another component is being dragged, render a helper event + if (seg && !seg.el.closest(this.el).length) { + + this.renderRangeHelper(start, end, seg); + + opacity = this.view.opt('dragOpacity'); + if (opacity !== undefined) { + this.helperEls.css('opacity', opacity); + } + + return true; // a helper has been rendered + } + }, + + + // Unrenders any visual indication of a hovering event + destroyDrag: function() { + this.destroyHighlight(); + this.destroyHelper(); + }, + + + /* Event Resize Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being resized + renderResize: function(start, end, seg) { + this.renderHighlight(start, end); + this.renderRangeHelper(start, end, seg); + }, + + + // Unrenders a visual indication of an event being resized + destroyResize: function() { + this.destroyHighlight(); + this.destroyHelper(); + }, + + + /* Event Helper + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a mock "helper" event. `sourceSeg` is the associated internal segment object. It can be null. + renderHelper: function(event, sourceSeg) { + var helperNodes = []; + var rowStructs = this.renderEventRows([ event ]); + + // inject each new event skeleton into each associated row + this.rowEls.each(function(row, rowNode) { + var rowEl = $(rowNode); // the .fc-row + var skeletonEl = $('
'); // will be absolutely positioned + var skeletonTop; + + // If there is an original segment, match the top position. Otherwise, put it at the row's top level + if (sourceSeg && sourceSeg.row === row) { + skeletonTop = sourceSeg.el.position().top; + } + else { + skeletonTop = rowEl.find('.fc-content-skeleton tbody').position().top; + } + + skeletonEl.css('top', skeletonTop) + .find('table') + .append(rowStructs[row].tbodyEl); + + rowEl.append(skeletonEl); + helperNodes.push(skeletonEl[0]); + }); + + this.helperEls = $(helperNodes); // array -> jQuery set + }, + + + // Unrenders any visual indication of a mock helper event + destroyHelper: function() { + if (this.helperEls) { + this.helperEls.remove(); + this.helperEls = null; + } + }, + + + /* Highlighting + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders an emphasis on the given date range. `start` is an inclusive, `end` is exclusive. + renderHighlight: function(start, end) { + var segs = this.rangeToSegs(start, end); + var highlightNodes = []; + var i, seg; + var el; + + // build an event skeleton for each row that needs it + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + el = $( + this.highlightSkeletonHtml(seg.leftCol, seg.rightCol + 1) // make end exclusive + ); + el.appendTo(this.rowEls[seg.row]); + highlightNodes.push(el[0]); + } + + this.highlightEls = $(highlightNodes); // array -> jQuery set + }, + + + // Unrenders any visual emphasis on a date range + destroyHighlight: function() { + if (this.highlightEls) { + this.highlightEls.remove(); + this.highlightEls = null; + } + }, + + + // Generates the HTML used to build a single-row "highlight skeleton", a table that frames highlight cells + highlightSkeletonHtml: function(startCol, endCol) { + var colCnt = this.view.colCnt; + var cellHtml = ''; + + if (startCol > 0) { + cellHtml += ' elements that should be appended to each row's content skeleton. + // Returns an array of rowStruct objects (see the bottom of `renderEventRow`). + renderEventRows: function(events) { + var segs = this.eventsToSegs(events); + var rowStructs = []; + var segRows; + var row; + + segs = this.renderSegs(segs); // returns a new array with only visible segments + segRows = this.groupSegRows(segs); // group into nested arrays + + // iterate each row of segment groupings + for (row = 0; row < segRows.length; row++) { + rowStructs.push( + this.renderEventRow(row, segRows[row]) + ); + } + + return rowStructs; + }, + + + // Builds the HTML to be used for the default element for an individual segment + renderSegHtml: function(seg, disableResizing) { + var view = this.view; + var isRTL = view.opt('isRTL'); + var event = seg.event; + var isDraggable = view.isEventDraggable(event); + var isResizable = !disableResizing && event.allDay && seg.isEnd && view.isEventResizable(event); + var classes = this.getSegClasses(seg, isDraggable, isResizable); + var skinCss = this.getEventSkinCss(event); + var timeHtml = ''; + var titleHtml; + + classes.unshift('fc-day-grid-event'); + + // Only display a timed events time if it is the starting segment + if (!event.allDay && seg.isStart) { + timeHtml = '' + htmlEscape(view.getEventTimeText(event)) + ''; + } + + titleHtml = + '' + + (htmlEscape(event.title || '') || ' ') + // we always want one line of height + ''; + + return '' + + '
' + + (isRTL ? + titleHtml + ' ' + timeHtml : // put a natural space in between + timeHtml + ' ' + titleHtml // + ) + + '
' + + (isResizable ? + '
' : + '' + ) + + ''; + }, + + + // Given a row # and an array of segments all in the same row, render a
element, a skeleton that contains + // the segments. Returns object with a bunch of internal data about how the render was calculated. + renderEventRow: function(row, rowSegs) { + var view = this.view; + var colCnt = view.colCnt; + var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels + var levelCnt = Math.max(1, segLevels.length); // ensure at least one level + var tbody = $(''); + var segMatrix = []; // lookup for which segments are rendered into which level+col cells + var cellMatrix = []; // lookup for all '); + + segMatrix.push([]); + cellMatrix.push([]); + loneCellMatrix.push([]); + + // levelCnt might be 1 even though there are no actual levels. protect against this. + // this single empty row is useful for styling. + if (levelSegs) { + for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level + seg = levelSegs[j]; + + emptyCellsUntil(seg.leftCol); + + // create a container that occupies or more columns. append the event element. + td = $(' at a time and stop when we find one out of bounds + for (i = 0; i < trEls.length; i++) { + trEl = trEls.eq(i).removeClass('fc-limited'); // get and reveal + if (trEl.position().top + trEl.outerHeight() > rowHeight) { + return i; + } + } + + return false; // should not limit at all + }, + + + // Limits the given grid row to the maximum number of levels and injects "more" links if necessary. + // `row` is the row number. + // `levelLimit` is a number for the maximum (inclusive) number of levels allowed. + limitRow: function(row, levelLimit) { + var _this = this; + var view = this.view; + var rowStruct = this.rowStructs[row]; + var moreNodes = []; // array of "more" links and and segment elements past the limit + .addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array + + // iterate though segments in the last allowable level + for (i = 0; i < levelSegs.length; i++) { + seg = levelSegs[i]; + emptyCellsUntil(seg.leftCol); // process empty cells before the segment + + // determine *all* segments below `seg` that occupy the same columns + colSegsBelow = []; + totalSegsBelow = 0; + while (col <= seg.rightCol) { + cell = { row: row, col: col }; + segsBelow = this.getCellSegs(cell, levelLimit); + colSegsBelow.push(segsBelow); + totalSegsBelow += segsBelow.length; + col++; + } + + if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links? + td = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell + rowspan = td.attr('rowspan') || 1; + segMoreNodes = []; + + // make a replacement '; + + html += + '' + + (!isRTL ? axisHtml : '') + + '"; + + slotTime.add(this.slotDuration); + } + + return html; + }, + + + // Parses various options into properties of this object + processOptions: function() { + var view = this.view; + var slotDuration = view.opt('slotDuration'); + var snapDuration = view.opt('snapDuration'); + + slotDuration = moment.duration(slotDuration); + snapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration; + + this.slotDuration = slotDuration; + this.snapDuration = snapDuration; + this.cellDuration = snapDuration; // important to assign this for Grid.events.js + + this.minTime = moment.duration(view.opt('minTime')); + this.maxTime = moment.duration(view.opt('maxTime')); + }, + + + // Slices up a date range into a segment for each column + rangeToSegs: function(rangeStart, rangeEnd) { + var view = this.view; + var segs = []; + var seg; + var col; + var cellDate; + var colStart, colEnd; + + // normalize + rangeStart = rangeStart.clone().stripZone(); + rangeEnd = rangeEnd.clone().stripZone(); + + for (col = 0; col < view.colCnt; col++) { + cellDate = view.cellToDate(0, col); // use the View's cell system for this + colStart = cellDate.clone().time(this.minTime); + colEnd = cellDate.clone().time(this.maxTime); + seg = intersectionToSeg(rangeStart, rangeEnd, colStart, colEnd); + if (seg) { + seg.col = col; + segs.push(seg); + } + } + + return segs; + }, + + + /* Coordinates + ------------------------------------------------------------------------------------------------------------------*/ + + + // Called when there is a window resize/zoom and we need to recalculate coordinates for the grid + resize: function() { + this.computeSlatTops(); + this.updateSegVerticals(); + }, + + + // Populates the given empty `rows` and `cols` arrays with offset positions of the "snap" cells. + // "Snap" cells are different the slots because they might have finer granularity. + buildCoords: function(rows, cols) { + var colCnt = this.view.colCnt; + var originTop = this.el.offset().top; + var snapTime = moment.duration(+this.minTime); + var p = null; + var e, n; + + this.dayEls.slice(0, colCnt).each(function(i, _e) { + e = $(_e); + n = e.offset().left; + if (p) { + p[1] = n; + } + p = [ n ]; + cols[i] = p; + }); + p[1] = n + e.outerWidth(); + + p = null; + while (snapTime < this.maxTime) { + n = originTop + this.computeTimeTop(snapTime); + if (p) { + p[1] = n; + } + p = [ n ]; + rows.push(p); + snapTime.add(this.snapDuration); + } + p[1] = originTop + this.computeTimeTop(snapTime); // the position of the exclusive end + }, + + + // Gets the datetime for the given slot cell + getCellDate: function(cell) { + var view = this.view; + var calendar = view.calendar; + + return calendar.rezoneDate( // since we are adding a time, it needs to be in the calendar's timezone + view.cellToDate(0, cell.col) // View's coord system only accounts for start-of-day for column + .time(this.minTime + this.snapDuration * cell.row) + ); + }, + + + // Gets the element that represents the whole-day the cell resides on + getCellDayEl: function(cell) { + return this.dayEls.eq(cell.col); + }, + + + // Computes the top coordinate, relative to the bounds of the grid, of the given date. + // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight. + computeDateTop: function(date, startOfDayDate) { + return this.computeTimeTop( + moment.duration( + date.clone().stripZone() - startOfDayDate.clone().stripTime() + ) + ); + }, + + + // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration). + computeTimeTop: function(time) { + var slatCoverage = (time - this.minTime) / this.slotDuration; // floating-point value of # of slots covered + var slatIndex; + var slatRemainder; + var slatTop; + var slatBottom; + + // constrain. because minTime/maxTime might be customized + slatCoverage = Math.max(0, slatCoverage); + slatCoverage = Math.min(this.slatEls.length, slatCoverage); + + slatIndex = Math.floor(slatCoverage); // an integer index of the furthest whole slot + slatRemainder = slatCoverage - slatIndex; + slatTop = this.slatTops[slatIndex]; // the top position of the furthest whole slot + + if (slatRemainder) { // time spans part-way into the slot + slatBottom = this.slatTops[slatIndex + 1]; + return slatTop + (slatBottom - slatTop) * slatRemainder; // part-way between slots + } + else { + return slatTop; + } + }, + + + // Queries each `slatEl` for its position relative to the grid's container and stores it in `slatTops`. + // Includes the the bottom of the last slat as the last item in the array. + computeSlatTops: function() { + var tops = []; + var top; + + this.slatEls.each(function(i, node) { + top = $(node).position().top; + tops.push(top); + }); + + tops.push(top + this.slatEls.last().outerHeight()); // bottom of the last slat + + this.slatTops = tops; + }, + + + /* Event Drag Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being dragged over the specified date(s). + // `end` and `seg` can be null. See View's documentation on renderDrag for more info. + renderDrag: function(start, end, seg) { + var opacity; + + if (seg) { // if there is event information for this drag, render a helper event + this.renderRangeHelper(start, end, seg); + + opacity = this.view.opt('dragOpacity'); + if (opacity !== undefined) { + this.helperEl.css('opacity', opacity); + } + + return true; // signal that a helper has been rendered + } + else { + // otherwise, just render a highlight + this.renderHighlight( + start, + end || this.view.calendar.getDefaultEventEnd(false, start) + ); + } + }, + + + // Unrenders any visual indication of an event being dragged + destroyDrag: function() { + this.destroyHelper(); + this.destroyHighlight(); + }, + + + /* Event Resize Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being resized + renderResize: function(start, end, seg) { + this.renderRangeHelper(start, end, seg); + }, + + + // Unrenders any visual indication of an event being resized + destroyResize: function() { + this.destroyHelper(); + }, + + + /* Event Helper + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a mock "helper" event. `sourceSeg` is the original segment object and might be null (an external drag) + renderHelper: function(event, sourceSeg) { + var res = this.renderEventTable([ event ]); + var tableEl = res.tableEl; + var segs = res.segs; + var i, seg; + var sourceEl; + + // Try to make the segment that is in the same row as sourceSeg look the same + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + if (sourceSeg && sourceSeg.col === seg.col) { + sourceEl = sourceSeg.el; + seg.el.css({ + left: sourceEl.css('left'), + right: sourceEl.css('right'), + 'margin-left': sourceEl.css('margin-left'), + 'margin-right': sourceEl.css('margin-right') + }); + } + } + + this.helperEl = $('
') + .append(tableEl) + .appendTo(this.el); + }, + + + // Unrenders any mock helper event + destroyHelper: function() { + if (this.helperEl) { + this.helperEl.remove(); + this.helperEl = null; + } + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight. + renderSelection: function(start, end) { + if (this.view.opt('selectHelper')) { // this setting signals that a mock helper event should be rendered + this.renderRangeHelper(start, end); + } + else { + this.renderHighlight(start, end); + } + }, + + + // Unrenders any visual indication of a selection + destroySelection: function() { + this.destroyHelper(); + this.destroyHighlight(); + }, + + + /* Highlight + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders an emphasis on the given date range. `start` is inclusive. `end` is exclusive. + renderHighlight: function(start, end) { + this.highlightEl = $( + this.highlightSkeletonHtml(start, end) + ).appendTo(this.el); + }, + + + // Unrenders the emphasis on a date range + destroyHighlight: function() { + if (this.highlightEl) { + this.highlightEl.remove(); + this.highlightEl = null; + } + }, + + + // Generates HTML for a table element with containers in each column, responsible for absolutely positioning the + // highlight elements to cover the highlighted slots. + highlightSkeletonHtml: function(start, end) { + var view = this.view; + var segs = this.rangeToSegs(start, end); + var cellHtml = ''; + var col = 0; + var i, seg; + var dayDate; + var top, bottom; + + for (i = 0; i < segs.length; i++) { // loop through the segments. one per column + seg = segs[i]; + + // need empty cells beforehand? + if (col < seg.col) { + cellHtml += '
'; + + col++; + } + + // need empty cells after the last segment? + if (col < view.colCnt) { + cellHtml += ''; + } + }, + + + // Generates the HTML that will go before content-skeleton cells that display the day/week numbers. + // Queried by the DayGrid subcomponent. Ordering depends on isRTL. + numberIntroHtml: function(row) { + if (this.weekNumbersVisible) { + return '' + + ''; + } + }, + + + // Generates the HTML that goes before the day bg cells for each day-row. + // Queried by the DayGrid subcomponent. Ordering depends on isRTL. + dayIntroHtml: function() { + if (this.weekNumbersVisible) { + return ''; + } + }, + + + // Generates the HTML that goes before every other type of row generated by DayGrid. Ordering depends on isRTL. + // Affects helper-skeleton and highlight-skeleton rows. + introHtml: function() { + if (this.weekNumbersVisible) { + return ''; + } + }, + + + // Generates the HTML for the '; + }, + + + // Generates an HTML attribute string for setting the width of the week number column, if it is known + weekNumberStyleAttr: function() { + if (this.weekNumberWidth !== null) { + return 'style="width:' + this.weekNumberWidth + 'px"'; + } + return ''; + }, + + + // Determines whether each row should have a constant height + hasRigidRows: function() { + var eventLimit = this.opt('eventLimit'); + return eventLimit && typeof eventLimit !== 'number'; + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + + // Refreshes the horizontal dimensions of the view + updateWidth: function() { + if (this.weekNumbersVisible) { + // Make sure all week number cells running down the side have the same width. + // Record the width for cells created later. + this.weekNumberWidth = matchCellWidths( + this.el.find('.fc-week-number') + ); + } + }, + + + // Adjusts the vertical dimensions of the view to the specified values + setHeight: function(totalHeight, isAuto) { + var eventLimit = this.opt('eventLimit'); + var scrollerHeight; + + // reset all heights to be natural + unsetScroller(this.scrollerEl); + uncompensateScroll(this.headRowEl); + + this.dayGrid.destroySegPopover(); // kill the "more" popover if displayed + + // is the event limit a constant level number? + if (eventLimit && typeof eventLimit === 'number') { + this.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after + } + + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.setGridHeight(scrollerHeight, isAuto); + + // is the event limit dynamically calculated? + if (eventLimit && typeof eventLimit !== 'number') { + this.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set + } + + if (!isAuto && setPotentialScroller(this.scrollerEl, scrollerHeight)) { // using scrollbars? + + compensateScroll(this.headRowEl, getScrollbarWidths(this.scrollerEl)); + + // doing the scrollbar compensation might have created text overflow which created more height. redo + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.scrollerEl.height(scrollerHeight); + + this.restoreScroll(); + } + }, + + + // Sets the height of just the DayGrid component in this view + setGridHeight: function(height, isAuto) { + if (isAuto) { + undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding + } + else { + distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows + } + }, + + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders the given events onto the view and populates the segments array + renderEvents: function(events) { + this.dayGrid.renderEvents(events); + + this.updateHeight(); // must compensate for events that overflow the row + + View.prototype.renderEvents.call(this, events); // call the super-method + }, + + + // Retrieves all segment objects that are rendered in the view + getSegs: function() { + return this.dayGrid.getSegs(); + }, + + + // Unrenders all event elements and clears internal segment data + destroyEvents: function() { + View.prototype.destroyEvents.call(this); // do this before dayGrid's segs have been cleared + + this.recordScroll(); // removing events will reduce height and mess with the scroll, so record beforehand + this.dayGrid.destroyEvents(); + + // we DON'T need to call updateHeight() because: + // A) a renderEvents() call always happens after this, which will eventually call updateHeight() + // B) in IE8, this causes a flash whenever events are rerendered + }, + + + /* Event Dragging + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being dragged over the view. + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(start, end, seg) { + return this.dayGrid.renderDrag(start, end, seg); + }, + + + // Unrenders the visual indication of an event being dragged over the view + destroyDrag: function() { + this.dayGrid.destroyDrag(); + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection + renderSelection: function(start, end) { + this.dayGrid.renderSelection(start, end); + }, + + + // Unrenders a visual indications of a selection + destroySelection: function() { + this.dayGrid.destroySelection(); + } + +}); + +;; + +/* A month view with day cells running in rows (one-per-week) and columns +----------------------------------------------------------------------------------------------------------------------*/ + +setDefaults({ + fixedWeekCount: true +}); + +fcViews.month = MonthView; // register the view + +function MonthView(calendar) { + BasicView.call(this, calendar); // call the super-constructor +} + + +MonthView.prototype = createObject(BasicView.prototype); // define the super-class +$.extend(MonthView.prototype, { + + name: 'month', + + + incrementDate: function(date, delta) { + return date.clone().stripTime().add(delta, 'months').startOf('month'); + }, + + + render: function(date) { + var rowCnt; + + this.intervalStart = date.clone().stripTime().startOf('month'); + this.intervalEnd = this.intervalStart.clone().add(1, 'months'); + + this.start = this.intervalStart.clone(); + this.start = this.skipHiddenDays(this.start); // move past the first week if no visible days + this.start.startOf('week'); + this.start = this.skipHiddenDays(this.start); // move past the first invisible days of the week + + this.end = this.intervalEnd.clone(); + this.end = this.skipHiddenDays(this.end, -1, true); // move in from the last week if no visible days + this.end.add((7 - this.end.weekday()) % 7, 'days'); // move to end of week if not already + this.end = this.skipHiddenDays(this.end, -1, true); // move in from the last invisible days of the week + + rowCnt = Math.ceil( // need to ceil in case there are hidden days + this.end.diff(this.start, 'weeks', true) // returnfloat=true + ); + if (this.isFixedWeeks()) { + this.end.add(6 - rowCnt, 'weeks'); + rowCnt = 6; + } + + this.title = this.calendar.formatDate(this.intervalStart, this.opt('titleFormat')); + + BasicView.prototype.render.call(this, rowCnt, this.getCellsPerWeek(), true); // call the super-method + }, + + + // Overrides the default BasicView behavior to have special multi-week auto-height logic + setGridHeight: function(height, isAuto) { + + isAuto = isAuto || this.opt('weekMode') === 'variable'; // LEGACY: weekMode is deprecated + + // if auto, make the height of each row the height that it would be if there were 6 weeks + if (isAuto) { + height *= this.rowCnt / 6; + } + + distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows + }, + + + isFixedWeeks: function() { + var weekMode = this.opt('weekMode'); // LEGACY: weekMode is deprecated + if (weekMode) { + return weekMode === 'fixed'; // if any other type of weekMode, assume NOT fixed + } + + return this.opt('fixedWeekCount'); + } + +}); + +;; + +/* A week view with simple day cells running horizontally +----------------------------------------------------------------------------------------------------------------------*/ +// TODO: a WeekView mixin for calculating dates and titles + +fcViews.basicWeek = BasicWeekView; // register this view + +function BasicWeekView(calendar) { + BasicView.call(this, calendar); // call the super-constructor +} + + +BasicWeekView.prototype = createObject(BasicView.prototype); // define the super-class +$.extend(BasicWeekView.prototype, { + + name: 'basicWeek', + + + incrementDate: function(date, delta) { + return date.clone().stripTime().add(delta, 'weeks').startOf('week'); + }, + + + render: function(date) { + + this.intervalStart = date.clone().stripTime().startOf('week'); + this.intervalEnd = this.intervalStart.clone().add(1, 'weeks'); + + this.start = this.skipHiddenDays(this.intervalStart); + this.end = this.skipHiddenDays(this.intervalEnd, -1, true); + + this.title = this.calendar.formatRange( + this.start, + this.end.clone().subtract(1), // make inclusive by subtracting 1 ms + this.opt('titleFormat'), + ' \u2014 ' // emphasized dash + ); + + BasicView.prototype.render.call(this, 1, this.getCellsPerWeek(), false); // call the super-method + } + +}); +;; + +/* A view with a single simple day cell +----------------------------------------------------------------------------------------------------------------------*/ + +fcViews.basicDay = BasicDayView; // register this view + +function BasicDayView(calendar) { + BasicView.call(this, calendar); // call the super-constructor +} + + +BasicDayView.prototype = createObject(BasicView.prototype); // define the super-class +$.extend(BasicDayView.prototype, { + + name: 'basicDay', + + + incrementDate: function(date, delta) { + var out = date.clone().stripTime().add(delta, 'days'); + out = this.skipHiddenDays(out, delta < 0 ? -1 : 1); + return out; + }, + + + render: function(date) { + + this.start = this.intervalStart = date.clone().stripTime(); + this.end = this.intervalEnd = this.start.clone().add(1, 'days'); + + this.title = this.calendar.formatDate(this.start, this.opt('titleFormat')); + + BasicView.prototype.render.call(this, 1, 1, false); // call the super-method + } + +}); +;; + +/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically. +----------------------------------------------------------------------------------------------------------------------*/ +// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on). +// Responsible for managing width/height. + +setDefaults({ + allDaySlot: true, + allDayText: 'all-day', + + scrollTime: '06:00:00', + + slotDuration: '00:30:00', + + axisFormat: generateAgendaAxisFormat, + timeFormat: { + agenda: generateAgendaTimeFormat + }, + + minTime: '00:00:00', + maxTime: '24:00:00', + slotEventOverlap: true +}); + +var AGENDA_ALL_DAY_EVENT_LIMIT = 5; + + +function generateAgendaAxisFormat(options, langData) { + return langData.longDateFormat('LT') + .replace(':mm', '(:mm)') + .replace(/(\Wmm)$/, '($1)') // like above, but for foreign langs + .replace(/\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand +} + + +function generateAgendaTimeFormat(options, langData) { + return langData.longDateFormat('LT') + .replace(/\s*a$/i, ''); // remove trailing AM/PM +} + + +function AgendaView(calendar) { + View.call(this, calendar); // call the super-constructor + + this.timeGrid = new TimeGrid(this); + + if (this.opt('allDaySlot')) { // should we display the "all-day" area? + this.dayGrid = new DayGrid(this); // the all-day subcomponent of this view + + // the coordinate grid will be a combination of both subcomponents' grids + this.coordMap = new ComboCoordMap([ + this.dayGrid.coordMap, + this.timeGrid.coordMap + ]); + } + else { + this.coordMap = this.timeGrid.coordMap; + } +} + + +AgendaView.prototype = createObject(View.prototype); // define the super-class +$.extend(AgendaView.prototype, { + + timeGrid: null, // the main time-grid subcomponent of this view + dayGrid: null, // the "all-day" subcomponent. if all-day is turned off, this will be null + + axisWidth: null, // the width of the time axis running down the side + + noScrollRowEls: null, // set of fake row elements that must compensate when scrollerEl has scrollbars + + // when the time-grid isn't tall enough to occupy the given height, we render an
underneath + bottomRuleEl: null, + bottomRuleHeight: null, + + + /* Rendering + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders the view into `this.el`, which has already been assigned. + // `colCnt` has been calculated by a subclass and passed here. + render: function(colCnt) { + + // needed for cell-to-date and date-to-cell calculations in View + this.rowCnt = 1; + this.colCnt = colCnt; + + this.el.addClass('fc-agenda-view').html(this.renderHtml()); + + // the element that wraps the time-grid that will probably scroll + this.scrollerEl = this.el.find('.fc-time-grid-container'); + this.timeGrid.coordMap.containerEl = this.scrollerEl; // don't accept clicks/etc outside of this + + this.timeGrid.el = this.el.find('.fc-time-grid'); + this.timeGrid.render(); + + // the
that sometimes displays under the time-grid + this.bottomRuleEl = $('
') + .appendTo(this.timeGrid.el); // inject it into the time-grid + + if (this.dayGrid) { + this.dayGrid.el = this.el.find('.fc-day-grid'); + this.dayGrid.render(); + + // have the day-grid extend it's coordinate area over the
dividing the two grids + this.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight(); + } + + this.noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)'); // fake rows not within the scroller + + View.prototype.render.call(this); // call the super-method + + this.resetScroll(); // do this after sizes have been set + }, + + + // Make subcomponents ready for cleanup + destroy: function() { + this.timeGrid.destroy(); + if (this.dayGrid) { + this.dayGrid.destroy(); + } + View.prototype.destroy.call(this); // call the super-method + }, + + + // Builds the HTML skeleton for the view. + // The day-grid and time-grid components will render inside containers defined by this HTML. + renderHtml: function() { + return '' + + '
'; + } + if (endCol > startCol) { + cellHtml += ''; + } + if (colCnt > endCol) { + cellHtml += ''; + } + + cellHtml = this.bookendCells(cellHtml, 'highlight'); + + return '' + + '
' + + '' + + '' + + cellHtml + + '' + + '
' + + '
'; + } + +}); + +;; + +/* Event-rendering methods for the DayGrid class +----------------------------------------------------------------------------------------------------------------------*/ + +$.extend(DayGrid.prototype, { + + segs: null, + rowStructs: null, // an array of objects, each holding information about a row's event-rendering + + + // Render the given events onto the Grid and return the rendered segments + renderEvents: function(events) { + var rowStructs = this.rowStructs = this.renderEventRows(events); + var segs = []; + + // append to each row's content skeleton + this.rowEls.each(function(i, rowNode) { + $(rowNode).find('.fc-content-skeleton > table').append( + rowStructs[i].tbodyEl + ); + segs.push.apply(segs, rowStructs[i].segs); + }); + + this.segs = segs; + }, + + + // Retrieves all segment objects that have been rendered + getSegs: function() { + return (this.segs || []).concat( + this.popoverSegs || [] // segs rendered in the "more" events popover + ); + }, + + + // Removes all rendered event elements + destroyEvents: function() { + var rowStructs; + var rowStruct; + + Grid.prototype.destroyEvents.call(this); // call the super-method + + rowStructs = this.rowStructs || []; + while ((rowStruct = rowStructs.pop())) { + rowStruct.tbodyEl.remove(); + } + + this.segs = null; + this.destroySegPopover(); // removes the "more.." events popover + }, + + + // Uses the given events array to generate
elements of the level+col matrix + var loneCellMatrix = []; // lookup for elements that only take up a single column + var i, levelSegs; + var col; + var tr; + var j, seg; + var td; + + // populates empty cells from the current column (`col`) to `endCol` + function emptyCellsUntil(endCol) { + while (col < endCol) { + // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell + td = (loneCellMatrix[i - 1] || [])[col]; + if (td) { + td.attr( + 'rowspan', + parseInt(td.attr('rowspan') || 1, 10) + 1 + ); + } + else { + td = $(''); + tr.append(td); + } + cellMatrix[i][col] = td; + loneCellMatrix[i][col] = td; + col++; + } + } + + for (i = 0; i < levelCnt; i++) { // iterate through all levels + levelSegs = segLevels[i]; + col = 0; + tr = $('
').append(seg.el); + if (seg.leftCol != seg.rightCol) { + td.attr('colspan', seg.rightCol - seg.leftCol + 1); + } + else { // a single-column segment + loneCellMatrix[i][col] = td; + } + + while (col <= seg.rightCol) { + cellMatrix[i][col] = td; + segMatrix[i][col] = seg; + col++; + } + + tr.append(td); + } + } + + emptyCellsUntil(colCnt); // finish off the row + this.bookendCells(tr, 'eventSkeleton'); + tbody.append(tr); + } + + return { // a "rowStruct" + row: row, // the row number + tbodyEl: tbody, + cellMatrix: cellMatrix, + segMatrix: segMatrix, + segLevels: segLevels, + segs: rowSegs + }; + }, + + + // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels. + buildSegLevels: function(segs) { + var levels = []; + var i, seg; + var j; + + // Give preference to elements with certain criteria, so they have + // a chance to be closer to the top. + segs.sort(compareSegs); + + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + + // loop through levels, starting with the topmost, until the segment doesn't collide with other segments + for (j = 0; j < levels.length; j++) { + if (!isDaySegCollision(seg, levels[j])) { + break; + } + } + // `j` now holds the desired subrow index + seg.level = j; + + // create new level array if needed and append segment + (levels[j] || (levels[j] = [])).push(seg); + } + + // order segments left-to-right. very important if calendar is RTL + for (j = 0; j < levels.length; j++) { + levels[j].sort(compareDaySegCols); + } + + return levels; + }, + + + // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row + groupSegRows: function(segs) { + var view = this.view; + var segRows = []; + var i; + + for (i = 0; i < view.rowCnt; i++) { + segRows.push([]); + } + + for (i = 0; i < segs.length; i++) { + segRows[segs[i].row].push(segs[i]); + } + + return segRows; + } + +}); + + +// Computes whether two segments' columns collide. They are assumed to be in the same row. +function isDaySegCollision(seg, otherSegs) { + var i, otherSeg; + + for (i = 0; i < otherSegs.length; i++) { + otherSeg = otherSegs[i]; + + if ( + otherSeg.leftCol <= seg.rightCol && + otherSeg.rightCol >= seg.leftCol + ) { + return true; + } + } + + return false; +} + + +// A cmp function for determining the leftmost event +function compareDaySegCols(a, b) { + return a.leftCol - b.leftCol; +} + +;; + +/* Methods relate to limiting the number events for a given day on a DayGrid +----------------------------------------------------------------------------------------------------------------------*/ + +$.extend(DayGrid.prototype, { + + + segPopover: null, // the Popover that holds events that can't fit in a cell. null when not visible + popoverSegs: null, // an array of segment objects that the segPopover holds. null when not visible + + + destroySegPopover: function() { + if (this.segPopover) { + this.segPopover.hide(); // will trigger destruction of `segPopover` and `popoverSegs` + } + }, + + + // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid. + // `levelLimit` can be false (don't limit), a number, or true (should be computed). + limitRows: function(levelLimit) { + var rowStructs = this.rowStructs || []; + var row; // row # + var rowLevelLimit; + + for (row = 0; row < rowStructs.length; row++) { + this.unlimitRow(row); + + if (!levelLimit) { + rowLevelLimit = false; + } + else if (typeof levelLimit === 'number') { + rowLevelLimit = levelLimit; + } + else { + rowLevelLimit = this.computeRowLevelLimit(row); + } + + if (rowLevelLimit !== false) { + this.limitRow(row, rowLevelLimit); + } + } + }, + + + // Computes the number of levels a row will accomodate without going outside its bounds. + // Assumes the row is "rigid" (maintains a constant height regardless of what is inside). + // `row` is the row number. + computeRowLevelLimit: function(row) { + var rowEl = this.rowEls.eq(row); // the containing "fake" row div + var rowHeight = rowEl.height(); // TODO: cache somehow? + var trEls = this.rowStructs[row].tbodyEl.children(); + var i, trEl; + + // Reveal one level
DOM nodes + var col = 0; // col # + var cell; + var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right + var cellMatrix; // a matrix (by level, then column) of all jQuery elements in the row + var limitedNodes; // array of temporarily hidden level
DOM nodes + var i, seg; + var segsBelow; // array of segment objects below `seg` in the current `col` + var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies + var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column) + var td, rowspan; + var segMoreNodes; // array of "more" cells that will stand-in for the current seg's cell + var j; + var moreTd, moreWrap, moreLink; + + // Iterates through empty level cells and places "more" links inside if need be + function emptyCellsUntil(endCol) { // goes from current `col` to `endCol` + while (col < endCol) { + cell = { row: row, col: col }; + segsBelow = _this.getCellSegs(cell, levelLimit); + if (segsBelow.length) { + td = cellMatrix[levelLimit - 1][col]; + moreLink = _this.renderMoreLink(cell, segsBelow); + moreWrap = $('
').append(moreLink); + td.append(moreWrap); + moreNodes.push(moreWrap[0]); + } + col++; + } + } + + if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit? + levelSegs = rowStruct.segLevels[levelLimit - 1]; + cellMatrix = rowStruct.cellMatrix; + + limitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level
for each column the segment occupies. will be one for each colspan + for (j = 0; j < colSegsBelow.length; j++) { + moreTd = $('').attr('rowspan', rowspan); + segsBelow = colSegsBelow[j]; + cell = { row: row, col: seg.leftCol + j }; + moreLink = this.renderMoreLink(cell, [ seg ].concat(segsBelow)); // count seg as hidden too + moreWrap = $('
').append(moreLink); + moreTd.append(moreWrap); + segMoreNodes.push(moreTd[0]); + moreNodes.push(moreTd[0]); + } + + td.addClass('fc-limited').after($(segMoreNodes)); // hide original
and inject replacements + limitedNodes.push(td[0]); + } + } + + emptyCellsUntil(view.colCnt); // finish off the level + rowStruct.moreEls = $(moreNodes); // for easy undoing later + rowStruct.limitedEls = $(limitedNodes); // for easy undoing later + } + }, + + + // Reveals all levels and removes all "more"-related elements for a grid's row. + // `row` is a row number. + unlimitRow: function(row) { + var rowStruct = this.rowStructs[row]; + + if (rowStruct.moreEls) { + rowStruct.moreEls.remove(); + rowStruct.moreEls = null; + } + + if (rowStruct.limitedEls) { + rowStruct.limitedEls.removeClass('fc-limited'); + rowStruct.limitedEls = null; + } + }, + + + // Renders an element that represents hidden event element for a cell. + // Responsible for attaching click handler as well. + renderMoreLink: function(cell, hiddenSegs) { + var _this = this; + var view = this.view; + + return $('') + .text( + this.getMoreLinkText(hiddenSegs.length) + ) + .on('click', function(ev) { + var clickOption = view.opt('eventLimitClick'); + var date = view.cellToDate(cell); + var moreEl = $(this); + var dayEl = _this.getCellDayEl(cell); + var allSegs = _this.getCellSegs(cell); + + // rescope the segments to be within the cell's date + var reslicedAllSegs = _this.resliceDaySegs(allSegs, date); + var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date); + + if (typeof clickOption === 'function') { + // the returned value can be an atomic option + clickOption = view.trigger('eventLimitClick', null, { + date: date, + dayEl: dayEl, + moreEl: moreEl, + segs: reslicedAllSegs, + hiddenSegs: reslicedHiddenSegs + }, ev); + } + + if (clickOption === 'popover') { + _this.showSegPopover(date, cell, moreEl, reslicedAllSegs); + } + else if (typeof clickOption === 'string') { // a view name + view.calendar.zoomTo(date, clickOption); + } + }); + }, + + + // Reveals the popover that displays all events within a cell + showSegPopover: function(date, cell, moreLink, segs) { + var _this = this; + var view = this.view; + var moreWrap = moreLink.parent(); // the
wrapper around the + var topEl; // the element we want to match the top coordinate of + var options; + + if (view.rowCnt == 1) { + topEl = this.view.el; // will cause the popover to cover any sort of header + } + else { + topEl = this.rowEls.eq(cell.row); // will align with top of row + } + + options = { + className: 'fc-more-popover', + content: this.renderSegPopoverContent(date, segs), + parentEl: this.el, + top: topEl.offset().top, + autoHide: true, // when the user clicks elsewhere, hide the popover + viewportConstrain: view.opt('popoverViewportConstrain'), + hide: function() { + // destroy everything when the popover is hidden + _this.segPopover.destroy(); + _this.segPopover = null; + _this.popoverSegs = null; + } + }; + + // Determine horizontal coordinate. + // We use the moreWrap instead of the
to avoid border confusion. + if (view.opt('isRTL')) { + options.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border + } + else { + options.left = moreWrap.offset().left - 1; // -1 to be over cell border + } + + this.segPopover = new Popover(options); + this.segPopover.show(); + }, + + + // Builds the inner DOM contents of the segment popover + renderSegPopoverContent: function(date, segs) { + var view = this.view; + var isTheme = view.opt('theme'); + var title = date.format(view.opt('dayPopoverFormat')); + var content = $( + '
' + + '' + + '' + + htmlEscape(title) + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + ); + var segContainer = content.find('.fc-event-container'); + var i; + + // render each seg's `el` and only return the visible segs + segs = this.renderSegs(segs, true); // disableResizing=true + this.popoverSegs = segs; + + for (i = 0; i < segs.length; i++) { + + // because segments in the popover are not part of a grid coordinate system, provide a hint to any + // grids that want to do drag-n-drop about which cell it came from + segs[i].cellDate = date; + + segContainer.append(segs[i].el); + } + + return content; + }, + + + // Given the events within an array of segment objects, reslice them to be in a single day + resliceDaySegs: function(segs, dayDate) { + var events = $.map(segs, function(seg) { + return seg.event; + }); + var dayStart = dayDate.clone().stripTime(); + var dayEnd = dayStart.clone().add(1, 'days'); + + return this.eventsToSegs(events, dayStart, dayEnd); + }, + + + // Generates the text that should be inside a "more" link, given the number of events it represents + getMoreLinkText: function(num) { + var view = this.view; + var opt = view.opt('eventLimitText'); + + if (typeof opt === 'function') { + return opt(num); + } + else { + return '+' + num + ' ' + opt; + } + }, + + + // Returns segments within a given cell. + // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs. + getCellSegs: function(cell, startLevel) { + var segMatrix = this.rowStructs[cell.row].segMatrix; + var level = startLevel || 0; + var segs = []; + var seg; + + while (level < segMatrix.length) { + seg = segMatrix[level][cell.col]; + if (seg) { + segs.push(seg); + } + level++; + } + + return segs; + } + +}); + +;; + +/* A component that renders one or more columns of vertical time slots +----------------------------------------------------------------------------------------------------------------------*/ + +function TimeGrid(view) { + Grid.call(this, view); // call the super-constructor +} + + +TimeGrid.prototype = createObject(Grid.prototype); // define the super-class +$.extend(TimeGrid.prototype, { + + slotDuration: null, // duration of a "slot", a distinct time segment on given day, visualized by lines + snapDuration: null, // granularity of time for dragging and selecting + + minTime: null, // Duration object that denotes the first visible time of any given day + maxTime: null, // Duration object that denotes the exclusive visible end time of any given day + + dayEls: null, // cells elements in the day-row background + slatEls: null, // elements running horizontally across all columns + + slatTops: null, // an array of top positions, relative to the container. last item holds bottom of last slot + + highlightEl: null, // cell skeleton element for rendering the highlight + helperEl: null, // cell skeleton element for rendering the mock event "helper" + + + // Renders the time grid into `this.el`, which should already be assigned. + // Relies on the view's colCnt. In the future, this component should probably be self-sufficient. + render: function() { + this.processOptions(); + + this.el.html(this.renderHtml()); + + this.dayEls = this.el.find('.fc-day'); + this.slatEls = this.el.find('.fc-slats tr'); + + this.computeSlatTops(); + + Grid.prototype.render.call(this); // call the super-method + }, + + + // Renders the basic HTML skeleton for the grid + renderHtml: function() { + return '' + + '
' + + '' + + this.rowHtml('slotBg') + // leverages RowRenderer, which will call slotBgCellHtml + '
' + + '
' + + '
' + + '' + + this.slatRowHtml() + + '
' + + '
'; + }, + + + // Renders the HTML for a vertical background cell behind the slots. + // This method is distinct from 'bg' because we wanted a new `rowType` so the View could customize the rendering. + slotBgCellHtml: function(row, col, date) { + return this.bgCellHtml(row, col, date); + }, + + + // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL. + slatRowHtml: function() { + var view = this.view; + var calendar = view.calendar; + var isRTL = view.opt('isRTL'); + var html = ''; + var slotNormal = this.slotDuration.asMinutes() % 15 === 0; + var slotTime = moment.duration(+this.minTime); // wish there was .clone() for durations + var slotDate; // will be on the view's first day, but we only care about its time + var minutes; + var axisHtml; + + // Calculate the time for each slot + while (slotTime < this.maxTime) { + slotDate = view.start.clone().time(slotTime); // will be in UTC but that's good. to avoid DST issues + minutes = slotDate.minutes(); + + axisHtml = + '
' + + ((!slotNormal || !minutes) ? // if irregular slot duration, or on the hour, then display the time + '' + // for matchCellWidths + htmlEscape(calendar.formatDate(slotDate, view.opt('axisFormat'))) + + '' : + '' + ) + + '
' + + (isRTL ? axisHtml : '') + + "
'; + col = seg.col; + } + + // compute vertical position + dayDate = view.cellToDate(0, col); + top = this.computeDateTop(seg.start, dayDate); + bottom = this.computeDateTop(seg.end, dayDate); // the y position of the bottom edge + + // generate the cell HTML. bottom becomes negative because it needs to be a CSS value relative to the + // bottom edge of the zero-height container. + cellHtml += + '' + + '
' + + '
' + + '
' + + '
'; + } + + cellHtml = this.bookendCells(cellHtml, 'highlight'); + + return '' + + '
' + + '' + + '' + + cellHtml + + '' + + '
' + + '
'; + } + +}); + +;; + +/* Event-rendering methods for the TimeGrid class +----------------------------------------------------------------------------------------------------------------------*/ + +$.extend(TimeGrid.prototype, { + + segs: null, // segment objects rendered in the component. null of events haven't been rendered yet + eventSkeletonEl: null, // has cells with event-containers, which contain absolutely positioned event elements + + + // Renders the events onto the grid and returns an array of segments that have been rendered + renderEvents: function(events) { + var res = this.renderEventTable(events); + + this.eventSkeletonEl = $('
').append(res.tableEl); + this.el.append(this.eventSkeletonEl); + + this.segs = res.segs; + }, + + + // Retrieves rendered segment objects + getSegs: function() { + return this.segs || []; + }, + + + // Removes all event segment elements from the view + destroyEvents: function() { + Grid.prototype.destroyEvents.call(this); // call the super-method + + if (this.eventSkeletonEl) { + this.eventSkeletonEl.remove(); + this.eventSkeletonEl = null; + } + + this.segs = null; + }, + + + // Renders and returns the portion of the event-skeleton. + // Returns an object with properties 'tbodyEl' and 'segs'. + renderEventTable: function(events) { + var tableEl = $('
'); + var trEl = tableEl.find('tr'); + var segs = this.eventsToSegs(events); + var segCols; + var i, seg; + var col, colSegs; + var containerEl; + + segs = this.renderSegs(segs); // returns only the visible segs + segCols = this.groupSegCols(segs); // group into sub-arrays, and assigns 'col' to each seg + + this.computeSegVerticals(segs); // compute and assign top/bottom + + for (col = 0; col < segCols.length; col++) { // iterate each column grouping + colSegs = segCols[col]; + placeSlotSegs(colSegs); // compute horizontal coordinates, z-index's, and reorder the array + + containerEl = $('
'); + + // assign positioning CSS and insert into container + for (i = 0; i < colSegs.length; i++) { + seg = colSegs[i]; + seg.el.css(this.generateSegPositionCss(seg)); + + // if the height is short, add a className for alternate styling + if (seg.bottom - seg.top < 30) { + seg.el.addClass('fc-short'); + } + + containerEl.append(seg.el); + } + + trEl.append($('
').append(containerEl)); + } + + this.bookendCells(trEl, 'eventSkeleton'); + + return { + tableEl: tableEl, + segs: segs + }; + }, + + + // Refreshes the CSS top/bottom coordinates for each segment element. Probably after a window resize/zoom. + updateSegVerticals: function() { + var segs = this.segs; + var i; + + if (segs) { + this.computeSegVerticals(segs); + + for (i = 0; i < segs.length; i++) { + segs[i].el.css( + this.generateSegVerticalCss(segs[i]) + ); + } + } + }, + + + // For each segment in an array, computes and assigns its top and bottom properties + computeSegVerticals: function(segs) { + var i, seg; + + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + seg.top = this.computeDateTop(seg.start, seg.start); + seg.bottom = this.computeDateTop(seg.end, seg.start); + } + }, + + + // Renders the HTML for a single event segment's default rendering + renderSegHtml: function(seg, disableResizing) { + var view = this.view; + var event = seg.event; + var isDraggable = view.isEventDraggable(event); + var isResizable = !disableResizing && seg.isEnd && view.isEventResizable(event); + var classes = this.getSegClasses(seg, isDraggable, isResizable); + var skinCss = this.getEventSkinCss(event); + var timeText; + var fullTimeText; // more verbose time text. for the print stylesheet + var startTimeText; // just the start time text + + classes.unshift('fc-time-grid-event'); + + if (view.isMultiDayEvent(event)) { // if the event appears to span more than one day... + // Don't display time text on segments that run entirely through a day. + // That would appear as midnight-midnight and would look dumb. + // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am) + if (seg.isStart || seg.isEnd) { + timeText = view.getEventTimeText(seg.start, seg.end); + fullTimeText = view.getEventTimeText(seg.start, seg.end, 'LT'); + startTimeText = view.getEventTimeText(seg.start, null); + } + } else { + // Display the normal time text for the *event's* times + timeText = view.getEventTimeText(event); + fullTimeText = view.getEventTimeText(event, 'LT'); + startTimeText = view.getEventTimeText(event.start, null); + } + + return '' + + '
' + + (timeText ? + '
' + + '' + htmlEscape(timeText) + '' + + '
' : + '' + ) + + (event.title ? + '
' + + htmlEscape(event.title) + + '
' : + '' + ) + + '
' + + '
' + + (isResizable ? + '
' : + '' + ) + + ''; + }, + + + // Generates an object with CSS properties/values that should be applied to an event segment element. + // Contains important positioning-related properties that should be applied to any event element, customized or not. + generateSegPositionCss: function(seg) { + var view = this.view; + var isRTL = view.opt('isRTL'); + var shouldOverlap = view.opt('slotEventOverlap'); + var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point + var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point + var props = this.generateSegVerticalCss(seg); // get top/bottom first + var left; // amount of space from left edge, a fraction of the total width + var right; // amount of space from right edge, a fraction of the total width + + if (shouldOverlap) { + // double the width, but don't go beyond the maximum forward coordinate (1.0) + forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2); + } + + if (isRTL) { + left = 1 - forwardCoord; + right = backwardCoord; + } + else { + left = backwardCoord; + right = 1 - forwardCoord; + } + + props.zIndex = seg.level + 1; // convert from 0-base to 1-based + props.left = left * 100 + '%'; + props.right = right * 100 + '%'; + + if (shouldOverlap && seg.forwardPressure) { + // add padding to the edge so that forward stacked events don't cover the resizer's icon + props[isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width + } + + return props; + }, + + + // Generates an object with CSS properties for the top/bottom coordinates of a segment element + generateSegVerticalCss: function(seg) { + return { + top: seg.top, + bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container + }; + }, + + + // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col + groupSegCols: function(segs) { + var view = this.view; + var segCols = []; + var i; + + for (i = 0; i < view.colCnt; i++) { + segCols.push([]); + } + + for (i = 0; i < segs.length; i++) { + segCols[segs[i].col].push(segs[i]); + } + + return segCols; + } + +}); + + +// Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each. +// Also reorders the given array by date! +function placeSlotSegs(segs) { + var levels; + var level0; + var i; + + segs.sort(compareSegs); // order by date + levels = buildSlotSegLevels(segs); + computeForwardSlotSegs(levels); + + if ((level0 = levels[0])) { + + for (i = 0; i < level0.length; i++) { + computeSlotSegPressures(level0[i]); + } + + for (i = 0; i < level0.length; i++) { + computeSlotSegCoords(level0[i], 0, 0); + } + } +} + + +// Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is +// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date. +function buildSlotSegLevels(segs) { + var levels = []; + var i, seg; + var j; + + for (i=0; i seg2.top && seg1.top < seg2.bottom; +} + + +// A cmp function for determining which forward segment to rely on more when computing coordinates. +function compareForwardSlotSegs(seg1, seg2) { + // put higher-pressure first + return seg2.forwardPressure - seg1.forwardPressure || + // put segments that are closer to initial edge first (and favor ones with no coords yet) + (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) || + // do normal sorting... + compareSegs(seg1, seg2); +} + +;; + +/* An abstract class from which other views inherit from +----------------------------------------------------------------------------------------------------------------------*/ +// Newer methods should be written as prototype methods, not in the monster `View` function at the bottom. + +View.prototype = { + + calendar: null, // owner Calendar object + coordMap: null, // a CoordMap object for converting pixel regions to dates + el: null, // the view's containing element. set by Calendar + + // important Moments + start: null, // the date of the very first cell + end: null, // the date after the very last cell + intervalStart: null, // the start of the interval of time the view represents (1st of month for month view) + intervalEnd: null, // the exclusive end of the interval of time the view represents + + // used for cell-to-date and date-to-cell calculations + rowCnt: null, // # of weeks + colCnt: null, // # of days displayed in a week + + isSelected: false, // boolean whether cells are user-selected or not + + // subclasses can optionally use a scroll container + scrollerEl: null, // the element that will most likely scroll when content is too tall + scrollTop: null, // cached vertical scroll value + + // classNames styled by jqui themes + widgetHeaderClass: null, + widgetContentClass: null, + highlightStateClass: null, + + // document handlers, bound to `this` object + documentMousedownProxy: null, + documentDragStartProxy: null, + + + // Serves as a "constructor" to suppliment the monster `View` constructor below + init: function() { + var tm = this.opt('theme') ? 'ui' : 'fc'; + + this.widgetHeaderClass = tm + '-widget-header'; + this.widgetContentClass = tm + '-widget-content'; + this.highlightStateClass = tm + '-state-highlight'; + + // save references to `this`-bound handlers + this.documentMousedownProxy = $.proxy(this, 'documentMousedown'); + this.documentDragStartProxy = $.proxy(this, 'documentDragStart'); + }, + + + // Renders the view inside an already-defined `this.el`. + // Subclasses should override this and then call the super method afterwards. + render: function() { + this.updateSize(); + this.trigger('viewRender', this, this, this.el); + + // attach handlers to document. do it here to allow for destroy/rerender + $(document) + .on('mousedown', this.documentMousedownProxy) + .on('dragstart', this.documentDragStartProxy); // jqui drag + }, + + + // Clears all view rendering, event elements, and unregisters handlers + destroy: function() { + this.unselect(); + this.trigger('viewDestroy', this, this, this.el); + this.destroyEvents(); + this.el.empty(); // removes inner contents but leaves the element intact + + $(document) + .off('mousedown', this.documentMousedownProxy) + .off('dragstart', this.documentDragStartProxy); + }, + + + // Used to determine what happens when the users clicks next/prev. Given -1 for prev, 1 for next. + // Should apply the delta to `date` (a Moment) and return it. + incrementDate: function(date, delta) { + // subclasses should implement + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + + // Refreshes anything dependant upon sizing of the container element of the grid + updateSize: function(isResize) { + if (isResize) { + this.recordScroll(); + } + this.updateHeight(); + this.updateWidth(); + }, + + + // Refreshes the horizontal dimensions of the calendar + updateWidth: function() { + // subclasses should implement + }, + + + // Refreshes the vertical dimensions of the calendar + updateHeight: function() { + var calendar = this.calendar; // we poll the calendar for height information + + this.setHeight( + calendar.getSuggestedViewHeight(), + calendar.isHeightAuto() + ); + }, + + + // Updates the vertical dimensions of the calendar to the specified height. + // if `isAuto` is set to true, height becomes merely a suggestion and the view should use its "natural" height. + setHeight: function(height, isAuto) { + // subclasses should implement + }, + + + // Given the total height of the view, return the number of pixels that should be used for the scroller. + // Utility for subclasses. + computeScrollerHeight: function(totalHeight) { + var both = this.el.add(this.scrollerEl); + var otherHeight; // cumulative height of everything that is not the scrollerEl in the view (header+borders) + + // fuckin IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked + both.css({ + position: 'relative', // cause a reflow, which will force fresh dimension recalculation + left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll + }); + otherHeight = this.el.outerHeight() - this.scrollerEl.height(); // grab the dimensions + both.css({ position: '', left: '' }); // undo hack + + return totalHeight - otherHeight; + }, + + + // Called for remembering the current scroll value of the scroller. + // Should be called before there is a destructive operation (like removing DOM elements) that might inadvertently + // change the scroll of the container. + recordScroll: function() { + if (this.scrollerEl) { + this.scrollTop = this.scrollerEl.scrollTop(); + } + }, + + + // Set the scroll value of the scroller to the previously recorded value. + // Should be called after we know the view's dimensions have been restored following some type of destructive + // operation (like temporarily removing DOM elements). + restoreScroll: function() { + if (this.scrollTop !== null) { + this.scrollerEl.scrollTop(this.scrollTop); + } + }, + + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders the events onto the view. + // Should be overriden by subclasses. Subclasses should call the super-method afterwards. + renderEvents: function(events) { + this.segEach(function(seg) { + this.trigger('eventAfterRender', seg.event, seg.event, seg.el); + }); + this.trigger('eventAfterAllRender'); + }, + + + // Removes event elements from the view. + // Should be overridden by subclasses. Should call this super-method FIRST, then subclass DOM destruction. + destroyEvents: function() { + this.segEach(function(seg) { + this.trigger('eventDestroy', seg.event, seg.event, seg.el); + }); + }, + + + // Given an event and the default element used for rendering, returns the element that should actually be used. + // Basically runs events and elements through the eventRender hook. + resolveEventEl: function(event, el) { + var custom = this.trigger('eventRender', event, event, el); + + if (custom === false) { // means don't render at all + el = null; + } + else if (custom && custom !== true) { + el = $(custom); + } + + return el; + }, + + + // Hides all rendered event segments linked to the given event + showEvent: function(event) { + this.segEach(function(seg) { + seg.el.css('visibility', ''); + }, event); + }, + + + // Shows all rendered event segments linked to the given event + hideEvent: function(event) { + this.segEach(function(seg) { + seg.el.css('visibility', 'hidden'); + }, event); + }, + + + // Iterates through event segments. Goes through all by default. + // If the optional `event` argument is specified, only iterates through segments linked to that event. + // The `this` value of the callback function will be the view. + segEach: function(func, event) { + var segs = this.getSegs(); + var i; + + for (i = 0; i < segs.length; i++) { + if (!event || segs[i].event._id === event._id) { + func.call(this, segs[i]); + } + } + }, + + + // Retrieves all the rendered segment objects for the view + getSegs: function() { + // subclasses must implement + }, + + + /* Event Drag Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event hovering over the specified date. + // `end` is a Moment and might be null. + // `seg` might be null. if specified, it is the segment object of the event being dragged. + // otherwise, an external event from outside the calendar is being dragged. + renderDrag: function(start, end, seg) { + // subclasses should implement + }, + + + // Unrenders a visual indication of event hovering + destroyDrag: function() { + // subclasses should implement + }, + + + // Handler for accepting externally dragged events being dropped in the view. + // Gets called when jqui's 'dragstart' is fired. + documentDragStart: function(ev, ui) { + var _this = this; + var dropDate = null; + var dragListener; + + if (this.opt('droppable')) { // only listen if this setting is on + + // listener that tracks mouse movement over date-associated pixel regions + dragListener = new DragListener(this.coordMap, { + cellOver: function(cell, date) { + dropDate = date; + _this.renderDrag(date); + }, + cellOut: function() { + dropDate = null; + _this.destroyDrag(); + } + }); + + // gets called, only once, when jqui drag is finished + $(document).one('dragstop', function(ev, ui) { + _this.destroyDrag(); + if (dropDate) { + _this.trigger('drop', ev.target, dropDate, ev, ui); + } + }); + + dragListener.startDrag(ev); // start listening immediately + } + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Selects a date range on the view. `start` and `end` are both Moments. + // `ev` is the native mouse event that begin the interaction. + select: function(start, end, ev) { + this.unselect(ev); + this.renderSelection(start, end); + this.reportSelection(start, end, ev); + }, + + + // Renders a visual indication of the selection + renderSelection: function(start, end) { + // subclasses should implement + }, + + + // Called when a new selection is made. Updates internal state and triggers handlers. + reportSelection: function(start, end, ev) { + this.isSelected = true; + this.trigger('select', null, start, end, ev); + }, + + + // Undoes a selection. updates in the internal state and triggers handlers. + // `ev` is the native mouse event that began the interaction. + unselect: function(ev) { + if (this.isSelected) { + this.isSelected = false; + this.destroySelection(); + this.trigger('unselect', null, ev); + } + }, + + + // Unrenders a visual indication of selection + destroySelection: function() { + // subclasses should implement + }, + + + // Handler for unselecting when the user clicks something and the 'unselectAuto' setting is on + documentMousedown: function(ev) { + var ignore; + + // is there a selection, and has the user made a proper left click? + if (this.isSelected && this.opt('unselectAuto') && isPrimaryMouseButton(ev)) { + + // only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element + ignore = this.opt('unselectCancel'); + if (!ignore || !$(ev.target).closest(ignore).length) { + this.unselect(ev); + } + } + } + +}; + + +// We are mixing JavaScript OOP design patterns here by putting methods and member variables in the closed scope of the +// constructor. Going forward, methods should be part of the prototype. +function View(calendar) { + var t = this; + + // exports + t.calendar = calendar; + t.opt = opt; + t.trigger = trigger; + t.isEventDraggable = isEventDraggable; + t.isEventResizable = isEventResizable; + t.eventDrop = eventDrop; + t.eventResize = eventResize; + + // imports + var reportEventChange = calendar.reportEventChange; + + // locals + var options = calendar.options; + var nextDayThreshold = moment.duration(options.nextDayThreshold); + + + t.init(); // the "constructor" that concerns the prototype methods + + + function opt(name) { + var v = options[name]; + if ($.isPlainObject(v) && !isForcedAtomicOption(name)) { + return smartProperty(v, t.name); + } + return v; + } + + + function trigger(name, thisObj) { + return calendar.trigger.apply( + calendar, + [name, thisObj || t].concat(Array.prototype.slice.call(arguments, 2), [t]) + ); + } + + + + /* Event Editable Boolean Calculations + ------------------------------------------------------------------------------*/ + + + function isEventDraggable(event) { + var source = event.source || {}; + + return firstDefined( + event.startEditable, + source.startEditable, + opt('eventStartEditable'), + event.editable, + source.editable, + opt('editable') + ); + } + + + function isEventResizable(event) { + var source = event.source || {}; + + return firstDefined( + event.durationEditable, + source.durationEditable, + opt('eventDurationEditable'), + event.editable, + source.editable, + opt('editable') + ); + } + + + + /* Event Elements + ------------------------------------------------------------------------------*/ + + + // Compute the text that should be displayed on an event's element. + // Based off the settings of the view. Possible signatures: + // .getEventTimeText(event, formatStr) + // .getEventTimeText(startMoment, endMoment, formatStr) + // .getEventTimeText(startMoment, null, formatStr) + // `timeFormat` is used but the `formatStr` argument can be used to override. + t.getEventTimeText = function(event, formatStr) { + var start; + var end; + + if (typeof event === 'object' && typeof formatStr === 'object') { + // first two arguments are actually moments (or null). shift arguments. + start = event; + end = formatStr; + formatStr = arguments[2]; + } + else { + // otherwise, an event object was the first argument + start = event.start; + end = event.end; + } + + formatStr = formatStr || opt('timeFormat'); + + if (end && opt('displayEventEnd')) { + return calendar.formatRange(start, end, formatStr); + } + else { + return calendar.formatDate(start, formatStr); + } + }; + + + + /* Event Modification Reporting + ---------------------------------------------------------------------------------*/ + + + function eventDrop(el, event, newStart, ev) { + var mutateResult = calendar.mutateEvent(event, newStart, null); + + trigger( + 'eventDrop', + el, + event, + mutateResult.dateDelta, + function() { + mutateResult.undo(); + reportEventChange(); + }, + ev, + {} // jqui dummy + ); + + reportEventChange(); + } + + + function eventResize(el, event, newEnd, ev) { + var mutateResult = calendar.mutateEvent(event, null, newEnd); + + trigger( + 'eventResize', + el, + event, + mutateResult.durationDelta, + function() { + mutateResult.undo(); + reportEventChange(); + }, + ev, + {} // jqui dummy + ); + + reportEventChange(); + } + + + // ==================================================================================================== + // Utilities for day "cells" + // ==================================================================================================== + // The "basic" views are completely made up of day cells. + // The "agenda" views have day cells at the top "all day" slot. + // This was the obvious common place to put these utilities, but they should be abstracted out into + // a more meaningful class (like DayEventRenderer). + // ==================================================================================================== + + + // For determining how a given "cell" translates into a "date": + // + // 1. Convert the "cell" (row and column) into a "cell offset" (the # of the cell, cronologically from the first). + // Keep in mind that column indices are inverted with isRTL. This is taken into account. + // + // 2. Convert the "cell offset" to a "day offset" (the # of days since the first visible day in the view). + // + // 3. Convert the "day offset" into a "date" (a Moment). + // + // The reverse transformation happens when transforming a date into a cell. + + + // exports + t.isHiddenDay = isHiddenDay; + t.skipHiddenDays = skipHiddenDays; + t.getCellsPerWeek = getCellsPerWeek; + t.dateToCell = dateToCell; + t.dateToDayOffset = dateToDayOffset; + t.dayOffsetToCellOffset = dayOffsetToCellOffset; + t.cellOffsetToCell = cellOffsetToCell; + t.cellToDate = cellToDate; + t.cellToCellOffset = cellToCellOffset; + t.cellOffsetToDayOffset = cellOffsetToDayOffset; + t.dayOffsetToDate = dayOffsetToDate; + t.rangeToSegments = rangeToSegments; + t.isMultiDayEvent = isMultiDayEvent; + + + // internals + var hiddenDays = opt('hiddenDays') || []; // array of day-of-week indices that are hidden + var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) + var cellsPerWeek; + var dayToCellMap = []; // hash from dayIndex -> cellIndex, for one week + var cellToDayMap = []; // hash from cellIndex -> dayIndex, for one week + var isRTL = opt('isRTL'); + + + // initialize important internal variables + (function() { + + if (opt('weekends') === false) { + hiddenDays.push(0, 6); // 0=sunday, 6=saturday + } + + // Loop through a hypothetical week and determine which + // days-of-week are hidden. Record in both hashes (one is the reverse of the other). + for (var dayIndex=0, cellIndex=0; dayIndex<7; dayIndex++) { + dayToCellMap[dayIndex] = cellIndex; + isHiddenDayHash[dayIndex] = $.inArray(dayIndex, hiddenDays) != -1; + if (!isHiddenDayHash[dayIndex]) { + cellToDayMap[cellIndex] = dayIndex; + cellIndex++; + } + } + + cellsPerWeek = cellIndex; + if (!cellsPerWeek) { + throw 'invalid hiddenDays'; // all days were hidden? bad. + } + + })(); + + + // Is the current day hidden? + // `day` is a day-of-week index (0-6), or a Moment + function isHiddenDay(day) { + if (moment.isMoment(day)) { + day = day.day(); + } + return isHiddenDayHash[day]; + } + + + function getCellsPerWeek() { + return cellsPerWeek; + } + + + // Incrementing the current day until it is no longer a hidden day, returning a copy. + // If the initial value of `date` is not a hidden day, don't do anything. + // Pass `isExclusive` as `true` if you are dealing with an end date. + // `inc` defaults to `1` (increment one day forward each time) + function skipHiddenDays(date, inc, isExclusive) { + var out = date.clone(); + inc = inc || 1; + while ( + isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7] + ) { + out.add(inc, 'days'); + } + return out; + } + + + // + // TRANSFORMATIONS: cell -> cell offset -> day offset -> date + // + + // cell -> date (combines all transformations) + // Possible arguments: + // - row, col + // - { row:#, col: # } + function cellToDate() { + var cellOffset = cellToCellOffset.apply(null, arguments); + var dayOffset = cellOffsetToDayOffset(cellOffset); + var date = dayOffsetToDate(dayOffset); + return date; + } + + // cell -> cell offset + // Possible arguments: + // - row, col + // - { row:#, col:# } + function cellToCellOffset(row, col) { + var colCnt = t.colCnt; + + // rtl variables. wish we could pre-populate these. but where? + var dis = isRTL ? -1 : 1; + var dit = isRTL ? colCnt - 1 : 0; + + if (typeof row == 'object') { + col = row.col; + row = row.row; + } + var cellOffset = row * colCnt + (col * dis + dit); // column, adjusted for RTL (dis & dit) + + return cellOffset; + } + + // cell offset -> day offset + function cellOffsetToDayOffset(cellOffset) { + var day0 = t.start.day(); // first date's day of week + cellOffset += dayToCellMap[day0]; // normlize cellOffset to beginning-of-week + return Math.floor(cellOffset / cellsPerWeek) * 7 + // # of days from full weeks + cellToDayMap[ // # of days from partial last week + (cellOffset % cellsPerWeek + cellsPerWeek) % cellsPerWeek // crazy math to handle negative cellOffsets + ] - + day0; // adjustment for beginning-of-week normalization + } + + // day offset -> date + function dayOffsetToDate(dayOffset) { + return t.start.clone().add(dayOffset, 'days'); + } + + + // + // TRANSFORMATIONS: date -> day offset -> cell offset -> cell + // + + // date -> cell (combines all transformations) + function dateToCell(date) { + var dayOffset = dateToDayOffset(date); + var cellOffset = dayOffsetToCellOffset(dayOffset); + var cell = cellOffsetToCell(cellOffset); + return cell; + } + + // date -> day offset + function dateToDayOffset(date) { + return date.clone().stripTime().diff(t.start, 'days'); + } + + // day offset -> cell offset + function dayOffsetToCellOffset(dayOffset) { + var day0 = t.start.day(); // first date's day of week + dayOffset += day0; // normalize dayOffset to beginning-of-week + return Math.floor(dayOffset / 7) * cellsPerWeek + // # of cells from full weeks + dayToCellMap[ // # of cells from partial last week + (dayOffset % 7 + 7) % 7 // crazy math to handle negative dayOffsets + ] - + dayToCellMap[day0]; // adjustment for beginning-of-week normalization + } + + // cell offset -> cell (object with row & col keys) + function cellOffsetToCell(cellOffset) { + var colCnt = t.colCnt; + + // rtl variables. wish we could pre-populate these. but where? + var dis = isRTL ? -1 : 1; + var dit = isRTL ? colCnt - 1 : 0; + + var row = Math.floor(cellOffset / colCnt); + var col = ((cellOffset % colCnt + colCnt) % colCnt) * dis + dit; // column, adjusted for RTL (dis & dit) + return { + row: row, + col: col + }; + } + + + // + // Converts a date range into an array of segment objects. + // "Segments" are horizontal stretches of time, sliced up by row. + // A segment object has the following properties: + // - row + // - cols + // - isStart + // - isEnd + // + function rangeToSegments(start, end) { + + var rowCnt = t.rowCnt; + var colCnt = t.colCnt; + var segments = []; // array of segments to return + + // day offset for given date range + var dayRange = computeDayRange(start, end); // convert to a whole-day range + var rangeDayOffsetStart = dateToDayOffset(dayRange.start); + var rangeDayOffsetEnd = dateToDayOffset(dayRange.end); // an exclusive value + + // first and last cell offset for the given date range + // "last" implies inclusivity + var rangeCellOffsetFirst = dayOffsetToCellOffset(rangeDayOffsetStart); + var rangeCellOffsetLast = dayOffsetToCellOffset(rangeDayOffsetEnd) - 1; + + // loop through all the rows in the view + for (var row=0; row
' + + '' + // needed for matchCellWidths + htmlEscape(this.opt('weekNumberTitle')) + + '' + + '' + + '' + // needed for matchCellWidths + this.calendar.calculateWeekNumber(this.cellToDate(row, 0)) + + '' + + 's of the "number" row in the DayGrid's content skeleton. + // The number row will only exist if either day numbers or week numbers are turned on. + numberCellHtml: function(row, col, date) { + var classes; + + if (!this.dayNumbersVisible) { // if there are week numbers but not day numbers + return ''; // will create an empty space above events :( + } + + classes = this.dayGrid.getDayClasses(date); + classes.unshift('fc-day-number'); + + return '' + + '' + + date.date() + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + + this.timeGrid.headHtml() + // render the day-of-week headers + '
' + + (this.dayGrid ? + '
' + + '
' : + '' + ) + + '
' + + '
' + + '
' + + '
'; + }, + + + // Generates the HTML that will go before the day-of week header cells. + // Queried by the TimeGrid subcomponent when generating rows. Ordering depends on isRTL. + headIntroHtml: function() { + var date; + var weekNumber; + var weekTitle; + var weekText; + + if (this.opt('weekNumbers')) { + date = this.cellToDate(0, 0); + weekNumber = this.calendar.calculateWeekNumber(date); + weekTitle = this.opt('weekNumberTitle'); + + if (this.opt('isRTL')) { + weekText = weekNumber + weekTitle; + } + else { + weekText = weekTitle + weekNumber; + } + + return '' + + '' + + '' + // needed for matchCellWidths + htmlEscape(weekText) + + '' + + ''; + } + else { + return ''; + } + }, + + + // Generates the HTML that goes before the all-day cells. + // Queried by the DayGrid subcomponent when generating rows. Ordering depends on isRTL. + dayIntroHtml: function() { + return '' + + '' + + '' + // needed for matchCellWidths + (this.opt('allDayHtml') || htmlEscape(this.opt('allDayText'))) + + '' + + ''; + }, + + + // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column. + slotBgIntroHtml: function() { + return ''; + }, + + + // Generates the HTML that goes before all other types of cells. + // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid. + // Queried by the TimeGrid and DayGrid subcomponents when generating rows. Ordering depends on isRTL. + introHtml: function() { + return ''; + }, + + + // Generates an HTML attribute string for setting the width of the axis, if it is known + axisStyleAttr: function() { + if (this.axisWidth !== null) { + return 'style="width:' + this.axisWidth + 'px"'; + } + return ''; + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + updateSize: function(isResize) { + if (isResize) { + this.timeGrid.resize(); + } + View.prototype.updateSize.call(this, isResize); + }, + + + // Refreshes the horizontal dimensions of the view + updateWidth: function() { + // make all axis cells line up, and record the width so newly created axis cells will have it + this.axisWidth = matchCellWidths(this.el.find('.fc-axis')); + }, + + + // Adjusts the vertical dimensions of the view to the specified values + setHeight: function(totalHeight, isAuto) { + var eventLimit; + var scrollerHeight; + + if (this.bottomRuleHeight === null) { + // calculate the height of the rule the very first time + this.bottomRuleHeight = this.bottomRuleEl.outerHeight(); + } + this.bottomRuleEl.hide(); // .show() will be called later if this
is necessary + + // reset all dimensions back to the original state + this.scrollerEl.css('overflow', ''); + unsetScroller(this.scrollerEl); + uncompensateScroll(this.noScrollRowEls); + + // limit number of events in the all-day area + if (this.dayGrid) { + this.dayGrid.destroySegPopover(); // kill the "more" popover if displayed + + eventLimit = this.opt('eventLimit'); + if (eventLimit && typeof eventLimit !== 'number') { + eventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number + } + if (eventLimit) { + this.dayGrid.limitRows(eventLimit); + } + } + + if (!isAuto) { // should we force dimensions of the scroll container, or let the contents be natural height? + + scrollerHeight = this.computeScrollerHeight(totalHeight); + if (setPotentialScroller(this.scrollerEl, scrollerHeight)) { // using scrollbars? + + // make the all-day and header rows lines up + compensateScroll(this.noScrollRowEls, getScrollbarWidths(this.scrollerEl)); + + // the scrollbar compensation might have changed text flow, which might affect height, so recalculate + // and reapply the desired height to the scroller. + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.scrollerEl.height(scrollerHeight); + + this.restoreScroll(); + } + else { // no scrollbars + // still, force a height and display the bottom rule (marks the end of day) + this.scrollerEl.height(scrollerHeight).css('overflow', 'hidden'); // in case
goes outside + this.bottomRuleEl.show(); + } + } + }, + + + // Sets the scroll value of the scroller to the intial pre-configured state prior to allowing the user to change it. + resetScroll: function() { + var _this = this; + var scrollTime = moment.duration(this.opt('scrollTime')); + var top = this.timeGrid.computeTimeTop(scrollTime); + + // zoom can give weird floating-point values. rather scroll a little bit further + top = Math.ceil(top); + + if (top) { + top++; // to overcome top border that slots beyond the first have. looks better + } + + function scroll() { + _this.scrollerEl.scrollTop(top); + } + + scroll(); + setTimeout(scroll, 0); // overrides any previous scroll state made by the browser + }, + + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders events onto the view and populates the View's segment array + renderEvents: function(events) { + var dayEvents = []; + var timedEvents = []; + var daySegs = []; + var timedSegs; + var i; + + // separate the events into all-day and timed + for (i = 0; i < events.length; i++) { + if (events[i].allDay) { + dayEvents.push(events[i]); + } + else { + timedEvents.push(events[i]); + } + } + + // render the events in the subcomponents + timedSegs = this.timeGrid.renderEvents(timedEvents); + if (this.dayGrid) { + daySegs = this.dayGrid.renderEvents(dayEvents); + } + + // the all-day area is flexible and might have a lot of events, so shift the height + this.updateHeight(); + + View.prototype.renderEvents.call(this, events); // call the super-method + }, + + + // Retrieves all segment objects that are rendered in the view + getSegs: function() { + return this.timeGrid.getSegs().concat( + this.dayGrid ? this.dayGrid.getSegs() : [] + ); + }, + + + // Unrenders all event elements and clears internal segment data + destroyEvents: function() { + View.prototype.destroyEvents.call(this); // do this before the grids' segs have been cleared + + // if destroyEvents is being called as part of an event rerender, renderEvents will be called shortly + // after, so remember what the scroll value was so we can restore it. + this.recordScroll(); + + // destroy the events in the subcomponents + this.timeGrid.destroyEvents(); + if (this.dayGrid) { + this.dayGrid.destroyEvents(); + } + + // we DON'T need to call updateHeight() because: + // A) a renderEvents() call always happens after this, which will eventually call updateHeight() + // B) in IE8, this causes a flash whenever events are rerendered + }, + + + /* Event Dragging + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being dragged over the view. + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(start, end, seg) { + if (start.hasTime()) { + return this.timeGrid.renderDrag(start, end, seg); + } + else if (this.dayGrid) { + return this.dayGrid.renderDrag(start, end, seg); + } + }, + + + // Unrenders a visual indications of an event being dragged over the view + destroyDrag: function() { + this.timeGrid.destroyDrag(); + if (this.dayGrid) { + this.dayGrid.destroyDrag(); + } + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection + renderSelection: function(start, end) { + if (start.hasTime() || end.hasTime()) { + this.timeGrid.renderSelection(start, end); + } + else if (this.dayGrid) { + this.dayGrid.renderSelection(start, end); + } + }, + + + // Unrenders a visual indications of a selection + destroySelection: function() { + this.timeGrid.destroySelection(); + if (this.dayGrid) { + this.dayGrid.destroySelection(); + } + } + +}); + +;; + +/* A week view with an all-day cell area at the top, and a time grid below +----------------------------------------------------------------------------------------------------------------------*/ +// TODO: a WeekView mixin for calculating dates and titles + +fcViews.agendaWeek = AgendaWeekView; // register the view + +function AgendaWeekView(calendar) { + AgendaView.call(this, calendar); // call the super-constructor +} + + +AgendaWeekView.prototype = createObject(AgendaView.prototype); // define the super-class +$.extend(AgendaWeekView.prototype, { + + name: 'agendaWeek', + + + incrementDate: function(date, delta) { + return date.clone().stripTime().add(delta, 'weeks').startOf('week'); + }, + + + render: function(date) { + + this.intervalStart = date.clone().stripTime().startOf('week'); + this.intervalEnd = this.intervalStart.clone().add(1, 'weeks'); + + this.start = this.skipHiddenDays(this.intervalStart); + this.end = this.skipHiddenDays(this.intervalEnd, -1, true); + + this.title = this.calendar.formatRange( + this.start, + this.end.clone().subtract(1), // make inclusive by subtracting 1 ms + this.opt('titleFormat'), + ' \u2014 ' // emphasized dash + ); + + AgendaView.prototype.render.call(this, this.getCellsPerWeek()); // call the super-method + } + +}); + +;; + +/* A day view with an all-day cell area at the top, and a time grid below +----------------------------------------------------------------------------------------------------------------------*/ + +fcViews.agendaDay = AgendaDayView; // register the view + +function AgendaDayView(calendar) { + AgendaView.call(this, calendar); // call the super-constructor +} + + +AgendaDayView.prototype = createObject(AgendaView.prototype); // define the super-class +$.extend(AgendaDayView.prototype, { + + name: 'agendaDay', + + + incrementDate: function(date, delta) { + var out = date.clone().stripTime().add(delta, 'days'); + out = this.skipHiddenDays(out, delta < 0 ? -1 : 1); + return out; + }, + + + render: function(date) { + + this.start = this.intervalStart = date.clone().stripTime(); + this.end = this.intervalEnd = this.start.clone().add(1, 'days'); + + this.title = this.calendar.formatDate(this.start, this.opt('titleFormat')); + + AgendaView.prototype.render.call(this, 1); // call the super-method + } + +}); + +;; + +}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/fullcalendar.min.css b/dist/cdnjs/2.1.1/fullcalendar.min.css new file mode 100644 index 0000000..2858443 --- /dev/null +++ b/dist/cdnjs/2.1.1/fullcalendar.min.css @@ -0,0 +1,5 @@ +/*! + * FullCalendar v2.1.1 Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed hr,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-popover .fc-header,.fc-unthemed hr{background:#eee}.fc-unthemed .fc-popover .fc-header .fc-close{color:#666}.fc-unthemed .fc-today{background:#fcf8e3}.fc-highlight{background:#bce8f1;opacity:.3;filter:alpha(opacity=30)}.fc-icon{display:inline-block;font-size:2em;line-height:.5em;height:.5em;font-family:"Courier New",Courier,monospace}.fc-icon-left-single-arrow:after{content:"\02039";font-weight:700}.fc-icon-right-single-arrow:after{content:"\0203A";font-weight:700}.fc-icon-left-double-arrow:after{content:"\000AB"}.fc-icon-right-double-arrow:after{content:"\000BB"}.fc-icon-x:after{content:"\000D7"}.fc button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;white-space:nowrap;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:.05em;margin:0 .1em}.fc-state-default{background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.fc-button-group{display:inline-block}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{padding:2px 4px}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{cursor:pointer}.fc-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:25px;margin-top:4px}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.fc hr{height:0;margin:0;padding:0 0 2px;border-style:solid;border-width:1px 0}.fc-clear{clear:both}.fc-bg,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc-bg{bottom:0}.fc-bg table{height:100%}.fc table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-highlight-skeleton{z-index:2;bottom:0}.fc-row .fc-highlight-skeleton table{height:100%}.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-content-skeleton{position:relative;z-index:3;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:4}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{background:0 0;border-color:transparent;border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{overflow-y:scroll;overflow-x:hidden}.fc-scroller>*{position:relative;width:100%;overflow:hidden}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad;background-color:#3a87ad;font-weight:400}.fc-event,.fc-event:hover,.ui-widget .fc-event{color:#fff;text-decoration:none}.fc-event.fc-draggable,.fc-event[href]{cursor:pointer}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}.fc-ltr .fc-day-grid-event.fc-not-start,.fc-rtl .fc-day-grid-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-day-grid-event.fc-not-end,.fc-rtl .fc-day-grid-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-day-grid-event>.fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-day-grid-event .fc-resizer{position:absolute;top:0;bottom:0;width:7px}.fc-ltr .fc-day-grid-event .fc-resizer{right:-3px;cursor:e-resize}.fc-rtl .fc-day-grid-event .fc-resizer{left:-3px;cursor:w-resize}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-toolbar{text-align:center;margin-bottom:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.fc-toolbar button{position:relative}.fc-toolbar .fc-state-hover,.fc-toolbar .ui-state-hover{z-index:2}.fc-toolbar .fc-state-down{z-index:3}.fc-toolbar .fc-state-active,.fc-toolbar .ui-state-active{z-index:4}.fc-toolbar button:focus{z-index:5}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc-basic-view tbody .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:0 2px}.fc-basic-view td.fc-day-number,.fc-basic-view td.fc-week-number span{padding-top:2px;padding-bottom:2px}.fc-basic-view .fc-week-number{text-align:center}.fc-basic-view .fc-week-number span{display:inline-block;min-width:1.25em}.fc-ltr .fc-basic-view .fc-day-number{text-align:right}.fc-rtl .fc-basic-view .fc-day-number{text-align:left}.fc-day-number.fc-other-month{opacity:.3;filter:alpha(opacity=30)}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-highlight-skeleton{z-index:3}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:4;top:0;left:0;right:0}.fc-time-grid>.fc-helper-skeleton{z-index:5}.fc-slats td{height:1.5em;border-bottom:0}.fc-slats .fc-minor td{border-top-style:dotted}.fc-slats .ui-widget-content{background:0 0}.fc-time-grid .fc-highlight-container{position:relative}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-time-grid .fc-event-container{position:relative}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-time-grid-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event{overflow:hidden}.fc-time-grid-event>.fc-content{position:relative;z-index:2}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event .fc-bg{z-index:1;background:#fff;opacity:.25;filter:alpha(opacity=25)}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\000A0-\000A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event .fc-resizer{position:absolute;z-index:3;left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event .fc-resizer:after{content:"="} \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/fullcalendar.min.js b/dist/cdnjs/2.1.1/fullcalendar.min.js new file mode 100644 index 0000000..aa83c57 --- /dev/null +++ b/dist/cdnjs/2.1.1/fullcalendar.min.js @@ -0,0 +1,8 @@ +/*! + * FullCalendar v2.1.1 + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function i(t,e){return e.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"t")}function n(t,e){var i=e.longDateFormat("L");return i=i.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g,""),t.isRTL?i+=" ddd":i="ddd "+i,i}function r(t){o(De,t)}function o(e){function i(i,n){t.isPlainObject(n)&&t.isPlainObject(e[i])&&!s(i)?e[i]=o({},e[i],n):void 0!==n&&(e[i]=n)}for(var n=1;arguments.length>n;n++)t.each(arguments[n],i);return e}function s(t){return/(Time|Duration)$/.test(t)}function l(i,n){function r(t){var i=e.localeData||e.langData;return i.call(e,t)||i.call(e,"en")}function s(t){ie?h()&&(p(),f(t)):l()}function l(){ne=K.theme?"ui":"fc",i.addClass("fc"),K.isRTL?i.addClass("fc-rtl"):i.addClass("fc-ltr"),K.theme?i.addClass("ui-widget"):i.addClass("fc-unthemed"),ie=t("
").prependTo(i),te=new a(q,K),ee=te.render(),ee&&i.prepend(ee),u(K.defaultView),K.handleWindowResize&&(se=L(v,K.windowResizeDelay),t(window).resize(se))}function d(){re&&re.destroy(),te.destroy(),ie.remove(),i.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"),t(window).unbind("resize",se)}function h(){return i.is(":visible")}function u(t){f(0,t)}function f(e,i){he++,re&&i&&re.name!==i&&(te.deactivateButton(re.name),I(),re.start&&re.destroy(),re.el.remove(),re=null),!re&&i&&(re=new xe[i](q),re.el=t("
").appendTo(ie),te.activateButton(i)),re&&(e&&(le=re.incrementDate(le,e)),re.start&&!e&&le.isWithin(re.intervalStart,re.intervalEnd)||h()&&(I(),re.start&&re.destroy(),re.render(le),Z(),C(),x(),b())),Z(),he--}function g(t){return h()?(t&&m(),he++,re.updateSize(!0),he--,!0):void 0}function p(){h()&&m()}function m(){oe="number"==typeof K.contentHeight?K.contentHeight:"number"==typeof K.height?K.height-(ee?ee.outerHeight(!0):0):Math.round(ie.width()/Math.max(K.aspectRatio,.5))}function v(t){!he&&t.target===window&&re.start&&g(!0)&&re.trigger("windowResize",de)}function y(){E(),S()}function w(){h()&&(I(),re.destroyEvents(),re.renderEvents(ue),Z())}function E(){I(),re.destroyEvents(),Z()}function b(){!K.lazyFetching||ae(re.start,re.end)?S():w()}function S(){ce(re.start,re.end)}function D(t){ue=t,w()}function T(){w()}function C(){te.updateTitle(re.title)}function x(){var t=q.getNow();t.isWithin(re.intervalStart,re.intervalEnd)?te.disableButton("today"):te.enableButton("today")}function k(t,e){t=q.moment(t),e=e?q.moment(e):t.hasTime()?t.clone().add(q.defaultTimedEventDuration):t.clone().add(q.defaultAllDayEventDuration),re.select(t,e)}function M(){re&&re.unselect()}function R(){f(-1)}function P(){f(1)}function G(){le.add(-1,"years"),f()}function N(){le.add(1,"years"),f()}function Y(){le=q.getNow(),f()}function A(t){le=q.moment(t),f()}function _(t){le.add(e.duration(t)),f()}function O(t,e){var i,n;e&&void 0!==xe[e]||(e=e||"day",i=te.getViewsWithButtons().join(" "),n=i.match(RegExp("\\w+"+z(e))),n||(n=i.match(/\w+Day/)),e=n?n[0]:"agendaDay"),le=t,u(e)}function F(){return le.clone()}function I(){ie.css({width:"100%",height:ie.height(),overflow:"hidden"})}function Z(){ie.css({width:"",height:"",overflow:""})}function B(){return q}function j(){return re}function X(t,e){return void 0===e?K[t]:(("height"==t||"contentHeight"==t||"aspectRatio"==t)&&(K[t]=e,g(!0)),void 0)}function $(t,e){return K[t]?K[t].apply(e||de,Array.prototype.slice.call(arguments,2)):void 0}var q=this;n=n||{};var U,K=o({},De,n);U=K.lang in Te?Te[K.lang]:Te[De.lang],U&&(K=o({},De,U,n)),K.isRTL&&(K=o({},De,Ce,U||{},n)),q.options=K,q.render=s,q.destroy=d,q.refetchEvents=y,q.reportEvents=D,q.reportEventChange=T,q.rerenderEvents=w,q.changeView=u,q.select=k,q.unselect=M,q.prev=R,q.next=P,q.prevYear=G,q.nextYear=N,q.today=Y,q.gotoDate=A,q.incrementDate=_,q.zoomTo=O,q.getDate=F,q.getCalendar=B,q.getView=j,q.option=X,q.trigger=$;var Q=H(r(K.lang));if(K.monthNames&&(Q._months=K.monthNames),K.monthNamesShort&&(Q._monthsShort=K.monthNamesShort),K.dayNames&&(Q._weekdays=K.dayNames),K.dayNamesShort&&(Q._weekdaysShort=K.dayNamesShort),null!=K.firstDay){var J=H(Q._week);J.dow=K.firstDay,Q._week=J}q.defaultAllDayEventDuration=e.duration(K.defaultAllDayEventDuration),q.defaultTimedEventDuration=e.duration(K.defaultTimedEventDuration),q.moment=function(){var t;return"local"===K.timezone?(t=He.moment.apply(null,arguments),t.hasTime()&&t.local()):t="UTC"===K.timezone?He.moment.utc.apply(null,arguments):He.moment.parseZone.apply(null,arguments),"_locale"in t?t._locale=Q:t._lang=Q,t},q.getIsAmbigTimezone=function(){return"local"!==K.timezone&&"UTC"!==K.timezone},q.rezoneDate=function(t){return q.moment(t.toArray())},q.getNow=function(){var t=K.now;return"function"==typeof t&&(t=t()),q.moment(t)},q.calculateWeekNumber=function(t){var e=K.weekNumberCalculation;return"function"==typeof e?e(t):"local"===e?t.week():"ISO"===e.toUpperCase()?t.isoWeek():void 0},q.getEventEnd=function(t){return t.end?t.end.clone():q.getDefaultEventEnd(t.allDay,t.start)},q.getDefaultEventEnd=function(t,e){var i=e.clone();return t?i.stripTime().add(q.defaultAllDayEventDuration):i.add(q.defaultTimedEventDuration),q.getIsAmbigTimezone()&&i.stripZone(),i},q.formatRange=function(t,e,i){return"function"==typeof i&&(i=i.call(q,K,Q)),W(t,e,i,null,K.isRTL)},q.formatDate=function(t,e){return"function"==typeof e&&(e=e.call(q,K,Q)),V(t,e)},c.call(q,K);var te,ee,ie,ne,re,oe,se,le,ae=q.isFetchNeeded,ce=q.fetchEvents,de=i[0],he=0,ue=[];le=null!=K.defaultDate?q.moment(K.defaultDate):q.getNow(),q.getSuggestedViewHeight=function(){return void 0===oe&&p(),oe},q.isHeightAuto=function(){return"auto"===K.contentHeight||"auto"===K.height}}function a(e,i){function n(){var e=i.header;return f=i.theme?"ui":"fc",e?g=t("
").append(o("left")).append(o("right")).append(o("center")).append('
'):void 0}function r(){g.remove()}function o(n){var r=t('
'),o=i.header[n];return o&&t.each(o.split(" "),function(){var n,o=t(),s=!0;t.each(this.split(","),function(n,r){var l,a,c,d,h,u,g,m;"title"==r?(o=o.add(t("

 

")),s=!1):(e[r]?l=function(){e[r]()}:xe[r]&&(l=function(){e.changeView(r)},p.push(r)),l&&(a=S(i.themeButtonIcons,r),c=S(i.buttonIcons,r),d=S(i.defaultButtonText,r),h=S(i.buttonText,r),u=h?R(h):a&&i.theme?"":c&&!i.theme?"":R(d||r),g=["fc-"+r+"-button",f+"-button",f+"-state-default"],m=t('").click(function(){m.hasClass(f+"-state-disabled")||(l(),(m.hasClass(f+"-state-active")||m.hasClass(f+"-state-disabled"))&&m.removeClass(f+"-state-hover"))}).mousedown(function(){m.not("."+f+"-state-active").not("."+f+"-state-disabled").addClass(f+"-state-down")}).mouseup(function(){m.removeClass(f+"-state-down")}).hover(function(){m.not("."+f+"-state-active").not("."+f+"-state-disabled").addClass(f+"-state-hover")},function(){m.removeClass(f+"-state-hover").removeClass(f+"-state-down")}),o=o.add(m)))}),s&&o.first().addClass(f+"-corner-left").end().last().addClass(f+"-corner-right").end(),o.length>1?(n=t("
"),s&&n.addClass("fc-button-group"),n.append(o),r.append(n)):r.append(o)}),r}function s(t){g.find("h2").text(t)}function l(t){g.find(".fc-"+t+"-button").addClass(f+"-state-active")}function a(t){g.find(".fc-"+t+"-button").removeClass(f+"-state-active")}function c(t){g.find(".fc-"+t+"-button").attr("disabled","disabled").addClass(f+"-state-disabled")}function d(t){g.find(".fc-"+t+"-button").removeAttr("disabled").removeClass(f+"-state-disabled")}function h(){return p}var u=this;u.render=n,u.destroy=r,u.updateTitle=s,u.activateButton=l,u.deactivateButton=a,u.disableButton=c,u.enableButton=d,u.getViewsWithButtons=h;var f,g=t(),p=[]}function c(e){function i(t,e){return!T||t.clone().stripZone()C.clone().stripZone()}function n(t,e){T=t,C=e,A=[];var i=++G,n=L.length;N=n;for(var o=0;n>o;o++)r(L[o],i)}function r(e,i){o(e,function(n){var r,o,s=t.isArray(e.events);if(i==G){if(n)for(r=0;n.length>r;r++)o=n[r],s||(o=w(o,e)),o&&A.push(o);N--,N||R(A)}})}function o(i,n){var r,s,l=He.sourceFetchers;for(r=0;l.length>r;r++){if(s=l[r].call(S,i,T.clone(),C.clone(),e.timezone,n),s===!0)return;if("object"==typeof s)return o(s,n),void 0}var a=i.events;if(a)t.isFunction(a)?(v(),a.call(S,T.clone(),C.clone(),e.timezone,function(t){n(t),y()})):t.isArray(a)?n(a):n();else{var c=i.url;if(c){var d,h=i.success,u=i.error,f=i.complete;d=t.isFunction(i.data)?i.data():i.data;var g=t.extend({},d||{}),p=M(i.startParam,e.startParam),m=M(i.endParam,e.endParam),w=M(i.timezoneParam,e.timezoneParam);p&&(g[p]=T.format()),m&&(g[m]=C.format()),e.timezone&&"local"!=e.timezone&&(g[w]=e.timezone),v(),t.ajax(t.extend({},ke,i,{data:g,success:function(e){e=e||[];var i=k(h,this,arguments);t.isArray(i)&&(e=i),n(e)},error:function(){k(u,this,arguments),n()},complete:function(){k(f,this,arguments),y()}}))}else n()}}function s(t){var e=l(t);e&&(L.push(e),N++,r(e,G))}function l(e){var i,n,r=He.sourceNormalizers;if(t.isFunction(e)||t.isArray(e)?i={events:e}:"string"==typeof e?i={url:e}:"object"==typeof e&&(i=t.extend({},e)),i){for(i.className?"string"==typeof i.className&&(i.className=i.className.split(/\s+/)):i.className=[],t.isArray(i.events)&&(i.origArray=i.events,i.events=t.map(i.events,function(t){return w(t,i)})),n=0;r.length>n;n++)r[n].call(S,i);return i}}function a(e){L=t.grep(L,function(t){return!c(t,e)}),A=t.grep(A,function(t){return!c(t.source,e)}),R(A)}function c(t,e){return t&&e&&h(t)==h(e)}function h(t){return("object"==typeof t?t.origArray||t.url||t.events:null)||t}function u(t){t.start=S.moment(t.start),t.end&&(t.end=S.moment(t.end)),E(t),f(t),R(A)}function f(t){var e,i,n,r;for(e=0;A.length>e;e++)if(i=A[e],i._id==t._id&&i!==t)for(n=0;V.length>n;n++)r=V[n],void 0!==t[r]&&(i[r]=t[r])}function g(t,e){var i=w(t);i&&(i.source||(e&&(z.events.push(i),i.source=z),A.push(i)),R(A))}function p(e){var i,n;for(null==e?e=function(){return!0}:t.isFunction(e)||(i=e+"",e=function(t){return t._id==i}),A=t.grep(A,e,!0),n=0;L.length>n;n++)t.isArray(L[n].events)&&(L[n].events=t.grep(L[n].events,e,!0));R(A)}function m(e){return t.isFunction(e)?t.grep(A,e):null!=e?(e+="",t.grep(A,function(t){return t._id==e})):A}function v(){Y++||H("loading",null,!0,x())}function y(){--Y||H("loading",null,!1,x())}function w(i,n){var r,o,s,l,a={};return e.eventDataTransform&&(i=e.eventDataTransform(i)),n&&n.eventDataTransform&&(i=n.eventDataTransform(i)),r=S.moment(i.start||i.date),r.isValid()&&(o=null,!i.end||(o=S.moment(i.end),o.isValid()))?(s=i.allDay,void 0===s&&(l=M(n?n.allDayDefault:void 0,e.allDayDefault),s=void 0!==l?l:!(r.hasTime()||o&&o.hasTime())),s?(r.hasTime()&&r.stripTime(),o&&o.hasTime()&&o.stripTime()):(r.hasTime()||(r=S.rezoneDate(r)),o&&!o.hasTime()&&(o=S.rezoneDate(o))),t.extend(a,i),n&&(a.source=n),a._id=i._id||(void 0===i.id?"_fc"+Me++:i.id+""),a.className=i.className?"string"==typeof i.className?i.className.split(/\s+/):i.className:[],a.resources?"string"==typeof a.resources&&(a.resources=a.resources.split(/\s+/)):a.resources=[],a.allDay=s,a.start=r,a.end=o,e.forceEventDuration&&!a.end&&(a.end=P(a)),d(a),a):void 0}function E(t,e,i){var n,r,o,s,l=t._allDay,a=t._start,c=t._end,d=!1;return e||i||(e=t.start,i=t.end),n=t.allDay!=l?t.allDay:!(e||i).hasTime(),n&&(e&&(e=e.clone().stripTime()),i&&(i=i.clone().stripTime())),e&&(r=n?D(e,a.clone().stripTime()):D(e,a)),n!=l?d=!0:i&&(o=D(i||S.getDefaultEventEnd(n,e||a),e||a).subtract(D(c||S.getDefaultEventEnd(l,a),a))),s=b(m(t._id),d,n,r,o),{dateDelta:r,durationDelta:o,undo:s}}function b(i,n,r,o,s){var l=S.getIsAmbigTimezone(),a=[];return t.each(i,function(t,i){var c=i._allDay,h=i._start,u=i._end,f=null!=r?r:c,g=h.clone(),p=!n&&u?u.clone():null;f?(g.stripTime(),p&&p.stripTime()):(g.hasTime()||(g=S.rezoneDate(g)),p&&!p.hasTime()&&(p=S.rezoneDate(p))),p||!e.forceEventDuration&&!+s||(p=S.getDefaultEventEnd(f,g)),g.add(o),p&&p.add(o).add(s),l&&(+o||+s)&&(g.stripZone(),p&&p.stripZone()),i.allDay=f,i.start=g,i.end=p,d(i),a.push(function(){i.allDay=c,i.start=h,i.end=u,d(i)})}),function(){for(var t=0;a.length>t;t++)a[t]()}}var S=this;S.isFetchNeeded=i,S.fetchEvents=n,S.addEventSource=s,S.removeEventSource=a,S.updateEvent=u,S.renderEvent=g,S.removeEvents=p,S.clientEvents=m,S.mutateEvent=E;var T,C,H=S.trigger,x=S.getView,R=S.reportEvents,P=S.getEventEnd,z={events:[]},L=[z],G=0,N=0,Y=0,A=[];t.each((e.events?[e.events]:[]).concat(e.eventSources||[]),function(t,e){var i=l(e);i&&L.push(i)});var V=["title","url","allDay","className","editable","color","backgroundColor","borderColor","textColor"]}function d(t){t._allDay=t.allDay,t._start=t.start.clone(),t._end=t.end?t.end.clone():null}function h(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function u(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function f(e,i,n){var r=Math.floor(i/e.length),o=Math.floor(i-r*(e.length-1)),s=[],l=[],a=[],c=0;g(e),e.each(function(i,n){var d=i===e.length-1?o:r,h=t(n).outerHeight(!0);d>h?(s.push(n),l.push(h),a.push(t(n).height())):c+=h}),n&&(i-=c,r=Math.floor(i/s.length),o=Math.floor(i-r*(s.length-1))),t(s).each(function(e,i){var n=e===s.length-1?o:r,c=l[e],d=a[e],h=n-(c-d);n>c&&t(i).height(h)})}function g(t){t.height("")}function p(e){var i=0;return e.find("> *").each(function(e,n){var r=t(n).outerWidth();r>i&&(i=r)}),i++,e.width(i),i}function m(t,e){return t.height(e).addClass("fc-scroller"),t[0].scrollHeight-1>t[0].clientHeight?!0:(v(t),!1)}function v(t){t.height("").removeClass("fc-scroller")}function y(e){var i=e.css("position"),n=e.parents().filter(function(){var e=t(this);return/(auto|scroll)/.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&n.length?n:t(e[0].ownerDocument||document)}function w(t){var e=t.offset().left,i=e+t.width(),n=t.children(),r=n.offset().left,o=r+n.outerWidth();return{left:r-e,right:i-o}}function E(t){return 1==t.which&&!t.ctrlKey}function b(t,e,i,n){var r,o,s,l;return e>i&&n>t?(t>=i?(r=t.clone(),s=!0):(r=i.clone(),s=!1),n>=e?(o=e.clone(),l=!0):(o=n.clone(),l=!1),{start:r,end:o,isStart:s,isEnd:l}):void 0}function S(t,e){if(t=t||{},void 0!==t[e])return t[e];for(var i,n=e.split(/(?=[A-Z])/),r=n.length-1;r>=0;r--)if(i=t[n[r].toLowerCase()],void 0!==i)return i;return t["default"]}function D(t,i){return e.duration({days:t.clone().stripTime().diff(i.clone().stripTime(),"days"),ms:t.time()-i.time()})}function T(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function C(t,e){return t-e}function H(t){var e=function(){};return e.prototype=t,new e}function x(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])}function k(e,i,n){if(t.isFunction(e)&&(e=[e]),e){var r,o;for(r=0;e.length>r;r++)o=e[r].apply(i,n)||o;return o}}function M(){for(var t=0;arguments.length>t;t++)if(void 0!==arguments[t])return arguments[t]}function R(t){return(t+"").replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function P(t){return t.replace(/&.*?;/g,"")}function z(t){return t.charAt(0).toUpperCase()+t.slice(1)}function L(t,e){var i,n,r,o,s=function(){var l=+new Date-o;e>l&&l>0?i=setTimeout(s,e-l):(i=null,t.apply(r,n),i||(r=n=null))};return function(){r=this,n=arguments,o=+new Date,i||(i=setTimeout(s,e))}}function G(i,n,r){var o,s,l,a,c=i[0],d=1==i.length&&"string"==typeof c;return e.isMoment(c)?(a=e.apply(null,i),c._ambigTime&&(a._ambigTime=!0),c._ambigZone&&(a._ambigZone=!0)):T(c)||void 0===c?a=e.apply(null,i):(o=!1,s=!1,d?Pe.test(c)?(c+="-01",i=[c],o=!0,s=!0):(l=ze.exec(c))&&(o=!l[5],s=!0):t.isArray(c)&&(s=!0),a=n?e.utc.apply(e,i):e.apply(null,i),o?(a._ambigTime=!0,a._ambigZone=!0):r&&(s?a._ambigZone=!0:d&&a.zone(c))),new N(a)}function N(t){x(this,t)}function Y(t,e){var i,n=[],r=!1,o=!1;for(i=0;t.length>i;i++)n.push(He.moment.parseZone(t[i])),r=r||n[i]._ambigTime,o=o||n[i]._ambigZone;for(i=0;n.length>i;i++)r&&!e?n[i].stripTime():o&&n[i].stripZone();return n}function A(t,i){return e.fn.format.call(t,i)}function V(t,e){return _(t,Z(e))}function _(t,e){var i,n="";for(i=0;e.length>i;i++)n+=O(t,e[i]);return n}function O(t,e){var i,n;return"string"==typeof e?e:(i=e.token)?Le[i]?Le[i](t):A(t,i):e.maybe&&(n=_(t,e.maybe),n.match(/[1-9]/))?n:""}function W(t,e,i,n,r){var o;return t=He.moment.parseZone(t),e=He.moment.parseZone(e),o=(t.localeData||t.lang).call(t),i=o.longDateFormat(i)||i,n=n||" - ",F(t,e,Z(i),n,r)}function F(t,e,i,n,r){var o,s,l,a,c="",d="",h="",u="",f="";for(s=0;i.length>s&&(o=I(t,e,i[s]),o!==!1);s++)c+=o;for(l=i.length-1;l>s&&(o=I(t,e,i[l]),o!==!1);l--)d=o+d;for(a=s;l>=a;a++)h+=O(t,i[a]),u+=O(e,i[a]);return(h||u)&&(f=r?u+n+h:h+n+u),c+f+d}function I(t,e,i){var n,r;return"string"==typeof i?i:(n=i.token)&&(r=Ge[n.charAt(0)],r&&t.isSame(e,r))?A(t,n):!1}function Z(t){return t in Ne?Ne[t]:Ne[t]=B(t)}function B(t){for(var e,i=[],n=/\[([^\]]*)\]|\(([^\)]*)\)|(LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=n.exec(t);)e[1]?i.push(e[1]):e[2]?i.push({maybe:B(e[2])}):e[3]?i.push({token:e[3]}):e[5]&&i.push(e[5]);return i}function j(t){this.options=t||{}}function X(t){this.grid=t}function $(t){this.coordMaps=t}function q(t,e){this.coordMap=t,this.options=e||{}}function U(t,e){return t||e?t&&e?t.grid===e.grid&&t.row===e.row&&t.col===e.col:!1:!0}function K(e,i){this.options=i=i||{},this.sourceEl=e,this.parentEl=i.parentEl?t(i.parentEl):e.parent()}function Q(t){this.view=t}function J(t){Q.call(this,t),this.coordMap=new X(this)}function te(t,e){return t.eventStartMS-e.eventStartMS||e.eventDurationMS-t.eventDurationMS||e.event.allDay-t.event.allDay||(t.event.title||"").localeCompare(e.event.title)}function ee(t){J.call(this,t)}function ie(t,e){var i,n;for(i=0;e.length>i;i++)if(n=e[i],n.leftCol<=t.rightCol&&n.rightCol>=t.leftCol)return!0;return!1}function ne(t,e){return t.leftCol-e.leftCol}function re(t){J.call(this,t)}function oe(t){var e,i,n;if(t.sort(te),e=se(t),le(e),i=e[0]){for(n=0;i.length>n;n++)ae(i[n]);for(n=0;i.length>n;n++)ce(i[n],0,0)}}function se(t){var e,i,n,r=[];for(e=0;t.length>e;e++){for(i=t[e],n=0;r.length>n&&de(i,r[n]).length;n++);i.level=n,(r[n]||(r[n]=[])).push(i)}return r}function le(t){var e,i,n,r,o;for(e=0;t.length>e;e++)for(i=t[e],n=0;i.length>n;n++)for(r=i[n],r.forwardSegs=[],o=e+1;t.length>o;o++)de(r,t[o],r.forwardSegs)}function ae(t){var e,i,n=t.forwardSegs,r=0;if(void 0===t.forwardPressure){for(e=0;n.length>e;e++)i=n[e],ae(i),r=Math.max(r,1+i.forwardPressure);t.forwardPressure=r}}function ce(t,e,i){var n,r=t.forwardSegs;if(void 0===t.forwardCoord)for(r.length?(r.sort(ue),ce(r[0],e+1,i),t.forwardCoord=r[0].backwardCoord):t.forwardCoord=1,t.backwardCoord=t.forwardCoord-(t.forwardCoord-i)/(e+1),n=0;r.length>n;n++)ce(r[n],0,t.forwardCoord)}function de(t,e,i){i=i||[];for(var n=0;e.length>n;n++)he(t,e[n])&&i.push(e[n]);return i}function he(t,e){return t.bottom>e.top&&t.topd;d++){var h=d*n,u=h+n-1,f=Math.max(a,h),g=Math.min(c,u);if(g>=f){var m=E(f),v=E(g),b=[m.col,v.col].sort(),S=p(f)==s,T=p(g)+1==l;r.push({row:d,leftCol:b[0],rightCol:b[1],isStart:S,isEnd:T})}}return r}function D(t,e){var i,n,r=t.clone().stripTime();return e&&(i=e.clone().stripTime(),n=+e.time(),n&&n>=k&&i.add(1,"days")),(!e||r>=i)&&(i=r.clone().add(1,"days")),{start:r,end:i}}function T(t){var e=D(t.start,t.end);return e.end.diff(e.start,"days")>1}var C=this;C.calendar=i,C.opt=n,C.trigger=r,C.isEventDraggable=o,C.isEventResizable=l,C.eventDrop=a,C.eventResize=c;var H=i.reportEventChange,x=i.options,k=e.duration(x.nextDayThreshold);C.init(),C.getEventTimeText=function(t,e){var r,o;return"object"==typeof t&&"object"==typeof e?(r=t,o=e,e=arguments[2]):(r=t.start,o=t.end),e=e||n("timeFormat"),o&&n("displayEventEnd")?i.formatRange(r,o,e):i.formatDate(r,e)},C.isHiddenDay=d,C.skipHiddenDays=u,C.getCellsPerWeek=h,C.dateToCell=v,C.dateToDayOffset=y,C.dayOffsetToCellOffset=w,C.cellOffsetToCell=E,C.cellToDate=f,C.cellToCellOffset=g,C.cellOffsetToDayOffset=p,C.dayOffsetToDate=m,C.rangeToSegments=b,C.isMultiDayEvent=T;var R,P=n("hiddenDays")||[],z=[],L=[],G=[],N=n("isRTL");(function(){n("weekends")===!1&&P.push(0,6);for(var e=0,i=0;7>e;e++)L[e]=i,z[e]=-1!=t.inArray(e,P),z[e]||(G[i]=e,i++);if(R=i,!R)throw"invalid hiddenDays"})()}function ge(t){fe.call(this,t),this.dayGrid=new ee(this),this.coordMap=this.dayGrid.coordMap}function pe(t){ge.call(this,t)}function me(t){ge.call(this,t)}function ve(t){ge.call(this,t)}function ye(t,e){return e.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"a")}function we(t,e){return e.longDateFormat("LT").replace(/\s*a$/i,"")}function Ee(t){fe.call(this,t),this.timeGrid=new re(this),this.opt("allDaySlot")?(this.dayGrid=new ee(this),this.coordMap=new $([this.dayGrid.coordMap,this.timeGrid.coordMap])):this.coordMap=this.timeGrid.coordMap}function be(t){Ee.call(this,t)}function Se(t){Ee.call(this,t)}var De={lang:"en",defaultTimedEventDuration:"02:00:00",defaultAllDayEventDuration:{days:1},forceEventDuration:!1,nextDayThreshold:"09:00:00",defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberTitle:"W",weekNumberCalculation:"local",lazyFetching:!0,startParam:"start",endParam:"end",timezoneParam:"timezone",timezone:!1,titleFormat:{month:"MMMM YYYY",week:"ll",day:"LL"},columnFormat:{month:"ddd",week:n,day:"dddd"},timeFormat:{"default":i},displayEventEnd:{month:!1,basicWeek:!1,"default":!0},isRTL:!1,defaultButtonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",today:"today",month:"month",week:"week",day:"day"},buttonIcons:{prev:"left-single-arrow",next:"right-single-arrow",prevYear:"left-double-arrow",nextYear:"right-double-arrow"},theme:!1,themeButtonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e",prevYear:"seek-prev",nextYear:"seek-next"},dragOpacity:.75,dragRevertDuration:500,dragScroll:!0,unselectAuto:!0,dropAccept:"*",eventLimit:!1,eventLimitText:"more",eventLimitClick:"popover",dayPopoverFormat:"LL",handleWindowResize:!0,windowResizeDelay:200},Te={en:{columnFormat:{week:"ddd M/D"},dayPopoverFormat:"dddd, MMMM D"}},Ce={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"right-single-arrow",next:"left-single-arrow",prevYear:"right-double-arrow",nextYear:"left-double-arrow"},themeButtonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w",nextYear:"seek-prev",prevYear:"seek-next"}},He=t.fullCalendar={version:"2.1.1"},xe=He.views={};t.fn.fullCalendar=function(e){var i=Array.prototype.slice.call(arguments,1),n=this;return this.each(function(r,o){var s,a=t(o),c=a.data("fullCalendar");"string"==typeof e?c&&t.isFunction(c[e])&&(s=c[e].apply(c,i),r||(n=s),"destroy"===e&&a.removeData("fullCalendar")):c||(c=new l(a,e),a.data("fullCalendar",c),c.render())}),n},He.langs=Te,He.datepickerLang=function(e,i,n){var r=Te[e];r||(r=Te[e]={}),o(r,{isRTL:n.isRTL,weekNumberTitle:n.weekHeader,titleFormat:{month:n.showMonthAfterYear?"YYYY["+n.yearSuffix+"] MMMM":"MMMM YYYY["+n.yearSuffix+"]"},defaultButtonText:{prev:P(n.prevText),next:P(n.nextText),today:P(n.currentText)}}),t.datepicker&&(t.datepicker.regional[i]=t.datepicker.regional[e]=n,t.datepicker.regional.en=t.datepicker.regional[""],t.datepicker.setDefaults(n))},He.lang=function(t,e){var i;e&&(i=Te[t],i||(i=Te[t]={}),o(i,e||{})),De.lang=t},He.sourceNormalizers=[],He.sourceFetchers=[];var ke={dataType:"json",cache:!1},Me=1,Re=["sun","mon","tue","wed","thu","fri","sat"];He.applyAll=k;var Pe=/^\s*\d{4}-\d\d$/,ze=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/;He.moment=function(){return G(arguments)},He.moment.utc=function(){var t=G(arguments,!0);return t.hasTime()&&t.utc(),t},He.moment.parseZone=function(){return G(arguments,!0,!0)},N.prototype=H(e.fn),N.prototype.clone=function(){return G([this])},N.prototype.time=function(t){if(null==t)return e.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});delete this._ambigTime,e.isDuration(t)||e.isMoment(t)||(t=e.duration(t));var i=0;return e.isDuration(t)&&(i=24*Math.floor(t.asDays())),this.hours(i+t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())},N.prototype.stripTime=function(){var t=this.toArray();return e.fn.utc.call(this),this.year(t[0]).month(t[1]).date(t[2]).hours(0).minutes(0).seconds(0).milliseconds(0),this._ambigTime=!0,this._ambigZone=!0,this},N.prototype.hasTime=function(){return!this._ambigTime},N.prototype.stripZone=function(){var t=this.toArray(),i=this._ambigTime;return e.fn.utc.call(this),this.year(t[0]).month(t[1]).date(t[2]).hours(t[3]).minutes(t[4]).seconds(t[5]).milliseconds(t[6]),i&&(this._ambigTime=!0),this._ambigZone=!0,this},N.prototype.hasZone=function(){return!this._ambigZone},N.prototype.zone=function(t){return null!=t&&(delete this._ambigTime,delete this._ambigZone),e.fn.zone.apply(this,arguments)},N.prototype.local=function(){var t=this.toArray(),i=this._ambigZone;return delete this._ambigTime,delete this._ambigZone,e.fn.local.apply(this,arguments),i&&this.year(t[0]).month(t[1]).date(t[2]).hours(t[3]).minutes(t[4]).seconds(t[5]).milliseconds(t[6]),this},N.prototype.utc=function(){return delete this._ambigTime,delete this._ambigZone,e.fn.utc.apply(this,arguments)},N.prototype.format=function(){return arguments[0]?V(this,arguments[0]):this._ambigTime?A(this,"YYYY-MM-DD"):this._ambigZone?A(this,"YYYY-MM-DD[T]HH:mm:ss"):A(this)},N.prototype.toISOString=function(){return this._ambigTime?A(this,"YYYY-MM-DD"):this._ambigZone?A(this,"YYYY-MM-DD[T]HH:mm:ss"):e.fn.toISOString.apply(this,arguments)},N.prototype.isWithin=function(t,e){var i=Y([this,t,e]);return i[0]>=i[1]&&i[0]').addClass(i.className||"").css({top:0,left:0}).append(i.content).appendTo(i.parentEl),this.el.on("click",".fc-close",function(){e.hide()}),i.autoHide&&t(document).on("mousedown",this.documentMousedownProxy=t.proxy(this,"documentMousedown"))},documentMousedown:function(e){this.el&&!t(e.target).closest(this.el).length&&this.hide()},destroy:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),t(document).off("mousedown",this.documentMousedownProxy)},position:function(){var e,i,n,r,o,s=this.options,l=this.el.offsetParent().offset(),a=this.el.outerWidth(),c=this.el.outerHeight(),d=t(window),h=y(this.el);r=s.top||0,o=void 0!==s.left?s.left:void 0!==s.right?s.right-a:0,h.is(window)||h.is(document)?(h=d,e=0,i=0):(n=h.offset(),e=n.top,i=n.left),e+=d.scrollTop(),i+=d.scrollLeft(),s.viewportConstrain!==!1&&(r=Math.min(r,e+h.outerHeight()-c-this.margin),r=Math.max(r,e+this.margin),o=Math.min(o,i+h.outerWidth()-a-this.margin),o=Math.max(o,i+this.margin)),this.el.css({top:r-l.top,left:o-l.left})},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))}},X.prototype={grid:null,rows:null,cols:null,containerEl:null,minX:null,maxX:null,minY:null,maxY:null,build:function(){this.grid.buildCoords(this.rows=[],this.cols=[]),this.computeBounds()},getCell:function(t,e){var i,n=null,r=this.rows,o=this.cols,s=-1,l=-1;if(this.inBounds(t,e)){for(i=0;r.length>i;i++)if(e>=r[i][0]&&r[i][1]>e){s=i;break}for(i=0;o.length>i;i++)if(t>=o[i][0]&&o[i][1]>t){l=i;break}s>=0&&l>=0&&(n={row:s,col:l},n.grid=this.grid,n.date=this.grid.getCellDate(n))}return n},computeBounds:function(){var t;this.containerEl&&(t=this.containerEl.offset(),this.minX=t.left,this.maxX=t.left+this.containerEl.outerWidth(),this.minY=t.top,this.maxY=t.top+this.containerEl.outerHeight())},inBounds:function(t,e){return this.containerEl?t>=this.minX&&this.maxX>t&&e>=this.minY&&this.maxY>e:!0}},$.prototype={coordMaps:null,build:function(){var t,e=this.coordMaps;for(t=0;e.length>t;t++)e[t].build()},getCell:function(t,e){var i,n=this.coordMaps,r=null;for(i=0;n.length>i&&!r;i++)r=n[i].getCell(t,e);return r}},q.prototype={coordMap:null,options:null,isListening:!1,isDragging:!1,origCell:null,origDate:null,cell:null,date:null,mouseX0:null,mouseY0:null,mousemoveProxy:null,mouseupProxy:null,scrollEl:null,scrollBounds:null,scrollTopVel:null,scrollLeftVel:null,scrollIntervalId:null,scrollHandlerProxy:null,scrollSensitivity:30,scrollSpeed:200,scrollIntervalMs:50,mousedown:function(t){E(t)&&(t.preventDefault(),this.startListening(t),this.options.distance||this.startDrag(t))},startListening:function(e){var i,n;this.isListening||(e&&this.options.scroll&&(i=y(t(e.target)),i.is(window)||i.is(document)||(this.scrollEl=i,this.scrollHandlerProxy=L(t.proxy(this,"scrollHandler"),100),this.scrollEl.on("scroll",this.scrollHandlerProxy))),this.computeCoords(),e&&(n=this.getCell(e),this.origCell=n,this.origDate=n?n.date:null,this.mouseX0=e.pageX,this.mouseY0=e.pageY),t(document).on("mousemove",this.mousemoveProxy=t.proxy(this,"mousemove")).on("mouseup",this.mouseupProxy=t.proxy(this,"mouseup")).on("selectstart",this.preventDefault),this.isListening=!0,this.trigger("listenStart",e))},computeCoords:function(){this.coordMap.build(),this.computeScrollBounds()},mousemove:function(t){var e,i;this.isDragging||(e=this.options.distance||1,i=Math.pow(t.pageX-this.mouseX0,2)+Math.pow(t.pageY-this.mouseY0,2),i>=e*e&&this.startDrag(t)),this.isDragging&&this.drag(t) +},startDrag:function(t){var e;this.isListening||this.startListening(),this.isDragging||(this.isDragging=!0,this.trigger("dragStart",t),e=this.getCell(t),e&&this.cellOver(e,!0))},drag:function(t){var e;this.isDragging&&(e=this.getCell(t),U(e,this.cell)||(this.cell&&this.cellOut(),e&&this.cellOver(e)),this.dragScroll(t))},cellOver:function(t){this.cell=t,this.date=t.date,this.trigger("cellOver",t,t.date)},cellOut:function(){this.cell&&(this.trigger("cellOut",this.cell),this.cell=null,this.date=null)},mouseup:function(t){this.stopDrag(t),this.stopListening(t)},stopDrag:function(t){this.isDragging&&(this.stopScrolling(),this.trigger("dragStop",t),this.isDragging=!1)},stopListening:function(e){this.isListening&&(this.scrollEl&&(this.scrollEl.off("scroll",this.scrollHandlerProxy),this.scrollHandlerProxy=null),t(document).off("mousemove",this.mousemoveProxy).off("mouseup",this.mouseupProxy).off("selectstart",this.preventDefault),this.mousemoveProxy=null,this.mouseupProxy=null,this.isListening=!1,this.trigger("listenStop",e),this.origCell=this.cell=null,this.origDate=this.date=null)},getCell:function(t){return this.coordMap.getCell(t.pageX,t.pageY)},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))},preventDefault:function(t){t.preventDefault()},computeScrollBounds:function(){var t,e=this.scrollEl;e&&(t=e.offset(),this.scrollBounds={top:t.top,left:t.left,bottom:t.top+e.outerHeight(),right:t.left+e.outerWidth()})},dragScroll:function(t){var e,i,n,r,o=this.scrollSensitivity,s=this.scrollBounds,l=0,a=0;s&&(e=(o-(t.pageY-s.top))/o,i=(o-(s.bottom-t.pageY))/o,n=(o-(t.pageX-s.left))/o,r=(o-(s.right-t.pageX))/o,e>=0&&1>=e?l=-1*e*this.scrollSpeed:i>=0&&1>=i&&(l=i*this.scrollSpeed),n>=0&&1>=n?a=-1*n*this.scrollSpeed:r>=0&&1>=r&&(a=r*this.scrollSpeed)),this.setScrollVel(l,a)},setScrollVel:function(e,i){this.scrollTopVel=e,this.scrollLeftVel=i,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(t.proxy(this,"scrollIntervalFunc"),this.scrollIntervalMs))},constrainScrollVel:function(){var t=this.scrollEl;0>this.scrollTopVel?0>=t.scrollTop()&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),0>this.scrollLeftVel?0>=t.scrollLeft()&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},scrollIntervalFunc:function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.stopScrolling()},stopScrolling:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.computeCoords())},scrollHandler:function(){this.scrollIntervalId||this.computeCoords()}},K.prototype={options:null,sourceEl:null,el:null,parentEl:null,top0:null,left0:null,mouseY0:null,mouseX0:null,topDelta:null,leftDelta:null,mousemoveProxy:null,isFollowing:!1,isHidden:!1,isAnimating:!1,start:function(e){this.isFollowing||(this.isFollowing=!0,this.mouseY0=e.pageY,this.mouseX0=e.pageX,this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),t(document).on("mousemove",this.mousemoveProxy=t.proxy(this,"mousemove")))},stop:function(e,i){function n(){this.isAnimating=!1,r.destroyEl(),this.top0=this.left0=null,i&&i()}var r=this,o=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,t(document).off("mousemove",this.mousemoveProxy),e&&o&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:o,complete:n})):n())},getEl:function(){var t=this.el;return t||(this.sourceEl.width(),t=this.el=this.sourceEl.clone().css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}).appendTo(this.parentEl)),t},destroyEl:function(){this.el&&(this.el.remove(),this.el=null)},updatePosition:function(){var t,e;this.getEl(),null===this.top0&&(this.sourceEl.width(),t=this.sourceEl.offset(),e=this.el.offsetParent().offset(),this.top0=t.top-e.top,this.left0=t.left-e.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},mousemove:function(t){this.topDelta=t.pageY-this.mouseY0,this.leftDelta=t.pageX-this.mouseX0,this.isHidden||this.updatePosition()},hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}},Q.prototype={view:null,cellHtml:"",rowHtml:function(t,e){var i,n,r=this.view,o=this.getHtmlRenderer("cell",t),s="";for(e=e||0,i=0;r.colCnt>i;i++)n=r.cellToDate(e,i),s+=o(e,i,n);return s=this.bookendCells(s,t,e),""+s+""},bookendCells:function(t,e,i){var n=this.view,r=this.getHtmlRenderer("intro",e)(i||0),o=this.getHtmlRenderer("outro",e)(i||0),s=n.opt("isRTL"),l=s?o:r,a=s?r:o;return"string"==typeof t?l+t+a:t.prepend(l).append(a)},getHtmlRenderer:function(t,e){var i,n,r,o,s=this.view;return i=t+"Html",e&&(n=e+z(t)+"Html"),n&&(o=s[n])?r=s:n&&(o=this[n])?r=this:(o=s[i])?r=s:(o=this[i])&&(r=this),"function"==typeof o?function(){return o.apply(r,arguments)||""}:function(){return o||""}}},J.prototype=H(Q.prototype),t.extend(J.prototype,{el:null,coordMap:null,cellDuration:null,render:function(){this.bindHandlers()},destroy:function(){},buildCoords:function(){},getCellDate:function(){},getCellDayEl:function(){},rangeToSegs:function(){},bindHandlers:function(){var e=this;this.el.on("mousedown",function(i){t(i.target).is(".fc-event-container *, .fc-more")||t(i.target).closest(".fc-popover").length||e.dayMousedown(i)}),this.bindSegHandlers()},dayMousedown:function(t){var e,i,n,r=this,o=this.view,s=o.opt("selectable"),l=null,a=new q(this.coordMap,{scroll:o.opt("dragScroll"),dragStart:function(){o.unselect()},cellOver:function(t,o){a.origDate&&(n=r.getCellDayEl(t),l=[o,a.origDate].sort(C),e=l[0],i=l[1].clone().add(r.cellDuration),s&&r.renderSelection(e,i))},cellOut:function(){l=null,r.destroySelection()},listenStop:function(t){l&&(l[0].isSame(l[1])&&o.trigger("dayClick",n[0],e,t),s&&o.reportSelection(e,i,t))}});a.mousedown(t)},renderDrag:function(){},destroyDrag:function(){},renderResize:function(){},destroyResize:function(){},renderRangeHelper:function(t,e,i){var n,r=this.view;!e&&r.opt("forceEventDuration")&&(e=r.calendar.getDefaultEventEnd(!t.hasTime(),t)),n=i?H(i.event):{},n.start=t,n.end=e,n.allDay=!(t.hasTime()||e&&e.hasTime()),n.className=(n.className||[]).concat("fc-helper"),i||(n.editable=!1),this.renderHelper(n,i)},renderHelper:function(){},destroyHelper:function(){},renderSelection:function(t,e){this.renderHighlight(t,e)},destroySelection:function(){this.destroyHighlight()},renderHighlight:function(){},destroyHighlight:function(){},headHtml:function(){return'
'+""+""+this.rowHtml("head")+""+"
"+"
"},headCellHtml:function(t,e,i){var n=this.view,r=n.calendar,o=n.opt("columnFormat");return''+R(r.formatDate(i,o))+""},bgCellHtml:function(t,e,i){var n=this.view,r=this.getDayClasses(i);return r.unshift("fc-day",n.widgetContentClass),''},getDayClasses:function(t){var e=this.view,i=e.calendar.getNow().stripTime(),n=["fc-"+Re[t.day()]];return"month"===e.name&&t.month()!=e.intervalStart.month()&&n.push("fc-other-month"),t.isSame(i,"day")?n.push("fc-today",e.highlightStateClass):i>t?n.push("fc-past"):n.push("fc-future"),n}}),t.extend(J.prototype,{mousedOverSeg:null,isDraggingSeg:!1,isResizingSeg:!1,renderEvents:function(){},getSegs:function(){},destroyEvents:function(){this.triggerSegMouseout()},renderSegs:function(e,i){var n,r=this.view,o="",s=[];for(n=0;e.length>n;n++)o+=this.renderSegHtml(e[n],i);return t(o).each(function(i,n){var o=e[i],l=r.resolveEventEl(o.event,t(n));l&&(l.data("fc-seg",o),o.el=l,s.push(o))}),s},renderSegHtml:function(){},eventsToSegs:function(e,i,n){var r=this;return t.map(e,function(t){return r.eventToSegs(t,i,n)})},eventToSegs:function(t,e,i){var n,r,o,s=t.start.clone().stripZone(),l=this.view.calendar.getEventEnd(t).stripZone();for(e&&i?(o=b(s,l,e,i),n=o?[o]:[]):n=this.rangeToSegs(s,l),r=0;n.length>r;r++)o=n[r],o.event=t,o.eventStartMS=+s,o.eventDurationMS=l-s;return n},bindSegHandlers:function(){var e=this,i=this.view;t.each({mouseenter:function(t,i){e.triggerSegMouseover(t,i)},mouseleave:function(t,i){e.triggerSegMouseout(t,i)},click:function(t,e){return i.trigger("eventClick",this,t.event,e)},mousedown:function(n,r){t(r.target).is(".fc-resizer")&&i.isEventResizable(n.event)?e.segResizeMousedown(n,r):i.isEventDraggable(n.event)&&e.segDragMousedown(n,r)}},function(i,n){e.el.on(i,".fc-event-container > *",function(i){var r=t(this).data("fc-seg");return!r||e.isDraggingSeg||e.isResizingSeg?void 0:n.call(this,r,i)})})},triggerSegMouseover:function(t,e){this.mousedOverSeg||(this.mousedOverSeg=t,this.view.trigger("eventMouseover",t.el[0],t.event,e))},triggerSegMouseout:function(t,e){e=e||{},this.mousedOverSeg&&(t=t||this.mousedOverSeg,this.mousedOverSeg=null,this.view.trigger("eventMouseout",t.el[0],t.event,e))},segDragMousedown:function(t,e){var i,n,r=this,o=this.view,s=t.el,l=t.event,a=new K(t.el,{parentEl:o.el,opacity:o.opt("dragOpacity"),revertDuration:o.opt("dragRevertDuration"),zIndex:2}),c=new q(o.coordMap,{distance:5,scroll:o.opt("dragScroll"),listenStart:function(t){a.hide(),a.start(t)},dragStart:function(e){r.triggerSegMouseout(t,e),r.isDraggingSeg=!0,o.hideEvent(l),o.trigger("eventDragStart",s[0],l,e,{})},cellOver:function(e,s){var l=t.cellDate||c.origDate,d=r.computeDraggedEventDates(t,l,s);i=d.start,n=d.end,o.renderDrag(i,n,t)?a.hide():a.show()},cellOut:function(){i=null,o.destroyDrag(),a.show()},dragStop:function(t){var e=i&&!i.isSame(l.start);a.stop(!e,function(){r.isDraggingSeg=!1,o.destroyDrag(),o.showEvent(l),o.trigger("eventDragStop",s[0],l,t,{}),e&&o.eventDrop(s[0],l,i,t)})},listenStop:function(){a.stop()}});c.mousedown(e)},computeDraggedEventDates:function(t,e,i){var n,r,o,s=this.view,l=t.event,a=l.start,c=s.calendar.getEventEnd(l);return i.hasTime()===e.hasTime()?(n=D(i,e),r=a.clone().add(n),o=null===l.end?null:c.clone().add(n)):(r=i,o=null),{start:r,end:o}},segResizeMousedown:function(t,e){function i(){r.destroyResize(),o.showEvent(l)}var n,r=this,o=this.view,s=t.el,l=t.event,a=l.start,c=o.calendar.getEventEnd(l),d=null;n=new q(this.coordMap,{distance:5,scroll:o.opt("dragScroll"),dragStart:function(e){r.triggerSegMouseout(t,e),r.isResizingSeg=!0,o.trigger("eventResizeStart",s[0],l,e,{})},cellOver:function(e,n){n.isBefore(a)&&(n=a),d=n.clone().add(r.cellDuration),d.isSame(c)?(d=null,i()):(r.renderResize(a,d,t),o.hideEvent(l))},cellOut:function(){d=null,i()},dragStop:function(t){r.isResizingSeg=!1,i(),o.trigger("eventResizeStop",s[0],l,t,{}),d&&o.eventResize(s[0],l,d,t)}}),n.mousedown(e)},getSegClasses:function(t,e,i){var n=t.event,r=["fc-event",t.isStart?"fc-start":"fc-not-start",t.isEnd?"fc-end":"fc-not-end"].concat(n.className,n.source?n.source.className:[]);return e&&r.push("fc-draggable"),i&&r.push("fc-resizable"),r},getEventSkinCss:function(t){var e=this.view,i=t.source||{},n=t.color,r=i.color,o=e.opt("eventColor"),s=t.backgroundColor||n||i.backgroundColor||r||e.opt("eventBackgroundColor")||o,l=t.borderColor||n||i.borderColor||r||e.opt("eventBorderColor")||o,a=t.textColor||i.textColor||e.opt("eventTextColor"),c=[];return s&&c.push("background-color:"+s),l&&c.push("border-color:"+l),a&&c.push("color:"+a),c.join(";")}}),ee.prototype=H(J.prototype),t.extend(ee.prototype,{numbersVisible:!1,cellDuration:e.duration({days:1}),bottomCoordPadding:0,rowEls:null,dayEls:null,helperEls:null,highlightEls:null,render:function(e){var i,n=this.view,r="";for(i=0;n.rowCnt>i;i++)r+=this.dayRowHtml(i,e);this.el.html(r),this.rowEls=this.el.find(".fc-row"),this.dayEls=this.el.find(".fc-day"),this.dayEls.each(function(e,i){var r=n.cellToDate(Math.floor(e/n.colCnt),e%n.colCnt);n.trigger("dayRender",null,r,t(i))}),J.prototype.render.call(this)},destroy:function(){this.destroySegPopover()},dayRowHtml:function(t,e){var i=this.view,n=["fc-row","fc-week",i.widgetContentClass];return e&&n.push("fc-rigid"),'
'+'
'+""+this.rowHtml("day",t)+"
"+"
"+'
'+""+(this.numbersVisible?""+this.rowHtml("number",t)+"":"")+"
"+"
"+"
"},dayCellHtml:function(t,e,i){return this.bgCellHtml(t,e,i)},buildCoords:function(e,i){var n,r,o,s=this.view.colCnt;this.dayEls.slice(0,s).each(function(e,s){n=t(s),r=n.offset().left,e&&(o[1]=r),o=[r],i[e]=o}),o[1]=r+n.outerWidth(),this.rowEls.each(function(i,s){n=t(s),r=n.offset().top,i&&(o[1]=r),o=[r],e[i]=o}),o[1]=r+n.outerHeight()+this.bottomCoordPadding},getCellDate:function(t){return this.view.cellToDate(t)},getCellDayEl:function(t){return this.dayEls.eq(t.row*this.view.colCnt+t.col)},rangeToSegs:function(t,e){return this.view.rangeToSegments(t,e)},renderDrag:function(t,e,i){var n;return this.renderHighlight(t,e||this.view.calendar.getDefaultEventEnd(!0,t)),i&&!i.el.closest(this.el).length?(this.renderRangeHelper(t,e,i),n=this.view.opt("dragOpacity"),void 0!==n&&this.helperEls.css("opacity",n),!0):void 0},destroyDrag:function(){this.destroyHighlight(),this.destroyHelper()},renderResize:function(t,e,i){this.renderHighlight(t,e),this.renderRangeHelper(t,e,i)},destroyResize:function(){this.destroyHighlight(),this.destroyHelper()},renderHelper:function(e,i){var n=[],r=this.renderEventRows([e]);this.rowEls.each(function(e,o){var s,l=t(o),a=t('
');s=i&&i.row===e?i.el.position().top:l.find(".fc-content-skeleton tbody").position().top,a.css("top",s).find("table").append(r[e].tbodyEl),l.append(a),n.push(a[0])}),this.helperEls=t(n)},destroyHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},renderHighlight:function(e,i){var n,r,o,s=this.rangeToSegs(e,i),l=[];for(n=0;s.length>n;n++)r=s[n],o=t(this.highlightSkeletonHtml(r.leftCol,r.rightCol+1)),o.appendTo(this.rowEls[r.row]),l.push(o[0]);this.highlightEls=t(l)},destroyHighlight:function(){this.highlightEls&&(this.highlightEls.remove(),this.highlightEls=null)},highlightSkeletonHtml:function(t,e){var i=this.view.colCnt,n="";return t>0&&(n+='"),m=[],v=[],y=[];for(r=0;g>r;r++){if(o=f[r],s=0,l=t(""),m.push([]),v.push([]),y.push([]),o)for(a=0;o.length>a;a++){for(c=o[a],n(c.leftCol),d=t('",l+=""+(s?"":n)+'",c.add(this.slotDuration);return l},processOptions:function(){var t=this.view,i=t.opt("slotDuration"),n=t.opt("snapDuration");i=e.duration(i),n=n?e.duration(n):i,this.slotDuration=i,this.snapDuration=n,this.cellDuration=n,this.minTime=e.duration(t.opt("minTime")),this.maxTime=e.duration(t.opt("maxTime"))},rangeToSegs:function(t,e){var i,n,r,o,s,l=this.view,a=[];for(t=t.clone().stripZone(),e=e.clone().stripZone(),n=0;l.colCnt>n;n++)r=l.cellToDate(0,n),o=r.clone().time(this.minTime),s=r.clone().time(this.maxTime),i=b(t,e,o,s),i&&(i.col=n,a.push(i));return a},resize:function(){this.computeSlatTops(),this.updateSegVerticals()},buildCoords:function(i,n){var r,o,s=this.view.colCnt,l=this.el.offset().top,a=e.duration(+this.minTime),c=null;for(this.dayEls.slice(0,s).each(function(e,i){r=t(i),o=r.offset().left,c&&(c[1]=o),c=[o],n[e]=c}),c[1]=o+r.outerWidth(),c=null;this.maxTime>a;)o=l+this.computeTimeTop(a),c&&(c[1]=o),c=[o],i.push(c),a.add(this.snapDuration);c[1]=l+this.computeTimeTop(a)},getCellDate:function(t){var e=this.view,i=e.calendar;return i.rezoneDate(e.cellToDate(0,t.col).time(this.minTime+this.snapDuration*t.row))},getCellDayEl:function(t){return this.dayEls.eq(t.col)},computeDateTop:function(t,i){return this.computeTimeTop(e.duration(t.clone().stripZone()-i.clone().stripTime()))},computeTimeTop:function(t){var e,i,n,r,o=(t-this.minTime)/this.slotDuration;return o=Math.max(0,o),o=Math.min(this.slatEls.length,o),e=Math.floor(o),i=o-e,n=this.slatTops[e],i?(r=this.slatTops[e+1],n+(r-n)*i):n},computeSlatTops:function(){var e,i=[];this.slatEls.each(function(n,r){e=t(r).position().top,i.push(e)}),i.push(e+this.slatEls.last().outerHeight()),this.slatTops=i},renderDrag:function(t,e,i){var n;return i?(this.renderRangeHelper(t,e,i),n=this.view.opt("dragOpacity"),void 0!==n&&this.helperEl.css("opacity",n),!0):(this.renderHighlight(t,e||this.view.calendar.getDefaultEventEnd(!1,t)),void 0)},destroyDrag:function(){this.destroyHelper(),this.destroyHighlight()},renderResize:function(t,e,i){this.renderRangeHelper(t,e,i)},destroyResize:function(){this.destroyHelper()},renderHelper:function(e,i){var n,r,o,s=this.renderEventTable([e]),l=s.tableEl,a=s.segs;for(n=0;a.length>n;n++)r=a[n],i&&i.col===r.col&&(o=i.el,r.el.css({left:o.css("left"),right:o.css("right"),"margin-left":o.css("margin-left"),"margin-right":o.css("margin-right")}));this.helperEl=t('
').append(l).appendTo(this.el)},destroyHelper:function(){this.helperEl&&(this.helperEl.remove(),this.helperEl=null)},renderSelection:function(t,e){this.view.opt("selectHelper")?this.renderRangeHelper(t,e):this.renderHighlight(t,e)},destroySelection:function(){this.destroyHelper(),this.destroyHighlight()},renderHighlight:function(e,i){this.highlightEl=t(this.highlightSkeletonHtml(e,i)).appendTo(this.el)},destroyHighlight:function(){this.highlightEl&&(this.highlightEl.remove(),this.highlightEl=null)},highlightSkeletonHtml:function(t,e){var i,n,r,o,s,l=this.view,a=this.rangeToSegs(t,e),c="",d=0;for(i=0;a.length>i;i++)n=a[i],n.col>d&&(c+='
",d++;return l.colCnt>d&&(c+='":void 0},numberIntroHtml:function(t){return this.weekNumbersVisible?'":void 0},dayIntroHtml:function(){return this.weekNumbersVisible?'":void 0},introHtml:function(){return this.weekNumbersVisible?'":void 0},numberCellHtml:function(t,e,i){var n;return this.dayNumbersVisible?(n=this.dayGrid.getDayClasses(i),n.unshift("fc-day-number"),'"):""):'"},dayIntroHtml:function(){return'"},slotBgIntroHtml:function(){return'"},introHtml:function(){return'"},axisStyleAttr:function(){return null!==this.axisWidth?'style="width:'+this.axisWidth+'px"':""},updateSize:function(t){t&&this.timeGrid.resize(),fe.prototype.updateSize.call(this,t)},updateWidth:function(){this.axisWidth=p(this.el.find(".fc-axis"))},setHeight:function(t,e){var i,n;null===this.bottomRuleHeight&&(this.bottomRuleHeight=this.bottomRuleEl.outerHeight()),this.bottomRuleEl.hide(),this.scrollerEl.css("overflow",""),v(this.scrollerEl),u(this.noScrollRowEls),this.dayGrid&&(this.dayGrid.destroySegPopover(),i=this.opt("eventLimit"),i&&"number"!=typeof i&&(i=Ye),i&&this.dayGrid.limitRows(i)),e||(n=this.computeScrollerHeight(t),m(this.scrollerEl,n)?(h(this.noScrollRowEls,w(this.scrollerEl)),n=this.computeScrollerHeight(t),this.scrollerEl.height(n),this.restoreScroll()):(this.scrollerEl.height(n).css("overflow","hidden"),this.bottomRuleEl.show()))},resetScroll:function(){function t(){i.scrollerEl.scrollTop(r)}var i=this,n=e.duration(this.opt("scrollTime")),r=this.timeGrid.computeTimeTop(n);r=Math.ceil(r),r&&r++,t(),setTimeout(t,0)},renderEvents:function(t){var e,i,n=[],r=[],o=[];for(i=0;t.length>i;i++)t[i].allDay?n.push(t[i]):r.push(t[i]);e=this.timeGrid.renderEvents(r),this.dayGrid&&(o=this.dayGrid.renderEvents(n)),this.updateHeight(),fe.prototype.renderEvents.call(this,t)},getSegs:function(){return this.timeGrid.getSegs().concat(this.dayGrid?this.dayGrid.getSegs():[])},destroyEvents:function(){fe.prototype.destroyEvents.call(this),this.recordScroll(),this.timeGrid.destroyEvents(),this.dayGrid&&this.dayGrid.destroyEvents()},renderDrag:function(t,e,i){return t.hasTime()?this.timeGrid.renderDrag(t,e,i):this.dayGrid?this.dayGrid.renderDrag(t,e,i):void 0},destroyDrag:function(){this.timeGrid.destroyDrag(),this.dayGrid&&this.dayGrid.destroyDrag()},renderSelection:function(t,e){t.hasTime()||e.hasTime()?this.timeGrid.renderSelection(t,e):this.dayGrid&&this.dayGrid.renderSelection(t,e)},destroySelection:function(){this.timeGrid.destroySelection(),this.dayGrid&&this.dayGrid.destroySelection()}}),xe.agendaWeek=be,be.prototype=H(Ee.prototype),t.extend(be.prototype,{name:"agendaWeek",incrementDate:function(t,e){return t.clone().stripTime().add(e,"weeks").startOf("week")},render:function(t){this.intervalStart=t.clone().stripTime().startOf("week"),this.intervalEnd=this.intervalStart.clone().add(1,"weeks"),this.start=this.skipHiddenDays(this.intervalStart),this.end=this.skipHiddenDays(this.intervalEnd,-1,!0),this.title=this.calendar.formatRange(this.start,this.end.clone().subtract(1),this.opt("titleFormat")," — "),Ee.prototype.render.call(this,this.getCellsPerWeek())}}),xe.agendaDay=Se,Se.prototype=H(Ee.prototype),t.extend(Se.prototype,{name:"agendaDay",incrementDate:function(t,e){var i=t.clone().stripTime().add(e,"days");return i=this.skipHiddenDays(i,0>e?-1:1)},render:function(t){this.start=this.intervalStart=t.clone().stripTime(),this.end=this.intervalEnd=this.start.clone().add(1,"days"),this.title=this.calendar.formatDate(this.start,this.opt("titleFormat")),Ee.prototype.render.call(this,1)}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/fullcalendar.print.css b/dist/cdnjs/2.1.1/fullcalendar.print.css new file mode 100644 index 0000000..dc073b7 --- /dev/null +++ b/dist/cdnjs/2.1.1/fullcalendar.print.css @@ -0,0 +1,201 @@ +/*! + * FullCalendar v2.1.1 Print Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + +/* + * Include this stylesheet on your page to get a more printer-friendly calendar. + * When including this stylesheet, use the media='print' attribute of the tag. + * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css. + */ + +.fc { + max-width: 100% !important; +} + + +/* Global Event Restyling +--------------------------------------------------------------------------------------------------*/ + +.fc-event { + background: #fff !important; + color: #000 !important; + page-break-inside: avoid; +} + +.fc-event .fc-resizer { + display: none; +} + + +/* Table & Day-Row Restyling +--------------------------------------------------------------------------------------------------*/ + +th, +td, +hr, +thead, +tbody, +.fc-row { + border-color: #ccc !important; + background: #fff !important; +} + +/* kill the overlaid, absolutely-positioned common components */ +.fc-bg, +.fc-highlight-skeleton, +.fc-helper-skeleton { + display: none; +} + +/* don't force a min-height on rows (for DayGrid) */ +.fc tbody .fc-row { + height: auto !important; /* undo height that JS set in distributeHeight */ + min-height: 0 !important; /* undo the min-height from each view's specific stylesheet */ +} + +.fc tbody .fc-row .fc-content-skeleton { + position: static; /* undo .fc-rigid */ + padding-bottom: 0 !important; /* use a more border-friendly method for this... */ +} + +.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td { /* only works in newer browsers */ + padding-bottom: 1em; /* ...gives space within the skeleton. also ensures min height in a way */ +} + +.fc tbody .fc-row .fc-content-skeleton table { + /* provides a min-height for the row, but only effective for IE, which exaggerates this value, + making it look more like 3em. for other browers, it will already be this tall */ + height: 1em; +} + + +/* Undo month-view event limiting. Display all events and hide the "more" links +--------------------------------------------------------------------------------------------------*/ + +.fc-more-cell, +.fc-more { + display: none !important; +} + +.fc tr.fc-limited { + display: table-row !important; +} + +.fc td.fc-limited { + display: table-cell !important; +} + +.fc-popover { + display: none; /* never display the "more.." popover in print mode */ +} + + +/* TimeGrid Restyling +--------------------------------------------------------------------------------------------------*/ + +/* undo the min-height 100% trick used to fill the container's height */ +.fc-time-grid { + min-height: 0 !important; +} + +/* don't display the side axis at all ("all-day" and time cells) */ +.fc-agenda-view .fc-axis { + display: none; +} + +/* don't display the horizontal lines */ +.fc-slats, +.fc-time-grid hr { /* this hr is used when height is underused and needs to be filled */ + display: none !important; /* important overrides inline declaration */ +} + +/* let the container that holds the events be naturally positioned and create real height */ +.fc-time-grid .fc-content-skeleton { + position: static; +} + +/* in case there are no events, we still want some height */ +.fc-time-grid .fc-content-skeleton table { + height: 4em; +} + +/* kill the horizontal spacing made by the event container. event margins will be done below */ +.fc-time-grid .fc-event-container { + margin: 0 !important; +} + + +/* TimeGrid *Event* Restyling +--------------------------------------------------------------------------------------------------*/ + +/* naturally position events, vertically stacking them */ +.fc-time-grid .fc-event { + position: static !important; + margin: 3px 2px !important; +} + +/* for events that continue to a future day, give the bottom border back */ +.fc-time-grid .fc-event.fc-not-end { + border-bottom-width: 1px !important; +} + +/* indicate the event continues via "..." text */ +.fc-time-grid .fc-event.fc-not-end:after { + content: "..."; +} + +/* for events that are continuations from previous days, give the top border back */ +.fc-time-grid .fc-event.fc-not-start { + border-top-width: 1px !important; +} + +/* indicate the event is a continuation via "..." text */ +.fc-time-grid .fc-event.fc-not-start:before { + content: "..."; +} + +/* time */ + +/* undo a previous declaration and let the time text span to a second line */ +.fc-time-grid .fc-event .fc-time { + white-space: normal !important; +} + +/* hide the the time that is normally displayed... */ +.fc-time-grid .fc-event .fc-time span { + display: none; +} + +/* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */ +.fc-time-grid .fc-event .fc-time:after { + content: attr(data-full); +} + + +/* Vertical Scroller & Containers +--------------------------------------------------------------------------------------------------*/ + +/* kill the scrollbars and allow natural height */ +.fc-scroller, +.fc-day-grid-container, /* these divs might be assigned height, which we need to cleared */ +.fc-time-grid-container { /* */ + overflow: visible !important; + height: auto !important; +} + +/* kill the horizontal border/padding used to compensate for scrollbars */ +.fc-row { + border: 0 !important; + margin: 0 !important; +} + + +/* Button Controls +--------------------------------------------------------------------------------------------------*/ + +.fc-button-group, +.fc button { + display: none; /* don't display any button-related controls */ +} diff --git a/dist/cdnjs/2.1.1/gcal.js b/dist/cdnjs/2.1.1/gcal.js new file mode 100644 index 0000000..754fb72 --- /dev/null +++ b/dist/cdnjs/2.1.1/gcal.js @@ -0,0 +1,100 @@ +/*! + * FullCalendar v2.1.1 Google Calendar Plugin + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + +(function(factory) { + if (typeof define === 'function' && define.amd) { + define([ 'jquery' ], factory); + } + else { + factory(jQuery); + } +})(function($) { + + +var fc = $.fullCalendar; +var applyAll = fc.applyAll; + + +fc.sourceNormalizers.push(function(sourceOptions) { + if (sourceOptions.dataType == 'gcal' || + sourceOptions.dataType === undefined && + (sourceOptions.url || '').match(/^(http|https):\/\/www.google.com\/calendar\/feeds\//)) { + sourceOptions.dataType = 'gcal'; + if (sourceOptions.editable === undefined) { + sourceOptions.editable = false; + } + } +}); + + +fc.sourceFetchers.push(function(sourceOptions, start, end, timezone) { + if (sourceOptions.dataType == 'gcal') { + return transformOptions(sourceOptions, start, end, timezone); + } +}); + + +function transformOptions(sourceOptions, start, end, timezone) { + + var success = sourceOptions.success; + var data = $.extend({}, sourceOptions.data || {}, { + singleevents: true, + 'max-results': 9999 + }); + + return $.extend({}, sourceOptions, { + url: sourceOptions.url.replace(/\/basic$/, '/full') + '?alt=json-in-script&callback=?', + dataType: 'jsonp', + data: data, + timezoneParam: 'ctz', + startParam: 'start-min', + endParam: 'start-max', + success: function(data) { + var events = []; + if (data.feed.entry) { + $.each(data.feed.entry, function(i, entry) { + + var url; + $.each(entry.link, function(i, link) { + if (link.type == 'text/html') { + url = link.href; + if (timezone && timezone != 'local') { + url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + encodeURIComponent(timezone); + } + } + }); + + events.push({ + id: entry.gCal$uid.value, + title: entry.title.$t, + start: entry.gd$when[0].startTime, + end: entry.gd$when[0].endTime, + url: url, + location: entry.gd$where[0].valueString, + description: entry.content.$t + }); + + }); + } + var args = [events].concat(Array.prototype.slice.call(arguments, 1)); + var res = applyAll(success, this, args); + if ($.isArray(res)) { + return res; + } + return events; + } + }); + +} + + +// legacy +fc.gcalFeed = function(url, sourceOptions) { + return $.extend({}, sourceOptions, { url: url, dataType: 'gcal' }); +}; + + +}); diff --git a/dist/cdnjs/2.1.1/lang-all.js b/dist/cdnjs/2.1.1/lang-all.js new file mode 100644 index 0000000..59b2f0f --- /dev/null +++ b/dist/cdnjs/2.1.1/lang-all.js @@ -0,0 +1,3 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(function(){(t.defineLocale||t.lang).call(t,"ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("ar-ma","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ar-ma",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})})(),function(){var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};(t.defineLocale||t.lang).call(t,"ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(e){return 12>e?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return n[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("ar-sa","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ar-sa",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}(),function(){var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},r=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&10>=e%100?3:e%100>=11?4:5},i={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},s=function(e){return function(t,a){var n=r(t),s=i[e][r(t)];return 2===n&&(s=s[a?0:1]),s.replace(/%d/i,t)}},o=["كانون الثاني يناير","شباط فبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوفمبر","كانون الأول ديسمبر"];(t.defineLocale||t.lang).call(t,"ar",{months:o,monthsShort:o,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(e){return 12>e?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:s("s"),m:s("m"),mm:s("m"),h:s("h"),hh:s("h"),d:s("d"),dd:s("d"),M:s("M"),MM:s("M"),y:s("y"),yy:s("y")},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return n[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("ar","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ar",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}(),function(){(t.defineLocale||t.lang).call(t,"bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinal:function(e){var t=e%10,a=e%100;return 0===e?e+"-ев":0===a?e+"-ен":a>10&&20>a?e+"-ти":1===t?e+"-ви":2===t?e+"-ри":7===t||8===t?e+"-ми":e+"-ти"},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("bg","bg",{closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("bg",{defaultButtonText:{month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("ca","ca",{closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ca",{defaultButtonText:{month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},allDayText:"Tot el dia",eventLimitText:"més"})}(),function(){function a(e){return e>1&&5>e&&1!==~~(e/10)}function n(e,t,n,r){var i=e+" ";switch(n){case"s":return t||r?"pár sekund":"pár sekundami";case"m":return t?"minuta":r?"minutu":"minutou";case"mm":return t||r?i+(a(e)?"minuty":"minut"):i+"minutami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(a(e)?"hodiny":"hodin"):i+"hodinami";case"d":return t||r?"den":"dnem";case"dd":return t||r?i+(a(e)?"dny":"dní"):i+"dny";case"M":return t||r?"měsíc":"měsícem";case"MM":return t||r?i+(a(e)?"měsíce":"měsíců"):i+"měsíci";case"y":return t||r?"rok":"rokem";case"yy":return t||r?i+(a(e)?"roky":"let"):i+"lety"}}var r="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),i="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");(t.defineLocale||t.lang).call(t,"cs",{months:r,monthsShort:i,monthsParse:function(e,t){var a,n=[];for(a=0;12>a;a++)n[a]=RegExp("^"+e[a]+"$|^"+t[a]+"$","i");return n}(r,i),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("cs","cs",{closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("cs",{defaultButtonText:{month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("da","da",{closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("da",{defaultButtonText:{month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"flere"})}(),function(){function a(e,t,a){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?n[a][0]:n[a][1]}(t.defineLocale||t.lang).call(t,"de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("de-at","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("de-at",{defaultButtonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e}})}(),function(){function a(e,t,a){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?n[a][0]:n[a][1]}(t.defineLocale||t.lang).call(t,"de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("de","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("de",{defaultButtonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(e,t){return/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(e,t,a){return e>11?a?"μμ":"ΜΜ":a?"πμ":"ΠΜ"},isPM:function(e){return"μ"===(e+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,t){var a=this._calendarEl[e],n=t&&t.hours();return"function"==typeof a&&(a=a.apply(t)),a.replace("{}",1===n%12?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinal:function(e){return e+"η"},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("el","el",{closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("el",{defaultButtonText:{month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},allDayText:"Ολοήμερο",eventLimitText:"περισσότερα"})}(),function(){(t.defineLocale||t.lang).call(t,"en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("en-au")}(),function(){(t.defineLocale||t.lang).call(t,"en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a}}),e.fullCalendar.lang("en-ca")}(),function(){(t.defineLocale||t.lang).call(t,"en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("en-gb",{columnFormat:{week:"ddd D/M"}})}(),function(){var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");(t.defineLocale||t.lang).call(t,"es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?n[e.month()]:a[e.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("es","es",{closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("es",{defaultButtonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo
el día",eventLimitText:"más"})}(),function(){var a={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},n={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};(t.defineLocale||t.lang).call(t,"fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiem:function(e){return 12>e?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return n[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},ordinal:"%dم",week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("fa","fa",{closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دی","بهمن","اسفند"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fa",{defaultButtonText:{month:"ماه",week:"هفته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e}})}(),function(){function a(e,t,a,r){var i="";switch(a){case"s":return r?"muutaman sekunnin":"muutama sekunti";case"m":return r?"minuutin":"minuutti";case"mm":i=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":i=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":i=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":i=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":i=r?"vuoden":"vuotta"}return i=n(e,r)+" "+i}function n(e,t){return 10>e?t?i[e]:r[e]:e}var r="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),i=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",r[7],r[8],r[9]];(t.defineLocale||t.lang).call(t,"fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("fi","fi",{closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fi",{defaultButtonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää"}) +}(),function(){(t.defineLocale||t.lang).call(t,"fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return e+(1===e?"er":"")}}),e.fullCalendar.datepickerLang("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fr-ca",{defaultButtonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
journée",eventLimitText:"en plus"})}(),function(){(t.defineLocale||t.lang).call(t,"fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return e+(1===e?"er":"")},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fr",{defaultButtonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
journée",eventLimitText:"en plus"})}(),function(){var a={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};(t.defineLocale||t.lang).call(t,"hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]})},meridiem:function(e){return 4>e?"रात":10>e?"सुबह":17>e?"दोपहर":20>e?"शाम":"रात"},week:{dow:0,doy:6}}),e.fullCalendar.datepickerLang("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("hi",{defaultButtonText:{month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e}})}(),function(){function a(e,t,a){var n=e+" ";switch(a){case"m":return t?"jedna minuta":"jedne minute";case"mm":return n+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return t?"jedan sat":"jednog sata";case"hh":return n+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return n+=1===e?"dan":"dana";case"MM":return n+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return n+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}(t.defineLocale||t.lang).call(t,"hr",{months:"sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:a,mm:a,h:a,hh:a,d:"dan",dd:a,M:"mjesec",MM:a,y:"godinu",yy:a},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("hr","hr",{closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("hr",{defaultButtonText:{month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e}})}(),function(){function a(e,t,a,n){var r=e;switch(a){case"s":return n||t?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(n||t?" perc":" perce");case"mm":return r+(n||t?" perc":" perce");case"h":return"egy"+(n||t?" óra":" órája");case"hh":return r+(n||t?" óra":" órája");case"d":return"egy"+(n||t?" nap":" napja");case"dd":return r+(n||t?" nap":" napja");case"M":return"egy"+(n||t?" hónap":" hónapja");case"MM":return r+(n||t?" hónap":" hónapja");case"y":return"egy"+(n||t?" év":" éve");case"yy":return r+(n||t?" év":" éve")}return""}function n(e){return(e?"":"[múlt] ")+"["+r[this.day()]+"] LT[-kor]"}var r="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");(t.defineLocale||t.lang).call(t,"hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiem:function(e,t,a){return 12>e?a===!0?"de":"DE":a===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return n.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return n.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.lang("hu",{defaultButtonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további"})}(),function(){(t.defineLocale||t.lang).call(t,"id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(e){return 11>e?"pagi":15>e?"siang":19>e?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("id","id",{closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("id",{defaultButtonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari
penuh",eventLimitText:"lebih"})}(),function(){function a(e){return 11===e%100?!0:1===e%10?!1:!0}function n(e,t,n,r){var i=e+" ";switch(n){case"s":return t||r?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return t?"mínúta":"mínútu";case"mm":return a(e)?i+(t||r?"mínútur":"mínútum"):t?i+"mínúta":i+"mínútu";case"hh":return a(e)?i+(t||r?"klukkustundir":"klukkustundum"):i+"klukkustund";case"d":return t?"dagur":r?"dag":"degi";case"dd":return a(e)?t?i+"dagar":i+(r?"daga":"dögum"):t?i+"dagur":i+(r?"dag":"degi");case"M":return t?"mánuður":r?"mánuð":"mánuði";case"MM":return a(e)?t?i+"mánuðir":i+(r?"mánuði":"mánuðum"):t?i+"mánuður":i+(r?"mánuð":"mánuði");case"y":return t||r?"ár":"ári";case"yy":return a(e)?i+(t||r?"ár":"árum"):i+(t||r?"ár":"ári")}}(t.defineLocale||t.lang).call(t,"is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("is","is",{closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("is",{defaultButtonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan
daginn",eventLimitText:"meira"})}(),function(){(t.defineLocale||t.lang).call(t,"it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:"[lo scorso] dddd [alle] LT",sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("it","it",{closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("it",{defaultButtonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il
giorno",eventLimitText:function(e){return"+altri "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日LT",LLLL:"YYYY年M月D日LT dddd"},meridiem:function(e){return 12>e?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}}),e.fullCalendar.datepickerLang("ja","ja",{closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),e.fullCalendar.lang("ja",{defaultButtonText:{month:"月",week:"週",day:"日",list:"予定リスト"},allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"}})}(),function(){(t.defineLocale||t.lang).call(t,"ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 m분",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 LT",LLLL:"YYYY년 MMMM D일 dddd LT"},meridiem:function(e){return 12>e?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇초",ss:"%d초",m:"일분",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한달",MM:"%d달",y:"일년",yy:"%d년"},ordinal:"%d일",meridiemParse:/(오전|오후)/,isPM:function(e){return"오후"===e}}),e.fullCalendar.datepickerLang("ko","ko",{closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"}),e.fullCalendar.lang("ko",{defaultButtonText:{month:"월",week:"주",day:"일",list:"일정목록"},allDayText:"종일",eventLimitText:"개"})}(),function(){function a(e,t,a,n){return t?"kelios sekundės":n?"kelių sekundžių":"kelias sekundes"}function n(e,t,a,n){return t?i(a)[0]:n?i(a)[1]:i(a)[2]}function r(e){return 0===e%10||e>10&&20>e}function i(e){return d[e].split("_")}function s(e,t,a,s){var o=e+" ";return 1===e?o+n(e,t,a[0],s):t?o+(r(e)?i(a)[1]:i(a)[0]):s?o+i(a)[1]:o+(r(e)?i(a)[1]:i(a)[2])}function o(e,t){var a=-1===t.indexOf("dddd HH:mm"),n=l[e.day()];return a?n:n.substring(0,n.length-2)+"į"}var d={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"},l="sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_");(t.defineLocale||t.lang).call(t,"lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:o,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:a,m:n,mm:s,h:n,hh:s,d:n,dd:s,M:n,MM:s,y:n,yy:s},ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("lt","lt",{closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.lang("lt",{defaultButtonText:{month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},allDayText:"Visą dieną",eventLimitText:"daugiau"})}(),function(){function a(e,t,a){var n=e.split("_");return a?1===t%10&&11!==t?n[2]:n[3]:1===t%10&&11!==t?n[0]:n[1]}function n(e,t,n){return e+" "+a(r[n],e,t)}var r={mm:"minūti_minūtes_minūte_minūtes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mēnesi_mēnešus_mēnesis_mēneši",yy:"gadu_gadus_gads_gadi"};(t.defineLocale||t.lang).call(t,"lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vēlāk",past:"%s agrāk",s:"dažas sekundes",m:"minūti",mm:n,h:"stundu",hh:n,d:"dienu",dd:n,M:"mēnesi",MM:n,y:"gadu",yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("lv","lv",{closeText:"Aizvērt",prevText:"Iepr.",nextText:"Nāk.",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("lv",{defaultButtonText:{month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e}})}(),function(){var a="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");(t.defineLocale||t.lang).call(t,"nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?n[e.month()]:a[e.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("nl","nl",{closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("nl",{defaultButtonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra"})}(),function(){function a(e){return 5>e%10&&e%10>1&&1!==~~(e/10)%10}function n(e,t,n){var r=e+" ";switch(n){case"m":return t?"minuta":"minutę";case"mm":return r+(a(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return r+(a(e)?"godziny":"godzin");case"MM":return r+(a(e)?"miesiące":"miesięcy");case"yy":return r+(a(e)?"lata":"lat")}}var r="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),i="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");(t.defineLocale||t.lang).call(t,"pl",{months:function(e,t){return/D MMMM/.test(t)?i[e.month()]:r[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:n,mm:n,h:n,hh:n,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:n,y:"rok",yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pl","pl",{closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pl",{defaultButtonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej"})}(),function(){(t.defineLocale||t.lang).call(t,"pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº"}),e.fullCalendar.datepickerLang("pt-br","pt-BR",{closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pt-br",{defaultButtonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e}})}(),function(){(t.defineLocale||t.lang).call(t,"pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pt",{defaultButtonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais"})}(),function(){function a(e,t,a){var n={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},r=" ";return(e%100>=20||e>=100&&0===e%100)&&(r=" de "),e+r+n[a]}(t.defineLocale||t.lang).call(t,"ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:a,h:"o oră",hh:a,d:"o zi",dd:a,M:"o lună",MM:a,y:"un an",yy:a},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("ro","ro",{closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ro",{defaultButtonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e +}})}(),function(){function a(e,t){var a=e.split("_");return 1===t%10&&11!==t%100?a[0]:t%10>=2&&4>=t%10&&(10>t%100||t%100>=20)?a[1]:a[2]}function n(e,t,n){var r={mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===n?t?"минута":"минуту":e+" "+a(r[n],+e)}function r(e,t){var a={nominative:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),accusative:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_")},n=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return a[n][e.month()]}function i(e,t){var a={nominative:"янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),accusative:"янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек".split("_")},n=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return a[n][e.month()]}function s(e,t){var a={nominative:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),accusative:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_")},n=/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/.test(t)?"accusative":"nominative";return a[n][e.day()]}(t.defineLocale||t.lang).call(t,"ru",{months:r,monthsShort:i,weekdays:s,weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|я]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT"},lastWeek:function(){switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:n,mm:n,h:"час",hh:n,d:"день",dd:n,M:"месяц",MM:n,y:"год",yy:n},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(e){return/^(дня|вечера)$/.test(e)},meridiem:function(e){return 4>e?"ночи":12>e?"утра":17>e?"дня":"вечера"},ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-я";default:return e}},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("ru","ru",{closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ru",{defaultButtonText:{month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e}})}(),function(){function a(e){return e>1&&5>e}function n(e,t,n,r){var i=e+" ";switch(n){case"s":return t||r?"pár sekúnd":"pár sekundami";case"m":return t?"minúta":r?"minútu":"minútou";case"mm":return t||r?i+(a(e)?"minúty":"minút"):i+"minútami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(a(e)?"hodiny":"hodín"):i+"hodinami";case"d":return t||r?"deň":"dňom";case"dd":return t||r?i+(a(e)?"dni":"dní"):i+"dňami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?i+(a(e)?"mesiace":"mesiacov"):i+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?i+(a(e)?"roky":"rokov"):i+"rokmi"}}var r="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),i="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");(t.defineLocale||t.lang).call(t,"sk",{months:r,monthsShort:i,monthsParse:function(e,t){var a,n=[];for(a=0;12>a;a++)n[a]=RegExp("^"+e[a]+"$|^"+t[a]+"$","i");return n}(r,i),weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("sk","sk",{closeText:"Zavrieť",prevText:"<Predchádzajúci",nextText:"Nasledujúci>",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sk",{defaultButtonText:{month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e}})}(),function(){function a(e,t,a){var n=e+" ";switch(a){case"m":return t?"ena minuta":"eno minuto";case"mm":return n+=1===e?"minuta":2===e?"minuti":3===e||4===e?"minute":"minut";case"h":return t?"ena ura":"eno uro";case"hh":return n+=1===e?"ura":2===e?"uri":3===e||4===e?"ure":"ur";case"dd":return n+=1===e?"dan":"dni";case"MM":return n+=1===e?"mesec":2===e?"meseca":3===e||4===e?"mesece":"mesecev";case"yy":return n+=1===e?"leto":2===e?"leti":3===e||4===e?"leta":"let"}}(t.defineLocale||t.lang).call(t,"sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejšnja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"%s nazaj",s:"nekaj sekund",m:a,mm:a,h:a,hh:a,d:"en dan",dd:a,M:"en mesec",MM:a,y:"eno leto",yy:a},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sl","sl",{closeText:"Zapri",prevText:"<Prejšnji",nextText:"Naslednji>",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sl",{defaultButtonText:{month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},allDayText:"Ves dan",eventLimitText:"več"})}(),function(){var a={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&4>=e?t[1]:t[2]},translate:function(e,t,n){var r=a.words[n];return 1===n.length?t?r[0]:r[1]:e+" "+a.correctGrammaticalCase(e,r)}};(t.defineLocale||t.lang).call(t,"sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","сеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","среда","четвртак","петак","субота"],weekdaysShort:["нед.","пон.","уто.","сре.","чет.","пет.","суб."],weekdaysMin:["не","по","ут","ср","че","пе","су"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var e=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"дан",dd:a.translate,M:"месец",MM:a.translate,y:"годину",yy:a.translate},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sr-cyrl","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sr-cyrl",{defaultButtonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e}})}(),function(){var a={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&4>=e?t[1]:t[2]},translate:function(e,t,n){var r=a.words[n];return 1===n.length?t?r[0]:r[1]:e+" "+a.correctGrammaticalCase(e,r)}};(t.defineLocale||t.lang).call(t,"sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","čet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","če","pe","su"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var e=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"dan",dd:a.translate,M:"mesec",MM:a.translate,y:"godinu",yy:a.translate},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sr","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sr",{defaultButtonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"e":1===t?"a":2===t?"a":3===t?"e":"e";return e+a},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("sv","sv",{closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sv",{defaultButtonText:{month:"Månad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till"})}(),function(){(t.defineLocale||t.lang).call(t,"th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิกา m นาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiem:function(e){return 12>e?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}}),e.fullCalendar.datepickerLang("th","th",{closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("th",{defaultButtonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม"})}(),function(){var a={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};(t.defineLocale||t.lang).call(t,"tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(e){if(0===e)return e+"'ıncı";var t=e%10,n=e%100-t,r=e>=100?100:null;return e+(a[t]||a[n]||a[r])},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("tr","tr",{closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("tr",{defaultButtonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla"})}(),function(){function a(e,t){var a=e.split("_");return 1===t%10&&11!==t%100?a[0]:t%10>=2&&4>=t%10&&(10>t%100||t%100>=20)?a[1]:a[2]}function n(e,t,n){var r={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===n?t?"хвилина":"хвилину":"h"===n?t?"година":"годину":e+" "+a(r[n],+e)}function r(e,t){var a={nominative:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_"),accusative:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_")},n=/D[oD]? *MMMM?/.test(t)?"accusative":"nominative";return a[n][e.month()]}function i(e,t){var a={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},n=/(\[[ВвУу]\]) ?dddd/.test(t)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(t)?"genitive":"nominative";return a[n][e.day()]}function s(e){return function(){return e+"о"+(11===this.hours()?"б":"")+"] LT"}}(t.defineLocale||t.lang).call(t,"uk",{months:r,monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:i,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., LT",LLLL:"dddd, D MMMM YYYY р., LT"},calendar:{sameDay:s("[Сьогодні "),nextDay:s("[Завтра "),lastDay:s("[Вчора "),nextWeek:s("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return s("[Минулої] dddd [").call(this);case 1:case 2:case 4:return s("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:n,mm:n,h:"годину",hh:n,d:"день",dd:n,M:"місяць",MM:n,y:"рік",yy:n},meridiem:function(e){return 4>e?"ночі":12>e?"ранку":17>e?"дня":"вечора"},ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e+"-й";case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("uk","uk",{closeText:"Закрити",prevText:"<",nextText:">",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("uk",{defaultButtonText:{month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."}})}(),function(){(t.defineLocale||t.lang).call(t,"vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},ordinal:function(e){return e},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("vi","vi",{closeText:"Đóng",prevText:"<Trước",nextText:"Tiếp>",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("vi",{defaultButtonText:{month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日LT",LLLL:"YYYY年MMMD日ddddLT",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日LT",llll:"YYYY年MMMD日ddddLT"},meridiem:function(e,t){var a=100*e+t;return 600>a?"凌晨":900>a?"早上":1130>a?"上午":1230>a?"中午":1800>a?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,a;return e=t().startOf("week"),a=this.unix()-e.unix()>=604800?"[下]":"[本]",0===this.minutes()?a+"dddAh点整":a+"dddAh点mm"},lastWeek:function(){var e,a;return e=t().startOf("week"),a=this.unix()a?"早上":1130>a?"上午":1230>a?"中午":1800>a?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"一分鐘",mm:"%d分鐘",h:"一小時",hh:"%d小時",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%d年"}}),e.fullCalendar.datepickerLang("zh-tw","zh-TW",{closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),e.fullCalendar.lang("zh-tw",{defaultButtonText:{month:"月",week:"週",day:"天",list:"待辦事項"},allDayText:"全天",eventLimitText:"更多"})}(),(t.locale||t.lang).call(t,"en"),e.fullCalendar.lang("en"),e.datepicker&&e.datepicker.setDefaults(e.datepicker.regional[""])}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/ar-ma.js b/dist/cdnjs/2.1.1/lang/ar-ma.js new file mode 100644 index 0000000..952b0d1 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/ar-ma.js @@ -0,0 +1 @@ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){(e.defineLocale||e.lang).call(e,"ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}}),t.fullCalendar.datepickerLang("ar-ma","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("ar-ma",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/ar-sa.js b/dist/cdnjs/2.1.1/lang/ar-sa.js new file mode 100644 index 0000000..2ca28b3 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/ar-sa.js @@ -0,0 +1 @@ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){var n={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},i={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};(e.defineLocale||e.lang).call(e,"ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(t){return 12>t?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return i[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return n[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}}),t.fullCalendar.datepickerLang("ar-sa","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("ar-sa",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/ar.js b/dist/cdnjs/2.1.1/lang/ar.js new file mode 100644 index 0000000..b3b3ef5 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/ar.js @@ -0,0 +1 @@ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){var n={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},i={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},r=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&10>=t%100?3:t%100>=11?4:5},o={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},s=function(t){return function(e,n){var i=r(e),s=o[t][r(e)];return 2===i&&(s=s[n?0:1]),s.replace(/%d/i,e)}},l=["كانون الثاني يناير","شباط فبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوفمبر","كانون الأول ديسمبر"];(e.defineLocale||e.lang).call(e,"ar",{months:l,monthsShort:l,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(t){return 12>t?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:s("s"),m:s("m"),mm:s("m"),h:s("h"),hh:s("h"),d:s("d"),dd:s("d"),M:s("M"),MM:s("M"),y:s("y"),yy:s("y")},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return i[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return n[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}}),t.fullCalendar.datepickerLang("ar","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("ar",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/bg.js b/dist/cdnjs/2.1.1/lang/bg.js new file mode 100644 index 0000000..e11e2ad --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/bg.js @@ -0,0 +1 @@ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){(e.defineLocale||e.lang).call(e,"bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-ев":0===n?t+"-ен":n>10&&20>n?t+"-ти":1===e?t+"-ви":2===e?t+"-ри":7===e||8===e?t+"-ми":t+"-ти"},week:{dow:1,doy:7}}),t.fullCalendar.datepickerLang("bg","bg",{closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("bg",{defaultButtonText:{month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(t){return"+още "+t}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/ca.js b/dist/cdnjs/2.1.1/lang/ca.js new file mode 100644 index 0000000..dc67a8a --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/ca.js @@ -0,0 +1 @@ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){(e.defineLocale||e.lang).call(e,"ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:"%dº",week:{dow:1,doy:4}}),t.fullCalendar.datepickerLang("ca","ca",{closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("ca",{defaultButtonText:{month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},allDayText:"Tot el dia",eventLimitText:"més"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/cs.js b/dist/cdnjs/2.1.1/lang/cs.js new file mode 100644 index 0000000..3ebc443 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/cs.js @@ -0,0 +1 @@ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function n(t){return t>1&&5>t&&1!==~~(t/10)}function i(t,e,i,r){var s=t+" ";switch(i){case"s":return e||r?"pár sekund":"pár sekundami";case"m":return e?"minuta":r?"minutu":"minutou";case"mm":return e||r?s+(n(t)?"minuty":"minut"):s+"minutami";case"h":return e?"hodina":r?"hodinu":"hodinou";case"hh":return e||r?s+(n(t)?"hodiny":"hodin"):s+"hodinami";case"d":return e||r?"den":"dnem";case"dd":return e||r?s+(n(t)?"dny":"dní"):s+"dny";case"M":return e||r?"měsíc":"měsícem";case"MM":return e||r?s+(n(t)?"měsíce":"měsíců"):s+"měsíci";case"y":return e||r?"rok":"rokem";case"yy":return e||r?s+(n(t)?"roky":"let"):s+"lety"}}var r="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),s="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");(e.defineLocale||e.lang).call(e,"cs",{months:r,monthsShort:s,monthsParse:function(t,e){var n,i=[];for(n=0;12>n;n++)i[n]=RegExp("^"+t[n]+"$|^"+e[n]+"$","i");return i}(r,s),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},ordinal:"%d.",week:{dow:1,doy:4}}),t.fullCalendar.datepickerLang("cs","cs",{closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("cs",{defaultButtonText:{month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(t){return"+další: "+t}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/da.js b/dist/cdnjs/2.1.1/lang/da.js new file mode 100644 index 0000000..637b54e --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/da.js @@ -0,0 +1 @@ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){(e.defineLocale||e.lang).call(e,"da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}}),t.fullCalendar.datepickerLang("da","da",{closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("da",{defaultButtonText:{month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"flere"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/de-at.js b/dist/cdnjs/2.1.1/lang/de-at.js new file mode 100644 index 0000000..dbd8562 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/de-at.js @@ -0,0 +1 @@ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function n(t,e,n){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}(e.defineLocale||e.lang).call(e,"de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:n,mm:"%d Minuten",h:n,hh:"%d Stunden",d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),t.fullCalendar.datepickerLang("de-at","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("de-at",{defaultButtonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(t){return"+ weitere "+t}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/de.js b/dist/cdnjs/2.1.1/lang/de.js new file mode 100644 index 0000000..a79c3ea --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/de.js @@ -0,0 +1 @@ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function n(t,e,n){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}(e.defineLocale||e.lang).call(e,"de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:n,mm:"%d Minuten",h:n,hh:"%d Stunden",d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),t.fullCalendar.datepickerLang("de","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("de",{defaultButtonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(t){return"+ weitere "+t}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/el.js b/dist/cdnjs/2.1.1/lang/el.js new file mode 100644 index 0000000..6985ca3 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/el.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(e,t){return/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(e,t,n){return e>11?n?"μμ":"ΜΜ":n?"πμ":"ΠΜ"},isPM:function(e){return"μ"===(e+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,t){var n=this._calendarEl[e],i=t&&t.hours();return"function"==typeof n&&(n=n.apply(t)),n.replace("{}",1===i%12?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinal:function(e){return e+"η"},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("el","el",{closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("el",{defaultButtonText:{month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},allDayText:"Ολοήμερο",eventLimitText:"περισσότερα"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/en-au.js b/dist/cdnjs/2.1.1/lang/en-au.js new file mode 100644 index 0000000..a22e013 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/en-au.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("en-au")}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/en-ca.js b/dist/cdnjs/2.1.1/lang/en-ca.js new file mode 100644 index 0000000..5b8a13a --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/en-ca.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n}}),e.fullCalendar.lang("en-ca")}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/en-gb.js b/dist/cdnjs/2.1.1/lang/en-gb.js new file mode 100644 index 0000000..54d2b95 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/en-gb.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("en-gb",{columnFormat:{week:"ddd D/M"}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/es.js b/dist/cdnjs/2.1.1/lang/es.js new file mode 100644 index 0000000..e9b049f --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/es.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),i="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");(t.defineLocale||t.lang).call(t,"es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?i[e.month()]:n[e.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("es","es",{closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("es",{defaultButtonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo
el día",eventLimitText:"más"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/fa.js b/dist/cdnjs/2.1.1/lang/fa.js new file mode 100644 index 0000000..4a73051 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/fa.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},i={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};(t.defineLocale||t.lang).call(t,"fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiem:function(e){return 12>e?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return i[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return n[e]}).replace(/,/g,"،")},ordinal:"%dم",week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("fa","fa",{closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دی","بهمن","اسفند"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fa",{defaultButtonText:{month:"ماه",week:"هفته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/fi.js b/dist/cdnjs/2.1.1/lang/fi.js new file mode 100644 index 0000000..c73045c --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/fi.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t,n,r){var o="";switch(n){case"s":return r?"muutaman sekunnin":"muutama sekunti";case"m":return r?"minuutin":"minuutti";case"mm":o=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":o=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":o=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":o=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":o=r?"vuoden":"vuotta"}return o=i(e,r)+" "+o}function i(e,t){return 10>e?t?o[e]:r[e]:e}var r="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),o=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",r[7],r[8],r[9]];(t.defineLocale||t.lang).call(t,"fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("fi","fi",{closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fi",{defaultButtonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/fr-ca.js b/dist/cdnjs/2.1.1/lang/fr-ca.js new file mode 100644 index 0000000..f5b4066 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/fr-ca.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return e+(1===e?"er":"")}}),e.fullCalendar.datepickerLang("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fr-ca",{defaultButtonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
journée",eventLimitText:"en plus"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/fr.js b/dist/cdnjs/2.1.1/lang/fr.js new file mode 100644 index 0000000..9c024c0 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/fr.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return e+(1===e?"er":"")},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fr",{defaultButtonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
journée",eventLimitText:"en plus"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/hi.js b/dist/cdnjs/2.1.1/lang/hi.js new file mode 100644 index 0000000..45713ca --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/hi.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},i={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};(t.defineLocale||t.lang).call(t,"hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return i[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return n[e]})},meridiem:function(e){return 4>e?"रात":10>e?"सुबह":17>e?"दोपहर":20>e?"शाम":"रात"},week:{dow:0,doy:6}}),e.fullCalendar.datepickerLang("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("hi",{defaultButtonText:{month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/hr.js b/dist/cdnjs/2.1.1/lang/hr.js new file mode 100644 index 0000000..6e36a77 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/hr.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t,n){var i=e+" ";switch(n){case"m":return t?"jedna minuta":"jedne minute";case"mm":return i+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return t?"jedan sat":"jednog sata";case"hh":return i+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return i+=1===e?"dan":"dana";case"MM":return i+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return i+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}(t.defineLocale||t.lang).call(t,"hr",{months:"sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:n,mm:n,h:n,hh:n,d:"dan",dd:n,M:"mjesec",MM:n,y:"godinu",yy:n},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("hr","hr",{closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("hr",{defaultButtonText:{month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/hu.js b/dist/cdnjs/2.1.1/lang/hu.js new file mode 100644 index 0000000..44a1b74 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/hu.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t,n,i){var r=e;switch(n){case"s":return i||t?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(i||t?" perc":" perce");case"mm":return r+(i||t?" perc":" perce");case"h":return"egy"+(i||t?" óra":" órája");case"hh":return r+(i||t?" óra":" órája");case"d":return"egy"+(i||t?" nap":" napja");case"dd":return r+(i||t?" nap":" napja");case"M":return"egy"+(i||t?" hónap":" hónapja");case"MM":return r+(i||t?" hónap":" hónapja");case"y":return"egy"+(i||t?" év":" éve");case"yy":return r+(i||t?" év":" éve")}return""}function i(e){return(e?"":"[múlt] ")+"["+r[this.day()]+"] LT[-kor]"}var r="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");(t.defineLocale||t.lang).call(t,"hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiem:function(e,t,n){return 12>e?n===!0?"de":"DE":n===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return i.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return i.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.lang("hu",{defaultButtonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/id.js b/dist/cdnjs/2.1.1/lang/id.js new file mode 100644 index 0000000..4bdc3d7 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/id.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(e){return 11>e?"pagi":15>e?"siang":19>e?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("id","id",{closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("id",{defaultButtonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari
penuh",eventLimitText:"lebih"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/is.js b/dist/cdnjs/2.1.1/lang/is.js new file mode 100644 index 0000000..7bbdebf --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/is.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e){return 11===e%100?!0:1===e%10?!1:!0}function i(e,t,i,r){var a=e+" ";switch(i){case"s":return t||r?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return t?"mínúta":"mínútu";case"mm":return n(e)?a+(t||r?"mínútur":"mínútum"):t?a+"mínúta":a+"mínútu";case"hh":return n(e)?a+(t||r?"klukkustundir":"klukkustundum"):a+"klukkustund";case"d":return t?"dagur":r?"dag":"degi";case"dd":return n(e)?t?a+"dagar":a+(r?"daga":"dögum"):t?a+"dagur":a+(r?"dag":"degi");case"M":return t?"mánuður":r?"mánuð":"mánuði";case"MM":return n(e)?t?a+"mánuðir":a+(r?"mánuði":"mánuðum"):t?a+"mánuður":a+(r?"mánuð":"mánuði");case"y":return t||r?"ár":"ári";case"yy":return n(e)?a+(t||r?"ár":"árum"):a+(t||r?"ár":"ári")}}(t.defineLocale||t.lang).call(t,"is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:i,m:i,mm:i,h:"klukkustund",hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("is","is",{closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("is",{defaultButtonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan
daginn",eventLimitText:"meira"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/it.js b/dist/cdnjs/2.1.1/lang/it.js new file mode 100644 index 0000000..629d86d --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/it.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:"[lo scorso] dddd [alle] LT",sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("it","it",{closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("it",{defaultButtonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il
giorno",eventLimitText:function(e){return"+altri "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/ja.js b/dist/cdnjs/2.1.1/lang/ja.js new file mode 100644 index 0000000..5552780 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/ja.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日LT",LLLL:"YYYY年M月D日LT dddd"},meridiem:function(e){return 12>e?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}}),e.fullCalendar.datepickerLang("ja","ja",{closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),e.fullCalendar.lang("ja",{defaultButtonText:{month:"月",week:"週",day:"日",list:"予定リスト"},allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/ko.js b/dist/cdnjs/2.1.1/lang/ko.js new file mode 100644 index 0000000..67d4dcb --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/ko.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 m분",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 LT",LLLL:"YYYY년 MMMM D일 dddd LT"},meridiem:function(e){return 12>e?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇초",ss:"%d초",m:"일분",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한달",MM:"%d달",y:"일년",yy:"%d년"},ordinal:"%d일",meridiemParse:/(오전|오후)/,isPM:function(e){return"오후"===e}}),e.fullCalendar.datepickerLang("ko","ko",{closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"}),e.fullCalendar.lang("ko",{defaultButtonText:{month:"월",week:"주",day:"일",list:"일정목록"},allDayText:"종일",eventLimitText:"개"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/lt.js b/dist/cdnjs/2.1.1/lang/lt.js new file mode 100644 index 0000000..d379e55 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/lt.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t,n,i){return t?"kelios sekundės":i?"kelių sekundžių":"kelias sekundes"}function i(e,t,n,i){return t?a(n)[0]:i?a(n)[1]:a(n)[2]}function r(e){return 0===e%10||e>10&&20>e}function a(e){return l[e].split("_")}function s(e,t,n,s){var o=e+" ";return 1===e?o+i(e,t,n[0],s):t?o+(r(e)?a(n)[1]:a(n)[0]):s?o+a(n)[1]:o+(r(e)?a(n)[1]:a(n)[2])}function o(e,t){var n=-1===t.indexOf("dddd HH:mm"),i=d[e.day()];return n?i:i.substring(0,i.length-2)+"į"}var l={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"},d="sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_");(t.defineLocale||t.lang).call(t,"lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:o,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:n,m:i,mm:s,h:i,hh:s,d:i,dd:s,M:i,MM:s,y:i,yy:s},ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("lt","lt",{closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.lang("lt",{defaultButtonText:{month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},allDayText:"Visą dieną",eventLimitText:"daugiau"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/lv.js b/dist/cdnjs/2.1.1/lang/lv.js new file mode 100644 index 0000000..b1591bb --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/lv.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t,n){var i=e.split("_");return n?1===t%10&&11!==t?i[2]:i[3]:1===t%10&&11!==t?i[0]:i[1]}function i(e,t,i){return e+" "+n(r[i],e,t)}var r={mm:"minūti_minūtes_minūte_minūtes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mēnesi_mēnešus_mēnesis_mēneši",yy:"gadu_gadus_gads_gadi"};(t.defineLocale||t.lang).call(t,"lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vēlāk",past:"%s agrāk",s:"dažas sekundes",m:"minūti",mm:i,h:"stundu",hh:i,d:"dienu",dd:i,M:"mēnesi",MM:i,y:"gadu",yy:i},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("lv","lv",{closeText:"Aizvērt",prevText:"Iepr.",nextText:"Nāk.",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("lv",{defaultButtonText:{month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/nl.js b/dist/cdnjs/2.1.1/lang/nl.js new file mode 100644 index 0000000..c3fe4a5 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/nl.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),i="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");(t.defineLocale||t.lang).call(t,"nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?i[e.month()]:n[e.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("nl","nl",{closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("nl",{defaultButtonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/pl.js b/dist/cdnjs/2.1.1/lang/pl.js new file mode 100644 index 0000000..2b92f13 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/pl.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e){return 5>e%10&&e%10>1&&1!==~~(e/10)%10}function i(e,t,i){var r=e+" ";switch(i){case"m":return t?"minuta":"minutę";case"mm":return r+(n(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return r+(n(e)?"godziny":"godzin");case"MM":return r+(n(e)?"miesiące":"miesięcy");case"yy":return r+(n(e)?"lata":"lat")}}var r="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),a="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");(t.defineLocale||t.lang).call(t,"pl",{months:function(e,t){return/D MMMM/.test(t)?a[e.month()]:r[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:i,mm:i,h:i,hh:i,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:i,y:"rok",yy:i},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pl","pl",{closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pl",{defaultButtonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/pt-br.js b/dist/cdnjs/2.1.1/lang/pt-br.js new file mode 100644 index 0000000..824e02e --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/pt-br.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº"}),e.fullCalendar.datepickerLang("pt-br","pt-BR",{closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pt-br",{defaultButtonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/pt.js b/dist/cdnjs/2.1.1/lang/pt.js new file mode 100644 index 0000000..fcb5935 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/pt.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pt",{defaultButtonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/ro.js b/dist/cdnjs/2.1.1/lang/ro.js new file mode 100644 index 0000000..6de85ad --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/ro.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t,n){var i={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},a=" ";return(e%100>=20||e>=100&&0===e%100)&&(a=" de "),e+a+i[n]}(t.defineLocale||t.lang).call(t,"ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:n,h:"o oră",hh:n,d:"o zi",dd:n,M:"o lună",MM:n,y:"un an",yy:n},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("ro","ro",{closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ro",{defaultButtonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/ru.js b/dist/cdnjs/2.1.1/lang/ru.js new file mode 100644 index 0000000..07c92f9 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/ru.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t){var n=e.split("_");return 1===t%10&&11!==t%100?n[0]:t%10>=2&&4>=t%10&&(10>t%100||t%100>=20)?n[1]:n[2]}function i(e,t,i){var a={mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===i?t?"минута":"минуту":e+" "+n(a[i],+e)}function a(e,t){var n={nominative:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),accusative:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_")},i=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return n[i][e.month()]}function r(e,t){var n={nominative:"янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),accusative:"янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек".split("_")},i=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return n[i][e.month()]}function s(e,t){var n={nominative:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),accusative:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_")},i=/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/.test(t)?"accusative":"nominative";return n[i][e.day()]}(t.defineLocale||t.lang).call(t,"ru",{months:a,monthsShort:r,weekdays:s,weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|я]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT"},lastWeek:function(){switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:i,mm:i,h:"час",hh:i,d:"день",dd:i,M:"месяц",MM:i,y:"год",yy:i},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(e){return/^(дня|вечера)$/.test(e)},meridiem:function(e){return 4>e?"ночи":12>e?"утра":17>e?"дня":"вечера"},ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-я";default:return e}},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("ru","ru",{closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ru",{defaultButtonText:{month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/sk.js b/dist/cdnjs/2.1.1/lang/sk.js new file mode 100644 index 0000000..aaf69a2 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/sk.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e){return e>1&&5>e}function a(e,t,a,i){var r=e+" ";switch(a){case"s":return t||i?"pár sekúnd":"pár sekundami";case"m":return t?"minúta":i?"minútu":"minútou";case"mm":return t||i?r+(n(e)?"minúty":"minút"):r+"minútami";case"h":return t?"hodina":i?"hodinu":"hodinou";case"hh":return t||i?r+(n(e)?"hodiny":"hodín"):r+"hodinami";case"d":return t||i?"deň":"dňom";case"dd":return t||i?r+(n(e)?"dni":"dní"):r+"dňami";case"M":return t||i?"mesiac":"mesiacom";case"MM":return t||i?r+(n(e)?"mesiace":"mesiacov"):r+"mesiacmi";case"y":return t||i?"rok":"rokom";case"yy":return t||i?r+(n(e)?"roky":"rokov"):r+"rokmi"}}var i="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),r="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");(t.defineLocale||t.lang).call(t,"sk",{months:i,monthsShort:r,monthsParse:function(e,t){var n,a=[];for(n=0;12>n;n++)a[n]=RegExp("^"+e[n]+"$|^"+t[n]+"$","i");return a}(i,r),weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("sk","sk",{closeText:"Zavrieť",prevText:"<Predchádzajúci",nextText:"Nasledujúci>",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sk",{defaultButtonText:{month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/sl.js b/dist/cdnjs/2.1.1/lang/sl.js new file mode 100644 index 0000000..1b18665 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/sl.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t,n){var a=e+" ";switch(n){case"m":return t?"ena minuta":"eno minuto";case"mm":return a+=1===e?"minuta":2===e?"minuti":3===e||4===e?"minute":"minut";case"h":return t?"ena ura":"eno uro";case"hh":return a+=1===e?"ura":2===e?"uri":3===e||4===e?"ure":"ur";case"dd":return a+=1===e?"dan":"dni";case"MM":return a+=1===e?"mesec":2===e?"meseca":3===e||4===e?"mesece":"mesecev";case"yy":return a+=1===e?"leto":2===e?"leti":3===e||4===e?"leta":"let"}}(t.defineLocale||t.lang).call(t,"sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejšnja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"%s nazaj",s:"nekaj sekund",m:n,mm:n,h:n,hh:n,d:"en dan",dd:n,M:"en mesec",MM:n,y:"eno leto",yy:n},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sl","sl",{closeText:"Zapri",prevText:"<Prejšnji",nextText:"Naslednji>",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sl",{defaultButtonText:{month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},allDayText:"Ves dan",eventLimitText:"več"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/sr-cyrl.js b/dist/cdnjs/2.1.1/lang/sr-cyrl.js new file mode 100644 index 0000000..0a8bccb --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/sr-cyrl.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&4>=e?t[1]:t[2]},translate:function(e,t,a){var r=n.words[a];return 1===a.length?t?r[0]:r[1]:e+" "+n.correctGrammaticalCase(e,r)}};(t.defineLocale||t.lang).call(t,"sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","сеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","среда","четвртак","петак","субота"],weekdaysShort:["нед.","пон.","уто.","сре.","чет.","пет.","суб."],weekdaysMin:["не","по","ут","ср","че","пе","су"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var e=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:n.translate,mm:n.translate,h:n.translate,hh:n.translate,d:"дан",dd:n.translate,M:"месец",MM:n.translate,y:"годину",yy:n.translate},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sr-cyrl","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sr-cyrl",{defaultButtonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/sr.js b/dist/cdnjs/2.1.1/lang/sr.js new file mode 100644 index 0000000..73de5c8 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/sr.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&4>=e?t[1]:t[2]},translate:function(e,t,a){var r=n.words[a];return 1===a.length?t?r[0]:r[1]:e+" "+n.correctGrammaticalCase(e,r)}};(t.defineLocale||t.lang).call(t,"sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","čet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","če","pe","su"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var e=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:n.translate,mm:n.translate,h:n.translate,hh:n.translate,d:"dan",dd:n.translate,M:"mesec",MM:n.translate,y:"godinu",yy:n.translate},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sr","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sr",{defaultButtonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/sv.js b/dist/cdnjs/2.1.1/lang/sv.js new file mode 100644 index 0000000..09cdcee --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/sv.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"e":1===t?"a":2===t?"a":3===t?"e":"e";return e+n},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("sv","sv",{closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sv",{defaultButtonText:{month:"Månad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/th.js b/dist/cdnjs/2.1.1/lang/th.js new file mode 100644 index 0000000..e8bea65 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/th.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิกา m นาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiem:function(e){return 12>e?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}}),e.fullCalendar.datepickerLang("th","th",{closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("th",{defaultButtonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/tr.js b/dist/cdnjs/2.1.1/lang/tr.js new file mode 100644 index 0000000..d7265a7 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/tr.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};(t.defineLocale||t.lang).call(t,"tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(e){if(0===e)return e+"'ıncı";var t=e%10,a=e%100-t,r=e>=100?100:null;return e+(n[t]||n[a]||n[r])},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("tr","tr",{closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("tr",{defaultButtonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla"})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/uk.js b/dist/cdnjs/2.1.1/lang/uk.js new file mode 100644 index 0000000..a472f52 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/uk.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t){var n=e.split("_");return 1===t%10&&11!==t%100?n[0]:t%10>=2&&4>=t%10&&(10>t%100||t%100>=20)?n[1]:n[2]}function a(e,t,a){var r={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===a?t?"хвилина":"хвилину":"h"===a?t?"година":"годину":e+" "+n(r[a],+e)}function r(e,t){var n={nominative:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_"),accusative:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_")},a=/D[oD]? *MMMM?/.test(t)?"accusative":"nominative";return n[a][e.month()]}function i(e,t){var n={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},a=/(\[[ВвУу]\]) ?dddd/.test(t)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(t)?"genitive":"nominative";return n[a][e.day()]}function s(e){return function(){return e+"о"+(11===this.hours()?"б":"")+"] LT"}}(t.defineLocale||t.lang).call(t,"uk",{months:r,monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:i,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., LT",LLLL:"dddd, D MMMM YYYY р., LT"},calendar:{sameDay:s("[Сьогодні "),nextDay:s("[Завтра "),lastDay:s("[Вчора "),nextWeek:s("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return s("[Минулої] dddd [").call(this);case 1:case 2:case 4:return s("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:a,mm:a,h:"годину",hh:a,d:"день",dd:a,M:"місяць",MM:a,y:"рік",yy:a},meridiem:function(e){return 4>e?"ночі":12>e?"ранку":17>e?"дня":"вечора"},ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e+"-й";case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("uk","uk",{closeText:"Закрити",prevText:"<",nextText:">",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("uk",{defaultButtonText:{month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/vi.js b/dist/cdnjs/2.1.1/lang/vi.js new file mode 100644 index 0000000..c92ac28 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/vi.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},ordinal:function(e){return e},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("vi","vi",{closeText:"Đóng",prevText:"<Trước",nextText:"Tiếp>",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("vi",{defaultButtonText:{month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e}})}); \ No newline at end of file diff --git a/dist/cdnjs/2.1.1/lang/zh-cn.js b/dist/cdnjs/2.1.1/lang/zh-cn.js new file mode 100644 index 0000000..ce7d584 --- /dev/null +++ b/dist/cdnjs/2.1.1/lang/zh-cn.js @@ -0,0 +1 @@ +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日LT",LLLL:"YYYY年MMMD日ddddLT",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日LT",llll:"YYYY年MMMD日ddddLT"},meridiem:function(e,t){var n=100*e+t;return 600>n?"凌晨":900>n?"早上":1130>n?"上午":1230>n?"中午":1800>n?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,n;return e=t().startOf("week"),n=this.unix()-e.unix()>=604800?"[下]":"[本]",0===this.minutes()?n+"dddAh点整":n+"dddAh点mm"},lastWeek:function(){var e,n;return e=t().startOf("week"),n=this.unix()n?"早上":1130>n?"上午":1230>n?"中午":1800>n?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"一分鐘",mm:"%d分鐘",h:"一小時",hh:"%d小時",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%d年"}}),e.fullCalendar.datepickerLang("zh-tw","zh-TW",{closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),e.fullCalendar.lang("zh-tw",{defaultButtonText:{month:"月",week:"週",day:"天",list:"待辦事項"},allDayText:"全天",eventLimitText:"更多"})}); \ No newline at end of file diff --git a/dist/cdnjs/package.json b/dist/cdnjs/package.json new file mode 100644 index 0000000..7fa715f --- /dev/null +++ b/dist/cdnjs/package.json @@ -0,0 +1,34 @@ +{ + "name": "fullcalendar", + "version": "2.1.1", + "description": "Full-sized drag & drop event calendar with resources", + "keywords": [ + "calendar", + "event", + "full-sized", + "resources" + ], + "homepage": "http://arshaw.com/fullcalendar/", + "dependencies": { + "jquery": ">=1.7.1", + "moment": ">=2.5.0" + }, + "title": "FullCalendar", + "demo": "", + "docs": "http://arshaw.com/fullcalendar/docs/", + "download": "", + "bugs": "https://github.com/seankenny/fullcalendar/issues", + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/arshaw/fullcalendar/blob/master/license.txt" + } + ], + "author": { + "name": "Adam Shaw", + "email": "arshaw@arshaw.com", + "url": "http://arshaw.com/" + }, + "copyright": "2013 Adam Shaw", + "filename": "fullcalendar.min.js" +} \ No newline at end of file diff --git a/dist/fullcalendar-2.1.1.zip b/dist/fullcalendar-2.1.1.zip new file mode 100644 index 0000000000000000000000000000000000000000..a98d1779c4dd46e57bd1ae0fb5cff3f228ca6a64 GIT binary patch literal 336134 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

ygUVf)rrJm(1m3jnt$QD>SibU8$)ZT_QyHbqob* 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 literal 0 HcmV?d00001 diff --git a/dist/fullcalendar.css b/dist/fullcalendar.css index a5b9d33..ab8b6e6 100644 --- a/dist/fullcalendar.css +++ b/dist/fullcalendar.css @@ -1,933 +1,933 @@ -/*! - * FullCalendar v2.1.1 Stylesheet - * Docs & License: http://arshaw.com/fullcalendar/ - * (c) 2013 Adam Shaw - */ - - -.fc { - direction: ltr; - text-align: left; -} - -.fc-rtl { - text-align: right; -} - -body .fc { /* extra precedence to overcome jqui */ - font-size: 1em; -} - - -/* Colors ---------------------------------------------------------------------------------------------------*/ - -.fc-unthemed th, -.fc-unthemed td, -.fc-unthemed hr, -.fc-unthemed thead, -.fc-unthemed tbody, -.fc-unthemed .fc-row, -.fc-unthemed .fc-popover { - border-color: #ddd; -} - -.fc-unthemed .fc-popover { - background-color: #fff; -} - -.fc-unthemed hr, -.fc-unthemed .fc-popover .fc-header { - background: #eee; -} - -.fc-unthemed .fc-popover .fc-header .fc-close { - color: #666; -} - -.fc-unthemed .fc-today { - background: #fcf8e3; -} - -.fc-highlight { /* when user is selecting cells */ - background: #bce8f1; - opacity: .3; - filter: alpha(opacity=30); /* for IE */ -} - - -/* Icons (inline elements with styled text that mock arrow icons) ---------------------------------------------------------------------------------------------------*/ - -.fc-icon { - display: inline-block; - font-size: 2em; - line-height: .5em; - height: .5em; /* will make the total height 1em */ - font-family: "Courier New", Courier, monospace; -} - -.fc-icon-left-single-arrow:after { - content: "\02039"; - font-weight: bold; -} - -.fc-icon-right-single-arrow:after { - content: "\0203A"; - font-weight: bold; -} - -.fc-icon-left-double-arrow:after { - content: "\000AB"; -} - -.fc-icon-right-double-arrow:after { - content: "\000BB"; -} - -.fc-icon-x:after { - content: "\000D7"; -} - - -/* Buttons (styled

rows. -----------------------------------------------------------------------------------------------------------------------*/ -// It leverages methods of the subclass and the View to determine custom rendering behavior for each row "type" -// (such as highlight rows, day rows, helper rows, etc). - -function RowRenderer(view) { - this.view = view; -} - - -RowRenderer.prototype = { - - view: null, // a View object - cellHtml: '' + cellHtml + ''; - }, - - - // Applies the "intro" and "outro" HTML to the given cells. - // Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro. - // `cells` can be an HTML string of element - // `row` is an optional row number. - bookendCells: function(cells, rowType, row) { - var view = this.view; - var intro = this.getHtmlRenderer('intro', rowType)(row || 0); - var outro = this.getHtmlRenderer('outro', rowType)(row || 0); - var isRTL = view.opt('isRTL'); - var prependHtml = isRTL ? outro : intro; - var appendHtml = isRTL ? intro : outro; - - if (typeof cells === 'string') { - return prependHtml + cells + appendHtml; - } - else { // a jQuery element - return cells.prepend(prependHtml).append(appendHtml); - } - }, - - - // Returns an HTML-rendering function given a specific `rendererName` (like cell, intro, or outro) and a specific - // `rowType` (like day, eventSkeleton, helperSkeleton), which is optional. - // If a renderer for the specific rowType doesn't exist, it will fall back to a generic renderer. - // We will query the View object first for any custom rendering functions, then the methods of the subclass. - getHtmlRenderer: function(rendererName, rowType) { - var view = this.view; - var generalName; // like "cellHtml" - var specificName; // like "dayCellHtml". based on rowType - var provider; // either the View or the RowRenderer subclass, whichever provided the method - var renderer; - - generalName = rendererName + 'Html'; - if (rowType) { - specificName = rowType + capitaliseFirstLetter(rendererName) + 'Html'; - } - - if (specificName && (renderer = view[specificName])) { - provider = view; - } - else if (specificName && (renderer = this[specificName])) { - provider = this; - } - else if ((renderer = view[generalName])) { - provider = view; - } - else if ((renderer = this[generalName])) { - provider = this; - } - - if (typeof renderer === 'function') { - return function(row) { - return renderer.apply(provider, arguments) || ''; // use correct `this` and always return a string - }; - } - - // the rendered can be a plain string as well. if not specified, always an empty string. - return function() { - return renderer || ''; - }; - } - -}; - -;; - -/* An abstract class comprised of a "grid" of cells that each represent a specific datetime -----------------------------------------------------------------------------------------------------------------------*/ - -function Grid(view) { - RowRenderer.call(this, view); // call the super-constructor - this.coordMap = new GridCoordMap(this); -} - - -Grid.prototype = createObject(RowRenderer.prototype); // declare the super-class -$.extend(Grid.prototype, { - - el: null, // the containing element - coordMap: null, // a GridCoordMap that converts pixel values to datetimes - cellDuration: null, // a cell's duration. subclasses must assign this ASAP - - - // Renders the grid into the `el` element. - // Subclasses should override and call this super-method when done. - render: function() { - this.bindHandlers(); - }, - - - // Called when the grid's resources need to be cleaned up - destroy: function() { - // subclasses can implement - }, - - - /* Coordinates & Cells - ------------------------------------------------------------------------------------------------------------------*/ - - - // Populates the given empty arrays with the y and x coordinates of the cells - buildCoords: function(rows, cols) { - // subclasses must implement - }, - - - // Given a cell object, returns the date for that cell - getCellDate: function(cell) { - // subclasses must implement - }, - - - // Given a cell object, returns the element that represents the cell's whole-day - getCellDayEl: function(cell) { - // subclasses must implement - }, - - - // Converts a range with an inclusive `start` and an exclusive `end` into an array of segment objects - rangeToSegs: function(start, end) { - // subclasses must implement - }, - - - /* Handlers - ------------------------------------------------------------------------------------------------------------------*/ - - - // Attach handlers to `this.el`, using bubbling to listen to all ancestors. - // We don't need to undo any of this in a "destroy" method, because the view will simply remove `this.el` from the - // DOM and jQuery will be smart enough to garbage collect the handlers. - bindHandlers: function() { - var _this = this; - - this.el.on('mousedown', function(ev) { - if ( - !$(ev.target).is('.fc-event-container *, .fc-more') && // not an an event element, or "more.." link - !$(ev.target).closest('.fc-popover').length // not on a popover (like the "more.." events one) - ) { - _this.dayMousedown(ev); - } - }); - - this.bindSegHandlers(); // attach event-element-related handlers. in Grid.events.js - }, - - - // Process a mousedown on an element that represents a day. For day clicking and selecting. - dayMousedown: function(ev) { - var _this = this; - var view = this.view; - var isSelectable = view.opt('selectable'); - var dates = null; // the inclusive dates of the selection. will be null if no selection - var start; // the inclusive start of the selection - var end; // the *exclusive* end of the selection - var dayEl; - - // this listener tracks a mousedown on a day element, and a subsequent drag. - // if the drag ends on the same day, it is a 'dayClick'. - // if 'selectable' is enabled, this listener also detects selections. - var dragListener = new DragListener(this.coordMap, { - //distance: 5, // needs more work if we want dayClick to fire correctly - scroll: view.opt('dragScroll'), - dragStart: function() { - view.unselect(); // since we could be rendering a new selection, we want to clear any old one - }, - cellOver: function(cell, date) { - if (dragListener.origDate) { // click needs to have started on a cell - - dayEl = _this.getCellDayEl(cell); - - dates = [ date, dragListener.origDate ].sort(dateCompare); - start = dates[0]; - end = dates[1].clone().add(_this.cellDuration); - - if (isSelectable) { - _this.renderSelection(start, end); - } - } - }, - cellOut: function(cell, date) { - dates = null; - _this.destroySelection(); - }, - listenStop: function(ev) { - if (dates) { // started and ended on a cell? - if (dates[0].isSame(dates[1])) { - view.trigger('dayClick', dayEl[0], start, ev); - } - if (isSelectable) { - // the selection will already have been rendered. just report it - view.reportSelection(start, end, ev); - } - } - } - }); - - dragListener.mousedown(ev); // start listening, which will eventually initiate a dragStart - }, - - - /* Event Dragging - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of a event being dragged over the given date(s). - // `end` can be null, as well as `seg`. See View's documentation on renderDrag for more info. - // A returned value of `true` signals that a mock "helper" event has been rendered. - renderDrag: function(start, end, seg) { - // subclasses must implement - }, - - - // Unrenders a visual indication of an event being dragged - destroyDrag: function() { - // subclasses must implement - }, - - - /* Event Resizing - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of an event being resized. - // `start` and `end` are the updated dates of the event. `seg` is the original segment object involved in the drag. - renderResize: function(start, end, seg) { - // subclasses must implement - }, - - - // Unrenders a visual indication of an event being resized. - destroyResize: function() { - // subclasses must implement - }, - - - /* Event Helper - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a mock event over the given date(s). - // `end` can be null, in which case the mock event that is rendered will have a null end time. - // `sourceSeg` is the internal segment object involved in the drag. If null, something external is dragging. - renderRangeHelper: function(start, end, sourceSeg) { - var view = this.view; - var fakeEvent; - - // compute the end time if forced to do so (this is what EventManager does) - if (!end && view.opt('forceEventDuration')) { - end = view.calendar.getDefaultEventEnd(!start.hasTime(), start); - } - - fakeEvent = sourceSeg ? createObject(sourceSeg.event) : {}; // mask the original event object if possible - fakeEvent.start = start; - fakeEvent.end = end; - fakeEvent.allDay = !(start.hasTime() || (end && end.hasTime())); // freshly compute allDay - - // this extra className will be useful for differentiating real events from mock events in CSS - fakeEvent.className = (fakeEvent.className || []).concat('fc-helper'); - - // if something external is being dragged in, don't render a resizer - if (!sourceSeg) { - fakeEvent.editable = false; - } - - this.renderHelper(fakeEvent, sourceSeg); // do the actual rendering - }, - - - // Renders a mock event - renderHelper: function(event, sourceSeg) { - // subclasses must implement - }, - - - // Unrenders a mock event - destroyHelper: function() { - // subclasses must implement - }, - - - /* Selection - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of a selection. Will highlight by default but can be overridden by subclasses. - renderSelection: function(start, end) { - this.renderHighlight(start, end); - }, - - - // Unrenders any visual indications of a selection. Will unrender a highlight by default. - destroySelection: function() { - this.destroyHighlight(); - }, - - - /* Highlight - ------------------------------------------------------------------------------------------------------------------*/ - - - // Puts visual emphasis on a certain date range - renderHighlight: function(start, end) { - // subclasses should implement - }, - - - // Removes visual emphasis on a date range - destroyHighlight: function() { - // subclasses should implement - }, - - - - /* Generic rendering utilities for subclasses - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a day-of-week header row - headHtml: function() { - return '' + - '
' + - '
'),e>t&&(n+=''),i>e&&(n+=''),n=this.bookendCells(n,"highlight"),'
'+n+""+"
"+"
"}}),t.extend(ee.prototype,{segs:null,rowStructs:null,renderEvents:function(e){var i=this.rowStructs=this.renderEventRows(e),n=[];this.rowEls.each(function(e,r){t(r).find(".fc-content-skeleton > table").append(i[e].tbodyEl),n.push.apply(n,i[e].segs)}),this.segs=n},getSegs:function(){return(this.segs||[]).concat(this.popoverSegs||[])},destroyEvents:function(){var t,e;for(J.prototype.destroyEvents.call(this),t=this.rowStructs||[];e=t.pop();)e.tbodyEl.remove();this.segs=null,this.destroySegPopover()},renderEventRows:function(t){var e,i,n=this.eventsToSegs(t),r=[];for(n=this.renderSegs(n),e=this.groupSegRows(n),i=0;e.length>i;i++)r.push(this.renderEventRow(i,e[i]));return r},renderSegHtml:function(t,e){var i,n=this.view,r=n.opt("isRTL"),o=t.event,s=n.isEventDraggable(o),l=!e&&o.allDay&&t.isEnd&&n.isEventResizable(o),a=this.getSegClasses(t,s,l),c=this.getEventSkinCss(o),d="";return a.unshift("fc-day-grid-event"),!o.allDay&&t.isStart&&(d=''+R(n.getEventTimeText(o))+""),i=''+(R(o.title||"")||" ")+"",'"+'
'+(r?i+" "+d:d+" "+i)+"
"+(l?'
':"")+""},renderEventRow:function(e,i){function n(e){for(;e>s;)d=(y[r-1]||[])[s],d?d.attr("rowspan",parseInt(d.attr("rowspan")||1,10)+1):(d=t("
"),l.append(d)),v[r][s]=d,y[r][s]=d,s++}var r,o,s,l,a,c,d,h=this.view,u=h.colCnt,f=this.buildSegLevels(i),g=Math.max(1,f.length),p=t("
').append(c.el),c.leftCol!=c.rightCol?d.attr("colspan",c.rightCol-c.leftCol+1):y[r][s]=d;c.rightCol>=s;)v[r][s]=d,m[r][s]=c,s++;l.append(d)}n(u),this.bookendCells(l,"eventSkeleton"),p.append(l)}return{row:e,tbodyEl:p,cellMatrix:v,segMatrix:m,segLevels:f,segs:i}},buildSegLevels:function(t){var e,i,n,r=[];for(t.sort(te),e=0;t.length>e;e++){for(i=t[e],n=0;r.length>n&&ie(i,r[n]);n++);i.level=n,(r[n]||(r[n]=[])).push(i)}for(n=0;r.length>n;n++)r[n].sort(ne);return r},groupSegRows:function(t){var e,i=this.view,n=[];for(e=0;i.rowCnt>e;e++)n.push([]);for(e=0;t.length>e;e++)n[t[e].row].push(t[e]);return n}}),t.extend(ee.prototype,{segPopover:null,popoverSegs:null,destroySegPopover:function(){this.segPopover&&this.segPopover.hide()},limitRows:function(t){var e,i,n=this.rowStructs||[];for(e=0;n.length>e;e++)this.unlimitRow(e),i=t?"number"==typeof t?t:this.computeRowLevelLimit(e):!1,i!==!1&&this.limitRow(e,i)},computeRowLevelLimit:function(t){var e,i,n=this.rowEls.eq(t),r=n.height(),o=this.rowStructs[t].tbodyEl.children();for(e=0;o.length>e;e++)if(i=o.eq(e).removeClass("fc-limited"),i.position().top+i.outerHeight()>r)return e;return!1},limitRow:function(e,i){function n(n){for(;n>T;)r={row:e,col:T},d=E.getCellSegs(r,i),d.length&&(f=s[i-1][T],w=E.renderMoreLink(r,d),y=t("
").append(w),f.append(y),D.push(y[0])),T++}var r,o,s,l,a,c,d,h,u,f,g,p,m,v,y,w,E=this,b=this.view,S=this.rowStructs[e],D=[],T=0;if(i&&S.segLevels.length>i){for(o=S.segLevels[i-1],s=S.cellMatrix,l=S.tbodyEl.children().slice(i).addClass("fc-limited").get(),a=0;o.length>a;a++){for(c=o[a],n(c.leftCol),u=[],h=0;c.rightCol>=T;)r={row:e,col:T},d=this.getCellSegs(r,i),u.push(d),h+=d.length,T++;if(h){for(f=s[i-1][c.leftCol],g=f.attr("rowspan")||1,p=[],m=0;u.length>m;m++)v=t('
').attr("rowspan",g),d=u[m],r={row:e,col:c.leftCol+m},w=this.renderMoreLink(r,[c].concat(d)),y=t("
").append(w),v.append(y),p.push(v[0]),D.push(v[0]);f.addClass("fc-limited").after(t(p)),l.push(f[0])}}n(b.colCnt),S.moreEls=t(D),S.limitedEls=t(l)}},unlimitRow:function(t){var e=this.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},renderMoreLink:function(e,i){var n=this,r=this.view;return t('').text(this.getMoreLinkText(i.length)).on("click",function(o){var s=r.opt("eventLimitClick"),l=r.cellToDate(e),a=t(this),c=n.getCellDayEl(e),d=n.getCellSegs(e),h=n.resliceDaySegs(d,l),u=n.resliceDaySegs(i,l);"function"==typeof s&&(s=r.trigger("eventLimitClick",null,{date:l,dayEl:c,moreEl:a,segs:h,hiddenSegs:u},o)),"popover"===s?n.showSegPopover(l,e,a,h):"string"==typeof s&&r.calendar.zoomTo(l,s)})},showSegPopover:function(t,e,i,n){var r,o,s=this,l=this.view,a=i.parent();r=1==l.rowCnt?this.view.el:this.rowEls.eq(e.row),o={className:"fc-more-popover",content:this.renderSegPopoverContent(t,n),parentEl:this.el,top:r.offset().top,autoHide:!0,viewportConstrain:l.opt("popoverViewportConstrain"),hide:function(){s.segPopover.destroy(),s.segPopover=null,s.popoverSegs=null}},l.opt("isRTL")?o.right=a.offset().left+a.outerWidth()+1:o.left=a.offset().left-1,this.segPopover=new j(o),this.segPopover.show()},renderSegPopoverContent:function(e,i){var n,r=this.view,o=r.opt("theme"),s=e.format(r.opt("dayPopoverFormat")),l=t('
'+''+''+R(s)+""+'
'+"
"+'
'+'
'+"
"),a=l.find(".fc-event-container");for(i=this.renderSegs(i,!0),this.popoverSegs=i,n=0;i.length>n;n++)i[n].cellDate=e,a.append(i[n].el);return l},resliceDaySegs:function(e,i){var n=t.map(e,function(t){return t.event}),r=i.clone().stripTime(),o=r.clone().add(1,"days");return this.eventsToSegs(n,r,o)},getMoreLinkText:function(t){var e=this.view,i=e.opt("eventLimitText");return"function"==typeof i?i(t):"+"+t+" "+i},getCellSegs:function(t,e){for(var i,n=this.rowStructs[t.row].segMatrix,r=e||0,o=[];n.length>r;)i=n[r][t.col],i&&o.push(i),r++;return o}}),re.prototype=H(J.prototype),t.extend(re.prototype,{slotDuration:null,snapDuration:null,minTime:null,maxTime:null,dayEls:null,slatEls:null,slatTops:null,highlightEl:null,helperEl:null,render:function(){this.processOptions(),this.el.html(this.renderHtml()),this.dayEls=this.el.find(".fc-day"),this.slatEls=this.el.find(".fc-slats tr"),this.computeSlatTops(),J.prototype.render.call(this)},renderHtml:function(){return'
'+this.rowHtml("slotBg")+"
"+"
"+'
'+""+this.slatRowHtml()+"
"+"
"},slotBgCellHtml:function(t,e,i){return this.bgCellHtml(t,e,i)},slatRowHtml:function(){for(var t,i,n,r=this.view,o=r.calendar,s=r.opt("isRTL"),l="",a=0===this.slotDuration.asMinutes()%15,c=e.duration(+this.minTime);this.maxTime>c;)t=r.start.clone().time(c),i=t.minutes(),n='
"+(a&&i?"":""+R(o.formatDate(t,r.opt("axisFormat")))+"")+"
'+(s?n:"")+"
',d=n.col),r=l.cellToDate(0,d),o=this.computeDateTop(n.start,r),s=this.computeDateTop(n.end,r),c+='
'+"
"+"
'),c=this.bookendCells(c,"highlight"),'
'+c+""+"
"+"
"}}),t.extend(re.prototype,{segs:null,eventSkeletonEl:null,renderEvents:function(e){var i=this.renderEventTable(e);this.eventSkeletonEl=t('
').append(i.tableEl),this.el.append(this.eventSkeletonEl),this.segs=i.segs},getSegs:function(){return this.segs||[]},destroyEvents:function(){J.prototype.destroyEvents.call(this),this.eventSkeletonEl&&(this.eventSkeletonEl.remove(),this.eventSkeletonEl=null),this.segs=null},renderEventTable:function(e){var i,n,r,o,s,l,a=t("
"),c=a.find("tr"),d=this.eventsToSegs(e);for(d=this.renderSegs(d),i=this.groupSegCols(d),this.computeSegVerticals(d),o=0;i.length>o;o++){for(s=i[o],oe(s),l=t('
'),n=0;s.length>n;n++)r=s[n],r.el.css(this.generateSegPositionCss(r)),30>r.bottom-r.top&&r.el.addClass("fc-short"),l.append(r.el);c.append(t("
").append(l))}return this.bookendCells(c,"eventSkeleton"),{tableEl:a,segs:d}},updateSegVerticals:function(){var t,e=this.segs;if(e)for(this.computeSegVerticals(e),t=0;e.length>t;t++)e[t].el.css(this.generateSegVerticalCss(e[t]))},computeSegVerticals:function(t){var e,i;for(e=0;t.length>e;e++)i=t[e],i.top=this.computeDateTop(i.start,i.start),i.bottom=this.computeDateTop(i.end,i.start)},renderSegHtml:function(t,e){var i,n,r,o=this.view,s=t.event,l=o.isEventDraggable(s),a=!e&&t.isEnd&&o.isEventResizable(s),c=this.getSegClasses(t,l,a),d=this.getEventSkinCss(s);return c.unshift("fc-time-grid-event"),o.isMultiDayEvent(s)?(t.isStart||t.isEnd)&&(i=o.getEventTimeText(t.start,t.end),n=o.getEventTimeText(t.start,t.end,"LT"),r=o.getEventTimeText(t.start,null)):(i=o.getEventTimeText(s),n=o.getEventTimeText(s,"LT"),r=o.getEventTimeText(s.start,null)),'"+'
'+(i?'
"+""+R(i)+""+"
":"")+(s.title?'
'+R(s.title)+"
":"")+"
"+'
'+(a?'
':"")+""},generateSegPositionCss:function(t){var e,i,n=this.view,r=n.opt("isRTL"),o=n.opt("slotEventOverlap"),s=t.backwardCoord,l=t.forwardCoord,a=this.generateSegVerticalCss(t);return o&&(l=Math.min(1,s+2*(l-s))),r?(e=1-l,i=s):(e=s,i=1-l),a.zIndex=t.level+1,a.left=100*e+"%",a.right=100*i+"%",o&&t.forwardPressure&&(a[r?"marginLeft":"marginRight"]=20),a},generateSegVerticalCss:function(t){return{top:t.top,bottom:-t.bottom}},groupSegCols:function(t){var e,i=this.view,n=[];for(e=0;i.colCnt>e;e++)n.push([]);for(e=0;t.length>e;e++)n[t[e].col].push(t[e]);return n}}),fe.prototype={calendar:null,coordMap:null,el:null,start:null,end:null,intervalStart:null,intervalEnd:null,rowCnt:null,colCnt:null,isSelected:!1,scrollerEl:null,scrollTop:null,widgetHeaderClass:null,widgetContentClass:null,highlightStateClass:null,documentMousedownProxy:null,documentDragStartProxy:null,init:function(){var e=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=e+"-widget-header",this.widgetContentClass=e+"-widget-content",this.highlightStateClass=e+"-state-highlight",this.documentMousedownProxy=t.proxy(this,"documentMousedown"),this.documentDragStartProxy=t.proxy(this,"documentDragStart")},render:function(){this.updateSize(),this.trigger("viewRender",this,this,this.el),t(document).on("mousedown",this.documentMousedownProxy).on("dragstart",this.documentDragStartProxy)},destroy:function(){this.unselect(),this.trigger("viewDestroy",this,this,this.el),this.destroyEvents(),this.el.empty(),t(document).off("mousedown",this.documentMousedownProxy).off("dragstart",this.documentDragStartProxy)},incrementDate:function(){},updateSize:function(t){t&&this.recordScroll(),this.updateHeight(),this.updateWidth()},updateWidth:function(){},updateHeight:function(){var t=this.calendar;this.setHeight(t.getSuggestedViewHeight(),t.isHeightAuto())},setHeight:function(){},computeScrollerHeight:function(t){var e,i=this.el.add(this.scrollerEl);return i.css({position:"relative",left:-1}),e=this.el.outerHeight()-this.scrollerEl.height(),i.css({position:"",left:""}),t-e},recordScroll:function(){this.scrollerEl&&(this.scrollTop=this.scrollerEl.scrollTop())},restoreScroll:function(){null!==this.scrollTop&&this.scrollerEl.scrollTop(this.scrollTop)},renderEvents:function(){this.segEach(function(t){this.trigger("eventAfterRender",t.event,t.event,t.el)}),this.trigger("eventAfterAllRender")},destroyEvents:function(){this.segEach(function(t){this.trigger("eventDestroy",t.event,t.event,t.el)})},resolveEventEl:function(e,i){var n=this.trigger("eventRender",e,e,i);return n===!1?i=null:n&&n!==!0&&(i=t(n)),i},showEvent:function(t){this.segEach(function(t){t.el.css("visibility","")},t)},hideEvent:function(t){this.segEach(function(t){t.el.css("visibility","hidden")},t)},segEach:function(t,e){var i,n=this.getSegs();for(i=0;n.length>i;i++)e&&n[i].event._id!==e._id||t.call(this,n[i])},getSegs:function(){},renderDrag:function(){},destroyDrag:function(){},documentDragStart:function(e){var i,n=this,r=null;this.opt("droppable")&&(i=new q(this.coordMap,{cellOver:function(t,e){r=e,n.renderDrag(e)},cellOut:function(){r=null,n.destroyDrag()}}),t(document).one("dragstop",function(t,e){n.destroyDrag(),r&&n.trigger("drop",t.target,r,t,e)}),i.startDrag(e))},select:function(t,e,i){this.unselect(i),this.renderSelection(t,e),this.reportSelection(t,e,i)},renderSelection:function(){},reportSelection:function(t,e,i){this.isSelected=!0,this.trigger("select",null,t,e,i)},unselect:function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection(),this.trigger("unselect",null,t))},destroySelection:function(){},documentMousedown:function(e){var i;this.isSelected&&this.opt("unselectAuto")&&E(e)&&(i=this.opt("unselectCancel"),i&&t(e.target).closest(i).length||this.unselect(e))}},ge.prototype=H(fe.prototype),t.extend(ge.prototype,{dayGrid:null,dayNumbersVisible:!1,weekNumbersVisible:!1,weekNumberWidth:null,headRowEl:null,render:function(t,e,i){this.rowCnt=t,this.colCnt=e,this.dayNumbersVisible=i,this.weekNumbersVisible=this.opt("weekNumbers"),this.dayGrid.numbersVisible=this.dayNumbersVisible||this.weekNumbersVisible,this.el.addClass("fc-basic-view").html(this.renderHtml()),this.headRowEl=this.el.find("thead .fc-row"),this.scrollerEl=this.el.find(".fc-day-grid-container"),this.dayGrid.coordMap.containerEl=this.scrollerEl,this.dayGrid.el=this.el.find(".fc-day-grid"),this.dayGrid.render(this.hasRigidRows()),fe.prototype.render.call(this)},destroy:function(){this.dayGrid.destroy(),fe.prototype.destroy.call(this)},renderHtml:function(){return'"+""+""+""+""+'"+""+""+"
'+this.dayGrid.headHtml()+"
'+'
'+'
'+"
"+"
" +},headIntroHtml:function(){return this.weekNumbersVisible?'
"+""+R(this.opt("weekNumberTitle"))+""+""+""+this.calendar.calculateWeekNumber(this.cellToDate(t,0))+""+"'+i.date()+""},weekNumberStyleAttr:function(){return null!==this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},hasRigidRows:function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},updateWidth:function(){this.weekNumbersVisible&&(this.weekNumberWidth=p(this.el.find(".fc-week-number")))},setHeight:function(t,e){var i,n=this.opt("eventLimit");v(this.scrollerEl),u(this.headRowEl),this.dayGrid.destroySegPopover(),n&&"number"==typeof n&&this.dayGrid.limitRows(n),i=this.computeScrollerHeight(t),this.setGridHeight(i,e),n&&"number"!=typeof n&&this.dayGrid.limitRows(n),!e&&m(this.scrollerEl,i)&&(h(this.headRowEl,w(this.scrollerEl)),i=this.computeScrollerHeight(t),this.scrollerEl.height(i),this.restoreScroll())},setGridHeight:function(t,e){e?g(this.dayGrid.rowEls):f(this.dayGrid.rowEls,t,!0)},renderEvents:function(t){this.dayGrid.renderEvents(t),this.updateHeight(),fe.prototype.renderEvents.call(this,t)},getSegs:function(){return this.dayGrid.getSegs()},destroyEvents:function(){fe.prototype.destroyEvents.call(this),this.recordScroll(),this.dayGrid.destroyEvents()},renderDrag:function(t,e,i){return this.dayGrid.renderDrag(t,e,i)},destroyDrag:function(){this.dayGrid.destroyDrag()},renderSelection:function(t,e){this.dayGrid.renderSelection(t,e)},destroySelection:function(){this.dayGrid.destroySelection()}}),r({fixedWeekCount:!0}),xe.month=pe,pe.prototype=H(ge.prototype),t.extend(pe.prototype,{name:"month",incrementDate:function(t,e){return t.clone().stripTime().add(e,"months").startOf("month")},render:function(t){var e;this.intervalStart=t.clone().stripTime().startOf("month"),this.intervalEnd=this.intervalStart.clone().add(1,"months"),this.start=this.intervalStart.clone(),this.start=this.skipHiddenDays(this.start),this.start.startOf("week"),this.start=this.skipHiddenDays(this.start),this.end=this.intervalEnd.clone(),this.end=this.skipHiddenDays(this.end,-1,!0),this.end.add((7-this.end.weekday())%7,"days"),this.end=this.skipHiddenDays(this.end,-1,!0),e=Math.ceil(this.end.diff(this.start,"weeks",!0)),this.isFixedWeeks()&&(this.end.add(6-e,"weeks"),e=6),this.title=this.calendar.formatDate(this.intervalStart,this.opt("titleFormat")),ge.prototype.render.call(this,e,this.getCellsPerWeek(),!0)},setGridHeight:function(t,e){e=e||"variable"===this.opt("weekMode"),e&&(t*=this.rowCnt/6),f(this.dayGrid.rowEls,t,!e)},isFixedWeeks:function(){var t=this.opt("weekMode");return t?"fixed"===t:this.opt("fixedWeekCount")}}),xe.basicWeek=me,me.prototype=H(ge.prototype),t.extend(me.prototype,{name:"basicWeek",incrementDate:function(t,e){return t.clone().stripTime().add(e,"weeks").startOf("week")},render:function(t){this.intervalStart=t.clone().stripTime().startOf("week"),this.intervalEnd=this.intervalStart.clone().add(1,"weeks"),this.start=this.skipHiddenDays(this.intervalStart),this.end=this.skipHiddenDays(this.intervalEnd,-1,!0),this.title=this.calendar.formatRange(this.start,this.end.clone().subtract(1),this.opt("titleFormat")," — "),ge.prototype.render.call(this,1,this.getCellsPerWeek(),!1)}}),xe.basicDay=ve,ve.prototype=H(ge.prototype),t.extend(ve.prototype,{name:"basicDay",incrementDate:function(t,e){var i=t.clone().stripTime().add(e,"days");return i=this.skipHiddenDays(i,0>e?-1:1)},render:function(t){this.start=this.intervalStart=t.clone().stripTime(),this.end=this.intervalEnd=this.start.clone().add(1,"days"),this.title=this.calendar.formatDate(this.start,this.opt("titleFormat")),ge.prototype.render.call(this,1,1,!1)}}),r({allDaySlot:!0,allDayText:"all-day",scrollTime:"06:00:00",slotDuration:"00:30:00",axisFormat:ye,timeFormat:{agenda:we},minTime:"00:00:00",maxTime:"24:00:00",slotEventOverlap:!0});var Ye=5;Ee.prototype=H(fe.prototype),t.extend(Ee.prototype,{timeGrid:null,dayGrid:null,axisWidth:null,noScrollRowEls:null,bottomRuleEl:null,bottomRuleHeight:null,render:function(e){this.rowCnt=1,this.colCnt=e,this.el.addClass("fc-agenda-view").html(this.renderHtml()),this.scrollerEl=this.el.find(".fc-time-grid-container"),this.timeGrid.coordMap.containerEl=this.scrollerEl,this.timeGrid.el=this.el.find(".fc-time-grid"),this.timeGrid.render(),this.bottomRuleEl=t('
').appendTo(this.timeGrid.el),this.dayGrid&&(this.dayGrid.el=this.el.find(".fc-day-grid"),this.dayGrid.render(),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight()),this.noScrollRowEls=this.el.find(".fc-row:not(.fc-scroller *)"),fe.prototype.render.call(this),this.resetScroll()},destroy:function(){this.timeGrid.destroy(),this.dayGrid&&this.dayGrid.destroy(),fe.prototype.destroy.call(this)},renderHtml:function(){return'"+""+""+""+""+'"+""+""+"
'+this.timeGrid.headHtml()+"
'+(this.dayGrid?'

':"")+'
'+'
'+"
"+"
"},headIntroHtml:function(){var t,e,i,n;return this.opt("weekNumbers")?(t=this.cellToDate(0,0),e=this.calendar.calculateWeekNumber(t),i=this.opt("weekNumberTitle"),n=this.opt("isRTL")?e+i:i+e,'
"+""+R(n)+""+""+""+(this.opt("allDayHtml")||R(this.opt("allDayText")))+""+"s are globally styled */ - border-color: transparent; - - /* don't put a border between events and/or the day number */ - border-bottom: 0; -} - -.fc-row .fc-content-skeleton tbody td, /* cells with events inside (so NOT the day number cell) */ -.fc-row .fc-helper-skeleton tbody td { - /* don't put a border between event cells */ - border-top: 0; -} - - -/* Scrolling Container ---------------------------------------------------------------------------------------------------*/ - -.fc-scroller { /* this class goes on elements for guaranteed vertical scrollbars */ - overflow-y: scroll; - overflow-x: hidden; -} - -.fc-scroller > * { /* we expect an immediate inner element */ - position: relative; /* re-scope all positions */ - width: 100%; /* hack to force re-sizing this inner element when scrollbars appear/disappear */ - overflow: hidden; /* don't let negative margins or absolute positioning create further scroll */ -} - - -/* Global Event Styles ---------------------------------------------------------------------------------------------------*/ - -.fc-event { - position: relative; /* for resize handle and other inner positioning */ - display: block; /* make the tag block */ - font-size: .85em; - line-height: 1.3; - border-radius: 3px; - border: 1px solid #3a87ad; /* default BORDER color */ - background-color: #3a87ad; /* default BACKGROUND color */ - font-weight: normal; /* undo jqui's ui-widget-header bold */ -} - -/* overpower some of bootstrap's and jqui's styles on tags */ -.fc-event, -.fc-event:hover, -.ui-widget .fc-event { - color: #fff; /* default TEXT color */ - text-decoration: none; /* if has an href */ -} - -.fc-event[href], -.fc-event.fc-draggable { - cursor: pointer; /* give events with links and draggable events a hand mouse pointer */ -} - - -/* DayGrid events ----------------------------------------------------------------------------------------------------- -We use the full "fc-day-grid-event" class instead of using descendants because the event won't -be a descendant of the grid when it is being dragged. -*/ - -.fc-day-grid-event { - margin: 1px 2px 0; /* spacing between events and edges */ - padding: 0 1px; -} - -/* events that are continuing to/from another week. kill rounded corners and butt up against edge */ - -.fc-ltr .fc-day-grid-event.fc-not-start, -.fc-rtl .fc-day-grid-event.fc-not-end { - margin-left: 0; - border-left-width: 0; - padding-left: 1px; /* replace the border with padding */ - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.fc-ltr .fc-day-grid-event.fc-not-end, -.fc-rtl .fc-day-grid-event.fc-not-start { - margin-right: 0; - border-right-width: 0; - padding-right: 1px; /* replace the border with padding */ - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.fc-day-grid-event > .fc-content { /* force events to be one-line tall */ - white-space: nowrap; - overflow: hidden; -} - -.fc-day-grid-event .fc-time { - font-weight: bold; -} - -/* resize handle (outside of fc-content, so can go outside of bounds) */ - -.fc-day-grid-event .fc-resizer { - position: absolute; - top: 0; - bottom: 0; - width: 7px; -} - -.fc-ltr .fc-day-grid-event .fc-resizer { - right: -3px; - cursor: e-resize; -} - -.fc-rtl .fc-day-grid-event .fc-resizer { - left: -3px; - cursor: w-resize; -} - - -/* Event Limiting ---------------------------------------------------------------------------------------------------*/ - -/* "more" link that represents hidden events */ - -a.fc-more { - margin: 1px 3px; - font-size: .85em; - cursor: pointer; - text-decoration: none; -} - -a.fc-more:hover { - text-decoration: underline; -} - -.fc-limited { /* rows and cells that are hidden because of a "more" link */ - display: none; -} - -/* popover that appears when "more" link is clicked */ - -.fc-day-grid .fc-row { - z-index: 1; /* make the "more" popover one higher than this */ -} - -.fc-more-popover { - z-index: 2; - width: 220px; -} - -.fc-more-popover .fc-event-container { - padding: 10px; -} - -/* Toolbar ---------------------------------------------------------------------------------------------------*/ - -.fc-toolbar { - text-align: center; - margin-bottom: 1em; -} - -.fc-toolbar .fc-left { - float: left; -} - -.fc-toolbar .fc-right { - float: right; -} - -.fc-toolbar .fc-center { - display: inline-block; -} - -/* the things within each left/right/center section */ -.fc .fc-toolbar > * > * { /* extra precedence to override button border margins */ - float: left; - margin-left: .75em; -} - -/* the first thing within each left/center/right section */ -.fc .fc-toolbar > * > :first-child { /* extra precedence to override button border margins */ - margin-left: 0; -} - -/* title text */ - -.fc-toolbar h2 { - margin: 0; -} - -/* button layering (for border precedence) */ - -.fc-toolbar button { - position: relative; -} - -.fc-toolbar .fc-state-hover, -.fc-toolbar .ui-state-hover { - z-index: 2; -} - -.fc-toolbar .fc-state-down { - z-index: 3; -} - -.fc-toolbar .fc-state-active, -.fc-toolbar .ui-state-active { - z-index: 4; -} - -.fc-toolbar button:focus { - z-index: 5; -} - - -/* View Structure ---------------------------------------------------------------------------------------------------*/ - -/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */ -/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */ -.fc-view-container *, -.fc-view-container *:before, -.fc-view-container *:after { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -.fc-view, /* scope positioning and z-index's for everything within the view */ -.fc-view > table { /* so dragged elements can be above the view's main element */ - position: relative; - z-index: 1; -} - -/* BasicView ---------------------------------------------------------------------------------------------------*/ - -/* day row structure */ - -.fc-basicWeek-view .fc-content-skeleton, -.fc-basicDay-view .fc-content-skeleton { - /* we are sure there are no day numbers in these views, so... */ - padding-top: 1px; /* add a pixel to make sure there are 2px padding above events */ - padding-bottom: 1em; /* ensure a space at bottom of cell for user selecting/clicking */ -} - -.fc-basic-view tbody .fc-row { - min-height: 4em; /* ensure that all rows are at least this tall */ -} - -/* a "rigid" row will take up a constant amount of height because content-skeleton is absolute */ - -.fc-row.fc-rigid { - overflow: hidden; -} - -.fc-row.fc-rigid .fc-content-skeleton { - position: absolute; - top: 0; - left: 0; - right: 0; -} - -/* week and day number styling */ - -.fc-basic-view .fc-week-number, -.fc-basic-view .fc-day-number { - padding: 0 2px; -} - -.fc-basic-view td.fc-week-number span, -.fc-basic-view td.fc-day-number { - padding-top: 2px; - padding-bottom: 2px; -} - -.fc-basic-view .fc-week-number { - text-align: center; -} - -.fc-basic-view .fc-week-number span { - /* work around the way we do column resizing and ensure a minimum width */ - display: inline-block; - min-width: 1.25em; -} - -.fc-ltr .fc-basic-view .fc-day-number { - text-align: right; -} - -.fc-rtl .fc-basic-view .fc-day-number { - text-align: left; -} - -.fc-day-number.fc-other-month { - opacity: 0.3; - filter: alpha(opacity=30); /* for IE */ - /* opacity with small font can sometimes look too faded - might want to set the 'color' property instead - making day-numbers bold also fixes the problem */ -} - -/* AgendaView all-day area ---------------------------------------------------------------------------------------------------*/ - -.fc-agenda-view .fc-day-grid { - position: relative; - z-index: 2; /* so the "more.." popover will be over the time grid */ -} - -.fc-agenda-view .fc-day-grid .fc-row { - min-height: 3em; /* all-day section will never get shorter than this */ -} - -.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton { - padding-top: 1px; /* add a pixel to make sure there are 2px padding above events */ - padding-bottom: 1em; /* give space underneath events for clicking/selecting days */ -} - - -/* TimeGrid axis running down the side (for both the all-day area and the slot area) ---------------------------------------------------------------------------------------------------*/ - -.fc .fc-axis { /* .fc to overcome default cell styles */ - vertical-align: middle; - padding: 0 4px; - white-space: nowrap; -} - -.fc-ltr .fc-axis { - text-align: right; -} - -.fc-rtl .fc-axis { - text-align: left; -} - -.ui-widget td.fc-axis { - font-weight: normal; /* overcome jqui theme making it bold */ -} - - -/* TimeGrid Structure ---------------------------------------------------------------------------------------------------*/ - -.fc-time-grid-container, /* so scroll container's z-index is below all-day */ -.fc-time-grid { /* so slats/bg/content/etc positions get scoped within here */ - position: relative; - z-index: 1; -} - -.fc-time-grid { - min-height: 100%; /* so if height setting is 'auto', .fc-bg stretches to fill height */ -} - -.fc-time-grid table { /* don't put outer borders on slats/bg/content/etc */ - border: 0 hidden transparent; -} - -.fc-time-grid > .fc-bg { - z-index: 1; -} - -.fc-time-grid .fc-slats, -.fc-time-grid > hr { /* the
AgendaView injects when grid is shorter than scroller */ - position: relative; - z-index: 2; -} - -.fc-time-grid .fc-highlight-skeleton { - z-index: 3; -} - -.fc-time-grid .fc-content-skeleton { - position: absolute; - z-index: 4; - top: 0; - left: 0; - right: 0; -} - -.fc-time-grid > .fc-helper-skeleton { - z-index: 5; -} - - -/* TimeGrid Slats (lines that run horizontally) ---------------------------------------------------------------------------------------------------*/ - -.fc-slats td { - height: 1.5em; - border-bottom: 0; /* each cell is responsible for its top border */ -} - -.fc-slats .fc-minor td { - border-top-style: dotted; -} - -.fc-slats .ui-widget-content { /* for jqui theme */ - background: none; /* see through to fc-bg */ -} - - -/* TimeGrid Highlighting Slots ---------------------------------------------------------------------------------------------------*/ - -.fc-time-grid .fc-highlight-container { /* a div within a cell within the fc-highlight-skeleton */ - position: relative; /* scopes the left/right of the fc-highlight to be in the column */ -} - -.fc-time-grid .fc-highlight { - position: absolute; - left: 0; - right: 0; - /* top and bottom will be in by JS */ -} - - -/* TimeGrid Event Containment ---------------------------------------------------------------------------------------------------*/ - -.fc-time-grid .fc-event-container { /* a div within a cell within the fc-content-skeleton */ - position: relative; -} - -.fc-ltr .fc-time-grid .fc-event-container { /* space on the sides of events for LTR (default) */ - margin: 0 2.5% 0 2px; -} - -.fc-rtl .fc-time-grid .fc-event-container { /* space on the sides of events for RTL */ - margin: 0 2px 0 2.5%; -} - -.fc-time-grid .fc-event { - position: absolute; - z-index: 1; /* scope inner z-index's */ -} - - -/* TimeGrid Event Styling ----------------------------------------------------------------------------------------------------- -We use the full "fc-time-grid-event" class instead of using descendants because the event won't -be a descendant of the grid when it is being dragged. -*/ - -.fc-time-grid-event.fc-not-start { /* events that are continuing from another day */ - /* replace space made by the top border with padding */ - border-top-width: 0; - padding-top: 1px; - - /* remove top rounded corners */ - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.fc-time-grid-event.fc-not-end { - /* replace space made by the top border with padding */ - border-bottom-width: 0; - padding-bottom: 1px; - - /* remove bottom rounded corners */ - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -.fc-time-grid-event { - overflow: hidden; /* don't let the bg flow over rounded corners */ -} - -.fc-time-grid-event > .fc-content { /* contains the time and title, but no bg and resizer */ - position: relative; - z-index: 2; /* above the bg */ -} - -.fc-time-grid-event .fc-time, -.fc-time-grid-event .fc-title { - padding: 0 1px; -} - -.fc-time-grid-event .fc-time { - font-size: .85em; - white-space: nowrap; -} - -.fc-time-grid-event .fc-bg { - z-index: 1; - background: #fff; - opacity: .25; - filter: alpha(opacity=25); /* for IE */ -} - -/* short mode, where time and title are on the same line */ - -.fc-time-grid-event.fc-short .fc-content { - /* don't wrap to second line (now that contents will be inline) */ - white-space: nowrap; -} - -.fc-time-grid-event.fc-short .fc-time, -.fc-time-grid-event.fc-short .fc-title { - /* put the time and title on the same line */ - display: inline-block; - vertical-align: top; -} - -.fc-time-grid-event.fc-short .fc-time span { - display: none; /* don't display the full time text... */ -} - -.fc-time-grid-event.fc-short .fc-time:before { - content: attr(data-start); /* ...instead, display only the start time */ -} - -.fc-time-grid-event.fc-short .fc-time:after { - content: "\000A0-\000A0"; /* seperate with a dash, wrapped in nbsp's */ -} - -.fc-time-grid-event.fc-short .fc-title { - font-size: .85em; /* make the title text the same size as the time */ - padding: 0; /* undo padding from above */ -} - -/* resizer */ - -.fc-time-grid-event .fc-resizer { - position: absolute; - z-index: 3; /* above content */ - left: 0; - right: 0; - bottom: 0; - height: 8px; - overflow: hidden; - line-height: 8px; - font-size: 11px; - font-family: monospace; - text-align: center; - cursor: s-resize; -} - -.fc-time-grid-event .fc-resizer:after { - content: "="; -} +/*! + * FullCalendar v2.1.1 Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + + +.fc { + direction: ltr; + text-align: left; +} + +.fc-rtl { + text-align: right; +} + +body .fc { /* extra precedence to overcome jqui */ + font-size: 1em; +} + + +/* Colors +--------------------------------------------------------------------------------------------------*/ + +.fc-unthemed th, +.fc-unthemed td, +.fc-unthemed hr, +.fc-unthemed thead, +.fc-unthemed tbody, +.fc-unthemed .fc-row, +.fc-unthemed .fc-popover { + border-color: #ddd; +} + +.fc-unthemed .fc-popover { + background-color: #fff; +} + +.fc-unthemed hr, +.fc-unthemed .fc-popover .fc-header { + background: #eee; +} + +.fc-unthemed .fc-popover .fc-header .fc-close { + color: #666; +} + +.fc-unthemed .fc-today { + background: #fcf8e3; +} + +.fc-highlight { /* when user is selecting cells */ + background: #bce8f1; + opacity: .3; + filter: alpha(opacity=30); /* for IE */ +} + + +/* Icons (inline elements with styled text that mock arrow icons) +--------------------------------------------------------------------------------------------------*/ + +.fc-icon { + display: inline-block; + font-size: 2em; + line-height: .5em; + height: .5em; /* will make the total height 1em */ + font-family: "Courier New", Courier, monospace; +} + +.fc-icon-left-single-arrow:after { + content: "\02039"; + font-weight: bold; +} + +.fc-icon-right-single-arrow:after { + content: "\0203A"; + font-weight: bold; +} + +.fc-icon-left-double-arrow:after { + content: "\000AB"; +} + +.fc-icon-right-double-arrow:after { + content: "\000BB"; +} + +.fc-icon-x:after { + content: "\000D7"; +} + + +/* Buttons (styled
s are globally styled */ + border-color: transparent; + + /* don't put a border between events and/or the day number */ + border-bottom: 0; +} + +.fc-row .fc-content-skeleton tbody td, /* cells with events inside (so NOT the day number cell) */ +.fc-row .fc-helper-skeleton tbody td { + /* don't put a border between event cells */ + border-top: 0; +} + + +/* Scrolling Container +--------------------------------------------------------------------------------------------------*/ + +.fc-scroller { /* this class goes on elements for guaranteed vertical scrollbars */ + overflow-y: scroll; + overflow-x: hidden; +} + +.fc-scroller > * { /* we expect an immediate inner element */ + position: relative; /* re-scope all positions */ + width: 100%; /* hack to force re-sizing this inner element when scrollbars appear/disappear */ + overflow: hidden; /* don't let negative margins or absolute positioning create further scroll */ +} + + +/* Global Event Styles +--------------------------------------------------------------------------------------------------*/ + +.fc-event { + position: relative; /* for resize handle and other inner positioning */ + display: block; /* make the tag block */ + font-size: .85em; + line-height: 1.3; + border-radius: 3px; + border: 1px solid #3a87ad; /* default BORDER color */ + background-color: #3a87ad; /* default BACKGROUND color */ + font-weight: normal; /* undo jqui's ui-widget-header bold */ +} + +/* overpower some of bootstrap's and jqui's styles on tags */ +.fc-event, +.fc-event:hover, +.ui-widget .fc-event { + color: #fff; /* default TEXT color */ + text-decoration: none; /* if has an href */ +} + +.fc-event[href], +.fc-event.fc-draggable { + cursor: pointer; /* give events with links and draggable events a hand mouse pointer */ +} + + +/* DayGrid events +---------------------------------------------------------------------------------------------------- +We use the full "fc-day-grid-event" class instead of using descendants because the event won't +be a descendant of the grid when it is being dragged. +*/ + +.fc-day-grid-event { + margin: 1px 2px 0; /* spacing between events and edges */ + padding: 0 1px; +} + +/* events that are continuing to/from another week. kill rounded corners and butt up against edge */ + +.fc-ltr .fc-day-grid-event.fc-not-start, +.fc-rtl .fc-day-grid-event.fc-not-end { + margin-left: 0; + border-left-width: 0; + padding-left: 1px; /* replace the border with padding */ + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.fc-ltr .fc-day-grid-event.fc-not-end, +.fc-rtl .fc-day-grid-event.fc-not-start { + margin-right: 0; + border-right-width: 0; + padding-right: 1px; /* replace the border with padding */ + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.fc-day-grid-event > .fc-content { /* force events to be one-line tall */ + white-space: nowrap; + overflow: hidden; +} + +.fc-day-grid-event .fc-time { + font-weight: bold; +} + +/* resize handle (outside of fc-content, so can go outside of bounds) */ + +.fc-day-grid-event .fc-resizer { + position: absolute; + top: 0; + bottom: 0; + width: 7px; +} + +.fc-ltr .fc-day-grid-event .fc-resizer { + right: -3px; + cursor: e-resize; +} + +.fc-rtl .fc-day-grid-event .fc-resizer { + left: -3px; + cursor: w-resize; +} + + +/* Event Limiting +--------------------------------------------------------------------------------------------------*/ + +/* "more" link that represents hidden events */ + +a.fc-more { + margin: 1px 3px; + font-size: .85em; + cursor: pointer; + text-decoration: none; +} + +a.fc-more:hover { + text-decoration: underline; +} + +.fc-limited { /* rows and cells that are hidden because of a "more" link */ + display: none; +} + +/* popover that appears when "more" link is clicked */ + +.fc-day-grid .fc-row { + z-index: 1; /* make the "more" popover one higher than this */ +} + +.fc-more-popover { + z-index: 2; + width: 220px; +} + +.fc-more-popover .fc-event-container { + padding: 10px; +} + +/* Toolbar +--------------------------------------------------------------------------------------------------*/ + +.fc-toolbar { + text-align: center; + margin-bottom: 1em; +} + +.fc-toolbar .fc-left { + float: left; +} + +.fc-toolbar .fc-right { + float: right; +} + +.fc-toolbar .fc-center { + display: inline-block; +} + +/* the things within each left/right/center section */ +.fc .fc-toolbar > * > * { /* extra precedence to override button border margins */ + float: left; + margin-left: .75em; +} + +/* the first thing within each left/center/right section */ +.fc .fc-toolbar > * > :first-child { /* extra precedence to override button border margins */ + margin-left: 0; +} + +/* title text */ + +.fc-toolbar h2 { + margin: 0; +} + +/* button layering (for border precedence) */ + +.fc-toolbar button { + position: relative; +} + +.fc-toolbar .fc-state-hover, +.fc-toolbar .ui-state-hover { + z-index: 2; +} + +.fc-toolbar .fc-state-down { + z-index: 3; +} + +.fc-toolbar .fc-state-active, +.fc-toolbar .ui-state-active { + z-index: 4; +} + +.fc-toolbar button:focus { + z-index: 5; +} + + +/* View Structure +--------------------------------------------------------------------------------------------------*/ + +/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */ +/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */ +.fc-view-container *, +.fc-view-container *:before, +.fc-view-container *:after { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.fc-view, /* scope positioning and z-index's for everything within the view */ +.fc-view > table { /* so dragged elements can be above the view's main element */ + position: relative; + z-index: 1; +} + +/* BasicView +--------------------------------------------------------------------------------------------------*/ + +/* day row structure */ + +.fc-basicWeek-view .fc-content-skeleton, +.fc-basicDay-view .fc-content-skeleton { + /* we are sure there are no day numbers in these views, so... */ + padding-top: 1px; /* add a pixel to make sure there are 2px padding above events */ + padding-bottom: 1em; /* ensure a space at bottom of cell for user selecting/clicking */ +} + +.fc-basic-view tbody .fc-row { + min-height: 4em; /* ensure that all rows are at least this tall */ +} + +/* a "rigid" row will take up a constant amount of height because content-skeleton is absolute */ + +.fc-row.fc-rigid { + overflow: hidden; +} + +.fc-row.fc-rigid .fc-content-skeleton { + position: absolute; + top: 0; + left: 0; + right: 0; +} + +/* week and day number styling */ + +.fc-basic-view .fc-week-number, +.fc-basic-view .fc-day-number { + padding: 0 2px; +} + +.fc-basic-view td.fc-week-number span, +.fc-basic-view td.fc-day-number { + padding-top: 2px; + padding-bottom: 2px; +} + +.fc-basic-view .fc-week-number { + text-align: center; +} + +.fc-basic-view .fc-week-number span { + /* work around the way we do column resizing and ensure a minimum width */ + display: inline-block; + min-width: 1.25em; +} + +.fc-ltr .fc-basic-view .fc-day-number { + text-align: right; +} + +.fc-rtl .fc-basic-view .fc-day-number { + text-align: left; +} + +.fc-day-number.fc-other-month { + opacity: 0.3; + filter: alpha(opacity=30); /* for IE */ + /* opacity with small font can sometimes look too faded + might want to set the 'color' property instead + making day-numbers bold also fixes the problem */ +} + +/* AgendaView all-day area +--------------------------------------------------------------------------------------------------*/ + +.fc-agenda-view .fc-day-grid { + position: relative; + z-index: 2; /* so the "more.." popover will be over the time grid */ +} + +.fc-agenda-view .fc-day-grid .fc-row { + min-height: 3em; /* all-day section will never get shorter than this */ +} + +.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton { + padding-top: 1px; /* add a pixel to make sure there are 2px padding above events */ + padding-bottom: 1em; /* give space underneath events for clicking/selecting days */ +} + + +/* TimeGrid axis running down the side (for both the all-day area and the slot area) +--------------------------------------------------------------------------------------------------*/ + +.fc .fc-axis { /* .fc to overcome default cell styles */ + vertical-align: middle; + padding: 0 4px; + white-space: nowrap; +} + +.fc-ltr .fc-axis { + text-align: right; +} + +.fc-rtl .fc-axis { + text-align: left; +} + +.ui-widget td.fc-axis { + font-weight: normal; /* overcome jqui theme making it bold */ +} + + +/* TimeGrid Structure +--------------------------------------------------------------------------------------------------*/ + +.fc-time-grid-container, /* so scroll container's z-index is below all-day */ +.fc-time-grid { /* so slats/bg/content/etc positions get scoped within here */ + position: relative; + z-index: 1; +} + +.fc-time-grid { + min-height: 100%; /* so if height setting is 'auto', .fc-bg stretches to fill height */ +} + +.fc-time-grid table { /* don't put outer borders on slats/bg/content/etc */ + border: 0 hidden transparent; +} + +.fc-time-grid > .fc-bg { + z-index: 1; +} + +.fc-time-grid .fc-slats, +.fc-time-grid > hr { /* the
AgendaView injects when grid is shorter than scroller */ + position: relative; + z-index: 2; +} + +.fc-time-grid .fc-highlight-skeleton { + z-index: 3; +} + +.fc-time-grid .fc-content-skeleton { + position: absolute; + z-index: 4; + top: 0; + left: 0; + right: 0; +} + +.fc-time-grid > .fc-helper-skeleton { + z-index: 5; +} + + +/* TimeGrid Slats (lines that run horizontally) +--------------------------------------------------------------------------------------------------*/ + +.fc-slats td { + height: 1.5em; + border-bottom: 0; /* each cell is responsible for its top border */ +} + +.fc-slats .fc-minor td { + border-top-style: dotted; +} + +.fc-slats .ui-widget-content { /* for jqui theme */ + background: none; /* see through to fc-bg */ +} + + +/* TimeGrid Highlighting Slots +--------------------------------------------------------------------------------------------------*/ + +.fc-time-grid .fc-highlight-container { /* a div within a cell within the fc-highlight-skeleton */ + position: relative; /* scopes the left/right of the fc-highlight to be in the column */ +} + +.fc-time-grid .fc-highlight { + position: absolute; + left: 0; + right: 0; + /* top and bottom will be in by JS */ +} + + +/* TimeGrid Event Containment +--------------------------------------------------------------------------------------------------*/ + +.fc-time-grid .fc-event-container { /* a div within a cell within the fc-content-skeleton */ + position: relative; +} + +.fc-ltr .fc-time-grid .fc-event-container { /* space on the sides of events for LTR (default) */ + margin: 0 2.5% 0 2px; +} + +.fc-rtl .fc-time-grid .fc-event-container { /* space on the sides of events for RTL */ + margin: 0 2px 0 2.5%; +} + +.fc-time-grid .fc-event { + position: absolute; + z-index: 1; /* scope inner z-index's */ +} + + +/* TimeGrid Event Styling +---------------------------------------------------------------------------------------------------- +We use the full "fc-time-grid-event" class instead of using descendants because the event won't +be a descendant of the grid when it is being dragged. +*/ + +.fc-time-grid-event.fc-not-start { /* events that are continuing from another day */ + /* replace space made by the top border with padding */ + border-top-width: 0; + padding-top: 1px; + + /* remove top rounded corners */ + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.fc-time-grid-event.fc-not-end { + /* replace space made by the top border with padding */ + border-bottom-width: 0; + padding-bottom: 1px; + + /* remove bottom rounded corners */ + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.fc-time-grid-event { + overflow: hidden; /* don't let the bg flow over rounded corners */ +} + +.fc-time-grid-event > .fc-content { /* contains the time and title, but no bg and resizer */ + position: relative; + z-index: 2; /* above the bg */ +} + +.fc-time-grid-event .fc-time, +.fc-time-grid-event .fc-title { + padding: 0 1px; +} + +.fc-time-grid-event .fc-time { + font-size: .85em; + white-space: nowrap; +} + +.fc-time-grid-event .fc-bg { + z-index: 1; + background: #fff; + opacity: .25; + filter: alpha(opacity=25); /* for IE */ +} + +/* short mode, where time and title are on the same line */ + +.fc-time-grid-event.fc-short .fc-content { + /* don't wrap to second line (now that contents will be inline) */ + white-space: nowrap; +} + +.fc-time-grid-event.fc-short .fc-time, +.fc-time-grid-event.fc-short .fc-title { + /* put the time and title on the same line */ + display: inline-block; + vertical-align: top; +} + +.fc-time-grid-event.fc-short .fc-time span { + display: none; /* don't display the full time text... */ +} + +.fc-time-grid-event.fc-short .fc-time:before { + content: attr(data-start); /* ...instead, display only the start time */ +} + +.fc-time-grid-event.fc-short .fc-time:after { + content: "\000A0-\000A0"; /* seperate with a dash, wrapped in nbsp's */ +} + +.fc-time-grid-event.fc-short .fc-title { + font-size: .85em; /* make the title text the same size as the time */ + padding: 0; /* undo padding from above */ +} + +/* resizer */ + +.fc-time-grid-event .fc-resizer { + position: absolute; + z-index: 3; /* above content */ + left: 0; + right: 0; + bottom: 0; + height: 8px; + overflow: hidden; + line-height: 8px; + font-size: 11px; + font-family: monospace; + text-align: center; + cursor: s-resize; +} + +.fc-time-grid-event .fc-resizer:after { + content: "="; +} diff --git a/dist/fullcalendar.js b/dist/fullcalendar.js index 7df984c..6984157 100644 --- a/dist/fullcalendar.js +++ b/dist/fullcalendar.js @@ -1,8391 +1,8399 @@ -/*! - * FullCalendar v2.1.1 - * Docs & License: http://arshaw.com/fullcalendar/ - * (c) 2013 Adam Shaw - */ - -(function(factory) { - if (typeof define === 'function' && define.amd) { - define([ 'jquery', 'moment' ], factory); - } - else { - factory(jQuery, moment); - } -})(function($, moment) { - -;; - -var defaults = { - - lang: 'en', - - defaultTimedEventDuration: '02:00:00', - defaultAllDayEventDuration: { days: 1 }, - forceEventDuration: false, - nextDayThreshold: '09:00:00', // 9am - - // display - defaultView: 'month', - aspectRatio: 1.35, - header: { - left: 'title', - center: '', - right: 'today prev,next' - }, - weekends: true, - weekNumbers: false, - - weekNumberTitle: 'W', - weekNumberCalculation: 'local', - - //editable: false, - - // event ajax - lazyFetching: true, - startParam: 'start', - endParam: 'end', - timezoneParam: 'timezone', - - timezone: false, - - //allDayDefault: undefined, - - // time formats - titleFormat: { - month: 'MMMM YYYY', // like "September 1986". each language will override this - week: 'll', // like "Sep 4 1986" - day: 'LL' // like "September 4 1986" - }, - columnFormat: { - month: 'ddd', // like "Sat" - week: generateWeekColumnFormat, - day: 'dddd' // like "Saturday" - }, - timeFormat: { // for event elements - 'default': generateShortTimeFormat - }, - - displayEventEnd: { - month: false, - basicWeek: false, - 'default': true - }, - - // locale - isRTL: false, - defaultButtonText: { - prev: "prev", - next: "next", - prevYear: "prev year", - nextYear: "next year", - today: 'today', - month: 'month', - week: 'week', - day: 'day' - }, - - buttonIcons: { - prev: 'left-single-arrow', - next: 'right-single-arrow', - prevYear: 'left-double-arrow', - nextYear: 'right-double-arrow' - }, - - // jquery-ui theming - theme: false, - themeButtonIcons: { - prev: 'circle-triangle-w', - next: 'circle-triangle-e', - prevYear: 'seek-prev', - nextYear: 'seek-next' - }, - - dragOpacity: .75, - dragRevertDuration: 500, - dragScroll: true, - - //selectable: false, - unselectAuto: true, - - dropAccept: '*', - - eventLimit: false, - eventLimitText: 'more', - eventLimitClick: 'popover', - dayPopoverFormat: 'LL', - - handleWindowResize: true, - windowResizeDelay: 200 // milliseconds before a rerender happens - -}; - - -function generateShortTimeFormat(options, langData) { - return langData.longDateFormat('LT') - .replace(':mm', '(:mm)') - .replace(/(\Wmm)$/, '($1)') // like above, but for foreign langs - .replace(/\s*a$/i, 't'); // convert to AM/PM/am/pm to lowercase one-letter. remove any spaces beforehand -} - - -function generateWeekColumnFormat(options, langData) { - var format = langData.longDateFormat('L'); // for the format like "MM/DD/YYYY" - format = format.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g, ''); // strip the year off the edge, as well as other misc non-whitespace chars - if (options.isRTL) { - format += ' ddd'; // for RTL, add day-of-week to end - } - else { - format = 'ddd ' + format; // for LTR, add day-of-week to beginning - } - return format; -} - - -var langOptionHash = { - en: { - columnFormat: { - week: 'ddd M/D' // override for english. different from the generated default, which is MM/DD - }, - dayPopoverFormat: 'dddd, MMMM D' - } -}; - - -// right-to-left defaults -var rtlDefaults = { - header: { - left: 'next,prev today', - center: '', - right: 'title' - }, - buttonIcons: { - prev: 'right-single-arrow', - next: 'left-single-arrow', - prevYear: 'right-double-arrow', - nextYear: 'left-double-arrow' - }, - themeButtonIcons: { - prev: 'circle-triangle-e', - next: 'circle-triangle-w', - nextYear: 'seek-prev', - prevYear: 'seek-next' - } -}; - -;; - -var fc = $.fullCalendar = { version: "2.1.1" }; -var fcViews = fc.views = {}; - - -$.fn.fullCalendar = function(options) { - var args = Array.prototype.slice.call(arguments, 1); // for a possible method call - var res = this; // what this function will return (this jQuery object by default) - - this.each(function(i, _element) { // loop each DOM element involved - var element = $(_element); - var calendar = element.data('fullCalendar'); // get the existing calendar object (if any) - var singleRes; // the returned value of this single method call - - // a method call - if (typeof options === 'string') { - if (calendar && $.isFunction(calendar[options])) { - singleRes = calendar[options].apply(calendar, args); - if (!i) { - res = singleRes; // record the first method call result - } - if (options === 'destroy') { // for the destroy method, must remove Calendar object data - element.removeData('fullCalendar'); - } - } - } - // a new calendar initialization - else if (!calendar) { // don't initialize twice - calendar = new Calendar(element, options); - element.data('fullCalendar', calendar); - calendar.render(); - } - }); - - return res; -}; - - -// function for adding/overriding defaults -function setDefaults(d) { - mergeOptions(defaults, d); -} - - -// Recursively combines option hash-objects. -// Better than `$.extend(true, ...)` because arrays are not traversed/copied. -// -// called like: -// mergeOptions(target, obj1, obj2, ...) -// -function mergeOptions(target) { - - function mergeIntoTarget(name, value) { - if ($.isPlainObject(value) && $.isPlainObject(target[name]) && !isForcedAtomicOption(name)) { - // merge into a new object to avoid destruction - target[name] = mergeOptions({}, target[name], value); // combine. `value` object takes precedence - } - else if (value !== undefined) { // only use values that are set and not undefined - target[name] = value; - } - } - - for (var i=1; i").prependTo(element); - - header = new Header(t, options); - headerElement = header.render(); - if (headerElement) { - element.prepend(headerElement); - } - - changeView(options.defaultView); - - if (options.handleWindowResize) { - windowResizeProxy = debounce(windowResize, options.windowResizeDelay); // prevents rapid calls - $(window).resize(windowResizeProxy); - } - } - - - function destroy() { - - if (currentView) { - currentView.destroy(); - } - - header.destroy(); - content.remove(); - element.removeClass('fc fc-ltr fc-rtl fc-unthemed ui-widget'); - - $(window).unbind('resize', windowResizeProxy); - } - - - function elementVisible() { - return element.is(':visible'); - } - - - - // View Rendering - // ----------------------------------------------------------------------------------- - - - function changeView(viewName) { - renderView(0, viewName); - } - - - // Renders a view because of a date change, view-type change, or for the first time - function renderView(delta, viewName) { - ignoreWindowResize++; - - // if viewName is changing, destroy the old view - if (currentView && viewName && currentView.name !== viewName) { - header.deactivateButton(currentView.name); - freezeContentHeight(); // prevent a scroll jump when view element is removed - if (currentView.start) { // rendered before? - currentView.destroy(); - } - currentView.el.remove(); - currentView = null; - } - - // if viewName changed, or the view was never created, create a fresh view - if (!currentView && viewName) { - currentView = new fcViews[viewName](t); - currentView.el = $("
").appendTo(content); - header.activateButton(viewName); - } - - if (currentView) { - - // let the view determine what the delta means - if (delta) { - date = currentView.incrementDate(date, delta); - } - - // render or rerender the view - if ( - !currentView.start || // never rendered before - delta || // explicit date window change - !date.isWithin(currentView.intervalStart, currentView.intervalEnd) // implicit date window change - ) { - if (elementVisible()) { - - freezeContentHeight(); - if (currentView.start) { // rendered before? - currentView.destroy(); - } - currentView.render(date); - unfreezeContentHeight(); - - // need to do this after View::render, so dates are calculated - updateTitle(); - updateTodayButton(); - - getAndRenderEvents(); - } - } - } - - unfreezeContentHeight(); // undo any lone freezeContentHeight calls - ignoreWindowResize--; - } - - - - // Resizing - // ----------------------------------------------------------------------------------- - - - t.getSuggestedViewHeight = function() { - if (suggestedViewHeight === undefined) { - calcSize(); - } - return suggestedViewHeight; - }; - - - t.isHeightAuto = function() { - return options.contentHeight === 'auto' || options.height === 'auto'; - }; - - - function updateSize(shouldRecalc) { - if (elementVisible()) { - - if (shouldRecalc) { - _calcSize(); - } - - ignoreWindowResize++; - currentView.updateSize(true); // isResize=true. will poll getSuggestedViewHeight() and isHeightAuto() - ignoreWindowResize--; - - return true; // signal success - } - } - - - function calcSize() { - if (elementVisible()) { - _calcSize(); - } - } - - - function _calcSize() { // assumes elementVisible - if (typeof options.contentHeight === 'number') { // exists and not 'auto' - suggestedViewHeight = options.contentHeight; - } - else if (typeof options.height === 'number') { // exists and not 'auto' - suggestedViewHeight = options.height - (headerElement ? headerElement.outerHeight(true) : 0); - } - else { - suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5)); - } - } - - - function windowResize(ev) { - if ( - !ignoreWindowResize && - ev.target === window && // so we don't process jqui "resize" events that have bubbled up - currentView.start // view has already been rendered - ) { - if (updateSize(true)) { - currentView.trigger('windowResize', _element); - } - } - } - - - - /* Event Fetching/Rendering - -----------------------------------------------------------------------------*/ - // TODO: going forward, most of this stuff should be directly handled by the view - - - function refetchEvents() { // can be called as an API method - destroyEvents(); // so that events are cleared before user starts waiting for AJAX - fetchAndRenderEvents(); - } - - - function renderEvents() { // destroys old events if previously rendered - if (elementVisible()) { - freezeContentHeight(); - currentView.destroyEvents(); // no performance cost if never rendered - currentView.renderEvents(events); - unfreezeContentHeight(); - } - } - - - function destroyEvents() { - freezeContentHeight(); - currentView.destroyEvents(); - unfreezeContentHeight(); - } - - - function getAndRenderEvents() { - if (!options.lazyFetching || isFetchNeeded(currentView.start, currentView.end)) { - fetchAndRenderEvents(); - } - else { - renderEvents(); - } - } - - - function fetchAndRenderEvents() { - fetchEvents(currentView.start, currentView.end); - // ... will call reportEvents - // ... which will call renderEvents - } - - - // called when event data arrives - function reportEvents(_events) { - events = _events; - renderEvents(); - } - - - // called when a single event's data has been changed - function reportEventChange() { - renderEvents(); - } - - - - /* Header Updating - -----------------------------------------------------------------------------*/ - - - function updateTitle() { - header.updateTitle(currentView.title); - } - - - function updateTodayButton() { - var now = t.getNow(); - if (now.isWithin(currentView.intervalStart, currentView.intervalEnd)) { - header.disableButton('today'); - } - else { - header.enableButton('today'); - } - } - - - - /* Selection - -----------------------------------------------------------------------------*/ - - - function select(start, end) { - - start = t.moment(start); - if (end) { - end = t.moment(end); - } - else if (start.hasTime()) { - end = start.clone().add(t.defaultTimedEventDuration); - } - else { - end = start.clone().add(t.defaultAllDayEventDuration); - } - - currentView.select(start, end); - } - - - function unselect() { // safe to be called before renderView - if (currentView) { - currentView.unselect(); - } - } - - - - /* Date - -----------------------------------------------------------------------------*/ - - - function prev() { - renderView(-1); - } - - - function next() { - renderView(1); - } - - - function prevYear() { - date.add(-1, 'years'); - renderView(); - } - - - function nextYear() { - date.add(1, 'years'); - renderView(); - } - - - function today() { - date = t.getNow(); - renderView(); - } - - - function gotoDate(dateInput) { - date = t.moment(dateInput); - renderView(); - } - - - function incrementDate(delta) { - date.add(moment.duration(delta)); - renderView(); - } - - - // Forces navigation to a view for the given date. - // `viewName` can be a specific view name or a generic one like "week" or "day". - function zoomTo(newDate, viewName) { - var viewStr; - var match; - - if (!viewName || fcViews[viewName] === undefined) { // a general view name, or "auto" - viewName = viewName || 'day'; - viewStr = header.getViewsWithButtons().join(' '); // space-separated string of all the views in the header - - // try to match a general view name, like "week", against a specific one, like "agendaWeek" - match = viewStr.match(new RegExp('\\w+' + capitaliseFirstLetter(viewName))); - - // fall back to the day view being used in the header - if (!match) { - match = viewStr.match(/\w+Day/); - } - - viewName = match ? match[0] : 'agendaDay'; // fall back to agendaDay - } - - date = newDate; - changeView(viewName); - } - - - function getDate() { - return date.clone(); - } - - - - /* Height "Freezing" - -----------------------------------------------------------------------------*/ - - - function freezeContentHeight() { - content.css({ - width: '100%', - height: content.height(), - overflow: 'hidden' - }); - } - - - function unfreezeContentHeight() { - content.css({ - width: '', - height: '', - overflow: '' - }); - } - - - - /* Misc - -----------------------------------------------------------------------------*/ - - - function getCalendar() { - return t; - } - - - function getView() { - return currentView; - } - - - function option(name, value) { - if (value === undefined) { - return options[name]; - } - if (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') { - options[name] = value; - updateSize(true); // true = allow recalculation of height - } - } - - - function trigger(name, thisObj) { - if (options[name]) { - return options[name].apply( - thisObj || _element, - Array.prototype.slice.call(arguments, 2) - ); - } - } - -} - -;; - -/* Top toolbar area with buttons and title -----------------------------------------------------------------------------------------------------------------------*/ -// TODO: rename all header-related things to "toolbar" - -function Header(calendar, options) { - var t = this; - - // exports - t.render = render; - t.destroy = destroy; - t.updateTitle = updateTitle; - t.activateButton = activateButton; - t.deactivateButton = deactivateButton; - t.disableButton = disableButton; - t.enableButton = enableButton; - t.getViewsWithButtons = getViewsWithButtons; - - // locals - var el = $(); - var viewsWithButtons = []; - var tm; - - - function render() { - var sections = options.header; - - tm = options.theme ? 'ui' : 'fc'; - - if (sections) { - el = $("
") - .append(renderSection('left')) - .append(renderSection('right')) - .append(renderSection('center')) - .append('
'); - - return el; - } - } - - - function destroy() { - el.remove(); - } - - - function renderSection(position) { - var sectionEl = $('
'); - var buttonStr = options.header[position]; - - if (buttonStr) { - $.each(buttonStr.split(' '), function(i) { - var groupChildren = $(); - var isOnlyButtons = true; - var groupEl; - - $.each(this.split(','), function(j, buttonName) { - var buttonClick; - var themeIcon; - var normalIcon; - var defaultText; - var customText; - var innerHtml; - var classes; - var button; - - if (buttonName == 'title') { - groupChildren = groupChildren.add($('

 

')); // we always want it to take up height - isOnlyButtons = false; - } - else { - if (calendar[buttonName]) { // a calendar method - buttonClick = function() { - calendar[buttonName](); - }; - } - else if (fcViews[buttonName]) { // a view name - buttonClick = function() { - calendar.changeView(buttonName); - }; - viewsWithButtons.push(buttonName); - } - if (buttonClick) { - - // smartProperty allows different text per view button (ex: "Agenda Week" vs "Basic Week") - themeIcon = smartProperty(options.themeButtonIcons, buttonName); - normalIcon = smartProperty(options.buttonIcons, buttonName); - defaultText = smartProperty(options.defaultButtonText, buttonName); - customText = smartProperty(options.buttonText, buttonName); - - if (customText) { - innerHtml = htmlEscape(customText); - } - else if (themeIcon && options.theme) { - innerHtml = ""; - } - else if (normalIcon && !options.theme) { - innerHtml = ""; - } - else { - innerHtml = htmlEscape(defaultText || buttonName); - } - - classes = [ - 'fc-' + buttonName + '-button', - tm + '-button', - tm + '-state-default' - ]; - - button = $( // type="button" so that it doesn't submit a form - '' - ) - .click(function() { - // don't process clicks for disabled buttons - if (!button.hasClass(tm + '-state-disabled')) { - - buttonClick(); - - // after the click action, if the button becomes the "active" tab, or disabled, - // it should never have a hover class, so remove it now. - if ( - button.hasClass(tm + '-state-active') || - button.hasClass(tm + '-state-disabled') - ) { - button.removeClass(tm + '-state-hover'); - } - } - }) - .mousedown(function() { - // the *down* effect (mouse pressed in). - // only on buttons that are not the "active" tab, or disabled - button - .not('.' + tm + '-state-active') - .not('.' + tm + '-state-disabled') - .addClass(tm + '-state-down'); - }) - .mouseup(function() { - // undo the *down* effect - button.removeClass(tm + '-state-down'); - }) - .hover( - function() { - // the *hover* effect. - // only on buttons that are not the "active" tab, or disabled - button - .not('.' + tm + '-state-active') - .not('.' + tm + '-state-disabled') - .addClass(tm + '-state-hover'); - }, - function() { - // undo the *hover* effect - button - .removeClass(tm + '-state-hover') - .removeClass(tm + '-state-down'); // if mouseleave happens before mouseup - } - ); - - groupChildren = groupChildren.add(button); - } - } - }); - - if (isOnlyButtons) { - groupChildren - .first().addClass(tm + '-corner-left').end() - .last().addClass(tm + '-corner-right').end(); - } - - if (groupChildren.length > 1) { - groupEl = $('
'); - if (isOnlyButtons) { - groupEl.addClass('fc-button-group'); - } - groupEl.append(groupChildren); - sectionEl.append(groupEl); - } - else { - sectionEl.append(groupChildren); // 1 or 0 children - } - }); - } - - return sectionEl; - } - - - function updateTitle(text) { - el.find('h2').text(text); - } - - - function activateButton(buttonName) { - el.find('.fc-' + buttonName + '-button') - .addClass(tm + '-state-active'); - } - - - function deactivateButton(buttonName) { - el.find('.fc-' + buttonName + '-button') - .removeClass(tm + '-state-active'); - } - - - function disableButton(buttonName) { - el.find('.fc-' + buttonName + '-button') - .attr('disabled', 'disabled') - .addClass(tm + '-state-disabled'); - } - - - function enableButton(buttonName) { - el.find('.fc-' + buttonName + '-button') - .removeAttr('disabled') - .removeClass(tm + '-state-disabled'); - } - - - function getViewsWithButtons() { - return viewsWithButtons; - } - -} - -;; - -fc.sourceNormalizers = []; -fc.sourceFetchers = []; - -var ajaxDefaults = { - dataType: 'json', - cache: false -}; - -var eventGUID = 1; - - -function EventManager(options) { // assumed to be a calendar - var t = this; - - - // exports - t.isFetchNeeded = isFetchNeeded; - t.fetchEvents = fetchEvents; - t.addEventSource = addEventSource; - t.removeEventSource = removeEventSource; - t.updateEvent = updateEvent; - t.renderEvent = renderEvent; - t.removeEvents = removeEvents; - t.clientEvents = clientEvents; - t.mutateEvent = mutateEvent; - - - // imports - var trigger = t.trigger; - var getView = t.getView; - var reportEvents = t.reportEvents; - var getEventEnd = t.getEventEnd; - - - // locals - var stickySource = { events: [] }; - var sources = [ stickySource ]; - var rangeStart, rangeEnd; - var currentFetchID = 0; - var pendingSourceCnt = 0; - var loadingLevel = 0; - var cache = []; - - - $.each( - (options.events ? [ options.events ] : []).concat(options.eventSources || []), - function(i, sourceInput) { - var source = buildEventSource(sourceInput); - if (source) { - sources.push(source); - } - } - ); - - - - /* Fetching - -----------------------------------------------------------------------------*/ - - - function isFetchNeeded(start, end) { - return !rangeStart || // nothing has been fetched yet? - // or, a part of the new range is outside of the old range? (after normalizing) - start.clone().stripZone() < rangeStart.clone().stripZone() || - end.clone().stripZone() > rangeEnd.clone().stripZone(); - } - - - function fetchEvents(start, end) { - rangeStart = start; - rangeEnd = end; - cache = []; - var fetchID = ++currentFetchID; - var len = sources.length; - pendingSourceCnt = len; - for (var i=0; i cells, find the cell with the largest natural width and set the widths of all the -// cells to be that width. -// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline -function matchCellWidths(els) { - var maxInnerWidth = 0; - - els.find('> *').each(function(i, innerEl) { - var innerWidth = $(innerEl).outerWidth(); - if (innerWidth > maxInnerWidth) { - maxInnerWidth = innerWidth; - } - }); - - maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance - - els.width(maxInnerWidth); - - return maxInnerWidth; -} - - -// Turns a container element into a scroller if its contents is taller than the allotted height. -// Returns true if the element is now a scroller, false otherwise. -// NOTE: this method is best because it takes weird zooming dimensions into account -function setPotentialScroller(containerEl, height) { - containerEl.height(height).addClass('fc-scroller'); - - // are scrollbars needed? - if (containerEl[0].scrollHeight - 1 > containerEl[0].clientHeight) { // !!! -1 because IE is often off-by-one :( - return true; - } - - unsetScroller(containerEl); // undo - return false; -} - - -// Takes an element that might have been a scroller, and turns it back into a normal element. -function unsetScroller(containerEl) { - containerEl.height('').removeClass('fc-scroller'); -} - - -/* General DOM Utilities -----------------------------------------------------------------------------------------------------------------------*/ - - -// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51 -function getScrollParent(el) { - var position = el.css('position'), - scrollParent = el.parents().filter(function() { - var parent = $(this); - return (/(auto|scroll)/).test( - parent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x') - ); - }).eq(0); - - return position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent; -} - - -// Given a container element, return an object with the pixel values of the left/right scrollbars. -// Left scrollbars might occur on RTL browsers (IE maybe?) but I have not tested. -// PREREQUISITE: container element must have a single child with display:block -function getScrollbarWidths(container) { - var containerLeft = container.offset().left; - var containerRight = containerLeft + container.width(); - var inner = container.children(); - var innerLeft = inner.offset().left; - var innerRight = innerLeft + inner.outerWidth(); - - return { - left: innerLeft - containerLeft, - right: containerRight - innerRight - }; -} - - -// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac) -function isPrimaryMouseButton(ev) { - return ev.which == 1 && !ev.ctrlKey; -} - - -/* FullCalendar-specific Misc Utilities -----------------------------------------------------------------------------------------------------------------------*/ - - -// Creates a basic segment with the intersection of the two ranges. Returns undefined if no intersection. -// Expects all dates to be normalized to the same timezone beforehand. -function intersectionToSeg(subjectStart, subjectEnd, intervalStart, intervalEnd) { - var segStart, segEnd; - var isStart, isEnd; - - if (subjectEnd > intervalStart && subjectStart < intervalEnd) { // in bounds at all? - - if (subjectStart >= intervalStart) { - segStart = subjectStart.clone(); - isStart = true; - } - else { - segStart = intervalStart.clone(); - isStart = false; - } - - if (subjectEnd <= intervalEnd) { - segEnd = subjectEnd.clone(); - isEnd = true; - } - else { - segEnd = intervalEnd.clone(); - isEnd = false; - } - - return { - start: segStart, - end: segEnd, - isStart: isStart, - isEnd: isEnd - }; - } -} - - -function smartProperty(obj, name) { // get a camel-cased/namespaced property of an object - obj = obj || {}; - if (obj[name] !== undefined) { - return obj[name]; - } - var parts = name.split(/(?=[A-Z])/), - i = parts.length - 1, res; - for (; i>=0; i--) { - res = obj[parts[i].toLowerCase()]; - if (res !== undefined) { - return res; - } - } - return obj['default']; -} - - -/* Date Utilities -----------------------------------------------------------------------------------------------------------------------*/ - -var dayIDs = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ]; - - -// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time. -// Moments will have their timezones normalized. -function dayishDiff(a, b) { - return moment.duration({ - days: a.clone().stripTime().diff(b.clone().stripTime(), 'days'), - ms: a.time() - b.time() - }); -} - - -function isNativeDate(input) { - return Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date; -} - - -function dateCompare(a, b) { // works with Moments and native Dates - return a - b; -} - - -/* General Utilities -----------------------------------------------------------------------------------------------------------------------*/ - -fc.applyAll = applyAll; // export - - -// Create an object that has the given prototype. Just like Object.create -function createObject(proto) { - var f = function() {}; - f.prototype = proto; - return new f(); -} - - -// Copies specifically-owned (non-protoype) properties of `b` onto `a`. -// FYI, $.extend would copy *all* properties of `b` onto `a`. -function extend(a, b) { - for (var i in b) { - if (b.hasOwnProperty(i)) { - a[i] = b[i]; - } - } -} - - -function applyAll(functions, thisObj, args) { - if ($.isFunction(functions)) { - functions = [ functions ]; - } - if (functions) { - var i; - var ret; - for (i=0; i/g, '>') - .replace(/'/g, ''') - .replace(/"/g, '"') - .replace(/\n/g, '
'); -} - - -function stripHtmlEntities(text) { - return text.replace(/&.*?;/g, ''); -} - - -function capitaliseFirstLetter(str) { - return str.charAt(0).toUpperCase() + str.slice(1); -} - - -// Returns a function, that, as long as it continues to be invoked, will not -// be triggered. The function will be called after it stops being called for -// N milliseconds. -// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714 -function debounce(func, wait) { - var timeoutId; - var args; - var context; - var timestamp; // of most recent call - var later = function() { - var last = +new Date() - timestamp; - if (last < wait && last > 0) { - timeoutId = setTimeout(later, wait - last); - } - else { - timeoutId = null; - func.apply(context, args); - if (!timeoutId) { - context = args = null; - } - } - }; - - return function() { - context = this; - args = arguments; - timestamp = +new Date(); - if (!timeoutId) { - timeoutId = setTimeout(later, wait); - } - }; -} - -;; - -var ambigDateOfMonthRegex = /^\s*\d{4}-\d\d$/; -var ambigTimeOrZoneRegex = - /^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/; - - -// Creating -// ------------------------------------------------------------------------------------------------- - -// Creates a new moment, similar to the vanilla moment(...) constructor, but with -// extra features (ambiguous time, enhanced formatting). When gived an existing moment, -// it will function as a clone (and retain the zone of the moment). Anything else will -// result in a moment in the local zone. -fc.moment = function() { - return makeMoment(arguments); -}; - -// Sames as fc.moment, but forces the resulting moment to be in the UTC timezone. -fc.moment.utc = function() { - var mom = makeMoment(arguments, true); - - // Force it into UTC because makeMoment doesn't guarantee it. - if (mom.hasTime()) { // don't give ambiguously-timed moments a UTC zone - mom.utc(); - } - - return mom; -}; - -// Same as fc.moment, but when given an ISO8601 string, the timezone offset is preserved. -// ISO8601 strings with no timezone offset will become ambiguously zoned. -fc.moment.parseZone = function() { - return makeMoment(arguments, true, true); -}; - -// Builds an FCMoment from args. When given an existing moment, it clones. When given a native -// Date, or called with no arguments (the current time), the resulting moment will be local. -// Anything else needs to be "parsed" (a string or an array), and will be affected by: -// parseAsUTC - if there is no zone information, should we parse the input in UTC? -// parseZone - if there is zone information, should we force the zone of the moment? -function makeMoment(args, parseAsUTC, parseZone) { - var input = args[0]; - var isSingleString = args.length == 1 && typeof input === 'string'; - var isAmbigTime; - var isAmbigZone; - var ambigMatch; - var output; // an object with fields for the new FCMoment object - - if (moment.isMoment(input)) { - output = moment.apply(null, args); // clone it - - // the ambig properties have not been preserved in the clone, so reassign them - if (input._ambigTime) { - output._ambigTime = true; - } - if (input._ambigZone) { - output._ambigZone = true; - } - } - else if (isNativeDate(input) || input === undefined) { - output = moment.apply(null, args); // will be local - } - else { // "parsing" is required - isAmbigTime = false; - isAmbigZone = false; - - if (isSingleString) { - if (ambigDateOfMonthRegex.test(input)) { - // accept strings like '2014-05', but convert to the first of the month - input += '-01'; - args = [ input ]; // for when we pass it on to moment's constructor - isAmbigTime = true; - isAmbigZone = true; - } - else if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) { - isAmbigTime = !ambigMatch[5]; // no time part? - isAmbigZone = true; - } - } - else if ($.isArray(input)) { - // arrays have no timezone information, so assume ambiguous zone - isAmbigZone = true; - } - // otherwise, probably a string with a format - - if (parseAsUTC) { - output = moment.utc.apply(moment, args); - } - else { - output = moment.apply(null, args); - } - - if (isAmbigTime) { - output._ambigTime = true; - output._ambigZone = true; // ambiguous time always means ambiguous zone - } - else if (parseZone) { // let's record the inputted zone somehow - if (isAmbigZone) { - output._ambigZone = true; - } - else if (isSingleString) { - output.zone(input); // if not a valid zone, will assign UTC - } - } - } - - return new FCMoment(output); -} - -// Our subclass of Moment. -// Accepts an object with the internal Moment properties that should be copied over to -// `this` object (most likely another Moment object). The values in this data must not -// be referenced by anything else (two moments sharing a Date object for example). -function FCMoment(internalData) { - extend(this, internalData); -} - -// Chain the prototype to Moment's -FCMoment.prototype = createObject(moment.fn); - -// We need this because Moment's implementation won't create an FCMoment, -// nor will it copy over the ambig flags. -FCMoment.prototype.clone = function() { - return makeMoment([ this ]); -}; - - -// Time-of-day -// ------------------------------------------------------------------------------------------------- - -// GETTER -// Returns a Duration with the hours/minutes/seconds/ms values of the moment. -// If the moment has an ambiguous time, a duration of 00:00 will be returned. -// -// SETTER -// You can supply a Duration, a Moment, or a Duration-like argument. -// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous. -FCMoment.prototype.time = function(time) { - if (time == null) { // getter - return moment.duration({ - hours: this.hours(), - minutes: this.minutes(), - seconds: this.seconds(), - milliseconds: this.milliseconds() - }); - } - else { // setter - - delete this._ambigTime; // mark that the moment now has a time - - if (!moment.isDuration(time) && !moment.isMoment(time)) { - time = moment.duration(time); - } - - // The day value should cause overflow (so 24 hours becomes 00:00:00 of next day). - // Only for Duration times, not Moment times. - var dayHours = 0; - if (moment.isDuration(time)) { - dayHours = Math.floor(time.asDays()) * 24; - } - - // We need to set the individual fields. - // Can't use startOf('day') then add duration. In case of DST at start of day. - return this.hours(dayHours + time.hours()) - .minutes(time.minutes()) - .seconds(time.seconds()) - .milliseconds(time.milliseconds()); - } -}; - -// Converts the moment to UTC, stripping out its time-of-day and timezone offset, -// but preserving its YMD. A moment with a stripped time will display no time -// nor timezone offset when .format() is called. -FCMoment.prototype.stripTime = function() { - var a = this.toArray(); // year,month,date,hours,minutes,seconds as an array - - // set the internal UTC flag - moment.fn.utc.call(this); // call the original method, because we don't want to affect _ambigZone - - this.year(a[0]) // TODO: find a way to do this in one shot - .month(a[1]) - .date(a[2]) - .hours(0) - .minutes(0) - .seconds(0) - .milliseconds(0); - - // Mark the time as ambiguous. This needs to happen after the .utc() call, which calls .zone(), which - // clears all ambig flags. Same concept with the .year/month/date calls in the case of moment-timezone. - this._ambigTime = true; - this._ambigZone = true; // if ambiguous time, also ambiguous timezone offset - - return this; // for chaining -}; - -// Returns if the moment has a non-ambiguous time (boolean) -FCMoment.prototype.hasTime = function() { - return !this._ambigTime; -}; - - -// Timezone -// ------------------------------------------------------------------------------------------------- - -// Converts the moment to UTC, stripping out its timezone offset, but preserving its -// YMD and time-of-day. A moment with a stripped timezone offset will display no -// timezone offset when .format() is called. -FCMoment.prototype.stripZone = function() { - var a = this.toArray(); // year,month,date,hours,minutes,seconds as an array - var wasAmbigTime = this._ambigTime; - - moment.fn.utc.call(this); // set the internal UTC flag - - this.year(a[0]) // TODO: find a way to do this in one shot - .month(a[1]) - .date(a[2]) - .hours(a[3]) - .minutes(a[4]) - .seconds(a[5]) - .milliseconds(a[6]); - - if (wasAmbigTime) { - // the above call to .utc()/.zone() unfortunately clears the ambig flags, so reassign - this._ambigTime = true; - } - - // Mark the zone as ambiguous. This needs to happen after the .utc() call, which calls .zone(), which - // clears all ambig flags. Same concept with the .year/month/date calls in the case of moment-timezone. - this._ambigZone = true; - - return this; // for chaining -}; - -// Returns of the moment has a non-ambiguous timezone offset (boolean) -FCMoment.prototype.hasZone = function() { - return !this._ambigZone; -}; - -// this method implicitly marks a zone -FCMoment.prototype.zone = function(tzo) { - - if (tzo != null) { - // FYI, the delete statements need to be before the .zone() call or else chaos ensues - // for reasons I don't understand. - delete this._ambigTime; - delete this._ambigZone; - } - - return moment.fn.zone.apply(this, arguments); -}; - -// this method implicitly marks a zone -FCMoment.prototype.local = function() { - var a = this.toArray(); // year,month,date,hours,minutes,seconds as an array - var wasAmbigZone = this._ambigZone; - - // will happen anyway via .local()/.zone(), but don't want to rely on internal implementation - delete this._ambigTime; - delete this._ambigZone; - - moment.fn.local.apply(this, arguments); - - if (wasAmbigZone) { - // If the moment was ambiguously zoned, the date fields were stored as UTC. - // We want to preserve these, but in local time. - this.year(a[0]) // TODO: find a way to do this in one shot - .month(a[1]) - .date(a[2]) - .hours(a[3]) - .minutes(a[4]) - .seconds(a[5]) - .milliseconds(a[6]); - } - - return this; // for chaining -}; - -// this method implicitly marks a zone -FCMoment.prototype.utc = function() { - - // will happen anyway via .local()/.zone(), but don't want to rely on internal implementation - delete this._ambigTime; - delete this._ambigZone; - - return moment.fn.utc.apply(this, arguments); -}; - - -// Formatting -// ------------------------------------------------------------------------------------------------- - -FCMoment.prototype.format = function() { - if (arguments[0]) { - return formatDate(this, arguments[0]); // our extended formatting - } - if (this._ambigTime) { - return momentFormat(this, 'YYYY-MM-DD'); - } - if (this._ambigZone) { - return momentFormat(this, 'YYYY-MM-DD[T]HH:mm:ss'); - } - return momentFormat(this); // default moment original formatting -}; - -FCMoment.prototype.toISOString = function() { - if (this._ambigTime) { - return momentFormat(this, 'YYYY-MM-DD'); - } - if (this._ambigZone) { - return momentFormat(this, 'YYYY-MM-DD[T]HH:mm:ss'); - } - return moment.fn.toISOString.apply(this, arguments); -}; - - -// Querying -// ------------------------------------------------------------------------------------------------- - -// Is the moment within the specified range? `end` is exclusive. -FCMoment.prototype.isWithin = function(start, end) { - var a = commonlyAmbiguate([ this, start, end ]); - return a[0] >= a[1] && a[0] < a[2]; -}; - -// When isSame is called with units, timezone ambiguity is normalized before the comparison happens. -// If no units are specified, the two moments must be identically the same, with matching ambig flags. -FCMoment.prototype.isSame = function(input, units) { - var a; - - if (units) { - a = commonlyAmbiguate([ this, input ], true); // normalize timezones but don't erase times - return moment.fn.isSame.call(a[0], a[1], units); - } - else { - input = fc.moment.parseZone(input); // normalize input - return moment.fn.isSame.call(this, input) && - Boolean(this._ambigTime) === Boolean(input._ambigTime) && - Boolean(this._ambigZone) === Boolean(input._ambigZone); - } -}; - -// Make these query methods work with ambiguous moments -$.each([ - 'isBefore', - 'isAfter' -], function(i, methodName) { - FCMoment.prototype[methodName] = function(input, units) { - var a = commonlyAmbiguate([ this, input ]); - return moment.fn[methodName].call(a[0], a[1], units); - }; -}); - - -// Misc Internals -// ------------------------------------------------------------------------------------------------- - -// given an array of moment-like inputs, return a parallel array w/ moments similarly ambiguated. -// for example, of one moment has ambig time, but not others, all moments will have their time stripped. -// set `preserveTime` to `true` to keep times, but only normalize zone ambiguity. -function commonlyAmbiguate(inputs, preserveTime) { - var outputs = []; - var anyAmbigTime = false; - var anyAmbigZone = false; - var i; - - for (i=0; i "MMMM D YYYY" - formatStr = localeData.longDateFormat(formatStr) || formatStr; - // BTW, this is not important for `formatDate` because it is impossible to put custom tokens - // or non-zero areas in Moment's localized format strings. - - separator = separator || ' - '; - - return formatRangeWithChunks( - date1, - date2, - getFormatStringChunks(formatStr), - separator, - isRTL - ); -} -fc.formatRange = formatRange; // expose - - -function formatRangeWithChunks(date1, date2, chunks, separator, isRTL) { - var chunkStr; // the rendering of the chunk - var leftI; - var leftStr = ''; - var rightI; - var rightStr = ''; - var middleI; - var middleStr1 = ''; - var middleStr2 = ''; - var middleStr = ''; - - // Start at the leftmost side of the formatting string and continue until you hit a token - // that is not the same between dates. - for (leftI=0; leftIleftI; rightI--) { - chunkStr = formatSimilarChunk(date1, date2, chunks[rightI]); - if (chunkStr === false) { - break; - } - rightStr = chunkStr + rightStr; - } - - // The area in the middle is different for both of the dates. - // Collect them distinctly so we can jam them together later. - for (middleI=leftI; middleI<=rightI; middleI++) { - middleStr1 += formatDateWithChunk(date1, chunks[middleI]); - middleStr2 += formatDateWithChunk(date2, chunks[middleI]); - } - - if (middleStr1 || middleStr2) { - if (isRTL) { - middleStr = middleStr2 + separator + middleStr1; - } - else { - middleStr = middleStr1 + separator + middleStr2; - } - } - - return leftStr + middleStr + rightStr; -} - - -var similarUnitMap = { - Y: 'year', - M: 'month', - D: 'day', // day of month - d: 'day', // day of week - // prevents a separator between anything time-related... - A: 'second', // AM/PM - a: 'second', // am/pm - T: 'second', // A/P - t: 'second', // a/p - H: 'second', // hour (24) - h: 'second', // hour (12) - m: 'second', // minute - s: 'second' // second -}; -// TODO: week maybe? - - -// Given a formatting chunk, and given that both dates are similar in the regard the -// formatting chunk is concerned, format date1 against `chunk`. Otherwise, return `false`. -function formatSimilarChunk(date1, date2, chunk) { - var token; - var unit; - - if (typeof chunk === 'string') { // a literal string - return chunk; - } - else if ((token = chunk.token)) { - unit = similarUnitMap[token.charAt(0)]; - // are the dates the same for this unit of measurement? - if (unit && date1.isSame(date2, unit)) { - return momentFormat(date1, token); // would be the same if we used `date2` - // BTW, don't support custom tokens - } - } - - return false; // the chunk is NOT the same for the two dates - // BTW, don't support splitting on non-zero areas -} - - -// Chunking Utils -// ------------------------------------------------------------------------------------------------- - - -var formatStringChunkCache = {}; - - -function getFormatStringChunks(formatStr) { - if (formatStr in formatStringChunkCache) { - return formatStringChunkCache[formatStr]; - } - return (formatStringChunkCache[formatStr] = chunkFormatString(formatStr)); -} - - -// Break the formatting string into an array of chunks -function chunkFormatString(formatStr) { - var chunks = []; - var chunker = /\[([^\]]*)\]|\(([^\)]*)\)|(LT|(\w)\4*o?)|([^\w\[\(]+)/g; // TODO: more descrimination - var match; - - while ((match = chunker.exec(formatStr))) { - if (match[1]) { // a literal string inside [ ... ] - chunks.push(match[1]); - } - else if (match[2]) { // non-zero formatting inside ( ... ) - chunks.push({ maybe: chunkFormatString(match[2]) }); - } - else if (match[3]) { // a formatting token - chunks.push({ token: match[3] }); - } - else if (match[5]) { // an unenclosed literal string - chunks.push(match[5]); - } - } - - return chunks; -} - -;; - -/* A rectangular panel that is absolutely positioned over other content ------------------------------------------------------------------------------------------------------------------------- -Options: - - className (string) - - content (HTML string or jQuery element set) - - parentEl - - top - - left - - right (the x coord of where the right edge should be. not a "CSS" right) - - autoHide (boolean) - - show (callback) - - hide (callback) -*/ - -function Popover(options) { - this.options = options || {}; -} - - -Popover.prototype = { - - isHidden: true, - options: null, - el: null, // the container element for the popover. generated by this object - documentMousedownProxy: null, // document mousedown handler bound to `this` - margin: 10, // the space required between the popover and the edges of the scroll container - - - // Shows the popover on the specified position. Renders it if not already - show: function() { - if (this.isHidden) { - if (!this.el) { - this.render(); - } - this.el.show(); - this.position(); - this.isHidden = false; - this.trigger('show'); - } - }, - - - // Hides the popover, through CSS, but does not remove it from the DOM - hide: function() { - if (!this.isHidden) { - this.el.hide(); - this.isHidden = true; - this.trigger('hide'); - } - }, - - - // Creates `this.el` and renders content inside of it - render: function() { - var _this = this; - var options = this.options; - - this.el = $('
') - .addClass(options.className || '') - .css({ - // position initially to the top left to avoid creating scrollbars - top: 0, - left: 0 - }) - .append(options.content) - .appendTo(options.parentEl); - - // when a click happens on anything inside with a 'fc-close' className, hide the popover - this.el.on('click', '.fc-close', function() { - _this.hide(); - }); - - if (options.autoHide) { - $(document).on('mousedown', this.documentMousedownProxy = $.proxy(this, 'documentMousedown')); - } - }, - - - // Triggered when the user clicks *anywhere* in the document, for the autoHide feature - documentMousedown: function(ev) { - // only hide the popover if the click happened outside the popover - if (this.el && !$(ev.target).closest(this.el).length) { - this.hide(); - } - }, - - - // Hides and unregisters any handlers - destroy: function() { - this.hide(); - - if (this.el) { - this.el.remove(); - this.el = null; - } - - $(document).off('mousedown', this.documentMousedownProxy); - }, - - - // Positions the popover optimally, using the top/left/right options - position: function() { - var options = this.options; - var origin = this.el.offsetParent().offset(); - var width = this.el.outerWidth(); - var height = this.el.outerHeight(); - var windowEl = $(window); - var viewportEl = getScrollParent(this.el); - var viewportTop; - var viewportLeft; - var viewportOffset; - var top; // the "position" (not "offset") values for the popover - var left; // - - // compute top and left - top = options.top || 0; - if (options.left !== undefined) { - left = options.left; - } - else if (options.right !== undefined) { - left = options.right - width; // derive the left value from the right value - } - else { - left = 0; - } - - if (viewportEl.is(window) || viewportEl.is(document)) { // normalize getScrollParent's result - viewportEl = windowEl; - viewportTop = 0; // the window is always at the top left - viewportLeft = 0; // (and .offset() won't work if called here) - } - else { - viewportOffset = viewportEl.offset(); - viewportTop = viewportOffset.top; - viewportLeft = viewportOffset.left; - } - - // if the window is scrolled, it causes the visible area to be further down - viewportTop += windowEl.scrollTop(); - viewportLeft += windowEl.scrollLeft(); - - // constrain to the view port. if constrained by two edges, give precedence to top/left - if (options.viewportConstrain !== false) { - top = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin); - top = Math.max(top, viewportTop + this.margin); - left = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin); - left = Math.max(left, viewportLeft + this.margin); - } - - this.el.css({ - top: top - origin.top, - left: left - origin.left - }); - }, - - - // Triggers a callback. Calls a function in the option hash of the same name. - // Arguments beyond the first `name` are forwarded on. - // TODO: better code reuse for this. Repeat code - trigger: function(name) { - if (this.options[name]) { - this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); - } - } - -}; - -;; - -/* A "coordinate map" converts pixel coordinates into an associated cell, which has an associated date ------------------------------------------------------------------------------------------------------------------------- -Common interface: - - CoordMap.prototype = { - build: function() {}, - getCell: function(x, y) {} - }; - -*/ - -/* Coordinate map for a grid component -----------------------------------------------------------------------------------------------------------------------*/ - -function GridCoordMap(grid) { - this.grid = grid; -} - - -GridCoordMap.prototype = { - - grid: null, // reference to the Grid - rows: null, // the top-to-bottom y coordinates. including the bottom of the last item - cols: null, // the left-to-right x coordinates. including the right of the last item - - containerEl: null, // container element that all coordinates are constrained to. optionally assigned - minX: null, - maxX: null, // exclusive - minY: null, - maxY: null, // exclusive - - - // Queries the grid for the coordinates of all the cells - build: function() { - this.grid.buildCoords( - this.rows = [], - this.cols = [] - ); - this.computeBounds(); - }, - - - // Given a coordinate of the document, gets the associated cell. If no cell is underneath, returns null - getCell: function(x, y) { - var cell = null; - var rows = this.rows; - var cols = this.cols; - var r = -1; - var c = -1; - var i; - - if (this.inBounds(x, y)) { - - for (i = 0; i < rows.length; i++) { - if (y >= rows[i][0] && y < rows[i][1]) { - r = i; - break; - } - } - - for (i = 0; i < cols.length; i++) { - if (x >= cols[i][0] && x < cols[i][1]) { - c = i; - break; - } - } - - if (r >= 0 && c >= 0) { - cell = { row: r, col: c }; - cell.grid = this.grid; - cell.date = this.grid.getCellDate(cell); - } - } - - return cell; - }, - - - // If there is a containerEl, compute the bounds into min/max values - computeBounds: function() { - var containerOffset; - - if (this.containerEl) { - containerOffset = this.containerEl.offset(); - this.minX = containerOffset.left; - this.maxX = containerOffset.left + this.containerEl.outerWidth(); - this.minY = containerOffset.top; - this.maxY = containerOffset.top + this.containerEl.outerHeight(); - } - }, - - - // Determines if the given coordinates are in bounds. If no `containerEl`, always true - inBounds: function(x, y) { - if (this.containerEl) { - return x >= this.minX && x < this.maxX && y >= this.minY && y < this.maxY; - } - return true; - } - -}; - - -/* Coordinate map that is a combination of multiple other coordinate maps -----------------------------------------------------------------------------------------------------------------------*/ - -function ComboCoordMap(coordMaps) { - this.coordMaps = coordMaps; -} - - -ComboCoordMap.prototype = { - - coordMaps: null, // an array of CoordMaps - - - // Builds all coordMaps - build: function() { - var coordMaps = this.coordMaps; - var i; - - for (i = 0; i < coordMaps.length; i++) { - coordMaps[i].build(); - } - }, - - - // Queries all coordMaps for the cell underneath the given coordinates, returning the first result - getCell: function(x, y) { - var coordMaps = this.coordMaps; - var cell = null; - var i; - - for (i = 0; i < coordMaps.length && !cell; i++) { - cell = coordMaps[i].getCell(x, y); - } - - return cell; - } - -}; - -;; - -/* Tracks mouse movements over a CoordMap and raises events about which cell the mouse is over. -----------------------------------------------------------------------------------------------------------------------*/ -// TODO: implement scrolling - -function DragListener(coordMap, options) { - this.coordMap = coordMap; - this.options = options || {}; -} - - -DragListener.prototype = { - - coordMap: null, - options: null, - - isListening: false, - isDragging: false, - - // the cell/date the mouse was over when listening started - origCell: null, - origDate: null, - - // the cell/date the mouse is over - cell: null, - date: null, - - // coordinates of the initial mousedown - mouseX0: null, - mouseY0: null, - - // handler attached to the document, bound to the DragListener's `this` - mousemoveProxy: null, - mouseupProxy: null, - - scrollEl: null, - scrollBounds: null, // { top, bottom, left, right } - scrollTopVel: null, // pixels per second - scrollLeftVel: null, // pixels per second - scrollIntervalId: null, // ID of setTimeout for scrolling animation loop - scrollHandlerProxy: null, // this-scoped function for handling when scrollEl is scrolled - - scrollSensitivity: 30, // pixels from edge for scrolling to start - scrollSpeed: 200, // pixels per second, at maximum speed - scrollIntervalMs: 50, // millisecond wait between scroll increment - - - // Call this when the user does a mousedown. Will probably lead to startListening - mousedown: function(ev) { - if (isPrimaryMouseButton(ev)) { - - ev.preventDefault(); // prevents native selection in most browsers - - this.startListening(ev); - - // start the drag immediately if there is no minimum distance for a drag start - if (!this.options.distance) { - this.startDrag(ev); - } - } - }, - - - // Call this to start tracking mouse movements - startListening: function(ev) { - var scrollParent; - var cell; - - if (!this.isListening) { - - // grab scroll container and attach handler - if (ev && this.options.scroll) { - scrollParent = getScrollParent($(ev.target)); - if (!scrollParent.is(window) && !scrollParent.is(document)) { - this.scrollEl = scrollParent; - - // scope to `this`, and use `debounce` to make sure rapid calls don't happen - this.scrollHandlerProxy = debounce($.proxy(this, 'scrollHandler'), 100); - this.scrollEl.on('scroll', this.scrollHandlerProxy); - } - } - - this.computeCoords(); // relies on `scrollEl` - - // get info on the initial cell, date, and coordinates - if (ev) { - cell = this.getCell(ev); - this.origCell = cell; - this.origDate = cell ? cell.date : null; - - this.mouseX0 = ev.pageX; - this.mouseY0 = ev.pageY; - } - - $(document) - .on('mousemove', this.mousemoveProxy = $.proxy(this, 'mousemove')) - .on('mouseup', this.mouseupProxy = $.proxy(this, 'mouseup')) - .on('selectstart', this.preventDefault); // prevents native selection in IE<=8 - - this.isListening = true; - this.trigger('listenStart', ev); - } - }, - - - // Recomputes the drag-critical positions of elements - computeCoords: function() { - this.coordMap.build(); - this.computeScrollBounds(); - }, - - - // Called when the user moves the mouse - mousemove: function(ev) { - var minDistance; - var distanceSq; // current distance from mouseX0/mouseY0, squared - - if (!this.isDragging) { // if not already dragging... - // then start the drag if the minimum distance criteria is met - minDistance = this.options.distance || 1; - distanceSq = Math.pow(ev.pageX - this.mouseX0, 2) + Math.pow(ev.pageY - this.mouseY0, 2); - if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem - this.startDrag(ev); - } - } - - if (this.isDragging) { - this.drag(ev); // report a drag, even if this mousemove initiated the drag - } - }, - - - // Call this to initiate a legitimate drag. - // This function is called internally from this class, but can also be called explicitly from outside - startDrag: function(ev) { - var cell; - - if (!this.isListening) { // startDrag must have manually initiated - this.startListening(); - } - - if (!this.isDragging) { - this.isDragging = true; - this.trigger('dragStart', ev); - - // report the initial cell the mouse is over - cell = this.getCell(ev); - if (cell) { - this.cellOver(cell, true); - } - } - }, - - - // Called while the mouse is being moved and when we know a legitimate drag is taking place - drag: function(ev) { - var cell; - - if (this.isDragging) { - cell = this.getCell(ev); - - if (!isCellsEqual(cell, this.cell)) { // a different cell than before? - if (this.cell) { - this.cellOut(); - } - if (cell) { - this.cellOver(cell); - } - } - - this.dragScroll(ev); // will possibly cause scrolling - } - }, - - - // Called when a the mouse has just moved over a new cell - cellOver: function(cell) { - this.cell = cell; - this.date = cell.date; - this.trigger('cellOver', cell, cell.date); - }, - - - // Called when the mouse has just moved out of a cell - cellOut: function() { - if (this.cell) { - this.trigger('cellOut', this.cell); - this.cell = null; - this.date = null; - } - }, - - - // Called when the user does a mouseup - mouseup: function(ev) { - this.stopDrag(ev); - this.stopListening(ev); - }, - - - // Called when the drag is over. Will not cause listening to stop however. - // A concluding 'cellOut' event will NOT be triggered. - stopDrag: function(ev) { - if (this.isDragging) { - this.stopScrolling(); - this.trigger('dragStop', ev); - this.isDragging = false; - } - }, - - - // Call this to stop listening to the user's mouse events - stopListening: function(ev) { - if (this.isListening) { - - // remove the scroll handler if there is a scrollEl - if (this.scrollEl) { - this.scrollEl.off('scroll', this.scrollHandlerProxy); - this.scrollHandlerProxy = null; - } - - $(document) - .off('mousemove', this.mousemoveProxy) - .off('mouseup', this.mouseupProxy) - .off('selectstart', this.preventDefault); - - this.mousemoveProxy = null; - this.mouseupProxy = null; - - this.isListening = false; - this.trigger('listenStop', ev); - - this.origCell = this.cell = null; - this.origDate = this.date = null; - } - }, - - - // Gets the cell underneath the coordinates for the given mouse event - getCell: function(ev) { - return this.coordMap.getCell(ev.pageX, ev.pageY); - }, - - - // Triggers a callback. Calls a function in the option hash of the same name. - // Arguments beyond the first `name` are forwarded on. - trigger: function(name) { - if (this.options[name]) { - this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); - } - }, - - - // Stops a given mouse event from doing it's native browser action. In our case, text selection. - preventDefault: function(ev) { - ev.preventDefault(); - }, - - - /* Scrolling - ------------------------------------------------------------------------------------------------------------------*/ - - - // Computes and stores the bounding rectangle of scrollEl - computeScrollBounds: function() { - var el = this.scrollEl; - var offset; - - if (el) { - offset = el.offset(); - this.scrollBounds = { - top: offset.top, - left: offset.left, - bottom: offset.top + el.outerHeight(), - right: offset.left + el.outerWidth() - }; - } - }, - - - // Called when the dragging is in progress and scrolling should be updated - dragScroll: function(ev) { - var sensitivity = this.scrollSensitivity; - var bounds = this.scrollBounds; - var topCloseness, bottomCloseness; - var leftCloseness, rightCloseness; - var topVel = 0; - var leftVel = 0; - - if (bounds) { // only scroll if scrollEl exists - - // compute closeness to edges. valid range is from 0.0 - 1.0 - topCloseness = (sensitivity - (ev.pageY - bounds.top)) / sensitivity; - bottomCloseness = (sensitivity - (bounds.bottom - ev.pageY)) / sensitivity; - leftCloseness = (sensitivity - (ev.pageX - bounds.left)) / sensitivity; - rightCloseness = (sensitivity - (bounds.right - ev.pageX)) / sensitivity; - - // translate vertical closeness into velocity. - // mouse must be completely in bounds for velocity to happen. - if (topCloseness >= 0 && topCloseness <= 1) { - topVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up - } - else if (bottomCloseness >= 0 && bottomCloseness <= 1) { - topVel = bottomCloseness * this.scrollSpeed; - } - - // translate horizontal closeness into velocity - if (leftCloseness >= 0 && leftCloseness <= 1) { - leftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left - } - else if (rightCloseness >= 0 && rightCloseness <= 1) { - leftVel = rightCloseness * this.scrollSpeed; - } - } - - this.setScrollVel(topVel, leftVel); - }, - - - // Sets the speed-of-scrolling for the scrollEl - setScrollVel: function(topVel, leftVel) { - - this.scrollTopVel = topVel; - this.scrollLeftVel = leftVel; - - this.constrainScrollVel(); // massages into realistic values - - // if there is non-zero velocity, and an animation loop hasn't already started, then START - if ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) { - this.scrollIntervalId = setInterval( - $.proxy(this, 'scrollIntervalFunc'), // scope to `this` - this.scrollIntervalMs - ); - } - }, - - - // Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way - constrainScrollVel: function() { - var el = this.scrollEl; - - if (this.scrollTopVel < 0) { // scrolling up? - if (el.scrollTop() <= 0) { // already scrolled all the way up? - this.scrollTopVel = 0; - } - } - else if (this.scrollTopVel > 0) { // scrolling down? - if (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) { // already scrolled all the way down? - this.scrollTopVel = 0; - } - } - - if (this.scrollLeftVel < 0) { // scrolling left? - if (el.scrollLeft() <= 0) { // already scrolled all the left? - this.scrollLeftVel = 0; - } - } - else if (this.scrollLeftVel > 0) { // scrolling right? - if (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) { // already scrolled all the way right? - this.scrollLeftVel = 0; - } - } - }, - - - // This function gets called during every iteration of the scrolling animation loop - scrollIntervalFunc: function() { - var el = this.scrollEl; - var frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by - - // change the value of scrollEl's scroll - if (this.scrollTopVel) { - el.scrollTop(el.scrollTop() + this.scrollTopVel * frac); - } - if (this.scrollLeftVel) { - el.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac); - } - - this.constrainScrollVel(); // since the scroll values changed, recompute the velocities - - // if scrolled all the way, which causes the vels to be zero, stop the animation loop - if (!this.scrollTopVel && !this.scrollLeftVel) { - this.stopScrolling(); - } - }, - - - // Kills any existing scrolling animation loop - stopScrolling: function() { - if (this.scrollIntervalId) { - clearInterval(this.scrollIntervalId); - this.scrollIntervalId = null; - - // when all done with scrolling, recompute positions since they probably changed - this.computeCoords(); - } - }, - - - // Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce) - scrollHandler: function() { - // recompute all coordinates, but *only* if this is *not* part of our scrolling animation - if (!this.scrollIntervalId) { - this.computeCoords(); - } - } - -}; - - -// Returns `true` if the cells are identically equal. `false` otherwise. -// They must have the same row, col, and be from the same grid. -// Two null values will be considered equal, as two "out of the grid" states are the same. -function isCellsEqual(cell1, cell2) { - - if (!cell1 && !cell2) { - return true; - } - - if (cell1 && cell2) { - return cell1.grid === cell2.grid && - cell1.row === cell2.row && - cell1.col === cell2.col; - } - - return false; -} - -;; - -/* Creates a clone of an element and lets it track the mouse as it moves -----------------------------------------------------------------------------------------------------------------------*/ - -function MouseFollower(sourceEl, options) { - this.options = options = options || {}; - this.sourceEl = sourceEl; - this.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent -} - - -MouseFollower.prototype = { - - options: null, - - sourceEl: null, // the element that will be cloned and made to look like it is dragging - el: null, // the clone of `sourceEl` that will track the mouse - parentEl: null, // the element that `el` (the clone) will be attached to - - // the initial position of el, relative to the offset parent. made to match the initial offset of sourceEl - top0: null, - left0: null, - - // the initial position of the mouse - mouseY0: null, - mouseX0: null, - - // the number of pixels the mouse has moved from its initial position - topDelta: null, - leftDelta: null, - - mousemoveProxy: null, // document mousemove handler, bound to the MouseFollower's `this` - - isFollowing: false, - isHidden: false, - isAnimating: false, // doing the revert animation? - - - // Causes the element to start following the mouse - start: function(ev) { - if (!this.isFollowing) { - this.isFollowing = true; - - this.mouseY0 = ev.pageY; - this.mouseX0 = ev.pageX; - this.topDelta = 0; - this.leftDelta = 0; - - if (!this.isHidden) { - this.updatePosition(); - } - - $(document).on('mousemove', this.mousemoveProxy = $.proxy(this, 'mousemove')); - } - }, - - - // Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position. - // `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately. - stop: function(shouldRevert, callback) { - var _this = this; - var revertDuration = this.options.revertDuration; - - function complete() { - this.isAnimating = false; - _this.destroyEl(); - - this.top0 = this.left0 = null; // reset state for future updatePosition calls - - if (callback) { - callback(); - } - } - - if (this.isFollowing && !this.isAnimating) { // disallow more than one stop animation at a time - this.isFollowing = false; - - $(document).off('mousemove', this.mousemoveProxy); - - if (shouldRevert && revertDuration && !this.isHidden) { // do a revert animation? - this.isAnimating = true; - this.el.animate({ - top: this.top0, - left: this.left0 - }, { - duration: revertDuration, - complete: complete - }); - } - else { - complete(); - } - } - }, - - - // Gets the tracking element. Create it if necessary - getEl: function() { - var el = this.el; - - if (!el) { - this.sourceEl.width(); // hack to force IE8 to compute correct bounding box - el = this.el = this.sourceEl.clone() - .css({ - position: 'absolute', - visibility: '', // in case original element was hidden (commonly through hideEvents()) - display: this.isHidden ? 'none' : '', // for when initially hidden - margin: 0, - right: 'auto', // erase and set width instead - bottom: 'auto', // erase and set height instead - width: this.sourceEl.width(), // explicit height in case there was a 'right' value - height: this.sourceEl.height(), // explicit width in case there was a 'bottom' value - opacity: this.options.opacity || '', - zIndex: this.options.zIndex - }) - .appendTo(this.parentEl); - } - - return el; - }, - - - // Removes the tracking element if it has already been created - destroyEl: function() { - if (this.el) { - this.el.remove(); - this.el = null; - } - }, - - - // Update the CSS position of the tracking element - updatePosition: function() { - var sourceOffset; - var origin; - - this.getEl(); // ensure this.el - - // make sure origin info was computed - if (this.top0 === null) { - this.sourceEl.width(); // hack to force IE8 to compute correct bounding box - sourceOffset = this.sourceEl.offset(); - origin = this.el.offsetParent().offset(); - this.top0 = sourceOffset.top - origin.top; - this.left0 = sourceOffset.left - origin.left; - } - - this.el.css({ - top: this.top0 + this.topDelta, - left: this.left0 + this.leftDelta - }); - }, - - - // Gets called when the user moves the mouse - mousemove: function(ev) { - this.topDelta = ev.pageY - this.mouseY0; - this.leftDelta = ev.pageX - this.mouseX0; - - if (!this.isHidden) { - this.updatePosition(); - } - }, - - - // Temporarily makes the tracking element invisible. Can be called before following starts - hide: function() { - if (!this.isHidden) { - this.isHidden = true; - if (this.el) { - this.el.hide(); - } - } - }, - - - // Show the tracking element after it has been temporarily hidden - show: function() { - if (this.isHidden) { - this.isHidden = false; - this.updatePosition(); - this.getEl().show(); - } - } - -}; - -;; - -/* A utility class for rendering
', // plain default HTML used for a cell when no other is available - - - // Renders the HTML for a row, leveraging custom cell-HTML-renderers based on the `rowType`. - // Also applies the "intro" and "outro" cells, which are specified by the subclass and views. - // `row` is an optional row number. - rowHtml: function(rowType, row) { - var view = this.view; - var renderCell = this.getHtmlRenderer('cell', rowType); - var cellHtml = ''; - var col; - var date; - - row = row || 0; - - for (col = 0; col < view.colCnt; col++) { - date = view.cellToDate(row, col); - cellHtml += renderCell(row, col, date); - } - - cellHtml = this.bookendCells(cellHtml, rowType, row); // apply intro and outro - - return '
's or a jQuery
' + - '' + - this.rowHtml('head') + // leverages RowRenderer - '' + - '
' + - '
'; - }, - - - // Used by the `headHtml` method, via RowRenderer, for rendering the HTML of a day-of-week header cell - headCellHtml: function(row, col, date) { - var view = this.view; - var calendar = view.calendar; - var colFormat = view.opt('columnFormat'); - - return '' + - '' + - htmlEscape(calendar.formatDate(date, colFormat)) + - ''; - }, - - - // Renders the HTML for a single-day background cell - bgCellHtml: function(row, col, date) { - var view = this.view; - var classes = this.getDayClasses(date); - - classes.unshift('fc-day', view.widgetContentClass); - - return ''; - }, - - - // Computes HTML classNames for a single-day cell - getDayClasses: function(date) { - var view = this.view; - var today = view.calendar.getNow().stripTime(); - var classes = [ 'fc-' + dayIDs[date.day()] ]; - - if ( - view.name === 'month' && - date.month() != view.intervalStart.month() - ) { - classes.push('fc-other-month'); - } - - if (date.isSame(today, 'day')) { - classes.push( - 'fc-today', - view.highlightStateClass - ); - } - else if (date < today) { - classes.push('fc-past'); - } - else { - classes.push('fc-future'); - } - - return classes; - } - -}); - -;; - -/* Event-rendering and event-interaction methods for the abstract Grid class -----------------------------------------------------------------------------------------------------------------------*/ - -$.extend(Grid.prototype, { - - mousedOverSeg: null, // the segment object the user's mouse is over. null if over nothing - isDraggingSeg: false, // is a segment being dragged? boolean - isResizingSeg: false, // is a segment being resized? boolean - - - // Renders the given events onto the grid - renderEvents: function(events) { - // subclasses must implement - }, - - - // Retrieves all rendered segment objects in this grid - getSegs: function() { - // subclasses must implement - }, - - - // Unrenders all events. Subclasses should implement, calling this super-method first. - destroyEvents: function() { - this.triggerSegMouseout(); // trigger an eventMouseout if user's mouse is over an event - }, - - - // Renders a `el` property for each seg, and only returns segments that successfully rendered - renderSegs: function(segs, disableResizing) { - var view = this.view; - var html = ''; - var renderedSegs = []; - var i; - - // build a large concatenation of event segment HTML - for (i = 0; i < segs.length; i++) { - html += this.renderSegHtml(segs[i], disableResizing); - } - - // Grab individual elements from the combined HTML string. Use each as the default rendering. - // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false. - $(html).each(function(i, node) { - var seg = segs[i]; - var el = view.resolveEventEl(seg.event, $(node)); - if (el) { - el.data('fc-seg', seg); // used by handlers - seg.el = el; - renderedSegs.push(seg); - } - }); - - return renderedSegs; - }, - - - // Generates the HTML for the default rendering of a segment - renderSegHtml: function(seg, disableResizing) { - // subclasses must implement - }, - - - // Converts an array of event objects into an array of segment objects - eventsToSegs: function(events, intervalStart, intervalEnd) { - var _this = this; - - return $.map(events, function(event) { - return _this.eventToSegs(event, intervalStart, intervalEnd); // $.map flattens all returned arrays together - }); - }, - - - // Slices a single event into an array of event segments. - // When `intervalStart` and `intervalEnd` are specified, intersect the events with that interval. - // Otherwise, let the subclass decide how it wants to slice the segments over the grid. - eventToSegs: function(event, intervalStart, intervalEnd) { - var eventStart = event.start.clone().stripZone(); // normalize - var eventEnd = this.view.calendar.getEventEnd(event).stripZone(); // compute (if necessary) and normalize - var segs; - var i, seg; - - if (intervalStart && intervalEnd) { - seg = intersectionToSeg(eventStart, eventEnd, intervalStart, intervalEnd); - segs = seg ? [ seg ] : []; - } - else { - segs = this.rangeToSegs(eventStart, eventEnd); // defined by the subclass - } - - // assign extra event-related properties to the segment objects - for (i = 0; i < segs.length; i++) { - seg = segs[i]; - seg.event = event; - seg.eventStartMS = +eventStart; - seg.eventDurationMS = eventEnd - eventStart; - } - - return segs; - }, - - - /* Handlers - ------------------------------------------------------------------------------------------------------------------*/ - - - // Attaches event-element-related handlers to the container element and leverage bubbling - bindSegHandlers: function() { - var _this = this; - var view = this.view; - - $.each( - { - mouseenter: function(seg, ev) { - _this.triggerSegMouseover(seg, ev); - }, - mouseleave: function(seg, ev) { - _this.triggerSegMouseout(seg, ev); - }, - click: function(seg, ev) { - return view.trigger('eventClick', this, seg.event, ev); // can return `false` to cancel - }, - mousedown: function(seg, ev) { - if ($(ev.target).is('.fc-resizer') && view.isEventResizable(seg.event)) { - _this.segResizeMousedown(seg, ev); - } - else if (view.isEventDraggable(seg.event)) { - _this.segDragMousedown(seg, ev); - } - } - }, - function(name, func) { - // attach the handler to the container element and only listen for real event elements via bubbling - _this.el.on(name, '.fc-event-container > *', function(ev) { - var seg = $(this).data('fc-seg'); // grab segment data. put there by View::renderEvents - - // only call the handlers if there is not a drag/resize in progress - if (seg && !_this.isDraggingSeg && !_this.isResizingSeg) { - return func.call(this, seg, ev); // `this` will be the event element - } - }); - } - ); - }, - - - // Updates internal state and triggers handlers for when an event element is moused over - triggerSegMouseover: function(seg, ev) { - if (!this.mousedOverSeg) { - this.mousedOverSeg = seg; - this.view.trigger('eventMouseover', seg.el[0], seg.event, ev); - } - }, - - - // Updates internal state and triggers handlers for when an event element is moused out. - // Can be given no arguments, in which case it will mouseout the segment that was previously moused over. - triggerSegMouseout: function(seg, ev) { - ev = ev || {}; // if given no args, make a mock mouse event - - if (this.mousedOverSeg) { - seg = seg || this.mousedOverSeg; // if given no args, use the currently moused-over segment - this.mousedOverSeg = null; - this.view.trigger('eventMouseout', seg.el[0], seg.event, ev); - } - }, - - - /* Dragging - ------------------------------------------------------------------------------------------------------------------*/ - - - // Called when the user does a mousedown on an event, which might lead to dragging. - // Generic enough to work with any type of Grid. - segDragMousedown: function(seg, ev) { - var _this = this; - var view = this.view; - var el = seg.el; - var event = seg.event; - var newStart, newEnd; - - // A clone of the original element that will move with the mouse - var mouseFollower = new MouseFollower(seg.el, { - parentEl: view.el, - opacity: view.opt('dragOpacity'), - revertDuration: view.opt('dragRevertDuration'), - zIndex: 2 // one above the .fc-view - }); - - // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents - // of the view. - var dragListener = new DragListener(view.coordMap, { - distance: 5, - scroll: view.opt('dragScroll'), - listenStart: function(ev) { - mouseFollower.hide(); // don't show until we know this is a real drag - mouseFollower.start(ev); - }, - dragStart: function(ev) { - _this.triggerSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported - _this.isDraggingSeg = true; - view.hideEvent(event); // hide all event segments. our mouseFollower will take over - view.trigger('eventDragStart', el[0], event, ev, {}); // last argument is jqui dummy - }, - cellOver: function(cell, date) { - var origDate = seg.cellDate || dragListener.origDate; - var res = _this.computeDraggedEventDates(seg, origDate, date); - newStart = res.start; - newEnd = res.end; - - if (view.renderDrag(newStart, newEnd, seg)) { // have the view render a visual indication - mouseFollower.hide(); // if the view is already using a mock event "helper", hide our own - } - else { - mouseFollower.show(); - } - }, - cellOut: function() { // called before mouse moves to a different cell OR moved out of all cells - newStart = null; - view.destroyDrag(); // unrender whatever was done in view.renderDrag - mouseFollower.show(); // show in case we are moving out of all cells - }, - dragStop: function(ev) { - var hasChanged = newStart && !newStart.isSame(event.start); - - // do revert animation if hasn't changed. calls a callback when finished (whether animation or not) - mouseFollower.stop(!hasChanged, function() { - _this.isDraggingSeg = false; - view.destroyDrag(); - view.showEvent(event); - view.trigger('eventDragStop', el[0], event, ev, {}); // last argument is jqui dummy - - if (hasChanged) { - view.eventDrop(el[0], event, newStart, ev); // will rerender all events... - } - }); - }, - listenStop: function() { - mouseFollower.stop(); // put in listenStop in case there was a mousedown but the drag never started - } - }); - - dragListener.mousedown(ev); // start listening, which will eventually lead to a dragStart - }, - - - // Given a segment, the dates where a drag began and ended, calculates the Event Object's new start and end dates - computeDraggedEventDates: function(seg, dragStartDate, dropDate) { - var view = this.view; - var event = seg.event; - var start = event.start; - var end = view.calendar.getEventEnd(event); - var delta; - var newStart; - var newEnd; - - if (dropDate.hasTime() === dragStartDate.hasTime()) { - delta = dayishDiff(dropDate, dragStartDate); - newStart = start.clone().add(delta); - if (event.end === null) { // do we need to compute an end? - newEnd = null; - } - else { - newEnd = end.clone().add(delta); - } - } - else { - // if switching from day <-> timed, start should be reset to the dropped date, and the end cleared - newStart = dropDate; - newEnd = null; // end should be cleared - } - - return { start: newStart, end: newEnd }; - }, - - - /* Resizing - ------------------------------------------------------------------------------------------------------------------*/ - - - // Called when the user does a mousedown on an event's resizer, which might lead to resizing. - // Generic enough to work with any type of Grid. - segResizeMousedown: function(seg, ev) { - var _this = this; - var view = this.view; - var el = seg.el; - var event = seg.event; - var start = event.start; - var end = view.calendar.getEventEnd(event); - var newEnd = null; - var dragListener; - - function destroy() { // resets the rendering - _this.destroyResize(); - view.showEvent(event); - } - - // Tracks mouse movement over the *grid's* coordinate map - dragListener = new DragListener(this.coordMap, { - distance: 5, - scroll: view.opt('dragScroll'), - dragStart: function(ev) { - _this.triggerSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported - _this.isResizingSeg = true; - view.trigger('eventResizeStart', el[0], event, ev, {}); // last argument is jqui dummy - }, - cellOver: function(cell, date) { - // compute the new end. don't allow it to go before the event's start - if (date.isBefore(start)) { // allows comparing ambig to non-ambig - date = start; - } - newEnd = date.clone().add(_this.cellDuration); // make it an exclusive end - - if (newEnd.isSame(end)) { - newEnd = null; - destroy(); - } - else { - _this.renderResize(start, newEnd, seg); - view.hideEvent(event); - } - }, - cellOut: function() { // called before mouse moves to a different cell OR moved out of all cells - newEnd = null; - destroy(); - }, - dragStop: function(ev) { - _this.isResizingSeg = false; - destroy(); - view.trigger('eventResizeStop', el[0], event, ev, {}); // last argument is jqui dummy - - if (newEnd) { - view.eventResize(el[0], event, newEnd, ev); // will rerender all events... - } - } - }); - - dragListener.mousedown(ev); // start listening, which will eventually lead to a dragStart - }, - - - /* Rendering Utils - ------------------------------------------------------------------------------------------------------------------*/ - - - // Generic utility for generating the HTML classNames for an event segment's element - getSegClasses: function(seg, isDraggable, isResizable) { - var event = seg.event; - var classes = [ - 'fc-event', - seg.isStart ? 'fc-start' : 'fc-not-start', - seg.isEnd ? 'fc-end' : 'fc-not-end' - ].concat( - event.className, - event.source ? event.source.className : [] - ); - - if (isDraggable) { - classes.push('fc-draggable'); - } - if (isResizable) { - classes.push('fc-resizable'); - } - - return classes; - }, - - - // Utility for generating a CSS string with all the event skin-related properties - getEventSkinCss: function(event) { - var view = this.view; - var source = event.source || {}; - var eventColor = event.color; - var sourceColor = source.color; - var optionColor = view.opt('eventColor'); - var backgroundColor = - event.backgroundColor || - eventColor || - source.backgroundColor || - sourceColor || - view.opt('eventBackgroundColor') || - optionColor; - var borderColor = - event.borderColor || - eventColor || - source.borderColor || - sourceColor || - view.opt('eventBorderColor') || - optionColor; - var textColor = - event.textColor || - source.textColor || - view.opt('eventTextColor'); - var statements = []; - if (backgroundColor) { - statements.push('background-color:' + backgroundColor); - } - if (borderColor) { - statements.push('border-color:' + borderColor); - } - if (textColor) { - statements.push('color:' + textColor); - } - return statements.join(';'); - } - -}); - - -/* Event Segment Utilities -----------------------------------------------------------------------------------------------------------------------*/ - - -// A cmp function for determining which segments should take visual priority -function compareSegs(seg1, seg2) { - return seg1.eventStartMS - seg2.eventStartMS || // earlier events go first - seg2.eventDurationMS - seg1.eventDurationMS || // tie? longer events go first - seg2.event.allDay - seg1.event.allDay || // tie? put all-day events first (booleans cast to 0/1) - (seg1.event.title || '').localeCompare(seg2.event.title); // tie? alphabetically by title -} - - -;; - -/* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week. -----------------------------------------------------------------------------------------------------------------------*/ - -function DayGrid(view) { - Grid.call(this, view); // call the super-constructor -} - - -DayGrid.prototype = createObject(Grid.prototype); // declare the super-class -$.extend(DayGrid.prototype, { - - numbersVisible: false, // should render a row for day/week numbers? manually set by the view - cellDuration: moment.duration({ days: 1 }), // required for Grid.event.js. Each cell is always a single day - bottomCoordPadding: 0, // hack for extending the hit area for the last row of the coordinate grid - - rowEls: null, // set of fake row elements - dayEls: null, // set of whole-day elements comprising the row's background - helperEls: null, // set of cell skeleton elements for rendering the mock event "helper" - highlightEls: null, // set of cell skeleton elements for rendering the highlight - - - // Renders the rows and columns into the component's `this.el`, which should already be assigned. - // isRigid determins whether the individual rows should ignore the contents and be a constant height. - // Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient. - render: function(isRigid) { - var view = this.view; - var html = ''; - var row; - - for (row = 0; row < view.rowCnt; row++) { - html += this.dayRowHtml(row, isRigid); - } - this.el.html(html); - - this.rowEls = this.el.find('.fc-row'); - this.dayEls = this.el.find('.fc-day'); - - // run all the day cells through the dayRender callback - this.dayEls.each(function(i, node) { - var date = view.cellToDate(Math.floor(i / view.colCnt), i % view.colCnt); - view.trigger('dayRender', null, date, $(node)); - }); - - Grid.prototype.render.call(this); // call the super-method - }, - - - destroy: function() { - this.destroySegPopover(); - }, - - - // Generates the HTML for a single row. `row` is the row number. - dayRowHtml: function(row, isRigid) { - var view = this.view; - var classes = [ 'fc-row', 'fc-week', view.widgetContentClass ]; - - if (isRigid) { - classes.push('fc-rigid'); - } - - return '' + - '
' + - '
' + - '' + - this.rowHtml('day', row) + // leverages RowRenderer. calls dayCellHtml() - '
' + - '
' + - '
' + - '' + - (this.numbersVisible ? - '' + - this.rowHtml('number', row) + // leverages RowRenderer. View will define render method - '' : - '' - ) + - '
' + - '
' + - '
'; - }, - - - // Renders the HTML for a whole-day cell. Will eventually end up in the day-row's background. - // We go through a 'day' row type instead of just doing a 'bg' row type so that the View can do custom rendering - // specifically for whole-day rows, whereas a 'bg' might also be used for other purposes (TimeGrid bg for example). - dayCellHtml: function(row, col, date) { - return this.bgCellHtml(row, col, date); - }, - - - /* Coordinates & Cells - ------------------------------------------------------------------------------------------------------------------*/ - - - // Populates the empty `rows` and `cols` arrays with coordinates of the cells. For CoordGrid. - buildCoords: function(rows, cols) { - var colCnt = this.view.colCnt; - var e, n, p; - - this.dayEls.slice(0, colCnt).each(function(i, _e) { // iterate the first row of day elements - e = $(_e); - n = e.offset().left; - if (i) { - p[1] = n; - } - p = [ n ]; - cols[i] = p; - }); - p[1] = n + e.outerWidth(); - - this.rowEls.each(function(i, _e) { - e = $(_e); - n = e.offset().top; - if (i) { - p[1] = n; - } - p = [ n ]; - rows[i] = p; - }); - p[1] = n + e.outerHeight() + this.bottomCoordPadding; // hack to extend hit area of last row - }, - - - // Converts a cell to a date - getCellDate: function(cell) { - return this.view.cellToDate(cell); // leverages the View's cell system - }, - - - // Gets the whole-day element associated with the cell - getCellDayEl: function(cell) { - return this.dayEls.eq(cell.row * this.view.colCnt + cell.col); - }, - - - // Converts a range with an inclusive `start` and an exclusive `end` into an array of segment objects - rangeToSegs: function(start, end) { - return this.view.rangeToSegments(start, end); // leverages the View's cell system - }, - - - /* Event Drag Visualization - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of an event hovering over the given date(s). - // `end` can be null, as well as `seg`. See View's documentation on renderDrag for more info. - // A returned value of `true` signals that a mock "helper" event has been rendered. - renderDrag: function(start, end, seg) { - var opacity; - - // always render a highlight underneath - this.renderHighlight( - start, - end || this.view.calendar.getDefaultEventEnd(true, start) - ); - - // if a segment from the same calendar but another component is being dragged, render a helper event - if (seg && !seg.el.closest(this.el).length) { - - this.renderRangeHelper(start, end, seg); - - opacity = this.view.opt('dragOpacity'); - if (opacity !== undefined) { - this.helperEls.css('opacity', opacity); - } - - return true; // a helper has been rendered - } - }, - - - // Unrenders any visual indication of a hovering event - destroyDrag: function() { - this.destroyHighlight(); - this.destroyHelper(); - }, - - - /* Event Resize Visualization - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of an event being resized - renderResize: function(start, end, seg) { - this.renderHighlight(start, end); - this.renderRangeHelper(start, end, seg); - }, - - - // Unrenders a visual indication of an event being resized - destroyResize: function() { - this.destroyHighlight(); - this.destroyHelper(); - }, - - - /* Event Helper - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a mock "helper" event. `sourceSeg` is the associated internal segment object. It can be null. - renderHelper: function(event, sourceSeg) { - var helperNodes = []; - var rowStructs = this.renderEventRows([ event ]); - - // inject each new event skeleton into each associated row - this.rowEls.each(function(row, rowNode) { - var rowEl = $(rowNode); // the .fc-row - var skeletonEl = $('
'); // will be absolutely positioned - var skeletonTop; - - // If there is an original segment, match the top position. Otherwise, put it at the row's top level - if (sourceSeg && sourceSeg.row === row) { - skeletonTop = sourceSeg.el.position().top; - } - else { - skeletonTop = rowEl.find('.fc-content-skeleton tbody').position().top; - } - - skeletonEl.css('top', skeletonTop) - .find('table') - .append(rowStructs[row].tbodyEl); - - rowEl.append(skeletonEl); - helperNodes.push(skeletonEl[0]); - }); - - this.helperEls = $(helperNodes); // array -> jQuery set - }, - - - // Unrenders any visual indication of a mock helper event - destroyHelper: function() { - if (this.helperEls) { - this.helperEls.remove(); - this.helperEls = null; - } - }, - - - /* Highlighting - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders an emphasis on the given date range. `start` is an inclusive, `end` is exclusive. - renderHighlight: function(start, end) { - var segs = this.rangeToSegs(start, end); - var highlightNodes = []; - var i, seg; - var el; - - // build an event skeleton for each row that needs it - for (i = 0; i < segs.length; i++) { - seg = segs[i]; - el = $( - this.highlightSkeletonHtml(seg.leftCol, seg.rightCol + 1) // make end exclusive - ); - el.appendTo(this.rowEls[seg.row]); - highlightNodes.push(el[0]); - } - - this.highlightEls = $(highlightNodes); // array -> jQuery set - }, - - - // Unrenders any visual emphasis on a date range - destroyHighlight: function() { - if (this.highlightEls) { - this.highlightEls.remove(); - this.highlightEls = null; - } - }, - - - // Generates the HTML used to build a single-row "highlight skeleton", a table that frames highlight cells - highlightSkeletonHtml: function(startCol, endCol) { - var colCnt = this.view.colCnt; - var cellHtml = ''; - - if (startCol > 0) { - cellHtml += ' elements that should be appended to each row's content skeleton. - // Returns an array of rowStruct objects (see the bottom of `renderEventRow`). - renderEventRows: function(events) { - var segs = this.eventsToSegs(events); - var rowStructs = []; - var segRows; - var row; - - segs = this.renderSegs(segs); // returns a new array with only visible segments - segRows = this.groupSegRows(segs); // group into nested arrays - - // iterate each row of segment groupings - for (row = 0; row < segRows.length; row++) { - rowStructs.push( - this.renderEventRow(row, segRows[row]) - ); - } - - return rowStructs; - }, - - - // Builds the HTML to be used for the default element for an individual segment - renderSegHtml: function(seg, disableResizing) { - var view = this.view; - var isRTL = view.opt('isRTL'); - var event = seg.event; - var isDraggable = view.isEventDraggable(event); - var isResizable = !disableResizing && event.allDay && seg.isEnd && view.isEventResizable(event); - var classes = this.getSegClasses(seg, isDraggable, isResizable); - var skinCss = this.getEventSkinCss(event); - var timeHtml = ''; - var titleHtml; - - classes.unshift('fc-day-grid-event'); - - // Only display a timed events time if it is the starting segment - if (!event.allDay && seg.isStart) { - timeHtml = '' + htmlEscape(view.getEventTimeText(event)) + ''; - } - - titleHtml = - '' + - (htmlEscape(event.title || '') || ' ') + // we always want one line of height - ''; - - return '' + - '
' + - (isRTL ? - titleHtml + ' ' + timeHtml : // put a natural space in between - timeHtml + ' ' + titleHtml // - ) + - '
' + - (isResizable ? - '
' : - '' - ) + - ''; - }, - - - // Given a row # and an array of segments all in the same row, render a
element, a skeleton that contains - // the segments. Returns object with a bunch of internal data about how the render was calculated. - renderEventRow: function(row, rowSegs) { - var view = this.view; - var colCnt = view.colCnt; - var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels - var levelCnt = Math.max(1, segLevels.length); // ensure at least one level - var tbody = $(''); - var segMatrix = []; // lookup for which segments are rendered into which level+col cells - var cellMatrix = []; // lookup for all '); - - segMatrix.push([]); - cellMatrix.push([]); - loneCellMatrix.push([]); - - // levelCnt might be 1 even though there are no actual levels. protect against this. - // this single empty row is useful for styling. - if (levelSegs) { - for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level - seg = levelSegs[j]; - - emptyCellsUntil(seg.leftCol); - - // create a container that occupies or more columns. append the event element. - td = $(' at a time and stop when we find one out of bounds - for (i = 0; i < trEls.length; i++) { - trEl = trEls.eq(i).removeClass('fc-limited'); // get and reveal - if (trEl.position().top + trEl.outerHeight() > rowHeight) { - return i; - } - } - - return false; // should not limit at all - }, - - - // Limits the given grid row to the maximum number of levels and injects "more" links if necessary. - // `row` is the row number. - // `levelLimit` is a number for the maximum (inclusive) number of levels allowed. - limitRow: function(row, levelLimit) { - var _this = this; - var view = this.view; - var rowStruct = this.rowStructs[row]; - var moreNodes = []; // array of "more" links and and segment elements past the limit - .addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array - - // iterate though segments in the last allowable level - for (i = 0; i < levelSegs.length; i++) { - seg = levelSegs[i]; - emptyCellsUntil(seg.leftCol); // process empty cells before the segment - - // determine *all* segments below `seg` that occupy the same columns - colSegsBelow = []; - totalSegsBelow = 0; - while (col <= seg.rightCol) { - cell = { row: row, col: col }; - segsBelow = this.getCellSegs(cell, levelLimit); - colSegsBelow.push(segsBelow); - totalSegsBelow += segsBelow.length; - col++; - } - - if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links? - td = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell - rowspan = td.attr('rowspan') || 1; - segMoreNodes = []; - - // make a replacement '; - - html += - '' + - (!isRTL ? axisHtml : '') + - '"; - - slotTime.add(this.slotDuration); - } - - return html; - }, - - - // Parses various options into properties of this object - processOptions: function() { - var view = this.view; - var slotDuration = view.opt('slotDuration'); - var snapDuration = view.opt('snapDuration'); - - slotDuration = moment.duration(slotDuration); - snapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration; - - this.slotDuration = slotDuration; - this.snapDuration = snapDuration; - this.cellDuration = snapDuration; // important to assign this for Grid.events.js - - this.minTime = moment.duration(view.opt('minTime')); - this.maxTime = moment.duration(view.opt('maxTime')); - }, - - - // Slices up a date range into a segment for each column - rangeToSegs: function(rangeStart, rangeEnd) { - var view = this.view; - var segs = []; - var seg; - var col; - var cellDate; - var colStart, colEnd; - - // normalize - rangeStart = rangeStart.clone().stripZone(); - rangeEnd = rangeEnd.clone().stripZone(); - - for (col = 0; col < view.colCnt; col++) { - cellDate = view.cellToDate(0, col); // use the View's cell system for this - colStart = cellDate.clone().time(this.minTime); - colEnd = cellDate.clone().time(this.maxTime); - seg = intersectionToSeg(rangeStart, rangeEnd, colStart, colEnd); - if (seg) { - seg.col = col; - segs.push(seg); - } - } - - return segs; - }, - - - /* Coordinates - ------------------------------------------------------------------------------------------------------------------*/ - - - // Called when there is a window resize/zoom and we need to recalculate coordinates for the grid - resize: function() { - this.computeSlatTops(); - this.updateSegVerticals(); - }, - - - // Populates the given empty `rows` and `cols` arrays with offset positions of the "snap" cells. - // "Snap" cells are different the slots because they might have finer granularity. - buildCoords: function(rows, cols) { - var colCnt = this.view.colCnt; - var originTop = this.el.offset().top; - var snapTime = moment.duration(+this.minTime); - var p = null; - var e, n; - - this.dayEls.slice(0, colCnt).each(function(i, _e) { - e = $(_e); - n = e.offset().left; - if (p) { - p[1] = n; - } - p = [ n ]; - cols[i] = p; - }); - p[1] = n + e.outerWidth(); - - p = null; - while (snapTime < this.maxTime) { - n = originTop + this.computeTimeTop(snapTime); - if (p) { - p[1] = n; - } - p = [ n ]; - rows.push(p); - snapTime.add(this.snapDuration); - } - p[1] = originTop + this.computeTimeTop(snapTime); // the position of the exclusive end - }, - - - // Gets the datetime for the given slot cell - getCellDate: function(cell) { - var view = this.view; - var calendar = view.calendar; - - return calendar.rezoneDate( // since we are adding a time, it needs to be in the calendar's timezone - view.cellToDate(0, cell.col) // View's coord system only accounts for start-of-day for column - .time(this.minTime + this.snapDuration * cell.row) - ); - }, - - - // Gets the element that represents the whole-day the cell resides on - getCellDayEl: function(cell) { - return this.dayEls.eq(cell.col); - }, - - - // Computes the top coordinate, relative to the bounds of the grid, of the given date. - // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight. - computeDateTop: function(date, startOfDayDate) { - return this.computeTimeTop( - moment.duration( - date.clone().stripZone() - startOfDayDate.clone().stripTime() - ) - ); - }, - - - // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration). - computeTimeTop: function(time) { - var slatCoverage = (time - this.minTime) / this.slotDuration; // floating-point value of # of slots covered - var slatIndex; - var slatRemainder; - var slatTop; - var slatBottom; - - // constrain. because minTime/maxTime might be customized - slatCoverage = Math.max(0, slatCoverage); - slatCoverage = Math.min(this.slatEls.length, slatCoverage); - - slatIndex = Math.floor(slatCoverage); // an integer index of the furthest whole slot - slatRemainder = slatCoverage - slatIndex; - slatTop = this.slatTops[slatIndex]; // the top position of the furthest whole slot - - if (slatRemainder) { // time spans part-way into the slot - slatBottom = this.slatTops[slatIndex + 1]; - return slatTop + (slatBottom - slatTop) * slatRemainder; // part-way between slots - } - else { - return slatTop; - } - }, - - - // Queries each `slatEl` for its position relative to the grid's container and stores it in `slatTops`. - // Includes the the bottom of the last slat as the last item in the array. - computeSlatTops: function() { - var tops = []; - var top; - - this.slatEls.each(function(i, node) { - top = $(node).position().top; - tops.push(top); - }); - - tops.push(top + this.slatEls.last().outerHeight()); // bottom of the last slat - - this.slatTops = tops; - }, - - - /* Event Drag Visualization - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of an event being dragged over the specified date(s). - // `end` and `seg` can be null. See View's documentation on renderDrag for more info. - renderDrag: function(start, end, seg) { - var opacity; - - if (seg) { // if there is event information for this drag, render a helper event - this.renderRangeHelper(start, end, seg); - - opacity = this.view.opt('dragOpacity'); - if (opacity !== undefined) { - this.helperEl.css('opacity', opacity); - } - - return true; // signal that a helper has been rendered - } - else { - // otherwise, just render a highlight - this.renderHighlight( - start, - end || this.view.calendar.getDefaultEventEnd(false, start) - ); - } - }, - - - // Unrenders any visual indication of an event being dragged - destroyDrag: function() { - this.destroyHelper(); - this.destroyHighlight(); - }, - - - /* Event Resize Visualization - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of an event being resized - renderResize: function(start, end, seg) { - this.renderRangeHelper(start, end, seg); - }, - - - // Unrenders any visual indication of an event being resized - destroyResize: function() { - this.destroyHelper(); - }, - - - /* Event Helper - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a mock "helper" event. `sourceSeg` is the original segment object and might be null (an external drag) - renderHelper: function(event, sourceSeg) { - var res = this.renderEventTable([ event ]); - var tableEl = res.tableEl; - var segs = res.segs; - var i, seg; - var sourceEl; - - // Try to make the segment that is in the same row as sourceSeg look the same - for (i = 0; i < segs.length; i++) { - seg = segs[i]; - if (sourceSeg && sourceSeg.col === seg.col) { - sourceEl = sourceSeg.el; - seg.el.css({ - left: sourceEl.css('left'), - right: sourceEl.css('right'), - 'margin-left': sourceEl.css('margin-left'), - 'margin-right': sourceEl.css('margin-right') - }); - } - } - - this.helperEl = $('
') - .append(tableEl) - .appendTo(this.el); - }, - - - // Unrenders any mock helper event - destroyHelper: function() { - if (this.helperEl) { - this.helperEl.remove(); - this.helperEl = null; - } - }, - - - /* Selection - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight. - renderSelection: function(start, end) { - if (this.view.opt('selectHelper')) { // this setting signals that a mock helper event should be rendered - this.renderRangeHelper(start, end); - } - else { - this.renderHighlight(start, end); - } - }, - - - // Unrenders any visual indication of a selection - destroySelection: function() { - this.destroyHelper(); - this.destroyHighlight(); - }, - - - /* Highlight - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders an emphasis on the given date range. `start` is inclusive. `end` is exclusive. - renderHighlight: function(start, end) { - this.highlightEl = $( - this.highlightSkeletonHtml(start, end) - ).appendTo(this.el); - }, - - - // Unrenders the emphasis on a date range - destroyHighlight: function() { - if (this.highlightEl) { - this.highlightEl.remove(); - this.highlightEl = null; - } - }, - - - // Generates HTML for a table element with containers in each column, responsible for absolutely positioning the - // highlight elements to cover the highlighted slots. - highlightSkeletonHtml: function(start, end) { - var view = this.view; - var segs = this.rangeToSegs(start, end); - var cellHtml = ''; - var col = 0; - var i, seg; - var dayDate; - var top, bottom; - - for (i = 0; i < segs.length; i++) { // loop through the segments. one per column - seg = segs[i]; - - // need empty cells beforehand? - if (col < seg.col) { - cellHtml += '
'; - - col++; - } - - // need empty cells after the last segment? - if (col < view.colCnt) { - cellHtml += ''; - } - }, - - - // Generates the HTML that will go before content-skeleton cells that display the day/week numbers. - // Queried by the DayGrid subcomponent. Ordering depends on isRTL. - numberIntroHtml: function(row) { - if (this.weekNumbersVisible) { - return '' + - ''; - } - }, - - - // Generates the HTML that goes before the day bg cells for each day-row. - // Queried by the DayGrid subcomponent. Ordering depends on isRTL. - dayIntroHtml: function() { - if (this.weekNumbersVisible) { - return ''; - } - }, - - - // Generates the HTML that goes before every other type of row generated by DayGrid. Ordering depends on isRTL. - // Affects helper-skeleton and highlight-skeleton rows. - introHtml: function() { - if (this.weekNumbersVisible) { - return ''; - } - }, - - - // Generates the HTML for the '; - }, - - - // Generates an HTML attribute string for setting the width of the week number column, if it is known - weekNumberStyleAttr: function() { - if (this.weekNumberWidth !== null) { - return 'style="width:' + this.weekNumberWidth + 'px"'; - } - return ''; - }, - - - // Determines whether each row should have a constant height - hasRigidRows: function() { - var eventLimit = this.opt('eventLimit'); - return eventLimit && typeof eventLimit !== 'number'; - }, - - - /* Dimensions - ------------------------------------------------------------------------------------------------------------------*/ - - - // Refreshes the horizontal dimensions of the view - updateWidth: function() { - if (this.weekNumbersVisible) { - // Make sure all week number cells running down the side have the same width. - // Record the width for cells created later. - this.weekNumberWidth = matchCellWidths( - this.el.find('.fc-week-number') - ); - } - }, - - - // Adjusts the vertical dimensions of the view to the specified values - setHeight: function(totalHeight, isAuto) { - var eventLimit = this.opt('eventLimit'); - var scrollerHeight; - - // reset all heights to be natural - unsetScroller(this.scrollerEl); - uncompensateScroll(this.headRowEl); - - this.dayGrid.destroySegPopover(); // kill the "more" popover if displayed - - // is the event limit a constant level number? - if (eventLimit && typeof eventLimit === 'number') { - this.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after - } - - scrollerHeight = this.computeScrollerHeight(totalHeight); - this.setGridHeight(scrollerHeight, isAuto); - - // is the event limit dynamically calculated? - if (eventLimit && typeof eventLimit !== 'number') { - this.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set - } - - if (!isAuto && setPotentialScroller(this.scrollerEl, scrollerHeight)) { // using scrollbars? - - compensateScroll(this.headRowEl, getScrollbarWidths(this.scrollerEl)); - - // doing the scrollbar compensation might have created text overflow which created more height. redo - scrollerHeight = this.computeScrollerHeight(totalHeight); - this.scrollerEl.height(scrollerHeight); - - this.restoreScroll(); - } - }, - - - // Sets the height of just the DayGrid component in this view - setGridHeight: function(height, isAuto) { - if (isAuto) { - undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding - } - else { - distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows - } - }, - - - /* Events - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders the given events onto the view and populates the segments array - renderEvents: function(events) { - this.dayGrid.renderEvents(events); - - this.updateHeight(); // must compensate for events that overflow the row - - View.prototype.renderEvents.call(this, events); // call the super-method - }, - - - // Retrieves all segment objects that are rendered in the view - getSegs: function() { - return this.dayGrid.getSegs(); - }, - - - // Unrenders all event elements and clears internal segment data - destroyEvents: function() { - View.prototype.destroyEvents.call(this); // do this before dayGrid's segs have been cleared - - this.recordScroll(); // removing events will reduce height and mess with the scroll, so record beforehand - this.dayGrid.destroyEvents(); - - // we DON'T need to call updateHeight() because: - // A) a renderEvents() call always happens after this, which will eventually call updateHeight() - // B) in IE8, this causes a flash whenever events are rerendered - }, - - - /* Event Dragging - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of an event being dragged over the view. - // A returned value of `true` signals that a mock "helper" event has been rendered. - renderDrag: function(start, end, seg) { - return this.dayGrid.renderDrag(start, end, seg); - }, - - - // Unrenders the visual indication of an event being dragged over the view - destroyDrag: function() { - this.dayGrid.destroyDrag(); - }, - - - /* Selection - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of a selection - renderSelection: function(start, end) { - this.dayGrid.renderSelection(start, end); - }, - - - // Unrenders a visual indications of a selection - destroySelection: function() { - this.dayGrid.destroySelection(); - } - -}); - -;; - -/* A month view with day cells running in rows (one-per-week) and columns -----------------------------------------------------------------------------------------------------------------------*/ - -setDefaults({ - fixedWeekCount: true -}); - -fcViews.month = MonthView; // register the view - -function MonthView(calendar) { - BasicView.call(this, calendar); // call the super-constructor -} - - -MonthView.prototype = createObject(BasicView.prototype); // define the super-class -$.extend(MonthView.prototype, { - - name: 'month', - - - incrementDate: function(date, delta) { - return date.clone().stripTime().add(delta, 'months').startOf('month'); - }, - - - render: function(date) { - var rowCnt; - - this.intervalStart = date.clone().stripTime().startOf('month'); - this.intervalEnd = this.intervalStart.clone().add(1, 'months'); - - this.start = this.intervalStart.clone(); - this.start = this.skipHiddenDays(this.start); // move past the first week if no visible days - this.start.startOf('week'); - this.start = this.skipHiddenDays(this.start); // move past the first invisible days of the week - - this.end = this.intervalEnd.clone(); - this.end = this.skipHiddenDays(this.end, -1, true); // move in from the last week if no visible days - this.end.add((7 - this.end.weekday()) % 7, 'days'); // move to end of week if not already - this.end = this.skipHiddenDays(this.end, -1, true); // move in from the last invisible days of the week - - rowCnt = Math.ceil( // need to ceil in case there are hidden days - this.end.diff(this.start, 'weeks', true) // returnfloat=true - ); - if (this.isFixedWeeks()) { - this.end.add(6 - rowCnt, 'weeks'); - rowCnt = 6; - } - - this.title = this.calendar.formatDate(this.intervalStart, this.opt('titleFormat')); - - BasicView.prototype.render.call(this, rowCnt, this.getCellsPerWeek(), true); // call the super-method - }, - - - // Overrides the default BasicView behavior to have special multi-week auto-height logic - setGridHeight: function(height, isAuto) { - - isAuto = isAuto || this.opt('weekMode') === 'variable'; // LEGACY: weekMode is deprecated - - // if auto, make the height of each row the height that it would be if there were 6 weeks - if (isAuto) { - height *= this.rowCnt / 6; - } - - distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows - }, - - - isFixedWeeks: function() { - var weekMode = this.opt('weekMode'); // LEGACY: weekMode is deprecated - if (weekMode) { - return weekMode === 'fixed'; // if any other type of weekMode, assume NOT fixed - } - - return this.opt('fixedWeekCount'); - } - -}); - -;; - -/* A week view with simple day cells running horizontally -----------------------------------------------------------------------------------------------------------------------*/ -// TODO: a WeekView mixin for calculating dates and titles - -fcViews.basicWeek = BasicWeekView; // register this view - -function BasicWeekView(calendar) { - BasicView.call(this, calendar); // call the super-constructor -} - - -BasicWeekView.prototype = createObject(BasicView.prototype); // define the super-class -$.extend(BasicWeekView.prototype, { - - name: 'basicWeek', - - - incrementDate: function(date, delta) { - return date.clone().stripTime().add(delta, 'weeks').startOf('week'); - }, - - - render: function(date) { - - this.intervalStart = date.clone().stripTime().startOf('week'); - this.intervalEnd = this.intervalStart.clone().add(1, 'weeks'); - - this.start = this.skipHiddenDays(this.intervalStart); - this.end = this.skipHiddenDays(this.intervalEnd, -1, true); - - this.title = this.calendar.formatRange( - this.start, - this.end.clone().subtract(1), // make inclusive by subtracting 1 ms - this.opt('titleFormat'), - ' \u2014 ' // emphasized dash - ); - - BasicView.prototype.render.call(this, 1, this.getCellsPerWeek(), false); // call the super-method - } - -}); -;; - -/* A view with a single simple day cell -----------------------------------------------------------------------------------------------------------------------*/ - -fcViews.basicDay = BasicDayView; // register this view - -function BasicDayView(calendar) { - BasicView.call(this, calendar); // call the super-constructor -} - - -BasicDayView.prototype = createObject(BasicView.prototype); // define the super-class -$.extend(BasicDayView.prototype, { - - name: 'basicDay', - - - incrementDate: function(date, delta) { - var out = date.clone().stripTime().add(delta, 'days'); - out = this.skipHiddenDays(out, delta < 0 ? -1 : 1); - return out; - }, - - - render: function(date) { - - this.start = this.intervalStart = date.clone().stripTime(); - this.end = this.intervalEnd = this.start.clone().add(1, 'days'); - - this.title = this.calendar.formatDate(this.start, this.opt('titleFormat')); - - BasicView.prototype.render.call(this, 1, 1, false); // call the super-method - } - -}); -;; - -/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically. -----------------------------------------------------------------------------------------------------------------------*/ -// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on). -// Responsible for managing width/height. - -setDefaults({ - allDaySlot: true, - allDayText: 'all-day', - - scrollTime: '06:00:00', - - slotDuration: '00:30:00', - - axisFormat: generateAgendaAxisFormat, - timeFormat: { - agenda: generateAgendaTimeFormat - }, - - minTime: '00:00:00', - maxTime: '24:00:00', - slotEventOverlap: true -}); - -var AGENDA_ALL_DAY_EVENT_LIMIT = 5; - - -function generateAgendaAxisFormat(options, langData) { - return langData.longDateFormat('LT') - .replace(':mm', '(:mm)') - .replace(/(\Wmm)$/, '($1)') // like above, but for foreign langs - .replace(/\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand -} - - -function generateAgendaTimeFormat(options, langData) { - return langData.longDateFormat('LT') - .replace(/\s*a$/i, ''); // remove trailing AM/PM -} - - -function AgendaView(calendar) { - View.call(this, calendar); // call the super-constructor - - this.timeGrid = new TimeGrid(this); - - if (this.opt('allDaySlot')) { // should we display the "all-day" area? - this.dayGrid = new DayGrid(this); // the all-day subcomponent of this view - - // the coordinate grid will be a combination of both subcomponents' grids - this.coordMap = new ComboCoordMap([ - this.dayGrid.coordMap, - this.timeGrid.coordMap - ]); - } - else { - this.coordMap = this.timeGrid.coordMap; - } -} - - -AgendaView.prototype = createObject(View.prototype); // define the super-class -$.extend(AgendaView.prototype, { - - timeGrid: null, // the main time-grid subcomponent of this view - dayGrid: null, // the "all-day" subcomponent. if all-day is turned off, this will be null - - axisWidth: null, // the width of the time axis running down the side - - noScrollRowEls: null, // set of fake row elements that must compensate when scrollerEl has scrollbars - - // when the time-grid isn't tall enough to occupy the given height, we render an
underneath - bottomRuleEl: null, - bottomRuleHeight: null, - - - /* Rendering - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders the view into `this.el`, which has already been assigned. - // `colCnt` has been calculated by a subclass and passed here. - render: function(colCnt) { - - // needed for cell-to-date and date-to-cell calculations in View - this.rowCnt = 1; - this.colCnt = colCnt; - - this.el.addClass('fc-agenda-view').html(this.renderHtml()); - - // the element that wraps the time-grid that will probably scroll - this.scrollerEl = this.el.find('.fc-time-grid-container'); - this.timeGrid.coordMap.containerEl = this.scrollerEl; // don't accept clicks/etc outside of this - - this.timeGrid.el = this.el.find('.fc-time-grid'); - this.timeGrid.render(); - - // the
that sometimes displays under the time-grid - this.bottomRuleEl = $('
') - .appendTo(this.timeGrid.el); // inject it into the time-grid - - if (this.dayGrid) { - this.dayGrid.el = this.el.find('.fc-day-grid'); - this.dayGrid.render(); - - // have the day-grid extend it's coordinate area over the
dividing the two grids - this.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight(); - } - - this.noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)'); // fake rows not within the scroller - - View.prototype.render.call(this); // call the super-method - - this.resetScroll(); // do this after sizes have been set - }, - - - // Make subcomponents ready for cleanup - destroy: function() { - this.timeGrid.destroy(); - if (this.dayGrid) { - this.dayGrid.destroy(); - } - View.prototype.destroy.call(this); // call the super-method - }, - - - // Builds the HTML skeleton for the view. - // The day-grid and time-grid components will render inside containers defined by this HTML. - renderHtml: function() { - return '' + - '
'; - } - if (endCol > startCol) { - cellHtml += ''; - } - if (colCnt > endCol) { - cellHtml += ''; - } - - cellHtml = this.bookendCells(cellHtml, 'highlight'); - - return '' + - '
' + - '' + - '' + - cellHtml + - '' + - '
' + - '
'; - } - -}); - -;; - -/* Event-rendering methods for the DayGrid class -----------------------------------------------------------------------------------------------------------------------*/ - -$.extend(DayGrid.prototype, { - - segs: null, - rowStructs: null, // an array of objects, each holding information about a row's event-rendering - - - // Render the given events onto the Grid and return the rendered segments - renderEvents: function(events) { - var rowStructs = this.rowStructs = this.renderEventRows(events); - var segs = []; - - // append to each row's content skeleton - this.rowEls.each(function(i, rowNode) { - $(rowNode).find('.fc-content-skeleton > table').append( - rowStructs[i].tbodyEl - ); - segs.push.apply(segs, rowStructs[i].segs); - }); - - this.segs = segs; - }, - - - // Retrieves all segment objects that have been rendered - getSegs: function() { - return (this.segs || []).concat( - this.popoverSegs || [] // segs rendered in the "more" events popover - ); - }, - - - // Removes all rendered event elements - destroyEvents: function() { - var rowStructs; - var rowStruct; - - Grid.prototype.destroyEvents.call(this); // call the super-method - - rowStructs = this.rowStructs || []; - while ((rowStruct = rowStructs.pop())) { - rowStruct.tbodyEl.remove(); - } - - this.segs = null; - this.destroySegPopover(); // removes the "more.." events popover - }, - - - // Uses the given events array to generate
elements of the level+col matrix - var loneCellMatrix = []; // lookup for elements that only take up a single column - var i, levelSegs; - var col; - var tr; - var j, seg; - var td; - - // populates empty cells from the current column (`col`) to `endCol` - function emptyCellsUntil(endCol) { - while (col < endCol) { - // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell - td = (loneCellMatrix[i - 1] || [])[col]; - if (td) { - td.attr( - 'rowspan', - parseInt(td.attr('rowspan') || 1, 10) + 1 - ); - } - else { - td = $(''); - tr.append(td); - } - cellMatrix[i][col] = td; - loneCellMatrix[i][col] = td; - col++; - } - } - - for (i = 0; i < levelCnt; i++) { // iterate through all levels - levelSegs = segLevels[i]; - col = 0; - tr = $('
').append(seg.el); - if (seg.leftCol != seg.rightCol) { - td.attr('colspan', seg.rightCol - seg.leftCol + 1); - } - else { // a single-column segment - loneCellMatrix[i][col] = td; - } - - while (col <= seg.rightCol) { - cellMatrix[i][col] = td; - segMatrix[i][col] = seg; - col++; - } - - tr.append(td); - } - } - - emptyCellsUntil(colCnt); // finish off the row - this.bookendCells(tr, 'eventSkeleton'); - tbody.append(tr); - } - - return { // a "rowStruct" - row: row, // the row number - tbodyEl: tbody, - cellMatrix: cellMatrix, - segMatrix: segMatrix, - segLevels: segLevels, - segs: rowSegs - }; - }, - - - // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels. - buildSegLevels: function(segs) { - var levels = []; - var i, seg; - var j; - - // Give preference to elements with certain criteria, so they have - // a chance to be closer to the top. - segs.sort(compareSegs); - - for (i = 0; i < segs.length; i++) { - seg = segs[i]; - - // loop through levels, starting with the topmost, until the segment doesn't collide with other segments - for (j = 0; j < levels.length; j++) { - if (!isDaySegCollision(seg, levels[j])) { - break; - } - } - // `j` now holds the desired subrow index - seg.level = j; - - // create new level array if needed and append segment - (levels[j] || (levels[j] = [])).push(seg); - } - - // order segments left-to-right. very important if calendar is RTL - for (j = 0; j < levels.length; j++) { - levels[j].sort(compareDaySegCols); - } - - return levels; - }, - - - // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row - groupSegRows: function(segs) { - var view = this.view; - var segRows = []; - var i; - - for (i = 0; i < view.rowCnt; i++) { - segRows.push([]); - } - - for (i = 0; i < segs.length; i++) { - segRows[segs[i].row].push(segs[i]); - } - - return segRows; - } - -}); - - -// Computes whether two segments' columns collide. They are assumed to be in the same row. -function isDaySegCollision(seg, otherSegs) { - var i, otherSeg; - - for (i = 0; i < otherSegs.length; i++) { - otherSeg = otherSegs[i]; - - if ( - otherSeg.leftCol <= seg.rightCol && - otherSeg.rightCol >= seg.leftCol - ) { - return true; - } - } - - return false; -} - - -// A cmp function for determining the leftmost event -function compareDaySegCols(a, b) { - return a.leftCol - b.leftCol; -} - -;; - -/* Methods relate to limiting the number events for a given day on a DayGrid -----------------------------------------------------------------------------------------------------------------------*/ - -$.extend(DayGrid.prototype, { - - - segPopover: null, // the Popover that holds events that can't fit in a cell. null when not visible - popoverSegs: null, // an array of segment objects that the segPopover holds. null when not visible - - - destroySegPopover: function() { - if (this.segPopover) { - this.segPopover.hide(); // will trigger destruction of `segPopover` and `popoverSegs` - } - }, - - - // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid. - // `levelLimit` can be false (don't limit), a number, or true (should be computed). - limitRows: function(levelLimit) { - var rowStructs = this.rowStructs || []; - var row; // row # - var rowLevelLimit; - - for (row = 0; row < rowStructs.length; row++) { - this.unlimitRow(row); - - if (!levelLimit) { - rowLevelLimit = false; - } - else if (typeof levelLimit === 'number') { - rowLevelLimit = levelLimit; - } - else { - rowLevelLimit = this.computeRowLevelLimit(row); - } - - if (rowLevelLimit !== false) { - this.limitRow(row, rowLevelLimit); - } - } - }, - - - // Computes the number of levels a row will accomodate without going outside its bounds. - // Assumes the row is "rigid" (maintains a constant height regardless of what is inside). - // `row` is the row number. - computeRowLevelLimit: function(row) { - var rowEl = this.rowEls.eq(row); // the containing "fake" row div - var rowHeight = rowEl.height(); // TODO: cache somehow? - var trEls = this.rowStructs[row].tbodyEl.children(); - var i, trEl; - - // Reveal one level
DOM nodes - var col = 0; // col # - var cell; - var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right - var cellMatrix; // a matrix (by level, then column) of all jQuery elements in the row - var limitedNodes; // array of temporarily hidden level
DOM nodes - var i, seg; - var segsBelow; // array of segment objects below `seg` in the current `col` - var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies - var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column) - var td, rowspan; - var segMoreNodes; // array of "more" cells that will stand-in for the current seg's cell - var j; - var moreTd, moreWrap, moreLink; - - // Iterates through empty level cells and places "more" links inside if need be - function emptyCellsUntil(endCol) { // goes from current `col` to `endCol` - while (col < endCol) { - cell = { row: row, col: col }; - segsBelow = _this.getCellSegs(cell, levelLimit); - if (segsBelow.length) { - td = cellMatrix[levelLimit - 1][col]; - moreLink = _this.renderMoreLink(cell, segsBelow); - moreWrap = $('
').append(moreLink); - td.append(moreWrap); - moreNodes.push(moreWrap[0]); - } - col++; - } - } - - if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit? - levelSegs = rowStruct.segLevels[levelLimit - 1]; - cellMatrix = rowStruct.cellMatrix; - - limitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level
for each column the segment occupies. will be one for each colspan - for (j = 0; j < colSegsBelow.length; j++) { - moreTd = $('').attr('rowspan', rowspan); - segsBelow = colSegsBelow[j]; - cell = { row: row, col: seg.leftCol + j }; - moreLink = this.renderMoreLink(cell, [ seg ].concat(segsBelow)); // count seg as hidden too - moreWrap = $('
').append(moreLink); - moreTd.append(moreWrap); - segMoreNodes.push(moreTd[0]); - moreNodes.push(moreTd[0]); - } - - td.addClass('fc-limited').after($(segMoreNodes)); // hide original
and inject replacements - limitedNodes.push(td[0]); - } - } - - emptyCellsUntil(view.colCnt); // finish off the level - rowStruct.moreEls = $(moreNodes); // for easy undoing later - rowStruct.limitedEls = $(limitedNodes); // for easy undoing later - } - }, - - - // Reveals all levels and removes all "more"-related elements for a grid's row. - // `row` is a row number. - unlimitRow: function(row) { - var rowStruct = this.rowStructs[row]; - - if (rowStruct.moreEls) { - rowStruct.moreEls.remove(); - rowStruct.moreEls = null; - } - - if (rowStruct.limitedEls) { - rowStruct.limitedEls.removeClass('fc-limited'); - rowStruct.limitedEls = null; - } - }, - - - // Renders an element that represents hidden event element for a cell. - // Responsible for attaching click handler as well. - renderMoreLink: function(cell, hiddenSegs) { - var _this = this; - var view = this.view; - - return $('') - .text( - this.getMoreLinkText(hiddenSegs.length) - ) - .on('click', function(ev) { - var clickOption = view.opt('eventLimitClick'); - var date = view.cellToDate(cell); - var moreEl = $(this); - var dayEl = _this.getCellDayEl(cell); - var allSegs = _this.getCellSegs(cell); - - // rescope the segments to be within the cell's date - var reslicedAllSegs = _this.resliceDaySegs(allSegs, date); - var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date); - - if (typeof clickOption === 'function') { - // the returned value can be an atomic option - clickOption = view.trigger('eventLimitClick', null, { - date: date, - dayEl: dayEl, - moreEl: moreEl, - segs: reslicedAllSegs, - hiddenSegs: reslicedHiddenSegs - }, ev); - } - - if (clickOption === 'popover') { - _this.showSegPopover(date, cell, moreEl, reslicedAllSegs); - } - else if (typeof clickOption === 'string') { // a view name - view.calendar.zoomTo(date, clickOption); - } - }); - }, - - - // Reveals the popover that displays all events within a cell - showSegPopover: function(date, cell, moreLink, segs) { - var _this = this; - var view = this.view; - var moreWrap = moreLink.parent(); // the
wrapper around the - var topEl; // the element we want to match the top coordinate of - var options; - - if (view.rowCnt == 1) { - topEl = this.view.el; // will cause the popover to cover any sort of header - } - else { - topEl = this.rowEls.eq(cell.row); // will align with top of row - } - - options = { - className: 'fc-more-popover', - content: this.renderSegPopoverContent(date, segs), - parentEl: this.el, - top: topEl.offset().top, - autoHide: true, // when the user clicks elsewhere, hide the popover - viewportConstrain: view.opt('popoverViewportConstrain'), - hide: function() { - // destroy everything when the popover is hidden - _this.segPopover.destroy(); - _this.segPopover = null; - _this.popoverSegs = null; - } - }; - - // Determine horizontal coordinate. - // We use the moreWrap instead of the
to avoid border confusion. - if (view.opt('isRTL')) { - options.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border - } - else { - options.left = moreWrap.offset().left - 1; // -1 to be over cell border - } - - this.segPopover = new Popover(options); - this.segPopover.show(); - }, - - - // Builds the inner DOM contents of the segment popover - renderSegPopoverContent: function(date, segs) { - var view = this.view; - var isTheme = view.opt('theme'); - var title = date.format(view.opt('dayPopoverFormat')); - var content = $( - '
' + - '' + - '' + - htmlEscape(title) + - '' + - '
' + - '
' + - '
' + - '
' + - '
' - ); - var segContainer = content.find('.fc-event-container'); - var i; - - // render each seg's `el` and only return the visible segs - segs = this.renderSegs(segs, true); // disableResizing=true - this.popoverSegs = segs; - - for (i = 0; i < segs.length; i++) { - - // because segments in the popover are not part of a grid coordinate system, provide a hint to any - // grids that want to do drag-n-drop about which cell it came from - segs[i].cellDate = date; - - segContainer.append(segs[i].el); - } - - return content; - }, - - - // Given the events within an array of segment objects, reslice them to be in a single day - resliceDaySegs: function(segs, dayDate) { - var events = $.map(segs, function(seg) { - return seg.event; - }); - var dayStart = dayDate.clone().stripTime(); - var dayEnd = dayStart.clone().add(1, 'days'); - - return this.eventsToSegs(events, dayStart, dayEnd); - }, - - - // Generates the text that should be inside a "more" link, given the number of events it represents - getMoreLinkText: function(num) { - var view = this.view; - var opt = view.opt('eventLimitText'); - - if (typeof opt === 'function') { - return opt(num); - } - else { - return '+' + num + ' ' + opt; - } - }, - - - // Returns segments within a given cell. - // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs. - getCellSegs: function(cell, startLevel) { - var segMatrix = this.rowStructs[cell.row].segMatrix; - var level = startLevel || 0; - var segs = []; - var seg; - - while (level < segMatrix.length) { - seg = segMatrix[level][cell.col]; - if (seg) { - segs.push(seg); - } - level++; - } - - return segs; - } - -}); - -;; - -/* A component that renders one or more columns of vertical time slots -----------------------------------------------------------------------------------------------------------------------*/ - -function TimeGrid(view) { - Grid.call(this, view); // call the super-constructor -} - - -TimeGrid.prototype = createObject(Grid.prototype); // define the super-class -$.extend(TimeGrid.prototype, { - - slotDuration: null, // duration of a "slot", a distinct time segment on given day, visualized by lines - snapDuration: null, // granularity of time for dragging and selecting - - minTime: null, // Duration object that denotes the first visible time of any given day - maxTime: null, // Duration object that denotes the exclusive visible end time of any given day - - dayEls: null, // cells elements in the day-row background - slatEls: null, // elements running horizontally across all columns - - slatTops: null, // an array of top positions, relative to the container. last item holds bottom of last slot - - highlightEl: null, // cell skeleton element for rendering the highlight - helperEl: null, // cell skeleton element for rendering the mock event "helper" - - - // Renders the time grid into `this.el`, which should already be assigned. - // Relies on the view's colCnt. In the future, this component should probably be self-sufficient. - render: function() { - this.processOptions(); - - this.el.html(this.renderHtml()); - - this.dayEls = this.el.find('.fc-day'); - this.slatEls = this.el.find('.fc-slats tr'); - - this.computeSlatTops(); - - Grid.prototype.render.call(this); // call the super-method - }, - - - // Renders the basic HTML skeleton for the grid - renderHtml: function() { - return '' + - '
' + - '' + - this.rowHtml('slotBg') + // leverages RowRenderer, which will call slotBgCellHtml - '
' + - '
' + - '
' + - '' + - this.slatRowHtml() + - '
' + - '
'; - }, - - - // Renders the HTML for a vertical background cell behind the slots. - // This method is distinct from 'bg' because we wanted a new `rowType` so the View could customize the rendering. - slotBgCellHtml: function(row, col, date) { - return this.bgCellHtml(row, col, date); - }, - - - // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL. - slatRowHtml: function() { - var view = this.view; - var calendar = view.calendar; - var isRTL = view.opt('isRTL'); - var html = ''; - var slotNormal = this.slotDuration.asMinutes() % 15 === 0; - var slotTime = moment.duration(+this.minTime); // wish there was .clone() for durations - var slotDate; // will be on the view's first day, but we only care about its time - var minutes; - var axisHtml; - - // Calculate the time for each slot - while (slotTime < this.maxTime) { - slotDate = view.start.clone().time(slotTime); // will be in UTC but that's good. to avoid DST issues - minutes = slotDate.minutes(); - - axisHtml = - '
' + - ((!slotNormal || !minutes) ? // if irregular slot duration, or on the hour, then display the time - '' + // for matchCellWidths - htmlEscape(calendar.formatDate(slotDate, view.opt('axisFormat'))) + - '' : - '' - ) + - '
' + - (isRTL ? axisHtml : '') + - "
'; - col = seg.col; - } - - // compute vertical position - dayDate = view.cellToDate(0, col); - top = this.computeDateTop(seg.start, dayDate); - bottom = this.computeDateTop(seg.end, dayDate); // the y position of the bottom edge - - // generate the cell HTML. bottom becomes negative because it needs to be a CSS value relative to the - // bottom edge of the zero-height container. - cellHtml += - '' + - '
' + - '
' + - '
' + - '
'; - } - - cellHtml = this.bookendCells(cellHtml, 'highlight'); - - return '' + - '
' + - '' + - '' + - cellHtml + - '' + - '
' + - '
'; - } - -}); - -;; - -/* Event-rendering methods for the TimeGrid class -----------------------------------------------------------------------------------------------------------------------*/ - -$.extend(TimeGrid.prototype, { - - segs: null, // segment objects rendered in the component. null of events haven't been rendered yet - eventSkeletonEl: null, // has cells with event-containers, which contain absolutely positioned event elements - - - // Renders the events onto the grid and returns an array of segments that have been rendered - renderEvents: function(events) { - var res = this.renderEventTable(events); - - this.eventSkeletonEl = $('
').append(res.tableEl); - this.el.append(this.eventSkeletonEl); - - this.segs = res.segs; - }, - - - // Retrieves rendered segment objects - getSegs: function() { - return this.segs || []; - }, - - - // Removes all event segment elements from the view - destroyEvents: function() { - Grid.prototype.destroyEvents.call(this); // call the super-method - - if (this.eventSkeletonEl) { - this.eventSkeletonEl.remove(); - this.eventSkeletonEl = null; - } - - this.segs = null; - }, - - - // Renders and returns the portion of the event-skeleton. - // Returns an object with properties 'tbodyEl' and 'segs'. - renderEventTable: function(events) { - var tableEl = $('
'); - var trEl = tableEl.find('tr'); - var segs = this.eventsToSegs(events); - var segCols; - var i, seg; - var col, colSegs; - var containerEl; - - segs = this.renderSegs(segs); // returns only the visible segs - segCols = this.groupSegCols(segs); // group into sub-arrays, and assigns 'col' to each seg - - this.computeSegVerticals(segs); // compute and assign top/bottom - - for (col = 0; col < segCols.length; col++) { // iterate each column grouping - colSegs = segCols[col]; - placeSlotSegs(colSegs); // compute horizontal coordinates, z-index's, and reorder the array - - containerEl = $('
'); - - // assign positioning CSS and insert into container - for (i = 0; i < colSegs.length; i++) { - seg = colSegs[i]; - seg.el.css(this.generateSegPositionCss(seg)); - - // if the height is short, add a className for alternate styling - if (seg.bottom - seg.top < 30) { - seg.el.addClass('fc-short'); - } - - containerEl.append(seg.el); - } - - trEl.append($('
').append(containerEl)); - } - - this.bookendCells(trEl, 'eventSkeleton'); - - return { - tableEl: tableEl, - segs: segs - }; - }, - - - // Refreshes the CSS top/bottom coordinates for each segment element. Probably after a window resize/zoom. - updateSegVerticals: function() { - var segs = this.segs; - var i; - - if (segs) { - this.computeSegVerticals(segs); - - for (i = 0; i < segs.length; i++) { - segs[i].el.css( - this.generateSegVerticalCss(segs[i]) - ); - } - } - }, - - - // For each segment in an array, computes and assigns its top and bottom properties - computeSegVerticals: function(segs) { - var i, seg; - - for (i = 0; i < segs.length; i++) { - seg = segs[i]; - seg.top = this.computeDateTop(seg.start, seg.start); - seg.bottom = this.computeDateTop(seg.end, seg.start); - } - }, - - - // Renders the HTML for a single event segment's default rendering - renderSegHtml: function(seg, disableResizing) { - var view = this.view; - var event = seg.event; - var isDraggable = view.isEventDraggable(event); - var isResizable = !disableResizing && seg.isEnd && view.isEventResizable(event); - var classes = this.getSegClasses(seg, isDraggable, isResizable); - var skinCss = this.getEventSkinCss(event); - var timeText; - var fullTimeText; // more verbose time text. for the print stylesheet - var startTimeText; // just the start time text - - classes.unshift('fc-time-grid-event'); - - if (view.isMultiDayEvent(event)) { // if the event appears to span more than one day... - // Don't display time text on segments that run entirely through a day. - // That would appear as midnight-midnight and would look dumb. - // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am) - if (seg.isStart || seg.isEnd) { - timeText = view.getEventTimeText(seg.start, seg.end); - fullTimeText = view.getEventTimeText(seg.start, seg.end, 'LT'); - startTimeText = view.getEventTimeText(seg.start, null); - } - } else { - // Display the normal time text for the *event's* times - timeText = view.getEventTimeText(event); - fullTimeText = view.getEventTimeText(event, 'LT'); - startTimeText = view.getEventTimeText(event.start, null); - } - - return '' + - '
' + - (timeText ? - '
' + - '' + htmlEscape(timeText) + '' + - '
' : - '' - ) + - (event.title ? - '
' + - htmlEscape(event.title) + - '
' : - '' - ) + - '
' + - '
' + - (isResizable ? - '
' : - '' - ) + - ''; - }, - - - // Generates an object with CSS properties/values that should be applied to an event segment element. - // Contains important positioning-related properties that should be applied to any event element, customized or not. - generateSegPositionCss: function(seg) { - var view = this.view; - var isRTL = view.opt('isRTL'); - var shouldOverlap = view.opt('slotEventOverlap'); - var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point - var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point - var props = this.generateSegVerticalCss(seg); // get top/bottom first - var left; // amount of space from left edge, a fraction of the total width - var right; // amount of space from right edge, a fraction of the total width - - if (shouldOverlap) { - // double the width, but don't go beyond the maximum forward coordinate (1.0) - forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2); - } - - if (isRTL) { - left = 1 - forwardCoord; - right = backwardCoord; - } - else { - left = backwardCoord; - right = 1 - forwardCoord; - } - - props.zIndex = seg.level + 1; // convert from 0-base to 1-based - props.left = left * 100 + '%'; - props.right = right * 100 + '%'; - - if (shouldOverlap && seg.forwardPressure) { - // add padding to the edge so that forward stacked events don't cover the resizer's icon - props[isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width - } - - return props; - }, - - - // Generates an object with CSS properties for the top/bottom coordinates of a segment element - generateSegVerticalCss: function(seg) { - return { - top: seg.top, - bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container - }; - }, - - - // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col - groupSegCols: function(segs) { - var view = this.view; - var segCols = []; - var i; - - for (i = 0; i < view.colCnt; i++) { - segCols.push([]); - } - - for (i = 0; i < segs.length; i++) { - segCols[segs[i].col].push(segs[i]); - } - - return segCols; - } - -}); - - -// Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each. -// Also reorders the given array by date! -function placeSlotSegs(segs) { - var levels; - var level0; - var i; - - segs.sort(compareSegs); // order by date - levels = buildSlotSegLevels(segs); - computeForwardSlotSegs(levels); - - if ((level0 = levels[0])) { - - for (i = 0; i < level0.length; i++) { - computeSlotSegPressures(level0[i]); - } - - for (i = 0; i < level0.length; i++) { - computeSlotSegCoords(level0[i], 0, 0); - } - } -} - - -// Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is -// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date. -function buildSlotSegLevels(segs) { - var levels = []; - var i, seg; - var j; - - for (i=0; i seg2.top && seg1.top < seg2.bottom; -} - - -// A cmp function for determining which forward segment to rely on more when computing coordinates. -function compareForwardSlotSegs(seg1, seg2) { - // put higher-pressure first - return seg2.forwardPressure - seg1.forwardPressure || - // put segments that are closer to initial edge first (and favor ones with no coords yet) - (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) || - // do normal sorting... - compareSegs(seg1, seg2); -} - -;; - -/* An abstract class from which other views inherit from -----------------------------------------------------------------------------------------------------------------------*/ -// Newer methods should be written as prototype methods, not in the monster `View` function at the bottom. - -View.prototype = { - - calendar: null, // owner Calendar object - coordMap: null, // a CoordMap object for converting pixel regions to dates - el: null, // the view's containing element. set by Calendar - - // important Moments - start: null, // the date of the very first cell - end: null, // the date after the very last cell - intervalStart: null, // the start of the interval of time the view represents (1st of month for month view) - intervalEnd: null, // the exclusive end of the interval of time the view represents - - // used for cell-to-date and date-to-cell calculations - rowCnt: null, // # of weeks - colCnt: null, // # of days displayed in a week - - isSelected: false, // boolean whether cells are user-selected or not - - // subclasses can optionally use a scroll container - scrollerEl: null, // the element that will most likely scroll when content is too tall - scrollTop: null, // cached vertical scroll value - - // classNames styled by jqui themes - widgetHeaderClass: null, - widgetContentClass: null, - highlightStateClass: null, - - // document handlers, bound to `this` object - documentMousedownProxy: null, - documentDragStartProxy: null, - - - // Serves as a "constructor" to suppliment the monster `View` constructor below - init: function() { - var tm = this.opt('theme') ? 'ui' : 'fc'; - - this.widgetHeaderClass = tm + '-widget-header'; - this.widgetContentClass = tm + '-widget-content'; - this.highlightStateClass = tm + '-state-highlight'; - - // save references to `this`-bound handlers - this.documentMousedownProxy = $.proxy(this, 'documentMousedown'); - this.documentDragStartProxy = $.proxy(this, 'documentDragStart'); - }, - - - // Renders the view inside an already-defined `this.el`. - // Subclasses should override this and then call the super method afterwards. - render: function() { - this.updateSize(); - this.trigger('viewRender', this, this, this.el); - - // attach handlers to document. do it here to allow for destroy/rerender - $(document) - .on('mousedown', this.documentMousedownProxy) - .on('dragstart', this.documentDragStartProxy); // jqui drag - }, - - - // Clears all view rendering, event elements, and unregisters handlers - destroy: function() { - this.unselect(); - this.trigger('viewDestroy', this, this, this.el); - this.destroyEvents(); - this.el.empty(); // removes inner contents but leaves the element intact - - $(document) - .off('mousedown', this.documentMousedownProxy) - .off('dragstart', this.documentDragStartProxy); - }, - - - // Used to determine what happens when the users clicks next/prev. Given -1 for prev, 1 for next. - // Should apply the delta to `date` (a Moment) and return it. - incrementDate: function(date, delta) { - // subclasses should implement - }, - - - /* Dimensions - ------------------------------------------------------------------------------------------------------------------*/ - - - // Refreshes anything dependant upon sizing of the container element of the grid - updateSize: function(isResize) { - if (isResize) { - this.recordScroll(); - } - this.updateHeight(); - this.updateWidth(); - }, - - - // Refreshes the horizontal dimensions of the calendar - updateWidth: function() { - // subclasses should implement - }, - - - // Refreshes the vertical dimensions of the calendar - updateHeight: function() { - var calendar = this.calendar; // we poll the calendar for height information - - this.setHeight( - calendar.getSuggestedViewHeight(), - calendar.isHeightAuto() - ); - }, - - - // Updates the vertical dimensions of the calendar to the specified height. - // if `isAuto` is set to true, height becomes merely a suggestion and the view should use its "natural" height. - setHeight: function(height, isAuto) { - // subclasses should implement - }, - - - // Given the total height of the view, return the number of pixels that should be used for the scroller. - // Utility for subclasses. - computeScrollerHeight: function(totalHeight) { - var both = this.el.add(this.scrollerEl); - var otherHeight; // cumulative height of everything that is not the scrollerEl in the view (header+borders) - - // fuckin IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked - both.css({ - position: 'relative', // cause a reflow, which will force fresh dimension recalculation - left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll - }); - otherHeight = this.el.outerHeight() - this.scrollerEl.height(); // grab the dimensions - both.css({ position: '', left: '' }); // undo hack - - return totalHeight - otherHeight; - }, - - - // Called for remembering the current scroll value of the scroller. - // Should be called before there is a destructive operation (like removing DOM elements) that might inadvertently - // change the scroll of the container. - recordScroll: function() { - if (this.scrollerEl) { - this.scrollTop = this.scrollerEl.scrollTop(); - } - }, - - - // Set the scroll value of the scroller to the previously recorded value. - // Should be called after we know the view's dimensions have been restored following some type of destructive - // operation (like temporarily removing DOM elements). - restoreScroll: function() { - if (this.scrollTop !== null) { - this.scrollerEl.scrollTop(this.scrollTop); - } - }, - - - /* Events - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders the events onto the view. - // Should be overriden by subclasses. Subclasses should call the super-method afterwards. - renderEvents: function(events) { - this.segEach(function(seg) { - this.trigger('eventAfterRender', seg.event, seg.event, seg.el); - }); - this.trigger('eventAfterAllRender'); - }, - - - // Removes event elements from the view. - // Should be overridden by subclasses. Should call this super-method FIRST, then subclass DOM destruction. - destroyEvents: function() { - this.segEach(function(seg) { - this.trigger('eventDestroy', seg.event, seg.event, seg.el); - }); - }, - - - // Given an event and the default element used for rendering, returns the element that should actually be used. - // Basically runs events and elements through the eventRender hook. - resolveEventEl: function(event, el) { - var custom = this.trigger('eventRender', event, event, el); - - if (custom === false) { // means don't render at all - el = null; - } - else if (custom && custom !== true) { - el = $(custom); - } - - return el; - }, - - - // Hides all rendered event segments linked to the given event - showEvent: function(event) { - this.segEach(function(seg) { - seg.el.css('visibility', ''); - }, event); - }, - - - // Shows all rendered event segments linked to the given event - hideEvent: function(event) { - this.segEach(function(seg) { - seg.el.css('visibility', 'hidden'); - }, event); - }, - - - // Iterates through event segments. Goes through all by default. - // If the optional `event` argument is specified, only iterates through segments linked to that event. - // The `this` value of the callback function will be the view. - segEach: function(func, event) { - var segs = this.getSegs(); - var i; - - for (i = 0; i < segs.length; i++) { - if (!event || segs[i].event._id === event._id) { - func.call(this, segs[i]); - } - } - }, - - - // Retrieves all the rendered segment objects for the view - getSegs: function() { - // subclasses must implement - }, - - - /* Event Drag Visualization - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of an event hovering over the specified date. - // `end` is a Moment and might be null. - // `seg` might be null. if specified, it is the segment object of the event being dragged. - // otherwise, an external event from outside the calendar is being dragged. - renderDrag: function(start, end, seg) { - // subclasses should implement - }, - - - // Unrenders a visual indication of event hovering - destroyDrag: function() { - // subclasses should implement - }, - - - // Handler for accepting externally dragged events being dropped in the view. - // Gets called when jqui's 'dragstart' is fired. - documentDragStart: function(ev, ui) { - var _this = this; - var dropDate = null; - var dragListener; - - if (this.opt('droppable')) { // only listen if this setting is on - - // listener that tracks mouse movement over date-associated pixel regions - dragListener = new DragListener(this.coordMap, { - cellOver: function(cell, date) { - dropDate = date; - _this.renderDrag(date); - }, - cellOut: function() { - dropDate = null; - _this.destroyDrag(); - } - }); - - // gets called, only once, when jqui drag is finished - $(document).one('dragstop', function(ev, ui) { - _this.destroyDrag(); - if (dropDate) { - _this.trigger('drop', ev.target, dropDate, ev, ui); - } - }); - - dragListener.startDrag(ev); // start listening immediately - } - }, - - - /* Selection - ------------------------------------------------------------------------------------------------------------------*/ - - - // Selects a date range on the view. `start` and `end` are both Moments. - // `ev` is the native mouse event that begin the interaction. - select: function(start, end, ev) { - this.unselect(ev); - this.renderSelection(start, end); - this.reportSelection(start, end, ev); - }, - - - // Renders a visual indication of the selection - renderSelection: function(start, end) { - // subclasses should implement - }, - - - // Called when a new selection is made. Updates internal state and triggers handlers. - reportSelection: function(start, end, ev) { - this.isSelected = true; - this.trigger('select', null, start, end, ev); - }, - - - // Undoes a selection. updates in the internal state and triggers handlers. - // `ev` is the native mouse event that began the interaction. - unselect: function(ev) { - if (this.isSelected) { - this.isSelected = false; - this.destroySelection(); - this.trigger('unselect', null, ev); - } - }, - - - // Unrenders a visual indication of selection - destroySelection: function() { - // subclasses should implement - }, - - - // Handler for unselecting when the user clicks something and the 'unselectAuto' setting is on - documentMousedown: function(ev) { - var ignore; - - // is there a selection, and has the user made a proper left click? - if (this.isSelected && this.opt('unselectAuto') && isPrimaryMouseButton(ev)) { - - // only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element - ignore = this.opt('unselectCancel'); - if (!ignore || !$(ev.target).closest(ignore).length) { - this.unselect(ev); - } - } - } - -}; - - -// We are mixing JavaScript OOP design patterns here by putting methods and member variables in the closed scope of the -// constructor. Going forward, methods should be part of the prototype. -function View(calendar) { - var t = this; - - // exports - t.calendar = calendar; - t.opt = opt; - t.trigger = trigger; - t.isEventDraggable = isEventDraggable; - t.isEventResizable = isEventResizable; - t.eventDrop = eventDrop; - t.eventResize = eventResize; - - // imports - var reportEventChange = calendar.reportEventChange; - - // locals - var options = calendar.options; - var nextDayThreshold = moment.duration(options.nextDayThreshold); - - - t.init(); // the "constructor" that concerns the prototype methods - - - function opt(name) { - var v = options[name]; - if ($.isPlainObject(v) && !isForcedAtomicOption(name)) { - return smartProperty(v, t.name); - } - return v; - } - - - function trigger(name, thisObj) { - return calendar.trigger.apply( - calendar, - [name, thisObj || t].concat(Array.prototype.slice.call(arguments, 2), [t]) - ); - } - - - - /* Event Editable Boolean Calculations - ------------------------------------------------------------------------------*/ - - - function isEventDraggable(event) { - var source = event.source || {}; - - return firstDefined( - event.startEditable, - source.startEditable, - opt('eventStartEditable'), - event.editable, - source.editable, - opt('editable') - ); - } - - - function isEventResizable(event) { - var source = event.source || {}; - - return firstDefined( - event.durationEditable, - source.durationEditable, - opt('eventDurationEditable'), - event.editable, - source.editable, - opt('editable') - ); - } - - - - /* Event Elements - ------------------------------------------------------------------------------*/ - - - // Compute the text that should be displayed on an event's element. - // Based off the settings of the view. Possible signatures: - // .getEventTimeText(event, formatStr) - // .getEventTimeText(startMoment, endMoment, formatStr) - // .getEventTimeText(startMoment, null, formatStr) - // `timeFormat` is used but the `formatStr` argument can be used to override. - t.getEventTimeText = function(event, formatStr) { - var start; - var end; - - if (typeof event === 'object' && typeof formatStr === 'object') { - // first two arguments are actually moments (or null). shift arguments. - start = event; - end = formatStr; - formatStr = arguments[2]; - } - else { - // otherwise, an event object was the first argument - start = event.start; - end = event.end; - } - - formatStr = formatStr || opt('timeFormat'); - - if (end && opt('displayEventEnd')) { - return calendar.formatRange(start, end, formatStr); - } - else { - return calendar.formatDate(start, formatStr); - } - }; - - - - /* Event Modification Reporting - ---------------------------------------------------------------------------------*/ - - - function eventDrop(el, event, newStart, ev) { - var mutateResult = calendar.mutateEvent(event, newStart, null); - - trigger( - 'eventDrop', - el, - event, - mutateResult.dateDelta, - function() { - mutateResult.undo(); - reportEventChange(); - }, - ev, - {} // jqui dummy - ); - - reportEventChange(); - } - - - function eventResize(el, event, newEnd, ev) { - var mutateResult = calendar.mutateEvent(event, null, newEnd); - - trigger( - 'eventResize', - el, - event, - mutateResult.durationDelta, - function() { - mutateResult.undo(); - reportEventChange(); - }, - ev, - {} // jqui dummy - ); - - reportEventChange(); - } - - - // ==================================================================================================== - // Utilities for day "cells" - // ==================================================================================================== - // The "basic" views are completely made up of day cells. - // The "agenda" views have day cells at the top "all day" slot. - // This was the obvious common place to put these utilities, but they should be abstracted out into - // a more meaningful class (like DayEventRenderer). - // ==================================================================================================== - - - // For determining how a given "cell" translates into a "date": - // - // 1. Convert the "cell" (row and column) into a "cell offset" (the # of the cell, cronologically from the first). - // Keep in mind that column indices are inverted with isRTL. This is taken into account. - // - // 2. Convert the "cell offset" to a "day offset" (the # of days since the first visible day in the view). - // - // 3. Convert the "day offset" into a "date" (a Moment). - // - // The reverse transformation happens when transforming a date into a cell. - - - // exports - t.isHiddenDay = isHiddenDay; - t.skipHiddenDays = skipHiddenDays; - t.getCellsPerWeek = getCellsPerWeek; - t.dateToCell = dateToCell; - t.dateToDayOffset = dateToDayOffset; - t.dayOffsetToCellOffset = dayOffsetToCellOffset; - t.cellOffsetToCell = cellOffsetToCell; - t.cellToDate = cellToDate; - t.cellToCellOffset = cellToCellOffset; - t.cellOffsetToDayOffset = cellOffsetToDayOffset; - t.dayOffsetToDate = dayOffsetToDate; - t.rangeToSegments = rangeToSegments; - t.isMultiDayEvent = isMultiDayEvent; - - - // internals - var hiddenDays = opt('hiddenDays') || []; // array of day-of-week indices that are hidden - var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) - var cellsPerWeek; - var dayToCellMap = []; // hash from dayIndex -> cellIndex, for one week - var cellToDayMap = []; // hash from cellIndex -> dayIndex, for one week - var isRTL = opt('isRTL'); - - - // initialize important internal variables - (function() { - - if (opt('weekends') === false) { - hiddenDays.push(0, 6); // 0=sunday, 6=saturday - } - - // Loop through a hypothetical week and determine which - // days-of-week are hidden. Record in both hashes (one is the reverse of the other). - for (var dayIndex=0, cellIndex=0; dayIndex<7; dayIndex++) { - dayToCellMap[dayIndex] = cellIndex; - isHiddenDayHash[dayIndex] = $.inArray(dayIndex, hiddenDays) != -1; - if (!isHiddenDayHash[dayIndex]) { - cellToDayMap[cellIndex] = dayIndex; - cellIndex++; - } - } - - cellsPerWeek = cellIndex; - if (!cellsPerWeek) { - throw 'invalid hiddenDays'; // all days were hidden? bad. - } - - })(); - - - // Is the current day hidden? - // `day` is a day-of-week index (0-6), or a Moment - function isHiddenDay(day) { - if (moment.isMoment(day)) { - day = day.day(); - } - return isHiddenDayHash[day]; - } - - - function getCellsPerWeek() { - return cellsPerWeek; - } - - - // Incrementing the current day until it is no longer a hidden day, returning a copy. - // If the initial value of `date` is not a hidden day, don't do anything. - // Pass `isExclusive` as `true` if you are dealing with an end date. - // `inc` defaults to `1` (increment one day forward each time) - function skipHiddenDays(date, inc, isExclusive) { - var out = date.clone(); - inc = inc || 1; - while ( - isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7] - ) { - out.add(inc, 'days'); - } - return out; - } - - - // - // TRANSFORMATIONS: cell -> cell offset -> day offset -> date - // - - // cell -> date (combines all transformations) - // Possible arguments: - // - row, col - // - { row:#, col: # } - function cellToDate() { - var cellOffset = cellToCellOffset.apply(null, arguments); - var dayOffset = cellOffsetToDayOffset(cellOffset); - var date = dayOffsetToDate(dayOffset); - return date; - } - - // cell -> cell offset - // Possible arguments: - // - row, col - // - { row:#, col:# } - function cellToCellOffset(row, col) { - var colCnt = t.colCnt; - - // rtl variables. wish we could pre-populate these. but where? - var dis = isRTL ? -1 : 1; - var dit = isRTL ? colCnt - 1 : 0; - - if (typeof row == 'object') { - col = row.col; - row = row.row; - } - var cellOffset = row * colCnt + (col * dis + dit); // column, adjusted for RTL (dis & dit) - - return cellOffset; - } - - // cell offset -> day offset - function cellOffsetToDayOffset(cellOffset) { - var day0 = t.start.day(); // first date's day of week - cellOffset += dayToCellMap[day0]; // normlize cellOffset to beginning-of-week - return Math.floor(cellOffset / cellsPerWeek) * 7 + // # of days from full weeks - cellToDayMap[ // # of days from partial last week - (cellOffset % cellsPerWeek + cellsPerWeek) % cellsPerWeek // crazy math to handle negative cellOffsets - ] - - day0; // adjustment for beginning-of-week normalization - } - - // day offset -> date - function dayOffsetToDate(dayOffset) { - return t.start.clone().add(dayOffset, 'days'); - } - - - // - // TRANSFORMATIONS: date -> day offset -> cell offset -> cell - // - - // date -> cell (combines all transformations) - function dateToCell(date) { - var dayOffset = dateToDayOffset(date); - var cellOffset = dayOffsetToCellOffset(dayOffset); - var cell = cellOffsetToCell(cellOffset); - return cell; - } - - // date -> day offset - function dateToDayOffset(date) { - return date.clone().stripTime().diff(t.start, 'days'); - } - - // day offset -> cell offset - function dayOffsetToCellOffset(dayOffset) { - var day0 = t.start.day(); // first date's day of week - dayOffset += day0; // normalize dayOffset to beginning-of-week - return Math.floor(dayOffset / 7) * cellsPerWeek + // # of cells from full weeks - dayToCellMap[ // # of cells from partial last week - (dayOffset % 7 + 7) % 7 // crazy math to handle negative dayOffsets - ] - - dayToCellMap[day0]; // adjustment for beginning-of-week normalization - } - - // cell offset -> cell (object with row & col keys) - function cellOffsetToCell(cellOffset) { - var colCnt = t.colCnt; - - // rtl variables. wish we could pre-populate these. but where? - var dis = isRTL ? -1 : 1; - var dit = isRTL ? colCnt - 1 : 0; - - var row = Math.floor(cellOffset / colCnt); - var col = ((cellOffset % colCnt + colCnt) % colCnt) * dis + dit; // column, adjusted for RTL (dis & dit) - return { - row: row, - col: col - }; - } - - - // - // Converts a date range into an array of segment objects. - // "Segments" are horizontal stretches of time, sliced up by row. - // A segment object has the following properties: - // - row - // - cols - // - isStart - // - isEnd - // - function rangeToSegments(start, end) { - - var rowCnt = t.rowCnt; - var colCnt = t.colCnt; - var segments = []; // array of segments to return - - // day offset for given date range - var dayRange = computeDayRange(start, end); // convert to a whole-day range - var rangeDayOffsetStart = dateToDayOffset(dayRange.start); - var rangeDayOffsetEnd = dateToDayOffset(dayRange.end); // an exclusive value - - // first and last cell offset for the given date range - // "last" implies inclusivity - var rangeCellOffsetFirst = dayOffsetToCellOffset(rangeDayOffsetStart); - var rangeCellOffsetLast = dayOffsetToCellOffset(rangeDayOffsetEnd) - 1; - - // loop through all the rows in the view - for (var row=0; row
' + - '' + // needed for matchCellWidths - htmlEscape(this.opt('weekNumberTitle')) + - '' + - '' + - '' + // needed for matchCellWidths - this.calendar.calculateWeekNumber(this.cellToDate(row, 0)) + - '' + - 's of the "number" row in the DayGrid's content skeleton. - // The number row will only exist if either day numbers or week numbers are turned on. - numberCellHtml: function(row, col, date) { - var classes; - - if (!this.dayNumbersVisible) { // if there are week numbers but not day numbers - return ''; // will create an empty space above events :( - } - - classes = this.dayGrid.getDayClasses(date); - classes.unshift('fc-day-number'); - - return '' + - '' + - date.date() + - '
' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '
' + - this.timeGrid.headHtml() + // render the day-of-week headers - '
' + - (this.dayGrid ? - '
' + - '
' : - '' - ) + - '
' + - '
' + - '
' + - '
'; - }, - - - // Generates the HTML that will go before the day-of week header cells. - // Queried by the TimeGrid subcomponent when generating rows. Ordering depends on isRTL. - headIntroHtml: function() { - var date; - var weekNumber; - var weekTitle; - var weekText; - - if (this.opt('weekNumbers')) { - date = this.cellToDate(0, 0); - weekNumber = this.calendar.calculateWeekNumber(date); - weekTitle = this.opt('weekNumberTitle'); - - if (this.opt('isRTL')) { - weekText = weekNumber + weekTitle; - } - else { - weekText = weekTitle + weekNumber; - } - - return '' + - '' + - '' + // needed for matchCellWidths - htmlEscape(weekText) + - '' + - ''; - } - else { - return ''; - } - }, - - - // Generates the HTML that goes before the all-day cells. - // Queried by the DayGrid subcomponent when generating rows. Ordering depends on isRTL. - dayIntroHtml: function() { - return '' + - '' + - '' + // needed for matchCellWidths - (this.opt('allDayHtml') || htmlEscape(this.opt('allDayText'))) + - '' + - ''; - }, - - - // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column. - slotBgIntroHtml: function() { - return ''; - }, - - - // Generates the HTML that goes before all other types of cells. - // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid. - // Queried by the TimeGrid and DayGrid subcomponents when generating rows. Ordering depends on isRTL. - introHtml: function() { - return ''; - }, - - - // Generates an HTML attribute string for setting the width of the axis, if it is known - axisStyleAttr: function() { - if (this.axisWidth !== null) { - return 'style="width:' + this.axisWidth + 'px"'; - } - return ''; - }, - - - /* Dimensions - ------------------------------------------------------------------------------------------------------------------*/ - - updateSize: function(isResize) { - if (isResize) { - this.timeGrid.resize(); - } - View.prototype.updateSize.call(this, isResize); - }, - - - // Refreshes the horizontal dimensions of the view - updateWidth: function() { - // make all axis cells line up, and record the width so newly created axis cells will have it - this.axisWidth = matchCellWidths(this.el.find('.fc-axis')); - }, - - - // Adjusts the vertical dimensions of the view to the specified values - setHeight: function(totalHeight, isAuto) { - var eventLimit; - var scrollerHeight; - - if (this.bottomRuleHeight === null) { - // calculate the height of the rule the very first time - this.bottomRuleHeight = this.bottomRuleEl.outerHeight(); - } - this.bottomRuleEl.hide(); // .show() will be called later if this
is necessary - - // reset all dimensions back to the original state - this.scrollerEl.css('overflow', ''); - unsetScroller(this.scrollerEl); - uncompensateScroll(this.noScrollRowEls); - - // limit number of events in the all-day area - if (this.dayGrid) { - this.dayGrid.destroySegPopover(); // kill the "more" popover if displayed - - eventLimit = this.opt('eventLimit'); - if (eventLimit && typeof eventLimit !== 'number') { - eventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number - } - if (eventLimit) { - this.dayGrid.limitRows(eventLimit); - } - } - - if (!isAuto) { // should we force dimensions of the scroll container, or let the contents be natural height? - - scrollerHeight = this.computeScrollerHeight(totalHeight); - if (setPotentialScroller(this.scrollerEl, scrollerHeight)) { // using scrollbars? - - // make the all-day and header rows lines up - compensateScroll(this.noScrollRowEls, getScrollbarWidths(this.scrollerEl)); - - // the scrollbar compensation might have changed text flow, which might affect height, so recalculate - // and reapply the desired height to the scroller. - scrollerHeight = this.computeScrollerHeight(totalHeight); - this.scrollerEl.height(scrollerHeight); - - this.restoreScroll(); - } - else { // no scrollbars - // still, force a height and display the bottom rule (marks the end of day) - this.scrollerEl.height(scrollerHeight).css('overflow', 'hidden'); // in case
goes outside - this.bottomRuleEl.show(); - } - } - }, - - - // Sets the scroll value of the scroller to the intial pre-configured state prior to allowing the user to change it. - resetScroll: function() { - var _this = this; - var scrollTime = moment.duration(this.opt('scrollTime')); - var top = this.timeGrid.computeTimeTop(scrollTime); - - // zoom can give weird floating-point values. rather scroll a little bit further - top = Math.ceil(top); - - if (top) { - top++; // to overcome top border that slots beyond the first have. looks better - } - - function scroll() { - _this.scrollerEl.scrollTop(top); - } - - scroll(); - setTimeout(scroll, 0); // overrides any previous scroll state made by the browser - }, - - - /* Events - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders events onto the view and populates the View's segment array - renderEvents: function(events) { - var dayEvents = []; - var timedEvents = []; - var daySegs = []; - var timedSegs; - var i; - - // separate the events into all-day and timed - for (i = 0; i < events.length; i++) { - if (events[i].allDay) { - dayEvents.push(events[i]); - } - else { - timedEvents.push(events[i]); - } - } - - // render the events in the subcomponents - timedSegs = this.timeGrid.renderEvents(timedEvents); - if (this.dayGrid) { - daySegs = this.dayGrid.renderEvents(dayEvents); - } - - // the all-day area is flexible and might have a lot of events, so shift the height - this.updateHeight(); - - View.prototype.renderEvents.call(this, events); // call the super-method - }, - - - // Retrieves all segment objects that are rendered in the view - getSegs: function() { - return this.timeGrid.getSegs().concat( - this.dayGrid ? this.dayGrid.getSegs() : [] - ); - }, - - - // Unrenders all event elements and clears internal segment data - destroyEvents: function() { - View.prototype.destroyEvents.call(this); // do this before the grids' segs have been cleared - - // if destroyEvents is being called as part of an event rerender, renderEvents will be called shortly - // after, so remember what the scroll value was so we can restore it. - this.recordScroll(); - - // destroy the events in the subcomponents - this.timeGrid.destroyEvents(); - if (this.dayGrid) { - this.dayGrid.destroyEvents(); - } - - // we DON'T need to call updateHeight() because: - // A) a renderEvents() call always happens after this, which will eventually call updateHeight() - // B) in IE8, this causes a flash whenever events are rerendered - }, - - - /* Event Dragging - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of an event being dragged over the view. - // A returned value of `true` signals that a mock "helper" event has been rendered. - renderDrag: function(start, end, seg) { - if (start.hasTime()) { - return this.timeGrid.renderDrag(start, end, seg); - } - else if (this.dayGrid) { - return this.dayGrid.renderDrag(start, end, seg); - } - }, - - - // Unrenders a visual indications of an event being dragged over the view - destroyDrag: function() { - this.timeGrid.destroyDrag(); - if (this.dayGrid) { - this.dayGrid.destroyDrag(); - } - }, - - - /* Selection - ------------------------------------------------------------------------------------------------------------------*/ - - - // Renders a visual indication of a selection - renderSelection: function(start, end) { - if (start.hasTime() || end.hasTime()) { - this.timeGrid.renderSelection(start, end); - } - else if (this.dayGrid) { - this.dayGrid.renderSelection(start, end); - } - }, - - - // Unrenders a visual indications of a selection - destroySelection: function() { - this.timeGrid.destroySelection(); - if (this.dayGrid) { - this.dayGrid.destroySelection(); - } - } - -}); - -;; - -/* A week view with an all-day cell area at the top, and a time grid below -----------------------------------------------------------------------------------------------------------------------*/ -// TODO: a WeekView mixin for calculating dates and titles - -fcViews.agendaWeek = AgendaWeekView; // register the view - -function AgendaWeekView(calendar) { - AgendaView.call(this, calendar); // call the super-constructor -} - - -AgendaWeekView.prototype = createObject(AgendaView.prototype); // define the super-class -$.extend(AgendaWeekView.prototype, { - - name: 'agendaWeek', - - - incrementDate: function(date, delta) { - return date.clone().stripTime().add(delta, 'weeks').startOf('week'); - }, - - - render: function(date) { - - this.intervalStart = date.clone().stripTime().startOf('week'); - this.intervalEnd = this.intervalStart.clone().add(1, 'weeks'); - - this.start = this.skipHiddenDays(this.intervalStart); - this.end = this.skipHiddenDays(this.intervalEnd, -1, true); - - this.title = this.calendar.formatRange( - this.start, - this.end.clone().subtract(1), // make inclusive by subtracting 1 ms - this.opt('titleFormat'), - ' \u2014 ' // emphasized dash - ); - - AgendaView.prototype.render.call(this, this.getCellsPerWeek()); // call the super-method - } - -}); - -;; - -/* A day view with an all-day cell area at the top, and a time grid below -----------------------------------------------------------------------------------------------------------------------*/ - -fcViews.agendaDay = AgendaDayView; // register the view - -function AgendaDayView(calendar) { - AgendaView.call(this, calendar); // call the super-constructor -} - - -AgendaDayView.prototype = createObject(AgendaView.prototype); // define the super-class -$.extend(AgendaDayView.prototype, { - - name: 'agendaDay', - - - incrementDate: function(date, delta) { - var out = date.clone().stripTime().add(delta, 'days'); - out = this.skipHiddenDays(out, delta < 0 ? -1 : 1); - return out; - }, - - - render: function(date) { - - this.start = this.intervalStart = date.clone().stripTime(); - this.end = this.intervalEnd = this.start.clone().add(1, 'days'); - - this.title = this.calendar.formatDate(this.start, this.opt('titleFormat')); - - AgendaView.prototype.render.call(this, 1); // call the super-method - } - -}); - -;; - +/*! + * FullCalendar v2.1.1 + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + +(function(factory) { + if (typeof define === 'function' && define.amd) { + define([ 'jquery', 'moment' ], factory); + } + else { + factory(jQuery, moment); + } +})(function($, moment) { + +;; + +var defaults = { + + lang: 'en', + + defaultTimedEventDuration: '02:00:00', + defaultAllDayEventDuration: { days: 1 }, + forceEventDuration: false, + nextDayThreshold: '09:00:00', // 9am + + // display + defaultView: 'month', + aspectRatio: 1.35, + header: { + left: 'title', + center: '', + right: 'today prev,next' + }, + weekends: true, + weekNumbers: false, + + weekNumberTitle: 'W', + weekNumberCalculation: 'local', + + //editable: false, + + // event ajax + lazyFetching: true, + startParam: 'start', + endParam: 'end', + timezoneParam: 'timezone', + + timezone: false, + + //allDayDefault: undefined, + + // time formats + titleFormat: { + month: 'MMMM YYYY', // like "September 1986". each language will override this + week: 'll', // like "Sep 4 1986" + day: 'LL' // like "September 4 1986" + }, + columnFormat: { + month: 'ddd', // like "Sat" + week: generateWeekColumnFormat, + day: 'dddd' // like "Saturday" + }, + timeFormat: { // for event elements + 'default': generateShortTimeFormat + }, + + displayEventEnd: { + month: false, + basicWeek: false, + 'default': true + }, + + // locale + isRTL: false, + defaultButtonText: { + prev: "prev", + next: "next", + prevYear: "prev year", + nextYear: "next year", + today: 'today', + month: 'month', + week: 'week', + day: 'day' + }, + + buttonIcons: { + prev: 'left-single-arrow', + next: 'right-single-arrow', + prevYear: 'left-double-arrow', + nextYear: 'right-double-arrow' + }, + + // jquery-ui theming + theme: false, + themeButtonIcons: { + prev: 'circle-triangle-w', + next: 'circle-triangle-e', + prevYear: 'seek-prev', + nextYear: 'seek-next' + }, + + dragOpacity: .75, + dragRevertDuration: 500, + dragScroll: true, + + //selectable: false, + unselectAuto: true, + + dropAccept: '*', + + eventLimit: false, + eventLimitText: 'more', + eventLimitClick: 'popover', + dayPopoverFormat: 'LL', + + handleWindowResize: true, + windowResizeDelay: 200 // milliseconds before a rerender happens + +}; + + +function generateShortTimeFormat(options, langData) { + return langData.longDateFormat('LT') + .replace(':mm', '(:mm)') + .replace(/(\Wmm)$/, '($1)') // like above, but for foreign langs + .replace(/\s*a$/i, 't'); // convert to AM/PM/am/pm to lowercase one-letter. remove any spaces beforehand +} + + +function generateWeekColumnFormat(options, langData) { + var format = langData.longDateFormat('L'); // for the format like "MM/DD/YYYY" + format = format.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g, ''); // strip the year off the edge, as well as other misc non-whitespace chars + if (options.isRTL) { + format += ' ddd'; // for RTL, add day-of-week to end + } + else { + format = 'ddd ' + format; // for LTR, add day-of-week to beginning + } + return format; +} + + +var langOptionHash = { + en: { + columnFormat: { + week: 'ddd M/D' // override for english. different from the generated default, which is MM/DD + }, + dayPopoverFormat: 'dddd, MMMM D' + } +}; + + +// right-to-left defaults +var rtlDefaults = { + header: { + left: 'next,prev today', + center: '', + right: 'title' + }, + buttonIcons: { + prev: 'right-single-arrow', + next: 'left-single-arrow', + prevYear: 'right-double-arrow', + nextYear: 'left-double-arrow' + }, + themeButtonIcons: { + prev: 'circle-triangle-e', + next: 'circle-triangle-w', + nextYear: 'seek-prev', + prevYear: 'seek-next' + } +}; + +;; + +var fc = $.fullCalendar = { version: "2.1.1" }; +var fcViews = fc.views = {}; + + +$.fn.fullCalendar = function(options) { + var args = Array.prototype.slice.call(arguments, 1); // for a possible method call + var res = this; // what this function will return (this jQuery object by default) + + this.each(function(i, _element) { // loop each DOM element involved + var element = $(_element); + var calendar = element.data('fullCalendar'); // get the existing calendar object (if any) + var singleRes; // the returned value of this single method call + + // a method call + if (typeof options === 'string') { + if (calendar && $.isFunction(calendar[options])) { + singleRes = calendar[options].apply(calendar, args); + if (!i) { + res = singleRes; // record the first method call result + } + if (options === 'destroy') { // for the destroy method, must remove Calendar object data + element.removeData('fullCalendar'); + } + } + } + // a new calendar initialization + else if (!calendar) { // don't initialize twice + calendar = new Calendar(element, options); + element.data('fullCalendar', calendar); + calendar.render(); + } + }); + + return res; +}; + + +// function for adding/overriding defaults +function setDefaults(d) { + mergeOptions(defaults, d); +} + + +// Recursively combines option hash-objects. +// Better than `$.extend(true, ...)` because arrays are not traversed/copied. +// +// called like: +// mergeOptions(target, obj1, obj2, ...) +// +function mergeOptions(target) { + + function mergeIntoTarget(name, value) { + if ($.isPlainObject(value) && $.isPlainObject(target[name]) && !isForcedAtomicOption(name)) { + // merge into a new object to avoid destruction + target[name] = mergeOptions({}, target[name], value); // combine. `value` object takes precedence + } + else if (value !== undefined) { // only use values that are set and not undefined + target[name] = value; + } + } + + for (var i=1; i").prependTo(element); + + header = new Header(t, options); + headerElement = header.render(); + if (headerElement) { + element.prepend(headerElement); + } + + changeView(options.defaultView); + + if (options.handleWindowResize) { + windowResizeProxy = debounce(windowResize, options.windowResizeDelay); // prevents rapid calls + $(window).resize(windowResizeProxy); + } + } + + + function destroy() { + + if (currentView) { + currentView.destroy(); + } + + header.destroy(); + content.remove(); + element.removeClass('fc fc-ltr fc-rtl fc-unthemed ui-widget'); + + $(window).unbind('resize', windowResizeProxy); + } + + + function elementVisible() { + return element.is(':visible'); + } + + + + // View Rendering + // ----------------------------------------------------------------------------------- + + + function changeView(viewName) { + renderView(0, viewName); + } + + + // Renders a view because of a date change, view-type change, or for the first time + function renderView(delta, viewName) { + ignoreWindowResize++; + + // if viewName is changing, destroy the old view + if (currentView && viewName && currentView.name !== viewName) { + header.deactivateButton(currentView.name); + freezeContentHeight(); // prevent a scroll jump when view element is removed + if (currentView.start) { // rendered before? + currentView.destroy(); + } + currentView.el.remove(); + currentView = null; + } + + // if viewName changed, or the view was never created, create a fresh view + if (!currentView && viewName) { + currentView = new fcViews[viewName](t); + currentView.el = $("
").appendTo(content); + header.activateButton(viewName); + } + + if (currentView) { + + // let the view determine what the delta means + if (delta) { + date = currentView.incrementDate(date, delta); + } + + // render or rerender the view + if ( + !currentView.start || // never rendered before + delta || // explicit date window change + !date.isWithin(currentView.intervalStart, currentView.intervalEnd) // implicit date window change + ) { + if (elementVisible()) { + + freezeContentHeight(); + if (currentView.start) { // rendered before? + currentView.destroy(); + } + currentView.render(date); + unfreezeContentHeight(); + + // need to do this after View::render, so dates are calculated + updateTitle(); + updateTodayButton(); + + getAndRenderEvents(); + } + } + } + + unfreezeContentHeight(); // undo any lone freezeContentHeight calls + ignoreWindowResize--; + } + + + + // Resizing + // ----------------------------------------------------------------------------------- + + + t.getSuggestedViewHeight = function() { + if (suggestedViewHeight === undefined) { + calcSize(); + } + return suggestedViewHeight; + }; + + + t.isHeightAuto = function() { + return options.contentHeight === 'auto' || options.height === 'auto'; + }; + + + function updateSize(shouldRecalc) { + if (elementVisible()) { + + if (shouldRecalc) { + _calcSize(); + } + + ignoreWindowResize++; + currentView.updateSize(true); // isResize=true. will poll getSuggestedViewHeight() and isHeightAuto() + ignoreWindowResize--; + + return true; // signal success + } + } + + + function calcSize() { + if (elementVisible()) { + _calcSize(); + } + } + + + function _calcSize() { // assumes elementVisible + if (typeof options.contentHeight === 'number') { // exists and not 'auto' + suggestedViewHeight = options.contentHeight; + } + else if (typeof options.height === 'number') { // exists and not 'auto' + suggestedViewHeight = options.height - (headerElement ? headerElement.outerHeight(true) : 0); + } + else { + suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5)); + } + } + + + function windowResize(ev) { + if ( + !ignoreWindowResize && + ev.target === window && // so we don't process jqui "resize" events that have bubbled up + currentView.start // view has already been rendered + ) { + if (updateSize(true)) { + currentView.trigger('windowResize', _element); + } + } + } + + + + /* Event Fetching/Rendering + -----------------------------------------------------------------------------*/ + // TODO: going forward, most of this stuff should be directly handled by the view + + + function refetchEvents() { // can be called as an API method + destroyEvents(); // so that events are cleared before user starts waiting for AJAX + fetchAndRenderEvents(); + } + + + function renderEvents() { // destroys old events if previously rendered + if (elementVisible()) { + freezeContentHeight(); + currentView.destroyEvents(); // no performance cost if never rendered + currentView.renderEvents(events); + unfreezeContentHeight(); + } + } + + + function destroyEvents() { + freezeContentHeight(); + currentView.destroyEvents(); + unfreezeContentHeight(); + } + + + function getAndRenderEvents() { + if (!options.lazyFetching || isFetchNeeded(currentView.start, currentView.end)) { + fetchAndRenderEvents(); + } + else { + renderEvents(); + } + } + + + function fetchAndRenderEvents() { + fetchEvents(currentView.start, currentView.end); + // ... will call reportEvents + // ... which will call renderEvents + } + + + // called when event data arrives + function reportEvents(_events) { + events = _events; + renderEvents(); + } + + + // called when a single event's data has been changed + function reportEventChange() { + renderEvents(); + } + + + + /* Header Updating + -----------------------------------------------------------------------------*/ + + + function updateTitle() { + header.updateTitle(currentView.title); + } + + + function updateTodayButton() { + var now = t.getNow(); + if (now.isWithin(currentView.intervalStart, currentView.intervalEnd)) { + header.disableButton('today'); + } + else { + header.enableButton('today'); + } + } + + + + /* Selection + -----------------------------------------------------------------------------*/ + + + function select(start, end) { + + start = t.moment(start); + if (end) { + end = t.moment(end); + } + else if (start.hasTime()) { + end = start.clone().add(t.defaultTimedEventDuration); + } + else { + end = start.clone().add(t.defaultAllDayEventDuration); + } + + currentView.select(start, end); + } + + + function unselect() { // safe to be called before renderView + if (currentView) { + currentView.unselect(); + } + } + + + + /* Date + -----------------------------------------------------------------------------*/ + + + function prev() { + renderView(-1); + } + + + function next() { + renderView(1); + } + + + function prevYear() { + date.add(-1, 'years'); + renderView(); + } + + + function nextYear() { + date.add(1, 'years'); + renderView(); + } + + + function today() { + date = t.getNow(); + renderView(); + } + + + function gotoDate(dateInput) { + date = t.moment(dateInput); + renderView(); + } + + + function incrementDate(delta) { + date.add(moment.duration(delta)); + renderView(); + } + + + // Forces navigation to a view for the given date. + // `viewName` can be a specific view name or a generic one like "week" or "day". + function zoomTo(newDate, viewName) { + var viewStr; + var match; + + if (!viewName || fcViews[viewName] === undefined) { // a general view name, or "auto" + viewName = viewName || 'day'; + viewStr = header.getViewsWithButtons().join(' '); // space-separated string of all the views in the header + + // try to match a general view name, like "week", against a specific one, like "agendaWeek" + match = viewStr.match(new RegExp('\\w+' + capitaliseFirstLetter(viewName))); + + // fall back to the day view being used in the header + if (!match) { + match = viewStr.match(/\w+Day/); + } + + viewName = match ? match[0] : 'agendaDay'; // fall back to agendaDay + } + + date = newDate; + changeView(viewName); + } + + + function getDate() { + return date.clone(); + } + + + + /* Height "Freezing" + -----------------------------------------------------------------------------*/ + + + function freezeContentHeight() { + content.css({ + width: '100%', + height: content.height(), + overflow: 'hidden' + }); + } + + + function unfreezeContentHeight() { + content.css({ + width: '', + height: '', + overflow: '' + }); + } + + + + /* Misc + -----------------------------------------------------------------------------*/ + + + function getCalendar() { + return t; + } + + + function getView() { + return currentView; + } + + + function option(name, value) { + if (value === undefined) { + return options[name]; + } + if (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') { + options[name] = value; + updateSize(true); // true = allow recalculation of height + } + } + + + function trigger(name, thisObj) { + if (options[name]) { + return options[name].apply( + thisObj || _element, + Array.prototype.slice.call(arguments, 2) + ); + } + } + +} + +;; + +/* Top toolbar area with buttons and title +----------------------------------------------------------------------------------------------------------------------*/ +// TODO: rename all header-related things to "toolbar" + +function Header(calendar, options) { + var t = this; + + // exports + t.render = render; + t.destroy = destroy; + t.updateTitle = updateTitle; + t.activateButton = activateButton; + t.deactivateButton = deactivateButton; + t.disableButton = disableButton; + t.enableButton = enableButton; + t.getViewsWithButtons = getViewsWithButtons; + + // locals + var el = $(); + var viewsWithButtons = []; + var tm; + + + function render() { + var sections = options.header; + + tm = options.theme ? 'ui' : 'fc'; + + if (sections) { + el = $("
") + .append(renderSection('left')) + .append(renderSection('right')) + .append(renderSection('center')) + .append('
'); + + return el; + } + } + + + function destroy() { + el.remove(); + } + + + function renderSection(position) { + var sectionEl = $('
'); + var buttonStr = options.header[position]; + + if (buttonStr) { + $.each(buttonStr.split(' '), function(i) { + var groupChildren = $(); + var isOnlyButtons = true; + var groupEl; + + $.each(this.split(','), function(j, buttonName) { + var buttonClick; + var themeIcon; + var normalIcon; + var defaultText; + var customText; + var innerHtml; + var classes; + var button; + + if (buttonName == 'title') { + groupChildren = groupChildren.add($('

 

')); // we always want it to take up height + isOnlyButtons = false; + } + else { + if (calendar[buttonName]) { // a calendar method + buttonClick = function() { + calendar[buttonName](); + }; + } + else if (fcViews[buttonName]) { // a view name + buttonClick = function() { + calendar.changeView(buttonName); + }; + viewsWithButtons.push(buttonName); + } + if (buttonClick) { + + // smartProperty allows different text per view button (ex: "Agenda Week" vs "Basic Week") + themeIcon = smartProperty(options.themeButtonIcons, buttonName); + normalIcon = smartProperty(options.buttonIcons, buttonName); + defaultText = smartProperty(options.defaultButtonText, buttonName); + customText = smartProperty(options.buttonText, buttonName); + + if (customText) { + innerHtml = htmlEscape(customText); + } + else if (themeIcon && options.theme) { + innerHtml = ""; + } + else if (normalIcon && !options.theme) { + innerHtml = ""; + } + else { + innerHtml = htmlEscape(defaultText || buttonName); + } + + classes = [ + 'fc-' + buttonName + '-button', + tm + '-button', + tm + '-state-default' + ]; + + button = $( // type="button" so that it doesn't submit a form + '' + ) + .click(function() { + // don't process clicks for disabled buttons + if (!button.hasClass(tm + '-state-disabled')) { + + buttonClick(); + + // after the click action, if the button becomes the "active" tab, or disabled, + // it should never have a hover class, so remove it now. + if ( + button.hasClass(tm + '-state-active') || + button.hasClass(tm + '-state-disabled') + ) { + button.removeClass(tm + '-state-hover'); + } + } + }) + .mousedown(function() { + // the *down* effect (mouse pressed in). + // only on buttons that are not the "active" tab, or disabled + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-down'); + }) + .mouseup(function() { + // undo the *down* effect + button.removeClass(tm + '-state-down'); + }) + .hover( + function() { + // the *hover* effect. + // only on buttons that are not the "active" tab, or disabled + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-hover'); + }, + function() { + // undo the *hover* effect + button + .removeClass(tm + '-state-hover') + .removeClass(tm + '-state-down'); // if mouseleave happens before mouseup + } + ); + + groupChildren = groupChildren.add(button); + } + } + }); + + if (isOnlyButtons) { + groupChildren + .first().addClass(tm + '-corner-left').end() + .last().addClass(tm + '-corner-right').end(); + } + + if (groupChildren.length > 1) { + groupEl = $('
'); + if (isOnlyButtons) { + groupEl.addClass('fc-button-group'); + } + groupEl.append(groupChildren); + sectionEl.append(groupEl); + } + else { + sectionEl.append(groupChildren); // 1 or 0 children + } + }); + } + + return sectionEl; + } + + + function updateTitle(text) { + el.find('h2').text(text); + } + + + function activateButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .addClass(tm + '-state-active'); + } + + + function deactivateButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .removeClass(tm + '-state-active'); + } + + + function disableButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .attr('disabled', 'disabled') + .addClass(tm + '-state-disabled'); + } + + + function enableButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .removeAttr('disabled') + .removeClass(tm + '-state-disabled'); + } + + + function getViewsWithButtons() { + return viewsWithButtons; + } + +} + +;; + +fc.sourceNormalizers = []; +fc.sourceFetchers = []; + +var ajaxDefaults = { + dataType: 'json', + cache: false +}; + +var eventGUID = 1; + + +function EventManager(options) { // assumed to be a calendar + var t = this; + + + // exports + t.isFetchNeeded = isFetchNeeded; + t.fetchEvents = fetchEvents; + t.addEventSource = addEventSource; + t.removeEventSource = removeEventSource; + t.updateEvent = updateEvent; + t.renderEvent = renderEvent; + t.removeEvents = removeEvents; + t.clientEvents = clientEvents; + t.mutateEvent = mutateEvent; + + + // imports + var trigger = t.trigger; + var getView = t.getView; + var reportEvents = t.reportEvents; + var getEventEnd = t.getEventEnd; + + + // locals + var stickySource = { events: [] }; + var sources = [ stickySource ]; + var rangeStart, rangeEnd; + var currentFetchID = 0; + var pendingSourceCnt = 0; + var loadingLevel = 0; + var cache = []; + + + $.each( + (options.events ? [ options.events ] : []).concat(options.eventSources || []), + function(i, sourceInput) { + var source = buildEventSource(sourceInput); + if (source) { + sources.push(source); + } + } + ); + + + + /* Fetching + -----------------------------------------------------------------------------*/ + + + function isFetchNeeded(start, end) { + return !rangeStart || // nothing has been fetched yet? + // or, a part of the new range is outside of the old range? (after normalizing) + start.clone().stripZone() < rangeStart.clone().stripZone() || + end.clone().stripZone() > rangeEnd.clone().stripZone(); + } + + + function fetchEvents(start, end) { + rangeStart = start; + rangeEnd = end; + cache = []; + var fetchID = ++currentFetchID; + var len = sources.length; + pendingSourceCnt = len; + for (var i=0; i cells, find the cell with the largest natural width and set the widths of all the +// cells to be that width. +// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline +function matchCellWidths(els) { + var maxInnerWidth = 0; + + els.find('> *').each(function(i, innerEl) { + var innerWidth = $(innerEl).outerWidth(); + if (innerWidth > maxInnerWidth) { + maxInnerWidth = innerWidth; + } + }); + + maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance + + els.width(maxInnerWidth); + + return maxInnerWidth; +} + + +// Turns a container element into a scroller if its contents is taller than the allotted height. +// Returns true if the element is now a scroller, false otherwise. +// NOTE: this method is best because it takes weird zooming dimensions into account +function setPotentialScroller(containerEl, height) { + containerEl.height(height).addClass('fc-scroller'); + + // are scrollbars needed? + if (containerEl[0].scrollHeight - 1 > containerEl[0].clientHeight) { // !!! -1 because IE is often off-by-one :( + return true; + } + + unsetScroller(containerEl); // undo + return false; +} + + +// Takes an element that might have been a scroller, and turns it back into a normal element. +function unsetScroller(containerEl) { + containerEl.height('').removeClass('fc-scroller'); +} + + +/* General DOM Utilities +----------------------------------------------------------------------------------------------------------------------*/ + + +// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51 +function getScrollParent(el) { + var position = el.css('position'), + scrollParent = el.parents().filter(function() { + var parent = $(this); + return (/(auto|scroll)/).test( + parent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x') + ); + }).eq(0); + + return position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent; +} + + +// Given a container element, return an object with the pixel values of the left/right scrollbars. +// Left scrollbars might occur on RTL browsers (IE maybe?) but I have not tested. +// PREREQUISITE: container element must have a single child with display:block +function getScrollbarWidths(container) { + var containerLeft = container.offset().left; + var containerRight = containerLeft + container.width(); + var inner = container.children(); + var innerLeft = inner.offset().left; + var innerRight = innerLeft + inner.outerWidth(); + + return { + left: innerLeft - containerLeft, + right: containerRight - innerRight + }; +} + + +// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac) +function isPrimaryMouseButton(ev) { + return ev.which == 1 && !ev.ctrlKey; +} + + +/* FullCalendar-specific Misc Utilities +----------------------------------------------------------------------------------------------------------------------*/ + + +// Creates a basic segment with the intersection of the two ranges. Returns undefined if no intersection. +// Expects all dates to be normalized to the same timezone beforehand. +function intersectionToSeg(subjectStart, subjectEnd, intervalStart, intervalEnd) { + var segStart, segEnd; + var isStart, isEnd; + + if (subjectEnd > intervalStart && subjectStart < intervalEnd) { // in bounds at all? + + if (subjectStart >= intervalStart) { + segStart = subjectStart.clone(); + isStart = true; + } + else { + segStart = intervalStart.clone(); + isStart = false; + } + + if (subjectEnd <= intervalEnd) { + segEnd = subjectEnd.clone(); + isEnd = true; + } + else { + segEnd = intervalEnd.clone(); + isEnd = false; + } + + return { + start: segStart, + end: segEnd, + isStart: isStart, + isEnd: isEnd + }; + } +} + + +function smartProperty(obj, name) { // get a camel-cased/namespaced property of an object + obj = obj || {}; + if (obj[name] !== undefined) { + return obj[name]; + } + var parts = name.split(/(?=[A-Z])/), + i = parts.length - 1, res; + for (; i>=0; i--) { + res = obj[parts[i].toLowerCase()]; + if (res !== undefined) { + return res; + } + } + return obj['default']; +} + + +/* Date Utilities +----------------------------------------------------------------------------------------------------------------------*/ + +var dayIDs = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ]; + + +// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time. +// Moments will have their timezones normalized. +function dayishDiff(a, b) { + return moment.duration({ + days: a.clone().stripTime().diff(b.clone().stripTime(), 'days'), + ms: a.time() - b.time() + }); +} + + +function isNativeDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date; +} + + +function dateCompare(a, b) { // works with Moments and native Dates + return a - b; +} + + +/* General Utilities +----------------------------------------------------------------------------------------------------------------------*/ + +fc.applyAll = applyAll; // export + + +// Create an object that has the given prototype. Just like Object.create +function createObject(proto) { + var f = function() {}; + f.prototype = proto; + return new f(); +} + + +// Copies specifically-owned (non-protoype) properties of `b` onto `a`. +// FYI, $.extend would copy *all* properties of `b` onto `a`. +function extend(a, b) { + for (var i in b) { + if (b.hasOwnProperty(i)) { + a[i] = b[i]; + } + } +} + + +function applyAll(functions, thisObj, args) { + if ($.isFunction(functions)) { + functions = [ functions ]; + } + if (functions) { + var i; + var ret; + for (i=0; i/g, '>') + .replace(/'/g, ''') + .replace(/"/g, '"') + .replace(/\n/g, '
'); +} + + +function stripHtmlEntities(text) { + return text.replace(/&.*?;/g, ''); +} + + +function capitaliseFirstLetter(str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} + + +// Returns a function, that, as long as it continues to be invoked, will not +// be triggered. The function will be called after it stops being called for +// N milliseconds. +// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714 +function debounce(func, wait) { + var timeoutId; + var args; + var context; + var timestamp; // of most recent call + var later = function() { + var last = +new Date() - timestamp; + if (last < wait && last > 0) { + timeoutId = setTimeout(later, wait - last); + } + else { + timeoutId = null; + func.apply(context, args); + if (!timeoutId) { + context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = +new Date(); + if (!timeoutId) { + timeoutId = setTimeout(later, wait); + } + }; +} + +;; + +var ambigDateOfMonthRegex = /^\s*\d{4}-\d\d$/; +var ambigTimeOrZoneRegex = + /^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/; + + +// Creating +// ------------------------------------------------------------------------------------------------- + +// Creates a new moment, similar to the vanilla moment(...) constructor, but with +// extra features (ambiguous time, enhanced formatting). When gived an existing moment, +// it will function as a clone (and retain the zone of the moment). Anything else will +// result in a moment in the local zone. +fc.moment = function() { + return makeMoment(arguments); +}; + +// Sames as fc.moment, but forces the resulting moment to be in the UTC timezone. +fc.moment.utc = function() { + var mom = makeMoment(arguments, true); + + // Force it into UTC because makeMoment doesn't guarantee it. + if (mom.hasTime()) { // don't give ambiguously-timed moments a UTC zone + mom.utc(); + } + + return mom; +}; + +// Same as fc.moment, but when given an ISO8601 string, the timezone offset is preserved. +// ISO8601 strings with no timezone offset will become ambiguously zoned. +fc.moment.parseZone = function() { + return makeMoment(arguments, true, true); +}; + +// Builds an FCMoment from args. When given an existing moment, it clones. When given a native +// Date, or called with no arguments (the current time), the resulting moment will be local. +// Anything else needs to be "parsed" (a string or an array), and will be affected by: +// parseAsUTC - if there is no zone information, should we parse the input in UTC? +// parseZone - if there is zone information, should we force the zone of the moment? +function makeMoment(args, parseAsUTC, parseZone) { + var input = args[0]; + var isSingleString = args.length == 1 && typeof input === 'string'; + var isAmbigTime; + var isAmbigZone; + var ambigMatch; + var output; // an object with fields for the new FCMoment object + + if (moment.isMoment(input)) { + output = moment.apply(null, args); // clone it + + // the ambig properties have not been preserved in the clone, so reassign them + if (input._ambigTime) { + output._ambigTime = true; + } + if (input._ambigZone) { + output._ambigZone = true; + } + } + else if (isNativeDate(input) || input === undefined) { + output = moment.apply(null, args); // will be local + } + else { // "parsing" is required + isAmbigTime = false; + isAmbigZone = false; + + if (isSingleString) { + if (ambigDateOfMonthRegex.test(input)) { + // accept strings like '2014-05', but convert to the first of the month + input += '-01'; + args = [ input ]; // for when we pass it on to moment's constructor + isAmbigTime = true; + isAmbigZone = true; + } + else if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) { + isAmbigTime = !ambigMatch[5]; // no time part? + isAmbigZone = true; + } + } + else if ($.isArray(input)) { + // arrays have no timezone information, so assume ambiguous zone + isAmbigZone = true; + } + // otherwise, probably a string with a format + + if (parseAsUTC) { + output = moment.utc.apply(moment, args); + } + else { + output = moment.apply(null, args); + } + + if (isAmbigTime) { + output._ambigTime = true; + output._ambigZone = true; // ambiguous time always means ambiguous zone + } + else if (parseZone) { // let's record the inputted zone somehow + if (isAmbigZone) { + output._ambigZone = true; + } + else if (isSingleString) { + output.zone(input); // if not a valid zone, will assign UTC + } + } + } + + return new FCMoment(output); +} + +// Our subclass of Moment. +// Accepts an object with the internal Moment properties that should be copied over to +// `this` object (most likely another Moment object). The values in this data must not +// be referenced by anything else (two moments sharing a Date object for example). +function FCMoment(internalData) { + extend(this, internalData); +} + +// Chain the prototype to Moment's +FCMoment.prototype = createObject(moment.fn); + +// We need this because Moment's implementation won't create an FCMoment, +// nor will it copy over the ambig flags. +FCMoment.prototype.clone = function() { + return makeMoment([ this ]); +}; + + +// Time-of-day +// ------------------------------------------------------------------------------------------------- + +// GETTER +// Returns a Duration with the hours/minutes/seconds/ms values of the moment. +// If the moment has an ambiguous time, a duration of 00:00 will be returned. +// +// SETTER +// You can supply a Duration, a Moment, or a Duration-like argument. +// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous. +FCMoment.prototype.time = function(time) { + if (time == null) { // getter + return moment.duration({ + hours: this.hours(), + minutes: this.minutes(), + seconds: this.seconds(), + milliseconds: this.milliseconds() + }); + } + else { // setter + + delete this._ambigTime; // mark that the moment now has a time + + if (!moment.isDuration(time) && !moment.isMoment(time)) { + time = moment.duration(time); + } + + // The day value should cause overflow (so 24 hours becomes 00:00:00 of next day). + // Only for Duration times, not Moment times. + var dayHours = 0; + if (moment.isDuration(time)) { + dayHours = Math.floor(time.asDays()) * 24; + } + + // We need to set the individual fields. + // Can't use startOf('day') then add duration. In case of DST at start of day. + return this.hours(dayHours + time.hours()) + .minutes(time.minutes()) + .seconds(time.seconds()) + .milliseconds(time.milliseconds()); + } +}; + +// Converts the moment to UTC, stripping out its time-of-day and timezone offset, +// but preserving its YMD. A moment with a stripped time will display no time +// nor timezone offset when .format() is called. +FCMoment.prototype.stripTime = function() { + var a = this.toArray(); // year,month,date,hours,minutes,seconds as an array + + // set the internal UTC flag + moment.fn.utc.call(this); // call the original method, because we don't want to affect _ambigZone + + this.year(a[0]) // TODO: find a way to do this in one shot + .month(a[1]) + .date(a[2]) + .hours(0) + .minutes(0) + .seconds(0) + .milliseconds(0); + + // Mark the time as ambiguous. This needs to happen after the .utc() call, which calls .zone(), which + // clears all ambig flags. Same concept with the .year/month/date calls in the case of moment-timezone. + this._ambigTime = true; + this._ambigZone = true; // if ambiguous time, also ambiguous timezone offset + + return this; // for chaining +}; + +// Returns if the moment has a non-ambiguous time (boolean) +FCMoment.prototype.hasTime = function() { + return !this._ambigTime; +}; + + +// Timezone +// ------------------------------------------------------------------------------------------------- + +// Converts the moment to UTC, stripping out its timezone offset, but preserving its +// YMD and time-of-day. A moment with a stripped timezone offset will display no +// timezone offset when .format() is called. +FCMoment.prototype.stripZone = function() { + var a = this.toArray(); // year,month,date,hours,minutes,seconds as an array + var wasAmbigTime = this._ambigTime; + + moment.fn.utc.call(this); // set the internal UTC flag + + this.year(a[0]) // TODO: find a way to do this in one shot + .month(a[1]) + .date(a[2]) + .hours(a[3]) + .minutes(a[4]) + .seconds(a[5]) + .milliseconds(a[6]); + + if (wasAmbigTime) { + // the above call to .utc()/.zone() unfortunately clears the ambig flags, so reassign + this._ambigTime = true; + } + + // Mark the zone as ambiguous. This needs to happen after the .utc() call, which calls .zone(), which + // clears all ambig flags. Same concept with the .year/month/date calls in the case of moment-timezone. + this._ambigZone = true; + + return this; // for chaining +}; + +// Returns of the moment has a non-ambiguous timezone offset (boolean) +FCMoment.prototype.hasZone = function() { + return !this._ambigZone; +}; + +// this method implicitly marks a zone +FCMoment.prototype.zone = function(tzo) { + + if (tzo != null) { + // FYI, the delete statements need to be before the .zone() call or else chaos ensues + // for reasons I don't understand. + delete this._ambigTime; + delete this._ambigZone; + } + + return moment.fn.zone.apply(this, arguments); +}; + +// this method implicitly marks a zone +FCMoment.prototype.local = function() { + var a = this.toArray(); // year,month,date,hours,minutes,seconds as an array + var wasAmbigZone = this._ambigZone; + + // will happen anyway via .local()/.zone(), but don't want to rely on internal implementation + delete this._ambigTime; + delete this._ambigZone; + + moment.fn.local.apply(this, arguments); + + if (wasAmbigZone) { + // If the moment was ambiguously zoned, the date fields were stored as UTC. + // We want to preserve these, but in local time. + this.year(a[0]) // TODO: find a way to do this in one shot + .month(a[1]) + .date(a[2]) + .hours(a[3]) + .minutes(a[4]) + .seconds(a[5]) + .milliseconds(a[6]); + } + + return this; // for chaining +}; + +// this method implicitly marks a zone +FCMoment.prototype.utc = function() { + + // will happen anyway via .local()/.zone(), but don't want to rely on internal implementation + delete this._ambigTime; + delete this._ambigZone; + + return moment.fn.utc.apply(this, arguments); +}; + + +// Formatting +// ------------------------------------------------------------------------------------------------- + +FCMoment.prototype.format = function() { + if (arguments[0]) { + return formatDate(this, arguments[0]); // our extended formatting + } + if (this._ambigTime) { + return momentFormat(this, 'YYYY-MM-DD'); + } + if (this._ambigZone) { + return momentFormat(this, 'YYYY-MM-DD[T]HH:mm:ss'); + } + return momentFormat(this); // default moment original formatting +}; + +FCMoment.prototype.toISOString = function() { + if (this._ambigTime) { + return momentFormat(this, 'YYYY-MM-DD'); + } + if (this._ambigZone) { + return momentFormat(this, 'YYYY-MM-DD[T]HH:mm:ss'); + } + return moment.fn.toISOString.apply(this, arguments); +}; + + +// Querying +// ------------------------------------------------------------------------------------------------- + +// Is the moment within the specified range? `end` is exclusive. +FCMoment.prototype.isWithin = function(start, end) { + var a = commonlyAmbiguate([ this, start, end ]); + return a[0] >= a[1] && a[0] < a[2]; +}; + +// When isSame is called with units, timezone ambiguity is normalized before the comparison happens. +// If no units are specified, the two moments must be identically the same, with matching ambig flags. +FCMoment.prototype.isSame = function(input, units) { + var a; + + if (units) { + a = commonlyAmbiguate([ this, input ], true); // normalize timezones but don't erase times + return moment.fn.isSame.call(a[0], a[1], units); + } + else { + input = fc.moment.parseZone(input); // normalize input + return moment.fn.isSame.call(this, input) && + Boolean(this._ambigTime) === Boolean(input._ambigTime) && + Boolean(this._ambigZone) === Boolean(input._ambigZone); + } +}; + +// Make these query methods work with ambiguous moments +$.each([ + 'isBefore', + 'isAfter' +], function(i, methodName) { + FCMoment.prototype[methodName] = function(input, units) { + var a = commonlyAmbiguate([ this, input ]); + return moment.fn[methodName].call(a[0], a[1], units); + }; +}); + + +// Misc Internals +// ------------------------------------------------------------------------------------------------- + +// given an array of moment-like inputs, return a parallel array w/ moments similarly ambiguated. +// for example, of one moment has ambig time, but not others, all moments will have their time stripped. +// set `preserveTime` to `true` to keep times, but only normalize zone ambiguity. +function commonlyAmbiguate(inputs, preserveTime) { + var outputs = []; + var anyAmbigTime = false; + var anyAmbigZone = false; + var i; + + for (i=0; i "MMMM D YYYY" + formatStr = localeData.longDateFormat(formatStr) || formatStr; + // BTW, this is not important for `formatDate` because it is impossible to put custom tokens + // or non-zero areas in Moment's localized format strings. + + separator = separator || ' - '; + + return formatRangeWithChunks( + date1, + date2, + getFormatStringChunks(formatStr), + separator, + isRTL + ); +} +fc.formatRange = formatRange; // expose + + +function formatRangeWithChunks(date1, date2, chunks, separator, isRTL) { + var chunkStr; // the rendering of the chunk + var leftI; + var leftStr = ''; + var rightI; + var rightStr = ''; + var middleI; + var middleStr1 = ''; + var middleStr2 = ''; + var middleStr = ''; + + // Start at the leftmost side of the formatting string and continue until you hit a token + // that is not the same between dates. + for (leftI=0; leftIleftI; rightI--) { + chunkStr = formatSimilarChunk(date1, date2, chunks[rightI]); + if (chunkStr === false) { + break; + } + rightStr = chunkStr + rightStr; + } + + // The area in the middle is different for both of the dates. + // Collect them distinctly so we can jam them together later. + for (middleI=leftI; middleI<=rightI; middleI++) { + middleStr1 += formatDateWithChunk(date1, chunks[middleI]); + middleStr2 += formatDateWithChunk(date2, chunks[middleI]); + } + + if (middleStr1 || middleStr2) { + if (isRTL) { + middleStr = middleStr2 + separator + middleStr1; + } + else { + middleStr = middleStr1 + separator + middleStr2; + } + } + + return leftStr + middleStr + rightStr; +} + + +var similarUnitMap = { + Y: 'year', + M: 'month', + D: 'day', // day of month + d: 'day', // day of week + // prevents a separator between anything time-related... + A: 'second', // AM/PM + a: 'second', // am/pm + T: 'second', // A/P + t: 'second', // a/p + H: 'second', // hour (24) + h: 'second', // hour (12) + m: 'second', // minute + s: 'second' // second +}; +// TODO: week maybe? + + +// Given a formatting chunk, and given that both dates are similar in the regard the +// formatting chunk is concerned, format date1 against `chunk`. Otherwise, return `false`. +function formatSimilarChunk(date1, date2, chunk) { + var token; + var unit; + + if (typeof chunk === 'string') { // a literal string + return chunk; + } + else if ((token = chunk.token)) { + unit = similarUnitMap[token.charAt(0)]; + // are the dates the same for this unit of measurement? + if (unit && date1.isSame(date2, unit)) { + return momentFormat(date1, token); // would be the same if we used `date2` + // BTW, don't support custom tokens + } + } + + return false; // the chunk is NOT the same for the two dates + // BTW, don't support splitting on non-zero areas +} + + +// Chunking Utils +// ------------------------------------------------------------------------------------------------- + + +var formatStringChunkCache = {}; + + +function getFormatStringChunks(formatStr) { + if (formatStr in formatStringChunkCache) { + return formatStringChunkCache[formatStr]; + } + return (formatStringChunkCache[formatStr] = chunkFormatString(formatStr)); +} + + +// Break the formatting string into an array of chunks +function chunkFormatString(formatStr) { + var chunks = []; + var chunker = /\[([^\]]*)\]|\(([^\)]*)\)|(LT|(\w)\4*o?)|([^\w\[\(]+)/g; // TODO: more descrimination + var match; + + while ((match = chunker.exec(formatStr))) { + if (match[1]) { // a literal string inside [ ... ] + chunks.push(match[1]); + } + else if (match[2]) { // non-zero formatting inside ( ... ) + chunks.push({ maybe: chunkFormatString(match[2]) }); + } + else if (match[3]) { // a formatting token + chunks.push({ token: match[3] }); + } + else if (match[5]) { // an unenclosed literal string + chunks.push(match[5]); + } + } + + return chunks; +} + +;; + +/* A rectangular panel that is absolutely positioned over other content +------------------------------------------------------------------------------------------------------------------------ +Options: + - className (string) + - content (HTML string or jQuery element set) + - parentEl + - top + - left + - right (the x coord of where the right edge should be. not a "CSS" right) + - autoHide (boolean) + - show (callback) + - hide (callback) +*/ + +function Popover(options) { + this.options = options || {}; +} + + +Popover.prototype = { + + isHidden: true, + options: null, + el: null, // the container element for the popover. generated by this object + documentMousedownProxy: null, // document mousedown handler bound to `this` + margin: 10, // the space required between the popover and the edges of the scroll container + + + // Shows the popover on the specified position. Renders it if not already + show: function() { + if (this.isHidden) { + if (!this.el) { + this.render(); + } + this.el.show(); + this.position(); + this.isHidden = false; + this.trigger('show'); + } + }, + + + // Hides the popover, through CSS, but does not remove it from the DOM + hide: function() { + if (!this.isHidden) { + this.el.hide(); + this.isHidden = true; + this.trigger('hide'); + } + }, + + + // Creates `this.el` and renders content inside of it + render: function() { + var _this = this; + var options = this.options; + + this.el = $('
') + .addClass(options.className || '') + .css({ + // position initially to the top left to avoid creating scrollbars + top: 0, + left: 0 + }) + .append(options.content) + .appendTo(options.parentEl); + + // when a click happens on anything inside with a 'fc-close' className, hide the popover + this.el.on('click', '.fc-close', function() { + _this.hide(); + }); + + if (options.autoHide) { + $(document).on('mousedown', this.documentMousedownProxy = $.proxy(this, 'documentMousedown')); + } + }, + + + // Triggered when the user clicks *anywhere* in the document, for the autoHide feature + documentMousedown: function(ev) { + // only hide the popover if the click happened outside the popover + if (this.el && !$(ev.target).closest(this.el).length) { + this.hide(); + } + }, + + + // Hides and unregisters any handlers + destroy: function() { + this.hide(); + + if (this.el) { + this.el.remove(); + this.el = null; + } + + $(document).off('mousedown', this.documentMousedownProxy); + }, + + + // Positions the popover optimally, using the top/left/right options + position: function() { + var options = this.options; + var origin = this.el.offsetParent().offset(); + var width = this.el.outerWidth(); + var height = this.el.outerHeight(); + var windowEl = $(window); + var viewportEl = getScrollParent(this.el); + var viewportTop; + var viewportLeft; + var viewportOffset; + var top; // the "position" (not "offset") values for the popover + var left; // + + // compute top and left + top = options.top || 0; + if (options.left !== undefined) { + left = options.left; + } + else if (options.right !== undefined) { + left = options.right - width; // derive the left value from the right value + } + else { + left = 0; + } + + if (viewportEl.is(window) || viewportEl.is(document)) { // normalize getScrollParent's result + viewportEl = windowEl; + viewportTop = 0; // the window is always at the top left + viewportLeft = 0; // (and .offset() won't work if called here) + } + else { + viewportOffset = viewportEl.offset(); + viewportTop = viewportOffset.top; + viewportLeft = viewportOffset.left; + } + + // if the window is scrolled, it causes the visible area to be further down + viewportTop += windowEl.scrollTop(); + viewportLeft += windowEl.scrollLeft(); + + // constrain to the view port. if constrained by two edges, give precedence to top/left + if (options.viewportConstrain !== false) { + top = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin); + top = Math.max(top, viewportTop + this.margin); + left = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin); + left = Math.max(left, viewportLeft + this.margin); + } + + this.el.css({ + top: top - origin.top, + left: left - origin.left + }); + }, + + + // Triggers a callback. Calls a function in the option hash of the same name. + // Arguments beyond the first `name` are forwarded on. + // TODO: better code reuse for this. Repeat code + trigger: function(name) { + if (this.options[name]) { + this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); + } + } + +}; + +;; + +/* A "coordinate map" converts pixel coordinates into an associated cell, which has an associated date +------------------------------------------------------------------------------------------------------------------------ +Common interface: + + CoordMap.prototype = { + build: function() {}, + getCell: function(x, y) {} + }; + +*/ + +/* Coordinate map for a grid component +----------------------------------------------------------------------------------------------------------------------*/ + +function GridCoordMap(grid) { + this.grid = grid; +} + + +GridCoordMap.prototype = { + + grid: null, // reference to the Grid + rows: null, // the top-to-bottom y coordinates. including the bottom of the last item + cols: null, // the left-to-right x coordinates. including the right of the last item + + containerEl: null, // container element that all coordinates are constrained to. optionally assigned + minX: null, + maxX: null, // exclusive + minY: null, + maxY: null, // exclusive + + + // Queries the grid for the coordinates of all the cells + build: function() { + this.grid.buildCoords( + this.rows = [], + this.cols = [] + ); + this.computeBounds(); + }, + + + // Given a coordinate of the document, gets the associated cell. If no cell is underneath, returns null + getCell: function(x, y) { + var cell = null; + var rows = this.rows; + var cols = this.cols; + var r = -1; + var c = -1; + var i; + + if (this.inBounds(x, y)) { + + for (i = 0; i < rows.length; i++) { + if (y >= rows[i][0] && y < rows[i][1]) { + r = i; + break; + } + } + + for (i = 0; i < cols.length; i++) { + if (x >= cols[i][0] && x < cols[i][1]) { + c = i; + break; + } + } + + if (r >= 0 && c >= 0) { + cell = { row: r, col: c }; + cell.grid = this.grid; + cell.date = this.grid.getCellDate(cell); + } + } + + return cell; + }, + + + // If there is a containerEl, compute the bounds into min/max values + computeBounds: function() { + var containerOffset; + + if (this.containerEl) { + containerOffset = this.containerEl.offset(); + this.minX = containerOffset.left; + this.maxX = containerOffset.left + this.containerEl.outerWidth(); + this.minY = containerOffset.top; + this.maxY = containerOffset.top + this.containerEl.outerHeight(); + } + }, + + + // Determines if the given coordinates are in bounds. If no `containerEl`, always true + inBounds: function(x, y) { + if (this.containerEl) { + return x >= this.minX && x < this.maxX && y >= this.minY && y < this.maxY; + } + return true; + } + +}; + + +/* Coordinate map that is a combination of multiple other coordinate maps +----------------------------------------------------------------------------------------------------------------------*/ + +function ComboCoordMap(coordMaps) { + this.coordMaps = coordMaps; +} + + +ComboCoordMap.prototype = { + + coordMaps: null, // an array of CoordMaps + + + // Builds all coordMaps + build: function() { + var coordMaps = this.coordMaps; + var i; + + for (i = 0; i < coordMaps.length; i++) { + coordMaps[i].build(); + } + }, + + + // Queries all coordMaps for the cell underneath the given coordinates, returning the first result + getCell: function(x, y) { + var coordMaps = this.coordMaps; + var cell = null; + var i; + + for (i = 0; i < coordMaps.length && !cell; i++) { + cell = coordMaps[i].getCell(x, y); + } + + return cell; + } + +}; +;; + +/* Tracks mouse movements over a CoordMap and raises events about which cell the mouse is over. +----------------------------------------------------------------------------------------------------------------------*/ +// TODO: implement scrolling + +function DragListener(coordMap, options) { + this.coordMap = coordMap; + this.options = options || {}; +} + + +DragListener.prototype = { + + coordMap: null, + options: null, + + isListening: false, + isDragging: false, + + // the cell/date the mouse was over when listening started + origCell: null, + origDate: null, + + // the cell/date the mouse is over + cell: null, + date: null, + + // coordinates of the initial mousedown + mouseX0: null, + mouseY0: null, + + // handler attached to the document, bound to the DragListener's `this` + mousemoveProxy: null, + mouseupProxy: null, + + scrollEl: null, + scrollBounds: null, // { top, bottom, left, right } + scrollTopVel: null, // pixels per second + scrollLeftVel: null, // pixels per second + scrollIntervalId: null, // ID of setTimeout for scrolling animation loop + scrollHandlerProxy: null, // this-scoped function for handling when scrollEl is scrolled + + scrollSensitivity: 30, // pixels from edge for scrolling to start + scrollSpeed: 200, // pixels per second, at maximum speed + scrollIntervalMs: 50, // millisecond wait between scroll increment + + + // Call this when the user does a mousedown. Will probably lead to startListening + mousedown: function(ev) { + if (isPrimaryMouseButton(ev)) { + + ev.preventDefault(); // prevents native selection in most browsers + + this.startListening(ev); + + // start the drag immediately if there is no minimum distance for a drag start + if (!this.options.distance) { + this.startDrag(ev); + } + } + }, + + + // Call this to start tracking mouse movements + startListening: function(ev) { + var scrollParent; + var cell; + + if (!this.isListening) { + + // grab scroll container and attach handler + if (ev && this.options.scroll) { + scrollParent = getScrollParent($(ev.target)); + if (!scrollParent.is(window) && !scrollParent.is(document)) { + this.scrollEl = scrollParent; + + // scope to `this`, and use `debounce` to make sure rapid calls don't happen + this.scrollHandlerProxy = debounce($.proxy(this, 'scrollHandler'), 100); + this.scrollEl.on('scroll', this.scrollHandlerProxy); + } + } + + this.computeCoords(); // relies on `scrollEl` + + // get info on the initial cell, date, and coordinates + if (ev) { + cell = this.getCell(ev); + this.origCell = cell; + this.origDate = cell ? cell.date : null; + + this.mouseX0 = ev.pageX; + this.mouseY0 = ev.pageY; + } + + $(document) + .on('mousemove', this.mousemoveProxy = $.proxy(this, 'mousemove')) + .on('mouseup', this.mouseupProxy = $.proxy(this, 'mouseup')) + .on('selectstart', this.preventDefault); // prevents native selection in IE<=8 + + this.isListening = true; + this.trigger('listenStart', ev); + } + }, + + + // Recomputes the drag-critical positions of elements + computeCoords: function() { + this.coordMap.build(); + this.computeScrollBounds(); + }, + + + // Called when the user moves the mouse + mousemove: function(ev) { + var minDistance; + var distanceSq; // current distance from mouseX0/mouseY0, squared + + if (!this.isDragging) { // if not already dragging... + // then start the drag if the minimum distance criteria is met + minDistance = this.options.distance || 1; + distanceSq = Math.pow(ev.pageX - this.mouseX0, 2) + Math.pow(ev.pageY - this.mouseY0, 2); + if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem + this.startDrag(ev); + } + } + + if (this.isDragging) { + this.drag(ev); // report a drag, even if this mousemove initiated the drag + } + }, + + + // Call this to initiate a legitimate drag. + // This function is called internally from this class, but can also be called explicitly from outside + startDrag: function(ev) { + var cell; + + if (!this.isListening) { // startDrag must have manually initiated + this.startListening(); + } + + if (!this.isDragging) { + this.isDragging = true; + this.trigger('dragStart', ev); + + // report the initial cell the mouse is over + cell = this.getCell(ev); + if (cell) { + this.cellOver(cell, true); + } + } + }, + + + // Called while the mouse is being moved and when we know a legitimate drag is taking place + drag: function(ev) { + var cell; + + if (this.isDragging) { + cell = this.getCell(ev); + + if (!isCellsEqual(cell, this.cell)) { // a different cell than before? + if (this.cell) { + this.cellOut(); + } + if (cell) { + this.cellOver(cell); + } + } + + this.dragScroll(ev); // will possibly cause scrolling + } + }, + + + // Called when a the mouse has just moved over a new cell + cellOver: function(cell) { + this.cell = cell; + this.date = cell.date; + this.trigger('cellOver', cell, cell.date); + }, + + + // Called when the mouse has just moved out of a cell + cellOut: function() { + if (this.cell) { + this.trigger('cellOut', this.cell); + this.cell = null; + this.date = null; + } + }, + + + // Called when the user does a mouseup + mouseup: function(ev) { + this.stopDrag(ev); + this.stopListening(ev); + }, + + + // Called when the drag is over. Will not cause listening to stop however. + // A concluding 'cellOut' event will NOT be triggered. + stopDrag: function(ev) { + if (this.isDragging) { + this.stopScrolling(); + this.trigger('dragStop', ev); + this.isDragging = false; + } + }, + + + // Call this to stop listening to the user's mouse events + stopListening: function(ev) { + if (this.isListening) { + + // remove the scroll handler if there is a scrollEl + if (this.scrollEl) { + this.scrollEl.off('scroll', this.scrollHandlerProxy); + this.scrollHandlerProxy = null; + } + + $(document) + .off('mousemove', this.mousemoveProxy) + .off('mouseup', this.mouseupProxy) + .off('selectstart', this.preventDefault); + + this.mousemoveProxy = null; + this.mouseupProxy = null; + + this.isListening = false; + this.trigger('listenStop', ev); + + this.origCell = this.cell = null; + this.origDate = this.date = null; + } + }, + + + // Gets the cell underneath the coordinates for the given mouse event + getCell: function(ev) { + return this.coordMap.getCell(ev.pageX, ev.pageY); + }, + + + // Triggers a callback. Calls a function in the option hash of the same name. + // Arguments beyond the first `name` are forwarded on. + trigger: function(name) { + if (this.options[name]) { + this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); + } + }, + + + // Stops a given mouse event from doing it's native browser action. In our case, text selection. + preventDefault: function(ev) { + ev.preventDefault(); + }, + + + /* Scrolling + ------------------------------------------------------------------------------------------------------------------*/ + + + // Computes and stores the bounding rectangle of scrollEl + computeScrollBounds: function() { + var el = this.scrollEl; + var offset; + + if (el) { + offset = el.offset(); + this.scrollBounds = { + top: offset.top, + left: offset.left, + bottom: offset.top + el.outerHeight(), + right: offset.left + el.outerWidth() + }; + } + }, + + + // Called when the dragging is in progress and scrolling should be updated + dragScroll: function(ev) { + var sensitivity = this.scrollSensitivity; + var bounds = this.scrollBounds; + var topCloseness, bottomCloseness; + var leftCloseness, rightCloseness; + var topVel = 0; + var leftVel = 0; + + if (bounds) { // only scroll if scrollEl exists + + // compute closeness to edges. valid range is from 0.0 - 1.0 + topCloseness = (sensitivity - (ev.pageY - bounds.top)) / sensitivity; + bottomCloseness = (sensitivity - (bounds.bottom - ev.pageY)) / sensitivity; + leftCloseness = (sensitivity - (ev.pageX - bounds.left)) / sensitivity; + rightCloseness = (sensitivity - (bounds.right - ev.pageX)) / sensitivity; + + // translate vertical closeness into velocity. + // mouse must be completely in bounds for velocity to happen. + if (topCloseness >= 0 && topCloseness <= 1) { + topVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up + } + else if (bottomCloseness >= 0 && bottomCloseness <= 1) { + topVel = bottomCloseness * this.scrollSpeed; + } + + // translate horizontal closeness into velocity + if (leftCloseness >= 0 && leftCloseness <= 1) { + leftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left + } + else if (rightCloseness >= 0 && rightCloseness <= 1) { + leftVel = rightCloseness * this.scrollSpeed; + } + } + + this.setScrollVel(topVel, leftVel); + }, + + + // Sets the speed-of-scrolling for the scrollEl + setScrollVel: function(topVel, leftVel) { + + this.scrollTopVel = topVel; + this.scrollLeftVel = leftVel; + + this.constrainScrollVel(); // massages into realistic values + + // if there is non-zero velocity, and an animation loop hasn't already started, then START + if ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) { + this.scrollIntervalId = setInterval( + $.proxy(this, 'scrollIntervalFunc'), // scope to `this` + this.scrollIntervalMs + ); + } + }, + + + // Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way + constrainScrollVel: function() { + var el = this.scrollEl; + + if (this.scrollTopVel < 0) { // scrolling up? + if (el.scrollTop() <= 0) { // already scrolled all the way up? + this.scrollTopVel = 0; + } + } + else if (this.scrollTopVel > 0) { // scrolling down? + if (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) { // already scrolled all the way down? + this.scrollTopVel = 0; + } + } + + if (this.scrollLeftVel < 0) { // scrolling left? + if (el.scrollLeft() <= 0) { // already scrolled all the left? + this.scrollLeftVel = 0; + } + } + else if (this.scrollLeftVel > 0) { // scrolling right? + if (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) { // already scrolled all the way right? + this.scrollLeftVel = 0; + } + } + }, + + + // This function gets called during every iteration of the scrolling animation loop + scrollIntervalFunc: function() { + var el = this.scrollEl; + var frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by + + // change the value of scrollEl's scroll + if (this.scrollTopVel) { + el.scrollTop(el.scrollTop() + this.scrollTopVel * frac); + } + if (this.scrollLeftVel) { + el.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac); + } + + this.constrainScrollVel(); // since the scroll values changed, recompute the velocities + + // if scrolled all the way, which causes the vels to be zero, stop the animation loop + if (!this.scrollTopVel && !this.scrollLeftVel) { + this.stopScrolling(); + } + }, + + + // Kills any existing scrolling animation loop + stopScrolling: function() { + if (this.scrollIntervalId) { + clearInterval(this.scrollIntervalId); + this.scrollIntervalId = null; + + // when all done with scrolling, recompute positions since they probably changed + this.computeCoords(); + } + }, + + + // Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce) + scrollHandler: function() { + // recompute all coordinates, but *only* if this is *not* part of our scrolling animation + if (!this.scrollIntervalId) { + this.computeCoords(); + } + } + +}; + + +// Returns `true` if the cells are identically equal. `false` otherwise. +// They must have the same row, col, and be from the same grid. +// Two null values will be considered equal, as two "out of the grid" states are the same. +function isCellsEqual(cell1, cell2) { + + if (!cell1 && !cell2) { + return true; + } + + if (cell1 && cell2) { + return cell1.grid === cell2.grid && + cell1.row === cell2.row && + cell1.col === cell2.col; + } + + return false; +} + +;; + +/* Creates a clone of an element and lets it track the mouse as it moves +----------------------------------------------------------------------------------------------------------------------*/ + +function MouseFollower(sourceEl, options) { + this.options = options = options || {}; + this.sourceEl = sourceEl; + this.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent +} + + +MouseFollower.prototype = { + + options: null, + + sourceEl: null, // the element that will be cloned and made to look like it is dragging + el: null, // the clone of `sourceEl` that will track the mouse + parentEl: null, // the element that `el` (the clone) will be attached to + + // the initial position of el, relative to the offset parent. made to match the initial offset of sourceEl + top0: null, + left0: null, + + // the initial position of the mouse + mouseY0: null, + mouseX0: null, + + // the number of pixels the mouse has moved from its initial position + topDelta: null, + leftDelta: null, + + mousemoveProxy: null, // document mousemove handler, bound to the MouseFollower's `this` + + isFollowing: false, + isHidden: false, + isAnimating: false, // doing the revert animation? + + + // Causes the element to start following the mouse + start: function(ev) { + if (!this.isFollowing) { + this.isFollowing = true; + + this.mouseY0 = ev.pageY; + this.mouseX0 = ev.pageX; + this.topDelta = 0; + this.leftDelta = 0; + + if (!this.isHidden) { + this.updatePosition(); + } + + $(document).on('mousemove', this.mousemoveProxy = $.proxy(this, 'mousemove')); + } + }, + + + // Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position. + // `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately. + stop: function(shouldRevert, callback) { + var _this = this; + var revertDuration = this.options.revertDuration; + + function complete() { + this.isAnimating = false; + _this.destroyEl(); + + this.top0 = this.left0 = null; // reset state for future updatePosition calls + + if (callback) { + callback(); + } + } + + if (this.isFollowing && !this.isAnimating) { // disallow more than one stop animation at a time + this.isFollowing = false; + + $(document).off('mousemove', this.mousemoveProxy); + + if (shouldRevert && revertDuration && !this.isHidden) { // do a revert animation? + this.isAnimating = true; + this.el.animate({ + top: this.top0, + left: this.left0 + }, { + duration: revertDuration, + complete: complete + }); + } + else { + complete(); + } + } + }, + + + // Gets the tracking element. Create it if necessary + getEl: function() { + var el = this.el; + + if (!el) { + this.sourceEl.width(); // hack to force IE8 to compute correct bounding box + el = this.el = this.sourceEl.clone() + .css({ + position: 'absolute', + visibility: '', // in case original element was hidden (commonly through hideEvents()) + display: this.isHidden ? 'none' : '', // for when initially hidden + margin: 0, + right: 'auto', // erase and set width instead + bottom: 'auto', // erase and set height instead + width: this.sourceEl.width(), // explicit height in case there was a 'right' value + height: this.sourceEl.height(), // explicit width in case there was a 'bottom' value + opacity: this.options.opacity || '', + zIndex: this.options.zIndex + }) + .appendTo(this.parentEl); + } + + return el; + }, + + + // Removes the tracking element if it has already been created + destroyEl: function() { + if (this.el) { + this.el.remove(); + this.el = null; + } + }, + + + // Update the CSS position of the tracking element + updatePosition: function() { + var sourceOffset; + var origin; + + this.getEl(); // ensure this.el + + // make sure origin info was computed + if (this.top0 === null) { + this.sourceEl.width(); // hack to force IE8 to compute correct bounding box + sourceOffset = this.sourceEl.offset(); + origin = this.el.offsetParent().offset(); + this.top0 = sourceOffset.top - origin.top; + this.left0 = sourceOffset.left - origin.left; + } + + this.el.css({ + top: this.top0 + this.topDelta, + left: this.left0 + this.leftDelta + }); + }, + + + // Gets called when the user moves the mouse + mousemove: function(ev) { + this.topDelta = ev.pageY - this.mouseY0; + this.leftDelta = ev.pageX - this.mouseX0; + + if (!this.isHidden) { + this.updatePosition(); + } + }, + + + // Temporarily makes the tracking element invisible. Can be called before following starts + hide: function() { + if (!this.isHidden) { + this.isHidden = true; + if (this.el) { + this.el.hide(); + } + } + }, + + + // Show the tracking element after it has been temporarily hidden + show: function() { + if (this.isHidden) { + this.isHidden = false; + this.updatePosition(); + this.getEl().show(); + } + } + +}; + +;; + +/* A utility class for rendering rows. +----------------------------------------------------------------------------------------------------------------------*/ +// It leverages methods of the subclass and the View to determine custom rendering behavior for each row "type" +// (such as highlight rows, day rows, helper rows, etc). + +function RowRenderer(view) { + this.view = view; +} + + +RowRenderer.prototype = { + + view: null, // a View object + cellHtml: '', // plain default HTML used for a cell when no other is available + + + // Renders the HTML for a row, leveraging custom cell-HTML-renderers based on the `rowType`. + // Also applies the "intro" and "outro" cells, which are specified by the subclass and views. + // `row` is an optional row number. + rowHtml: function(rowType, row) { + var view = this.view; + var renderCell = this.getHtmlRenderer('cell', rowType); + var cellHtml = ''; + var col; + var date; + + row = row || 0; + + for (col = 0; col < view.colCnt; col++) { + date = view.cellToDate(row, col); + cellHtml += renderCell(row, col, date); + } + + cellHtml = this.bookendCells(cellHtml, rowType, row); // apply intro and outro + + return '' + cellHtml + ''; + }, + + + // Applies the "intro" and "outro" HTML to the given cells. + // Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro. + // `cells` can be an HTML string of 's or a jQuery element + // `row` is an optional row number. + bookendCells: function(cells, rowType, row) { + var view = this.view; + var intro = this.getHtmlRenderer('intro', rowType)(row || 0); + var outro = this.getHtmlRenderer('outro', rowType)(row || 0); + var isRTL = view.opt('isRTL'); + var prependHtml = isRTL ? outro : intro; + var appendHtml = isRTL ? intro : outro; + + if (typeof cells === 'string') { + return prependHtml + cells + appendHtml; + } + else { // a jQuery element + return cells.prepend(prependHtml).append(appendHtml); + } + }, + + + // Returns an HTML-rendering function given a specific `rendererName` (like cell, intro, or outro) and a specific + // `rowType` (like day, eventSkeleton, helperSkeleton), which is optional. + // If a renderer for the specific rowType doesn't exist, it will fall back to a generic renderer. + // We will query the View object first for any custom rendering functions, then the methods of the subclass. + getHtmlRenderer: function(rendererName, rowType) { + var view = this.view; + var generalName; // like "cellHtml" + var specificName; // like "dayCellHtml". based on rowType + var provider; // either the View or the RowRenderer subclass, whichever provided the method + var renderer; + + generalName = rendererName + 'Html'; + if (rowType) { + specificName = rowType + capitaliseFirstLetter(rendererName) + 'Html'; + } + + if (specificName && (renderer = view[specificName])) { + provider = view; + } + else if (specificName && (renderer = this[specificName])) { + provider = this; + } + else if ((renderer = view[generalName])) { + provider = view; + } + else if ((renderer = this[generalName])) { + provider = this; + } + + if (typeof renderer === 'function') { + return function(row) { + return renderer.apply(provider, arguments) || ''; // use correct `this` and always return a string + }; + } + + // the rendered can be a plain string as well. if not specified, always an empty string. + return function() { + return renderer || ''; + }; + } + +}; + +;; + +/* An abstract class comprised of a "grid" of cells that each represent a specific datetime +----------------------------------------------------------------------------------------------------------------------*/ + +function Grid(view) { + RowRenderer.call(this, view); // call the super-constructor + this.coordMap = new GridCoordMap(this); +} + + +Grid.prototype = createObject(RowRenderer.prototype); // declare the super-class +$.extend(Grid.prototype, { + + el: null, // the containing element + coordMap: null, // a GridCoordMap that converts pixel values to datetimes + cellDuration: null, // a cell's duration. subclasses must assign this ASAP + + + // Renders the grid into the `el` element. + // Subclasses should override and call this super-method when done. + render: function() { + this.bindHandlers(); + }, + + + // Called when the grid's resources need to be cleaned up + destroy: function() { + // subclasses can implement + }, + + + /* Coordinates & Cells + ------------------------------------------------------------------------------------------------------------------*/ + + + // Populates the given empty arrays with the y and x coordinates of the cells + buildCoords: function(rows, cols) { + // subclasses must implement + }, + + + // Given a cell object, returns the date for that cell + getCellDate: function(cell) { + // subclasses must implement + }, + + + // Given a cell object, returns the element that represents the cell's whole-day + getCellDayEl: function(cell) { + // subclasses must implement + }, + + + // Converts a range with an inclusive `start` and an exclusive `end` into an array of segment objects + rangeToSegs: function(start, end) { + // subclasses must implement + }, + + + /* Handlers + ------------------------------------------------------------------------------------------------------------------*/ + + + // Attach handlers to `this.el`, using bubbling to listen to all ancestors. + // We don't need to undo any of this in a "destroy" method, because the view will simply remove `this.el` from the + // DOM and jQuery will be smart enough to garbage collect the handlers. + bindHandlers: function() { + var _this = this; + + this.el.on('mousedown', function(ev) { + if ( + !$(ev.target).is('.fc-event-container *, .fc-more') && // not an an event element, or "more.." link + !$(ev.target).closest('.fc-popover').length // not on a popover (like the "more.." events one) + ) { + _this.dayMousedown(ev); + } + }); + + this.bindSegHandlers(); // attach event-element-related handlers. in Grid.events.js + }, + + + // Process a mousedown on an element that represents a day. For day clicking and selecting. + dayMousedown: function(ev) { + var _this = this; + var view = this.view; + var isSelectable = view.opt('selectable'); + var dates = null; // the inclusive dates of the selection. will be null if no selection + var start; // the inclusive start of the selection + var end; // the *exclusive* end of the selection + var dayEl; + + // this listener tracks a mousedown on a day element, and a subsequent drag. + // if the drag ends on the same day, it is a 'dayClick'. + // if 'selectable' is enabled, this listener also detects selections. + var dragListener = new DragListener(this.coordMap, { + //distance: 5, // needs more work if we want dayClick to fire correctly + scroll: view.opt('dragScroll'), + dragStart: function() { + view.unselect(); // since we could be rendering a new selection, we want to clear any old one + }, + cellOver: function(cell, date) { + if (dragListener.origDate) { // click needs to have started on a cell + + dayEl = _this.getCellDayEl(cell); + + dates = [ date, dragListener.origDate ].sort(dateCompare); + start = dates[0]; + end = dates[1].clone().add(_this.cellDuration); + + if (isSelectable) { + _this.renderSelection(start, end); + } + } + }, + cellOut: function(cell, date) { + dates = null; + _this.destroySelection(); + }, + listenStop: function(ev) { + if (dates) { // started and ended on a cell? + if (dates[0].isSame(dates[1])) { + view.trigger('dayClick', dayEl[0], start, ev); + } + if (isSelectable) { + // the selection will already have been rendered. just report it + view.reportSelection(start, end, ev); + } + } + } + }); + + dragListener.mousedown(ev); // start listening, which will eventually initiate a dragStart + }, + + + /* Event Dragging + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a event being dragged over the given date(s). + // `end` can be null, as well as `seg`. See View's documentation on renderDrag for more info. + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(start, end, seg) { + // subclasses must implement + }, + + + // Unrenders a visual indication of an event being dragged + destroyDrag: function() { + // subclasses must implement + }, + + + /* Event Resizing + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being resized. + // `start` and `end` are the updated dates of the event. `seg` is the original segment object involved in the drag. + renderResize: function(start, end, seg) { + // subclasses must implement + }, + + + // Unrenders a visual indication of an event being resized. + destroyResize: function() { + // subclasses must implement + }, + + + /* Event Helper + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a mock event over the given date(s). + // `end` can be null, in which case the mock event that is rendered will have a null end time. + // `sourceSeg` is the internal segment object involved in the drag. If null, something external is dragging. + renderRangeHelper: function(start, end, sourceSeg) { + var view = this.view; + var fakeEvent; + + // compute the end time if forced to do so (this is what EventManager does) + if (!end && view.opt('forceEventDuration')) { + end = view.calendar.getDefaultEventEnd(!start.hasTime(), start); + } + + fakeEvent = sourceSeg ? createObject(sourceSeg.event) : {}; // mask the original event object if possible + fakeEvent.start = start; + fakeEvent.end = end; + fakeEvent.allDay = !(start.hasTime() || (end && end.hasTime())); // freshly compute allDay + + // this extra className will be useful for differentiating real events from mock events in CSS + fakeEvent.className = (fakeEvent.className || []).concat('fc-helper'); + + // if something external is being dragged in, don't render a resizer + if (!sourceSeg) { + fakeEvent.editable = false; + } + + this.renderHelper(fakeEvent, sourceSeg); // do the actual rendering + }, + + + // Renders a mock event + renderHelper: function(event, sourceSeg) { + // subclasses must implement + }, + + + // Unrenders a mock event + destroyHelper: function() { + // subclasses must implement + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection. Will highlight by default but can be overridden by subclasses. + renderSelection: function(start, end) { + this.renderHighlight(start, end); + }, + + + // Unrenders any visual indications of a selection. Will unrender a highlight by default. + destroySelection: function() { + this.destroyHighlight(); + }, + + + /* Highlight + ------------------------------------------------------------------------------------------------------------------*/ + + + // Puts visual emphasis on a certain date range + renderHighlight: function(start, end) { + // subclasses should implement + }, + + + // Removes visual emphasis on a date range + destroyHighlight: function() { + // subclasses should implement + }, + + + + /* Generic rendering utilities for subclasses + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a day-of-week header row + headHtml: function() { + return '' + + '
' + + '' + + '' + + this.rowHtml('head') + // leverages RowRenderer + '' + + '
' + + '
'; + }, + + + // Used by the `headHtml` method, via RowRenderer, for rendering the HTML of a day-of-week header cell + headCellHtml: function(row, col, date) { + var view = this.view; + var calendar = view.calendar; + var colFormat = view.opt('columnFormat'); + + return '' + + '' + + htmlEscape(calendar.formatDate(date, colFormat)) + + ''; + }, + + + // Renders the HTML for a single-day background cell + bgCellHtml: function(row, col, date) { + var view = this.view; + var classes = this.getDayClasses(date); + + classes.unshift('fc-day', view.widgetContentClass); + + return ''; + }, + + + // Computes HTML classNames for a single-day cell + getDayClasses: function(date) { + var view = this.view; + var today = view.calendar.getNow().stripTime(); + var classes = [ 'fc-' + dayIDs[date.day()] ]; + + if ( + view.name === 'month' && + date.month() != view.intervalStart.month() + ) { + classes.push('fc-other-month'); + } + + if (date.isSame(today, 'day')) { + classes.push( + 'fc-today', + view.highlightStateClass + ); + } + else if (date < today) { + classes.push('fc-past'); + } + else { + classes.push('fc-future'); + } + + return classes; + } + +}); + +;; + +/* Event-rendering and event-interaction methods for the abstract Grid class +----------------------------------------------------------------------------------------------------------------------*/ + +$.extend(Grid.prototype, { + + mousedOverSeg: null, // the segment object the user's mouse is over. null if over nothing + isDraggingSeg: false, // is a segment being dragged? boolean + isResizingSeg: false, // is a segment being resized? boolean + + + // Renders the given events onto the grid + renderEvents: function(events) { + // subclasses must implement + }, + + + // Retrieves all rendered segment objects in this grid + getSegs: function() { + // subclasses must implement + }, + + + // Unrenders all events. Subclasses should implement, calling this super-method first. + destroyEvents: function() { + this.triggerSegMouseout(); // trigger an eventMouseout if user's mouse is over an event + }, + + + // Renders a `el` property for each seg, and only returns segments that successfully rendered + renderSegs: function(segs, disableResizing) { + var view = this.view; + var html = ''; + var renderedSegs = []; + var i; + + // build a large concatenation of event segment HTML + for (i = 0; i < segs.length; i++) { + html += this.renderSegHtml(segs[i], disableResizing); + } + + // Grab individual elements from the combined HTML string. Use each as the default rendering. + // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false. + $(html).each(function(i, node) { + var seg = segs[i]; + var el = view.resolveEventEl(seg.event, $(node)); + if (el) { + el.data('fc-seg', seg); // used by handlers + seg.el = el; + renderedSegs.push(seg); + } + }); + + return renderedSegs; + }, + + + // Generates the HTML for the default rendering of a segment + renderSegHtml: function(seg, disableResizing) { + // subclasses must implement + }, + + + // Converts an array of event objects into an array of segment objects + eventsToSegs: function(events, intervalStart, intervalEnd) { + var _this = this; + + return $.map(events, function(event) { + return _this.eventToSegs(event, intervalStart, intervalEnd); // $.map flattens all returned arrays together + }); + }, + + + // Slices a single event into an array of event segments. + // When `intervalStart` and `intervalEnd` are specified, intersect the events with that interval. + // Otherwise, let the subclass decide how it wants to slice the segments over the grid. + eventToSegs: function(event, intervalStart, intervalEnd) { + var eventStart = event.start.clone().stripZone(); // normalize + var eventEnd = this.view.calendar.getEventEnd(event).stripZone(); // compute (if necessary) and normalize + var segs; + var i, seg; + + if (intervalStart && intervalEnd) { + seg = intersectionToSeg(eventStart, eventEnd, intervalStart, intervalEnd); + segs = seg ? [ seg ] : []; + } + else { + segs = this.rangeToSegs(eventStart, eventEnd); // defined by the subclass + } + + // assign extra event-related properties to the segment objects + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + seg.event = event; + seg.eventStartMS = +eventStart; + seg.eventDurationMS = eventEnd - eventStart; + } + + return segs; + }, + + + /* Handlers + ------------------------------------------------------------------------------------------------------------------*/ + + + // Attaches event-element-related handlers to the container element and leverage bubbling + bindSegHandlers: function() { + var _this = this; + var view = this.view; + + $.each( + { + mouseenter: function(seg, ev) { + _this.triggerSegMouseover(seg, ev); + }, + mouseleave: function(seg, ev) { + _this.triggerSegMouseout(seg, ev); + }, + click: function(seg, ev) { + return view.trigger('eventClick', this, seg.event, ev); // can return `false` to cancel + }, + mousedown: function(seg, ev) { + if ($(ev.target).is('.fc-resizer') && view.isEventResizable(seg.event)) { + _this.segResizeMousedown(seg, ev); + } + else if (view.isEventDraggable(seg.event)) { + _this.segDragMousedown(seg, ev); + } + } + }, + function(name, func) { + // attach the handler to the container element and only listen for real event elements via bubbling + _this.el.on(name, '.fc-event-container > *', function(ev) { + var seg = $(this).data('fc-seg'); // grab segment data. put there by View::renderEvents + + // only call the handlers if there is not a drag/resize in progress + if (seg && !_this.isDraggingSeg && !_this.isResizingSeg) { + return func.call(this, seg, ev); // `this` will be the event element + } + }); + } + ); + }, + + + // Updates internal state and triggers handlers for when an event element is moused over + triggerSegMouseover: function(seg, ev) { + if (!this.mousedOverSeg) { + this.mousedOverSeg = seg; + this.view.trigger('eventMouseover', seg.el[0], seg.event, ev); + } + }, + + + // Updates internal state and triggers handlers for when an event element is moused out. + // Can be given no arguments, in which case it will mouseout the segment that was previously moused over. + triggerSegMouseout: function(seg, ev) { + ev = ev || {}; // if given no args, make a mock mouse event + + if (this.mousedOverSeg) { + seg = seg || this.mousedOverSeg; // if given no args, use the currently moused-over segment + this.mousedOverSeg = null; + this.view.trigger('eventMouseout', seg.el[0], seg.event, ev); + } + }, + + + /* Dragging + ------------------------------------------------------------------------------------------------------------------*/ + + + // Called when the user does a mousedown on an event, which might lead to dragging. + // Generic enough to work with any type of Grid. + segDragMousedown: function(seg, ev) { + var _this = this; + var view = this.view; + var el = seg.el; + var event = seg.event; + var newStart, newEnd; + + // A clone of the original element that will move with the mouse + var mouseFollower = new MouseFollower(seg.el, { + parentEl: view.el, + opacity: view.opt('dragOpacity'), + revertDuration: view.opt('dragRevertDuration'), + zIndex: 2 // one above the .fc-view + }); + + // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents + // of the view. + var dragListener = new DragListener(view.coordMap, { + distance: 5, + scroll: view.opt('dragScroll'), + listenStart: function(ev) { + mouseFollower.hide(); // don't show until we know this is a real drag + mouseFollower.start(ev); + }, + dragStart: function(ev) { + _this.triggerSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported + _this.isDraggingSeg = true; + view.hideEvent(event); // hide all event segments. our mouseFollower will take over + view.trigger('eventDragStart', el[0], event, ev, {}); // last argument is jqui dummy + }, + cellOver: function(cell, date) { + var origDate = seg.cellDate || dragListener.origDate; + var res = _this.computeDraggedEventDates(seg, origDate, date); + newStart = res.start; + newEnd = res.end; + + if (view.renderDrag(newStart, newEnd, seg)) { // have the view render a visual indication + mouseFollower.hide(); // if the view is already using a mock event "helper", hide our own + } + else { + mouseFollower.show(); + } + }, + cellOut: function() { // called before mouse moves to a different cell OR moved out of all cells + newStart = null; + view.destroyDrag(); // unrender whatever was done in view.renderDrag + mouseFollower.show(); // show in case we are moving out of all cells + }, + dragStop: function(ev) { + var hasChanged = newStart && !newStart.isSame(event.start); + + // do revert animation if hasn't changed. calls a callback when finished (whether animation or not) + mouseFollower.stop(!hasChanged, function() { + _this.isDraggingSeg = false; + view.destroyDrag(); + view.showEvent(event); + view.trigger('eventDragStop', el[0], event, ev, {}); // last argument is jqui dummy + + if (hasChanged) { + view.eventDrop(el[0], event, newStart, ev); // will rerender all events... + } + }); + }, + listenStop: function() { + mouseFollower.stop(); // put in listenStop in case there was a mousedown but the drag never started + } + }); + + dragListener.mousedown(ev); // start listening, which will eventually lead to a dragStart + }, + + + // Given a segment, the dates where a drag began and ended, calculates the Event Object's new start and end dates + computeDraggedEventDates: function(seg, dragStartDate, dropDate) { + var view = this.view; + var event = seg.event; + var start = event.start; + var end = view.calendar.getEventEnd(event); + var delta; + var newStart; + var newEnd; + + if (dropDate.hasTime() === dragStartDate.hasTime()) { + delta = dayishDiff(dropDate, dragStartDate); + newStart = start.clone().add(delta); + if (event.end === null) { // do we need to compute an end? + newEnd = null; + } + else { + newEnd = end.clone().add(delta); + } + } + else { + // if switching from day <-> timed, start should be reset to the dropped date, and the end cleared + newStart = dropDate; + newEnd = null; // end should be cleared + } + + return { start: newStart, end: newEnd }; + }, + + + /* Resizing + ------------------------------------------------------------------------------------------------------------------*/ + + + // Called when the user does a mousedown on an event's resizer, which might lead to resizing. + // Generic enough to work with any type of Grid. + segResizeMousedown: function(seg, ev) { + var _this = this; + var view = this.view; + var el = seg.el; + var event = seg.event; + var start = event.start; + var end = view.calendar.getEventEnd(event); + var newEnd = null; + var dragListener; + + function destroy() { // resets the rendering + _this.destroyResize(); + view.showEvent(event); + } + + // Tracks mouse movement over the *grid's* coordinate map + dragListener = new DragListener(this.coordMap, { + distance: 5, + scroll: view.opt('dragScroll'), + dragStart: function(ev) { + _this.triggerSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported + _this.isResizingSeg = true; + view.trigger('eventResizeStart', el[0], event, ev, {}); // last argument is jqui dummy + }, + cellOver: function(cell, date) { + // compute the new end. don't allow it to go before the event's start + if (date.isBefore(start)) { // allows comparing ambig to non-ambig + date = start; + } + newEnd = date.clone().add(_this.cellDuration); // make it an exclusive end + + if (newEnd.isSame(end)) { + newEnd = null; + destroy(); + } + else { + _this.renderResize(start, newEnd, seg); + view.hideEvent(event); + } + }, + cellOut: function() { // called before mouse moves to a different cell OR moved out of all cells + newEnd = null; + destroy(); + }, + dragStop: function(ev) { + _this.isResizingSeg = false; + destroy(); + view.trigger('eventResizeStop', el[0], event, ev, {}); // last argument is jqui dummy + + if (newEnd) { + view.eventResize(el[0], event, newEnd, ev); // will rerender all events... + } + } + }); + + dragListener.mousedown(ev); // start listening, which will eventually lead to a dragStart + }, + + + /* Rendering Utils + ------------------------------------------------------------------------------------------------------------------*/ + + + // Generic utility for generating the HTML classNames for an event segment's element + getSegClasses: function(seg, isDraggable, isResizable) { + var event = seg.event; + var classes = [ + 'fc-event', + seg.isStart ? 'fc-start' : 'fc-not-start', + seg.isEnd ? 'fc-end' : 'fc-not-end' + ].concat( + event.className, + event.source ? event.source.className : [] + ); + + if (isDraggable) { + classes.push('fc-draggable'); + } + if (isResizable) { + classes.push('fc-resizable'); + } + + return classes; + }, + + + // Utility for generating a CSS string with all the event skin-related properties + getEventSkinCss: function(event) { + var view = this.view; + var source = event.source || {}; + var eventColor = event.color; + var sourceColor = source.color; + var optionColor = view.opt('eventColor'); + var backgroundColor = + event.backgroundColor || + eventColor || + source.backgroundColor || + sourceColor || + view.opt('eventBackgroundColor') || + optionColor; + var borderColor = + event.borderColor || + eventColor || + source.borderColor || + sourceColor || + view.opt('eventBorderColor') || + optionColor; + var textColor = + event.textColor || + source.textColor || + view.opt('eventTextColor'); + var statements = []; + if (backgroundColor) { + statements.push('background-color:' + backgroundColor); + } + if (borderColor) { + statements.push('border-color:' + borderColor); + } + if (textColor) { + statements.push('color:' + textColor); + } + return statements.join(';'); + } + +}); + + +/* Event Segment Utilities +----------------------------------------------------------------------------------------------------------------------*/ + + +// A cmp function for determining which segments should take visual priority +function compareSegs(seg1, seg2) { + return seg1.eventStartMS - seg2.eventStartMS || // earlier events go first + seg2.eventDurationMS - seg1.eventDurationMS || // tie? longer events go first + seg2.event.allDay - seg1.event.allDay || // tie? put all-day events first (booleans cast to 0/1) + (seg1.event.title || '').localeCompare(seg2.event.title); // tie? alphabetically by title +} + + +;; + +/* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week. +----------------------------------------------------------------------------------------------------------------------*/ + +function DayGrid(view) { + Grid.call(this, view); // call the super-constructor +} + + +DayGrid.prototype = createObject(Grid.prototype); // declare the super-class +$.extend(DayGrid.prototype, { + + numbersVisible: false, // should render a row for day/week numbers? manually set by the view + cellDuration: moment.duration({ days: 1 }), // required for Grid.event.js. Each cell is always a single day + bottomCoordPadding: 0, // hack for extending the hit area for the last row of the coordinate grid + + rowEls: null, // set of fake row elements + dayEls: null, // set of whole-day elements comprising the row's background + helperEls: null, // set of cell skeleton elements for rendering the mock event "helper" + highlightEls: null, // set of cell skeleton elements for rendering the highlight + + + // Renders the rows and columns into the component's `this.el`, which should already be assigned. + // isRigid determins whether the individual rows should ignore the contents and be a constant height. + // Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient. + render: function(isRigid) { + var view = this.view; + var html = ''; + var row; + + for (row = 0; row < view.rowCnt; row++) { + html += this.dayRowHtml(row, isRigid); + } + this.el.html(html); + + this.rowEls = this.el.find('.fc-row'); + this.dayEls = this.el.find('.fc-day'); + + // run all the day cells through the dayRender callback + this.dayEls.each(function(i, node) { + var date = view.cellToDate(Math.floor(i / view.colCnt), i % view.colCnt); + view.trigger('dayRender', null, date, $(node)); + }); + + Grid.prototype.render.call(this); // call the super-method + }, + + + destroy: function() { + this.destroySegPopover(); + }, + + + // Generates the HTML for a single row. `row` is the row number. + dayRowHtml: function(row, isRigid) { + var view = this.view; + var classes = [ 'fc-row', 'fc-week', view.widgetContentClass ]; + + if (isRigid) { + classes.push('fc-rigid'); + } + + return '' + + '
' + + '
' + + '' + + this.rowHtml('day', row) + // leverages RowRenderer. calls dayCellHtml() + '
' + + '
' + + '
' + + '' + + (this.numbersVisible ? + '' + + this.rowHtml('number', row) + // leverages RowRenderer. View will define render method + '' : + '' + ) + + '
' + + '
' + + '
'; + }, + + + // Renders the HTML for a whole-day cell. Will eventually end up in the day-row's background. + // We go through a 'day' row type instead of just doing a 'bg' row type so that the View can do custom rendering + // specifically for whole-day rows, whereas a 'bg' might also be used for other purposes (TimeGrid bg for example). + dayCellHtml: function(row, col, date) { + return this.bgCellHtml(row, col, date); + }, + + + /* Coordinates & Cells + ------------------------------------------------------------------------------------------------------------------*/ + + + // Populates the empty `rows` and `cols` arrays with coordinates of the cells. For CoordGrid. + buildCoords: function(rows, cols) { + var colCnt = this.view.colCnt; + var e, n, p; + + this.dayEls.slice(0, colCnt).each(function(i, _e) { // iterate the first row of day elements + e = $(_e); + n = e.offset().left; + if (i) { + p[1] = n; + } + p = [ n ]; + cols[i] = p; + }); + p[1] = n + e.outerWidth(); + + this.rowEls.each(function(i, _e) { + e = $(_e); + n = e.offset().top; + if (i) { + p[1] = n; + } + p = [ n ]; + rows[i] = p; + }); + p[1] = n + e.outerHeight() + this.bottomCoordPadding; // hack to extend hit area of last row + }, + + + // Converts a cell to a date + getCellDate: function(cell) { + return this.view.cellToDate(cell); // leverages the View's cell system + }, + + + // Gets the whole-day element associated with the cell + getCellDayEl: function(cell) { + return this.dayEls.eq(cell.row * this.view.colCnt + cell.col); + }, + + + // Converts a range with an inclusive `start` and an exclusive `end` into an array of segment objects + rangeToSegs: function(start, end) { + return this.view.rangeToSegments(start, end); // leverages the View's cell system + }, + + + /* Event Drag Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event hovering over the given date(s). + // `end` can be null, as well as `seg`. See View's documentation on renderDrag for more info. + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(start, end, seg) { + var opacity; + + // always render a highlight underneath + this.renderHighlight( + start, + end || this.view.calendar.getDefaultEventEnd(true, start) + ); + + // if a segment from the same calendar but another component is being dragged, render a helper event + if (seg && !seg.el.closest(this.el).length) { + + this.renderRangeHelper(start, end, seg); + + opacity = this.view.opt('dragOpacity'); + if (opacity !== undefined) { + this.helperEls.css('opacity', opacity); + } + + return true; // a helper has been rendered + } + }, + + + // Unrenders any visual indication of a hovering event + destroyDrag: function() { + this.destroyHighlight(); + this.destroyHelper(); + }, + + + /* Event Resize Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being resized + renderResize: function(start, end, seg) { + this.renderHighlight(start, end); + this.renderRangeHelper(start, end, seg); + }, + + + // Unrenders a visual indication of an event being resized + destroyResize: function() { + this.destroyHighlight(); + this.destroyHelper(); + }, + + + /* Event Helper + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a mock "helper" event. `sourceSeg` is the associated internal segment object. It can be null. + renderHelper: function(event, sourceSeg) { + var helperNodes = []; + var rowStructs = this.renderEventRows([ event ]); + + // inject each new event skeleton into each associated row + this.rowEls.each(function(row, rowNode) { + var rowEl = $(rowNode); // the .fc-row + var skeletonEl = $('
'); // will be absolutely positioned + var skeletonTop; + + // If there is an original segment, match the top position. Otherwise, put it at the row's top level + if (sourceSeg && sourceSeg.row === row) { + skeletonTop = sourceSeg.el.position().top; + } + else { + skeletonTop = rowEl.find('.fc-content-skeleton tbody').position().top; + } + + skeletonEl.css('top', skeletonTop) + .find('table') + .append(rowStructs[row].tbodyEl); + + rowEl.append(skeletonEl); + helperNodes.push(skeletonEl[0]); + }); + + this.helperEls = $(helperNodes); // array -> jQuery set + }, + + + // Unrenders any visual indication of a mock helper event + destroyHelper: function() { + if (this.helperEls) { + this.helperEls.remove(); + this.helperEls = null; + } + }, + + + /* Highlighting + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders an emphasis on the given date range. `start` is an inclusive, `end` is exclusive. + renderHighlight: function(start, end) { + var segs = this.rangeToSegs(start, end); + var highlightNodes = []; + var i, seg; + var el; + + // build an event skeleton for each row that needs it + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + el = $( + this.highlightSkeletonHtml(seg.leftCol, seg.rightCol + 1) // make end exclusive + ); + el.appendTo(this.rowEls[seg.row]); + highlightNodes.push(el[0]); + } + + this.highlightEls = $(highlightNodes); // array -> jQuery set + }, + + + // Unrenders any visual emphasis on a date range + destroyHighlight: function() { + if (this.highlightEls) { + this.highlightEls.remove(); + this.highlightEls = null; + } + }, + + + // Generates the HTML used to build a single-row "highlight skeleton", a table that frames highlight cells + highlightSkeletonHtml: function(startCol, endCol) { + var colCnt = this.view.colCnt; + var cellHtml = ''; + + if (startCol > 0) { + cellHtml += ' elements that should be appended to each row's content skeleton. + // Returns an array of rowStruct objects (see the bottom of `renderEventRow`). + renderEventRows: function(events) { + var segs = this.eventsToSegs(events); + var rowStructs = []; + var segRows; + var row; + + segs = this.renderSegs(segs); // returns a new array with only visible segments + segRows = this.groupSegRows(segs); // group into nested arrays + + // iterate each row of segment groupings + for (row = 0; row < segRows.length; row++) { + rowStructs.push( + this.renderEventRow(row, segRows[row]) + ); + } + + return rowStructs; + }, + + + // Builds the HTML to be used for the default element for an individual segment + renderSegHtml: function(seg, disableResizing) { + var view = this.view; + var isRTL = view.opt('isRTL'); + var event = seg.event; + var isDraggable = view.isEventDraggable(event); + var isResizable = !disableResizing && event.allDay && seg.isEnd && view.isEventResizable(event); + var classes = this.getSegClasses(seg, isDraggable, isResizable); + var skinCss = this.getEventSkinCss(event); + var timeHtml = ''; + var titleHtml; + + classes.unshift('fc-day-grid-event'); + + // Only display a timed events time if it is the starting segment + if (!event.allDay && seg.isStart) { + timeHtml = '' + htmlEscape(view.getEventTimeText(event)) + ''; + } + + titleHtml = + '' + + (htmlEscape(event.title || '') || ' ') + // we always want one line of height + ''; + + return '' + + '
' + + (isRTL ? + titleHtml + ' ' + timeHtml : // put a natural space in between + timeHtml + ' ' + titleHtml // + ) + + '
' + + (isResizable ? + '
' : + '' + ) + + ''; + }, + + + // Given a row # and an array of segments all in the same row, render a
element, a skeleton that contains + // the segments. Returns object with a bunch of internal data about how the render was calculated. + renderEventRow: function(row, rowSegs) { + var view = this.view; + var colCnt = view.colCnt; + var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels + var levelCnt = Math.max(1, segLevels.length); // ensure at least one level + var tbody = $(''); + var segMatrix = []; // lookup for which segments are rendered into which level+col cells + var cellMatrix = []; // lookup for all '); + + segMatrix.push([]); + cellMatrix.push([]); + loneCellMatrix.push([]); + + // levelCnt might be 1 even though there are no actual levels. protect against this. + // this single empty row is useful for styling. + if (levelSegs) { + for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level + seg = levelSegs[j]; + + emptyCellsUntil(seg.leftCol); + + // create a container that occupies or more columns. append the event element. + td = $(' at a time and stop when we find one out of bounds + for (i = 0; i < trEls.length; i++) { + trEl = trEls.eq(i).removeClass('fc-limited'); // get and reveal + if (trEl.position().top + trEl.outerHeight() > rowHeight) { + return i; + } + } + + return false; // should not limit at all + }, + + + // Limits the given grid row to the maximum number of levels and injects "more" links if necessary. + // `row` is the row number. + // `levelLimit` is a number for the maximum (inclusive) number of levels allowed. + limitRow: function(row, levelLimit) { + var _this = this; + var view = this.view; + var rowStruct = this.rowStructs[row]; + var moreNodes = []; // array of "more" links and and segment elements past the limit + .addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array + + // iterate though segments in the last allowable level + for (i = 0; i < levelSegs.length; i++) { + seg = levelSegs[i]; + emptyCellsUntil(seg.leftCol); // process empty cells before the segment + + // determine *all* segments below `seg` that occupy the same columns + colSegsBelow = []; + totalSegsBelow = 0; + while (col <= seg.rightCol) { + cell = { row: row, col: col }; + segsBelow = this.getCellSegs(cell, levelLimit); + colSegsBelow.push(segsBelow); + totalSegsBelow += segsBelow.length; + col++; + } + + if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links? + td = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell + rowspan = td.attr('rowspan') || 1; + segMoreNodes = []; + + // make a replacement '; + + html += + '' + + (!isRTL ? axisHtml : '') + + '"; + + slotTime.add(this.slotDuration); + } + + return html; + }, + + + // Parses various options into properties of this object + processOptions: function() { + var view = this.view; + var slotDuration = view.opt('slotDuration'); + var snapDuration = view.opt('snapDuration'); + + slotDuration = moment.duration(slotDuration); + snapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration; + + this.slotDuration = slotDuration; + this.snapDuration = snapDuration; + this.cellDuration = snapDuration; // important to assign this for Grid.events.js + + this.minTime = moment.duration(view.opt('minTime')); + this.maxTime = moment.duration(view.opt('maxTime')); + }, + + + // Slices up a date range into a segment for each column + rangeToSegs: function(rangeStart, rangeEnd) { + var view = this.view; + var segs = []; + var seg; + var col; + var cellDate; + var colStart, colEnd; + + // normalize + rangeStart = rangeStart.clone().stripZone(); + rangeEnd = rangeEnd.clone().stripZone(); + + for (col = 0; col < view.colCnt; col++) { + cellDate = view.cellToDate(0, col); // use the View's cell system for this + colStart = cellDate.clone().time(this.minTime); + colEnd = cellDate.clone().time(this.maxTime); + seg = intersectionToSeg(rangeStart, rangeEnd, colStart, colEnd); + if (seg) { + seg.col = col; + segs.push(seg); + } + } + + return segs; + }, + + + /* Coordinates + ------------------------------------------------------------------------------------------------------------------*/ + + + // Called when there is a window resize/zoom and we need to recalculate coordinates for the grid + resize: function() { + this.computeSlatTops(); + this.updateSegVerticals(); + }, + + + // Populates the given empty `rows` and `cols` arrays with offset positions of the "snap" cells. + // "Snap" cells are different the slots because they might have finer granularity. + buildCoords: function(rows, cols) { + var colCnt = this.view.colCnt; + var originTop = this.el.offset().top; + var snapTime = moment.duration(+this.minTime); + var p = null; + var e, n; + + this.dayEls.slice(0, colCnt).each(function(i, _e) { + e = $(_e); + n = e.offset().left; + if (p) { + p[1] = n; + } + p = [ n ]; + cols[i] = p; + }); + p[1] = n + e.outerWidth(); + + p = null; + while (snapTime < this.maxTime) { + n = originTop + this.computeTimeTop(snapTime); + if (p) { + p[1] = n; + } + p = [ n ]; + rows.push(p); + snapTime.add(this.snapDuration); + } + p[1] = originTop + this.computeTimeTop(snapTime); // the position of the exclusive end + }, + + + // Gets the datetime for the given slot cell + getCellDate: function(cell) { + var view = this.view; + var calendar = view.calendar; + + return calendar.rezoneDate( // since we are adding a time, it needs to be in the calendar's timezone + view.cellToDate(0, cell.col) // View's coord system only accounts for start-of-day for column + .time(this.minTime + this.snapDuration * cell.row) + ); + }, + + + // Gets the element that represents the whole-day the cell resides on + getCellDayEl: function(cell) { + return this.dayEls.eq(cell.col); + }, + + + // Computes the top coordinate, relative to the bounds of the grid, of the given date. + // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight. + computeDateTop: function(date, startOfDayDate) { + return this.computeTimeTop( + moment.duration( + date.clone().stripZone() - startOfDayDate.clone().stripTime() + ) + ); + }, + + + // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration). + computeTimeTop: function(time) { + var slatCoverage = (time - this.minTime) / this.slotDuration; // floating-point value of # of slots covered + var slatIndex; + var slatRemainder; + var slatTop; + var slatBottom; + + // constrain. because minTime/maxTime might be customized + slatCoverage = Math.max(0, slatCoverage); + slatCoverage = Math.min(this.slatEls.length, slatCoverage); + + slatIndex = Math.floor(slatCoverage); // an integer index of the furthest whole slot + slatRemainder = slatCoverage - slatIndex; + slatTop = this.slatTops[slatIndex]; // the top position of the furthest whole slot + + if (slatRemainder) { // time spans part-way into the slot + slatBottom = this.slatTops[slatIndex + 1]; + return slatTop + (slatBottom - slatTop) * slatRemainder; // part-way between slots + } + else { + return slatTop; + } + }, + + + // Queries each `slatEl` for its position relative to the grid's container and stores it in `slatTops`. + // Includes the the bottom of the last slat as the last item in the array. + computeSlatTops: function() { + var tops = []; + var top; + + this.slatEls.each(function(i, node) { + top = $(node).position().top; + tops.push(top); + }); + + tops.push(top + this.slatEls.last().outerHeight()); // bottom of the last slat + + this.slatTops = tops; + }, + + + /* Event Drag Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being dragged over the specified date(s). + // `end` and `seg` can be null. See View's documentation on renderDrag for more info. + renderDrag: function(start, end, seg) { + var opacity; + + if (seg) { // if there is event information for this drag, render a helper event + this.renderRangeHelper(start, end, seg); + + opacity = this.view.opt('dragOpacity'); + if (opacity !== undefined) { + this.helperEl.css('opacity', opacity); + } + + return true; // signal that a helper has been rendered + } + else { + // otherwise, just render a highlight + this.renderHighlight( + start, + end || this.view.calendar.getDefaultEventEnd(false, start) + ); + } + }, + + + // Unrenders any visual indication of an event being dragged + destroyDrag: function() { + this.destroyHelper(); + this.destroyHighlight(); + }, + + + /* Event Resize Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being resized + renderResize: function(start, end, seg) { + this.renderRangeHelper(start, end, seg); + }, + + + // Unrenders any visual indication of an event being resized + destroyResize: function() { + this.destroyHelper(); + }, + + + /* Event Helper + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a mock "helper" event. `sourceSeg` is the original segment object and might be null (an external drag) + renderHelper: function(event, sourceSeg) { + var res = this.renderEventTable([ event ]); + var tableEl = res.tableEl; + var segs = res.segs; + var i, seg; + var sourceEl; + + // Try to make the segment that is in the same row as sourceSeg look the same + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + if (sourceSeg && sourceSeg.col === seg.col) { + sourceEl = sourceSeg.el; + seg.el.css({ + left: sourceEl.css('left'), + right: sourceEl.css('right'), + 'margin-left': sourceEl.css('margin-left'), + 'margin-right': sourceEl.css('margin-right') + }); + } + } + + this.helperEl = $('
') + .append(tableEl) + .appendTo(this.el); + }, + + + // Unrenders any mock helper event + destroyHelper: function() { + if (this.helperEl) { + this.helperEl.remove(); + this.helperEl = null; + } + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight. + renderSelection: function(start, end) { + if (this.view.opt('selectHelper')) { // this setting signals that a mock helper event should be rendered + this.renderRangeHelper(start, end); + } + else { + this.renderHighlight(start, end); + } + }, + + + // Unrenders any visual indication of a selection + destroySelection: function() { + this.destroyHelper(); + this.destroyHighlight(); + }, + + + /* Highlight + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders an emphasis on the given date range. `start` is inclusive. `end` is exclusive. + renderHighlight: function(start, end) { + this.highlightEl = $( + this.highlightSkeletonHtml(start, end) + ).appendTo(this.el); + }, + + + // Unrenders the emphasis on a date range + destroyHighlight: function() { + if (this.highlightEl) { + this.highlightEl.remove(); + this.highlightEl = null; + } + }, + + + // Generates HTML for a table element with containers in each column, responsible for absolutely positioning the + // highlight elements to cover the highlighted slots. + highlightSkeletonHtml: function(start, end) { + var view = this.view; + var segs = this.rangeToSegs(start, end); + var cellHtml = ''; + var col = 0; + var i, seg; + var dayDate; + var top, bottom; + + for (i = 0; i < segs.length; i++) { // loop through the segments. one per column + seg = segs[i]; + + // need empty cells beforehand? + if (col < seg.col) { + cellHtml += '
'; + + col++; + } + + // need empty cells after the last segment? + if (col < view.colCnt) { + cellHtml += ''; + } + }, + + + // Generates the HTML that will go before content-skeleton cells that display the day/week numbers. + // Queried by the DayGrid subcomponent. Ordering depends on isRTL. + numberIntroHtml: function(row) { + if (this.weekNumbersVisible) { + return '' + + ''; + } + }, + + + // Generates the HTML that goes before the day bg cells for each day-row. + // Queried by the DayGrid subcomponent. Ordering depends on isRTL. + dayIntroHtml: function() { + if (this.weekNumbersVisible) { + return ''; + } + }, + + + // Generates the HTML that goes before every other type of row generated by DayGrid. Ordering depends on isRTL. + // Affects helper-skeleton and highlight-skeleton rows. + introHtml: function() { + if (this.weekNumbersVisible) { + return ''; + } + }, + + + // Generates the HTML for the '; + }, + + + // Generates an HTML attribute string for setting the width of the week number column, if it is known + weekNumberStyleAttr: function() { + if (this.weekNumberWidth !== null) { + return 'style="width:' + this.weekNumberWidth + 'px"'; + } + return ''; + }, + + + // Determines whether each row should have a constant height + hasRigidRows: function() { + var eventLimit = this.opt('eventLimit'); + return eventLimit && typeof eventLimit !== 'number'; + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + + // Refreshes the horizontal dimensions of the view + updateWidth: function() { + if (this.weekNumbersVisible) { + // Make sure all week number cells running down the side have the same width. + // Record the width for cells created later. + this.weekNumberWidth = matchCellWidths( + this.el.find('.fc-week-number') + ); + } + }, + + + // Adjusts the vertical dimensions of the view to the specified values + setHeight: function(totalHeight, isAuto) { + var eventLimit = this.opt('eventLimit'); + var scrollerHeight; + + // reset all heights to be natural + unsetScroller(this.scrollerEl); + uncompensateScroll(this.headRowEl); + + this.dayGrid.destroySegPopover(); // kill the "more" popover if displayed + + // is the event limit a constant level number? + if (eventLimit && typeof eventLimit === 'number') { + this.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after + } + + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.setGridHeight(scrollerHeight, isAuto); + + // is the event limit dynamically calculated? + if (eventLimit && typeof eventLimit !== 'number') { + this.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set + } + + if (!isAuto && setPotentialScroller(this.scrollerEl, scrollerHeight)) { // using scrollbars? + + compensateScroll(this.headRowEl, getScrollbarWidths(this.scrollerEl)); + + // doing the scrollbar compensation might have created text overflow which created more height. redo + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.scrollerEl.height(scrollerHeight); + + this.restoreScroll(); + } + }, + + + // Sets the height of just the DayGrid component in this view + setGridHeight: function(height, isAuto) { + if (isAuto) { + undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding + } + else { + distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows + } + }, + + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders the given events onto the view and populates the segments array + renderEvents: function(events) { + this.dayGrid.renderEvents(events); + + this.updateHeight(); // must compensate for events that overflow the row + + View.prototype.renderEvents.call(this, events); // call the super-method + }, + + + // Retrieves all segment objects that are rendered in the view + getSegs: function() { + return this.dayGrid.getSegs(); + }, + + + // Unrenders all event elements and clears internal segment data + destroyEvents: function() { + View.prototype.destroyEvents.call(this); // do this before dayGrid's segs have been cleared + + this.recordScroll(); // removing events will reduce height and mess with the scroll, so record beforehand + this.dayGrid.destroyEvents(); + + // we DON'T need to call updateHeight() because: + // A) a renderEvents() call always happens after this, which will eventually call updateHeight() + // B) in IE8, this causes a flash whenever events are rerendered + }, + + + /* Event Dragging + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being dragged over the view. + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(start, end, seg) { + return this.dayGrid.renderDrag(start, end, seg); + }, + + + // Unrenders the visual indication of an event being dragged over the view + destroyDrag: function() { + this.dayGrid.destroyDrag(); + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection + renderSelection: function(start, end) { + this.dayGrid.renderSelection(start, end); + }, + + + // Unrenders a visual indications of a selection + destroySelection: function() { + this.dayGrid.destroySelection(); + } + +}); + +;; + +/* A month view with day cells running in rows (one-per-week) and columns +----------------------------------------------------------------------------------------------------------------------*/ + +setDefaults({ + fixedWeekCount: true +}); + +fcViews.month = MonthView; // register the view + +function MonthView(calendar) { + BasicView.call(this, calendar); // call the super-constructor +} + + +MonthView.prototype = createObject(BasicView.prototype); // define the super-class +$.extend(MonthView.prototype, { + + name: 'month', + + + incrementDate: function(date, delta) { + return date.clone().stripTime().add(delta, 'months').startOf('month'); + }, + + + render: function(date) { + var rowCnt; + + this.intervalStart = date.clone().stripTime().startOf('month'); + this.intervalEnd = this.intervalStart.clone().add(1, 'months'); + + this.start = this.intervalStart.clone(); + this.start = this.skipHiddenDays(this.start); // move past the first week if no visible days + this.start.startOf('week'); + this.start = this.skipHiddenDays(this.start); // move past the first invisible days of the week + + this.end = this.intervalEnd.clone(); + this.end = this.skipHiddenDays(this.end, -1, true); // move in from the last week if no visible days + this.end.add((7 - this.end.weekday()) % 7, 'days'); // move to end of week if not already + this.end = this.skipHiddenDays(this.end, -1, true); // move in from the last invisible days of the week + + rowCnt = Math.ceil( // need to ceil in case there are hidden days + this.end.diff(this.start, 'weeks', true) // returnfloat=true + ); + if (this.isFixedWeeks()) { + this.end.add(6 - rowCnt, 'weeks'); + rowCnt = 6; + } + + this.title = this.calendar.formatDate(this.intervalStart, this.opt('titleFormat')); + + BasicView.prototype.render.call(this, rowCnt, this.getCellsPerWeek(), true); // call the super-method + }, + + + // Overrides the default BasicView behavior to have special multi-week auto-height logic + setGridHeight: function(height, isAuto) { + + isAuto = isAuto || this.opt('weekMode') === 'variable'; // LEGACY: weekMode is deprecated + + // if auto, make the height of each row the height that it would be if there were 6 weeks + if (isAuto) { + height *= this.rowCnt / 6; + } + + distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows + }, + + + isFixedWeeks: function() { + var weekMode = this.opt('weekMode'); // LEGACY: weekMode is deprecated + if (weekMode) { + return weekMode === 'fixed'; // if any other type of weekMode, assume NOT fixed + } + + return this.opt('fixedWeekCount'); + } + +}); + +;; + +/* A week view with simple day cells running horizontally +----------------------------------------------------------------------------------------------------------------------*/ +// TODO: a WeekView mixin for calculating dates and titles + +fcViews.basicWeek = BasicWeekView; // register this view + +function BasicWeekView(calendar) { + BasicView.call(this, calendar); // call the super-constructor +} + + +BasicWeekView.prototype = createObject(BasicView.prototype); // define the super-class +$.extend(BasicWeekView.prototype, { + + name: 'basicWeek', + + + incrementDate: function(date, delta) { + return date.clone().stripTime().add(delta, 'weeks').startOf('week'); + }, + + + render: function(date) { + + this.intervalStart = date.clone().stripTime().startOf('week'); + this.intervalEnd = this.intervalStart.clone().add(1, 'weeks'); + + this.start = this.skipHiddenDays(this.intervalStart); + this.end = this.skipHiddenDays(this.intervalEnd, -1, true); + + this.title = this.calendar.formatRange( + this.start, + this.end.clone().subtract(1), // make inclusive by subtracting 1 ms + this.opt('titleFormat'), + ' \u2014 ' // emphasized dash + ); + + BasicView.prototype.render.call(this, 1, this.getCellsPerWeek(), false); // call the super-method + } + +}); +;; + +/* A view with a single simple day cell +----------------------------------------------------------------------------------------------------------------------*/ + +fcViews.basicDay = BasicDayView; // register this view + +function BasicDayView(calendar) { + BasicView.call(this, calendar); // call the super-constructor +} + + +BasicDayView.prototype = createObject(BasicView.prototype); // define the super-class +$.extend(BasicDayView.prototype, { + + name: 'basicDay', + + + incrementDate: function(date, delta) { + var out = date.clone().stripTime().add(delta, 'days'); + out = this.skipHiddenDays(out, delta < 0 ? -1 : 1); + return out; + }, + + + render: function(date) { + + this.start = this.intervalStart = date.clone().stripTime(); + this.end = this.intervalEnd = this.start.clone().add(1, 'days'); + + this.title = this.calendar.formatDate(this.start, this.opt('titleFormat')); + + BasicView.prototype.render.call(this, 1, 1, false); // call the super-method + } + +}); +;; + +/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically. +----------------------------------------------------------------------------------------------------------------------*/ +// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on). +// Responsible for managing width/height. + +setDefaults({ + allDaySlot: true, + allDayText: 'all-day', + + scrollTime: '06:00:00', + + slotDuration: '00:30:00', + + axisFormat: generateAgendaAxisFormat, + timeFormat: { + agenda: generateAgendaTimeFormat + }, + + minTime: '00:00:00', + maxTime: '24:00:00', + slotEventOverlap: true +}); + +var AGENDA_ALL_DAY_EVENT_LIMIT = 5; + + +function generateAgendaAxisFormat(options, langData) { + return langData.longDateFormat('LT') + .replace(':mm', '(:mm)') + .replace(/(\Wmm)$/, '($1)') // like above, but for foreign langs + .replace(/\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand +} + + +function generateAgendaTimeFormat(options, langData) { + return langData.longDateFormat('LT') + .replace(/\s*a$/i, ''); // remove trailing AM/PM +} + + +function AgendaView(calendar) { + View.call(this, calendar); // call the super-constructor + + this.timeGrid = new TimeGrid(this); + + if (this.opt('allDaySlot')) { // should we display the "all-day" area? + this.dayGrid = new DayGrid(this); // the all-day subcomponent of this view + + // the coordinate grid will be a combination of both subcomponents' grids + this.coordMap = new ComboCoordMap([ + this.dayGrid.coordMap, + this.timeGrid.coordMap + ]); + } + else { + this.coordMap = this.timeGrid.coordMap; + } +} + + +AgendaView.prototype = createObject(View.prototype); // define the super-class +$.extend(AgendaView.prototype, { + + timeGrid: null, // the main time-grid subcomponent of this view + dayGrid: null, // the "all-day" subcomponent. if all-day is turned off, this will be null + + axisWidth: null, // the width of the time axis running down the side + + noScrollRowEls: null, // set of fake row elements that must compensate when scrollerEl has scrollbars + + // when the time-grid isn't tall enough to occupy the given height, we render an
underneath + bottomRuleEl: null, + bottomRuleHeight: null, + + + /* Rendering + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders the view into `this.el`, which has already been assigned. + // `colCnt` has been calculated by a subclass and passed here. + render: function(colCnt) { + + // needed for cell-to-date and date-to-cell calculations in View + this.rowCnt = 1; + this.colCnt = colCnt; + + this.el.addClass('fc-agenda-view').html(this.renderHtml()); + + // the element that wraps the time-grid that will probably scroll + this.scrollerEl = this.el.find('.fc-time-grid-container'); + this.timeGrid.coordMap.containerEl = this.scrollerEl; // don't accept clicks/etc outside of this + + this.timeGrid.el = this.el.find('.fc-time-grid'); + this.timeGrid.render(); + + // the
that sometimes displays under the time-grid + this.bottomRuleEl = $('
') + .appendTo(this.timeGrid.el); // inject it into the time-grid + + if (this.dayGrid) { + this.dayGrid.el = this.el.find('.fc-day-grid'); + this.dayGrid.render(); + + // have the day-grid extend it's coordinate area over the
dividing the two grids + this.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight(); + } + + this.noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)'); // fake rows not within the scroller + + View.prototype.render.call(this); // call the super-method + + this.resetScroll(); // do this after sizes have been set + }, + + + // Make subcomponents ready for cleanup + destroy: function() { + this.timeGrid.destroy(); + if (this.dayGrid) { + this.dayGrid.destroy(); + } + View.prototype.destroy.call(this); // call the super-method + }, + + + // Builds the HTML skeleton for the view. + // The day-grid and time-grid components will render inside containers defined by this HTML. + renderHtml: function() { + return '' + + '
'; + } + if (endCol > startCol) { + cellHtml += ''; + } + if (colCnt > endCol) { + cellHtml += ''; + } + + cellHtml = this.bookendCells(cellHtml, 'highlight'); + + return '' + + '
' + + '' + + '' + + cellHtml + + '' + + '
' + + '
'; + } + +}); + +;; + +/* Event-rendering methods for the DayGrid class +----------------------------------------------------------------------------------------------------------------------*/ + +$.extend(DayGrid.prototype, { + + segs: null, + rowStructs: null, // an array of objects, each holding information about a row's event-rendering + + + // Render the given events onto the Grid and return the rendered segments + renderEvents: function(events) { + var rowStructs = this.rowStructs = this.renderEventRows(events); + var segs = []; + + // append to each row's content skeleton + this.rowEls.each(function(i, rowNode) { + $(rowNode).find('.fc-content-skeleton > table').append( + rowStructs[i].tbodyEl + ); + segs.push.apply(segs, rowStructs[i].segs); + }); + + this.segs = segs; + }, + + + // Retrieves all segment objects that have been rendered + getSegs: function() { + return (this.segs || []).concat( + this.popoverSegs || [] // segs rendered in the "more" events popover + ); + }, + + + // Removes all rendered event elements + destroyEvents: function() { + var rowStructs; + var rowStruct; + + Grid.prototype.destroyEvents.call(this); // call the super-method + + rowStructs = this.rowStructs || []; + while ((rowStruct = rowStructs.pop())) { + rowStruct.tbodyEl.remove(); + } + + this.segs = null; + this.destroySegPopover(); // removes the "more.." events popover + }, + + + // Uses the given events array to generate
elements of the level+col matrix + var loneCellMatrix = []; // lookup for elements that only take up a single column + var i, levelSegs; + var col; + var tr; + var j, seg; + var td; + + // populates empty cells from the current column (`col`) to `endCol` + function emptyCellsUntil(endCol) { + while (col < endCol) { + // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell + td = (loneCellMatrix[i - 1] || [])[col]; + if (td) { + td.attr( + 'rowspan', + parseInt(td.attr('rowspan') || 1, 10) + 1 + ); + } + else { + td = $(''); + tr.append(td); + } + cellMatrix[i][col] = td; + loneCellMatrix[i][col] = td; + col++; + } + } + + for (i = 0; i < levelCnt; i++) { // iterate through all levels + levelSegs = segLevels[i]; + col = 0; + tr = $('
').append(seg.el); + if (seg.leftCol != seg.rightCol) { + td.attr('colspan', seg.rightCol - seg.leftCol + 1); + } + else { // a single-column segment + loneCellMatrix[i][col] = td; + } + + while (col <= seg.rightCol) { + cellMatrix[i][col] = td; + segMatrix[i][col] = seg; + col++; + } + + tr.append(td); + } + } + + emptyCellsUntil(colCnt); // finish off the row + this.bookendCells(tr, 'eventSkeleton'); + tbody.append(tr); + } + + return { // a "rowStruct" + row: row, // the row number + tbodyEl: tbody, + cellMatrix: cellMatrix, + segMatrix: segMatrix, + segLevels: segLevels, + segs: rowSegs + }; + }, + + + // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels. + buildSegLevels: function(segs) { + var levels = []; + var i, seg; + var j; + + // Give preference to elements with certain criteria, so they have + // a chance to be closer to the top. + segs.sort(compareSegs); + + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + + // loop through levels, starting with the topmost, until the segment doesn't collide with other segments + for (j = 0; j < levels.length; j++) { + if (!isDaySegCollision(seg, levels[j])) { + break; + } + } + // `j` now holds the desired subrow index + seg.level = j; + + // create new level array if needed and append segment + (levels[j] || (levels[j] = [])).push(seg); + } + + // order segments left-to-right. very important if calendar is RTL + for (j = 0; j < levels.length; j++) { + levels[j].sort(compareDaySegCols); + } + + return levels; + }, + + + // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row + groupSegRows: function(segs) { + var view = this.view; + var segRows = []; + var i; + + for (i = 0; i < view.rowCnt; i++) { + segRows.push([]); + } + + for (i = 0; i < segs.length; i++) { + segRows[segs[i].row].push(segs[i]); + } + + return segRows; + } + +}); + + +// Computes whether two segments' columns collide. They are assumed to be in the same row. +function isDaySegCollision(seg, otherSegs) { + var i, otherSeg; + + for (i = 0; i < otherSegs.length; i++) { + otherSeg = otherSegs[i]; + + if ( + otherSeg.leftCol <= seg.rightCol && + otherSeg.rightCol >= seg.leftCol + ) { + return true; + } + } + + return false; +} + + +// A cmp function for determining the leftmost event +function compareDaySegCols(a, b) { + return a.leftCol - b.leftCol; +} + +;; + +/* Methods relate to limiting the number events for a given day on a DayGrid +----------------------------------------------------------------------------------------------------------------------*/ + +$.extend(DayGrid.prototype, { + + + segPopover: null, // the Popover that holds events that can't fit in a cell. null when not visible + popoverSegs: null, // an array of segment objects that the segPopover holds. null when not visible + + + destroySegPopover: function() { + if (this.segPopover) { + this.segPopover.hide(); // will trigger destruction of `segPopover` and `popoverSegs` + } + }, + + + // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid. + // `levelLimit` can be false (don't limit), a number, or true (should be computed). + limitRows: function(levelLimit) { + var rowStructs = this.rowStructs || []; + var row; // row # + var rowLevelLimit; + + for (row = 0; row < rowStructs.length; row++) { + this.unlimitRow(row); + + if (!levelLimit) { + rowLevelLimit = false; + } + else if (typeof levelLimit === 'number') { + rowLevelLimit = levelLimit; + } + else { + rowLevelLimit = this.computeRowLevelLimit(row); + } + + if (rowLevelLimit !== false) { + this.limitRow(row, rowLevelLimit); + } + } + }, + + + // Computes the number of levels a row will accomodate without going outside its bounds. + // Assumes the row is "rigid" (maintains a constant height regardless of what is inside). + // `row` is the row number. + computeRowLevelLimit: function(row) { + var rowEl = this.rowEls.eq(row); // the containing "fake" row div + var rowHeight = rowEl.height(); // TODO: cache somehow? + var trEls = this.rowStructs[row].tbodyEl.children(); + var i, trEl; + + // Reveal one level
DOM nodes + var col = 0; // col # + var cell; + var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right + var cellMatrix; // a matrix (by level, then column) of all jQuery elements in the row + var limitedNodes; // array of temporarily hidden level
DOM nodes + var i, seg; + var segsBelow; // array of segment objects below `seg` in the current `col` + var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies + var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column) + var td, rowspan; + var segMoreNodes; // array of "more" cells that will stand-in for the current seg's cell + var j; + var moreTd, moreWrap, moreLink; + + // Iterates through empty level cells and places "more" links inside if need be + function emptyCellsUntil(endCol) { // goes from current `col` to `endCol` + while (col < endCol) { + cell = { row: row, col: col }; + segsBelow = _this.getCellSegs(cell, levelLimit); + if (segsBelow.length) { + td = cellMatrix[levelLimit - 1][col]; + moreLink = _this.renderMoreLink(cell, segsBelow); + moreWrap = $('
').append(moreLink); + td.append(moreWrap); + moreNodes.push(moreWrap[0]); + } + col++; + } + } + + if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit? + levelSegs = rowStruct.segLevels[levelLimit - 1]; + cellMatrix = rowStruct.cellMatrix; + + limitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level
for each column the segment occupies. will be one for each colspan + for (j = 0; j < colSegsBelow.length; j++) { + moreTd = $('').attr('rowspan', rowspan); + segsBelow = colSegsBelow[j]; + cell = { row: row, col: seg.leftCol + j }; + moreLink = this.renderMoreLink(cell, [ seg ].concat(segsBelow)); // count seg as hidden too + moreWrap = $('
').append(moreLink); + moreTd.append(moreWrap); + segMoreNodes.push(moreTd[0]); + moreNodes.push(moreTd[0]); + } + + td.addClass('fc-limited').after($(segMoreNodes)); // hide original
and inject replacements + limitedNodes.push(td[0]); + } + } + + emptyCellsUntil(view.colCnt); // finish off the level + rowStruct.moreEls = $(moreNodes); // for easy undoing later + rowStruct.limitedEls = $(limitedNodes); // for easy undoing later + } + }, + + + // Reveals all levels and removes all "more"-related elements for a grid's row. + // `row` is a row number. + unlimitRow: function(row) { + var rowStruct = this.rowStructs[row]; + + if (rowStruct.moreEls) { + rowStruct.moreEls.remove(); + rowStruct.moreEls = null; + } + + if (rowStruct.limitedEls) { + rowStruct.limitedEls.removeClass('fc-limited'); + rowStruct.limitedEls = null; + } + }, + + + // Renders an element that represents hidden event element for a cell. + // Responsible for attaching click handler as well. + renderMoreLink: function(cell, hiddenSegs) { + var _this = this; + var view = this.view; + + return $('') + .text( + this.getMoreLinkText(hiddenSegs.length) + ) + .on('click', function(ev) { + var clickOption = view.opt('eventLimitClick'); + var date = view.cellToDate(cell); + var moreEl = $(this); + var dayEl = _this.getCellDayEl(cell); + var allSegs = _this.getCellSegs(cell); + + // rescope the segments to be within the cell's date + var reslicedAllSegs = _this.resliceDaySegs(allSegs, date); + var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date); + + if (typeof clickOption === 'function') { + // the returned value can be an atomic option + clickOption = view.trigger('eventLimitClick', null, { + date: date, + dayEl: dayEl, + moreEl: moreEl, + segs: reslicedAllSegs, + hiddenSegs: reslicedHiddenSegs + }, ev); + } + + if (clickOption === 'popover') { + _this.showSegPopover(date, cell, moreEl, reslicedAllSegs); + } + else if (typeof clickOption === 'string') { // a view name + view.calendar.zoomTo(date, clickOption); + } + }); + }, + + + // Reveals the popover that displays all events within a cell + showSegPopover: function(date, cell, moreLink, segs) { + var _this = this; + var view = this.view; + var moreWrap = moreLink.parent(); // the
wrapper around the + var topEl; // the element we want to match the top coordinate of + var options; + + if (view.rowCnt == 1) { + topEl = this.view.el; // will cause the popover to cover any sort of header + } + else { + topEl = this.rowEls.eq(cell.row); // will align with top of row + } + + options = { + className: 'fc-more-popover', + content: this.renderSegPopoverContent(date, segs), + parentEl: this.el, + top: topEl.offset().top, + autoHide: true, // when the user clicks elsewhere, hide the popover + viewportConstrain: view.opt('popoverViewportConstrain'), + hide: function() { + // destroy everything when the popover is hidden + _this.segPopover.destroy(); + _this.segPopover = null; + _this.popoverSegs = null; + } + }; + + // Determine horizontal coordinate. + // We use the moreWrap instead of the
to avoid border confusion. + if (view.opt('isRTL')) { + options.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border + } + else { + options.left = moreWrap.offset().left - 1; // -1 to be over cell border + } + + this.segPopover = new Popover(options); + this.segPopover.show(); + }, + + + // Builds the inner DOM contents of the segment popover + renderSegPopoverContent: function(date, segs) { + var view = this.view; + var isTheme = view.opt('theme'); + var title = date.format(view.opt('dayPopoverFormat')); + var content = $( + '
' + + '' + + '' + + htmlEscape(title) + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + ); + var segContainer = content.find('.fc-event-container'); + var i; + + // render each seg's `el` and only return the visible segs + segs = this.renderSegs(segs, true); // disableResizing=true + this.popoverSegs = segs; + + for (i = 0; i < segs.length; i++) { + + // because segments in the popover are not part of a grid coordinate system, provide a hint to any + // grids that want to do drag-n-drop about which cell it came from + segs[i].cellDate = date; + + segContainer.append(segs[i].el); + } + + return content; + }, + + + // Given the events within an array of segment objects, reslice them to be in a single day + resliceDaySegs: function(segs, dayDate) { + var events = $.map(segs, function(seg) { + return seg.event; + }); + var dayStart = dayDate.clone().stripTime(); + var dayEnd = dayStart.clone().add(1, 'days'); + + return this.eventsToSegs(events, dayStart, dayEnd); + }, + + + // Generates the text that should be inside a "more" link, given the number of events it represents + getMoreLinkText: function(num) { + var view = this.view; + var opt = view.opt('eventLimitText'); + + if (typeof opt === 'function') { + return opt(num); + } + else { + return '+' + num + ' ' + opt; + } + }, + + + // Returns segments within a given cell. + // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs. + getCellSegs: function(cell, startLevel) { + var segMatrix = this.rowStructs[cell.row].segMatrix; + var level = startLevel || 0; + var segs = []; + var seg; + + while (level < segMatrix.length) { + seg = segMatrix[level][cell.col]; + if (seg) { + segs.push(seg); + } + level++; + } + + return segs; + } + +}); + +;; + +/* A component that renders one or more columns of vertical time slots +----------------------------------------------------------------------------------------------------------------------*/ + +function TimeGrid(view) { + Grid.call(this, view); // call the super-constructor +} + + +TimeGrid.prototype = createObject(Grid.prototype); // define the super-class +$.extend(TimeGrid.prototype, { + + slotDuration: null, // duration of a "slot", a distinct time segment on given day, visualized by lines + snapDuration: null, // granularity of time for dragging and selecting + + minTime: null, // Duration object that denotes the first visible time of any given day + maxTime: null, // Duration object that denotes the exclusive visible end time of any given day + + dayEls: null, // cells elements in the day-row background + slatEls: null, // elements running horizontally across all columns + + slatTops: null, // an array of top positions, relative to the container. last item holds bottom of last slot + + highlightEl: null, // cell skeleton element for rendering the highlight + helperEl: null, // cell skeleton element for rendering the mock event "helper" + + + // Renders the time grid into `this.el`, which should already be assigned. + // Relies on the view's colCnt. In the future, this component should probably be self-sufficient. + render: function() { + this.processOptions(); + + this.el.html(this.renderHtml()); + + this.dayEls = this.el.find('.fc-day'); + this.slatEls = this.el.find('.fc-slats tr'); + + this.computeSlatTops(); + + Grid.prototype.render.call(this); // call the super-method + }, + + + // Renders the basic HTML skeleton for the grid + renderHtml: function() { + return '' + + '
' + + '' + + this.rowHtml('slotBg') + // leverages RowRenderer, which will call slotBgCellHtml + '
' + + '
' + + '
' + + '' + + this.slatRowHtml() + + '
' + + '
'; + }, + + + // Renders the HTML for a vertical background cell behind the slots. + // This method is distinct from 'bg' because we wanted a new `rowType` so the View could customize the rendering. + slotBgCellHtml: function(row, col, date) { + return this.bgCellHtml(row, col, date); + }, + + + // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL. + slatRowHtml: function() { + var view = this.view; + var calendar = view.calendar; + var isRTL = view.opt('isRTL'); + var html = ''; + var slotNormal = this.slotDuration.asMinutes() % 15 === 0; + var slotTime = moment.duration(+this.minTime); // wish there was .clone() for durations + var slotDate; // will be on the view's first day, but we only care about its time + var minutes; + var axisHtml; + + // Calculate the time for each slot + while (slotTime < this.maxTime) { + slotDate = view.start.clone().time(slotTime); // will be in UTC but that's good. to avoid DST issues + minutes = slotDate.minutes(); + + axisHtml = + '
' + + ((!slotNormal || !minutes) ? // if irregular slot duration, or on the hour, then display the time + '' + // for matchCellWidths + htmlEscape(calendar.formatDate(slotDate, view.opt('axisFormat'))) + + '' : + '' + ) + + '
' + + (isRTL ? axisHtml : '') + + "
'; + col = seg.col; + } + + // compute vertical position + dayDate = view.cellToDate(0, col); + top = this.computeDateTop(seg.start, dayDate); + bottom = this.computeDateTop(seg.end, dayDate); // the y position of the bottom edge + + // generate the cell HTML. bottom becomes negative because it needs to be a CSS value relative to the + // bottom edge of the zero-height container. + cellHtml += + '' + + '
' + + '
' + + '
' + + '
'; + } + + cellHtml = this.bookendCells(cellHtml, 'highlight'); + + return '' + + '
' + + '' + + '' + + cellHtml + + '' + + '
' + + '
'; + } + +}); + +;; + +/* Event-rendering methods for the TimeGrid class +----------------------------------------------------------------------------------------------------------------------*/ + +$.extend(TimeGrid.prototype, { + + segs: null, // segment objects rendered in the component. null of events haven't been rendered yet + eventSkeletonEl: null, // has cells with event-containers, which contain absolutely positioned event elements + + + // Renders the events onto the grid and returns an array of segments that have been rendered + renderEvents: function(events) { + var res = this.renderEventTable(events); + + this.eventSkeletonEl = $('
').append(res.tableEl); + this.el.append(this.eventSkeletonEl); + + this.segs = res.segs; + }, + + + // Retrieves rendered segment objects + getSegs: function() { + return this.segs || []; + }, + + + // Removes all event segment elements from the view + destroyEvents: function() { + Grid.prototype.destroyEvents.call(this); // call the super-method + + if (this.eventSkeletonEl) { + this.eventSkeletonEl.remove(); + this.eventSkeletonEl = null; + } + + this.segs = null; + }, + + + // Renders and returns the portion of the event-skeleton. + // Returns an object with properties 'tbodyEl' and 'segs'. + renderEventTable: function(events) { + var tableEl = $('
'); + var trEl = tableEl.find('tr'); + var segs = this.eventsToSegs(events); + var segCols; + var i, seg; + var col, colSegs; + var containerEl; + + segs = this.renderSegs(segs); // returns only the visible segs + segCols = this.groupSegCols(segs); // group into sub-arrays, and assigns 'col' to each seg + + this.computeSegVerticals(segs); // compute and assign top/bottom + + for (col = 0; col < segCols.length; col++) { // iterate each column grouping + colSegs = segCols[col]; + placeSlotSegs(colSegs); // compute horizontal coordinates, z-index's, and reorder the array + + containerEl = $('
'); + + // assign positioning CSS and insert into container + for (i = 0; i < colSegs.length; i++) { + seg = colSegs[i]; + seg.el.css(this.generateSegPositionCss(seg)); + + // if the height is short, add a className for alternate styling + if (seg.bottom - seg.top < 30) { + seg.el.addClass('fc-short'); + } + + containerEl.append(seg.el); + } + + trEl.append($('
').append(containerEl)); + } + + this.bookendCells(trEl, 'eventSkeleton'); + + return { + tableEl: tableEl, + segs: segs + }; + }, + + + // Refreshes the CSS top/bottom coordinates for each segment element. Probably after a window resize/zoom. + updateSegVerticals: function() { + var segs = this.segs; + var i; + + if (segs) { + this.computeSegVerticals(segs); + + for (i = 0; i < segs.length; i++) { + segs[i].el.css( + this.generateSegVerticalCss(segs[i]) + ); + } + } + }, + + + // For each segment in an array, computes and assigns its top and bottom properties + computeSegVerticals: function(segs) { + var i, seg; + + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + seg.top = this.computeDateTop(seg.start, seg.start); + seg.bottom = this.computeDateTop(seg.end, seg.start); + } + }, + + + // Renders the HTML for a single event segment's default rendering + renderSegHtml: function(seg, disableResizing) { + var view = this.view; + var event = seg.event; + var isDraggable = view.isEventDraggable(event); + var isResizable = !disableResizing && seg.isEnd && view.isEventResizable(event); + var classes = this.getSegClasses(seg, isDraggable, isResizable); + var skinCss = this.getEventSkinCss(event); + var timeText; + var fullTimeText; // more verbose time text. for the print stylesheet + var startTimeText; // just the start time text + + classes.unshift('fc-time-grid-event'); + + if (view.isMultiDayEvent(event)) { // if the event appears to span more than one day... + // Don't display time text on segments that run entirely through a day. + // That would appear as midnight-midnight and would look dumb. + // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am) + if (seg.isStart || seg.isEnd) { + timeText = view.getEventTimeText(seg.start, seg.end); + fullTimeText = view.getEventTimeText(seg.start, seg.end, 'LT'); + startTimeText = view.getEventTimeText(seg.start, null); + } + } else { + // Display the normal time text for the *event's* times + timeText = view.getEventTimeText(event); + fullTimeText = view.getEventTimeText(event, 'LT'); + startTimeText = view.getEventTimeText(event.start, null); + } + + return '' + + '
' + + (timeText ? + '
' + + '' + htmlEscape(timeText) + '' + + '
' : + '' + ) + + (event.title ? + '
' + + htmlEscape(event.title) + + '
' : + '' + ) + + '
' + + '
' + + (isResizable ? + '
' : + '' + ) + + ''; + }, + + + // Generates an object with CSS properties/values that should be applied to an event segment element. + // Contains important positioning-related properties that should be applied to any event element, customized or not. + generateSegPositionCss: function(seg) { + var view = this.view; + var isRTL = view.opt('isRTL'); + var shouldOverlap = view.opt('slotEventOverlap'); + var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point + var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point + var props = this.generateSegVerticalCss(seg); // get top/bottom first + var left; // amount of space from left edge, a fraction of the total width + var right; // amount of space from right edge, a fraction of the total width + + if (shouldOverlap) { + // double the width, but don't go beyond the maximum forward coordinate (1.0) + forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2); + } + + if (isRTL) { + left = 1 - forwardCoord; + right = backwardCoord; + } + else { + left = backwardCoord; + right = 1 - forwardCoord; + } + + props.zIndex = seg.level + 1; // convert from 0-base to 1-based + props.left = left * 100 + '%'; + props.right = right * 100 + '%'; + + if (shouldOverlap && seg.forwardPressure) { + // add padding to the edge so that forward stacked events don't cover the resizer's icon + props[isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width + } + + return props; + }, + + + // Generates an object with CSS properties for the top/bottom coordinates of a segment element + generateSegVerticalCss: function(seg) { + return { + top: seg.top, + bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container + }; + }, + + + // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col + groupSegCols: function(segs) { + var view = this.view; + var segCols = []; + var i; + + for (i = 0; i < view.colCnt; i++) { + segCols.push([]); + } + + for (i = 0; i < segs.length; i++) { + segCols[segs[i].col].push(segs[i]); + } + + return segCols; + } + +}); + + +// Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each. +// Also reorders the given array by date! +function placeSlotSegs(segs) { + var levels; + var level0; + var i; + + segs.sort(compareSegs); // order by date + levels = buildSlotSegLevels(segs); + computeForwardSlotSegs(levels); + + if ((level0 = levels[0])) { + + for (i = 0; i < level0.length; i++) { + computeSlotSegPressures(level0[i]); + } + + for (i = 0; i < level0.length; i++) { + computeSlotSegCoords(level0[i], 0, 0); + } + } +} + + +// Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is +// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date. +function buildSlotSegLevels(segs) { + var levels = []; + var i, seg; + var j; + + for (i=0; i seg2.top && seg1.top < seg2.bottom; +} + + +// A cmp function for determining which forward segment to rely on more when computing coordinates. +function compareForwardSlotSegs(seg1, seg2) { + // put higher-pressure first + return seg2.forwardPressure - seg1.forwardPressure || + // put segments that are closer to initial edge first (and favor ones with no coords yet) + (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) || + // do normal sorting... + compareSegs(seg1, seg2); +} + +;; + +/* An abstract class from which other views inherit from +----------------------------------------------------------------------------------------------------------------------*/ +// Newer methods should be written as prototype methods, not in the monster `View` function at the bottom. + +View.prototype = { + + calendar: null, // owner Calendar object + coordMap: null, // a CoordMap object for converting pixel regions to dates + el: null, // the view's containing element. set by Calendar + + // important Moments + start: null, // the date of the very first cell + end: null, // the date after the very last cell + intervalStart: null, // the start of the interval of time the view represents (1st of month for month view) + intervalEnd: null, // the exclusive end of the interval of time the view represents + + // used for cell-to-date and date-to-cell calculations + rowCnt: null, // # of weeks + colCnt: null, // # of days displayed in a week + + isSelected: false, // boolean whether cells are user-selected or not + + // subclasses can optionally use a scroll container + scrollerEl: null, // the element that will most likely scroll when content is too tall + scrollTop: null, // cached vertical scroll value + + // classNames styled by jqui themes + widgetHeaderClass: null, + widgetContentClass: null, + highlightStateClass: null, + + // document handlers, bound to `this` object + documentMousedownProxy: null, + documentDragStartProxy: null, + + + // Serves as a "constructor" to suppliment the monster `View` constructor below + init: function() { + var tm = this.opt('theme') ? 'ui' : 'fc'; + + this.widgetHeaderClass = tm + '-widget-header'; + this.widgetContentClass = tm + '-widget-content'; + this.highlightStateClass = tm + '-state-highlight'; + + // save references to `this`-bound handlers + this.documentMousedownProxy = $.proxy(this, 'documentMousedown'); + this.documentDragStartProxy = $.proxy(this, 'documentDragStart'); + }, + + + // Renders the view inside an already-defined `this.el`. + // Subclasses should override this and then call the super method afterwards. + render: function() { + this.updateSize(); + this.trigger('viewRender', this, this, this.el); + + // attach handlers to document. do it here to allow for destroy/rerender + $(document) + .on('mousedown', this.documentMousedownProxy) + .on('dragstart', this.documentDragStartProxy); // jqui drag + }, + + + // Clears all view rendering, event elements, and unregisters handlers + destroy: function() { + this.unselect(); + this.trigger('viewDestroy', this, this, this.el); + this.destroyEvents(); + this.el.empty(); // removes inner contents but leaves the element intact + + $(document) + .off('mousedown', this.documentMousedownProxy) + .off('dragstart', this.documentDragStartProxy); + }, + + + // Used to determine what happens when the users clicks next/prev. Given -1 for prev, 1 for next. + // Should apply the delta to `date` (a Moment) and return it. + incrementDate: function(date, delta) { + // subclasses should implement + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + + // Refreshes anything dependant upon sizing of the container element of the grid + updateSize: function(isResize) { + if (isResize) { + this.recordScroll(); + } + this.updateHeight(); + this.updateWidth(); + }, + + + // Refreshes the horizontal dimensions of the calendar + updateWidth: function() { + // subclasses should implement + }, + + + // Refreshes the vertical dimensions of the calendar + updateHeight: function() { + var calendar = this.calendar; // we poll the calendar for height information + + this.setHeight( + calendar.getSuggestedViewHeight(), + calendar.isHeightAuto() + ); + }, + + + // Updates the vertical dimensions of the calendar to the specified height. + // if `isAuto` is set to true, height becomes merely a suggestion and the view should use its "natural" height. + setHeight: function(height, isAuto) { + // subclasses should implement + }, + + + // Given the total height of the view, return the number of pixels that should be used for the scroller. + // Utility for subclasses. + computeScrollerHeight: function(totalHeight) { + var both = this.el.add(this.scrollerEl); + var otherHeight; // cumulative height of everything that is not the scrollerEl in the view (header+borders) + + // fuckin IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked + both.css({ + position: 'relative', // cause a reflow, which will force fresh dimension recalculation + left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll + }); + otherHeight = this.el.outerHeight() - this.scrollerEl.height(); // grab the dimensions + both.css({ position: '', left: '' }); // undo hack + + return totalHeight - otherHeight; + }, + + + // Called for remembering the current scroll value of the scroller. + // Should be called before there is a destructive operation (like removing DOM elements) that might inadvertently + // change the scroll of the container. + recordScroll: function() { + if (this.scrollerEl) { + this.scrollTop = this.scrollerEl.scrollTop(); + } + }, + + + // Set the scroll value of the scroller to the previously recorded value. + // Should be called after we know the view's dimensions have been restored following some type of destructive + // operation (like temporarily removing DOM elements). + restoreScroll: function() { + if (this.scrollTop !== null) { + this.scrollerEl.scrollTop(this.scrollTop); + } + }, + + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders the events onto the view. + // Should be overriden by subclasses. Subclasses should call the super-method afterwards. + renderEvents: function(events) { + this.segEach(function(seg) { + this.trigger('eventAfterRender', seg.event, seg.event, seg.el); + }); + this.trigger('eventAfterAllRender'); + }, + + + // Removes event elements from the view. + // Should be overridden by subclasses. Should call this super-method FIRST, then subclass DOM destruction. + destroyEvents: function() { + this.segEach(function(seg) { + this.trigger('eventDestroy', seg.event, seg.event, seg.el); + }); + }, + + + // Given an event and the default element used for rendering, returns the element that should actually be used. + // Basically runs events and elements through the eventRender hook. + resolveEventEl: function(event, el) { + var custom = this.trigger('eventRender', event, event, el); + + if (custom === false) { // means don't render at all + el = null; + } + else if (custom && custom !== true) { + el = $(custom); + } + + return el; + }, + + + // Hides all rendered event segments linked to the given event + showEvent: function(event) { + this.segEach(function(seg) { + seg.el.css('visibility', ''); + }, event); + }, + + + // Shows all rendered event segments linked to the given event + hideEvent: function(event) { + this.segEach(function(seg) { + seg.el.css('visibility', 'hidden'); + }, event); + }, + + + // Iterates through event segments. Goes through all by default. + // If the optional `event` argument is specified, only iterates through segments linked to that event. + // The `this` value of the callback function will be the view. + segEach: function(func, event) { + var segs = this.getSegs(); + var i; + + for (i = 0; i < segs.length; i++) { + if (!event || segs[i].event._id === event._id) { + func.call(this, segs[i]); + } + } + }, + + + // Retrieves all the rendered segment objects for the view + getSegs: function() { + // subclasses must implement + }, + + + /* Event Drag Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event hovering over the specified date. + // `end` is a Moment and might be null. + // `seg` might be null. if specified, it is the segment object of the event being dragged. + // otherwise, an external event from outside the calendar is being dragged. + renderDrag: function(start, end, seg) { + // subclasses should implement + }, + + + // Unrenders a visual indication of event hovering + destroyDrag: function() { + // subclasses should implement + }, + + + // Handler for accepting externally dragged events being dropped in the view. + // Gets called when jqui's 'dragstart' is fired. + documentDragStart: function(ev, ui) { + var _this = this; + var dropDate = null; + var dragListener; + + if (this.opt('droppable')) { // only listen if this setting is on + + // listener that tracks mouse movement over date-associated pixel regions + dragListener = new DragListener(this.coordMap, { + cellOver: function(cell, date) { + dropDate = date; + _this.renderDrag(date); + }, + cellOut: function() { + dropDate = null; + _this.destroyDrag(); + } + }); + + // gets called, only once, when jqui drag is finished + $(document).one('dragstop', function(ev, ui) { + _this.destroyDrag(); + if (dropDate) { + _this.trigger('drop', ev.target, dropDate, ev, ui); + } + }); + + dragListener.startDrag(ev); // start listening immediately + } + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Selects a date range on the view. `start` and `end` are both Moments. + // `ev` is the native mouse event that begin the interaction. + select: function(start, end, ev) { + this.unselect(ev); + this.renderSelection(start, end); + this.reportSelection(start, end, ev); + }, + + + // Renders a visual indication of the selection + renderSelection: function(start, end) { + // subclasses should implement + }, + + + // Called when a new selection is made. Updates internal state and triggers handlers. + reportSelection: function(start, end, ev) { + this.isSelected = true; + this.trigger('select', null, start, end, ev); + }, + + + // Undoes a selection. updates in the internal state and triggers handlers. + // `ev` is the native mouse event that began the interaction. + unselect: function(ev) { + if (this.isSelected) { + this.isSelected = false; + this.destroySelection(); + this.trigger('unselect', null, ev); + } + }, + + + // Unrenders a visual indication of selection + destroySelection: function() { + // subclasses should implement + }, + + + // Handler for unselecting when the user clicks something and the 'unselectAuto' setting is on + documentMousedown: function(ev) { + var ignore; + + // is there a selection, and has the user made a proper left click? + if (this.isSelected && this.opt('unselectAuto') && isPrimaryMouseButton(ev)) { + + // only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element + ignore = this.opt('unselectCancel'); + if (!ignore || !$(ev.target).closest(ignore).length) { + this.unselect(ev); + } + } + } + +}; + + +// We are mixing JavaScript OOP design patterns here by putting methods and member variables in the closed scope of the +// constructor. Going forward, methods should be part of the prototype. +function View(calendar) { + var t = this; + + // exports + t.calendar = calendar; + t.opt = opt; + t.trigger = trigger; + t.isEventDraggable = isEventDraggable; + t.isEventResizable = isEventResizable; + t.eventDrop = eventDrop; + t.eventResize = eventResize; + + // imports + var reportEventChange = calendar.reportEventChange; + + // locals + var options = calendar.options; + var nextDayThreshold = moment.duration(options.nextDayThreshold); + + + t.init(); // the "constructor" that concerns the prototype methods + + + function opt(name) { + var v = options[name]; + if ($.isPlainObject(v) && !isForcedAtomicOption(name)) { + return smartProperty(v, t.name); + } + return v; + } + + + function trigger(name, thisObj) { + return calendar.trigger.apply( + calendar, + [name, thisObj || t].concat(Array.prototype.slice.call(arguments, 2), [t]) + ); + } + + + + /* Event Editable Boolean Calculations + ------------------------------------------------------------------------------*/ + + + function isEventDraggable(event) { + var source = event.source || {}; + + return firstDefined( + event.startEditable, + source.startEditable, + opt('eventStartEditable'), + event.editable, + source.editable, + opt('editable') + ); + } + + + function isEventResizable(event) { + var source = event.source || {}; + + return firstDefined( + event.durationEditable, + source.durationEditable, + opt('eventDurationEditable'), + event.editable, + source.editable, + opt('editable') + ); + } + + + + /* Event Elements + ------------------------------------------------------------------------------*/ + + + // Compute the text that should be displayed on an event's element. + // Based off the settings of the view. Possible signatures: + // .getEventTimeText(event, formatStr) + // .getEventTimeText(startMoment, endMoment, formatStr) + // .getEventTimeText(startMoment, null, formatStr) + // `timeFormat` is used but the `formatStr` argument can be used to override. + t.getEventTimeText = function(event, formatStr) { + var start; + var end; + + if (typeof event === 'object' && typeof formatStr === 'object') { + // first two arguments are actually moments (or null). shift arguments. + start = event; + end = formatStr; + formatStr = arguments[2]; + } + else { + // otherwise, an event object was the first argument + start = event.start; + end = event.end; + } + + formatStr = formatStr || opt('timeFormat'); + + if (end && opt('displayEventEnd')) { + return calendar.formatRange(start, end, formatStr); + } + else { + return calendar.formatDate(start, formatStr); + } + }; + + + + /* Event Modification Reporting + ---------------------------------------------------------------------------------*/ + + + function eventDrop(el, event, newStart, ev) { + var mutateResult = calendar.mutateEvent(event, newStart, null); + + trigger( + 'eventDrop', + el, + event, + mutateResult.dateDelta, + function() { + mutateResult.undo(); + reportEventChange(); + }, + ev, + {} // jqui dummy + ); + + reportEventChange(); + } + + + function eventResize(el, event, newEnd, ev) { + var mutateResult = calendar.mutateEvent(event, null, newEnd); + + trigger( + 'eventResize', + el, + event, + mutateResult.durationDelta, + function() { + mutateResult.undo(); + reportEventChange(); + }, + ev, + {} // jqui dummy + ); + + reportEventChange(); + } + + + // ==================================================================================================== + // Utilities for day "cells" + // ==================================================================================================== + // The "basic" views are completely made up of day cells. + // The "agenda" views have day cells at the top "all day" slot. + // This was the obvious common place to put these utilities, but they should be abstracted out into + // a more meaningful class (like DayEventRenderer). + // ==================================================================================================== + + + // For determining how a given "cell" translates into a "date": + // + // 1. Convert the "cell" (row and column) into a "cell offset" (the # of the cell, cronologically from the first). + // Keep in mind that column indices are inverted with isRTL. This is taken into account. + // + // 2. Convert the "cell offset" to a "day offset" (the # of days since the first visible day in the view). + // + // 3. Convert the "day offset" into a "date" (a Moment). + // + // The reverse transformation happens when transforming a date into a cell. + + + // exports + t.isHiddenDay = isHiddenDay; + t.skipHiddenDays = skipHiddenDays; + t.getCellsPerWeek = getCellsPerWeek; + t.dateToCell = dateToCell; + t.dateToDayOffset = dateToDayOffset; + t.dayOffsetToCellOffset = dayOffsetToCellOffset; + t.cellOffsetToCell = cellOffsetToCell; + t.cellToDate = cellToDate; + t.cellToCellOffset = cellToCellOffset; + t.cellOffsetToDayOffset = cellOffsetToDayOffset; + t.dayOffsetToDate = dayOffsetToDate; + t.rangeToSegments = rangeToSegments; + t.isMultiDayEvent = isMultiDayEvent; + + + // internals + var hiddenDays = opt('hiddenDays') || []; // array of day-of-week indices that are hidden + var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) + var cellsPerWeek; + var dayToCellMap = []; // hash from dayIndex -> cellIndex, for one week + var cellToDayMap = []; // hash from cellIndex -> dayIndex, for one week + var isRTL = opt('isRTL'); + + + // initialize important internal variables + (function() { + + if (opt('weekends') === false) { + hiddenDays.push(0, 6); // 0=sunday, 6=saturday + } + + // Loop through a hypothetical week and determine which + // days-of-week are hidden. Record in both hashes (one is the reverse of the other). + for (var dayIndex=0, cellIndex=0; dayIndex<7; dayIndex++) { + dayToCellMap[dayIndex] = cellIndex; + isHiddenDayHash[dayIndex] = $.inArray(dayIndex, hiddenDays) != -1; + if (!isHiddenDayHash[dayIndex]) { + cellToDayMap[cellIndex] = dayIndex; + cellIndex++; + } + } + + cellsPerWeek = cellIndex; + if (!cellsPerWeek) { + throw 'invalid hiddenDays'; // all days were hidden? bad. + } + + })(); + + + // Is the current day hidden? + // `day` is a day-of-week index (0-6), or a Moment + function isHiddenDay(day) { + if (moment.isMoment(day)) { + day = day.day(); + } + return isHiddenDayHash[day]; + } + + + function getCellsPerWeek() { + return cellsPerWeek; + } + + + // Incrementing the current day until it is no longer a hidden day, returning a copy. + // If the initial value of `date` is not a hidden day, don't do anything. + // Pass `isExclusive` as `true` if you are dealing with an end date. + // `inc` defaults to `1` (increment one day forward each time) + function skipHiddenDays(date, inc, isExclusive) { + var out = date.clone(); + inc = inc || 1; + while ( + isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7] + ) { + out.add(inc, 'days'); + } + return out; + } + + + // + // TRANSFORMATIONS: cell -> cell offset -> day offset -> date + // + + // cell -> date (combines all transformations) + // Possible arguments: + // - row, col + // - { row:#, col: # } + function cellToDate() { + var cellOffset = cellToCellOffset.apply(null, arguments); + var dayOffset = cellOffsetToDayOffset(cellOffset); + var date = dayOffsetToDate(dayOffset); + return date; + } + + // cell -> cell offset + // Possible arguments: + // - row, col + // - { row:#, col:# } + function cellToCellOffset(row, col) { + var colCnt = t.colCnt; + + // rtl variables. wish we could pre-populate these. but where? + var dis = isRTL ? -1 : 1; + var dit = isRTL ? colCnt - 1 : 0; + + if (typeof row == 'object') { + col = row.col; + row = row.row; + } + var cellOffset = row * colCnt + (col * dis + dit); // column, adjusted for RTL (dis & dit) + + return cellOffset; + } + + // cell offset -> day offset + function cellOffsetToDayOffset(cellOffset) { + var day0 = t.start.day(); // first date's day of week + cellOffset += dayToCellMap[day0]; // normlize cellOffset to beginning-of-week + return Math.floor(cellOffset / cellsPerWeek) * 7 + // # of days from full weeks + cellToDayMap[ // # of days from partial last week + (cellOffset % cellsPerWeek + cellsPerWeek) % cellsPerWeek // crazy math to handle negative cellOffsets + ] - + day0; // adjustment for beginning-of-week normalization + } + + // day offset -> date + function dayOffsetToDate(dayOffset) { + return t.start.clone().add(dayOffset, 'days'); + } + + + // + // TRANSFORMATIONS: date -> day offset -> cell offset -> cell + // + + // date -> cell (combines all transformations) + function dateToCell(date) { + var dayOffset = dateToDayOffset(date); + var cellOffset = dayOffsetToCellOffset(dayOffset); + var cell = cellOffsetToCell(cellOffset); + return cell; + } + + // date -> day offset + function dateToDayOffset(date) { + return date.clone().stripTime().diff(t.start, 'days'); + } + + // day offset -> cell offset + function dayOffsetToCellOffset(dayOffset) { + var day0 = t.start.day(); // first date's day of week + dayOffset += day0; // normalize dayOffset to beginning-of-week + return Math.floor(dayOffset / 7) * cellsPerWeek + // # of cells from full weeks + dayToCellMap[ // # of cells from partial last week + (dayOffset % 7 + 7) % 7 // crazy math to handle negative dayOffsets + ] - + dayToCellMap[day0]; // adjustment for beginning-of-week normalization + } + + // cell offset -> cell (object with row & col keys) + function cellOffsetToCell(cellOffset) { + var colCnt = t.colCnt; + + // rtl variables. wish we could pre-populate these. but where? + var dis = isRTL ? -1 : 1; + var dit = isRTL ? colCnt - 1 : 0; + + var row = Math.floor(cellOffset / colCnt); + var col = ((cellOffset % colCnt + colCnt) % colCnt) * dis + dit; // column, adjusted for RTL (dis & dit) + return { + row: row, + col: col + }; + } + + + // + // Converts a date range into an array of segment objects. + // "Segments" are horizontal stretches of time, sliced up by row. + // A segment object has the following properties: + // - row + // - cols + // - isStart + // - isEnd + // + function rangeToSegments(start, end) { + + var rowCnt = t.rowCnt; + var colCnt = t.colCnt; + var segments = []; // array of segments to return + + // day offset for given date range + var dayRange = computeDayRange(start, end); // convert to a whole-day range + var rangeDayOffsetStart = dateToDayOffset(dayRange.start); + var rangeDayOffsetEnd = dateToDayOffset(dayRange.end); // an exclusive value + + // first and last cell offset for the given date range + // "last" implies inclusivity + var rangeCellOffsetFirst = dayOffsetToCellOffset(rangeDayOffsetStart); + var rangeCellOffsetLast = dayOffsetToCellOffset(rangeDayOffsetEnd) - 1; + + // loop through all the rows in the view + for (var row=0; row
' + + '' + // needed for matchCellWidths + htmlEscape(this.opt('weekNumberTitle')) + + '' + + '' + + '' + // needed for matchCellWidths + this.calendar.calculateWeekNumber(this.cellToDate(row, 0)) + + '' + + 's of the "number" row in the DayGrid's content skeleton. + // The number row will only exist if either day numbers or week numbers are turned on. + numberCellHtml: function(row, col, date) { + var classes; + + if (!this.dayNumbersVisible) { // if there are week numbers but not day numbers + return ''; // will create an empty space above events :( + } + + classes = this.dayGrid.getDayClasses(date); + classes.unshift('fc-day-number'); + + return '' + + '' + + date.date() + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + + this.timeGrid.headHtml() + // render the day-of-week headers + '
' + + (this.dayGrid ? + '
' + + '
' : + '' + ) + + '
' + + '
' + + '
' + + '
'; + }, + + + // Generates the HTML that will go before the day-of week header cells. + // Queried by the TimeGrid subcomponent when generating rows. Ordering depends on isRTL. + headIntroHtml: function() { + var date; + var weekNumber; + var weekTitle; + var weekText; + + if (this.opt('weekNumbers')) { + date = this.cellToDate(0, 0); + weekNumber = this.calendar.calculateWeekNumber(date); + weekTitle = this.opt('weekNumberTitle'); + + if (this.opt('isRTL')) { + weekText = weekNumber + weekTitle; + } + else { + weekText = weekTitle + weekNumber; + } + + return '' + + '' + + '' + // needed for matchCellWidths + htmlEscape(weekText) + + '' + + ''; + } + else { + return ''; + } + }, + + + // Generates the HTML that goes before the all-day cells. + // Queried by the DayGrid subcomponent when generating rows. Ordering depends on isRTL. + dayIntroHtml: function() { + return '' + + '' + + '' + // needed for matchCellWidths + (this.opt('allDayHtml') || htmlEscape(this.opt('allDayText'))) + + '' + + ''; + }, + + + // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column. + slotBgIntroHtml: function() { + return ''; + }, + + + // Generates the HTML that goes before all other types of cells. + // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid. + // Queried by the TimeGrid and DayGrid subcomponents when generating rows. Ordering depends on isRTL. + introHtml: function() { + return ''; + }, + + + // Generates an HTML attribute string for setting the width of the axis, if it is known + axisStyleAttr: function() { + if (this.axisWidth !== null) { + return 'style="width:' + this.axisWidth + 'px"'; + } + return ''; + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + updateSize: function(isResize) { + if (isResize) { + this.timeGrid.resize(); + } + View.prototype.updateSize.call(this, isResize); + }, + + + // Refreshes the horizontal dimensions of the view + updateWidth: function() { + // make all axis cells line up, and record the width so newly created axis cells will have it + this.axisWidth = matchCellWidths(this.el.find('.fc-axis')); + }, + + + // Adjusts the vertical dimensions of the view to the specified values + setHeight: function(totalHeight, isAuto) { + var eventLimit; + var scrollerHeight; + + if (this.bottomRuleHeight === null) { + // calculate the height of the rule the very first time + this.bottomRuleHeight = this.bottomRuleEl.outerHeight(); + } + this.bottomRuleEl.hide(); // .show() will be called later if this
is necessary + + // reset all dimensions back to the original state + this.scrollerEl.css('overflow', ''); + unsetScroller(this.scrollerEl); + uncompensateScroll(this.noScrollRowEls); + + // limit number of events in the all-day area + if (this.dayGrid) { + this.dayGrid.destroySegPopover(); // kill the "more" popover if displayed + + eventLimit = this.opt('eventLimit'); + if (eventLimit && typeof eventLimit !== 'number') { + eventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number + } + if (eventLimit) { + this.dayGrid.limitRows(eventLimit); + } + } + + if (!isAuto) { // should we force dimensions of the scroll container, or let the contents be natural height? + + scrollerHeight = this.computeScrollerHeight(totalHeight); + if (setPotentialScroller(this.scrollerEl, scrollerHeight)) { // using scrollbars? + + // make the all-day and header rows lines up + compensateScroll(this.noScrollRowEls, getScrollbarWidths(this.scrollerEl)); + + // the scrollbar compensation might have changed text flow, which might affect height, so recalculate + // and reapply the desired height to the scroller. + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.scrollerEl.height(scrollerHeight); + + this.restoreScroll(); + } + else { // no scrollbars + // still, force a height and display the bottom rule (marks the end of day) + this.scrollerEl.height(scrollerHeight).css('overflow', 'hidden'); // in case
goes outside + this.bottomRuleEl.show(); + } + } + }, + + + // Sets the scroll value of the scroller to the intial pre-configured state prior to allowing the user to change it. + resetScroll: function() { + var _this = this; + var scrollTime = moment.duration(this.opt('scrollTime')); + var top = this.timeGrid.computeTimeTop(scrollTime); + + // zoom can give weird floating-point values. rather scroll a little bit further + top = Math.ceil(top); + + if (top) { + top++; // to overcome top border that slots beyond the first have. looks better + } + + function scroll() { + _this.scrollerEl.scrollTop(top); + } + + scroll(); + setTimeout(scroll, 0); // overrides any previous scroll state made by the browser + }, + + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders events onto the view and populates the View's segment array + renderEvents: function(events) { + var dayEvents = []; + var timedEvents = []; + var daySegs = []; + var timedSegs; + var i; + + // separate the events into all-day and timed + for (i = 0; i < events.length; i++) { + if (events[i].allDay) { + dayEvents.push(events[i]); + } + else { + timedEvents.push(events[i]); + } + } + + // render the events in the subcomponents + timedSegs = this.timeGrid.renderEvents(timedEvents); + if (this.dayGrid) { + daySegs = this.dayGrid.renderEvents(dayEvents); + } + + // the all-day area is flexible and might have a lot of events, so shift the height + this.updateHeight(); + + View.prototype.renderEvents.call(this, events); // call the super-method + }, + + + // Retrieves all segment objects that are rendered in the view + getSegs: function() { + return this.timeGrid.getSegs().concat( + this.dayGrid ? this.dayGrid.getSegs() : [] + ); + }, + + + // Unrenders all event elements and clears internal segment data + destroyEvents: function() { + View.prototype.destroyEvents.call(this); // do this before the grids' segs have been cleared + + // if destroyEvents is being called as part of an event rerender, renderEvents will be called shortly + // after, so remember what the scroll value was so we can restore it. + this.recordScroll(); + + // destroy the events in the subcomponents + this.timeGrid.destroyEvents(); + if (this.dayGrid) { + this.dayGrid.destroyEvents(); + } + + // we DON'T need to call updateHeight() because: + // A) a renderEvents() call always happens after this, which will eventually call updateHeight() + // B) in IE8, this causes a flash whenever events are rerendered + }, + + + /* Event Dragging + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being dragged over the view. + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(start, end, seg) { + if (start.hasTime()) { + return this.timeGrid.renderDrag(start, end, seg); + } + else if (this.dayGrid) { + return this.dayGrid.renderDrag(start, end, seg); + } + }, + + + // Unrenders a visual indications of an event being dragged over the view + destroyDrag: function() { + this.timeGrid.destroyDrag(); + if (this.dayGrid) { + this.dayGrid.destroyDrag(); + } + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection + renderSelection: function(start, end) { + if (start.hasTime() || end.hasTime()) { + this.timeGrid.renderSelection(start, end); + } + else if (this.dayGrid) { + this.dayGrid.renderSelection(start, end); + } + }, + + + // Unrenders a visual indications of a selection + destroySelection: function() { + this.timeGrid.destroySelection(); + if (this.dayGrid) { + this.dayGrid.destroySelection(); + } + } + +}); + +;; + +/* A week view with an all-day cell area at the top, and a time grid below +----------------------------------------------------------------------------------------------------------------------*/ +// TODO: a WeekView mixin for calculating dates and titles + +fcViews.agendaWeek = AgendaWeekView; // register the view + +function AgendaWeekView(calendar) { + AgendaView.call(this, calendar); // call the super-constructor +} + + +AgendaWeekView.prototype = createObject(AgendaView.prototype); // define the super-class +$.extend(AgendaWeekView.prototype, { + + name: 'agendaWeek', + + + incrementDate: function(date, delta) { + return date.clone().stripTime().add(delta, 'weeks').startOf('week'); + }, + + + render: function(date) { + + this.intervalStart = date.clone().stripTime().startOf('week'); + this.intervalEnd = this.intervalStart.clone().add(1, 'weeks'); + + this.start = this.skipHiddenDays(this.intervalStart); + this.end = this.skipHiddenDays(this.intervalEnd, -1, true); + + this.title = this.calendar.formatRange( + this.start, + this.end.clone().subtract(1), // make inclusive by subtracting 1 ms + this.opt('titleFormat'), + ' \u2014 ' // emphasized dash + ); + + AgendaView.prototype.render.call(this, this.getCellsPerWeek()); // call the super-method + } + +}); + +;; + +/* A day view with an all-day cell area at the top, and a time grid below +----------------------------------------------------------------------------------------------------------------------*/ + +fcViews.agendaDay = AgendaDayView; // register the view + +function AgendaDayView(calendar) { + AgendaView.call(this, calendar); // call the super-constructor +} + + +AgendaDayView.prototype = createObject(AgendaView.prototype); // define the super-class +$.extend(AgendaDayView.prototype, { + + name: 'agendaDay', + + + incrementDate: function(date, delta) { + var out = date.clone().stripTime().add(delta, 'days'); + out = this.skipHiddenDays(out, delta < 0 ? -1 : 1); + return out; + }, + + + render: function(date) { + + this.start = this.intervalStart = date.clone().stripTime(); + this.end = this.intervalEnd = this.start.clone().add(1, 'days'); + + this.title = this.calendar.formatDate(this.start, this.opt('titleFormat')); + + AgendaView.prototype.render.call(this, 1); // call the super-method + } + +}); + +;; + }); \ No newline at end of file diff --git a/dist/fullcalendar.min.css b/dist/fullcalendar.min.css index 31aaeb4..2858443 100644 --- a/dist/fullcalendar.min.css +++ b/dist/fullcalendar.min.css @@ -1,5 +1,5 @@ -/*! - * FullCalendar v2.1.1 Stylesheet - * Docs & License: http://arshaw.com/fullcalendar/ - * (c) 2013 Adam Shaw +/*! + * FullCalendar v2.1.1 Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw */.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed hr,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-popover .fc-header,.fc-unthemed hr{background:#eee}.fc-unthemed .fc-popover .fc-header .fc-close{color:#666}.fc-unthemed .fc-today{background:#fcf8e3}.fc-highlight{background:#bce8f1;opacity:.3;filter:alpha(opacity=30)}.fc-icon{display:inline-block;font-size:2em;line-height:.5em;height:.5em;font-family:"Courier New",Courier,monospace}.fc-icon-left-single-arrow:after{content:"\02039";font-weight:700}.fc-icon-right-single-arrow:after{content:"\0203A";font-weight:700}.fc-icon-left-double-arrow:after{content:"\000AB"}.fc-icon-right-double-arrow:after{content:"\000BB"}.fc-icon-x:after{content:"\000D7"}.fc button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;white-space:nowrap;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:.05em;margin:0 .1em}.fc-state-default{background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.fc-button-group{display:inline-block}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{padding:2px 4px}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{cursor:pointer}.fc-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:25px;margin-top:4px}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.fc hr{height:0;margin:0;padding:0 0 2px;border-style:solid;border-width:1px 0}.fc-clear{clear:both}.fc-bg,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc-bg{bottom:0}.fc-bg table{height:100%}.fc table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-highlight-skeleton{z-index:2;bottom:0}.fc-row .fc-highlight-skeleton table{height:100%}.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-content-skeleton{position:relative;z-index:3;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:4}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{background:0 0;border-color:transparent;border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{overflow-y:scroll;overflow-x:hidden}.fc-scroller>*{position:relative;width:100%;overflow:hidden}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad;background-color:#3a87ad;font-weight:400}.fc-event,.fc-event:hover,.ui-widget .fc-event{color:#fff;text-decoration:none}.fc-event.fc-draggable,.fc-event[href]{cursor:pointer}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}.fc-ltr .fc-day-grid-event.fc-not-start,.fc-rtl .fc-day-grid-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-day-grid-event.fc-not-end,.fc-rtl .fc-day-grid-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-day-grid-event>.fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-day-grid-event .fc-resizer{position:absolute;top:0;bottom:0;width:7px}.fc-ltr .fc-day-grid-event .fc-resizer{right:-3px;cursor:e-resize}.fc-rtl .fc-day-grid-event .fc-resizer{left:-3px;cursor:w-resize}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-toolbar{text-align:center;margin-bottom:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.fc-toolbar button{position:relative}.fc-toolbar .fc-state-hover,.fc-toolbar .ui-state-hover{z-index:2}.fc-toolbar .fc-state-down{z-index:3}.fc-toolbar .fc-state-active,.fc-toolbar .ui-state-active{z-index:4}.fc-toolbar button:focus{z-index:5}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc-basic-view tbody .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:0 2px}.fc-basic-view td.fc-day-number,.fc-basic-view td.fc-week-number span{padding-top:2px;padding-bottom:2px}.fc-basic-view .fc-week-number{text-align:center}.fc-basic-view .fc-week-number span{display:inline-block;min-width:1.25em}.fc-ltr .fc-basic-view .fc-day-number{text-align:right}.fc-rtl .fc-basic-view .fc-day-number{text-align:left}.fc-day-number.fc-other-month{opacity:.3;filter:alpha(opacity=30)}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-highlight-skeleton{z-index:3}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:4;top:0;left:0;right:0}.fc-time-grid>.fc-helper-skeleton{z-index:5}.fc-slats td{height:1.5em;border-bottom:0}.fc-slats .fc-minor td{border-top-style:dotted}.fc-slats .ui-widget-content{background:0 0}.fc-time-grid .fc-highlight-container{position:relative}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-time-grid .fc-event-container{position:relative}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-time-grid-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event{overflow:hidden}.fc-time-grid-event>.fc-content{position:relative;z-index:2}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event .fc-bg{z-index:1;background:#fff;opacity:.25;filter:alpha(opacity=25)}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\000A0-\000A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event .fc-resizer{position:absolute;z-index:3;left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event .fc-resizer:after{content:"="} \ No newline at end of file diff --git a/dist/fullcalendar.min.js b/dist/fullcalendar.min.js index 87be86d..aa83c57 100644 --- a/dist/fullcalendar.min.js +++ b/dist/fullcalendar.min.js @@ -3,6 +3,6 @@ * Docs & License: http://arshaw.com/fullcalendar/ * (c) 2013 Adam Shaw */ -(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function i(t,e){return e.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"t")}function n(t,e){var i=e.longDateFormat("L");return i=i.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g,""),t.isRTL?i+=" ddd":i="ddd "+i,i}function r(t){o(De,t)}function o(e){function i(i,n){t.isPlainObject(n)&&t.isPlainObject(e[i])&&!s(i)?e[i]=o({},e[i],n):void 0!==n&&(e[i]=n)}for(var n=1;arguments.length>n;n++)t.each(arguments[n],i);return e}function s(t){return/(Time|Duration)$/.test(t)}function l(i,n){function r(t){var i=e.localeData||e.langData;return i.call(e,t)||i.call(e,"en")}function s(t){ie?h()&&(p(),f(t)):l()}function l(){ne=K.theme?"ui":"fc",i.addClass("fc"),K.isRTL?i.addClass("fc-rtl"):i.addClass("fc-ltr"),K.theme?i.addClass("ui-widget"):i.addClass("fc-unthemed"),ie=t("
").prependTo(i),te=new a(q,K),ee=te.render(),ee&&i.prepend(ee),u(K.defaultView),K.handleWindowResize&&(se=L(v,K.windowResizeDelay),t(window).resize(se))}function d(){re&&re.destroy(),te.destroy(),ie.remove(),i.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"),t(window).unbind("resize",se)}function h(){return i.is(":visible")}function u(t){f(0,t)}function f(e,i){he++,re&&i&&re.name!==i&&(te.deactivateButton(re.name),I(),re.start&&re.destroy(),re.el.remove(),re=null),!re&&i&&(re=new xe[i](q),re.el=t("
").appendTo(ie),te.activateButton(i)),re&&(e&&(le=re.incrementDate(le,e)),re.start&&!e&&le.isWithin(re.intervalStart,re.intervalEnd)||h()&&(I(),re.start&&re.destroy(),re.render(le),Z(),C(),x(),b())),Z(),he--}function g(t){return h()?(t&&m(),he++,re.updateSize(!0),he--,!0):void 0}function p(){h()&&m()}function m(){oe="number"==typeof K.contentHeight?K.contentHeight:"number"==typeof K.height?K.height-(ee?ee.outerHeight(!0):0):Math.round(ie.width()/Math.max(K.aspectRatio,.5))}function v(t){!he&&t.target===window&&re.start&&g(!0)&&re.trigger("windowResize",de)}function y(){E(),S()}function w(){h()&&(I(),re.destroyEvents(),re.renderEvents(ue),Z())}function E(){I(),re.destroyEvents(),Z()}function b(){!K.lazyFetching||ae(re.start,re.end)?S():w()}function S(){ce(re.start,re.end)}function D(t){ue=t,w()}function T(){w()}function C(){te.updateTitle(re.title)}function x(){var t=q.getNow();t.isWithin(re.intervalStart,re.intervalEnd)?te.disableButton("today"):te.enableButton("today")}function k(t,e){t=q.moment(t),e=e?q.moment(e):t.hasTime()?t.clone().add(q.defaultTimedEventDuration):t.clone().add(q.defaultAllDayEventDuration),re.select(t,e)}function M(){re&&re.unselect()}function R(){f(-1)}function P(){f(1)}function G(){le.add(-1,"years"),f()}function N(){le.add(1,"years"),f()}function Y(){le=q.getNow(),f()}function A(t){le=q.moment(t),f()}function _(t){le.add(e.duration(t)),f()}function O(t,e){var i,n;e&&void 0!==xe[e]||(e=e||"day",i=te.getViewsWithButtons().join(" "),n=i.match(RegExp("\\w+"+z(e))),n||(n=i.match(/\w+Day/)),e=n?n[0]:"agendaDay"),le=t,u(e)}function F(){return le.clone()}function I(){ie.css({width:"100%",height:ie.height(),overflow:"hidden"})}function Z(){ie.css({width:"",height:"",overflow:""})}function B(){return q}function j(){return re}function X(t,e){return void 0===e?K[t]:(("height"==t||"contentHeight"==t||"aspectRatio"==t)&&(K[t]=e,g(!0)),void 0)}function $(t,e){return K[t]?K[t].apply(e||de,Array.prototype.slice.call(arguments,2)):void 0}var q=this;n=n||{};var U,K=o({},De,n);U=K.lang in Te?Te[K.lang]:Te[De.lang],U&&(K=o({},De,U,n)),K.isRTL&&(K=o({},De,Ce,U||{},n)),q.options=K,q.render=s,q.destroy=d,q.refetchEvents=y,q.reportEvents=D,q.reportEventChange=T,q.rerenderEvents=w,q.changeView=u,q.select=k,q.unselect=M,q.prev=R,q.next=P,q.prevYear=G,q.nextYear=N,q.today=Y,q.gotoDate=A,q.incrementDate=_,q.zoomTo=O,q.getDate=F,q.getCalendar=B,q.getView=j,q.option=X,q.trigger=$;var Q=H(r(K.lang));if(K.monthNames&&(Q._months=K.monthNames),K.monthNamesShort&&(Q._monthsShort=K.monthNamesShort),K.dayNames&&(Q._weekdays=K.dayNames),K.dayNamesShort&&(Q._weekdaysShort=K.dayNamesShort),null!=K.firstDay){var J=H(Q._week);J.dow=K.firstDay,Q._week=J}q.defaultAllDayEventDuration=e.duration(K.defaultAllDayEventDuration),q.defaultTimedEventDuration=e.duration(K.defaultTimedEventDuration),q.moment=function(){var t;return"local"===K.timezone?(t=He.moment.apply(null,arguments),t.hasTime()&&t.local()):t="UTC"===K.timezone?He.moment.utc.apply(null,arguments):He.moment.parseZone.apply(null,arguments),"_locale"in t?t._locale=Q:t._lang=Q,t},q.getIsAmbigTimezone=function(){return"local"!==K.timezone&&"UTC"!==K.timezone},q.rezoneDate=function(t){return q.moment(t.toArray())},q.getNow=function(){var t=K.now;return"function"==typeof t&&(t=t()),q.moment(t)},q.calculateWeekNumber=function(t){var e=K.weekNumberCalculation;return"function"==typeof e?e(t):"local"===e?t.week():"ISO"===e.toUpperCase()?t.isoWeek():void 0},q.getEventEnd=function(t){return t.end?t.end.clone():q.getDefaultEventEnd(t.allDay,t.start)},q.getDefaultEventEnd=function(t,e){var i=e.clone();return t?i.stripTime().add(q.defaultAllDayEventDuration):i.add(q.defaultTimedEventDuration),q.getIsAmbigTimezone()&&i.stripZone(),i},q.formatRange=function(t,e,i){return"function"==typeof i&&(i=i.call(q,K,Q)),W(t,e,i,null,K.isRTL)},q.formatDate=function(t,e){return"function"==typeof e&&(e=e.call(q,K,Q)),V(t,e)},c.call(q,K);var te,ee,ie,ne,re,oe,se,le,ae=q.isFetchNeeded,ce=q.fetchEvents,de=i[0],he=0,ue=[];le=null!=K.defaultDate?q.moment(K.defaultDate):q.getNow(),q.getSuggestedViewHeight=function(){return void 0===oe&&p(),oe},q.isHeightAuto=function(){return"auto"===K.contentHeight||"auto"===K.height}}function a(e,i){function n(){var e=i.header;return f=i.theme?"ui":"fc",e?g=t("
").append(o("left")).append(o("right")).append(o("center")).append('
'):void 0}function r(){g.remove()}function o(n){var r=t('
'),o=i.header[n];return o&&t.each(o.split(" "),function(){var n,o=t(),s=!0;t.each(this.split(","),function(n,r){var l,a,c,d,h,u,g,m;"title"==r?(o=o.add(t("

 

")),s=!1):(e[r]?l=function(){e[r]()}:xe[r]&&(l=function(){e.changeView(r)},p.push(r)),l&&(a=S(i.themeButtonIcons,r),c=S(i.buttonIcons,r),d=S(i.defaultButtonText,r),h=S(i.buttonText,r),u=h?R(h):a&&i.theme?"":c&&!i.theme?"":R(d||r),g=["fc-"+r+"-button",f+"-button",f+"-state-default"],m=t('").click(function(){m.hasClass(f+"-state-disabled")||(l(),(m.hasClass(f+"-state-active")||m.hasClass(f+"-state-disabled"))&&m.removeClass(f+"-state-hover"))}).mousedown(function(){m.not("."+f+"-state-active").not("."+f+"-state-disabled").addClass(f+"-state-down")}).mouseup(function(){m.removeClass(f+"-state-down")}).hover(function(){m.not("."+f+"-state-active").not("."+f+"-state-disabled").addClass(f+"-state-hover")},function(){m.removeClass(f+"-state-hover").removeClass(f+"-state-down")}),o=o.add(m)))}),s&&o.first().addClass(f+"-corner-left").end().last().addClass(f+"-corner-right").end(),o.length>1?(n=t("
"),s&&n.addClass("fc-button-group"),n.append(o),r.append(n)):r.append(o)}),r}function s(t){g.find("h2").text(t)}function l(t){g.find(".fc-"+t+"-button").addClass(f+"-state-active")}function a(t){g.find(".fc-"+t+"-button").removeClass(f+"-state-active")}function c(t){g.find(".fc-"+t+"-button").attr("disabled","disabled").addClass(f+"-state-disabled")}function d(t){g.find(".fc-"+t+"-button").removeAttr("disabled").removeClass(f+"-state-disabled")}function h(){return p}var u=this;u.render=n,u.destroy=r,u.updateTitle=s,u.activateButton=l,u.deactivateButton=a,u.disableButton=c,u.enableButton=d,u.getViewsWithButtons=h;var f,g=t(),p=[]}function c(e){function i(t,e){return!T||t.clone().stripZone()C.clone().stripZone()}function n(t,e){T=t,C=e,A=[];var i=++G,n=L.length;N=n;for(var o=0;n>o;o++)r(L[o],i)}function r(e,i){o(e,function(n){var r,o,s=t.isArray(e.events);if(i==G){if(n)for(r=0;n.length>r;r++)o=n[r],s||(o=w(o,e)),o&&A.push(o);N--,N||R(A)}})}function o(i,n){var r,s,l=He.sourceFetchers;for(r=0;l.length>r;r++){if(s=l[r].call(S,i,T.clone(),C.clone(),e.timezone,n),s===!0)return;if("object"==typeof s)return o(s,n),void 0}var a=i.events;if(a)t.isFunction(a)?(v(),a.call(S,T.clone(),C.clone(),e.timezone,function(t){n(t),y()})):t.isArray(a)?n(a):n();else{var c=i.url;if(c){var d,h=i.success,u=i.error,f=i.complete;d=t.isFunction(i.data)?i.data():i.data;var g=t.extend({},d||{}),p=M(i.startParam,e.startParam),m=M(i.endParam,e.endParam),w=M(i.timezoneParam,e.timezoneParam);p&&(g[p]=T.format()),m&&(g[m]=C.format()),e.timezone&&"local"!=e.timezone&&(g[w]=e.timezone),v(),t.ajax(t.extend({},ke,i,{data:g,success:function(e){e=e||[];var i=k(h,this,arguments);t.isArray(i)&&(e=i),n(e)},error:function(){k(u,this,arguments),n()},complete:function(){k(f,this,arguments),y()}}))}else n()}}function s(t){var e=l(t);e&&(L.push(e),N++,r(e,G))}function l(e){var i,n,r=He.sourceNormalizers;if(t.isFunction(e)||t.isArray(e)?i={events:e}:"string"==typeof e?i={url:e}:"object"==typeof e&&(i=t.extend({},e)),i){for(i.className?"string"==typeof i.className&&(i.className=i.className.split(/\s+/)):i.className=[],t.isArray(i.events)&&(i.origArray=i.events,i.events=t.map(i.events,function(t){return w(t,i)})),n=0;r.length>n;n++)r[n].call(S,i);return i}}function a(e){L=t.grep(L,function(t){return!c(t,e)}),A=t.grep(A,function(t){return!c(t.source,e)}),R(A)}function c(t,e){return t&&e&&h(t)==h(e)}function h(t){return("object"==typeof t?t.origArray||t.url||t.events:null)||t}function u(t){t.start=S.moment(t.start),t.end&&(t.end=S.moment(t.end)),E(t),f(t),R(A)}function f(t){var e,i,n,r;for(e=0;A.length>e;e++)if(i=A[e],i._id==t._id&&i!==t)for(n=0;V.length>n;n++)r=V[n],void 0!==t[r]&&(i[r]=t[r])}function g(t,e){var i=w(t);i&&(i.source||(e&&(z.events.push(i),i.source=z),A.push(i)),R(A))}function p(e){var i,n;for(null==e?e=function(){return!0}:t.isFunction(e)||(i=e+"",e=function(t){return t._id==i}),A=t.grep(A,e,!0),n=0;L.length>n;n++)t.isArray(L[n].events)&&(L[n].events=t.grep(L[n].events,e,!0));R(A)}function m(e){return t.isFunction(e)?t.grep(A,e):null!=e?(e+="",t.grep(A,function(t){return t._id==e})):A}function v(){Y++||H("loading",null,!0,x())}function y(){--Y||H("loading",null,!1,x())}function w(i,n){var r,o,s,l,a={};return e.eventDataTransform&&(i=e.eventDataTransform(i)),n&&n.eventDataTransform&&(i=n.eventDataTransform(i)),r=S.moment(i.start||i.date),r.isValid()&&(o=null,!i.end||(o=S.moment(i.end),o.isValid()))?(s=i.allDay,void 0===s&&(l=M(n?n.allDayDefault:void 0,e.allDayDefault),s=void 0!==l?l:!(r.hasTime()||o&&o.hasTime())),s?(r.hasTime()&&r.stripTime(),o&&o.hasTime()&&o.stripTime()):(r.hasTime()||(r=S.rezoneDate(r)),o&&!o.hasTime()&&(o=S.rezoneDate(o))),t.extend(a,i),n&&(a.source=n),a._id=i._id||(void 0===i.id?"_fc"+Me++:i.id+""),a.className=i.className?"string"==typeof i.className?i.className.split(/\s+/):i.className:[],a.allDay=s,a.start=r,a.end=o,e.forceEventDuration&&!a.end&&(a.end=P(a)),d(a),a):void 0}function E(t,e,i){var n,r,o,s,l=t._allDay,a=t._start,c=t._end,d=!1;return e||i||(e=t.start,i=t.end),n=t.allDay!=l?t.allDay:!(e||i).hasTime(),n&&(e&&(e=e.clone().stripTime()),i&&(i=i.clone().stripTime())),e&&(r=n?D(e,a.clone().stripTime()):D(e,a)),n!=l?d=!0:i&&(o=D(i||S.getDefaultEventEnd(n,e||a),e||a).subtract(D(c||S.getDefaultEventEnd(l,a),a))),s=b(m(t._id),d,n,r,o),{dateDelta:r,durationDelta:o,undo:s}}function b(i,n,r,o,s){var l=S.getIsAmbigTimezone(),a=[];return t.each(i,function(t,i){var c=i._allDay,h=i._start,u=i._end,f=null!=r?r:c,g=h.clone(),p=!n&&u?u.clone():null;f?(g.stripTime(),p&&p.stripTime()):(g.hasTime()||(g=S.rezoneDate(g)),p&&!p.hasTime()&&(p=S.rezoneDate(p))),p||!e.forceEventDuration&&!+s||(p=S.getDefaultEventEnd(f,g)),g.add(o),p&&p.add(o).add(s),l&&(+o||+s)&&(g.stripZone(),p&&p.stripZone()),i.allDay=f,i.start=g,i.end=p,d(i),a.push(function(){i.allDay=c,i.start=h,i.end=u,d(i)})}),function(){for(var t=0;a.length>t;t++)a[t]()}}var S=this;S.isFetchNeeded=i,S.fetchEvents=n,S.addEventSource=s,S.removeEventSource=a,S.updateEvent=u,S.renderEvent=g,S.removeEvents=p,S.clientEvents=m,S.mutateEvent=E;var T,C,H=S.trigger,x=S.getView,R=S.reportEvents,P=S.getEventEnd,z={events:[]},L=[z],G=0,N=0,Y=0,A=[];t.each((e.events?[e.events]:[]).concat(e.eventSources||[]),function(t,e){var i=l(e);i&&L.push(i)});var V=["title","url","allDay","className","editable","color","backgroundColor","borderColor","textColor"]}function d(t){t._allDay=t.allDay,t._start=t.start.clone(),t._end=t.end?t.end.clone():null}function h(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function u(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function f(e,i,n){var r=Math.floor(i/e.length),o=Math.floor(i-r*(e.length-1)),s=[],l=[],a=[],c=0;g(e),e.each(function(i,n){var d=i===e.length-1?o:r,h=t(n).outerHeight(!0);d>h?(s.push(n),l.push(h),a.push(t(n).height())):c+=h}),n&&(i-=c,r=Math.floor(i/s.length),o=Math.floor(i-r*(s.length-1))),t(s).each(function(e,i){var n=e===s.length-1?o:r,c=l[e],d=a[e],h=n-(c-d);n>c&&t(i).height(h)})}function g(t){t.height("")}function p(e){var i=0;return e.find("> *").each(function(e,n){var r=t(n).outerWidth();r>i&&(i=r)}),i++,e.width(i),i}function m(t,e){return t.height(e).addClass("fc-scroller"),t[0].scrollHeight-1>t[0].clientHeight?!0:(v(t),!1)}function v(t){t.height("").removeClass("fc-scroller")}function y(e){var i=e.css("position"),n=e.parents().filter(function(){var e=t(this);return/(auto|scroll)/.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&n.length?n:t(e[0].ownerDocument||document)}function w(t){var e=t.offset().left,i=e+t.width(),n=t.children(),r=n.offset().left,o=r+n.outerWidth();return{left:r-e,right:i-o}}function E(t){return 1==t.which&&!t.ctrlKey}function b(t,e,i,n){var r,o,s,l;return e>i&&n>t?(t>=i?(r=t.clone(),s=!0):(r=i.clone(),s=!1),n>=e?(o=e.clone(),l=!0):(o=n.clone(),l=!1),{start:r,end:o,isStart:s,isEnd:l}):void 0}function S(t,e){if(t=t||{},void 0!==t[e])return t[e];for(var i,n=e.split(/(?=[A-Z])/),r=n.length-1;r>=0;r--)if(i=t[n[r].toLowerCase()],void 0!==i)return i;return t["default"]}function D(t,i){return e.duration({days:t.clone().stripTime().diff(i.clone().stripTime(),"days"),ms:t.time()-i.time()})}function T(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function C(t,e){return t-e}function H(t){var e=function(){};return e.prototype=t,new e}function x(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])}function k(e,i,n){if(t.isFunction(e)&&(e=[e]),e){var r,o;for(r=0;e.length>r;r++)o=e[r].apply(i,n)||o;return o}}function M(){for(var t=0;arguments.length>t;t++)if(void 0!==arguments[t])return arguments[t]}function R(t){return(t+"").replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function P(t){return t.replace(/&.*?;/g,"")}function z(t){return t.charAt(0).toUpperCase()+t.slice(1)}function L(t,e){var i,n,r,o,s=function(){var l=+new Date-o;e>l&&l>0?i=setTimeout(s,e-l):(i=null,t.apply(r,n),i||(r=n=null))};return function(){r=this,n=arguments,o=+new Date,i||(i=setTimeout(s,e))}}function G(i,n,r){var o,s,l,a,c=i[0],d=1==i.length&&"string"==typeof c;return e.isMoment(c)?(a=e.apply(null,i),c._ambigTime&&(a._ambigTime=!0),c._ambigZone&&(a._ambigZone=!0)):T(c)||void 0===c?a=e.apply(null,i):(o=!1,s=!1,d?Pe.test(c)?(c+="-01",i=[c],o=!0,s=!0):(l=ze.exec(c))&&(o=!l[5],s=!0):t.isArray(c)&&(s=!0),a=n?e.utc.apply(e,i):e.apply(null,i),o?(a._ambigTime=!0,a._ambigZone=!0):r&&(s?a._ambigZone=!0:d&&a.zone(c))),new N(a)}function N(t){x(this,t)}function Y(t,e){var i,n=[],r=!1,o=!1;for(i=0;t.length>i;i++)n.push(He.moment.parseZone(t[i])),r=r||n[i]._ambigTime,o=o||n[i]._ambigZone;for(i=0;n.length>i;i++)r&&!e?n[i].stripTime():o&&n[i].stripZone();return n}function A(t,i){return e.fn.format.call(t,i)}function V(t,e){return _(t,Z(e))}function _(t,e){var i,n="";for(i=0;e.length>i;i++)n+=O(t,e[i]);return n}function O(t,e){var i,n;return"string"==typeof e?e:(i=e.token)?Le[i]?Le[i](t):A(t,i):e.maybe&&(n=_(t,e.maybe),n.match(/[1-9]/))?n:""}function W(t,e,i,n,r){var o;return t=He.moment.parseZone(t),e=He.moment.parseZone(e),o=(t.localeData||t.lang).call(t),i=o.longDateFormat(i)||i,n=n||" - ",F(t,e,Z(i),n,r)}function F(t,e,i,n,r){var o,s,l,a,c="",d="",h="",u="",f="";for(s=0;i.length>s&&(o=I(t,e,i[s]),o!==!1);s++)c+=o;for(l=i.length-1;l>s&&(o=I(t,e,i[l]),o!==!1);l--)d=o+d;for(a=s;l>=a;a++)h+=O(t,i[a]),u+=O(e,i[a]);return(h||u)&&(f=r?u+n+h:h+n+u),c+f+d}function I(t,e,i){var n,r;return"string"==typeof i?i:(n=i.token)&&(r=Ge[n.charAt(0)],r&&t.isSame(e,r))?A(t,n):!1}function Z(t){return t in Ne?Ne[t]:Ne[t]=B(t)}function B(t){for(var e,i=[],n=/\[([^\]]*)\]|\(([^\)]*)\)|(LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=n.exec(t);)e[1]?i.push(e[1]):e[2]?i.push({maybe:B(e[2])}):e[3]?i.push({token:e[3]}):e[5]&&i.push(e[5]);return i}function j(t){this.options=t||{}}function X(t){this.grid=t}function $(t){this.coordMaps=t}function q(t,e){this.coordMap=t,this.options=e||{}}function U(t,e){return t||e?t&&e?t.grid===e.grid&&t.row===e.row&&t.col===e.col:!1:!0}function K(e,i){this.options=i=i||{},this.sourceEl=e,this.parentEl=i.parentEl?t(i.parentEl):e.parent()}function Q(t){this.view=t}function J(t){Q.call(this,t),this.coordMap=new X(this)}function te(t,e){return t.eventStartMS-e.eventStartMS||e.eventDurationMS-t.eventDurationMS||e.event.allDay-t.event.allDay||(t.event.title||"").localeCompare(e.event.title)}function ee(t){J.call(this,t)}function ie(t,e){var i,n;for(i=0;e.length>i;i++)if(n=e[i],n.leftCol<=t.rightCol&&n.rightCol>=t.leftCol)return!0;return!1}function ne(t,e){return t.leftCol-e.leftCol}function re(t){J.call(this,t)}function oe(t){var e,i,n;if(t.sort(te),e=se(t),le(e),i=e[0]){for(n=0;i.length>n;n++)ae(i[n]);for(n=0;i.length>n;n++)ce(i[n],0,0)}}function se(t){var e,i,n,r=[];for(e=0;t.length>e;e++){for(i=t[e],n=0;r.length>n&&de(i,r[n]).length;n++);i.level=n,(r[n]||(r[n]=[])).push(i)}return r}function le(t){var e,i,n,r,o;for(e=0;t.length>e;e++)for(i=t[e],n=0;i.length>n;n++)for(r=i[n],r.forwardSegs=[],o=e+1;t.length>o;o++)de(r,t[o],r.forwardSegs)}function ae(t){var e,i,n=t.forwardSegs,r=0;if(void 0===t.forwardPressure){for(e=0;n.length>e;e++)i=n[e],ae(i),r=Math.max(r,1+i.forwardPressure);t.forwardPressure=r}}function ce(t,e,i){var n,r=t.forwardSegs;if(void 0===t.forwardCoord)for(r.length?(r.sort(ue),ce(r[0],e+1,i),t.forwardCoord=r[0].backwardCoord):t.forwardCoord=1,t.backwardCoord=t.forwardCoord-(t.forwardCoord-i)/(e+1),n=0;r.length>n;n++)ce(r[n],0,t.forwardCoord)}function de(t,e,i){i=i||[];for(var n=0;e.length>n;n++)he(t,e[n])&&i.push(e[n]);return i}function he(t,e){return t.bottom>e.top&&t.topd;d++){var h=d*n,u=h+n-1,f=Math.max(a,h),g=Math.min(c,u);if(g>=f){var m=E(f),v=E(g),b=[m.col,v.col].sort(),S=p(f)==s,T=p(g)+1==l;r.push({row:d,leftCol:b[0],rightCol:b[1],isStart:S,isEnd:T})}}return r}function D(t,e){var i,n,r=t.clone().stripTime();return e&&(i=e.clone().stripTime(),n=+e.time(),n&&n>=k&&i.add(1,"days")),(!e||r>=i)&&(i=r.clone().add(1,"days")),{start:r,end:i}}function T(t){var e=D(t.start,t.end);return e.end.diff(e.start,"days")>1}var C=this;C.calendar=i,C.opt=n,C.trigger=r,C.isEventDraggable=o,C.isEventResizable=l,C.eventDrop=a,C.eventResize=c;var H=i.reportEventChange,x=i.options,k=e.duration(x.nextDayThreshold);C.init(),C.getEventTimeText=function(t,e){var r,o;return"object"==typeof t&&"object"==typeof e?(r=t,o=e,e=arguments[2]):(r=t.start,o=t.end),e=e||n("timeFormat"),o&&n("displayEventEnd")?i.formatRange(r,o,e):i.formatDate(r,e)},C.isHiddenDay=d,C.skipHiddenDays=u,C.getCellsPerWeek=h,C.dateToCell=v,C.dateToDayOffset=y,C.dayOffsetToCellOffset=w,C.cellOffsetToCell=E,C.cellToDate=f,C.cellToCellOffset=g,C.cellOffsetToDayOffset=p,C.dayOffsetToDate=m,C.rangeToSegments=b,C.isMultiDayEvent=T;var R,P=n("hiddenDays")||[],z=[],L=[],G=[],N=n("isRTL");(function(){n("weekends")===!1&&P.push(0,6);for(var e=0,i=0;7>e;e++)L[e]=i,z[e]=-1!=t.inArray(e,P),z[e]||(G[i]=e,i++);if(R=i,!R)throw"invalid hiddenDays"})()}function ge(t){fe.call(this,t),this.dayGrid=new ee(this),this.coordMap=this.dayGrid.coordMap}function pe(t){ge.call(this,t)}function me(t){ge.call(this,t)}function ve(t){ge.call(this,t)}function ye(t,e){return e.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"a")}function we(t,e){return e.longDateFormat("LT").replace(/\s*a$/i,"")}function Ee(t){fe.call(this,t),this.timeGrid=new re(this),this.opt("allDaySlot")?(this.dayGrid=new ee(this),this.coordMap=new $([this.dayGrid.coordMap,this.timeGrid.coordMap])):this.coordMap=this.timeGrid.coordMap}function be(t){Ee.call(this,t)}function Se(t){Ee.call(this,t)}var De={lang:"en",defaultTimedEventDuration:"02:00:00",defaultAllDayEventDuration:{days:1},forceEventDuration:!1,nextDayThreshold:"09:00:00",defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberTitle:"W",weekNumberCalculation:"local",lazyFetching:!0,startParam:"start",endParam:"end",timezoneParam:"timezone",timezone:!1,titleFormat:{month:"MMMM YYYY",week:"ll",day:"LL"},columnFormat:{month:"ddd",week:n,day:"dddd"},timeFormat:{"default":i},displayEventEnd:{month:!1,basicWeek:!1,"default":!0},isRTL:!1,defaultButtonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",today:"today",month:"month",week:"week",day:"day"},buttonIcons:{prev:"left-single-arrow",next:"right-single-arrow",prevYear:"left-double-arrow",nextYear:"right-double-arrow"},theme:!1,themeButtonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e",prevYear:"seek-prev",nextYear:"seek-next"},dragOpacity:.75,dragRevertDuration:500,dragScroll:!0,unselectAuto:!0,dropAccept:"*",eventLimit:!1,eventLimitText:"more",eventLimitClick:"popover",dayPopoverFormat:"LL",handleWindowResize:!0,windowResizeDelay:200},Te={en:{columnFormat:{week:"ddd M/D"},dayPopoverFormat:"dddd, MMMM D"}},Ce={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"right-single-arrow",next:"left-single-arrow",prevYear:"right-double-arrow",nextYear:"left-double-arrow"},themeButtonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w",nextYear:"seek-prev",prevYear:"seek-next"}},He=t.fullCalendar={version:"2.1.1"},xe=He.views={};t.fn.fullCalendar=function(e){var i=Array.prototype.slice.call(arguments,1),n=this;return this.each(function(r,o){var s,a=t(o),c=a.data("fullCalendar");"string"==typeof e?c&&t.isFunction(c[e])&&(s=c[e].apply(c,i),r||(n=s),"destroy"===e&&a.removeData("fullCalendar")):c||(c=new l(a,e),a.data("fullCalendar",c),c.render())}),n},He.langs=Te,He.datepickerLang=function(e,i,n){var r=Te[e];r||(r=Te[e]={}),o(r,{isRTL:n.isRTL,weekNumberTitle:n.weekHeader,titleFormat:{month:n.showMonthAfterYear?"YYYY["+n.yearSuffix+"] MMMM":"MMMM YYYY["+n.yearSuffix+"]"},defaultButtonText:{prev:P(n.prevText),next:P(n.nextText),today:P(n.currentText)}}),t.datepicker&&(t.datepicker.regional[i]=t.datepicker.regional[e]=n,t.datepicker.regional.en=t.datepicker.regional[""],t.datepicker.setDefaults(n))},He.lang=function(t,e){var i;e&&(i=Te[t],i||(i=Te[t]={}),o(i,e||{})),De.lang=t},He.sourceNormalizers=[],He.sourceFetchers=[];var ke={dataType:"json",cache:!1},Me=1,Re=["sun","mon","tue","wed","thu","fri","sat"];He.applyAll=k;var Pe=/^\s*\d{4}-\d\d$/,ze=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/;He.moment=function(){return G(arguments)},He.moment.utc=function(){var t=G(arguments,!0);return t.hasTime()&&t.utc(),t},He.moment.parseZone=function(){return G(arguments,!0,!0)},N.prototype=H(e.fn),N.prototype.clone=function(){return G([this])},N.prototype.time=function(t){if(null==t)return e.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});delete this._ambigTime,e.isDuration(t)||e.isMoment(t)||(t=e.duration(t));var i=0;return e.isDuration(t)&&(i=24*Math.floor(t.asDays())),this.hours(i+t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())},N.prototype.stripTime=function(){var t=this.toArray();return e.fn.utc.call(this),this.year(t[0]).month(t[1]).date(t[2]).hours(0).minutes(0).seconds(0).milliseconds(0),this._ambigTime=!0,this._ambigZone=!0,this},N.prototype.hasTime=function(){return!this._ambigTime},N.prototype.stripZone=function(){var t=this.toArray(),i=this._ambigTime;return e.fn.utc.call(this),this.year(t[0]).month(t[1]).date(t[2]).hours(t[3]).minutes(t[4]).seconds(t[5]).milliseconds(t[6]),i&&(this._ambigTime=!0),this._ambigZone=!0,this},N.prototype.hasZone=function(){return!this._ambigZone},N.prototype.zone=function(t){return null!=t&&(delete this._ambigTime,delete this._ambigZone),e.fn.zone.apply(this,arguments)},N.prototype.local=function(){var t=this.toArray(),i=this._ambigZone;return delete this._ambigTime,delete this._ambigZone,e.fn.local.apply(this,arguments),i&&this.year(t[0]).month(t[1]).date(t[2]).hours(t[3]).minutes(t[4]).seconds(t[5]).milliseconds(t[6]),this},N.prototype.utc=function(){return delete this._ambigTime,delete this._ambigZone,e.fn.utc.apply(this,arguments)},N.prototype.format=function(){return arguments[0]?V(this,arguments[0]):this._ambigTime?A(this,"YYYY-MM-DD"):this._ambigZone?A(this,"YYYY-MM-DD[T]HH:mm:ss"):A(this)},N.prototype.toISOString=function(){return this._ambigTime?A(this,"YYYY-MM-DD"):this._ambigZone?A(this,"YYYY-MM-DD[T]HH:mm:ss"):e.fn.toISOString.apply(this,arguments)},N.prototype.isWithin=function(t,e){var i=Y([this,t,e]);return i[0]>=i[1]&&i[0]').addClass(i.className||"").css({top:0,left:0}).append(i.content).appendTo(i.parentEl),this.el.on("click",".fc-close",function(){e.hide()}),i.autoHide&&t(document).on("mousedown",this.documentMousedownProxy=t.proxy(this,"documentMousedown"))},documentMousedown:function(e){this.el&&!t(e.target).closest(this.el).length&&this.hide()},destroy:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),t(document).off("mousedown",this.documentMousedownProxy)},position:function(){var e,i,n,r,o,s=this.options,l=this.el.offsetParent().offset(),a=this.el.outerWidth(),c=this.el.outerHeight(),d=t(window),h=y(this.el);r=s.top||0,o=void 0!==s.left?s.left:void 0!==s.right?s.right-a:0,h.is(window)||h.is(document)?(h=d,e=0,i=0):(n=h.offset(),e=n.top,i=n.left),e+=d.scrollTop(),i+=d.scrollLeft(),s.viewportConstrain!==!1&&(r=Math.min(r,e+h.outerHeight()-c-this.margin),r=Math.max(r,e+this.margin),o=Math.min(o,i+h.outerWidth()-a-this.margin),o=Math.max(o,i+this.margin)),this.el.css({top:r-l.top,left:o-l.left})},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))}},X.prototype={grid:null,rows:null,cols:null,containerEl:null,minX:null,maxX:null,minY:null,maxY:null,build:function(){this.grid.buildCoords(this.rows=[],this.cols=[]),this.computeBounds()},getCell:function(t,e){var i,n=null,r=this.rows,o=this.cols,s=-1,l=-1;if(this.inBounds(t,e)){for(i=0;r.length>i;i++)if(e>=r[i][0]&&r[i][1]>e){s=i;break}for(i=0;o.length>i;i++)if(t>=o[i][0]&&o[i][1]>t){l=i;break}s>=0&&l>=0&&(n={row:s,col:l},n.grid=this.grid,n.date=this.grid.getCellDate(n))}return n},computeBounds:function(){var t;this.containerEl&&(t=this.containerEl.offset(),this.minX=t.left,this.maxX=t.left+this.containerEl.outerWidth(),this.minY=t.top,this.maxY=t.top+this.containerEl.outerHeight())},inBounds:function(t,e){return this.containerEl?t>=this.minX&&this.maxX>t&&e>=this.minY&&this.maxY>e:!0}},$.prototype={coordMaps:null,build:function(){var t,e=this.coordMaps;for(t=0;e.length>t;t++)e[t].build()},getCell:function(t,e){var i,n=this.coordMaps,r=null;for(i=0;n.length>i&&!r;i++)r=n[i].getCell(t,e);return r}},q.prototype={coordMap:null,options:null,isListening:!1,isDragging:!1,origCell:null,origDate:null,cell:null,date:null,mouseX0:null,mouseY0:null,mousemoveProxy:null,mouseupProxy:null,scrollEl:null,scrollBounds:null,scrollTopVel:null,scrollLeftVel:null,scrollIntervalId:null,scrollHandlerProxy:null,scrollSensitivity:30,scrollSpeed:200,scrollIntervalMs:50,mousedown:function(t){E(t)&&(t.preventDefault(),this.startListening(t),this.options.distance||this.startDrag(t))},startListening:function(e){var i,n;this.isListening||(e&&this.options.scroll&&(i=y(t(e.target)),i.is(window)||i.is(document)||(this.scrollEl=i,this.scrollHandlerProxy=L(t.proxy(this,"scrollHandler"),100),this.scrollEl.on("scroll",this.scrollHandlerProxy))),this.computeCoords(),e&&(n=this.getCell(e),this.origCell=n,this.origDate=n?n.date:null,this.mouseX0=e.pageX,this.mouseY0=e.pageY),t(document).on("mousemove",this.mousemoveProxy=t.proxy(this,"mousemove")).on("mouseup",this.mouseupProxy=t.proxy(this,"mouseup")).on("selectstart",this.preventDefault),this.isListening=!0,this.trigger("listenStart",e))},computeCoords:function(){this.coordMap.build(),this.computeScrollBounds()},mousemove:function(t){var e,i;this.isDragging||(e=this.options.distance||1,i=Math.pow(t.pageX-this.mouseX0,2)+Math.pow(t.pageY-this.mouseY0,2),i>=e*e&&this.startDrag(t)),this.isDragging&&this.drag(t)},startDrag:function(t){var e;this.isListening||this.startListening(),this.isDragging||(this.isDragging=!0,this.trigger("dragStart",t),e=this.getCell(t),e&&this.cellOver(e,!0)) -},drag:function(t){var e;this.isDragging&&(e=this.getCell(t),U(e,this.cell)||(this.cell&&this.cellOut(),e&&this.cellOver(e)),this.dragScroll(t))},cellOver:function(t){this.cell=t,this.date=t.date,this.trigger("cellOver",t,t.date)},cellOut:function(){this.cell&&(this.trigger("cellOut",this.cell),this.cell=null,this.date=null)},mouseup:function(t){this.stopDrag(t),this.stopListening(t)},stopDrag:function(t){this.isDragging&&(this.stopScrolling(),this.trigger("dragStop",t),this.isDragging=!1)},stopListening:function(e){this.isListening&&(this.scrollEl&&(this.scrollEl.off("scroll",this.scrollHandlerProxy),this.scrollHandlerProxy=null),t(document).off("mousemove",this.mousemoveProxy).off("mouseup",this.mouseupProxy).off("selectstart",this.preventDefault),this.mousemoveProxy=null,this.mouseupProxy=null,this.isListening=!1,this.trigger("listenStop",e),this.origCell=this.cell=null,this.origDate=this.date=null)},getCell:function(t){return this.coordMap.getCell(t.pageX,t.pageY)},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))},preventDefault:function(t){t.preventDefault()},computeScrollBounds:function(){var t,e=this.scrollEl;e&&(t=e.offset(),this.scrollBounds={top:t.top,left:t.left,bottom:t.top+e.outerHeight(),right:t.left+e.outerWidth()})},dragScroll:function(t){var e,i,n,r,o=this.scrollSensitivity,s=this.scrollBounds,l=0,a=0;s&&(e=(o-(t.pageY-s.top))/o,i=(o-(s.bottom-t.pageY))/o,n=(o-(t.pageX-s.left))/o,r=(o-(s.right-t.pageX))/o,e>=0&&1>=e?l=-1*e*this.scrollSpeed:i>=0&&1>=i&&(l=i*this.scrollSpeed),n>=0&&1>=n?a=-1*n*this.scrollSpeed:r>=0&&1>=r&&(a=r*this.scrollSpeed)),this.setScrollVel(l,a)},setScrollVel:function(e,i){this.scrollTopVel=e,this.scrollLeftVel=i,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(t.proxy(this,"scrollIntervalFunc"),this.scrollIntervalMs))},constrainScrollVel:function(){var t=this.scrollEl;0>this.scrollTopVel?0>=t.scrollTop()&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),0>this.scrollLeftVel?0>=t.scrollLeft()&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},scrollIntervalFunc:function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.stopScrolling()},stopScrolling:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.computeCoords())},scrollHandler:function(){this.scrollIntervalId||this.computeCoords()}},K.prototype={options:null,sourceEl:null,el:null,parentEl:null,top0:null,left0:null,mouseY0:null,mouseX0:null,topDelta:null,leftDelta:null,mousemoveProxy:null,isFollowing:!1,isHidden:!1,isAnimating:!1,start:function(e){this.isFollowing||(this.isFollowing=!0,this.mouseY0=e.pageY,this.mouseX0=e.pageX,this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),t(document).on("mousemove",this.mousemoveProxy=t.proxy(this,"mousemove")))},stop:function(e,i){function n(){this.isAnimating=!1,r.destroyEl(),this.top0=this.left0=null,i&&i()}var r=this,o=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,t(document).off("mousemove",this.mousemoveProxy),e&&o&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:o,complete:n})):n())},getEl:function(){var t=this.el;return t||(this.sourceEl.width(),t=this.el=this.sourceEl.clone().css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}).appendTo(this.parentEl)),t},destroyEl:function(){this.el&&(this.el.remove(),this.el=null)},updatePosition:function(){var t,e;this.getEl(),null===this.top0&&(this.sourceEl.width(),t=this.sourceEl.offset(),e=this.el.offsetParent().offset(),this.top0=t.top-e.top,this.left0=t.left-e.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},mousemove:function(t){this.topDelta=t.pageY-this.mouseY0,this.leftDelta=t.pageX-this.mouseX0,this.isHidden||this.updatePosition()},hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}},Q.prototype={view:null,cellHtml:"",rowHtml:function(t,e){var i,n,r=this.view,o=this.getHtmlRenderer("cell",t),s="";for(e=e||0,i=0;r.colCnt>i;i++)n=r.cellToDate(e,i),s+=o(e,i,n);return s=this.bookendCells(s,t,e),""+s+""},bookendCells:function(t,e,i){var n=this.view,r=this.getHtmlRenderer("intro",e)(i||0),o=this.getHtmlRenderer("outro",e)(i||0),s=n.opt("isRTL"),l=s?o:r,a=s?r:o;return"string"==typeof t?l+t+a:t.prepend(l).append(a)},getHtmlRenderer:function(t,e){var i,n,r,o,s=this.view;return i=t+"Html",e&&(n=e+z(t)+"Html"),n&&(o=s[n])?r=s:n&&(o=this[n])?r=this:(o=s[i])?r=s:(o=this[i])&&(r=this),"function"==typeof o?function(){return o.apply(r,arguments)||""}:function(){return o||""}}},J.prototype=H(Q.prototype),t.extend(J.prototype,{el:null,coordMap:null,cellDuration:null,render:function(){this.bindHandlers()},destroy:function(){},buildCoords:function(){},getCellDate:function(){},getCellDayEl:function(){},rangeToSegs:function(){},bindHandlers:function(){var e=this;this.el.on("mousedown",function(i){t(i.target).is(".fc-event-container *, .fc-more")||t(i.target).closest(".fc-popover").length||e.dayMousedown(i)}),this.bindSegHandlers()},dayMousedown:function(t){var e,i,n,r=this,o=this.view,s=o.opt("selectable"),l=null,a=new q(this.coordMap,{scroll:o.opt("dragScroll"),dragStart:function(){o.unselect()},cellOver:function(t,o){a.origDate&&(n=r.getCellDayEl(t),l=[o,a.origDate].sort(C),e=l[0],i=l[1].clone().add(r.cellDuration),s&&r.renderSelection(e,i))},cellOut:function(){l=null,r.destroySelection()},listenStop:function(t){l&&(l[0].isSame(l[1])&&o.trigger("dayClick",n[0],e,t),s&&o.reportSelection(e,i,t))}});a.mousedown(t)},renderDrag:function(){},destroyDrag:function(){},renderResize:function(){},destroyResize:function(){},renderRangeHelper:function(t,e,i){var n,r=this.view;!e&&r.opt("forceEventDuration")&&(e=r.calendar.getDefaultEventEnd(!t.hasTime(),t)),n=i?H(i.event):{},n.start=t,n.end=e,n.allDay=!(t.hasTime()||e&&e.hasTime()),n.className=(n.className||[]).concat("fc-helper"),i||(n.editable=!1),this.renderHelper(n,i)},renderHelper:function(){},destroyHelper:function(){},renderSelection:function(t,e){this.renderHighlight(t,e)},destroySelection:function(){this.destroyHighlight()},renderHighlight:function(){},destroyHighlight:function(){},headHtml:function(){return'
'+""+""+this.rowHtml("head")+""+"
"+"
"},headCellHtml:function(t,e,i){var n=this.view,r=n.calendar,o=n.opt("columnFormat");return''+R(r.formatDate(i,o))+""},bgCellHtml:function(t,e,i){var n=this.view,r=this.getDayClasses(i);return r.unshift("fc-day",n.widgetContentClass),''},getDayClasses:function(t){var e=this.view,i=e.calendar.getNow().stripTime(),n=["fc-"+Re[t.day()]];return"month"===e.name&&t.month()!=e.intervalStart.month()&&n.push("fc-other-month"),t.isSame(i,"day")?n.push("fc-today",e.highlightStateClass):i>t?n.push("fc-past"):n.push("fc-future"),n}}),t.extend(J.prototype,{mousedOverSeg:null,isDraggingSeg:!1,isResizingSeg:!1,renderEvents:function(){},getSegs:function(){},destroyEvents:function(){this.triggerSegMouseout()},renderSegs:function(e,i){var n,r=this.view,o="",s=[];for(n=0;e.length>n;n++)o+=this.renderSegHtml(e[n],i);return t(o).each(function(i,n){var o=e[i],l=r.resolveEventEl(o.event,t(n));l&&(l.data("fc-seg",o),o.el=l,s.push(o))}),s},renderSegHtml:function(){},eventsToSegs:function(e,i,n){var r=this;return t.map(e,function(t){return r.eventToSegs(t,i,n)})},eventToSegs:function(t,e,i){var n,r,o,s=t.start.clone().stripZone(),l=this.view.calendar.getEventEnd(t).stripZone();for(e&&i?(o=b(s,l,e,i),n=o?[o]:[]):n=this.rangeToSegs(s,l),r=0;n.length>r;r++)o=n[r],o.event=t,o.eventStartMS=+s,o.eventDurationMS=l-s;return n},bindSegHandlers:function(){var e=this,i=this.view;t.each({mouseenter:function(t,i){e.triggerSegMouseover(t,i)},mouseleave:function(t,i){e.triggerSegMouseout(t,i)},click:function(t,e){return i.trigger("eventClick",this,t.event,e)},mousedown:function(n,r){t(r.target).is(".fc-resizer")&&i.isEventResizable(n.event)?e.segResizeMousedown(n,r):i.isEventDraggable(n.event)&&e.segDragMousedown(n,r)}},function(i,n){e.el.on(i,".fc-event-container > *",function(i){var r=t(this).data("fc-seg");return!r||e.isDraggingSeg||e.isResizingSeg?void 0:n.call(this,r,i)})})},triggerSegMouseover:function(t,e){this.mousedOverSeg||(this.mousedOverSeg=t,this.view.trigger("eventMouseover",t.el[0],t.event,e))},triggerSegMouseout:function(t,e){e=e||{},this.mousedOverSeg&&(t=t||this.mousedOverSeg,this.mousedOverSeg=null,this.view.trigger("eventMouseout",t.el[0],t.event,e))},segDragMousedown:function(t,e){var i,n,r=this,o=this.view,s=t.el,l=t.event,a=new K(t.el,{parentEl:o.el,opacity:o.opt("dragOpacity"),revertDuration:o.opt("dragRevertDuration"),zIndex:2}),c=new q(o.coordMap,{distance:5,scroll:o.opt("dragScroll"),listenStart:function(t){a.hide(),a.start(t)},dragStart:function(e){r.triggerSegMouseout(t,e),r.isDraggingSeg=!0,o.hideEvent(l),o.trigger("eventDragStart",s[0],l,e,{})},cellOver:function(e,s){var l=t.cellDate||c.origDate,d=r.computeDraggedEventDates(t,l,s);i=d.start,n=d.end,o.renderDrag(i,n,t)?a.hide():a.show()},cellOut:function(){i=null,o.destroyDrag(),a.show()},dragStop:function(t){var e=i&&!i.isSame(l.start);a.stop(!e,function(){r.isDraggingSeg=!1,o.destroyDrag(),o.showEvent(l),o.trigger("eventDragStop",s[0],l,t,{}),e&&o.eventDrop(s[0],l,i,t)})},listenStop:function(){a.stop()}});c.mousedown(e)},computeDraggedEventDates:function(t,e,i){var n,r,o,s=this.view,l=t.event,a=l.start,c=s.calendar.getEventEnd(l);return i.hasTime()===e.hasTime()?(n=D(i,e),r=a.clone().add(n),o=null===l.end?null:c.clone().add(n)):(r=i,o=null),{start:r,end:o}},segResizeMousedown:function(t,e){function i(){r.destroyResize(),o.showEvent(l)}var n,r=this,o=this.view,s=t.el,l=t.event,a=l.start,c=o.calendar.getEventEnd(l),d=null;n=new q(this.coordMap,{distance:5,scroll:o.opt("dragScroll"),dragStart:function(e){r.triggerSegMouseout(t,e),r.isResizingSeg=!0,o.trigger("eventResizeStart",s[0],l,e,{})},cellOver:function(e,n){n.isBefore(a)&&(n=a),d=n.clone().add(r.cellDuration),d.isSame(c)?(d=null,i()):(r.renderResize(a,d,t),o.hideEvent(l))},cellOut:function(){d=null,i()},dragStop:function(t){r.isResizingSeg=!1,i(),o.trigger("eventResizeStop",s[0],l,t,{}),d&&o.eventResize(s[0],l,d,t)}}),n.mousedown(e)},getSegClasses:function(t,e,i){var n=t.event,r=["fc-event",t.isStart?"fc-start":"fc-not-start",t.isEnd?"fc-end":"fc-not-end"].concat(n.className,n.source?n.source.className:[]);return e&&r.push("fc-draggable"),i&&r.push("fc-resizable"),r},getEventSkinCss:function(t){var e=this.view,i=t.source||{},n=t.color,r=i.color,o=e.opt("eventColor"),s=t.backgroundColor||n||i.backgroundColor||r||e.opt("eventBackgroundColor")||o,l=t.borderColor||n||i.borderColor||r||e.opt("eventBorderColor")||o,a=t.textColor||i.textColor||e.opt("eventTextColor"),c=[];return s&&c.push("background-color:"+s),l&&c.push("border-color:"+l),a&&c.push("color:"+a),c.join(";")}}),ee.prototype=H(J.prototype),t.extend(ee.prototype,{numbersVisible:!1,cellDuration:e.duration({days:1}),bottomCoordPadding:0,rowEls:null,dayEls:null,helperEls:null,highlightEls:null,render:function(e){var i,n=this.view,r="";for(i=0;n.rowCnt>i;i++)r+=this.dayRowHtml(i,e);this.el.html(r),this.rowEls=this.el.find(".fc-row"),this.dayEls=this.el.find(".fc-day"),this.dayEls.each(function(e,i){var r=n.cellToDate(Math.floor(e/n.colCnt),e%n.colCnt);n.trigger("dayRender",null,r,t(i))}),J.prototype.render.call(this)},destroy:function(){this.destroySegPopover()},dayRowHtml:function(t,e){var i=this.view,n=["fc-row","fc-week",i.widgetContentClass];return e&&n.push("fc-rigid"),'
'+'
'+""+this.rowHtml("day",t)+"
"+"
"+'
'+""+(this.numbersVisible?""+this.rowHtml("number",t)+"":"")+"
"+"
"+"
"},dayCellHtml:function(t,e,i){return this.bgCellHtml(t,e,i)},buildCoords:function(e,i){var n,r,o,s=this.view.colCnt;this.dayEls.slice(0,s).each(function(e,s){n=t(s),r=n.offset().left,e&&(o[1]=r),o=[r],i[e]=o}),o[1]=r+n.outerWidth(),this.rowEls.each(function(i,s){n=t(s),r=n.offset().top,i&&(o[1]=r),o=[r],e[i]=o}),o[1]=r+n.outerHeight()+this.bottomCoordPadding},getCellDate:function(t){return this.view.cellToDate(t)},getCellDayEl:function(t){return this.dayEls.eq(t.row*this.view.colCnt+t.col)},rangeToSegs:function(t,e){return this.view.rangeToSegments(t,e)},renderDrag:function(t,e,i){var n;return this.renderHighlight(t,e||this.view.calendar.getDefaultEventEnd(!0,t)),i&&!i.el.closest(this.el).length?(this.renderRangeHelper(t,e,i),n=this.view.opt("dragOpacity"),void 0!==n&&this.helperEls.css("opacity",n),!0):void 0},destroyDrag:function(){this.destroyHighlight(),this.destroyHelper()},renderResize:function(t,e,i){this.renderHighlight(t,e),this.renderRangeHelper(t,e,i)},destroyResize:function(){this.destroyHighlight(),this.destroyHelper()},renderHelper:function(e,i){var n=[],r=this.renderEventRows([e]);this.rowEls.each(function(e,o){var s,l=t(o),a=t('
');s=i&&i.row===e?i.el.position().top:l.find(".fc-content-skeleton tbody").position().top,a.css("top",s).find("table").append(r[e].tbodyEl),l.append(a),n.push(a[0])}),this.helperEls=t(n)},destroyHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},renderHighlight:function(e,i){var n,r,o,s=this.rangeToSegs(e,i),l=[];for(n=0;s.length>n;n++)r=s[n],o=t(this.highlightSkeletonHtml(r.leftCol,r.rightCol+1)),o.appendTo(this.rowEls[r.row]),l.push(o[0]);this.highlightEls=t(l)},destroyHighlight:function(){this.highlightEls&&(this.highlightEls.remove(),this.highlightEls=null)},highlightSkeletonHtml:function(t,e){var i=this.view.colCnt,n="";return t>0&&(n+='"),m=[],v=[],y=[];for(r=0;g>r;r++){if(o=f[r],s=0,l=t(""),m.push([]),v.push([]),y.push([]),o)for(a=0;o.length>a;a++){for(c=o[a],n(c.leftCol),d=t('",l+=""+(s?"":n)+'",c.add(this.slotDuration);return l},processOptions:function(){var t=this.view,i=t.opt("slotDuration"),n=t.opt("snapDuration");i=e.duration(i),n=n?e.duration(n):i,this.slotDuration=i,this.snapDuration=n,this.cellDuration=n,this.minTime=e.duration(t.opt("minTime")),this.maxTime=e.duration(t.opt("maxTime"))},rangeToSegs:function(t,e){var i,n,r,o,s,l=this.view,a=[];for(t=t.clone().stripZone(),e=e.clone().stripZone(),n=0;l.colCnt>n;n++)r=l.cellToDate(0,n),o=r.clone().time(this.minTime),s=r.clone().time(this.maxTime),i=b(t,e,o,s),i&&(i.col=n,a.push(i));return a},resize:function(){this.computeSlatTops(),this.updateSegVerticals()},buildCoords:function(i,n){var r,o,s=this.view.colCnt,l=this.el.offset().top,a=e.duration(+this.minTime),c=null;for(this.dayEls.slice(0,s).each(function(e,i){r=t(i),o=r.offset().left,c&&(c[1]=o),c=[o],n[e]=c}),c[1]=o+r.outerWidth(),c=null;this.maxTime>a;)o=l+this.computeTimeTop(a),c&&(c[1]=o),c=[o],i.push(c),a.add(this.snapDuration);c[1]=l+this.computeTimeTop(a)},getCellDate:function(t){var e=this.view,i=e.calendar;return i.rezoneDate(e.cellToDate(0,t.col).time(this.minTime+this.snapDuration*t.row))},getCellDayEl:function(t){return this.dayEls.eq(t.col)},computeDateTop:function(t,i){return this.computeTimeTop(e.duration(t.clone().stripZone()-i.clone().stripTime()))},computeTimeTop:function(t){var e,i,n,r,o=(t-this.minTime)/this.slotDuration;return o=Math.max(0,o),o=Math.min(this.slatEls.length,o),e=Math.floor(o),i=o-e,n=this.slatTops[e],i?(r=this.slatTops[e+1],n+(r-n)*i):n},computeSlatTops:function(){var e,i=[];this.slatEls.each(function(n,r){e=t(r).position().top,i.push(e)}),i.push(e+this.slatEls.last().outerHeight()),this.slatTops=i},renderDrag:function(t,e,i){var n;return i?(this.renderRangeHelper(t,e,i),n=this.view.opt("dragOpacity"),void 0!==n&&this.helperEl.css("opacity",n),!0):(this.renderHighlight(t,e||this.view.calendar.getDefaultEventEnd(!1,t)),void 0)},destroyDrag:function(){this.destroyHelper(),this.destroyHighlight()},renderResize:function(t,e,i){this.renderRangeHelper(t,e,i)},destroyResize:function(){this.destroyHelper()},renderHelper:function(e,i){var n,r,o,s=this.renderEventTable([e]),l=s.tableEl,a=s.segs;for(n=0;a.length>n;n++)r=a[n],i&&i.col===r.col&&(o=i.el,r.el.css({left:o.css("left"),right:o.css("right"),"margin-left":o.css("margin-left"),"margin-right":o.css("margin-right")}));this.helperEl=t('
').append(l).appendTo(this.el)},destroyHelper:function(){this.helperEl&&(this.helperEl.remove(),this.helperEl=null)},renderSelection:function(t,e){this.view.opt("selectHelper")?this.renderRangeHelper(t,e):this.renderHighlight(t,e)},destroySelection:function(){this.destroyHelper(),this.destroyHighlight()},renderHighlight:function(e,i){this.highlightEl=t(this.highlightSkeletonHtml(e,i)).appendTo(this.el)},destroyHighlight:function(){this.highlightEl&&(this.highlightEl.remove(),this.highlightEl=null)},highlightSkeletonHtml:function(t,e){var i,n,r,o,s,l=this.view,a=this.rangeToSegs(t,e),c="",d=0;for(i=0;a.length>i;i++)n=a[i],n.col>d&&(c+='
",d++;return l.colCnt>d&&(c+='"+s+""},bookendCells:function(t,e,i){var n=this.view,r=this.getHtmlRenderer("intro",e)(i||0),o=this.getHtmlRenderer("outro",e)(i||0),s=n.opt("isRTL"),l=s?o:r,a=s?r:o;return"string"==typeof t?l+t+a:t.prepend(l).append(a)},getHtmlRenderer:function(t,e){var i,n,r,o,s=this.view;return i=t+"Html",e&&(n=e+z(t)+"Html"),n&&(o=s[n])?r=s:n&&(o=this[n])?r=this:(o=s[i])?r=s:(o=this[i])&&(r=this),"function"==typeof o?function(){return o.apply(r,arguments)||""}:function(){return o||""}}},J.prototype=H(Q.prototype),t.extend(J.prototype,{el:null,coordMap:null,cellDuration:null,render:function(){this.bindHandlers()},destroy:function(){},buildCoords:function(){},getCellDate:function(){},getCellDayEl:function(){},rangeToSegs:function(){},bindHandlers:function(){var e=this;this.el.on("mousedown",function(i){t(i.target).is(".fc-event-container *, .fc-more")||t(i.target).closest(".fc-popover").length||e.dayMousedown(i)}),this.bindSegHandlers()},dayMousedown:function(t){var e,i,n,r=this,o=this.view,s=o.opt("selectable"),l=null,a=new q(this.coordMap,{scroll:o.opt("dragScroll"),dragStart:function(){o.unselect()},cellOver:function(t,o){a.origDate&&(n=r.getCellDayEl(t),l=[o,a.origDate].sort(C),e=l[0],i=l[1].clone().add(r.cellDuration),s&&r.renderSelection(e,i))},cellOut:function(){l=null,r.destroySelection()},listenStop:function(t){l&&(l[0].isSame(l[1])&&o.trigger("dayClick",n[0],e,t),s&&o.reportSelection(e,i,t))}});a.mousedown(t)},renderDrag:function(){},destroyDrag:function(){},renderResize:function(){},destroyResize:function(){},renderRangeHelper:function(t,e,i){var n,r=this.view;!e&&r.opt("forceEventDuration")&&(e=r.calendar.getDefaultEventEnd(!t.hasTime(),t)),n=i?H(i.event):{},n.start=t,n.end=e,n.allDay=!(t.hasTime()||e&&e.hasTime()),n.className=(n.className||[]).concat("fc-helper"),i||(n.editable=!1),this.renderHelper(n,i)},renderHelper:function(){},destroyHelper:function(){},renderSelection:function(t,e){this.renderHighlight(t,e)},destroySelection:function(){this.destroyHighlight()},renderHighlight:function(){},destroyHighlight:function(){},headHtml:function(){return'
'+"
'),e>t&&(n+=''),i>e&&(n+=''),n=this.bookendCells(n,"highlight"),'
'+n+""+"
"+"
"}}),t.extend(ee.prototype,{segs:null,rowStructs:null,renderEvents:function(e){var i=this.rowStructs=this.renderEventRows(e),n=[];this.rowEls.each(function(e,r){t(r).find(".fc-content-skeleton > table").append(i[e].tbodyEl),n.push.apply(n,i[e].segs)}),this.segs=n},getSegs:function(){return(this.segs||[]).concat(this.popoverSegs||[])},destroyEvents:function(){var t,e;for(J.prototype.destroyEvents.call(this),t=this.rowStructs||[];e=t.pop();)e.tbodyEl.remove();this.segs=null,this.destroySegPopover()},renderEventRows:function(t){var e,i,n=this.eventsToSegs(t),r=[];for(n=this.renderSegs(n),e=this.groupSegRows(n),i=0;e.length>i;i++)r.push(this.renderEventRow(i,e[i]));return r},renderSegHtml:function(t,e){var i,n=this.view,r=n.opt("isRTL"),o=t.event,s=n.isEventDraggable(o),l=!e&&o.allDay&&t.isEnd&&n.isEventResizable(o),a=this.getSegClasses(t,s,l),c=this.getEventSkinCss(o),d="";return a.unshift("fc-day-grid-event"),!o.allDay&&t.isStart&&(d=''+R(n.getEventTimeText(o))+""),i=''+(R(o.title||"")||" ")+"",'"+'
'+(r?i+" "+d:d+" "+i)+"
"+(l?'
':"")+""},renderEventRow:function(e,i){function n(e){for(;e>s;)d=(y[r-1]||[])[s],d?d.attr("rowspan",parseInt(d.attr("rowspan")||1,10)+1):(d=t("
"),l.append(d)),v[r][s]=d,y[r][s]=d,s++}var r,o,s,l,a,c,d,h=this.view,u=h.colCnt,f=this.buildSegLevels(i),g=Math.max(1,f.length),p=t("
').append(c.el),c.leftCol!=c.rightCol?d.attr("colspan",c.rightCol-c.leftCol+1):y[r][s]=d;c.rightCol>=s;)v[r][s]=d,m[r][s]=c,s++;l.append(d)}n(u),this.bookendCells(l,"eventSkeleton"),p.append(l)}return{row:e,tbodyEl:p,cellMatrix:v,segMatrix:m,segLevels:f,segs:i}},buildSegLevels:function(t){var e,i,n,r=[];for(t.sort(te),e=0;t.length>e;e++){for(i=t[e],n=0;r.length>n&&ie(i,r[n]);n++);i.level=n,(r[n]||(r[n]=[])).push(i)}for(n=0;r.length>n;n++)r[n].sort(ne);return r},groupSegRows:function(t){var e,i=this.view,n=[];for(e=0;i.rowCnt>e;e++)n.push([]);for(e=0;t.length>e;e++)n[t[e].row].push(t[e]);return n}}),t.extend(ee.prototype,{segPopover:null,popoverSegs:null,destroySegPopover:function(){this.segPopover&&this.segPopover.hide()},limitRows:function(t){var e,i,n=this.rowStructs||[];for(e=0;n.length>e;e++)this.unlimitRow(e),i=t?"number"==typeof t?t:this.computeRowLevelLimit(e):!1,i!==!1&&this.limitRow(e,i)},computeRowLevelLimit:function(t){var e,i,n=this.rowEls.eq(t),r=n.height(),o=this.rowStructs[t].tbodyEl.children();for(e=0;o.length>e;e++)if(i=o.eq(e).removeClass("fc-limited"),i.position().top+i.outerHeight()>r)return e;return!1},limitRow:function(e,i){function n(n){for(;n>T;)r={row:e,col:T},d=E.getCellSegs(r,i),d.length&&(f=s[i-1][T],w=E.renderMoreLink(r,d),y=t("
").append(w),f.append(y),D.push(y[0])),T++}var r,o,s,l,a,c,d,h,u,f,g,p,m,v,y,w,E=this,b=this.view,S=this.rowStructs[e],D=[],T=0;if(i&&S.segLevels.length>i){for(o=S.segLevels[i-1],s=S.cellMatrix,l=S.tbodyEl.children().slice(i).addClass("fc-limited").get(),a=0;o.length>a;a++){for(c=o[a],n(c.leftCol),u=[],h=0;c.rightCol>=T;)r={row:e,col:T},d=this.getCellSegs(r,i),u.push(d),h+=d.length,T++;if(h){for(f=s[i-1][c.leftCol],g=f.attr("rowspan")||1,p=[],m=0;u.length>m;m++)v=t('
').attr("rowspan",g),d=u[m],r={row:e,col:c.leftCol+m},w=this.renderMoreLink(r,[c].concat(d)),y=t("
").append(w),v.append(y),p.push(v[0]),D.push(v[0]);f.addClass("fc-limited").after(t(p)),l.push(f[0])}}n(b.colCnt),S.moreEls=t(D),S.limitedEls=t(l)}},unlimitRow:function(t){var e=this.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},renderMoreLink:function(e,i){var n=this,r=this.view;return t('').text(this.getMoreLinkText(i.length)).on("click",function(o){var s=r.opt("eventLimitClick"),l=r.cellToDate(e),a=t(this),c=n.getCellDayEl(e),d=n.getCellSegs(e),h=n.resliceDaySegs(d,l),u=n.resliceDaySegs(i,l);"function"==typeof s&&(s=r.trigger("eventLimitClick",null,{date:l,dayEl:c,moreEl:a,segs:h,hiddenSegs:u},o)),"popover"===s?n.showSegPopover(l,e,a,h):"string"==typeof s&&r.calendar.zoomTo(l,s)})},showSegPopover:function(t,e,i,n){var r,o,s=this,l=this.view,a=i.parent();r=1==l.rowCnt?this.view.el:this.rowEls.eq(e.row),o={className:"fc-more-popover",content:this.renderSegPopoverContent(t,n),parentEl:this.el,top:r.offset().top,autoHide:!0,viewportConstrain:l.opt("popoverViewportConstrain"),hide:function(){s.segPopover.destroy(),s.segPopover=null,s.popoverSegs=null}},l.opt("isRTL")?o.right=a.offset().left+a.outerWidth()+1:o.left=a.offset().left-1,this.segPopover=new j(o),this.segPopover.show()},renderSegPopoverContent:function(e,i){var n,r=this.view,o=r.opt("theme"),s=e.format(r.opt("dayPopoverFormat")),l=t('
'+''+''+R(s)+""+'
'+"
"+'
'+'
'+"
"),a=l.find(".fc-event-container");for(i=this.renderSegs(i,!0),this.popoverSegs=i,n=0;i.length>n;n++)i[n].cellDate=e,a.append(i[n].el);return l},resliceDaySegs:function(e,i){var n=t.map(e,function(t){return t.event}),r=i.clone().stripTime(),o=r.clone().add(1,"days");return this.eventsToSegs(n,r,o)},getMoreLinkText:function(t){var e=this.view,i=e.opt("eventLimitText");return"function"==typeof i?i(t):"+"+t+" "+i},getCellSegs:function(t,e){for(var i,n=this.rowStructs[t.row].segMatrix,r=e||0,o=[];n.length>r;)i=n[r][t.col],i&&o.push(i),r++;return o}}),re.prototype=H(J.prototype),t.extend(re.prototype,{slotDuration:null,snapDuration:null,minTime:null,maxTime:null,dayEls:null,slatEls:null,slatTops:null,highlightEl:null,helperEl:null,render:function(){this.processOptions(),this.el.html(this.renderHtml()),this.dayEls=this.el.find(".fc-day"),this.slatEls=this.el.find(".fc-slats tr"),this.computeSlatTops(),J.prototype.render.call(this)},renderHtml:function(){return'
'+this.rowHtml("slotBg")+"
"+"
"+'
'+""+this.slatRowHtml()+"
"+"
"},slotBgCellHtml:function(t,e,i){return this.bgCellHtml(t,e,i)},slatRowHtml:function(){for(var t,i,n,r=this.view,o=r.calendar,s=r.opt("isRTL"),l="",a=0===this.slotDuration.asMinutes()%15,c=e.duration(+this.minTime);this.maxTime>c;)t=r.start.clone().time(c),i=t.minutes(),n='
"+(a&&i?"":""+R(o.formatDate(t,r.opt("axisFormat")))+"")+"
'+(s?n:"")+"
',d=n.col),r=l.cellToDate(0,d),o=this.computeDateTop(n.start,r),s=this.computeDateTop(n.end,r),c+='
'+"
"+"
'),c=this.bookendCells(c,"highlight"),'
'+c+""+"
"+"
"}}),t.extend(re.prototype,{segs:null,eventSkeletonEl:null,renderEvents:function(e){var i=this.renderEventTable(e);this.eventSkeletonEl=t('
').append(i.tableEl),this.el.append(this.eventSkeletonEl),this.segs=i.segs},getSegs:function(){return this.segs||[]},destroyEvents:function(){J.prototype.destroyEvents.call(this),this.eventSkeletonEl&&(this.eventSkeletonEl.remove(),this.eventSkeletonEl=null),this.segs=null},renderEventTable:function(e){var i,n,r,o,s,l,a=t("
"),c=a.find("tr"),d=this.eventsToSegs(e);for(d=this.renderSegs(d),i=this.groupSegCols(d),this.computeSegVerticals(d),o=0;i.length>o;o++){for(s=i[o],oe(s),l=t('
'),n=0;s.length>n;n++)r=s[n],r.el.css(this.generateSegPositionCss(r)),30>r.bottom-r.top&&r.el.addClass("fc-short"),l.append(r.el);c.append(t("
").append(l))}return this.bookendCells(c,"eventSkeleton"),{tableEl:a,segs:d}},updateSegVerticals:function(){var t,e=this.segs;if(e)for(this.computeSegVerticals(e),t=0;e.length>t;t++)e[t].el.css(this.generateSegVerticalCss(e[t]))},computeSegVerticals:function(t){var e,i;for(e=0;t.length>e;e++)i=t[e],i.top=this.computeDateTop(i.start,i.start),i.bottom=this.computeDateTop(i.end,i.start)},renderSegHtml:function(t,e){var i,n,r,o=this.view,s=t.event,l=o.isEventDraggable(s),a=!e&&t.isEnd&&o.isEventResizable(s),c=this.getSegClasses(t,l,a),d=this.getEventSkinCss(s);return c.unshift("fc-time-grid-event"),o.isMultiDayEvent(s)?(t.isStart||t.isEnd)&&(i=o.getEventTimeText(t.start,t.end),n=o.getEventTimeText(t.start,t.end,"LT"),r=o.getEventTimeText(t.start,null)):(i=o.getEventTimeText(s),n=o.getEventTimeText(s,"LT"),r=o.getEventTimeText(s.start,null)),'"+'
'+(i?'
"+""+R(i)+""+"
":"")+(s.title?'
'+R(s.title)+"
":"")+"
"+'
'+(a?'
':"")+""},generateSegPositionCss:function(t){var e,i,n=this.view,r=n.opt("isRTL"),o=n.opt("slotEventOverlap"),s=t.backwardCoord,l=t.forwardCoord,a=this.generateSegVerticalCss(t);return o&&(l=Math.min(1,s+2*(l-s))),r?(e=1-l,i=s):(e=s,i=1-l),a.zIndex=t.level+1,a.left=100*e+"%",a.right=100*i+"%",o&&t.forwardPressure&&(a[r?"marginLeft":"marginRight"]=20),a},generateSegVerticalCss:function(t){return{top:t.top,bottom:-t.bottom}},groupSegCols:function(t){var e,i=this.view,n=[];for(e=0;i.colCnt>e;e++)n.push([]);for(e=0;t.length>e;e++)n[t[e].col].push(t[e]);return n}}),fe.prototype={calendar:null,coordMap:null,el:null,start:null,end:null,intervalStart:null,intervalEnd:null,rowCnt:null,colCnt:null,isSelected:!1,scrollerEl:null,scrollTop:null,widgetHeaderClass:null,widgetContentClass:null,highlightStateClass:null,documentMousedownProxy:null,documentDragStartProxy:null,init:function(){var e=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=e+"-widget-header",this.widgetContentClass=e+"-widget-content",this.highlightStateClass=e+"-state-highlight",this.documentMousedownProxy=t.proxy(this,"documentMousedown"),this.documentDragStartProxy=t.proxy(this,"documentDragStart")},render:function(){this.updateSize(),this.trigger("viewRender",this,this,this.el),t(document).on("mousedown",this.documentMousedownProxy).on("dragstart",this.documentDragStartProxy)},destroy:function(){this.unselect(),this.trigger("viewDestroy",this,this,this.el),this.destroyEvents(),this.el.empty(),t(document).off("mousedown",this.documentMousedownProxy).off("dragstart",this.documentDragStartProxy)},incrementDate:function(){},updateSize:function(t){t&&this.recordScroll(),this.updateHeight(),this.updateWidth()},updateWidth:function(){},updateHeight:function(){var t=this.calendar;this.setHeight(t.getSuggestedViewHeight(),t.isHeightAuto())},setHeight:function(){},computeScrollerHeight:function(t){var e,i=this.el.add(this.scrollerEl);return i.css({position:"relative",left:-1}),e=this.el.outerHeight()-this.scrollerEl.height(),i.css({position:"",left:""}),t-e},recordScroll:function(){this.scrollerEl&&(this.scrollTop=this.scrollerEl.scrollTop())},restoreScroll:function(){null!==this.scrollTop&&this.scrollerEl.scrollTop(this.scrollTop)},renderEvents:function(){this.segEach(function(t){this.trigger("eventAfterRender",t.event,t.event,t.el)}),this.trigger("eventAfterAllRender")},destroyEvents:function(){this.segEach(function(t){this.trigger("eventDestroy",t.event,t.event,t.el)})},resolveEventEl:function(e,i){var n=this.trigger("eventRender",e,e,i);return n===!1?i=null:n&&n!==!0&&(i=t(n)),i},showEvent:function(t){this.segEach(function(t){t.el.css("visibility","")},t)},hideEvent:function(t){this.segEach(function(t){t.el.css("visibility","hidden")},t)},segEach:function(t,e){var i,n=this.getSegs();for(i=0;n.length>i;i++)e&&n[i].event._id!==e._id||t.call(this,n[i])},getSegs:function(){},renderDrag:function(){},destroyDrag:function(){},documentDragStart:function(e){var i,n=this,r=null;this.opt("droppable")&&(i=new q(this.coordMap,{cellOver:function(t,e){r=e,n.renderDrag(e)},cellOut:function(){r=null,n.destroyDrag()}}),t(document).one("dragstop",function(t,e){n.destroyDrag(),r&&n.trigger("drop",t.target,r,t,e)}),i.startDrag(e))},select:function(t,e,i){this.unselect(i),this.renderSelection(t,e),this.reportSelection(t,e,i)},renderSelection:function(){},reportSelection:function(t,e,i){this.isSelected=!0,this.trigger("select",null,t,e,i)},unselect:function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection(),this.trigger("unselect",null,t))},destroySelection:function(){},documentMousedown:function(e){var i;this.isSelected&&this.opt("unselectAuto")&&E(e)&&(i=this.opt("unselectCancel"),i&&t(e.target).closest(i).length||this.unselect(e))}},ge.prototype=H(fe.prototype),t.extend(ge.prototype,{dayGrid:null,dayNumbersVisible:!1,weekNumbersVisible:!1,weekNumberWidth:null,headRowEl:null,render:function(t,e,i){this.rowCnt=t,this.colCnt=e,this.dayNumbersVisible=i,this.weekNumbersVisible=this.opt("weekNumbers"),this.dayGrid.numbersVisible=this.dayNumbersVisible||this.weekNumbersVisible,this.el.addClass("fc-basic-view").html(this.renderHtml()),this.headRowEl=this.el.find("thead .fc-row"),this.scrollerEl=this.el.find(".fc-day-grid-container"),this.dayGrid.coordMap.containerEl=this.scrollerEl,this.dayGrid.el=this.el.find(".fc-day-grid"),this.dayGrid.render(this.hasRigidRows()),fe.prototype.render.call(this)},destroy:function(){this.dayGrid.destroy(),fe.prototype.destroy.call(this)},renderHtml:function(){return'"+""+""+""+""+'"+""+""+"
'+this.dayGrid.headHtml()+"
'+'
'+'
'+"
"+"
" +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function i(t,e){return e.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"t")}function n(t,e){var i=e.longDateFormat("L");return i=i.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g,""),t.isRTL?i+=" ddd":i="ddd "+i,i}function r(t){o(De,t)}function o(e){function i(i,n){t.isPlainObject(n)&&t.isPlainObject(e[i])&&!s(i)?e[i]=o({},e[i],n):void 0!==n&&(e[i]=n)}for(var n=1;arguments.length>n;n++)t.each(arguments[n],i);return e}function s(t){return/(Time|Duration)$/.test(t)}function l(i,n){function r(t){var i=e.localeData||e.langData;return i.call(e,t)||i.call(e,"en")}function s(t){ie?h()&&(p(),f(t)):l()}function l(){ne=K.theme?"ui":"fc",i.addClass("fc"),K.isRTL?i.addClass("fc-rtl"):i.addClass("fc-ltr"),K.theme?i.addClass("ui-widget"):i.addClass("fc-unthemed"),ie=t("
").prependTo(i),te=new a(q,K),ee=te.render(),ee&&i.prepend(ee),u(K.defaultView),K.handleWindowResize&&(se=L(v,K.windowResizeDelay),t(window).resize(se))}function d(){re&&re.destroy(),te.destroy(),ie.remove(),i.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"),t(window).unbind("resize",se)}function h(){return i.is(":visible")}function u(t){f(0,t)}function f(e,i){he++,re&&i&&re.name!==i&&(te.deactivateButton(re.name),I(),re.start&&re.destroy(),re.el.remove(),re=null),!re&&i&&(re=new xe[i](q),re.el=t("
").appendTo(ie),te.activateButton(i)),re&&(e&&(le=re.incrementDate(le,e)),re.start&&!e&&le.isWithin(re.intervalStart,re.intervalEnd)||h()&&(I(),re.start&&re.destroy(),re.render(le),Z(),C(),x(),b())),Z(),he--}function g(t){return h()?(t&&m(),he++,re.updateSize(!0),he--,!0):void 0}function p(){h()&&m()}function m(){oe="number"==typeof K.contentHeight?K.contentHeight:"number"==typeof K.height?K.height-(ee?ee.outerHeight(!0):0):Math.round(ie.width()/Math.max(K.aspectRatio,.5))}function v(t){!he&&t.target===window&&re.start&&g(!0)&&re.trigger("windowResize",de)}function y(){E(),S()}function w(){h()&&(I(),re.destroyEvents(),re.renderEvents(ue),Z())}function E(){I(),re.destroyEvents(),Z()}function b(){!K.lazyFetching||ae(re.start,re.end)?S():w()}function S(){ce(re.start,re.end)}function D(t){ue=t,w()}function T(){w()}function C(){te.updateTitle(re.title)}function x(){var t=q.getNow();t.isWithin(re.intervalStart,re.intervalEnd)?te.disableButton("today"):te.enableButton("today")}function k(t,e){t=q.moment(t),e=e?q.moment(e):t.hasTime()?t.clone().add(q.defaultTimedEventDuration):t.clone().add(q.defaultAllDayEventDuration),re.select(t,e)}function M(){re&&re.unselect()}function R(){f(-1)}function P(){f(1)}function G(){le.add(-1,"years"),f()}function N(){le.add(1,"years"),f()}function Y(){le=q.getNow(),f()}function A(t){le=q.moment(t),f()}function _(t){le.add(e.duration(t)),f()}function O(t,e){var i,n;e&&void 0!==xe[e]||(e=e||"day",i=te.getViewsWithButtons().join(" "),n=i.match(RegExp("\\w+"+z(e))),n||(n=i.match(/\w+Day/)),e=n?n[0]:"agendaDay"),le=t,u(e)}function F(){return le.clone()}function I(){ie.css({width:"100%",height:ie.height(),overflow:"hidden"})}function Z(){ie.css({width:"",height:"",overflow:""})}function B(){return q}function j(){return re}function X(t,e){return void 0===e?K[t]:(("height"==t||"contentHeight"==t||"aspectRatio"==t)&&(K[t]=e,g(!0)),void 0)}function $(t,e){return K[t]?K[t].apply(e||de,Array.prototype.slice.call(arguments,2)):void 0}var q=this;n=n||{};var U,K=o({},De,n);U=K.lang in Te?Te[K.lang]:Te[De.lang],U&&(K=o({},De,U,n)),K.isRTL&&(K=o({},De,Ce,U||{},n)),q.options=K,q.render=s,q.destroy=d,q.refetchEvents=y,q.reportEvents=D,q.reportEventChange=T,q.rerenderEvents=w,q.changeView=u,q.select=k,q.unselect=M,q.prev=R,q.next=P,q.prevYear=G,q.nextYear=N,q.today=Y,q.gotoDate=A,q.incrementDate=_,q.zoomTo=O,q.getDate=F,q.getCalendar=B,q.getView=j,q.option=X,q.trigger=$;var Q=H(r(K.lang));if(K.monthNames&&(Q._months=K.monthNames),K.monthNamesShort&&(Q._monthsShort=K.monthNamesShort),K.dayNames&&(Q._weekdays=K.dayNames),K.dayNamesShort&&(Q._weekdaysShort=K.dayNamesShort),null!=K.firstDay){var J=H(Q._week);J.dow=K.firstDay,Q._week=J}q.defaultAllDayEventDuration=e.duration(K.defaultAllDayEventDuration),q.defaultTimedEventDuration=e.duration(K.defaultTimedEventDuration),q.moment=function(){var t;return"local"===K.timezone?(t=He.moment.apply(null,arguments),t.hasTime()&&t.local()):t="UTC"===K.timezone?He.moment.utc.apply(null,arguments):He.moment.parseZone.apply(null,arguments),"_locale"in t?t._locale=Q:t._lang=Q,t},q.getIsAmbigTimezone=function(){return"local"!==K.timezone&&"UTC"!==K.timezone},q.rezoneDate=function(t){return q.moment(t.toArray())},q.getNow=function(){var t=K.now;return"function"==typeof t&&(t=t()),q.moment(t)},q.calculateWeekNumber=function(t){var e=K.weekNumberCalculation;return"function"==typeof e?e(t):"local"===e?t.week():"ISO"===e.toUpperCase()?t.isoWeek():void 0},q.getEventEnd=function(t){return t.end?t.end.clone():q.getDefaultEventEnd(t.allDay,t.start)},q.getDefaultEventEnd=function(t,e){var i=e.clone();return t?i.stripTime().add(q.defaultAllDayEventDuration):i.add(q.defaultTimedEventDuration),q.getIsAmbigTimezone()&&i.stripZone(),i},q.formatRange=function(t,e,i){return"function"==typeof i&&(i=i.call(q,K,Q)),W(t,e,i,null,K.isRTL)},q.formatDate=function(t,e){return"function"==typeof e&&(e=e.call(q,K,Q)),V(t,e)},c.call(q,K);var te,ee,ie,ne,re,oe,se,le,ae=q.isFetchNeeded,ce=q.fetchEvents,de=i[0],he=0,ue=[];le=null!=K.defaultDate?q.moment(K.defaultDate):q.getNow(),q.getSuggestedViewHeight=function(){return void 0===oe&&p(),oe},q.isHeightAuto=function(){return"auto"===K.contentHeight||"auto"===K.height}}function a(e,i){function n(){var e=i.header;return f=i.theme?"ui":"fc",e?g=t("
").append(o("left")).append(o("right")).append(o("center")).append('
'):void 0}function r(){g.remove()}function o(n){var r=t('
'),o=i.header[n];return o&&t.each(o.split(" "),function(){var n,o=t(),s=!0;t.each(this.split(","),function(n,r){var l,a,c,d,h,u,g,m;"title"==r?(o=o.add(t("

 

")),s=!1):(e[r]?l=function(){e[r]()}:xe[r]&&(l=function(){e.changeView(r)},p.push(r)),l&&(a=S(i.themeButtonIcons,r),c=S(i.buttonIcons,r),d=S(i.defaultButtonText,r),h=S(i.buttonText,r),u=h?R(h):a&&i.theme?"":c&&!i.theme?"":R(d||r),g=["fc-"+r+"-button",f+"-button",f+"-state-default"],m=t('").click(function(){m.hasClass(f+"-state-disabled")||(l(),(m.hasClass(f+"-state-active")||m.hasClass(f+"-state-disabled"))&&m.removeClass(f+"-state-hover"))}).mousedown(function(){m.not("."+f+"-state-active").not("."+f+"-state-disabled").addClass(f+"-state-down")}).mouseup(function(){m.removeClass(f+"-state-down")}).hover(function(){m.not("."+f+"-state-active").not("."+f+"-state-disabled").addClass(f+"-state-hover")},function(){m.removeClass(f+"-state-hover").removeClass(f+"-state-down")}),o=o.add(m)))}),s&&o.first().addClass(f+"-corner-left").end().last().addClass(f+"-corner-right").end(),o.length>1?(n=t("
"),s&&n.addClass("fc-button-group"),n.append(o),r.append(n)):r.append(o)}),r}function s(t){g.find("h2").text(t)}function l(t){g.find(".fc-"+t+"-button").addClass(f+"-state-active")}function a(t){g.find(".fc-"+t+"-button").removeClass(f+"-state-active")}function c(t){g.find(".fc-"+t+"-button").attr("disabled","disabled").addClass(f+"-state-disabled")}function d(t){g.find(".fc-"+t+"-button").removeAttr("disabled").removeClass(f+"-state-disabled")}function h(){return p}var u=this;u.render=n,u.destroy=r,u.updateTitle=s,u.activateButton=l,u.deactivateButton=a,u.disableButton=c,u.enableButton=d,u.getViewsWithButtons=h;var f,g=t(),p=[]}function c(e){function i(t,e){return!T||t.clone().stripZone()C.clone().stripZone()}function n(t,e){T=t,C=e,A=[];var i=++G,n=L.length;N=n;for(var o=0;n>o;o++)r(L[o],i)}function r(e,i){o(e,function(n){var r,o,s=t.isArray(e.events);if(i==G){if(n)for(r=0;n.length>r;r++)o=n[r],s||(o=w(o,e)),o&&A.push(o);N--,N||R(A)}})}function o(i,n){var r,s,l=He.sourceFetchers;for(r=0;l.length>r;r++){if(s=l[r].call(S,i,T.clone(),C.clone(),e.timezone,n),s===!0)return;if("object"==typeof s)return o(s,n),void 0}var a=i.events;if(a)t.isFunction(a)?(v(),a.call(S,T.clone(),C.clone(),e.timezone,function(t){n(t),y()})):t.isArray(a)?n(a):n();else{var c=i.url;if(c){var d,h=i.success,u=i.error,f=i.complete;d=t.isFunction(i.data)?i.data():i.data;var g=t.extend({},d||{}),p=M(i.startParam,e.startParam),m=M(i.endParam,e.endParam),w=M(i.timezoneParam,e.timezoneParam);p&&(g[p]=T.format()),m&&(g[m]=C.format()),e.timezone&&"local"!=e.timezone&&(g[w]=e.timezone),v(),t.ajax(t.extend({},ke,i,{data:g,success:function(e){e=e||[];var i=k(h,this,arguments);t.isArray(i)&&(e=i),n(e)},error:function(){k(u,this,arguments),n()},complete:function(){k(f,this,arguments),y()}}))}else n()}}function s(t){var e=l(t);e&&(L.push(e),N++,r(e,G))}function l(e){var i,n,r=He.sourceNormalizers;if(t.isFunction(e)||t.isArray(e)?i={events:e}:"string"==typeof e?i={url:e}:"object"==typeof e&&(i=t.extend({},e)),i){for(i.className?"string"==typeof i.className&&(i.className=i.className.split(/\s+/)):i.className=[],t.isArray(i.events)&&(i.origArray=i.events,i.events=t.map(i.events,function(t){return w(t,i)})),n=0;r.length>n;n++)r[n].call(S,i);return i}}function a(e){L=t.grep(L,function(t){return!c(t,e)}),A=t.grep(A,function(t){return!c(t.source,e)}),R(A)}function c(t,e){return t&&e&&h(t)==h(e)}function h(t){return("object"==typeof t?t.origArray||t.url||t.events:null)||t}function u(t){t.start=S.moment(t.start),t.end&&(t.end=S.moment(t.end)),E(t),f(t),R(A)}function f(t){var e,i,n,r;for(e=0;A.length>e;e++)if(i=A[e],i._id==t._id&&i!==t)for(n=0;V.length>n;n++)r=V[n],void 0!==t[r]&&(i[r]=t[r])}function g(t,e){var i=w(t);i&&(i.source||(e&&(z.events.push(i),i.source=z),A.push(i)),R(A))}function p(e){var i,n;for(null==e?e=function(){return!0}:t.isFunction(e)||(i=e+"",e=function(t){return t._id==i}),A=t.grep(A,e,!0),n=0;L.length>n;n++)t.isArray(L[n].events)&&(L[n].events=t.grep(L[n].events,e,!0));R(A)}function m(e){return t.isFunction(e)?t.grep(A,e):null!=e?(e+="",t.grep(A,function(t){return t._id==e})):A}function v(){Y++||H("loading",null,!0,x())}function y(){--Y||H("loading",null,!1,x())}function w(i,n){var r,o,s,l,a={};return e.eventDataTransform&&(i=e.eventDataTransform(i)),n&&n.eventDataTransform&&(i=n.eventDataTransform(i)),r=S.moment(i.start||i.date),r.isValid()&&(o=null,!i.end||(o=S.moment(i.end),o.isValid()))?(s=i.allDay,void 0===s&&(l=M(n?n.allDayDefault:void 0,e.allDayDefault),s=void 0!==l?l:!(r.hasTime()||o&&o.hasTime())),s?(r.hasTime()&&r.stripTime(),o&&o.hasTime()&&o.stripTime()):(r.hasTime()||(r=S.rezoneDate(r)),o&&!o.hasTime()&&(o=S.rezoneDate(o))),t.extend(a,i),n&&(a.source=n),a._id=i._id||(void 0===i.id?"_fc"+Me++:i.id+""),a.className=i.className?"string"==typeof i.className?i.className.split(/\s+/):i.className:[],a.resources?"string"==typeof a.resources&&(a.resources=a.resources.split(/\s+/)):a.resources=[],a.allDay=s,a.start=r,a.end=o,e.forceEventDuration&&!a.end&&(a.end=P(a)),d(a),a):void 0}function E(t,e,i){var n,r,o,s,l=t._allDay,a=t._start,c=t._end,d=!1;return e||i||(e=t.start,i=t.end),n=t.allDay!=l?t.allDay:!(e||i).hasTime(),n&&(e&&(e=e.clone().stripTime()),i&&(i=i.clone().stripTime())),e&&(r=n?D(e,a.clone().stripTime()):D(e,a)),n!=l?d=!0:i&&(o=D(i||S.getDefaultEventEnd(n,e||a),e||a).subtract(D(c||S.getDefaultEventEnd(l,a),a))),s=b(m(t._id),d,n,r,o),{dateDelta:r,durationDelta:o,undo:s}}function b(i,n,r,o,s){var l=S.getIsAmbigTimezone(),a=[];return t.each(i,function(t,i){var c=i._allDay,h=i._start,u=i._end,f=null!=r?r:c,g=h.clone(),p=!n&&u?u.clone():null;f?(g.stripTime(),p&&p.stripTime()):(g.hasTime()||(g=S.rezoneDate(g)),p&&!p.hasTime()&&(p=S.rezoneDate(p))),p||!e.forceEventDuration&&!+s||(p=S.getDefaultEventEnd(f,g)),g.add(o),p&&p.add(o).add(s),l&&(+o||+s)&&(g.stripZone(),p&&p.stripZone()),i.allDay=f,i.start=g,i.end=p,d(i),a.push(function(){i.allDay=c,i.start=h,i.end=u,d(i)})}),function(){for(var t=0;a.length>t;t++)a[t]()}}var S=this;S.isFetchNeeded=i,S.fetchEvents=n,S.addEventSource=s,S.removeEventSource=a,S.updateEvent=u,S.renderEvent=g,S.removeEvents=p,S.clientEvents=m,S.mutateEvent=E;var T,C,H=S.trigger,x=S.getView,R=S.reportEvents,P=S.getEventEnd,z={events:[]},L=[z],G=0,N=0,Y=0,A=[];t.each((e.events?[e.events]:[]).concat(e.eventSources||[]),function(t,e){var i=l(e);i&&L.push(i)});var V=["title","url","allDay","className","editable","color","backgroundColor","borderColor","textColor"]}function d(t){t._allDay=t.allDay,t._start=t.start.clone(),t._end=t.end?t.end.clone():null}function h(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function u(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function f(e,i,n){var r=Math.floor(i/e.length),o=Math.floor(i-r*(e.length-1)),s=[],l=[],a=[],c=0;g(e),e.each(function(i,n){var d=i===e.length-1?o:r,h=t(n).outerHeight(!0);d>h?(s.push(n),l.push(h),a.push(t(n).height())):c+=h}),n&&(i-=c,r=Math.floor(i/s.length),o=Math.floor(i-r*(s.length-1))),t(s).each(function(e,i){var n=e===s.length-1?o:r,c=l[e],d=a[e],h=n-(c-d);n>c&&t(i).height(h)})}function g(t){t.height("")}function p(e){var i=0;return e.find("> *").each(function(e,n){var r=t(n).outerWidth();r>i&&(i=r)}),i++,e.width(i),i}function m(t,e){return t.height(e).addClass("fc-scroller"),t[0].scrollHeight-1>t[0].clientHeight?!0:(v(t),!1)}function v(t){t.height("").removeClass("fc-scroller")}function y(e){var i=e.css("position"),n=e.parents().filter(function(){var e=t(this);return/(auto|scroll)/.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&n.length?n:t(e[0].ownerDocument||document)}function w(t){var e=t.offset().left,i=e+t.width(),n=t.children(),r=n.offset().left,o=r+n.outerWidth();return{left:r-e,right:i-o}}function E(t){return 1==t.which&&!t.ctrlKey}function b(t,e,i,n){var r,o,s,l;return e>i&&n>t?(t>=i?(r=t.clone(),s=!0):(r=i.clone(),s=!1),n>=e?(o=e.clone(),l=!0):(o=n.clone(),l=!1),{start:r,end:o,isStart:s,isEnd:l}):void 0}function S(t,e){if(t=t||{},void 0!==t[e])return t[e];for(var i,n=e.split(/(?=[A-Z])/),r=n.length-1;r>=0;r--)if(i=t[n[r].toLowerCase()],void 0!==i)return i;return t["default"]}function D(t,i){return e.duration({days:t.clone().stripTime().diff(i.clone().stripTime(),"days"),ms:t.time()-i.time()})}function T(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function C(t,e){return t-e}function H(t){var e=function(){};return e.prototype=t,new e}function x(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])}function k(e,i,n){if(t.isFunction(e)&&(e=[e]),e){var r,o;for(r=0;e.length>r;r++)o=e[r].apply(i,n)||o;return o}}function M(){for(var t=0;arguments.length>t;t++)if(void 0!==arguments[t])return arguments[t]}function R(t){return(t+"").replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function P(t){return t.replace(/&.*?;/g,"")}function z(t){return t.charAt(0).toUpperCase()+t.slice(1)}function L(t,e){var i,n,r,o,s=function(){var l=+new Date-o;e>l&&l>0?i=setTimeout(s,e-l):(i=null,t.apply(r,n),i||(r=n=null))};return function(){r=this,n=arguments,o=+new Date,i||(i=setTimeout(s,e))}}function G(i,n,r){var o,s,l,a,c=i[0],d=1==i.length&&"string"==typeof c;return e.isMoment(c)?(a=e.apply(null,i),c._ambigTime&&(a._ambigTime=!0),c._ambigZone&&(a._ambigZone=!0)):T(c)||void 0===c?a=e.apply(null,i):(o=!1,s=!1,d?Pe.test(c)?(c+="-01",i=[c],o=!0,s=!0):(l=ze.exec(c))&&(o=!l[5],s=!0):t.isArray(c)&&(s=!0),a=n?e.utc.apply(e,i):e.apply(null,i),o?(a._ambigTime=!0,a._ambigZone=!0):r&&(s?a._ambigZone=!0:d&&a.zone(c))),new N(a)}function N(t){x(this,t)}function Y(t,e){var i,n=[],r=!1,o=!1;for(i=0;t.length>i;i++)n.push(He.moment.parseZone(t[i])),r=r||n[i]._ambigTime,o=o||n[i]._ambigZone;for(i=0;n.length>i;i++)r&&!e?n[i].stripTime():o&&n[i].stripZone();return n}function A(t,i){return e.fn.format.call(t,i)}function V(t,e){return _(t,Z(e))}function _(t,e){var i,n="";for(i=0;e.length>i;i++)n+=O(t,e[i]);return n}function O(t,e){var i,n;return"string"==typeof e?e:(i=e.token)?Le[i]?Le[i](t):A(t,i):e.maybe&&(n=_(t,e.maybe),n.match(/[1-9]/))?n:""}function W(t,e,i,n,r){var o;return t=He.moment.parseZone(t),e=He.moment.parseZone(e),o=(t.localeData||t.lang).call(t),i=o.longDateFormat(i)||i,n=n||" - ",F(t,e,Z(i),n,r)}function F(t,e,i,n,r){var o,s,l,a,c="",d="",h="",u="",f="";for(s=0;i.length>s&&(o=I(t,e,i[s]),o!==!1);s++)c+=o;for(l=i.length-1;l>s&&(o=I(t,e,i[l]),o!==!1);l--)d=o+d;for(a=s;l>=a;a++)h+=O(t,i[a]),u+=O(e,i[a]);return(h||u)&&(f=r?u+n+h:h+n+u),c+f+d}function I(t,e,i){var n,r;return"string"==typeof i?i:(n=i.token)&&(r=Ge[n.charAt(0)],r&&t.isSame(e,r))?A(t,n):!1}function Z(t){return t in Ne?Ne[t]:Ne[t]=B(t)}function B(t){for(var e,i=[],n=/\[([^\]]*)\]|\(([^\)]*)\)|(LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=n.exec(t);)e[1]?i.push(e[1]):e[2]?i.push({maybe:B(e[2])}):e[3]?i.push({token:e[3]}):e[5]&&i.push(e[5]);return i}function j(t){this.options=t||{}}function X(t){this.grid=t}function $(t){this.coordMaps=t}function q(t,e){this.coordMap=t,this.options=e||{}}function U(t,e){return t||e?t&&e?t.grid===e.grid&&t.row===e.row&&t.col===e.col:!1:!0}function K(e,i){this.options=i=i||{},this.sourceEl=e,this.parentEl=i.parentEl?t(i.parentEl):e.parent()}function Q(t){this.view=t}function J(t){Q.call(this,t),this.coordMap=new X(this)}function te(t,e){return t.eventStartMS-e.eventStartMS||e.eventDurationMS-t.eventDurationMS||e.event.allDay-t.event.allDay||(t.event.title||"").localeCompare(e.event.title)}function ee(t){J.call(this,t)}function ie(t,e){var i,n;for(i=0;e.length>i;i++)if(n=e[i],n.leftCol<=t.rightCol&&n.rightCol>=t.leftCol)return!0;return!1}function ne(t,e){return t.leftCol-e.leftCol}function re(t){J.call(this,t)}function oe(t){var e,i,n;if(t.sort(te),e=se(t),le(e),i=e[0]){for(n=0;i.length>n;n++)ae(i[n]);for(n=0;i.length>n;n++)ce(i[n],0,0)}}function se(t){var e,i,n,r=[];for(e=0;t.length>e;e++){for(i=t[e],n=0;r.length>n&&de(i,r[n]).length;n++);i.level=n,(r[n]||(r[n]=[])).push(i)}return r}function le(t){var e,i,n,r,o;for(e=0;t.length>e;e++)for(i=t[e],n=0;i.length>n;n++)for(r=i[n],r.forwardSegs=[],o=e+1;t.length>o;o++)de(r,t[o],r.forwardSegs)}function ae(t){var e,i,n=t.forwardSegs,r=0;if(void 0===t.forwardPressure){for(e=0;n.length>e;e++)i=n[e],ae(i),r=Math.max(r,1+i.forwardPressure);t.forwardPressure=r}}function ce(t,e,i){var n,r=t.forwardSegs;if(void 0===t.forwardCoord)for(r.length?(r.sort(ue),ce(r[0],e+1,i),t.forwardCoord=r[0].backwardCoord):t.forwardCoord=1,t.backwardCoord=t.forwardCoord-(t.forwardCoord-i)/(e+1),n=0;r.length>n;n++)ce(r[n],0,t.forwardCoord)}function de(t,e,i){i=i||[];for(var n=0;e.length>n;n++)he(t,e[n])&&i.push(e[n]);return i}function he(t,e){return t.bottom>e.top&&t.topd;d++){var h=d*n,u=h+n-1,f=Math.max(a,h),g=Math.min(c,u);if(g>=f){var m=E(f),v=E(g),b=[m.col,v.col].sort(),S=p(f)==s,T=p(g)+1==l;r.push({row:d,leftCol:b[0],rightCol:b[1],isStart:S,isEnd:T})}}return r}function D(t,e){var i,n,r=t.clone().stripTime();return e&&(i=e.clone().stripTime(),n=+e.time(),n&&n>=k&&i.add(1,"days")),(!e||r>=i)&&(i=r.clone().add(1,"days")),{start:r,end:i}}function T(t){var e=D(t.start,t.end);return e.end.diff(e.start,"days")>1}var C=this;C.calendar=i,C.opt=n,C.trigger=r,C.isEventDraggable=o,C.isEventResizable=l,C.eventDrop=a,C.eventResize=c;var H=i.reportEventChange,x=i.options,k=e.duration(x.nextDayThreshold);C.init(),C.getEventTimeText=function(t,e){var r,o;return"object"==typeof t&&"object"==typeof e?(r=t,o=e,e=arguments[2]):(r=t.start,o=t.end),e=e||n("timeFormat"),o&&n("displayEventEnd")?i.formatRange(r,o,e):i.formatDate(r,e)},C.isHiddenDay=d,C.skipHiddenDays=u,C.getCellsPerWeek=h,C.dateToCell=v,C.dateToDayOffset=y,C.dayOffsetToCellOffset=w,C.cellOffsetToCell=E,C.cellToDate=f,C.cellToCellOffset=g,C.cellOffsetToDayOffset=p,C.dayOffsetToDate=m,C.rangeToSegments=b,C.isMultiDayEvent=T;var R,P=n("hiddenDays")||[],z=[],L=[],G=[],N=n("isRTL");(function(){n("weekends")===!1&&P.push(0,6);for(var e=0,i=0;7>e;e++)L[e]=i,z[e]=-1!=t.inArray(e,P),z[e]||(G[i]=e,i++);if(R=i,!R)throw"invalid hiddenDays"})()}function ge(t){fe.call(this,t),this.dayGrid=new ee(this),this.coordMap=this.dayGrid.coordMap}function pe(t){ge.call(this,t)}function me(t){ge.call(this,t)}function ve(t){ge.call(this,t)}function ye(t,e){return e.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"a")}function we(t,e){return e.longDateFormat("LT").replace(/\s*a$/i,"")}function Ee(t){fe.call(this,t),this.timeGrid=new re(this),this.opt("allDaySlot")?(this.dayGrid=new ee(this),this.coordMap=new $([this.dayGrid.coordMap,this.timeGrid.coordMap])):this.coordMap=this.timeGrid.coordMap}function be(t){Ee.call(this,t)}function Se(t){Ee.call(this,t)}var De={lang:"en",defaultTimedEventDuration:"02:00:00",defaultAllDayEventDuration:{days:1},forceEventDuration:!1,nextDayThreshold:"09:00:00",defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberTitle:"W",weekNumberCalculation:"local",lazyFetching:!0,startParam:"start",endParam:"end",timezoneParam:"timezone",timezone:!1,titleFormat:{month:"MMMM YYYY",week:"ll",day:"LL"},columnFormat:{month:"ddd",week:n,day:"dddd"},timeFormat:{"default":i},displayEventEnd:{month:!1,basicWeek:!1,"default":!0},isRTL:!1,defaultButtonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",today:"today",month:"month",week:"week",day:"day"},buttonIcons:{prev:"left-single-arrow",next:"right-single-arrow",prevYear:"left-double-arrow",nextYear:"right-double-arrow"},theme:!1,themeButtonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e",prevYear:"seek-prev",nextYear:"seek-next"},dragOpacity:.75,dragRevertDuration:500,dragScroll:!0,unselectAuto:!0,dropAccept:"*",eventLimit:!1,eventLimitText:"more",eventLimitClick:"popover",dayPopoverFormat:"LL",handleWindowResize:!0,windowResizeDelay:200},Te={en:{columnFormat:{week:"ddd M/D"},dayPopoverFormat:"dddd, MMMM D"}},Ce={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"right-single-arrow",next:"left-single-arrow",prevYear:"right-double-arrow",nextYear:"left-double-arrow"},themeButtonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w",nextYear:"seek-prev",prevYear:"seek-next"}},He=t.fullCalendar={version:"2.1.1"},xe=He.views={};t.fn.fullCalendar=function(e){var i=Array.prototype.slice.call(arguments,1),n=this;return this.each(function(r,o){var s,a=t(o),c=a.data("fullCalendar");"string"==typeof e?c&&t.isFunction(c[e])&&(s=c[e].apply(c,i),r||(n=s),"destroy"===e&&a.removeData("fullCalendar")):c||(c=new l(a,e),a.data("fullCalendar",c),c.render())}),n},He.langs=Te,He.datepickerLang=function(e,i,n){var r=Te[e];r||(r=Te[e]={}),o(r,{isRTL:n.isRTL,weekNumberTitle:n.weekHeader,titleFormat:{month:n.showMonthAfterYear?"YYYY["+n.yearSuffix+"] MMMM":"MMMM YYYY["+n.yearSuffix+"]"},defaultButtonText:{prev:P(n.prevText),next:P(n.nextText),today:P(n.currentText)}}),t.datepicker&&(t.datepicker.regional[i]=t.datepicker.regional[e]=n,t.datepicker.regional.en=t.datepicker.regional[""],t.datepicker.setDefaults(n))},He.lang=function(t,e){var i;e&&(i=Te[t],i||(i=Te[t]={}),o(i,e||{})),De.lang=t},He.sourceNormalizers=[],He.sourceFetchers=[];var ke={dataType:"json",cache:!1},Me=1,Re=["sun","mon","tue","wed","thu","fri","sat"];He.applyAll=k;var Pe=/^\s*\d{4}-\d\d$/,ze=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/;He.moment=function(){return G(arguments)},He.moment.utc=function(){var t=G(arguments,!0);return t.hasTime()&&t.utc(),t},He.moment.parseZone=function(){return G(arguments,!0,!0)},N.prototype=H(e.fn),N.prototype.clone=function(){return G([this])},N.prototype.time=function(t){if(null==t)return e.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});delete this._ambigTime,e.isDuration(t)||e.isMoment(t)||(t=e.duration(t));var i=0;return e.isDuration(t)&&(i=24*Math.floor(t.asDays())),this.hours(i+t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())},N.prototype.stripTime=function(){var t=this.toArray();return e.fn.utc.call(this),this.year(t[0]).month(t[1]).date(t[2]).hours(0).minutes(0).seconds(0).milliseconds(0),this._ambigTime=!0,this._ambigZone=!0,this},N.prototype.hasTime=function(){return!this._ambigTime},N.prototype.stripZone=function(){var t=this.toArray(),i=this._ambigTime;return e.fn.utc.call(this),this.year(t[0]).month(t[1]).date(t[2]).hours(t[3]).minutes(t[4]).seconds(t[5]).milliseconds(t[6]),i&&(this._ambigTime=!0),this._ambigZone=!0,this},N.prototype.hasZone=function(){return!this._ambigZone},N.prototype.zone=function(t){return null!=t&&(delete this._ambigTime,delete this._ambigZone),e.fn.zone.apply(this,arguments)},N.prototype.local=function(){var t=this.toArray(),i=this._ambigZone;return delete this._ambigTime,delete this._ambigZone,e.fn.local.apply(this,arguments),i&&this.year(t[0]).month(t[1]).date(t[2]).hours(t[3]).minutes(t[4]).seconds(t[5]).milliseconds(t[6]),this},N.prototype.utc=function(){return delete this._ambigTime,delete this._ambigZone,e.fn.utc.apply(this,arguments)},N.prototype.format=function(){return arguments[0]?V(this,arguments[0]):this._ambigTime?A(this,"YYYY-MM-DD"):this._ambigZone?A(this,"YYYY-MM-DD[T]HH:mm:ss"):A(this)},N.prototype.toISOString=function(){return this._ambigTime?A(this,"YYYY-MM-DD"):this._ambigZone?A(this,"YYYY-MM-DD[T]HH:mm:ss"):e.fn.toISOString.apply(this,arguments)},N.prototype.isWithin=function(t,e){var i=Y([this,t,e]);return i[0]>=i[1]&&i[0]').addClass(i.className||"").css({top:0,left:0}).append(i.content).appendTo(i.parentEl),this.el.on("click",".fc-close",function(){e.hide()}),i.autoHide&&t(document).on("mousedown",this.documentMousedownProxy=t.proxy(this,"documentMousedown"))},documentMousedown:function(e){this.el&&!t(e.target).closest(this.el).length&&this.hide()},destroy:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),t(document).off("mousedown",this.documentMousedownProxy)},position:function(){var e,i,n,r,o,s=this.options,l=this.el.offsetParent().offset(),a=this.el.outerWidth(),c=this.el.outerHeight(),d=t(window),h=y(this.el);r=s.top||0,o=void 0!==s.left?s.left:void 0!==s.right?s.right-a:0,h.is(window)||h.is(document)?(h=d,e=0,i=0):(n=h.offset(),e=n.top,i=n.left),e+=d.scrollTop(),i+=d.scrollLeft(),s.viewportConstrain!==!1&&(r=Math.min(r,e+h.outerHeight()-c-this.margin),r=Math.max(r,e+this.margin),o=Math.min(o,i+h.outerWidth()-a-this.margin),o=Math.max(o,i+this.margin)),this.el.css({top:r-l.top,left:o-l.left})},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))}},X.prototype={grid:null,rows:null,cols:null,containerEl:null,minX:null,maxX:null,minY:null,maxY:null,build:function(){this.grid.buildCoords(this.rows=[],this.cols=[]),this.computeBounds()},getCell:function(t,e){var i,n=null,r=this.rows,o=this.cols,s=-1,l=-1;if(this.inBounds(t,e)){for(i=0;r.length>i;i++)if(e>=r[i][0]&&r[i][1]>e){s=i;break}for(i=0;o.length>i;i++)if(t>=o[i][0]&&o[i][1]>t){l=i;break}s>=0&&l>=0&&(n={row:s,col:l},n.grid=this.grid,n.date=this.grid.getCellDate(n))}return n},computeBounds:function(){var t;this.containerEl&&(t=this.containerEl.offset(),this.minX=t.left,this.maxX=t.left+this.containerEl.outerWidth(),this.minY=t.top,this.maxY=t.top+this.containerEl.outerHeight())},inBounds:function(t,e){return this.containerEl?t>=this.minX&&this.maxX>t&&e>=this.minY&&this.maxY>e:!0}},$.prototype={coordMaps:null,build:function(){var t,e=this.coordMaps;for(t=0;e.length>t;t++)e[t].build()},getCell:function(t,e){var i,n=this.coordMaps,r=null;for(i=0;n.length>i&&!r;i++)r=n[i].getCell(t,e);return r}},q.prototype={coordMap:null,options:null,isListening:!1,isDragging:!1,origCell:null,origDate:null,cell:null,date:null,mouseX0:null,mouseY0:null,mousemoveProxy:null,mouseupProxy:null,scrollEl:null,scrollBounds:null,scrollTopVel:null,scrollLeftVel:null,scrollIntervalId:null,scrollHandlerProxy:null,scrollSensitivity:30,scrollSpeed:200,scrollIntervalMs:50,mousedown:function(t){E(t)&&(t.preventDefault(),this.startListening(t),this.options.distance||this.startDrag(t))},startListening:function(e){var i,n;this.isListening||(e&&this.options.scroll&&(i=y(t(e.target)),i.is(window)||i.is(document)||(this.scrollEl=i,this.scrollHandlerProxy=L(t.proxy(this,"scrollHandler"),100),this.scrollEl.on("scroll",this.scrollHandlerProxy))),this.computeCoords(),e&&(n=this.getCell(e),this.origCell=n,this.origDate=n?n.date:null,this.mouseX0=e.pageX,this.mouseY0=e.pageY),t(document).on("mousemove",this.mousemoveProxy=t.proxy(this,"mousemove")).on("mouseup",this.mouseupProxy=t.proxy(this,"mouseup")).on("selectstart",this.preventDefault),this.isListening=!0,this.trigger("listenStart",e))},computeCoords:function(){this.coordMap.build(),this.computeScrollBounds()},mousemove:function(t){var e,i;this.isDragging||(e=this.options.distance||1,i=Math.pow(t.pageX-this.mouseX0,2)+Math.pow(t.pageY-this.mouseY0,2),i>=e*e&&this.startDrag(t)),this.isDragging&&this.drag(t) +},startDrag:function(t){var e;this.isListening||this.startListening(),this.isDragging||(this.isDragging=!0,this.trigger("dragStart",t),e=this.getCell(t),e&&this.cellOver(e,!0))},drag:function(t){var e;this.isDragging&&(e=this.getCell(t),U(e,this.cell)||(this.cell&&this.cellOut(),e&&this.cellOver(e)),this.dragScroll(t))},cellOver:function(t){this.cell=t,this.date=t.date,this.trigger("cellOver",t,t.date)},cellOut:function(){this.cell&&(this.trigger("cellOut",this.cell),this.cell=null,this.date=null)},mouseup:function(t){this.stopDrag(t),this.stopListening(t)},stopDrag:function(t){this.isDragging&&(this.stopScrolling(),this.trigger("dragStop",t),this.isDragging=!1)},stopListening:function(e){this.isListening&&(this.scrollEl&&(this.scrollEl.off("scroll",this.scrollHandlerProxy),this.scrollHandlerProxy=null),t(document).off("mousemove",this.mousemoveProxy).off("mouseup",this.mouseupProxy).off("selectstart",this.preventDefault),this.mousemoveProxy=null,this.mouseupProxy=null,this.isListening=!1,this.trigger("listenStop",e),this.origCell=this.cell=null,this.origDate=this.date=null)},getCell:function(t){return this.coordMap.getCell(t.pageX,t.pageY)},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))},preventDefault:function(t){t.preventDefault()},computeScrollBounds:function(){var t,e=this.scrollEl;e&&(t=e.offset(),this.scrollBounds={top:t.top,left:t.left,bottom:t.top+e.outerHeight(),right:t.left+e.outerWidth()})},dragScroll:function(t){var e,i,n,r,o=this.scrollSensitivity,s=this.scrollBounds,l=0,a=0;s&&(e=(o-(t.pageY-s.top))/o,i=(o-(s.bottom-t.pageY))/o,n=(o-(t.pageX-s.left))/o,r=(o-(s.right-t.pageX))/o,e>=0&&1>=e?l=-1*e*this.scrollSpeed:i>=0&&1>=i&&(l=i*this.scrollSpeed),n>=0&&1>=n?a=-1*n*this.scrollSpeed:r>=0&&1>=r&&(a=r*this.scrollSpeed)),this.setScrollVel(l,a)},setScrollVel:function(e,i){this.scrollTopVel=e,this.scrollLeftVel=i,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(t.proxy(this,"scrollIntervalFunc"),this.scrollIntervalMs))},constrainScrollVel:function(){var t=this.scrollEl;0>this.scrollTopVel?0>=t.scrollTop()&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),0>this.scrollLeftVel?0>=t.scrollLeft()&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},scrollIntervalFunc:function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.stopScrolling()},stopScrolling:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.computeCoords())},scrollHandler:function(){this.scrollIntervalId||this.computeCoords()}},K.prototype={options:null,sourceEl:null,el:null,parentEl:null,top0:null,left0:null,mouseY0:null,mouseX0:null,topDelta:null,leftDelta:null,mousemoveProxy:null,isFollowing:!1,isHidden:!1,isAnimating:!1,start:function(e){this.isFollowing||(this.isFollowing=!0,this.mouseY0=e.pageY,this.mouseX0=e.pageX,this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),t(document).on("mousemove",this.mousemoveProxy=t.proxy(this,"mousemove")))},stop:function(e,i){function n(){this.isAnimating=!1,r.destroyEl(),this.top0=this.left0=null,i&&i()}var r=this,o=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,t(document).off("mousemove",this.mousemoveProxy),e&&o&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:o,complete:n})):n())},getEl:function(){var t=this.el;return t||(this.sourceEl.width(),t=this.el=this.sourceEl.clone().css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}).appendTo(this.parentEl)),t},destroyEl:function(){this.el&&(this.el.remove(),this.el=null)},updatePosition:function(){var t,e;this.getEl(),null===this.top0&&(this.sourceEl.width(),t=this.sourceEl.offset(),e=this.el.offsetParent().offset(),this.top0=t.top-e.top,this.left0=t.left-e.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},mousemove:function(t){this.topDelta=t.pageY-this.mouseY0,this.leftDelta=t.pageX-this.mouseX0,this.isHidden||this.updatePosition()},hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}},Q.prototype={view:null,cellHtml:"
",rowHtml:function(t,e){var i,n,r=this.view,o=this.getHtmlRenderer("cell",t),s="";for(e=e||0,i=0;r.colCnt>i;i++)n=r.cellToDate(e,i),s+=o(e,i,n);return s=this.bookendCells(s,t,e),"
"+""+this.rowHtml("head")+""+"
"+"
"},headCellHtml:function(t,e,i){var n=this.view,r=n.calendar,o=n.opt("columnFormat");return''+R(r.formatDate(i,o))+""},bgCellHtml:function(t,e,i){var n=this.view,r=this.getDayClasses(i);return r.unshift("fc-day",n.widgetContentClass),''},getDayClasses:function(t){var e=this.view,i=e.calendar.getNow().stripTime(),n=["fc-"+Re[t.day()]];return"month"===e.name&&t.month()!=e.intervalStart.month()&&n.push("fc-other-month"),t.isSame(i,"day")?n.push("fc-today",e.highlightStateClass):i>t?n.push("fc-past"):n.push("fc-future"),n}}),t.extend(J.prototype,{mousedOverSeg:null,isDraggingSeg:!1,isResizingSeg:!1,renderEvents:function(){},getSegs:function(){},destroyEvents:function(){this.triggerSegMouseout()},renderSegs:function(e,i){var n,r=this.view,o="",s=[];for(n=0;e.length>n;n++)o+=this.renderSegHtml(e[n],i);return t(o).each(function(i,n){var o=e[i],l=r.resolveEventEl(o.event,t(n));l&&(l.data("fc-seg",o),o.el=l,s.push(o))}),s},renderSegHtml:function(){},eventsToSegs:function(e,i,n){var r=this;return t.map(e,function(t){return r.eventToSegs(t,i,n)})},eventToSegs:function(t,e,i){var n,r,o,s=t.start.clone().stripZone(),l=this.view.calendar.getEventEnd(t).stripZone();for(e&&i?(o=b(s,l,e,i),n=o?[o]:[]):n=this.rangeToSegs(s,l),r=0;n.length>r;r++)o=n[r],o.event=t,o.eventStartMS=+s,o.eventDurationMS=l-s;return n},bindSegHandlers:function(){var e=this,i=this.view;t.each({mouseenter:function(t,i){e.triggerSegMouseover(t,i)},mouseleave:function(t,i){e.triggerSegMouseout(t,i)},click:function(t,e){return i.trigger("eventClick",this,t.event,e)},mousedown:function(n,r){t(r.target).is(".fc-resizer")&&i.isEventResizable(n.event)?e.segResizeMousedown(n,r):i.isEventDraggable(n.event)&&e.segDragMousedown(n,r)}},function(i,n){e.el.on(i,".fc-event-container > *",function(i){var r=t(this).data("fc-seg");return!r||e.isDraggingSeg||e.isResizingSeg?void 0:n.call(this,r,i)})})},triggerSegMouseover:function(t,e){this.mousedOverSeg||(this.mousedOverSeg=t,this.view.trigger("eventMouseover",t.el[0],t.event,e))},triggerSegMouseout:function(t,e){e=e||{},this.mousedOverSeg&&(t=t||this.mousedOverSeg,this.mousedOverSeg=null,this.view.trigger("eventMouseout",t.el[0],t.event,e))},segDragMousedown:function(t,e){var i,n,r=this,o=this.view,s=t.el,l=t.event,a=new K(t.el,{parentEl:o.el,opacity:o.opt("dragOpacity"),revertDuration:o.opt("dragRevertDuration"),zIndex:2}),c=new q(o.coordMap,{distance:5,scroll:o.opt("dragScroll"),listenStart:function(t){a.hide(),a.start(t)},dragStart:function(e){r.triggerSegMouseout(t,e),r.isDraggingSeg=!0,o.hideEvent(l),o.trigger("eventDragStart",s[0],l,e,{})},cellOver:function(e,s){var l=t.cellDate||c.origDate,d=r.computeDraggedEventDates(t,l,s);i=d.start,n=d.end,o.renderDrag(i,n,t)?a.hide():a.show()},cellOut:function(){i=null,o.destroyDrag(),a.show()},dragStop:function(t){var e=i&&!i.isSame(l.start);a.stop(!e,function(){r.isDraggingSeg=!1,o.destroyDrag(),o.showEvent(l),o.trigger("eventDragStop",s[0],l,t,{}),e&&o.eventDrop(s[0],l,i,t)})},listenStop:function(){a.stop()}});c.mousedown(e)},computeDraggedEventDates:function(t,e,i){var n,r,o,s=this.view,l=t.event,a=l.start,c=s.calendar.getEventEnd(l);return i.hasTime()===e.hasTime()?(n=D(i,e),r=a.clone().add(n),o=null===l.end?null:c.clone().add(n)):(r=i,o=null),{start:r,end:o}},segResizeMousedown:function(t,e){function i(){r.destroyResize(),o.showEvent(l)}var n,r=this,o=this.view,s=t.el,l=t.event,a=l.start,c=o.calendar.getEventEnd(l),d=null;n=new q(this.coordMap,{distance:5,scroll:o.opt("dragScroll"),dragStart:function(e){r.triggerSegMouseout(t,e),r.isResizingSeg=!0,o.trigger("eventResizeStart",s[0],l,e,{})},cellOver:function(e,n){n.isBefore(a)&&(n=a),d=n.clone().add(r.cellDuration),d.isSame(c)?(d=null,i()):(r.renderResize(a,d,t),o.hideEvent(l))},cellOut:function(){d=null,i()},dragStop:function(t){r.isResizingSeg=!1,i(),o.trigger("eventResizeStop",s[0],l,t,{}),d&&o.eventResize(s[0],l,d,t)}}),n.mousedown(e)},getSegClasses:function(t,e,i){var n=t.event,r=["fc-event",t.isStart?"fc-start":"fc-not-start",t.isEnd?"fc-end":"fc-not-end"].concat(n.className,n.source?n.source.className:[]);return e&&r.push("fc-draggable"),i&&r.push("fc-resizable"),r},getEventSkinCss:function(t){var e=this.view,i=t.source||{},n=t.color,r=i.color,o=e.opt("eventColor"),s=t.backgroundColor||n||i.backgroundColor||r||e.opt("eventBackgroundColor")||o,l=t.borderColor||n||i.borderColor||r||e.opt("eventBorderColor")||o,a=t.textColor||i.textColor||e.opt("eventTextColor"),c=[];return s&&c.push("background-color:"+s),l&&c.push("border-color:"+l),a&&c.push("color:"+a),c.join(";")}}),ee.prototype=H(J.prototype),t.extend(ee.prototype,{numbersVisible:!1,cellDuration:e.duration({days:1}),bottomCoordPadding:0,rowEls:null,dayEls:null,helperEls:null,highlightEls:null,render:function(e){var i,n=this.view,r="";for(i=0;n.rowCnt>i;i++)r+=this.dayRowHtml(i,e);this.el.html(r),this.rowEls=this.el.find(".fc-row"),this.dayEls=this.el.find(".fc-day"),this.dayEls.each(function(e,i){var r=n.cellToDate(Math.floor(e/n.colCnt),e%n.colCnt);n.trigger("dayRender",null,r,t(i))}),J.prototype.render.call(this)},destroy:function(){this.destroySegPopover()},dayRowHtml:function(t,e){var i=this.view,n=["fc-row","fc-week",i.widgetContentClass];return e&&n.push("fc-rigid"),'
'+'
'+""+this.rowHtml("day",t)+"
"+"
"+'
'+""+(this.numbersVisible?""+this.rowHtml("number",t)+"":"")+"
"+"
"+"
"},dayCellHtml:function(t,e,i){return this.bgCellHtml(t,e,i)},buildCoords:function(e,i){var n,r,o,s=this.view.colCnt;this.dayEls.slice(0,s).each(function(e,s){n=t(s),r=n.offset().left,e&&(o[1]=r),o=[r],i[e]=o}),o[1]=r+n.outerWidth(),this.rowEls.each(function(i,s){n=t(s),r=n.offset().top,i&&(o[1]=r),o=[r],e[i]=o}),o[1]=r+n.outerHeight()+this.bottomCoordPadding},getCellDate:function(t){return this.view.cellToDate(t)},getCellDayEl:function(t){return this.dayEls.eq(t.row*this.view.colCnt+t.col)},rangeToSegs:function(t,e){return this.view.rangeToSegments(t,e)},renderDrag:function(t,e,i){var n;return this.renderHighlight(t,e||this.view.calendar.getDefaultEventEnd(!0,t)),i&&!i.el.closest(this.el).length?(this.renderRangeHelper(t,e,i),n=this.view.opt("dragOpacity"),void 0!==n&&this.helperEls.css("opacity",n),!0):void 0},destroyDrag:function(){this.destroyHighlight(),this.destroyHelper()},renderResize:function(t,e,i){this.renderHighlight(t,e),this.renderRangeHelper(t,e,i)},destroyResize:function(){this.destroyHighlight(),this.destroyHelper()},renderHelper:function(e,i){var n=[],r=this.renderEventRows([e]);this.rowEls.each(function(e,o){var s,l=t(o),a=t('
');s=i&&i.row===e?i.el.position().top:l.find(".fc-content-skeleton tbody").position().top,a.css("top",s).find("table").append(r[e].tbodyEl),l.append(a),n.push(a[0])}),this.helperEls=t(n)},destroyHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},renderHighlight:function(e,i){var n,r,o,s=this.rangeToSegs(e,i),l=[];for(n=0;s.length>n;n++)r=s[n],o=t(this.highlightSkeletonHtml(r.leftCol,r.rightCol+1)),o.appendTo(this.rowEls[r.row]),l.push(o[0]);this.highlightEls=t(l)},destroyHighlight:function(){this.highlightEls&&(this.highlightEls.remove(),this.highlightEls=null)},highlightSkeletonHtml:function(t,e){var i=this.view.colCnt,n="";return t>0&&(n+='"),m=[],v=[],y=[];for(r=0;g>r;r++){if(o=f[r],s=0,l=t(""),m.push([]),v.push([]),y.push([]),o)for(a=0;o.length>a;a++){for(c=o[a],n(c.leftCol),d=t('",l+=""+(s?"":n)+'",c.add(this.slotDuration);return l},processOptions:function(){var t=this.view,i=t.opt("slotDuration"),n=t.opt("snapDuration");i=e.duration(i),n=n?e.duration(n):i,this.slotDuration=i,this.snapDuration=n,this.cellDuration=n,this.minTime=e.duration(t.opt("minTime")),this.maxTime=e.duration(t.opt("maxTime"))},rangeToSegs:function(t,e){var i,n,r,o,s,l=this.view,a=[];for(t=t.clone().stripZone(),e=e.clone().stripZone(),n=0;l.colCnt>n;n++)r=l.cellToDate(0,n),o=r.clone().time(this.minTime),s=r.clone().time(this.maxTime),i=b(t,e,o,s),i&&(i.col=n,a.push(i));return a},resize:function(){this.computeSlatTops(),this.updateSegVerticals()},buildCoords:function(i,n){var r,o,s=this.view.colCnt,l=this.el.offset().top,a=e.duration(+this.minTime),c=null;for(this.dayEls.slice(0,s).each(function(e,i){r=t(i),o=r.offset().left,c&&(c[1]=o),c=[o],n[e]=c}),c[1]=o+r.outerWidth(),c=null;this.maxTime>a;)o=l+this.computeTimeTop(a),c&&(c[1]=o),c=[o],i.push(c),a.add(this.snapDuration);c[1]=l+this.computeTimeTop(a)},getCellDate:function(t){var e=this.view,i=e.calendar;return i.rezoneDate(e.cellToDate(0,t.col).time(this.minTime+this.snapDuration*t.row))},getCellDayEl:function(t){return this.dayEls.eq(t.col)},computeDateTop:function(t,i){return this.computeTimeTop(e.duration(t.clone().stripZone()-i.clone().stripTime()))},computeTimeTop:function(t){var e,i,n,r,o=(t-this.minTime)/this.slotDuration;return o=Math.max(0,o),o=Math.min(this.slatEls.length,o),e=Math.floor(o),i=o-e,n=this.slatTops[e],i?(r=this.slatTops[e+1],n+(r-n)*i):n},computeSlatTops:function(){var e,i=[];this.slatEls.each(function(n,r){e=t(r).position().top,i.push(e)}),i.push(e+this.slatEls.last().outerHeight()),this.slatTops=i},renderDrag:function(t,e,i){var n;return i?(this.renderRangeHelper(t,e,i),n=this.view.opt("dragOpacity"),void 0!==n&&this.helperEl.css("opacity",n),!0):(this.renderHighlight(t,e||this.view.calendar.getDefaultEventEnd(!1,t)),void 0)},destroyDrag:function(){this.destroyHelper(),this.destroyHighlight()},renderResize:function(t,e,i){this.renderRangeHelper(t,e,i)},destroyResize:function(){this.destroyHelper()},renderHelper:function(e,i){var n,r,o,s=this.renderEventTable([e]),l=s.tableEl,a=s.segs;for(n=0;a.length>n;n++)r=a[n],i&&i.col===r.col&&(o=i.el,r.el.css({left:o.css("left"),right:o.css("right"),"margin-left":o.css("margin-left"),"margin-right":o.css("margin-right")}));this.helperEl=t('
').append(l).appendTo(this.el)},destroyHelper:function(){this.helperEl&&(this.helperEl.remove(),this.helperEl=null)},renderSelection:function(t,e){this.view.opt("selectHelper")?this.renderRangeHelper(t,e):this.renderHighlight(t,e)},destroySelection:function(){this.destroyHelper(),this.destroyHighlight()},renderHighlight:function(e,i){this.highlightEl=t(this.highlightSkeletonHtml(e,i)).appendTo(this.el)},destroyHighlight:function(){this.highlightEl&&(this.highlightEl.remove(),this.highlightEl=null)},highlightSkeletonHtml:function(t,e){var i,n,r,o,s,l=this.view,a=this.rangeToSegs(t,e),c="",d=0;for(i=0;a.length>i;i++)n=a[i],n.col>d&&(c+='
",d++;return l.colCnt>d&&(c+='":void 0},numberIntroHtml:function(t){return this.weekNumbersVisible?'":void 0},dayIntroHtml:function(){return this.weekNumbersVisible?'":void 0},introHtml:function(){return this.weekNumbersVisible?'":void 0},numberCellHtml:function(t,e,i){var n;return this.dayNumbersVisible?(n=this.dayGrid.getDayClasses(i),n.unshift("fc-day-number"),'"):""):'"},dayIntroHtml:function(){return'"},slotBgIntroHtml:function(){return'"},introHtml:function(){return'"},axisStyleAttr:function(){return null!==this.axisWidth?'style="width:'+this.axisWidth+'px"':""},updateSize:function(t){t&&this.timeGrid.resize(),fe.prototype.updateSize.call(this,t)},updateWidth:function(){this.axisWidth=p(this.el.find(".fc-axis"))},setHeight:function(t,e){var i,n;null===this.bottomRuleHeight&&(this.bottomRuleHeight=this.bottomRuleEl.outerHeight()),this.bottomRuleEl.hide(),this.scrollerEl.css("overflow",""),v(this.scrollerEl),u(this.noScrollRowEls),this.dayGrid&&(this.dayGrid.destroySegPopover(),i=this.opt("eventLimit"),i&&"number"!=typeof i&&(i=Ye),i&&this.dayGrid.limitRows(i)),e||(n=this.computeScrollerHeight(t),m(this.scrollerEl,n)?(h(this.noScrollRowEls,w(this.scrollerEl)),n=this.computeScrollerHeight(t),this.scrollerEl.height(n),this.restoreScroll()):(this.scrollerEl.height(n).css("overflow","hidden"),this.bottomRuleEl.show()))},resetScroll:function(){function t(){i.scrollerEl.scrollTop(r)}var i=this,n=e.duration(this.opt("scrollTime")),r=this.timeGrid.computeTimeTop(n);r=Math.ceil(r),r&&r++,t(),setTimeout(t,0)},renderEvents:function(t){var e,i,n=[],r=[],o=[];for(i=0;t.length>i;i++)t[i].allDay?n.push(t[i]):r.push(t[i]);e=this.timeGrid.renderEvents(r),this.dayGrid&&(o=this.dayGrid.renderEvents(n)),this.updateHeight(),fe.prototype.renderEvents.call(this,t)},getSegs:function(){return this.timeGrid.getSegs().concat(this.dayGrid?this.dayGrid.getSegs():[])},destroyEvents:function(){fe.prototype.destroyEvents.call(this),this.recordScroll(),this.timeGrid.destroyEvents(),this.dayGrid&&this.dayGrid.destroyEvents()},renderDrag:function(t,e,i){return t.hasTime()?this.timeGrid.renderDrag(t,e,i):this.dayGrid?this.dayGrid.renderDrag(t,e,i):void 0},destroyDrag:function(){this.timeGrid.destroyDrag(),this.dayGrid&&this.dayGrid.destroyDrag()},renderSelection:function(t,e){t.hasTime()||e.hasTime()?this.timeGrid.renderSelection(t,e):this.dayGrid&&this.dayGrid.renderSelection(t,e)},destroySelection:function(){this.timeGrid.destroySelection(),this.dayGrid&&this.dayGrid.destroySelection()}}),xe.agendaWeek=be,be.prototype=H(Ee.prototype),t.extend(be.prototype,{name:"agendaWeek",incrementDate:function(t,e){return t.clone().stripTime().add(e,"weeks").startOf("week")},render:function(t){this.intervalStart=t.clone().stripTime().startOf("week"),this.intervalEnd=this.intervalStart.clone().add(1,"weeks"),this.start=this.skipHiddenDays(this.intervalStart),this.end=this.skipHiddenDays(this.intervalEnd,-1,!0),this.title=this.calendar.formatRange(this.start,this.end.clone().subtract(1),this.opt("titleFormat")," — "),Ee.prototype.render.call(this,this.getCellsPerWeek())}}),xe.agendaDay=Se,Se.prototype=H(Ee.prototype),t.extend(Se.prototype,{name:"agendaDay",incrementDate:function(t,e){var i=t.clone().stripTime().add(e,"days");return i=this.skipHiddenDays(i,0>e?-1:1)},render:function(t){this.start=this.intervalStart=t.clone().stripTime(),this.end=this.intervalEnd=this.start.clone().add(1,"days"),this.title=this.calendar.formatDate(this.start,this.opt("titleFormat")),Ee.prototype.render.call(this,1)}})}); \ No newline at end of file diff --git a/dist/fullcalendar.print.css b/dist/fullcalendar.print.css index c276fe3..dc073b7 100644 --- a/dist/fullcalendar.print.css +++ b/dist/fullcalendar.print.css @@ -1,201 +1,201 @@ -/*! - * FullCalendar v2.1.1 Print Stylesheet - * Docs & License: http://arshaw.com/fullcalendar/ - * (c) 2013 Adam Shaw - */ - -/* - * Include this stylesheet on your page to get a more printer-friendly calendar. - * When including this stylesheet, use the media='print' attribute of the tag. - * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css. - */ - -.fc { - max-width: 100% !important; -} - - -/* Global Event Restyling ---------------------------------------------------------------------------------------------------*/ - -.fc-event { - background: #fff !important; - color: #000 !important; - page-break-inside: avoid; -} - -.fc-event .fc-resizer { - display: none; -} - - -/* Table & Day-Row Restyling ---------------------------------------------------------------------------------------------------*/ - -th, -td, -hr, -thead, -tbody, -.fc-row { - border-color: #ccc !important; - background: #fff !important; -} - -/* kill the overlaid, absolutely-positioned common components */ -.fc-bg, -.fc-highlight-skeleton, -.fc-helper-skeleton { - display: none; -} - -/* don't force a min-height on rows (for DayGrid) */ -.fc tbody .fc-row { - height: auto !important; /* undo height that JS set in distributeHeight */ - min-height: 0 !important; /* undo the min-height from each view's specific stylesheet */ -} - -.fc tbody .fc-row .fc-content-skeleton { - position: static; /* undo .fc-rigid */ - padding-bottom: 0 !important; /* use a more border-friendly method for this... */ -} - -.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td { /* only works in newer browsers */ - padding-bottom: 1em; /* ...gives space within the skeleton. also ensures min height in a way */ -} - -.fc tbody .fc-row .fc-content-skeleton table { - /* provides a min-height for the row, but only effective for IE, which exaggerates this value, - making it look more like 3em. for other browers, it will already be this tall */ - height: 1em; -} - - -/* Undo month-view event limiting. Display all events and hide the "more" links ---------------------------------------------------------------------------------------------------*/ - -.fc-more-cell, -.fc-more { - display: none !important; -} - -.fc tr.fc-limited { - display: table-row !important; -} - -.fc td.fc-limited { - display: table-cell !important; -} - -.fc-popover { - display: none; /* never display the "more.." popover in print mode */ -} - - -/* TimeGrid Restyling ---------------------------------------------------------------------------------------------------*/ - -/* undo the min-height 100% trick used to fill the container's height */ -.fc-time-grid { - min-height: 0 !important; -} - -/* don't display the side axis at all ("all-day" and time cells) */ -.fc-agenda-view .fc-axis { - display: none; -} - -/* don't display the horizontal lines */ -.fc-slats, -.fc-time-grid hr { /* this hr is used when height is underused and needs to be filled */ - display: none !important; /* important overrides inline declaration */ -} - -/* let the container that holds the events be naturally positioned and create real height */ -.fc-time-grid .fc-content-skeleton { - position: static; -} - -/* in case there are no events, we still want some height */ -.fc-time-grid .fc-content-skeleton table { - height: 4em; -} - -/* kill the horizontal spacing made by the event container. event margins will be done below */ -.fc-time-grid .fc-event-container { - margin: 0 !important; -} - - -/* TimeGrid *Event* Restyling ---------------------------------------------------------------------------------------------------*/ - -/* naturally position events, vertically stacking them */ -.fc-time-grid .fc-event { - position: static !important; - margin: 3px 2px !important; -} - -/* for events that continue to a future day, give the bottom border back */ -.fc-time-grid .fc-event.fc-not-end { - border-bottom-width: 1px !important; -} - -/* indicate the event continues via "..." text */ -.fc-time-grid .fc-event.fc-not-end:after { - content: "..."; -} - -/* for events that are continuations from previous days, give the top border back */ -.fc-time-grid .fc-event.fc-not-start { - border-top-width: 1px !important; -} - -/* indicate the event is a continuation via "..." text */ -.fc-time-grid .fc-event.fc-not-start:before { - content: "..."; -} - -/* time */ - -/* undo a previous declaration and let the time text span to a second line */ -.fc-time-grid .fc-event .fc-time { - white-space: normal !important; -} - -/* hide the the time that is normally displayed... */ -.fc-time-grid .fc-event .fc-time span { - display: none; -} - -/* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */ -.fc-time-grid .fc-event .fc-time:after { - content: attr(data-full); -} - - -/* Vertical Scroller & Containers ---------------------------------------------------------------------------------------------------*/ - -/* kill the scrollbars and allow natural height */ -.fc-scroller, -.fc-day-grid-container, /* these divs might be assigned height, which we need to cleared */ -.fc-time-grid-container { /* */ - overflow: visible !important; - height: auto !important; -} - -/* kill the horizontal border/padding used to compensate for scrollbars */ -.fc-row { - border: 0 !important; - margin: 0 !important; -} - - -/* Button Controls ---------------------------------------------------------------------------------------------------*/ - -.fc-button-group, -.fc button { - display: none; /* don't display any button-related controls */ -} +/*! + * FullCalendar v2.1.1 Print Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + +/* + * Include this stylesheet on your page to get a more printer-friendly calendar. + * When including this stylesheet, use the media='print' attribute of the tag. + * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css. + */ + +.fc { + max-width: 100% !important; +} + + +/* Global Event Restyling +--------------------------------------------------------------------------------------------------*/ + +.fc-event { + background: #fff !important; + color: #000 !important; + page-break-inside: avoid; +} + +.fc-event .fc-resizer { + display: none; +} + + +/* Table & Day-Row Restyling +--------------------------------------------------------------------------------------------------*/ + +th, +td, +hr, +thead, +tbody, +.fc-row { + border-color: #ccc !important; + background: #fff !important; +} + +/* kill the overlaid, absolutely-positioned common components */ +.fc-bg, +.fc-highlight-skeleton, +.fc-helper-skeleton { + display: none; +} + +/* don't force a min-height on rows (for DayGrid) */ +.fc tbody .fc-row { + height: auto !important; /* undo height that JS set in distributeHeight */ + min-height: 0 !important; /* undo the min-height from each view's specific stylesheet */ +} + +.fc tbody .fc-row .fc-content-skeleton { + position: static; /* undo .fc-rigid */ + padding-bottom: 0 !important; /* use a more border-friendly method for this... */ +} + +.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td { /* only works in newer browsers */ + padding-bottom: 1em; /* ...gives space within the skeleton. also ensures min height in a way */ +} + +.fc tbody .fc-row .fc-content-skeleton table { + /* provides a min-height for the row, but only effective for IE, which exaggerates this value, + making it look more like 3em. for other browers, it will already be this tall */ + height: 1em; +} + + +/* Undo month-view event limiting. Display all events and hide the "more" links +--------------------------------------------------------------------------------------------------*/ + +.fc-more-cell, +.fc-more { + display: none !important; +} + +.fc tr.fc-limited { + display: table-row !important; +} + +.fc td.fc-limited { + display: table-cell !important; +} + +.fc-popover { + display: none; /* never display the "more.." popover in print mode */ +} + + +/* TimeGrid Restyling +--------------------------------------------------------------------------------------------------*/ + +/* undo the min-height 100% trick used to fill the container's height */ +.fc-time-grid { + min-height: 0 !important; +} + +/* don't display the side axis at all ("all-day" and time cells) */ +.fc-agenda-view .fc-axis { + display: none; +} + +/* don't display the horizontal lines */ +.fc-slats, +.fc-time-grid hr { /* this hr is used when height is underused and needs to be filled */ + display: none !important; /* important overrides inline declaration */ +} + +/* let the container that holds the events be naturally positioned and create real height */ +.fc-time-grid .fc-content-skeleton { + position: static; +} + +/* in case there are no events, we still want some height */ +.fc-time-grid .fc-content-skeleton table { + height: 4em; +} + +/* kill the horizontal spacing made by the event container. event margins will be done below */ +.fc-time-grid .fc-event-container { + margin: 0 !important; +} + + +/* TimeGrid *Event* Restyling +--------------------------------------------------------------------------------------------------*/ + +/* naturally position events, vertically stacking them */ +.fc-time-grid .fc-event { + position: static !important; + margin: 3px 2px !important; +} + +/* for events that continue to a future day, give the bottom border back */ +.fc-time-grid .fc-event.fc-not-end { + border-bottom-width: 1px !important; +} + +/* indicate the event continues via "..." text */ +.fc-time-grid .fc-event.fc-not-end:after { + content: "..."; +} + +/* for events that are continuations from previous days, give the top border back */ +.fc-time-grid .fc-event.fc-not-start { + border-top-width: 1px !important; +} + +/* indicate the event is a continuation via "..." text */ +.fc-time-grid .fc-event.fc-not-start:before { + content: "..."; +} + +/* time */ + +/* undo a previous declaration and let the time text span to a second line */ +.fc-time-grid .fc-event .fc-time { + white-space: normal !important; +} + +/* hide the the time that is normally displayed... */ +.fc-time-grid .fc-event .fc-time span { + display: none; +} + +/* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */ +.fc-time-grid .fc-event .fc-time:after { + content: attr(data-full); +} + + +/* Vertical Scroller & Containers +--------------------------------------------------------------------------------------------------*/ + +/* kill the scrollbars and allow natural height */ +.fc-scroller, +.fc-day-grid-container, /* these divs might be assigned height, which we need to cleared */ +.fc-time-grid-container { /* */ + overflow: visible !important; + height: auto !important; +} + +/* kill the horizontal border/padding used to compensate for scrollbars */ +.fc-row { + border: 0 !important; + margin: 0 !important; +} + + +/* Button Controls +--------------------------------------------------------------------------------------------------*/ + +.fc-button-group, +.fc button { + display: none; /* don't display any button-related controls */ +} diff --git a/dist/gcal.js b/dist/gcal.js index c7f3b3b..754fb72 100644 --- a/dist/gcal.js +++ b/dist/gcal.js @@ -1,100 +1,100 @@ -/*! - * FullCalendar v2.1.1 Google Calendar Plugin - * Docs & License: http://arshaw.com/fullcalendar/ - * (c) 2013 Adam Shaw - */ - -(function(factory) { - if (typeof define === 'function' && define.amd) { - define([ 'jquery' ], factory); - } - else { - factory(jQuery); - } -})(function($) { - - -var fc = $.fullCalendar; -var applyAll = fc.applyAll; - - -fc.sourceNormalizers.push(function(sourceOptions) { - if (sourceOptions.dataType == 'gcal' || - sourceOptions.dataType === undefined && - (sourceOptions.url || '').match(/^(http|https):\/\/www.google.com\/calendar\/feeds\//)) { - sourceOptions.dataType = 'gcal'; - if (sourceOptions.editable === undefined) { - sourceOptions.editable = false; - } - } -}); - - -fc.sourceFetchers.push(function(sourceOptions, start, end, timezone) { - if (sourceOptions.dataType == 'gcal') { - return transformOptions(sourceOptions, start, end, timezone); - } -}); - - -function transformOptions(sourceOptions, start, end, timezone) { - - var success = sourceOptions.success; - var data = $.extend({}, sourceOptions.data || {}, { - singleevents: true, - 'max-results': 9999 - }); - - return $.extend({}, sourceOptions, { - url: sourceOptions.url.replace(/\/basic$/, '/full') + '?alt=json-in-script&callback=?', - dataType: 'jsonp', - data: data, - timezoneParam: 'ctz', - startParam: 'start-min', - endParam: 'start-max', - success: function(data) { - var events = []; - if (data.feed.entry) { - $.each(data.feed.entry, function(i, entry) { - - var url; - $.each(entry.link, function(i, link) { - if (link.type == 'text/html') { - url = link.href; - if (timezone && timezone != 'local') { - url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + encodeURIComponent(timezone); - } - } - }); - - events.push({ - id: entry.gCal$uid.value, - title: entry.title.$t, - start: entry.gd$when[0].startTime, - end: entry.gd$when[0].endTime, - url: url, - location: entry.gd$where[0].valueString, - description: entry.content.$t - }); - - }); - } - var args = [events].concat(Array.prototype.slice.call(arguments, 1)); - var res = applyAll(success, this, args); - if ($.isArray(res)) { - return res; - } - return events; - } - }); - -} - - -// legacy -fc.gcalFeed = function(url, sourceOptions) { - return $.extend({}, sourceOptions, { url: url, dataType: 'gcal' }); -}; - - -}); +/*! + * FullCalendar v2.1.1 Google Calendar Plugin + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + +(function(factory) { + if (typeof define === 'function' && define.amd) { + define([ 'jquery' ], factory); + } + else { + factory(jQuery); + } +})(function($) { + + +var fc = $.fullCalendar; +var applyAll = fc.applyAll; + + +fc.sourceNormalizers.push(function(sourceOptions) { + if (sourceOptions.dataType == 'gcal' || + sourceOptions.dataType === undefined && + (sourceOptions.url || '').match(/^(http|https):\/\/www.google.com\/calendar\/feeds\//)) { + sourceOptions.dataType = 'gcal'; + if (sourceOptions.editable === undefined) { + sourceOptions.editable = false; + } + } +}); + + +fc.sourceFetchers.push(function(sourceOptions, start, end, timezone) { + if (sourceOptions.dataType == 'gcal') { + return transformOptions(sourceOptions, start, end, timezone); + } +}); + + +function transformOptions(sourceOptions, start, end, timezone) { + + var success = sourceOptions.success; + var data = $.extend({}, sourceOptions.data || {}, { + singleevents: true, + 'max-results': 9999 + }); + + return $.extend({}, sourceOptions, { + url: sourceOptions.url.replace(/\/basic$/, '/full') + '?alt=json-in-script&callback=?', + dataType: 'jsonp', + data: data, + timezoneParam: 'ctz', + startParam: 'start-min', + endParam: 'start-max', + success: function(data) { + var events = []; + if (data.feed.entry) { + $.each(data.feed.entry, function(i, entry) { + + var url; + $.each(entry.link, function(i, link) { + if (link.type == 'text/html') { + url = link.href; + if (timezone && timezone != 'local') { + url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + encodeURIComponent(timezone); + } + } + }); + + events.push({ + id: entry.gCal$uid.value, + title: entry.title.$t, + start: entry.gd$when[0].startTime, + end: entry.gd$when[0].endTime, + url: url, + location: entry.gd$where[0].valueString, + description: entry.content.$t + }); + + }); + } + var args = [events].concat(Array.prototype.slice.call(arguments, 1)); + var res = applyAll(success, this, args); + if ($.isArray(res)) { + return res; + } + return events; + } + }); + +} + + +// legacy +fc.gcalFeed = function(url, sourceOptions) { + return $.extend({}, sourceOptions, { url: url, dataType: 'gcal' }); +}; + + +}); diff --git a/dist/lang-all.js b/dist/lang-all.js index c6e94e4..59b2f0f 100644 --- a/dist/lang-all.js +++ b/dist/lang-all.js @@ -1,3 +1,3 @@ -(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(function(){(t.defineLocale||t.lang).call(t,"ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("ar-ma","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ar-ma",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})})(),function(){var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};(t.defineLocale||t.lang).call(t,"ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(e){return 12>e?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return n[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("ar-sa","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ar-sa",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}(),function(){var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};(t.defineLocale||t.lang).call(t,"ar",{months:"يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),monthsShort:"يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(e){return 12>e?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return n[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("ar","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ar",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}(),function(){(t.defineLocale||t.lang).call(t,"bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinal:function(e){var t=e%10,a=e%100;return 0===e?e+"-ев":0===a?e+"-ен":a>10&&20>a?e+"-ти":1===t?e+"-ви":2===t?e+"-ри":7===t||8===t?e+"-ми":e+"-ти"},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("bg","bg",{closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("bg",{defaultButtonText:{month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("ca","ca",{closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ca",{defaultButtonText:{month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},allDayText:"Tot el dia",eventLimitText:"més"})}(),function(){function a(e){return e>1&&5>e&&1!==~~(e/10)}function n(e,t,n,r){var i=e+" ";switch(n){case"s":return t||r?"pár sekund":"pár sekundami";case"m":return t?"minuta":r?"minutu":"minutou";case"mm":return t||r?i+(a(e)?"minuty":"minut"):i+"minutami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(a(e)?"hodiny":"hodin"):i+"hodinami";case"d":return t||r?"den":"dnem";case"dd":return t||r?i+(a(e)?"dny":"dní"):i+"dny";case"M":return t||r?"měsíc":"měsícem";case"MM":return t||r?i+(a(e)?"měsíce":"měsíců"):i+"měsíci";case"y":return t||r?"rok":"rokem";case"yy":return t||r?i+(a(e)?"roky":"let"):i+"lety"}}var r="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),i="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");(t.defineLocale||t.lang).call(t,"cs",{months:r,monthsShort:i,monthsParse:function(e,t){var a,n=[];for(a=0;12>a;a++)n[a]=RegExp("^"+e[a]+"$|^"+t[a]+"$","i");return n}(r,i),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H.mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("cs","cs",{closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("cs",{defaultButtonText:{month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("da","da",{closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("da",{defaultButtonText:{month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"flere"})}(),function(){function a(e,t,a){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?n[a][0]:n[a][1]}(t.defineLocale||t.lang).call(t,"de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("de-at","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("de-at",{defaultButtonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e}})}(),function(){function a(e,t,a){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?n[a][0]:n[a][1]}(t.defineLocale||t.lang).call(t,"de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("de","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("de",{defaultButtonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(e,t){return/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(e,t,a){return e>11?a?"μμ":"ΜΜ":a?"πμ":"ΠΜ"},longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,t){var a=this._calendarEl[e],n=t&&t.hours();return"function"==typeof a&&(a=a.apply(t)),a.replace("{}",1===n%12?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinal:function(e){return e+"η"},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("el","el",{closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("el",{defaultButtonText:{month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},allDayText:"Ολοήμερο",eventLimitText:"περισσότερα"})}(),function(){(t.defineLocale||t.lang).call(t,"en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("en-au")}(),function(){(t.defineLocale||t.lang).call(t,"en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a}}),e.fullCalendar.lang("en-ca")}(),function(){(t.defineLocale||t.lang).call(t,"en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("en-gb",{columnFormat:{week:"ddd D/M"}})}(),function(){var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");(t.defineLocale||t.lang).call(t,"es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?n[e.month()]:a[e.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [del] YYYY",LLL:"D [de] MMMM [del] YYYY LT",LLLL:"dddd, D [de] MMMM [del] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("es","es",{closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("es",{defaultButtonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo
el día",eventLimitText:"más"})}(),function(){var a={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},n={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};(t.defineLocale||t.lang).call(t,"fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiem:function(e){return 12>e?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return n[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},ordinal:"%dم",week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("fa","fa",{closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دی","بهمن","اسفند"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fa",{defaultButtonText:{month:"ماه",week:"هفته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e}})}(),function(){function a(e,t,a,r){var i="";switch(a){case"s":return r?"muutaman sekunnin":"muutama sekunti";case"m":return r?"minuutin":"minuutti";case"mm":i=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":i=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":i=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":i=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":i=r?"vuoden":"vuotta"}return i=n(e,r)+" "+i}function n(e,t){return 10>e?t?i[e]:r[e]:e}var r="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),i=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",r[7],r[8],r[9]];(t.defineLocale||t.lang).call(t,"fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("fi","fi",{closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fi",{defaultButtonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää"})}(),function(){(t.defineLocale||t.lang).call(t,"fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return e+(1===e?"er":"") -}}),e.fullCalendar.datepickerLang("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fr-ca",{defaultButtonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
journée",eventLimitText:"en plus"})}(),function(){(t.defineLocale||t.lang).call(t,"fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return e+(1===e?"er":"")},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fr",{defaultButtonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
journée",eventLimitText:"en plus"})}(),function(){var a={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};(t.defineLocale||t.lang).call(t,"hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]})},meridiem:function(e){return 4>e?"रात":10>e?"सुबह":17>e?"दोपहर":20>e?"शाम":"रात"},week:{dow:0,doy:6}}),e.fullCalendar.datepickerLang("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("hi",{defaultButtonText:{month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e}})}(),function(){function a(e,t,a){var n=e+" ";switch(a){case"m":return t?"jedna minuta":"jedne minute";case"mm":return n+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return t?"jedan sat":"jednog sata";case"hh":return n+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return n+=1===e?"dan":"dana";case"MM":return n+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return n+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}(t.defineLocale||t.lang).call(t,"hr",{months:"sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:a,mm:a,h:a,hh:a,d:"dan",dd:a,M:"mjesec",MM:a,y:"godinu",yy:a},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("hr","hr",{closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("hr",{defaultButtonText:{month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e}})}(),function(){function a(e,t,a,n){var r=e;switch(a){case"s":return n||t?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(n||t?" perc":" perce");case"mm":return r+(n||t?" perc":" perce");case"h":return"egy"+(n||t?" óra":" órája");case"hh":return r+(n||t?" óra":" órája");case"d":return"egy"+(n||t?" nap":" napja");case"dd":return r+(n||t?" nap":" napja");case"M":return"egy"+(n||t?" hónap":" hónapja");case"MM":return r+(n||t?" hónap":" hónapja");case"y":return"egy"+(n||t?" év":" éve");case"yy":return r+(n||t?" év":" éve")}return""}function n(e){return(e?"":"[múlt] ")+"["+r[this.day()]+"] LT[-kor]"}var r="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");(t.defineLocale||t.lang).call(t,"hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiem:function(e,t,a){return 12>e?a===!0?"de":"DE":a===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return n.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return n.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.lang("hu",{defaultButtonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további"})}(),function(){(t.defineLocale||t.lang).call(t,"id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(e){return 11>e?"pagi":15>e?"siang":19>e?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("id","id",{closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("id",{defaultButtonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari
penuh",eventLimitText:"lebih"})}(),function(){function a(e){return 11===e%100?!0:1===e%10?!1:!0}function n(e,t,n,r){var i=e+" ";switch(n){case"s":return t||r?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return t?"mínúta":"mínútu";case"mm":return a(e)?i+(t||r?"mínútur":"mínútum"):t?i+"mínúta":i+"mínútu";case"hh":return a(e)?i+(t||r?"klukkustundir":"klukkustundum"):i+"klukkustund";case"d":return t?"dagur":r?"dag":"degi";case"dd":return a(e)?t?i+"dagar":i+(r?"daga":"dögum"):t?i+"dagur":i+(r?"dag":"degi");case"M":return t?"mánuður":r?"mánuð":"mánuði";case"MM":return a(e)?t?i+"mánuðir":i+(r?"mánuði":"mánuðum"):t?i+"mánuður":i+(r?"mánuð":"mánuði");case"y":return t||r?"ár":"ári";case"yy":return a(e)?i+(t||r?"ár":"árum"):i+(t||r?"ár":"ári")}}(t.defineLocale||t.lang).call(t,"is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("is","is",{closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("is",{defaultButtonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan
daginn",eventLimitText:"meira"})}(),function(){(t.defineLocale||t.lang).call(t,"it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:"[lo scorso] dddd [alle] LT",sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("it","it",{closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("it",{defaultButtonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il
giorno",eventLimitText:function(e){return"+altri "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日LT",LLLL:"YYYY年M月D日LT dddd"},meridiem:function(e){return 12>e?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}}),e.fullCalendar.datepickerLang("ja","ja",{closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),e.fullCalendar.lang("ja",{defaultButtonText:{month:"月",week:"週",day:"日",list:"予定リスト"},allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"}})}(),function(){(t.defineLocale||t.lang).call(t,"ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 mm분",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 LT",LLLL:"YYYY년 MMMM D일 dddd LT"},meridiem:function(e){return 12>e?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇초",ss:"%d초",m:"일분",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한달",MM:"%d달",y:"일년",yy:"%d년"},ordinal:"%d일",meridiemParse:/(오전|오후)/,isPM:function(e){return"오후"===e}}),e.fullCalendar.datepickerLang("ko","ko",{closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"}),e.fullCalendar.lang("ko",{defaultButtonText:{month:"월",week:"주",day:"일",list:"일정목록"},allDayText:"종일",eventLimitText:"개"})}(),function(){function a(e,t,a,n){return t?"kelios sekundės":n?"kelių sekundžių":"kelias sekundes"}function n(e,t,a,n){return t?i(a)[0]:n?i(a)[1]:i(a)[2]}function r(e){return 0===e%10||e>10&&20>e}function i(e){return d[e].split("_")}function s(e,t,a,s){var o=e+" ";return 1===e?o+n(e,t,a[0],s):t?o+(r(e)?i(a)[1]:i(a)[0]):s?o+i(a)[1]:o+(r(e)?i(a)[1]:i(a)[2])}function o(e,t){var a=-1===t.indexOf("dddd HH:mm"),n=l[e.day()];return a?n:n.substring(0,n.length-2)+"į"}var d={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"},l="sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_");(t.defineLocale||t.lang).call(t,"lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:o,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:a,m:n,mm:s,h:n,hh:s,d:n,dd:s,M:n,MM:s,y:n,yy:s},ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("lt","lt",{closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.lang("lt",{defaultButtonText:{month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},allDayText:"Visą dieną",eventLimitText:"daugiau"})}(),function(){function a(e,t,a){var n=e.split("_");return a?1===t%10&&11!==t?n[2]:n[3]:1===t%10&&11!==t?n[0]:n[1]}function n(e,t,n){return e+" "+a(r[n],e,t)}var r={mm:"minūti_minūtes_minūte_minūtes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mēnesi_mēnešus_mēnesis_mēneši",yy:"gadu_gadus_gads_gadi"};(t.defineLocale||t.lang).call(t,"lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vēlāk",past:"%s agrāk",s:"dažas sekundes",m:"minūti",mm:n,h:"stundu",hh:n,d:"dienu",dd:n,M:"mēnesi",MM:n,y:"gadu",yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("lv","lv",{closeText:"Aizvērt",prevText:"Iepr.",nextText:"Nāk.",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("lv",{defaultButtonText:{month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e}})}(),function(){var a="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");(t.defineLocale||t.lang).call(t,"nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?n[e.month()]:a[e.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("nl","nl",{closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("nl",{defaultButtonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra"})}(),function(){function a(e){return 5>e%10&&e%10>1&&1!==~~(e/10)%10}function n(e,t,n){var r=e+" ";switch(n){case"m":return t?"minuta":"minutę";case"mm":return r+(a(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return r+(a(e)?"godziny":"godzin");case"MM":return r+(a(e)?"miesiące":"miesięcy");case"yy":return r+(a(e)?"lata":"lat")}}var r="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),i="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");(t.defineLocale||t.lang).call(t,"pl",{months:function(e,t){return/D MMMM/.test(t)?i[e.month()]:r[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:n,mm:n,h:n,hh:n,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:n,y:"rok",yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pl","pl",{closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pl",{defaultButtonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej"})}(),function(){(t.defineLocale||t.lang).call(t,"pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº"}),e.fullCalendar.datepickerLang("pt-br","pt-BR",{closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pt-br",{defaultButtonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e}})}(),function(){(t.defineLocale||t.lang).call(t,"pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pt",{defaultButtonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais"})}(),function(){function a(e,t,a){var n={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},r=" ";return(e%100>=20||e>=100&&0===e%100)&&(r=" de "),e+r+n[a]}(t.defineLocale||t.lang).call(t,"ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:a,h:"o oră",hh:a,d:"o zi",dd:a,M:"o lună",MM:a,y:"un an",yy:a},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("ro","ro",{closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ro",{defaultButtonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(function(){(t.defineLocale||t.lang).call(t,"ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("ar-ma","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ar-ma",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})})(),function(){var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};(t.defineLocale||t.lang).call(t,"ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(e){return 12>e?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return n[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("ar-sa","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ar-sa",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}(),function(){var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},r=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&10>=e%100?3:e%100>=11?4:5},i={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},s=function(e){return function(t,a){var n=r(t),s=i[e][r(t)];return 2===n&&(s=s[a?0:1]),s.replace(/%d/i,t)}},o=["كانون الثاني يناير","شباط فبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوفمبر","كانون الأول ديسمبر"];(t.defineLocale||t.lang).call(t,"ar",{months:o,monthsShort:o,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(e){return 12>e?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:s("s"),m:s("m"),mm:s("m"),h:s("h"),hh:s("h"),d:s("d"),dd:s("d"),M:s("M"),MM:s("M"),y:s("y"),yy:s("y")},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return n[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("ar","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ar",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}(),function(){(t.defineLocale||t.lang).call(t,"bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinal:function(e){var t=e%10,a=e%100;return 0===e?e+"-ев":0===a?e+"-ен":a>10&&20>a?e+"-ти":1===t?e+"-ви":2===t?e+"-ри":7===t||8===t?e+"-ми":e+"-ти"},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("bg","bg",{closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("bg",{defaultButtonText:{month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("ca","ca",{closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ca",{defaultButtonText:{month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},allDayText:"Tot el dia",eventLimitText:"més"})}(),function(){function a(e){return e>1&&5>e&&1!==~~(e/10)}function n(e,t,n,r){var i=e+" ";switch(n){case"s":return t||r?"pár sekund":"pár sekundami";case"m":return t?"minuta":r?"minutu":"minutou";case"mm":return t||r?i+(a(e)?"minuty":"minut"):i+"minutami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(a(e)?"hodiny":"hodin"):i+"hodinami";case"d":return t||r?"den":"dnem";case"dd":return t||r?i+(a(e)?"dny":"dní"):i+"dny";case"M":return t||r?"měsíc":"měsícem";case"MM":return t||r?i+(a(e)?"měsíce":"měsíců"):i+"měsíci";case"y":return t||r?"rok":"rokem";case"yy":return t||r?i+(a(e)?"roky":"let"):i+"lety"}}var r="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),i="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");(t.defineLocale||t.lang).call(t,"cs",{months:r,monthsShort:i,monthsParse:function(e,t){var a,n=[];for(a=0;12>a;a++)n[a]=RegExp("^"+e[a]+"$|^"+t[a]+"$","i");return n}(r,i),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("cs","cs",{closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("cs",{defaultButtonText:{month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("da","da",{closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("da",{defaultButtonText:{month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"flere"})}(),function(){function a(e,t,a){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?n[a][0]:n[a][1]}(t.defineLocale||t.lang).call(t,"de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("de-at","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("de-at",{defaultButtonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e}})}(),function(){function a(e,t,a){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?n[a][0]:n[a][1]}(t.defineLocale||t.lang).call(t,"de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("de","de",{closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("de",{defaultButtonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(e,t){return/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(e,t,a){return e>11?a?"μμ":"ΜΜ":a?"πμ":"ΠΜ"},isPM:function(e){return"μ"===(e+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,t){var a=this._calendarEl[e],n=t&&t.hours();return"function"==typeof a&&(a=a.apply(t)),a.replace("{}",1===n%12?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinal:function(e){return e+"η"},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("el","el",{closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("el",{defaultButtonText:{month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},allDayText:"Ολοήμερο",eventLimitText:"περισσότερα"})}(),function(){(t.defineLocale||t.lang).call(t,"en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("en-au")}(),function(){(t.defineLocale||t.lang).call(t,"en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a}}),e.fullCalendar.lang("en-ca")}(),function(){(t.defineLocale||t.lang).call(t,"en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("en-gb",{columnFormat:{week:"ddd D/M"}})}(),function(){var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");(t.defineLocale||t.lang).call(t,"es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?n[e.month()]:a[e.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("es","es",{closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("es",{defaultButtonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo
el día",eventLimitText:"más"})}(),function(){var a={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},n={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};(t.defineLocale||t.lang).call(t,"fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiem:function(e){return 12>e?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return n[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},ordinal:"%dم",week:{dow:6,doy:12}}),e.fullCalendar.datepickerLang("fa","fa",{closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دی","بهمن","اسفند"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fa",{defaultButtonText:{month:"ماه",week:"هفته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e}})}(),function(){function a(e,t,a,r){var i="";switch(a){case"s":return r?"muutaman sekunnin":"muutama sekunti";case"m":return r?"minuutin":"minuutti";case"mm":i=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":i=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":i=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":i=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":i=r?"vuoden":"vuotta"}return i=n(e,r)+" "+i}function n(e,t){return 10>e?t?i[e]:r[e]:e}var r="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),i=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",r[7],r[8],r[9]];(t.defineLocale||t.lang).call(t,"fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("fi","fi",{closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fi",{defaultButtonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää"}) +}(),function(){(t.defineLocale||t.lang).call(t,"fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return e+(1===e?"er":"")}}),e.fullCalendar.datepickerLang("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fr-ca",{defaultButtonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
journée",eventLimitText:"en plus"})}(),function(){(t.defineLocale||t.lang).call(t,"fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return e+(1===e?"er":"")},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fr",{defaultButtonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la
journée",eventLimitText:"en plus"})}(),function(){var a={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};(t.defineLocale||t.lang).call(t,"hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]})},meridiem:function(e){return 4>e?"रात":10>e?"सुबह":17>e?"दोपहर":20>e?"शाम":"रात"},week:{dow:0,doy:6}}),e.fullCalendar.datepickerLang("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("hi",{defaultButtonText:{month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e}})}(),function(){function a(e,t,a){var n=e+" ";switch(a){case"m":return t?"jedna minuta":"jedne minute";case"mm":return n+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return t?"jedan sat":"jednog sata";case"hh":return n+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return n+=1===e?"dan":"dana";case"MM":return n+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return n+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}(t.defineLocale||t.lang).call(t,"hr",{months:"sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:a,mm:a,h:a,hh:a,d:"dan",dd:a,M:"mjesec",MM:a,y:"godinu",yy:a},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("hr","hr",{closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("hr",{defaultButtonText:{month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e}})}(),function(){function a(e,t,a,n){var r=e;switch(a){case"s":return n||t?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(n||t?" perc":" perce");case"mm":return r+(n||t?" perc":" perce");case"h":return"egy"+(n||t?" óra":" órája");case"hh":return r+(n||t?" óra":" órája");case"d":return"egy"+(n||t?" nap":" napja");case"dd":return r+(n||t?" nap":" napja");case"M":return"egy"+(n||t?" hónap":" hónapja");case"MM":return r+(n||t?" hónap":" hónapja");case"y":return"egy"+(n||t?" év":" éve");case"yy":return r+(n||t?" év":" éve")}return""}function n(e){return(e?"":"[múlt] ")+"["+r[this.day()]+"] LT[-kor]"}var r="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");(t.defineLocale||t.lang).call(t,"hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiem:function(e,t,a){return 12>e?a===!0?"de":"DE":a===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return n.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return n.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.lang("hu",{defaultButtonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további"})}(),function(){(t.defineLocale||t.lang).call(t,"id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(e){return 11>e?"pagi":15>e?"siang":19>e?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("id","id",{closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("id",{defaultButtonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari
penuh",eventLimitText:"lebih"})}(),function(){function a(e){return 11===e%100?!0:1===e%10?!1:!0}function n(e,t,n,r){var i=e+" ";switch(n){case"s":return t||r?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return t?"mínúta":"mínútu";case"mm":return a(e)?i+(t||r?"mínútur":"mínútum"):t?i+"mínúta":i+"mínútu";case"hh":return a(e)?i+(t||r?"klukkustundir":"klukkustundum"):i+"klukkustund";case"d":return t?"dagur":r?"dag":"degi";case"dd":return a(e)?t?i+"dagar":i+(r?"daga":"dögum"):t?i+"dagur":i+(r?"dag":"degi");case"M":return t?"mánuður":r?"mánuð":"mánuði";case"MM":return a(e)?t?i+"mánuðir":i+(r?"mánuði":"mánuðum"):t?i+"mánuður":i+(r?"mánuð":"mánuði");case"y":return t||r?"ár":"ári";case"yy":return a(e)?i+(t||r?"ár":"árum"):i+(t||r?"ár":"ári")}}(t.defineLocale||t.lang).call(t,"is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("is","is",{closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("is",{defaultButtonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan
daginn",eventLimitText:"meira"})}(),function(){(t.defineLocale||t.lang).call(t,"it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:"[lo scorso] dddd [alle] LT",sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("it","it",{closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("it",{defaultButtonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il
giorno",eventLimitText:function(e){return"+altri "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日LT",LLLL:"YYYY年M月D日LT dddd"},meridiem:function(e){return 12>e?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}}),e.fullCalendar.datepickerLang("ja","ja",{closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),e.fullCalendar.lang("ja",{defaultButtonText:{month:"月",week:"週",day:"日",list:"予定リスト"},allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"}})}(),function(){(t.defineLocale||t.lang).call(t,"ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 m분",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 LT",LLLL:"YYYY년 MMMM D일 dddd LT"},meridiem:function(e){return 12>e?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇초",ss:"%d초",m:"일분",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한달",MM:"%d달",y:"일년",yy:"%d년"},ordinal:"%d일",meridiemParse:/(오전|오후)/,isPM:function(e){return"오후"===e}}),e.fullCalendar.datepickerLang("ko","ko",{closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"}),e.fullCalendar.lang("ko",{defaultButtonText:{month:"월",week:"주",day:"일",list:"일정목록"},allDayText:"종일",eventLimitText:"개"})}(),function(){function a(e,t,a,n){return t?"kelios sekundės":n?"kelių sekundžių":"kelias sekundes"}function n(e,t,a,n){return t?i(a)[0]:n?i(a)[1]:i(a)[2]}function r(e){return 0===e%10||e>10&&20>e}function i(e){return d[e].split("_")}function s(e,t,a,s){var o=e+" ";return 1===e?o+n(e,t,a[0],s):t?o+(r(e)?i(a)[1]:i(a)[0]):s?o+i(a)[1]:o+(r(e)?i(a)[1]:i(a)[2])}function o(e,t){var a=-1===t.indexOf("dddd HH:mm"),n=l[e.day()];return a?n:n.substring(0,n.length-2)+"į"}var d={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"},l="sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_");(t.defineLocale||t.lang).call(t,"lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:o,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:a,m:n,mm:s,h:n,hh:s,d:n,dd:s,M:n,MM:s,y:n,yy:s},ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("lt","lt",{closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.lang("lt",{defaultButtonText:{month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},allDayText:"Visą dieną",eventLimitText:"daugiau"})}(),function(){function a(e,t,a){var n=e.split("_");return a?1===t%10&&11!==t?n[2]:n[3]:1===t%10&&11!==t?n[0]:n[1]}function n(e,t,n){return e+" "+a(r[n],e,t)}var r={mm:"minūti_minūtes_minūte_minūtes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mēnesi_mēnešus_mēnesis_mēneši",yy:"gadu_gadus_gads_gadi"};(t.defineLocale||t.lang).call(t,"lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vēlāk",past:"%s agrāk",s:"dažas sekundes",m:"minūti",mm:n,h:"stundu",hh:n,d:"dienu",dd:n,M:"mēnesi",MM:n,y:"gadu",yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("lv","lv",{closeText:"Aizvērt",prevText:"Iepr.",nextText:"Nāk.",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("lv",{defaultButtonText:{month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e}})}(),function(){var a="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");(t.defineLocale||t.lang).call(t,"nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?n[e.month()]:a[e.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("nl","nl",{closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("nl",{defaultButtonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra"})}(),function(){function a(e){return 5>e%10&&e%10>1&&1!==~~(e/10)%10}function n(e,t,n){var r=e+" ";switch(n){case"m":return t?"minuta":"minutę";case"mm":return r+(a(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return r+(a(e)?"godziny":"godzin");case"MM":return r+(a(e)?"miesiące":"miesięcy");case"yy":return r+(a(e)?"lata":"lat")}}var r="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),i="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");(t.defineLocale||t.lang).call(t,"pl",{months:function(e,t){return/D MMMM/.test(t)?i[e.month()]:r[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:n,mm:n,h:n,hh:n,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:n,y:"rok",yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pl","pl",{closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pl",{defaultButtonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej"})}(),function(){(t.defineLocale||t.lang).call(t,"pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº"}),e.fullCalendar.datepickerLang("pt-br","pt-BR",{closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pt-br",{defaultButtonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e}})}(),function(){(t.defineLocale||t.lang).call(t,"pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pt",{defaultButtonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais"})}(),function(){function a(e,t,a){var n={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},r=" ";return(e%100>=20||e>=100&&0===e%100)&&(r=" de "),e+r+n[a]}(t.defineLocale||t.lang).call(t,"ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:a,h:"o oră",hh:a,d:"o zi",dd:a,M:"o lună",MM:a,y:"un an",yy:a},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("ro","ro",{closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ro",{defaultButtonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e }})}(),function(){function a(e,t){var a=e.split("_");return 1===t%10&&11!==t%100?a[0]:t%10>=2&&4>=t%10&&(10>t%100||t%100>=20)?a[1]:a[2]}function n(e,t,n){var r={mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===n?t?"минута":"минуту":e+" "+a(r[n],+e)}function r(e,t){var a={nominative:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),accusative:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_")},n=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return a[n][e.month()]}function i(e,t){var a={nominative:"янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),accusative:"янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек".split("_")},n=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return a[n][e.month()]}function s(e,t){var a={nominative:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),accusative:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_")},n=/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/.test(t)?"accusative":"nominative";return a[n][e.day()]}(t.defineLocale||t.lang).call(t,"ru",{months:r,monthsShort:i,weekdays:s,weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|я]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT"},lastWeek:function(){switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:n,mm:n,h:"час",hh:n,d:"день",dd:n,M:"месяц",MM:n,y:"год",yy:n},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(e){return/^(дня|вечера)$/.test(e)},meridiem:function(e){return 4>e?"ночи":12>e?"утра":17>e?"дня":"вечера"},ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-я";default:return e}},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("ru","ru",{closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ru",{defaultButtonText:{month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e}})}(),function(){function a(e){return e>1&&5>e}function n(e,t,n,r){var i=e+" ";switch(n){case"s":return t||r?"pár sekúnd":"pár sekundami";case"m":return t?"minúta":r?"minútu":"minútou";case"mm":return t||r?i+(a(e)?"minúty":"minút"):i+"minútami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(a(e)?"hodiny":"hodín"):i+"hodinami";case"d":return t||r?"deň":"dňom";case"dd":return t||r?i+(a(e)?"dni":"dní"):i+"dňami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?i+(a(e)?"mesiace":"mesiacov"):i+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?i+(a(e)?"roky":"rokov"):i+"rokmi"}}var r="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),i="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");(t.defineLocale||t.lang).call(t,"sk",{months:r,monthsShort:i,monthsParse:function(e,t){var a,n=[];for(a=0;12>a;a++)n[a]=RegExp("^"+e[a]+"$|^"+t[a]+"$","i");return n}(r,i),weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("sk","sk",{closeText:"Zavrieť",prevText:"<Predchádzajúci",nextText:"Nasledujúci>",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sk",{defaultButtonText:{month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e}})}(),function(){function a(e,t,a){var n=e+" ";switch(a){case"m":return t?"ena minuta":"eno minuto";case"mm":return n+=1===e?"minuta":2===e?"minuti":3===e||4===e?"minute":"minut";case"h":return t?"ena ura":"eno uro";case"hh":return n+=1===e?"ura":2===e?"uri":3===e||4===e?"ure":"ur";case"dd":return n+=1===e?"dan":"dni";case"MM":return n+=1===e?"mesec":2===e?"meseca":3===e||4===e?"mesece":"mesecev";case"yy":return n+=1===e?"leto":2===e?"leti":3===e||4===e?"leta":"let"}}(t.defineLocale||t.lang).call(t,"sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejšnja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"%s nazaj",s:"nekaj sekund",m:a,mm:a,h:a,hh:a,d:"en dan",dd:a,M:"en mesec",MM:a,y:"eno leto",yy:a},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sl","sl",{closeText:"Zapri",prevText:"<Prejšnji",nextText:"Naslednji>",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sl",{defaultButtonText:{month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},allDayText:"Ves dan",eventLimitText:"več"})}(),function(){var a={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&4>=e?t[1]:t[2]},translate:function(e,t,n){var r=a.words[n];return 1===n.length?t?r[0]:r[1]:e+" "+a.correctGrammaticalCase(e,r)}};(t.defineLocale||t.lang).call(t,"sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","сеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","среда","четвртак","петак","субота"],weekdaysShort:["нед.","пон.","уто.","сре.","чет.","пет.","суб."],weekdaysMin:["не","по","ут","ср","че","пе","су"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var e=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"дан",dd:a.translate,M:"месец",MM:a.translate,y:"годину",yy:a.translate},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sr-cyrl","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sr-cyrl",{defaultButtonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e}})}(),function(){var a={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&4>=e?t[1]:t[2]},translate:function(e,t,n){var r=a.words[n];return 1===n.length?t?r[0]:r[1]:e+" "+a.correctGrammaticalCase(e,r)}};(t.defineLocale||t.lang).call(t,"sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","čet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","če","pe","su"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var e=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"dan",dd:a.translate,M:"mesec",MM:a.translate,y:"godinu",yy:a.translate},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sr","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sr",{defaultButtonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinal:function(e){var t=e%10,a=1===~~(e%100/10)?"e":1===t?"a":2===t?"a":3===t?"e":"e";return e+a},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("sv","sv",{closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sv",{defaultButtonText:{month:"Månad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till"})}(),function(){(t.defineLocale||t.lang).call(t,"th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิกา m นาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiem:function(e){return 12>e?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}}),e.fullCalendar.datepickerLang("th","th",{closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("th",{defaultButtonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม"})}(),function(){var a={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};(t.defineLocale||t.lang).call(t,"tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(e){if(0===e)return e+"'ıncı";var t=e%10,n=e%100-t,r=e>=100?100:null;return e+(a[t]||a[n]||a[r])},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("tr","tr",{closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("tr",{defaultButtonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla"})}(),function(){function a(e,t){var a=e.split("_");return 1===t%10&&11!==t%100?a[0]:t%10>=2&&4>=t%10&&(10>t%100||t%100>=20)?a[1]:a[2]}function n(e,t,n){var r={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===n?t?"хвилина":"хвилину":"h"===n?t?"година":"годину":e+" "+a(r[n],+e)}function r(e,t){var a={nominative:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_"),accusative:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_")},n=/D[oD]? *MMMM?/.test(t)?"accusative":"nominative";return a[n][e.month()]}function i(e,t){var a={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},n=/(\[[ВвУу]\]) ?dddd/.test(t)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(t)?"genitive":"nominative";return a[n][e.day()]}function s(e){return function(){return e+"о"+(11===this.hours()?"б":"")+"] LT"}}(t.defineLocale||t.lang).call(t,"uk",{months:r,monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:i,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., LT",LLLL:"dddd, D MMMM YYYY р., LT"},calendar:{sameDay:s("[Сьогодні "),nextDay:s("[Завтра "),lastDay:s("[Вчора "),nextWeek:s("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return s("[Минулої] dddd [").call(this);case 1:case 2:case 4:return s("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:n,mm:n,h:"годину",hh:n,d:"день",dd:n,M:"місяць",MM:n,y:"рік",yy:n},meridiem:function(e){return 4>e?"ночі":12>e?"ранку":17>e?"дня":"вечора"},ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e+"-й";case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("uk","uk",{closeText:"Закрити",prevText:"<",nextText:">",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("uk",{defaultButtonText:{month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."}})}(),function(){(t.defineLocale||t.lang).call(t,"vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},ordinal:function(e){return e},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("vi","vi",{closeText:"Đóng",prevText:"<Trước",nextText:"Tiếp>",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("vi",{defaultButtonText:{month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e}})}(),function(){(t.defineLocale||t.lang).call(t,"zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日LT",LLLL:"YYYY年MMMD日ddddLT",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日LT",llll:"YYYY年MMMD日ddddLT"},meridiem:function(e,t){var a=100*e+t;return 600>a?"凌晨":900>a?"早上":1130>a?"上午":1230>a?"中午":1800>a?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,a;return e=t().startOf("week"),a=this.unix()-e.unix()>=604800?"[下]":"[本]",0===this.minutes()?a+"dddAh点整":a+"dddAh点mm"},lastWeek:function(){var e,a;return e=t().startOf("week"),a=this.unix()a?"早上":1130>a?"上午":1230>a?"中午":1800>a?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"一分鐘",mm:"%d分鐘",h:"一小時",hh:"%d小時",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%d年"}}),e.fullCalendar.datepickerLang("zh-tw","zh-TW",{closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),e.fullCalendar.lang("zh-tw",{defaultButtonText:{month:"月",week:"週",day:"天",list:"待辦事項"},allDayText:"全天",eventLimitText:"更多"})}(),(t.locale||t.lang).call(t,"en"),e.fullCalendar.lang("en"),e.datepicker&&e.datepicker.setDefaults(e.datepicker.regional[""])}); \ No newline at end of file diff --git a/dist/lang/ar.js b/dist/lang/ar.js index e6f2163..b3b3ef5 100644 --- a/dist/lang/ar.js +++ b/dist/lang/ar.js @@ -1 +1 @@ -(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){var n={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},i={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};(e.defineLocale||e.lang).call(e,"ar",{months:"يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),monthsShort:"يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(t){return 12>t?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return i[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return n[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}}),t.fullCalendar.datepickerLang("ar","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("ar",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}); \ No newline at end of file +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){var n={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},i={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},r=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&10>=t%100?3:t%100>=11?4:5},o={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},s=function(t){return function(e,n){var i=r(e),s=o[t][r(e)];return 2===i&&(s=s[n?0:1]),s.replace(/%d/i,e)}},l=["كانون الثاني يناير","شباط فبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوفمبر","كانون الأول ديسمبر"];(e.defineLocale||e.lang).call(e,"ar",{months:l,monthsShort:l,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(t){return 12>t?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:s("s"),m:s("m"),mm:s("m"),h:s("h"),hh:s("h"),d:s("d"),dd:s("d"),M:s("M"),MM:s("M"),y:s("y"),yy:s("y")},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return i[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return n[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}}),t.fullCalendar.datepickerLang("ar","ar",{closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("ar",{defaultButtonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى"})}); \ No newline at end of file diff --git a/dist/lang/cs.js b/dist/lang/cs.js index 0e7f002..3ebc443 100644 --- a/dist/lang/cs.js +++ b/dist/lang/cs.js @@ -1 +1 @@ -(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function n(t){return t>1&&5>t&&1!==~~(t/10)}function i(t,e,i,r){var s=t+" ";switch(i){case"s":return e||r?"pár sekund":"pár sekundami";case"m":return e?"minuta":r?"minutu":"minutou";case"mm":return e||r?s+(n(t)?"minuty":"minut"):s+"minutami";case"h":return e?"hodina":r?"hodinu":"hodinou";case"hh":return e||r?s+(n(t)?"hodiny":"hodin"):s+"hodinami";case"d":return e||r?"den":"dnem";case"dd":return e||r?s+(n(t)?"dny":"dní"):s+"dny";case"M":return e||r?"měsíc":"měsícem";case"MM":return e||r?s+(n(t)?"měsíce":"měsíců"):s+"měsíci";case"y":return e||r?"rok":"rokem";case"yy":return e||r?s+(n(t)?"roky":"let"):s+"lety"}}var r="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),s="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");(e.defineLocale||e.lang).call(e,"cs",{months:r,monthsShort:s,monthsParse:function(t,e){var n,i=[];for(n=0;12>n;n++)i[n]=RegExp("^"+t[n]+"$|^"+e[n]+"$","i");return i}(r,s),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H.mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},ordinal:"%d.",week:{dow:1,doy:4}}),t.fullCalendar.datepickerLang("cs","cs",{closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("cs",{defaultButtonText:{month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(t){return"+další: "+t}})}); \ No newline at end of file +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function n(t){return t>1&&5>t&&1!==~~(t/10)}function i(t,e,i,r){var s=t+" ";switch(i){case"s":return e||r?"pár sekund":"pár sekundami";case"m":return e?"minuta":r?"minutu":"minutou";case"mm":return e||r?s+(n(t)?"minuty":"minut"):s+"minutami";case"h":return e?"hodina":r?"hodinu":"hodinou";case"hh":return e||r?s+(n(t)?"hodiny":"hodin"):s+"hodinami";case"d":return e||r?"den":"dnem";case"dd":return e||r?s+(n(t)?"dny":"dní"):s+"dny";case"M":return e||r?"měsíc":"měsícem";case"MM":return e||r?s+(n(t)?"měsíce":"měsíců"):s+"měsíci";case"y":return e||r?"rok":"rokem";case"yy":return e||r?s+(n(t)?"roky":"let"):s+"lety"}}var r="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),s="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");(e.defineLocale||e.lang).call(e,"cs",{months:r,monthsShort:s,monthsParse:function(t,e){var n,i=[];for(n=0;12>n;n++)i[n]=RegExp("^"+t[n]+"$|^"+e[n]+"$","i");return i}(r,s),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},ordinal:"%d.",week:{dow:1,doy:4}}),t.fullCalendar.datepickerLang("cs","cs",{closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("cs",{defaultButtonText:{month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(t){return"+další: "+t}})}); \ No newline at end of file diff --git a/dist/lang/el.js b/dist/lang/el.js index 96ee518..6985ca3 100644 --- a/dist/lang/el.js +++ b/dist/lang/el.js @@ -1 +1 @@ -(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){(e.defineLocale||e.lang).call(e,"el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(t,e){return/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[t.month()]:this._monthsNominativeEl[t.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(t,e,n){return t>11?n?"μμ":"ΜΜ":n?"πμ":"ΠΜ"},longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(t,e){var n=this._calendarEl[t],i=e&&e.hours();return"function"==typeof n&&(n=n.apply(e)),n.replace("{}",1===i%12?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinal:function(t){return t+"η"},week:{dow:1,doy:4}}),t.fullCalendar.datepickerLang("el","el",{closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("el",{defaultButtonText:{month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},allDayText:"Ολοήμερο",eventLimitText:"περισσότερα"})}); \ No newline at end of file +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(e,t){return/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(e,t,n){return e>11?n?"μμ":"ΜΜ":n?"πμ":"ΠΜ"},isPM:function(e){return"μ"===(e+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,t){var n=this._calendarEl[e],i=t&&t.hours();return"function"==typeof n&&(n=n.apply(t)),n.replace("{}",1===i%12?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinal:function(e){return e+"η"},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("el","el",{closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("el",{defaultButtonText:{month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},allDayText:"Ολοήμερο",eventLimitText:"περισσότερα"})}); \ No newline at end of file diff --git a/dist/lang/es.js b/dist/lang/es.js index c4af976..e9b049f 100644 --- a/dist/lang/es.js +++ b/dist/lang/es.js @@ -1 +1 @@ -(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),i="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");(t.defineLocale||t.lang).call(t,"es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?i[e.month()]:n[e.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [del] YYYY",LLL:"D [de] MMMM [del] YYYY LT",LLLL:"dddd, D [de] MMMM [del] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("es","es",{closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("es",{defaultButtonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo
el día",eventLimitText:"más"})}); \ No newline at end of file +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),i="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");(t.defineLocale||t.lang).call(t,"es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?i[e.month()]:n[e.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("es","es",{closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("es",{defaultButtonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo
el día",eventLimitText:"más"})}); \ No newline at end of file diff --git a/dist/lang/ko.js b/dist/lang/ko.js index 0a6d902..67d4dcb 100644 --- a/dist/lang/ko.js +++ b/dist/lang/ko.js @@ -1 +1 @@ -(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 mm분",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 LT",LLLL:"YYYY년 MMMM D일 dddd LT"},meridiem:function(e){return 12>e?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇초",ss:"%d초",m:"일분",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한달",MM:"%d달",y:"일년",yy:"%d년"},ordinal:"%d일",meridiemParse:/(오전|오후)/,isPM:function(e){return"오후"===e}}),e.fullCalendar.datepickerLang("ko","ko",{closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"}),e.fullCalendar.lang("ko",{defaultButtonText:{month:"월",week:"주",day:"일",list:"일정목록"},allDayText:"종일",eventLimitText:"개"})}); \ No newline at end of file +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 m분",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 LT",LLLL:"YYYY년 MMMM D일 dddd LT"},meridiem:function(e){return 12>e?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇초",ss:"%d초",m:"일분",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한달",MM:"%d달",y:"일년",yy:"%d년"},ordinal:"%d일",meridiemParse:/(오전|오후)/,isPM:function(e){return"오후"===e}}),e.fullCalendar.datepickerLang("ko","ko",{closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"}),e.fullCalendar.lang("ko",{defaultButtonText:{month:"월",week:"주",day:"일",list:"일정목록"},allDayText:"종일",eventLimitText:"개"})}); \ No newline at end of file diff --git a/dist/lang/pl.js b/dist/lang/pl.js index f49e6a4..2b92f13 100644 --- a/dist/lang/pl.js +++ b/dist/lang/pl.js @@ -1 +1 @@ -(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e){return 5>e%10&&e%10>1&&1!==~~(e/10)%10}function i(e,t,i){var a=e+" ";switch(i){case"m":return t?"minuta":"minutę";case"mm":return a+(n(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return a+(n(e)?"godziny":"godzin");case"MM":return a+(n(e)?"miesiące":"miesięcy");case"yy":return a+(n(e)?"lata":"lat")}}var a="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),r="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");(t.defineLocale||t.lang).call(t,"pl",{months:function(e,t){return/D MMMM/.test(t)?r[e.month()]:a[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:i,mm:i,h:i,hh:i,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:i,y:"rok",yy:i},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pl","pl",{closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pl",{defaultButtonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej"})}); \ No newline at end of file +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e){return 5>e%10&&e%10>1&&1!==~~(e/10)%10}function i(e,t,i){var r=e+" ";switch(i){case"m":return t?"minuta":"minutę";case"mm":return r+(n(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return r+(n(e)?"godziny":"godzin");case"MM":return r+(n(e)?"miesiące":"miesięcy");case"yy":return r+(n(e)?"lata":"lat")}}var r="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),a="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");(t.defineLocale||t.lang).call(t,"pl",{months:function(e,t){return/D MMMM/.test(t)?a[e.month()]:r[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:i,mm:i,h:i,hh:i,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:i,y:"rok",yy:i},ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pl","pl",{closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pl",{defaultButtonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej"})}); \ No newline at end of file diff --git a/dist/lang/sr-cyrl.js b/dist/lang/sr-cyrl.js index 36c4e39..0a8bccb 100644 --- a/dist/lang/sr-cyrl.js +++ b/dist/lang/sr-cyrl.js @@ -1 +1 @@ -(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&4>=e?t[1]:t[2]},translate:function(e,t,a){var i=n.words[a];return 1===a.length?t?i[0]:i[1]:e+" "+n.correctGrammaticalCase(e,i)}};(t.defineLocale||t.lang).call(t,"sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","сеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","среда","четвртак","петак","субота"],weekdaysShort:["нед.","пон.","уто.","сре.","чет.","пет.","суб."],weekdaysMin:["не","по","ут","ср","че","пе","су"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var e=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:n.translate,mm:n.translate,h:n.translate,hh:n.translate,d:"дан",dd:n.translate,M:"месец",MM:n.translate,y:"годину",yy:n.translate},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sr-cyrl","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sr-cyrl",{defaultButtonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e}})}); \ No newline at end of file +(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&4>=e?t[1]:t[2]},translate:function(e,t,a){var r=n.words[a];return 1===a.length?t?r[0]:r[1]:e+" "+n.correctGrammaticalCase(e,r)}};(t.defineLocale||t.lang).call(t,"sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","сеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","среда","четвртак","петак","субота"],weekdaysShort:["нед.","пон.","уто.","сре.","чет.","пет.","суб."],weekdaysMin:["не","по","ут","ср","че","пе","су"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var e=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:n.translate,mm:n.translate,h:n.translate,hh:n.translate,d:"дан",dd:n.translate,M:"месец",MM:n.translate,y:"годину",yy:n.translate},ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sr-cyrl","sr",{closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sr-cyrl",{defaultButtonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e}})}); \ No newline at end of file
'),e>t&&(n+=''),i>e&&(n+=''),n=this.bookendCells(n,"highlight"),'
'+n+""+"
"+"
"}}),t.extend(ee.prototype,{segs:null,rowStructs:null,renderEvents:function(e){var i=this.rowStructs=this.renderEventRows(e),n=[];this.rowEls.each(function(e,r){t(r).find(".fc-content-skeleton > table").append(i[e].tbodyEl),n.push.apply(n,i[e].segs)}),this.segs=n},getSegs:function(){return(this.segs||[]).concat(this.popoverSegs||[])},destroyEvents:function(){var t,e;for(J.prototype.destroyEvents.call(this),t=this.rowStructs||[];e=t.pop();)e.tbodyEl.remove();this.segs=null,this.destroySegPopover()},renderEventRows:function(t){var e,i,n=this.eventsToSegs(t),r=[];for(n=this.renderSegs(n),e=this.groupSegRows(n),i=0;e.length>i;i++)r.push(this.renderEventRow(i,e[i]));return r},renderSegHtml:function(t,e){var i,n=this.view,r=n.opt("isRTL"),o=t.event,s=n.isEventDraggable(o),l=!e&&o.allDay&&t.isEnd&&n.isEventResizable(o),a=this.getSegClasses(t,s,l),c=this.getEventSkinCss(o),d="";return a.unshift("fc-day-grid-event"),!o.allDay&&t.isStart&&(d=''+R(n.getEventTimeText(o))+""),i=''+(R(o.title||"")||" ")+"",'"+'
'+(r?i+" "+d:d+" "+i)+"
"+(l?'
':"")+""},renderEventRow:function(e,i){function n(e){for(;e>s;)d=(y[r-1]||[])[s],d?d.attr("rowspan",parseInt(d.attr("rowspan")||1,10)+1):(d=t("
"),l.append(d)),v[r][s]=d,y[r][s]=d,s++}var r,o,s,l,a,c,d,h=this.view,u=h.colCnt,f=this.buildSegLevels(i),g=Math.max(1,f.length),p=t("
').append(c.el),c.leftCol!=c.rightCol?d.attr("colspan",c.rightCol-c.leftCol+1):y[r][s]=d;c.rightCol>=s;)v[r][s]=d,m[r][s]=c,s++;l.append(d)}n(u),this.bookendCells(l,"eventSkeleton"),p.append(l)}return{row:e,tbodyEl:p,cellMatrix:v,segMatrix:m,segLevels:f,segs:i}},buildSegLevels:function(t){var e,i,n,r=[];for(t.sort(te),e=0;t.length>e;e++){for(i=t[e],n=0;r.length>n&&ie(i,r[n]);n++);i.level=n,(r[n]||(r[n]=[])).push(i)}for(n=0;r.length>n;n++)r[n].sort(ne);return r},groupSegRows:function(t){var e,i=this.view,n=[];for(e=0;i.rowCnt>e;e++)n.push([]);for(e=0;t.length>e;e++)n[t[e].row].push(t[e]);return n}}),t.extend(ee.prototype,{segPopover:null,popoverSegs:null,destroySegPopover:function(){this.segPopover&&this.segPopover.hide()},limitRows:function(t){var e,i,n=this.rowStructs||[];for(e=0;n.length>e;e++)this.unlimitRow(e),i=t?"number"==typeof t?t:this.computeRowLevelLimit(e):!1,i!==!1&&this.limitRow(e,i)},computeRowLevelLimit:function(t){var e,i,n=this.rowEls.eq(t),r=n.height(),o=this.rowStructs[t].tbodyEl.children();for(e=0;o.length>e;e++)if(i=o.eq(e).removeClass("fc-limited"),i.position().top+i.outerHeight()>r)return e;return!1},limitRow:function(e,i){function n(n){for(;n>T;)r={row:e,col:T},d=E.getCellSegs(r,i),d.length&&(f=s[i-1][T],w=E.renderMoreLink(r,d),y=t("
").append(w),f.append(y),D.push(y[0])),T++}var r,o,s,l,a,c,d,h,u,f,g,p,m,v,y,w,E=this,b=this.view,S=this.rowStructs[e],D=[],T=0;if(i&&S.segLevels.length>i){for(o=S.segLevels[i-1],s=S.cellMatrix,l=S.tbodyEl.children().slice(i).addClass("fc-limited").get(),a=0;o.length>a;a++){for(c=o[a],n(c.leftCol),u=[],h=0;c.rightCol>=T;)r={row:e,col:T},d=this.getCellSegs(r,i),u.push(d),h+=d.length,T++;if(h){for(f=s[i-1][c.leftCol],g=f.attr("rowspan")||1,p=[],m=0;u.length>m;m++)v=t('
').attr("rowspan",g),d=u[m],r={row:e,col:c.leftCol+m},w=this.renderMoreLink(r,[c].concat(d)),y=t("
").append(w),v.append(y),p.push(v[0]),D.push(v[0]);f.addClass("fc-limited").after(t(p)),l.push(f[0])}}n(b.colCnt),S.moreEls=t(D),S.limitedEls=t(l)}},unlimitRow:function(t){var e=this.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},renderMoreLink:function(e,i){var n=this,r=this.view;return t('').text(this.getMoreLinkText(i.length)).on("click",function(o){var s=r.opt("eventLimitClick"),l=r.cellToDate(e),a=t(this),c=n.getCellDayEl(e),d=n.getCellSegs(e),h=n.resliceDaySegs(d,l),u=n.resliceDaySegs(i,l);"function"==typeof s&&(s=r.trigger("eventLimitClick",null,{date:l,dayEl:c,moreEl:a,segs:h,hiddenSegs:u},o)),"popover"===s?n.showSegPopover(l,e,a,h):"string"==typeof s&&r.calendar.zoomTo(l,s)})},showSegPopover:function(t,e,i,n){var r,o,s=this,l=this.view,a=i.parent();r=1==l.rowCnt?this.view.el:this.rowEls.eq(e.row),o={className:"fc-more-popover",content:this.renderSegPopoverContent(t,n),parentEl:this.el,top:r.offset().top,autoHide:!0,viewportConstrain:l.opt("popoverViewportConstrain"),hide:function(){s.segPopover.destroy(),s.segPopover=null,s.popoverSegs=null}},l.opt("isRTL")?o.right=a.offset().left+a.outerWidth()+1:o.left=a.offset().left-1,this.segPopover=new j(o),this.segPopover.show()},renderSegPopoverContent:function(e,i){var n,r=this.view,o=r.opt("theme"),s=e.format(r.opt("dayPopoverFormat")),l=t('
'+''+''+R(s)+""+'
'+"
"+'
'+'
'+"
"),a=l.find(".fc-event-container");for(i=this.renderSegs(i,!0),this.popoverSegs=i,n=0;i.length>n;n++)i[n].cellDate=e,a.append(i[n].el);return l},resliceDaySegs:function(e,i){var n=t.map(e,function(t){return t.event}),r=i.clone().stripTime(),o=r.clone().add(1,"days");return this.eventsToSegs(n,r,o)},getMoreLinkText:function(t){var e=this.view,i=e.opt("eventLimitText");return"function"==typeof i?i(t):"+"+t+" "+i},getCellSegs:function(t,e){for(var i,n=this.rowStructs[t.row].segMatrix,r=e||0,o=[];n.length>r;)i=n[r][t.col],i&&o.push(i),r++;return o}}),re.prototype=H(J.prototype),t.extend(re.prototype,{slotDuration:null,snapDuration:null,minTime:null,maxTime:null,dayEls:null,slatEls:null,slatTops:null,highlightEl:null,helperEl:null,render:function(){this.processOptions(),this.el.html(this.renderHtml()),this.dayEls=this.el.find(".fc-day"),this.slatEls=this.el.find(".fc-slats tr"),this.computeSlatTops(),J.prototype.render.call(this)},renderHtml:function(){return'
'+this.rowHtml("slotBg")+"
"+"
"+'
'+""+this.slatRowHtml()+"
"+"
"},slotBgCellHtml:function(t,e,i){return this.bgCellHtml(t,e,i)},slatRowHtml:function(){for(var t,i,n,r=this.view,o=r.calendar,s=r.opt("isRTL"),l="",a=0===this.slotDuration.asMinutes()%15,c=e.duration(+this.minTime);this.maxTime>c;)t=r.start.clone().time(c),i=t.minutes(),n='
"+(a&&i?"":""+R(o.formatDate(t,r.opt("axisFormat")))+"")+"
'+(s?n:"")+"
',d=n.col),r=l.cellToDate(0,d),o=this.computeDateTop(n.start,r),s=this.computeDateTop(n.end,r),c+='
'+"
"+"
'),c=this.bookendCells(c,"highlight"),'
'+c+""+"
"+"
"}}),t.extend(re.prototype,{segs:null,eventSkeletonEl:null,renderEvents:function(e){var i=this.renderEventTable(e);this.eventSkeletonEl=t('
').append(i.tableEl),this.el.append(this.eventSkeletonEl),this.segs=i.segs},getSegs:function(){return this.segs||[]},destroyEvents:function(){J.prototype.destroyEvents.call(this),this.eventSkeletonEl&&(this.eventSkeletonEl.remove(),this.eventSkeletonEl=null),this.segs=null},renderEventTable:function(e){var i,n,r,o,s,l,a=t("
"),c=a.find("tr"),d=this.eventsToSegs(e);for(d=this.renderSegs(d),i=this.groupSegCols(d),this.computeSegVerticals(d),o=0;i.length>o;o++){for(s=i[o],oe(s),l=t('
'),n=0;s.length>n;n++)r=s[n],r.el.css(this.generateSegPositionCss(r)),30>r.bottom-r.top&&r.el.addClass("fc-short"),l.append(r.el);c.append(t("
").append(l))}return this.bookendCells(c,"eventSkeleton"),{tableEl:a,segs:d}},updateSegVerticals:function(){var t,e=this.segs;if(e)for(this.computeSegVerticals(e),t=0;e.length>t;t++)e[t].el.css(this.generateSegVerticalCss(e[t]))},computeSegVerticals:function(t){var e,i;for(e=0;t.length>e;e++)i=t[e],i.top=this.computeDateTop(i.start,i.start),i.bottom=this.computeDateTop(i.end,i.start)},renderSegHtml:function(t,e){var i,n,r,o=this.view,s=t.event,l=o.isEventDraggable(s),a=!e&&t.isEnd&&o.isEventResizable(s),c=this.getSegClasses(t,l,a),d=this.getEventSkinCss(s);return c.unshift("fc-time-grid-event"),o.isMultiDayEvent(s)?(t.isStart||t.isEnd)&&(i=o.getEventTimeText(t.start,t.end),n=o.getEventTimeText(t.start,t.end,"LT"),r=o.getEventTimeText(t.start,null)):(i=o.getEventTimeText(s),n=o.getEventTimeText(s,"LT"),r=o.getEventTimeText(s.start,null)),'"+'
'+(i?'
"+""+R(i)+""+"
":"")+(s.title?'
'+R(s.title)+"
":"")+"
"+'
'+(a?'
':"")+""},generateSegPositionCss:function(t){var e,i,n=this.view,r=n.opt("isRTL"),o=n.opt("slotEventOverlap"),s=t.backwardCoord,l=t.forwardCoord,a=this.generateSegVerticalCss(t);return o&&(l=Math.min(1,s+2*(l-s))),r?(e=1-l,i=s):(e=s,i=1-l),a.zIndex=t.level+1,a.left=100*e+"%",a.right=100*i+"%",o&&t.forwardPressure&&(a[r?"marginLeft":"marginRight"]=20),a},generateSegVerticalCss:function(t){return{top:t.top,bottom:-t.bottom}},groupSegCols:function(t){var e,i=this.view,n=[];for(e=0;i.colCnt>e;e++)n.push([]);for(e=0;t.length>e;e++)n[t[e].col].push(t[e]);return n}}),fe.prototype={calendar:null,coordMap:null,el:null,start:null,end:null,intervalStart:null,intervalEnd:null,rowCnt:null,colCnt:null,isSelected:!1,scrollerEl:null,scrollTop:null,widgetHeaderClass:null,widgetContentClass:null,highlightStateClass:null,documentMousedownProxy:null,documentDragStartProxy:null,init:function(){var e=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=e+"-widget-header",this.widgetContentClass=e+"-widget-content",this.highlightStateClass=e+"-state-highlight",this.documentMousedownProxy=t.proxy(this,"documentMousedown"),this.documentDragStartProxy=t.proxy(this,"documentDragStart")},render:function(){this.updateSize(),this.trigger("viewRender",this,this,this.el),t(document).on("mousedown",this.documentMousedownProxy).on("dragstart",this.documentDragStartProxy)},destroy:function(){this.unselect(),this.trigger("viewDestroy",this,this,this.el),this.destroyEvents(),this.el.empty(),t(document).off("mousedown",this.documentMousedownProxy).off("dragstart",this.documentDragStartProxy)},incrementDate:function(){},updateSize:function(t){t&&this.recordScroll(),this.updateHeight(),this.updateWidth()},updateWidth:function(){},updateHeight:function(){var t=this.calendar;this.setHeight(t.getSuggestedViewHeight(),t.isHeightAuto())},setHeight:function(){},computeScrollerHeight:function(t){var e,i=this.el.add(this.scrollerEl);return i.css({position:"relative",left:-1}),e=this.el.outerHeight()-this.scrollerEl.height(),i.css({position:"",left:""}),t-e},recordScroll:function(){this.scrollerEl&&(this.scrollTop=this.scrollerEl.scrollTop())},restoreScroll:function(){null!==this.scrollTop&&this.scrollerEl.scrollTop(this.scrollTop)},renderEvents:function(){this.segEach(function(t){this.trigger("eventAfterRender",t.event,t.event,t.el)}),this.trigger("eventAfterAllRender")},destroyEvents:function(){this.segEach(function(t){this.trigger("eventDestroy",t.event,t.event,t.el)})},resolveEventEl:function(e,i){var n=this.trigger("eventRender",e,e,i);return n===!1?i=null:n&&n!==!0&&(i=t(n)),i},showEvent:function(t){this.segEach(function(t){t.el.css("visibility","")},t)},hideEvent:function(t){this.segEach(function(t){t.el.css("visibility","hidden")},t)},segEach:function(t,e){var i,n=this.getSegs();for(i=0;n.length>i;i++)e&&n[i].event._id!==e._id||t.call(this,n[i])},getSegs:function(){},renderDrag:function(){},destroyDrag:function(){},documentDragStart:function(e){var i,n=this,r=null;this.opt("droppable")&&(i=new q(this.coordMap,{cellOver:function(t,e){r=e,n.renderDrag(e)},cellOut:function(){r=null,n.destroyDrag()}}),t(document).one("dragstop",function(t,e){n.destroyDrag(),r&&n.trigger("drop",t.target,r,t,e)}),i.startDrag(e))},select:function(t,e,i){this.unselect(i),this.renderSelection(t,e),this.reportSelection(t,e,i)},renderSelection:function(){},reportSelection:function(t,e,i){this.isSelected=!0,this.trigger("select",null,t,e,i)},unselect:function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection(),this.trigger("unselect",null,t))},destroySelection:function(){},documentMousedown:function(e){var i;this.isSelected&&this.opt("unselectAuto")&&E(e)&&(i=this.opt("unselectCancel"),i&&t(e.target).closest(i).length||this.unselect(e))}},ge.prototype=H(fe.prototype),t.extend(ge.prototype,{dayGrid:null,dayNumbersVisible:!1,weekNumbersVisible:!1,weekNumberWidth:null,headRowEl:null,render:function(t,e,i){this.rowCnt=t,this.colCnt=e,this.dayNumbersVisible=i,this.weekNumbersVisible=this.opt("weekNumbers"),this.dayGrid.numbersVisible=this.dayNumbersVisible||this.weekNumbersVisible,this.el.addClass("fc-basic-view").html(this.renderHtml()),this.headRowEl=this.el.find("thead .fc-row"),this.scrollerEl=this.el.find(".fc-day-grid-container"),this.dayGrid.coordMap.containerEl=this.scrollerEl,this.dayGrid.el=this.el.find(".fc-day-grid"),this.dayGrid.render(this.hasRigidRows()),fe.prototype.render.call(this)},destroy:function(){this.dayGrid.destroy(),fe.prototype.destroy.call(this)},renderHtml:function(){return'"+""+""+""+""+'"+""+""+"
'+this.dayGrid.headHtml()+"
'+'
'+'
'+"
"+"
" },headIntroHtml:function(){return this.weekNumbersVisible?'
"+""+R(this.opt("weekNumberTitle"))+""+""+""+this.calendar.calculateWeekNumber(this.cellToDate(t,0))+""+"'+i.date()+""},weekNumberStyleAttr:function(){return null!==this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},hasRigidRows:function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},updateWidth:function(){this.weekNumbersVisible&&(this.weekNumberWidth=p(this.el.find(".fc-week-number")))},setHeight:function(t,e){var i,n=this.opt("eventLimit");v(this.scrollerEl),u(this.headRowEl),this.dayGrid.destroySegPopover(),n&&"number"==typeof n&&this.dayGrid.limitRows(n),i=this.computeScrollerHeight(t),this.setGridHeight(i,e),n&&"number"!=typeof n&&this.dayGrid.limitRows(n),!e&&m(this.scrollerEl,i)&&(h(this.headRowEl,w(this.scrollerEl)),i=this.computeScrollerHeight(t),this.scrollerEl.height(i),this.restoreScroll())},setGridHeight:function(t,e){e?g(this.dayGrid.rowEls):f(this.dayGrid.rowEls,t,!0)},renderEvents:function(t){this.dayGrid.renderEvents(t),this.updateHeight(),fe.prototype.renderEvents.call(this,t)},getSegs:function(){return this.dayGrid.getSegs()},destroyEvents:function(){fe.prototype.destroyEvents.call(this),this.recordScroll(),this.dayGrid.destroyEvents()},renderDrag:function(t,e,i){return this.dayGrid.renderDrag(t,e,i)},destroyDrag:function(){this.dayGrid.destroyDrag()},renderSelection:function(t,e){this.dayGrid.renderSelection(t,e)},destroySelection:function(){this.dayGrid.destroySelection()}}),r({fixedWeekCount:!0}),xe.month=pe,pe.prototype=H(ge.prototype),t.extend(pe.prototype,{name:"month",incrementDate:function(t,e){return t.clone().stripTime().add(e,"months").startOf("month")},render:function(t){var e;this.intervalStart=t.clone().stripTime().startOf("month"),this.intervalEnd=this.intervalStart.clone().add(1,"months"),this.start=this.intervalStart.clone(),this.start=this.skipHiddenDays(this.start),this.start.startOf("week"),this.start=this.skipHiddenDays(this.start),this.end=this.intervalEnd.clone(),this.end=this.skipHiddenDays(this.end,-1,!0),this.end.add((7-this.end.weekday())%7,"days"),this.end=this.skipHiddenDays(this.end,-1,!0),e=Math.ceil(this.end.diff(this.start,"weeks",!0)),this.isFixedWeeks()&&(this.end.add(6-e,"weeks"),e=6),this.title=this.calendar.formatDate(this.intervalStart,this.opt("titleFormat")),ge.prototype.render.call(this,e,this.getCellsPerWeek(),!0)},setGridHeight:function(t,e){e=e||"variable"===this.opt("weekMode"),e&&(t*=this.rowCnt/6),f(this.dayGrid.rowEls,t,!e)},isFixedWeeks:function(){var t=this.opt("weekMode");return t?"fixed"===t:this.opt("fixedWeekCount")}}),xe.basicWeek=me,me.prototype=H(ge.prototype),t.extend(me.prototype,{name:"basicWeek",incrementDate:function(t,e){return t.clone().stripTime().add(e,"weeks").startOf("week")},render:function(t){this.intervalStart=t.clone().stripTime().startOf("week"),this.intervalEnd=this.intervalStart.clone().add(1,"weeks"),this.start=this.skipHiddenDays(this.intervalStart),this.end=this.skipHiddenDays(this.intervalEnd,-1,!0),this.title=this.calendar.formatRange(this.start,this.end.clone().subtract(1),this.opt("titleFormat")," — "),ge.prototype.render.call(this,1,this.getCellsPerWeek(),!1)}}),xe.basicDay=ve,ve.prototype=H(ge.prototype),t.extend(ve.prototype,{name:"basicDay",incrementDate:function(t,e){var i=t.clone().stripTime().add(e,"days");return i=this.skipHiddenDays(i,0>e?-1:1)},render:function(t){this.start=this.intervalStart=t.clone().stripTime(),this.end=this.intervalEnd=this.start.clone().add(1,"days"),this.title=this.calendar.formatDate(this.start,this.opt("titleFormat")),ge.prototype.render.call(this,1,1,!1)}}),r({allDaySlot:!0,allDayText:"all-day",scrollTime:"06:00:00",slotDuration:"00:30:00",axisFormat:ye,timeFormat:{agenda:we},minTime:"00:00:00",maxTime:"24:00:00",slotEventOverlap:!0});var Ye=5;Ee.prototype=H(fe.prototype),t.extend(Ee.prototype,{timeGrid:null,dayGrid:null,axisWidth:null,noScrollRowEls:null,bottomRuleEl:null,bottomRuleHeight:null,render:function(e){this.rowCnt=1,this.colCnt=e,this.el.addClass("fc-agenda-view").html(this.renderHtml()),this.scrollerEl=this.el.find(".fc-time-grid-container"),this.timeGrid.coordMap.containerEl=this.scrollerEl,this.timeGrid.el=this.el.find(".fc-time-grid"),this.timeGrid.render(),this.bottomRuleEl=t('
').appendTo(this.timeGrid.el),this.dayGrid&&(this.dayGrid.el=this.el.find(".fc-day-grid"),this.dayGrid.render(),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight()),this.noScrollRowEls=this.el.find(".fc-row:not(.fc-scroller *)"),fe.prototype.render.call(this),this.resetScroll()},destroy:function(){this.timeGrid.destroy(),this.dayGrid&&this.dayGrid.destroy(),fe.prototype.destroy.call(this)},renderHtml:function(){return'"+""+""+""+""+'"+""+""+"
'+this.timeGrid.headHtml()+"
'+(this.dayGrid?'

':"")+'
'+'
'+"
"+"
"},headIntroHtml:function(){var t,e,i,n;return this.opt("weekNumbers")?(t=this.cellToDate(0,0),e=this.calendar.calculateWeekNumber(t),i=this.opt("weekNumberTitle"),n=this.opt("isRTL")?e+i:i+e,'
"+""+R(n)+""+""+""+(this.opt("allDayHtml")||R(this.opt("allDayText")))+""+"