ImToNy / WhatIf?

// ==UserScript==
// @name         WhatIf?
// @namespace    imtony@protonmail.com
// @version      0.6
// @description  Co się stanie jeżeli dostanę jakąś ocenę?
// @author       Antoni Siek
// @match        https://dziennik.oswiatawradomiu.pl/przegladaj_oceny/uczen
// @match        https://dziennik.librus.pl/przegladaj_oceny/uczen
// @match        https://synergia.librus.pl/przegladaj_oceny/uczen
// @updateURL    https://openuserjs.org/meta/ImToNy/WhatIf.meta.js
// @downloadURL  https://openuserjs.org/install/ImToNy/WhatIf.user.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function() {
    'use strict';

    function start() {

        $("h3:contains('Oceny bieżące')").append("<br><br><span style='color:red'>WhatIf? v" + GM_info.script.version + " by Antoni Siek</span>");

        var blocked = $("img[title='Podgląd średniej ocen został wyłączony przez administratora szkoły.']").length;

        $("tr.line1,tr.line0").has("td.micro").not("tr.bolded").each(function() {
            $('td:eq(2),td:eq(6)', this).append("<span class='grade-box whatif' title='What if?'>?</span>");

            if(blocked) {
                $('td:eq(3)', this).text($('td:eq(2)', this).getGrades());
                $('td:eq(7)', this).text($('td:eq(6)', this).getGrades());
            }
        });

        $('.whatif').css({
            "background-color": "#c4c4c4",
            "cursor": "pointer"
        });

        $('.whatif').click(function() {
            var grade = prompt("Proszę podać ocenę:") || 0;

            if(grade < 1 || grade > 6) {
                alert("Zła ocena! Powinno być: 1-6, podano: " + grade);
                return;
            }

            var weight = prompt("Proszę podać wagę oceny:") || 0;

            if(weight < 1) {
                alert("Zła waga! Powinno być >1, podano: " + weight);
                return;
            }

            var toPush = {};
            toPush[grade] = [weight];

            var grades = $(this).closest('td').getGrades(toPush);

            if(!grades) {
                alert('Niestety, ale wygląda na to, że w systemie twojej szkoły wyłączone są wagi ocen lub wybrałeś przedmiot w którym wszystkie oceny nie posiadają wag.');
            } else {
                alert("Twoja średnia wynosiłaby: " + grades);
            }

        });

    }

    Array.prototype.clean = function() {
        for (var i = 0; i < this.length; i++) {
            if (this[i] === "") {
                this.splice(i, 1);
                i--;
            }
        }
        return this;
    };

    jQuery.fn.getGrades = function(toAdd=false) {
        var somethinghave = false,
            parent = $(this[0]),
            current = {
                1:[],
                2:[],
                3:[],
                4:[],
                5:[],
                6:[],
            };

        if(toAdd) {
            $.each(toAdd, function(element, index) {
                $.each(index, function(parent, grade) {
                    current[element].push(grade);
                });
            });
        }

        parent.find('.grade-box:not(.whatif)>a').each(function() {
            var grade = $(this);

            var title = grade.attr('title').split(/<br>|<br\/>/gi).clean();

            var data = {};
            for (var i = 0; i < title.length; i++) {
                var split = title[i].split(': ');
                data[split[0].trim()] = split[1].trim();
            }

            if(typeof data.Waga == 'undefined') {
                return;
            }

            var exact,
                imported = grade.text(), trimmed = grade.text().replace(/\D+/g, '');

            if(imported.indexOf("+") !== -1) {
                exact = trimmed + 0.25;
            } else if (imported.indexOf("-") !== -1) {
                exact = trimmed - 0.15;
            } else {
                exact = trimmed;
            }

            somethinghave = true;

            var weight = data.Waga;

            current[exact].push(weight);
        });

        if(!somethinghave) {
            return false;
        } else {
            var upper = 0, lower = 0;

            var formattedList = {};

            $.each(current, function(grade, value) {
                $.each(value, function(i, weight) {
                    if (typeof formattedList[weight] !== 'undefined') {
                        formattedList[weight].push(grade);
                    } else {
                        formattedList[weight] = [grade];
                    }
                });
            });

            $.each(formattedList, function(key, value) {
                var sum = 0;

                if(value.length < 1) {
                    return;
                }

                $.each(value, function(i, number) {
                    sum += Number(number);
                });

                upper += sum * key;
                lower += value.length * key;
            });

            var average = upper / lower;

            return Math.round(average * 100) / 100;
        }
    };

    $(start());
})();