diff --git a/index.php b/index.php
index a02f8b03..5723f3a5 100644
--- a/index.php
+++ b/index.php
@@ -28,6 +28,7 @@
+
diff --git a/js/calendar/calendar.js b/js/calendar/calendar.js
new file mode 100644
index 00000000..de882928
--- /dev/null
+++ b/js/calendar/calendar.js
@@ -0,0 +1,132 @@
+var calendar = {
+ eventList: [],
+ calendarLocation: '.calendar',
+ updateInterval: 1000,
+ updateDataInterval: 60000,
+ fadeInterval: 1000,
+ intervalId: null,
+ dataIntervalId: null
+}
+
+calendar.updateData = function (callback) {
+
+ new ical_parser("calendar.php", function(cal) {
+ var events = cal.getEvents();
+ this.eventList = [];
+
+ for (var i in events) {
+ var e = events[i];
+ for (var key in e) {
+ var value = e[key];
+ var seperator = key.search(';');
+ if (seperator >= 0) {
+ var mainKey = key.substring(0,seperator);
+ var subKey = key.substring(seperator+1);
+
+ var dt;
+ if (subKey == 'VALUE=DATE') {
+ //date
+ dt = new Date(value.substring(0,4), value.substring(4,6) - 1, value.substring(6,8));
+ } else {
+ //time
+ dt = new Date(value.substring(0,4), value.substring(4,6) - 1, value.substring(6,8), value.substring(9,11), value.substring(11,13), value.substring(13,15));
+ }
+
+ if (mainKey == 'DTSTART') e.startDate = dt;
+ if (mainKey == 'DTEND') e.endDate = dt;
+ }
+ }
+
+ if (e.startDate == undefined){
+ //some old events in Gmail Calendar is "start_date"
+ //FIXME: problems with Gmail's TimeZone
+ var days = moment(e.DTSTART).diff(moment(), 'days');
+ var seconds = moment(e.DTSTART).diff(moment(), 'seconds');
+ var startDate = moment(e.DTSTART);
+ } else {
+ var days = moment(e.startDate).diff(moment(), 'days');
+ var seconds = moment(e.startDate).diff(moment(), 'seconds');
+ var startDate = moment(e.startDate);
+ }
+
+ //only add fututre events, days doesn't work, we need to check seconds
+ if (seconds >= 0) {
+ if (seconds <= 60*60*5 || seconds >= 60*60*24*2) {
+ var time_string = moment(startDate).fromNow();
+ }else {
+ var time_string = moment(startDate).calendar()
+ }
+ if (!e.RRULE) {
+ this.eventList.push({'description':e.SUMMARY,'seconds':seconds,'days':time_string});
+ }
+ e.seconds = seconds;
+ }
+
+ // Special handling for rrule events
+ if (e.RRULE) {
+ var options = new RRule.parseString(e.RRULE);
+ options.dtstart = e.startDate;
+ var rule = new RRule(options);
+
+ // TODO: don't use fixed end date here, use something like now() + 1 year
+ var dates = rule.between(new Date(), new Date(2016,11,31), true, function (date, i){return i < 10});
+ for (date in dates) {
+ var dt = new Date(dates[date]);
+ var days = moment(dt).diff(moment(), 'days');
+ var seconds = moment(dt).diff(moment(), 'seconds');
+ var startDate = moment(dt);
+ if (seconds >= 0) {
+ if (seconds <= 60*60*5 || seconds >= 60*60*24*2) {
+ var time_string = moment(dt).fromNow();
+ } else {
+ var time_string = moment(dt).calendar()
+ }
+ this.eventList.push({'description':e.SUMMARY,'seconds':seconds,'days':time_string});
+ }
+ }
+ }
+ };
+
+ this.eventList = this.eventList.sort(function(a,b){return a.seconds-b.seconds});
+
+ if (callback !== undefined && Object.prototype.toString.call(callback) === '[object Function]') {
+ callback(this.eventList);
+ }
+
+ }.bind(this));
+
+}
+
+calendar.updateCalendar = function (eventList) {
+
+ table = $('
').addClass('xsmall').addClass('calendar-table');
+ opacity = 1;
+
+ for (var i in eventList) {
+ var e = eventList[i];
+
+ var row = $('
').css('opacity',opacity);
+ row.append($(' | ').html(e.description).addClass('description'));
+ row.append($(' | ').html(e.days).addClass('days dimmed'));
+ table.append(row);
+
+ opacity -= 1 / eventList.length;
+ }
+
+ $(this.calendarLocation).updateWithText(table, this.fadeInterval);
+
+}
+
+calendar.init = function () {
+
+ this.updateData(this.updateCalendar.bind(this));
+
+ this.intervalId = setInterval(function () {
+ this.updateCalendar(this.eventList)
+ }.bind(this), this.updateInterval);
+
+ this.dataIntervalId = setInterval(function () {
+ this.updateData(this.updateCalendar.bind(this));
+ }.bind(this), this.updateDataInterval);
+
+}
\ No newline at end of file
diff --git a/js/main.js b/js/main.js
index 0070fd67..bca7479e 100755
--- a/js/main.js
+++ b/js/main.js
@@ -49,115 +49,7 @@ jQuery(document).ready(function($) {
time.init();
- (function updateCalendarData()
- {
- new ical_parser("calendar.php", function(cal){
- events = cal.getEvents();
- eventList = [];
-
- for (var i in events) {
- var e = events[i];
- for (var key in e) {
- var value = e[key];
- var seperator = key.search(';');
- if (seperator >= 0) {
- var mainKey = key.substring(0,seperator);
- var subKey = key.substring(seperator+1);
-
- var dt;
- if (subKey == 'VALUE=DATE') {
- //date
- dt = new Date(value.substring(0,4), value.substring(4,6) - 1, value.substring(6,8));
- } else {
- //time
- dt = new Date(value.substring(0,4), value.substring(4,6) - 1, value.substring(6,8), value.substring(9,11), value.substring(11,13), value.substring(13,15));
- }
-
- if (mainKey == 'DTSTART') e.startDate = dt;
- if (mainKey == 'DTEND') e.endDate = dt;
- }
- }
-
- if (e.startDate == undefined){
- //some old events in Gmail Calendar is "start_date"
- //FIXME: problems with Gmail's TimeZone
- var days = moment(e.DTSTART).diff(moment(), 'days');
- var seconds = moment(e.DTSTART).diff(moment(), 'seconds');
- var startDate = moment(e.DTSTART);
- } else {
- var days = moment(e.startDate).diff(moment(), 'days');
- var seconds = moment(e.startDate).diff(moment(), 'seconds');
- var startDate = moment(e.startDate);
- }
-
- //only add fututre events, days doesn't work, we need to check seconds
- if (seconds >= 0) {
- if (seconds <= 60*60*5 || seconds >= 60*60*24*2) {
- var time_string = moment(startDate).fromNow();
- }else {
- var time_string = moment(startDate).calendar()
- }
- if (!e.RRULE) {
- eventList.push({'description':e.SUMMARY,'seconds':seconds,'days':time_string});
- }
- e.seconds = seconds;
- }
-
- // Special handling for rrule events
- if (e.RRULE) {
- var options = new RRule.parseString(e.RRULE);
- options.dtstart = e.startDate;
- var rule = new RRule(options);
-
- // TODO: don't use fixed end date here, use something like now() + 1 year
- var dates = rule.between(new Date(), new Date(2016,11,31), true, function (date, i){return i < 10});
- for (date in dates) {
- var dt = new Date(dates[date]);
- var days = moment(dt).diff(moment(), 'days');
- var seconds = moment(dt).diff(moment(), 'seconds');
- var startDate = moment(dt);
- if (seconds >= 0) {
- if (seconds <= 60*60*5 || seconds >= 60*60*24*2) {
- var time_string = moment(dt).fromNow();
- } else {
- var time_string = moment(dt).calendar()
- }
- eventList.push({'description':e.SUMMARY,'seconds':seconds,'days':time_string});
- }
- }
- }
- };
- eventList.sort(function(a,b){return a.seconds-b.seconds});
-
- setTimeout(function() {
- updateCalendarData();
- }, 60000);
- });
- })();
-
- (function updateCalendar()
- {
- table = $('').addClass('xsmall').addClass('calendar-table');
- opacity = 1;
-
-
- for (var i in eventList) {
- var e = eventList[i];
-
- var row = $('
').css('opacity',opacity);
- row.append($(' | ').html(e.description).addClass('description'));
- row.append($(' | ').html(e.days).addClass('days dimmed'));
- table.append(row);
-
- opacity -= 1 / eventList.length;
- }
-
- $('.calendar').updateWithText(table,1000);
-
- setTimeout(function() {
- updateCalendar();
- }, 1000);
- })();
+ calendar.init();
compliments.init();