1 | /* |
---|
2 | * FullCalendar v1.5.3 Google Calendar Plugin |
---|
3 | * |
---|
4 | * Copyright (c) 2011 Adam Shaw |
---|
5 | * Dual licensed under the MIT and GPL licenses, located in |
---|
6 | * MIT-LICENSE.txt and GPL-LICENSE.txt respectively. |
---|
7 | * |
---|
8 | * Date: Mon Feb 6 22:40:40 2012 -0800 |
---|
9 | * |
---|
10 | */ |
---|
11 | |
---|
12 | (function($) { |
---|
13 | |
---|
14 | |
---|
15 | var fc = $.fullCalendar; |
---|
16 | var formatDate = fc.formatDate; |
---|
17 | var parseISO8601 = fc.parseISO8601; |
---|
18 | var addDays = fc.addDays; |
---|
19 | var applyAll = fc.applyAll; |
---|
20 | |
---|
21 | |
---|
22 | fc.sourceNormalizers.push(function(sourceOptions) { |
---|
23 | if (sourceOptions.dataType == 'gcal' || |
---|
24 | sourceOptions.dataType === undefined && |
---|
25 | (sourceOptions.url || '').match(/^(http|https):\/\/www.google.com\/calendar\/feeds\//)) { |
---|
26 | sourceOptions.dataType = 'gcal'; |
---|
27 | if (sourceOptions.editable === undefined) { |
---|
28 | sourceOptions.editable = false; |
---|
29 | } |
---|
30 | } |
---|
31 | }); |
---|
32 | |
---|
33 | |
---|
34 | fc.sourceFetchers.push(function(sourceOptions, start, end) { |
---|
35 | if (sourceOptions.dataType == 'gcal') { |
---|
36 | return transformOptions(sourceOptions, start, end); |
---|
37 | } |
---|
38 | }); |
---|
39 | |
---|
40 | |
---|
41 | function transformOptions(sourceOptions, start, end) { |
---|
42 | |
---|
43 | var success = sourceOptions.success; |
---|
44 | var data = $.extend({}, sourceOptions.data || {}, { |
---|
45 | 'start-min': formatDate(start, 'u'), |
---|
46 | 'start-max': formatDate(end, 'u'), |
---|
47 | 'singleevents': true, |
---|
48 | 'max-results': 9999 |
---|
49 | }); |
---|
50 | |
---|
51 | var ctz = sourceOptions.currentTimezone; |
---|
52 | if (ctz) { |
---|
53 | data.ctz = ctz = ctz.replace(' ', '_'); |
---|
54 | } |
---|
55 | |
---|
56 | return $.extend({}, sourceOptions, { |
---|
57 | url: sourceOptions.url.replace(/\/basic$/, '/full') + '?alt=json-in-script&callback=?', |
---|
58 | dataType: 'jsonp', |
---|
59 | data: data, |
---|
60 | startParam: false, |
---|
61 | endParam: false, |
---|
62 | success: function(data) { |
---|
63 | var events = []; |
---|
64 | if (data.feed.entry) { |
---|
65 | $.each(data.feed.entry, function(i, entry) { |
---|
66 | var startStr = entry['gd$when'][0]['startTime']; |
---|
67 | var start = parseISO8601(startStr, true); |
---|
68 | var end = parseISO8601(entry['gd$when'][0]['endTime'], true); |
---|
69 | var allDay = startStr.indexOf('T') == -1; |
---|
70 | var url; |
---|
71 | $.each(entry.link, function(i, link) { |
---|
72 | if (link.type == 'text/html') { |
---|
73 | url = link.href; |
---|
74 | if (ctz) { |
---|
75 | url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + ctz; |
---|
76 | } |
---|
77 | } |
---|
78 | }); |
---|
79 | if (allDay) { |
---|
80 | addDays(end, -1); // make inclusive |
---|
81 | } |
---|
82 | events.push({ |
---|
83 | id: entry['gCal$uid']['value'], |
---|
84 | title: entry['title']['$t'], |
---|
85 | url: url, |
---|
86 | start: start, |
---|
87 | end: end, |
---|
88 | allDay: allDay, |
---|
89 | location: entry['gd$where'][0]['valueString'], |
---|
90 | description: entry['content']['$t'] |
---|
91 | }); |
---|
92 | }); |
---|
93 | } |
---|
94 | var args = [events].concat(Array.prototype.slice.call(arguments, 1)); |
---|
95 | var res = applyAll(success, this, args); |
---|
96 | if ($.isArray(res)) { |
---|
97 | return res; |
---|
98 | } |
---|
99 | return events; |
---|
100 | } |
---|
101 | }); |
---|
102 | |
---|
103 | } |
---|
104 | |
---|
105 | |
---|
106 | // legacy |
---|
107 | fc.gcalFeed = function(url, sourceOptions) { |
---|
108 | return $.extend({}, sourceOptions, { url: url, dataType: 'gcal' }); |
---|
109 | }; |
---|
110 | |
---|
111 | |
---|
112 | })(jQuery); |
---|