-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcalendarize.min.js
More file actions
1 lines (1 loc) 路 8.11 KB
/
Copy pathcalendarize.min.js
File metadata and controls
1 lines (1 loc) 路 8.11 KB
1
var saveAs=saveAs||function(b){"use strict";if(!("undefined"==typeof b||"undefined"!=typeof navigator&&/MSIE [1-9]\./.test(navigator.userAgent))){var d=b.document,g=function(){return b.URL||b.webkitURL||b},e=d.createElementNS("http://www.w3.org/1999/xhtml","a"),j="download"in e,k=function(a){var b=new MouseEvent("click");a.dispatchEvent(b)},a=/constructor/i.test(b.HTMLElement)||b.safari,i=/CriOS\/[\d]+/.test(navigator.userAgent),f=function(a){(b.setImmediate||b.setTimeout)(function(){throw a},0)},n=function(a){setTimeout(function(){"string"==typeof a?g().revokeObjectURL(a):a.remove()},40000)},c=function(a,b,c){b=[].concat(b);for(var d,e=b.length;e--;)if(d=a["on"+b[e]],"function"==typeof d)try{d.call(a,c||a)}catch(b){f(b)}},l=function(a){var b=String.fromCharCode;return /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob([b(65279),a],{type:a.type}):a},h=function(f,o,p){p||(f=l(f));var d,q=this,r=f.type,s="application/octet-stream"===r,m=function(){c(q,["writestart","progress","write","writeend"])},h=function(){if((i||s&&a)&&b.FileReader){var c=new FileReader;return c.onloadend=function(){var a=i?c.result:c.result.replace(/^data:[^;]*;/,"data:attachment/file;"),d=b.open(a,"_blank");d||(b.location.href=a),a=void 0,q.readyState=q.DONE,m()},c.readAsDataURL(f),void(q.readyState=q.INIT)}if(d||(d=g().createObjectURL(f)),s)b.location.href=d;else{var e=b.open(d,"_blank");e||(b.location.href=d)}q.readyState=q.DONE,m(),n(d)};return q.readyState=q.INIT,j?(d=g().createObjectURL(f),void setTimeout(function(){e.href=d,e.download=o,k(e),m(),n(d),q.readyState=q.DONE})):void h()},o=h.prototype,p=function(a,b,c){return new h(a,b||a.name||"download",c)};return"undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob?function(a,b,c){return b=b||a.name||"download",c||(a=l(a)),navigator.msSaveOrOpenBlob(a,b)}:(o.abort=function(){},o.readyState=o.INIT=0,o.WRITING=1,o.DONE=2,o.error=o.onwritestart=o.onprogress=o.onwrite=o.onabort=o.onerror=o.onwriteend=null,p)}}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this.content);"undefined"!=typeof module&&module.exports?module.exports.saveAs=saveAs:"undefined"!=typeof define&&null!==define&&null!==define.amd&&define("FileSaver.js",function(){return saveAs});var ics=function(k,b){"use strict";{if(!(-1<navigator.userAgent.indexOf("MSIE")&&-1==navigator.userAgent.indexOf("MSIE 10"))){void 0===k&&(k="default"),void 0===b&&(b="Calendar");var q=-1===navigator.appVersion.indexOf("Win")?"\n":"\r\n",r=[],c=["BEGIN:VCALENDAR","PRODID:"+b,"VERSION:2.0"].join(q),d=q+"END:VCALENDAR",f=["SU","MO","TU","WE","TH","FR","SA"];return{events:function(){return r},calendar:function(){return c+q+r.join(q)+d},addEvent:function(a,e,i,n,l,o){if(void 0===a||void 0===e||void 0===i||void 0===n||void 0===l)return!1;if(o&&!o.rrule){if("YEARLY"!==o.freq&&"MONTHLY"!==o.freq&&"WEEKLY"!==o.freq&&"DAILY"!==o.freq)throw"Recurrence rrule frequency must be provided and be one of the following: 'YEARLY', 'MONTHLY', 'WEEKLY', or 'DAILY'";if(o.until&&isNaN(Date.parse(o.until)))throw"Recurrence rrule 'until' must be a valid date string";if(o.interval&&isNaN(parseInt(o.interval)))throw"Recurrence rrule 'interval' must be an integer";if(o.count&&isNaN(parseInt(o.count)))throw"Recurrence rrule 'count' must be an integer";if(void 0!==o.byday){if("[object Array]"!==Object.prototype.toString.call(o.byday))throw"Recurrence rrule 'byday' must be an array";if(7<o.byday.length)throw"Recurrence rrule 'byday' array must not be longer than the 7 days in a week";for(var s in o.byday=o.byday.filter(function(a,b){return o.byday.indexOf(a)==b}),o.byday)if(0>f.indexOf(o.byday[s]))throw"Recurrence rrule 'byday' values must include only the following: 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'"}}var t=new Date(n),g=new Date(l),d=new Date,u=("0000"+t.getFullYear().toString()).slice(-4),z=("00"+(t.getMonth()+1).toString()).slice(-2),E=("00"+t.getDate().toString()).slice(-2),v=("00"+t.getHours().toString()).slice(-2),y=("00"+t.getMinutes().toString()).slice(-2),A=("00"+t.getSeconds().toString()).slice(-2),F=("0000"+g.getFullYear().toString()).slice(-4),b=("00"+(g.getMonth()+1).toString()).slice(-2),D=("00"+g.getDate().toString()).slice(-2),G=("00"+g.getHours().toString()).slice(-2),h=("00"+g.getMinutes().toString()).slice(-2),I=("00"+g.getMinutes().toString()).slice(-2),J=("0000"+d.getFullYear().toString()).slice(-4),K=("00"+(d.getMonth()+1).toString()).slice(-2),w=("00"+d.getDate().toString()).slice(-2),L=("00"+d.getHours().toString()).slice(-2),M=("00"+d.getMinutes().toString()).slice(-2),p=("00"+d.getMinutes().toString()).slice(-2),N="",O="";0!=v+y+A+G+h+I&&(N="T"+v+y+A,O="T"+G+h+I);var P,Q=u+z+E+N,C=F+b+D+O,j=J+K+w+("T"+L+M+p);if(o)if(o.rrule)P=o.rrule;else{if(P="rrule:FREQ="+o.freq,o.until){var m=new Date(Date.parse(o.until)).toISOString();P+=";UNTIL="+m.substring(0,m.length-13).replace(/[-]/g,"")+"000000Z"}o.interval&&(P+=";INTERVAL="+o.interval),o.count&&(P+=";COUNT="+o.count),o.byday&&0<o.byday.length&&(P+=";BYDAY="+o.byday.join(","))}new Date().toISOString();var x=["BEGIN:VEVENT","UID:"+r.length+"@"+k,"CLASS:PUBLIC","DESCRIPTION:"+e,"DTSTAMP;VALUE=DATE-TIME:"+j,"DTSTART;VALUE=DATE-TIME:"+Q,"DTEND;VALUE=DATE-TIME:"+C,"LOCATION:"+i,"SUMMARY;LANGUAGE=en-us:"+a,"TRANSP:TRANSPARENT","END:VEVENT"];return P&&x.splice(4,0,P),x=x.join(q),r.push(x),x},download:function(b,f){if(1>r.length)return!1;f=void 0===f?".ics":f,b=void 0===b?"calendar":b;var g,h=c+q+r.join(q)+d;if(-1===navigator.userAgent.indexOf("MSIE 10"))g=new Blob([h]);else{var i=new BlobBuilder;i.append(h),g=i.getBlob("text/x-vCalendar;charset="+document.characterSet)}return saveAs(g,b+f),h},build:function(){return!(1>r.length)&&c+q+r.join(q)+d}}}console.log("Unsupported Browser")}},EVENT_LINE_SEPARATOR=-1===navigator.appVersion.indexOf("Win")?"\n":"\r\n",DAY_MAP={0:"SU",M:"MO",2:"TU",W:"WE",4:"TH",F:"FR",6:"SA"},MS_PER_DAY=86400000,MS_PER_10_WEEKS=70*MS_PER_DAY;function getText(a,b){const c=a.querySelector(`[aria-describedby="${b}"]`);if(!c)throw alert("The WebReg table does not follow the expected format!"),Error(`No element with label ${b} could be found!`);return c.textContent.trim()}function toDayInWeek(a,b){let c=new Date(a);for(;c.getUTCDay()!==b;)c=new Date(c-MS_PER_DAY);return c.toISOString().split("T")[0]}function daysToArray(a,b={asNums:!1}){return a=a.replace("Su","0"),a=a.replace("Tu","2"),a=a.replace("Th","4"),a=a.replace("Sa","6"),b.asNums?(a=a.replace("M","1"),a=a.replace("W","3"),a=a.replace("F","5"),a.split("").map(a=>parseInt(a))):a.split("").map(a=>DAY_MAP[a])}var table=document.getElementById("list-id-table");if(!table)throw alert("The WebReg table could not be found on this page!"),Error("No table with id #list-id-table could be found!");var tableRows=Array.from(table.querySelector("tbody").children);tableRows.shift();var courseRows={},currentCourse=[],prevCourseTitle="";tableRows.forEach((a,b)=>{const c=a.firstElementChild.textContent.trim();c&&(0!==b&&(courseRows[prevCourseTitle]=currentCourse,currentCourse=[]),prevCourseTitle=c),currentCourse.push(a)}),courseRows[prevCourseTitle]=currentCourse;var courseEvents={};for(const a in courseRows){const b={},c=courseRows[a];c.forEach(a=>{const c=getText(a,"list-id-table_FK_CDI_INSTR_TYPE"),d={};d.days=getText(a,"list-id-table_DAY_CODE"),d.time=getText(a,"list-id-table_coltime");const e=getText(a,"list-id-table_BLDG_CODE"),f=getText(a,"list-id-table_ROOM_CODE");d.location=`${e} ${f}`,b[c]=d}),courseEvents[a]=b}var cal=ics();for(const a in courseEvents){const b=courseEvents[a];if(!b.hasOwnProperty("FI"))continue;const c=b.FI.days.split(" ")[1];for(const d in b){const e=`${a} - ${d}`,{days:f,location:g,time:h}=b[d];if("TBA"===f||"TBA"===h)continue;const i=daysToArray(f,{asNums:!0})[0],j="FI"==d?c:toDayInWeek(new Date(c)-MS_PER_10_WEEKS,i),[k,l]=h.split("-").map(a=>a.slice(0,-1)+" "+a.slice(-1)+"m"),m=`${j} ${k}`,n=`${j} ${l}`;if("FI"!=d){const a={};a.freq="WEEKLY",a.until=toDayInWeek(c,0),a.byday=daysToArray(f),cal.addEvent(e,"",g,m,n,a)}else cal.addEvent(e,"",g,m,n)}}var updatedEvents=cal.events().map(a=>a.split(EVENT_LINE_SEPARATOR).filter(a=>!a.startsWith("UID")).join(EVENT_LINE_SEPARATOR));cal.events().splice(0,cal.events().length),cal.events().splice(0,0,...updatedEvents),cal.download("Course Calendar");