// ==UserScript==
// @name CS UBB Timetable Fixer
// @namespace http://tampermonkey.net/
// @version 2.1.7
// @description A userscript that enhances the tabelar timetables for CS UBB students.
// @author myklosbotond
// @match http://www.cs.ubbcluj.ro/files/orar/*/tabelar/*.html
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js
// @require https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js
// @resource jqUI_CSS https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.css
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_getResourceText
// ==/UserScript==
/*
* jshint esversion: 6
* jshint esnext: true
*/
function getDefaultOptions() {
'use strict';
return {
weekOffset: 1,
group: 0,
halfGroup: 0,
disciplinesToReplace: {},
disciplinesToHide: []
};
}
var defaultHTML;
var options;
var disciplines = [];
const days = ["Luni", "Marti", "Miercuri", "Joi", "Vineri"];
const disciplineColumn = "disciplina";
(function() {
'use strict';
loadOptions();
setupCss();
setupFunctions();
structureHTML();
injectSettingHTML();
getDisciplinesList();
setEventHandlers();
updateSettingsUi();
runFixer();
})();
function getBaseOptionKey(){
return "options";
}
function getOptionKey(){
parts = location.pathname.match('/([0-9]+-[0-9]+)/.*/([^.]+)');
try{
return getBaseOptionKey() + "_" + parts[1] + "_" + parts[2];
}
catch(err){
return getBaseOptionKey();
}
}
function loadOptions() {
'use strict';
let defOptions = getDefaultOptions();
let savedOptions = GM_getValue(getOptionKey(), GM_getValue(getBaseOptionKey(), "{}"));
try{
savedOptions = JSON.parse(savedOptions);
}
catch(err){
savedOptions = {};
}
options = $.extend(defOptions, savedOptions);
}
function setupCss() {
'use strict';
GM_addStyle(".curs-tr {background: #fffedd;}");
GM_addStyle(".curs-tr td a{color: #c16b00;}");
GM_addStyle(".seminar-tr {background: #ddf2ff;}");
GM_addStyle(".seminar-tr td a{color: #0e62a5;}");
GM_addStyle(".labor-tr {background: #e4ffdd;}");
GM_addStyle(".labor-tr td a{color: #009688;}");
GM_addStyle(".last-of-day-tr{border-bottom: 2px solid}");
GM_addStyle("a:hover, a:hover font {background-color: transparent; text-decoration: underline}");
GM_addStyle(".other-week-tr {filter: grayscale(100%);}");
GM_addStyle(".other-week-tr td {background:transparent}");
GM_addStyle(".other-week-tr:hover {filter: grayscale(0%);}");
GM_addStyle(".meh-tr {opacity: 0.3; filter: grayscale(100%);}");
GM_addStyle(".meh-tr td {background:transparent}");
GM_addStyle(".meh-tr:hover {opacity: 0.7}");
GM_addStyle(".nope-tr {background: transparent}");
GM_addStyle(".nope-tr td {background: transparent}");
GM_addStyle(".nope-tr a {color: #003399}");
let jqUI_CssSrc = GM_getResourceText ("jqUI_CSS");
jqUI_CssSrc = jqUI_CssSrc.replace (/url\(['"]images\/ui\-bg_.*00\.png['"]\)/g, "");
jqUI_CssSrc = jqUI_CssSrc.replace (/url\(['"]images\/ui\-icons_.*\.png['"]\)/g, "");
GM_addStyle (jqUI_CssSrc);
GM_addStyle(".ui-selectmenu-button.ui-button {width: auto}");
GM_addStyle(".ui-front:not(.ui-widget-overlay):not(.ui-selectmenu-open){z-index:100 !important; } .ui-selectmenu-open {z-index:9999 !important;}");
GM_addStyle(".ui-selectmenu-icon.ui-icon {float: right; margin-top: 8px; border-style: solid; border-width: 3px 3px 0 3px; border-color: #0f0f0d transparent transparent transparent; width: 0; height: 0;}");
GM_addStyle('span.ui-button-icon.ui-icon.ui-icon-closethick {background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg\" width="24" height="24" viewBox="0 0 24 24"><path d="M24 20.188l-8.315-8.209 8.2-8.282-3.697-3.697-8.212 8.318-8.31-8.203-3.666 3.666 8.321 8.24-8.206 8.313 3.666 3.666 8.237-8.318 8.285 8.203z"/></svg>\'); background-position: center; background-size: 50%;}');
GM_addStyle('#hider-list-wrapper {max-height: 300px; overflow: auto; margin-bottom: 9px;}');
GM_addStyle('#renamer-list-wrapper {max-height: 330px; overflow: auto; margin-bottom: 9px;}');
GM_addStyle('#hider-dialog table{ width: 100%; }');
GM_addStyle('#hider-dialog .check-column{ width: 1px; }');
GM_addStyle('.option-wrapper{ display: inline-block; margin-top: 7px;}');
GM_addStyle('.finder-options-wrapper{ margin-left: 91px;}');
GM_addStyle('#finder-result, #finder-time-result { margin: 10px auto 0 auto; }');
/* ================ Icons =============== */
GM_addStyle('.ui-icon-hide {background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19.604 2.562l-3.346 3.137c-1.27-.428-2.686-.699-4.243-.699-7.569 0-12.015 6.551-12.015 6.551s1.928 2.951 5.146 5.138l-2.911 2.909 1.414 1.414 17.37-17.035-1.415-1.415zm-6.016 5.779c-3.288-1.453-6.681 1.908-5.265 5.206l-1.726 1.707c-1.814-1.16-3.225-2.65-4.06-3.66 1.493-1.648 4.817-4.594 9.478-4.594.927 0 1.796.119 2.61.315l-1.037 1.026zm-2.883 7.431l5.09-4.993c1.017 3.111-2.003 6.067-5.09 4.993zm13.295-4.221s-4.252 7.449-11.985 7.449c-1.379 0-2.662-.291-3.851-.737l1.614-1.583c.715.193 1.458.32 2.237.32 4.791 0 8.104-3.527 9.504-5.364-.729-.822-1.956-1.99-3.587-2.952l1.489-1.46c2.982 1.9 4.579 4.327 4.579 4.327z"/></svg>\'); background-position: center; background-size: 100%;}');
GM_addStyle('.ui-icon-rename {background-image: url(\'data:image/svg+xml;utf8,<?xml version="1.0" encoding="UTF-8"?><svg viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="m18.483 14.133h-1.462v-9h1.462v9z"/><path d="m12.525 6.6228h-10.542v6h10.542v1.51h-12.042v-9h12.042v1.49z"/><path d="m15.521 2.8728v13.5c0 0.414 0.335 0.75 0.75 0.75h1.5v1.5h-6v-1.5h1.504c0.415 0 0.75-0.336 0.75-0.75v-13.5c0-0.414-0.335-0.75-0.75-0.75h-1.504v-1.499h6v1.499h-1.5c-0.415 0-0.75 0.336-0.75 0.75"/></svg>\'); background-position: center; background-size: 100%;}');
GM_addStyle('.ui-icon-find {background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M21.172 24l-7.387-7.387c-1.388.874-3.024 1.387-4.785 1.387-4.971 0-9-4.029-9-9s4.029-9 9-9 9 4.029 9 9c0 1.761-.514 3.398-1.387 4.785l7.387 7.387-2.828 2.828zm-12.172-8c3.859 0 7-3.14 7-7s-3.141-7-7-7-7 3.14-7 7 3.141 7 7 7z"/></svg>\'); background-position: center; background-size: 100%;}');
GM_addStyle('.ui-icon-reset {background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M17.026 22.957c10.957-11.421-2.326-20.865-10.384-13.309l2.464 2.352h-9.106v-8.947l2.232 2.229c14.794-13.203 31.51 7.051 14.794 17.675z"/></svg>\'); background-position: center; background-size: 100%;}');
GM_addStyle('.ui-icon-printer {background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M14 20h-6v-1h6v1zm10-15v13h-4v6h-16v-6h-4v-13h4v-5h16v5h4zm-6 10h-12v7h12v-7zm0-13h-12v3h12v-3zm4 5.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5.224.5.5.5.5-.224.5-.5zm-6 9.5h-8v1h8v-1z"/></svg>\'); background-position: center; background-size: 100%;}');
/* =========== Printer styles =========== */
GM_addStyle('@media print{ #settings-wrapper {display:none;} #tables-wrapper table{page-break-after: always;}}');
}
function setupFunctions() {
'use strict';
Date.prototype.getWeek = function() {
var onejan = new Date(this.getFullYear(), 0, 1);
return Math.ceil((((this - onejan) / 86400000) + onejan.getDay() + 1) / 7);
};
setDialogsPositionFixed();
}
function setDialogsPositionFixed() {
$.ui.dialog.prototype._oldinit = $.ui.dialog.prototype._init;
$.ui.dialog.prototype._init = function() {
$(this.element).parent().css("position", "fixed");
$(this.element).parent().addClass("no-select");
$(this.element).parent().css("margin", "5px"); //limit 5px to the top
$(this.element).dialog("option", {
resizeStart: function(event, ui) {
$(event.target).parent().css("position", "fixed");
return true;
},
resizeStop: function(event, ui) {
$(event.target).parent().css("position", "fixed");
return true;
}
});
this._oldinit();
};
}
function structureHTML() {
'use strict';
let html = $('center').html();
$('center').html('<div id="tables-wrapper"></div>');
let wrapper = $('#tables-wrapper');
wrapper.html(html);
wrapper
.find('h1:first')
.insertBefore(wrapper)
.attr('id', 'title-heading');
wrapper.find('table').each(function() {
let columns = [];
$(this).find('tr:first th').each(function() {
columns.push($(this).text().replace(/\s/g, '-').toLowerCase());
});
for(let i = 0; i < columns.length; ++i) {
$(this).find('td:nth-child('+(i+1)+')').addClass('column-'+columns[i]);
}
});
$('.column-' + disciplineColumn).each(function() {
$(this).attr('data-original', $(this).text());
});
defaultHTML = wrapper.html();
}
function injectSettingHTML() {
'use strict';
let html = '<div id="settings-wrapper">'+
' <div id="week-wrapper" class="option-wrapper">'+
' <span id="week-span"></span>'+
' <label for="offset-week">Offset week by 1</label>'+
' <input type="checkbox" id="offset-week" />'+
' </div>'+
' <div id="group-wrapper" class="option-wrapper">'+
' <label for="group-select">Your group: </label>'+
' <select id="group-select">'+
' <option value="0"></option>';
$('#tables-wrapper h1').each(function() {
try{
let group = parseInt($(this).text().replace('Grupa ', ''), 10);
html += '<option value="'+group+'">'+group+'</option>';
}
catch(e){
console.log(e);
}
});
html += '</select>'+
' </div>'+
' <div id="half-group-wrapper" class="option-wrapper">'+
' <label for="half-group-select">Your half group: </label>'+
' <select id="half-group-select">'+
' <option value="1">1</option>'+
' <option value="2">2</option>'+
' <option value="0">Don\'t hide</option>'+
' </select>'+
' </div>'+
' <br>'+
' <div id="buttons-wrapper" class="option-wrapper">'+
' <button id="hider-button">Hidden disciplines</button>'+
' <button id="renamer-button">Rename disciplines</button>'+
' <button id="finder-button">Find disciplines</button>'+
' <button id="reset-button">Reset Settings</button>'+
' <button id="print-button">Print this page</button>'+
' </div>'+
' <div id="hider-dialog">'+
' <span>Select the disciplines you <b>don\'t</b> want highlighted:</span>'+
' <div id="hider-list-wrapper"></div>'+
' <div style="float: right;">'+
' <button id="hider-save">Save</button>'+
' <button id="hider-close">Cancel</button>'+
' </div>'+
' </div>'+
' <div id="renamer-dialog">'+
' <span>Enter the text you want each discipline to be renamed to. <br> Leave the field blank if you don\'t want a discipline\'s name replaced.</span>'+
' <div id="renamer-list-wrapper"></div>'+
' <div style="float: right;">'+
' <button id="renamer-save">Save</button>'+
' <button id="renamer-close">Cancel</button>'+
' </div>'+
' </div>'+
' <div id="finder-dialog">'+
' <div id="tabs">'+
' <ul>' +
' <li><a href="#tabs-1">By Discipline</a></li>' +
' <li><a href="#tabs-2">By Time</a></li>' +
' </ul>' +
' <div id="tabs-1">'+
' <div class="finder-options-wrapper">'+
' <label for="finder-select">Discipline to search for: </label><select id="finder-select"></select>'+
' <label for="finder-type"> Type: </label>'+
' <select id="finder-type">'+
' <option value="curs">Course</option>'+
' <option value="seminar">Seminar</option>'+
' <option value="laborator">Laboratory</option>'+
' </select>'+
' </div>'+
' <table id="finder-result"></table>'+
' </div>'+
' <div id="tabs-2">'+
' <div class="finder-options-wrapper">'+
' <label for="finder-day">Day: </label><select id="finder-day"></select>'+
' <label for="finder-hour"> Hour: </label>'+
' <select id="finder-hour"></select>'+
' <label for="finder-sapt"> Week: </label>'+
' <select id="finder-sapt">'+
' <option value="0">Both</option>'+
' <option value="1">1</option>'+
' <option value="2">2</option>'+
' </select>'+
' </div>'+
' <table id="finder-time-result"></table>'+
' </div>'+
' </div>'+
' </div>';
html += '</div>';
$(html).insertAfter('#title-heading');
for(let i = 0; i < days.length; ++i) {
$('#finder-day').append('<option value="'+days[i]+'">'+days[i]+'</option>');
}
$('#offset-week').checkboxradio({
icon:false
});
$('button').button();
$('select').selectmenu();
$('#hider-button').button({
icon: 'ui-icon-hide'
});
$('#renamer-button').button({
icon: 'ui-icon-rename'
});
$('#finder-button').button({
icon: 'ui-icon-find'
});
$('#reset-button').button({
icon: 'ui-icon-reset'
});
$('#print-button').button({
icon: 'ui-icon-printer'
});
$('#tabs').tabs();
$('#hider-dialog').dialog({
modal: true,
width: 320,
title: 'Hide disciplines',
autoOpen: false
});
$('#renamer-dialog').dialog({
modal: true,
width: 420,
title: 'Rename disciplines',
autoOpen: false
});
$('#finder-dialog').dialog({
modal: true,
width: 620,
height: 'auto',
title: 'Find disciplines',
autoOpen: false
});
updateFinderHourSelect();
}
function getDisciplinesList() {
let discSet = new Set();
$('.column-' + disciplineColumn).each(function() {
discSet.add($(this).text());
});
disciplines = [...discSet];
}
function setEventHandlers() {
$('body')
.on('change', '#offset-week', function() {
options.weekOffset = ($(this).prop('checked') ? 1 : 0);
performChange();
})
.on('selectmenuchange', '#group-select', function() {
options.group = parseInt($(this).val(), 10);
performChange();
})
.on('selectmenuchange', '#half-group-select', function() {
options.halfGroup = parseInt($(this).val(), 10);
performChange();
})
.on('click', '#hider-button', function() {
$('#hider-dialog')
.dialog('option', 'position', {
my: 'center top',
at: 'center top+50',
of: window
})
.dialog('open');
})
.on('click', '#renamer-button', function() {
$('#renamer-dialog')
.dialog('option', 'position', {
my: 'center top',
at: 'center top+50',
of: window
})
.dialog('open');
})
.on('click', '#reset-button', function() {
if(confirm('Are you sure you want to reset?')){
options = getDefaultOptions();
performChange();
}
})
.on('click', '#print-button', window.print)
.on('click', '#hider-save', function() {
let hides = [];
$('#hider-list-wrapper tr').each(function() {
if($(this).find('.hide-check').is(':checked')){
hides.push($(this).find('.discipline-name').attr('data-discipline'));
}
});
$('#hider-dialog').dialog('close');
options.disciplinesToHide = hides;
performChange();
})
.on('click', '#hider-close', function() {
$('#hider-dialog').dialog('close');
})
.on('click', '#renamer-save', function() {
let renames = {};
$('#renamer-list-wrapper tr').each(function() {
let renameTo = $(this).find('.rename-to').val();
if(renameTo.length > 0){
renames[$(this).find('.discipline-name').text()] = renameTo;
}
});
options.disciplinesToReplace = renames;
$('#renamer-dialog').dialog('close');
performChange();
})
.on('click', '#renamer-close', function() {
$('#renamer-dialog').dialog('close');
})
.on('click', '#finder-button', function() {
$('#finder-dialog')
.dialog('option', 'position', {
my: 'center top',
at: 'center top+50',
of: window
})
.dialog('open');
findDiscipline();
})
.on('selectmenuchange', '#finder-dialog select', findDiscipline)
.on('selectmenuchange', '#finder-day', updateFinderHourSelect)
.on('selectmenuchange', '#finder-hour, #finder-sapt', findDisciplineByTime);
}
function findDiscipline() {
let disc = $('#finder-select').val();
let type = $('#finder-type').val();
let result = $('#finder-result');
result.html('');
$('#tables-wrapper tr').each(function() {
if($(this).find('.column-tipul').text().toLowerCase() === type &&
($(this).find('.column-disciplina').text() === disc ||
$(this).find('.column-disciplina').attr('data-original') === disc)){
$(this)
.clone()
.removeClass('meh-tr')
.removeClass('other-week-tr')
.removeClass('nope-tr')
.removeClass('last-of-day-tr')
.appendTo(result);
}
});
let rows = $('#finder-result tr').get();
rows.sort(function(a, b) {
a = $(a);
b = $(b);
let aDay = a.find('.column-ziua').text();
let bDay = b.find('.column-ziua').text();
if(aDay === bDay){
let aHr = a.find('.column-orele').text().split('-')[0];
aHr = parseInt(aHr, 10);
let bHr = b.find('.column-orele').text().split('-')[0];
bHr = parseInt(bHr, 10);
return aHr - bHr;
}
else{
aDay = days.indexOf(aDay);
bDay = days.indexOf(bDay);
return aDay - bDay;
}
});
rows = rows.filter(function (value, index, self) {
if(index + 1 < self.length){
let tr = $(value);
let nextTr = $(self[index+1]);
return !equalTrs(tr, nextTr);
}
return true;
});
$('#finder-result').html(rows);
addDayLines($('#finder-result'));
}
function equalTrs(a, b) {
let aDay = a.find('.column-ziua').text();
let aHr = a.find('.column-orele').text();
let aFreq = a.find('.column-frecventa').text();
let aSala = a.find('.column-sala').text();
let aForm = a.find('.column-formatia').text();
let aType = a.find('.column-tipul').text();
let aDisc = a.find('.column-disciplina').text();
let aTeacher = a.find('.column-cadrul-didactic').text();
let bDay = b.find('.column-ziua').text();
let bHr = b.find('.column-orele').text();
let bFreq = b.find('.column-frecventa').text();
let bSala = b.find('.column-sala').text();
let bForm = b.find('.column-formatia').text();
let bType = b.find('.column-tipul').text();
let bDisc = b.find('.column-disciplina').text();
let bTeacher = b.find('.column-cadrul-didactic').text();
return aDay === bDay && aHr === bHr && aFreq === bFreq && aSala === bSala &&
aForm === bForm && aType === bType && aDisc === bDisc && aTeacher === bTeacher;
}
function updateFinderHourSelect() {
let hours = new Set();
$('tr:contains('+$('#finder-day').val()+')').each(function() {
hours.add($(this).find('.column-orele').text());
});
hours = [...hours].sort(function(a, b) {
a = parseInt(a.split('-')[0], 10);
b = parseInt(b.split('-')[0], 10);
return a-b;
});
$('#finder-hour').html('');
for(let i = 0; i < hours.length; ++i) {
$('#finder-hour').append('<option value="'+hours[i]+'">'+hours[i]+'</option>');
}
$('#finder-hour').selectmenu('refresh');
findDisciplineByTime();
}
function findDisciplineByTime() {
let day = $('#finder-day').val();
let hour = $('#finder-hour').val();
let week = $('#finder-sapt').val();
let result = $('#finder-time-result');
result.html('');
$('#tables-wrapper tr').each(function() {
let weekString = $(this).find('.column-frecventa').text();
if($(this).find('.column-ziua').text().toLowerCase() === day.toLowerCase() &&
$(this).find('.column-orele').text() === hour &&
(week == "0" || weekString.replace(/\s/g, '') === '' || weekString === 'sapt. ' + week)){
$(this)
.clone()
.removeClass('meh-tr')
.removeClass('other-week-tr')
.removeClass('nope-tr')
.removeClass('last-of-day-tr')
.appendTo(result);
}
});
let rows = $('#finder-time-result tr').get();
rows.sort(function(a, b) {
a = $(a);
b = $(b);
let aGroup = a.find('.column-formatia').text();
let bGroup = b.find('.column-formatia').text();
if(aGroup === bGroup){
let aDisc = a.find('.column-disciplina').text();
let bDisc = b.find('.column-disciplina').text();
return compareStrings(aDisc, bDisc);
}
else{
return compareStrings(aGroup, bGroup);
}
});
rows = rows.filter(function (value, index, self) {
if(index + 1 < self.length){
let tr = $(value);
let nextTr = $(self[index+1]);
return !equalTrs(tr, nextTr);
}
return true;
});
$('#finder-time-result').html(rows);
}
function compareStrings(a, b) {
if(a < b){
return -1;
}
else if(a > b){
return 1;
}
return 0;
}
function performChange(){
saveOptions();
updateSettingsUi();
runFixer();
}
function saveOptions() {
GM_setValue(getOptionKey(), JSON.stringify(options));
}
function updateSettingsUi() {
let week = getWeekNo();
if(week === 0){
week = 2;
}
$('#week-span').text("Week "+ week + ": ");
$('#offset-week')
.prop('checked', options.weekOffset === 1)
.checkboxradio('refresh');
if($('#tables-wrapper .column-frecventa:contains(sapt)').length === 0){
$('#week-wrapper').hide();
}
else{
$('#week-wrapper').show();
}
if($('#group-select:contains('+options.group+')').length){
$('#group-select')
.val(options.group)
.selectmenu('refresh');
}
if($('#tables-wrapper table').length === 1){
$('#group-wrapper').hide();
}
else{
$('#group-wrapper').show();
}
$('#half-group-select')
.val(options.halfGroup)
.selectmenu('refresh');
if($('#tables-wrapper .column-formatia:contains(/1)').length === 0 &&
$('#tables-wrapper .column-formatia:contains(/2)').length === 0){
$('#half-group-wrapper').hide();
}
else{
$('#half-group-wrapper').show();
}
let hiderList = '<table>';
let renamerList = '<table>';
let finderOptions = '';
for(let i = 0; i < disciplines.length; ++i) {
let discipline = disciplines[i];
let discName = discipline;
let discReplacer = '';
if(options.disciplinesToReplace.hasOwnProperty(discipline) && options.disciplinesToReplace[discipline]){
discName = options.disciplinesToReplace[discipline];
discReplacer = discName;
}
hiderList += '<tr><td class="discipline-name" data-discipline="'+discipline+'">'+discName+'</td><td class="check-column"><input class="hide-check" type="checkbox" '+(options.disciplinesToHide.includes(discipline) ? ' checked': '')+'/></td></tr>';
renamerList += '<tr><td class="discipline-name" >'+discipline+'</td><td class="input-column"><input class="rename-to" type="text" value="'+discReplacer+'"/></td></tr>';
finderOptions += '<option value="'+discipline+'">' + discName + '</option>';
}
hiderList += '</table>';
renamerList += '</table>';
$('#hider-list-wrapper').html(hiderList);
$('#renamer-list-wrapper').html(renamerList);
$('#finder-select').html(finderOptions);
$('#finder-select').selectmenu('refresh');
}
function runFixer() {
'use strict';
$('#tables-wrapper').html(defaultHTML);
let myGroupHeading = $("h1:contains('"+options.group+"')");
if($('#tables-wrapper table').length === 1){
myGroupHeading = $('#tables-wrapper h1');
}
let myGroupTable = myGroupHeading.next("table");
myGroupHeading.prependTo("#tables-wrapper").css("margin", "30px" );
myGroupTable.insertAfter(myGroupHeading).css("margin-bottom","147px");
for(let discipline in options.disciplinesToReplace){
if(options.disciplinesToReplace.hasOwnProperty(discipline) && options.disciplinesToReplace[discipline]){
let a = $('.column-'+disciplineColumn+' a:contains('+discipline+')');
a.each(function() {
let text = $(this).text();
$(this)
.text(text.replace(discipline, options.disciplinesToReplace[discipline]));
});
}
}
for(let i = 0; i < options.disciplinesToHide.length; ++i) {
let discipline = options.disciplinesToHide[i];
myGroupTable
.find('.column-'+disciplineColumn+'[data-original="'+discipline+'"]')
.closest('tr')
.addClass("meh-tr")
.addClass("nope-tr");
}
myGroupTable.find("tr:contains('"+options.group+"/"+(3-options.halfGroup)+"')").addClass("meh-tr");
let weekNo = getWeekNo();
let otherWeekNo = weekNo + 1;
let saptString = "sapt. " + otherWeekNo;
myGroupTable.find("tr:contains(" + saptString + ")").addClass("other-week-tr");
$("tr:contains('Curs')").addClass("curs-tr");
$("tr:contains('Seminar')").addClass("seminar-tr");
$("tr:contains('Laborator')").addClass("labor-tr");
$("table").each(function(){
addDayLines($(this));
});
}
function addDayLines(table) {
for(let i in days){
let dayString = days[i];
let last = table.find("tr:contains(" + dayString + ")");
last = $(last[last.length - 1]);
if(!last.is(':last-child')){
last.addClass("last-of-day-tr");
}
}
}
function getWeekNo() {
let weekInYear = new Date().getWeek();
let firstWeek = new Date(new Date().getYear(), 0, 1).getWeek();
return (weekInYear - firstWeek + 1 + options.weekOffset) % 2;
}