diff --git a/css/styles.css b/css/styles.css index 2ecf1619..fe83cfa0 100644 --- a/css/styles.css +++ b/css/styles.css @@ -31,6 +31,7 @@ animation: spin 2s linear infinite; } + @keyframes spin { 0% { transform: rotate(0deg); @@ -73,10 +74,16 @@ .dateTimePlace { margin-left: 5px; + margin-bottom: 0px; font-size: smaller; font-weight: bold; } +#chartcontainer { + max-width: 100%; + height: 250px; +} + #chart { min-width: auto; max-width: 100%; diff --git a/js/background.js b/js/background.js index 0953cab1..31abec64 100644 --- a/js/background.js +++ b/js/background.js @@ -1,6 +1,8 @@ updateBadge(true); +var grades; +loadDataBase() /* Handle messages and their commands from content and popup scripts*/ -chrome.runtime.onMessage.addListener(function(request, sender, response) { +chrome.runtime.onMessage.addListener(function (request, sender, response) { switch (request.command) { case "courseStorage": if (request.action == "add") { @@ -31,6 +33,8 @@ chrome.runtime.onMessage.addListener(function(request, sender, response) { case "updateCourseList": updateTabs(); break; + case "gradesQuery": + executeQuery(request.query, response); default: const xhr = new XMLHttpRequest(); const method = request.method ? request.method.toUpperCase() : "GET"; @@ -51,35 +55,35 @@ chrome.runtime.onMessage.addListener(function(request, sender, response) { }); /* Initially set the course data in storage */ -chrome.runtime.onInstalled.addListener(function(details) { +chrome.runtime.onInstalled.addListener(function (details) { if (details.reason == "install") { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { if (!data.savedCourses) { var arr = new Array(); chrome.storage.sync.set({ savedCourses: arr - }, function() { + }, function () { console.log('initial course list'); }); chrome.storage.sync.set({ courseConflictHighlight: true - }, function() { + }, function () { console.log('initial highlighting: true'); }); chrome.storage.sync.set({ loadAll: true - }, function() { + }, function () { console.log('initial loadAll: true'); }); } }); } else if (details.reason == "update") { console.log("updated"); - chrome.storage.sync.get('loadAll', function(data) { + chrome.storage.sync.get('loadAll', function (data) { if (data.loadAll == undefined) { chrome.storage.sync.set({ loadAll: true - }, function() { + }, function () { console.log('initial loadAll: true'); }); } @@ -88,8 +92,39 @@ chrome.runtime.onInstalled.addListener(function(details) { }); +function executeQuery(query, sendResponse) { + console.log(grades) + var res = grades.exec(query)[0]; + sendResponse({ + data: res, + }); +} + + +/* Load the database*/ +function loadDataBase() { + sql = window.SQL; + loadBinaryFile('grades.db', function (data) { + var sqldb = new SQL.Database(data); + grades = sqldb; + }); +} +/* load the database from file */ +function loadBinaryFile(path, success) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", chrome.extension.getURL(path), true); + xhr.responseType = "arraybuffer"; + xhr.onload = function () { + var data = new Uint8Array(xhr.response); + var arr = new Array(); + for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); + success(arr.join("")); + }; + xhr.send(); +}; + function updateBadge(first) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { if (data.savedCourses) { let text = ""; if (data.savedCourses.length > 0) { @@ -105,7 +140,7 @@ function updateBadge(first) { }); timeout = 200; } - setTimeout(function() { + setTimeout(function () { chrome.browserAction.setBadgeBackgroundColor({ color: '#bf5700' }); @@ -117,7 +152,7 @@ function updateBadge(first) { /* Find all the conflicts in the courses and send them out/ if there is even a conflict*/ function checkConflicts(sendResponse) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { var conflicts = []; var courses = data.savedCourses; for (var i = 0; i < courses.length; i++) { @@ -144,7 +179,7 @@ function checkConflicts(sendResponse) { /* Find if the course at unique and with currdatearr is contained in the saved courses and if it conflicts with any other courses*/ function isSingleConflict(currdatearr, unique, sendResponse) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { var courses = data.savedCourses; var conflict = false; for (var i = 0; i < courses.length; i++) { @@ -188,7 +223,7 @@ function isConflict(adtarr, bdtarr) { /* Add the requested course to the storage*/ function add(request, sender, sendResponse) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { var courses = data.savedCourses; if (!contains(courses, request.course.unique)) { courses.push(request.course) @@ -206,7 +241,7 @@ function add(request, sender, sendResponse) { } /* Find and Remove the requested course from the storage*/ function remove(request, sender, sendResponse) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { var courses = data.savedCourses; console.log(courses); var index = 0; @@ -227,7 +262,7 @@ function remove(request, sender, sendResponse) { /* Find if the unique is already contained within the storage*/ function alreadyContains(unique, sendResponse) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { var courses = data.savedCourses; sendResponse({ alreadyContains: contains(courses, unique) @@ -247,7 +282,7 @@ function contains(courses, unique) { } function updateTabs() { - chrome.tabs.query({}, function(tabs) { + chrome.tabs.query({}, function (tabs) { for (var i = 0; i < tabs.length; i++) { chrome.tabs.sendMessage(tabs[i].id, { command: "updateCourseList" @@ -260,7 +295,7 @@ const UPDATE_INTERVAL = 1000 * 60 * 16; setInterval(updateStatus, UPDATE_INTERVAL); // updateStatus(); function updateStatus(sendResponse) { - chrome.storage.sync.get('savedCourses', function(data) { + chrome.storage.sync.get('savedCourses', function (data) { var courses = data.savedCourses; var nochange = true; for (let i = 0; i < courses.length; i++) { @@ -268,25 +303,29 @@ function updateStatus(sendResponse) { let c = courses[i]; let oldstatus = c.status; let oldlink = c.link; - $.ajax({url: oldlink, success: function(result){ - if(result){ - console.log(result); - var object = $('
').html(result).contents(); - let newstatus = object.find('[data-th="Status"]').text(); - let registerlink = object.find('td[data-th="Add"] a'); - if (registerlink) { - registerlink = registerlink.attr('href'); + $.ajax({ + url: oldlink, + success: function (result) { + if (result) { + console.log(result); + var object = $('
').html(result).contents(); + let newstatus = object.find('[data-th="Status"]').text(); + let registerlink = object.find('td[data-th="Add"] a'); + if (registerlink) { + registerlink = registerlink.attr('href'); + } + var haschanged = (newstatus == oldstatus && registerlink == oldlink); + if (!haschanged) { + console.log(c.unique + ' updated from ' + oldstatus + " to " + newstatus + " and " + oldlink + " to " + registerlink); + } + nochange &= haschanged; + c.registerlink = registerlink; + c.status = newstatus; } - var haschanged = (newstatus == oldstatus && registerlink == oldlink); - if (!haschanged) { - console.log(c.unique + ' updated from ' + oldstatus + " to " + newstatus + " and " + oldlink + " to " + registerlink); - } - nochange &= haschanged; - c.registerlink = registerlink; - c.status = newstatus; - }}}); - - + } + }); + + } catch (e) { console.log(e); console.log('Not logged into UT Coursebook. Could not update class statuses.'); diff --git a/js/config.js b/js/config.js new file mode 100644 index 00000000..a592cccd --- /dev/null +++ b/js/config.js @@ -0,0 +1,2 @@ +const fadetime = 150; +const butdelay = 75; \ No newline at end of file diff --git a/js/content.js b/js/content.js index e3e71f30..849f97af 100644 --- a/js/content.js +++ b/js/content.js @@ -1,4 +1,3 @@ -var grades; var rmpLink; var next; var bottom; @@ -20,18 +19,11 @@ var semesterCode; var isIndividual = false; var done = true; -const days = new Map([ - ["M", "Monday"], - ["T", "Tuesday"], - ["W", "Wednesday"], - ["TH", "Thursday"], - ["F", "Friday"] -]); -const fadetime = 150; -const butdelay = 75; + //This extension may be super lit, but you know what's even more lit? //Matthew Tran's twitter and insta: @MATTHEWTRANN and @matthew.trann +console.log('UT Registration Plus is running on this page.'); if (document.querySelector('#fos_fl')) { let params = (new URL(document.location)).searchParams; @@ -44,14 +36,17 @@ if (document.querySelector('#fos_fl')) { } } } -next = $("#next_nav_link"); -chrome.storage.sync.get('loadAll', function (data) { - if (data.loadAll) { - $('[title*="next listing"]').remove(); - } -}); -loadDataBase(); + +next = $("#next_nav_link"); +if (next) { + chrome.storage.sync.get('loadAll', function (data) { + if (data.loadAll) { + $('[title*="next listing"]').remove(); + } + }); +} + //make heading and modal if (!$("#kw_results_table").length) { $("table thead th:last-child").after('Plus'); @@ -111,7 +106,7 @@ if (!$("#kw_results_table").length) { //update the conflicts update(0); /*Handle the button clicks*/ -$("tbody").on('click', '#distButton', function () { +$("body").on('click', '#distButton', function () { var row = $(this).closest('tr'); $('.modal-content').stop().animate({ scrollTop: 0 @@ -205,7 +200,7 @@ function loadNextPages() { nextpage.find('tbody>tr').each(function () { let hasCourseHead = $(this).find('td').hasClass("course_header"); if (!(hasCourseHead && $(this).has('th').length == 0)) { - $(this).append(``); + $(this).append(``); // if ($(this).find('td[data-th="Status"]').text().includes('waitlisted')) { // $(this).find('td').each(function () { // $(this).css('background-color', '#E0E0E0'); @@ -338,7 +333,7 @@ function Course(coursename, unique, profname, datetimearr, status, link, registe /*For a row, get all the course information and add the date-time-lines*/ function getCourseInfo(row) { - console.log('WHAT'); + console.log(row); semesterCode = new URL(window.location.href).pathname.split('/')[4]; $("h2.dateTimePlace").remove(); $('table').find('tr').each(function () { @@ -452,27 +447,29 @@ function getDistribution(sem) { query += "and sem like '%" + sem + "%'"; } query += "order by a1+a2+a3+b1+b2+b3+c1+c2+c3+d1+d2+d3+f desc"; - var res = grades.exec(query)[0]; - var output = ""; - if (!sem) { - openDialog(department, coursename, "aggregate", profname, res); - } else { - var data; - if (typeof res == 'undefined' || profname == "") { - data = []; + chrome.runtime.sendMessage({ + command: "gradesQuery", + query: query + }, function (response) { + var res = response.data; + if (!sem) { + openDialog(department, coursename, "aggregate", profname, res); } else { - data = res.values[0]; + var data; + if (typeof res == 'undefined' || profname == "") { + data = []; + } else { + data = res.values[0]; + } + setChart(data); } - setChart(data); - } + }); } /*Open the modal and show all the data*/ function openDialog(dep, cls, sem, professor, res) { $("#myModal").fadeIn(fadetime); //initial text on the "save course button" - - chrome.runtime.sendMessage({ command: "alreadyContains", unique: uniquenum @@ -487,35 +484,11 @@ function openDialog(dep, cls, sem, professor, res) { var data; $("#semesters").empty(); if (typeof res == 'undefined' || profname == "") { - data = []; $("#semesters").append("") + data = []; } else { var semesters = res.values[0][18].split(","); - semesters.sort(function (a, b) { - var as = a.split(' ')[0]; - var ay = parseInt(a.split(' ')[1]); - var bs = b.split(' ')[0]; - var by = parseInt(b.split(' ')[1]); - if (ay < by) { - return -1; - } - if (ay > by) { - return 1; - } - var seas = { - "Spring": 0, - "Fall": 1, - "Summer": 2, - "Winter": 3 - } - if (seas[as] < seas[bs]) { - return -1; - } - if (seas[as] > seas[bs]) { - return 1; - } - return 0; - }); + semesters.sort(semesterSort); semesters.reverse().unshift('Aggregate'); var sems = []; for (var i = 0; i < semesters.length; i++) { @@ -568,112 +541,7 @@ function close() { function setChart(data) { //set up the chart - chart = Highcharts.chart('chart', { - chart: { - type: 'column', - backgroundColor: ' #fefefe', - spacingLeft: 10 - }, - title: { - text: null - }, - subtitle: { - text: null - }, - legend: { - enabled: false - }, - xAxis: { - title: { - text: 'Grades' - }, - categories: [ - 'A', - 'A-', - 'B+', - 'B', - 'B-', - 'C+', - 'C', - 'C-', - 'D+', - 'D', - 'D-', - 'F' - ], - crosshair: true - }, - yAxis: { - min: 0, - title: { - text: 'Students' - } - }, - credits: { - enabled: false - }, - lang: { - noData: "The professor hasn't taught this class :(" - }, - tooltip: { - headerFormat: '{point.key}', - pointFormat: '', - footerFormat: '
{point.y:.0f} Students
', - shared: true, - useHTML: true - }, - plotOptions: { - bar: { - pointPadding: 0.2, - borderWidth: 0 - }, - series: { - animation: { - duration: 700 - } - } - }, - series: [{ - name: 'Grades', - data: [{ - y: data[6], - color: '#4CAF50' - }, { - y: data[7], - color: '#8BC34A' - }, { - y: data[8], - color: '#CDDC39' - }, { - y: data[9], - color: '#FFEB3B' - }, { - y: data[10], - color: '#FFC107' - }, { - y: data[11], - color: '#FFA000' - }, { - y: data[12], - color: '#F57C00' - }, { - y: data[13], - color: '#FF5722' - }, { - y: data[14], - color: '#FF5252' - }, { - y: data[15], - color: '#E64A19' - }, { - y: data[16], - color: '#F44336' - }, { - y: data[17], - color: '#D32F2F' - }] - }] - }, function (chart) { // on complete + chart = Highcharts.chart('chart', buildChartConfig(data), function (chart) { // on complete if (data.length == 0) { //if no data, then show the message and hide the series chart.renderer.text('Could not find data for this Instructor teaching this Course.', 100, 120) @@ -716,77 +584,59 @@ function getDescription() { // console.log(window.location.href); // console.log(profurl); console.log('hello'); - $.ajax({url: profurl, success: function(response){ - if (response) { - console.log(profurl); - var output = ""; - var object = $('
').html(response).contents(); - object.find('#details > p').each(function () { - var sentence = $(this).text(); - if (sentence.indexOf("Prerequisite") == 0) { - sentence = "
  • " + sentence + "
  • "; - } else if (sentence.indexOf("May be") >= 0) { - sentence = "
  • " + sentence + "
  • "; - } else if (sentence.indexOf("Restricted to") == 0) { - sentence = "
  • " + sentence + "
  • "; - } else { - sentence = "
  • " + sentence + "
  • "; + $.ajax({ + url: profurl, + success: function (response) { + if (response) { + console.log(profurl); + var output = ""; + var object = $('
    ').html(response).contents(); + object.find('#details > p').each(function () { + var sentence = $(this).text(); + if (sentence.indexOf("Prerequisite") == 0) { + sentence = "
  • " + sentence + "
  • "; + } else if (sentence.indexOf("May be") >= 0) { + sentence = "
  • " + sentence + "
  • "; + } else if (sentence.indexOf("Restricted to") == 0) { + sentence = "
  • " + sentence + "
  • "; + } else { + sentence = "
  • " + sentence + "
  • "; + } + output += sentence; + }); + description = output; + console.log(response); + if (!description) { + description = "

    There was an error. Please refresh the page and/or log back in using your UT EID and password.

    " + } + $("#description").animate({ + 'opacity': 0 + }, 200, function () { + $(this).html(description).animate({ + 'opacity': 1 + }, 200); + }); + var first = object.find('td[data-th="Instructor"]').text(); + first = first.substring(first.indexOf(", "), first.indexOf(" ", first.indexOf(", ") + 2)); + first = first.substring(2); + rmpLink = `http://www.ratemyprofessors.com/search.jsp?queryBy=teacherName&schoolName=university+of+texas+at+austin&queryoption=HEADER&query=${first} ${profname};&facetSearch=true`; + if (profname == "") { + eCISLink = `http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?s_in_action_sw=S&s_in_search_type_sw=C&s_in_max_nbr_return=10&s_in_search_course_dept=${department}&s_in_search_course_num=${course_nbr}`; + } else { + eCISLink = `http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?&s_in_action_sw=S&s_in_search_type_sw=N&s_in_search_name=${profname.substring(0, 1) + profname.substring(1).toLowerCase()}%2C%20${first.substring(0, 1) + first.substring(1).toLowerCase()}`; } - output += sentence; - }); - description = output; - console.log(response); - if (!description) { - description = "

    You have been logged out. Please refresh the page and log back in using your UT EID and password.

    " - } - $("#description").animate({ - 'opacity': 0 - }, 200, function () { - $(this).html(description).animate({ - 'opacity': 1 - }, 200); - }); - var first = object.find('td[data-th="Instructor"]').text(); - first = first.substring(first.indexOf(", "), first.indexOf(" ", first.indexOf(", ") + 2)); - first = first.substring(2); - rmpLink = `http://www.ratemyprofessors.com/search.jsp?queryBy=teacherName&schoolName=university+of+texas+at+austin&queryoption=HEADER&query=${first} ${profname};&facetSearch=true`; - if (profname == "") { - eCISLink = `http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?s_in_action_sw=S&s_in_search_type_sw=C&s_in_max_nbr_return=10&s_in_search_course_dept=${department}&s_in_search_course_num=${course_nbr}`; } else { - eCISLink = `http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?&s_in_action_sw=S&s_in_search_type_sw=N&s_in_search_name=${profname.substring(0, 1) + profname.substring(1).toLowerCase()}%2C%20${first.substring(0, 1) + first.substring(1).toLowerCase()}`; + description = "

    You have been logged out. Please refresh the page and log back in using your UT EID and password.

    " + $("#description").animate({ + 'opacity': 0 + }, 200, function () { + $(this).html(description).animate({ + 'opacity': 1 + }, 200); + }); + rmpLink = "http://www.ratemyprofessors.com/campusRatings.jsp?sid=1255"; + eCISLink = "http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?"; } - } else { - description = "

    You have been logged out. Please refresh the page and log back in using your UT EID and password.

    " - $("#description").animate({ - 'opacity': 0 - }, 200, function () { - $(this).html(description).animate({ - 'opacity': 1 - }, 200); - }); - rmpLink = "http://www.ratemyprofessors.com/campusRatings.jsp?sid=1255"; - eCISLink = "http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?"; } - }}); -} -/* Load the database*/ -function loadDataBase() { - sql = window.SQL; - loadBinaryFile('grades.db', function (data) { - var sqldb = new SQL.Database(data); - grades = sqldb; }); -} -/* load the database from file */ -function loadBinaryFile(path, success) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", chrome.extension.getURL(path), true); - xhr.responseType = "arraybuffer"; - xhr.onload = function () { - var data = new Uint8Array(xhr.response); - var arr = new Array(); - for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); - success(arr.join("")); - }; - xhr.send(); -}; \ No newline at end of file +} \ No newline at end of file diff --git a/js/jquery.initialize.min.js b/js/jquery.initialize.min.js new file mode 100644 index 00000000..9ea59e98 --- /dev/null +++ b/js/jquery.initialize.min.js @@ -0,0 +1 @@ +(function($){"use strict";var combinators=[" ",">","+","~"];var fraternisers=["+","~"];var complexTypes=["ATTR","PSEUDO","ID","CLASS"];function grok(msobserver){if(!$.find.tokenize){msobserver.isCombinatorial=true;msobserver.isFraternal=true;msobserver.isComplex=true;return}msobserver.isCombinatorial=false;msobserver.isFraternal=false;msobserver.isComplex=false;var token=$.find.tokenize(msobserver.selector);for(var i=0;i bYear) + return 1; + if (semOrder[aName] < semOrder[bName]) + return -1; + if (semOrder[aName] > semOrder[bName]) + return 1; + return 0; +} + +function buildChartConfig(data) { + return { + chart: { + type: 'column', + backgroundColor: ' #fefefe', + spacingLeft: 10 + }, + title: { + text: null + }, + subtitle: { + text: null + }, + legend: { + enabled: false + }, + xAxis: { + title: { + text: 'Grades' + }, + categories: [ + 'A', + 'A-', + 'B+', + 'B', + 'B-', + 'C+', + 'C', + 'C-', + 'D+', + 'D', + 'D-', + 'F' + ], + crosshair: true + }, + yAxis: { + min: 0, + title: { + text: 'Students' + } + }, + credits: { + enabled: false + }, + lang: { + noData: "The professor hasn't taught this class :(" + }, + tooltip: { + headerFormat: '{point.key}', + pointFormat: '', + footerFormat: '
    {point.y:.0f} Students
    ', + shared: true, + useHTML: true + }, + plotOptions: { + bar: { + pointPadding: 0.2, + borderWidth: 0 + }, + series: { + animation: { + duration: 700 + } + } + }, + series: [{ + name: 'Grades', + data: [{ + y: data[6], + color: '#4CAF50' + }, { + y: data[7], + color: '#8BC34A' + }, { + y: data[8], + color: '#CDDC39' + }, { + y: data[9], + color: '#FFEB3B' + }, { + y: data[10], + color: '#FFC107' + }, { + y: data[11], + color: '#FFA000' + }, { + y: data[12], + color: '#F57C00' + }, { + y: data[13], + color: '#FF5722' + }, { + y: data[14], + color: '#FF5252' + }, { + y: data[15], + color: '#E64A19' + }, { + y: data[16], + color: '#F44336' + }, { + y: data[17], + color: '#D32F2F' + }] + }] + } +} \ No newline at end of file diff --git a/js/utplanner.js b/js/utplanner.js new file mode 100644 index 00000000..65099566 --- /dev/null +++ b/js/utplanner.js @@ -0,0 +1,241 @@ +if ($('html').hasClass('gr__utexas_collegescheduler_com')) { + $.initialize("table.section-detail-grid", function () { + $(this).find('thead>tr').append(' Plustr').each(function () { + $(this).append(``); + }) + }); +} + +curr_course = {} +var modhtml = ``; +$("body").prepend(modhtml); + +$("body").on('click', '#distButton', function () { + var row = $(this).closest('tr'); + console.log(row.text()) + $('.modal-content').stop().animate({ + scrollTop: 0 + }, 500); + $(this).blur(); + getCourseInfo(row) +}); + + +function getCourseInfo(row) { + let rowdata = $(row).find('td').slice(3).toArray().map(x => $(x).text().trim()); + let [uniquenum, department, coursenum, coursename, profname, notes, rawtime] = rowdata + let profinit = "" + if (profname !== undefined && profname != "Staff") { + profinit = profname.split(',')[1].trim(); + profname = profname.split(',')[0].trim(); + } + let times = rawtime.split('\n').map(x => x.trim()); + var course_data = { + "unique": uniquenum, + "department": department, + "number": coursenum, + "name": coursename, + "prof_name": profname, + "initial": profinit, + "notes": notes, + "times": times, + } + curr_course = course_data; + getDistribution(course_data); + var modal = document.getElementById('myModal'); + window.onclick = function (event) { + if (event.target == modal) { + close(); + } + } +} + +function badData(course_data, res) { + return typeof res == 'undefined' || course_data["prof_name"] == "Staff"; +} + +$("#semesters").on('change', function () { + var sem = $(this).val(); + sem = sem == "Aggregate" ? undefined : sem; + getDistribution(curr_course, sem); +}); + + +function showLoading(loading) { + if (loading) { + $('#loader').css('display', 'inline-block'); + $("#chart").hide(); + } else { + $('#loader').hide(); + $("#chart").show(); + } + +} + + +function openDialog(course_data, res) { + $("#title").text(buildTitle(course_data)) + $("#topbuttons").before(buildTimeTitle(course_data["times"])); + $("#profname").text(buildProfTitle(course_data)); + $("#myModal").fadeIn(fadetime); + buildSemestersDropdown(course_data, res) + var data; + if (badData(course_data, res)) { + data = []; + } else { + data = res.values[0]; + } + setChart(data); +} + +function buildProfTitle(course_data) { + const { + initial, + prof_name + } = course_data; + return `with ${initial?initial+". ":""}${prof_name}`; +} + +function buildSemestersDropdown(course_data, res) { + $("#semesters").empty(); + if (badData(course_data, res)) { + $("#semesters").append("") + } else { + var semesters = res.values[0][18].split(","); + semesters.sort(semesterSort); + semesters.reverse().unshift('Aggregate'); + var sems = []; + for (var i = 0; i < semesters.length; i++) { + sems.push($(``)); + } + $("#semesters").append(sems); + } +} + + +/*Query the grades database*/ +function getDistribution(course_data, sem) { + showLoading(true); + let query = buildQuery(course_data, sem); + chrome.runtime.sendMessage({ + command: "gradesQuery", + query: query + }, function (response) { + var res = response.data; + if (!sem) { + openDialog(course_data, res); + } else { + var data = badData(course_data, res) ? [] : res.values[0]; + setChart(data); + } + }); +} + + +function buildTitle(course_data) { + return `${course_data["name"]} (${course_data["department"]} ${course_data["number"]})` +} + + +function buildTimeTitle(times) { + $("h2.dateTimePlace").remove(); + var lines = [] + for (var i = 0; i < times.length; i++) { + date = times[i].substring(0, times[i].indexOf(' ')).toUpperCase(); + time = times[i].substring(times[i].indexOf(' ') + 1, times[i].lastIndexOf('-')).trim(); + place = times[i].substring(times[i].lastIndexOf('-') + 1).trim(); + lines.push($(`

    ${makeLine(date, time, place)}`)); + } + return lines +} + +function close() { + $("#myModal").fadeOut(fadetime); +} + +function makeLine(date, time, place) { + var arr = seperateDays(date) + var output = prettifyDaysText(arr) + var building = place.substring(0, place.search(/\d/) - 1); + building = building == "" ? "Undecided Location" : building; + return `${output} at ${time.replace(/\./g, '').replace(/\-/g, ' to ')} in ${building}`; +} + + +function seperateDays(date) { + let arr = []; + for (var i = 0; i < date.length; i++) { + let letter = date.charAt(i); + if (letter == "T" && i < date.length - 1 && date.charAt(i + 1) == "H") { + arr.push(days.get("TH")); + } else { + if (letter != "H") { + arr.push(days.get(letter)); + } + } + } + return arr; +} + +function prettifyDaysText(arr) { + var output = ""; + if (arr.length > 2) { + for (var i = 0; i < arr.length; i++) { + if (i < arr.length - 1) + output += arr[i] + ", " + if (i == arr.length - 2) + output += "and "; + if (i == arr.length - 1) + output += arr[i]; + } + } else if (arr.length == 2) { + output = arr[0] + " and " + arr[1]; + } else { + output = arr[0]; + } + return output +} + +function setChart(data) { + //set up the chart + showLoading(false); + chart = Highcharts.chart('chart', buildChartConfig(data), function (chart) { // on complete + if (data.length == 0) { + //if no data, then show the message and hide the series + chart.renderer.text('Could not find data for this Instructor teaching this Course.', 100, 120) + .css({ + fontSize: '20px', + width: '300px', + align: 'center', + left: '160px' + }) + .add(); + $.each(chart.series, function (i, ser) { + ser.hide(); + }); + } + }); +} \ No newline at end of file diff --git a/manifest.json b/manifest.json index 49843440..72a69f16 100644 --- a/manifest.json +++ b/manifest.json @@ -9,14 +9,21 @@ "declarativeContent", "storage", "*://*.utdirect.utexas.edu/apps/registrar/course_schedule/*", + "*://*.utexas.collegescheduler.com/*", "*://*.catalog.utexas.edu/ribbit/", "*://*.registrar.utexas.edu/schedules/*", "*://*.login.utexas.edu/login/*" ], "content_scripts": [{ "css": ["css/styles.css"], - "js": ["js/moment.min.js", "js/sql-memory-growth.js", "js/highcharts.js", "js/jquery-3.3.1.min.js", "js/content.js"], + "js": ["js/moment.min.js", "js/highcharts.js", "js/jquery-3.3.1.min.js", "js/jquery.initialize.min.js", "js/config.js", "js/util.js", + "js/content.js" + ], "matches": ["https://utdirect.utexas.edu/apps/registrar/course_schedule/*"] + }, { + "css": ["css/styles.css"], + "js": ["js/moment.min.js", "js/highcharts.js", "js/jquery-3.3.1.min.js", "js/jquery.initialize.min.js", "js/config.js", "js/util.js", "js/utplanner.js"], + "matches": ["https://utexas.collegescheduler.com/*"] }, { "css": ["css/styles.css"], "js": ["js/moment.min.js", "js/sql-memory-growth.js", "js/highcharts.js", "js/jquery-3.3.1.min.js", "js/import.js"], @@ -26,7 +33,7 @@ "grades.db", "images/disticon.png" ], "background": { - "scripts": ["js/jquery-3.3.1.min.js", "js/background.js", "js/moment.min.js"], + "scripts": ["js/jquery-3.3.1.min.js", "js/sql-memory-growth.js", "js/background.js", "js/moment.min.js"], "persistent": true }, "browser_action": {