// This file is used when a user tries to export the entire CryptDrive. // Calendars will be exported using this format instead of plain text. define([ '/customize/pages.js', ], function (Pages) { var module = {}; var getICSDate = function (str) { var date = new Date(str); var m = date.getUTCMonth() + 1; var d = date.getUTCDate(); var h = date.getUTCHours(); var min = date.getUTCMinutes(); var year = date.getUTCFullYear().toString(); var month = m < 10 ? "0" + m : m.toString(); var day = d < 10 ? "0" + d : d.toString(); var hours = h < 10 ? "0" + h : h.toString(); var minutes = min < 10 ? "0" + min : min.toString(); return year + month + day + "T" + hours + minutes + "00Z"; } var getDate = function (str, end) { var date = new Date(str); if (end) { date.setDate(date.getDate() + 1); } var m = date.getUTCMonth() + 1; var d = date.getUTCDate(); var year = date.getUTCFullYear().toString(); var month = m < 10 ? "0" + m : m.toString(); var day = d < 10 ? "0" + d : d.toString(); return year+month+day; }; var MINUTE = 60; var HOUR = MINUTE * 60; var DAY = HOUR * 24; module.main = function (userDoc) { var content = userDoc.content; var md = userDoc.metadata; var ICS = [ 'BEGIN:VCALENDAR', 'VERSION:2.0', 'PRODID:-//CryptPad//CryptPad Calendar '+Pages.versionString+'//EN', 'METHOD:PUBLISH', ]; Object.keys(content).forEach(function (uid) { var data = content[uid]; // DTSTAMP: now... // UID: uid var start, end; if (data.isAllDay && data.startDay && data.endDay) { start = "DTSTART;VALUE=DATE:" + getDate(data.startDay); end = "DTEND;VALUE=DATE:" + getDate(data.endDay, true); } else { start = "DTSTART:"+getICSDate(data.start); end = "DTEND:"+getICSDate(data.end); } Array.prototype.push.apply(ICS, [ 'BEGIN:VEVENT', 'DTSTAMP:'+getICSDate(+new Date()), 'UID:'+uid, start, end, 'SUMMARY:'+ data.title, 'LOCATION:'+ data.location, ]); if (Array.isArray(data.reminders)) { data.reminders.forEach(function (valueMin) { var time = valueMin * 60; var days = Math.floor(time / DAY); time -= days * DAY; var hours = Math.floor(time / HOUR); time -= hours * HOUR; var minutes = Math.floor(time / MINUTE); time -= minutes * MINUTE; var seconds = time; var str = "-P" + days + "D"; if (hours || minutes || seconds) { str += "T" + hours + "H" + minutes + "M" + seconds + "S"; } Array.prototype.push.apply(ICS, [ 'BEGIN:VALARM', 'ACTION:DISPLAY', 'DESCRIPTION:This is an event reminder', 'TRIGGER:'+str, 'END:VALARM' ]); // XXX ACTION:EMAIL // XXX ATTENDEE:mailto:xxx@xxx.xxx // XXX SUMMARY:Alarm notification }); } // XXX add hidden data (from imports) ICS.push('END:VEVENT'); }); ICS.push('END:VCALENDAR'); return new Blob([ ICS.join('\n') ], { type: 'text/calendar;charset=utf-8' }); }; return module; });