// ==UserScript== // @name studentportalen-extended // @namespace http://ventureinto.space // @version 0.7 // @user-agent Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0 // @description Add missing functionality to studenportalen.liu.se // @author Nils Eriksson niler851@student.liu.se // @match https://www3.student.liu.se/portal/studieresultat/resultat* // @grant GM_getResourceText // @grant GM_addStyle // @grant GM_xmlhttpRequest // @require http://code.jquery.com/jquery-2.1.4.min.js // @require https://cdn.firebase.com/js/client/2.3.1/firebase.js // @resource bootcss https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css // @downloadURL https://update.greasyfork.cloud/scripts/13401/studentportalen-extended.user.js // @updateURL https://update.greasyfork.cloud/scripts/13401/studentportalen-extended.meta.js // ==/UserScript== /* set up FireBASE */ var myFirebaseRef = new Firebase("https://studentportalen-data.firebaseio.com/"); var getAllCourseData = function(){ var fireCourses = myFirebaseRef.child("courses"); fireCourses.on("value", function(snapshot) { var courses = snapshot.val(); $('.course-row').each(function(i, row){ var rowID = $(row).attr('id').replace('*',''); if(rowID in courses){ var level = courses[rowID].level var select = $(row).find('select'); selectAlternative(level, select); // $(row).find('.'+level).attr('selected',true); } }); }, function (errorObject) { console.log("The read failed: " + errorObject.code); }); }(); var updateCourseLevel = function(course ,level){ var fireCourses = myFirebaseRef.child("courses"); fireCourses.child(course).set({ "level": level}); } /* END OF FIREBASE */ $("head").prepend(''); console.debug('start: add CSS'); var bootcss = GM_getResourceText('bootcss'); GM_addStyle(bootcss); console.debug('done: add CSS'); var studiehandbokenBase = "http://kdb-5.liu.se/liu/lith/studiehandboken/svkursplan.lasso?&k_budget_year=2015&k_kurskod=" //// VIEW //// /* Create area for grade info */ $("form").append("

Snitt

"); $("#snitt").append("

Viktat:

"); $("#snitt").append("

Oviktat:

"); $("#snitt").append("

Alla

"); $("#snitt").append("

Avklarade

"); $("#snitt").append("

"); $("#info-container").append("
"); $("#course-level").append("

Statestik

"); $("#course-level").append("

Avancerade hp:

"); /* Give the table of courses a id */ $("table.resultlist > tbody").attr('id','grade-table'); //var createLevelBox = function(selectedLevel){ var levelBox ='\ \ \ '; /** MODIFY THE TABLE OF GRADES -Add new header "Selected" -Add checkbox for all courses -Add plus minus sign next to grades to se the impact of rasing them **/ (function expandTableOfGrades(){ $("#grade-table").children().each(function(){ var row = rowType(this); if( row.numericGrade || row.letterGrade){ if(row.numericGrade){ $(this).prepend(""); $(this).children().eq(4).attr('nowrap','nowrap'); $(this).children().eq(4).wrapInner(""); $(this).children().eq(4).append(" "); } if(row.letterGrade){ $(this).prepend(""); } $(this).children().eq(3).addClass("hp"); $(this).children().eq(1).addClass("course-code"); //is course finished ? if($(this).children().eq(1).text().indexOf("*") > 0){ $(this).children().eq(1).addClass("is-finished");} // $(this).children().eq(1).wrapInner(""); $(this).addClass('course-row'); $(this).attr('id',$(this).children().eq(1).text()); $(this).append(levelBox); } if($(this).children().eq(0).text() == "Kurskod"){ $(this).prepend("Vald"); //HP padding $(this).children().eq(3).attr('style','padding-right:23px'); $(this).append("Nivå"); } }); })(); function rowType( row ){ var header = $(row).children().eq(0).is("th"); var numberOfEntrys = $(row).children().size(); var hasNumbericGrade = !isNaN(Number($(row).children().eq(3).text())); var numericGrade = false; var letterGrade = false; var notAcourse = false; if( !header && numberOfEntrys >2 && hasNumbericGrade ){ numericGrade = true; } else if( !header && numberOfEntrys >2 && !hasNumbericGrade){ letterGrade =true; } else{ notACourse = true; } return { numericGrade:numericGrade, letterGrade:letterGrade, notACourse:notACourse } } /* when we click select all, all checkboxes shoul be selected. */ $("#select-all").click(function(event){ event.stopPropagation(); if(this.checked){ $('.course-checkbox').each(function(){ this.checked = true; $(this).closest("tr").addClass('selected'); }); } else{ $('.course-checkbox').each(function(){ this.checked = false; $(this).closest("tr").removeClass('selected'); }); } }); $("#select-all-done").click(function(event){ event.stopPropagation(); if(this.checked){ $('.course-checkbox').each(function(){ var row = $(this).closest("tr"); if(row.find('.is-finished').length != 0){ this.checked = true; row.addClass('selected'); } }); } else{ $('.course-checkbox').each(function(){ this.checked = false; $(this).closest("tr").removeClass('selected'); }); } }); /* pression a row should make it checked and highlighted */ $( '#grade-table' ).delegate( 'tr', 'click', function ( e ) { if ( $( e.target ).is( 'input:checkbox' ) ) { this.checked = !this.checked; $(this).toggleClass('selected'); }else if($( e.target ).parent().is( "a")){ e.stopPropagation(); } else { $(this).find("input[type='checkbox']").click(); } }); /** When we click the button "Calculate" we first call calculateAverages(); then put the numbers in the view for the user to se **/ $("#calculate-btn").click(function(event){ var levelPoints = sumPointsInLevels(); var grades = calculateAverages(); $('#sum-advanced-points').text(levelPoints.A); $('#average-grade').text(grades.average.toFixed(2)); $('#weighted-average-grade').text(grades.WeightedAverage.toFixed(2)); }); /* Add hover highlighting for course-rows */ document.styleSheets[0].insertRule('.course-row:hover { background-color: #FF9; outline: thin solid black;}', 0); document.styleSheets[0].insertRule('.selected { background-color: #FFC; outline: thin solid black;}', 0); /// Controllers ///// /* This function calculated the average and weighted average of selected fields. */ function calculateAverages(){ var selectedRows = $(".course-checkbox:checked").parent().parent(); var avrage = (function(){ var gradesWithoutNumbers = 0; var sum = 0; selectedRows.each(function(){ var grade = Number($(this).children().eq(4).text()); if( !isNaN(grade)){ sum += grade; }else{ gradesWithoutNumbers++; } }); var coursesWithRegularGrades = selectedRows.size() - gradesWithoutNumbers; var avrage = sum/coursesWithRegularGrades; return avrage; })(); var WeightedAverage = (function(){ var pointsSum = 0; var pointsTimesGradeSum =0; selectedRows.each(function(){ var grade = Number($(this).children().eq(4).text()); var points = Number($(this).children().eq(3).text()); if( !isNaN(grade)){ pointsSum += points; pointsTimesGradeSum += points*grade; } }); return pointsTimesGradeSum/pointsSum; })(); return { WeightedAverage: WeightedAverage, average: avrage } } (function plusMinus(){ $('.plus').click(function(e){ e.stopPropagation(); var gradeElement =$(this).prev(".grade"); var grade = Number(gradeElement.text()); // If is not undefined if (!isNaN(grade)) { // Increment $(gradeElement).text(boundValue(grade+1)); } else { // Otherwise put a 0 there $(gradeElement).text(0); } }); $('.minus').click(function(e){ e.stopPropagation(); var gradeElement = $(this).prevAll(".grade"); var grade = Number(gradeElement.text()); // If is not undefined if (!isNaN(grade)) { // Increment $(gradeElement).text(boundValue(grade-1)); } else { // Otherwise put a 0 there $(gradeElement).text(0); } }); var boundValue = function(value){ if(value > 5)return 5; if(value < 3)return 3; return value; } })(); (function selectLevel(){ $('select').click(function(e){ e.preventDefault(); e.stopPropagation(); }); })(); (function onCourseSelected(){ $('select').on('change', function(e) { var level = $(this).val(); var select = $(this).closest('select'); selectAlternative(level, select); var courseID = $(this).closest('tr').attr('id').replace('*',''); updateCourseLevel(courseID,level); }); })(); var sumPointsInLevels = function(){ var selectedRows = $(".course-checkbox:checked").parent().parent(); function findAndSumLevel(level){ var sum = 0; var selectedRows = $(".course-checkbox:checked").parent().parent(); selectedRows.each(function(i,obj){ if($(obj).find('.course-levels').val() === level) { var hp = Number($(obj).find('.hp').text()); sum +=hp; } }); return sum; } var levelA = findAndSumLevel("A"); var levelG1 = findAndSumLevel("G1"); var levelG2 = findAndSumLevel("G2"); var empty = findAndSumLevel("empty"); return { G1: levelG1, G2: levelG2, A: levelA, empty:empty } }; //Helper Functions var selectAlternative = function(alt, select){ select.children().removeAttr('selected'); select.find('.'+alt).attr('selected',true); }