Pendorian Elite UI

Changes a large portion of the text and UI to 'Elite' blue and makes small changes to the UI.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name Pendorian Elite UI
// @namespace http://pendoria.net/
// @version 3.1
// @author Puls3
// @include /^https?:\/\/(?:.+\.)?pendoria\.net\/?(?:.+)?$/
// @homepage https://xpuls3.github.io/Pendorian-Elite-UI
// @supportURL https://github.com/xPuls3/Pendorian-Elite-UI/issues
// @icon https://raw.githubusercontent.com/xPuls3/Pendorian-Elite-UI/master/favicon.ico
// @grant none
// @run-at document-start
// @description Changes a large portion of the text and UI to 'Elite' blue and makes small changes to the UI.
// ==/UserScript==

// Pendorian Elite UI is only officially distributed on GitHub!
// - https://github.com/xPuls3/Pendorian-Elite-UI/

// Pendorian Elite UI also has an official website!
// - https://xpuls3.github.io/Pendorian-Elite-UI/

// This script was created by Puls3!
// - Puls3 on Pendoria

const version = "3.1";
window.eliteUI = version;
let modules = register();
define();

// [Options]

// Toggle Script Debugging
const isDebug = false;

(function () {

    // Recolor Module
    // Changes the color of almost everything
    modules.recolor.options = {

        // Enable / Disable
        status: true,

        // Changes cyan titles to match the new chat username color
        titleSwap: true,

        // Colors
        color: "rgb(0, 153, 255)",
        darkColor: "rgb(0, 123, 235)",
        buttonColor: "rgba(0, 153, 255, 0.5)",
        buttonHoverColor: "rgba(0, 153, 255, 0.8)",
        progressBackgroundColor: "rgb(51, 71, 113)",
        profileLinkColor: "rgb(0, 123, 235)",
        mentionColor: "rgb(0, 219, 255)",
        mentionTabColor: "rgb(0, 153, 255)",
        chatUsernameColor: "rgb(0, 153, 255)"

    };

    // Background Module
    // Changes the background to the link below
    modules.background.options = {

        // Enable / Disable
        status: true,

        // Standard Image: 'Stellar Collision' by KuldarLeement
        // Original Link: https://www.deviantart.com/kuldarleement/art/Stellar-collision-397866757
        // Hosted Link: https://raw.githubusercontent.com/xPuls3/Pendorian-Elite-UI/dev/background.jpg

        // Background link
        link: "https://raw.githubusercontent.com/xPuls3/Pendorian-Elite-UI/dev/background.jpg"

    };

    // Favicon Module
    // Changes the favicon to the link below
    modules.favicon.options = {

        // Enable / Disable
        status: true,

        // Favicon link
        link: "https://raw.githubusercontent.com/xpuls3/Pendorian-Elite-UI/master/favicon.ico"

    };

    // Edits Module
    // Changes that used to be included with the recolor
    modules.edits.options = {

        // Enable / Disable
        status: true

    };

    // Frameless Mode Module
    // Removes all of the frames
    modules.frameless.options = {

        // Enable / Disable
        status: true

    };

    // Dungeon Sidebar Module
    // Removes the Dungeon tab and adds a link on the sidebar
    modules.dungeonSidebar.options = {

        // Enable / Disable
        status: true

    };

    // Dual View Module
    // Forces both the action and content pages to always show next to each other vertically
    // Requires Dungeon Sidebar to work correctly
    modules.dualView.options = {

        // Enable / Disable
        status: false,

        // How far down the frame (in pixels) the line between content and actions is
        line: 220

    };

    // Legacy Sidebar Module
    // Makes the sidebar look almost like the original sidebar designed by Zampa
    modules.legacySidebar.options = {

        // Enable / Disable
        status: true

    };

    // Rounded Borders Module
    // Makes most of the game's main area corners round.
    // Requires Frameless Mode to work correctly
    modules.roundedBorders.options = {

        // Enable / Disable
        status: false,

        // Changes how round the corners are with CSS values
        amount: "16px"

    };

    // Extended Header Module
    // Extends the header above chat in side-by-side mode
    modules.extendedHeader.options = {

        // Enable / Disable
        status: true

    };

    // Areas Included Module
    // Removes the Areas tab and adds the content to the battle tab
    modules.areasIncluded.options = {

        // Enable / Disable
        status: true

    };

    // Extra Footer Links Module
    // Adds more links to the bottom of the screen
    modules.extraFooterLinks.options = {

        // Enable / Disable
        status: true,

        // Add more links below
        // Use the existing ones as examples
        links: [
            [
                "Karubo's ROI",
                "http://pendcalc.karubo.de/"
            ],
            [
                "Puls3's Calcs",
                "https://xpuls3.github.io/calculators/"
            ],
            [
                "Impulsive Updates",
                "https://xpuls3.github.io/blog/"
            ]
        ]

    };

    // Remove Battle Stats Module
    // Removes the battle stats in the header
    modules.removeBattleStats.options = {

        // Enable / Disable
        status: false

    };

    // Remove Gold & Stat Module
    // Removes Gold Boost & Stat Drop Boost from Rhodium Boosts
    modules.removeGoldStat.options = {

        // Enable / Disable
        status: false

    };

    // Remove Logo Module
    // Removes the 'Pendoria Logo' and moves the left side upwards to reduce clutter
    modules.removeLogo.options = {

        // Enable / Disable
        status: true

    };

    // Pace Hider Module
    // Removes the loading bar at the top of the screen
    modules.paceHider.options = {

        // Enable / Disable
        status: false

    };

    // Remove Tabs Module
    // Removes the tabs on the actions page
    // Requires Dungeon Sidebar to work correctly
    // Requires Areas Included to work correctly
    modules.removeTabs.options = {

        // Enable / Disable
        status: false

    };

    // Remove Tradeskill Selection Module
    // Removes the Tradeskill Selection dropdown and the work button
    // Ensure that you are already doing the TS that you want to continue doing
    // Click the action bar to refresh after turning this on
    modules.removeTradeskillSelection.options = {

        // Enable / Disable
        status: false,

        // Adds a small amount of space above the action text
        // Without this it will look awkward
        addSpace: true

    };

    // Version Check Module
    // Checks for updates
    modules.versionCheck.options = {

        // Enable / Disable
        status: true,

        // Only check once every 24 hours
        dailyLimit: true

    };

})();

// [Functions]

(function () {

    window.addEventListener("load", origin);

    function origin () {

        logDo(`Initiating Pendorian Elite UI v${version}`, 0);

        const k = Object.keys(modules);

        let promiseList = [];
        let isGame = checkIsPath("/game");
        let isLogin = checkIsPath("/");

        for (let i = 0; i < k.length; i++) {

            modules[k[i]].id = String(k[i]);

            if (typeof (modules[k[i]].name) === "undefined") modules[k[i]].name = modules[k[i]].id;

            if (isGame || (isLogin && modules[k[i]].runLogin)) activateModule(modules[k[i]]);

        }

        Promise.all(promiseList).then(function () {

            if (isDebug) logDo("Script completely loaded", 0);

        });

        function activateModule(module) {
            if (typeof (module.options) !== "undefined") {
                if (module.options.status) {
                    if (typeof (module.code) !== "undefined") {
                        promiseList.push(new Promise(function (resolve) {
                            module.code(resolve);
                        }).then(function (result) {
                            moduleEnabled(module, result)
                        }));
                    } else {
                        logDo(`${module.name} Module does not contain code`, 1);
                    }
                }
            } else {
                logDo(`${module.name} Module does not contain options`, 1);
            }
        }

    }

    function moduleEnabled (module, result) {

        if (result) {
            module.style = result;
            applyStyle(module);
        }

        if (isDebug) {
            logDo(`${module.name} Module enabled`, 0);
        }

    }

    function applyStyle (module) {
        let matches = $(`.Elite-UI-Style[Elite-UI-Module="${module.id}"]`);
        if (matches.length !== 0) matches.remove();
        $("head").append(`<style class="Pendorian-Elite-UI Elite-UI-Style" Elite-UI-Module="${module.id}">${module.style}</style>`);
    }

    function checkIsPath (x) {
        return (window.location.pathname === x);
    }

})();

function register () {
    return {
        "recolor": {
            "name": "Recolor",
            "runLogin": true
        },
        "background": {
            "name": "Background",
            "runLogin": true
        },
        "favicon": {
            "name": "Favicon",
            "runLogin": true
        },
        "edits": {
            "name": "Edits"
        },
        "frameless": {
            "name": "Frameless Mode",
            "runLogin": true
        },
        "dungeonSidebar": {
            "name": "Dungeon Sidebar"
        },
        "dualView": {
            "name": "Dual View"
        },
        "legacySidebar": {
            "name": "Legacy Sidebar"
        },
        "roundedBorders": {
            "name": "Rounded Borders",
            "runLogin": true
        },
        "extendedHeader": {
            "name": "Extended Header"
        },
        "areasIncluded": {
            "name": "Areas Included"
        },
        "extraFooterLinks": {
            "name": "Extra Footer Links"
        },
        "removeBattleStats": {
            "name": "Remove Battle Stats"
        },
        "removeGoldStat": {
            "name": "Remove Gold & Stat"
        },
        "removeLogo": {
            "name": "Remove Logo"
        },
        "paceHider": {
            "name": "Pace Hider",
            "runLogin": true
        },
        "removeTabs": {
            "name": "Remove Tabs"
        },
        "removeTradeskillSelection": {
            "name": "Remove Tradeskill Selection"
        },
        "versionCheck": {
            "name": "Version Check",
            "runLogin": true
        }
    };
}

function define () {

    modules.recolor.code = function (resolve) {
        const t = `
            html {
                --Elite-Color: ${modules.recolor.options.color};
                --Elite-Dark-Color: ${modules.recolor.options.darkColor};
                --Elite-Mention-Color: ${modules.recolor.options.mentionColor};
                --Elite-Mention-Tab-Color: ${modules.recolor.options.mentionTabColor};
                --Elite-Button-Color: ${modules.recolor.options.buttonColor};
                --Elite-Button-Hover-Color: ${modules.recolor.options.buttonHoverColor};
                --Elite-Profile-Link-Color: ${modules.recolor.options.profileLinkColor};
                --Elite-Progress-Background-Color: ${modules.recolor.options.progressBackgroundColor};
                --Elite-Chat-Color: ${modules.recolor.options.chatUsernameColor};
            }

    		/* Chat Color CSS */

                .chat-username {
                    color: var(--Elite-Chat-Color) !important;
                }

    		    #chat-messages > ul > li > font[color="#00ffff"] {
    		        color: var(--Elite-Chat-Color) !important;
    		    }

                .chat-local-error, #chat-messages ul li span[style*="color: #ea907b;"] {
                    color: var(--Elite-Color) !important;
                }

                .username-hilighted {
                    color: var(--Elite-Mention-Color) !important;
                }

                .chat-hilighted {
                    color: var(--Elite-Mention-Tab-Color) !important;
                }

    		/* UI CSS Below */

                #invinfo, #scraptowninfo, #invasioninfo, .activity-log-username, .guild-section [style*="color: rgb(29, 166, 87);"], .guild-section [style*="color: #1da657;"], #event[style="color:red;"], #mailcount, #action-info, a[style="color: rgb(255, 0, 0);"] {
                    color: var(--Elite-Color) !important;
                }
                #header-stats, #quest_done, #quest_prog {
                    color: var(--Elite-Color);
                }
                .green, #expwidth, #building-progress, #profile-scraptown-building-progress, #profile-encampment-building-progress, #chat-composer input[type="submit"], .toast-success {
                    background-color: var(--Elite-Color) !important;
                }
                button {
                    background: var(--Elite-Button-Color) !important;
                }
                button:hover {
                    background: var(--Elite-Button-Hover-Color) !important;
                }
                .item-rarity-runic {
                    color: var(--Elite-Color) !important;
                    text-shadow: 0 0 1px blue !important;
                }
                .display-item [style*="color: rgb(29, 166, 87);"], .display-item [style*="color: green;"], #rerollCost, #rerollCost + span[style="color: #1da657;"] {
                    color: var(--Elite-Color) !important;
                }
                .display-item [style*="color: #98bda1; padding-top: 5px;"], #lockedStatsForm span[style="color: green;"], #lockedStatsForm div[style="color: #98bda1; padding-top: 5px;"]{
                    color: var(--Elite-Dark-Color) !important;
                }
                ::selection {
                    color: white;
                    background: var(--Elite-Color);
                }
                .guild-name {
                    font-weight: bold;
                    color: var(--Elite-Profile-Link-Color);
                }
                .chat-command {
                    color: var(--Elite-Color);
                }
                progress {
                    color: var(--Elite-Color);
                }
                progress::-webkit-progress-value {
                    background: var(--Elite-Color);
                }
                progress::-moz-progress-bar {
                    background: var(--Elite-Color);
                }
                progress::-webkit-progress-bar {
                    background: var(--Elite-Color);
                }
                #progressbar-wrapper {
                    background: var(--Elite-Progress-Background-Color);
                }
                #exp {
                    background: var(--Elite-Progress-Background-Color) !important;
                }
                .tab-game-content [style*="width: 100%; border-radius: 10px; overflow: hidden; background-color: #31453a;"] {
                    background: var(--Elite-Progress-Background-Color) !important;
                }
                .terms-section-header, .question {
                    color: var(--Elite-Color) !important;
                }

                #dungeon-progressbar-wrapper {
                    background-color: var(--Elite-Progress-Background-Color);
                }
                #dungeon-progressbar-wrapper .progressbar, #encampment-building-progress  {
                    background-color: var(--Elite-Color) !important;
                }

                [data-player-id*="334"] .chat-username {
                    color: rgb(0, 153, 255) !important;
                }

                #quint span, .actionexperience, .actionexperience span, #double_tradeskill span, #guild_amount, #guild_currency, #gainedtype, #gainedres, #actionencampmentax {
                    color: var(--Elite-Color) !important;
                }

                .timeshit, .timescrit, .timesdodged, .hitstaken, #gainedgold, .actiongold, #guild_gold, #double_battle span {
                    color: var(--Elite-Color) !important;
                }

                .pace .pace-progress {
                    background: var(--Elite-Color) !important;
                }`;
        resolve(t);
    };

    modules.background.code = function (resolve) {
        const t = `
    		body {
    			background: #171d1d url(${modules.background.options.link}) no-repeat scroll center center;
                background-attachment: fixed;
                -webkit-background-size: cover;
                -moz-background-size: cover;
                -o-background-size: cover;
                background-size: cover;
    		}`;
        resolve(t);
    };

    modules.favicon.code = function (resolve) {
        const t = `<link rel="icon" href="${modules.favicon.options.link}"/>`;
        $("head").append(t);
        resolve();
    };

    modules.edits.code = function (resolve) {
        const t = `
    		#dungeon-dialogue {
    			display: none;
    		}`;
        resolve(t);
    };

    modules.frameless.code = function (resolve) {
        const t = `
            #menu, #profile, #chat, #charity, #stats-hourly, #gameframe, #drop-statistics {
              border: none !important;
            }
    		#gameframe-status-wrapper:after, #progressbar-wrapper::after {
    			background: none;
    		}
    		#progressbar-wrapper {
    			bottom: 0px;
    		}
    		#progressbar-wrapper .progressbar {
    			top: 0px;
    		}
    		#gameframe-status-wrapper {
    			line-height: 15px;
    			top: 0px;
    			left: 0px;
    			right: 0px;
    		}`;
        resolve(t);
    };

    modules.dungeonSidebar.code = function (resolve) {
        const t = `
    		#gameframe-battle > ul > li:nth-child(4) {
    			display: none;
    		}
    		#dungeon-content, #dungeon-tools-content {
    			color: white;
    		}`;
        $("#scraptown-button").parent().after(`<li><a href="" id="elite-dungeon-button" class="Pendorian-Elite-UI"><i class="fas fa-dungeon"></i>Dungeons</a></li>`);

        // Function Below Grabbed From Pendoria And Modified
        // Heavily modified, as this code is less than awesome.
        $("#elite-dungeon-button").click(function (event) {
            event.preventDefault();
            ajaxPost("/action/dungeons", function (data) {
                $("#gameframe-content").html(data).show();
                $("#gameframe-battle").hide();
                $("#dungeon-tools-content [tooltip-title]").each(function () {
                    $(this).qtip({
                        content: {
                            title: $(this).attr("tooltip-title"),
                            text: $(this).attr("tooltip-text")
                        },
                        style: { classes: "qtip-dark" },
                        position: {
                            target: "mouse"
                        }
                    });
                });
                ajaxPost("/dungeons/in-progress", function (inProgress) {
                    $progressbarWrapper = $("#dungeon-progressbar-wrapper");
                    $startButton = $(".dungeon-button-start");
                    if (inProgress) {
                        $progressbarWrapper.attr("hidden", false);
                        $startButton.attr("hidden", true);
                        setDungeonDialogueText(dungeonTextInProgress);
                    } else {
                        $progressbarWrapper.attr("hidden", true);
                        $startButton.attr("hidden", false);
                        setDungeonDialogueText(dungeonTextDone);
                    }
                    $dungeonDialogue = $("#dungeon-dialogue");
                    $dungeonDialogue.attr("hidden", false);
                    $dungeonControls = $(".dungeon-controls");
                    $dungeonControls.attr("hidden", false);
                    updateDungeonActivatorCount();
                    updateProfileDungeonActivatorCount();
                });
                ajaxPost("/dungeons/boosts", function (dungeonBoosts) {
                    dungeonTools.updateBoostPrices(dungeonBoosts);
                });
            });
        });
        resolve(t);
    };

    modules.dualView.code = function (resolve) {
        const t = `
    		html {
    			--DualViewLine: ${modules.dualView.options.line}px;
    		}
    		#gameframe-battle {
    		  display: block !important;
    		  height: var(--DualViewLine);
    		}
    		#gameframe-content {
    		  display: block !important;
    		  height: calc(100% - var(--DualViewLine) - 80px);
    		  top: calc(70px + var(--DualViewLine));
    		}
    		#menu ul li:first-child {
    		  display: none !important;
    		}`;
        resolve(t);
    };

    modules.legacySidebar.code = function (resolve) {
        const t = `
    		#menu .frame {
    			display: none;
    			width: 0px;
    		}
    		#menu {
    			padding: 0px;
    			background: none !important;
    			height: auto !important;
    			overflow: hidden;
    		}
    		#menu li a {
    			font-family: "Open Sans", helvetica, arial;
    			color: #969696;
    			padding: 5px 0;
    			text-decoration: none;
    			font-size: 15px;
    			padding-left: 15px;
    		}
    		#menu li.active a, #menu li:hover a{
    			color: #FFFFFF;
    			text-decoration: none !important;
    		}`;
        resolve(t);
    };

    modules.roundedBorders.code = function (resolve) {
        const l = modules.roundedBorders.options.amount;
        const t = `
    		#profile, #menu, #stats-hourly, #ether-resources-sidebar,
                #gameframe-battle, #gameframe-content, #drop-statistics,
                #gameframe-status-wrapper, #chat, #chat-form {
    			border-radius: ${l} !important;
    		}
    		.nav-tabs > li > a {
    			border-radius: ${l} ${l} 0px 0px !important;
    		}`;
        resolve(t);
    };

    modules.extendedHeader.code = function (resolve) {
        let t = `
            #header-content {
                width: calc(100% - 260px) !important
            }`;
        resolve(t);
    };

    modules.areasIncluded.code = function (resolve) {
        const t = `
            #gameframe-battle > ul > li:nth-child(3) {
    			display: none;
    		}`;
        setTimeout(function () {
            let $battleNav = $("#gameframe-battle .nav-tabs li");
            $battleNav.off("click");

            // Function Below Grabbed From Pendoria And Modified
            $battleNav.on("click", "a", function (e) {
                let url;
                if (e.currentTarget.textContent === "Battle") {
                    url = "battle";
                } else if (e.currentTarget.textContent === "Tradeskill") {
                    url = "tradeskill";
                } else if (e.currentTarget.textContent === "Dungeons") {
                    // Open dungeons instead
                    url = "dungeons";
                } else if (e.currentTarget.textContent === "Area") {
                    // Open dungeons instead
                    url = "area";
                }
                ajaxPost("/action/" + url, function (data) {
                    $("#actioncontent").html(data);
                    if (url === "dungeons") {
                        ajaxPost("/action/dungeons", function (data) {
                            $("#gameframe-battle").html(data).show();
                            $("#dungeon-tools-content [tooltip-title]").each(function () {
                                $(this).qtip({
                                    content: {
                                        title: $(this).attr("tooltip-title"),
                                        text: $(this).attr("tooltip-text")
                                    },
                                    style: { classes: "qtip-dark" },
                                    position: {
                                        target: "mouse"
                                    }
                                });
                            });
                            ajaxPost("/dungeons/in-progress",
                                function (inProgress) {
                                    $progressbarWrapper = $("#dungeon-progressbar-wrapper");
                                    $startButton = $(".dungeon-button-start");
                                    if (inProgress) {
                                        $progressbarWrapper.attr("hidden", false);
                                        $startButton.attr("hidden", true);
                                        setDungeonDialogueText(dungeonTextInProgress);
                                    } else {
                                        $progressbarWrapper.attr("hidden", true);
                                        $startButton.attr("hidden", false);
                                        setDungeonDialogueText(dungeonTextDone);
                                    }
                                    $dungeonDialogue = $("#dungeon-dialogue");
                                    $dungeonDialogue.attr("hidden", false);
                                    $dungeonControls = $(".dungeon-controls");
                                    $dungeonControls.attr("hidden", false);
                                    updateDungeonActivatorCount();
                                    updateProfileDungeonActivatorCount();
                                });
                            ajaxPost("/dungeons/boosts",
                                function (dungeonBoosts) {
                                    dungeonTools.updateBoostPrices(dungeonBoosts);
                                });
                        });
                    }
                    if (url === "tradeskill") {
                        $("#stats-hourly-tab-battle").attr("hidden", true);
                        $("#stats-hourly-tab-tradeskill").attr("hidden", false);
                    }
                    if (url === "battle") {
                        $("#stats-hourly-tab-battle").attr("hidden", false);
                        $("#stats-hourly-tab-tradeskill").attr("hidden", true);
                        if (!$("#AreasIncluded").first.length) {
                            $("#nofight").after("<div id='AreasIncluded' class=\"Pendorian-Elite-UI\"></div>");
                            $("#gameframe-battle > ul > li:contains('Area')").hide();
                        }
                        $.ajax({
                            type: "POST",
                            url: "/action/area",
                            success: function (data) {
                                $("#AreasIncluded").html(data.replace(`<div style="text-align: center; margin-top: 10px; margin-bottom: 15px;">Exploring the lands? Watch out for strangers.</div>`, ""));
                            }
                        });
                    }
                });
            });
            if (!$("#AreasIncluded").first.length) {
                $("#nofight").after("<div id='AreasIncluded'></div>");
            }
            $.ajax({
                type: "POST",
                url: "/action/area",
                success: function (data) {
                    $("#AreasIncluded").html(data.replace(`<div style="text-align: center; margin-top: 10px; margin-bottom: 15px;">Exploring the lands? Watch out for strangers.</div>`, ""));
                }
            });
        }, 10000);
        resolve(t);
    };

    modules.extraFooterLinks.code = function (resolve) {
        const links = modules.extraFooterLinks.options.links;
        let e = $("#gameframe-menu #togglechat").parent();
        for (let i = 0; i < links.length; i++) {
            e.after(`<li class="Pendorian-Elite-UI Elite-UI-Extra-Footer-Link" style="vertical-align: top;"><a href="${links[i][1]}" target="_blank">${links[i][0]}</a></li>`);
        }
        resolve();
    };

    modules.removeBattleStats.code = function (resolve) {
        const t = `
            #rhodium-boosts-actions + div + div > table > tbody > tr:nth-of-type(3),
            #rhodium-boosts-actions + div + div > table > tbody > tr:nth-of-type(2),
    		#rhodium-boosts-actions + div + div > table > tbody > tr:nth-of-type(1),
            #rhodium-boosts-actions + div + div + div > table > tbody > tr:nth-of-type(3),
            #rhodium-boosts-actions + div + div + div > table > tbody > tr:nth-of-type(2),
    		#rhodium-boosts-actions + div + div + div > table > tbody > tr:nth-of-type(1) {
    			display: none;
    		}`;
        resolve(t);
    };

    modules.removeGoldStat.code = function (resolve) {
        let t = `
            #header-content {
                width: calc(100% - 260px) !important
            }`;
        resolve(t);
    };

    modules.removeLogo.code = function (resolve) {
        const t = `
    		#content > div.wrapper > aside > * {
    			top: -50px;
    		}
    		#logo {
    			display: none;
    		}
    		#content > .wrapper:first-child > header:first-child {
    			pointer-events: none;
    		}
    		#header-stats {
    			pointer-events: auto;
    		}`;
        resolve(t);
    };

    modules.paceHider.code = function (resolve) {
        const t = `.pace{ display: none !important }`;
        resolve(t);
    };

    modules.removeTabs.code = function (resolve) {
        const t = `
    		#gameframe-battle > ul {
    			display: none;
    		}`;
        resolve(t);
    };

    modules.removeTradeskillSelection.code = function (resolve) {
        let t = `
    		#actioncontent > div:nth-child(2) {
                display: none !important;
            }`;
        if (modules.removeTradeskillSelection.options.addSpace === true) {
            t = t + `
                #actioncontent {
                    margin-top: 15px;
                }`;
        }
        resolve(t);
    };

    modules.versionCheck.code = function (resolve) {
        let t = `
            .elite-version-window {
                z-index: 999999999;
                width: 100vw;
                height: 100vh;
                max-width: max-content;
                background: rgba(0, 0, 0, 0.70);
            }

            .elite-version-window h1 {
                text-align: center;
                padding-top: 10px;
            }

            .elite-version-window button {
                text-align: center;
                margin-right: 10px;
            }

            .elite-version-content {
                width: 30%;
                min-width: max-content;
                height: 135px;
                background: black;
                color: white;
                top: 0;
                left: 0;
                bottom: 0;
                right: 0;
                margin: auto;
                position: absolute;
                padding: 0px 50px 0px;
            }

            .elite-version-border {
                border: 10px solid transparent !important;
                border-image-source: url(/images/frame.png) !important;
                border-image-slice: 10 8 !important;
                border-image-repeat: round !important;
            }`;
        let hasls = (function () {
            let test = "test";
            try {
                localStorage.setItem(test, test);
                localStorage.removeItem(test);
                return true;
            } catch (e) {
                return false;
            }
        });
        if (hasls || !modules.versionCheck.options.dailyLimit) {
            let lastCheck = new Date(localStorage.getItem("Last Elite UI Version Check"));
            if ((new Date().getTime() - lastCheck.getTime()) > (60 * 60 * 24 * 1000) || !modules.versionCheck.options.dailyLimit) {
                localStorage.setItem("Last Elite UI Version Check", String(new Date()));
                new Promise(function (resolve) {
                    $.get("https://api.github.com/repos/xpuls3/Pendorian-Elite-UI/releases/latest", function (data) {
                        if (version.includes("-") && version.split("-")[0] === data.tag_name) {
                            resolve(data.tag_name);
                        } else if (version.split("-")[0] !== data.tag_name) {
                            resolve(data.tag_name);
                        } else {
                            resolve(false);
                        }
                    });
                }).then(function (newVer) {
                    if (newVer !== false) {
                        logDo(`Pendorian Elite UI v${newVer} has been released, you are currently running outdated version ${version}`, 1);

                        const eliteVersionWindowBackground = document.createElement("div");
                        eliteVersionWindowBackground.setAttribute("class", "elite-version-window");
                        eliteVersionWindowBackground.setAttribute("id", "elite-version-window");

                        const eliteVersionWindowContent = document.createElement("div");
                        eliteVersionWindowContent.setAttribute("class", "elite-version-content elite-version-border");
                        eliteVersionWindowContent.innerHTML = `<h1>Outdated Elite UI Version!</h1><p>Pendorian Elite UI v${newVer} has been released, you are currently running outdated version ${version}!</p>`;

                        const eliteVersionDownloadButton = document.createElement("button");
                        eliteVersionDownloadButton.innerText = "Download";
                        eliteVersionDownloadButton.setAttribute("onclick", "window.open('https://github.com/xPuls3/Pendorian-Elite-UI/raw/master/script.user.js', '_blank');");

                        const eliteVersionNotesButton = document.createElement("button");
                        eliteVersionNotesButton.innerText = "Release Notes";
                        eliteVersionNotesButton.setAttribute("onclick", "window.open('https://github.com/xPuls3/Pendorian-Elite-UI/releases/latest', '_blank');");

                        const eliteVersionCloseButton = document.createElement("button");
                        eliteVersionCloseButton.innerText = "Close";
                        eliteVersionCloseButton.setAttribute("onclick", `$("#elite-version-window").remove();`);

                        eliteVersionWindowContent.appendChild(eliteVersionDownloadButton);
                        eliteVersionWindowContent.appendChild(eliteVersionNotesButton);
                        eliteVersionWindowContent.appendChild(eliteVersionCloseButton);
                        eliteVersionWindowBackground.appendChild(eliteVersionWindowContent);
                        document.body.appendChild(eliteVersionWindowBackground);
                    }
                });
            }
        }
        resolve(t);
    };

}

function logDo (i, t) {
    const logType = {
        0: ["OKAY", "color: rgb(0,148,255);"],
        1: ["ERROR", "color:red;"]
    };
    let logArray = [`%c[%cElite UI%c] [%c${logType[t][0]}%c] ${i}`, "color: none;", "color: rgb(0,148,255);", "color: none;", logType[t][1], "color: none;"];
    console.log.apply(null, logArray);
}