diff --git a/example.html b/example.html index fa82ccb..990ec8d 100644 --- a/example.html +++ b/example.html @@ -1,33 +1,39 @@ - - - - OuiCal Example - - - -
-
+ + + + + OuiCal Example + + + +
+
+ + Google + Outlook + iCal + - - + + + + \ No newline at end of file diff --git a/ouical.js b/ouical.js index 3a13b64..26104b1 100644 --- a/ouical.js +++ b/ouical.js @@ -1,18 +1,18 @@ -;(function(exports) { +; (function (exports) { var MS_IN_MINUTES = 60 * 1000; - var formatTime = function(date) { + var formatTime = function (date) { return date.toISOString().replace(/-|:|\.\d+/g, ''); }; - var calculateEndTime = function(event) { + var calculateEndTime = function (event) { return event.end ? formatTime(event.end) : formatTime(new Date(event.start.getTime() + (event.duration * MS_IN_MINUTES))); }; var calendarGenerators = { - google: function(event) { + google: function (event) { var startTime = formatTime(event.start); var endTime = calculateEndTime(event); @@ -26,13 +26,12 @@ '&location=' + (event.address || ''), '&sprop=&sprop=name:' ].join('')); - return 'Google Calendar'; + return href; }, - yahoo: function(event) { + yahoo: function (event) { var eventDuration = event.end ? - ((event.end.getTime() - event.start.getTime())/ MS_IN_MINUTES) : + ((event.end.getTime() - event.start.getTime()) / MS_IN_MINUTES) : event.duration; // Yahoo dates are crazy, we need to convert the duration from minutes to hh:mm @@ -48,7 +47,7 @@ // Remove timezone from event time var st = formatTime(new Date(event.start - (event.start.getTimezoneOffset() * - MS_IN_MINUTES))) || ''; + MS_IN_MINUTES))) || ''; var href = encodeURI([ 'http://calendar.yahoo.com/?v=60&view=d&type=20', @@ -59,11 +58,10 @@ '&in_loc=' + (event.address || '') ].join('')); - return 'Yahoo! Calendar'; + return href; }, - ics: function(event, eClass, calendarName) { + ics: function (event, eClass, calendarName) { var startTime = formatTime(event.start); var endTime = calculateEndTime(event); @@ -81,20 +79,19 @@ 'END:VEVENT', 'END:VCALENDAR'].join('\n')); - return '' + calendarName + ' Calendar'; + return href; }, - ical: function(event) { + ical: function (event) { return this.ics(event, 'icon-ical', 'iCal'); }, - outlook: function(event) { + outlook: function (event) { return this.ics(event, 'icon-outlook', 'Outlook'); } }; - var generateCalendars = function(event) { + exports.generateCalendars = function (event) { return { google: calendarGenerators.google(event), yahoo: calendarGenerators.yahoo(event), @@ -104,13 +101,13 @@ }; // Create CSS - var addCSS = function() { + var addCSS = function () { if (!document.getElementById('ouical-css')) { document.getElementsByTagName('head')[0].appendChild(generateCSS()); } }; - var generateCSS = function() { + var generateCSS = function () { var styles = document.createElement('style'); styles.id = 'ouical-css'; @@ -120,19 +117,19 @@ }; // Make sure we have the necessary event data, such as start time and event duration - var validParams = function(params) { + var validParams = function (params) { return params.data !== undefined && params.data.start !== undefined && (params.data.end !== undefined || params.data.duration !== undefined); }; - var generateMarkup = function(calendars, clazz, calendarId) { + var generateMarkup = function (calendars, clazz, calendarId) { var result = document.createElement('div'); result.innerHTML = ''; result.innerHTML += ''; - Object.keys(calendars).forEach(function(services) { + Object.keys(calendars).forEach(function (services) { result.innerHTML += calendars[services]; }); @@ -147,26 +144,36 @@ return result; }; - var getClass = function(params) { + var getClass = function (params) { if (params.options && params.options.class) { return params.options.class; } }; - var getOrGenerateCalendarId = function(params) { + var getOrGenerateCalendarId = function (params) { return params.options && params.options.id ? params.options.id : Math.floor(Math.random() * 1000000); // Generate a 6-digit random ID }; - exports.createCalendar = function(params) { + exports.createCalendar = function (params) { if (!validParams(params)) { console.log('Event details missing.'); return; } return generateMarkup(generateCalendars(params.data), - getClass(params), - getOrGenerateCalendarId(params)); + getClass(params), + getOrGenerateCalendarId(params)); }; + + exports.createLinks = function (params) { + if (!validParams(params)) { + console.log('Event details missing.'); + return; + } + return generateCalendars(params.data); + }; + + })(this); diff --git a/ouical.min.js b/ouical.min.js deleted file mode 100644 index 4534373..0000000 --- a/ouical.min.js +++ /dev/null @@ -1 +0,0 @@ -;(function(e){var t=60*1e3;var n=function(e){return e.toISOString().replace(/-|:|\.\d+/g,"")};var r=function(e){return e.end?n(e.end):n(new Date(e.start.getTime()+e.duration*t))};var i={google:function(e){var t=n(e.start);var i=r(e);var s=encodeURI(["https://www.google.com/calendar/render","?action=TEMPLATE","&text="+(e.title||""),"&dates="+(t||""),"/"+(i||""),"&details="+(e.description||""),"&location="+(e.address||""),"&sprop=&sprop=name:"].join(""));return'Google Calendar'},yahoo:function(e){var r=e.end?(e.end.getTime()-e.start.getTime())/t:e.duration;var i=r<600?"0"+Math.floor(r/60):Math.floor(r/60)+"";var s=r%60<10?"0"+r%60:r%60+"";var o=i+s;var u=n(new Date(e.start-e.start.getTimezoneOffset()*t))||"";var a=encodeURI(["http://calendar.yahoo.com/?v=60&view=d&type=20","&title="+(e.title||""),"&st="+u,"&dur="+(o||""),"&desc="+(e.description||""),"&in_loc="+(e.address||"")].join(""));return'Yahoo! Calendar'},ics:function(e,t,i){var s=n(e.start);var o=r(e);var u=encodeURI("data:text/calendar;charset=utf8,"+["BEGIN:VCALENDAR","VERSION:2.0","BEGIN:VEVENT","URL:"+document.URL,"DTSTART:"+(s||""),"DTEND:"+(o||""),"SUMMARY:"+(e.title||""),"DESCRIPTION:"+(e.description||""),"LOCATION:"+(e.address||""),"END:VEVENT","END:VCALENDAR"].join("\n"));return''+i+" Calendar"},ical:function(e){return this.ics(e,"icon-ical","iCal")},outlook:function(e){return this.ics(e,"icon-outlook","Outlook")}};var s=function(e){return{google:i.google(e),yahoo:i.yahoo(e),ical:i.ical(e),outlook:i.outlook(e)}};var o=function(){if(!document.getElementById("ouical-css")){document.getElementsByTagName("head")[0].appendChild(u())}};var u=function(){var e=document.createElement("style");e.id="ouical-css";e.innerHTML="#add-to-calendar-checkbox-label{cursor:pointer}.add-to-calendar-checkbox~a{display:none}.add-to-calendar-checkbox:checked~a{display:block;width:150px;margin-left:20px}input[type=checkbox].add-to-calendar-checkbox{position:absolute;top:-9999px;left:-9999px}.add-to-calendar-checkbox~a:before{width:16px;height:16px;display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAAAQCAYAAACIoli7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0MzJCRDU2NUE1MDIxMUUyOTY1Q0EwNTkxNEJDOUIwNCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0MzJCRDU2NkE1MDIxMUUyOTY1Q0EwNTkxNEJDOUIwNCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjQzMkJENTYzQTUwMjExRTI5NjVDQTA1OTE0QkM5QjA0IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjQzMkJENTY0QTUwMjExRTI5NjVDQTA1OTE0QkM5QjA0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+1Gcb3QAACh1JREFUeNrEWAtw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);margin-right:.5em;content:' '}.icon-ical:before{background-position:-68px 0}.icon-outlook:before{}.icon-yahoo:before{background-position:-36px +4px}.icon-google:before{background-position:-52px 0}";return e};var a=function(e){return e.data!==undefined&&e.data.start!==undefined&&(e.data.end!==undefined||e.data.duration!==undefined)};var f=function(e,t,n){var r=document.createElement("div");r.innerHTML='';r.innerHTML+='';Object.keys(e).forEach(function(t){r.innerHTML+=e[t]});r.className="add-to-calendar";if(t!==undefined){r.className+=" "+t}o();r.id=n;return r};var l=function(e){if(e.options&&e.options.class){return e.options.class}};var c=function(e){return e.options&&e.options.id?e.options.id:Math.floor(Math.random()*1e6)};e.createCalendar=function(e){if(!a(e)){console.log("Event details missing.");return}return f(s(e.data),l(e),c(e))}})(this); \ No newline at end of file