diff --git a/calendar.html b/calendar.html index 816892ed..07b34c99 100644 --- a/calendar.html +++ b/calendar.html @@ -3,31 +3,37 @@ - - - + + +
- - - + + \ No newline at end of file diff --git a/js/content.js b/js/courseCatalog.js similarity index 50% rename from js/content.js rename to js/courseCatalog.js index 849f97af..f4d9ad89 100644 --- a/js/content.js +++ b/js/courseCatalog.js @@ -20,11 +20,22 @@ var isIndividual = false; var done = true; +var curr_course = {} + + //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.'); +semesterCode = new URL(window.location.href).pathname.split('/')[4]; +$(window).scroll(function () { + if ($(document).height() <= $(window).scrollTop() + $(window).height() + 150) { + loadNextPages(); + } +}); + + if (document.querySelector('#fos_fl')) { let params = (new URL(document.location)).searchParams; let dep = params.get("fos_fl"); @@ -47,17 +58,19 @@ if (next) { }); } + + //make heading and modal if (!$("#kw_results_table").length) { $("table thead th:last-child").after('Plus'); $("table").after(`
-
-
-

Loading Courses

-

Failed to Load Courses

-
- -
`); +
+
+

Loading Courses

+

Failed to Load Courses

+
+ +
`); var modhtml = ``; $("#container").prepend(modhtml); - $("#myModal").prepend("
defaultmessage..
"); + $("#myModal").prepend("
save course popup...
"); //go through all the rows in the list $('table').find('tr').each(function () { if (!($(this).find('td').hasClass("course_header")) && $(this).has('th').length == 0) { //if a course row, then add the extension button $(this).append(``); - // if ($(this).find('td[data-th="Status"]').text().includes('waitlisted')) { - // $(this).find('td').each(function () { - // $(this).css('background-color', '#E0E0E0'); - // }); - // } } }); } @@ -112,15 +120,10 @@ $("body").on('click', '#distButton', function () { scrollTop: 0 }, 500); $(this).blur(); - getCourseInfo(row); - getDistribution(); + curr_course = getCourseInfo(row); + getDistribution(curr_course); }); -$(window).scroll(function () { - if ($(document).height() <= $(window).scrollTop() + $(window).height() + 150) { - loadNextPages(); - } -}); $("#myModal").on('click', '#saveCourse', function () { setTimeout(function () { @@ -130,28 +133,28 @@ $("#myModal").on('click', '#saveCourse', function () { $("#Syllabi").click(function () { setTimeout(function () { - window.open(`https://utdirect.utexas.edu/apps/student/coursedocs/nlogon/?semester=&department=${department}&course_number=${course_nbr}&course_title=&unique=&instructor_first=&instructor_last=${profname}&course_type=In+Residence&search=Search`); + window.open(curr_course["links"]["syllabi"]); }, butdelay); }); $("#rateMyProf").click(function () { setTimeout(function () { - window.open(rmpLink); + window.open(curr_course["links"]["rate_my_prof"]); }, butdelay); }); $("#eCIS").click(function () { setTimeout(function () { - window.open(eCISLink); + window.open(curr_course["links"]["ecis"]); }, butdelay); }); $("#textbook").click(function () { setTimeout(function () { - window.open(textbookLink); + window.open(curr_course["links"]["textbook"]); }, butdelay); }); $("#semesters").on('change', function () { var sem = $(this).val(); sem = sem == "Aggregate" ? undefined : sem; - getDistribution(sem); + getDistribution(curr_course, sem); }); $("#retry").click(function () { @@ -159,22 +162,126 @@ $("#retry").click(function () { $(this).hide(); loadNextPages(); }); + + + + $(document).keydown(function (e) { /*Close Modal when hit escape*/ if (e.keyCode == 27) { close(); } else if (e.keyCode == 13 && $('#myModal').is(':visible')) { - /*save course when hit enter*/ saveCourse(); } }); + /*Listen for update mssage coming from popup*/ chrome.runtime.onMessage.addListener( function (request, sender, sendResponse) { if (request.command == "updateCourseList") { update(0); } - }); + } +); + + +function sepNameParts(name) { + numIndex = name.search(/\d/); + department = name.substring(0, numIndex).trim(); + number = name.substring(numIndex, name.indexOf(" ", numIndex)).trim(); + name = capitalizeString(name.substring(name.indexOf(" ", numIndex)).trim()); + return [name, department, number]; +} + + + +function buildCourseLinks(course_info) { + let { + department, + number, + unique, + prof_name + } = course_info + links = { + "textbook": `https://www.universitycoop.com/adoption-search-results?sn=${semesterCode}__${department}__${number}__${unique}`, + "syllabi": `https://utdirect.utexas.edu/apps/student/coursedocs/nlogon/?semester=&department=${department}&course_number=${number}&course_title=&unique=&instructor_first=&instructor_last=${prof_name}&course_type=In+Residence&search=Search`, + //default ones (before first name can be used) + "rate_my_prof": "http://www.ratemyprofessors.com/campusRatings.jsp?sid=1255", + "ecis": "http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?" + } + course_info["links"] = links; + return course_info; +} + +function buildBasicCourseInfo(row, course_name, individual) { + let namedata = sepNameParts(course_name) + let instructor_text = $(row).find('td[data-th="Instructor"]').text(); + let has_initial = instructor_text.indexOf(',') > 0; + course_info = { + "full_name": course_name, + "name": namedata[0], + "department": namedata[1], + "number": namedata[2], + "individual": individual ? individual : $(row).find('td[data-th="Unique"] a').prop('href'), + "register": $(row).find('td[data-th="Add"] a').prop('href'), + "unique": $(row).find('td[data-th="Unique"]').text(), + "status": $(row).find('td[data-th="Status"]').text(), + "prof_name": instructor_text ? has_initial ? capitalizeString(instructor_text.split(', ')[0]) : capitalizeString(instructor_text) : "Undecided", + "initial": instructor_text && has_initial ? instructor_text.split(', ')[1].substring(0, 1) : "", + "time_data": { + "days": $(row).find('td[data-th="Days"]>span').toArray().map(x => $(x).text().trim()), + "times": $(row).find('td[data-th="Hour"]>span').toArray().map(x => $(x).text().trim()), + "places": $(row).find('td[data-th="Room"]>span').toArray().map(x => $(x).text().trim()) + }, + "links": {} + } + return buildCourseLinks(course_info); +} + + + +function buildTimeTitle(course_info) { + $("h2.dateTimePlace").remove(); + let { + days, + times, + places + } = course_info["time_data"] + datetimearr = []; + var lines = []; + for (var i = 0; i < days.length; i++) { + var date = days[i]; + var time = times[i]; + var place = places[i]; + lines.push($(`

${makeLine(date, time, place)}`)); + } + return lines; +} + +/*For a row, get all the course information and add the date-time-lines*/ +function getCourseInfo(row) { + let course_name = ""; + let course_row = {} + let individual = undefined; + if ($("#textbook_button").length) { + course_name = $("#details h2").text(); + course_row = $('table'); + individual = document.URL; + } else { + $('table').find('tr').each(function () { + if ($(this).find('td').hasClass("course_header")) { + course_name = $(this).find('td').text() + ""; + } + if ($(this).is(row)) { + course_row = row; + return false; + } + }); + } + curr_course = buildBasicCourseInfo(course_row, course_name, individual); + getDescription(curr_course); + return curr_course; +} function loadNextPages() { chrome.storage.sync.get('loadAll', function (data) { @@ -201,19 +308,12 @@ function loadNextPages() { let hasCourseHead = $(this).find('td').hasClass("course_header"); if (!(hasCourseHead && $(this).has('th').length == 0)) { $(this).append(``); - // if ($(this).find('td[data-th="Status"]').text().includes('waitlisted')) { - // $(this).find('td').each(function () { - // $(this).css('background-color', '#E0E0E0'); - // }); - // } } if (!(hasCourseHead && last == $(this).find('td').text())) { newrows.push($(this)); } }); current.append(newrows); - // console.log($('tbody tr').length + " " + $('tr>td.course_header').length); - // update(oldlength + 1); update(oldlength + 1) } }).fail(function () { @@ -229,27 +329,41 @@ function loadNextPages() { } function saveCourse() { - var c = new Course(coursename, uniquenum, profname, datetimearr, status, profurl, registerlink); + let { + full_name, + unique, + prof_name, + status, + individual, + register + } = curr_course; + let dtarr = getDayTimeArray(undefined, curr_course); + + var c = new Course(full_name, unique, prof_name, dtarr, status, individual, register); chrome.runtime.sendMessage({ command: "courseStorage", course: c, action: $("#saveCourse").text().substring(0, $("#saveCourse").text().indexOf(" ")).toLowerCase() }, function (response) { - $("#saveCourse").text(response.label); $("#snackbar").text(response.done); - setTimeout(function () { - $("#snackbar").attr("class", "show"); - }, 200); - setTimeout(function () { - $("#snackbar").attr("class", ""); - }, 3000); + toggleSnackbar(); chrome.runtime.sendMessage({ command: "updateCourseList" }); }); } + +function toggleSnackbar() { + setTimeout(function () { + $("#snackbar").attr("class", "show"); + }, 200); + setTimeout(function () { + $("#snackbar").attr("class", ""); + }, 3000); +} + /* Update the course list to show if the row contains a course that conflicts with the saved course is one of the saved courses */ function update(start) { chrome.storage.sync.get('courseConflictHighlight', function (data) { @@ -261,23 +375,19 @@ function update(start) { if (!($(this).find('td').hasClass("course_header")) && $(this).has('th').length == 0) { var thisForm = this; var uniquenum = $(this).find('td[data-th="Unique"]').text(); - // console.log(uniquenum); chrome.runtime.sendMessage({ command: "isSingleConflict", - dtarr: getDtarr(this), + dtarr: getDayTimeArray(this), unique: uniquenum }, function (response) { var tds = $(thisForm).find('td'); - // console.log(tds.css('color')); if (response.isConflict && data.courseConflictHighlight && !response.alreadyContains) { if (tds.css('color') != 'rgb(244, 67, 54)') { - console.log('made red ' + uniquenum); red++; tds.css('color', '#F44336').css('text-decoration', 'line-through').css('font-weight', 'normal'); } } else if (!response.alreadyContains) { if (tds.css('color') != 'rgb(51, 51, 51)') { - console.log('made black ' + uniquenum); black++; tds.css('color', 'black').css('text-decoration', 'none').css('font-weight', 'normal'); } @@ -285,7 +395,6 @@ function update(start) { if (response.alreadyContains) { if (tds.css('color') != 'rgb(76, 175, 80)') { green++; - console.log('made green ' + uniquenum); tds.css('color', '#4CAF50').css('text-decoration', 'none').css('font-weight', 'bold'); } } @@ -293,199 +402,80 @@ function update(start) { } } }); - //console.log(`red: ${red} black: ${black} green: ${green}`); }); } /* For a row, get the date-time-array for checking conflicts*/ -function getDtarr(row) { - var numlines = $(row).find('td[data-th="Days"]>span').length; - var dtarr = []; - for (var i = 0; i < numlines; i++) { - var date = $(row).find('td[data-th="Days"]>span:eq(' + i + ')').text(); - var time = $(row).find('td[data-th="Hour"]>span:eq(' + i + ')').text(); - var place = $(row).find('td[data-th="Room"]>span:eq(' + i + ')').text(); +function getDayTimeArray(row, course_info) { + var daytimearray = [] + let days = course_info ? course_info["time_data"]["days"] : $(row).find('td[data-th="Days"]>span').toArray().map(x => $(x).text().trim()); + let times = course_info ? course_info["time_data"]["times"] : $(row).find('td[data-th="Hour"]>span').toArray().map(x => $(x).text().trim()); + let places = course_info ? course_info["time_data"]["places"] : $(row).find('td[data-th="Room"]>span').toArray().map(x => $(x).text().trim()); + for (var i = 0; i < days.length; i++) { + let date = days[i]; + let time = times[i]; + let place = places[i]; for (var j = 0; j < date.length; j++) { - var letter = date.charAt(j); - var day = ""; + let letter = date.charAt(j); if (letter == "T" && j < date.length - 1 && date.charAt(j + 1) == "H") { - dtarr.push(["TH", convertTime(time), place]); + daytimearray.push(["TH", convertTime(time), place]); } else { - if (letter != "H") { - dtarr.push([letter, convertTime(time), place]); - } + if (letter != "H") + daytimearray.push([letter, convertTime(time), place]); } } } - return dtarr; + return daytimearray; } -/*Course object for passing to background*/ -function Course(coursename, unique, profname, datetimearr, status, link, registerlink) { - this.coursename = coursename; - this.unique = unique; - this.profname = profname; - this.datetimearr = datetimearr; - this.status = status; - this.link = link; - this.registerlink = registerlink; -} - -/*For a row, get all the course information and add the date-time-lines*/ -function getCourseInfo(row) { - console.log(row); - semesterCode = new URL(window.location.href).pathname.split('/')[4]; - $("h2.dateTimePlace").remove(); - $('table').find('tr').each(function () { - if ($(this).find('td').hasClass("course_header")) { - coursename = $(this).find('td').text() + ""; - } - if ($(this).is(row)) { - profurl = $(this).find('td[data-th="Unique"] a').prop('href'); - registerlink = $(this).find('td[data-th="Add"] a').prop('href'); - // console.log(registerlink); - uniquenum = $(this).find('td[data-th="Unique"]').text(); - status = $(this).find('td[data-th="Status"]').text(); - profname = $(this).find('td[data-th="Instructor"]').text().split(', ')[0]; - profinit = $(this).find('td[data-th="Instructor"]').text().split(', ')[1]; - if (profname.indexOf(" ") == 0) { - profname = profname.substring(1); - } - var numlines = $(this).find('td[data-th="Days"]>span').length; - datetimearr = []; - var lines = []; - for (var i = 0; i < numlines; i++) { - var date = $(this).find('td[data-th="Days"]>span:eq(' + i + ')').text(); - var time = $(this).find('td[data-th="Hour"]>span:eq(' + i + ')').text(); - var place = $(this).find('td[data-th="Room"]>span:eq(' + i + ')').text(); - lines.push($(`

${makeLine(date, time, place)}`)); - } - $("#topbuttons").before(lines); - return false; - } - }); - /*Handle if on the individual course page, ie if the textbook button exists*/ - if ($("#textbook_button").length) { - coursename = $("#details h2").text(); - var gotname = $("table").find("td[data-th='Instructor']").text(); - if (gotname != "") { - profinit = gotname.split(", ")[1].substring(0, 1); - } else { - profinit = ""; - } - profurl = document.URL; - // console.log(profurl); - } - getDescription(); - department = coursename.substring(0, coursename.search(/\d/) - 2); - course_nbr = coursename.substring(coursename.search(/\d/), coursename.indexOf(" ", coursename.search(/\d/))); - textbookLink = `https://www.universitycoop.com/adoption-search-results?sn=${semesterCode}__${department}__${course_nbr}__${uniquenum}` -} - -/* Make the day-time-arr and make the text for the date-time-line*/ function makeLine(date, time, place) { - var arr = []; - var output = ""; - for (var i = 0; i < date.length; i++) { - var letter = date.charAt(i); - var day = ""; - if (letter == "T" && i < date.length - 1 && date.charAt(i + 1) == "H") { - arr.push(days.get("TH")); - datetimearr.push(["TH", convertTime(time), place]); - } else { - if (letter != "H") { - arr.push(days.get(letter)); - datetimearr.push([letter, convertTime(time), place]); - } - } - } - 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]; - } + var arr = seperateDays(date) + var output = prettifyDaysText(arr) var building = place.substring(0, place.search(/\d/) - 1); - if (building == "") { - building = "Undecided Location"; - } + building = building == "" ? "Undecided Location" : building; return `${output} at ${time.replace(/\./g, '').replace(/\-/g, ' to ')} in ${building}`; } -/*Convert time to 24hour format*/ -function convertTime(time) { - var converted = time.replace(/\./g, '').split("-"); - for (var i = 0; i < 2; i++) { - converted[i] = moment(converted[i], ["h:mm A"]).format("HH:mm"); - } - return converted; +function badData(course_data, res) { + return typeof res == 'undefined' || course_data["prof_name"] == "Undecided"; } /*Query the grades database*/ -function getDistribution(sem) { - var query; - if (!sem) { - query = "select * from agg"; - } else { - query = "select * from grades"; - } - query += " where dept like '%" + department + "%'"; - query += " and prof like '%" + profname.replace(/'/g, "") + "%'"; - query += " and course_nbr like '%" + course_nbr + "%'"; - if (sem) { - query += "and sem like '%" + sem + "%'"; - } - query += "order by a1+a2+a3+b1+b2+b3+c1+c2+c3+d1+d2+d3+f desc"; +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(department, coursename, "aggregate", profname, res); + openDialog(course_data, res); } else { - var data; - if (typeof res == 'undefined' || profname == "") { - data = []; - } else { - data = res.values[0]; - } + var data = badData(course_data, res) ? [] : res.values[0]; 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 - }, function (response) { - if (response.alreadyContains) { - $("#saveCourse").text("Remove Course -"); - } else { - $("#saveCourse").text("Add Course +"); - } - }); - //set if no grade distribution - var data; + +function buildTitle(course_data) { + return `${course_data["name"]} (${course_data["department"]} ${course_data["number"]})` +} + +function buildProfTitle(course_data) { + const { + initial, + prof_name + } = course_data; + return `with ${initial?initial+". ":""}${prof_name}`; +} + + +function buildSemestersDropdown(course_data, res) { $("#semesters").empty(); - if (typeof res == 'undefined' || profname == "") { + if (badData(course_data, res)) { $("#semesters").append("") - data = []; } else { var semesters = res.values[0][18].split(","); semesters.sort(semesterSort); @@ -495,43 +485,49 @@ function openDialog(dep, cls, sem, professor, res) { sems.push($(``)); } $("#semesters").append(sems); + } +} + + +/*Open the modal and show all the data*/ +function openDialog(course_info, res) { + $("#title").text(buildTitle(course_info)) + $("#topbuttons").before(buildTimeTitle(course_info)); + $("#profname").text(buildProfTitle(course_info)); + $("#myModal").fadeIn(fadetime); + //initial text on the "save course button" + chrome.runtime.sendMessage({ + command: "alreadyContains", + unique: course_info["unique"] + }, function (response) { + if (response.alreadyContains) { + $("#saveCourse").text("Remove Course -"); + } else { + $("#saveCourse").text("Add Course +"); + } + }); + + buildSemestersDropdown(course_info, res) + var data = [] + if (!badData(course_info, res)) data = res.values[0]; - } - var modal = document.getElementById('myModal'); - var span = document.getElementsByClassName("close")[0]; - modal.style.display = "block"; - - var color = "black"; - if (status.includes("open")) { - color = "#4CAF50"; - } else if (status.includes("waitlisted")) { - color = "#FF9800" - } else if (status.includes("closed") || status.includes("cancelled")) { - color = "#FF5722"; - } - $("#title").text(prettifyTitle()).append("" + " #" + uniquenum + ""); - - if (typeof profinit != "undefined" && profinit.length > 1) { - profinit = profinit.substring(0, 1); - } - var name; - if (profname == "") { - name = "Undecided Professor "; - } else { - name = prettifyName(); - } - $("#profname").text("with " + name); + let status_color = getStatusColor(course_info["status"]); //close button - span.onclick = function () { - close(); - } + allowClosing(); setChart(data); - // When clicks anywhere outside of the modal, close it - window.onclick = function (event) { - if (event.target == modal) { + +} + +function allowClosing() { + $('.close').click(function () { + close(); + }); + $('#myModal').click(function (event) { + if (event.target.id == 'myModal') { close(); } - } + }); + } function close() { @@ -560,83 +556,70 @@ function setChart(data) { }); } -/*Format the title*/ -function prettifyTitle() { - val = department.length + course_nbr.length + 3; - output = coursename.substring(val).replace(/\b\w*/g, function (txt) { - return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); - }); - return output + " (" + department + " " + course_nbr + ")"; -} -/* Format the Professor Name */ -function prettifyName() { - var fixedprofinit = ""; - if (profinit) { - fixedprofinit = profinit + ". "; +function buildFormattedDescription(description_lines) { + let description = "" + for (let i in description_lines) { + let sentence = description_lines[i]; + 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}
  • `; + description += sentence; } - return fixedprofinit + profname.replace(/\w\S*/g, function (txt) { - return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + if (!description) + description = "

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

    " + return description; +} + + +function displayDescription(description) { + $("#description").animate({ + 'opacity': 0 + }, 200, function () { + $(this).html(description).animate({ + 'opacity': 1 + }, 200); }); } /*Get the course description from the profurl and highlight the important elements, as well as set the eCIS, and rmp links.*/ -function getDescription() { - // console.log(window.location.href); - // console.log(profurl); - console.log('hello'); +function getDescription(course_info) { + console.log('getting description for ') $.ajax({ - url: profurl, + url: course_info["individual"], 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()}`; - } + response_node = $('
    ').html(response).contents(); + description_lines = response_node.find('#details > p').toArray().map(x => $(x).text()); + displayDescription(buildFormattedDescription(description_lines)); + let first_name = extractFirstName(response_node); + updateLinks(course_info, first_name); } 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?"; + displayDescription(description); } } }); +} + + +function updateLinks(course_info, first_name) { + let { + prof_name, + number + } = course_info; + course_info["first_name"] = first_name; + course_info["links"]["rate_my_prof"] = `http://www.ratemyprofessors.com/search.jsp?queryBy=teacherName&schoolName=university+of+texas+at+austin&queryoption=HEADER&query=${first_name} ${prof_name};&facetSearch=true`; + course_info["links"]["ecis"] = profname ? `http://utdirect.utexas.edu/ctl/ecis/results/index.WBX?&s_in_action_sw=S&s_in_search_type_sw=N&s_in_search_name=${prof_name}%2C%20${first_name}` : + `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=${number}`; +} + +function extractFirstName(response_node) { + let full_name = response_node.find('td[data-th="Instructor"]').text().split(', '); + let first = full_name[full_name.length - 1]; + return capitalizeString(first); } \ No newline at end of file diff --git a/js/fullcalendar.min.js b/js/lib/fullcalendar.min.js similarity index 100% rename from js/fullcalendar.min.js rename to js/lib/fullcalendar.min.js diff --git a/js/highcharts.js b/js/lib/highcharts.js similarity index 100% rename from js/highcharts.js rename to js/lib/highcharts.js diff --git a/js/html2canvas.min.js b/js/lib/html2canvas.min.js similarity index 100% rename from js/html2canvas.min.js rename to js/lib/html2canvas.min.js diff --git a/js/ics.min.js b/js/lib/ics.min.js similarity index 100% rename from js/ics.min.js rename to js/lib/ics.min.js diff --git a/js/jquery-3.3.1.min.js b/js/lib/jquery-3.3.1.min.js similarity index 100% rename from js/jquery-3.3.1.min.js rename to js/lib/jquery-3.3.1.min.js diff --git a/js/jquery.initialize.min.js b/js/lib/jquery.initialize.min.js similarity index 100% rename from js/jquery.initialize.min.js rename to js/lib/jquery.initialize.min.js diff --git a/js/moment.min.js b/js/lib/moment.min.js similarity index 100% rename from js/moment.min.js rename to js/lib/moment.min.js diff --git a/js/sql-memory-growth.js b/js/lib/sql-memory-growth.js similarity index 100% rename from js/sql-memory-growth.js rename to js/lib/sql-memory-growth.js diff --git a/js/util.js b/js/util.js index 0cae328d..4a4f9c8b 100644 --- a/js/util.js +++ b/js/util.js @@ -14,6 +14,18 @@ const semOrder = { } +function getStatusColor(status) { + let color = "black"; + if (status.includes("open")) { + color = "#4CAF50"; + } else if (status.includes("waitlisted")) { + color = "#FF9800" + } else if (status.includes("closed") || status.includes("cancelled")) { + color = "#FF5722"; + } + return color; +} + function buildQuery(course_data, sem) { let query = !sem ? "select * from agg" : "select * from grades"; query += " where dept like '%" + course_data["department"] + "%'"; @@ -25,6 +37,73 @@ function buildQuery(course_data, sem) { return query + "order by a1+a2+a3+b1+b2+b3+c1+c2+c3+d1+d2+d3+f desc"; } +/*Course object for passing to background*/ +function Course(coursename, unique, profname, datetimearr, status, link, registerlink) { + this.coursename = coursename; + this.unique = unique; + this.profname = profname; + this.datetimearr = datetimearr; + this.status = status; + this.link = link; + this.registerlink = registerlink; +} + +function capitalizeString(string) { + //if one word, and if multiple words: + let output = ""; + words = string.split(/[. ,\/ -]/); + for (let i in words) { + word = words[i]; + capitalizedWord = word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); + output += capitalizedWord + " "; + } + return output.trim(); +} + +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; +} + + +/*Convert time to 24hour format*/ +function convertTime(time) { + var converted = time.replace(/\./g, '').split("-"); + for (var i = 0; i < 2; i++) { + converted[i] = moment(converted[i], ["h:mm A"]).format("HH:mm"); + } + return converted; +} + +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 semesterSort(semA, semB) { let aName = semA.split(' ')[0]; diff --git a/js/utplanner.js b/js/utplanner.js index 65099566..1c7b22fa 100644 --- a/js/utplanner.js +++ b/js/utplanner.js @@ -102,12 +102,9 @@ function openDialog(course_data, res) { $("#profname").text(buildProfTitle(course_data)); $("#myModal").fadeIn(fadetime); buildSemestersDropdown(course_data, res) - var data; - if (badData(course_data, res)) { - data = []; - } else { + var data = [] + if (!badData(course_data, res)) data = res.values[0]; - } setChart(data); } @@ -172,9 +169,7 @@ function buildTimeTitle(times) { return lines } -function close() { - $("#myModal").fadeOut(fadetime); -} + function makeLine(date, time, place) { var arr = seperateDays(date) @@ -185,20 +180,7 @@ function makeLine(date, time, place) { } -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 = ""; @@ -238,4 +220,8 @@ function setChart(data) { }); } }); +} + +function close() { + $("#myModal").fadeOut(fadetime); } \ No newline at end of file diff --git a/manifest.json b/manifest.json index 72a69f16..4f53263a 100644 --- a/manifest.json +++ b/manifest.json @@ -16,24 +16,24 @@ ], "content_scripts": [{ "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/content.js" + "js": ["js/lib/moment.min.js", "js/lib/highcharts.js", "js/lib/jquery-3.3.1.min.js", "js/lib/jquery.initialize.min.js", "js/config.js", "js/util.js", + "js/courseCatalog.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"], + "js": ["js/lib/moment.min.js", "js/lib/highcharts.js", "js/lib/jquery-3.3.1.min.js", "js/lib/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"], + "js": ["js/lib/moment.min.js", "js/lib/sql-memory-growth.js", "js/lib/highcharts.js", "js/lib/jquery-3.3.1.min.js", "js/import.js"], "matches": ["https://utdirect.utexas.edu/registrar/waitlist/wl_see_my_waitlists.WBX", "https://utdirect.utexas.edu/registration/classlist.WBX*"] }], "web_accessible_resources": [ "grades.db", "images/disticon.png" ], "background": { - "scripts": ["js/jquery-3.3.1.min.js", "js/sql-memory-growth.js", "js/background.js", "js/moment.min.js"], + "scripts": ["js/lib/jquery-3.3.1.min.js", "js/lib/sql-memory-growth.js", "js/lib/moment.min.js", "js/background.js"], "persistent": true }, "browser_action": { diff --git a/options.html b/options.html index f35b5734..1c9cd0b8 100644 --- a/options.html +++ b/options.html @@ -12,16 +12,18 @@

    Conflict Highlighting

    -

    Scroll To Load More Courses

    -

    (v), Sriram Hariharan, 2018

    - + diff --git a/popup.html b/popup.html index 47089842..cb89ca71 100644 --- a/popup.html +++ b/popup.html @@ -83,8 +83,8 @@

    - - + +