Greasy Fork is available in English.

EP Overhaul

Education Perfect Information Skipper

// ==UserScript==
// @name         EP Overhaul
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Education Perfect Information Skipper
// @author       You
// @match        https://app.educationperfect.com/app/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=educationperfect.com
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// @grant        GM_addStyle
// ==/UserScript==

const loadScriptXML = (src) => {
    return new Promise((resolve, reject) => {
        var connect = new XMLHttpRequest();
        connect.open('GET', src, true);

        connect.onload = () => {
            if (connect.status == 200) {
                resolve(connect.responseText);
                return;
            } else {
                reject(connect.statusText);
                return;
            }
        }

        connect.send();
    });
}

const loadScriptJq = (src, jQuery) => {
    return new Promise((resolve, reject) => {
        jQuery.get(src, (data) => {
            resolve(data);
            return;
        });
    });
}

function loadScripts() {
    loadScriptXML('https://code.jquery.com/jquery-3.6.0.min.js').then((jQuery_dat) => {
        var jqF = new Function(jQuery_dat + "; return jQuery;");
        var jQuery = jqF();

        detectPage();
    });
}

loadScripts();

       function detectPage() {
    global();

    if (location.href.includes("educationperfect.com")) educationPerfect();
}

async function global() {
    var panel = `
    <div id='panel' class='inactive'>
        <p>No</p>
    </div>

    <style>
    #panel {
        position: fixed;
        top: 0;
        left: 0;
        background: hotpink;
        width: 100vw;
        height: 100vh;
        z-index: 9999999;
        color: orange;
        transition: 0.5s ease;
        transform: translateX(0);
    }

    #panel.inactive {
        transform: translateX(-100vw);
    }
    </style>
    `;

    $("body").append(panel);

    document.addEventListener('keydown', function(event) {
        if (event.altKey && event.code == 'KeyL') {
            event.preventDefault();
            $("#panel").toggleClass("inactive");
        }
    });
}

async function educationPerfect() {
    // Wait for .sa-navigation-controls-content.h-group.v-align-center.h-align-space-between.align-right to load
    await new Promise(resolve => {
        var interval = setInterval(function() {
            if ($(".sa-navigation-controls-content.h-group.v-align-center.h-align-space-between.align-right").length) {
                clearInterval(interval);
                resolve();
            }
        }, 100);
    });

    setInterval(() => {
        if ($(".learnsharp-ep-skip-btn").length == 0 || $("#learnsharp-ep-skip").length == 0) {
            console.log('a');
            $(".learnsharp-ep-skip-btn").remove();
            $("#learnsharp-ep-skip").remove();

            $(".sa-navigation-controls-content.h-group.v-align-center.h-align-space-between.align-right").append(`
            <div class="continue arrow action-bar-button v-group learnsharp-ep-skip-btn" sidebar="self.model.sidebarMode" walkthrough-position="top">
                <button id="skip-btn" class="learnsharp-ep-btn">
                    <span ng-hide="self.sidebar" class="abb-label" ng-transclude="">
                    <span class="ng-binding ng-scope"> Skip </span></span>
                    <span class="highlight"></span>
                </button>
                <div class="sidemode-label ng-hide">
                    <span class="ng-binding ng-scope"> Skip </span>
                </div>
            </div>

            <div class="continue arrow action-bar-button v-group learnsharp-ep-skip-btn" sidebar="self.model.sidebarMode" walkthrough-position="top">
                <button id="skip-sec-btn" class="learnsharp-ep-btn">
                    <span ng-hide="self.sidebar" class="abb-label" ng-transclude="">
                    <span class="ng-binding ng-scope"> Skip Section </span></span>
                    <span class="highlight"></span>
                </button>
                <div class="sidemode-label ng-hide">
                    <span class="ng-binding ng-scope"> Skip Section </span>
                </div>
            </div>

            <div class="learnsharp-ep-skip-btn">
                <input type="checkbox" id="learnsharp-ep-skip" name="learnsharp-ep-skip" value="learnsharp-ep-skip">
                <label for="learnsharp-ep-skip">Auto Skip</label>
            </div>

            <style>
            .learnsharp-ep-skip-btn {
                margin-left: 10px;
            }
            </style>
            `);
        }

        // clear $("#skip-btn") click events
        $("#skip-btn").off("click");

        $("#skip-btn").on('click', function() {
            var elms = $(".h-group.v-align-center.expanded-content.information.selected");
            if (elms.length > 0) {
                var btn = $(".continue.arrow.action-bar-button.v-group.ng-isolate-scope").find('button');

                // Make sure we dont click the button we just clicked.
                for (var i = 0; i < btn.length; i++) {
                    if (btn[i].classList.contains("learnsharp-ep-btn"))
                            continue;

                        console.log(btn[i]);

                    btn[i].click();
                }
            }
        });

        $("#skip-sec-btn").off("click");

        $("#skip-sec-btn").on('click', async function() {
            while (true) {
                var elms = $(".h-group.v-align-center.expanded-content.information.selected");
                if (elms.length > 0) {
                    var btn = $(".continue.arrow.action-bar-button.v-group.ng-isolate-scope").find('button');

                    for (var i = 0; i < btn.length; i++) {
                        // Check if has class
                        if (btn[i].classList.contains("learnsharp-ep-btn"))
                            continue;

                        btn[i].click();
                    }
                } else break;

                await new Promise(resolve => { setTimeout(resolve, 100); });
            }
        });
    }, 100);

    setInterval(() => {
        if ($(".h-group.v-align-center.expanded-content.information.selected").length > 0) {
            $(".continue.arrow.action-bar-button.v-group:not(.ng-isolate-scop)").css("display", "block");
            $(".continue.arrow.action-bar-button.v-group.ng-isolate-scope").css("display", "none");
        } else {
            $(".continue.arrow.action-bar-button.v-group:not(.ng-isolate-scop)").css("display", "none");
            $(".continue.arrow.action-bar-button.v-group.ng-isolate-scope").css("display", "block");
        }
    }, 100);

    while (true) {
        if ($("#learnsharp-ep-skip").is(":checked")) {
            var elms = $(".h-group.v-align-center.expanded-content.information.selected");
            if (elms.length > 0) {
                var btn = $(".continue.arrow.action-bar-button.v-group.ng-isolate-scope").find('button');

                for (var i = 0; i < btn.length; i++) {
                    btn[i].click();
                }
            }
        }

        await new Promise(resolve => { setTimeout(resolve, 100); });
    }
}