├── README.md ├── build └── jquery.googlecalreader-1.1.min.js ├── examples └── index.html └── index.js /README.md: -------------------------------------------------------------------------------- 1 | Google Calendar feed reader - plugin to get upcoming events from a *public* google calendar 2 | 3 | #### [Demo](http://bradoyler.github.io/GoogleCalReader-jquery-plugin/examples/) 4 | 5 | ### Default Options 6 | ```js 7 | { 8 | calendarId:'en.usa#holiday@group.v.calendar.google.com', 9 | apiKey:'Public_API_Key', 10 | dateFormat: 'LongDate', 11 | errorMsg:'No events in calendar', 12 | maxEvents: 50, 13 | futureEventsOnly: true, 14 | sortDescending: true 15 | } 16 | ``` 17 | 18 | ### Example 19 | 20 | ```html 21 | 22 | 23 | 24 | 29 |
30 | ``` 31 | 32 | #### Uses Google Calendar api endpoint @ 33 | https://developers.google.com/google-apps/calendar/v3/reference/events/list 34 | -------------------------------------------------------------------------------- /build/jquery.googlecalreader-1.1.min.js: -------------------------------------------------------------------------------- 1 | (function(e){e.fn.gCalReader=function(t){function o(e,t){var n,r,i,s;var o={months:{full:["","January","February","March","April","May","June","July","August","September","October","November","December"],"short":["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},days:{full:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],"short":["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"]}};if(e.length>10){r=/(\d+)\-(\d+)\-(\d+)T(\d+)\:(\d+)/.exec(e);i=r[4]<12;s=i?parseInt(r[4])+":"+r[5]+" AM":r[4]-12+":"+r[5]+" PM";if(s.indexOf("0")===0){if(s.indexOf(":00")===1){if(s.indexOf("AM")===5){s="MIDNIGHT"}else{s="NOON"}}else{s=s.replace("0:","12:")}}}else{r=/(\d+)\-(\d+)\-(\d+)/.exec(e);s="Time not present in feed."}var u=parseInt(r[1]);var a=parseInt(r[2]);var f=parseInt(r[3]);var l=new Date(u,a-1,f);switch(t){case"ShortTime":n=s;break;case"ShortDate":n=a+"/"+f+"/"+u;break;case"LongDate":n=o.days.full[l.getDay()]+" "+o.months.full[a]+" "+f+", "+u;break;case"LongDate+ShortTime":n=o.days.full[l.getDay()]+" "+o.months.full[a]+" "+f+", "+u+" "+s;break;case"ShortDate+ShortTime":n=a+"/"+f+"/"+u+" "+s;break;case"DayMonth":n=o.days.short[l.getDay()]+", "+o.months.full[a]+" "+f;break;case"MonthDay":n=o.months.full[a]+" "+f;break;case"YearMonth":n=o.months.full[a]+" "+u;break;default:n=o.days.full[l.getDay()]+" "+o.months.short[a]+" "+f+", "+u+" "+s}return n}var n=e(this);var r=e.extend({calendarId:"en.usa#holiday@group.v.calendar.google.com",apiKey:"Public_API_Key",dateFormat:"LongDate",errorMsg:"No events in calendar",maxEvents:50,sortDescending:true},t);var i="";var s="https://www.googleapis.com/calendar/v3/calendars/"+encodeURIComponent(r.calendarId.trim())+"/events?key="+r.apiKey+"&orderBy=startTime&singleEvents=true";e.ajax({url:s,dataType:"json",success:function(t){if(r.sortDescending){t.items=t.items.reverse()}t.items=t.items.slice(0,r.maxEvents);e.each(t.items,function(t,s){var u=s.start.dateTime||s.start.date||"";var a=s.summary||"";var f=s.description;var l=s.location;i='
'+a+"
";i+='
When: '+o(u,r.dateFormat.trim())+"
";if(l){i+='
Where: '+l+"
"}if(f){i+='
'+f+"
"}e(n).append("
  • "+i+"
  • ")})},error:function(t){e(n).append("

    "+r.errorMsg+" | "+t+"

    ")}})}})(jQuery) 2 | -------------------------------------------------------------------------------- /examples/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 11 | 12 | 13 | 14 | 15 | 16 | 25 | 26 |

    Upcoming Holidays (demo)

    27 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | $.fn.gCalReader = function(options) { 4 | var $div = $(this); 5 | 6 | var defaults = $.extend({ 7 | calendarId: 'en.usa#holiday@group.v.calendar.google.com', 8 | apiKey: 'Public_API_Key', 9 | dateFormat: 'LongDate', 10 | errorMsg: 'No events in calendar', 11 | maxEvents: 50, 12 | futureEventsOnly: true, 13 | sortDescending: true 14 | }, 15 | options); 16 | 17 | var s = ''; 18 | var feedUrl = 'https://www.googleapis.com/calendar/v3/calendars/' + 19 | encodeURIComponent(defaults.calendarId.trim()) +'/events?key=' + defaults.apiKey + 20 | '&orderBy=startTime&singleEvents=true'; 21 | if(defaults.futureEventsOnly) { 22 | feedUrl+='&timeMin='+ new Date().toISOString(); 23 | } 24 | 25 | $.ajax({ 26 | url: feedUrl, 27 | dataType: 'json', 28 | success: function(data) { 29 | if(defaults.sortDescending){ 30 | data.items = data.items.reverse(); 31 | } 32 | data.items = data.items.slice(0, defaults.maxEvents); 33 | 34 | $.each(data.items, function(e, item) { 35 | var eventdate = item.start.dateTime || item.start.date ||''; 36 | var summary = item.summary || ''; 37 | var description = item.description; 38 | var location = item.location; 39 | var eventDate = formatDate(eventdate, defaults.dateFormat.trim()); 40 | s ='
    '+ summary +'
    '; 41 | s +='
    When: '+ eventDate +'
    '; 42 | if(location) { 43 | s +='
    Where: '+ location +'
    '; 44 | } 45 | if(description) { 46 | s +='
    '+ description +'
    '; 47 | } 48 | $($div).append('
  • ' + s + '
  • '); 49 | }); 50 | }, 51 | error: function(xhr, status) { 52 | $($div).append('

    ' + status +' : '+ defaults.errorMsg +'

    '); 53 | } 54 | }); 55 | 56 | function formatDate(strDate, strFormat) { 57 | var fd, arrDate, am, time; 58 | var calendar = { 59 | months: { 60 | full: ['', 'January', 'February', 'March', 'April', 'May', 61 | 'June', 'July', 'August', 'September', 'October', 62 | 'November', 'December' 63 | ], 64 | short: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 65 | 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' 66 | ] 67 | }, 68 | days: { 69 | full: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 70 | 'Friday', 'Saturday', 'Sunday' 71 | ], 72 | short: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 73 | 'Sun' 74 | ] 75 | } 76 | }; 77 | 78 | if (strDate.length > 10) { 79 | arrDate = /(\d+)\-(\d+)\-(\d+)T(\d+)\:(\d+)/.exec(strDate); 80 | 81 | am = (arrDate[4] < 12); 82 | time = am ? (parseInt(arrDate[4]) + ':' + arrDate[5] + ' AM') : ( 83 | arrDate[4] - 12 + ':' + arrDate[5] + ' PM'); 84 | 85 | if (time.indexOf('0') === 0) { 86 | if (time.indexOf(':00') === 1) { 87 | if (time.indexOf('AM') === 5) { 88 | time = 'MIDNIGHT'; 89 | } else { 90 | time = 'NOON'; 91 | } 92 | } else { 93 | time = time.replace('0:', '12:'); 94 | } 95 | } 96 | 97 | } else { 98 | arrDate = /(\d+)\-(\d+)\-(\d+)/.exec(strDate); 99 | time = 'Time not present in feed.'; 100 | } 101 | 102 | var year = parseInt(arrDate[1]); 103 | var month = parseInt(arrDate[2]); 104 | var dayNum = parseInt(arrDate[3]); 105 | 106 | var d = new Date(year, month - 1, dayNum); 107 | 108 | switch (strFormat) { 109 | case 'ShortTime': 110 | fd = time; 111 | break; 112 | case 'ShortDate': 113 | fd = month + '/' + dayNum + '/' + year; 114 | break; 115 | case 'LongDate': 116 | fd = calendar.days.full[d.getDay()] + ' ' + calendar.months.full[ 117 | month] + ' ' + dayNum + ', ' + year; 118 | break; 119 | case 'LongDate+ShortTime': 120 | fd = calendar.days.full[d.getDay()] + ' ' + calendar.months.full[ 121 | month] + ' ' + dayNum + ', ' + year + ' ' + time; 122 | break; 123 | case 'ShortDate+ShortTime': 124 | fd = month + '/' + dayNum + '/' + year + ' ' + time; 125 | break; 126 | case 'DayMonth': 127 | fd = calendar.days.short[d.getDay()] + ', ' + calendar.months.full[ 128 | month] + ' ' + dayNum; 129 | break; 130 | case 'MonthDay': 131 | fd = calendar.months.full[month] + ' ' + dayNum; 132 | break; 133 | case 'YearMonth': 134 | fd = calendar.months.full[month] + ' ' + year; 135 | break; 136 | default: 137 | fd = calendar.days.full[d.getDay()] + ' ' + calendar.months.short[ 138 | month] + ' ' + dayNum + ', ' + year + ' ' + time; 139 | } 140 | 141 | return fd; 142 | } 143 | }; 144 | 145 | }(jQuery)); 146 | --------------------------------------------------------------------------------