|
|
@@ -1,5 +1,5 @@
|
|
|
/*!
|
|
|
- * FullCalendar v2.0.2
|
|
|
+ * FullCalendar v2.0.3
|
|
|
* Docs & License: http://arshaw.com/fullcalendar/
|
|
|
* (c) 2013 Adam Shaw
|
|
|
*/
|
|
|
@@ -166,7 +166,7 @@ var rtlDefaults = {
|
|
|
|
|
|
;;
|
|
|
|
|
|
-var fc = $.fullCalendar = { version: "2.0.2" };
|
|
|
+var fc = $.fullCalendar = { version: "2.0.3" };
|
|
|
var fcViews = fc.views = {};
|
|
|
|
|
|
|
|
|
@@ -384,26 +384,34 @@ function Calendar(element, instanceOptions) {
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
// Apply overrides to the current language's data
|
|
|
|
|
|
- var langData = createObject( // make a cheap clone
|
|
|
- moment.langData(options.lang)
|
|
|
- );
|
|
|
+
|
|
|
+ // Returns moment's internal locale data. If doesn't exist, returns English.
|
|
|
+ // Works with moment-pre-2.8
|
|
|
+ function getLocaleData(langCode) {
|
|
|
+ var f = moment.localeData || moment.langData;
|
|
|
+ return f.call(moment, langCode) ||
|
|
|
+ f.call(moment, 'en'); // the newer localData could return null, so fall back to en
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var localeData = createObject(getLocaleData(options.lang)); // make a cheap copy
|
|
|
|
|
|
if (options.monthNames) {
|
|
|
- langData._months = options.monthNames;
|
|
|
+ localeData._months = options.monthNames;
|
|
|
}
|
|
|
if (options.monthNamesShort) {
|
|
|
- langData._monthsShort = options.monthNamesShort;
|
|
|
+ localeData._monthsShort = options.monthNamesShort;
|
|
|
}
|
|
|
if (options.dayNames) {
|
|
|
- langData._weekdays = options.dayNames;
|
|
|
+ localeData._weekdays = options.dayNames;
|
|
|
}
|
|
|
if (options.dayNamesShort) {
|
|
|
- langData._weekdaysShort = options.dayNamesShort;
|
|
|
+ localeData._weekdaysShort = options.dayNamesShort;
|
|
|
}
|
|
|
if (options.firstDay != null) {
|
|
|
- var _week = createObject(langData._week); // _week: { dow: # }
|
|
|
+ var _week = createObject(localeData._week); // _week: { dow: # }
|
|
|
_week.dow = options.firstDay;
|
|
|
- langData._week = _week;
|
|
|
+ localeData._week = _week;
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -436,7 +444,12 @@ function Calendar(element, instanceOptions) {
|
|
|
mom = fc.moment.parseZone.apply(null, arguments); // let the input decide the zone
|
|
|
}
|
|
|
|
|
|
- mom._lang = langData;
|
|
|
+ if ('_locale' in mom) { // moment 2.8 and above
|
|
|
+ mom._locale = localeData;
|
|
|
+ }
|
|
|
+ else { // pre-moment-2.8
|
|
|
+ mom._lang = localeData;
|
|
|
+ }
|
|
|
|
|
|
return mom;
|
|
|
};
|
|
|
@@ -524,7 +537,7 @@ function Calendar(element, instanceOptions) {
|
|
|
|
|
|
// a function that returns a formatStr // TODO: in future, precompute this
|
|
|
if (typeof formatStr === 'function') {
|
|
|
- formatStr = formatStr.call(t, options, langData);
|
|
|
+ formatStr = formatStr.call(t, options, localeData);
|
|
|
}
|
|
|
|
|
|
return formatRange(m1, m2, formatStr, null, options.isRTL);
|
|
|
@@ -536,7 +549,7 @@ function Calendar(element, instanceOptions) {
|
|
|
|
|
|
// a function that returns a formatStr // TODO: in future, precompute this
|
|
|
if (typeof formatStr === 'function') {
|
|
|
- formatStr = formatStr.call(t, options, langData);
|
|
|
+ formatStr = formatStr.call(t, options, localeData);
|
|
|
}
|
|
|
|
|
|
return formatDate(mom, formatStr);
|
|
|
@@ -948,13 +961,13 @@ function Calendar(element, instanceOptions) {
|
|
|
|
|
|
|
|
|
function prevYear() {
|
|
|
- date.add('years', -1);
|
|
|
+ date.add(-1, 'years');
|
|
|
renderView();
|
|
|
}
|
|
|
|
|
|
|
|
|
function nextYear() {
|
|
|
- date.add('years', 1);
|
|
|
+ date.add(1, 'years');
|
|
|
renderView();
|
|
|
}
|
|
|
|
|
|
@@ -2689,12 +2702,15 @@ function formatDateWithChunk(date, chunk) {
|
|
|
// If the dates are the same as far as the format string is concerned, just return a single
|
|
|
// rendering of one date, without any separator.
|
|
|
function formatRange(date1, date2, formatStr, separator, isRTL) {
|
|
|
+ var localeData;
|
|
|
|
|
|
date1 = fc.moment.parseZone(date1);
|
|
|
date2 = fc.moment.parseZone(date2);
|
|
|
|
|
|
+ localeData = (date1.localeData || date1.lang).call(date1); // works with moment-pre-2.8
|
|
|
+
|
|
|
// Expand localized format strings, like "LL" -> "MMMM D YYYY"
|
|
|
- formatStr = date1.lang().longDateFormat(formatStr) || formatStr;
|
|
|
+ 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.
|
|
|
|
|
|
@@ -2859,14 +2875,14 @@ function MonthView(element, calendar) {
|
|
|
|
|
|
|
|
|
function incrementDate(date, delta) {
|
|
|
- return date.clone().stripTime().add('months', delta).startOf('month');
|
|
|
+ return date.clone().stripTime().add(delta, 'months').startOf('month');
|
|
|
}
|
|
|
|
|
|
|
|
|
function render(date) {
|
|
|
|
|
|
t.intervalStart = date.clone().stripTime().startOf('month');
|
|
|
- t.intervalEnd = t.intervalStart.clone().add('months', 1);
|
|
|
+ t.intervalEnd = t.intervalStart.clone().add(1, 'months');
|
|
|
|
|
|
t.start = t.intervalStart.clone();
|
|
|
t.start = t.skipHiddenDays(t.start); // move past the first week if no visible days
|
|
|
@@ -2875,14 +2891,14 @@ function MonthView(element, calendar) {
|
|
|
|
|
|
t.end = t.intervalEnd.clone();
|
|
|
t.end = t.skipHiddenDays(t.end, -1, true); // move in from the last week if no visible days
|
|
|
- t.end.add('days', (7 - t.end.weekday()) % 7); // move to end of week if not already
|
|
|
+ t.end.add((7 - t.end.weekday()) % 7, 'days'); // move to end of week if not already
|
|
|
t.end = t.skipHiddenDays(t.end, -1, true); // move in from the last invisible days of the week
|
|
|
|
|
|
var rowCnt = Math.ceil( // need to ceil in case there are hidden days
|
|
|
t.end.diff(t.start, 'weeks', true) // returnfloat=true
|
|
|
);
|
|
|
if (t.opt('weekMode') == 'fixed') {
|
|
|
- t.end.add('weeks', 6 - rowCnt);
|
|
|
+ t.end.add(6 - rowCnt, 'weeks');
|
|
|
rowCnt = 6;
|
|
|
}
|
|
|
|
|
|
@@ -2912,14 +2928,14 @@ function BasicWeekView(element, calendar) { // TODO: do a WeekView mixin
|
|
|
|
|
|
|
|
|
function incrementDate(date, delta) {
|
|
|
- return date.clone().stripTime().add('weeks', delta).startOf('week');
|
|
|
+ return date.clone().stripTime().add(delta, 'weeks').startOf('week');
|
|
|
}
|
|
|
|
|
|
|
|
|
function render(date) {
|
|
|
|
|
|
t.intervalStart = date.clone().stripTime().startOf('week');
|
|
|
- t.intervalEnd = t.intervalStart.clone().add('weeks', 1);
|
|
|
+ t.intervalEnd = t.intervalStart.clone().add(1, 'weeks');
|
|
|
|
|
|
t.start = t.skipHiddenDays(t.intervalStart);
|
|
|
t.end = t.skipHiddenDays(t.intervalEnd, -1, true);
|
|
|
@@ -2955,7 +2971,7 @@ function BasicDayView(element, calendar) { // TODO: make a DayView mixin
|
|
|
|
|
|
|
|
|
function incrementDate(date, delta) {
|
|
|
- var out = date.clone().stripTime().add('days', delta);
|
|
|
+ var out = date.clone().stripTime().add(delta, 'days');
|
|
|
out = t.skipHiddenDays(out, delta < 0 ? -1 : 1);
|
|
|
return out;
|
|
|
}
|
|
|
@@ -2964,7 +2980,7 @@ function BasicDayView(element, calendar) { // TODO: make a DayView mixin
|
|
|
function render(date) {
|
|
|
|
|
|
t.start = t.intervalStart = date.clone().stripTime();
|
|
|
- t.end = t.intervalEnd = t.start.clone().add('days', 1);
|
|
|
+ t.end = t.intervalEnd = t.start.clone().add(1, 'days');
|
|
|
|
|
|
t.title = calendar.formatDate(t.start, t.opt('titleFormat'));
|
|
|
|
|
|
@@ -3365,7 +3381,7 @@ function BasicView(element, calendar, viewName) {
|
|
|
|
|
|
|
|
|
function defaultSelectionEnd(start) {
|
|
|
- return start.clone().stripTime().add('days', 1);
|
|
|
+ return start.clone().stripTime().add(1, 'days');
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3534,14 +3550,14 @@ function AgendaWeekView(element, calendar) { // TODO: do a WeekView mixin
|
|
|
|
|
|
|
|
|
function incrementDate(date, delta) {
|
|
|
- return date.clone().stripTime().add('weeks', delta).startOf('week');
|
|
|
+ return date.clone().stripTime().add(delta, 'weeks').startOf('week');
|
|
|
}
|
|
|
|
|
|
|
|
|
function render(date) {
|
|
|
|
|
|
t.intervalStart = date.clone().stripTime().startOf('week');
|
|
|
- t.intervalEnd = t.intervalStart.clone().add('weeks', 1);
|
|
|
+ t.intervalEnd = t.intervalStart.clone().add(1, 'weeks');
|
|
|
|
|
|
t.start = t.skipHiddenDays(t.intervalStart);
|
|
|
t.end = t.skipHiddenDays(t.intervalEnd, -1, true);
|
|
|
@@ -3577,7 +3593,7 @@ function AgendaDayView(element, calendar) { // TODO: make a DayView mixin
|
|
|
|
|
|
|
|
|
function incrementDate(date, delta) {
|
|
|
- var out = date.clone().stripTime().add('days', delta);
|
|
|
+ var out = date.clone().stripTime().add(delta, 'days');
|
|
|
out = t.skipHiddenDays(out, delta < 0 ? -1 : 1);
|
|
|
return out;
|
|
|
}
|
|
|
@@ -3586,7 +3602,7 @@ function AgendaDayView(element, calendar) { // TODO: make a DayView mixin
|
|
|
function render(date) {
|
|
|
|
|
|
t.start = t.intervalStart = date.clone().stripTime();
|
|
|
- t.end = t.intervalEnd = t.start.clone().add('days', 1);
|
|
|
+ t.end = t.intervalEnd = t.start.clone().add(1, 'days');
|
|
|
|
|
|
t.title = calendar.formatDate(t.start, t.opt('titleFormat'));
|
|
|
|
|
|
@@ -4235,7 +4251,7 @@ function AgendaView(element, calendar, viewName) {
|
|
|
for (var i=0; i<colCnt; i++) { // loop through the day columns
|
|
|
|
|
|
var dayStart = cellToDate(0, i);
|
|
|
- var dayEnd = dayStart.clone().add('days', 1);
|
|
|
+ var dayEnd = dayStart.clone().add(1, 'days');
|
|
|
|
|
|
var stretchStart = dayStart < overlayStart ? overlayStart : dayStart; // the max of the two
|
|
|
var stretchEnd = dayEnd < overlayEnd ? dayEnd : overlayEnd; // the min of the two
|
|
|
@@ -4401,7 +4417,7 @@ function AgendaView(element, calendar, viewName) {
|
|
|
return start.clone().add(slotDuration);
|
|
|
}
|
|
|
else {
|
|
|
- return start.clone().add('days', 1);
|
|
|
+ return start.clone().add(1, 'days');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -4981,8 +4997,8 @@ function AgendaEventRenderer() {
|
|
|
if (!cell.row) { // on full-days
|
|
|
|
|
|
renderDayOverlay(
|
|
|
- event.start.clone().add('days', dayDelta),
|
|
|
- getEventEnd(event).add('days', dayDelta)
|
|
|
+ event.start.clone().add(dayDelta, 'days'),
|
|
|
+ getEventEnd(event).add(dayDelta, 'days')
|
|
|
);
|
|
|
|
|
|
resetElement();
|
|
|
@@ -5027,7 +5043,7 @@ function AgendaEventRenderer() {
|
|
|
}
|
|
|
else { // changed!
|
|
|
|
|
|
- var eventStart = event.start.clone().add('days', dayDelta); // already assumed to have a stripped time
|
|
|
+ var eventStart = event.start.clone().add(dayDelta, 'days'); // already assumed to have a stripped time
|
|
|
var snapTime;
|
|
|
var snapIndex;
|
|
|
if (!allDay) {
|
|
|
@@ -5147,12 +5163,12 @@ function AgendaEventRenderer() {
|
|
|
|
|
|
// compute new dates
|
|
|
if (isAllDay) {
|
|
|
- eventStart = event.start.clone().stripTime().add('days', dayDelta);
|
|
|
+ eventStart = event.start.clone().stripTime().add(dayDelta, 'days');
|
|
|
eventEnd = eventStart.clone().add(calendar.defaultAllDayEventDuration);
|
|
|
}
|
|
|
else {
|
|
|
- eventStart = event.start.clone().add(snapDelta * snapDuration).add('days', dayDelta);
|
|
|
- eventEnd = getEventEnd(event).add(snapDelta * snapDuration).add('days', dayDelta);
|
|
|
+ eventStart = event.start.clone().add(snapDelta * snapDuration).add(dayDelta, 'days');
|
|
|
+ eventEnd = getEventEnd(event).add(snapDelta * snapDuration).add(dayDelta, 'days');
|
|
|
}
|
|
|
|
|
|
updateUI();
|
|
|
@@ -5833,7 +5849,7 @@ function View(element, calendar, viewName) {
|
|
|
while (
|
|
|
isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7]
|
|
|
) {
|
|
|
- out.add('days', inc);
|
|
|
+ out.add(inc, 'days');
|
|
|
}
|
|
|
return out;
|
|
|
}
|
|
|
@@ -5887,7 +5903,7 @@ function View(element, calendar, viewName) {
|
|
|
|
|
|
// day offset -> date
|
|
|
function dayOffsetToDate(dayOffset) {
|
|
|
- return t.start.clone().add('days', dayOffset);
|
|
|
+ return t.start.clone().add(dayOffset, 'days');
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -6593,10 +6609,10 @@ function DayEventRenderer() {
|
|
|
var origCellDate = cellToDate(origCell);
|
|
|
var cellDate = cellToDate(cell);
|
|
|
dayDelta = cellDate.diff(origCellDate, 'days');
|
|
|
- eventStart = event.start.clone().add('days', dayDelta);
|
|
|
+ eventStart = event.start.clone().add(dayDelta, 'days');
|
|
|
renderDayOverlay(
|
|
|
eventStart,
|
|
|
- getEventEnd(event).add('days', dayDelta)
|
|
|
+ getEventEnd(event).add(dayDelta, 'days')
|
|
|
);
|
|
|
}
|
|
|
else {
|
|
|
@@ -6676,7 +6692,7 @@ function DayEventRenderer() {
|
|
|
cellOffsetToDayOffset(cellOffset) -
|
|
|
cellOffsetToDayOffset(origCellOffset);
|
|
|
|
|
|
- eventEnd = getEventEnd(event).add('days', dayDelta); // assumed to already have a stripped time
|
|
|
+ eventEnd = getEventEnd(event).add(dayDelta, 'days'); // assumed to already have a stripped time
|
|
|
|
|
|
if (dayDelta) {
|
|
|
eventCopy.end = eventEnd;
|
|
|
@@ -6869,7 +6885,7 @@ function SelectionManager() {
|
|
|
dates = [ cellToDate(origCell), cellToDate(cell) ].sort(dateCompare);
|
|
|
renderSelection(
|
|
|
dates[0],
|
|
|
- dates[1].clone().add('days', 1) // make exclusive
|
|
|
+ dates[1].clone().add(1, 'days') // make exclusive
|
|
|
);
|
|
|
}else{
|
|
|
dates = null;
|
|
|
@@ -6883,7 +6899,7 @@ function SelectionManager() {
|
|
|
}
|
|
|
reportSelection(
|
|
|
dates[0],
|
|
|
- dates[1].clone().add('days', 1), // make exclusive
|
|
|
+ dates[1].clone().add(1, 'days'), // make exclusive
|
|
|
ev
|
|
|
);
|
|
|
}
|