Greasy Fork

TripTag Enhancer

Laat op het profiel van een speler of op het eiland scherm zien welke steden wel/geen trip hebben

目前为 2025-03-24 提交的版本。查看 最新版本

// ==UserScript==
// @name         TripTag Enhancer
// @version      2.2
// @description  Laat op het profiel van een speler of op het eiland scherm zien welke steden wel/geen trip hebben
// @author       archdukeDaan
// @match        https://*.grepolis.com/game/*
// @license      MIT
// @namespace    https://dlnvt.nl
// @grant        GM_setValue
// @grant        GM_getValue
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// ==/UserScript==

(function() {
    'use strict';

    // wacht tot document is geladen
    $(document).ready(function () {
        setTimeout(console.log(`Archduke script: ${GM_info.script.name} is geladen`), 5000);
    
        // maak de knop om naar het menu te gaan
        maakMenuKnop()

        // laadt de trip detector module aan de hand van de voorkeuren
        if (laadSettings().trip_module == true){
            // maak een wrapper function over de createTownDiv function
            // voordat een stad wordt gemaakt op de kaart, run eerst mijn functie en dan pas de grepo functie
            var wrapper = function(originalFunc) {
                return function() {
                    var wrapper = originalFunc.apply(this, arguments);
                    return generateTripjesOpKaart(wrapper, arguments);
                };
            };
            MapTiles.createTownDiv = wrapper(MapTiles.createTownDiv);

            // timer om te checken of de knop moet worden geplaatst
            // er kan maar maximaal 1 profiel tegelijk open staan
            setTimeout(function checkProfielWindowOpen() {
                if (document.getElementById("player_towns") != null) {
                    if (document.getElementById("tripknopProfiel") == null){
                        addTripKnop('profiel')
                    }
                }
                setTimeout(checkProfielWindowOpen, 500);
            }, 500);

            // timer om te checken of de knop moet worden geplaatst
            // er kunnen meerdere eilanden vensters tegelijk open staan
            setTimeout(function checkEilandWindowOpen() {
                if (document.getElementsByClassName("island_info_wrapper") != null) {
                    // verkrijg alle openstaande eiland vensters
                    var vensters = getAllOpenEilandVensters()
                    for(let i=0;i<vensters.length;i++){
                        var venster = vensters[i]
                        // check of dit eiland venster al een knop heeft
                        if (venster.querySelector("#tripknopEiland") == null){
                            addTripKnop('eiland',venster)
                        }
                    }
                }
                setTimeout(checkEilandWindowOpen, 500);
            }, 500);
        }
        
    });

    // verkrijg de voorkeuren
    function laadSettings(){
        var auto_trip_kaart = GM_getValue('archduke_menu_auto_trip_kaart')
        if (auto_trip_kaart == null){
            auto_trip_kaart = false
        }
        var auto_trip_eiland = GM_getValue('archduke_menu_auto_trip_eiland')
        if (auto_trip_eiland == null){
            auto_trip_eiland = false
        }
        var auto_trip_profiel = GM_getValue('archduke_menu_auto_trip_profiel')
        if (auto_trip_profiel == null){
            auto_trip_profiel = false
        }
        var trip_allianties = GM_getValue('archduke_menu_trip_allianties')
        if (trip_allianties == null){
            trip_allianties = []
        }
        var trip_eigen_stad = GM_getValue('archduke_menu_trip_eigen_stad')
        if (trip_eigen_stad == null){
            trip_eigen_stad = false
        }
        var trip_module = GM_getValue('archduke_menu_trip_module')
        if (trip_module == null){
            trip_module = true
        }
        var trip_spelers = GM_getValue('archduke_menu_trip_spelers')
        if (trip_spelers == null){
            trip_spelers = []
        }
        var settings = {
            "trip_module": trip_module,
            'auto_trip_kaart': auto_trip_kaart,
            'auto_trip_eiland': auto_trip_eiland,
            'auto_trip_profiel': auto_trip_profiel,
            "trip_allianties" : trip_allianties,
            "trip_eigen_stad" : trip_eigen_stad,
            "trip_spelers": trip_spelers
        }
        return settings
        
    }

    function addTripKnop(knop_type,venster) {
        var button = document.createElement('span');
        button.textContent = 'Tripjes';
        button.style.zIndex = 1000;
        button.style.width = '50px'
        button.style.padding = '4px';
        button.style.marginTop = '4px'
        button.style.marginBottom = '4px'
        button.style.color = 'white';
        button.style.border = '1px solid black';
        button.style.borderRadius = '5px';
        button.style.cursor = 'pointer';
        button.style.marginLeft = '15px';

        var settings = laadSettings()

        if (knop_type == 'profiel'){
            button.addEventListener('click', function(){
                generateTripjesOpProfiel();
            }, false);
            button.setAttribute('id', 'tripknopProfiel');

            // voeg de knop als tweede element toe aan de game_header van de stedenlijst op het profiel
            var profiel = document.getElementById("player_towns")
            var element = profiel.children[0].querySelector('.game_header');
            element.insertBefore(button,element.children[0]);

            var bool = settings.auto_trip_profiel
            if (bool == true){
                button.click()
            }

        } else if (knop_type == 'eiland'){
            button.addEventListener('click', function(){
                generateTripjesOpEiland(venster);
            }, false);
            button.setAttribute('id', `tripknopEiland`);
            button.style.backgroundColor = 'blue';

            var eiland_controls = venster.querySelector("#island_towns_controls")
            eiland_controls.appendChild(button)
            var bool = settings.auto_trip_eiland
            if (bool == true){
                button.click()
            }
        }
        console.log("Trip knop toegevoegd!")
    }

    function getHuidigeSpeler(){
        var playerObj = MM.getModels().Player
        var player = Object.values(playerObj)[0].attributes;
        var huidigeSpeler = player.name
        return huidigeSpeler
    }

    function getTripLijst(){
        // verkrijg alle tripjes en stop ze in een lijst
        const steden_met_troepen_buiten = ITowns.all_supporting_units.fragments

        var triplijst = []

        Object.values(steden_met_troepen_buiten).forEach((stad) => {
            var tripjes = stad.models
            tripjes.forEach((trip) => {
                var trip_info = trip.attributes

                var stad_naam = trip_info.current_town_name
                var stad_speler = trip_info.current_town_player_name
                var stad_id = trip_info.current_town_id
                //var trip_stad_herkomst = trip_info.home_town_name

                var row = {"stad_naam":stad_naam,"stad_speler":stad_speler,"stad_id":stad_id}
                triplijst.push( row )
            });
        });
        //console.log(triplijst)
        return triplijst
    }

    function getProfileName(){
        // verkrijg speler naam van het huidige profiel dat open staat
        var profiel = document.getElementById("player_info").children
        var naam = ""
        for(let i=0;i<profiel.length;i++){
            var el = profiel[i]
            if (el.tagName == "H3"){
                naam = el.innerHTML
                break
            }
        }
        return naam
    }

    function getStedenLijstOpProfiel(){
        // verkrijg stedenlijst dom element van een speler zn profiel
        var profiel_steden = document.getElementById("player_towns").children[0].children
        var steden = false
        for(let i=0;i<profiel_steden.length;i++){
            var el2 = profiel_steden[i]
            if (el2.tagName == "UL"){
                steden = el2.children
                break
            }
        }
        //console.log(steden)
        return steden
    }

    function getStedenLijstOpEiland(venster){
        // verkrijg stedenlijst dom element van een eiland
        var eiland_steden = venster.querySelector("#island_info_towns_left_sorted_by_name").children
        //console.log(steden)
        return eiland_steden
    }

    function getAlliantieFromLink(stad_obj){
        // verkrijg de alliantie van de eigenaar van een stad vanuit de GP link DOM element
        // als speler geen alliantie heeft, return -1
        if (stad_obj.querySelector('.gp_alliance_link') != null){
            var link_as_str = stad_obj.querySelector('.gp_alliance_link').outerHTML;
            var alliantie = link_as_str.split("Layout.allianceProfile.open")[1].split(",")[1].split(")")[0]
            return parseInt(alliantie)
        } else {
            return -1
        }
    }

    function getAllOpenEilandVensters(){
        var vensters = document.getElementsByClassName("island_info_wrapper")
        return vensters
    }

    function generateTripjesOpEiland(venster){
        // indien van toepassing, verwijder de oude tags op het eiland informatie scherm
        venster.querySelector("#island_info_towns_left_sorted_by_name").querySelectorAll('.tripTag').forEach(e => e.remove());

        // verkrijg stedenlijst op het eiland
        var steden = getStedenLijstOpEiland(venster)

        // verkrijg de triplijst
        var triplijst = getTripLijst()

        // loop over de steden en voeg tag 'geen trip' toe als de stadsnaam niet in triplijst staat
        for (let k=0; k < steden.length; k++){
            var stad_obj = steden[k]
            var stad_naam = stad_obj.querySelector(".gp_town_link").innerHTML;
            var stad_eigenaar_dom = stad_obj.querySelector(".gp_player_link")
            var stad_eigenaar = "Spookstad"
            if (stad_eigenaar_dom != null){
                stad_eigenaar = stad_eigenaar_dom.innerHTML;
            }
            var stad_alliantie = getAlliantieFromLink(stad_obj);

            // plaats geen tag als de stad van de huidige speler is
            // plaats geen tag als de alliantie van de eigenaar van de stad niet in de alliantie lijst staat
            var settings = laadSettings()
            var allianties = settings.trip_allianties
            if ( allianties.includes(stad_alliantie) == true ){
                // filter eigen stad weg
                var eigen_stad_bool = settings.trip_eigen_stad
                if (eigen_stad_bool == false){
                    if (stad_eigenaar == getHuidigeSpeler()){
                        continue
                    }
                }
                //filter spelers weg waar geen tag bij hoeft
                if (settings.trip_spelers.includes(stad_eigenaar) == true){
                    continue
                }
                
                var tag = document.createElement('div');
                tag.style.zIndex = 1000;
                tag.style.cursor = 'pointer';
                tag.setAttribute('class','tripTag')
                tag.style.fontWeight = 'bold';
                tag.style.marginLeft = '10px';
                // kijk of er een trip in de stad ligt
                var j = triplijst.findIndex( e => (e.stad_naam == stad_naam) && (e.stad_speler == stad_eigenaar) )
                if (j>-1){
                    tag.textContent = "Wel trip";
                    tag.style.color = 'green'
                } else {
                    tag.textContent = "Geen trip";
                    tag.style.color = 'red'
                }
                // voeg de tag toe aan de DOM
                steden[k].appendChild(tag);
            }
        }
    }

    function generateTripjesOpProfiel(){
        // indien van toepassing, verwijder de oude tags op het profiel
        document.getElementById("player_towns").querySelectorAll('.tripTag').forEach(e => e.remove());

        // verkrijg naam op het profiel
        var naam = getProfileName()

        // verkrijg de triplijst
        var triplijst = getTripLijst()

        // verkrijg stedenlijst op het profiel
        var steden = getStedenLijstOpProfiel()

        // loop over de steden en voeg tag 'geen trip' of 'wel trip' toe
        for (let k=0; k < steden.length; k++){
            var stad = steden[k].children[1]
            var stad_naam = stad.innerHTML

            var tag = document.createElement('span');
            tag.style.zIndex = 1000;
            tag.style.cursor = 'pointer';
            tag.setAttribute('class','tripTag')
            tag.style.fontWeight = 'bold';

            // kijk of er een trip in de stad ligt
            var j = triplijst.findIndex( e => (e.stad_naam == stad_naam) & (e.stad_speler == naam) )
            if (j>-1){
                tag.textContent = "Wel trip";
                tag.style.color = 'green'
            } else {
                tag.textContent = "Geen trip";
                tag.style.color = 'red'
            }
            // voeg de tag toe aan de DOM
            steden[k].appendChild(tag)
        }

    }

    function generateTripjesOpKaart(originalFunc, args){
        var stad = args[0]
        //console.log(stad)
        // check of stad een speler heeft, dus of het geen spookstad is
        if(stad.player_id != null){
            // createTownDiv 2 keer geroepen per stad, eens voor de stad en eens voor de stad vlag
            for (let i=0;i<originalFunc.length;i++){
                // maak tag alleen op de stadsvlag ivm dubbele tags per stad
                var dom_element = originalFunc[i]
                var class_list = dom_element.classList
                //console.log(class_list)
                if (class_list.contains("flag")){
                    // verkrijg de triplijst
                    var triplijst = getTripLijst()

                    var stad_id = stad.id
                    var stad_alliantie = stad.alliance_id
                    var stad_eigenaar = stad.player_name

                    var settings = laadSettings()
                    var allianties = settings.trip_allianties
                    var eigen_stad = settings.trip_eigen_stad
                    if ((allianties.includes(stad_alliantie) == true)){
                        if(eigen_stad == false){
                            if(stad_eigenaar == getHuidigeSpeler()){
                                return originalFunc
                            }
                        }
                        if (settings.trip_spelers.includes(stad_eigenaar) == true){
                            return originalFunc
                        }
                        // tag
                        var tag = document.createElement('div');
                        tag.style.zIndex = 2000;
                        tag.style.cursor = 'pointer';
                        tag.setAttribute('class','tripTag')
                        tag.style.fontWeight = 'bold';
                        tag.style.width = '15px';
                        tag.style.height = '15px';
                        tag.style.borderRadius = '50%'
                        tag.style.position = 'relative';
                        tag.style.top = "60%";
                        tag.style.left = "70%";
                        tag.style.border = '2px solid black'

                        // kijk of er een trip in de stad ligt
                        var j = triplijst.findIndex( e => (e.stad_id == stad_id) )
                        if (j>-1){
                            tag.style.backgroundColor = 'green'
                        } else {
                            tag.style.backgroundColor = 'red'
                        }
                        $(originalFunc[i]).append(tag);
                    }
                }
            }
        }
        return originalFunc
    }

    /////////////////////////////////////////////////////////////////////////////
    // menu 
    /////////////////////////////////////////////////////////////////////////////

    function maakMenu(){
        var titel = "Archduke Menu"
        var menu = new ArchdukeMenu(titel)

        menu.addItemMenuSelection("TripTag Enhancer", maakTripInstellingen)
    }

    function maakTripInstellingen(){       
        // maak instellingen
        var instelling = new Instellingen("tripenhancer","Voorkeuren","Bepaal het gedrag van de tripjes detector door de checkboxen aan te vinken.")

        // maak alle knopjes
        instelling.createCheckBox("Activeer de trip detector ( vereist refresh van de pagina )","trip_module")
        instelling.createCheckBox("Weergeef automatisch de trip tags op de kaart","auto_trip_kaart")
        instelling.createCheckBox("Weergeef automatisch de trip tags op het eiland scherm","auto_trip_eiland")
        instelling.createCheckBox("Weergeef automatisch de trip tags op het profiel van een speler","auto_trip_profiel")
        instelling.createCheckBox("Weergeef trip tags bij je eigen steden","trip_eigen_stad")
        // opslaan knop
        instelling.createKnop("Opslaan",null)

        instelling.createInnerBox("archduke_menu_trip_allianties","Alleen voor onderstaande allianties zullen trip tag worden getoond.","Alliantie ID","Opslaan","input_ally_id",saveInstellingenAllianties)

        instelling.createInnerBox("archduke_menu_trip_spelers","Onderstaande spelers zullen geen trip tag krijgen.","Grepolis Naam","Opslaan","input_speler_id",saveInstellingenSpelers)

        // voeg aan menu
        var menu_right = document.getElementById("archduke_menu_right")
        menu_right.appendChild(instelling.instelling)

        // check settings in de local storage
        var settings = laadSettings()
        if (settings.auto_trip_eiland){ document.getElementById("archduke_menu_auto_trip_eiland").classList.add('checked') }
        if (settings.auto_trip_kaart){ document.getElementById("archduke_menu_auto_trip_kaart").classList.add('checked') }
        if (settings.auto_trip_profiel){ document.getElementById("archduke_menu_auto_trip_profiel").classList.add('checked') }
        if (settings.trip_eigen_stad){ document.getElementById("archduke_menu_trip_eigen_stad").classList.add('checked') }
        if (settings.trip_module){ document.getElementById("archduke_menu_trip_module").classList.add('checked') }
        for (let i=0; i < settings.trip_allianties.length;i++){
            var ally_id = settings.trip_allianties[i]
            addRowToInnerBox(ally_id,"archduke_menu_trip_allianties",saveInstellingenAllianties)
        }
        for (let i=0; i < settings.trip_spelers.length;i++){
            var speler_id = settings.trip_spelers[i]
            addRowToInnerBox(speler_id,"archduke_menu_trip_spelers",saveInstellingenSpelers)
        }
    }

    function saveInstellingenAllianties(){
        var entries = document.body.querySelectorAll(".archduke_menu_trip_allianties")
        var allianties = []
        for (let i=0;i<entries.length;i++){
            var ally = entries[i]
            var ally_id = parseInt(ally.id.substring(30))
            allianties.push(ally_id)
        }
        GM_setValue("archduke_menu_trip_allianties",allianties)
    }

    function saveInstellingenSpelers(){
        var entries = document.body.querySelectorAll(".archduke_menu_trip_spelers")
        var spelers = []
        for (let i=0;i<entries.length;i++){
            var speler = entries[i]
            var speler_naam = speler.id.substring(27).trim()
            spelers.push(speler_naam)
        }
        GM_setValue("archduke_menu_trip_spelers",spelers)
    }

    /////////////////////////////////////////////////////////////////////////////
    // menu classes en knop
    /////////////////////////////////////////////////////////////////////////////
    function maakMenuKnop(){
        if (document.getElementById("archduke_menu") == null){
            var knop = document.createElement("div")
            knop.setAttribute("id","archduke_menu")
            knop.addEventListener('click', maakMenu)
            knop.style.position = 'absolute'
            knop.style.top = '3px'
            knop.style.height = '27px'
            knop.style.left = "35%"
            knop.style.width = '70px'
            knop.style.cursor = 'pointer'
            knop.style.zIndex = '2000'

            var icon = document.createElement("div")
            icon.setAttribute("class",'icon')
            icon.style.position = 'relative'
            icon.style.width = '100%'
            icon.style.height = '100%'
            icon.style.backgroundImage = `url(${getImageData()})`
            knop.appendChild(icon)

            document.body.appendChild(knop)
        }
        document.getElementById("archduke_menu").addEventListener('click', maakMenu)
    }

    function getImageData() {
        return "data:image/png;base64,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LyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjFhZDRlODM2LTBkNzAtNGFiNy05ZjNmLTMyNTMxMGI1NzBiZCIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3YjIyNThkNi04MGM3LTQ5ZWYtYmE1NS00NzliMWZlOTZjNzIiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiNmQxNjU3ZC0zMWQ2LTQ5NTctODlmMi1mNWQzYTZiZDM3NzMiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3RhbXA9IjE3MzgwNzQ4NzczODQzNTAiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zMCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo5YTY4MGRjNS00OWI2LTQwN2MtOGFkMi1hNzI5NmYwYjQ5NjEiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSIyMDI1LTAxLTI4VDE1OjI0OjI5KzAxOjAwIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgxMzhkOTNiLTUyYWYtNDA4ZC1hYzNkLTAzOGM0N2Q2YTZlOCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChMaW51eCkiCiAgICAgIHN0RXZ0OndoZW49IjIwMjUtMDEtMjhUMTU6MzQ6MzcrMDE6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+/2YlgAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+kBHA4iJTwYnhAAAA0MSURBVFjDvZnJjx3XdYe/e2uuekO/brLZ7JkUSZESyaaoOYIoyTIcwxEEeJEgWQQJEMQGsslfEGSR7LIKbDiAIQNR4EXiTRQBiawoiiU71mSKFEVzbLKb7Hl881DjvVm85mu2REsWLfEAD4V67776nfvVOfecuiXYMtvvG0VjxJ3qzdHRQT02spsgcAkCF8+xieOYSi1kc6NC3jMoFAMV5HwaTeTKyhydMEWgkVIihKDe6KAB05BkmUZrBYCUEikEWoAAslShtEZrEAKkECitkUIgDYmUAoEgVRlZptBKoTVIKbBMA9e10AgEGo3Ac02GhsbJ51CtZpt6rSUbnYyBXSVKRRfbtulEMa1WSKsVMr+4zsLCmrC9vgkEWdyuLkDXtx128sShZM9A0fz2i48iDYkhJVGS4bkujm2xsVbnp2+eo91uUegrcHl2k6GiotmOiKOEJE0BaDQjlFK4joGUEr0lJoSg33FYbXUQgFIaIUBrjVa6O0jDbt9jIwxBdOGA7o7RGpUplAYhBf3FHLZjEUcJtmOR8x1WapLD+waoV+v4fsA3n59i12CBKE7ohCGOZZAphcoU//7qr1jdrKVnPrpq3c7B/CSY3QN98sVvPcIHv7pOJ0owTQOEIIoTpCF45Nh9/OELj/H9f36DMK7SFxgUijZDQ/006i3qjRCAlbU50lTRaUsMQwKg6E76xUf2c3ZtkzM3FwFByXeRCDabHYSAk5OjnBwc4F/OXqATpT3fNBoJSCHJtEIpzdQDE+QLAY16i3whoN1pE6YZa2tVklTxZ3/0GJv1Jq/+9ANUpnFsC7QmTTM8x+LFbz3KK/91Wn6Sww4wh/aN1J4/dUz+3/tXuHFziZzn88ypB5g6NsmH52b45buXeef0ZR4+PomWmnK9SV8xh+dYaAW5nE2t3uleWEqEKbBNEykFGriVL0Xb5skDExwaHcKzbdKsm2amIenEMQOugxPGmIZB3jfQ6G4aaU2mNEIIhIJUZORydk9bK/AcC0RGudYkl/NY2tjgw49v0Gi0eerJwzw8tZ9z52/w9s8v0uy06cQpz586JmdnFmtXZxeLdwQzMrrHvnJtiVq1Dlrw9NOHee7UcRzX5lk/4MKleVZXK5w+e42jB4Z46/2ruJbEcR3QJmGYdhcKwDANLASimyddASEYLuSJPRdlSEq5rrza+l0KgWtbKCD2JMOFPEv1BgKBaRgAWFvpCJo0y9Ba4Lo2YZjiujYIiWvFhFHCEyf2cfrsNTYrTfbsKfHsk8fIFT36SwWUVrz2+llq1TpXri0xMrrHvjq72GOxI4QsS6tGvcXGZoO19TKmFrz841/w7nvX+N5Lr1EqFojDmPX1Grmcg2MJAtfEs02UVhiGiWVZWJaFEN0JaK3ZwsJAzufUsfvJjJ2RK4VAip3LXWZITh27n4Gc/8koR2uNbZnkPAfD2NZWWuHZJoFr4liCXM5hfb1GHMaUigW+99JrvPveNV7+8S8wtWBtvczGZoNGvYVlbVWHLTNuPxko5f8yTlVfvd6gFcYoYTC/sMbFSzPML6xQqbZZXt2kWAiQUmIIg76cRZC3URoCz6FSbSOEoFptcCt7btk3po6Qcx0AKs0WF24ssre/bysCuhP+cPoGnmPj2TamIRks5rmytPopOIYU9BcL7Ns3iBaawHPQQmPbkjRKMQ0b0DSbHRaWN2m1Y5aWVpm9scT6Zp1yvc380gaGAIWg0WgtLi6X//GOEfPBmel9oGJkNwWmr8+xtLxCtVrFkIIr03NYUlIIHM5fmKETxmgElmXAFhi07i5uWbeC3LITEyP0Bf5tE5PkPZexB0+y7/HnGD7xJGMPniTvuRhy262+wOfExMinwGRKU2u2tjTpHS3LQCPohDHnL8xQCBwsKbkyPYchBdVqlaXlFaavz3VviBSAirtz/w0RA+B77p9YtjVgSSHa7QStBZ1ORLnaIOokZCpFSMlDxw6yWS2jFPT3+2SJRqmUJE1xHIOFpXIvEgAeO7gPz96uiI5lse/h3+Ov//bvubm6RtC/iz/97l8xOzuLaFZ2+ORY1h2jJue7DO8toBQolaIUGKZgcalKnIQcP3If128ssb5RIQoTwjgiyzQIkyRR5H0b07ZUvd6+ur5Z+8FnglnfrP1gfHTwu5Zj55VKEAgkBghFPnDZO7yb5546yuCuIgfvG6VWbeAHNkJLwjjCcRwcx2b2xipCb4N5/ODkDlAAzUyy3mhRKpXwPI9fvvMO89OXkZ3GjnGuZXLu5uKO7wQwNFig0OdhmzZhHGGbNkJqsljx1ONHKRZ8RocHqDZCBBphCBzLxTQlti0J8jkMKZc/Oj9z32eW615KfXhl5OTU/puDu0qDnSg1LdOQpmHIgVJAphRXry/zwNH9HD80yshIP2fOXSZf8BANhSGNXqWRW/3jYD73KSgAQVTnoQePcPCBowBMX/w1M2++SvKJcUIIBvM51hrN27/sViDbJpfvaufyHp1Om2/+/qP4gc/HF+e4en2ZkeFdjI8OsllpkWaZStJMeY6Z1pvttTPnZibuxEDwGdbfn/+LU08c+aFlWvLipVkW18pkKmN87yBCguOafONrT9BqVJDSpN0J8bcW13975V3E1hLzB4WAvzkwwe9if3ftJv9Zb23fUVNyYHKQAweH8T23q+25KJUS5Ev89/++RxSmaAVzy2sY0mBksJ8HjuwjSRP18/cufadcbvzoN+mZn+VMudz40fDu/EtBPiCKIg4fGuXC1RUW1tc5sH+Cou/wxtvneebRCbQAaYpel6szjZBd7ucti38qFH4nMOcta2dVMgRpqpGmQEp6R0MYvPH2eYr5PmpGxLWZm4wM7eXBQ0MkqWJyfIBWoyU/C8rnggH41/94/89LfcEPlc5M1/Hl+Ohe2p2ES9OzPDJ1hD2lANu16LQTTGkQxnEv0r8KmxofoZTz+WhuHqUyTGmgMt07er7FnlJAI+r6uKvQz/joXi5OLxNGbXXhynxaqba+83k6nwumXG2+XK42XwYo9QXPlevJ/+zut6SyilydXaCUdzlxdC+ZypCGSd4xe3dUqS8XymA+x4n9Y1tP6YLp8gbSMMmydPuIxcziMpVGSP9AkYJnce7SnIrD+tcr1dbPflst+UUcq1RbP4va1f0rS+Wf5G2bou9Sq7dIkowszZBAmnU/Sm+1CF+iBVvrF4BtmmilkNDTztKMJMmo1VsUfZe8bbOyVP5J1K7u/yJQvjAYgGq9c7OQd18ol2ugM3K+i2Vb2LaNNCSOa+K4Zre5+4rS6ZYpBdKQPW3btrFsi5zvgs4ol2sU8u4L1Xrn5he9trwbh2bmN4KcY6GSlPHhQaQhutsAmcK2uz2C+IqhdMF392ZuaWdaIQ3B+PAgKknJORYz8xvB3VzfvFvHLMNMtWGaU0cmSeOMdjvCcS1WVmvbfcyXSCfvujtSSWmNYRrEaUIUJjiuRRQm5DyHqSOTzC+sY2iR3q2evNs/CiF6UKM4pJAPaLVCHMvEsUyElHyZuXR8cpQjY3t756vVGqZl0mptaxfyAVEc3tHHewZGa927G47n0my2MaWg1YlpdWIsKb70xfeWrVRqXF5eRSowpehpN5ttHM+9o4/3LJUqzXhlbKw4uri4zthkP4YtUWHW+z3NdA/M7Y8DnTgmSlJ8p5sW7SgijLsPAb7jUPC7E6u3QyxT4tk2AJvNFmjNSqXOx/NLWKZBvdmNjlvahi1JU8XiYpl8PmB+fn3lnoIZGxk4+8TDh+Xzz0xRq7dYXF4mSxW2axGHaW9xNAwDrdWO7Ydaq8NarcHB4T0AzK2XOXtjofugeWCSgj8EwFK5Sl/g9cBcWVxhsVLrbm1uNZCdOMV2LdIt7TRVRFHMQycP8uyzJ3jz7XPyvQ8vn51f3HzonoD5428/PTo+Pui+/voHCAv27M5TLlfpLzg026LX+WZ6+3XK7WabZm8LwjZ/excy1d3jEYBtSlxTkoYtyvWI/oJDuR4xuKuP909fQCfwta+fLEyO77b/4fuv3JuIqdRa/vRbZ+WNlY1Ua83k+G5KBc/MBVZYaYTuraqRpRmeYxOlt6eYIkqS286zHrg02x4XJgmp2q5CrTDuQhHdF1JpphASdu0aQrNGLrBCjXQ9z02vz80ghODNt86auwb6/HuWSp12JLUWZrEQgBYkScLaeoN2x1a3CoGQkiTOSLKMcrvDpYVlir7HxcVl6mGHUs5HCMn1jTKeY6I0zJar9OV8lIYb1TrlMMKQklo7pJGk2FuNpGk7NOs1ojij0tjWbjZjPN+nr5AHodFamJ12lN4zMNIQLuhb78aYGNvDpSsLrFfqfl+hBMD9h6fwfR+lMtrNOmUBTWUzdvgYtu2gpCDLMo7278UyLZI0IY4iKmmKaZk8eHwIwzBpa43TL3h8ZD9qK2IypfnozGkcz+Tc+V8TeB7rlbofeB4TY3vMjy+tbDUKGmncXcn+fwepLCrsVVzGAAAAAElFTkSuQmCC"
    }

    function addRowToInnerBox(input_txt,name,save_function){
        var li = document.createElement("li")
        li.style.listStyleType = 'square'
        li.setAttribute("class",name)
        li.setAttribute('id',name+"_"+input_txt)

        var a = document.createElement("a")
        a.innerHTML = input_txt
        li.appendChild(a)

        var a = document.createElement("a")
        a.setAttribute("class",'cancel')
        a.addEventListener('click', function(){
            li.remove()
            save_function()
        })
        li.appendChild(a)
        document.getElementById(`${name}_list`).appendChild(li)
    }

    class Instellingen {
        constructor (naam, titel, beschrijving){
            this.naam = naam
            this.instelling = this.createWrapper()
            this.parent = this.createParent()
            this.section = this.createSection(titel)
            this.group = this.createGroup(beschrijving)
            this.inner_box_add_row = this.addRowToInnerBox
        }
    
        createWrapper(){
            if (document.getElementById("archduke_menu_right") != null){
                document.getElementById("archduke_menu_right").innerHTML = ""
            }
            var el = document.createElement("div")
            el.setAttribute('id',"archduke_menu_instellingen")
            return el
        };
    
        createParent(){
            var form = document.createElement("form")
            this.instelling.appendChild(form)
            return form
        };
    
        createSection(titel){
            var section = document.createElement("div")
            section.setAttribute("class",'section')
            section.style.display = 'block'
    
            var section_titel = document.createElement("div")
            section_titel.innerHTML = titel
            section_titel.setAttribute("class",'game_header bold')
            section.appendChild(section_titel)
    
            this.parent.appendChild(section)
    
            return section
        };
    
        createGroup(beschrijving){
            var group = document.createElement("div")
            group.setAttribute("class",'group')
    
            var group_text = document.createElement("p")
            group_text.innerHTML = beschrijving
            group.appendChild(group_text)
    
            this.section.appendChild(group)
    
            return group
        };
    
        createCheckBox(beschrijving,id){
            var checkbox = document.createElement("div")
            checkbox.setAttribute('class',"checkbox_new large archduke_menu_checkbox")
            checkbox.setAttribute('id', `archduke_menu_${id}`)
    
            var btn = document.createElement("div")
            btn.setAttribute("class","cbx_icon")
            checkbox.appendChild(btn)
    
            var text = document.createElement("div")
            text.setAttribute("class","cbx_caption")
            text.innerHTML = beschrijving
            checkbox.appendChild(text)
    
            checkbox.addEventListener('click', function(){
                this.classList.toggle('checked')
            })
    
            this.group.appendChild(checkbox)
            var breakline = document.createElement("br")
            this.group.appendChild(breakline)
    
            return checkbox
        };

        createTextBox(text,id=null){
            var div = document.createElement("p")
            if (id != null){
                div.setAttribute("id",id)
            }
            div.innerHTML = text

            this.group.appendChild(div)
        }

        createInputBox(default_value,id){
            var div = document.createElement("div")
            div.setAttribute("class","windowmgr_max_concurrent_input textbox")

            var left = document.createElement("div")
            left.setAttribute("class","left")
            div.appendChild(left)

            var right = document.createElement("div")
            right.setAttribute("class","right")
            div.appendChild(right)

            var middle = document.createElement("div")
            middle.setAttribute("class","middle")
            div.appendChild(middle)

            var input = document.createElement("input")
            input.type = 'text'
            input.tabIndex = 1
            input.placeholder = default_value
            input.pattern = "^\d+$"
            input.setAttribute('id', `archduke_menu_${id}`)
            input.setAttribute('class',"archduke_menu_checkbox")
            middle.appendChild(input)

            var breakline = document.createElement("br")

            this.group.appendChild(div)
            this.group.appendChild(breakline)
        }
    
        createKnop(text, f){
            var el = document.createElement("div")
            el.setAttribute("class",'button_new')
            el.style.marginTop = "10px"
    
            var el2 = document.createElement("div")
            el2.setAttribute("class",'left')
    
            var el3 = document.createElement("div")
            el3.setAttribute("class",'right')
    
            var btn = document.createElement("div")
            btn.setAttribute("class",'caption js-caption')
    
            var btn_txt = document.createElement("span")
            btn_txt.innerHTML = text
    
            var btn_ef = document.createElement("div")
            btn_ef.setAttribute('class',"effect js-effect")
    
            el.appendChild(el2)
            el.appendChild(el3)
            btn.appendChild(btn_txt)
            btn.appendChild(btn_ef)
            el.appendChild(btn)
            
            if (f == null){
                btn.addEventListener('click', this.save_instellingen)
            } else {
                btn.addEventListener('click', f )
            }
            
    
            this.group.appendChild(el)
            return el
        };
    
        save_instellingen(){
            var instel = document.body.querySelectorAll(".archduke_menu_checkbox")
            for (let i=0;i<instel.length;i++){
                var box = instel[i]
                var id = box.id
                var tag = box.tagName

                if (tag == "INPUT"){
                    var checked = box.value
                } else {
                    var checked = false
                    if (box.classList.contains('checked')){
                        checked = true
                    }
                }
                
                GM_setValue(id,checked)
                console.log(id,GM_getValue(id))
            }
        };
    
        createInnerBox(name,box_title,label_text,button_text,input_id,save_function){
            var el = document.createElement("div")
            el.setAttribute("class",'game_inner_box')
            el.style.marginTop = '20px'
    
            var child = document.createElement('div')
            child.setAttribute('class',"game_border")
            el.appendChild(child)
    
            var e = document.createElement('div')
            e.setAttribute('class',"game_border_top")
            child.appendChild(e)
    
            var e = document.createElement('div')
            e.setAttribute('class',"game_border_bottom")
            child.appendChild(e)
    
            var e = document.createElement('div')
            e.setAttribute('class',"game_border_left")
            child.appendChild(e)
    
            var e = document.createElement('div')
            e.setAttribute('class',"game_border_right")
            child.appendChild(e)
    
            var e = document.createElement('div')
            e.setAttribute('class',"game_border_corner corner1")
            child.appendChild(e)
    
            var e = document.createElement('div')
            e.setAttribute('class',"game_border_corner corner2")
            child.appendChild(e)
    
            var e = document.createElement('div')
            e.setAttribute('class',"game_border_corner corner3")
            child.appendChild(e)
    
            var e = document.createElement('div')
            e.setAttribute('class',"game_border_corner corner4")
            child.appendChild(e)
    
            var title = document.createElement('div')
            title.setAttribute('class',"game_header bold")
            title.style.margin = '5px 0 5px 0'
            title.innerHTML = box_title
            child.appendChild(title)
    
            var list = document.createElement("div")
            var list_ul = document.createElement("ul")
            list_ul.setAttribute("class",'game_list')
            list_ul.setAttribute("id",`${name}_list`)
            list_ul.style.listStyle = 'disc'
            list_ul.style.width = '490px'
            list_ul.style.margin = '5px 0px 15px 35px'
            list.appendChild(list_ul)
            child.appendChild(list)
    
            var list_text = document.createElement('div')
            list_text.style.float = 'left'
            child.appendChild(list_text)
    
            var label = document.createElement("label")
            label.setAttribute("class","bold")
            label.style.marginLeft = '5px'
            label.innerHTML = label_text+" : "
            list_text.appendChild(label)
    
            var span = document.createElement("span")
            span.setAttribute("class","grepo_input")
            list_text.appendChild(span)
    
            var span_left = document.createElement("span")
            span_left.setAttribute("class","left")
            span.appendChild(span_left)
    
            var span_right = document.createElement("span")
            span_right.setAttribute("class","right")
            span_left.appendChild(span_right)
    
            var input = document.createElement("input")
            input.setAttribute("class", 'ac_input')
            input.setAttribute("id",input_id)
            input.type = 'text'
            input.value = ''
            input.autocomplete = 'off'
            span_right.appendChild(input)
    
            var btn = this.createKnop(button_text)
            child.appendChild(btn)
            btn.addEventListener('click', function(){
                var input_txt = document.getElementById(input_id).value
                if (input_txt != ""){
                    input_txt = input_txt.trim()
                    document.getElementById(input_id).value = ''
                    var li = document.createElement("li")
                    li.style.listStyleType = 'square'
                    li.setAttribute("class",name)
                    li.setAttribute('id',name+"_"+input_txt)
            
                    var a = document.createElement("a")
                    a.innerHTML = input_txt
                    li.appendChild(a)
            
                    var a = document.createElement("a")
                    a.setAttribute("class",'cancel')
                    a.addEventListener('click', function(){
                        li.remove()
                        save_function()
                    })
                    li.appendChild(a)
                    list_ul.appendChild(li)
                    save_function()
                }
            })
    
            this.group.appendChild(el)
        };
    
    }
    
    class ArchdukeMenu {
    
        constructor(titel){
            this.titel = titel
            this.window = this.createWindow()
            this.frame = this.window.parentElement.parentElement.children[1].children[4]
            this.menu_selection = this.createMenuSelectorContainer()
            this.instelling = this.createMenuContentContainer()
        }
    
        checkMenuOpen(){
            var find = false
            var dom_element = null
            for(let i of document.getElementsByClassName('ui-dialog-title')){
                if(i.innerHTML == this.titel){
                    find = true;
                    dom_element = i
                }
            }
            return [find,dom_element]
        }
    
        createWindow(){
            var [find,dom_element] = this.checkMenuOpen()
            if (find == false){
                var window = Layout.wnd.Create(Layout.wnd.TYPE_DIALOG, this.titel);
                // zet window size
                window.setHeight(document.body.scrollHeight/2);
                window.setWidth('800');
                window.setContent(''); // clear window
                for(let i of document.getElementsByClassName('ui-dialog-title')){ 
                    if(i.innerHTML == this.titel){
                        dom_element = i;
                    }
                }
            }
            console.log(find)
            return dom_element
        }
    
        createMenuSelectorContainer(){
            var container_left = document.getElementById("archduke_menu_left")
            var list = document.getElementById("archduke_menu_module_list")
            if ( container_left == null){
    
                var container_left = document.createElement("div")
                container_left.setAttribute("id","archduke_menu_left")
                container_left.setAttribute("class",'settings_menu')
    
                var el = document.createElement("b")
                el.innerHTML = 'Scripts'
                container_left.appendChild(el)
    
                list = document.createElement("ul")
                list.setAttribute("id","archduke_menu_module_list")
                container_left.appendChild(list)
    
                this.frame.appendChild(container_left)
            }
            return list
        }
    
        createMenuContentContainer(){
            var container_right = document.getElementById("archduke_menu_right")
            if (container_right == null){
                var container_right = document.createElement("div")
                container_right.setAttribute("id","archduke_menu_right")
                container_right.setAttribute("class",'settings-container')
                this.frame.appendChild(container_right)
            }
            return container_right
        }
    
        addItemMenuSelection(naam,f){
            if (document.getElementById(`archduke_menu_selection_${naam}`) == null){
                var el = document.createElement("li")
                el.style.marginBottom = '10px'
                var a = document.createElement('a')
                a.innerHTML = naam
                a.setAttribute("class",`settings-link`)
                a.setAttribute("id",`archduke_menu_selection_${naam}`)
                a.addEventListener('click', function(){
                    f()
                })
                el.appendChild(a)
                this.menu_selection.appendChild(el)
            }
        }
    }

})();