rewrite to gcal plugin; leverages new event-source features
This commit is contained in:
parent
6b6391635e
commit
075df1d144
152
src/gcal/gcal.js
152
src/gcal/gcal.js
|
@ -1,70 +1,102 @@
|
||||||
/*
|
|
||||||
* FullCalendar v@VERSION Google Calendar Extension
|
|
||||||
*
|
|
||||||
* Copyright (c) 2010 Adam Shaw
|
|
||||||
* Dual licensed under the MIT and GPL licenses, located in
|
|
||||||
* MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
|
||||||
*
|
|
||||||
* Date: @DATE
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function($) {
|
(function($) {
|
||||||
|
|
||||||
$.fullCalendar.gcalFeed = function(feedUrl, options) {
|
|
||||||
|
|
||||||
feedUrl = feedUrl.replace(/\/basic$/, '/full');
|
var fc = $.fullCalendar;
|
||||||
options = options || {};
|
var formatDate = fc.formatDate;
|
||||||
|
var parseISO8601 = fc.parseISO8601;
|
||||||
|
var addDays = fc.addDays;
|
||||||
|
var applyAll = fc.applyAll;
|
||||||
|
|
||||||
return function(start, end, callback) {
|
|
||||||
var params = {
|
fc.sourceNormalizers.push(function(sourceOptions) {
|
||||||
'start-min': $.fullCalendar.formatDate(start, 'u'),
|
if (sourceOptions.dataType == 'gcal' ||
|
||||||
'start-max': $.fullCalendar.formatDate(end, 'u'),
|
sourceOptions.dataType === undefined &&
|
||||||
'singleevents': true,
|
(sourceOptions.url || '').indexOf('http://www.google.com/calendar/feeds/') == 0) {
|
||||||
'max-results': 9999
|
sourceOptions.dataType = 'gcal';
|
||||||
};
|
if (sourceOptions.editable === undefined) {
|
||||||
var ctz = options.currentTimezone;
|
sourceOptions.editable = false;
|
||||||
if (ctz) {
|
|
||||||
params.ctz = ctz = ctz.replace(' ', '_');
|
|
||||||
}
|
}
|
||||||
$.getJSON(feedUrl + "?alt=json-in-script&callback=?", params, function(data) {
|
|
||||||
var events = [];
|
|
||||||
if (data.feed.entry) {
|
|
||||||
$.each(data.feed.entry, function(i, entry) {
|
|
||||||
var startStr = entry['gd$when'][0]['startTime'],
|
|
||||||
start = $.fullCalendar.parseISO8601(startStr, true),
|
|
||||||
end = $.fullCalendar.parseISO8601(entry['gd$when'][0]['endTime'], true),
|
|
||||||
allDay = startStr.indexOf('T') == -1,
|
|
||||||
url;
|
|
||||||
$.each(entry.link, function() {
|
|
||||||
if (this.type == 'text/html') {
|
|
||||||
url = this.href;
|
|
||||||
if (ctz) {
|
|
||||||
url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + ctz;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (allDay) {
|
|
||||||
$.fullCalendar.addDays(end, -1); // make inclusive
|
|
||||||
}
|
|
||||||
events.push({
|
|
||||||
id: entry['gCal$uid']['value'],
|
|
||||||
title: entry['title']['$t'],
|
|
||||||
url: url,
|
|
||||||
start: start,
|
|
||||||
end: end,
|
|
||||||
allDay: allDay,
|
|
||||||
location: entry['gd$where'][0]['valueString'],
|
|
||||||
description: entry['content']['$t'],
|
|
||||||
className: options.className,
|
|
||||||
editable: options.editable || false
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
callback(events);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
fc.sourceFetchers.push(function(sourceOptions, start, end) {
|
||||||
|
if (sourceOptions.dataType == 'gcal') {
|
||||||
|
return transformOptions(sourceOptions, start, end);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function transformOptions(sourceOptions, start, end) {
|
||||||
|
|
||||||
|
var success = sourceOptions.success;
|
||||||
|
var data = $.extend({}, sourceOptions.data || {}, {
|
||||||
|
'start-min': formatDate(start, 'u'),
|
||||||
|
'start-max': formatDate(end, 'u'),
|
||||||
|
'singleevents': true,
|
||||||
|
'max-results': 9999
|
||||||
|
});
|
||||||
|
|
||||||
|
var ctz = sourceOptions.currentTimezone;
|
||||||
|
if (ctz) {
|
||||||
|
data.ctz = ctz = ctz.replace(' ', '_');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $.extend({}, sourceOptions, {
|
||||||
|
url: sourceOptions.url.replace(/\/basic$/, '/full') + '?alt=json-in-script&callback=?',
|
||||||
|
dataType: 'jsonp',
|
||||||
|
data: data,
|
||||||
|
startParam: false,
|
||||||
|
endParam: false,
|
||||||
|
cacheParam: false,
|
||||||
|
cache: false, // TODO: when we remove cacheParam, we can also remove this
|
||||||
|
success: function(data) {
|
||||||
|
var events = [];
|
||||||
|
if (data.feed.entry) {
|
||||||
|
$.each(data.feed.entry, function(i, entry) {
|
||||||
|
var startStr = entry['gd$when'][0]['startTime'];
|
||||||
|
var start = parseISO8601(startStr, true);
|
||||||
|
var end = parseISO8601(entry['gd$when'][0]['endTime'], true);
|
||||||
|
var allDay = startStr.indexOf('T') == -1;
|
||||||
|
var url;
|
||||||
|
$.each(entry.link, function(i, link) {
|
||||||
|
if (link.type == 'text/html') {
|
||||||
|
url = link.href;
|
||||||
|
if (ctz) {
|
||||||
|
url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + ctz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (allDay) {
|
||||||
|
addDays(end, -1); // make inclusive
|
||||||
|
}
|
||||||
|
events.push({
|
||||||
|
id: entry['gCal$uid']['value'],
|
||||||
|
title: entry['title']['$t'],
|
||||||
|
url: url,
|
||||||
|
start: start,
|
||||||
|
end: end,
|
||||||
|
allDay: allDay,
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fc.gcalFeed = function(url, sourceOptions) {
|
||||||
|
return $.extend({}, sourceOptions, { url: url, dataType: 'gcal' });
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
|
|
Loading…
Reference in a new issue