obame-tbot / OGLight

// ==UserScript==
// @name         OGLight
// @namespace    https://openuserjs.org/users/obame-tbot
// @version      3.0.0
// @description  OGLight script for OGame
// @author       Oz
// @license      MIT
// @copyright    2021
// @match        *://*/game/*
// @updateURL    https://openuserjs.org/meta/obame-tbot/OGLight.meta.js
// @grant        GM_addStyle
// @run-at       document-start
// ==/UserScript==

// ogl lazy loading
if(new URL(window.location.href).searchParams.get('oglLazy') == 'true' && !document.hasFocus())
{
    window.onfocus = () => window.location.href = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search.replace('&oglLazy=true', '');
    localStorage.setItem('ogl-redirect', false);
    window.stop();
}

let redirect = localStorage.getItem('ogl-redirect');

if(redirect && redirect.indexOf('https') > -1)
{
    localStorage.setItem('ogl-redirect', false);
    window.location.href = redirect;
}

// goodbye tooltips
function goodbyeTipped()
{
    if(typeof Tipped !== 'undefined')
    {
        for(let [key] of Object.entries(Tipped))
        {
            Tipped[key] = function() { return false; }
        }
    }
    else requestAnimationFrame(() => goodbyeTipped());
}

if(new URL(window.location.href).searchParams.get('component') != 'empire')
{
    // collect resources fix
    let mode = new URL(window.location.href).searchParams.get('oglMode');

    if(mode == 1 || mode == 4)
    {
        //let cp = new URL(window.location.href).searchParams.get('cp') || document.querySelector(`head meta[name="ogame-planet-id"]`).getAttribute('content');

        async function fetchData()
        {
            let result = await fetch(window.location.protocol + '//' + window.location.host + window.location.pathname + '?page=fetchResources&ajax=1');
            return result.text();
        }

        fetchData().then(response =>
        {
            let loop = () =>
            {
                if(document.readyState === 'complete')
                {
                    resourcesBar.reload(JSON.parse(response));
                    new OGLight();
                }
                else requestAnimationFrame(() => loop());
            }

            loop();
        });
    }
    else window.addEventListener("DOMContentLoaded", () => { new OGLight() });
}

goodbyeTipped();

GM_addStyle(`
@font-face
{
    font-family:'Material Icons';
    font-style:normal;
    font-weight:400;
    src:local('Material Icons'), local('MaterialIcons-Regular'),
    url('data:font/woff2;base64,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');
}
`);

class OGLight
{
    constructor()
    {
        this.rawURL = new URL(window.location.href);
        this.mode = this.rawURL.searchParams.get('oglMode') || 0; // 0:default; 1:autoHarvest; 2:raid; 3:locked; 4:linkedMoon;
        this.playerID = document.querySelector('head meta[name="ogame-player-id"]').getAttribute('content');
        this.playerName = document.querySelector('head meta[name="ogame-player-name"]').getAttribute('content');
        this.ecoSpeed = document.querySelector('head meta[name="ogame-universe-speed"]').getAttribute('content');
        this.fleetSpeed = document.querySelector('head meta[name="ogame-universe-speed-fleet"]').getAttribute('content');
        this.universeName = document.querySelector('head meta[name="ogame-universe-name"]').getAttribute('content');
        this.lang = document.querySelector('head meta[name="ogame-language"]').getAttribute('content');
        this.universeNumber = window.location.host.replace(/\D/g,'');
        this.baselink = window.location.protocol + '//' + window.location.host + window.location.pathname;
        this.planetList = document.querySelectorAll('.smallplanet');
        this.current = {};
        this.current.smallplanet = document.querySelector('.smallplanet.hightlightPlanet') || document.querySelector('.smallplanet.hightlightMoon') || document.querySelector('.smallplanet');
        this.current.type = document.querySelector('head meta[name="ogame-planet-type"]').getAttribute('content');
        this.current.coords = this.current.smallplanet.querySelector('.planetlink .planet-koords').textContent.slice(1,-1).split(':');
        this.current.id = document.querySelector('head meta[name="ogame-planet-id"]').getAttribute('content');
        this.current.next = this.current.smallplanet.nextElementSibling || document.querySelectorAll('.smallplanet')[0];
        this.keyboardActionsList = this.keyboardActionsList || {};
        this.shipCost =
        {
            202:[2000,2000,0],
            203:[6000,6000,0],
            204:[3000,1000,0],
            205:[6000,4000,0],
            206:[20000,7000,2000],
            207:[45000,15000,0],
            215:[30000,40000,15000],
            211:[50000,25000,15000],
            213:[60000,50000,15000],
            214:[5000000,4000000,1000000],
            218:[85000,55000,20000],
            219:[8000,15000,8000],
            209:[10000,6000,2000],
            210:[0,1000,0],
            212:[0,2000,500],
            208:[10000,20000,10000],
            217:[2000,2000,1000],
            401:[2000,0,0],
            402:[1500,500,0],
            403:[6000,2000,0],
            404:[20000,15000,2000],
            405:[5000,3000,0],
            406:[50000,50000,30000],
            407:[10000,10000,0],
            408:[50000,50000,0],
        };

        this.resources =
        {
            'metal' : Math.floor(resourcesBar.resources.metal.amount),
            'crystal' : Math.floor(resourcesBar.resources.crystal.amount),
            'deut' : Math.floor(resourcesBar.resources.deuterium.amount),
        };

        if(Util.getPage() == 'fleetdispatch')
        {
            fleetDispatcher.metalOnPlanet = this.resources.metal;
            fleetDispatcher.crystalOnPlanet = this.resources.crystal;
            fleetDispatcher.deuteriumOnPlanet = this.resources.deut;
        }

        this.totalResources = [0,0,0];
    
        document.querySelector('#pageContent').appendChild(Util.createDom('div', {'class':'ogl_universeName'}, this.universeName + '.' + this.lang))

        this.json = JSON.parse(localStorage.getItem('ogl_redata')) || {};
        this.json.topScore = this.json.topScore || [0,0];
        this.json.loca = this.json.loca || {};
        this.json.shipCapacity = this.json.shipCapacity || {};
        this.json.stalkList = this.json.stalkList || {};
        this.json.spyProbesCount = this.json.spyProbesCount || 6;
        this.json.lastFleet = this.json.lastFleet || {};
        this.json.myActivities = this.json.myActivities || {};
        this.json.myEconomy = this.json.myEconomy || {};
        this.json.myTechs = this.json.myTechs || {};

        if(!this.json.loca.metal) window.location.href = window.location.protocol + '//' + window.location.host + '/game/index.php?page=ingame&component=fleetdispatch';

        this.json.stats = this.json.stats || {};
        this.json.stats.range = this.json.stats.range || 1;
        this.json.stats.total = this.json.stats.total || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 };

        this.json.options = this.json.options || {};
        this.json.options.togglesOff = this.json.options.togglesOff || [];
        this.json.options.defaultShip = this.json.options.defaultShip || 202;
        this.json.options.defaultMission = this.json.options.defaultMission || 3;
        this.json.options.rval = this.json.options.rval || 300000 * this.ecoSpeed;
        this.json.options.expeShips = this.json.options.expeShips || [this.json.options.defaultShip,0,1];
        this.json.options.resSaver = this.json.options.resSaver || [0,0,0];
        this.json.options.pinned = this.json.options.pinned || false;
        this.json.options.spyFilter = this.json.options.spyFilter || '$';
        this.json.options.autoHarvest = this.json.options.autoHarvest || [0,0,0,0];
        this.json.options.harvestInitialPlanet = this.json.options.harvestInitialPlanet || '0';
        this.json.options.hiddenTargets = this.json.options.hiddenTargets || {};
        this.json.options.targetFilter = this.json.options.targetFilter || [1, 0];
        this.json.options.sideViewOpened = this.json.options.sideViewOpened || false;
        this.json.options.currentTarget = this.json.options.currentTarget || false;
        this.json.options.nextTarget = this.json.options.nextTarget || false;
        this.json.options.currentPanel = this.json.options.currentPanel || 'default';
        this.json.jumpGateTimers = this.json.jumpGateTimers || {};

        this.json.locked = this.json.locked || {};

        this.menuOptions = Util.createDom('div', {'class':'ogl_menuOptions'});
        document.querySelector('#countColonies').prepend(this.menuOptions);

        if(!this.json.loca.metal && Util.getPage() != 'fleetdispatch') window.location.href = this.ogl.baselink + '?page=ingame&component=fleetdispatch';

        this.component = {};
        this.component.langManager = new LangManager(this);
        this.component.sideViewManager = new SideViewManager(this);
        this.component.planetManager = new PlanetManager(this);
        this.component.empireManager = new EmpireManager(this);
        this.component.playerManager = new PlayerManager(this);
        this.component.popupManager = new PopupManager(this);
        this.component.tooltipManager = new TooltipManager(this);
        this.component.fleetManager = new FleetManager(this);
        this.component.messageManager = new MessageManager(this);
        this.component.timeManager = new TimeManager(this);
        this.component.lockManager = new LockManager(this);
        this.component.jumpgateManager = new JumpgateManager(this);
        this.component.keyboardManager = new KeyboardManager(this);

        Util.saveData(this.json);
        Util.loop(() => Util.checkInputs());
        Util.checkTopScore(this);
    }
}

class LangManager
{
    constructor(ogl)
    {
        this.ogl = ogl;

        this.en =
        {
            abbr202 : "SC",
            abbr203 : "LC",
            abbr219 : "PF",
            abbr210 : "SP",
            planets : "planets",
            ships : "Ships",
            items : "Items",
            other : "Other",
            resources : "Resources",
            fight : "Fight",
            noMoonError : "Error, there is no moon here",
            capacityPicker : "Resources to send",
            scExpe : "Small cargo expedition",
            lcExpe : "Large cargo expedition",
            allShipsRes : "Select all ships (page 1) or all resources (page 3)",
            splitShipsRes : "Split all ships (page 1) or all resources (page 3) by the value selected (2-9)",
            prevFleet : "Repeat previous fleet",
            required : "req.",
            reverseAllShipsRes : "Reverse all selected ships (page 1) or all resources (page 3)",
            nextPlanet : "Go to next planet",
            gain : "Gain",
            timeLimits : "Day;Week;Month;All",
            spyPosition : "Spy this position",
            flagTarget : "Set next target",
            attackCurrentTarget : "Attack next target",
            noTargetSelected : "No target selected",
            timerInfo : "Last refresh",
            blackhole : "Black hole",
            signalBlackhole : "Signal a blackhole",
            moreStats : "More statistics",
            eraseData : "Erase data",
            defaultView : "Default view",
            economyView : "Economy view",
            productionView : "Production view",
            pinnedView : "Pinned target",
            targetView : "Targets list",
            oglConfig : "OGLight settings",
            defaultShip : "Default ship",
            defaultMission : "Default mission",
            autoCollect : "Collect resources",
            minifyPictures : "Minify large pictures",
            displayTimers : "Display refresh timers",
            rentaStats : "Rentability Statistics",
            excludeConso : "Exclude deut consumption from stats",
            spiesTable : "Display spies table",
            autoClean : "Autoclean spies table",
            inFlight : "In flight",
            linkedMoons : "Linked moons",
            kofi : "Do you like OGLight ? Then support me :)",
            wrongTarget : "Warning, the targeted planet has changed and will be removed from the list !",
            deleteSpyDef : "Delete spies agaisnt my planets",
            rentaPerDay : "Renta / day ($daysd)",
            totalPerDay : "Total / day ($daysd)",
            ignoreRaid : "Ignore this raid",
        }

        this.fr =
        {
            abbr202 : "PT",
            abbr203 : "GT",
            abbr219 : "EC",
            abbr210 : "SP",
            planets : "planètes",
            ships : "Vaisseaux",
            other : "Autre",
            resources : "Ressources",
            fight : "Combat",
            noMoonError : "Erreur, il n'y a pas de lune ici",
            capacityPicker : "Ressources à envoyer",
            scExpe : "Expedition au PT",
            lcExpe : "Expedition au GT",
            allShipsRes : "Selectionner tous les vaisseux (page 1) ou toutes les ressources (page3)",
            splitShipsRes : "Diviser tous les vaisseux (page 1) ou toutes les ressources (page3) par la valeur selectionnée (2-9)",
            prevFleet : "Répéter la flotte précédente",
            reverseAllShipsRes : "Inverser tous les vaisseaux (page 1) ou toutes ressources selectionné(e)s (page 3)",
            nextPlanet : "Se rendre sur la planète suivante",
            gain : "Gain",
            timeLimits : "Jour;Semaine;Mois;Tout",
            spyPosition : "Espionner cette position",
            flagTarget : "Définir la prochaine cible",
            attackCurrentTarget : "Attaquer la prochaine cible",
            noTargetSelected : "Aucune cible définie",
            timerInfo : "Dernier refresh",
            blackhole : 'Trou noir',
            signalBlackhole : "Signaler un trou noir",
            moreStats : "Plus de statistiques",
            eraseData : "Supprimer les données",
            defaultView : "Vue par défaut",
            economyView : "Vue économie",
            productionView : "Vue production",
            pinnedView : "Cible épinglée",
            targetView : "Liste des cibles",
            oglConfig : "Configuration d'OGLight",
            defaultShip : "Vaisseau par défaut",
            defaultMission : "Mission par défaut",
            autoCollect : "Collecter les ressources",
            minifyPictures : "Réduire les grandes images",
            displayTimers : "Afficher les timers de refresh",
            rentaStats : "Statistiques de rentabilité",
            excludeConso : "Ignore la conso de deut dans les stats",
            spiesTable : "Afficher le tableau de RE",
            autoClean : "Nettoyage automatique du tableau de RE",
            inFlight : "En vol",
            linkedMoons : "Lunes associées",
            kofi : "Vous aimez OGLight ? Alors soutenez-moi :)",
            wrongTarget : "Attention, la planète ciblée a changée et va être supprimée de la liste !",
            deleteSpyDef : "Supprimer les espionnages de mes planètes",
            rentaPerDay : "Renta / jour ($daysj)",
            totalPerDay : "Total / jour ($daysj)",
            ignoreRaid : "Ignorer ce raid",
        }
    }

    getText(key)
    {   
        if(this[this.ogl.lang] && this[this.ogl.lang][key]) return this[this.ogl.lang][key];
        else if(this.ogl.json.loca[key]) return this.ogl.json.loca[key];
        else if(this.en[key]) return this.en[key];
        else return 'OGL lang error';
    }
}

class LockManager
{
    constructor(ogl)
    {
        this.ogl = ogl;

        if(Util.getPage() == 'fleetdispatch' && this.ogl.mode == '3')
        {
            let url = new URL(window.location.href);
            let techIDs = url.searchParams.get('oglTech').split(/;/g);
            let coords = `${fleetDispatcher.targetPlanet.galaxy}:${fleetDispatcher.targetPlanet.system}:${fleetDispatcher.targetPlanet.position}`;

            let cumulRes = [0,0,0];
            let totalShipsToSend = 0;
            let shipID = this.ogl.json.options.defaultShip;
            let maxShips = this.ogl.component.fleetManager.shipsOnPlanet[shipID].number;

            let sentList = {};

            techIDs.forEach(techID =>
            {
                if(this.ogl.json.locked[coords] && this.ogl.json.locked[coords][techID])
                {
                    let data = this.ogl.json.locked[coords][techID];
                    let resToSend = Math.min(data.metal, fleetDispatcher.metalOnPlanet - cumulRes[0]) + Math.min(data.crystal, fleetDispatcher.crystalOnPlanet - cumulRes[1]) + Math.min(data.deut, fleetDispatcher.deuteriumOnPlanet - cumulRes[2]);
                    let shipsToSend = this.ogl.component.fleetManager.calcRequiredShips(shipID, resToSend + 3);
                    let diffShips = Math.min(maxShips - (totalShipsToSend + shipsToSend), 0);

                    totalShipsToSend += (shipsToSend - diffShips);
                    let diffRes = [fleetDispatcher.cargoMetal, fleetDispatcher.cargoCrystal, fleetDispatcher.cargoDeuterium];

                    cumulRes[0] = Math.min(fleetDispatcher.cargoMetal + data.metal, fleetDispatcher.metalOnPlanet);
                    cumulRes[1] = Math.min(fleetDispatcher.cargoCrystal + data.crystal, fleetDispatcher.crystalOnPlanet);
                    cumulRes[2] = Math.min(fleetDispatcher.cargoDeuterium + data.deut, fleetDispatcher.deuteriumOnPlanet);

                    fleetDispatcher.selectShip(shipID, totalShipsToSend);

                    fleetDispatcher.cargoMetal = Math.min(cumulRes[0], fleetDispatcher.getFreeCargoSpace());
                    fleetDispatcher.cargoCrystal = Math.min(cumulRes[1], fleetDispatcher.getFreeCargoSpace());
                    fleetDispatcher.cargoDeuterium = Math.min(cumulRes[2], fleetDispatcher.getFreeCargoSpace());

                    diffRes[0] = fleetDispatcher.cargoMetal - diffRes[0];
                    diffRes[1] = fleetDispatcher.cargoCrystal - diffRes[1];
                    diffRes[2] = fleetDispatcher.cargoDeuterium - diffRes[2];

                    sentList[techID] = sentList[techID] || {};
                    sentList[techID].metal = diffRes[0];
                    sentList[techID].crystal = diffRes[1];
                    sentList[techID].deut = diffRes[2];
                }
            });

            fleetDispatcher.refresh();

            Util.overwriteFleetDispatcher('submitFleet3', false, () =>
            {
                if(fleetDispatcher.currentPage == 'fleet3')
                {
                    techIDs.forEach(techID =>
                    {
                        this.ogl.json.locked[coords][techID].metal = Math.max(this.ogl.json.locked[coords][techID].metal - sentList[techID].metal, 0);
                        this.ogl.json.locked[coords][techID].crystal = Math.max(this.ogl.json.locked[coords][techID].crystal - sentList[techID].crystal, 0);
                        this.ogl.json.locked[coords][techID].deut = Math.max(this.ogl.json.locked[coords][techID].deut - sentList[techID].deut, 0);

                        Util.saveData(this.ogl.json);
                    });
                }
            });
        }

        let pages = ['supplies', 'facilities', 'shipyard', 'defenses', 'research'];
        if(pages.indexOf(Util.getPage()) > -1) this.checkDetail();

        this.sideLock();
    }

    checkDetail()
    {
        let coords = this.ogl.current.coords.join(':');
        this.ogl.json.locked[coords] = this.ogl.json.locked[coords] || {};

        let updateData = (detail, tech) =>
        {
            let level = tech.level + tech.currentStep - 1;
            let nextLevel = tech.level + tech.currentStep;
            let domLevel = detail.querySelector('.information .level');
            domLevel.innerHTML = `Level ${level} <i class="material-icons">arrow_forward</i> <span>${nextLevel}</span>`;
            domLevel.setAttribute('data-value', tech.level + tech.currentStep);
            domLevel.setAttribute('data-ratio', tech.ratio);
            domLevel.setAttribute('data-step', tech.currentStep);

            this.ogl.json.locked[coords] = this.ogl.json.locked[coords] || {};

            let lockButton = detail.querySelector('.ogl_lockBuild');

            if(this.ogl.json.locked[coords][`${tech.id}_${level+1}`]) lockButton.classList.add('ogl_active');
            else lockButton.classList.remove('ogl_active');

            ['metal', 'crystal', 'deut', 'energy'].forEach(res =>
            {
                if(tech[res])
                {
                    let ratio;

                    if(tech.id == 36 && res == 'energy') ratio = 2.5;
                    else ratio = tech.ratio;

                    let newValue = Math.ceil(tech[res] * Math.pow(ratio, tech.currentStep));
                    let target = detail.querySelector('.costs .' + res.replace('deut', 'deuterium'));
                    target.textContent = Util.formatToUnits(newValue);
                    target.setAttribute('data-total', newValue);
                    target.setAttribute('title', `${Util.formatNumber(newValue)} ${this.ogl.component.langManager.getText(res)}`);
                    target.classList.remove('ogl_tooltipReady');
                }
            });
        }

        for(let [k,v] of Object.entries(this.ogl.json.locked[coords]))
        {
            let domBuilding = document.querySelector(`.technology[data-technology="${v.id}"]`);
            if(domBuilding && (v.id < 200 || (v.id >= 300 && v.id < 400) || v.id >= 500))
            {
                let currentLevel = (domBuilding.querySelector('.targetlevel') || domBuilding.querySelector('.level')).getAttribute('data-value');
                let onMoon = this.ogl.current.type == 'moon' ? true : false;
                if(domBuilding && currentLevel >= v.level && onMoon === this.ogl.json.locked[coords][k].onMoon)
                {
                    delete(this.ogl.json.locked[coords][k]);
                }
            }
        }

        Util.loop(() =>
        {
            // fix ogame bug when user spam click
            if(document.querySelectorAll('#technologydetails').length > 1)
            {
                document.querySelectorAll('#technologydetails').forEach((e, index) => { if(index > 0) e.remove() });
            }

            let detail = document.querySelector('#technologydetails');
            if(!detail || detail.classList.contains('ogl_lockReady')) return;

            detail.classList.add('ogl_lockReady');

            let detailAction = detail.querySelector('.sprite_large').appendChild(Util.createDom('div', {'class':'ogl_detailAction'}));
            let lockButton = detailAction.appendChild(Util.createDom('div', {'class':'ogl_button material-icons ogl_lockBuild tooltip', 'title':'Lock this building'}, 'lock'));

            if(detail.querySelector('#build_amount'))
            {
                detail.querySelector('#build_amount').setAttribute('onkeyup', 'checkIntInput(this, 1, 99999);event.stopPropagation();');
                for(let i=0; i<3; i++) detailAction.appendChild(Util.createDom('div'));
            }
            else
            {
                let tech = {};
                tech.id = parseInt(detail.getAttribute('data-technology-id'));
                tech.level = parseInt(detail.querySelector('.information .level') ? detail.querySelector('.information .level').getAttribute('data-value') : 0);
                tech.metal = parseInt(!detail.querySelector('.costs .metal') ? 0 : detail.querySelector('.costs .metal').getAttribute('data-value'));
                tech.crystal = parseInt(!detail.querySelector('.costs .crystal') ? 0 : detail.querySelector('.costs .crystal').getAttribute('data-value'));
                tech.deut = parseInt(!detail.querySelector('.costs .deuterium') ? 0 : detail.querySelector('.costs .deuterium').getAttribute('data-value'));
                tech.energy = parseInt(!detail.querySelector('.costs .energy') ? 0 : detail.querySelector('.costs .energy').getAttribute('data-value'));
                tech.currentStep = 0;

                if(tech.id == 1 || tech.id == 3 || tech.id == 4) tech.ratio = 1.5;
                else if(tech.id == 2) tech.ratio = 1.6;
                else if(tech.id == 12) tech.ratio = 1.8;
                else if(tech.id == 36) tech.ratio = 5;
                else if(tech.id == 124) tech.ratio = 1.75;
                else if(tech.id == 199) tech.ratio = 3;
                else tech.ratio = 2;

                let level = tech.level + tech.currentStep - 1;
                let nextLevel = tech.level + tech.currentStep;
                detail.querySelector('.information .level').innerHTML = `Level ${level} <i class="material-icons">arrow_forward</i> <span>${nextLevel}</span>`;

                let prevButton = detailAction.appendChild(Util.createDom('div', {'class':'ogl_button material-icons tooltip', 'title':'Next level'}, 'keyboard_arrow_left'));
                let clearButton = detailAction.appendChild(Util.createDom('div', {'class':'ogl_button material-icons tooltip', 'title':'Current level'}, 'clear'));
                let nextButton = detailAction.appendChild(Util.createDom('div', {'class':'ogl_button material-icons tooltip', 'title':'Next level'}, 'keyboard_arrow_right'));

                prevButton.addEventListener('click', () =>
                {
                    if(tech.level + tech.currentStep > 1)
                    {
                        tech.currentStep--;
                        updateData(detail, tech);
                        if(tech.level + tech.currentStep < tech.level) lockButton.classList.add('ogl_disabled');
                        else lockButton.classList.remove('ogl_disabled');
                    }
                });

                clearButton.addEventListener('click', () =>
                {
                    tech.currentStep = 0;
                    updateData(detail, tech);
                    lockButton.classList.remove('ogl_disabled');
                });
                

                nextButton.addEventListener('click', () =>
                {
                    tech.currentStep++;
                    updateData(detail, tech);
                    if(tech.level + tech.currentStep < tech.level) lockButton.classList.add('ogl_disabled');
                    else lockButton.classList.remove('ogl_disabled');
                });
            }

            this.ogl.json.locked[coords] = this.ogl.json.locked[coords] || {};

            let t = {};
            t.id = parseInt(detail.getAttribute('data-technology-id'));
            t.level = parseInt(detail.querySelector('.information .level') ? detail.querySelector('.information .level').getAttribute('data-value') : 0);

            if(this.ogl.json.locked[coords][`${t.id}_${t.level}`]) lockButton.classList.add('ogl_active');
            lockButton.addEventListener('click', e =>
            {
                if(e.target.classList.contains('ogl_disabled')) return;

                let tech = {};

                tech.id = parseInt(detail.getAttribute('data-technology-id'));
                tech.onMoon = this.ogl.current.type == 'moon' ? true : false;
                tech.name = detail.querySelector('.content h3').textContent;
                tech.amount = parseInt(detail.querySelector('#build_amount') ? detail.querySelector('#build_amount').value || 1 : 0);
                tech.level = parseInt(detail.querySelector('.information .level') ? detail.querySelector('.information .level').getAttribute('data-value') : 0);
                tech.metal = parseInt(!detail.querySelector('.costs .metal') ? 0 : detail.querySelector('.costs .metal').getAttribute('data-total') || detail.querySelector('.costs .metal').getAttribute('data-value'));
                tech.crystal = parseInt(!detail.querySelector('.costs .crystal') ? 0 : detail.querySelector('.costs .crystal').getAttribute('data-total') || detail.querySelector('.costs .crystal').getAttribute('data-value'));
                tech.deut = parseInt(!detail.querySelector('.costs .deuterium') ? 0 : detail.querySelector('.costs .deuterium').getAttribute('data-total') || detail.querySelector('.costs .deuterium').getAttribute('data-value'));

                let key = tech.level ? `${tech.id}_${tech.level}` : tech.id;

                this.ogl.json.locked[coords] = this.ogl.json.locked[coords] || {};
                this.ogl.json.locked[coords][key] = tech;

                lockButton.classList.add('ogl_active');

                Util.saveData(this.ogl.json);
                this.sideLock();
            });
        });
    }

    sideLock()
    {
        this.ogl.planetList.forEach(planet =>
        {
            planet.querySelector('.ogl_sideLock') && planet.querySelector('.ogl_sideLock').remove();

            let coords = planet.querySelector('.planet-koords').textContent.slice(1,-1);
    
            if(this.ogl.json.locked[coords] && Object.keys(this.ogl.json.locked[coords]).length > 0)
            {
                let lock = planet.appendChild(Util.createDom('div', {'class':'material-icons ogl_sideLock'}, 'lock'));
                lock.addEventListener('click', () => this.buildContent(coords, planet));
            }
        });
    }

    buildContent(coords, planet)
    {
        this.ogl.component.popupManager.load();
        let container = Util.createDom('div', {'class':'ogl_lockInfo'});

        let total = [0,0,0,0,0,0];
        let pTechList;
        let mTechList;

        let pLine = container.appendChild(Util.createDom('div', {'class':'ogl_type ogl_lockLine'}));
        let mLine = container.appendChild(Util.createDom('div', {'class':'ogl_type ogl_lockLine'}));

        pLine.appendChild(Util.createDom('div', {'class':'ogl_type'}, `${planet.querySelector('.planet-name').textContent} ${planet.querySelector('.planet-koords').textContent}`));
        ['metal', 'crystal', 'deut'].forEach(res => pLine.appendChild(Util.createDom('div', {}, `<div class="ogl_shipIcon ogl_${res}"></div>`)));
        pLine.appendChild(Util.createDom('div'));
        pLine.appendChild(Util.createDom('hr'));

        mLine.appendChild(Util.createDom('div', {'class':'ogl_type'}, `Moon ${planet.querySelector('.planet-koords').textContent}`));
        ['metal', 'crystal', 'deut'].forEach(res => mLine.appendChild(Util.createDom('div', {}, `<div class="ogl_shipIcon ogl_${res}"></div>`)));
        mLine.appendChild(Util.createDom('div'));
        mLine.appendChild(Util.createDom('hr'));

        for(let [k,v] of Object.entries(this.ogl.json.locked[coords]))
        {
            let tech = this.ogl.json.locked[coords][k];

            if(tech.onMoon) mTechList = !mTechList ? k : mTechList+';'+k;
            else pTechList = !pTechList ? k : pTechList+';'+k;

            let target = tech.onMoon ? mLine : pLine;

            let name = target.appendChild(Util.createDom('div', {'class':'ogl_type'},  `${tech.name} (${tech.level || Util.formatNumber(tech.amount)})`));
            if(tech.metal + tech.crystal + tech.deut <= 0) name.appendChild(Util.createDom('i', {'class':'material-icons ogl_ok'}, 'checked'));
            ['metal', 'crystal', 'deut'].forEach((res, index) =>
            {
                target.appendChild(Util.createDom('div', {'class':'ogl_'+res}, Util.formatNumber(tech[res])));
                tech.onMoon ? total[index + 3] += tech[res] : total[index] += tech[res];
            });

            let actions = target.appendChild(Util.createDom('div'));
            let sendRes = actions.appendChild(Util.createDom('div', {'class':'ogl_button material-icons'}, 'local_shipping'));
            if(tech.metal + tech.crystal + tech.deut <= 0) sendRes.classList.add('ogl_hidden');

            sendRes.addEventListener('click', () =>
            {
                let type = tech.onMoon ? 3 : 1;
                let splittedCoords = coords.replace('M', '').split(':');
                let id = tech.level ? `${tech.id}_${tech.level}` : tech.id;

                let link = `?page=ingame&component=fleetdispatch&galaxy=${splittedCoords[0]}&system=${splittedCoords[1]
                }&position=${splittedCoords[2]}&type=${type}&mission=${this.ogl.json.options.defaultMission}&oglMode=3&oglTech=${id}`;

                window.location.href = this.ogl.baselink + link;
            });

            let clear = actions.appendChild(Util.createDom('div', {'class':'ogl_button material-icons'}, 'clear'));
            clear.addEventListener('click', () =>
            {
                delete this.ogl.json.locked[coords][k];
                this.sideLock();
                this.ogl.component.popupManager.close();
                if(Object.keys(this.ogl.json.locked[coords]).length > 0) this.buildContent(coords, planet);
                Util.saveData(this.ogl.json);
            });
        }

        for(let i=0; i<2; i++)
        {
            let line = i == 0 ? pLine : mLine;
            let indexOffset = i == 0 ? 0 : 3;
            let type = i == 0 ? 1 : 3;
            let techList = i == 0 ? pTechList : mTechList;

            line.appendChild(Util.createDom('hr'));

            line.appendChild(Util.createDom('div', {'class':'ogl_type material-icons'}, 'functions'));
            ['metal', 'crystal', 'deut'].forEach((res, index) => line.appendChild(Util.createDom('div', {'class':'ogl_'+res}, Util.formatNumber(total[index + indexOffset]))));

            let actions = line.appendChild(Util.createDom('div'));

            if(total[0 + indexOffset] + total[1 + indexOffset] + total[2 + indexOffset] > 0)
            {
                let sendRes = actions.appendChild(Util.createDom('div', {'class':'ogl_button material-icons'}, 'local_shipping'));
    
                sendRes.addEventListener('click', () =>
                {
                    let splittedCoords = coords.replace('M', '').split(':');
                    let link = `?page=ingame&component=fleetdispatch&galaxy=${splittedCoords[0]}&system=${splittedCoords[1]
                    }&position=${splittedCoords[2]}&type=${type}&mission=${this.ogl.json.options.defaultMission}&oglMode=3&oglTech=${techList}`;
    
                    window.location.href = this.ogl.baselink + link;
                });

                let clear = actions.appendChild(Util.createDom('div', {'class':'ogl_button material-icons'}, 'clear'));
                clear.addEventListener('click', () =>
                {
                    for(let [k,v] of Object.entries(this.ogl.json.locked[coords]))
                    {
                        if(i == 0 && !this.ogl.json.locked[coords][k].onMoon) delete this.ogl.json.locked[coords][k];
                        else if(i == 1 && this.ogl.json.locked[coords][k].onMoon) delete this.ogl.json.locked[coords][k];
                    }

                    this.sideLock();
                    this.ogl.component.popupManager.close();
                    if(Object.keys(this.ogl.json.locked[coords]).length > 0) this.buildContent(coords, planet);
                    Util.saveData(this.ogl.json);
                });
            }
        }

        this.ogl.component.popupManager.open(container);
    }
}

class JumpgateManager
{
    constructor(ogl)
    {
        this.ogl = ogl;

        if(Util.getPage() == 'facilities' || this.ogl.current.type == 'moon')
        {
            let calcTimer = level =>
            {
                return (0.25*Math.pow(level,2)-7.57*level+67.34)/this.ogl.fleetSpeed * 60000;
            }

            jumpgateDone = a =>
            {
                var a = $.parseJSON(a);
                if(a.status)
                {
                    planet = a.targetMoon;
                    $(".overlayDiv").dialog("destroy");

                    let originCoords = this.ogl.current.coords.join(':');
                    let originLevel = this.ogl.current.smallplanet.querySelector('.moonlink').getAttribute('data-jumpgatelevel');

                    let destinationCoords = document.querySelector(`.moonlink[href*="${jumpGateTargetId}"]`).parentNode.querySelector('.planet-koords').textContent.slice(1, -1);
                    let destinationLevel = document.querySelector(`.moonlink[href*="${jumpGateTargetId}"]`).getAttribute('data-jumpgatelevel');

                    let now = Date.now();
                    this.ogl.json.jumpGateTimers[originCoords] = now + calcTimer(originLevel);
                    this.ogl.json.jumpGateTimers[destinationCoords] = now + calcTimer(destinationLevel);

                    Util.saveData(this.ogl.json);
                }
                errorBoxAsArray(a.errorbox);
                if(typeof(a.newToken) != "undefined") setNewTokenData(a.newToken);
            }
        }

        Util.loop(() =>
        {
            if(document.querySelector('#jumpgateForm') && !document.querySelector('#jumpgateForm').classList.contains('ogl_ready'))
            {
                document.querySelector('#jumpgateForm').classList.add('ogl_ready');
                document.querySelectorAll('#jumpgateForm .ship_txt_row:not(.tdInactive)').forEach(ship =>
                {
                    ship.style.position = 'relative';
                    let delta = ship.appendChild(Util.createDom('div',{'class':'ogl_delta'}, '<i class="material-icons">fiber_smart_record</i>'));
    
                    delta.addEventListener('click', event => 
                    {
                        let input = ship.nextElementSibling.querySelector('input');
                        let selected = input.value.replace(/\./g, '') || 0;
                        let amount = parseInt(input.getAttribute('rel'));
    
                        input.value = amount - selected;
                    });
                });
            }
        });

        this.addTimer();
    }

    addTimer()
    {
        this.ogl.planetList.forEach(planet =>
        {
            let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1);
            if(this.ogl.json.jumpGateTimers[coords] && this.ogl.json.jumpGateTimers[coords] > Date.now())
            {
                if(!planet.querySelector('.moonlink')) return;

                let updateTimer = () => new Date(this.ogl.json.jumpGateTimers[coords] - (Date.now() + 3600000)).toLocaleTimeString('fr-FR').substr(3);

                let timer = updateTimer();
                let div = planet.querySelector('.moonlink').appendChild(Util.createDom('div', {'class':'ogl_jumpGateTimer'}, timer));
                let interval = setInterval(() =>
                {
                    if(this.ogl.json.jumpGateTimers[coords] <= Date.now()) clearInterval(interval);
                    else div.textContent = updateTimer();
                }, 1000);
            }
        });
    }
}

class KeyboardManager
{
    constructor(ogl)
    {
        this.ogl = ogl;
        this.dom = (document.querySelector('#cutty') || document.querySelector('#norm')).appendChild(Util.createDom('div', {'class':'ogl_keyList'}));

        this.addKey('o', this.ogl.component.langManager.getText('nextPlanet'), () =>
        {
            if(this.ogl.mode == 1 || this.ogl.mode == 4)
            {
                window.location.href = this.ogl.component.fleetManager.nextLink;
            }
            else
            {
                let linkType = this.ogl.current.type == 'planet' ? '.planetlink' : '.moonlink';
                if(!this.ogl.current.next.querySelector(linkType)) linkType = '.planetlink';

                let url = new URL(window.location.href);
                url.searchParams.delete('cp');

                let cp = new URL(this.ogl.current.next.querySelector(linkType).href).searchParams.get('cp');
                url.searchParams.set('cp', cp);
                window.location.href = url.href;
            }
        });

        if(Util.getPage() == 'messages')
        {
            this.addKey('enter', 'Send fleet on next spies table line', () =>
            {
                if(document.querySelector('.ogl_spyTable') && document.querySelectorAll('.ogl_spyTable tr:not(.ogl_attacked):not(.ogl_notGray)')[1])
                {
                    document.querySelectorAll('.ogl_spyTable tr:not(.ogl_attacked):not(.ogl_notGray)')[1].querySelector('.ogl_shipsLink a').click(); 
                }
            });
        }

        if(Util.getPage() == 'galaxy')
        {
            this.addKey('s', 'Previous galaxy', () => submitOnKey(40));
            this.addKey('z|w', 'Next galaxy', () => submitOnKey(38));
            this.addKey('q|a', 'Previous system', () => submitOnKey(37));
            this.addKey('d', 'Next system', () => submitOnKey(39));
        }

        if(Util.getPage() == 'fleetdispatch')
        {
            this.addKey('a', this.ogl.component.langManager.getText('allShipsRes'), () =>
            {
                if(fleetDispatcher.currentPage == 'fleet1') fleetDispatcher.selectAllShips();
                if(fleetDispatcher.currentPage == 'fleet3') fleetDispatcher.selectMaxAll();
                fleetDispatcher.refresh();
            });

            let expeAction = shipID =>
            {
                let initialValue = this.ogl.json.options.expeShips[0];
                this.ogl.json.options.expeShips[0] = shipID;
                this.ogl.component.fleetManager.expeButtonAction();
                this.ogl.json.options.expeShips[0] = initialValue;
                Util.saveData(this.ogl.json);
                fleetDispatcher.refresh();
            }

            this.addKey('s', this.ogl.component.langManager.getText('scExpe'), () =>
            {
                if(fleetDispatcher.currentPage == 'fleet1') expeAction(202);
            });

            this.addKey('l', this.ogl.component.langManager.getText('lcExpe'), () =>
            {
                if(fleetDispatcher.currentPage == 'fleet1') expeAction(203);
            });

            this.addKey('2-9', this.ogl.component.langManager.getText('splitShipsRes'), keyNumber =>
            {
                if(!keyNumber) keyNumber = 2;

                if(fleetDispatcher.currentPage == 'fleet1')
                {
                    fleetDispatcher.shipsOnPlanet.forEach(ship => fleetDispatcher.selectShip(ship.id, Math.ceil(ship.number / keyNumber)));
                    fleetDispatcher.focusSubmitFleet1();
                }
                else if(fleetDispatcher.currentPage == 'fleet3')
                {
                    document.querySelectorAll('#fleet3 #resources .res_wrap').forEach((resource, index) =>
                    {
                        let cargoType = ['cargoMetal', 'cargoCrystal', 'cargoDeuterium'];

                        let currentMax = this.ogl.component.fleetManager.resOnPlanet[index];
                        if(index == 2) currentMax -= fleetDispatcher.getConsumption();

                        fleetDispatcher[cargoType[index]] = Math.max(Math.ceil(currentMax / keyNumber), 0);
                        resource.querySelector('input').value = fleetDispatcher[cargoType[index]];

                        fleetDispatcher.focusSubmitFleet3();
                    });
                }
                fleetDispatcher.refresh();
            });

            this.addKey('p', this.ogl.component.langManager.getText('prevFleet'), () =>
            {
                if(fleetDispatcher.currentPage != 'fleet1') return;

                fleetDispatcher.resetShips();
                Object.values(this.ogl.json.lastFleet.shipsToSend).forEach(ship => fleetDispatcher.selectShip(ship.id, ship.number));

                fleetDispatcher.targetPlanet = this.ogl.json.lastFleet.targetPlanet;
                fleetDispatcher.speedPercent = this.ogl.json.lastFleet.speedPercent;
                fleetDispatcher.mission = this.ogl.json.lastFleet.mission;
                fleetDispatcher.refresh();

                fleetDispatcher.cargoMetal = Math.min(this.ogl.json.lastFleet.cargoMetal, fleetDispatcher.metalOnPlanet, fleetDispatcher.getFreeCargoSpace());
                fleetDispatcher.cargoCrystal = Math.min(this.ogl.json.lastFleet.cargoCrystal, fleetDispatcher.crystalOnPlanet, fleetDispatcher.getFreeCargoSpace());
                fleetDispatcher.cargoDeuterium = Math.min(this.ogl.json.lastFleet.cargoDeuterium, fleetDispatcher.deuteriumOnPlanet, fleetDispatcher.getFreeCargoSpace());

                this.ogl.component.fleetManager.tempCoords = [fleetDispatcher.targetPlanet.galaxy, fleetDispatcher.targetPlanet.system,fleetDispatcher.targetPlanet.position, fleetDispatcher.targetPlanet.type];

                this.ogl.component.fleetManager.updateSpeedPercent();
                fleetDispatcher.refresh();
                fleetDispatcher.focusSubmitFleet1();
            });

            this.addKey('r', this.ogl.component.langManager.getText('reverseAllShipsRes'), () =>
            {
                if(fleetDispatcher.currentPage == 'fleet1') document.querySelectorAll('#fleet1 li[data-status="on"] .ogl_delta').forEach(e => e.click());
                if(fleetDispatcher.currentPage == 'fleet3') document.querySelectorAll('#fleet3 .res_wrap .ogl_delta').forEach(e => e.click());
            });

            this.addKey('t', this.ogl.component.langManager.getText('attackCurrentTarget'), () =>
            {
                if(this.ogl.json.options.currentTarget)
                {
                    fleetDispatcher.resetShips();

                    let shipID = this.ogl.json.options.defaultShip;
                    this.ogl.component.fleetManager.shipsOnPlanet[shipID] = this.ogl.component.fleetManager.shipsOnPlanet[shipID] || {number:0};
                    let shipCount = this.ogl.component.fleetManager.calcRequiredShips(shipID, this.ogl.json.options.rval);
                    fleetDispatcher.selectShip(shipID, Math.min(shipCount, this.ogl.component.fleetManager.shipsOnPlanet[shipID].number));

                    let coords =  this.ogl.json.options.currentTarget.split(':');
                    fleetDispatcher.targetPlanet.galaxy = coords[0];
                    fleetDispatcher.targetPlanet.system = coords[1];
                    fleetDispatcher.targetPlanet.position = coords[2];
                    fleetDispatcher.targetPlanet.type = 1;
                    fleetDispatcher.targetPlanet.name = '-';
                    fleetDispatcher.mission = 1;
                    fleetDispatcher.refresh();

                    this.ogl.component.fleetManager.targetSelected = true;
                    this.ogl.component.fleetManager.tempCoords = [fleetDispatcher.targetPlanet.galaxy, fleetDispatcher.targetPlanet.system,fleetDispatcher.targetPlanet.position, fleetDispatcher.targetPlanet.type];
                }
                else
                {
                    fadeBox(this.ogl.component.langManager.getText('noTargetSelected'), true);
                }
            });
            
        }

        this.sent = false;

        document.addEventListener('keypress', event =>
        {
            if(!this.sent && (!document.querySelector('.ui-dialog') || document.querySelector('.ui-dialog').style.display == 'none')
            && !document.querySelector('.chat_box_textarea:focus') && document.activeElement.tagName != 'INPUT' && document.activeElement.tagName != 'TEXTAREA')
            {
                this.sent = true;

                let keycode = event.keyCode ? event.keyCode : event.which;
                let keyNumber = parseInt(String.fromCharCode(keycode));
                let charList = Object.keys(this.ogl.keyboardActionsList).map(x => x.split('|'));

                if(keycode == 91 || keycode == 17) return; // windows key

                charList.forEach(c =>
                {
                    if(c.indexOf(String.fromCharCode(keycode).toLowerCase()) > -1)
                    {
                        this.ogl.keyboardActionsList[c.join('|')]();
                    }
                    else if(keyNumber > 1 && keyNumber <= 9 && keycode)
                    {
                        this.ogl.keyboardActionsList['2-9'] && this.ogl.keyboardActionsList['2-9'](keyNumber);
                    }
                    else if(keycode == 13 && this.ogl.keyboardActionsList['enter'])
                    {
                        this.ogl.keyboardActionsList['enter']();
                    }
                });
            }
        });

        document.addEventListener('keyup', () => this.sent = false);
    }

    addKey(key, text, callback)
    {
        this.ogl.keyboardActionsList[key] = callback;

        let tip = this.dom.appendChild(Util.createDom('div', {'class':'ogl_key tooltipLeft', 'title':text}, key.toUpperCase()));
        if(key == 'enter')
        {
            tip.classList.add('material-icons');
            tip.textContent = 'subdirectory_arrow_left';
        }
        tip.addEventListener('click', () => callback());
    }
}

class EmpireManager
{
    constructor(ogl)
    {
        this.ogl = ogl;

        this.saveData();
        this.addTimers();
        this.displayStats();
        this.checkStorage();
    }

    saveData()
    {
        let now = Date.now();
        let currentCoords = this.ogl.current.coords.join(':');
        if(this.ogl.current.type == 'moon') currentCoords += 'M';

        this.ogl.json.myEconomy[currentCoords] = this.ogl.json.myEconomy[currentCoords] || {};

        if(Util.getPage() == 'supplies' && this.ogl.current.type == 'planet')
        {
            this.ogl.json.myEconomy[currentCoords].metal = parseInt((document.querySelector('.metalMine .level') || document.querySelector('.metalMine .targetlevel')).getAttribute('data-value'));
            this.ogl.json.myEconomy[currentCoords].crystal = parseInt((document.querySelector('.crystalMine .level') || document.querySelector('.crystalMine .targetlevel')).getAttribute('data-value'));
            this.ogl.json.myEconomy[currentCoords].deut = parseInt((document.querySelector('.deuteriumSynthesizer .level') || document.querySelector('.deuteriumSynthesizer .targetlevel')).getAttribute('data-value'));
        
            Util.saveData(this.ogl.json);
        }

        if(this.ogl.current.type == 'planet' && (Util.getPage() == 'supplies' || Util.getPage() == 'shipyard'))
        {
            let maxCrawler = (this.ogl.json.myEconomy[currentCoords].metal + this.ogl.json.myEconomy[currentCoords].crystal + this.ogl.json.myEconomy[currentCoords].deut) * 8;
            if(document.querySelector('#officers .geologist.on') && this.ogl.json.playerClass == 1) maxCrawler += maxCrawler * .1;
            document.querySelector('.technology[data-technology="217"] span').prepend(Util.createDom('div', {'class':'ogl_maxCrawler'}, 'max. ' + Util.formatNumber(Math.floor(maxCrawler))));
        }

        let commander = document.querySelector('.commander.on') ? true : false;
        if(commander)
        {
            let getEmpireResources = i =>
            {
                $.ajax(
                {
                    url:`https://${window.location.host}/game/index.php?page=ajax&component=empire&ajax=1&asJson=1&planetType=${i}`,
                    type:'GET',
                    dataType:'json',
                    success:result =>
                    {
                        let data = JSON.parse(result.mergedArray).planets;
                        
                        Object.values(data).forEach(p =>
                        {
                            let planet = {};
                            planet.id = p.id;
                            planet.resources = p.production.resources;
                            planet.prod = p.production.hourly;
                            planet.building = [p.production.production[1].number, p.production.production[2].number, p.production.production[3].number];
                            planet.coords = i == 1 ? p.coordinates.slice(1, -1) + 'M' : p.coordinates.slice(1, -1);
    
                            this.ogl.json.myEconomy[planet.coords] = this.ogl.json.myEconomy[planet.coords] || {};
                            this.ogl.json.myEconomy[planet.coords].prodTimer = now;
    
                            ['metal', 'crystal', 'deut'].forEach((res, index) =>
                            {
                                this.ogl.json.myEconomy[planet.coords][res] = planet.building[index];
                                this.ogl.json.myEconomy[planet.coords]['res'+res] = planet.resources[index];
                                this.ogl.json.myEconomy[planet.coords]['prod'+res] = (planet.prod[index] / 3600).toFixed(2);
    
                                if(i != 1)
                                {
                                    let target = document.querySelector(`.smallplanet[id="planet-${planet.id}"]`);
                                    target.querySelector('.planetlink .ogl_stock .ogl_'+res).textContent = Util.formatToUnits(this.ogl.json.myEconomy[planet.coords]['res'+res]);
                                }
                                else
                                {
                                    let target = document.querySelector(`.smallplanet[id="planet-${p.planetID}"]`);
                                    target.querySelector('.moonlink .ogl_stock .ogl_'+res).textContent = Util.formatToUnits(this.ogl.json.myEconomy[planet.coords]['res'+res]);
                                }
                            });
                        });
    
                        if(i != 1) getEmpireResources(1);
                        else Util.saveData(this.ogl.json);
                    }
                });
            };

            getEmpireResources(0);
        }

        ['metal', 'crystal', 'deut'].forEach(res =>
        {
            let data = resourcesBar.resources[res.replace('deut', 'deuterium')].tooltip;
            let currentRes = Math.floor(resourcesBar.resources[res.replace('deut', 'deuterium')].amount);
            let prod = data.replace(/\./g, '').match(/\d+/g)[2];

            this.ogl.json.myEconomy[currentCoords]['res'+res] = currentRes;
            this.ogl.json.myEconomy[currentCoords]['prod'+res] = (prod / 3600).toFixed(2);
            this.ogl.json.myEconomy[currentCoords].prodTimer = now;

            Util.saveData(this.ogl.json);
        });
    }

    addBlackHole()
    {
        let dom = document.querySelector('#links .ogl_stats');
        let button = dom.appendChild(Util.createDom('button', {'class':'ogl_button material-icons tooltip', 'title':this.ogl.component.langManager.getText('signalBlackhole')}, 'sentiment_very_dissatisfied'));
        button.addEventListener('click', () =>
        {
            let date = new Date();
            let midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0).getTime();

            let container = Util.createDom('div', {'class':'ogl_blackHole'});
            [202,203,204,205,206,207,208,209,210,211,213,214,215,218,219].forEach(shipID =>
            {
                let content = container.appendChild(Util.createDom('div'));
                content.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_'+shipID}));
                content.appendChild(Util.createDom('input', {'type':'text', 'class':'ogl_checkInput', 'data-ship':shipID}));
            });

            let confirmButton = container.appendChild(Util.createDom('button', {'class':'ogl_button'}, 'OK'));
            confirmButton.addEventListener('click', () =>
            {
                if(confirm('Do you really want to add this black hole ?'))
                {
                    let result = {};
                    container.querySelectorAll('input').forEach(input =>
                    {
                        let shipID = parseInt(input.getAttribute('data-ship'));
                        let amount = parseInt(input.value.replace(/[\,\.]/g, ''));
                        if(!isNaN(shipID) && !isNaN(amount)) result[shipID] = amount;
                    });

                    this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 };

                    for(let [k,v] of Object.entries(result))
                    {
                        this.ogl.json.stats[midnight].expe[k] = (this.ogl.json.stats[midnight].expe[k] || 0) - v;
                        this.ogl.json.stats.total.expe[k] = (this.ogl.json.stats.total.expe[k] || 0) - v;
                    }

                    this.ogl.json.stats[midnight].expeOccurences.blackhole = (this.ogl.json.stats[midnight].expeOccurences.blackhole || 0) + 1;
                    this.ogl.json.stats.total.expeOccurences.blackhole = (this.ogl.json.stats.total.expeOccurences.blackhole || 0) + 1;

                    this.ogl.component.empireManager.displayStats(this.ogl.json.stats.range);
                    Util.saveData(this.ogl.json);

                    document.location.reload();
                }
            });

            this.ogl.component.popupManager.open(container);
        });
    }

    displayStats(days)
    {
        if(this.ogl.json.options.togglesOff.indexOf('renta') > -1) return;
        days = days || this.ogl.json.stats.range;

        document.querySelector('.ogl_stats') && document.querySelector('.ogl_stats').remove();

        let now = new Date();
        let midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0);
        let aMonth = 30 * 24 * 60 * 60 * 1000;
        let limitTime = days > 1 ? days * 24 * 60 * 60 * 1000 : now.getTime() - midnight.getTime();

        let firstloopDone = false;
        let result = { raid:{metal:0,crystal:0,deut:0,dm:0}, expe:{metal:0,crystal:0,deut:0,dm:0}, cumul:{metal:0,crystal:0,deut:0,dm:0}, expeOccurences:{resources:0,dm:0,ships:0,item:0,fight:0,blackhole:0,none:0} };
        
        for(let [k,v] of Object.entries(this.ogl.json.stats))
        {
            // delete stats older than 1 month
            if(!isNaN(k) && now.getTime() - k > aMonth)
            {
                delete this.ogl.json.stats[k];
            }

            // delete ignored raid id older than 3 months
            if(k == 'ignored')
            {
                for(let [l,m] of Object.entries(this.ogl.json.stats.ignored))
                {
                    if(now.getTime() - m > aMonth * 3) delete this.ogl.json.stats.ignored[l];
                }
            }

            if((days < 99999999999 && !isNaN(k) && now.getTime() - k <= limitTime) || (days == 99999999999 && !firstloopDone))
            {
                let keyID = days == 99999999999 ? 'total' : k;
                firstloopDone = true;

                for(let [i,j] of Object.entries(this.ogl.json.stats[keyID].raid))
                {
                    result.raid[i] = (result.raid[i] || 0) + j;
                    result.cumul[i] = (result.cumul[i] || 0) + j;
                }
                for(let [i,j] of Object.entries(this.ogl.json.stats[keyID].expe))
                {
                    result.expe[i] = (result.expe[i] || 0) + j;
                    if(i != 'item')
                    {
                        if(!this.ogl.shipCost[i]) result.cumul[i] = (result.cumul[i] || 0) + j;
                        else
                        {
                            result.cumul.metal = (result.cumul.metal || 0) + this.ogl.shipCost[i][0] * j;
                            result.cumul.crystal = (result.cumul.crystal || 0) + this.ogl.shipCost[i][1] * j;
                            result.cumul.deut = (result.cumul.deut || 0) + this.ogl.shipCost[i][2] * j;
                        }
                    }
                }
                for(let [i,j] of Object.entries(this.ogl.json.stats[keyID].expeOccurences))
                {
                    result.expeOccurences[i] = (result.expeOccurences[i] || 0) + j;
                    if(i == 'blackhole') result.expeOccurences['none'] = (result.expeOccurences['none'] || 0) - j;
                }
                result.consumption = (result.consumption || 0) + this.ogl.json.stats[keyID].consumption;
            }
        }

        if(this.ogl.json.options.togglesOff.indexOf('ignoreConsumption') > -1) result.cumul.deut += result.consumption;
    
        let dom = document.querySelector('#links').appendChild(Util.createDom('div', {'class':'ogl_stats'}));
        let timeLimits = this.ogl.component.langManager.getText('timeLimits').split(';');

        let rawRenta = result.cumul.metal + result.cumul.crystal + result.cumul.deut;
        let rawProd = this.ogl.totalProd[0] + this.ogl.totalProd[1] + this.ogl.totalProd[2];

        let limitDom = dom.appendChild(Util.createDom('div', {'class':'ogl_labelLimit'}, this.ogl.json.stats.range.toString().replace('1', timeLimits[0]).replace('7', timeLimits[1]).replace('30', timeLimits[2]).replace('99999999999', timeLimits[3])));

        if(days < 31)
        {
            limitDom.className = 'ogl_labelLimit tooltipRight tooltipClose tooltipClick';
            limitDom.title =
            `
                ${this.ogl.component.langManager.getText('rentaPerDay').replace('$days', days)} : <span class="ogl_value float_right">${Util.formatNumber(Math.round(rawRenta/days))}</span><br>
                Production : <span class="ogl_value float_right">${Util.formatNumber(rawProd)}</span>
                <div class="splitLine"></div>
                ${this.ogl.component.langManager.getText('totalPerDay').replace('$days', days)} : <span class="ogl_value float_right">${Util.formatNumber(Math.round(rawRenta/days) + rawProd)}</span>
            `;
        }

        for(let [k,v] of Object.entries(result.cumul))
        {
            let line = dom.appendChild(Util.createDom('div'));
            line.innerHTML = `<div class="ogl_shipIcon ogl_${k}"></div><div class="number tooltip ogl_${k}" title="${this.ogl.component.langManager.getText(k)}: ${Util.formatNumber(v)}">${Util.formatToUnits(v)}</div>`;
        }

        let more = dom.appendChild(Util.createDom('button', {'class':'ogl_button material-icons tooltip', 'title':this.ogl.component.langManager.getText('moreStats')}, 'launch'));
        more.addEventListener('click', () =>
        {
            this.ogl.component.popupManager.load();

            let allStats = Util.createDom('div', {'class':'ogl_fullStats'});

            [result.expe, result.raid, result.cumul].forEach(stats =>
            {
                let totalOccurences = stats == result.expe ? Object.values(result.expeOccurences).reduce((a,b) => a+b, 0) : 0;
                let title = stats == result.expe ? `Expeditions<br>(${totalOccurences})` : stats == result.raid ? 'Raids' : 'Total';
                let container = allStats.appendChild(Util.createDom('div', {}, '<h2>'+title+'</h2>'));
                let chart = container.appendChild(Util.createDom('div', {'class':'ogl_pie'}));
                let labels = stats == result.expe ? container.appendChild(Util.createDom('div', {'class':'ogl_pieLabel'})) : false;
                let itemContainer = container.appendChild(Util.createDom('div', {'class':'ogl_pieItems'}));

                let piePercent = stats == result.expe ? result.expeOccurences : stats;
                let dataSum = Object.values(piePercent).reduce((a,b) => b>0 ? a+b : a+0, 0);
                let pieStats = Object.values(piePercent).map(x => (1 / (dataSum / x) * 100));
                let gradient = '';
                let sum = 0;
                let colors = ['var(--yellow)', 'var(--dm)', '#577af9', 'var(--red)', 'var(--green)', '#926042', 'gray'];
                if(stats != result.expe) colors = ['var(--metal)', 'var(--crystal)', 'var(--deut)', 'var(--dm)'];

                let itemList = stats == result.expe ? ['metal','crystal','deut','dm',202,203,204,205,206,207,208,209,210,211,213,215,218,219] : ['metal','crystal','deut','dm'];

                itemList.forEach(item =>
                {
                    let box = itemContainer.appendChild(Util.createDom('div', {'class':'ogl_item'}));
                    box.innerHTML = `<div class="ogl_shipIcon ogl_${item}"></div><div class="number ogl_${item}">${Util.formatToUnits(stats[item])}</div>`;
                });

                pieStats.forEach((v, index) =>
                {
                    gradient += `${colors[index]} ${Math.max(sum, 0)||0}%, ${colors[index]} ${Math.max(sum + v, 0)||0}%, `;
                    sum += v;

                    if(index == pieStats.length-1 && (isNaN(sum) || sum < 0)) gradient = '';
                });

                if(stats == result.expe)
                {
                    itemContainer.classList.add('tooltipRight');
                    itemContainer.title = `
                        <div class="ogl_expeditionTooltip">
                            <h3>Expeditions Total</h3>
                            <div class="ogl_shipIcon ogl_metal"></div><div class="ogl_metal">${Util.formatToUnits(result.cumul.metal - result.raid.metal)}</div>
                            <div class="ogl_shipIcon ogl_crystal"></div><div class="ogl_crystal">${Util.formatToUnits(result.cumul.crystal - result.raid.crystal)}</div>
                            <div class="ogl_shipIcon ogl_deut"></div><div class="ogl_deut">${Util.formatToUnits(result.cumul.deut - result.raid.deut)}</div>
                        </div>`;

                    Object.entries(piePercent).forEach((e, index) =>
                    {
                        if(e[0] == 'none') e[0] = 'other';

                        let label = labels.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText(e[0])}</span><span>${Util.formatToUnits(Math.max(0, e[1]))}</span><b>(${Math.max(0, pieStats[index].toFixed(2)) || 0}%)</b>`));
                        label.prepend(Util.createDom('div', {'style':'background:'+colors[index]}));
                    });
                }

                chart.style.background = `conic-gradient(${gradient}#000)`;
            });

            let links = allStats.appendChild(Util.createDom('div', {'class':'ogl_statsLimit'}));
            let timeLimits = this.ogl.component.langManager.getText('timeLimits').split(';');

            [1,7,30,99999999999].forEach(i =>
            {
                let link = links.appendChild(Util.createDom('div', {}, i.toString().replace('1', timeLimits[0]).replace('7', timeLimits[1]).replace('30', timeLimits[2]).replace('99999999999', timeLimits[3])));
                if(i == this.ogl.json.stats.range) link.classList.add('ogl_active');

                link.addEventListener('click', () =>
                {
                    this.ogl.json.stats.range = i;
                    Util.saveData(this.ogl.json);
                    this.displayStats(i);
                    document.querySelectorAll('.ogl_stats .ogl_button')[0].click();
                });
            });

            setTimeout(() => this.ogl.component.popupManager.open(allStats), 500);
        });

        let reset = dom.appendChild(Util.createDom('button', {'class':'ogl_button material-icons tooltip', 'title':this.ogl.component.langManager.getText('eraseData')}, 'delete_sweep'));
        reset.addEventListener('click', () =>
        {
            if(confirm('Do you want to erase stats data ?'))
            {
                delete this.ogl.json.stats;
                Util.saveData(this.ogl.json);
                document.location.reload();
            }
        });

        this.addBlackHole();
    }

    addTimers()
    {
        let now = Date.now();
        let currentCoords = this.ogl.current.coords.join(':');

        if(!this.ogl.json.myActivities[currentCoords]) this.ogl.json.myActivities[currentCoords] = [0, 0];

        let planetActivity = this.ogl.json.myActivities[currentCoords][0];
        let moonActivity = this.ogl.json.myActivities[currentCoords][1];

        if(this.ogl.current.type == 'moon') moonActivity = now;
        else planetActivity = now;

        this.ogl.json.myActivities[currentCoords] = [planetActivity, moonActivity];
        Util.saveData(this.ogl.json);

        if(this.ogl.json.options.togglesOff.indexOf('timers') > -1) return;

        this.ogl.planetList.forEach(planet =>
        {
            let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1);
            let timers = this.ogl.json.myActivities[coords] || [0,0];

            //let pTimer = planet.querySelector('.planetlink').appendChild(Util.createDom('div', {'class':'ogl_timer ogl_medium ogl_short', 'data-timer':Math.min(Math.round((now - timers[0]) / 60000), 60)}));
            let pt =  Math.min(Math.round((now - timers[0]) / 60000), 60);
            let pTimer = planet.querySelector('.planetlink').appendChild(Util.createDom('div', {'class':'ogl_timer ogl_medium ogl_short', 'title':this.ogl.component.langManager.getText('timerInfo'), 'data-timer':pt}));

            this.updateTimer(pTimer, timers[0]);
            setInterval(() => this.updateTimer(pTimer, timers[0]), 20000);

            if(planet.querySelector('.moonlink'))
            {
                //let mTimer = planet.querySelector('.moonlink').appendChild(Util.createDom('div', {'class':'ogl_timer ogl_medium ogl_short', 'data-timer':Math.min(Math.round((now - timers[1]) / 60000), 60)}));
                let mt =  Math.min(Math.round((now - timers[1]) / 60000), 60);
                let mTimer = planet.querySelector('.moonlink').appendChild(Util.createDom('div', {'class':'ogl_timer ogl_medium ogl_short', 'title':this.ogl.component.langManager.getText('timerInfo'), 'data-timer':mt}));

                this.updateTimer(mTimer, timers[1]);
                setInterval(() => this.updateTimer(mTimer, timers[1]), 20000);
            }
        });
    }

    updateTimer(element, timer)
    {
        let time = Math.min(Math.round((Date.now() - timer) / 60000), 60);

        if(time >= 15) element.classList.remove('ogl_short');
        if(time >= 30) element.classList.remove('ogl_medium');
        if(time >= 60) return;

        element.setAttribute('data-timer', time);
        element.title = time;
    }

    checkStorage()
    {
        if(this.ogl.current.type == 'moon') return;

        let storage =
        {
            'metal' : resourcesBar.resources.metal.storage,
            'crystal' : resourcesBar.resources.crystal.storage,
            'deut' : resourcesBar.resources.deuterium.storage,
        };

        ['metal', 'crystal', 'deut'].forEach(res =>
        {
            let data = resourcesBar.resources[res.replace('deut', 'deuterium')].tooltip;
            let prod = data.replace(/\./g, '').match(/\d+/g)[2];
            let timeLeft = prod > 0 ? Math.floor((storage[res] - this.ogl.resources[res]) / prod) || 0 : 0;
            let day = Math.floor(timeLeft / 24);
            let hour = Math.floor(timeLeft % 24);

            let box = document.querySelector(`#${res.replace('deut', 'deuterium')}_box`);
            box.querySelector('.resourceIcon').appendChild(Util.createDom('div', {'class':'ogl_storage'}, `${day}${LocalizationStrings.timeunits.short.day} ${hour}${LocalizationStrings.timeunits.short.hour}`));
        });
    }
}

class PlayerManager
{
    constructor(ogl)
    {
        this.ogl = ogl;
        this.ogl.tooltipList = this.ogl.tooltipList || {};
        this.playerList = {};

        if(Util.getPage() == 'galaxy')
        {
            Util.loop(() =>
            {
                this.stalkPlayers();
                this.checkCurrentGalaxy();
            });
        }
    }

    deleteTarget(galaxy, system, position)
    {
        let coords = `${galaxy}:${system}:${position}`;
        let sideTarget = document.querySelector(`.ogl_sideView div[data-galaxy="${galaxy}"][data-system="${system}"][data-position="${position}"]`);

        if(this.ogl.json.options.currentTarget == coords) this.ogl.json.options.currentTarget = null;
        sideTarget && sideTarget.remove();
        delete this.ogl.json.stalkList[coords];
        Util.saveData(this.ogl.json);
    }

    stalkPlayers()
    {
        document.querySelectorAll('#galaxytable tbody tr:not(.ogl_ready)').forEach(line =>
        {
            line.classList.add('ogl_ready');
            if(!line.querySelector('.position')) return;

            this.ogl.component.tooltipManager.close();

            let player = {};
            let position = line.querySelector('.position').textContent;
            let coords = `${galaxy}:${system}:${position}`;

            if(line.querySelector('.playername').textContent.trim().length == 0)
            {
                if(this.ogl.json.stalkList[coords])
                {
                    this.deleteTarget(galaxy, system, position);
                }
                return;
            }

            if(!line.querySelector('.playername a') && !line.querySelector('.playername span[class^="status_abbr"]')) return;
            else if(!line.querySelector('.playername a') && this.ogl.playerName.indexOf(line.querySelector('.playername span[class^="status_abbr"]').textContent.trim().replace('...', '')) == 0)
            {
                player.id = this.ogl.playerID;

                if(!this.playerList[player.id])
                {
                    let highscore = document.querySelector('#bar a[href$="page=highscore"]');
    
                    this.ogl.tooltipList['#player' + player.id] = Util.createDom('div', {'class':'htmlTooltip galaxyTooltip'});
                    this.ogl.tooltipList['#player' + player.id].innerHTML = `
                        <h1>
                            <span class="status_abbr_active">${document.querySelector('#bar a[href$="changenick"]').textContent}</span>
                        </h1>
                        <ul class="ListLinks">
                            <li class="rank"><a href="${highscore.getAttribute('href')}">${highscore.parentNode.textContent.match(/\d+/g)[0]}</a></li>
                        </ul>
                    `;
                }

                line.querySelector('.playername').innerHTML = `<a href="javascript:void(0);" class="tooltipRel tooltipClose tooltipRight js_hideTipOnMobile">${line.querySelector('.playername').innerHTML}</a>`;
                line.querySelector('.playername a').setAttribute('rel', 'player' + player.id);
            }
            else if(line.querySelector('.playername a')) player.id = line.querySelector('.playername a').getAttribute('rel').replace('player', '');
            else player.id = -1;

            if(line.querySelector('.playername').textContent.trim().length == 0) return;
            line.setAttribute('data-player', player.id);

            if(this.ogl.json.stalkList[coords] && this.ogl.json.stalkList[coords].player == -1)
            {
                this.ogl.json.stalkList[coords].player = player.id;
                this.ogl.json.stalkList[coords].id = line.querySelector('td[data-planet-id]').getAttribute('data-planet-id');
                Util.saveData(this.ogl.json);
            }

            if(this.ogl.json.stalkList[coords] && this.ogl.json.stalkList[coords].player != player.id && this.ogl.json.stalkList[coords].player != -1)
            {
                this.deleteTarget(galaxy, system, position);
            }

            if(this.playerList[player.id])
            {
                player = this.playerList[player.id];
            }
            else
            {
                this.playerList[player.id] = player;

                if(line.querySelector('.playername.admin')) return;
                if(!this.ogl.tooltipList['#player' + player.id] && !document.querySelector('#player' + player.id)) return;

                player.tooltip = this.ogl.tooltipList['#player' + player.id] || document.querySelector('#player' + player.id);
                player.name = player.tooltip.querySelector('h1 span').textContent;
                player.ranking = player.tooltip.querySelector('.rank a') || player.tooltip.querySelector('.ogl_ranking a') || Util.createDom('s', {}, '(b)');
                player.write = player.tooltip.querySelector('a[href*="page=chat"]') || player.tooltip.querySelector('a.sendMail');
                player.buddy = player.tooltip.querySelector('a[href*="component=buddies"]');
                player.ignore = player.tooltip.querySelector('a[href*="page=ignorelist"]');
                player.status = line.querySelector('.status');
                player.color = (player.status.querySelector('span') || Util.createDom('span')).getAttribute('class');
                player.planets = {};

                Util.loadPageContent(`https://${window.location.host}/api/playerData.xml?id=${player.id}`, 'text/xml', result =>
                {
                    player.update = parseInt(result.querySelector('playerData').getAttribute('timestamp'));
                    player.total = parseInt(result.querySelector('position[type="0"]').getAttribute('score'));
                    player.eco = parseInt(result.querySelector('position[type="1"]').getAttribute('score'));
                    player.tech = parseInt(result.querySelector('position[type="2"]').getAttribute('score'));
                    player.power = parseInt(result.querySelector('position[type="3"]').getAttribute('score'));
                    player.def = Math.max(player.power - (player.total - player.eco - player.tech), 0);
                    player.fleet = player.power - player.def;

                    let planetList = this.ogl.component.planetManager.buildPlanetList(result);

                    this.ogl.tooltipList['#player' + player.id] = this.ogl.tooltipList['#player' + player.id] || document.querySelector('#player' + player.id);

                    this.ogl.tooltipList['#player' + player.id].classList.add('ogl_stalk');
                    this.ogl.tooltipList['#player' + player.id].innerHTML = `
                        <h1><span class="${player.color}">${player.name}</span><span class="ogl_ranking">#${player.ranking.outerHTML}</span></h1>
                        <div class="ogl_actions"></div>
                        <div class="splitLine"></div>
                        <div class="ogl_stalkInfo">
                            <div class="ogl_stalkPoints">
                                <div title="${Util.formatNumber(player.total)}"><i class="material-icons">star</i>${Util.formatToUnits(player.total)}</div>
                                <div title="${Util.formatNumber(player.eco)}"><i class="material-icons">attach_money</i>${Util.formatToUnits(player.eco)}</div>
                                <div title="${Util.formatNumber(player.tech)}"><i class="material-icons">science</i>${Util.formatToUnits(player.tech)}</div>
                                <div title="${Util.formatNumber(player.fleet)}"><i class="material-icons">military_tech</i>${Util.formatToUnits(player.fleet)}</div>
                                <div title="${Util.formatNumber(player.def)}"><i class="material-icons">security</i>${Util.formatToUnits(player.def)}</div>
                            </div>
                        </div>
                        <div class="splitLine"></div>
                        <div class="ogl_colorAll"></div>
                    `;

                    let container = this.ogl.tooltipList['#player' + player.id].querySelector('.ogl_stalkInfo').appendChild(Util.createDom('div', {'class':'ogl_stalkPlanets'}));
                    this.ogl.tooltipList['#player' + player.id].appendChild(Util.createDom('div', {'class':'splitLine'}));
                    this.ogl.tooltipList['#player' + player.id].appendChild(Util.createDom('div', {'class':'float_right'}, `<div>${new Date(player.update * 1000).toLocaleDateString('fr-FR')}</div>`));
                    this.ogl.tooltipList['#player' + player.id].appendChild(Util.createDom('div', {'class':'float_left'}, `<div>${planetList.length} ${this.ogl.component.langManager.getText('planets')}</div>`));

                    let actions = this.ogl.tooltipList['#player' + player.id].querySelector('.ogl_actions');

                    let iconList = ['person_add_alt_1', 'block', 'create']
                    let actionList = [player.buddy, player.ignore, player.write];

                    if(iconList.length > 0)
                    {
                        actionList.forEach((button, index) =>
                        {
                            if(button)
                            {
                                button.textContent = iconList[index];
                                actions.appendChild(button);
                            }
                            else actions.appendChild(Util.createDom('div', {'class':'ogl_invisible'}));
                        });
                    }

                    let lockButton = actions.appendChild(Util.createDom('div', {'class':'material-icons ogl_pin'}, 'push_pin'));
                    lockButton.addEventListener('click', () =>
                    {
                        this.ogl.json.options.pinned = player;
                        Util.saveData(this.ogl.json);

                        this.ogl.component.sideViewManager.checkPinnedContent();
                    });

                    let stats = actions.appendChild(Util.createDom('a', {'class':'material-icons ogl_mmorpgstats'}, 'leaderboard'));
                    stats.addEventListener('click', () =>
                    {
                        let lang = ['fr', 'de', 'en', 'es', 'pl', 'it', 'ru', 'ar', 'mx', 'tr', 'fi', 'tw', 'gr', 'br', 'nl',
                        'hr', 'sk', 'cz', 'ro', 'us', 'pt', 'dk', 'no', 'se', 'si', 'hu', 'jp', 'ba'].indexOf(this.ogl.lang);

                        let link = `https://www.mmorpg-stat.eu/0_fiche_joueur.php?pays=${lang}&ftr=${player.id.replace(/\D/g,'')}.dat&univers=_${this.ogl.universeNumber}`;
                        window.open(link, '_blank');
                    });

                    let sendProbes = (event, planet, type) =>
                    {
                        event.stopPropagation();
                        event.preventDefault();
                        this.ogl.component.fleetManager.sendSpyProbe([planet.galaxy, planet.system, planet.position, type], this.ogl.json.spyProbesCount, event.target);
                    };

                    planetList.forEach(planet =>
                    {
                        let div = container.appendChild(Util.createDom('div', {'data-coords':planet.coords}));
                        div.appendChild(Util.createDom('span', {}, planet.coords));
                        let mSpy = div.appendChild(Util.createDom('div', {'class':'ogl_moonIcon material-icons', 'data-type':3}, 'brightness_2'));
                        let pSpy = div.appendChild(Util.createDom('div', {'class':'ogl_planetIcon material-icons', 'data-type':1}, 'language'));

                        pSpy.addEventListener('click', event => sendProbes(event, planet, 1));
                        mSpy.addEventListener('click', event => sendProbes(event, planet, 3));

                        if(planet.main) div.appendChild(Util.createDom('span', {'class':'ogl_mainPlanet material-icons'}, 'star'));
                        if(planet.moon) mSpy.classList.add('ogl_active');

                        if(this.ogl.json.stalkList[planet.coords]) div.setAttribute('data-color', this.ogl.json.stalkList[planet.coords].color);
                        else div.removeAttribute('data-color');

                        div.addEventListener('click', () =>
                        {
                            this.ogl.component.tooltipManager.close();
                            this.ogl.component.planetManager.goToPosition(planet.galaxy, planet.system, planet.position);
                        });

                        player.planets[planet.coords] = planet;
                    });

                    let colors = this.ogl.tooltipList['#player' + player.id].querySelector('.ogl_colorAll');

                    ['red', 'halfred', 'yellow', 'halfyellow', 'green', 'halfgreen', 'blue', 'halfblue', 'violet', 'halfviolet', 'gray', 'none'].forEach(color =>
                    {
                        let colorAll = colors.appendChild(Util.createDom('div', {'data-color':color}));
                        if(color == 'none') colorAll.textContent = 'clear';
                        colorAll.addEventListener('click', () =>
                        {
                            this.ogl.component.planetManager.colorizeAllPlanets(player.id, planetList, color);
                            document.querySelectorAll(`tr[data-player="${player.id}"]`).forEach(tr => tr.classList.remove('ogl_ready'));
                            delete this.playerList[player.id];
                        });
                    });

                    this.playerList[player.id] = player;
                });
            }

            if(!player.ranking) return;

            if(!line.querySelector('.playername .float_right'))
            {
                let div = line.querySelector('.playername').appendChild(Util.createDom('div', {'class':'float_right'}));
                div.innerHTML = `#${player.ranking.outerHTML}`;
            }

            let planetID = line.querySelector('td[data-planet-id]') ? line.querySelector('td[data-planet-id]').getAttribute('data-planet-id') : 0;

            if(this.ogl.json.stalkList[coords]) line.setAttribute('data-color', this.ogl.json.stalkList[coords].color);
            else line.removeAttribute('data-color');

            this.ogl.component.planetManager.buildColorPicker(line.querySelector('.allytag'), {player:player.id, planet:planetID, coords:coords});
        
            let pinnedPosition = document.querySelector(`.ogl_pinnedContent div[data-coords="${coords}"]`);
            if(pinnedPosition)
            {
                let pActivityDom = line.querySelector('td[data-planet-id] .activity') || Util.createDom('div');
                let mActivitydom = line.querySelector('.moon .activity') || Util.createDom('div', {}, '60');

                let pActivity = pActivityDom.classList.contains('minute15') ? '*' : parseInt(pActivityDom.textContent.trim() || 60);
                let mActivity = mActivitydom.classList.contains('minute15') ? '*' : parseInt(mActivitydom.textContent.trim() || 60);

                this.ogl.json.options.pinned.planets[coords].activity = pActivity;
                if(this.ogl.json.options.pinned.planets[coords].moon) this.ogl.json.options.pinned.planets[coords].moon.activity = mActivity;

                Util.saveData(this.ogl.json);

                let pActivityDiv = pinnedPosition.querySelector('.ogl_planetActivity');
                let mActivityDiv = pinnedPosition.querySelector('.ogl_moonActivity');

                if(pActivityDiv)
                {
                    pActivityDiv.textContent = pActivity;
                    pActivityDiv.className = 'ogl_planetActivity';
                    if(pActivity == '*') pActivityDiv.classList.add('ogl_short');
                }

                if(mActivityDiv)
                {
                    mActivityDiv.textContent = mActivity;
                    mActivityDiv.className = 'ogl_moonActivity';
                    if(mActivity == '*') mActivityDiv.classList.add('ogl_short');
                }
            }
        });
    }

    checkCurrentGalaxy()
    {
        document.querySelectorAll('.ogl_stalkPlanets [data-coords]').forEach(planet =>
        {
            let coords = planet.getAttribute('data-coords').split(':');
            if(coords[0] == galaxy && coords[1] == system)
            {
                planet.classList.add('ogl_active');
            }
            else
            {
                planet.classList.remove('ogl_active');
            }
        });
        
        if(!this.spyProbeCountDone && document.querySelector('a[onclick*="sendShips"]'))
        {
            let ships = document.querySelector('a[onclick*="sendShips"]').getAttribute('onclick').match(/\d+/g).map(Number);
            if(ships[0] == 6)
            {
                this.ogl.json.spyProbesCount = ships[5];
                this.spyProbeCountDone = true;
                Util.saveData(this.ogl.json);
            }
        }
    }
}

class TimeManager
{
    constructor(ogl)
    {
        this.ogl = ogl;
        this.currentDetail;

        this.checkCurrentBuilding()

        Util.loop(() =>
        {
            let list = [];
            list.push({domElement:document.querySelectorAll('#bar ul li.OGameClock, #arrivalTime, #returnTime'), observe:true});
            list.push({domElement:document.querySelectorAll('.msg_date, .eventFleet .arrivalTime, .fleetDetails .absTime, .fleetDetails .nextabsTime')});

            list.forEach(domList =>
            {
                domList.domElement.forEach(element =>
                {
                    if(!element.classList.contains('ogl_ready'))
                    {
                        element.classList.add('ogl_ready');
                        this.updateTime(element);
                        if(domList.observe) this.observe(element);
                    }
                });
            });
        });

        let pages = ['supplies', 'facilities', 'shipyard', 'defenses', 'research'];
        if(pages.indexOf(Util.getPage()) > -1) this.checkDetail();
    }

    observe(target)
    {
        let observer = new MutationObserver(() => this.updateTime(target));
        observer.observe(target, {childList:true});
    }

    updateTime(domElement)
    {
        domElement.classList.add('ogl_hiddenContent');
        domElement.classList.add('ogl_timeZone');
        domElement.setAttribute('title', domElement.innerHTML);

        let time = domElement.textContent;
        let newTime;
        let timeMode = false;

        if(!time) return;

        time = time.replace(/ \.$/, '');
        time = time.trim().replace(/[ \.]/g, ':');
        time = time.split(':');

        if(time.length <= 5)
        {
            timeMode = true;
            time = ["01","01","2000"].concat(time);
        }
        
        time.forEach((t, index) => time[index] = t.padStart(2, '0'));
        if(time[2].length == 2) time[2] = '20' + time[2];

        newTime = new Date(`${time[2]}-${time[1]}-${time[0]}T${time[3]}:${time[4]}:${time[5]}`).getTime();
        newTime = new Date(newTime - Math.round(timeDiff / 100000) * 100000);

        domElement.setAttribute('data-timestamp', newTime.getTime());

        if(timeMode)
        {
            domElement.setAttribute('data-timezone', newTime.toLocaleTimeString('fr-FR'));
        }
        else
        {
            domElement.classList.add('ogl_fulldate');
            domElement.setAttribute('data-datezone', `${newTime.toLocaleDateString('fr-FR').replace(/\//g, '.')} `);
            domElement.setAttribute('data-timezone', ` ${newTime.toLocaleTimeString('fr-FR')}`);
        }
    }

    checkCurrentBuilding()
    {
        let countDownID = ['buildingCountdown', 'researchCountdown', 'shipyardCountdown2'];
        ['restTimebuilding', 'restTimeresearch', 'restTimeship2'].forEach((building, index) =>
        {
            try
            {
                let time = new Date(localTime.getTime() + eval(building) * 1000);
                let parent = document.querySelector(`span#${countDownID[index]}`).closest('.content');
                let div =  parent.appendChild(Util.createDom('div', {'class':'ogl_endTime'}));
                div.innerHTML = `${time.toLocaleDateString('fr-FR').replace(/\//g, '.')} <span>${time.toLocaleTimeString('fr-FR')}</span>`;
            }
            catch(e){}
        });
    }

    updateBuildTime(totalTime, domTime)
    {
        let seconds = totalTime;
        let d = Math.floor(seconds / (3600*24));
        let h = Math.floor(seconds % (3600*24) / 3600);
        let m = Math.floor(seconds % 3600 / 60);
        let s = Math.floor(seconds % 60);

        domTime.textContent = '';
        if(d > 0) domTime.textContent += `${d}${LocalizationStrings.timeunits.short.day} `;
        if(h > 0) domTime.textContent += `${h}${LocalizationStrings.timeunits.short.hour} `;
        if(m > 0) domTime.textContent += `${m}${LocalizationStrings.timeunits.short.minute} `;
        if(s > 0) domTime.textContent += `${s}${LocalizationStrings.timeunits.short.second}`;
    }

    checkDetail()
    {
        Util.updateCheckIntInput(() => check());

        let check = () =>
        {
            let detail = this.currentDetail;
            detail && detail.querySelector('.costs li') && detail.querySelectorAll('.costs li').forEach(res =>
            {
                let amount = Math.max(parseInt(detail.querySelector('#build_amount').value), 1) || 1;
                let resValue = res.getAttribute('data-value') * amount;
                let domTime = detail.querySelector('.build_duration time');

                let baseTime = domTime.getAttribute('datetime').replace('PT', '').replace('P', '');

                let totalTime = 0;
                let indexArr = baseTime.match(/\D+/g).map(String);
                let valueArr = baseTime.match(/\d+/g).map(Number);

                valueArr.forEach((value, index) =>
                {
                    if(indexArr[index] == "DT") totalTime += value * 86400;
                    if(indexArr[index] == "H") totalTime += value * 3600;
                    if(indexArr[index] == "M") totalTime += value * 60;
                    if(indexArr[index] == "S") totalTime += value;
                });

                this.updateBuildTime(totalTime * amount, domTime);

                if((res.classList.contains('metal') && this.ogl.resources.metal >= resValue)
                || (res.classList.contains('crystal') && this.ogl.resources.crystal >= resValue)
                || (res.classList.contains('deuterium') && this.ogl.resources.deut >= resValue))
                {
                    res.classList.add('ogl_active');
                    res.classList.remove('ogl_noMoney');
                }
                else
                {
                    res.classList.remove('ogl_active');
                    res.classList.add('ogl_noMoney');
                }

                if(!isNaN(resValue))
                {
                    let techID =  parseInt(detail.getAttribute('data-technology-id'));
                    if(techID == 212)
                    {
                        let bonus = detail.querySelector('.energy_production span.bonus');
                        let bonusScaled = parseInt(bonus.getAttribute('data-value')) * amount;
                        bonus.textContent = `(+${Util.formatNumber(bonusScaled)})`;
                    }

                    res.setAttribute('data-total', resValue);
                    res.textContent = Util.formatToUnits(resValue);
                }
            });
        }

        Util.loop(() =>
        {
            let detail = document.querySelector('#technologydetails');

            if(detail)
            {
                this.currentDetail = detail;
                let techID = parseInt(detail.getAttribute('data-technology-id'));
                let li = detail.querySelector('.ogl_endTime') || detail.querySelector('.build_duration').appendChild(Util.createDom('div', {'class':'ogl_endTime'}));
                let domTime = detail.querySelector('.build_duration time');
                let baseTime = domTime.getAttribute('datetime').replace('PT', '').replace('P', '');
                let levelTime;

                let totalTime = 0;
                let offset = 0;
                let indexArr = baseTime.match(/\D+/g).map(String);
                let valueArr = baseTime.match(/\d+/g).map(Number);

                if(!detail.querySelector('.ogl_energyLeft'))
                {
                    let energy = detail.querySelector('.additional_energy_consumption span');
                    let energyLeft = !energy ? 0 : parseInt(document.querySelector('#resources_energy').getAttribute('data-raw')) - parseInt(energy.getAttribute('data-value'));    
                    energyLeft && energy.parentNode.appendChild(Util.createDom('span', {'class':`ogl_energyLeft ${energyLeft > 0 ? 'ogl_ok' : 'ogl_danger'}`}, ' ('+Util.formatNumber(energyLeft)+')'));
                }

                valueArr.forEach((value, index) =>
                {
                    if(indexArr[index] == "DT") totalTime += value * 86400;
                    if(indexArr[index] == "H") totalTime += value * 3600;
                    if(indexArr[index] == "M") totalTime += value * 60;
                    if(indexArr[index] == "S") totalTime += value;
                });

                if(techID < 100 && typeof restTimebuilding !== 'undefined') offset = restTimebuilding;
                else if(techID < 200 && typeof restTimeresearch !== 'undefined') offset = restTimeresearch;
                else if(techID < 300 && typeof restTimeship2 !== 'undefined') offset = restTimeship2;

                let domLevel = detail.querySelector('.information .level');
                if(domLevel)
                {
                    let ratio = parseFloat(domLevel.getAttribute('data-ratio'));
                    let step = parseInt(domLevel.getAttribute('data-step'));
                    levelTime = (!isNaN(step) && !isNaN(ratio)) ? Math.pow(ratio, step) : 1;
                }

                let amount = detail.querySelector('#build_amount') ? parseInt(detail.querySelector('#build_amount').value) || 1 : levelTime;
                let time = new Date(localTime.getTime() + offset * 1000 + totalTime * amount * 1000);
                li.innerHTML = `${time.toLocaleDateString('fr-FR').replace(/\//g, '.')} <span>${time.toLocaleTimeString('fr-FR')}</span>`;

                if(domLevel)
                {
                    this.updateBuildTime(totalTime * amount, domTime);
                }

                if(!detail.classList.contains('ogl_ready') && detail.querySelector('#build_amount'))
                {
                    detail.classList.add('ogl_ready');
                    detail.querySelector('#build_amount').addEventListener('focus', () => setTimeout(check(detail), 500));
                    detail.querySelector('.build_amount .maximum') && detail.querySelector('.build_amount .maximum').addEventListener('click', () => setTimeout(() => check(detail), 100));
                }
            }
        });
    }
}

class MessageManager
{
    constructor(ogl)
    {
        this.ogl = ogl;
        this.spyTable;
        this.dataList = [];
        this.tableReady = false;

        if(Util.getPage() == 'messages')
        {
            Util.loadPageContent(`https://${window.location.host}/game/index.php?page=componentOnly&component=fleetdispatch&ajax=1`, 'text/html', result =>
            {
                document.head.appendChild(Util.createDom('script', {}, result.querySelector('#fleetdispatch > script').textContent.split('var expeditionCount')[0]));
                shipsOnPlanet.forEach(ship =>
                {
                    if(ship.id == this.ogl.json.options.defaultShip) this.availableShips = ship.number;
                });

                Util.loop(() => this.checkCurrentTab());
            });

            Util.loop(() =>
            {
                if(!document.querySelector('#tabs-nfFleets[tabindex="0"]')) return;

                let detail = document.querySelector('.detail_msg');

                if(detail && detail.getAttribute('data-message-type') == 10 && !detail.classList.contains('ogl_detailReady'))
                {
                    detail.classList.add('ogl_detailReady');

                    let apiKey = Util.createDom('div', {});
                    //apiKey.innerHTML = detail.querySelector('.icon_apikey').getAttribute('data-tooltip') || detail.querySelector('.icon_apikey').getAttribute('title');
                    apiKey.innerHTML = detail.querySelector('.icon_apikey').getAttribute('title');
                    apiKey = apiKey.querySelector('input').value;

                    let simButton = detail.querySelector('.msg_actions').appendChild(Util.createDom('div', {'class':'icon_nf ogl_sim'}, 'S'));
                    simButton.addEventListener('click', () => window.open(Util.genTrashsimLink(apiKey, this.ogl), '_blank'));
                }
            });
        }
    }

    cleanString(str)
    {
        ['.', '(', ')', ':'].forEach(car => str = str.replace(new RegExp('\\'+car, 'g'), ''));
        return str;
    }

    getExpeValue(locaAttr, message)
    {
        let regex = new RegExp(this.cleanString(locaAttr)+' (\\d+)', 'g');
        return parseInt(regex.exec(this.cleanString(message.innerHTML))[1]);
    }

    checkCurrentTab()
    {
        if(document.querySelector('#tabs-nfFleets.ui-state-active') && document.querySelector('#subtabs-nfFleet20.ui-state-active'))
        {
            this.checkReports();
            this.spyTable && this.spyTable.classList.remove('ogl_hidden');
            document.querySelector('#subtabs-nfFleetTrash .ogl_trash') && document.querySelector('#subtabs-nfFleetTrash .ogl_trash').classList.remove('ogl_hidden');
        }
        else
        {
            this.spyTable && this.spyTable.classList.add('ogl_hidden');
            document.querySelector('#subtabs-nfFleetTrash .ogl_trash') && document.querySelector('#subtabs-nfFleetTrash .ogl_trash').classList.add('ogl_hidden');
        }

        if(this.spyTable && !this.spyTable.classList.contains('ogl_hidden'))
        {
            document.querySelector('.ogl_key.material-icons') && document.querySelector('.ogl_key.material-icons').classList.remove('ogl_hidden');
        }
        else
        {
            document.querySelector('.ogl_key.material-icons') && document.querySelector('.ogl_key.material-icons').classList.add('ogl_hidden');
        }

        if(document.querySelector('#tabs-nfFleets.ui-state-active') && document.querySelector('#subtabs-nfFleet21.ui-state-active')) this.checkRaid();
        else if(document.querySelector('#tabs-nfFleets.ui-state-active') && document.querySelector('#subtabs-nfFleet22.ui-state-active')) this.checkExpeditions();
        else if(document.querySelector('#tabs-nfFleets.ui-state-active') && document.querySelector('#subtabs-nfFleet24.ui-state-active')) this.checkDebris();
    }

    checkReports()
    {
        if(document.querySelector('#subtabs-nfFleetTrash.ui-state-active') || this.ogl.json.options.togglesOff.indexOf('spytable') > -1) return;

        if(!document.querySelector('#subtabs-nfFleetTrash .ogl_trash'))
        {
            let deleteSpyDef = document.querySelector('#subtabs-nfFleetTrash').appendChild(Util.createDom('div', {'class':'icon icon_trash ogl_trash tooltip', 'title':this.ogl.component.langManager.getText('deleteSpyDef')}));
            deleteSpyDef.addEventListener('click', () =>
            {
                document.querySelectorAll('.msg').forEach(e =>
                {
                    if(e.querySelector('.espionageDefText')) e.querySelector('.icon_refuse').click();
                });
            });    
        }

        let messages = document.querySelectorAll('.msg:not(.ogl_ready)');

        if(messages.length > 0) this.dataList = [];

        messages.forEach((report, index) =>
        {
            if(!report.querySelector('.ogl_timeZone')) return;
            report.classList.add('ogl_ready');

            let params = new URLSearchParams(report.querySelector('.msg_head a').href);
            let compacting = report.querySelectorAll('.compacting');

            if(compacting.length > 0)
            {
                let data = {};
                data.id = report.getAttribute('data-msg-id');
                data.date = report.querySelector('.msg_date').getAttribute('data-timestamp');
                data.status = compacting[0].querySelectorAll('span[class^="status"]')[0].className;
                data.name = compacting[0].querySelectorAll('span[class^="status"]')[0].textContent.replace(/&nbsp;/g,'').trim();
                data.coords = [params.get('galaxy'), params.get('system'), params.get('position')];
                data.tmpCoords = data.coords.map(x => x.padStart(3, '0')).join('');
                data.type = report.querySelector('.msg_head figure.moon') ? 3 : 1;
                data.color = (this.ogl.json.stalkList[data.coords.join(':')] || {}).color;
                data.activity = compacting[0].querySelectorAll('span.fright')[0].textContent ? parseInt(compacting[0].querySelectorAll('span.fright')[0].textContent.match(/\d+/)[0]) : -1;
                data.resources =
                [
                    Util.formatFromUnits(compacting[2].querySelectorAll('.resspan')[0].textContent.replace(/(\D*)/, '')),
                    Util.formatFromUnits(compacting[2].querySelectorAll('.resspan')[1].textContent.replace(/(\D*)/, '')),
                    Util.formatFromUnits(compacting[2].querySelectorAll('.resspan')[2].textContent.replace(/(\D*)/, '')),
                ];
                data.total = data.resources.reduce((sum, x) => sum + x);
                data.loot = parseInt(compacting[3].querySelector('.ctn').textContent.replace(/(\D*)/, '').replace(/%/, '')) / 100;
                data.renta = Math.ceil(data.total * data.loot);
                data.fleet = compacting[4].querySelectorAll('span').length > 0 ? Util.formatFromUnits(compacting[4].querySelectorAll('span.ctn')[0].textContent.replace(/(\D*)/, '').split(' ')[0]) : -1;
                data.defense = compacting[4].querySelectorAll('span').length > 1 ? Util.formatFromUnits(compacting[4].querySelectorAll('span.ctn')[1].textContent.replace(/(\D*)/, '').split(' ')[0]) : -1;
                data.attacked = report.querySelector('.msg_actions .icon_attack img') ? true : false;
                data.trash = report.querySelector('.msg_head .fright a .icon_refuse');
                data.detail = report.querySelector('.msg_actions a.fright').href;
                data.spy = report.querySelector('a[onclick*="sendShipsWithPopup"]').getAttribute('onclick');
                data.api = report.querySelector('.icon_apikey');
                data.dom = report;

                if(this.ogl.json.options.togglesOff.indexOf('autoclean') == -1 && data.renta < this.ogl.json.options.rval && data.fleet == 0)
                {
                    data.trash.click();
                }
                else
                {
                    this.dataList.push(data);
                }
            }

            if(index == messages.length-1) this.tableReady = true;
        });

        if(this.tableReady && this.dataList.length > 0) this.buildSpyTable();
        requestAnimationFrame(() => this.checkReports());
    }

    buildSpyTable()
    {
        this.tableReady = false;

        this.dataList.sort((a, b) =>
        {
            if(this.ogl.json.options.spyFilter == "$") return b.renta - a.renta;
            else if(this.ogl.json.options.spyFilter == "COORDS") return a.tmpCoords - b.tmpCoords;
            else if(this.ogl.json.options.spyFilter == "FLEET") return b.fleet - a.fleet;
            else if(this.ogl.json.options.spyFilter == "DEF") return b.defense - a.defense;
            else if(this.ogl.json.options.spyFilter == "DATE") return b.date - a.date;
            else if(this.ogl.json.options.spyFilter == "R_$") return a.renta - b.renta;
            else if(this.ogl.json.options.spyFilter == "R_COORDS") return b.tmpCoords - a.tmpCoords;
            else if(this.ogl.json.options.spyFilter == "R_FLEET") return a.fleet - b.fleet;
            else if(this.ogl.json.options.spyFilter == "R_DEF") return a.defense - b.defense;
            else if(this.ogl.json.options.spyFilter == "R_DATE") return a.date - b.date;
        });

        if(!this.spyTable)
        {
            this.spyTable = Util.createDom('table', {'class':'ogl_spyTable'});
            document.querySelector('ul.subtabs').after(this.spyTable);
        }
        else
        {
            this.spyTable.textContent = '';
        }

        let header = this.spyTable.appendChild(Util.createDom('tr'));
        header.appendChild(Util.createDom('th', {}, '#'));
        header.appendChild(Util.createDom('th', {'data-filter':'DATE'}, 'date'));
        header.appendChild(Util.createDom('th', {'data-filter':'COORDS'}, 'coords'));
        header.appendChild(Util.createDom('th', {}, 'type'));
        header.appendChild(Util.createDom('th', {}, 'name'));
        header.appendChild(Util.createDom('th', {'data-filter':'$'}, 'renta'));
        header.appendChild(Util.createDom('th', {'data-filter':'FLEET'}, 'fleet'));
        header.appendChild(Util.createDom('th', {'data-filter':'DEF'}, 'def'));
        header.appendChild(Util.createDom('th', {'class':'ogl_shipIcon ogl_'+this.ogl.json.options.defaultShip}));
        //header.appendChild(Util.createDom('th', {}, this.ogl.component.langManager.getText('abbr'+this.ogl.json.options.defaultShip)));
        /*header.appendChild(Util.createDom('th', {}, 'ships'));
        header.appendChild(Util.createDom('th', {}, 'ships'));
        if(this.ogl.json.shipCapacity[210]) header.appendChild(Util.createDom('th', {}, 'ships'));*/
        header.appendChild(Util.createDom('th', {}, ''));
        header.appendChild(Util.createDom('th', {}, ''));

        header.querySelectorAll('th[data-filter]').forEach(filter =>
        {
            if(this.ogl.json.options.spyFilter.indexOf(filter.getAttribute('data-filter')) > -1) filter.classList.add('ogl_active');
            filter.addEventListener('click', () =>
            {
                this.ogl.json.options.spyFilter = this.ogl.json.options.spyFilter.indexOf('R_') > -1 ? filter.getAttribute('data-filter') : 'R_'+filter.getAttribute('data-filter');
                Util.saveData(this.ogl.json);

                this.spyTable.remove();
                this.spyTable = false;
                document.querySelectorAll('.msg.ogl_ready').forEach(e => e.classList.remove('.ogl_ready'));
                this.buildSpyTable();
            });
        });

        let sum = 0;

        this.dataList.forEach((report, index) =>
        {
            let content = this.spyTable.appendChild(Util.createDom('tr', {'data-coords':report.coords.join(':'), 'data-color':report.color}));
            if(report.attacked) content.classList.add('ogl_attacked');
            if(report.fleet || report.defense) content.classList.add('ogl_notGray');

            // index
            let indexContent = content.appendChild(Util.createDom('td'));
            indexContent.appendChild(Util.createDom('div'));

            // date
            let deltaDate =  Date.now() - report.date;
            let dateContent = content.appendChild(Util.createDom('td', {'class':'ogl_reportDate'}));
            let date = dateContent.appendChild(Util.createDom('div'));

            if(deltaDate < 3600000) date.textContent = (Math.floor(deltaDate / 60000) || '0') + LocalizationStrings.timeunits.short.minute;
            else if(deltaDate < 86400000) date.textContent = (Math.floor(deltaDate / 3600000) || '0') + LocalizationStrings.timeunits.short.hour;
            else date.textContent = (Math.floor(deltaDate / 86400000) || '0') + LocalizationStrings.timeunits.short.day;

            if(report.activity > 0 && report.activity <= 15) date.classList.add('ogl_danger');
            else if(report.activity > 0 && report.activity < 60) date.classList.add('ogl_warning');

            // coords
            let coords = content.appendChild(Util.createDom('td', {'class':'ogl_coords'}));
            coords.appendChild(Util.createDom('a',
            {
                'href': this.ogl.baselink + `?page=ingame&component=galaxy&galaxy=${
                report.coords[0]}&system=${report.coords[1]}&position=${report.coords[2]}`
            }, report.coords.join(':')));

            // type
            let type = content.appendChild(Util.createDom('td', {'class':'ogl_type'}));
            type.appendChild(Util.createDom('div', {'class':'material-icons'}, report.type == 1 ? 'language' : 'brightness_2'))
            if(report.attacked) type.appendChild(Util.createDom('div', {'class':'ogl_inFlight'}));

            // player
            let detail = content.appendChild(Util.createDom('td', {'class':'ogl_name '+report.status}));
            detail.appendChild(Util.createDom('a', {'class':'msg_action_link overlay', 'href':report.detail}, report.name));

            // renta
            let renta = content.appendChild(Util.createDom('td', {'class':'tooltip ogl_renta'}, Util.formatToUnits(report.renta) || '0'));
            let resources = ['metal', 'crystal', 'deut'];
            let resourcesName = [this.ogl.component.langManager.getText('metal'), this.ogl.component.langManager.getText('crystal'), this.ogl.component.langManager.getText('deut')];
            resources.forEach((res, index) =>
            {
                renta.title += `<div>${resourcesName[index]}:&nbsp;<span class="ogl_${resources[index]} float_right">${Util.formatToUnits(report.resources[index])}</span></div>`;
            });

            // fleet
            let fleet = content.appendChild(Util.createDom('td', {}, (Util.formatToUnits(report.fleet, 1) || '0').replace('-1', '?')))
            if(report.fleet) fleet.classList.add('ogl_danger');

            // def
            let def = content.appendChild(Util.createDom('td', {}, (Util.formatToUnits(report.defense, 1) || '0').replace('-1', '?')));
            if(report.defense) def.classList.add('ogl_danger');

            // ships
            let ships;
            let shipList = this.ogl.json.shipCapacity[210] ? [202,203,219,210] : [202,203,219];
            shipList = [this.ogl.json.options.defaultShip];
            shipList.forEach(shipID =>
            {
                let shipsCount = this.ogl.component.fleetManager.calcRequiredShips(shipID, Math.round(report.renta * 1.07)); // 7% more resources
                ships = content.appendChild(Util.createDom('td', {'class':'ogl_shipsLink'}));
                let a = ships.appendChild(Util.createDom('a',
                {
                    'href': this.ogl.baselink + `?page=ingame&component=fleetdispatch&galaxy=${
                    report.coords[0]}&system=${report.coords[1]}&position=${report.coords[2]}&type=${report.type == 3 ? 3 : 1}&mission=1&am${shipID}=${shipsCount}&oglMode=2&oglLazy=true`
                }, Util.formatToUnits(shipsCount, 1)));
                this.availableShips >= shipsCount ? a.classList.add('ogl_ok') : a.classList.add('ogl_danger');
            });
            
            // colors
            this.ogl.component.planetManager.buildColorPicker(content.appendChild(Util.createDom('td', {'class':'ogl_colors'})), {player:report.player, planet:report.planet, coords:report.coords.join(':')});
            
            //actions
            let actions = content.appendChild(Util.createDom('td', {'class':'ogl_reportOptions'}));
            actions.appendChild(Util.createDom('div', {'class':'icon icon_eye', 'onclick':report.spy}));

            let more = actions.appendChild(Util.createDom('div', {'class':'icon icon_fastforward'}));
            more.addEventListener('click', () =>
            {
                if(content.classList.contains('ogl_extended'))
                {
                    content.classList.remove('ogl_extended');
                    content.querySelectorAll('.ogl_added').forEach(e => e.remove());
                }
                else
                {
                    content.classList.add('ogl_extended');
                    let resMax = report.total - report.renta;
    
                    for(let i=0; i<5; i++)
                    {
                        resMax = resMax - Math.ceil(resMax * report.loot);
                        renta.innerHTML += `<div class="ogl_added">${Util.formatToUnits(resMax)}</div>`;

                        let shipID = this.ogl.json.options.defaultShip;
                        let shipsCount = this.ogl.component.fleetManager.calcRequiredShips(shipID, Math.round(resMax * 1.07));

                        ships.appendChild(Util.createDom('a',
                        {
                            'class' : 'ogl_added',
                            'href': this.ogl.baselink + `?page=ingame&component=fleetdispatch&galaxy=${
                            report.coords[0]}&system=${report.coords[1]}&position=${report.coords[2]}&type=${report.type == 3 ? 3 : 1}&mission=1&am${shipID}=${shipsCount}&oglMode=2&oglLazy=true`
                        }, Util.formatToUnits(shipsCount, 1) || '0'));
                    }
                }
            });

            let apiKey = Util.createDom('div', {});
            //apiKey.innerHTML = report.api.getAttribute('data-tooltip') || report.api.getAttribute('title');
            apiKey.innerHTML = report.api.getAttribute('title');
            apiKey = apiKey.querySelector('input').value;

            let simButton = report.dom.querySelector('.msg_actions').appendChild(Util.createDom('div', {'class':'icon_nf ogl_sim'}, 'S'));
            simButton.addEventListener('click', () => window.open(Util.genTrashsimLink(apiKey, this.ogl), '_blank'));

            let trash = actions.appendChild(Util.createDom('div', {'class':'icon icon_trash'}));
            trash.addEventListener('click', () =>
            {
                sum -= report.renta;
                this.calcTotal(sum);
                report.trash.click();
                content.remove();
            });

            sum += report.renta;
        });

        this.calcTotal(sum);
    }

    calcTotal(sum)
    {
        document.querySelector('.ogl_spyTable .ogl_totalSum') && document.querySelector('.ogl_spyTable .ogl_totalSum').remove();
        let total = this.spyTable.appendChild(Util.createDom('tr', {'class':'ogl_totalSum'}));

        total.appendChild(Util.createDom('td', {}, ''));
        total.appendChild(Util.createDom('td', {}, ''));
        total.appendChild(Util.createDom('td', {}, ''));
        total.appendChild(Util.createDom('td', {}, ''));
        total.appendChild(Util.createDom('td', {}, ''));
        total.appendChild(Util.createDom('td', {}, Util.formatToUnits(sum)));
        total.appendChild(Util.createDom('td', {}, ''));
        total.appendChild(Util.createDom('td', {}, ''));
        total.appendChild(Util.createDom('td', {}, ''));
        total.appendChild(Util.createDom('td', {}, ''));
        total.appendChild(Util.createDom('td', {}, ''));
    }

    checkExpeditions()
    {
        document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_expeditionDone)').forEach(message =>
        {
            if(!message.querySelector('.ogl_timeZone')) return;
            message.classList.add('ogl_expeditionDone');

            if(document.querySelector('#subtabs-nfFleetTrash.ui-state-active')) return;

            let id = message.getAttribute('data-msg-id');
            let date = new Date(parseInt(message.querySelector('.msg_date').getAttribute('data-timestamp')));
            let midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0).getTime();
            let type = 'none';
            let typeList = ['metal','crystal','deut','dm',202,203,204,205,206,207,208,209,210,211,213,214,215,217,218,219];

            let result = {};

            typeList.forEach(typeID =>
            {
                if(message.textContent.indexOf(this.ogl.component.langManager.getText(typeID)) > -1)
                {
                    if(!isNaN(typeID)) type = 'ships';
                    else if(typeID == 'metal' || typeID == 'crystal' || typeID == 'deut') type = 'resources';
                    else if(typeID == 'dm') type = 'dm';
                    result[typeID] = this.getExpeValue(this.ogl.component.langManager.getText(typeID), message);
                }
            });

            if(message.querySelector('a.itemLink'))
            {
                type = 'item';
                result.item = 1;
            }

            message.querySelector('.msg_content').prepend(Util.createDom('div', {'class':'ogl_expeResult'}, type));

            this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 };

            if(this.ogl.json.stats[midnight].idList.indexOf(id) == -1)
            {
                this.ogl.json.stats[midnight].idList.push(id);

                for(let [k,v] of Object.entries(result))
                {
                    this.ogl.json.stats[midnight].expe[k] = (this.ogl.json.stats[midnight].expe[k] || 0) + v;
                    this.ogl.json.stats.total.expe[k] = (this.ogl.json.stats.total.expe[k] || 0) + v;
                }

                this.ogl.json.stats[midnight].expeOccurences[type] = (this.ogl.json.stats[midnight].expeOccurences[type] || 0) + 1;
                this.ogl.json.stats.total.expeOccurences[type] = (this.ogl.json.stats.total.expeOccurences[type] || 0) + 1;

                this.ogl.component.empireManager.displayStats(this.ogl.json.stats.range);
            }

            Util.saveData(this.ogl.json);
        });
    }

    checkRaid()
    {
        document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_raidDone)').forEach(message =>
        {
            let content = message.querySelector('.msg_content');

            if(!message.querySelector('.ogl_timeZone') || !content.querySelector('.msg_ctn2')) return;
            message.classList.add('ogl_raidDone');

            if(document.querySelector('#subtabs-nfFleetTrash.ui-state-active')) return;

            let id = message.getAttribute('data-msg-id');
            let date = new Date(parseInt(message.querySelector('.msg_date').getAttribute('data-timestamp')));
            let midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0).getTime();

            let report = {};

            Util.loadPageContent(`https://${window.location.host}/game/index.php?page=messages&messageId=${id}&tabid=21&ajax=1`, 'text/html', result =>
            {
                let htmlReport = result.getElementsByClassName('detail_msg')[0].innerHTML;
                let json = JSON.parse(htmlReport.substring((htmlReport.search("var combatData") + 35),(htmlReport.search("var attackerJson") - 12)));

                let loot = [json.loot.metal, json.loot.crystal, json.loot.deuterium];
                let renta = [0,0,0];
                let loss = [0,0,0];

                let fleetID = [];
                let leftSide = false;

                Object.values(json.attackerJSON.member).forEach(v => { if(v && v.ownerID == this.ogl.playerID) fleetID.push(v.fleetID) });
                if(fleetID.length > 0) leftSide = true;

                Object.values(json.defenderJSON.member).forEach(v => { if(v && v.ownerID == this.ogl.playerID) fleetID.push(v.fleetID) });

                let atkRounds = json.attackerJSON.combatRounds;
                let defRounds = json.defenderJSON.combatRounds;

                fleetID.forEach(fleet =>
                {
                    if(defRounds[defRounds.length-1].losses && defRounds[defRounds.length-1].losses[fleet])
                    {
                        for(let [k,v] of Object.entries(defRounds[defRounds.length-1].losses[fleet]))
                        {
                            let lossValue = this.ogl.shipCost[k].map(x => x * v);
                            loss = loss.map((x, i) => parseInt(x) + parseInt(lossValue[i]));
                        }
                    }

                    if(atkRounds[atkRounds.length-1].losses && atkRounds[atkRounds.length-1].losses[fleet])
                    {
                        for(let [k,v] of Object.entries(atkRounds[atkRounds.length-1].losses[fleet]))
                        {
                            let lossValue = this.ogl.shipCost[k].map(x => x * v);
                            loss = loss.map((x, i) => parseInt(x) + parseInt(lossValue[i]));
                        }
                    }
                });

                if(json.defender[0] && json.defender[0].ownerID == this.ogl.playerID)
                {
                    for(let [k,v] of Object.entries(json.repairedDefense))
                    {
                        let repairedValue = this.ogl.shipCost[k].map(x => x * v);
                        loss = loss.map((x, i) => parseInt(x) - parseInt(repairedValue[i]));
                    }
                }

                if(leftSide) renta = renta.map((x, i) => parseInt(x) - loss[i] + loot[i]);
                else renta = renta.map((x, i) => parseInt(x) - loss[i] - loot[i]);
                ['metal', 'crystal', 'deut'].forEach((r, index) => report[r] = renta[index]);

                let formatedRenta = renta.map((res) => Util.formatToUnits(res));
                let line = Util.createDom('div', {'class':'ogl_expeResult'}, 'Renta: ' + formatedRenta.join(' | '));
                message.prepend(line);

                let target = json.coordinates.position == 16 ? 'expe' : 'raid';

                this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 };
                this.ogl.json.stats.ignored = this.ogl.json.stats.ignored || {};

                let saveReport = () =>
                {
                    if(this.ogl.json.stats[midnight].idList.indexOf(id) == -1 && !this.ogl.json.stats.ignored[id])
                    {
                        this.ogl.json.stats[midnight].idList.push(id);

                        for(let [k,v] of Object.entries(report))
                        {
                            this.ogl.json.stats[midnight][target][k] = (this.ogl.json.stats[midnight][target][k] || 0) + v;
                            this.ogl.json.stats.total[target][k] = (this.ogl.json.stats.total[target][k] || 0) + v;
                        }

                        if(target == 'expe')
                        {
                            this.ogl.json.stats[midnight].expeOccurences['fight'] = (this.ogl.json.stats[midnight].expeOccurences['fight'] || 0) + 1;
                            this.ogl.json.stats.total.expeOccurences['fight'] = (this.ogl.json.stats.total.expeOccurences['fight'] || 0) + 1;

                            this.ogl.json.stats[midnight].expeOccurences['none'] = (this.ogl.json.stats[midnight].expeOccurences['none'] || 0) - 1;
                            this.ogl.json.stats.total.expeOccurences['none'] = (this.ogl.json.stats.total.expeOccurences['none'] || 0) - 1;
                        }

                        this.ogl.component.empireManager.displayStats(this.ogl.json.stats.range);
                    }
                }

                if(target == 'raid')
                {
                    let ignore = line.appendChild(Util.createDom('div', {'class':'ogl_button ogl_ignoreRaid material-icons tooltip', 'title':this.ogl.component.langManager.getText('ignoreRaid')}));
                    if(this.ogl.json.stats.ignored[id]) ignore.classList.add('ogl_active');
                    ignore.addEventListener('click', () =>
                    {
                        if(this.ogl.json.stats.ignored[id]) 
                        {
                            delete this.ogl.json.stats.ignored[id];
                            ignore.classList.remove('ogl_active');
                        }
                        else
                        {
                            ignore.classList.add('ogl_active');
                            let index = this.ogl.json.stats[midnight].idList.indexOf(id);
                            this.ogl.json.stats[midnight].idList.splice(index, 1);
                            this.ogl.json.stats.ignored[id] = Date.now();

                            for(let [k,v] of Object.entries(report))
                            {
                                this.ogl.json.stats[midnight][target][k] = (this.ogl.json.stats[midnight][target][k] || 0) - v;
                                this.ogl.json.stats.total[target][k] = (this.ogl.json.stats.total[target][k] || 0) - v;
                            }
                        }

                        saveReport();
                        Util.saveData(this.ogl.json);
                        this.ogl.component.empireManager.displayStats(this.ogl.json.stats.range);
                    });
                }

                saveReport();
                Util.saveData(this.ogl.json);
            });
        });
    }

    checkDebris()
    {
        document.querySelectorAll('#ui-id-2 div[aria-hidden="false"] .msg:not(.ogl_debrisDone)').forEach(message =>
        {
            if(!message.querySelector('.ogl_timeZone')) return;
            message.classList.add('ogl_debrisDone');

            if(!message.querySelector('.icon_apikey') && message.querySelector('.msg_head').textContent.indexOf(':17]') < 0) return;

            let content = message.querySelector('.msg_content');
            let regex = new RegExp('\\'+LocalizationStrings.thousandSeperator, 'g');

            let id = message.getAttribute('data-msg-id');
            let date = new Date(parseInt(message.querySelector('.msg_date').getAttribute('data-timestamp')));
            let midnight = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0).getTime();

            let report = {};

            let numList = content.textContent.replace(regex, '').match(/\d+/g);
            let target = parseInt(numList[numList.length - 3] == '16') ? 'expe' : 'raid';

            if(!message.querySelector('.icon_apikey'))
            {
                report.dm = parseInt(numList[numList.length - 2]);
                message.prepend(Util.createDom('div', {'class':'ogl_expeResult'}, `Renta: ${report.DM} ${this.ogl.component.langManager.getText('DM')}`));
            }
            else
            {
                report.metal = parseInt(numList[numList.length - 2]);
                report.crystal = parseInt(numList[numList.length - 1]);
                report.deut = 0;
                message.prepend(Util.createDom('div', {'class':'ogl_expeResult'}, `Renta: ${Util.formatToUnits(report.metal)} | ${Util.formatToUnits(report.crystal)} | ${Util.formatToUnits(report.deut)}`));
            }

            this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 };

            if(this.ogl.json.stats[midnight].idList.indexOf(id) == -1)
            {
                this.ogl.json.stats[midnight].idList.push(id);

                for(let [k,v] of Object.entries(report))
                {
                    this.ogl.json.stats[midnight][target][k] = (this.ogl.json.stats[midnight][target][k] || 0) + v;
                    this.ogl.json.stats.total[target][k] = (this.ogl.json.stats.total[target][k] || 0) + v;
                }

                if(target == 'expe')
                {
                    this.ogl.json.stats[midnight].expeOccurences['resources'] = (this.ogl.json.stats[midnight].expeOccurences['resources'] || 0) + 1;
                    this.ogl.json.stats.total.expeOccurences['resources'] = (this.ogl.json.stats.total.expeOccurences['resources'] || 0) + 1;
                }

                this.ogl.component.empireManager.displayStats(this.ogl.json.stats.range);
            }

            Util.saveData(this.ogl.json);
        });
    }
}

class PlanetManager
{
    constructor(ogl)
    {
        this.ogl = ogl;
        this.myPlanets = {};

        let isGroup = false;
        let lastCoords, countGroup = 0;

        this.ogl.planetList.forEach(p =>
        {
            let coords = p.querySelector('.planetlink .planet-koords').textContent.slice(1,-1).split(':');

            p.setAttribute('data-coords', coords.join(':'));

            let planet = {};
            planet.id = p.getAttribute('id').replace('planet-','');
            planet.galaxy = coords[0];
            planet.system = coords[1];
            planet.position = coords[2];
            planet.coords = coords.join(':');
            planet.name = p.querySelector('.planetlink .planet-name').textContent;
            planet.active = p.querySelector('.planetlink').classList.contains('active');

            if(lastCoords == coords[0] + ':' + coords[1])
            {
                p.setAttribute('data-multi', countGroup);
                planet.multi = countGroup;
                isGroup = true;
            }
            else
            {
                if(isGroup) countGroup++;
                isGroup = false;
            }

            lastCoords = coords[0] + ':' + coords[1];


            if(p.querySelector('.moonlink'))
            {
                planet.moon = {};
                planet.moon.id = new URL(p.querySelector('.moonlink').href).searchParams.get('cp');
                planet.moon.jumpgate = p.querySelector('.moonlink').getAttribute('data-jumpgatelevel');
                planet.moon.active = p.querySelector('.moonlink').classList.contains('active');
            }

            this.myPlanets[planet.coords] = planet;

            if(Util.getPage() == 'galaxy') Util.loop(() => this.updateDebris());
        });

        this.buildTargetList();
        this.ogl.component.sideViewManager.addEconomyPanel();
    }

    buildPlanetList(dom)
    {
        let stalkPlanetList = [];

        dom.querySelectorAll('planet').forEach(domPlanet =>
        {
            let coords = domPlanet.getAttribute('coords').split(':');

            let planet = {};
            planet.id = domPlanet.getAttribute('id');
            planet.name = domPlanet.getAttribute('name');
            planet.coords = domPlanet.getAttribute('coords');
            planet.galaxy = coords[0];
            planet.system = coords[1];
            planet.position = coords[2];
            planet.main = stalkPlanetList.length == 0;

            if(domPlanet.querySelector('moon'))
            {
                let moon = domPlanet.querySelector('moon');

                planet.moon = {};
                planet.moon.id = moon.getAttribute('id');
                planet.moon.size = moon.getAttribute('size');
            }

            stalkPlanetList.push(planet);
        });

        stalkPlanetList.sort((a, b) =>
        {
            let coordsA = a.coords.split(':').map(x => x.padStart(3, '0')).join('');
            let coordsB = b.coords.split(':').map(x => x.padStart(3, '0')).join('');

            return coordsA - coordsB;
        });

        return stalkPlanetList;
    }

    buildColorPicker(domElement, data)
    {
        data = data || {};

        if(!this.colorPicker)
        {
            this.colorPicker = document.body.appendChild(Util.createDom('div', {'style':'display:none;', 'id':'ogl_color'}));
            let container = this.colorPicker.appendChild(Util.createDom('div', {'class':'ogl_colorPicker'}));

            ['red', 'halfred', 'yellow', 'halfyellow', 'green', 'halfgreen', 'blue', 'halfblue', 'violet', 'halfviolet', 'gray', 'none'].forEach(color =>
            {
                let pick = container.appendChild(Util.createDom('div', {'data-color':color}));
                pick.addEventListener('click', () =>
                {
                    let planet = {};
                    let coords = this.colorPicker.getAttribute('data-coords');
                    let splitted = coords.split(':');
                    this.ogl.json.stalkList[coords] = this.ogl.json.stalkList[coords] || {};

                    planet.id = parseInt(this.colorPicker.getAttribute('data-planet'));
                    planet.player = parseInt(this.colorPicker.getAttribute('data-player'));
                    planet.coords = coords;
                    planet.color = this.ogl.json.stalkList[planet.coords].color == color ? false : color == 'none' ? false : color;

                    if(!planet.color)
                    {
                        delete this.ogl.json.stalkList[planet.coords];
                        Util.saveData(this.ogl.json);
                    }
                    else if(!planet.id || !planet.player)
                    {
                        Util.loadPageContent(`https://${window.location.host}/game/index.php?page=componentOnly&component=galaxyContent&ajax=1&galaxy=${splitted[0]}&system=${splitted[1]}&position=${splitted[2]}`, 'text/html', result =>
                        {
                            let line = result.querySelector('#planet'+splitted[2]).closest('tr');

                            planet.id = line.querySelector('td[data-planet-id]').getAttribute('data-planet-id');
                            planet.player = line.querySelector('td.playername a[rel^="player"]').getAttribute('rel').replace('player', '');

                            this.ogl.json.stalkList[planet.coords] = planet;
                            Util.saveData(this.ogl.json);
                        });
                    }
                    else
                    {    
                        this.ogl.json.stalkList[planet.coords] = planet;
                        Util.saveData(this.ogl.json);
                    }

                    let line = this.colorPicker.domLink.parentNode;

                    if(line.closest('.ogl_spyTable'))
                    {
                        line.closest('.ogl_spyTable').querySelectorAll(`tr[data-coords="${planet.coords}"]`).forEach(e =>
                        {
                            e.setAttribute('data-color', planet.color);
                        });
                    }
                    else
                    {
                        line.classList.remove('ogl_ready');
                        delete this.ogl.component.playerManager.playerList[planet.player];
                        this.colorPicker.domLink.parentNode.removeAttribute('data-color');

                        if(this.ogl.json.options.sideViewOpened == 'stalkPinned' && this.ogl.json.options.pinned.id == planet.player)
                        {
                            document.querySelector(`.ogl_sideView [data-coords="${planet.coords}"]`).setAttribute('data-color', planet.color);
                        }
                    }
    
                    this.ogl.component.planetManager.buildTargetList();
                    this.ogl.component.tooltipManager.close();
                });
            });
        }

        if(!domElement.querySelector('.ogl_colorButton'))
        {
            let colorButton = domElement.appendChild(Util.createDom('div', {'class':'ogl_colorButton tooltipClick tooltipRel', 'rel':'ogl_color'}));
            colorButton.addEventListener('click', () =>
            {
                this.colorPicker.domLink = domElement;
                this.colorPicker.setAttribute('data-player', data.player);
                this.colorPicker.setAttribute('data-planet', data.planet);
                this.colorPicker.setAttribute('data-coords', data.coords);
            });
        }
    }

    colorizeAllPlanets(playerID, planetList, color)
    {
        planetList.forEach(planet =>
        {
            let p = {};
            p.id = planet.id;
            p.player = playerID;
            p.coords = planet.coords;
            p.color = color;

            color == 'none' ? delete this.ogl.json.stalkList[planet.coords] : this.ogl.json.stalkList[planet.coords] = p;
        });

        Util.saveData(this.ogl.json);
        this.ogl.component.planetManager.buildTargetList();
    }

    goToPosition(galaxy, system, position)
    {
        if(Util.getPage() == 'galaxy')
        {
            document.querySelector('#galaxy_input').value = galaxy;
            document.querySelector('#system_input').value = system;
            submitForm();
        }
        else
        {
            let link = `?page=ingame&component=galaxy&galaxy=${galaxy}&system=${system}&position=${position}`;
            window.location.href = this.ogl.baselink + link;
        }
    }

    buildTargetList()
    {
        this.stalkList ? this.stalkList.textContent = '' : this.stalkList = Util.createDom('div', {'class':'ogl_stalkList'});

        let systemSteps = 50;
        let currentStep = 0;
        let targetFound = false;

        let colors = this.stalkList.appendChild(Util.createDom('div'));
        let gMenu = this.stalkList.appendChild(Util.createDom('div'));
        let sMenu = this.stalkList.appendChild(Util.createDom('div'));
        let content = this.stalkList.appendChild(Util.createDom('div', {'class':'ogl_stalkPlanets'}));

        let sendProbes = (event, planet, type, sender) =>
        {
            event.stopPropagation();
            event.preventDefault();

            if(type == 3)
            {
                Util.loadPageContent(`https://${window.location.host}/game/index.php?page=componentOnly&component=galaxyContent&ajax=1&galaxy=${planet.galaxy}&system=${planet.system}&position=${planet.position}`, 'text/html', result =>
                {
                    let line = result.querySelector('#planet'+planet.position).closest('tr');
                    if(line.querySelector('.moon .moon_a'))
                    {
                        this.ogl.component.fleetManager.sendSpyProbe([planet.galaxy, planet.system, planet.position, type], this.ogl.json.spyProbesCount, sender);
                    }
                    else fadeBox(this.ogl.component.langManager.getText('noMoonError'), true);

                    this.ogl.json.stalkList[`${planet.galaxy}:${planet.system}:${planet.position}`].lastMoonSpy = Date.now();
                });
            }
            else
            {
                this.ogl.component.fleetManager.sendSpyProbe([planet.galaxy, planet.system, planet.position, type], this.ogl.json.spyProbesCount, sender);
                this.ogl.json.stalkList[`${planet.galaxy}:${planet.system}:${planet.position}`].lastPlanetSpy = Date.now();
            }
            Util.saveData(this.ogl.json);
        };

        ['red', 'halfred', 'yellow', 'halfyellow', 'green', 'halfgreen', 'blue', 'halfblue', 'violet', 'halfviolet', 'gray'].forEach(color =>
        {
            let toggle = colors.appendChild(Util.createDom('div', {'class':'ogl_toggle', 'data-toggle':color}));
            if(!this.ogl.json.options.hiddenTargets[color]) toggle.classList.add('ogl_active');

            toggle.addEventListener('click', () =>
            {
                if(this.ogl.json.options.hiddenTargets[color])
                {
                    delete this.ogl.json.options.hiddenTargets[color];
                    toggle.classList.add('ogl_active');
                    content.querySelectorAll(`div[data-color="${color}"]`).forEach(e => e.classList.remove('ogl_colorHidden'));
                }
                else
                {
                    this.ogl.json.options.hiddenTargets[color] = color;
                    toggle.classList.remove('ogl_active');
                    content.querySelectorAll(`div[data-color="${color}"]`).forEach(e => e.classList.add('ogl_colorHidden'));
                }
                Util.saveData(this.ogl.json);

                gMenu.querySelectorAll('div').forEach(e => e.classList.add('ogl_disabled'));
                sMenu.querySelectorAll('div').forEach(e => e.classList.add('ogl_disabled'));

                for(let i=0; i<10; i++)
                {
                    if(content.querySelector(`div[data-galaxy="${i}"]:not(.ogl_colorHidden)`))
                    {
                        gMenu.querySelector(`div[data-galaxy="${i}"]`).classList.remove('ogl_disabled');
                    }
                }

                for(let i=0; i<500; i+=systemSteps)
                {
                    if(content.querySelector(`div[data-galaxy="${gMenu.querySelector('.ogl_active').getAttribute('data-galaxy')}"][data-group="${i}"]:not(.ogl_colorHidden)`))
                    {
                        sMenu.querySelector(`div[data-system="${i}"]`).classList.remove('ogl_disabled');
                    }
                }
            });
        });

        for(let g=1; g<=10; g++)
        {
            let gDiv = gMenu.appendChild(Util.createDom('div', {'class':'ogl_disabled', 'data-galaxy':g}, g));
            gDiv.addEventListener('click', () =>
            {
                gMenu.querySelectorAll('div.ogl_active').forEach(e => e.classList.remove('ogl_active'));
                gDiv.classList.add('ogl_active');
                this.ogl.json.options.targetFilter[0] = g;
                Util.saveData(this.ogl.json);

                content.querySelectorAll('div[data-galaxy]').forEach(div =>
                {
                    if(div.getAttribute('data-galaxy') == g) div.classList.remove('ogl_galaxyHidden');
                    else div.classList.add('ogl_galaxyHidden');
                });

                sMenu.querySelectorAll('div').forEach(e => e.classList.add('ogl_disabled'));

                for(let i=0; i<500; i+=systemSteps)
                {
                    if(content.querySelector(`div[data-galaxy="${g}"][data-group="${i}"]:not(.ogl_colorHidden)`))
                    {
                        sMenu.querySelector(`div[data-system="${i}"]`).classList.remove('ogl_disabled');
                    }
                }
            });

            for(let s=0; s<500; s++)
            {
                if(s == currentStep)
                {
                    let sDiv = sMenu.appendChild(Util.createDom('div', {'class':'ogl_disabled', 'data-system':s}, s||'0'));
                    sDiv.addEventListener('click', () =>
                    {
                        sMenu.querySelectorAll('div.ogl_active').forEach(e => e.classList.remove('ogl_active'));
                        sDiv.classList.add('ogl_active');
                        this.ogl.json.options.targetFilter[1] = s;
                        Util.saveData(this.ogl.json);

                        content.querySelectorAll('div[data-system]').forEach(div =>
                        {
                            if(div.getAttribute('data-group') == s) div.classList.remove('ogl_systemHidden');
                            else div.classList.add('ogl_systemHidden');
                        });
                    });

                    currentStep += systemSteps;
                }

                for(let p=1; p<=15; p++)
                {
                    let id = `${g}:${s}:${p}`;

                    if(this.ogl.json.stalkList[id])
                    {
                        let group = Math.floor(s/systemSteps)*systemSteps;

                        let div = content.appendChild(Util.createDom('div', {'data-galaxy':g, 'data-system':s, 'data-position':p, 'data-group':group, 'data-coords':id}));
                        div.appendChild(Util.createDom('span', {}, id));
                        let mSpy = div.appendChild(Util.createDom('div', {'class':'ogl_moonIcon material-icons ogl_active tooltip', 'data-type':3, 'title':this.ogl.component.langManager.getText('spyPosition')}, 'brightness_2'));
                        let pSpy = div.appendChild(Util.createDom('div', {'class':'ogl_planetIcon material-icons tooltip', 'data-type':1, 'title':this.ogl.component.langManager.getText('spyPosition')}, 'language'));
                        let pTarget = div.appendChild(Util.createDom('div', {'class':'ogl_flagIcon material-icons tooltip', 'data-type':3, 'title':this.ogl.component.langManager.getText('flagTarget')}, 'flag'));

                        let now = Date.now();
                        if(now - this.ogl.json.stalkList[id].lastPlanetSpy < 3*60*60*1000) pSpy.classList.add('ogl_disabled');
                        if(now - this.ogl.json.stalkList[id].lastMoonSpy < 3*60*60*1000) mSpy.classList.add('ogl_disabled');

                        let planet = { galaxy:g, system:s, position:p };

                        pSpy.addEventListener('click', event => sendProbes(event, planet, 1, pSpy));
                        mSpy.addEventListener('click', event => sendProbes(event, planet, 3, mSpy));
                        pTarget.addEventListener('click', event =>
                        {
                            event.stopPropagation();
                            event.preventDefault();
                            content.querySelector('[data-galaxy] .ogl_flagIcon.ogl_active') && content.querySelector('[data-galaxy] .ogl_flagIcon.ogl_active').classList.remove('ogl_active');
                            pTarget.classList.add('ogl_active');
                            this.ogl.json.options.currentTarget = id;
                            this.ogl.json.options.targetFilter = [g,group];
                        
                            let siblingFound = false;
                            let nextElement = div.nextElementSibling;

                            if(nextElement && nextElement.classList.contains('ogl_colorHidden'))
                            {
                                while(!siblingFound)
                                {
                                    nextElement = nextElement.nextElementSibling;
                                    if(!nextElement || !nextElement.classList.contains('ogl_colorHidden')) siblingFound = true;
                                }
                            }

                            Util.saveData(this.ogl.json);
                        });

                        div.setAttribute('data-color', this.ogl.json.stalkList[id].color);
                        if(this.ogl.json.options.hiddenTargets[this.ogl.json.stalkList[id].color]) div.classList.add('ogl_colorHidden');
                        else gMenu.querySelector(`div[data-galaxy="${g}"]`).classList.remove('ogl_disabled');
                        
                        if(targetFound && !div.classList.contains('ogl_colorHidden'))
                        {
                            targetFound = false;
                            this.ogl.json.options.nextTarget = id;
                            Util.saveData(this.ogl.json);
                        }

                        if(this.ogl.json.options.currentTarget == id)
                        {
                            pTarget.classList.add('ogl_active');
                            targetFound = true;
                        }

                        div.addEventListener('click', () =>
                        {
                            this.ogl.component.tooltipManager.close();
                            this.ogl.component.planetManager.goToPosition(planet.galaxy, planet.system, planet.position);
                        });
                    }
                }
            }
        }

        gMenu.querySelector(`div[data-galaxy="${this.ogl.json.options.targetFilter[0]}"]`).click();
        sMenu.querySelector(`div[data-system="${this.ogl.json.options.targetFilter[1]}"]`).click();

        let syncOldData = this.stalkList.appendChild(Util.createDom('button', {'class':'ogl_button ogl_tempSync'}, 'Sync OGL v2 Data'));
        syncOldData.addEventListener('click', () =>
        {
            this.ogl.component.popupManager.load();
            let result = Util.createDom('div');

            if(localStorage.getItem('ogl-data'))
            {
                let oldData = JSON.parse(localStorage.getItem('ogl-data'));
                if(oldData.markers && Object.keys(oldData.markers).length > 0)
                {
                    for(const [key, value] of Object.entries(oldData.markers))
                    {
                        this.ogl.json.stalkList[key] =
                        {
                            id:-1,
                            player:-1,
                            coords:key,
                            color:value.color,
                        };
                    }
                    Util.saveData(this.ogl.json);
                    result.textContent = 'Data synced';
                }
                else result.textContent = 'No data found';
            }
            else result.textContent = 'No data found';

            let btn = result.appendChild(Util.createDom('div', {'class':'ogl_button'}, 'OK'));
            btn.addEventListener('click', () => document.location.reload());

            this.ogl.component.popupManager.open(result);
        });

        if(!this.ogl.component.sideViewManager.panel.querySelector('.ogl_targetButton'))
        {
            let button = this.ogl.component.sideViewManager.panel.appendChild(Util.createDom('div', {'class':'material-icons tooltip ogl_targetButton', 'title':this.ogl.component.langManager.getText('targetView')}, 'gps_fixed'));
            let sideViewId = 'stalkList';
            button.addEventListener('click', () => this.ogl.component.sideViewManager.open(this.stalkList, sideViewId));
            if(this.ogl.json.options.sideViewOpened == sideViewId) this.ogl.component.sideViewManager.open(this.stalkList, sideViewId);
        }       
    }

    updateDebris()
    {
        document.querySelectorAll('.debris a.ogl_tooltipReady:not(.ogl_debrisReady)').forEach(element =>
        {
            element.classList.add('ogl_debrisReady');

            let total = 0;
            let id = '#' + element.getAttribute('rel');

            this.ogl.tmpTooltip[id].querySelectorAll('.debris-content').forEach(resources =>
            {
                let value = Util.formatFromUnits(resources.innerText.replace(/(\D*)/, ''));
                element.querySelector('.debrisField').innerHTML += Util.formatToUnits(parseInt(value), 1) + '<br>';
                total += parseInt(value);
            });

            if(total >= this.ogl.json.options.rval) element.closest('.debris').classList.add('ogl_active');
        });
        
        document.querySelectorAll('.expeditionDebrisSlotBox:not(.ogl_debrisReady)').forEach(element =>
        {
            element.classList.add('ogl_debrisReady');

            let content = element.querySelectorAll('.ListLinks li');
            if(!content[0]) content = this.ogl.tmpTooltip['#debris16'].querySelectorAll('.ListLinks li');

            let scouts = content[2];
            let action = content[3];
            let res =
            [
                content[0].textContent.replace(/(\D*)/, ''),
                content[1].textContent.replace(/(\D*)/, '')
            ];

            element.innerHTML = `
                <img src="https://gf1.geo.gfsrv.net/cdnc5/fa3e396b8af2ae31e28ef3b44eca91.gif">
                <div>
                    <div class="ogl_metal">${res[0]}</div>
                    <div class="ogl_crystal">${res[1]}</div>
                </div>
                <div>
                    <div>${scouts.textContent}</div>
                    <div>${action.outerHTML}</div>
                </div>
            `;
        });
    }
}

class FleetManager
{
    constructor(ogl)
    {
        this.ogl = ogl;
        this.defaultShip;
        this.sliderSpeed;
        this.targetSelected = false;
        this.checkFleetMovements();

        this.totalOnPlanet = this.ogl.resources.metal + this.ogl.resources.crystal + this.ogl.resources.deut;

        if(Util.getPage() == 'fleetdispatch')
        {
            if(this.ogl.mode == '2')
            {
                let link = this.ogl.baselink + '?page=messages';
                Util.overwriteFleetDispatcher('submitFleet3', false, () =>
                {
                    if(fleetDispatcher.currentPage == 'fleet3') localStorage.setItem('ogl-redirect', link);
                });
            }

            this.ogl.json.loca.metal = loca.LOCA_ALL_METAL;
            this.ogl.json.loca.crystal = loca.LOCA_ALL_CRYSTAL;
            this.ogl.json.loca.deut = loca.LOCA_ALL_DEUTERIUM;
            this.ogl.json.loca.dm = LocalizationStrings.darkMatter;
            this.ogl.json.loca.item = 'Item';
            this.ogl.json.loca.conso = loca.LOCA_FLEET_FUEL_CONSUMPTION;

            fleetDispatcher.apiTechData.forEach(tech => this.ogl.json.myTechs[tech[0]] = tech[1]);

            [202,203,204,205,206,207,208,209,210,211,213,214,215,217,218,219].forEach(shipID =>
            {
                this.ogl.json.loca[shipID] = fleetDispatcher.fleetHelper.shipsData[shipID].name;
                this.ogl.json.shipCapacity[shipID] = fleetDispatcher.fleetHelper.shipsData[shipID].cargoCapacity;
            });

            this.ogl.json.playerClass = fleetDispatcher.apiCommonData[1][1];

            if(!fleetDispatcher.shipsOnPlanet.length)
            {
                this.rightMenuOptions();

                let empty = document.querySelector('#fleetdispatchcomponent #warning h3');
                empty.textContent = '';
                let grid = empty.appendChild(Util.createDom('div', {'class':'ogl_emptyGrid'}));

                [202,203,219,210].forEach(shipID =>
                {
                    let amount = this.calcRequiredShips(shipID, this.totalOnPlanet);
                    let div = grid.appendChild(Util.createDom('div', {'class':'ogl_emptyShip'}));
                    div.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_' + shipID}));
                    div.appendChild(Util.createDom('span', {}, amount.toLocaleString('de-DE')));
                });

                return;
            }

            this.tempCoords = [fleetDispatcher.targetPlanet.galaxy, fleetDispatcher.targetPlanet.system, fleetDispatcher.targetPlanet.position, fleetDispatcher.targetPlanet.type];
            this.initialResOnPlanet = [fleetDispatcher.metalOnPlanet, fleetDispatcher.crystalOnPlanet, fleetDispatcher.deuteriumOnPlanet];

            fleetDispatcher.metalOnPlanet = Math.max(0, fleetDispatcher.metalOnPlanet - this.ogl.json.options.resSaver[0]);
            fleetDispatcher.crystalOnPlanet = Math.max(0, fleetDispatcher.crystalOnPlanet - this.ogl.json.options.resSaver[1]);
            fleetDispatcher.deuteriumOnPlanet = Math.max(0, fleetDispatcher.deuteriumOnPlanet - this.ogl.json.options.resSaver[2]);

            this.resOnPlanet = [fleetDispatcher.metalOnPlanet, fleetDispatcher.crystalOnPlanet, fleetDispatcher.deuteriumOnPlanet];
            this.shipsOnPlanet = [];

            Util.saveData(this.ogl.json);
    
            fleetDispatcher.totalFret = 0;
            fleetDispatcher.shipsOnPlanet.forEach(ship =>
            {
                fleetDispatcher.totalFret += ship.baseCargoCapacity * ship.number;
                this.shipsOnPlanet[ship.id] = ship;
                document.querySelector(`.technology[data-technology="${ship.id}"] input`).classList.add('ogl_checkInput');
            });

            this.updatePlanetList(this.tempCoords, fleetDispatcher.targetPlanet.type);

            // DOM manipulations
            document.querySelector('#fleet1 .allornonewrap').prepend(document.querySelector('#fleet1 #continueToFleet2'));
            document.querySelector('#fleet1 .allornonewrap .secondcol').prepend(document.querySelector('#fleet1 .show_fleet_apikey'));
            document.querySelector('#fleet2 #buttonz .header').appendChild(document.querySelector('#fleet2 #mission #shortcuts > div:nth-child(2)'));
            fleetDispatcher.focusSubmitFleet1();

            document.querySelector('#fleet1 .show_fleet_apikey').addEventListener('mouseover', () => fleetDispatcher.refresh());

            let preloadShips = () =>
            {
                let shipID = this.ogl.json.options.defaultShip;
                let required = this.calcRequiredShips(shipID, this.totalOnPlanet);

                this.shipsOnPlanet[shipID] = this.shipsOnPlanet[shipID] || {number:0};
                fleetDispatcher.selectShip(shipID, Math.min(required, this.shipsOnPlanet[shipID].number));
                if(this.ogl.mode == 1 || this.ogl.mode == 4) fleetDispatcher.selectMaxAll();
                fleetDispatcher.refresh();

                fleetDispatcher.focusSubmitFleet2();
            }

            Util.overwriteFleetDispatcher('trySubmitFleet1', false, () =>
            {
                let shipSelected = false;
                document.querySelectorAll('.technology').forEach(tech =>
                {
                    let inputValue = tech.querySelector('input').value.replace(/\./g);
                    if(inputValue && inputValue != "0") shipSelected = true;
                });

                if(fleetDispatcher.currentPage == 'fleet1' && !shipSelected && !fleetDispatcher.shipsToSend.length && !fleetDispatcher.mission)
                {
                    preloadShips();
                }
            });

            if(this.ogl.mode == 1 || this.ogl.mode == 4) preloadShips();

            this.expedition();
            this.addRequiredUI();
            this.addDeltaUI();
            this.addFretInfoUI();
            this.addFleet2UI();
            this.addFleet3UI();

            Util.overwriteFleetDispatcher('trySubmitFleet2', false, () =>
            {
                fleetDispatcher.targetPlanet.galaxy = this.tempCoords[0];
                fleetDispatcher.targetPlanet.system = this.tempCoords[1];
                fleetDispatcher.targetPlanet.position = this.tempCoords[2];
                fleetDispatcher.targetPlanet.type = this.tempCoords[3];

                if(fleetDispatcher.targetPlanet.galaxy == fleetDispatcher.currentPlanet.galaxy
                && fleetDispatcher.targetPlanet.system == fleetDispatcher.currentPlanet.system
                && fleetDispatcher.targetPlanet.position == fleetDispatcher.currentPlanet.position
                && fleetDispatcher.targetPlanet.type == fleetDispatcher.currentPlanet.type && this.ogl.mode == 0)
                {
                    if(!fleetDispatcher.mission) fleetDispatcher.mission = this.ogl.json.options.defaultMission;
                    if(fleetDispatcher.cargoMetal == 0 && fleetDispatcher.cargoCrystal == 0 && fleetDispatcher.cargoDeuterium == 0) fleetDispatcher.selectMaxAll();

                    fleetDispatcher.targetPlanet.type = fleetDispatcher.targetPlanet.type == 1 ? 3 : 1;

                    this.checkPlanetList(fleetDispatcher.targetPlanet.type);
                    fleetDispatcher.refresh();
                }

                if(!fleetDispatcher.mission)
                {
                    fleetDispatcher.mission = this.ogl.json.options.defaultMission;
                }
            });

            Util.overwriteFleetDispatcher('submitFleet3', false, () =>
            {
                if(fleetDispatcher.currentPage == 'fleet3')
                {
                    let now = new Date();
                    let midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0).getTime();
                    let coords = this.ogl.current.type == 'moon' ? this.ogl.current.coords.join(':') + 'M' : this.ogl.current.coords.join(':');

                    if(this.targetSelected)
                    {
                        let tCoords =  this.ogl.json.options.currentTarget.split(':');

                        if(fleetDispatcher.targetPlanet.galaxy == tCoords[0] && fleetDispatcher.targetPlanet.system == tCoords[1]
                        && fleetDispatcher.targetPlanet.position == tCoords[2] && fleetDispatcher.mission == 1)
                        {
                            if(this.ogl.json.options.nextTarget)
                            {
                                if(this.ogl.json.options.currentTarget == this.ogl.json.options.nextTarget)
                                {
                                    this.ogl.json.options.nextTarget = false;
                                    this.ogl.json.options.currentTarget = false;
                                }
                                else
                                {
                                    let newTarget = this.ogl.json.options.nextTarget.split(':');
                                    let group = Math.floor(newTarget[1]/50)*50; // system step
                                    this.ogl.json.options.currentTarget = this.ogl.json.options.nextTarget;
                                    this.ogl.json.options.targetFilter = [newTarget[0],group];
                                }
                            }
                            else
                            {
                                this.ogl.json.options.currentTarget = false;
                                this.ogl.json.options.nextTarget = false;
                            }
                        }
                    }
                    
                    this.ogl.json.lastFleet.shipsToSend = fleetDispatcher.shipsToSend;
                    this.ogl.json.lastFleet.targetPlanet = fleetDispatcher.targetPlanet;
                    this.ogl.json.lastFleet.speedPercent = fleetDispatcher.speedPercent;
                    this.ogl.json.lastFleet.cargoMetal = fleetDispatcher.cargoMetal;
                    this.ogl.json.lastFleet.cargoCrystal = fleetDispatcher.cargoCrystal;
                    this.ogl.json.lastFleet.cargoDeuterium = fleetDispatcher.cargoDeuterium;
                    this.ogl.json.lastFleet.mission = fleetDispatcher.mission;

                    this.ogl.json.stats[midnight] = this.ogl.json.stats[midnight] || { idList:[], expe:{}, raid:{}, expeOccurences:{}, consumption:0 };
                    this.ogl.json.stats[midnight].consumption = (this.ogl.json.stats[midnight].consumption || 0) - fleetDispatcher.getConsumption();
                    this.ogl.json.stats.total.consumption = (this.ogl.json.stats.total.consumption || 0) - fleetDispatcher.getConsumption();

                    this.ogl.json.myEconomy[coords] = this.ogl.json.myEconomy[coords] || {};
                    this.ogl.json.myEconomy[coords]['resmetal'] = Math.max(0, (this.ogl.json.myEconomy[coords]['resmetal'] || 0) - fleetDispatcher.cargoMetal);
                    this.ogl.json.myEconomy[coords]['rescrystal'] = Math.max(0, (this.ogl.json.myEconomy[coords]['rescrystal'] || 0) - fleetDispatcher.cargoCrystal);
                    this.ogl.json.myEconomy[coords]['resdeut'] = Math.max(0, (this.ogl.json.myEconomy[coords]['resdeut'] || 0) - fleetDispatcher.cargoDeuterium);

                    Util.saveData(this.ogl.json);
                    fleetDispatcher.refresh();
                }
            });

            let data = fleetDispatcher.fleetHelper.shipsData;
            for(let id in data)
            {
                let infos = `
                    <div class="ogl_fleetInfo">
                        ${data[id].name}
                        <div class="splitLine"></div>
                        <div><span>Fret</span>${Util.formatNumber(data[id].cargoCapacity)}</div>
                        <div><span>Speed</span>${Util.formatNumber(data[id].speed)}</div>
                        <div><span>Conso</span>${Util.formatNumber(data[id].fuelConsumption)}</div>
                    </div>
                `;

                let ship = document.querySelector(`.technology[data-technology="${id}"]`);
                if(ship) ship.setAttribute('title', infos);
            }

            Util.loop(() =>
            {
                if(!fleetDispatcher.mission && document.querySelectorAll('#missions .on').length == 1)
                {
                    document.querySelector('#missions .on a').click();
                }

                if(fleetDispatcher.currentPage == 'fleet3')
                {
                    if(this.targetSelected && this.ogl.json.stalkList[this.ogl.json.options.currentTarget])
                    {
                        let tCoords = this.ogl.json.options.currentTarget.split(':');
                        let playerID = this.ogl.json.stalkList[this.ogl.json.options.currentTarget].player;

                        if(fleetDispatcher.targetPlanet.galaxy == tCoords[0] && fleetDispatcher.targetPlanet.system == tCoords[1]
                        && fleetDispatcher.targetPlanet.position == tCoords[2] && fleetDispatcher.mission == 1
                        && fleetDispatcher.targetPlayerId != playerID && playerID != -1)
                        {
                            this.ogl.component.playerManager.deleteTarget(tCoords[0], tCoords[1], tCoords[2]);
                            fadeBox(this.ogl.component.langManager.getText('wrongTarget'), true);
                        }
                    }
                }
            });
        }

        this.rightMenuOptions();

        if(Util.getPage() == 'movement')
        {
            this.addBackTimer();

            document.querySelectorAll('.starStreak .route').forEach(movement =>
            {   
                let id = '#'+movement.querySelector('a').getAttribute('rel');
                let div = document.querySelector(id);
                let container = movement.closest('.fleetDetails').appendChild(Util.createDom('div',{'class':'ogl_shipDetail'}));

                movement.querySelector('a').classList.add('ogl_inFlight');

                div.querySelectorAll('.fleetinfo tr').forEach((line, index) =>
                {
                    if(line.querySelector('td'))
                    {
                        let shipLine = Util.createDom('div', {'class':'ogl_movementItem'});
                        let shipID = Util.findObjectByValue(this.ogl.json.loca, line.querySelector('td').textContent.replace(':', '')) || -1;

                        if(shipID == 'metal') container.prepend(shipLine);
                        else if(shipID == 'crystal') container.insertBefore(shipLine, container.querySelectorAll('.ogl_movementItem')[1]);
                        else if(shipID == 'deut') container.insertBefore(shipLine, container.querySelectorAll('.ogl_movementItem')[2]);
                        else if(shipID == -1) container.prepend(shipLine);
                        else container.appendChild(shipLine);

                        let shipNumber = line.querySelector('td.value') ? line.querySelector('td.value').textContent : '0';
                        if(shipID && shipID != -1)
                        {
                            shipLine.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_'+shipID}));
                            shipLine.appendChild(Util.createDom('span', {'class':'ogl_'+shipID}, Util.formatToUnits(Util.formatNumber(shipNumber), 0).replace(' ','')));
                        }
                    }
                });
                
            });
        }
    }

    checkFleetMovements()
    {
        Util.loadPageContent(`https://${window.location.host}/game/index.php?page=componentOnly&component=eventList&action=checkEvents&ajax=1`, 'text/html', result =>
        {
            let idList = [];

            result.querySelectorAll('.eventFleet').forEach(line =>
            {
                let id = line.getAttribute('id').replace('eventRow-', '');
                let mission = line.getAttribute('data-mission-type');
                let back = line.getAttribute('data-return-flight') == 'false' ? false : true;

                if((mission == '1' && back)     // attack
                || mission == '3'               // transpo
                || mission == '4'               // deploy
                || (mission == '8' && back)     // harvest
                || (mission == '15' && back))   // expedition
                {
                    let target;
                    if(idList.indexOf(parseInt(id)) > -1) return;
                    if(mission == '3' && !back) idList.push(parseInt(id) + 1);

                    if(!back) target = line.querySelector('.destCoords').textContent.trim().slice(1,-1);
                    else target = line.querySelector('.coordsOrigin').textContent.trim().slice(1,-1);

                    this.ogl.component.planetManager.myPlanets[target] = this.ogl.component.planetManager.myPlanets[target] || {};

                    let tempElem = Util.createDom('div', {}, (line.querySelector('.icon_movement .tooltip') || line.querySelector('.icon_movement_reserve .tooltip')).getAttribute('title'));
                    if(tempElem.querySelectorAll('th').length > 1)
                    {
                        let trLen = tempElem.querySelectorAll('tr').length;

                        this.ogl.component.planetManager.myPlanets[target].inFlight = this.ogl.component.planetManager.myPlanets[target].inFlight || [0,0,0];

                        for(let i=0; i<3; i++)
                        {
                            let res = parseInt(tempElem.querySelectorAll('tr')[trLen-3+i].querySelector('.value').textContent.replace(/\./g,''));
                            this.ogl.component.planetManager.myPlanets[target].inFlight[i] += res;
                            this.ogl.totalResources[i] += res;
                        }
                    }
                }
            });

            let inFlightTotal = [0,0,0];
            let totalDiv = Util.createDom('div', {'class':'ogl_resourcesSum tooltip'}, '<i class="material-icons">functions</i>');
            (document.querySelector('#myPlanets') || document.querySelector('#myWorlds')).appendChild(totalDiv);

            ['metal','crystal','deut'].forEach((res, index) =>
            {
                totalDiv.appendChild(Util.createDom('span', {'class':'ogl_'+res}, Util.formatToUnits(this.ogl.totalResources[index])));
            });

            this.ogl.planetList.forEach(planet =>
            {
                let coords = planet.querySelector('.planet-koords').textContent.slice(1,-1);

                if(this.ogl.component.planetManager.myPlanets[coords].inFlight && this.ogl.component.planetManager.myPlanets[coords].inFlight.reduce((a, b) => a + b, 0) > 0)
                {
                    let content = this.ogl.component.langManager.getText('inFlight') + '<div class="splitLine"></div>';
                    let resources = ['metal', 'crystal', 'deut'];
                    let resourcesName = [this.ogl.component.langManager.getText('metal'), this.ogl.component.langManager.getText('crystal'), this.ogl.component.langManager.getText('deut')];
                    this.ogl.component.planetManager.myPlanets[coords].inFlight.forEach((res, index) =>
                    {
                        content += `<div>${resourcesName[index]}:&nbsp;<span class="ogl_${resources[index]} float_right">${Util.formatToUnits(res)}</span></div>`;
                        inFlightTotal[index] += parseInt(res);
                    });
                    planet.appendChild(Util.createDom('div', {'class':'tooltip ogl_inFlight', 'title':content}));
                }
            });
            
            totalDiv.title = this.ogl.component.langManager.getText('inFlight') + '<div class="splitLine"></div>';
            ['metal','crystal','deut'].forEach((res, index) =>
            {
                let resName = this.ogl.component.langManager.getText(res);
                totalDiv.title += `<div>${resName}:&nbsp;<span class="ogl_${res} float_right">${Util.formatToUnits(inFlightTotal[index])}</span></div>`;
            });
            
        });
    }

    checkPlanetList(forcedType)
    {
        setTimeout(() =>
        {
            let coords = `${document.querySelector('input#galaxy').value}:${document.querySelector('input#system').value}:${document.querySelector('input#position').value}`;
            let domElement = document.querySelector(`.ogl_planetList > div[data-coords="${coords}"]`);

            document.querySelectorAll('.ogl_planetList .ogl_active').forEach(e => e.classList.remove('ogl_active'));
            if(domElement)
            {
                if((document.querySelector('a#pbutton.planet_selected') && !forcedType) || forcedType == 1) domElement.querySelector('.ogl_planet').classList.add('ogl_active');
                if((document.querySelector('a#dbutton.debris_selected') && !forcedType) || forcedType == 2) domElement.querySelector('.ogl_cr').classList.add('ogl_active');
                if((document.querySelector('a#mbutton.moon_selected') && !forcedType) || forcedType == 3) domElement.querySelector('.ogl_moon') && domElement.querySelector('.ogl_moon').classList.add('ogl_active');
            }

            this.tempCoords = [fleetDispatcher.targetPlanet.galaxy, fleetDispatcher.targetPlanet.system,fleetDispatcher.targetPlanet.position, fleetDispatcher.targetPlanet.type];

            this.updatePlanetList(coords.split(':'), this.tempCoords[3]);
        }, 100);
    }

    updatePlanetList(coords, type)
    {
        let targetCoords = `${coords[0]}:${coords[1]}:${coords[2]}`;

        document.querySelector('.smallplanet .ogl_active') && document.querySelector('.smallplanet .ogl_active').classList.remove('ogl_active');
        let target = document.querySelector(`.smallplanet[data-coords="${targetCoords}"]`);

        if(target && type == 1)
        {
            document.querySelector(`.smallplanet[data-coords="${targetCoords}"] .planetlink`).classList.add('ogl_active');
        }
        else if(target && type == 3)
        {
            document.querySelector(`.smallplanet[data-coords="${targetCoords}"] .moonlink`).classList.add('ogl_active');
        }
    }

    rightMenuOptions()
    {
        // data button
        let dataButton = this.ogl.menuOptions.appendChild(Util.createDom('div', {'class':'material-icons ogl_manageData ogl_button tooltip', 'title':this.ogl.component.langManager.getText('oglConfig')}, 'settings'));
        dataButton.addEventListener('click', () =>
        {
            this.ogl.component.popupManager.load();

            let globalContainer = Util.createDom('div', {'class':'ogl_globalConfig'});
            let sideContainer = globalContainer.appendChild(Util.createDom('div'));
            let container = globalContainer.appendChild(Util.createDom('div', {'class':'ogl_config'}));

            sideContainer.appendChild(Util.createDom('h1', {'class':'ogl_scriptTitle'}, `OGLight <span>(v${GM_info.script.version})</span>`));
            sideContainer.appendChild(Util.createDom('hr'));
            sideContainer.appendChild(Util.createDom('p', {}, this.ogl.component.langManager.getText('kofi')));
            sideContainer.appendChild(Util.createDom('div', {}, "<a class='ogl_kofi' href='https://ko-fi.com/O4O22XV69' target='_blank'>Buy me a coffee</a>"));

            let rval = container.appendChild(Util.createDom('div', {}, '<span>Resources Value (RVal)</span>'));
            let rvalInput = rval.appendChild(Util.createDom('input', {'type':'text', 'class':'ogl_checkInput'}));
            rvalInput.value = this.ogl.json.options.rval;

            container.appendChild(Util.createDom('hr'));

            let minifyPictures = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('minifyPictures')}</span>`));
            let minifyToggle = minifyPictures.appendChild(Util.createDom('div', {'class':'ogl_confToggle'}));
            if(localStorage.getItem('ogl-minipics')) minifyToggle.classList.add('ogl_active');

            minifyToggle.addEventListener('click', () =>
            {
                if(localStorage.getItem('ogl-minipics'))
                {
                    localStorage.removeItem('ogl-minipics');
                    minifyToggle.classList.remove('ogl_active');
                }
                else
                {
                    localStorage.setItem('ogl-minipics', true);
                    minifyToggle.classList.add('ogl_active');
                }
            });

            let timers = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('displayTimers')}</span>`));
            timers.appendChild(Util.createDom('div', {'class':'ogl_confToggle ogl_active', 'data-conf':'timers'}));
            
            let stats = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('rentaStats')}</span>`));
            stats.appendChild(Util.createDom('div', {'class':'ogl_confToggle ogl_active', 'data-conf':'renta'}));

            let ignoreConsumption = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('excludeConso')}</span>`));
            ignoreConsumption.appendChild(Util.createDom('div', {'class':'ogl_confToggle ogl_active', 'data-conf':'ignoreConsumption'}));

            let spytable = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('spiesTable')}</span>`));
            spytable.appendChild(Util.createDom('div', {'class':'ogl_confToggle ogl_active', 'data-conf':'spytable'}));

            let autoclean = container.appendChild(Util.createDom('div', {}, `<span>${this.ogl.component.langManager.getText('autoClean')}</span>`));
            autoclean.appendChild(Util.createDom('div', {'class':'ogl_confToggle ogl_active', 'data-conf':'autoclean'}));

            container.appendChild(Util.createDom('hr'));

            let data;

            let dataDiv = container.appendChild(Util.createDom('div', {'class':'ogl_manageData'}));
            dataDiv.appendChild(Util.createDom('span', {}, 'Manage data'));

            let resetButton = dataDiv.appendChild(Util.createDom('button', {'class':'ogl_button'}, 'RESET'));
            resetButton.addEventListener('click', () =>
            {
                if(confirm('Do you really want to reset your data ?'))
                {
                    Util.saveData({});
                    document.location.reload();
                } 
            });

            dataDiv.appendChild(Util.createDom('label', {'class':'ogl_button', 'for':'ogl_import'}, 'IMPORT'));
            let importButton = dataDiv.appendChild(Util.createDom('input', {'id':'ogl_import', 'class':'ogl_hidden', 'type':'file'}));
            importButton.addEventListener('change', () =>
            {
                let file = importButton.files[0];

                let reader = new FileReader();
                reader.onload = () =>
                {
                    try { JSON.parse(reader.result); }
                    catch (e) { return false; }
                    data = reader.result;
                };
                reader.readAsText(file);
            });

            let exportButton = dataDiv.appendChild(Util.createDom('a', {'class':'ogl_button', 'download':`ogl_${this.ogl.universeName}_${this.ogl.lang}_${Date.now()}.txt`}, 'EXPORT'));
            exportButton.href = URL.createObjectURL(new Blob([JSON.stringify(this.ogl.json)], {type: 'application/json'}));

            let saveButton = container.appendChild(Util.createDom('button', {'class':'ogl_button'}, 'SAVE'));
            saveButton.addEventListener('click', () =>
            {
                this.ogl.json.options.rval = Util.formatFromUnits(rvalInput.value || '0');
                if(data)
                {
                    this.ogl.json = JSON.parse(data);
                }

                Util.saveData(this.ogl.json);
                document.location.reload();
            });
            container.querySelectorAll('.ogl_confToggle[data-conf]').forEach(button =>

            {
                let id = button.getAttribute('data-conf');

                if(this.ogl.json.options.togglesOff.indexOf(id) > -1) button.classList.remove('ogl_active');

                button.addEventListener('click', () =>
                {
                    let index = this.ogl.json.options.togglesOff.indexOf(id);
                    index > -1 ? this.ogl.json.options.togglesOff.splice(index, 1) : this.ogl.json.options.togglesOff.push(id);
                    button.classList.toggle('ogl_active');
                });
            });

            this.ogl.component.popupManager.open(globalContainer);
        });


        // default cargo button
        let cargoButton = this.ogl.menuOptions.appendChild(Util.createDom('div', {'class':'ogl_shipPicker tooltipLeft tooltipClick tooltipRel ogl_button', 'rel':'ogl_defaultShipPicker'}));
        cargoButton.textContent = this.ogl.component.langManager.getText('abbr' + this.ogl.json.options.defaultShip);

        let container = document.body.appendChild(Util.createDom('div', {'style':'display:none;'}));
        let cargoChoice = container.appendChild(Util.createDom('div', {'id':'ogl_defaultShipPicker', 'class':'ogl_shipList'}));
        [202, 203, 219, 210].forEach(shipID =>
        {
            let cargoType = cargoChoice.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_'+shipID}));
            cargoType.addEventListener('click', () =>
            {
                this.ogl.json.options.defaultShip = shipID;
                Util.saveData(this.ogl.json);
                document.location.reload();
            });
        });

        // default mission button
        let mission = this.ogl.json.options.defaultMission;
        let missionButton = this.ogl.menuOptions.appendChild(Util.createDom('div', {'class':'material-icons tooltip ogl_button ogl_missionPicker'+mission, 'title':this.ogl.component.langManager.getText('defaultMission')}, mission == 3 ? 'swap_horiz' : 'keyboard_tab'));
        missionButton.addEventListener('click', () =>
        {
            this.ogl.json.options.defaultMission = mission == 3 ? 4 : 3;
            Util.saveData(this.ogl.json);
            window.location.href = window.location.href.replace(`&mission=${mission}`, `&mission=${this.ogl.json.options.defaultMission}`);
        });

        let nextElementWithMoon = this.ogl.current.smallplanet;

        if(document.querySelector('.moonlink'))
        {
            if(!this.ogl.current.smallplanet.querySelector('.moonlink') || this.ogl.mode == 1 || this.ogl.mode == 4)
            {
                do nextElementWithMoon = nextElementWithMoon.nextElementSibling || document.querySelectorAll('.smallplanet')[0];
                while(!nextElementWithMoon.querySelector('.moonlink'));
            }
        }

        let harvestAction = (mode, origin, destination) =>
        {
            let link = `?page=ingame&component=fleetdispatch&galaxy=${destination.coords[0]}&system=${destination.coords[1]
            }&position=${destination.coords[2]}&type=${destination.type}&mission=${this.ogl.json.options.defaultMission}&cp=${origin.cp}&oglMode=${mode}`;

            if(mode == 4) this.ogl.json.options.autoHarvest = [origin.coords[0], origin.coords[1], origin.coords[2], origin.type];
            else this.ogl.json.options.autoHarvest = [destination.coords[0], destination.coords[1], destination.coords[2], destination.type];

            this.ogl.json.options.harvestInitialPlanet = origin.cp;
            Util.saveData(this.ogl.json);
            
            window.location.href = this.ogl.baselink + link;
        }

        // auto harvest button
        let loopButton = this.ogl.menuOptions.appendChild(Util.createDom('div', {'class':'material-icons ogl_harvest ogl_button ogl_button tooltip', 'title':this.ogl.component.langManager.getText('autoCollect')}, 'all_inclusive'));
        loopButton.addEventListener('click', () =>
        {
            this.ogl.component.popupManager.load();

            let dom = Util.createDom('div', {'class':'ogl_planetList'});
            let planetList = this.ogl.component.planetManager.myPlanets;
            let origin, destination;

            // harvest planet to its associated moon
            if(nextElementWithMoon)
            {
                let linkedMoon = dom.appendChild(Util.createDom('button', {'class':'ogl_linkedMoon ogl_button'}, this.ogl.component.langManager.getText('linkedMoons')));
                linkedMoon.addEventListener('click', () =>
                {
                    origin = { coords:nextElementWithMoon.querySelector('.planet-koords').textContent.slice(1,-1).split(':'), type:1, cp:nextElementWithMoon.getAttribute('id').replace('planet-', '') };
                    destination = { coords:nextElementWithMoon.querySelector('.planet-koords').textContent.slice(1,-1).split(':'), type:3 };
                    harvestAction(4, origin, destination);
                });
            }

            // harvest planet/moon to the chosen location
            Object.keys(planetList).forEach(planet =>
            {
                origin = { coords:this.ogl.current.coords, type:(this.ogl.current.type == 'moon' ? 3 : 1) };

                if(origin.type == 1) origin.cp = this.ogl.current.smallplanet.getAttribute('id').replace('planet-', '');
                else origin.cp = new URL(this.ogl.current.smallplanet.querySelector('.moonlink').href).searchParams.get('cp');

                let line = dom.appendChild(Util.createDom('div', {'data-coords':planetList[planet].coords, 'data-multi':planetList[planet].multi}));
                line.appendChild(Util.createDom('div', {'class':'ogl_coords'}, `[${planetList[planet].coords}] <b>${planetList[planet].name}</b>`));

                let buttons = line.appendChild(Util.createDom('div', {'class':'ogl_actions'}));

                // planet
                let pButton = buttons.appendChild(Util.createDom('div', {'class':'ogl_planet material-icons', 'data-type':'1'}, 'language'));
                if(planet == origin.coords.join(':') && origin.type == 1) pButton.classList.add('ogl_disabled');
                pButton.addEventListener('click', () =>
                {
                    destination = { coords:planetList[planet].coords.split(':'), type:1 };
                    harvestAction(1, origin, destination);
                });

                // moon
                if(planetList[planet].moon)
                {
                    let mButton = buttons.appendChild(Util.createDom('div', {'class':'ogl_planet material-icons', 'data-type':'3'}, 'brightness_2'));
                    if(planet == origin.coords.join(':') && origin.type == 3) mButton.classList.add('ogl_disabled');
                    mButton.addEventListener('click', () =>
                    {
                        destination = { coords:planetList[planet].coords.split(':'), type:3 };
                        harvestAction(1, origin, destination);
                    });
                }
            });

            this.ogl.component.popupManager.open(dom);
        });

        if((this.ogl.mode == 1 || this.ogl.mode == 4) && Util.getPage() == 'fleetdispatch')
        {
            let nextElement;
            loopButton.classList.add('ogl_active');

            if(this.ogl.mode == 1) 
            {
                nextElement = this.ogl.current.type == 'moon' ? nextElementWithMoon : this.ogl.current.next;
                let coords = this.ogl.json.options.autoHarvest.join(':');

                if(this.ogl.current.type == 'planet')
                {
                    if(coords == nextElement.getAttribute('data-coords')+':1')
                    {
                        nextElement = nextElement.nextElementSibling || document.querySelectorAll('.smallplanet')[0];
                    }
                }
                else
                {
                    if(coords == nextElement.getAttribute('data-coords')+':3')
                    {
                        do nextElement = nextElement.nextElementSibling || document.querySelectorAll('.smallplanet')[0];
                        while(!nextElement.querySelector('.moonlink'));
                    }
                }
            }
            else
            {
                nextElement = nextElementWithMoon;
                this.ogl.json.options.autoHarvest = (nextElementWithMoon.getAttribute('data-coords')+':3').split(':');
            }

            let coords = this.ogl.json.options.autoHarvest;
            let cp;
            let link;

            if(this.ogl.current.type == 'planet') cp = nextElement.getAttribute('id').replace('planet-', '');
            else cp = new URL(nextElement.querySelector('.moonlink').href).searchParams.get('cp');

            if(cp == this.ogl.json.options.harvestInitialPlanet) link = `?page=ingame&component=overview&cp=${cp}`;
            else
            {
                link = `?page=ingame&component=fleetdispatch&galaxy=${coords[0]}&system=${coords[1]
                }&position=${coords[2]}&type=${coords[3]}&mission=${mission}&cp=${cp}&oglMode=${this.ogl.mode}`;
            }

            this.nextLink = link;

            Util.overwriteFleetDispatcher('trySubmitFleet2', false, () =>
            {
                fleetDispatcher.selectMaxAll();
                fleetDispatcher.refresh();
            });

            Util.overwriteFleetDispatcher('submitFleet3', false, () =>
            {
                if(fleetDispatcher.currentPage == 'fleet3') localStorage.setItem('ogl-redirect', this.ogl.baselink + link);
            });
        }
    }

    expedition()
    {
        let div = document.querySelector('#fleetdispatchcomponent .allornonewrap .secondcol');

        //let mainShipButton = div.appendChild(Util.createDom('div', {'data-ratio':'1', 'class':`ogl_shipIcon ogl_${this.ogl.json.options.expeShips[0]}`}));
        //let subShipButton = div.appendChild(Util.createDom('div', {'data-ratio':this.ogl.json.options.expeShips[2]}));
        this.expeButton = div.appendChild(Util.createDom('div', {'class':'ogl_expeButton'}));

        /*if([202,203,219].indexOf(this.ogl.json.options.expeShips[0]) > -1) subShipButton.className = 'ogl_shipIcon ogl_0';
        else subShipButton.className = 'ogl_active ogl_shipIcon ogl_'+this.ogl.json.options.expeShips[1];

        mainShipButton.addEventListener('click', () =>
        {
            let container = Util.createDom('div', {'class':'ogl_shipList'});

            [202,203,204,205,206,207,209,211,213,214,215,218,219].forEach(shipID =>
            {
                let ship = container.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_'+shipID}));
                ship.addEventListener('click', () =>
                {
                    mainShipButton.classList.remove('ogl_'+this.ogl.json.options.expeShips[0]);
                    mainShipButton.classList.add('ogl_'+shipID);
                    this.ogl.json.options.expeShips[0] = shipID;

                    if([202,203,219].indexOf(shipID) > -1) subShipButton.className = 'ogl_shipIcon ogl_0';
                    else subShipButton.className = 'ogl_active ogl_shipIcon ogl_'+this.ogl.json.options.expeShips[1];

                    Util.saveData(this.ogl.json);
                    this.ogl.component.popupManager.close();
                });
            });

            this.ogl.component.popupManager.open(container);
        });

        subShipButton.addEventListener('click', () =>
        {
            if([202,203,219].indexOf(this.ogl.json.options.expeShips[0]) > -1) return;

            let container = Util.createDom('div', {'class':'ogl_shipList'});

            [202,203,219,0].forEach(shipID =>
            {
                let ship = container.appendChild(Util.createDom('div', {'class':'ogl_shipIcon ogl_'+shipID}));
                ship.addEventListener('click', () =>
                {
                    subShipButton.classList.remove('ogl_'+this.ogl.json.options.expeShips[1]);
                    subShipButton.classList.add('ogl_'+shipID);
                    this.ogl.json.options.expeShips[1] = shipID;

                    Util.saveData(this.ogl.json);
                    this.ogl.component.popupManager.close();
                });
            });

            let expeRatio = container.appendChild(Util.createDom('input', {'class':'ogl_expeRatio', 'type':'number', 'value':this.ogl.json.options.expeShips[2], 'min':'0', 'max':'2', 'step':'0.1' }));

            expeRatio.addEventListener('input', () =>
            {
                if(!expeRatio.checkValidity()) expeRatio.value = '0';
                expeRatio.value = parseFloat(expeRatio.value);
                this.ogl.json.options.expeShips[2] = expeRatio.value;
                subShipButton.setAttribute('data-ratio', expeRatio.value);
                Util.saveData(this.ogl.json);
            });

            this.ogl.component.popupManager.open(container);
        });*/

        this.expeButtonAction = forcedShip =>
        {
            fleetDispatcher.resetShips();
            if(forcedShip) this.ogl.json.options.expeShips[0] = this.ogl.json.options.defaultShip; // NO MILI EXPE

            let mainAmount, subAmount, fillerId = 0;
            let coords = [fleetDispatcher.currentPlanet.galaxy, fleetDispatcher.currentPlanet.system, fleetDispatcher.currentPlanet.position];

            if([202,203,219].indexOf(this.ogl.json.options.expeShips[0]) > -1)
            {
                let maxTotal = 0;
                let minShip = 0;
                let currentStep = 0;

                let steps =
                {
                    10000 : { 202:273, 203:91, 219:137, max:40000 },
                    100000 : { 202:423, 203:141, 219:212, max:500000 },
                    1000000 : { 202:423, 203:191, 219:212, max:1200000 },
                    5000000 : { 202:423, 203:191, 219:212, max:1800000 },
                    25000000 : { 202:573, 203:191, 219:287, max:2400000 },
                    50000000 : { 202:723, 203:241, 219:362, max:3000000 },
                    75000000 : { 202:873, 203:291, 219:437, max:3600000 },
                    100000000 : { 202:1023, 203:341, 219:512, max:4200000 },
                    999999999999999999999999999999 : { 202:1223, 203:417, 219:612, max:5000000 },
                }

                for(const [key, value] of Object.entries(steps))
                {
                    if(this.ogl.json.topScore[0] < key && !currentStep)
                    {
                        currentStep = key;
                        break;
                    }
                }

                maxTotal = steps[currentStep]['max'];
                minShip = steps[currentStep][this.ogl.json.options.expeShips[0]];
                maxTotal = this.ogl.json.playerClass == 3 ? maxTotal * 3 * this.ogl.ecoSpeed : maxTotal * 2;
                mainAmount = Math.max(minShip, this.calcRequiredShips(this.ogl.json.options.expeShips[0], maxTotal));
            }
            else
            {
                mainAmount = parseInt(document.querySelector(`.technology[data-technology="${this.ogl.json.options.expeShips[0]}"] .amount`).getAttribute('data-value'));
                mainAmount = (Math.floor(mainAmount / (fleetDispatcher.maxExpeditionCount - fleetDispatcher.expeditionCount)) || 0);
                subAmount = Math.floor(mainAmount * this.ogl.json.options.expeShips[2]);
            }

            let priority = [218, 213, 211, 215, 207];

            priority.forEach(shipID =>
            {
                let count = document.querySelector(`.technology[data-technology="${shipID}"] .amount`).getAttribute('data-value');
                if(fillerId == 0 && count > 0) fillerId = shipID;
            });

            shipsOnPlanet.forEach(ship =>
            {
                if(ship.id == this.ogl.json.options.expeShips[0]) fleetDispatcher.selectShip(ship.id, mainAmount);
                else if(ship.id == this.ogl.json.options.expeShips[1] && subAmount) fleetDispatcher.selectShip(ship.id, subAmount);
                else if(ship.id == fillerId && this.ogl.json.options.expeShips[0] != fillerId) fleetDispatcher.selectShip(ship.id, 1);
                else if(ship.id == 210) fleetDispatcher.selectShip(ship.id, 1);
                else if(ship.id == 219 && this.ogl.json.options.expeShips[0] != 219 && this.ogl.json.options.expeShips[1] != 219) fleetDispatcher.selectShip(ship.id, 1);
            });

            fleetDispatcher.targetPlanet.galaxy = coords[0];
            fleetDispatcher.targetPlanet.system = coords[1];
            fleetDispatcher.targetPlanet.position = 16;
            fleetDispatcher.targetPlanet.type = 1;
            fleetDispatcher.targetPlanet.name = '-';
            fleetDispatcher.mission = 15;
            fleetDispatcher.expeditionTime = 1;
            fleetDispatcher.refresh();
            
            this.tempCoords = [fleetDispatcher.targetPlanet.galaxy, fleetDispatcher.targetPlanet.system,fleetDispatcher.targetPlanet.position, fleetDispatcher.targetPlanet.type];
            
            setTimeout(() => document.querySelector('#continueToFleet2').focus(), 100);
        }

        this.expeButton.addEventListener('click', () => this.expeButtonAction(true));
    }

    addFretInfoUI()
    {
        let container = document.querySelector('#fleet1 .allornonewrap').appendChild(Util.createDom('div', {'class':'ogl_capacityContainer ogl_button tooltip', 'title':this.ogl.component.langManager.getText('capacityPicker')}));
        let dom = container.appendChild(Util.createDom('div', {'class':'ogl_capacityInfo'}));

        let capacityValues = dom.appendChild(Util.createDom('p'));
        let current = dom.appendChild(Util.createDom('div', {'class':'ogl_capacityCurrent'}));
        let required = dom.appendChild(Util.createDom('div', {'class':'ogl_capacityRequired'}, this.ogl.component.langManager.getText('required') + ' ' + Util.formatNumber(fleetDispatcher.totalOnPlanet)));
        container.appendChild(Util.createDom('i', {'class':'material-icons'}, 'launch'));

        required.appendChild(Util.createDom('div'));
        required.style.width = Math.min(fleetDispatcher.totalOnPlanet / fleetDispatcher.totalFret * 100, 100) + '%';
        if(fleetDispatcher.totalOnPlanet > fleetDispatcher.totalFret) bar.classList.add('ogl_active');

        let updateData = () =>
        {
            let domWidth = fleetDispatcher.getCargoCapacity() / fleetDispatcher.totalFret * 100;
            current.style.width = domWidth + '%';

            capacityValues.innerHTML = `<span class="float_right"><b>${Util.formatNumber(fleetDispatcher.getCargoCapacity())}</b> / <b>${Util.formatNumber(fleetDispatcher.totalFret)}</b></span>`;
        };

        Util.loop(() => updateData());

        container.addEventListener('click', () =>
        {
            this.ogl.component.popupManager.load();

            let domPick = Util.createDom('div', {'class':'ogl_choseCapacity'});
            domPick.appendChild(Util.createDom('h2', {}, this.ogl.component.langManager.getText('capacityPicker')));

            let metal = domPick.appendChild(Util.createDom('div', {}, '<div class="ogl_shipIcon ogl_metal"></div>'));
            let inputMetal = metal.appendChild(Util.createDom('input', {'type':'text', 'placeholder':this.ogl.component.langManager.getText('metal'), 'class':'ogl_checkInput'}));

            let crystal = domPick.appendChild(Util.createDom('div', {}, '<div class="ogl_shipIcon ogl_crystal"></div>'));
            let inputCrystal = crystal.appendChild(Util.createDom('input', {'type':'text', 'placeholder':this.ogl.component.langManager.getText('crystal'), 'class':'ogl_checkInput'}));

            let deut = domPick.appendChild(Util.createDom('div', {}, '<div class="ogl_shipIcon ogl_deut"></div>'));
            let inputDeut = deut.appendChild(Util.createDom('input', {'type':'text', 'placeholder':this.ogl.component.langManager.getText('deut'), 'class':'ogl_checkInput'}));

            let button = domPick.appendChild(Util.createDom('button', {'class':'ogl_button'}, 'ok'));
            this.ogl.component.popupManager.open(domPick);

            Util.clickOrKeydown(button, 13, () =>
            {
                if(inputMetal.value || inputCrystal.value || inputDeut.value)
                {
                    let res = [Util.formatFromUnits(inputMetal.value) || 0, Util.formatFromUnits(inputCrystal.value) || 0, Util.formatFromUnits(inputDeut.value) || 0];
                    let sum = res.reduce((a, b) => a + b, 0);

                    let shipID = this.ogl.json.options.defaultShip;
                    let required = this.calcRequiredShips(shipID, sum);

                    this.shipsOnPlanet[shipID] = this.shipsOnPlanet[shipID] || {number:0};
                    fleetDispatcher.selectShip(shipID, Math.min(required, this.shipsOnPlanet[shipID].number));

                    fleetDispatcher.cargoMetal = Math.min(this.ogl.component.fleetManager.resOnPlanet[0], res[0], fleetDispatcher.getFreeCargoSpace());
                    fleetDispatcher.cargoCrystal = Math.min(this.ogl.component.fleetManager.resOnPlanet[1], res[1], fleetDispatcher.getFreeCargoSpace());
                    fleetDispatcher.cargoDeuterium = Math.min(this.ogl.component.fleetManager.resOnPlanet[2], res[2], fleetDispatcher.getFreeCargoSpace());
                    fleetDispatcher.refresh();
                }

                this.ogl.component.popupManager.close();
                setTimeout(() => document.querySelector('#continueToFleet2').focus(), 100);
            }, true);
        });
    }

    addRequiredUI()
    {
        let shipList = [202,203,209,210,219];

        document.querySelectorAll('#fleet1 .technology').forEach(technology =>
        {
            let shipID = parseInt(technology.getAttribute('data-technology'));

            if(shipList.indexOf(shipID) < 0) return;

            let required = this.calcRequiredShips(shipID, this.totalOnPlanet);

            if(isFinite(required))
            {
                let dom = Util.createDom('div', {'class':'ogl_required'}, Util.formatNumber(required));
                technology.querySelector('.icon').appendChild(dom);
                dom.addEventListener('click', event =>
                {
                    event.preventDefault();
                    event.stopPropagation();
                    
                    this.shipsOnPlanet[shipID] = this.shipsOnPlanet[shipID] || {number:0};
                    fleetDispatcher.selectShip(shipID, Math.min(required, this.shipsOnPlanet[shipID].number));
                    fleetDispatcher.refresh();

                    setTimeout(() => document.querySelector('#continueToFleet2').focus(), 100);
                });
            }
        });
    }

    updateSpeedPercent()
    {
        this.sliderSpeed.querySelectorAll('div').forEach(e => e.classList.remove('ogl_active'));
        this.sliderSpeed.querySelector(`[data-step="${fleetDispatcher.speedPercent}"]`).classList.add('ogl_active');
    }

    addFleet2UI()
    {
        document.querySelector('#speedPercentage').classList.add('ogl_hidden');

        this.sliderSpeed = Util.createDom('div', {'class':'ogl_fleetSpeed'});
        if(this.ogl.json.playerClass == 2) this.sliderSpeed.classList.add('ogl_big');
        document.querySelector('#fleet2 .content').insertBefore(this.sliderSpeed, document.querySelector('#fleet2 .content .briefing'));

        let steps = this.ogl.json.playerClass == 2 ? .5 : 1;

        for(let i=steps; i<=10; i+=steps)
        {
            let step = this.sliderSpeed.appendChild(Util.createDom('div', {'data-step':i}, i*10));
            if(fleetDispatcher.speedPercent == i) step.classList.add('ogl_active');
        }

        this.sliderSpeed.addEventListener('click', event =>
        {
            if(!event.target.getAttribute('data-step')) return;

            this.sliderSpeed.querySelectorAll('div').forEach(e => e.classList.remove('ogl_active'));
            event.target.classList.add('ogl_active');
            fleetDispatcher.speedPercent = event.target.getAttribute('data-step');
            fleetDispatcher.refresh();

            setTimeout(() => document.querySelector('#continueToFleet3').focus(), 100);
        });

        this.sliderSpeed.addEventListener('mouseover', event =>
        {
            fleetDispatcher.speedPercent = event.target.getAttribute('data-step');
            fleetDispatcher.refresh();
        });

        this.sliderSpeed.addEventListener('mouseout', event =>
        {
            fleetDispatcher.speedPercent = this.sliderSpeed.querySelector('.ogl_active').getAttribute('data-step');
            fleetDispatcher.refresh();
        });

        let dom = Util.createDom('div', {'class':'ogl_planetList'});
        // document.querySelector('#fleet2 #buttonz').insertBefore(dom, document.querySelector('#fleet2 .content'));
        document.querySelector('#fleet2 #buttonz').appendChild(dom);

        document.querySelectorAll('input#galaxy, input#system, input#position').forEach(input =>
        {
            input.addEventListener('input', () => this.checkPlanetList());
        });

        document.querySelectorAll('a#pbutton, a#mbutton, a#dbutton').forEach(button =>
        {
            button.addEventListener('click', () => this.checkPlanetList());
        });

        let planetList = this.ogl.component.planetManager.myPlanets;

        dom.addEventListener('click', event =>
        {
            if(!event.target.classList.contains('ogl_planet')
            && !event.target.classList.contains('ogl_moon')
            && !event.target.classList.contains('ogl_cr')) return;

            let coords = event.target.closest('[data-coords]').getAttribute('data-coords').split(':');
            let type = event.target.getAttribute('data-type');

            this.updatePlanetList(coords, type);

            this.tempCoords = coords;
            this.tempCoords.push(type);

            dom.querySelectorAll('.ogl_active').forEach(e => e.classList.remove('ogl_active'));
            event.target.classList.add('ogl_active');

            fleetDispatcher.targetPlanet.galaxy = coords[0];
            fleetDispatcher.targetPlanet.system = coords[1];
            fleetDispatcher.targetPlanet.position = coords[2];
            fleetDispatcher.targetPlanet.type = parseInt(type);
            fleetDispatcher.refresh();
            
            setTimeout(() => document.querySelector('#continueToFleet3').focus(), 100);
        });
        
        let hasFocus = false;

        dom.addEventListener('mouseover', event =>
        {
            if(!event.target.classList.contains('ogl_planet')
            && !event.target.classList.contains('ogl_moon')
            && !event.target.classList.contains('ogl_cr')) return;
            
            let coords = event.target.closest('[data-coords]').getAttribute('data-coords').split(':');
            let type = event.target.getAttribute('data-type');

            this.updatePlanetList(coords, type);

            fleetDispatcher.targetPlanet.galaxy = coords[0];
            fleetDispatcher.targetPlanet.system = coords[1];
            fleetDispatcher.targetPlanet.position = coords[2];
            fleetDispatcher.targetPlanet.type = parseInt(event.target.getAttribute('data-type'));
            fleetDispatcher.refresh();

            hasFocus = true;
        });

        dom.addEventListener('mouseout', event =>
        {
            if(hasFocus)
            {
                let params = new URL(window.location.href);
                let g = params.searchParams.get('galaxy');
                let s = params.searchParams.get('system');
                let p = params.searchParams.get('position');
                let t = params.searchParams.get('type');
    
                let type = parseInt(this.tempCoords[3]);
                let coords = `${this.tempCoords[0]}:${this.tempCoords[1]}:${this.tempCoords[2]}`.split(':');
    
                fleetDispatcher.targetPlanet.galaxy = g || this.tempCoords[0];
                fleetDispatcher.targetPlanet.system = s || this.tempCoords[1];
                fleetDispatcher.targetPlanet.position = p || this.tempCoords[2];
                fleetDispatcher.targetPlanet.type = t || type;
    
                this.updatePlanetList(coords, type);
    
                fleetDispatcher.refresh();
                hasFocus = false;
            }
            else
            {
                this.tempCoords[0] = fleetDispatcher.targetPlanet.galaxy;
                this.tempCoords[1] = fleetDispatcher.targetPlanet.system;
                this.tempCoords[2] = fleetDispatcher.targetPlanet.position;
                this.tempCoords[3] = fleetDispatcher.targetPlanet.type;
            }
        });

        Object.keys(planetList).forEach(planet =>
        {
            let line = dom.appendChild(Util.createDom('div'));
            line.setAttribute('data-coords', planetList[planet].coords);
            line.setAttribute('data-multi', planetList[planet].multi);

            let isCurrent = false;
            let isSource = false;

            if(planetList[planet].galaxy == fleetDispatcher.targetPlanet.galaxy && planetList[planet].system == fleetDispatcher.targetPlanet.system
            && planetList[planet].position == fleetDispatcher.targetPlanet.position) isCurrent = true;

            if(planetList[planet].galaxy == fleetDispatcher.currentPlanet.galaxy && planetList[planet].system == fleetDispatcher.currentPlanet.system
            && planetList[planet].position == fleetDispatcher.currentPlanet.position) isSource = true;

            line.appendChild(Util.createDom('div', {'class':'ogl_coords'}, `${planetList[planet].coords}`));
            //line.appendChild(Util.createDom('div', {'class':'ogl_name'}, `${planetList[planet].name}`));

            let buttons = line.appendChild(Util.createDom('div', {'class':'ogl_actions'}));
            let p = buttons.appendChild(Util.createDom('div', {'class':'ogl_planet material-icons', 'data-type':'1'}, 'language'));

            if(planetList[planet].moon)
            {
                let m = buttons.appendChild(Util.createDom('div', {'class':'ogl_moon material-icons', 'data-type':'3'}, 'brightness_2'));
                if(this.ogl.current.type == 'moon' && isSource == true) m.classList.add('ogl_disabled');
                if(fleetDispatcher.targetPlanet.type == 3 && isCurrent == true) m.classList.add('ogl_active');
            }
            else
            {
                buttons.appendChild(Util.createDom('div', {'class':'ogl_moon material-icons ogl_disabled', 'data-type':'3'}, 'brightness_2'));
            }

            let c = buttons.appendChild(Util.createDom('div', {'class':'ogl_cr', 'data-type':'2'}));
            c.appendChild(Util.createDom('img', {'src':'https://gf1.geo.gfsrv.net/cdnc5/fa3e396b8af2ae31e28ef3b44eca91.gif'}));

            if(this.ogl.current.type == 'planet' && isSource == true) p.classList.add('ogl_disabled');
            if(fleetDispatcher.targetPlanet.type == 1 && isCurrent == true) p.classList.add('ogl_active');
            //if(fleetDispatcher.targetPlanet.type == 2 && isCurrent == true) c.classList.add('ogl_disabled');
        });
    }

    addFleet3UI()
    {
        let resourcesNames = [loca.LOCA_ALL_METAL, loca.LOCA_ALL_CRYSTAL, loca.LOCA_ALL_DEUTERIUM];

        document.querySelectorAll('#fleet3 #resources .res_wrap').forEach((resource, index) =>
        {
            let cargoType = ['cargoMetal', 'cargoCrystal', 'cargoDeuterium'];

            let edit = resource.querySelector('.res').appendChild(Util.createDom('div', {'class':'ogl_resourceSaver'}, '$'));
            if(this.ogl.json.options.resSaver[index]) edit.textContent = '-' + Util.formatToUnits(this.ogl.json.options.resSaver[index]);

            resource.querySelector('input').classList.add('ogl_checkInput');

            let deltaResources = resource.querySelector('.res').appendChild(Util.createDom('div', {'class':'ogl_delta material-icons'}, 'fiber_smart_record'));
            deltaResources.addEventListener('click', () =>
            {
                let resourceValue = Util.formatFromUnits(resource.querySelector('input').value) || 0;
                let currentMax = this.resOnPlanet[index];
                
                if(index == 2) currentMax -= fleetDispatcher.getConsumption();

                fleetDispatcher[cargoType[index]] = Math.max(Math.min(currentMax - resourceValue, currentMax), 0);
                resource.querySelector('input').value = fleetDispatcher[cargoType[index]];

                setTimeout(() => document.querySelector('#sendFleet').focus(), 100);
            });

            edit.addEventListener('click', () =>
            {
                this.ogl.component.popupManager.load();

                let container = Util.createDom('div', {'class':'ogl_resourceToKeep'});
                container.appendChild(Util.createDom('h2', {}, `${resourcesNames[index]} to keep on planet`));
                let input = container.appendChild(Util.createDom('input', {'type':'text', 'class':'ogl_checkInput'}));
                let validate = container.appendChild(Util.createDom('button', {'class':'ogl_button'}, 'ok'));

                this.ogl.component.popupManager.open(container);

                validate.addEventListener('click', () =>
                {
                    if(input.value || input.value == 0)
                    {
                        let resType = ['metalOnPlanet', 'crystalOnPlanet', 'deuteriumOnPlanet'];
                        let rawInput = Util.formatFromUnits(input.value);
                        let currentValue = fleetDispatcher[resType[index]];

                        window[resType[index]] = fleetDispatcher[resType[index]] = Math.max(0, this.initialResOnPlanet[index] - rawInput);

                        this.ogl.json.options.resSaver[index] = rawInput;
                        edit.textContent = input.value == 0 ? '$' : '-' + Util.formatToUnits(input.value);

                        fleetDispatcher.resetCargo();
                        fleetDispatcher.refresh();

                        this.resOnPlanet = [fleetDispatcher.metalOnPlanet, fleetDispatcher.crystalOnPlanet, fleetDispatcher.deuteriumOnPlanet];

                        Util.saveData(this.ogl.json);
                    }

                    this.ogl.component.popupManager.close(container);
                    setTimeout(() => document.querySelector('#sendFleet').focus(), 100);
                });
            });
        });

        let allButton = Util.createDom('div', {'class':'ogl_button ogl_loadAllResources material-icons'}, 'double_arrow');
        document.querySelector('#fleet3 #loadAllResources').appendChild(allButton);

        allButton.addEventListener('click', () =>
        {
            fleetDispatcher.selectMaxAll();
            fleetDispatcher.refresh();

            setTimeout(() => document.querySelector('#sendFleet').focus(), 100);
        });

        let noneButton = Util.createDom('div', {'class':'ogl_button ogl_loadAllResources material-icons'}, 'clear');
        document.querySelector('#fleet3 #loadAllResources').appendChild(noneButton);

        noneButton.addEventListener('click', () =>
        {
            fleetDispatcher.resetCargo();
            fleetDispatcher.refresh();

            setTimeout(() => document.querySelector('#sendFleet').focus(), 100);
        });
    }

    addDeltaUI()
    {
        document.querySelectorAll('#fleet1 .technology').forEach(technology =>
        {
            let shipID = parseInt(technology.getAttribute('data-technology'));

            let dom = Util.createDom('div', {'class':'ogl_delta material-icons'}, 'fiber_smart_record');
            technology.querySelector('.icon').appendChild(dom);
            dom.addEventListener('click', event =>
            {
                event.preventDefault();
                event.stopPropagation();

                fleetDispatcher.selectShip(shipID, this.deltaSelectedShips(shipID));
                fleetDispatcher.refresh();

                setTimeout(() => document.querySelector('#continueToFleet2').focus(), 100);
            });
        });
    }

    addBackTimer()
    {
        document.querySelectorAll('.reversal a').forEach(button =>
        {
            let time = button.getAttribute('data-tooltip') || button.getAttribute('title');
            time = time.replace('<br>',' ');
            time = time.replace(/ \.$/, '');
            time = time.trim().replace(/[ \.]/g, ':');
            time = time.split(':');

            let initialTime = Date.now();

            let domElement = button.closest('.fleetDetails').appendChild(Util.createDom('div', {'class':'ogl_fulldate ogl_hiddenContent ogl_timeZone ogl_backTimer'}));

            setInterval(() =>
            {
                let deltaTime = Date.now() - initialTime;
                this.updateBackTimer(domElement, time, deltaTime);
            }, 200);
        });
    }

    updateBackTimer(parent, time, offset)
    {
        let newTime = new Date(`${time[4]}-${time[3]}-${time[2]}T${time[5]}:${time[6]}:${time[7]}`).getTime();
        newTime = new Date((newTime - Math.round(timeDiff / 100000) * 100000) + offset * 2);

        parent.setAttribute('data-timestamp', newTime.getTime());
        parent.setAttribute('data-datezone', `${newTime.toLocaleDateString('fr-FR').replace(/\//g, '.')} `);
        parent.setAttribute('data-timezone', ` ${newTime.toLocaleTimeString('fr-FR')}`);
    }

    calcRequiredShips(shipID, resources)
    {
        let fret = this.ogl.json.shipCapacity[shipID];
        let required = Math.ceil(parseInt(resources) / parseInt(fret));

        return required;
    }

    deltaSelectedShips(shipID)
    {
        return this.shipsOnPlanet[shipID].number - (fleetDispatcher.findShip(shipID) || {number:0}).number;
    }

    sendSpyProbe(coords, count, sender)
    {
        let params =
        {
            mission:6,
            galaxy:coords[0],
            system:coords[1],
            position:coords[2],
            type:coords[3],
            shipCount:count,
            token:miniFleetToken,
        }

        $.ajax(miniFleetLink,
        {
            data:params,
            dataType:"json",
            type:"POST",
            success:function(data)
            {
                if(typeof data.newToken != "undefined")
                {
                    miniFleetToken = data.newToken;
                }
                fadeBox(data.response.message + ' ' + data.response.coordinates.galaxy + ":" + data.response.coordinates.system + ":" + data.response.coordinates.position, !data.response.success);
                if(sender && data.response.success) sender.classList.add('ogl_disabled');
            }
        });
    }
}

class TooltipManager
{
    constructor(ogl)
    {
        this.ogl = ogl;
        this.ogl.tooltipList = this.ogl.tooltipList || {};
        this.ogl.tmpTooltip = this.ogl.tmpTooltip || {};
        this.dom = document.body.appendChild(Util.createDom('div', {'class':'ogl_tooltip tpd-tooltip'}));
        this.cross = this.dom.appendChild(Util.createDom('div', {'class':'ogl_close material-icons'}, 'clear'));
        this.container = this.dom.appendChild(Util.createDom('div', {}));
        this.timer;
        this.closeTimer;
        this.overed = false;

        document.addEventListener('click', event =>
        {
            if(!this.dom.classList.contains('ogl_active')) return;
            if(event.target != this.dom && !event.target.closest('.ogl_tooltip')) this.close();
        });

        this.dom.addEventListener('mouseover', e => this.overed = true);
        this.dom.addEventListener('mouseleave', () => this.overed = false);

        this.cross.addEventListener('click', () => this.close());

        Util.loop(() => this.initTooltip());
    }

    initTooltip()
    {
        document.querySelectorAll(`.tooltip:not(.ogl_tooltipReady), .tooltipRight:not(.ogl_tooltipReady), .tooltipLeft:not(.ogl_tooltipReady),
        .tooltipBottom:not(.ogl_tooltipReady), .tooltipClose:not(.ogl_tooltipReady), .tooltipHTML:not(.ogl_tooltipReady),
        .tooltipRel:not(.ogl_tooltipReady), .tooltipCustom:not(.ogl_tooltipReady)`).forEach(sender =>
        {
            if(sender.classList.contains('ogl_tooltipReady') || !this.ogl.component.tooltipManager) return;
            
            sender.classList.add('ogl_tooltipReady');

            if(this.ogl.component.tooltipManager.dom.contains(sender)) return;

            let content;

            if(sender.classList.contains('tooltipRel'))
            {
                let id = '#' + sender.getAttribute('rel');
                if(document.querySelector(id) && !this.ogl.tooltipList[id]) this.ogl.tooltipList[id] = document.querySelector(id);
                content = this.ogl.tooltipList[id];

                if(id == '#demolition_costs_tooltip_oneTimeelement') this.ogl.tooltipList[id] = false;
                if(id.indexOf('planet') == 1 || id.indexOf('moon') == 1 || id.indexOf('debris') == 1) this.ogl.tooltipList[id] = false;

                if(id.indexOf('debris') == 1) this.ogl.tmpTooltip[id] = content;
            }
            else
            {
                sender.setAttribute('data-tooltip', sender.getAttribute('title'));
                content = sender.getAttribute('data-tooltip');
            }

            if(!content) return;

            if(content.style && content.style.display == 'none')
            {
                content.style.display = 'block';
            }

            let div = Util.createDom('div');
            sender.classList.contains('tooltipRel') ? div.appendChild(content) : div.innerHTML = content;

            if(sender.classList.contains('tooltipClick'))
            {
                sender.addEventListener('click', () => this.open(sender, content, 0));
                sender.addEventListener('click', event =>
                {
                    if(event.target != sender)
                    {
                        if(content && content != 'null') this.close();
                    }
                });
            }
            else
            {
                sender.addEventListener('mouseenter', () => this.open(sender, content));
                sender.addEventListener('mouseleave', () =>
                {
                    sender.setAttribute('title', sender.getAttribute('data-temp-title'));
                    if(!sender.classList.contains('tooltipClose') && !sender.classList.contains('tooltipCustom'))
                    {
                        if(content && content != 'null') this.close();
                    }
                    else
                    {
                        this.closeTimer = setInterval(() =>
                        {
                            if(content && content != 'null' && !this.overed)
                            {
                                this.close();
                                clearInterval(this.closeTimer);
                            }
                        }, 400);
                    }
                    clearTimeout(this.timer);
                });
            }
        });
    }

    open(sender, content, delay)
    {
        if(!content || content == 'null') return;
        clearInterval(this.closeTimer);

        this.close();
        this.sender = sender;
        if(sender.getAttribute('title') && sender.getAttribute('title') != 'null' && sender.getAttribute('title') != sender.getAttribute('data-tooltip')) content = sender.getAttribute('title');
        sender.setAttribute('data-temp-title', sender.getAttribute('title'));
        sender.removeAttribute('title');

        this.dom.style.height = '0';
        this.dom.style.width = '0';

        this.container.textContent = '';
        typeof content == 'object' ? this.container.appendChild(content) : this.container.innerHTML = content;

        if(this.container.textContent.indexOf('|') > -1)
        {
            this.container.innerHTML = this.container.innerHTML.replace(/\|/g, '<div class="splitLine"></div>');
        }

        delay = delay === 0 ? 0 : delay || 200;

        let rect = sender.getBoundingClientRect();
        let win = sender.ownerDocument.defaultView;

        this.position =
        {
            x:rect.left + win.pageXOffset,
            y:rect.top + win.pageYOffset
        };

        this.updateBeforeDisplay(sender);

        this.dom.className = 'ogl_tooltip tpd-tooltip';

        this.timer = setTimeout(() =>
        {
            this.dom.style.width = 'fit-content';
            this.dom.style.width = '-moz-fit-content';
            this.dom.style.height = 'auto';

            this.dom.classList.add('ogl_active');

            if(sender.classList.contains('tooltipLeft'))
            {
                this.dom.classList.add('ogl_left');
                this.position.x -= this.dom.offsetWidth;
                this.position.x += rect.width / 2;
                this.position.y -= this.dom.offsetHeight / 2;
                this.position.y += 4;
                this.position.y += rect.height / 2;
            }
            else if(sender.classList.contains('tooltipRight'))
            {
                this.dom.classList.add('ogl_right');
                this.position.x += rect.width + 4;
                this.position.y -= this.dom.offsetHeight / 2;
                this.position.y += 4;
                this.position.y += rect.height / 2;
            }
            else if(sender.classList.contains('tooltipBottom'))
            {
                this.dom.classList.add('ogl_bottom');
                this.position.x -= this.dom.offsetWidth / 2;
                this.position.x += rect.width / 2;
                this.position.y += rect.height;
            }
            else
            {
                this.position.x -= this.dom.offsetWidth / 2;
                this.position.x += rect.width / 2;
                this.position.y -= this.dom.offsetHeight;
                this.position.y -= 4;
            }

            if(sender.classList.contains('tooltipClose') || sender.classList.contains('tooltipCustom') || sender.classList.contains('tooltipRel'))
            {
                this.cross.classList.remove('ogl_hidden');
                this.dom.classList.remove('ogl_noPointer');
            }
            else
            {
                this.cross.classList.add('ogl_hidden');
                this.dom.classList.add('ogl_noPointer');
            }

            this.position.x = Math.round(this.position.x);
            this.position.y = Math.round(this.position.y);

            this.position.x = this.position.x - (this.position.x % 2);
            this.position.y = this.position.y - (this.position.y % 2);

            this.dom.style.top = this.position.y + 'px';
            this.dom.style.left = this.position.x + 'px';
        }, delay);
    }

    close()
    {
        this.dom.classList.remove('ogl_active');
    }

    updateBeforeDisplay(sender)
    {
        if(this.container.querySelector('.fleetinfo'))
        {
            if((sender.classList.contains('ogl_updated') && sender.closest('.route'))
            || (sender.classList.contains('ogl_updated') && sender.closest('.fleetDetailButton'))) return;

            this.container.querySelectorAll('.fleetinfo tr').forEach(line =>
            {
                if(line.textContent.trim() == '') line.classList.add('ogl_hidden');
                else if(!line.querySelector('td')) line.classList.add('ogl_full');
                else
                {
                    let id = Util.findObjectByValue(this.ogl.json.loca, line.querySelector('td').textContent.replace(':', '')) || -1;
                    if(id)
                    {
                        line.classList.add('ogl_'+id);
                        line.querySelector('td').textContent = '';
                        line.querySelector('td').className = 'ogl_shipIcon ogl_'+id;
                        line.title = line.querySelector('.value').textContent;

                        line.querySelector('.value').textContent = Util.formatToUnits(line.querySelector('.value').textContent);
                    }
                }
            });

            if(sender.closest('.fleetDetails'))
            {
                sender.closest('.fleetDetails').querySelector('.fleetDetailButton a').classList.add('ogl_updated');
                sender.closest('.fleetDetails').querySelector('.route a').classList.add('ogl_updated');
            }
        }

        if(sender.classList.contains('moonlink'))
        {
            sender.classList.add('tooltipRight');
            sender.classList.remove('tooltipLeft');
        }
        else if(sender.classList.contains('planetlink'))
        {
            this.position.x += sender.closest('[data-panel="stock"]') ? 80 : 45;
        }

        if(sender.closest('#top') || sender.closest('#box'))
        {
            sender.classList.add('tooltipBottom');
            sender.classList.remove('tooltip');
        }
    }
}

class PopupManager
{
    constructor(ogl)
    {
        this.ogl = ogl;

        this.overlay = document.body.appendChild(Util.createDom('div', {'class':'ogl_overlay'}));
        this.dom = this.overlay.appendChild(Util.createDom('div', {'class':'ogl_popup'}));
        this.cross = this.dom.appendChild(Util.createDom('div', {'class':'ogl_close material-icons'}, 'clear'));
        this.content = this.dom.appendChild(Util.createDom('div'));

        this.cross.addEventListener('click', () => this.close());
        this.overlay.addEventListener('click', event => { if(event.target === this.overlay) this.close(); });
    }

    load()
    {
        this.content.innerHTML = '';
        this.content.appendChild(Util.createDom('div', {'class':'ogl_loader'}));
        document.body.classList.add('ogl_active');
        this.dom.classList.add('ogl_active');
        this.overlay.classList.add('ogl_active');
    }

    open(html)
    {
        setTimeout(() =>
        {
            this.content.innerHTML = '';
            this.content.appendChild(html);
            document.body.classList.add('ogl_active');
            this.dom.classList.add('ogl_active');
            this.overlay.classList.add('ogl_active');
        }, Math.random() * (400 - 100 + 1) + 100)
    }

    close()
    {
        document.body.classList.remove('ogl_active');
        this.dom.classList.remove('ogl_active');
        this.overlay.classList.remove('ogl_active');
    }
}

class SideViewManager
{
    constructor(ogl)
    {
        this.ogl = ogl;
        this.dom = document.body.appendChild(Util.createDom('div', {'class':'ogl_sideView'}));
        this.cross = this.dom.appendChild(Util.createDom('div', {'class':'ogl_close material-icons'}, 'clear'));
        this.content = this.dom.appendChild(Util.createDom('div'));

        this.cross.addEventListener('click', () => this.close());

        this.panel = document.querySelector('#countColonies').appendChild(Util.createDom('div', {'class':'ogl_panel'}));
        this.addDefaultPanel();
        this.addProductionPanel();
        this.economyButton = this.panel.appendChild(Util.createDom('div', {'class':'material-icons tooltip', 'title':this.ogl.component.langManager.getText('productionView')}, 'account_balance'));
        this.addPinnedPanel();
    }

    open(html, id)
    {
        this.content.innerHTML = '';
        this.content.appendChild(html);
        this.dom.classList.add('ogl_active');
        this.ogl.json.options.sideViewOpened = id;
        Util.saveData(this.ogl.json);
    }

    close()
    {
        this.dom.classList.remove('ogl_active');
        this.ogl.json.options.sideViewOpened = false;
        Util.saveData(this.ogl.json);
    }

    addDefaultPanel()
    {
        let button = this.panel.appendChild(Util.createDom('div', {'class':'material-icons tooltip', 'title':this.ogl.component.langManager.getText('defaultView')}, 'home'));
        button.addEventListener('click', () =>
        {
            document.querySelector('#rechts').setAttribute('data-panel', 'default');
            this.ogl.json.options.currentPanel = 'default';
            Util.saveData(this.ogl.json);
        });

        //document.querySelector('#rechts').setAttribute('data-panel', 'default');
    }

    addProductionPanel()
    {
        let button = this.panel.appendChild(Util.createDom('div', {'class':'material-icons tooltip', 'title':this.ogl.component.langManager.getText('economyView')}, 'equalizer'));
        button.addEventListener('click', () =>
        {
            document.querySelector('#rechts').setAttribute('data-panel', 'stock');
            this.ogl.json.options.currentPanel = 'stock';
            Util.saveData(this.ogl.json);
        });

        if(this.ogl.json.options.currentPanel == 'stock')
        {
            document.querySelector('#rechts').setAttribute('data-panel', 'stock');
        }

        let updateRes = (coords, res) =>
        {
            if(!this.ogl.json.myEconomy[coords]) return;

            let deltaTime = Math.floor((Date.now() - this.ogl.json.myEconomy[coords].prodTimer || 0) / 1000);
            let prodSinceLastUpdate = (this.ogl.json.myEconomy[coords]['prod'+res] || 0) * deltaTime;
            return Math.floor((this.ogl.json.myEconomy[coords]['res'+res] || 0) + prodSinceLastUpdate);
        }

        Util.loop(() =>
        {
            this.ogl.planetList.forEach((planet, pIndex) =>
            {
                if(!planet.querySelector('.planetlink .ogl_stock')) planet.querySelector('.planetlink').appendChild(Util.createDom('div', {'class':'ogl_stock'}));
                if(planet.querySelector('.moonlink') && !planet.querySelector('.moonlink .ogl_stock')) planet.querySelector('.moonlink').appendChild(Util.createDom('div', {'class':'ogl_stock'}));

                let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1);
                let stock = planet.querySelector('.planetlink .ogl_stock');
                let moonStock = planet.querySelector('.moonlink .ogl_stock');
                
                ['metal', 'crystal', 'deut'].forEach((res, index) =>
                {
                    let updatedValue = updateRes(coords, res);

                    if(!stock.querySelector('.ogl_'+res)) stock.appendChild(Util.createDom('span', {'class':'ogl_'+res}, (Util.formatToUnits(updatedValue) || '0')));
                    else stock.querySelector('.ogl_'+res).textContent = (Util.formatToUnits(updatedValue) || '0');

                    this.ogl.totalResources[index] += parseInt(updatedValue) || 0;

                    if(moonStock)
                    {
                        let moonValue = updateRes(coords+'M', res);

                        if(!moonStock.querySelector('.ogl_'+res)) moonStock.appendChild(Util.createDom('span', {'class':'ogl_'+res}, (Util.formatToUnits(moonValue) || '0')));
                        else moonStock.querySelector('.ogl_'+res).textContent = (Util.formatToUnits(moonValue) || '0');

                        this.ogl.totalResources[index] += parseInt(moonValue) || 0;
                    }
                });
            });
        }, 10000);
    }

    addEconomyPanel()
    {
        let content = Util.createDom('div', {'class':'ogl_economy'});

        let averageMines = [0,0,0];
        let totalProd = [0,0,0];
    
        let totalBox = content.appendChild(Util.createDom('div', {'class':'ogl_total'}, '<div></div>'));

        this.ogl.planetList.forEach((planet, pIndex) =>
        {
            let name = planet.querySelector('.planet-name').textContent;
            let coords = planet.querySelector('.planet-koords').textContent.slice(1, -1);

            this.ogl.json.myEconomy[coords] = this.ogl.json.myEconomy[coords] || {};

            let box = content.appendChild(Util.createDom('div'));
            planet.getAttribute('data-multi') && box.setAttribute('data-multi', planet.getAttribute('data-multi'));

            box.appendChild(Util.createDom('h3', {}, `<span>[${coords}]</span> ${name}`));

            ['metal', 'crystal', 'deut'].forEach((res, index) =>
            {
                let prodValue = Math.round((this.ogl.json.myEconomy[coords]['prod'+res] || 0) * 3600 * 24);
                let boxContent = `<b>${this.ogl.json.myEconomy[coords][res] || '0'}</b> <i>+${Util.formatToUnits(prodValue) || '0'}</i>`;
                box.appendChild(Util.createDom('div', {'class':'ogl_'+res}, boxContent));

                averageMines[index] += parseInt(this.ogl.json.myEconomy[coords][res]);
                totalProd[index] += prodValue;

                if(pIndex == this.ogl.planetList.length-1)
                {
                    let totalBoxContent = `<div><b>ø ${(averageMines[index]/this.ogl.planetList.length).toFixed(1)}</b> <i>+${Util.formatToUnits(totalProd[index]) || '0'}</i></div>`;
                    totalBox.appendChild(Util.createDom('div', {'class':'ogl_'+res}, totalBoxContent));
                }
            });

            box.addEventListener('click', () =>
            {
                window.location.href = planet.querySelector('.planetlink').href;
            });
        });

        this.ogl.totalProd = totalProd;

        this.economyButton.addEventListener('click', () =>
        {
            this.ogl.component.popupManager.load();
            this.ogl.component.popupManager.open(content);
        });
    }

    addPinnedPanel()
    {
        let button = this.panel.appendChild(Util.createDom('div', {'class':'material-icons tooltip', 'title':this.ogl.component.langManager.getText('pinnedView')}, 'push_pin'));
        button.addEventListener('click', () => this.checkPinnedContent());

        if(this.ogl.json.options.pinned && Object.keys(this.ogl.json.options.pinned).length > 0)
        {
            if(this.ogl.json.options.sideViewOpened == 'stalkPinned') this.checkPinnedContent();
        }
    }

    checkPinnedContent()
    {
        let player = this.ogl.json.options.pinned;

        let container = Util.createDom('div');
        container.innerHTML = `
            <h1><span class="${player.color}">${player.name}</span></h1>
            <div class="splitLine"></div>
            <div class="ogl_stalkPoints">
                <div title="${player.total}"><i class="material-icons">star</i>${Util.formatToUnits(player.total)}</div>
                <div title="${player.eco}"><i class="material-icons">attach_money</i>${Util.formatToUnits(player.eco)}</div>
                <div title="${player.tech}"><i class="material-icons">science</i>${Util.formatToUnits(player.tech)}</div>
                <div title="${player.fleet}"><i class="material-icons">military_tech</i>${Util.formatToUnits(player.fleet)}</div>
                <div title="${player.def}"><i class="material-icons">security</i>${Util.formatToUnits(player.def)}</div>
            </div>
            <div class="splitLine"></div>
            <div class="ogl_stalkInfo">
                <div class="ogl_stalkPlanets ogl_pinnedContent"></div>
            </div>
            <div class="splitLine"></div>
            <div class="float_right">${new Date(player.update * 1000).toLocaleDateString('fr-FR')}</div>
        `;

        let sendProbes = (event, planet, type) =>
        {
            event.stopPropagation();
            event.preventDefault();
            this.ogl.component.fleetManager.sendSpyProbe([planet.galaxy, planet.system, planet.position, type], this.ogl.json.spyProbesCount, event.target);
        };

        if(!this.ogl.json.options.pinned) return;

        Object.values(this.ogl.json.options.pinned.planets).forEach(planet =>
        {
            let div = container.querySelector('.ogl_stalkPlanets').appendChild(Util.createDom('div', {'data-coords':planet.coords}));
            div.appendChild(Util.createDom('span', {}, planet.coords));
            let mSpy = div.appendChild(Util.createDom('div', {'class':'ogl_moonIcon material-icons', 'data-type':3}, 'brightness_2'));
            let pSpy = div.appendChild(Util.createDom('div', {'class':'ogl_planetIcon material-icons', 'data-type':1}, 'language'));

            pSpy.addEventListener('click', event => sendProbes(event, planet, 1));
            mSpy.addEventListener('click', event => sendProbes(event, planet, 3));

            if(planet.main) div.appendChild(Util.createDom('span', {'class':'ogl_mainPlanet material-icons'}, 'star'));
            if(planet.moon) mSpy.classList.add('ogl_active');

            if(this.ogl.json.stalkList[planet.coords]) div.setAttribute('data-color', this.ogl.json.stalkList[planet.coords].color);

            div.addEventListener('click', () =>
            {
                this.ogl.component.tooltipManager.close();
                this.ogl.component.planetManager.goToPosition(planet.galaxy, planet.system, planet.position);
            });

            let pActivityDom = div.appendChild(Util.createDom('div', {'class':'ogl_planetActivity'}));
            let mActivityDom = div.appendChild(Util.createDom('div', {'class':'ogl_moonActivity'}));

            if(planet.activity)
            {
                pActivityDom.textContent = planet.activity;
                if(planet.activity == '*') pActivityDom.classList.add('ogl_short');
            }

            if(planet.moon && planet.moon.activity)
            {
                mActivityDom.textContent = planet.moon.activity;
                if(planet.moon.activity == '*') mActivityDom.classList.add('ogl_short');
            }
        });

        this.open(container, 'stalkPinned');
    }
}

class Util
{
    static genTrashsimLink(apiKey, ogl)
    {
        let coords = ogl.current.coords;

        let jsonTechs = {"0":
        [{
            planet:
            {
                galaxy:coords[0],
                system:coords[1],
                position:coords[2],
            },
            class: ogl.playerClass,
            "research": {}
        }]};

        for(let [key, value] of Object.entries(ogl.json.myTechs))
        {
            jsonTechs[0][0].research[key] = {"level":value};
        }

        jsonTechs = btoa(JSON.stringify(jsonTechs));

        return 'https://trashsim.universeview.be/' + ogl.lang + '?SR_KEY=' + apiKey + '#prefill=' + jsonTechs;
    }

    static loop(callback, delay, lastCall)
    {
        let now = Date.now();
        delay = delay || 1000 / 20;
        lastCall = lastCall || 0;

        if(now - lastCall >= delay)
        {
            lastCall = now;
            callback();
        }

        requestAnimationFrame(() => Util.loop(callback, delay, lastCall));
    }

    // overwrite global functions
    static updateCheckIntInput(callback)
    {
        let old = checkIntInput;

        checkIntInput = function(id, minVal, maxVal)
        {
            old.call(window, id, minVal, maxVal);
            callback();
        }
    }

    static overwriteFleetDispatcher(functionName, param, callback)
    {
        let old = fleetDispatcher[functionName];

        fleetDispatcher[functionName] = function(param)
        {
            callback();
            old.call(fleetDispatcher, param);
        }
    }

    static checkInputs()
    {
        document.querySelectorAll('.ogl_checkInput').forEach(input =>
        {
            if(input.value)
            {
                let max = input.getAttribute('max');

                let newValue = input.value.toLowerCase();
                newValue = newValue.replace('g', '000000000');
                newValue = newValue.replace('m', '000000');
                newValue = newValue.replace('k', '000');
                newValue = newValue.replace(/[\,\.]/g, '');
                newValue = parseInt(newValue);

                if(isNaN(newValue) || newValue <= 0)
                {
                    input.value = 0;
                }
                else
                {
                    if(max && newValue > max) newValue = max;
                    input.value = newValue.toLocaleString('de-DE');
                }
            }
        });
    }

    static formatToUnits(value, forced)
    {
        if(!value) return 0;

        value = value.toString().replace(/[\,\.]/g, '');

        if(isNaN(value)) return value;

        let precision = 0;

        value = parseInt(value);

        if(value == 0 || forced == 0 || value < 1000) precision = 0;
        else if(value < 1000000 || forced == 1) precision = 1;
        else precision = 2;

        // const abbrev = ['', LocalizationStrings.unitKilo, LocalizationStrings.unitMega, LocalizationStrings.unitMilliard];
        const abbrev = ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];
		const unrangifiedOrder = Math.floor(Math.log10(Math.abs(value)) / 3);
		const order = Math.max(0, Math.min(unrangifiedOrder, abbrev.length-1));
        const suffix = abbrev[order];

        let result = (value / Math.pow(10, order * 3)).toFixed(precision);

        return suffix ? result + ' ' + suffix : result;
    }

    static formatFromUnits(value)
    {
        let offset = (value.split(LocalizationStrings.thousandSeperator).length - 1) * 3;
        let splitted = value.split(/[\,\.]/g)[0].length;
        if(value.match(/\d+/g) && value.match(/\d+/g).map(Number).length == 1) splitted -= 1;

        if(value.indexOf(LocalizationStrings.unitMilliard) > -1)
        {
            //let padEnd = value.indexOf(LocalizationStrings.thousandSeperator) > -1 ? 12 : 9;
            value = value.replace(LocalizationStrings.unitMilliard, '');
            value = value.replace(/[\,\.]/g, '');
            value = value.padEnd(9 + offset + splitted, '0');
        }
        else if(value.indexOf(LocalizationStrings.unitMega) > -1)
        {
            value = value.replace(LocalizationStrings.unitMega, '');
            value = value.replace(/[\,\.]/g, '');
            value = value.padEnd(6 + offset + splitted, '0');
        }
        else if(value.indexOf(LocalizationStrings.unitKilo) > -1)
        {
            value = value.replace(LocalizationStrings.unitKilo, '');
            value = value.replace(/[\,\.]/g, '');
            value = value.padEnd(3 + offset + splitted, '0');
        }
        else
        {
            value = value.replace(/[\,\.]/g, '');
        }

        return parseInt(value);
    }

    static formatNumber(number)
    {
        return (number || '0').toLocaleString('de-DE');
    }

    static saveData(json)
    {
        if(json) localStorage.setItem('ogl_redata', JSON.stringify(json));
    }

    static getPage()
    {
        let rawURL = new URL(window.location.href);
        return rawURL.searchParams.get('component') || rawURL.searchParams.get('page');
    }

    static createDom(element, params, content)
    {
        params = params || {};
        content = content || '';

        let dom = document.createElement(element);
        Object.entries(params).forEach(p => dom.setAttribute(p[0], p[1]));
        dom.innerHTML = content;

        return dom;
    }

    static clickOrKeydown(domElement, keyID, callback, forced)
    {
        if(domElement) domElement.addEventListener('click', () => callback());

        let sent = true; // todo

        document.addEventListener('keydown', event =>
        {
            let keycode = event.keyCode ? event.keyCode : event.which;
            if(!sent && keycode == keyID && ((!document.querySelector('.ui-dialog') || document.querySelector('.ui-dialog').style.display == 'none')
            && !document.querySelector('.chat_box_textarea:focus') && (!document.querySelector('.ogl_overlay.ogl_active') || forced)))
            {
                if(!domElement) callback();
                else if(domElement && forced) domElement.click();
                sent = true;
            }
        });

        document.addEventListener('keyup', () => sent = false);
    }

    static loadPageContent(url, type, callback)
    {
        let cancelController = new AbortController()
        let signal = cancelController.signal;

        fetch(url, {cache:'no-store', signal:signal})
        .then(result => result.text())
        .then(txt =>
        {
            let parser = new DOMParser();
            let result = parser.parseFromString(txt, type);
            callback(result);
        })
        .catch((e) => /*console.log(e)*/{});

        window.onbeforeunload = () => cancelController.abort();
    }

    static checkTopScore(ogl)
    {
        if(ogl.json.topScore[1] < Date.now() - 86400000)
        {
            fetch(window.location.protocol + '//' + window.location.host + '/api/serverData.xml')
            .then(result => result.text())
            .then(txt =>
            {
                let parser = new DOMParser();
                let xmlResult = parser.parseFromString(txt, 'text/xml');
                ogl.json.topScore = [parseInt(xmlResult.querySelector('topScore').innerHTML), Date.now()];
                Util.saveData(ogl.json);
            });
        }
    }

    static findObjectByValue(object, value)
    {
        return Object.keys(object).find(key => object[key] === value);
    }
}

let oglcss = `
/*css*/
:root
{
    /* ui */
    --skyblue:hsla(227, 85%, 84%, 1);
    --raisin:hsla(218, 26%, 16%, 1);
    --deepnight:hsla(204, 33%, 3%, 1);
    --darkblue:hsla(218, 23%, 9%, 1);
    --sunset:hsla(22, 100%, 65%, 1);
    --purple:#610348;

    /* marker */
    --blue:#5476f1;
    --red:#da3e3e;
    --violet:#b646da;
    --green:#32b199;
    --yellow:#e2b431;
    --gray:#171f29;
    --white:#bbb;

    /* resources */
    --metal:#de74b4;
    --crystal:#85abff;
    --deut:#84f1c8;
    --dm:#db95ff;
}

body.ogl_active
{
    overflow:hidden;
}

.input_replacement, input[type="text"], input[type="email"], input[type="password"], input[type="search"],
.technology input[type="number"], .technology input[type="text"]
{
    background-color:#c8d1da;
    border-color:#eef7fb !important;
    border-radius:3px !important;
    box-shadow:0 0 0 1px #eef7fb !important;
    color:#0c1117;
    font-weight:bold;
}

.technology input[type="number"][disabled], .technology input[type="text"][disabled]
{
    background:#333c44;
    border-color:#52565a !important;
    box-shadow:0 0 0 1px #52565a !important;
}

div#banner_skyscraper
{
    position:fixed !important;
    left:50% !important;
    top:70px !important;
    transform:translatex(530px) !important;
}

.icon:not(.sprite):not(.resource), .material-icons
{
    direction:ltr;
    display:inline-block;
    font-family:'Material Icons' !important;
    font-weight:normal !important;
    font-style:normal !important;
    font-size:inherit !important;
    image-rendering:pixelated;
    line-height:inherit !important;
    letter-spacing:normal;
    text-transform:none;
    transform:rotate(0.03deg);
    white-space:nowrap;
    word-wrap:normal;
    -webkit-font-feature-settings:'liga';
    -webkit-font-smoothing:antialiased;
}

#galaxytable .icon
{
    vertical-align:top;
}

.eventFleet .icon
{
    vertical-align:middle;
}

.icon[style*="background: none"]
{
    border:none !important;
    box-shadow:none !important;
}

.tpd-tooltip:not(.ogl_tooltip)
{
    display:none !important;
    height:0px !important;
    overflow:hidden !important;
    pointer-events:none !important;
    width:0px !important;
}

.ogl_close
{
    background:#101317;
    border:2px solid #364352;
    border-radius:30px;
    color:#bbb;
    cursor:pointer;
    font-size:18px !important;
    padding:2px;
    position:absolute;
    right:-10px;
    top:-10px;
    z-index:3;
}

.ogl_tooltip .ogl_close
{
    right:-10px;
    top:-10px;
}

.ogl_close:hover
{
    color:#fff;
}

.ogl_stalk h1
{
    float:left;
}

.ogl_stalk .ogl_actions
{
    display:grid;
    float:right;
    grid-gap:3px;
    grid-template-columns:repeat(5, 1fr);
    width:fit-content;
    width:-moz-fit-content;
}

.ogl_stalk .ogl_actions > *,
.ogl_stalk .ogl_colorAll > *
{
    border-radius:3px;
    color:#fff !important;
    cursor:pointer;
    display:block;
    font-family:'material icons';
    font-size:14px !important;
    padding:3px;
    text-align:center;
    text-decoration:none !important;
    width:14px;
}

.ogl_stalk .ogl_actions > *
{
    background:#3e5c86;
}

.ogl_stalk .ogl_actions > *:hover,
.ogl_stalk .ogl_colorAll > *:hover
{
    filter:brightness(1.2);
}

.ogl_stalk .ogl_colorAll
{
    display:grid;
    float:right;
    grid-gap:2px;
    grid-template-columns:repeat(12, 1fr);
    width:fit-content;
    width:-moz-fit-content;
}

.ogl_stalk .ogl_colorAll > *
{
    border:2px solid var(--darkblue);
    font-size:10px !important;
    height:10px;
    width:10px;
}

.ogl_colorAll div[data-color="gray"]
{
    background:var(--white);
    opacity:1 !important;
}

.ogl_pinned
{
    background:var(--gray);
    border:2px solid #364352;
    border-radius:4px;
    padding:12px;
    position:absolute;
    z-index:10;
}

.ogl_pinnedContent.ogl_stalkPlanets > div
{
    height:34px;
}

.ogl_pinnedContent.ogl_stalkPlanets > div:before
{
    height:32px;
}

.ogl_pinnedContent .ogl_planetActivity, .ogl_pinnedContent .ogl_moonActivity
{
    bottom:0px;
    color:gold;
    font-size:9px;
    pointer-events:none;
    position:absolute;
    text-align:center;
    width:12px;
}

.ogl_pinnedContent .ogl_short
{
    font-size:12px;
}

.ogl_pinnedContent .ogl_planetActivity
{
    right:22px;
}

.ogl_pinnedContent .ogl_moonActivity
{
    right:7px;
}

.ogl_pinned .ogl_pin,
.ogl_pinned .ogl_stalkPoints,
.ogl_pinned .splitLine:first-of-type
{
    display:none;
}

.ogl_metal, #metal_box .value { color:var(--metal) !important; }
.ogl_crystal, #crystal_box .value { color:var(--crystal) !important; }
.ogl_deut, #deuterium_box .value { color:var(--deut) !important; }
.ogl_dm, #darkmatter_box .value { color:var(--dm) !important; }

.ogl_shipList
{
    display:grid;
    grid-gap:5px;
    grid-template-columns:repeat(4, 1fr);
}

.ogl_shipList .ogl_shipIcon:hover
{
    border-color:var(--yellow);
    cursor:pointer;
}

.ogl_shipIcon
{
    background-color:rgba(255,255,255,.1);
    background-size:cover !important;
    border:2px solid #29384e;
    border-radius:4px;
    box-shadow:inset 0 0 0 2px rgba(0,0,0,.3);
    box-sizing:border-box;
    height:40px;
    width:40px;
}

.ogl_shipIcon.ogl_0 { background:var(--red); }
.ogl_shipIcon.ogl_0.ogl_active { background:var(--green); }
.ogl_shipIcon.ogl_202 { background-image:url(https://gf2.geo.gfsrv.net/cdnd9/60555c3c87b9eb3b5ddf76780b5712.jpg); }
.ogl_shipIcon.ogl_203 { background-image:url(https://gf1.geo.gfsrv.net/cdn34/fdbcc505474e3e108d10a3ed4a19f4.jpg); }
.ogl_shipIcon.ogl_204 { background-image:url(https://gf2.geo.gfsrv.net/cdnd2/9ed5c1b6aea28fa51f84cdb8cb1e7e.jpg); }
.ogl_shipIcon.ogl_205 { background-image:url(https://gf1.geo.gfsrv.net/cdnf1/8266a2cbae5ad630c5fedbdf270f3e.jpg); }
.ogl_shipIcon.ogl_206 { background-image:url(https://gf2.geo.gfsrv.net/cdn45/b7ee4f9d556a0f39dae8d2133e05b7.jpg); }
.ogl_shipIcon.ogl_207 { background-image:url(https://gf1.geo.gfsrv.net/cdn32/3f4a081f4d15662bed33473db53d5b.jpg); }
.ogl_shipIcon.ogl_208 { background-image:url(https://gf1.geo.gfsrv.net/cdn6f/41a21e4253d2231f8937ddef1ba43e.jpg); }
.ogl_shipIcon.ogl_209 { background-image:url(https://gf1.geo.gfsrv.net/cdn07/6246eb3d7fa67414f6b818fa79dd9b.jpg); }
.ogl_shipIcon.ogl_210 { background-image:url(https://gf3.geo.gfsrv.net/cdnb5/347821e80cafc52aec04f27c3a2a4d.jpg); }
.ogl_shipIcon.ogl_211 { background-image:url(https://gf1.geo.gfsrv.net/cdnca/4d55a520aed09d0c43e7b962f33e27.jpg); }
.ogl_shipIcon.ogl_213 { background-image:url(https://gf3.geo.gfsrv.net/cdn2a/c2b9fedc9c93ef22f2739c49fbac52.jpg); }
.ogl_shipIcon.ogl_214 { background-image:url(https://gf3.geo.gfsrv.net/cdn84/155e9e24fc1d34ed4660de8d428f45.jpg); }
.ogl_shipIcon.ogl_215 { background-image:url(https://gf3.geo.gfsrv.net/cdn5a/24f511ec14a71e2d83fd750aa0dee2.jpg); }
.ogl_shipIcon.ogl_218 { background-image:url(https://gf1.geo.gfsrv.net/cdn39/12d016c8bb0d71e053b901560c17cc.jpg); }
.ogl_shipIcon.ogl_219 { background-image:url(https://gf3.geo.gfsrv.net/cdne2/b8d8d18f2baf674acedb7504c7cc83.jpg); }

.ogl_shipIcon.ogl_metal, .ogl_shipIcon.ogl_crystal, .ogl_shipIcon.ogl_deut, .ogl_shipIcon.ogl_dm
{
    background-image:url(https://gf3.geo.gfsrv.net/cdnbb/a9fe14ed992de9b7f40d22213a475e.png) !important;
    background-size:190px !important;
}

.ogl_shipIcon.ogl_metal { background-position:-1px -44px !important; }
.ogl_shipIcon.ogl_crystal { background-position:-39px -44px !important; }
.ogl_shipIcon.ogl_deut { background-position:-76px -44px !important; }
.ogl_shipIcon.ogl_dm { background-position:-153px -45px !important; }

.technology input[type="number"], .technology input[type="text"]
{
    font-weight:bold;
}

.ogl_hidden, .ogl_colorHidden, .ogl_galaxyHidden, .ogl_systemHidden
{
    display:none !important;
}

.ogl_hiddenContent
{
    font-size:0 !important;
    line-height:0;
}

.ogl_invisible
{
    pointer-events:none;
    visibility:hidden;
}

.ogl_noPointer
{
    pointer-events:none;
}

.ogl_danger
{
    color:var(--red) !important;
}

.ogl_warning
{
    color:var(--yellow) !important;
}

.ogl_ok
{
    color:var(--green) !important;
}

.btn_blue, .btn_blue:hover
{
    background:linear-gradient(to bottom, #527cb1 50%, #4465a0 50%) !important;
    border:1px solid transparent;
}

.btn_blue.undermark, .btn_blue.undermark:hover
{
    background:linear-gradient(to bottom, #52b197 50%, #4493a0 50%) !important;
}

.btn_blue[disabled]
{
    filter:grayscale(1) contrast(.9) !important;
}

.btn_blue:hover
{
    filter:brightness(1.1);
}

.ogl_timeZone.ogl_fulldate:before
{
    content:attr(data-datezone);
    margin-right:5px;
}

.ogl_timeZone:after
{
    color:var(--yellow);
    content:attr(data-timezone);
}

.ogl_timeZone:before, .ogl_timeZone:after
{
    display:inline-block;
    font-size:11px !important;
    line-height:1;
}

.chat_msg .msg_title
{
    width:255px;
}

#chatMsgList .msg_date
{
    margin-top:5px;
}

.msg_date.ogl_timeZone:before, .msg_date.ogl_timeZone:after { font-size:9px !important; }
.eventFleet .ogl_timeZone:after { float:left;font-size:10px !important; }

.ogl_endTime, .ogl_timeZone:before
{
    color:#71cade;
    font-weight:bold;
}

.ogl_endTime span
{
    color:var(--yellow);
}

.content > .ogl_endTime
{
    font-size:10px;
    margin-top:10px;
    text-align:center;
}

#technologydetails h3
{
    background:none !important;
    color:#a7bce4 !important;
    font-size:16px !important;
    text-indent:7px !important;
    top:3px !important;
}

#technologydetails h3::before
{
    display:none !important;
}

#technologydetails > .description
{
    background:#141b23;
}

#technologydetails .content
{
    background:#0d1117;
    box-shadow:inset 0 55px #121b25;
    height:203px;
    left:203px;
}

#technologydetails .level, #technologydetails .amount
{
    color:#606f8c !important;
    font-size:12px !important;
    font-weight:bold !important;
    left:7px !important;
    top:25px !important;
}

#technologydetails .level i
{
    font-size:20px !important;
    vertical-align:bottom;
}

#technologydetails .level span
{
    color:var(--yellow);
    font-size:16px;
    vertical-align:bottom;
}

#technologydetails .narrow strong
{
    display:none;
}

#technologydetails .build_duration
{
    bottom:7px;
    margin:0 !important;
    padding-left:24px;
    position:absolute;
    top:auto;
}

#technologydetails .build_duration:before
{
    color:var(--yellow);
    content:'hourglass_top';
    font-family:'material icons';
    font-size:21px;
    left:0;
    position:absolute;
    top:8px;
}

#technologydetails .build_duration .bonus
{
    display:none;
}

#technologydetails .possible_build_start
{
    bottom:55px;
    margin:0;
    position:absolute;
    right:10px;
    top:auto;
}

#technologydetails .additional_energy_consumption,
#technologydetails .energy_production
{
    bottom:81px;
    margin:0 !important;
    padding-left:24px;
    position:absolute;
    right:10px;
}

#technologydetails .research_laboratory_levels_sum
{
    bottom:81px;
    margin:0 !important;
    padding-left:24px;
    position:absolute;
    right:10px;
}
}

#technologydetails .research_laboratory_levels_sum:before
{
    color:var(--yellow);
    content:'science';
    font-family:'material icons';
    font-size:21px;
    left:0;
    position:absolute;
    top:1px;
}

#technologydetails .additional_energy_consumption:before,
#technologydetails .energy_production:before
{
    color:var(--yellow);
    content:'flash_on';
    font-family:'material icons';
    font-size:21px;
    left:0;
    position:absolute;
    top:1px;
}

#technologydetails .information .ogl_endTime
{
    display:block;
}

#technologydetails .costs
{
    font-size:12px !important;
    font-weight:bold !important;
    top:59px !important;
}

#technologydetails .resource.icon
{
    display:block !important;
    height:21px !important;
    line-height:21px !important;
    margin:0 !important;
    width:fit-content !important;
    width:-moz-fit-content !important;
}

#technologydetails .resource.icon::before
{
    display:inline-block !important;
    image-rendering:-webkit-optimize-contrast !important;
    margin:0 5px 0 -24px !important;
    transform:scale(0.5) !important;
    transform-origin:top right !important;
    vertical-align:text-top !important;
}

#technologydetails .costs p
{
    display:none;
}

#technologydetails .bonus
{
    color:var(--green);
}

.ogl_overlay
{
    align-items:center;
    background:rgba(0,0,0,.7);
    display:none;
    justify-content:center;
    left:0;
    position:fixed;
    top:0;
    height:100%;
    width:100%;
    z-index:1000000;
}

.ogl_popup
{
    position:relative;   
}

.ogl_popup > div:nth-child(2)
{
    background:var(--raisin);
    border-radius:5px;
    box-shadow:0 0 10px #000;
    max-height:calc(100vh - 100px);
    overflow-y:auto;
    padding:20px;
    position:relative;
}

.ogl_popup h2
{
    font-size:14px;
    margin-bottom:10px;
}

.ogl_loader
{
    animation:spin .7s infinite linear;
    border:4px solid #000;
    border-left-color:#fff;
    border-radius:100%;
    height:50px;
    margin:30px;
    width:50px;
}

@keyframes spin
{
   from { transform:rotate(0); }
   to { transform:rotate(360deg); }
}

.ogl_overlay.ogl_active
{
    display:flex;
}

.ogl_expeResult
{
    background:rgba(0,0,0,.5);
    color:#ffd370;
    padding:6px;
    text-align:center;
    text-transform:capitalize;
}

.ogl_required
{
    background:#2a364a;
    border-bottom:2px solid #0d1014;
    color:#fff;
    font-size:10px;
    line-height:20px;
    padding:0 4px;
    user-select:none;
}

.ogl_required:hover
{
    color:var(--yellow);
}

.ogl_delta
{
    background:var(--raisin);
    border:2px solid #0d1014;
    border-radius:0 6px 0 6px;
    border-width:0 0 2px 2px;
    color:var(--skyblue);
    font-size:15px !important;
    line-height:20px !important;
    padding:0 3px;
    position:absolute;
    right:0;
    top:0;
    user-select:none;
}

.ogl_delta:hover
{
    color:var(--yellow);
}

#pageContent #middle
{
    padding-bottom:40px;
}

.technology .icon .level, .technology .icon .amount
{
    background:var(--raisin);
}

.technology .icon:hover, .technology.showsDetails .icon
{
    border-color:var(--yellow);
}

#resources li span
{
    font-weight:bold;
    text-shadow:1px 1px #000;
}

table.fleetinfo tbody
{
    display:grid;
    grid-gap:2px 5px;
    grid-template-columns:repeat(3, 1fr);
}

table.fleetinfo tr
{
    background:#0f141b;
    border:1px solid #27354e;
    color:var(--skyblue);
    display:grid;
    grid-template-columns:40px auto;
    font-size:11px;
}

table.fleetinfo td.value
{
    line-height:22px;
    padding:0 5px;
}

table.fleetinfo .ogl_full
{
    background:none;
    border:none;
    box-shadow:none;
    grid-column-start:1;
    grid-column-end:4;
    padding:7px 4px 4px 4px;
    font-size:11px;
}

table.fleetinfo .ogl_shipIcon
{
    background-position:center;
    border:none;
    border-radius:0;
    border-right:1px solid #000;
    height:22px !important;
    width:38px !important;
}

.ogl_menuOptions
{
    color:#fff;
    display:grid;
    font-size:16px;
    grid-gap:4px;
    grid-template-columns:repeat(4, 1fr);
    padding:4px 4px 2px 4px;
}

.ogl_button, #fleet1 .secondcol > *
{
    background:var(--deepnight) !important;
    border:2px solid var(--deepnight);
    border-radius:3px;
    box-shadow:inset 0 10px rgba(255,255,255,.07);
    box-sizing:border-box;
    color:#8ca5c5;
    cursor:pointer;
    line-height:21px !important;
    position:relative;
    text-shadow:1px 2px var(--deepnight);
    text-align:center;
}

.ogl_button
{
    font-weight:bold;
    text-decoration:none;
    user-select:none;
}

.ogl_button:hover
{
    background:#12151b;
    color:#fff !important;
}

.ogl_menuOptions > .ogl_button.ogl_active
{
    border-color:#fff;
}

.ogl_menuOptions .ogl_manageData { color:#c54f4f; }
.ogl_menuOptions .ogl_harvest { color:#50deec; }
.ogl_menuOptions .ogl_shipPicker { color:var(--yellow);font-size:11px;font-weight:bold; }
.ogl_menuOptions .ogl_missionPicker3 { color:#c2f75a; }
.ogl_menuOptions .ogl_missionPicker4 { color:#43ec77; }

.ogl_universeName
{
    color:#b2c0ce;
    font-size:12px;
    font-weight:bold;
    pointer-events:none;
    position:absolute;
    text-align:right;
    top:88px;
    width:138px;
}

/*  SCROLLBAR MANAGER
------------------------------------------ */
.ogl_scrollable
{
    bottom:-7px;
    overflow-y:auto;
    padding-right:1px;
}

/*  FLEET MANAGER
------------------------------------------ */

.ogl_inFlight, .ogl_inFlight:before, .ogl_inFlight:after
{
    border-style:solid;
    border-width:3px 6px 3px 0;
    border-color:transparent #9fc7d4 transparent transparent;
    height:0 !important;
    position:absolute !important;
    top:0 !important;
    right:-5px !important;
    transform:translateX(100%);
    width:0 !important;
}

.ogl_inFlight:before, .ogl_inFlight:after
{
    border:inherit;
}

.ogl_type .ogl_inFlight
{
    border-color:transparent #ff3e3e transparent transparent;
    right:20px !important;
    top:15px !important;
}

.ogl_inFlight
{
    top:5px !important;
}

.ogl_inFlight:before
{
    content:'';
    right:-6px !important;
}

.ogl_inFlight:after
{
    bottom:0 !important;
    content:'';
    right:-6px !important;
    top:auto !important;
}

#subtabs-nfFleetTrash .ogl_trash
{
    position:absolute;
    right:98px;
    top:11px;
}

.ogl_spyTable
{
    color:#b5b5b5;
    counter-reset:report-counter;
    margin-top:50px;
    text-align:center;
    width:100%;
}

.ogl_spyTable tr[data-coords]
{
    counter-increment:report-counter;
}

.ogl_spyTable tr[data-coords] td:nth-child(1) div:before
{
    content:counter(report-counter);
}

.ogl_spyTable tr:first-child:before
{
    background:none;
    pointer-events:none;
}

.ogl_spyTable tr.ogl_attacked td
{
    box-shadow:inset 0 100px rgba(0,0,0,.5), inset 1px 0 rgba(255,255,255,.03), inset -1px 0 rgba(0,0,0,.5), inset 0 1px rgba(255,255,255,.03), inset 0 -1px rgba(0,0,0,.5), inset 0 0 3px 2px red;
    opacity:.75;
}

.ogl_spyTable .ogl_reportOptions > *
{
    margin:auto;
}

.ogl_spyTable .ogl_reportOptions > *:not(last-child)
{
    margin-right:3px;
}

.ogl_spyTable .ogl_coords a
{
    background:rgba(0,0,0,.5);
    border-radius:40px;
    display:block;
    text-decoration:none;
}

.ogl_spyTable .material-icons
{
    font-size:16px !important;
}

.ogl_spyTable th
{
    background:#111;
    line-height:18px;
    padding:7px;
    text-transform:capitalize;
}

.ogl_spyTable th[data-filter]
{
    cursor:pointer;
}

.ogl_spyTable th[data-filter]:hover
{
    background:#282828;
}

.ogl_spyTable th.ogl_active
{
    background:var(--purple) !important;
    color:#fff;
}

.ogl_spyTable th[data-filter]:after
{
    content:'unfold_more';
    font-family:'material icons';
    font-size:14px;
    vertical-align:middle;
}

.ogl_spyTable th.ogl_shipIcon
{
    background-position:center !important;
    border:none;
    border-radius:0;
    height:auto;
}

.ogl_spyTable td
{
    height:30px;
    position:relative;
}

.ogl_spyTable a
{
    color:inherit;
}

.ogl_spyTable a:hover
{
    color:#fff;
}

.ogl_spyTable .ogl_name
{
    text-align:left;
    text-indent:10px;
}

.ogl_spyTable .ogl_renta
{
    color:#fff;
}

.ogl_spyTable .ogl_reportDate
{
    color:var(--green);
}

.ogl_spyTable .ogl_reportDate > div,
.ogl_spyTable tr td:nth-child(1) > div
{
    background:rgba(0,0,0,.5);
    border-radius:40px;
}

.ogl_spyTable .ogl_colors
{
    padding:0;
    width:22px;
}

.ogl_spyTable .ogl_colorButton
{
    left:1px;
    position:relative;
    top:0;
}

#fleet1 #buttonz .header
{
    display:none !important;
}

#fleet1 #buttonz #battleships
{
    margin-left:8px !important;
    width:441px !important;
}

#fleet1 #buttonz #battleships ul,
#fleet1 #buttonz #civilships ul,
#shipyard #technologies_battle ul,
#shipyard #technologies_civil ul
{
    padding:0 !important;
}

#shipyard #technologies_battle
{
    margin-left:0 !important;
    width:400px !important;
}

#shipyard #technologies_civil
{
    margin-left:0 !important;
    width:240px !important;
}

#fleet1 .ogl_capacityContainer
{
    box-sizing:border-box;
    grid-column-start:2;
    grid-row-start:1;
    height:38px;
    padding:5px;
    position:relative;
    width:100% !important;
}

#fleet1 .ogl_capacityContainer i
{
    font-size:17px !important;
    position:absolute;
    right:7px;
    top:7px;
}

#fleet1 .ogl_capacityContainer:hover i
{
    color:var(--yellow);
}

#fleet1 .ogl_capacityInfo
{
    background:#253058;
    border:2px solid #0c1014;
    bottom:4px;
    box-sizing:border-box;
    font-size:10px;
    font-weight:bold;
    height:8px;
    left:7px;
    line-height:16px;
    position:absolute;
    right:30px;
}

#fleet1 .ogl_capacityInfo p
{
    pointer-events:none;
    transform:translate(0px, -22px);
}

#fleet1 .ogl_capacityInfo p b:nth-child(1)
{
    color:var(--yellow);
}

#fleet1 .ogl_capacityInfo .ogl_capacityCurrent,
#fleet1 .ogl_capacityInfo .ogl_capacityRequired
{
    display:block;
    height:100%;
    left:0;
    position:absolute;
    top:0;
    z-index:-1;
}

#fleet1 .ogl_capacityInfo .ogl_capacityCurrent
{
    background:#b18b22;
    min-width:1px;
    transition:width .3s;
    width:0%;
}

#fleet1 .ogl_capacityInfo .ogl_capacityRequired
{
    color:var(--skyblue);
    text-align:left;
    transform:translate(0px, -22px);
    white-space:nowrap;
}

#fleet1 .ogl_capacityInfo .ogl_capacityRequired > div
{
    background:repeating-linear-gradient(-45deg, #303e6f, #303e6f 5px, transparent 5px, transparent 10px);
    height:100%;
    transform:translate(0px, 6px);
    width:100%;
}

#fleet1 #allornone .info
{
    display:none;
}

#fleet1 .allornonewrap
{
    align-items:end !important;
    background:none !important;
    border:none !important;
    display:grid !important;
    grid-gap:2px !important;
    grid-template-columns:118px auto min-content !important;
    margin-top:7px !important;
    padding:0 !important;
    width:637px !important;
}

#fleet1 .allornonewrap .secondcol
{
    align-items:end !important;
    background:none !important;
    border:none !important;
    display:grid !important;
    float:right !important;
    grid-column-start:1 !important;
    grid-row-start:1 !important;
    grid-gap:2px !important;
    grid-template-columns:repeat(4, 1fr) !important;
    margin:0 !important;
    padding:0 !important;
}

#fleet1 .allornonewrap .firstcol
{
    bottom:-28px !important;
    position:absolute !important;
    right:18px !important;
    width:auto !important;
}

#fleet1 .allornonewrap .secondcol .clearfloat
{
    display:none !important;
}

#fleet1 #buttonz .content
{
    margin-bottom:30px;
}

#fleet1 #continueToFleet2, #fleet2 #continueToFleet3,
#fleet3 #sendFleet, #fleet2 #backToFleet1, #fleet3 #backToFleet2
{
    background:linear-gradient(to bottom right, #1f2735 45%, #05080a) !important;
    border:2px solid #0c1014 !important;
    border-radius:4px;
    box-shadow:inset 0 1px rgb(255 255 255 / 7%), 0 0 0 1px #000, inset 0 100px rgb(29 39 70 / 30%);
    color:var(--green);
    grid-column-start:3;
    grid-row-start:1;
    height:auto;
    margin:0 !important;
    text-decoration:none !important;
    transition:opacity .3s;
}

#fleet1 #continueToFleet2 span, #fleet2 #continueToFleet3 span,
#fleet3 #sendFleet span, #fleet2 #backToFleet1 span, #fleet3 #backToFleet2 span
{
    height:auto;
    line-height:34px;
    padding:0 !important;
}

#fleet2 #continueToFleet3
{
    margin-left:15px !important;
}

#fleet2 #backToFleet1, #fleet3 #backToFleet2
{
    color:#9c9c9c !important;
}

#fleet3 #backToFleet2
{
    position:absolute;
    right:315px;
}

#fleet1 #continueToFleet2:not(.off):hover, #fleet2 #continueToFleet3:not(.off):hover,
#fleet3 #sendFleet:not(.off):hover, #fleet2 #backToFleet1:not(.off):hover, #fleet3 #backToFleet2:not(.off):hover
{
    color:#fff !important;
}

#fleet1 #continueToFleet2.off, #fleet2 #continueToFleet3.off, #fleet3 #sendFleet.off
{
    opacity:.5;
}

#fleet1 #continueToFleet2.on, #fleet2 #continueToFleet3.on, #fleet3 #sendFleet.on
{
    color:var(--green) !important;
}

#fleet1 #continueToFleet2 span, #fleet2 #continueToFleet3 span, #fleet3 #sendFleet span,
#fleet2 #backToFleet1 span, #fleet3 #backToFleet2 span
{
    color:inherit;
}

#fleet1 .send_all, #fleet1 .send_none,
#fleet1 .ogl_expeButton, #fleet1 .show_fleet_apikey, .ogl_capacityContainer
{
    background:linear-gradient(to bottom right, #1f2735 45%, #05080a) !important;
    border-color:#0c1014 !important;
    border-radius:4px;
    box-shadow:inset 0 1px rgb(255 255 255 / 7%), 0 0 0 1px #000, inset 0 100px rgb(29 39 70 / 30%);
    color:#fff !important;
    cursor:pointer;
    font-size:12px;
    font-weight:bold;
    grid-row-start:1;
    height:auto;
    position:relative;
    text-decoration:none !important;
    width:38px;
}

#fleet1 .send_all:before, #fleet1 .send_none:before,
#fleet1 .ogl_expeButton:before, #fleet1 .show_fleet_apikey:before
{
    content:'';
    line-height:34px !important;
    width:100%;
}

#fleet1 .send_all:hover, #fleet1 .send_none:hover,
#fleet1 .ogl_expeButton:hover, #fleet1 .show_fleet_apikey:hover
{
    color:#fff !important;
}

#fleet1 .send_all, #fleet1 .send_none
{
    font-family:"Material Icons";
    font-size:20px;
}

#fleet1 #sendall, #fleet1 #resetall
{
    background:none;
    height:100%;
    left:-1px;
    padding:1px;
    position:absolute;
    text-align:center;
    top:-1px;
    width:100%;
}

#fleet1 .send_all { color:#d0af37 !important; }
#fleet1 .send_none { color:#bd4d4d !important; }
#fleet1 .ogl_expeButton { color:#4087f1 !important;display:none; }
#fleet1 .show_fleet_apikey { color:#9c9c9c !important;grid-column-start:3; }

#fleet1 .send_all:before { content:'double_arrow'; }
#fleet1 .send_none:before { content:'exposure_zero'; }
#fleet1 .ogl_expeButton:before { content:'EXP'; }
#fleet1 .show_fleet_apikey:before { content:'API'; }

.ogl_choseCapacity > div
{
    display:grid;
    grid-template-columns:40px auto;
    margin-bottom:4px;
}

.ogl_choseCapacity .ogl_shipIcon
{
    border-radius:0;
    border-right:none;
    height:26px;
}

.ogl_choseCapacity button,
.ogl_resourceToKeep button
{
    color:var(--green);
    float:right;
    font-weight:bold;
    text-transform:uppercase;
}

#fleet1 .technology .icon.small
{
    height:70px;
}

#fleet1 #buttonz .footer
{
    bottom:-45px;
    left:-1px;
}

#fleet2 #buttonz
{
    background:#0d1014;
    border-radius:0 0 7px 7px;
    box-shadow:inset 0 0 0 1px #000;
    display:grid;
    grid-gap:3px;
    grid-template-columns:auto 147px;
    overflow:hidden;
    width:659px;
}

#fleet2 #buttonz .content, #fleet2 #buttonz .footer
{
    background:#0d1014;
    width:512px;
}

#fleet2 #buttonz .header
{
    grid-column:1 / 3;
}

#fleet2 .ogl_planetList
{
    display:grid;
    grid-auto-rows:min-content;
    height:100%;
    left:-5px;
    position:relative;
    width:auto;
    z-index:2;
}

#fleet2 .glow
{
    box-shadow:none;
}

.ogl_planetList > div
{
    align-items:center;
    background:#121a21;
    box-shadow:0 0 0 2px #0d1014;
    display:grid;
    grid-gap:2px;
    grid-template-columns:104px 74px;
    line-height:22px;
    margin:1px;
    padding:0 0 0 5px;
    position:relative;
    white-space:nowrap;
}

.ogl_planetList div > b
{
    color:#ccc;
    display:inline-block;
}

.ogl_popup .ogl_planetList > div
{
    grid-template-columns:145px 50px;
}

#fleet2 .ogl_planetList > div
{
    grid-template-columns:58px 74px;
}

.ogl_planetList .ogl_coords, .ogl_planetList .ogl_name
{
    align-items:center;
    color:#5d82af;
    display:grid;
    grid-gap:4px;
    grid-template-columns:72px min-content;
    font-size:10px;
    font-weight:bold;
    overflow:hidden;
    text-align:left;
    text-overflow:ellipsis;
    white-space:nowrap;
}

.ogl_planetList .ogl_coords > div
{
    color:var(--yellow);
    font-weight:bold;
}

.ogl_planetList > div .ogl_actions
{
    display:grid;
    grid-template-columns:repeat(3, 1fr);
    text-align:center;
}

.ogl_popup .ogl_planetList > div .ogl_actions
{
    grid-template-columns:repeat(2, 1fr);
}

.ogl_planetList .ogl_planet,
.ogl_planetList .ogl_moon,
.ogl_planetList .ogl_cr
{
    align-items:center;
    display:grid;
    color:#c2d0d9;
    cursor:pointer;
    font-size:18px !important;
    height:100%;
    margin:auto;
    opacity:.4;
    user-select:none;
    width:100%;
}

.ogl_planetList .ogl_planet:hover,
.ogl_planetList .ogl_moon:hover,
.ogl_planetList .ogl_cr:hover
{
    opacity:.7;
}

.ogl_planetList .ogl_planet.ogl_active,
.ogl_planetList .ogl_moon.ogl_active,
.ogl_planetList .ogl_cr.ogl_active
{
    filter:hue-rotate(200deg) saturate(8);
    opacity:1;
}

.ogl_planetList .ogl_planet.ogl_active:before,
.ogl_planetList .ogl_moon.ogl_active:before,
.ogl_planetList .ogl_cr.ogl_active:before
{
    content:'';
    border-radius:3px;
    box-shadow:inset 0 0 0 2px #fff;
    height:100%;
    left:0;
    position:absolute;
    top:0;
    width:100%;
}

.ogl_planetList .ogl_planet.ogl_disabled,
.ogl_planetList .ogl_moon.ogl_disabled,
.ogl_planetList .ogl_cr.ogl_disabled
{
    filter:hue-rotate(150deg) saturate(20);
    pointer-events:none;
}

.ogl_planetList .ogl_cr > img
{
    height:20px;
    image-rendering:-webkit-optimize-contrast;
    margin:auto;
    pointer-events:none;
    width:20px;
}

#fleet2 #mission
{
    margin-left:14px !important;
    margin-top:0 !important;
    width:627px !important;
}

#fleet2 #mission th
{
    display:none;
}

#fleet2 #distanceValue
{
    margin:50px auto 0 auto;
}

#fleet2 #shortcuts
{
    width:117px !important;
}

#fleet2 #shortcuts > div:nth-child(1)
{
    visibility:hidden;
}

#fleet2 #shortcuts *
{
    max-width:109px;
}

#fleet2 #buttonz .header
{
    align-items:center;
    display:grid;
    justify-content:end;
    padding-right:15px;
}

#fleet2 #buttonz .header > div
{
    padding:0 !important;
}

#fleet2 #start, #fleet2 #target
{
    border-radius:7px;
}

#fleet2 #target
{
    margin:0;
    padding:0;
}

#fleet2 #target .target
{
    margin:auto;
    width:132px;
}

#fleet2 #target a.planet, #fleet2 #target a.planet_source,
#fleet2 #target a.planet_selected, #fleet2 #target a.planet_source_selected
{
    margin-left:0 !important;
}

#fleet2 .planetname
{
    width:auto;
}

#fleet2 .briefing
{
    border-radius:7px !important;
    margin:0 !important;
    width:475px !important;
}

#fleet2 .briefing > ul
{
    width:446px;
}

ul#fleetBriefingPart1
{
    margin-bottom:0;
}

ul#fleetBriefingPart1_2
{
    margin-left:20px;
    margin-top:0;
}

#fleet2 .briefing .undermark,
#fleet3 .undermark,
.status_abbr_ally_own
{
    color:var(--green) !important;
}

#fleet2 .briefing #steps
{
    margin-top:0 !important;
}

#fleet2 .briefing h2
{
    display:none;
}

.ogl_fleetSpeed
{
    background:linear-gradient(to left, #248469, #b9801a, #a72525);
    box-shadow:inset 0 0 0 1px #0c0f13;
    color:#6f9fc8;
    display:grid;
    grid-template-columns:repeat(10, 1fr);
    margin:7px 0 7px 15px;
    overflow:hidden;
    text-align:center;
    width:475px;
}

.ogl_fleetSpeed.ogl_big
{
    grid-template-columns:repeat(20, 1fr);
}

.ogl_fleetSpeed > div
{
    background:#13171d;
    box-shadow:inset 0 0 0 1px #0c0f13;
    cursor:pointer;
    font-size:11px;
    font-weight:bold;
    padding:5px 1px 5px 0;
    position:relative;
    transition:all .2s;
}

.ogl_fleetSpeed.ogl_big > div:nth-child(odd)
{
    color:#607486;
}

.ogl_fleetSpeed > div:hover
{
    opacity:.5;
}

.ogl_fleetSpeed > div.ogl_active
{
    background:var(--yellow);
    color:var(--gray);
    opacity:1;
}

#loadAllResources
{
    font-size:0;
    z-index:-1;
}

#fleet3 #sendfleet
{
    margin-top:-46px;
}

#fleet3 #missionNameWrapper
{
    display:none;
}

#fleet3 #sendfleet #resources .res_wrap
{
    background:#0c1014;
    border-radius:0;
    border:1px solid #1a232b;
    height:auto;
    margin-top:-4px;
    position:relative;
}

#fleet3 #sendfleet #resources .res_wrap .resourceIcon
{
    height:20px;
}

#fleet3 #sendfleet .res
{
    font-size:0;
}

#fleet3 #sendfleet .res > *:not(input)
{
    background:var(--gray);
    border:1px solid #000;
    border-radius:2px;
    box-shadow:inset 0 200px #253644;
    cursor:pointer;
    display:inline-block;
    font-size:14px;
    font-weight:bold;
    height:18px;
    line-height:18px;
    margin-right:2px;
    overflow:hidden;
    text-align:center;
    transform:translateX(-50px);
    vertical-align:bottom;
    width:18px;
}

#fleet3 #sendfleet .res .resbuttons
{
    display:none;
}

#fleet3 #sendfleet .res > *:not(input):hover
{
    background:var(--yellow) !important;
    box-shadow:none;
    color:var(--gray) !important;
}

#fleet3 #sendfleet .res a:nth-child(2):before,
#fleet3 #sendfleet .res a:nth-child(3):before
{
    content:'double_arrow';
    font-family:'material icons';
}

#fleet3 #sendfleet .res a:nth-child(2):before
{
    content:'clear';
}

#fleet3 #sendfleet .ogl_resourceSaver,
#fleet3 #sendfleet .ogl_delta
{
    border:none;
    border-radius:2px;
    color:#fff;
    cursor:pointer;
    display:inline-block;
    padding:0;
    position:relative;
    text-align:center;
    top:auto;
    width:15px;
}

#fleet3 #sendfleet .ogl_resourceSaver
{
    font-size:11px !important;
    position:absolute;
    right:-50px;
    top:auto;
    width:65px !important;
}


/*  PLANETMANAGER
------------------------------------------ */
.smallplanet
{
    border-radius:0 !important;
    display:grid;
    grid-gap:3px;
    grid-template-columns:auto 39px;
    height:auto !important;
    font-size:10px;
    margin:0 0 3px 0!important;
    position:relative !important;
    width:100% !important;
}

.smallplanet *
{
    box-sizing:border-box;
    font-size:inherit !important;
    font-weight:normal !important;
}

.smallplanet img
{
    background:#284563;
    border-radius:50% !important;
    box-shadow:0 0 0 1px #000 !important;
    height:14px;
    left:-3px !important;
    margin:0 !important;
    position:absolute !important;
    top:12px !important;
    transition:transform .3s;
    width:14px;
    z-index:2;
}

.smallplanet .planetlink img
{
    top:10px !important;
    height:18px;
    width:18px;
}

.smallplanet .planetlink, .smallplanet .moonlink
{
    background:linear-gradient(to bottom right, #1f2735 45%, #05080a);
    background-position:0 !important;
    border:none !important;
    border-radius:4px;
    box-shadow:inset 0 1px rgba(255,255,255,.07), 0 0 0 1px #000, inset 0 100px rgba(29,39,70,.3);
    height:36px !important;
    overflow:hidden;
    position:relative !important;
    transition:box-shadow .3s;
    z-index:1;
}

.smallplanet .planetlink.ogl_active, .smallplanet .moonlink.ogl_active
{
    box-shadow:inset 0 1px rgba(255,255,255,.07), inset 0 100px rgba(31,38,53,.3), 0 0 0 2px #fff;
}

.smallplanet .planetlink
{
    border-right:1px solid #000;
    left:0 !important;
    text-align:left;
    top:0 !important;
}

.smallplanet .moonlink
{
    bottom:0 !important;
    color:#9e945b !important;
    left:0 !important;
    text-align:left;
    top:auto !important;
}

.smallplanet .planetlink:hover, .smallplanet .moonlink:hover
{
    background:linear-gradient(to bottom right, #3b4b6f 45%, #090e13);
}

.smallplanet .planetlink.active, .smallplanet .moonlink.active
{
    background:linear-gradient(to bottom right, var(--purple) 45%, #090e13);
}

.smallplanet .planet-name,
.smallplanet .planet-koords
{
    left:20px !important;
    position:absolute !important;
}

.smallplanet .planet-name
{
    color:#6982af !important;
    font-weight:bold !important;
    max-width:62px;
    overflow:hidden;
    text-overflow:ellipsis;
    top:5px !important;
}

.smallplanet .planet-koords
{
    color:#6d6d6d !important;
    letter-spacing:-0.05em;
    top:18px !important;
}

[data-multi="0"]::before
{
    border:2px solid #ffdb2d;
}

[data-multi="1"]::before
{
    border:2px solid #8bc34a;
}

[data-multi="2"]::before
{
    border:2px solid #d24c9c;
}

[data-multi="3"]::before
{
    border:2px solid #03a9f4;
}

[data-multi="4"]::before
{
    border:2px solid #f57c00;
}

[data-multi="5"]::before
{
    border:2px solid #d2d2d2;
}

[data-multi="6"]::before
{
    border:2px solid #009688;
}

[data-multi="7"]::before
{
    border:2px solid #d41c1c;
}

[data-multi="8"]::before
{
    border:2px solid #3f51b5;
}

[data-multi]::before
{
    border-right:0;
    bottom:-3px;
    content:'';
    display:block;
    height:100%;
    left:-6px;
    position:absolute;
    transform:translateY(-50%);
    width:3px;
}

#planetbarcomponent #rechts #myPlanets .smallplanet a.constructionIcon,
#planetbarcomponent #rechts #cutty a.constructionIcon
{
    bottom:3px !important;
    left:3px !important;
    position:absolute !important;
    top:auto !important;
    z-index:3 !important;
}

#planetbarcomponent #rechts #myPlanets .smallplanet a.constructionIcon.moon,
#planetbarcomponent #rechts #cutty a.constructionIcon.moon
{
    left:111px !important;
}

#planetbarcomponent #rechts #myPlanets .smallplanet a.wreckFieldIcon
{
    left:-20px;
    top:-1px;
}

/*  FLEET EVENTS
------------------------------------------ */
.eventFleet[data-mission-type="1"], .fleetDetails[data-mission-type="1"]
{
    color:#ea463e !important;
}

.eventFleet[data-mission-type="2"], .fleetDetails[data-mission-type="2"]
{
    color:#ff6046 !important;
}

.eventFleet[data-mission-type="3"], .fleetDetails[data-mission-type="3"]
{
    color:#76c754 !important;
}

.eventFleet[data-mission-type="4"], .fleetDetails[data-mission-type="4"]
{
    color:#47c79e !important;
}

.eventFleet[data-mission-type="5"], .fleetDetails[data-mission-type="5"]
{
    color:#e48d50 !important;
}

.eventFleet[data-mission-type="6"], .fleetDetails[data-mission-type="6"]
{
    color:#cabe6e !important;
}

.eventFleet[data-mission-type="7"], .fleetDetails[data-mission-type="7"]
{
    color:#72d9de !important;
}

.eventFleet[data-mission-type="8"], .fleetDetails[data-mission-type="8"]
{
    color:#b7e8c0 !important;
}

.eventFleet[data-mission-type="9"], .fleetDetails[data-mission-type="9"]
{
    color:#fd2e2e !important;
}

.eventFleet[data-mission-type="15"], .fleetDetails[data-mission-type="15"]
{
    color:#6d98e2 !important;
}

.eventFleet[data-mission-type="16"], .fleetDetails[data-mission-type="16"]
{
    color:#72c4d4 !important;
}

#eventContent tbody
{
    outline:1px solid #000;
}

#eventContent tr, #eventContent .odd, #eventContent .part-even
{
    background:#141e26;
    line-height:22px;
}

#eventContent tr td
{
    font-size:10px;
    padding:0;
    position:relative;
    vertical-align:middle;
}

#eventContent tr td *
{
    font-size:inherit !important;
}

#eventContent tr td *:not(.textBeefy):not(a)
{
    color:inherit;
}

#eventContent tr td a:not(.icon_link)
{
    background:rgba(0,0,0,.4);
    border-radius:40px;
    padding:2px 4px;
    text-decoration:none;
}

.sendProbe .icon_link
{
    background:none;
}

#eventContent tr td figure
{
    margin-right:2px;
}

#eventContent tr .icon_movement,
#eventContent tr .icon_movement_reserve
{
    background-position-y:center;
    display:table-cell;
    height:auto;
    padding:0;
}

.eventFleet[data-return-flight="true"],
.fleetDetails[data-return-flight="1"]
{
    box-shadow:inset 0 150px 0 rgba(0,0,0,.5);
}

#eventContent td a:hover
{
    color:#73a7c5;
}

#eventContent tr[data-return-flight="true"] td
{
    opacity:.5;
}

#eventContent .originFleet span, #eventContent .destFleet span
{
    display:block !important;
    font-size:0 !important;
    overflow:visible;
    width:auto;
}

#eventContent .originFleet span:after, #eventContent .destFleet span:after
{
    content:attr(data-tooltip);
    font-size:10px;
    overflow:hidden;
    text-align:center;
    text-overflow:ellipsis;
    vertical-align:middle;
}

.eventFleet .countDown, .eventFleet .arrivalTime
{
    text-align:left;
    text-indent:5px;
}

#eventContent .countDown
{
    text-shadow:1px 1px #000;
}

.eventFleet .missionFleet img
{
    position:relative;
    top:3px;
    vertical-align:top;
}

.detailsOpened .ogl_backTimer
{
    background:#232f3a;
    border-radius:2px;
    right:205px;
    line-height:16px;
    padding:0 9px;
    position:absolute;
    top:3px;
}

.ogl_backTimer:before, .ogl_backTimer:after
{
    font-size:10px !important;
    vertical-align:middle;
}

.detailsOpened .marker01, .detailsOpened .marker02
{
    visibility:hidden !important;
}

.ogl_shipDetail
{
    color:#6982af;
    display:grid;
    grid-gap:2px;
    grid-template-columns:repeat(20, 1fr);
    height:18px;
    pointer-events:none;
    position:absolute;
    left:115px;
    text-align:center;
    top:25px;
    white-space:nowrap;
}

.ogl_shipDetail > div
{
    display:grid;
}

.ogl_shipDetail .ogl_shipIcon
{
    border:none;
    border-radius:40px !important;
    box-shadow:none;
    display:inline-block;
    height:24px;
    image-rendering:-webkit-optimize-contrast;
    margin:auto;
    position:relative;
    width:24px;
    z-index:-1;
}

.ogl_shipDetail span
{
    background:#1f273a;
    border-radius:2px;
    box-shadow:0 0 5px #000;
    line-height:14px;
    margin-top:-6px;
    font-weight:bold;
    font-size:9px;
}

.fleetDetails.detailsOpened
{
    height:59px !important;
}

.detailsOpened .timer
{
    font-size:12px !important;
    font-weight:bold !important;
    left:7px !important;
    top:24px !important;
    width:auto !important;
}

.detailsOpened .absTime
{
    left:7px !important;
    top:40px !important;
}

.detailsOpened .originData
{
    left:107px !important;
    text-align:right !important;
}

.detailsOpened .destinationData
{
    left:470px !important;
    text-align:left !important;
}

.fleetDetails
{
    background:#141e26;
    box-shadow:inset 0 23px #0d1014, inset 0 -2px 23px #000 !important;
    margin:2px 5px 10px 5px;
}

.fleetDetails.detailsOpened .mission
{
    border-radius:2px !important;
    color:inherit !important;
    display:inline-block !important;
    left:7px !important; 
    padding:1px 10px !important;
    top:3px !important;
}

.fleetDetails.detailsOpened .mission:before
{
    background:currentColor;
    content:'';
    display:block;
    height:100%;
    left:0;
    opacity:.2;
    position:absolute;
    top:0;
    width:100%;
}

.detailsOpened .nextTimer, .detailsOpened .nextabsTime, .detailsOpened .nextMission,
#movementcomponent .starStreak .origin, #movementcomponent .starStreak .destination
{
    display:none !important;
}

.detailsOpened .starStreak
{
    background:none !important;
    border:none !important;
    overflow:initial !important;
}

.detailsOpened .reversal
{
    left:auto !important;
    right:338px !important;
    top:1px !important;
    z-index:2 !important;
}

.detailsOpened .fedAttack
{
    left:auto !important;
    right:43px !important;
    top:24px !important;
}

.detailsOpened .sendMail
{
    left:auto !important;
    right:22px !important;
    top:24px !important;
}

.detailsOpened .originData, .detailsOpened .destinationData
{
    color:#fff !important;
    width:168px !important;
}

.detailsOpened .originPlanet, .detailsOpened .destinationPlanet
{
    display:inline-block !important;
    position:relative !important;
    top:auto !important;
    left:auto !important;
    max-width:100px !important;
    right:auto !important;
    vertical-align:middle !important;
    width:auto !important;
}

.detailsOpened .absTime:after
{
    font-size:10px !important;
}

#movementcomponent .detailsOpened .starStreak .route a
{
    background:none !important;
    left:103px !important;
    margin-left:0 !important;
    margin-top:5px !important;
    position:absolute !important;
    top:-33px !important;
    transform:scaleX(1) !important;
    transform-origin:right !important;
}

#movementcomponent .detailsOpened .starStreak .route a.fleet_icon_forward
{
    transform:scaleX(-1) !important;
    transform-origin:right !important;
}

/*  TOOLTIP MANAGER
------------------------------------------ */
.ogl_tooltip
{
    background:var(--raisin);
    border:2px solid #364352;
    border-radius:5px;
    box-shadow:0 0 10px #000;
    box-sizing:border-box;
    display:none;
    font-size:11px;
    max-width:440px;
    min-width:20px;
    padding:10px;
    position:absolute;
    width:fit-content;
    width:-moz-fit-content;
    z-index:1000000;
}

.ogl_tooltip.ogl_active
{
    display:block;
}

.ogl_tooltip:after
{
    background:var(--raisin);
    border-bottom:2px solid #364352;
    border-right:2px solid #364352;
    bottom:-6px;
    content:'';
    display:block;
    height:15px;
    left:50%;
    pointer-events:none;
    position:absolute;
    transform:translateX(-50%) rotate(45deg);
    width:15px;
    z-index:-1;
}

.ogl_tooltip.ogl_left:after
{
    border:none;
    border-top:2px solid #364352;
    border-right:2px solid #364352;
    bottom:auto;
    left:auto;
    margin-top:-12px;
    top:50%;
    transform:rotate(45deg);
    right:-6px;
}

.ogl_tooltip.ogl_right:after
{
    border:none;
    border-bottom:2px solid #364352;
    border-left:2px solid #364352;
    bottom:auto;
    left:-6px;
    transform:rotate(45deg);
    margin-top:-12px;
    top:50%;
}

.ogl_tooltip.ogl_bottom:after
{
    border:none;
    border-top:2px solid #364352;
    border-left:2px solid #364352;
    bottom:auto;
    left:50%;
    top:-8px;
    transform:translateX(-50%) rotate(45deg);
}

.splitLine
{
    background:#181d27;
    border:none;
    height:2px;
    margin:9px 0;
}

.ogl_tooltip .ogl_value
{
    color:var(--yellow);
    font-weight:bold;
    margin-left:10px;
}

.ogl_tooltip a
{
    color:var(--skyblue);
    text-decoration:none;
}

.ogl_tooltip a:hover
{
    color:var(--yellow);
}

.ogl_tooltip div.alert_triangle
{
    top:auto;
}

.ogl_tooltip .float_right
{
    margin-left:10px;
}

/*  GALAXY MANAGER
------------------------------------------ */
#galaxytable, .ogl_spyTable
{
    background:#0d1014;
    border-collapse:collapse;
}

#galaxytable tbody tr.row, .ogl_spyTable tr
{
    height:30px;
    opacity:1;
    position:relative;
}

#galaxytable tbody tr:before, .ogl_spyTable tr:before
{
    background:linear-gradient(to right, rgba(23,31,41,.6) 10px, rgba(23,31,41,.96) 200px);
    content:'';
    height:30px;
    left:0;
    position:absolute;
    width:100%;
}

.ogl_spyTable tr:before
{
    left:auto;
    width:626px;
}

.ogl_spyTable tr.ogl_extended
{
    height:120px;
}

.ogl_spyTable tr.ogl_extended:before
{
    height:120px;
}

.ogl_spyTable .ogl_added
{
    font-size:10px;
    opacity:.5;
}

.ogl_spyTable a.ogl_added
{
    display:block;
}

#galaxytable .expeditionDebrisSlot:before
{
    height:64px;
}

#galaxytable tbody tr td, .ogl_spyTable td
{
    background:none !important;
    border-radius:0;
    box-shadow:inset 1px 0 rgba(255,255,255,.03), inset -1px 0 rgba(0,0,0,.5), inset 0 1px rgba(255,255,255,.03), inset 0 -1px rgba(0,0,0,.5);
    filter:brightness(100%) !important;
    font-size:11px;
    font-weight:normal;
    line-height:17px !important;
    padding:0 5px;
    text-shadow:1px 1px #000;
    transition:background .2s;
    white-space:nowrap;
}

#galaxytable tbody tr[class*="filtered_filter_"]:not([data-color]):before
{
    background:#0d1014;
}

#galaxytable tbody tr[class*="filtered_filter_"]:not([data-color]) td
{
    opacity:.2;
}

#galaxytable tbody *
{
    white-space:nowrap;
}

#galaxytable tr.row
{
    display:grid;
    grid-template-columns:30px 35px 140px 35px 50px auto 80px 90px;
    height:30px !important;
}

#galaxytable tr.row td
{
    box-sizing:border-box;
    font-size:11px !important;
    height:30px !important;
    line-height:30px !important;
    margin:0 !important;
    padding:0 !important;
    width:100% !important;
}

#galaxytable td.playername
{
    width:240px;
}

#galaxytable .playername .float_right,
#galaxytable .playername .float_right a
{
    color:var(--yellow);
    font-size:10px;
}

#galaxytable .ListImage .planetTooltip, #galaxytable tr.row td.moon img
{
    margin-left:-5px;
}

#galaxytable td.moon
{
    width:30px;
}

#galaxytable tr.row td.planetname, #galaxytable tr.row td.planetname1
{
    text-align:left;
    text-indent:10px;
}

#galaxytable tr td.action
{
    padding-top:7px !important;
}

#galaxytable tr td.playername
{
    padding:0 5px !important;
}

#galaxytable .playername a
{
    display:inline-block;
    line-height:27px;
    max-width:110px;
    overflow:hidden;
    text-overflow:ellipsis;
    vertical-align:middle;
    white-space:nowrap;
}

#galaxytable .playername .honorRank
{
    pointer-events:none;
    position:relative;
    top:6px;
    vertical-align:top;
}

.status_abbr_longinactive
{
    color:#616161!important;
}

.status_abbr_inactive
{
    color:#989898!important;
}

#galaxytable .playername
{
    text-align:left;
}

#galaxytable .playername .status
{
    
}

#galaxytable .activity,
#galaxytable .fleetAction
{
    pointer-events:none;
}

#galaxytable tr.row td.allytag
{
    padding-right:8px !important;
    text-align:right;
}

.ogl_stalk h1 .ogl_ranking
{
    color:var(--yellow);
    margin-left:5px;
}

.ogl_stalk h1 span a
{
    color:inherit;
}

.ogl_stalkPlanets
{
    background:var(--darkblue);
    box-sizing:border-box;
    display:grid;
    grid-auto-rows:min-content;
    grid-gap:5px;
    grid-template-columns:repeat(2, 1fr);
}

.ogl_sideView .ogl_stalkPlanets
{
    align-content:flex-start;
    display:flex;
    flex-wrap:wrap;
    height:calc(100vh - 215px);
    overflow-y:auto;
    padding:6px;
    width:100%;
}

.ogl_stalkPlanets > div
{
    background-color:var(--darkblue);
    border:3px solid #1f2735;
    border-radius:3px;
    box-shadow:0 0 5px #000;
    color:var(--bluelight);
    cursor:pointer;
    font-weight:bold;
    font-size:11px;
    height:23px;
    line-height:20px;
    min-width:100px;
    padding:0 5px;
    position:relative;
    text-shadow:0px 1px 5px #000;
    user-select:none;
    white-space:nowrap;
}

.ogl_sideView .ogl_stalkPlanets > div
{
    width:40%;
}

.ogl_stalkPlanets > div:before
{
    background:var(--raisin);
    content:'';
    display:block;
    height:21px;
    left:-1px;
    position:absolute;
    right:-1px;
    top:-1px;
}

.ogl_stalkPlanets > div span
{
    position:relative;
    z-index:1;
}

.ogl_stalkPlanets > div.ogl_active,
.ogl_sideView .ogl_stalkPlanets > div.ogl_active
{
    border-color:hsla(218, 26%, 25%, 1);
}

.ogl_stalkPlanets > div.ogl_active:before,
.ogl_sideView .ogl_stalkPlanets > div.ogl_active:before
{
    background:hsla(218, 26%, 25%, 1);
}

.ogl_sideView .ogl_stalkPlanets > div
{
    min-width:106px;
}

.ogl_sideView .ogl_stalkPlanets > div .ogl_active.ogl_flagIcon
{
    color:var(--yellow);
}

.ogl_stalkPlanets > div:hover
{
    border-color:hsla(218, 26%, 25%, 1);
}

.ogl_stalkPlanets > div .ogl_planetIcon,
.ogl_stalkPlanets > div .ogl_moonIcon,
.ogl_stalkPlanets > div .ogl_flagIcon
{
    border-radius:50%;
    color:var(--skyblue);
    float:right;
    font-size:15px !important;
}

.ogl_stalkPlanets > div .ogl_flagIcon
{
    margin-right:2px;
}

.ogl_stalkPlanets > div .ogl_planetIcon:hover,
.ogl_stalkPlanets > div .ogl_moonIcon:hover,
.ogl_stalkPlanets > div .ogl_flagIcon:hover
{
    color:var(--sunset);
}

.ogl_stalkPlanets > div .ogl_moonIcon
{
    filter:brightness(.3);
    pointer-events:none;
    position:relative;
    top:1px;
    transform:rotate(20deg);
}

.ogl_stalkPlanets > div .ogl_moonIcon.ogl_active
{
    filter:brightness(1);
    pointer-events:auto;
}

.ogl_stalkPlanets > div .ogl_mainPlanet
{
    color:#e4bb25;
    font-size:9px !important;
    position:absolute;
    top:-5px;
}

.ogl_stalk .splitLine
{
    background:none;
    clear:both;
    margin:4px 0;
}

.ogl_stalkPlanets .ogl_disabled
{
    color:var(--red) !important;
    opacity:.5;
}

.ogl_stalkInfo
{
    background:var(--darkblue);
    border-radius:5px;
    display:grid;
    grid-template-columns:auto min-content;
    padding:5px;
}

.ogl_stalkInfo > *
{
    grid-row:1;
}

.ogl_stalkPoints
{
    border-left:2px solid var(--raisin);
    display:grid;
    grid-auto-rows:min-content;
    grid-column-start:2;
    grid-gap:3px;
    margin-left:5px;
    padding-left:5px;
}

.ogl_sideView .ogl_stalkPoints
{
    grid-template-columns:repeat(3, 1fr);
    margin:0;
    padding:0;
}

.ogl_sideView h1
{
    font-size:16px;
    font-weight:bold;
    text-align:center;
}

.ogl_stalkPoints > div
{
    align-self:end;
    align-items:center;
    background:var(--black);
    border:1px solid #121921;
    border-radius:4px;
    display:grid;
    font-size:10px;
    font-weight:bold;
    grid-gap:8px;
    grid-template-columns:min-content auto;
    padding:1px 4px 1px 1px;
    text-align:right;
    white-space:nowrap;
}

.ogl_stalkPoints > div i
{
    font-size:16px !important;
}

.ogl_stalkPoints > div:nth-child(1) { background:#1b3444;color:#91d2ff; }
.ogl_stalkPoints > div:nth-child(2) { background:#383737;color:#c5c5c5; }
.ogl_stalkPoints > div:nth-child(3) { background:#214227;color:#a6e88b; }
.ogl_stalkPoints > div:nth-child(4) { background:#402020;color:#ff9393; }
.ogl_stalkPoints > div:nth-child(5) { background:#443822;color:#e8a560; }

.ogl_stalkPoints > div:nth-child(1):before
{
    background-position:0 -3px;
}

.ogl_stalkPoints > div:nth-child(2):before
{
    background-position:100% -3px;
}

.ogl_stalkPoints > div:nth-child(3):before
{
    background-position:80% -3px;
}

.ogl_stalkPoints > div:nth-child(4):before
{
    background-position:60% -3px;
}

.ogl_stalkPoints > div:nth-child(5):before
{
    background-position:60% -3px;
    filter:hue-rotate(27deg) brightness(1.75);
}

.ogl_stalkPoints > div:nth-child(6):before
{
    background-position:60% -3px;
    filter:hue-rotate(67deg) brightness(1.75);
}

#galaxytable .debrisField
{
    background:none !important;
    color:#fff;
    font-size:10px;
    left:0;
    line-height:14px;
    padding:0;
    position:absolute;
    width:100% !important;
}

#galaxytable .debris.ogl_active
{
    background:var(--orangedark) !important;
    opacity:1 !important;
}

.expeditionDebrisSlotBox
{
    align-items:center;
    background:none !important;
    border:none !important;
    box-shadow:none !important;
    display:grid;
    grid-template-columns:20% auto auto auto;
    width:652px;
}

.expeditionDebrisSlotBox li
{
    list-style:none;
}

.expeditionDebrisSlotBox > img
{
    float:right;
    justify-self:center;
}

.expeditionDebrisSlotBox > div
{
    line-height:1.6;
    text-align:left;
}

.expeditionDebrisSlotBox a:hover
{
    color:var(--orange);
}

/*  PLAYER MANAGER
------------------------------------------ */
.ogl_colorButton
{
    background:#151515;
    border:2px solid #1f252b;
    border-radius:3px;
    cursor:pointer;
    height:16px;
    left:5px;
    position:absolute;
    top:5px;
    transition:all .2s;
    width:16px;
}

.ogl_colorButton:hover
{
    border-color:#263640;
    filter:brightness(1.2);
}

/*  PLANET MANAGER
------------------------------------------ */
.ogl_colorPicker
{
    display:grid;
    grid-template-columns:repeat(2, 1fr);
    width:60px;
}

.ogl_colorPicker > div
{
    border-radius:3px;
    box-shadow:inset 0 0 0 3px rgba(0,0,0,.3);
    cursor:pointer;
    filter:brightness(.9);
    height:24px;
    margin:2px;
    position:relative;
    transition:transform .2s, filter .2s;
    width:24px;
}

.ogl_colorPicker > div:hover
{
    filter:brightness(1.3);
    transform:scale(1.2);
    z-index:2;
}

.ogl_colorPicker > div[data-color="none"]:before
{
    content:'clear';
    display:block;
    font-family:'material icons';
    font-size:10px;
    height:100%;
    left:0;
    line-height:24px;
    position:absolute;
    text-align:center;
    top:0;
    width:100%;
}

[data-color="red"], [data-color="red"] .ogl_colorButton, [data-toggle="red"] { background:var(--red) !important; }
[data-color="yellow"], [data-color="yellow"] .ogl_colorButton, [data-toggle="yellow"] { background:var(--yellow) !important; }
[data-color="green"], [data-color="green"] .ogl_colorButton, [data-toggle="green"] { background:var(--green) !important; }
[data-color="blue"], [data-color="blue"] .ogl_colorButton, [data-toggle="blue"] { background:var(--blue) !important; }
[data-color="violet"], [data-color="violet"] .ogl_colorButton, [data-toggle="violet"] { background:var(--violet) !important; }

[data-color="gray"] { opacity:.2 !important; }
[data-color="gray"] .ogl_colorButton, [data-toggle="gray"] { background:var(--white) !important; }
.ogl_colorPicker [data-color="gray"] { background:var(--white) !important;opacity:1 !important; }
#galaxytable tr[data-color="gray"] { background:#0d1014;opacity:1 !important; }
#galaxytable tr[data-color="gray"]:before { background:#0d1014; }
#galaxytable tr[data-color="gray"] td { opacity:.2 !important; }

[data-color="halfred"], [data-color="halfred"] .ogl_colorButton, [data-toggle="halfred"] { background:repeating-linear-gradient(-45deg, var(--red), var(--red) 5px, #942424 5px, #942424 10px) !important; }
[data-color="halfyellow"], [data-color="halfyellow"] .ogl_colorButton, [data-toggle="halfyellow"] { background:repeating-linear-gradient(-45deg, var(--yellow), var(--yellow) 5px, #947931 5px, #947931 10px) !important; }
[data-color="halfgreen"], [data-color="halfgreen"] .ogl_colorButton, [data-toggle="halfgreen"] { background:repeating-linear-gradient(-45deg, var(--green), var(--green) 5px, #2b8055 5px, #2b8055 10px) !important; }
[data-color="halfblue"], [data-color="halfblue"] .ogl_colorButton, [data-toggle="halfblue"] { background:repeating-linear-gradient(-45deg, var(--blue), var(--blue) 5px, #314a8c 5px, #314a8c 10px) !important; }
[data-color="halfviolet"], [data-color="halfviolet"] .ogl_colorButton, [data-toggle="halfviolet"] { background:repeating-linear-gradient(-45deg, var(--violet), var(--violet) 5px, #5c2e6b 5px, #5c2e6b 10px) !important; }

.ogl_stalkList
{
    display:grid;
    justify-items:end;
}

.ogl_stalkList > div:nth-child(1)
{
    display:grid;
    grid-gap:4px;
    grid-template-columns:repeat(11, 1fr);
    justify-items:end;
    margin-bottom:20px;
    width:280px;
}

.ogl_stalkList > div:nth-child(2),
.ogl_stalkList > div:nth-child(3)
{
    display:grid;
    grid-gap:3px;
    grid-template-columns:repeat(10, 1fr);
    margin-bottom:7px;
    width:100%;
}

.ogl_stalkList > div:nth-child(2) > div,
.ogl_stalkList > div:nth-child(3) > div
{
    background:rgba(255,255,255,.07);
    border-radius:3px;
    box-sizing:border-box;
    color:#b3b3b3;
    cursor:pointer;
    font-size:10px;
    font-weight:bold;
    line-height:21px;
    padding:4px 0;
    text-shadow:1px 2px var(--black);
    text-align:center;
}

.ogl_stalkList > div:nth-child(2) > div:hover,
.ogl_stalkList > div:nth-child(3) > div:hover
{
    color:#fff;
}

.ogl_stalkList > div:nth-child(2) > div.ogl_active,
.ogl_stalkList > div:nth-child(3) > div.ogl_active
{
    background:rgba(255,255,255,.07);
    box-shadow:0 0 0 2px #fff;
}

.ogl_stalkList > div:nth-child(2) > div.ogl_disabled,
.ogl_stalkList > div:nth-child(3) > div.ogl_disabled
{
    background:#0e1115;
    color:#353535;
}

.ogl_stalkList > div:nth-child(3)
{
    margin-bottom:20px;
}

.ogl_stalkList > div:nth-child(4)
{
    min-width:280px;
}

.ogl_toggle
{
    border-radius:3px;
    box-shadow:inset 0 50px rgba(0,0,0,.6), inset 0 0 0 2px rgba(255,255,255,.4);
    cursor:pointer;
    display:inline-block;
    height:20px;
    vertical-align:middle;
    width:20px;
}

.ogl_toggle:hover
{
    opacity:.7;
}

.ogl_toggle.ogl_active
{
    box-shadow:inset 0 50px rgba(0,0,0,.3), inset 0 0 0 2px rgba(255,255,255,.2);
}

.ogl_toggle.ogl_active:before
{ 
    color:#fff;
    content:"✓";
    display:inline-block;
    font-size:14px;
    left:0;
    line-height:22px;
    text-align:center;
    top:0;
    width:100%;
}

/*  PANEL MANAGER
------------------------------------------ */
#rechts
{
    margin-bottom:0 !important;
    margin-top:-57px;
}

#planetList
{
    margin-top:10px;
    width:147px !important;
}

#countColonies
{
    background:var(--raisin) !important;
    box-shadow:inset 0 1px rgba(255,255,255,.07), inset 0 100px rgba(0,0,0,.15), 0 0 0 1px #000;
    border-radius:5px;
    color:#6982af;
    font-size:10px;
    height:auto !important;
    line-height:20px !important;
    margin:0 !important;
    user-select:none;
}

#countColonies
{
    color:transparent !important;
}

#countColonies p
{
    text-align:left !important;
    text-indent:5px;
}

#countColonies span
{
    color:#6f9fc8;
}

#countColonies p:hover:after
{
    color:var(--hoverLight);
}

/*  SIDE VIEW MANAGER
------------------------------------------ */
.ogl_sideView
{
    background:var(--raisin);
    box-sizing:border-box;
    min-height:100vh;
    max-width:85%;
    padding:50px 20px 20px 20px;
    position:fixed;
    top:0;
    transform:translateX(100%);
    transition:transform .3s;
    right:0;
    width:320px;
    z-index:10000;
}

.ogl_sideView.ogl_active
{
    box-shadow:0 0 10px #000;
    transform:translateX(0%);
}

.ogl_sideView .ogl_close
{
    right:20px;
    top:10px;
}

.ogl_sideContent
{
    margin-bottom:20px;
}

.ogl_economy .ogl_total
{
    background:#0c1015;
    padding:10px 12px;
}

.ogl_economy > div:not(.ogl_total):hover
{
    background:#403916;
    cursor:pointer;
}

.ogl_economy .ogl_total .ogl_metal > div,
.ogl_economy .ogl_total .ogl_crystal> div,
.ogl_economy .ogl_total .ogl_deut > div
{
    display:inline-block;
    text-align:center;
}

.ogl_economy .ogl_total b
{
    font-size:16px;
}

.ogl_economy > div
{
    background:#141921;
    box-shadow:inset 0 -1px #0c1015;
    display:grid;
    grid-template-columns:auto 120px 120px 120px;
    font-size:10px;
    padding:1px 12px 2px 12px;
    position:relative;
    text-align:right;
}

.ogl_economy > div b
{
    display:inline-block;
    font-size:12px;
    magin:1px 0;
}

.ogl_economy > div i
{
    display:inline-block;
    font-size:10px;
    margin-bottom:2px;
    opacity:.8;
    text-align:left;
    text-indent:4px;
    vertical-align:bottom;
    width:64px;
}

.ogl_economy > div h3
{
    color:#fff;
    font-size:10px;
    margin:2px 0;
    text-align:left;
}

.ogl_economy > div h3 span
{
    color:#969696;
    display:inline-block;
    width:65px;
}

.ogl_panel > div:nth-child(1)
{
    color:var(--yellow);
}

[data-panel="stock"] .ogl_panel > div:nth-child(1)
{
    color:#51658a;
}

[data-panel="stock"] .ogl_panel > div:nth-child(2)
{
    color:var(--yellow);
}

[data-panel="stock"] .smallplanet
{
    grid-template-columns:50% 50%;
}

[data-panel="stock"] .ogl_stock
{
    display:grid;
}

[data-panel="stock"] img
{
    transform:scale(.9);
}

[data-panel="stock"] .planet-name,
[data-panel="stock"] .planet-koords,
[data-panel="stock"] .ogl_timer,
[data-panel="stock"] .ogl_jumpGateTimer
{
    opacity:0 !important;
    pointer-events:none;
}

.ogl_stock
{
    display:none;
    grid-template-rows:repeat(3, 1fr);
    line-height:10px;
    pointer-events:none;
    position:absolute;
    right:5px;
    text-align:right;
    top:4px;
}

.ogl_stock > *
{
    font-size:9px !important;
    font-weight:bold !important;
}

.ogl_prod
{
    grid-template-columns:repeat(4, 1fr) !important;
}

.ogl_mines
{
    font-weight:bold;
}

.ogl_panel
{
    bottom:0;
    display:grid;
    font-size:14px;
    grid-gap:4px;
    grid-template-columns:repeat(5, 1fr);
    position:absolute;
    right:5px;
    text-align:center;
    width:auto;
}

.ogl_panel > div
{
    color:#51658a;
    cursor:pointer;
}

.ogl_panel > div:hover
{
    color:var(--yellow);
}

.ogl_resourcesSum
{
    background:var(--raisin);
    border-radius:5px;
    box-shadow:inset 0 1px rgba(255,255,255,.07), inset 0 100px rgba(0,0,0,.15), 0 0 0 1px #000;
    display:grid;
    font-size:11px;
    font-weight:bold;
    grid-template-rows:repeat(3, 1fr);
    margin-top:7px;
    padding:8px;
    position:relative;
    text-align:right;
    text-shadow:1px 1px #000;
}

.ogl_resourcesSum i
{
    color:#4c5f88;
    font-size:24px !important;
    left:5px;
    position:absolute;
    top:10px;
}

/*  EMPIRE MANAGER
------------------------------------------ */
#technologydetails .costs li.ogl_noMoney
{
    color:var(--red);
}

#technologydetails .costs li.ogl_active
{
    color:var(--green);
}

#technologydetails > .sprite_large:before
{
    background:rgba(92,142,214,.4);
    box-shadow:inset 0 0 56px #000, inset 0 0 0 1px #000;
    content:'';
    height:100%;
    left:0;
    left:0;
    position:absolute;
    top:0;
    width:100%;
}

#technologydetails .technology_tree
{
    border-radius:0 8px 0 0;
}

#technologydetails .ogl_button
{
    font-size:18px !important;
    height:30px;
    line-height:26px !important;
    width:30px;
}

.ogl_lockBuild.ogl_disabled
{
    opacity:.5;
}

.ogl_lockBuild.ogl_active, .ogl_lockBuild.ogl_active:hover
{
    color:var(--yellow) !important;
}

#technologydetails .ogl_detailAction
{
    display:grid;
    grid-gap:2px;
    grid-template-columns:repeat(4, 1fr);
    position:absolute;
    right:3px;
    top:3px;
}

#shipyard .ogl_detailAction, #defense .ogl_detailAction
{
    grid-template-columns:repeat(1, 1fr);
}

#technologydetails .costs p
{
    display:none;
}

a.build-it_premium, button.build-it_premium
{
    display:block;
    padding-left:45px;
    text-align:left;
}

#technologydetails .premium_info
{
    bottom:10px;
    left:0;
    margin:0;
    padding-left:50px;
    pointer-events:none;
    position:absolute;
    width:auto;
}

#technologydetails a.build-it_premium span,
#technologydetails button.build-it_premium span
{
    display:inline-block !important;
    font-size:10px !important;
    height:auto !important;
    margin-top:12px !important;
    width:auto !important;
}

#technologydetails .premium_info span
{
    color:#b1e8fb;
}

.ogl_stats
{
    background:var(--raisin);
    border-radius:5px;
    box-shadow:inset 0 1px rgba(255,255,255,.07), inset 0 300px rgba(0,0,0,.15), 0 0 0 1px #000;
    box-sizing:border-box;
    font-weight:bold;
    margin:12px 0;
    padding:8px;
    position:relative;
    text-shadow:1px 1px #000;
    width:134px;
}

.ogl_stats b
{
    background:var(--yellow);
    border-radius:4px;
    box-shadow:0 0 4px 1px #000;
    color:var(--gray);
    font-size:10px;
    padding:3px 7px;
    position:absolute;
    left:-4px;
    text-align:center;
    top:-7px;
    z-index:2;
}

.ogl_stats .ogl_button
{
    box-shadow:inset 0 12px rgba(255,255,255,.07);
    font-size:21px !important;
    height:29px;
    line-height:29px;
    padding:0;
    position:absolute;
    right:-2px;
    top:-2px;
    transform:translateX(100%);
    width:29px;
}

.ogl_stats .ogl_button:nth-of-type(2)
{
    top:29px;
}

.ogl_stats .ogl_button:nth-of-type(3)
{
    top:60px;
}

.ogl_labelLimit
{
    background:var(--yellow) !important;
    border-radius:2px;
    box-shadow:0 3px 5px rgba(0,0,0,.8);
    color:var(--gray) !important;
    display:block !important;
    font-weight:bold;
    left:-6px;
    padding:3px 5px;
    position:absolute;
    text-shadow:none;
    top:-8px;
    z-index:2;
}

.ogl_labelLimit.tooltipRight
{
    cursor:pointer;
}

.ogl_stats .ogl_date
{
    color:#4f5b73;
    display:block;
    font-size:10px;
    margin-top:5px;
    text-align:right;
}

.ogl_stats h2
{
    margin-bottom:10px;
    text-align:center;
}

.ogl_stats .ogl_0
{
    background:#252d3e;
    font-size:22px !important;
    text-align:center;
}

.ogl_stats .ogl_0:before
{
    color:#fff;
    content:'functions';
}

.ogl_stats > div
{
    color:#a9bbda;
    display:grid;
    font-size:10px;
    grid-template-columns:40px auto;
}

.ogl_stats .ogl_shipIcon, .ogl_sideView .ogl_shipIcon
{
    background-position:center;
    border:none;
    border-radius:0;
    border-right:1px solid #0d1013;
    height:18px !important;
    width:37px !important;
}

.ogl_stats .number
{
    color:var(--yellow);
    line-height:17px;
    padding:0 5px;
    text-align:right;
}

.ogl_fullStats
{
    align-items:start;
    display:grid;
    grid-gap:20px;
    grid-template-columns:repeat(2, 1fr);
    grid-template-rows:auto auto;
    padding-top:46px;
}

.ogl_fullStats h2
{
    font-size:10px;
    font-weight:bold;
    left:8px;
    position:absolute;
    text-transform:uppercase;
    top:8px;
}

.ogl_fullStats > div:nth-child(1) h2 { color:#5591dc; }
.ogl_fullStats > div:nth-child(2) h2 { color:#cc5c5c; }
.ogl_fullStats > div:nth-child(3) h2 { color:#57a28a; }

.ogl_fullStats > div
{
    background:#181e27;
    box-sizing:border-box;
    position:relative;
}

.ogl_fullStats .ogl_pieItems
{
    border-radius:4px;
    display:grid;
    grid-auto-rows:min-content;
    grid-gap:3px 8px;
    grid-template-columns:repeat(2, 1fr);
    padding:7px;
}

.ogl_fullStats .ogl_item
{
    background:#2c3954;
    border-radius:4px;
    display:grid;
    font-size:11px;
    font-weight:bold;
    grid-gap:4px;
    grid-template-columns:40px auto;
    line-height:22px;
    padding-right:7px;
    text-align:right;
}

.ogl_fullStats > div
{
    border-radius:6px;
    padding:20px;
    height:100%;
}

.ogl_fullStats > div .ogl_pieLabel, .ogl_fullStats > div .ogl_pieItems
{
    background:#222d40;
}

.ogl_fullStats > div > div:not(:last-child)
{
    margin-bottom:30px;
}

.ogl_fullStats > div:nth-child(1) { grid-row:1 / 3; }

.ogl_fullStats .ogl_shipIcon
{
    background-position:center;
    border:2px solid #43516d;
    height:100%;
    padding:0;
}

.ogl_fullStats .ogl_statsLimit
{
    background:#273346;
    border-radius:4px;
    box-shadow:0 2px 4px rgba(0,0,0,.5);
    color:#8da7b3;
    display:grid;
    font-size:12px;
    font-weight:bold;
    grid-template-columns:repeat(4, 1fr);
    height:25px;
    line-height:25px;
    left:50%;
    overflow:hidden;
    padding:0;
    position:absolute;
    text-align:center;
    transform:translateX(-50%);
    top:20px;
}

.ogl_fullStats .ogl_statsLimit > div
{
    cursor:pointer;
    margin:0 !important;
    padding:0 7px;
}

.ogl_fullStats .ogl_statsLimit > div.ogl_active
{
    background:#544d34;
    color:var(--yellow);
}

.ogl_fullStats .ogl_statsLimit > div:hover
{
    color:#fff;
}

.ogl_pie
{
    background:rgba(255,255,255,.1);
    border-radius:50%;
    box-shadow:0 7px 5px rgba(0,0,0,.3);
    height:167px;
    margin:auto;
    position:relative;
    text-align:center;
    width:167px;
}

.ogl_pie:before
{
    background:var(--gray);
    border-radius:50%;
    box-shadow:inset 0 7px 5px rgba(0,0,0,.3);
    content:'';
    height:1px;
    left:50%;
    padding:29%;
    position:absolute;
    top:50%;
    transform:translate(-50%, -50%);
    width:1px;
}

.ogl_pieLabel
{
    background:#272c44;
    border-radius:4px;
    box-sizing:border-box;
    color:#818cb3;
    margin:0 auto;
    padding:8px;
    white-space:nowrap;
    width:100%;
}

.ogl_pieLabel > div
{
    display:grid;
    font-weight:bold;
    grid-gap:5px;
    grid-template-columns:11px 145px auto auto;
}

.ogl_pieLabel > div span:last-of-type
{
    color:#fff;
}

.ogl_pieLabel > div b
{
    color:#80869e;
    text-align:right;
}

.ogl_pieLabel > div > div
{
    border-radius:50%;
    display:inline-block;
    height:10px;
    margin-top:3px;
    width:10px;
}

.planetlink .ogl_timer, .moonlink .ogl_timer
{
    bottom:3px;
    color:#5f2f2f !important;
    content:'';
    font-size:12px !important;
    font-weight:bold !important;
    position:absolute;
    right:4px;
}

.ogl_timer[data-timer]:before
{
    content:attr(data-timer);
}

.planetlink .ogl_timer.ogl_medium, .moonlink .ogl_timer.ogl_medium, .ogl_medium
{
    color:#795a31 !important;
}

.planetlink .ogl_timer.ogl_short, .moonlink .ogl_timer.ogl_short, .ogl_short
{
    color:#26867d !important;
}

.ogl_pinnedContent .ogl_short
{
    color:#da3e3e !important;
}

#planetbarcomponent #rechts .smallplanet a.alert
{
    left:1px;
}

/*  KEYBOARD MANAGER
------------------------------------------ */
.ogl_keyList
{
    display:grid;
    grid-gap:8px;
    grid-template-columns:repeat(4, 1fr);
    margin-top:10px;
}

.ogl_key
{
    background:#161b25;
    border:1px solid #1c222f;
    box-shadow:1px 0 1px 0 #161b25, 0 2px 0 2px #0a0c10, 0 2px 0 3px #11151d;
    box-sizing:border-box;
    border-radius:3px;
    color:#d29d3e;
    cursor:pointer;
    font-size:10px;
    font-weight:bold;
    line-height:24px !important;
    text-align:center;
    width:100%;
}

.ogl_key:hover
{
    background:#0e1119;
    box-shadow:1px 0 1px 0 #161b25, 0 1px 0 2px #0a0c10, 0 0 0 3px #11151d;
    transform:translateY(2px);
}

/*  ICONS
------------------------------------------ */
.icon:not(.sprite):not(.resource):not(.icon_wreck_field)
{
    border-radius:4px;
    box-shadow:inset 0 0 0 0 #121821;
    cursor:pointer;
    filter:sepia(1) hue-rotate(174deg) saturate(1.4) brightness(.8) contrast(1.5);
}

.icon:not(.resource):not(.sprite):not(.icon_wreck_field):hover
{
    filter:sepia(1) hue-rotate(174deg) saturate(1.4) brightness(.9) contrast(1.2);
}

.icon.grayscale, .colonize-inactive
{
    cursor:default !important;
    filter:grayscale(100%) !important;
    opacity:.7;
}

.icon.hueRotate
{
    filter:hue-rotate(275deg) contrast(1.8) !important;
}

/*  CONFIG
------------------------------------------ */

.ogl_scriptTitle
{
    font-size:45px;
    font-weight:bold;
}

.ogl_scriptTitle span
{
    color:#85a0c1;
    font-size:16px;
    font-weight:normal;
}

.ogl_globalConfig
{
    display:grid;
    grid-gap:20px;
    grid-template-columns:repeat(2, 1fr);
}

.ogl_globalConfig > div:nth-child(1)
{
    align-items:center;
    display:flex;
    flex-direction:column;
    justify-content:center;
}

.ogl_globalConfig p
{
    margin-bottom:10px;
    padding:10px 0;
}

.ogl_kofi
{
    background:var(--green);
    border:2px solid var(--darkblue);
    border-radius:4px;
    color:#fff !important;
    display:block;
    line-height:32px !important;
    padding:0 10px;
    text-decoration:none !important;
    text-shadow:1px 1px rgba(0,0,0,.3);
}

.ogl_kofi:after
{
    color:#fff;
    content:'favorite';
    font-family:'material icons';
    font-size:16px !important;
    margin-left:7px;
    text-shadow:none;
    vertical-align:bottom;
    -webkit-text-stroke:2px var(--darkblue);
}

.ogl_kofi:hover:after
{
    color:var(--red);
}

.ogl_config
{
    background:#253144;
    border-radius:4px;
    display:grid;
    grid-gap:10px;
    padding:20px;
}

.ogl_globalConfig hr
{
    background:var(--bluedark);
    border:none;
    height:2px;
    margin:5px 0;
    width:100%;
}

.ogl_config hr
{
    margin:10px 0;
}

.ogl_globalConfig .ogl_button
{
    color:#8ca5c5;
    padding:0 8px;
}

.ogl_config > div
{
    display:grid;
    grid-gap:30px;
    grid-template-columns:auto max-content;
    line-height:22px;
}

.ogl_config > .ogl_manageData
{
    grid-gap:10px;
    grid-template-columns:auto max-content max-content max-content;
}

.ogl_confToggle
{
    background:#777;
    border-radius:50px;
    cursor:pointer;
    font-size:11px;
    font-weight:bold;
    position:relative;
    width:50px;
}

.ogl_confToggle:hover
{
    opacity:.8;
}

.ogl_confToggle.ogl_active
{
    background:var(--green);
}

.ogl_confToggle:before
{
    box-sizing:border-box;
    content:'OFF';
    height:100%;
    padding:0 5px;
    position:absolute;
    text-align:right;
    width:100%;
}

.ogl_confToggle.ogl_active:before
{
    content:'ON';
    text-align:left;
}

.ogl_confToggle:after
{
    background:#fff;
    border-radius:50px;
    box-shadow:0 0 4px rgba(0,0,0,.5);
    content:'';
    height:16px;
    left:3px;
    position:absolute;
    top:3px;
    transition:left .2s;
    width:16px;
}

.ogl_confToggle.ogl_active:after
{
    left:calc(50px - 20px);
}

/*  LOCK
------------------------------------------ */
.ogl_sideLock
{
    bottom:0;
    color:var(--yellow);
    cursor:pointer;
    font-size:16px !important;
    position:absolute;
    right:-20px;
}

.ogl_sideLock:hover
{
    color:#fff;
}

.ogl_lockInfo
{
    width:auto;
}

.ogl_lockInfo hr
{
    border:none;
    grid-column:1 / 6;
    height:24px;
    margin:0;
    width:100%;
}

.ogl_lockLine
{
    align-items:center;
    background:#131821;
    box-shadow:inset 0 43px #0e1117, inset 0 -43px #0e1117;
    display:grid;
    font-size:12px;
    grid-gap:2px 0;
    grid-template-columns:auto 140px 140px 140px 72px;
    justify-items:flex-end;
    overflow:hidden;
    padding:8px;
    white-space:nowrap;
}

.ogl_lockLine:nth-child(1)
{
    margin-bottom:10px;
}

.ogl_lockLine > div
{
    align-self:normal;
    height:25px;
    line-height:25px;
    padding:0 8px;
    text-align:right;
}

.ogl_lockInfo .ogl_type
{
    text-align:left;
}

.ogl_lockLine .ogl_shipIcon
{
    border-color:#5fb1ca;
    height:28px;
    margin:-1px 0 0 auto;
    padding:0 5px;
}

.ogl_lockLine .material-icons
{
    font-size:16px !important;
}

.ogl_lockLine .ogl_button
{
    margin-left:3px;
    width:25px;
}

.ogl_lockLine .ogl_ok.material-icons
{
    font-size:22px !important;
    margin-left:5px;
    vertical-align:middle;
}

.ogl_lockLine .ogl_delete
{
    cursor:pointer;
}

.ogl_emptyGrid
{
    color:#fff;
    display:grid;
    font-size:12px;
    font-weight:normal;
    float:right;
    grid-gap:5px;
    grid-template-columns:repeat(4, auto);
    margin:0 16px;
    overflow:hidden;
    width:fit-content;
    width:-moz-fit-content;
}

.ogl_emptyShip
{
    background:#4e2323;
    border:1px solid #000;
    border-radius:3px;
    display:grid;
    grid-template-columns:32px auto;
    line-height:15px;
}

.ogl_emptyGrid .ogl_shipIcon
{
    background-position:center;
    border:none !important;
    border-right:1px solid #000 !important;
    border-radius:0 !important;
    height:15px;
    image-rendering:-webkit-optimize-contrast;
    width:32px;
}

.ogl_emptyShip span
{
    display:inline-block;
    padding:0 8px;
}

#fleetdispatchcomponent #warning p
{
    margin:30px auto 18px auto;
}

.ogl_sim
{
    background:linear-gradient(to top, #1a2027, #2e3948) !important;
    box-shadow:inset 0 1px 3px #374454;
    border-radius:5px;
    color:#9ea5af;
    cursor:pointer;
    float:left;
    font-size:16px;
    font-weight:bold;
    line-height:26px;
    text-align:center;
}

.ogl_sim:hover
{
    background:linear-gradient(to bottom, #1a2027, #2e3948) !important;
    box-shadow:inset 0 -1px 3px #374454;
}

.ogl_jumpGateTimer
{
    text-align:center;
}

#jumpgateForm .ogl_delta
{
    border-width:2px;
    border-radius:4px;
    top:7px;
}

.ogl_storage
{
    background:rgba(0,0,0,.8);
    border-top:1px solid #000;
    bottom:0;
    color:var(--yellow);
    display:none;
    font-size:9px;
    font-weight:bold;
    height:100%;
    line-height:33px;
    pointer-events:none;
    position:absolute;
    width:49px;
}

#resourcesbarcomponent:hover .ogl_storage
{
    display:block;
}

.ogl_blackHole
{
    display:grid;
    grid-gap:7px 20px;
    grid-template-columns:repeat(2, 1fr);
    grid-template-rows:repeat(7, 1fr);
}

.ogl_blackHole > div
{
    display:grid;
    grid-template-columns:40px auto;
}

.ogl_blackHole .ogl_shipIcon
{
    background-position:center;
    height:26px;
}

.ogl_fleetInfo div:nth-of-type(2)
{
    color:#eac612;
}

.ogl_fleetInfo div:nth-of-type(3)
{
    color:#36c7e8;
}

.ogl_fleetInfo div:nth-of-type(4)
{
    color:#e979f1;
}

.ogl_fleetInfo span
{
    display:inline-block;
    width:50px;
}

.ogl_maxCrawler
{
    color:#5a5719;
    font-size:10px;
    font-weight:bold;
    margin:1px 4px;
}

#overviewcomponent #planetdata
{
    bottom:47px;
    position:absolute !important;
    right:0;
}

#overviewcomponent #detailWrapper
{
    height:100% !important;
}

.ogl_tempSync
{
    position:absolute;
    top:10px;
}

.ogl_planetList > .ogl_linkedMoon
{
    cursor:pointer;
    margin-bottom:25px;
    width:100%;
}

.ogl_planetList > .ogl_linkedMoon:after
{
    content:'language east brightness_2';
    direction:ltr;
    display:inline-block;
    font-family:'Material Icons' !important;
    font-weight:normal !important;
    font-style:normal !important;
    font-size:16px;
    image-rendering:pixelated;
    line-height:inherit !important;
    letter-spacing:normal;
    margin-left:10px;
    text-transform:none;
    transform:rotate(0.03deg);
    vertical-align:sub;
    white-space:nowrap;
    word-wrap:normal;
    -webkit-font-feature-settings:'liga';
    -webkit-font-smoothing:antialiased;
}

.ogl_expeditionTooltip
{
    display:grid;
    font-weight:bold;
    grid-gap:7px 3px;
    grid-template-columns:40px auto;
    line-height:22px;
    text-align:right;
}

.ogl_expeditionTooltip h3
{
    grid-column:1 / 3;
    margin-bottom:7px;
}

.ogl_expeditionTooltip .ogl_shipIcon
{
    height:22px;
}

.ogl_button.ogl_ignoreRaid
{
    font-size:18px !important;
    left:6px;
    position:absolute;
    top:0;
    width:25px;
}

.ogl_button.ogl_ignoreRaid.ogl_active
{
    color:var(--red) !important;
}

.ogl_button.ogl_ignoreRaid:before
{
    content:'toggle_off';
}

.ogl_button.ogl_ignoreRaid.ogl_active:before
{
    content:'toggle_on';
}

/*!css*/
`;

if(localStorage.getItem('ogl-minipics'))
{
    GM_addStyle(`
        #supplies > header, #facilities > header, #research > header,
        #shipyard > header, #defense > header, #fleet1 .planet-header,
        #fleet2 .planet-header, #fleet3 .planet-header
        {
            height:34px !important;
        }

        #overviewcomponent #planet,
        #overviewcomponent #detailWrapper
        {
            height:auto !important;
            min-height:208px !important;
            position:relative !important;
        }

        #technologydetails_wrapper
        {
            position:relative !important;
        }

        #detail.detail_screen
        {
            height:300px !important;
            position:relative !important;
        }
    `);
}

GM_addStyle(oglcss);