DIO-TOOLS

DIO-Tools is a small extension for the browser game Grepolis. (counter, displays, smilies, trade options, changes to the layout)

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name		DIO-TOOLS
// @namespace	DIO
// @version		3.07
// @author		Diony
// @description DIO-Tools is a small extension for the browser game Grepolis. (counter, displays, smilies, trade options, changes to the layout)
// @include		http://de.grepolis.com/game*
// @include		/http[s]{0,1}://[a-z]{2}[0-9]{1,2}\.grepolis\.com/game*/
// @include		https://*forum.*.grepolis.com/*.php*
// @include		http://diotools.de/*
// @require		http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js
// @icon		http://s7.directupload.net/images/140128/vqchpigi.gif
// @icon64		http://diotools.de/images/icon_dio_64x64.png
// @copyright	2013+, DIONY
// @grant		GM_info
// @grant		GM_setValue
// @grant		GM_getValue
// @grant		GM_deleteValue
// @grant		GM_xmlhttpRequest
// @grant		GM_getResourceURL
// ==/UserScript==

var version = '3.07';

//if(unsafeWindow.DM) console.dir(unsafeWindow.DM.status('l10n'));
//console.dir(DM.status('templates'));

//http://s7.directupload.net/images/140128/vqchpigi.gif - DIO-Tools-Smiley

//http://de44.grepolis.com/cache/js/libs/jquery-1.10.2.min.js


//console.log(JSON.stringify(DM.getl10n()));


//// console.log(GM_getResourceText("dio_sprite"));

/*******************************************************************************************************************************
 * Changes
 * ----------------------------------------------------------------------------------------------------------------------------
 * | ● Einstellungen und auch das ganze Script komplett überarbeitet
 * | ● Features können nun ohne Refresh deaktiviert/aktiviert werden
 * | ● Einzelne Features sind unabhängiger voneinander und somit auch fehlerresistenter (einzelne Features können sich bei Fehlerauftreten durch Grepolis-Updates nicht mehr gegenseitig blockieren)
 * | ● Fehlerhafter Biremenzähler als Kompromiss für die Erweiterung der "Verfügbare Einheiten"-Anzeige entfernt: es kann nun jede Einheit im Bullauge angezeigt werden
 * | ● EO-Zähler hat ATT/UT's doppelt gezählt, wenn nebenher der veröffentlichte Belagerungsbericht im Forum offen war
 * | ● 3 kleine Layoutfehler beim EO-Zähler behoben
 * | ● Wenn Zauberfenster und Zauberbox gleichzeitig offen waren, kam es zu einem Layoutfehler
 * | ● Fehler beim Mausrad-Zoom behoben
 * | ● Fehler bei der Transporteranzeige behoben: die Kapazität der großen Transporter wurde durch das Rebalancing nichtmehr korrekt berechnet
 * | ● Smileybox etwas verbessert
 * | ● Weihnachtssmileys hinzugefügt
 * | ● Kontextmenü der Stadticons auf der strategischen Karte konnte im Nachtmodus nicht geöffnet werden
 * | ● Grüner Fortschrittsbalken beim Weltwunderzähler wurde nicht angezeigt
 * | ● Fenster wurden angepasst (Verfügbare Einheiten und Einheitenvergleich)
 * ----------------------------------------------------------------------------------------------------------------------------
 *******************************************************************************************************************************/

/*******************************************************************************************************************************
 * Bugs / TODOs
 * ----------------------------------------------------------------------------------------------------------------------------
 * | ● Aktivitätsbox für Angriffe blendet nicht aus
 * | ● Smileys verschwinden manchmal? -> bisher nicht reproduzierbar
 * | ● Performanceeinbruch nach dem Switchen des WW-Fensters
 * | ● keine Smileys im Grepoforum mit Safari (fehlendes jQuery)
 * ----------------------------------------------------------------------------------------------------------------------------
 *******************************************************************************************************************************/

/*******************************************************************************************************************************
 * Global stuff
 *******************************************************************************************************************************/
var uw = unsafeWindow || window, $ = uw.jQuery || jQuery, DATA, GM;

// GM-API?
GM = (typeof GM_info === 'object');

console.log('%c|= DIO-Tools is active =|', 'color: green; font-size: 1em; font-weight: bolder; ');

function loadValue(name, default_val){
    var value;
    if(GM){
        value = GM_getValue(name, default_val);
    } else {
        value = localStorage.getItem(name) || default_val;
    }

    if(typeof(value) === "string"){
        value = JSON.parse(value)
    }
    return value;
}

// LOAD DATA
if(GM && (uw.location.pathname === "/game/index")){
    var WID = uw.Game.world_id, MID = uw.Game.market_id, AID = uw.Game.alliance_id;

    //GM_deleteValue(WID + "_bullseyeUnit");

    DATA = {
        // GLOBAL
        options : loadValue("options", "{}"),

        user : loadValue("dio_user", "{}"),
        count: loadValue("dio_count", "[]"),

        notification : loadValue('notif', '0'),

        error: loadValue('error', '{}'),

        spellbox  :	loadValue("spellbox", '{ "top":"23%", "left": "-150%", "show": false }'),
        commandbox: loadValue("commandbox" , '{ "top":55, "left": 250 }'),
        tradebox  :	loadValue("tradebox", '{ "top":55, "left": 450 }'),

        // WORLD
        townTypes : loadValue(WID + "_townTypes", "{}"),
        sentUnits : loadValue(WID + "_sentUnits", '{ "attack": {}, "support": {} }'),

        biremes   : loadValue(WID + "_biremes", "{}"), //old
        bullseyeUnit : loadValue(WID + "_bullseyeUnit", '{ "current_group" : -1 }'), // new

        worldWonder : loadValue(WID + "_wonder", '{ "ratio": {}, "storage": {}, "map": {} }'),

        clickCount : loadValue(WID + "_click_count", '{}'), // old
        statistic : loadValue(WID + "_statistic", '{}'), // new

        // MARKET
        worldWonderTypes : loadValue(MID + "_wonderTypes", '{}')
    };

    if(!DATA.worldWonder.map) {
        DATA.worldWonder.map = {};
    }

    // Temporary:
    if(typeof DATA.options.trd == 'boolean') {
        DATA.options.per = DATA.options.rec = DATA.options.trd; delete DATA.options.trd;
    }
    if(typeof DATA.options.mov == 'boolean') {
        DATA.options.act = DATA.options.mov; delete DATA.options.mov;
    }
    if(typeof DATA.options.twn == 'boolean') {
        DATA.options.tic = DATA.options.til = DATA.options.tim = DATA.options.twn; delete DATA.options.twn;
    }
    if(GM) GM_deleteValue("notification");
}

// GM: EXPORT FUNCTIONS
uw.saveValueGM = function(name, val){
    setTimeout(function(){
        GM_setValue(name, val);
    }, 0);
};

uw.deleteValueGM = function(name){
    setTimeout(function(){
        GM_deleteValue(name);
    },0);
};

uw.chatUserRequest = function(){
    var _chatIndicator = $('.nui_main_menu .chat .indicator');

    setTimeout(function(){
        GM_xmlhttpRequest({
            method: "GET",
            url: "http://api.relay-chat.de/compteur_js.php?chan="+ (uw.Game.market_id === "de" ? "Grepolis" + uw.Game.market_id.toUpperCase() : "GREPO"),
            onload: function(text){
                _chatIndicator.get(0).innerHTML = text.response.split("'")[1];
                _chatIndicator.get(0).style.display = 'block';
            },
            onerror: function(){
                _chatIndicator.get(0).style.display = 'none';
            }
        });
    }, 0);
};

uw.getImageDataFromCanvas = function(x, y){

    console.debug("HEY", document.getElementById('canvas_picker').getContext('2d').getImageData(x, y, 1, 1));
};
uw.calculateConcaveHull = function() {
    var contour = [
        new poly2tri.Point(100, 100),
        new poly2tri.Point(100, 300),
        new poly2tri.Point(300, 300),
        new poly2tri.Point(300, 100)
    ];

    var swctx = new poly2tri.SweepContext(contour);

    swctx.triangulate();
    var triangles = swctx.getTriangles();

    console.debug(triangles);

    return triangles;
};

if(typeof exportFunction == 'function'){
    // Firefox > 30
    //uw.DATA = cloneInto(DATA, unsafeWindow);
    exportFunction(uw.saveValueGM, unsafeWindow, {defineAs: "saveValueGM"});
    exportFunction(uw.deleteValueGM, unsafeWindow, {defineAs: "deleteValueGM"});
    exportFunction(uw.chatUserRequest, unsafeWindow, {defineAs: "chatUserRequest"});
    exportFunction(uw.calculateConcaveHull, unsafeWindow, {defineAs: "calculateConcaveHull"});
    exportFunction(uw.getImageDataFromCanvas, unsafeWindow, {defineAs: "getImageDataFromCanvas"});
} else {
    // Firefox < 30, Chrome, Opera, ...
    //uw.DATA = DATA;
}

var time_a, time_b;

// APPEND SCRIPT
function appendScript(){
    //console.log("GM-API: " + gm_bool);
    if(document.getElementsByTagName('body')[0]){
        var dioscript = document.createElement('script');
        dioscript.type ='text/javascript';
        dioscript.id = 'diotools';

        time_a = uw.Timestamp.client();
        dioscript.textContent = DIO_GAME.toString().replace(/uw\./g, "") + "\n DIO_GAME('"+ version +"', "+ GM +", '" + JSON.stringify(DATA).replace(/'/g, "##") + "', "+ time_a +");";
        document.body.appendChild(dioscript);
    } else {
        setTimeout(function(){
            appendScript();
        }, 500);
    }
}

if(location.host === "diotools.de"){
    // PAGE
    DIO_PAGE();
} else {
    if((location.pathname !== "/game/index") && GM){
        // FORUM
        DIO_GAME(version);
    } else {
        // GAME
        appendScript();
    }
}

function DIO_PAGE(){
    if(typeof GM_info == 'object') {
        setTimeout(function() {
            dio_user = JSON.parse(loadValue("dio_user", ""));
            console.log(dio_user);
            uw.dio_version = parseFloat(version);
        }, 0);
    } else {
        dio_user = localStorage.getItem("dio_user") || "";

        dio_version = parseFloat(version);
    }
}
function DIO_FORUM(){
    if($(".editor_textbox_container").get(0)){
        loadSmileys();
        changeForumEditorLayout();
        addForum();
    }
}
function DIO_GAME(version, gm, DATA, time_a) {
    var MutationObserver = uw.MutationObserver || window.MutationObserver,

        WID, MID, AID, PID, LID,

        dio_sprite = "http://666kb.com/i/ct1etaz0uyohw402i.png"; // http://abload.de/img/dio_spritejmqxp.png, http://img1.myimg.de/DIOSPRITEe9708.png -> Forbidden!?

    if (uw.location.pathname === "/game/index") {
        DATA = JSON.parse(DATA.replace(/##/g, "'"));

        WID = uw.Game.world_id;
        MID = uw.Game.market_id;
        AID = uw.Game.alliance_id;
        PID = uw.Game.player_id;
        LID = uw.Game.locale_lang.split("_")[0]; // LID ="es";

        // World with Artemis ??
        Game.hasArtemis = true; //Game.constants.gods.length == 6;
    }

    $.prototype.reverseList = [].reverse;

    // Implement old jQuery method (version < 1.9)
    $.fn.toggleClick = function () {
        var methods = arguments;    // Store the passed arguments for future reference
        var count = methods.length; // Cache the number of methods

        // Use return this to maintain jQuery chainability
        // For each element you bind to
        return this.each(function (i, item) {
            // Create a local counter for that element
            var index = 0;

            // Bind a click handler to that element
            $(item).on('click', function () {
                // That when called will apply the 'index'th method to that element
                // the index % count means that we constrain our iterator between 0
                // and (count-1)
                return methods[index++ % count].apply(this, arguments);
            });
        });
    };

    function saveValue(name, val) {
        if (gm) {
            saveValueGM(name, val);
        } else {
            localStorage.setItem(name, val);
        }
    }

    function deleteValue(name) {
        if (gm) {
            deleteValueGM(name);
        } else {
            localStorage.removeItem(name);
        }
    }

    /*******************************************************************************************************************************
     * Graphic filters
     *******************************************************************************************************************************/
    if (uw.location.pathname === "/game/index") {
        $('<svg width="0%" height="0%">' +
                // GREYSCALE
            '<filter id="GrayScale">' +
            '<feColorMatrix type="matrix" values="0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0">' +
            '</filter>' +
                // SEPIA
            '<filter id="Sepia">' +
            '<feColorMatrix type="matrix" values="0.343 0.669 0.119 0 0 0.249 0.626 0.130 0 0 0.172 0.334 0.111 0 0 0.000 0.000 0.000 1 0">' +
            '</filter>' +
                // SATURATION
            '<filter id="Saturation"><feColorMatrix type="saturate" values="0.2"></filter>' +
            '<filter id="Saturation1"><feColorMatrix type="saturate" values="1"></filter>' +
            '<filter id="Saturation2"><feColorMatrix type="saturate" values="2"></filter>' +
                // HUE
            '<filter id="Hue1"><feColorMatrix type="hueRotate" values= "65"></filter>' +
            '<filter id="Hue2"><feColorMatrix type="hueRotate" values="150"></filter>' +
            '<filter id="Hue3"><feColorMatrix type="hueRotate" values="-65"></filter>' +
                // BRIGHTNESS
            '<filter id="Brightness15">' +
            '<feComponentTransfer><feFuncR type="linear" slope="1.5"/><feFuncG type="linear" slope="1.5"/><feFuncB type="linear" slope="1.5"/></feComponentTransfer>' +
            '</filter>' +
            '<filter id="Brightness12">' +
            '<feComponentTransfer><feFuncR type="linear" slope="1.2"/><feFuncG type="linear" slope="1.2"/><feFuncB type="linear" slope="1.2"/></feComponentTransfer>' +
            '</filter>' +
            '<filter id="Brightness11">' +
            '<feComponentTransfer><feFuncR type="linear" slope="1.1"/><feFuncG type="linear" slope="1.1"/><feFuncB type="linear" slope="1.1"/></feComponentTransfer>' +
            '</filter>' +
            '<filter id="Brightness10">' +
            '<feComponentTransfer><feFuncR type="linear" slope="1.0"/><feFuncG type="linear" slope="1.0"/><feFuncB type="linear" slope="1.0"/></feComponentTransfer>' +
            '</filter>' +
            '<filter id="Brightness07">' +
            '<feComponentTransfer><feFuncR type="linear" slope="0.7"/><feFuncG type="linear" slope="0.7"/><feFuncB type="linear" slope="0.7"/></feComponentTransfer>' +
            '</filter>' +
            '</svg>').appendTo('#ui_box');
    }

    /*******************************************************************************************************************************
     * Language versions: german, english, french, russian, polish, spanish
     *******************************************************************************************************************************/
    var LANG = {
        de: {
            settings: {
                dsc: "DIO-Tools bietet unter anderem einige Anzeigen, eine Smileyauswahlbox,<br>Handelsoptionen und einige Veränderungen des Layouts.",
                act: "Funktionen der Toolsammlung aktivieren/deaktivieren:",
                prv: "Vorschau einzelner Funktionen:",

                version_old: "DIO-Tools-Version ist nicht aktuell",
                version_new: "DIO-Tools-Version ist aktuell",
                version_dev: "DIO-Tools-Entwicklerversion",

                version_update: "Aktualisieren",

                link_forum: "http://forum.de.grepolis.com/showthread.php?28838&goto=newpost", //"http://forum.de.grepolis.com/showthread.php?28838"
                link_contact: "http://forum.de.grepolis.com/private.php?do=newpm&u=10548",

                forum: "Forum",
                author: "Autor",

                cat_units: "Einheiten",
                cat_icons: "Stadticons",
                cat_forum: "Forum",
                cat_trade: "Handel",
                cat_wonders: "Weltwunder",
                cat_layout: "Layout",
                cat_other: "Sonstiges"
            },
            options: {
                bir: ["Biremenzähler", "Zählt die jeweiligen Biremen einer Stadt und summiert diese.<br><br>Anzeige im Minimap-Bullauge oben links"],
                ava: ["Verfügbare Einheiten", "Zählt die verfügbaren Einheiten von allen Städten"],
                sml: ["Smileys", "Erweitert die BBCode-Leiste um eine Smileybox"],
                str: ["Einheitenstärke", "Fügt mehrere Einheitenstärketabellen in verschiedenen Bereichen hinzu"],
                tra: ["Transportkapazität", "Zeigt die belegte und verfügbare Transportkapazität im Einheitenmenu an"],
                per: ["Prozentualer Handel", "Erweitert das Handelsfenster um einen Prozentualer Handel"],
                rec: ["Rekrutierungshandel", "Erweitert das Handelsfenster um einen Rekrutierungshandel"],
                cnt: ["EO-Zähler", "Zählt die ATT/UT-Anzahl im EO-Fenster"],
                way: ["Laufzeit", "Zeigt im ATT/UT-Fenster die Laufzeit bei Verbesserter Truppenbewegung an"],
                sim: ["Simulator", "Anpassung des Simulatorlayouts & permanente Anzeige der Erweiterten Modifikatorbox"],
                spl: ["Zauberbox", "Komprimierte verschiebbare & magnetische Zauberbox (Positionsspeicherung)"],
                act: ["Aktivitätsboxen", "Verbesserte Anzeige der Handels- und Truppenaktivitätsboxen (Positionsspeicherung)"],
                pop: ["Gunst-Popup", 'Ändert das Aussehen des Gunst-Popups'],
                tsk: ["Taskleiste", 'Vergrößert die Taskleiste und minimiert das "Tägliche Belohnung"-Fenster beim Start'],
                irc: ["Chat", "Ersetzt den Allianzchat durch einen IRC-Chat"],
                bbc: ["DEF-Formular", "Erweitert die BBCode-Leiste um ein automatisches DEF-Formular"],
                com: ["Einheitenvergleich", "Fügt Einheitenvergleichstabellen hinzu"],
                tic: ["Stadticons", "Jede Stadt erhält ein Icon für den Stadttyp (Automatische Erkennung)", "Zusätzliche Icons stehen bei der manuellen Auswahl zur Verfügung"],
                til: ["Stadtliste", "Fügt die Stadticons zur Stadtliste hinzu"],
                tim: ["Karte", "Setzt die Stadticons auf die strategische Karte"],
                wwc: ["Anteil", "Anteilsrechner & Rohstoffzähler + Vor- & Zurück-Buttons bei fertiggestellten WW's (momentan nicht deaktivierbar!)"],
                wwr: ["Rangliste", "Überarbeitete Weltwunderrangliste"],
                wwi: ["Icons", 'Fügt Weltwundericons auf der strategischen Karte hinzu'],
                con: ["Kontextmenu", 'Vertauscht "Stadt selektieren" und "Stadtübersicht" im Kontextmenu'],
                sen: ["Abgeschickte Einheiten", 'Zeigt im Angriffs-/Unterstützungsfenster abgeschickte Einheiten an'],
                tov: ["Stadtübersicht", 'Ersetzt die neue Stadtansicht mit der alten Fensteransicht'],
                scr: ["Mausrad-Zoom", 'Man kann mit dem Mausrad die 3 Ansichten wechseln'],

                err: ["Automatische Fehlerberichte senden", "Wenn du diese Option aktivierst, kannst du dabei helfen Fehler zu identifizieren."],
                her: ["Thrakische Eroberung", "Verkleinerung der Karte der Thrakischen Eroberung."]
            },
            labels: {
                uni: "Verfügbare Einheiten",
                con: "Selektieren",
                // Smileys
                std: "Standard",
                gre: "Grepolis",
                nat: "Natur",
                ppl: "Leute",
                oth: "Sonstige",
                // Defense form
                ttl: "Übersicht: Stadtverteidigung",
                inf: "Informationen zur Stadt:",
                dev: "Abweichung",
                det: "Detailierte Landeinheiten",
                prm: "Premiumboni",
                sil: "Silberstand",
                mov: "Truppenbewegungen:",
                // WW
                leg: "WW-Anteil",
                stg: "Stufe",
                tot: "Gesamt",
                // Simulator
                str: "Einheitenstärke",
                los: "Verluste",
                mod: "ohne Modifikatoreinfluss",
                // Comparison box
                dsc: "Einheitenvergleich",
                hck: "Schlag",
                prc: "Stich",
                dst: "Distanz",
                sea: "See",
                att: "Angriff",
                def: "Verteidigung",
                spd: "Geschwindigkeit",
                bty: "Beute (Rohstoffe)",
                cap: "Transportkapazität",
                res: "Baukosten (Rohstoffe)",
                fav: "Gunst",
                tim: "Bauzeit (s)",
                // Trade
                rat: "Ressourcenverhältnis eines Einheitentyps",
                shr: "Anteil an der Lagerkapazität der Zielstadt",
                per: "Prozentualer Handel",
                // Sent units box
                lab: "Abgeschickt",
                improved_movement: "Verbesserte Truppenbewegung"
            },
            buttons: {
                sav: "Speichern", ins: "Einfügen", res: "Zurücksetzen"
            }
        },

        en: {
            settings: {
                dsc: "DIO-Tools offers, among other things, some displays, a smiley box,<br>trade options and some changes to the layout.",
                act: "Activate/deactivate features of the toolset:",
                prv: "Preview of several features:",

                version_old: "Version is not up to date",
                version_new: "Version is up to date",
                version_dev: "Developer version",

                version_update: "Update",

                link_forum: "http://forum.en.grepolis.com/showthread.php?52104&goto=newpost",
                link_contact: "http://forum.en.grepolis.com/private.php?do=newpm&u=46211",

                forum: "Forum",
                author: "Author",

                cat_units: "Units",
                cat_icons: "Town icons",
                cat_forum: "Forum",
                cat_trade: "Trade",
                cat_wonders: "World wonder",
                cat_layout: "Layout",
                cat_other: "Miscellaneous"
            },
            options: {
                bir: ["Bireme counter", "Counts the biremes of a city and sums these"],
                ava: ["Available units", "Counts the available units of all cities"],
                sml: ["Smilies", "Extends the bbcode bar by a smiley box"],
                str: ["Unit strength", "Adds unit strength tables in various areas"],
                tra: ["Transport capacity", "Shows the occupied and available transport capacity in the unit menu"],
                per: ["Percentual trade", "Extends the trade window by a percentual trade"],
                rec: ["Recruiting trade", "Extends the trade window by a recruiting trade"],
                cnt: ["Conquests", "Counts the attacks/supports in the conquest window"],
                way: ["Troop speed", "Displays improved troop speed in the attack/support window"],
                sim: ["Simulator", "Adaptation of the simulator layout & permanent display of the extended modifier box"],
                spl: ["Spell box", "Compressed movable & magnetic spell box (position memory)"],
                act: ["Activity boxes", "Improved display of trade and troop activity boxes (position memory)"],
                pop: ["Favor popup", "Changes the favor popup"],
                tsk: ["Taskbar", "Increases the taskbar and minimizes the daily reward window on startup"],
                irc: ["Chat", 'Replaced the alliance chat by an irc chat. (FlashPlayer required)'],
                bbc: ["Defense form", "Extends the bbcode bar by an automatic defense form"],
                com: ["Unit Comparison", "Adds unit comparison tables"],
                tic: ["Town icons", "Each city receives an icon for the town type (automatic detection)", "Additional icons are available for manual selection"],
                til: ["Town list", "Adds the town icons to the town list"],
                tim: ["Map", "Sets the town icons on the strategic map"],
                wwc: ["Calculator", "Share calculation & resources counter + previous & next buttons on finished world wonders (currently not deactivatable!)"],
                wwr: ["Ranking", "Redesigned world wonder rankings"],
                wwi: ["Icons", 'Adds world wonder icons on the strategic map'],
                con: ["Context menu", 'Swaps "Select town" and "City overview" in the context menu'],
                sen: ["Sent units", 'Shows sent units in the attack/support window'],
                tov: ["Town overview", 'Replaces the new town overview with the old window style'],
                scr: ["Mouse wheel", 'You can change the views with the mouse wheel'],

                err: ["Send bug reports automatically", "If you activate this option, you can help identify bugs."],
                her: ["Thracian Conquest", "Downsizing of the map of the Thracian conquest."]
            },
            labels: {
                uni: "Available Units",
                con: "Select town",
                // Smileys
                std: "Standard",
                gre: "Grepolis",
                nat: "Nature",
                ppl: "People",
                oth: "Other",
                hal: "Halloween",
                xma: "Xmas",
                // Defense form
                ttl: "Overview: Town defense",
                inf: "Town information:",
                dev: "Deviation",
                det: "Detailed land units",
                prm: "Premium bonuses",
                sil: "Silver volume",
                mov: "Troop movements:",
                // WW
                leg: "WW Share",
                stg: "Stage",
                tot: "Total",
                // Simulator
                str: "Unit strength",
                los: "Loss",
                mod: "without modificator influence",
                // Comparison box
                dsc: "Unit comparison",
                hck: "Blunt",
                prc: "Sharp",
                dst: "Distance",
                sea: "Sea",
                att: "Offensive",
                def: "Defensive",
                spd: "Speed",
                bty: "Booty (resources)",
                cap: "Transport capacity",
                res: "Costs (resources)",
                fav: "Favor",
                tim: "Recruiting time (s)",
                // Trade
                rat: "Resource ratio of an unit type",
                shr: "Share of the storage capacity of the target city",
                per: "Percentage trade",
                // Sent units box
                lab: "Sent units",
                improved_movement: "Improved troop movement"
            },
            buttons: {
                sav: "Save", ins: "Insert", res: "Reset"
            }
        },
        ///////////////////////////////////
        // French Translation by eclat49 //
        ///////////////////////////////////
        fr: {
            settings: {
                dsc: "DIO-Tools offres certains écrans, une boîte de smiley, les options <br>commerciales, des changements à la mise en page et d'autres choses.",
                act: "Activation/Désactivation des fonctions:",
                prv: "Aperçu des fonctions séparées:"
            },
            options: {
                bir: ["Compteur de birèmes ", "Totalise l'ensemble des birèmes présentent en villes et les résume. (Remplace la mini carte dans le cadran)"],
                sml: ["Smileys", "Rajoutes une boite de smilies à la boite de bbcode"],
                str: ["Force unitaire", "Ajoutes des tableaux de force unitaire dans les différentes armes"],
                //trd: [ "Commerce",				"Ajout d'une option par pourcentage, par troupes pour le commerce, ainsi qu'un affichage des limites pour les festivals" ],
                per: ["Commerce de pourcentage", ""],
                rec: ["Commerce de recrutement", ""],
                cnt: ["Compteur conquête", "Comptabilise le nombre d'attaque et de soutien dans la fenêtre de conquête"],
                way: ["Vitesse des troupes ", "Rajoutes le temps de trajet avec le bonus accélération"],
                sim: ["Simulateur", "Modification de la présentation du simulateur et affichage permanent des options premium"],
                spl: ["Boîte de magie", "Boîte de sort cliquable et positionnable"],
                act: ["Boîte d'activité", "Présentation améliorée du commerce et des mouvement de troupes (mémoire de position)"],
                pop: ["Popup de faveur", 'Change la popup de faveur'],
                tsk: ["Barre de tâches ", "La barre de tâches augmente et minimise le fenêtre de bonus journalier"],
                irc: ["Chat", "Remplace le chat de l'alliance à travers un chat IRC. (FlashPlayer requis)"],
                bbc: ["Formulaire de défense", "Ajout d'un bouton dans la barre BBCode pour un formulaire de défense automatique"],
                com: ["Comparaison des unités", "Ajoutes des tableaux de comparaison des unités"],
                tic: ["Icônes des villes", "Chaque ville reçoit une icône pour le type de ville (détection automatique)", "Des icônes supplémentaires sont disponibles pour la sélection manuelle"],
                til: ["Liste de ville", "Ajoute les icônes de la ville à la liste de la ville"],
                tim: ["Carte", "Définit les icônes de la ville sur la carte stratégique"],
                wwc: ["Merveille du monde", "Compteur de ressource et calcul d'envoi + bouton précédent et suivant sur les merveilles finies(ne peut être désactivé pour le moment)"],
                wwr: ["", ""],
                //wwi: [ "Icônes",'Adds world wonder icons on the strategic map' ],
                con: ["Menu contextuel", 'Swaps "Sélectionner ville" et "Aperçu de la ville" dans le menu contextuel'],
                sen: ["Unités envoyées", 'Affiche unités envoyées dans la fenêtre attaque/support'],
                tov: ["Aperçu de ville", "Remplace la nouvelle aperçu de la ville avec l'ancien style de fenêtre"],
                scr: ["Molette de la souris", 'Avec la molette de la souris vous pouvez changer les vues'],

                err: ["Envoyer des rapports de bogues automatiquement", "Si vous activez cette option, vous pouvez aider à identifier les bugs."]
            },
            labels: {
                uni: "Unités disponibles",
                con: "Sélectionner",
                // Smileys
                std: "Standard",
                gre: "Grepolis",
                nat: "Nature",
                ppl: "Gens",
                oth: "Autres",
                // Defense form
                ttl: "Aperçu: Défense de ville",
                inf: "Renseignements sur la ville:",
                dev: "Différence",
                det: "Unités terrestres détaillées",
                prm: "Bonus premium",
                sil: "Remplissage de la grotte",
                mov: "Mouvements de troupes:",
                // WW
                leg: "Participation",
                stg: "Niveau",
                tot: "Total",
                // Simulator
                str: "Force unitaire",
                los: "Pertes",
                mod: "sans influence de modificateur",
                // Comparison box
                dsc: "Comparaison des unités",
                hck: "Contond.",
                prc: "Blanche",
                dst: "Jet",
                sea: "Navale",
                att: "Attaque",
                def: "Défense",
                spd: "Vitesse",
                bty: "Butin",
                cap: "Capacité de transport",
                res: "Coût de construction",
                fav: "Faveur",
                tim: "Temps de construction (s)",
                // Trade
                rat: "Ratio des ressources d'un type d'unité",
                shr: "Part de la capacité de stockage de la ville cible",
                per: "Commerce de pourcentage",
                // Sent units box
                lab: "Envoyée",
                improved_movement: "Mouvement des troupes amélioré"
            },
            buttons: {
                sav: "Sauver", ins: "Insertion", res: "Remettre"
            }
        },
        ///////////////////////////////////
        // Russian Translation by MrBobr //
        ///////////////////////////////////
        ru: {
            settings: {
                dsc: "DIO-Tools изменяет некоторые окна, добавляет новые смайлы, отчёты,<br>улучшеные варианты торговли и другие функции.",
                act: "Включение/выключение функций:",
                prv: "Примеры внесённых изменений:"
            },
            options: {
                bir: ["Счётчик бирем", "Показывает число бирем во всех городах"],
                sml: ["Смайлы", "Добавляет кнопку для вставки смайлов в сообщения"],
                str: ["Сила отряда", "Добавляет таблицу общей силы отряда в некоторых окнах"],
                //trd: [ "Торговля",		"Добавляет маркеры и отправку недостающих ресурсов, необходимых для фестиваля. Инструменты для долевой торговли" ],
                per: ["Процент торговля", ""],
                rec: ["Рекрутинг торговля", ""],
                cnt: ["Завоевания", "Отображение общего числа атак/подкреплений в окне завоевания города"],
                way: ["30% ускорение", "Отображает примерное время движения отряда с 30% бонусом"],
                sim: ["Симулятор", "Изменение интерфейса симулятора, добавление новых функций"],
                spl: ["Заклинания", "Изменяет положение окна заклинаний"],
                act: ["Перемещения", "Показывает окна пересылки ресурсов и перемещения войск"],
                pop: ["Благосклонность", "Отображение окна с уровнем благосклонности богов"],
                tsk: ["Таскбар", "Увеличение ширины таскбара и сворачивание окна ежедневной награды при входе в игру"],
                irc: ["Чат", 'Замена чата игры на irc-чат'],
                bbc: ["Форма обороны", "Добавляет кнопку для вставки в сообщение отчёта о городе"], // Beschreibung passt nicht ganz
                com: ["Сравнение юнитов", "Добавляет окно сравнения юнитов"],
                tic: ["Типы городов", "Каждый город получает значок для городского типа (автоматическое определение)", "Дополнительные иконки доступны для ручного выбора"], // ?
                til: ["Список город", "Добавляет значки городские в список города"], // ?
                tim: ["Карта", "Устанавливает городские иконки на стратегической карте"], // ?
                wwc: ["Чудо света", "Share calculation & resources counter + previous & next buttons on finished world wonders (currently not deactivatable!)"],
                wwr: ["", ""],
                //wwi: [ "World wonder icons",'Adds world wonder icons on the strategic map' ],
                //con: [ "Context menu",	'Swaps "Select town" and "City overview" in the context menu'],
                //sen: [ "Sent units",		'Shows sent units in the attack/support window'],
                tov: ["Обзор Город", 'Заменяет новый обзор города с старом стиле окна'],  // ?
                scr: ["Колесо мыши", 'С помощью колеса мыши вы можете изменить взгляды'], // ?

                err: ["Отправить сообщения об ошибках автоматически", "Если вы включите эту опцию, вы можете помочь идентифицировать ошибки"]
            },

            labels: {
                uni: "Доступные войска",
                con: "выбирать",
                // Smileys
                std: "",
                gre: "",
                nat: "",
                ppl: "",
                oth: "",
                // Defense form
                ttl: "Обзор: Отчёт о городе",
                inf: "Информация о войсках и постройках:",
                dev: "Отклонение",
                det: "Детальный отчёт",
                prm: "Премиум-бонусы",
                sil: "Серебро в пещере",
                mov: "Перемещения",
                // WW
                leg: "",
                stg: "",
                tot: "",
                // Simulator
                str: "Сила войск",
                los: "Потери",
                mod: "без учёта заклинаний, бонусов, исследований",
                // Comparison box
                dsc: "Сравнение юнитов",
                hck: "Ударное",
                prc: "Колющее",
                dst: "Дальнего боя",
                sea: "Морские",
                att: "Атака",
                def: "Защита",
                spd: "Скорость",
                bty: "Добыча (ресурсы)",
                cap: "Вместимость транспортов",
                res: "Стоимость (ресурсы)",
                fav: "Благосклонность",
                tim: "Время найма (с)",
                // Trade
                rat: "",
                shr: "",
                per: "",
                // Sent units box
                lab: "Отправлено",
                improved_movement: "Улучшенная перемещение войск"
            },

            buttons: {
                sav: "Сохраниить", ins: "Вставка", res: "Сброс"
            }
        },
        ////////////////////////////////
        // Polish Translation by anpu //
        ////////////////////////////////
        pl: {
            settings: {
                dsc: "DIO-Tools oferuje (między innymi) poprawione widoki, nowe uśmieszki,<br>opcje handlu i zmiany w wyglądzie.",
                act: "Włącz/wyłącz funkcje skryptu:",
                prv: "podgląd poszczególnych opcji:"
            },
            options: {
                bir: ["Licznik birem", "Zlicza i sumuje biremy z miast"],
                sml: ["Emotki", "Dodaje dodatkowe (zielone) emotikonki"],
                str: ["Siła jednostek", "dodaje tabelki z siłą jednostek w różnych miejscach gry"],
                //trd: [ "Handel",			"Rozszerza okno handlu o handel procentowy, proporcje surowców wg jednostek, dodaje znaczniki dla festynów" ],
                per: ["Handel procentowy", ""],
                rec: ["Handel rekrutacyjne", ""],
                cnt: ["Podboje", "Zlicza wsparcia/ataki w oknie podboju (tylko własne podboje)"],
                way: ["Prędkość wojsk", "Wyświetla dodatkowo czas jednostek dla bonusu przyspieszone ruchy wojsk"],
                sim: ["Symulator", "Dostosowanie wyglądu symulatora oraz dodanie szybkich pól wyboru"],
                spl: ["Ramka czarów", "Kompaktowa pływająca ramka z czarami (można umieścić w dowolnym miejscu ekranu. Zapamiętuje położenie.)"],
                act: ["Ramki aktywności", "Ulepszony podgląd ruchów wojsk i handlu (można umieścić w dowolnym miejscu ekranu. Zapamiętuje położenie.)"],
                pop: ["Łaski", "Zmienia wygląd ramki informacyjnej o ilości produkowanych łask"],
                tsk: ["Pasek skrótów", "Powiększa pasek skrótów i minimalizuje okienko z bonusem dziennym"],
                irc: ["Czat", 'Zastępuje standardowy Chat chatem IRC (wymagany FlashPlayer)'],
                bbc: ["Raportów obronnych", "Rozszerza pasek skrótów BBcode o generator raportów obronnych"],
                com: ["Porównianie", "Dodaje tabelki z porównaniem jednostek"],
                tic: ["Ikony miasta", "Każde miasto otrzyma ikonę typu miasta (automatyczne wykrywanie)", "Dodatkowe ikony są dostępne dla ręcznego wyboru"], // ?
                til: ["Lista miasto", "Dodaje ikony miasta do listy miasta"], // ?
                tim: ["Mapa", "Zestawy ikon miasta na mapie strategicznej"], // ?
                wwc: ["Cuda Świata", "Liczy udział w budowie oraz ilość wysłanych surowców na budowę Cudu Świata oraz dodaje przyciski do szybkiego przełączania między cudami (obecnie nie możliwe do wyłączenia)"],
                wwr: ["", ""],
                //wwi: [ "World wonder icons",'Adds world wonder icons on the strategic map' ],
                con: ["menu kontekstowe", 'Zamiemia miejcami przycisk "wybierz miasto" z przyciskiem "podgląd miasta" po kliknięciu miasta na mapie'],
                sen: ["Wysłane jednostki", 'Pokaż wysłane jednostki w oknie wysyłania ataków/wsparć'],
                tov: ["Podgląd miasta", 'Zastępuje nowy podgląd miasta starym'],
                scr: ["Zoom", 'Możesz zmienić poziom przybliżenia mapy kółkiem myszy'],

                err: ["Automatycznie wysyłać raporty o błędach", "Jeśli włączysz tę opcję, możesz pomóc zidentyfikować błędy"]

            },
            labels: {
                uni: "Dostępne jednostki",
                con: "Wybierz miasto",
                // Smileys
                std: "Standard" /* "Standardowe" */,
                gre: "Grepolis",
                nat: "Przyroda",
                ppl: "Ludzie",
                oth: "Inne",
                // Defense form
                ttl: "Podgląd: Obrona miasta",
                inf: "Informacje o mieście:",
                dev: "Ochyłka",
                det: "jednostki lądowe",
                prm: "opcje Premium",
                sil: "Ilość srebra",
                mov: "Ruchy wojsk",
                // WW
                leg: "Udział w Cudzie",
                stg: "Poziom",
                tot: "Łącznie",
                // Simulator
                str: "Siła jednostek",
                los: "Straty",
                mod: "bez modyfikatorów",
                // Comparison box
                dsc: "Porównianie jednostek",
                hck: "Obuchowa",
                prc: "Tnąca",
                dst: "Dystansowa",
                sea: "Morskie",
                att: "Offensywne",
                def: "Defensywne",
                spd: "Prędkość",
                bty: "Łup (surowce)",
                cap: "Pojemność transportu",
                res: "Koszta (surowce)",
                fav: "Łaski",
                tim: "Czas rekrutacji (s)",
                // Trade
                rat: "Stosunek surowców dla wybranej jednostki",
                shr: "procent zapełnienia magazynu w docelowym mieście",
                per: "Handel procentowy",
                // Sent units box
                lab: "Wysłane jednostki",
                improved_movement: "Przyspieszone ruchy wojsk"
            },
            buttons: {
                sav: "Zapisz", ins: "Wstaw", res: "Anuluj"
            }
        },
        //////////////////////////////////////////////
        // Spanish Translation by Juana de Castilla //
        //////////////////////////////////////////////
        es: {
            settings: {
                dsc: "DIO-Tools ofrece, entre otras cosas, varias pantallas, ventana de <br>emoticones, opciones de comercio y algunos cambios en el diseño.",
                act: "Activar/desactivar características de las herramientas:",
                prv: "Vista previa de varias características:"
            },
            options: {
                bir: ["Contador de birremes", "Cuenta los birremes de una ciudad y los suma"],
                sml: ["Emoticones", "Código BB para emoticones"],
                str: ["Fortaleza de la Unidad", "Añade tabla de fortalezas de cada unidad en varias zonas"],
                //trd: [ "Comercio",				"Añade en la pestaña de comercio un porcentaje de comercio y reclutamiento y limitadores de Mercado por cada ciudad" ],
                per: ["Comercio de porcentual", ""],
                rec: ["Comercio de reclutamiento", ""],
                cnt: ["Conquistas", "contador de ataques y refuerzos en la pestaña de conquista"],
                way: ["Velocidad de tropas", "Muestra movimiento de tropas mejorado en la ventana de ataque/refuerzo"],
                sim: ["Simulador", "Adaptación de la ventana del simulador incluyendo recuadro de modificadores"],
                spl: ["Ventana de hechizos", "Ventana deslizante y comprimida de los hechizos (memoria posicional)"],
                act: ["Ventana de actividad", "Mejora las ventanas de comercio y movimiento de tropas (memoria posicional)"],
                pop: ["Popup", "Cambia el popup de favores"],
                tsk: ["Barra de tareas", "aumenta la barra de tareas y minimice la recompensa al aparecer"],
                irc: ["Chat", 'Sustituye el chat de la alianza con un irc chat. (require FlashPlayer)'],
                bbc: ["Formulario de defensa", "Añade en la barra de códigos bb un formulario de defensa"],
                com: ["Comparación", "añade ventana de comparación de unidades"],
                tic: ["Iconos de la ciudad", "Cada ciudad recibe un icono para el tipo de la ciudad (detección automática)", "Iconos adicionales están disponibles para la selección manual"],
                til: ["Lista de la ciudad", "Agrega los iconos de la ciudad a la lista de la ciudad"],
                tim: ["Map", "Establece los iconos de la ciudad en el mapa estratégico"],
                wwc: ["Maravillas", "Calcula participación & contador de recursos + antes y después teclas de maravillas terminadas (no desactibable ahora!)"],
                wwr: ["", ""],
                //wwi: [ "World wonder icons",'Adds world wonder icons on the strategic map' ],
                con: ["menú contextual", 'Cambia "Elegir ciudad" y "vista de la ciudad" en el menú contextual '],
                sen: ["Unidades enviadas", 'Muestra las unidades enviadas en la ventana de ataque/refuerzos'],
                tov: ["Información de la ciudad", 'sustituye la vista nueva de ciudad por la ventana antigua'],
                scr: ["Rueda raton", 'Puede cambiar las vistas con la rueda del raton'],

                err: ["Enviar informes de errores automáticamente", "Si se activa esta opción, puede ayudar a identificar errores."]
            },
            labels: {
                uni: "Unidades disponibles",
                con: "Escoger ciudad",
                // Smileys
                std: "Standard",
                gre: "Grepolis",
                nat: "Natura",
                ppl: "Gente",
                oth: "Otros",
                // Defense form
                ttl: "Vista general: Defensa de la ciudad",
                inf: "Información de la ciudad:",
                dev: "Desviación",
                det: "Unidades de tierra detalladas",
                prm: "Bonos Premium",
                sil: "Volumen de plata",
                mov: "Movimientos de tropas:",
                // WW
                leg: "WW cuota",
                stg: "Nivel",
                tot: "Total",
                // Simulator
                str: "Fortaleza de la Unidad",
                los: "Perdida",
                mod: "sin influencia del modificador",
                // Comparison box
                dsc: "Comparación de Unidades",
                hck: "Contundente",
                prc: "Punzante",
                dst: "Distancia",
                sea: "Mar",
                att: "Ataque",
                def: "Defensa",
                spd: "Velocidad",
                bty: "Botín (recursos)",
                cap: "Capacidad de transporte",
                res: "Costes (recursos)",
                fav: "Favor",
                tim: "Tiempo de reclutamiento (s)",
                // Trade
                rat: "Proporción de recursos de un tipo de unidad",
                shr: "Porcentaje de la capacidad de almacenamiento de la ciudad destino",
                per: "Porcentaje de comercio",
                // Sent units box
                lab: "Unidades enviadas",
                improved_movement: "Movimiento de tropas mejorados"
            },
            buttons: {
                sav: "Guardar", ins: "Insertar", res: "Reinicio"
            }
        },
        ar: {},
        ////////////////////////////////////////////
        //  Portuguese (BR) Translation by  HELL  //
        ////////////////////////////////////////////
        br: {
            settings: {
                dsc: "DIO-Tools oferece, entre outras coisas, algumas telas, uma caixa de smiley, opções de comércio <br> e algumas alterações no layout.",
                act: "Ativar/desativar recursos do conjunto de ferramentas:",
                prv: "Pré-visualização de vários recursos:",

                version_old: "Versão não está atualizada",
                version_new: "Versão está atualizada",
                version_dev: "Versão do desenvolvedor",

                version_update: "Atualização",

                link_forum: "http://forum.en.grepolis.com/showthread.php?52104&goto=newpost",
                link_contact: "http://forum.en.grepolis.com/private.php?do=newpm&u=46211",

                forum: "Forum",
                author: "Autor",

                cat_units: "Unidades",
                cat_icons: "Ícones nas Cidades",
                cat_forum: "Forum",
                cat_trade: "Comércio",
                cat_wonders: "Maravilhas do Mundo",
                cat_layout: "Layout",
                cat_other: "Outros"
            },
            options: {
                bir: ["Contador de Birremes", "Conta as biremes da cidade na cidade"],
                ava: ["Unidades Disponíveis", "Conta as unidades disponíveis de todas as cidades"],
                sml: ["Smilies", "Estende o bbcode com uma caixa de smiley"],
                str: ["Força das Tropas", "Adiciona quadros de força das tropas em diversas áreas"],
                tra: ["Capacidade de Transporte", "Mostra a capacidade de transporte ocupado e disponível no menu de unidades"],
                per: ["Percentual de comércio", "Estende-se a janela de comércio com um percentual de comércio"],
                rec: ["Comércio para recrutamento", "Estende-se a janela de comércio com um comércio de recrutamento"],
                cnt: ["Conquistas", "Conta os ataques/apoios na janela de conquista"],
                way: ["Velocidade da Tropa", "Displays mostram a possivél velocidade de tropa na janela de ataque/suporte"],
                sim: ["Simulador", "Adaptação do layout simulador & exposição permanente da caixa poderes estendida"],
                spl: ["Caixa de Poderes Divinos", "Pequena caixa móvel & magnética de poderes divinos (com memória de posição) "],
                act: ["Ativar caixas suspensas de comércio e ataque", "Melhorias da exibição de caixas de comércio e atividade tropa (com memória de posição)"],
                pop: ["Caixa de favores divino", "Altera a caixa de favores divino por um novo layout"],
                tsk: ["Barra de tarefas", "Aumenta a barra de tarefas e minimiza a janela recompensa diária no inicio"],
                irc: ["Chat", 'Substituiu o da bate-papo por um bate-papo IRC. (Flash Player requerido)'],
                bbc: ["Pedido de Apoio", "Estende a barra de bbcode com uma forma de Pedido de Apoio Automática"],
                com: ["Comparação de Unidades", "Adiciona tabelas de comparação de unidade"],
                tic: ["Ícones nas Cidades", "Cada cidade recebe um ícone para o tipo de tropas na cidade (detecção automática) "," Ícones adicionais estão disponíveis para seleção manual"],
                til: ["Lista das Cidades", "Adiciona os ícones da cidade na lista de cidades"],
                tim: ["Mapa", "Mostra os ícones das cidades no mapa estratégico"],
                wwc: ["Calculadora de WW", "Cálculo compartilhado & contador de recursos + botões anterior e próxima maravilhas do mundo (atualmente não desactivável!)"],
                wwr: ["Classificação", "Classificação das maravilha do mundo redesenhadas"],
                wwi: ["Icones", 'Adiciona ícones nas maravilha do mundo no mapa estratégico'],
                con: ["Menu de Contexto", 'Troca da "Selecione cidade" e "Visão Geral da Cidade" no menu de contexto'],
                sen: ["Unidades Enviadas", 'Shows sent units in the attack/support window'],
                tov: ["Visão da Cidade", 'Substitui o novo panorama da cidade, com o estilo da janela antiga'],
                scr: ["Roda do Mouse", 'Você pode alterar os pontos de vista com a roda do mouse'],

                err: ["Enviar automaticamente relatórios de erros", "Se você ativar essa opção, você pode ajudar a identificar erros."],
                her: ["Conquista Thracian", "Redução de tamanho do mapa da conquista Thracian."]
            },
            labels: {
                uni: "Unidades disponíveis",
                con: "Selecionar cidade",
                // Smileys
                std: "Padrão",
                gre: "Grepolis",
                nat: "Natural",
                ppl: "Popular",
                oth: "Outros",
                hal: "Halloween",
                xma: "Natal",
                // Defense form
                ttl: "Pedido de Apoio",
                inf: "Informação da cidade:",
                dev: "Desvio",
                det: "Unidades Detalhadas",
                prm: "Bônus Premium",
                sil: "Prata na Gruta",
                mov: "Movimentação de Tropas:",
                // WW
                leg: "WW Maravilhas",
                stg: "Level",
                tot: "Total",
                // Simulator
                str: "Força das Unidades",
                los: "Perdas",
                mod: "Sem modificador de influência",
                // Comparison box
                dsc: "Comparação de unidades",
                hck: "Impacto",
                prc: "Corte",
                dst: "Arremço",
                sea: "Naval",
                att: "Ofensivo",
                def: "Defensivo",
                spd: "Velocidade",
                bty: "Saque (recursos)",
                cap: "Capacidade de trasporte",
                res: "Custo (recursos)",
                fav: "Favor",
                tim: "Tempo de recrutamento (s)",
                // Trade
                rat: "Proporção de recursos de um tipo de unidade",
                shr: "A partir do armazenamento sobre a cidade de destino",
                per: "Percentual de comércio",
                // Sent units box
                lab: "Unidades enviadas",
                improved_movement: "Movimentação de tropas com ajuste de bônus"
            },
            buttons: {
                sav: "Salvar", ins: "Inserir", res: "Resetar"
            }
        },
        pt : {}
    };

    LANG.ar = LANG.es;
    LANG.pt = LANG.br;

    // Create JSON
    // console.log(JSON.stringify(LANG.en));

    // Forum: Choose language
    if (uw.location.pathname !== "/game/index") {
        LID = uw.location.host.split(".")[1];
    }

    // Translation GET
    function getText(category, name) {
        var txt = "???";
        if (LANG[LID]) {
            if (LANG[LID][category]) {
                if (LANG[LID][category][name]) {
                    txt = LANG[LID][category][name];
                } else {
                    if (LANG.en[category]) {
                        if (LANG.en[category][name]) {
                            txt = LANG.en[category][name];
                        }
                    }
                }
            } else {
                if (LANG.en[category]) {
                    if (LANG.en[category][name]) {
                        txt = LANG.en[category][name];
                    }
                }
            }
        } else {
            if (LANG.en[category]) {
                if (LANG.en[category][name]) {
                    txt = LANG.en[category][name];
                }
            }
        }
        return txt;
    }

    /*******************************************************************************************************************************
     * Settings
     *******************************************************************************************************************************/

    // (De)activation of the features
    var options_def = {
        bir: true, // Biremes counter
        ava: true,	// Available units
        sml: true, // Smileys
        str: true, // Unit strength
        tra: true, // Transport capacity
        per: true, // Percentual Trade
        rec: true, // Recruiting Trade
        way: true, // Troop speed
        cnt: true, // Attack/support counter
        sim: true, // Simulator
        spl: true, // Spell box
        act: false,// Activity boxes
        tsk: true, // Task bar
        irc: true, // IRC-Chat
        pop: true, // Favor popup
        bbc: true, // BBCode bar
        com: true, // Unit comparison
        tic: true, // Town icons
        til: true, // Town icons: Town list
        tim: true, // Town icons: Map
        wwc: true, // World wonder counter
        wwr: true, // World wonder ranking
        wwi: true, // World wonder icons
        con: true, // Context menu
        sen: true, // Sent units
        tov: false,// Town overview
        scr: true, // Mausrad,

        err: false,// Error Reports
        her: true	// Thrakische Eroberung
    };

    if (uw.location.pathname === "/game/index") {
        for (var opt in options_def) {
            if (options_def.hasOwnProperty(opt)) {
                if (DATA.options[opt] === undefined) {
                    DATA.options[opt] = options_def[opt];
                }
            }
        }
    }

    var version_text = '', version_color = 'black';

    function getLatestVersion() {
        $('<style id="dio_version">' +
            '#version_info .version_icon { background: url(http://666kb.com/i/ct1etaz0uyohw402i.png) -50px -50px no-repeat; width:25px; height:25px; float:left; } ' +
            '#version_info .version_icon.red { -webkit-filter: hue-rotate(-100deg); } ' +
            '#version_info .version_icon.green { -webkit-filter: hue-rotate(0deg); } ' +
            '#version_info .version_icon.blue { -webkit-filter: hue-rotate(120deg); } ' +
            '#version_info .version_text { line-height: 2; margin: 0px 6px 0px 6px; float: left;} ' +
            '</style>').appendTo("head");

        var v_info = $('#version_info');
        if (version_text === '') {
            $.ajax({
                type: "GET", url: "https://diotools.de/scripts/version.php",
                success: function (response) {
                    var latest_version = parseFloat(response),
                        current_version = parseFloat(version);

                    if (current_version < latest_version) {
                        version_text = "<div class='version_icon red'></div><div class='version_text'>" + getText('settings', 'version_old') + "</div><div class='version_icon red'></div>" +
                            '<a class="version_text" href="https://diotools.de/downloads/DIO-TOOLS.user.js" target="_blank">--> Update</a>';
                        version_color = 'crimson';
                    } else if (current_version == latest_version) {
                        version_text = "<div class='version_icon green'></div><div class='version_text'>" + getText('settings', 'version_new') + "</div><div class='version_icon green'></div>";
                        version_color = 'darkgreen';
                    } else {
                        version_text = "<div class='version_icon blue'></div><div class='version_text'>" + getText('settings', 'version_dev') + "</div><div class='version_icon blue'></div>";
                        version_color = 'darkblue';
                    }
                    v_info.html(version_text).css({color: version_color});
                }
            });
        } else {
            v_info.html(version_text).css({color: version_color});
        }
    }

    // Add DIO-Tools to grepo settings
    function settings() {
        var wid = $(".settings-menu").get(0).parentNode.id;

        if (!$("#dio_tools").get(0)) {
            $(".settings-menu ul:last").append('<li id="dio_li"><img id="dio_icon" src="http://www.greensmilies.com/smile/smiley_emoticons_smile.gif"></div> <a id="dio_tools" href="#"> DIO-Tools</a></li>');
        }

        $(".settings-link").click(function () {
            $('.section').each(function () {
                this.style.display = "block";
            });
            $('.settings-container').removeClass("dio_overflow");

            $('#dio_bg_medusa').css({display: "none"});

            if ($('#dio_settings').get(0)) {
                $('#dio_settings').get(0).style.display = "none";
            }
        });

        $("#dio_tools").click(function () {
            if ($('.email').get(0)) {
                $('.settings-container').removeClass("email");
            }

            $('.settings-container').addClass("dio_overflow");

            $('#dio_bg_medusa').css({display: "block"});

            if (!$('#dio_settings').get(0)) {
                // Styles
                $('<style id="dio_settings_style">' +
                        // Chrome Scroollbar Style
                    '#dio_settings ::-webkit-scrollbar { width: 13px; } ' +
                    '#dio_settings ::-webkit-scrollbar-track { background-color: rgba(130, 186, 135, 0.5); border-top-right-radius: 4px; border-bottom-right-radius: 4px; } ' +
                    '#dio_settings ::-webkit-scrollbar-thumb { background-color: rgba(87, 121, 45, 0.5); border-radius: 3px; } ' +
                    '#dio_settings ::-webkit-scrollbar-thumb:hover { background-color: rgba(87, 121, 45, 0.8); } ' +

                    '#dio_settings table tr :first-child { text-align:center; vertical-align:top; } ' +

                    '#dio_settings #version_info { font-weight:bold;height: 35px;margin-top:-5px; } ' +
                    '#dio_settings #version_info img { margin:-1px 2px -8px 0px; } ' +

                    '#dio_settings .icon_types_table { font-size:0.7em; line-height:2.5; border:1px solid green; border-spacing:10px 2px; border-radius:5px; } ' +
                    '#dio_settings .icon_types_table td { text-align:left; } ' +

                    '#dio_settings table p { margin:0.2em 0em; } ' +

                    '#dio_settings .checkbox_new .cbx_caption { white-space:nowrap; margin-right:10px; font-weight:bold; } ' +

                    '#dio_settings .dio_settings_tabs {width:auto; border:2px solid darkgreen; background:#2B241A; padding:1px 1px 0px 1px; right:auto; border-top-left-radius:5px; border-top-right-radius:5px; border-bottom:0px;} ' +

                    '#dio_settings .dio_settings_tabs li { float:left; } ' +

                    '#dio_settings .icon_small { margin:0px; } ' +

                    '#dio_settings img { max-width:90px; max-height:90px; margin-right:10px; } ' +

                    '#dio_settings .content { border:2px solid darkgreen; border-radius:5px; border-top-left-radius:0px; background:rgba(31, 25, 12, 0.1); top:23px; position:relative; padding:10px; height:350px; overflow-y:auto; } ' +
                    '#dio_settings .content .content_category { display:none; border-spacing:5px; } ' +

                    '#dio_settings .dio_options_table legend { font-weight:bold; } ' +
                    '#dio_settings .dio_options_table p { margin:0px; } ' +
                    '#dio_settings #donate_btn { -webkit-filter: hue-rotate(45deg); } ' +

                    '#donate_btn { background: url(' + dio_sprite + '); width:100px; height:26px;} ' +
                    '#donate_btn.de { background-position: 0px 250px } ' +
                    '#donate_btn.en { background-position: 0px 300px } ' +

                    '#dio_hall table { border-spacing: 9px 3px; } ' +
                    '#dio_hall table th { text-align:left !important;color:green;text-decoration:underline;padding-bottom:10px; } ' +
                    '#dio_hall table td.value { text-align: right; } ' +

                    '#dio_hall table td.laurel.green { background: url("/images/game/ally/founder.png") no-repeat; height:18px; width:18px; background-size:100%; } ' +
                    '#dio_hall table td.laurel.bronze { background: url("https://diotools.de/images/game/laurel_sprite.png") no-repeat 25%; height:18px; width:18px; } ' +
                    '#dio_hall table td.laurel.silver { background: url("https://diotools.de/images/game/laurel_sprite.png") no-repeat 50%; height:18px; width:18px; } ' +
                    '#dio_hall table td.laurel.gold { background: url("https://diotools.de/images/game/laurel_sprite.png") no-repeat 75%; height:18px; width:18px; } ' +
                    '#dio_hall table td.laurel.blue { background: url("https://diotools.de/images/game/laurel_sprite.png") no-repeat 100%; height:18px; width:18px; } ' +
                    '</style>').appendTo('head');


                $('.settings-container').append(
                    '<div id="dio_settings" class="player_settings section"><div id="dio_bg_medusa"></div>' +
                    '<div class="game_header bold"><a href="#" target="_blank" style="color:white">DIO-Tools (v' + version + ')</a></div>' +

                        // Check latest version
                    '<div id="version_info"><img src="http://666kb.com/i/csmicltyu4zhiwo5b.gif" /></div>' +

                        // Donate button
                    '<div style="position:absolute; left: 495px;top: 40px;"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3EWUQUTMC5VKS" target="_blank">' +
                    '<div id="donate_btn" class="' + LID + '" alt="Donate"></div></a></div>' +

                        // Settings navigation
                    '<ul class="menu_inner dio_settings_tabs">' +
                    '<li><a class="submenu_link active" href="#" id="dio_units"><span class="left"><span class="right"><span class="middle">' + getText("settings", "cat_units") + '</span></span></span></a></li>' +
                    '<li><a class="submenu_link" href="#" id="dio_icons"><span class="left"><span class="right"><span class="middle">' + getText("settings", "cat_icons") + '</span></span></span></a></li>' +
                    '<li><a class="submenu_link" href="#" id="dio_forum"><span class="left"><span class="right"><span class="middle">' + getText("settings", "cat_forum") + '</span></span></span></a></li>' +
                    '<li><a class="submenu_link" href="#" id="dio_trade"><span class="left"><span class="right"><span class="middle">' + getText("settings", "cat_trade") + '</span></span></span></a></li>' +
                    '<li><a class="submenu_link" href="#" id="dio_wonder"><span class="left"><span class="right"><span class="middle">' + getText("settings", "cat_wonders") + '</span></span></span></a></li>' +
                    '<li><a class="submenu_link" href="#" id="dio_layout"><span class="left"><span class="right"><span class="middle">' + getText("settings", "cat_layout") + '</span></span></span></a></li>' +
                    '<li><a class="submenu_link" href="#" id="dio_other"><span class="left"><span class="right"><span class="middle">' + getText("settings", "cat_other") + '</span></span></span></a></li>' +
                    '</ul>' +

                        // Settings content
                    '<DIV class="content">' +

                        // Units tab
                    '<table id="dio_units_table" class="content_category visible"><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/units/available_units.png" alt="" /></td>' +
                    '<td><div id="ava" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "ava")[0] + '</div></div>' +
                    '<p>' + getText("options", "ava")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/units/sent_units.png" alt="" /></td>' +
                    '<td><div id="sen" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "sen")[0] + '</div></div>' +
                    '<p>' + getText("options", "sen")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/units/unit_strength.png" alt="" /></td>' +
                    '<td><div id="str" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "str")[0] + '</div></div>' +
                    '<p>' + getText("options", "str")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/units/transport_capacity.png" alt="" /></td>' +
                    '<td><div id="tra" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "tra")[0] + '</div></div>' +
                    '<p>' + getText("options", "tra")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/units/unit_comparison.png" alt="" /></td>' +
                    '<td><div id="com" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "com")[0] + '</div></div>' +
                    '<p>' + getText("options", "com")[1] + '</p></td>' +
                    '</tr></table>' +

                        // Icons tab
                    '<table id="dio_icons_table" class="content_category"><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/townicons/townicons.png" alt="" /></td>' +
                    '<td><div id="tic" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "tic")[0] + '</div></div>' +
                    '<p>' + getText("options", "tic")[1] + '</p>' +
                    '<table class="icon_types_table">' +
                    '<tr><td style="width:115px"><div class="icon_small townicon_lo"></div> Land Offensive</td>' + '<td><div class="icon_small townicon_fo"></div> Fly Offensive</td></tr>' +
                    '<tr><td><div class="icon_small townicon_ld"></div> Land Defensive</td>' + '<td><div class="icon_small townicon_fd"></div> Fly Defensive</td></tr>' +
                    '<tr><td><div class="icon_small townicon_so"></div> Navy Offensive</td>' + '<td><div class="icon_small townicon_no"></div> Outside</td></tr>' +
                    '<tr><td><div class="icon_small townicon_sd"></div> Navy Defensive</td>' + '<td><div class="icon_small townicon_po"></div> Empty</td></tr>' +
                    '</table><br>' +
                    '<p>' + getText("options", "tic")[2] + ':</p>' +
                    '<div class="icon_small townicon_sh"></div><div class="icon_small townicon_di"></div><div class="icon_small townicon_un"></div><div class="icon_small townicon_ko"></div>' +
                    '<div class="icon_small townicon_ti"></div><div class="icon_small townicon_gr"></div><div class="icon_small townicon_dp"></div><div class="icon_small townicon_re"></div>' +
                    '<div class="icon_small townicon_wd"></div><div class="icon_small townicon_st"></div><div class="icon_small townicon_si"></div><div class="icon_small townicon_bu"></div>' +
                    '<div class="icon_small townicon_he"></div><div class="icon_small townicon_ch"></div><div class="icon_small townicon_bo"></div><div class="icon_small townicon_fa"></div>' +
                    '<div class="icon_small townicon_wo"></div>' +
                    '</td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/townicons/townlist.png" alt="" style="border: 1px solid rgb(158, 133, 78);" /></td>' +
                    '<td><div id="til" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "til")[0] + '</div></div>' +
                    '<p>' + getText("options", "til")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/townicons/map.png" alt="" /></td>' +
                    '<td><div id="tim" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "tim")[0] + '</div></div>' +
                    '<p>' + getText("options", "tim")[1] + '</p></td>' +
                    '</tr></table>' +

                        // Forum tab
                    '<table id="dio_forum_table" class="content_category"><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/forum/smiley_box.png" alt="" /></td>' +
                    '<td><div id="sml" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "sml")[0] + '</div></div>' +
                    '<p>' + getText("options", "sml")[1] + '</p>' +
                    '<img src="http://www.greensmilies.com/smile/smiley_emoticons_mttao_wassermann.gif" /> <img src="http://666kb.com/i/cigrqlp2odi2kqo24.gif" /> ' +
                    '<img src="http://666kb.com/i/cifvfsu3e2sdiipn0.gif" alt="" /> <img src="http://666kb.com/i/cigmv8wnffb3v0ifg.gif" /> ' +
                    '<img src="http://666kb.com/i/cj2byjendffymp88t.gif" alt="" /> <img src="http://666kb.com/i/cj1l9gndtu3nduyvi.gif" /> ' +
                    '<img src="http://666kb.com/i/cigrmpfofys5xtiks.gif" alt="" />' + //'<img src="http://666kb.com/i/cifohielywpedbyh8.gif" />'+
                    '<br><br><br></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/forum/def_formular.png" alt="" /></td>' +
                    '<td><div id="bbc" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "bbc")[0] + '</div></div>' +
                    '<p>' + getText("options", "bbc")[1] + '</p><br><img src="http://s1.directupload.net/images/140401/9b2ydh82.png" alt="" style="max-width:none !important;" /></td>' +
                    '</tr></table>' +

                        // Trade tab
                    '<table id="dio_trade_table" class="content_category"><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/trade/recruiting_trade.png" /></td>' +
                    '<td><div id="rec" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "rec")[0] + '</div></div>' +
                    '<p>' + getText("options", "rec")[1] + '</p><br>' +
                        /*
                         '<p><u>Beispiel Feuerschiffe:</u><br>'+
                         '<p>Verhältnisauswahl</p>'+
                         '<table style="font-size: 0.7em;line-height: 2.5;border: 1px solid green;border-spacing: 10px 2px;border-radius: 5px;">'+
                         '<tr><th></th><th><div class="icon_small townicon_wd"></div></th><td></td><th><div class="icon_small townicon_st"></div></th><td></td><th><div class="icon_small townicon_si"></div></th></tr>'+
                         '<tr><td>Kosten</td><td>1300</td><td></td><td>300</td><td></td><td>800</td></tr>'+
                         '<tr><td>Verhältnis</td><td>1</td><td>:</td><td>0.23</td><td>:</td><td>0.62</td></tr>'+
                         '</table>'+
                         '<p>Lagergröße Zielstadt: 25500 - 1000 Puffer (=100%)</p>'+
                         '<p>Handelsmenge 25%: </p>'+
                         '<table style="font-size: 0.7em;line-height: 2.5;">'+
                         '<tr><td>4 x 25%</td><td>4 x 25%</td><td>...</td></tr>'+
                         '<tr><td><img src="http://s7.directupload.net/images/140920/uc4dsyp9.png" style="width:60px" /></td>'+
                         '<td><img src="http://s7.directupload.net/images/140920/uc4dsyp9.png" style="width:60px" /></td><td>...</td></tr>'+
                         '</table>'+
                         //'- Versenden von 35 einzelnen Rohstoffportionen im Anteil 20% (z.B. 4900 Holz, 1130 Stein, 3015 Silber bei Lagerkapazität von 25.500), das heißt 5 Portionen für einen Rekrutierungsslot'+
                         //'- nach Ankommen von jeweils 5 Portionen, Einheiten in Auftrag geben (19-21 Feuerschiffe bei maximaler Lagerkapazität)'+
                         //'Ein Puffer von 1000 Rohstoffeinheiten wird dabei von der Lagerkapazität der Zielstadt abgezogen, damit Rekrutierungsreste und neu produzierte Rohstoffe nicht gleich zum Überlaufen des Lagers führen.'+
                         //'Das Ganze beschleunigt das Befüllen der Rekrutierungsschleifen enorm und es gehen dabei keine Rohstoffe verloren.</p>'+
                         '<br><br><br></td>'+
                         */
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/trade/percentage_trade.png" /></td>' +
                    '<td><div id="per" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "per")[0] + '</div></div>' +
                    '<p>' + getText("options", "per")[1] + '</p><br></td>' +
                        /*
                         '</tr><tr>'+
                         '<td><img src="http://s7.directupload.net/images/140917/tveb5n33.png" /></td>'+
                         '<td><div id="trd2" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">Trade Limit Marker</div></div>'+
                         '<p></p></td>'+
                         */
                    '</tr></table>' +

                        // World wonder tab
                    '<table id="dio_wonder_table" class="content_category"><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/wonders/share.png" alt="" /></td>' +
                    '<td><div id="wwc" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "wwc")[0] + '</div></div>' +
                    '<p>' + getText("options", "wwc")[1] + '</p><br/>' +
                    '<img src="https://diotools.de/images/game/settings/wonders/share_calculator.png" alt="" style="max-width:none !important;" /></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/wonders/ranking.png" alt="" /></td>' +
                    '<td><div id="wwr" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "wwr")[0] + '</div></div>' +
                    '<p>' + getText("options", "wwr")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/wonders/icons.png" alt="" /></td>' +
                    '<td><div id="wwi" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "wwi")[0] + '</div></div>' +
                    '<p>' + getText("options", "wwi")[1] + '</p></td>' +
                    '</tr></table>' +

                        // Layout tab
                    '<table id="dio_layout_table" class="content_category"><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/layout/simulator.png" alt="" /></td>' +
                    '<td><div id="sim" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "sim")[0] + '</div></div>' +
                    '<p>' + getText("options", "sim")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/layout/spellbox.png" alt="" /></td>' +
                    '<td><div id="spl" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "spl")[0] + '</div></div>' +
                    '<p>' + getText("options", "spl")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/layout/taskbar.png" alt="" /></td>' +
                    '<td><div id="tsk" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "tsk")[0] + '</div></div>' +
                    '<p>' + getText("options", "tsk")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/layout/favor_popup.png" alt="" /></td>' +
                    '<td><div id="pop" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "pop")[0] + '</div></div>' +
                    '<p>' + getText("options", "pop")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/layout/contextmenu.png" alt="" /></td>' +
                    '<td><div id="con" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "con")[0] + '</div></div>' +
                    '<p>' + getText("options", "con")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/layout/activity_boxes.png" alt="" /></td>' +
                    '<td><div id="act" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "act")[0] + '</div></div>' +
                    '<p>' + getText("options", "act")[1] + '</p></td>' +
                    '</tr></table>' +

                        // Other Stuff tab
                    '<table id="dio_other_table" class="content_category"><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/misc/troop_speed.png" style="border: 1px solid rgb(158, 133, 78);" alt="" /></td>' +
                    '<td><div id="way" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "way")[0] + '</div></div>' +
                    '<p>' + getText("options", "way")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/misc/chat.png" alt="" /></td>' +
                    '<td><div id="irc" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "irc")[0] + '</div></div>' +
                    '<p>' + getText("options", "irc")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/misc/conquer_counter.png" style="border: 1px solid rgb(158, 133, 78);" alt="" /></td>' +
                    '<td><div id="cnt" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "cnt")[0] + '</div></div>' +
                    '<p>' + getText("options", "cnt")[1] + '</p></td>' +
                    '</tr><tr>' +
                    '<td><img src="https://diotools.de/images/game/settings/misc/mousewheel_zoom.png" alt="" /></td>' +
                    '<td><div id="scr" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "scr")[0] + '</div></div>' +
                    '<p>' + getText("options", "scr")[1] + '</p><br><br></td>' +
                    '</tr><tr>' +
                    '<td><img src="" alt="" /></td>' +
                    '<td><div id="err" class="checkbox_new"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("options", "err")[0] + '</div></div>' +
                    '<p>' + getText("options", "err")[1] + '</p></td>' +
                    '</tr></table>' +


                        // Hall of DIO-Tools tab
                    '<div id="dio_hall" class="content_category">'+
                        "<p>I like to thank all of you who helped the development of DIO-Tools by donating or translating!</p>"+
                    '<table style="float:left;margin-right: 75px;">'+
                    '<tr><th colspan="3">Donations</th></tr>'+
                    (function(){
                        var donations = [
                            ["Eduard R", 50],
                            ["Gregoire L", 25],
                            ["Renee A", 20], ["Dirk R", 20], ["Patti T", 20],
                            ["Klaus N", 15],
                            ["Marco S", 10], ["Richard L", 10], ["Carsten K", 10], ["Tatiana H", 10], ["Ursula S", 10], ["Susanne S", 10], ["Falk T", 10],
                            ["Belinda M", 8], ["Wolfgang R", 8],
                            ["Miguel B", 7],
                            ["Antje S", 5], ["Hans-Jörg S", 5], ["Deanna P", 5], ["ForexTraction", 5], ["Rene F", 5], ["Rüdiger D", 5], ["Hans Hermann S", 5],
                            ["Siegbert M", 5], ["Wilhelm B", 5], ["Peter P", 5], ["Helga W", 5], ["Lydia R", 5],
                            ["Michael S", 3],
                            ["Mario P", 2], ["Artur G", 2], ["Heiko K", 2], ["Alexander B", 2], ["Dick N", 2],
                            ["Marcel G", 1], ["Ramona L", 1], ["Dennis S", 1], ["Konstandinos K", 1], ["Sarl T", 1], ["Jagadics I", 1], ["Andreas R", 1],
                            ["Peter F", 1], ["Vinicio G", 1], ["Marielle M", 1], ["Christian B", 1], ["Bernd W", 1], ["Maria N", 1], ["Thomas W", 1],
                            ["Domenik F", 1], ["Oliver H", 1], ["Jens R", 1], ["Nicole S", 1], ["Hartmut S", 1], ["Alex L", 1], ["Andreas S", 1]
                        ];
                        var donation_table = "";

                        for(var d = 0; d < donations.length; d++){

                            var donation_class = "";

                            switch(donations[d][1]){
                                case 50: donation_class = "gold";   break;
                                case 25: donation_class = "silver"; break;
                                case 20: donation_class = "bronze"; break;
                                default: donation_class = "green";  break;
                            }

                            donation_table += '<tr class="donation"><td class="laurel '+ donation_class +'"></td><td>' + donations[d][0] + '</td><td class="value">' + donations[d][1] + '€</td></tr>';
                        }

                        return donation_table;
                    })() +
                    '</table>'+
                    '<table>'+
                    '<tr><th colspan="3">Translations</th></tr>'+
                    (function(){
                        var translations = [
                            ["eclat49", "FR"],
                            ["MrBobr", "RU"],
                            ["anpu", "PL"],
                            ["Juana de Castilla", "ES"],
                            ["HELL", "BR"]
                        ];

                        var translation_table = "";

                        for(var d = 0; d < translations.length; d++){
                            translation_table += '<tr class="translation"><td class="laurel blue"></td><td >' + translations[d][0] + '</td><td class="value">' + translations[d][1] + '</td></tr>';
                        }

                        return translation_table;
                    })() +
                    '</table>'+
                    '</div>' +

                    '</DIV>' +

                    // Links (Forum, PM, ...)
                    '<div style="bottom: -50px;font-weight: bold;position: absolute;width: 99%;">' +

                    '<a id="hall_of_diotools" href="#" style="font-weight:bold; float:left">' +
                    '<img src="/images/game/ally/founder.png" alt="" style="float:left;height:19px;margin:0px 5px -3px;"><span>Hall of DIO-Tools</span></a>' +

                    '<span class="bbcodes_player bold" style="font-weight:bold; float:right; margin-left:20px;">' + getText("settings", "author") + ': ' +
                    '<a id="link_contact" href=' + getText("settings", "link_contact") + ' target="_blank">Diony</a></span>' +

                    '<a id="link_forum" href=' + getText("settings", "link_forum") + ' target="_blank" style="font-weight:bold; float:right">' +
                    '<img src="http://forum.de.grepolis.com/grepolis/statusicon/forum_new-16.png" alt="" style="margin: 0px 5px -3px 5px;" /><span>' + getText("settings", "forum") + '</span></a>' +

                    '</div>' +

                    '</div></div>');

                getLatestVersion();

                // Tab event handler
                $('#dio_settings .dio_settings_tabs .submenu_link').click(function () {
                    if (!$(this).hasClass("active")) {
                        $('#dio_settings .dio_settings_tabs .submenu_link.active').removeClass("active");
                        $(this).addClass("active");
                        $("#dio_settings .visible").removeClass("visible");
                        $("#" + this.id + "_table").addClass("visible");
                    }
                });

                //
                $('#hall_of_diotools').click(function () {
                    $('#dio_settings .dio_settings_tabs .submenu_link.active').removeClass("active");

                    $("#dio_settings .visible").removeClass("visible");
                    $("#dio_hall").addClass("visible");
                });

                $("#dio_settings .checkbox_new").click(function () {
                    $(this).toggleClass("checked").toggleClass("disabled").toggleClass("green");
                    toggleActivation(this.id);

                    DATA.options[this.id] = $(this).hasClass("checked");

                    saveValue("options", JSON.stringify(DATA.options));
                });
                for (var e in DATA.options) {
                    if (DATA.options.hasOwnProperty(e)) {
                        if (DATA.options[e] === true) {
                            $("#" + e).addClass("checked").addClass("green");
                        } else {
                            $("#" + e).addClass("disabled");
                        }
                    }
                }

                $('#dio_save').click(function () {
                    $('#dio_settings .checkbox_new').each(function () {
                        var act = false;
                        if ($("#" + this.id).hasClass("checked")) {
                            act = true;
                        }
                        DATA.options[this.id] = act;
                    });
                    saveValue("options", JSON.stringify(DATA.options));
                });
            }
            $('.section').each(function () {
                this.style.display = "none";
            });
            $('#dio_settings').get(0).style.display = "block";
        });
    }

    function toggleActivation(opt) {
        var FEATURE, activation = true;
        switch (opt) {
            case "sml":
                FEATURE = SmileyBox;
                break;
            case "bir":
                FEATURE = BiremeCounter;
                break;
            case "str":
                FEATURE = UnitStrength.Menu;
                break;
            case "tra":
                FEATURE = TransportCapacity;
                break;
            case "ava":
                FEATURE = AvailableUnits;
                break;
            case "sim":
                FEATURE = Simulator;
                break;
            case "spl":
                FEATURE = Spellbox;
                break;
            case "tsk":
                FEATURE = Taskbar;
                break;
            case "scr":
                FEATURE = MouseWheelZoom;
                break;
            case "irc":
                FEATURE = Chat;
                break;
            case "com":
                FEATURE = UnitComparison;
                break;
            case "pop":
                FEATURE = FavorPopup;
                break;
            case "con":
                FEATURE = ContextMenu;
                break;
            case "tic":
                FEATURE = TownIcons;
                break;
            case "tim":
                FEATURE = TownIcons.Map;
                break;
            case "til":
                FEATURE = TownList;
                break;
            case "sen":
                FEATURE = SentUnits;
                break;
            case "act":
                FEATURE = ActivityBoxes;
                break;
            case "wwc":
                FEATURE = WorldWonderCalculator;
                break;
            case "wwr":
                FEATURE = WorldWonderRanking;
                break;
            case "wwi":
                FEATURE = WorldWonderIcons;
                break;
            case "pom":
                FEATURE = PoliticalMap;
                break;

            default:
                activation = false;
                break;
        }
        if (activation) {
            if (DATA.options[opt]) {
                FEATURE.deactivate();
            } else {
                FEATURE.activate();
            }
        }
    }

    function addSettingsButton() {
        var tooltip_str = "DIO-Tools: " + (DM.getl10n("layout", "config_buttons").settings || "Settings");

        $('<div class="btn_settings circle_button dio_settings"><div class="dio_icon js-caption"></div></div>').appendTo(".gods_area");

        // Style
        $('<style id="dio_settings_button" type="text/css">' +
            '#ui_box .btn_settings.dio_settings { top:95px; right:103px; z-index:10; } ' +
            '#ui_box .dio_settings .dio_icon { margin:7px 0px 0px 4px; width:24px; height:24px; background:url(http://666kb.com/i/cifvfsu3e2sdiipn0.gif) no-repeat 0px 0px; background-size:100% } ' +
            '#ui_box .dio_settings .dio_icon.click { margin-top:8px; }' +
            '</style>').appendTo('head');

        // Tooltip
        $('.dio_settings').tooltip(tooltip_str);

        // Mouse Events
        $('.dio_settings').on('mousedown', function () {
            $('.dio_icon').addClass('click');
        });
        $('.dio_settings').on('mouseup', function () {
            $('.dio_icon').removeClass('click');
        });
        $('.dio_settings').click(openSettings);
    }

    var diosettings = false;

    function openSettings() {
        if (!GPWindowMgr.getOpenFirst(Layout.wnd.TYPE_PLAYER_SETTINGS)) {
            diosettings = true;
        }
        Layout.wnd.Create(GPWindowMgr.TYPE_PLAYER_SETTINGS, 'Settings');
    }

    var exc = false, sum = 0, ch = ["FBADAF", "IGCCJB"], alpha = 'ABCDEFGHIJ';

    function a() {
        var pA = PID.toString(), pB = "";

        for (var c in pA) {
            if (pA.hasOwnProperty(c)) {
                pB += alpha[pA[parseInt(c, 10)]];
            }
        }

        sum = 0;
        for (var b in ch) {
            if (ch.hasOwnProperty(b)) {
                if (pB !== ch[b]) {
                    exc = true;
                } else {
                    exc = false;
                    return;
                }
                for (var s in ch[b]) {
                    if (ch[b].hasOwnProperty(s)) {
                        sum += alpha.indexOf(ch[b][s]);
                    }
                }
            }
        }
    }

    var autoTownTypes, manuTownTypes, population, sentUnitsArray, biriArray, spellbox, commandbox, tradebox, wonder, wonderTypes;

    function setStyle() {
        // Settings
        $('<style id="dio_settings_style" type="text/css">' +
            '#dio_bg_medusa { background:url(' + dio_sprite + ') -160px -43px no-repeat; height: 510px; width: 260px; right: -10px; z-index: -1; position: absolute;} ' +
            '.dio_overflow  { overflow: hidden; } ' +
            '#dio_icon  { width:15px; vertical-align:middle; margin-top:-2px; } ' +
            '#quackicon { width:15px !important; vertical-align:middle !important; margin-top:-2px; height:12px !important; } ' +
            '#dio_settings .green { color: green; } ' +
            '#dio_settings .visible { display:block !important; } ' +
            '</style>').appendTo('head');

        // Town Icons
        $('<style id="dio_icons" type="text/css">.icon_small { position:relative; height:20px; width:25px; margin-left:-25px; }</style>').appendTo('head');

        // Tutorial-Quest Container
        $('<style id="dio_quest_container" type="text/css"> #tutorial_quest_container { top: 130px } </style>').appendTo('head');

        // Velerios
        $('<style id="dio_velerios" type="text/css"> #ph_trader_image { background-image: url(http://s14.directupload.net/images/140826/mh8k8nyw.jpg); } </style>').appendTo('head');
        // http://s7.directupload.net/images/140826/bgqlsdrf.jpg

        // Specific player wishes
        if (PID == 1212083) {
            $('<style id="dio_wishes" type="text/css"> #world_end_info { display: none; } </style>').appendTo('head');
        }
    }

    if (uw.location.pathname === "/game/index") {
        setStyle();
    }

    function loadFeatures() {
        if (typeof(ITowns) !== "undefined") {

            autoTownTypes = {};
            manuTownTypes = DATA.townTypes;
            population = {};

            sentUnitsArray = DATA.sentUnits;
            biriArray = DATA.biremes;

            spellbox = DATA.spellbox;
            commandbox = DATA.commandbox;
            tradebox = DATA.tradebox;

            wonder = DATA.worldWonder;
            wonderTypes = DATA.worldWonderTypes;

            var DIO_USER = {'name': uw.Game.player_name, 'market': MID};
            saveValue("dio_user", JSON.stringify(DIO_USER));


            $.Observer(uw.GameEvents.game.load).subscribe('DIO_START', function (e, data) {
                a();

                // English => default language
                if (!LANG[LID]) {
                    LID = "en";
                }

                if ((ch.length == 2) && exc && (sum == 42)) {
                    // AJAX-EVENTS
                    setTimeout(function () {
                        ajaxObserver();
                    }, 0);

                    addSettingsButton();

                    addFunctionToITowns();

                    if (DATA.options.tsk) {
                        setTimeout(function () {
                            minimizeDailyReward();
                            Taskbar.activate();
                        }, 0);
                    }

                    //addStatsButton();

                    fixUnitValues();

                    setTimeout(function () {

                        var waitCount = 0;

                        // No comment... it's Grepolis... i don't know... *rolleyes*
                        function waitForGrepoLazyLoading() {
                            if (typeof(ITowns.townGroups.getGroupsDIO()[-1]) !== "undefined" && typeof(ITowns.getTown(Game.townId).getBuildings) !== "undefined") {

                                try {
                                    // Funktion wird manchmal nicht ausgeführt:
                                    var units = ITowns.getTown(Game.townId).units();


                                    getAllUnits();

                                    setInterval(function () {
                                        getAllUnits();
                                    }, 900000); // 15min

                                    if (DATA.options.ava) {
                                        setTimeout(function () {
                                            AvailableUnits.activate();
                                        }, 0);
                                    }
                                    if (DATA.options.tic) {
                                        setTimeout(function () {
                                            TownIcons.activate();
                                        }, 0);
                                    }
                                    if (DATA.options.tim) {
                                        setTimeout(function () {
                                            TownIcons.Map.activate();
                                        }, 0);
                                    }
                                    if (DATA.options.til) {
                                        setTimeout(function () {
                                            TownList.activate();
                                        }, 0);
                                    }
                                } catch(e){
                                    if(waitCount < 12) {
                                        waitCount++;

                                        console.warn("DIO-Tools | Fehler | getAllUnits | units() fehlerhaft ausgeführt?", e);

                                        // Ausführung wiederholen
                                        setTimeout(function () {
                                            waitForGrepoLazyLoading();
                                        }, 5000); // 5s
                                    }
                                    else {
                                        errorHandling(e, "waitForGrepoLazyLoading2");
                                    }
                                }
                            }
                            else {
                                var e = { "stack": "getGroups() = " + typeof(ITowns.townGroups.getGroupsDIO()[-1]) + ", getBuildings() = " + typeof(ITowns.getTown(Game.townId).getBuildings) };

                                if(waitCount < 12) {
                                    waitCount++;

                                    console.warn("DIO-Tools | Fehler | getAllUnits | " + e.stack);

                                    // Ausführung wiederholen
                                    setTimeout(function () {
                                        waitForGrepoLazyLoading();
                                    }, 5000); // 5s
                                }
                                else {


                                    errorHandling(e, "waitForGrepoLazyLoading2");
                                }
                            }
                        }

                        waitForGrepoLazyLoading();

                    }, 0);

                    if (DATA.options.pop) {
                        setTimeout(function () {
                            FavorPopup.activate();
                        }, 0);
                    }
                    if (DATA.options.spl) {
                        setTimeout(function () {
                            Spellbox.activate();
                        }, 0);
                    }

                    imageSelectionProtection();

                    if (DATA.options.con) {
                        setTimeout(function () {
                            ContextMenu.activate();
                        }, 0);
                    }

                    if (DATA.options.act) {
                        setTimeout(function () {
                            ActivityBoxes.activate();
                        }, 0);
                    }

                    if (DATA.options.str) {
                        setTimeout(function () {
                            UnitStrength.Menu.activate();
                            hideNavElements();
                        }, 0);
                    }

                    if (DATA.options.tra) {
                        setTimeout(function () {
                            TransportCapacity.activate();
                        }, 0);
                    }

                    if (DATA.options.com) {
                        setTimeout(function () {
                            UnitComparison.activate();
                        }, 0);
                    }

                    if (DATA.options.sml) {
                        setTimeout(function () {
                            SmileyBox.activate();
                        }, 0);
                    }

                    if (DATA.options.irc) {
                        setTimeout(function () {
                            Chat.activate();
                        }, 0);
                    }

                    if (DATA.options.scr) {
                        setTimeout(function () {
                            MouseWheelZoom.activate();
                        }, 0);
                    }

                    if (DATA.options.sim) {
                        setTimeout(function () {
                            Simulator.activate();
                        }, 0);
                    }

                    if (DATA.options.sen) {
                        setTimeout(function () {
                            SentUnits.activate();
                        }, 0);
                    }

                    if (DATA.options.wwc) {
                        setTimeout(function () {
                            WorldWonderCalculator.activate();
                        }, 0);
                    }

                    if (PID === 84367 || PID === 104769 || PID === 1291505) {
                        setTimeout(function() {
                            PoliticalMap.activate();

                            //PoliticalMap.getAllianceColors();

                            //Statistics.activate();
                        }, 0);
                    }

                    setTimeout(function () {
                        counter(uw.Timestamp.server());
                        setInterval(function () {
                            counter(uw.Timestamp.server());
                        }, 21600000);
                    }, 60000);

                    // Notifications
                    setTimeout(function () {
                        Notification.init();
                    }, 0);

                    // setTimeout(function(){ HolidaySpecial.activate(); }, 0);


                    // Execute once to get the world wonder types and coordinates
                    setTimeout(function () {
                        if (!wonderTypes.great_pyramid_of_giza) {
                            getWorldWonderTypes();
                        }
                        if (wonderTypes.great_pyramid_of_giza) {
                            setTimeout(function () {
                                if (!wonder.map.mausoleum_of_halicarnassus) {
                                    getWorldWonders();
                                } else {
                                    if (DATA.options.wwi) {
                                        WorldWonderIcons.activate();
                                    }
                                }
                            }, 2000);
                        }
                    }, 3000);

                    // Execute once to get alliance ratio
                    if (wonder.ratio[AID] == -1 || !$.isNumeric(wonder.ratio[AID])) {
                        setTimeout(function () {
                            getPointRatioFromAllianceProfile();
                        }, 5000);
                    }
                }
                time_b = uw.Timestamp.client();
                //console.log("Gebrauchte Zeit:" + (time_b - time_a));
            });
        } else {
            setTimeout(function () {
                loadFeatures();
            }, 100);
        }
    }

    if (uw.location.pathname === "/game/index") {
        loadFeatures();
    }

    /*******************************************************************************************************************************
     * HTTP-Requests
     * *****************************************************************************************************************************/
    function ajaxObserver() {
        $(document).ajaxComplete(function (e, xhr, opt) {
            var url = opt.url.split("?"),
                action = url[0].substr(5) + "/" + url[1].split(/&/)[1].substr(7);
            if (PID == 84367 || PID == 104769) {
                console.log(action);
                //console.log((JSON.parse(xhr.responseText).json));
            }
            switch (action) {
                case "/frontend_bridge/fetch": // Daily Reward
                    //$('.daily_login').find(".minimize").click();
                    break;
                case "/player/index":
                    settings();
                    if (diosettings) {
                        $('#dio_tools').click();
                        diosettings = false;
                    }
                    break;
                case "/index/switch_town":
                    if (DATA.options.str) {
                        UnitStrength.Menu.update();
                    }
                    if (DATA.options.str) {
                        TransportCapacity.update();
                    }
                    if (DATA.options.bir) {
                        BiremeCounter.get();
                    }
                    if (DATA.options.tic) {
                        TownIcons.changeTownIcon();
                    }
                    break;
                case "/building_docks/index":
                    if (DATA.options.bir) {
                        BiremeCounter.getDocks();
                    }
                    break;
                case "/building_place/units_beyond":
                    if (DATA.options.bir) {
                        BiremeCounter.getAgora();
                    }
                    //addTransporterBackButtons();
                    break;
                case "/building_place/simulator":
                    if (DATA.options.sim) {
                        Simulator.change();
                    }
                    break;
                case "/building_place/simulate":
                    if (DATA.options.sim) {
                        afterSimulation();
                    }
                    break;

                case "/alliance_forum/forum":
                case "/message/new":
                case "/message/forward":
                case "/message/view":
                case "/player_memo/load_memo_content":
                    if (DATA.options.sml) {
                        SmileyBox.add(action);
                    }
                    if (DATA.options.bbc) {
                        addForm(action);
                    }
                    break;
                case "/wonders/index":
                    if (DATA.options.per) {
                        WWTradeHandler();
                    }
                    if (DATA.options.wwc) {
                        getResWW();
                    }
                    break;
                case "/wonders/send_resources":
                    if (DATA.options.wwc) {
                        getResWW();
                    }
                    break;
                case "/ranking/alliance":
                    getPointRatioFromAllianceRanking();
                    break;
                case "/ranking/wonder_alliance":
                    getPointRatioFromAllianceRanking();
                    if (DATA.options.wwr) {
                        WorldWonderRanking.change(JSON.parse(xhr.responseText).plain.html);
                    }
                    if (DATA.options.wwi) {
                        WorldWonderIcons.activate();
                    }
                    break;
                case "/alliance/members_show":
                    getPointRatioFromAllianceMembers();
                    break;
                case "/town_info/trading":
                    addTradeMarks(15, 18, 15, "red");
                    TownTabHandler(action.split("/")[2]);
                    break;
                case "/town_overviews/trade_overview":
                    addPercentTrade(1234, false); // TODO
                case "/farm_town_overviews/get_farm_towns_for_town":
                    changeResColor();
                    break;
                case "/command_info/conquest_info":
                    if (DATA.options.str) {
                        UnitStrength.Conquest.add();
                    }
                    break;
                case "/command_info/conquest_movements":
                case "/conquest_info/getinfo":
                    if (DATA.options.cnt) {
                        countMovements();
                    }
                    break;
                case "/building_barracks/index":
                case "/building_barracks/build":
                    if (DATA.options.str) {
                        UnitStrength.Barracks.add();
                    }
                    break;
                case "/town_info/attack":
                case "/town_info/support":
                    console.debug(JSON.parse(xhr.responseText));
                    TownTabHandler(action.split("/")[2]);

                    break;
                case "/report/index":
                    changeDropDownButton();
                    loadFilter();
                    saveFilter();
                    //removeReports();
                    break;
                case "/report/view":
                    Statistics.LuckCounter.count();
                    break;
                case "/message/default":
                case "/message/index":
                    break;
                case "/chat/init":
                    if (DATA.options.irc) {
                        Chat.open();
                    }
                    break;
                case "/town_info/go_to_town":
                    /*
                     //console.log(uw.Layout.wnd);
                     var windo = uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_TOWNINDEX).getID();
                     //console.log(uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_TOWNINDEX));
                     uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_TOWNINDEX).setPosition([100,400]);
                     //console.log(windo);
                     //console.log(uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_TOWNINDEX).getPosition());
                     */
                    break;
            }
        });
    }

    function test() {
        //http://gpde.innogamescdn.com/images/game/temp/island.png

        //console.log(uw.WMap);
        //console.log(uw.WMap.getSea(uw.WMap.getXCoord(), uw.WMap.getYCoord()));

        //console.log(uw.GameControllers.LayoutToolbarActivitiesController().prototype.getActivityTypes());
        //console.log(uw.GameViews);
        //console.log(uw.GameViews.BarracksUnitDetails());

        //console.log(uw.ITowns.getTown(uw.Game.townId).unitsOuter().sword);
        //console.log(uw.ITowns.getCurrentTown().unitsOuter().sword);

        //console.log(uw.ITowns.getTown(uw.Game.townId).researches().attributes);
        //console.log(uw.ITowns.getTown(uw.Game.townId).hasConqueror());
        //console.log(uw.ITowns.getTown(uw.Game.townId).allUnits());
        //console.log(uw.ITowns.all_units.fragments[uw.Game.townId]._byId);
        //console.log("Zeus: " + uw.ITowns.player_gods.zeus_favor_delta_property.lastTriggeredVirtualPropertyValue);
        //console.log(uw.ITowns.player_gods.attributes);

        //console.log(uw.ITowns.getTown('5813').createTownLink());
        //console.log(uw.ITowns.getTown(5813).unitsOuterTown);

        //console.log(uw.ITowns.getTown(uw.Game.townId).getLinkFragment());

        //console.log(uw.ITowns.getTown(uw.Game.townId).allGodsFavors());
    }

    /*******************************************************************************************************************************
     * Helping functions
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● fixUnitValues: Get unit values and overwrite some wrong values
     * | ● getMaxZIndex: Get the highest z-index of "ui-dialog"-class elements
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/

    // Fix buggy grepolis values
    function fixUnitValues() {
        //uw.GameData.units.small_transporter.attack = uw.GameData.units.big_transporter.attack = uw.GameData.units.demolition_ship.attack = uw.GameData.units.militia.attack = 0;
        //uw.GameData.units.small_transporter.defense = uw.GameData.units.big_transporter.defense = uw.GameData.units.demolition_ship.defense = uw.GameData.units.colonize_ship.defense = 0;
        uw.GameData.units.militia.resources = {wood: 0, stone: 0, iron: 0};
    }

    function getMaxZIndex() {
        var maxZ = Math.max.apply(null, $.map($("div[class^='ui-dialog']"), function (e, n) {
            if ($(e).css('position') == 'absolute') {
                return parseInt($(e).css('z-index'), 10) || 1000;
            }
        }));
        return (maxZ !== -Infinity) ? maxZ + 1 : 1000;
    }

    function getBrowser() {
        var ua = navigator.userAgent,
            tem,
            M = ua.match(/(opera|maxthon|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
        if (/trident/i.test(M[1])) {
            tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
            M[1] = 'IE';
            M[2] = tem[1] || '';
        }
        if (M[1] === 'Chrome') {
            tem = ua.match(/\bOPR\/(\d+)/);
            if (tem !== null) {
                M[1] = 'Opera';
                M[2] = tem[1];
            }
        }
        M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
        if ((tem = ua.match(/version\/(\d+)/i)) !== null) M.splice(1, 1, tem[1]);

        return M.join(' ');
    }

    // Error Handling / Remote diagnosis / Automatic bug reports
    function errorHandling(e, fn) {
        if (PID == 84367 || PID == 104769 || PID === 1291505) {
            HumanMessage.error("DIO-TOOLS(" + version + ")-ERROR: " + e.message);
            console.log("DIO-TOOLS | Error-Stack | ", e.stack);
        } else {
            if (!DATA.error[version]) {
                DATA.error[version] = {};
            }

            if (DATA.options.err && !DATA.error[version][fn]) {
                $.ajax({
                    type: "POST",
                    url: "https://diotools.de/game/error.php",
                    data: {error: e.stack.replace(/'/g, '"'), "function": fn, browser: getBrowser(), version: version},
                    success: function (text) {
                        DATA.error[version][fn] = true;
                        saveValue("error", JSON.stringify(DATA.error));
                    }
                });
            }
        }
    }

    function createWindowType(name, title, width, height, minimizable, position) {
        $('<style id="dio_window">' +
            '.dio_title_img { height:18px; float:left; margin-right:3px; } ' +
            '.dio_title { margin:1px 6px 13px 23px; color:rgb(126,223,126); } ' +
            '</style>').appendTo('head');

        // Create Window Type
        function WndHandler(wndhandle) {
            this.wnd = wndhandle;
        }

        Function.prototype.inherits.call(WndHandler, WndHandlerDefault);
        WndHandler.prototype.getDefaultWindowOptions = function () {
            return {
                position: position,
                width: width,
                height: height,
                minimizable: minimizable,
                title: "<img class='dio_title_img' src='http://666kb.com/i/cifvfsu3e2sdiipn0.gif' /><div class='dio_title'>" + title + "</div>"
            };
        };
        GPWindowMgr.addWndType(name, "", WndHandler, 1);
    }

    // Notification
    var Notification = {
        init: function () {
            // NotificationType
            NotificationType.DIO_TOOLS = "diotools";

            // Style
            $('<style id="dio_notification" type="text/css">' +
                '#notification_area .diotools .icon { background: url(http://666kb.com/i/cifvfsu3e2sdiipn0.gif) 4px 7px no-repeat !important;} ' +
                '#notification_area .diotools { cursor:pointer; } ' +
                '</style>').appendTo('head');

            var notif = DATA.notification;
            if (notif <= 7) {
                //Notification.create(1, 'Swap context menu buttons ("Select town" and "City overview")');
                //Notification.create(2, 'Town overview (old window mode)');
                //Notification.create(3, 'Mouse wheel: You can change the views with the mouse wheel');
                //Notification.create(4, 'Town icons on the strategic map');
                //Notification.create(5, 'Percentual unit population in the town list');
                //Notification.create(6, 'New world wonder ranking');
                //Notification.create(7, 'World wonder icons on the strategic map');

                // Click Event
                $('.diotools .icon').click(function () {
                    openSettings();
                    $(this).parent().find(".close").click();
                });

                saveValue('notif', '8');
            }
        },
        create: function (nid, feature) {
            var Notification = new NotificationHandler();
            Notification.notify($('#notification_area>.notification').length + 1, uw.NotificationType.DIO_TOOLS,
                "<span style='color:rgb(8, 207, 0)'><b><u>New Feature!</u></b></span>" + feature + "<span class='small notification_date'>DIO-Tools: v" + version + "</span>");
        }
    };

    /*******************************************************************************************************************************
     * Mousewheel Zoom
     *******************************************************************************************************************************/

    var MouseWheelZoom = {
        // Scroll trough the views
        activate: function () {
            $('#main_area, #dio_political_map, .viewport, .sjs-city-overview-viewport').bind('mousewheel', function (e) {
                e.stopPropagation();
                var current = $('.bull_eye_buttons .checked').get(0).getAttribute("name"), delta = 0, scroll, sub_scroll = 6;

                switch (current) {
                    case 'political_map':
                        scroll = 4;
                        break;
                    case 'strategic_map':
                        scroll = 3;
                        break;
                    case 'island_view':
                        scroll = 2;
                        break;
                    case 'city_overview':
                        scroll = 1;
                        break;
                }
                delta = -e.originalEvent.detail || e.originalEvent.wheelDelta; // Firefox || Chrome & Opera

                //console.debug("cursor_pos", e.pageX, e.pageY);

                if (scroll !== 4) {
                    if (delta < 0) {
                        scroll += 1;
                    } else {
                        scroll -= 1;
                    }
                } else {
                    // Zoomstufen bei der Politischen Karte
                    sub_scroll = $('.zoom_select').get(0).selectedIndex;

                    if (delta < 0) {
                        sub_scroll -= 1;
                    } else {
                        sub_scroll += 1;
                    }
                    if (sub_scroll === -1) {
                        sub_scroll = 0;
                    }
                    if (sub_scroll === 7) {
                        scroll = 3;
                    }
                }
                switch (scroll) {
                    case 4:
                        if (!$('.bull_eye_buttons .btn_political_map').hasClass("checked")) {
                            $('.bull_eye_buttons .btn_political_map').click();
                        }

                        // onChange wird aufgerufen, wenn sich die Selektierung ändert
                        //$('.zoom_select option').eq(sub_scroll).prop('selected', true);
                        $('.zoom_select').get(0)[sub_scroll].selected = true;
                        //$('.zoom_select').get(0).change();
                        //$('.zoom_select').get(0).val(sub_scroll);


                        PoliticalMap.zoomToCenter();
                        //PoliticalMap.zoomToCenterToCursorPosition($('.zoom_select').get(0)[sub_scroll].value, [e.pageX, e.pageY]);

                        break;
                    case 3:
                        $('.bull_eye_buttons .strategic_map').click();
                        $('#popup_div').css('display', 'none');
                        break;
                    case 2:
                        $('.bull_eye_buttons .island_view').click();
                        break;
                    case 1:
                        $('.bull_eye_buttons .city_overview').click();
                        break;
                }

                // Prevent page from scrolling
                return false;
            });
        },
        deactivate: function () {
            $('#main_area, .ui_city_overview').unbind('mousewheel');
        }
    };


    /*******************************************************************************************************************************
     * Statistics
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Expansion of towns?
     * | ● Occupancy of the farms?
     * | ● Mouseclick-Counter?
     * | ● Resource distribution (%)?
     * | ● Building level counter ?
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/
    //$('<script src="https://github.com/mbostock/d3/blob/master/d3.js"></script>').appendTo("head");
    // http://mbostock.github.com/d3/d3.v2.js
    var Statistics = {
        activate: function () {
            Statistics.addButton();

            $('<style id="dio_statistic">' +
                'path { stroke: steelblue; stroke-width: 1; fill: none; } ' +
                '.axis { shape-rendering: crispEdges; } ' +
                '.x.axis line { stroke: lightgrey; } ' +
                '.x.axis .minor { stroke-opacity: .5; } ' +
                '.x.axis path { display: none; } ' +
                '.y.axis line, .y.axis path { fill: none; stroke: #000; } ' +
                '</style>').appendTo('head');

            Statistics.ClickCounter.activate();

            // Create Window Type
            createWindowType("DIO_STATISTICS", "Statistics", 300, 250, true, ["center", "center", 100, 100]);
        },
        deactivate: function () {
            $('#dio_statistic_button').remove();
            $('#dio_statistic').remove();
            Statistics.ClickCounter.deactivate();
        },
        addButton: function () {
            $('<div id="dio_statistic_button" class="circle_button"><div class="ico_statistics js-caption"></div></div>').appendTo(".gods_area");

            // Style
            $('<style id="dio_statistic_style">' +
                '#dio_statistic_button { top:56px; left:-4px; z-index:10; position:absolute; } ' +

                '#dio_statistic_button .ico_statistics { margin:7px 0px 0px 8px; width:17px; height:17px; background:url(http://s1.directupload.net/images/140408/pltgqlaw.png) no-repeat 0px 0px; background-size:100%; } ' +
                    // http://s14.directupload.net/images/140408/k4wikrlq.png // http://s7.directupload.net/images/140408/ahfr8227.png
                '#dio_statistic_button .ico_statistics.checked { margin-top:8px; } ' +
                '</style>').appendTo('head');

            // Tooltip
            $('#dio_statistic_button').tooltip(getText("labels", "uni")); // TODO

            // Events
            $('#dio_statistic_button').on('mousedown', function () {
                $('#dio_statistic_button, .ico_statistics').addClass("checked");
            }).on('mouseup', function () {
                $('#dio_statistic_button, .ico_statistics').removeClass("checked");
            });

            $('#dio_statistic_button').click(function () {
                if (!Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_STATISTICS)) {
                    Statistics.openWindow();
                    $('#dio_statistic_button, .ico_statistics').addClass("checked");
                } else {
                    Statistics.closeWindow();
                    $('#dio_statistic_button, .ico_statistics').removeClass("checked");
                }
            });
        },
        openWindow: function () {
            var content =
                '<div id="dio_mouseclicks" style="margin-bottom:5px; font-style:italic;">' +
                '<span style="text-decoration:underline;">Insgesamt:</span> <span></span>' +
                '<span style="float:right;"></span><span style="text-decoration:underline;float:right;">Heute:</span> ' +
                '</div><canvas id="dio_graph" width="290" height="150" style="margin-top:15px;"></canvas>';

            Layout.wnd.Create(GPWindowMgr.TYPE_DIO_STATISTICS).setContent(content);

            Statistics.ClickCounter.onOpenWindow();

            // Draw diagram
            var graph, xPadding = 35, yPadding = 25;

            var data = {values: [{X: "Jan", Y: 0}]};

            console.log(DATA.clickCount);
            for (var o in DATA.clickCount) {
                data.values.push({X: "opp", Y: DATA.clickCount[o]});
            }

            function getMaxY() {
                var max = 0;
                for (var i = 0; i < data.values.length; i++) {
                    if (data.values[i].Y > max) {
                        max = data.values[i].Y;
                    }
                }
                max += 10 - max % 10;
                return max + 10;
            }

            function getXPixel(val) {
                return ((graph.width() - xPadding) / data.values.length) * val + (xPadding + 10);
            }

            function getYPixel(val) {
                return graph.height() - (((graph.height() - yPadding) / getMaxY()) * val) - yPadding;
            }

            graph = $('#dio_graph');
            var c = graph[0].getContext('2d');

            c.lineWidth = 2;
            c.strokeStyle = '#333';
            c.font = 'italic 8pt sans-serif';
            c.textAlign = "center";

            // Axis
            c.beginPath();
            c.moveTo(xPadding, 0);
            c.lineTo(xPadding, graph.height() - yPadding);
            c.lineTo(graph.width(), graph.height() - yPadding);
            c.stroke();

            // X-Axis caption
            for (var x = 0; x < data.values.length; x++) {
                c.fillText(data.values[x].X, getXPixel(x), graph.height() - yPadding + 20);
            }

            // Y-Axis caption
            c.textAlign = "right";
            c.textBaseline = "middle";

            var maxY = getMaxY(), maxYscala = Math.ceil(maxY / 1000) * 1000;
            console.log(maxY);
            for (var y = 0; y < maxY; y += maxYscala / 10) {
                c.fillText(y, xPadding - 10, getYPixel(y));
            }

            // Graph
            c.strokeStyle = 'rgb(0,150,0)';
            c.beginPath();
            c.moveTo(getXPixel(0), getYPixel(data.values[0].Y));

            for (var i = 1; i < data.values.length; i++) {
                c.lineTo(getXPixel(i), getYPixel(data.values[i].Y));
            }
            c.stroke();

            // Points
            c.fillStyle = '#333';

            for (var p = 0; p < data.values.length; p++) {
                c.beginPath();
                c.arc(getXPixel(p), getYPixel(data.values[p].Y), 2, 0, Math.PI * 2, true);
                c.fill();
            }
        },
        closeWindow: function () {
            Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_STATISTICS).close();
        },

        ClickCounter: {
            today: "00000000",
            activate: function () {
                Statistics.ClickCounter.updateDate();

                $(document).on("mousedown", function () {
                    DATA.clickCount[Statistics.ClickCounter.today]++;
                });

                window.onbeforeunload = function () {
                    Statistics.ClickCounter.save();
                };

                // TODO: Update date
                setTimeout(function () {
                    Statistics.ClickCounter.updateDate();
                }, 0);
            },
            deactivate: function () {
                $(document).off("mousedown");
            },
            save: function () {
                saveValue(WID + "_click_count", JSON.stringify(DATA.clickCount));
            },
            updateDate: function () {
                var today = new Date((window.Timestamp.server() + 7200) * 1000);

                Statistics.ClickCounter.today = today.getUTCFullYear() + ((today.getUTCMonth() + 1) < 10 ? "0" : "") + (today.getUTCMonth() + 1) + (today.getUTCDate() < 10 ? "0" : "") + today.getUTCDate();

                DATA.clickCount[Statistics.ClickCounter.today] = DATA.clickCount[Statistics.ClickCounter.today] || 0;
            },
            onOpenWindow: function () {
                $('#dio_mouseclicks span:eq(2)').get(0).innerHTML = DATA.clickCount[Statistics.ClickCounter.today];
                $(document).off("mousedown");
                $(document).on("mousedown", function () {
                    if ($('#dio_mouseclicks').get(0)) {
                        $('#dio_mouseclicks span:eq(2)').get(0).innerHTML = ++DATA.clickCount[Statistics.ClickCounter.today];
                    } else {
                        DATA.clickCount[Statistics.ClickCounter.today]++;
                        $(document).off("mousedown");
                        $(document).on("mousedown", function () {
                            DATA.clickCount[Statistics.ClickCounter.today]++;
                        });
                    }
                });
            }
        },
        LuckCounter: {
            luckArray: {},
            count: function () {
                if ($('.fight_bonus.luck').get(0)) {
                    var report_id = $('#report_report_header .game_arrow_delete').attr("onclick").split(",")[1].split(")")[0].trim(),
                        luck = parseInt($('.fight_bonus.luck').get(0).innerHTML.split(":")[1].split("%")[0].trim(), 10);

                    Statistics.LuckCounter.luckArray[report_id] = luck;

                    console.log(Statistics.LuckCounter.calcAverage());
                }
            },
            calcAverage: function () {
                var sum = 0, count = 0;
                for (var report_id in Statistics.LuckCounter.luckArray) {
                    if (Statistics.LuckCounter.luckArray.hasOwnProperty(report_id)) {
                        sum += parseInt(Statistics.LuckCounter.luckArray[report_id], 10);
                        count++;
                    }
                }
                return (parseFloat(sum) / parseFloat(count));
            }
        }
    };

    /*******************************************************************************************************************************
     * Body Handler
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Town icon
     * | ● Town list: Adds town type to the town list
     * | ● Swap Context Icons
     * | ● City overview
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/

    function imageSelectionProtection() {
        $('<style id="dio_image_selection" type="text/css"> img { -moz-user-select: -moz-none; -khtml-user-select: none; -webkit-user-select: none;} </style>').appendTo('head');
    }

    var worldWonderIcon = {
        colossus_of_rhodes: "url(https://gpall.innogamescdn.com/images/game/map/wonder_colossus_of_rhodes.png) 38px -1px;",
        great_pyramid_of_giza: "url(https://gpall.innogamescdn.com/images/game/map/wonder_great_pyramid_of_giza.png) 34px -6px;",
        hanging_gardens_of_babylon: "url(https://gpall.innogamescdn.com/images/game/map/wonder_hanging_gardens_of_babylon.png) 34px -5px;",
        lighthouse_of_alexandria: "url(https://gpall.innogamescdn.com/images/game/map/wonder_lighthouse_of_alexandria.png) 37px -1px;",
        mausoleum_of_halicarnassus: "url(https://gpall.innogamescdn.com/images/game/map/wonder_mausoleum_of_halicarnassus.png) 37px -4px;",
        statue_of_zeus_at_olympia: "url(https://gpall.innogamescdn.com/images/game/map/wonder_statue_of_zeus_at_olympia.png) 36px -3px;",
        temple_of_artemis_at_ephesus: "url(https://gpall.innogamescdn.com/images/game/map/wonder_temple_of_artemis_at_ephesus.png) 34px -5px;"
    };

    var WorldWonderIcons = {
        activate: function () {
            try {
                if (!$('#dio_wondericons').get(0)) {
                    var color = "orange";

                    // style for world wonder icons
                    var style_str = "<style id='dio_wondericons' type='text/css'>";
                    for (var ww_type in wonder.map) {
                        if (wonder.map.hasOwnProperty(ww_type)) {
                            for (var ww in wonder.map[ww_type]) {
                                if (wonder.map[ww_type].hasOwnProperty(ww)) {
                                    /*
                                     if(wonder.map[ww_type][ww] !== AID){
                                     color = "rgb(192, 109, 54)";
                                     } else {
                                     color = "orange";
                                     }
                                     */
                                    style_str += "#mini_i" + ww + ":before {" +
                                        "content: '';" +
                                        "background:" + color + " " + worldWonderIcon[ww_type] +
                                        "background-size: auto 97%;" +
                                        "padding: 8px 16px;" +
                                        "top: 50px;" +
                                        "position: relative;" +
                                        "border-radius: 40px;" +
                                        "z-index: 200;" +
                                        "cursor: pointer;" +
                                        "box-shadow: 1px 1px 0px rgba(0, 0, 0, 0.5);" +
                                        "border: 2px solid green; } " +
                                        "#mini_i" + ww + ":hover:before { z-index: 201; " +
                                        "filter: url(#Brightness12);" +
                                        "-webkit-filter: brightness(1.2); } ";
                                }
                            }
                        }
                    }
                    $(style_str + "</style>").appendTo('head');

                    // Context menu on mouseclick
                    $('#minimap_islands_layer').on('click', '.m_island', function (e) {
                        var ww_coords = this.id.split("i")[3].split("_");
                        uw.Layout.contextMenu(e, 'wonder', {ix: ww_coords[0], iy: ww_coords[1]});
                    });


                }
            } catch (error) {
                errorHandling(error, "setWonderIconsOnMap");
            }
        },
        deactivate: function () {
            $('#dio_wondericons').remove();
        }
    };

    var TownIcons = {
        types: {
            // Automatic Icons
            lo: 0,
            ld: 3,
            so: 6,
            sd: 7,
            fo: 10,
            fd: 9,
            bu: 14, /* Building */
            po: 22,
            no: 12,

            // Manual Icons
            fa: 20, /* Favor */
            re: 15, /* Resources */
            di: 2, /* Distance */
            sh: 1, /* Pierce */
            lu: 13, /* ?? */
            dp: 11, /* Diplomacy */
            ha: 15, /* ? */
            si: 18, /* Silber */
            ra: 17,
            ch: 19, /* Research */
            ti: 23, /* Time */
            un: 5,
            wd: 16, /* Wood */
            wo: 24, /* World */
            bo: 13, /* Booty */
            gr: 21, /* Lorbeer */
            st: 17, /* Stone */
            is: 26, /* ?? */
            he: 4, /* Helmet */
            ko: 8 /* Kolo */

        },
        deactivate: function () {
            $('#town_icon').remove();
            $('#dio_townicons_field').remove();
        },
        activate: function () {
            try {
                $('<div id="town_icon"><div class="town_icon_bg"><div class="icon_big townicon_' +
                    (manuTownTypes[uw.Game.townId] || ((autoTownTypes[uw.Game.townId] || "no") + " auto")) + '"></div></div></div>').appendTo('.town_name_area');

                // Town Icon Style
                $('#town_icon .icon_big').css({
                    backgroundPosition: TownIcons.types[(manuTownTypes[uw.Game.townId] || ((autoTownTypes[uw.Game.townId] || "no")))] * -25 + 'px 0px'
                });
                console.debug(dio_sprite);
                $('<style id="dio_townicons_field" type="text/css">' +
                    '#town_icon { background:url(' + dio_sprite + ') 0 -125px no-repeat; position:absolute; width:69px; height:61px; left:-47px; top:0px; z-index: 10; } ' +
                    '#town_icon .town_icon_bg { background:url(' + dio_sprite + ') -76px -129px no-repeat; width:43px; height:43px; left:25px; top:4px; cursor:pointer; position: relative; } ' +
                    '#town_icon .town_icon_bg:hover { filter:url(#Brightness11); -webkit-filter:brightness(1.1); box-shadow: 0px 0px 15px rgb(1, 197, 33); } ' +
                    '#town_icon .icon_big	{ position:absolute; left:9px; top:9px; height:25px; width:25px; } ' +

                    '#town_icon .select_town_icon {position: absolute; top:47px; left:23px; width:145px; display:none; padding:2px; border:3px inset rgb(7, 99, 12); box-shadow:rgba(0, 0, 0, 0.5) 4px 4px 6px; border-radius:0px 10px 10px 10px;' +
                    'background:url(https://gpall.innogamescdn.com/images/game/popup/middle_middle.png); } ' +
                    '#town_icon .item-list { max-height:400px; max-width:200px; align:right; overflow-x:hidden; } ' +

                    '#town_icon .option_s { cursor:pointer; width:20px; height:20px; margin:0px; padding:2px 2px 3px 3px; border:2px solid rgba(0,0,0,0); border-radius:5px; background-origin:content-box; background-clip:content-box;} ' +
                    '#town_icon .option_s:hover { border: 2px solid rgb(59, 121, 81) !important;-webkit-filter: brightness(1.3); } ' +
                    '#town_icon .sel { border: 2px solid rgb(202, 176, 109); } ' +
                    '#town_icon hr { width:145px; margin:0px 0px 7px 0px; position:relative; top:3px; border:0px; border-top:2px dotted #000; float:left} ' +
                    '#town_icon .auto_s { width:136px; height:16px; float:left} ' +

                        // Quickbar modification
                    '.ui_quickbar .left, .ui_quickbar .right { width:46%; } ' +

                        // because of Kapsonfires Script and Beta Worlds bug report bar:
                    '.town_name_area { z-index:11; left:52%; } ' +
                    '.town_name_area .left { z-index:20; left:-39px; } ' +
                    '</style>').appendTo('head');


                var icoArray = ['ld', 'lo', 'sh', 'di', 'un',
                    'sd', 'so', 'ko', 'ti', 'gr',
                    'fd', 'fo', 'dp', 'no', 'po',
                    're', 'wd', 'st', 'si', 'bu',
                    'he', 'ch', 'bo', 'fa', 'wo'];

                // Fill select box with town icons
                $('<div class="select_town_icon dropdown-list default active"><div class="item-list"></div></div>').appendTo("#town_icon");
                for (var i in icoArray) {
                    if (icoArray.hasOwnProperty(i)) {
                        $('.select_town_icon .item-list').append('<div class="option_s icon_small townicon_' + icoArray[i] + '" name="' + icoArray[i] + '"></div>');
                    }
                }
                $('<hr><div class="option_s auto_s" name="auto"><b>Auto</b></div>').appendTo('.select_town_icon .item-list');

                $('#town_icon .option_s').click(function () {
                    $("#town_icon .sel").removeClass("sel");
                    $(this).addClass("sel");

                    if ($(this).attr("name") === "auto") {
                        delete manuTownTypes[uw.Game.townId];
                    } else {
                        manuTownTypes[uw.Game.townId] = $(this).attr("name");
                    }
                    TownIcons.changeTownIcon();

                    // Update town icons on the map
                    TownIcons.Map.activate(); //setOnMap();

                    saveValue(WID + "_townTypes", JSON.stringify(manuTownTypes));
                });

                // Show & hide drop menus on click
                $('#town_icon .town_icon_bg').click(function () {
                    var el = $('#town_icon .select_town_icon').get(0);
                    if (el.style.display === "none") {
                        el.style.display = "block";
                    } else {
                        el.style.display = "none";
                    }
                });

                $('#town_icon .select_town_icon [name="' + (manuTownTypes[uw.Game.townId] || (autoTownTypes[uw.Game.townId] ? "auto" : "" )) + '"]').addClass("sel");

            } catch (error) {
                errorHandling(error, "addTownIcon");
            }
        },
        changeTownIcon: function () {
            var townType = (manuTownTypes[uw.Game.townId] || ((autoTownTypes[uw.Game.townId] || "no")));
            $('#town_icon .icon_big').removeClass().addClass('icon_big townicon_' + townType + " auto");
            $('#town_icon .sel').removeClass("sel");
            $('#town_icon .select_town_icon [name="' + (manuTownTypes[uw.Game.townId] || (autoTownTypes[uw.Game.townId] ? "auto" : "" )) + '"]').addClass("sel");

            $('#town_icon .icon_big').css({
                backgroundPosition: TownIcons.types[townType] * -25 + 'px 0px'
            });

            $('#town_icon .select_town_icon').get(0).style.display = "none";
        },
        Map: {
            activate: function () {
                try {
                    // if town icon changed
                    if ($('#dio_townicons_map').get(0)) {
                        $('#dio_townicons_map').remove();
                    }

                    // style for own towns (town icons)
                    var start = (new Date()).getTime(), end, style_str = "<style id='dio_townicons_map' type='text/css'>";
                    for (var e in autoTownTypes) {
                        if (autoTownTypes.hasOwnProperty(e)) {
                            style_str += "#mini_t" + e + " { height: 19px;" +
                                "width:19px;" +
                                "border-radius: 11px;" +
                                "border: 2px solid rgb(16, 133, 0);" +
                                "margin: -4px;" +
                                    //"background: rgb(255, 187, 0) url(http://s7.directupload.net/images/140404/xt839us6.png) repeat;"+
                                "background: rgb(255, 187, 0) url(" + dio_sprite + ") " + (TownIcons.types[(manuTownTypes[e] || autoTownTypes[e])] * -25) + "px -27px repeat;" +
                                "z-index: 100;" +
                                "font-size: 0em;" +
                                "cursor: pointer;" +
                                (Game.night_mode ? "filter:url(#Brightness07); -webkit-filter: brightness(0.7);" : " ") +
                                "box-shadow: 1px 1px 0px rgba(0, 0, 0, 0.5);} " +
                                    // Mouseover Style
                                "#mini_t" + e + ":hover { z-index: 101; " +
                                (Game.night_mode ? "filter:none; -webkit-filter: none;" : "filter: url(#Brightness12); -webkit-filter: brightness(1.2);") +
                                "} ";
                        }
                    }
                    // Context menu on mouseclick
                    $('#minimap_islands_layer').on('click', '.m_town', function (z) {
                        var id = parseInt(this.id.substring(6), 10);
                        Layout.contextMenu(z, 'determine', {"id": id, "name": uw.ITowns.getTown(id).name});

                        z.stopPropagation(); // prevent parent world wonder event
                    });

                    // Style for foreign cities (shadow)
                    style_str += "#minimap_islands_layer .m_town { text-shadow: 1px 1px 0px rgba(0, 0, 0, 0.7); } ";

                    // Style for night mode
                    style_str += "#minimap { z-index: auto } ";

                    style_str += "</style>";
                    $(style_str).appendTo('head');

                    // Test:
                    $.Observer(GameEvents.game.night).subscribe('DIO_SWITCH_NIGHT', function (o) {
                        console.log("Switch Night: " + Timestamp.serverTime());
                        console.log(o);
                    });


                    /*
                     setTimeout(function(){
                     uw.MapTiles.createTownDiv_old = uw.MapTiles.createTownDiv;

                     uw.MapTiles.createTownDiv = function(town, player_current_town) {
                     var ret = uw.MapTiles.createTownDiv_old(town, player_current_town);

                     if(!isNaN(town.id) && town.player_id == PID) {

                     //setIconMap(town.id);
                     console.log(town.id);
                     console.log(player_current_town);
                     }
                     return ret;
                     };
                     },2000);
                     */
                } catch (error) {
                    errorHandling(error, "TownIcons.Map.activate");
                }
            },
            deactivate: function () {
                $('#dio_townicons_map').remove();

                $('#minimap_islands_layer').off('click');
            }
        }
    };

    // Style for town icons
    var style_str = '<style id="dio_townicons" type="text/css">';
    for (var s in TownIcons.types) {
        if (TownIcons.types.hasOwnProperty(s)) {
            style_str += '.townicon_' + s + ' { background:url(' + dio_sprite + ') ' + (TownIcons.types[s] * -25) + 'px -26px repeat;float:left;} ';
        }
    }
    style_str += '</style>';
    $(style_str).appendTo('head');


    var ContextMenu = {
        activate: function () {
            // Set context menu event handler
            $.Observer(uw.GameEvents.map.context_menu.click).subscribe('DIO_CONTEXT', function (e, data) {
                if (DATA.options.con && $('#context_menu').children().length == 4) {
                    // Clear animation
                    $('#context_menu div#goToTown').css({
                        left: '0px',
                        top: '0px',
                        WebkitAnimation: 'none', //'A 0s linear',
                        animation: 'none' //'B 0s linear'
                    });
                }
                // Replace german label of 'select town' button
                if (LID === "de" && $('#select_town').get(0)) {
                    $("#select_town .caption").get(0).innerHTML = "Selektieren";
                }
            });

            // Set context menu animation
            $('<style id="dio_context_menu" type="text/css">' +
                    // set fixed position of 'select town' button
                '#select_town { left: 0px !important; top: 0px !important; z-index: 6; } ' +
                    // set animation of 'goToTown' button
                '#context_menu div#goToTown { left: 30px; top: -51px; ' +
                '-webkit-animation: A 0.115s linear; animation: B 0.2s;} ' +
                '@-webkit-keyframes A { from {left: 0px; top: 0px;} to {left: 30px; top: -51px;} }' +
                '@keyframes B { from {left: 0px; top: 0px;} to {left: 30px; top: -51px;} }' +
                '</style>').appendTo('head');
        },
        deactivate: function () {
            $.Observer(uw.GameEvents.map.context_menu.click).unsubscribe('DIO_CONTEXT');

            $('#dio_context_menu').remove();
        }
    };


    var TownList = {
        activate: function () {
            // Style town list
            $('<style id="dio_town_list" type="text/css">' +
                '#town_groups_list .item { text-align: left; padding-left:35px; } ' +
                '#town_groups_list .inner_column { border: 1px solid rgba(100, 100, 0, 0.3);margin: -2px 0px 0px 2px; } ' +
                '#town_groups_list .island_quest_icon { background-size: 90%; position: absolute; right: 37px; top: 4px; } ' +
                '#town_groups_list .island_quest_icon.hidden { display:none; } ' +
                    // Quacks Zentrier-Button verschieben
                '#town_groups_list .jump_town { right: 37px !important; } ' +
                    // Population percentage
                '#town_groups_list .pop_percent { position: absolute; right: 7px; top:0px; font-size: 0.7em; display:block !important;} ' +
                '#town_groups_list .full { color: green; } ' +
                '#town_groups_list .threequarter { color: darkgoldenrod; } ' +
                '#town_groups_list .half { color: darkred; } ' +
                '#town_groups_list .quarter { color: red; } ' +
                '</style>').appendTo('head');


            // Open town list: hook to grepolis function render()
            var i = 0;
            while (uw.layout_main_controller.sub_controllers[i].name != 'town_name_area') {
                i++;
            }

            uw.layout_main_controller.sub_controllers[i].controller.town_groups_list_view.render_old = uw.layout_main_controller.sub_controllers[i].controller.town_groups_list_view.render;

            uw.layout_main_controller.sub_controllers[i].controller.town_groups_list_view.render = function () {
                uw.layout_main_controller.sub_controllers[i].controller.town_groups_list_view.render_old();
                TownList.change();
            };

            // Town List open?
            if ($('#town_groups_list').get(0)) {
                TownList.change();
            }
        },
        deactivate: function () {
            var i = 0;
            while (uw.layout_main_controller.sub_controllers[i].name != 'town_name_area') {
                i++;
            }

            layout_main_controller.sub_controllers[i].controller.town_groups_list_view.render = layout_main_controller.sub_controllers[i].controller.town_groups_list_view.render_old;

            $('#dio_town_list').remove();

            $('#town_groups_list .small_icon, #town_groups_list .pop_percent').css({display: 'none'});

            //$.Observer(uw.GameEvents.town.town_switch).unsubscribe('DIO_SWITCH_TOWN');

            $("#town_groups_list .town_group_town").unbind('mouseenter mouseleave');
        },
        change: function () {
            if (!$('#town_groups_list .icon_small').get(0) && !$('#town_groups_list .pop_percent').get(0)) {
                $("#town_groups_list .town_group_town").each(function () {
                    try {
                        var town_item = $(this), town_id = town_item.attr('name'), townicon_div, percent_div = "", percent = -1, pop_space = "full";

                        if (population[town_id]) {
                            percent = population[town_id].percent;
                        }
                        if (percent < 75) {
                            pop_space = "threequarter";
                        }
                        if (percent < 50) {
                            pop_space = "half";
                        }
                        if (percent < 25) {
                            pop_space = "quarter";
                        }

                        if (!town_item.find('icon_small').length) {
                            townicon_div = '<div class="icon_small townicon_' + (manuTownTypes[town_id] || autoTownTypes[town_id] || "no") + '"></div>';
                            // TODO: Notlösung...
                            if (percent != -1) {
                                percent_div = '<div class="pop_percent ' + pop_space + '">' + percent + '%</div>';
                            }
                            town_item.prepend(townicon_div + percent_div);
                        }

                        // opening context menu
                        /*
                         $(this).click(function(e){
                         console.log(e);
                         uw.Layout.contextMenu(e, 'determine', {"id": town_id,"name": uw.ITowns[town_id].getName()});
                         });
                         */

                    } catch (error) {
                        errorHandling(error, "TownList.change");
                    }
                });

            }

            // Hover Effect for Quacks Tool:
            $("#town_groups_list .town_group_town").hover(function () {
                $(this).find('.island_quest_icon').addClass("hidden");
            }, function () {
                $(this).find('.island_quest_icon').removeClass("hidden");
            });

            // Add change town list event handler
            //$.Observer(uw.GameEvents.town.town_switch).subscribe('DIO_SWITCH_TOWN', function () {
            //TownList.change();
            //});
        }
    };

    /*******************************************************************************************************************************
     * Available units
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● GetAllUnits
     * | ● Shows all available units
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/
    var groupUnitArray = {};
    // TODO: split Function (getUnits, calcUnitsSum, availableUnits, countBiremes, getTownTypes)?
    function getAllUnits() {
        try {
            var townArray = uw.ITowns.getTowns(), groupArray = uw.ITowns.townGroups.getGroupsDIO(),

                unitArray = {
                    "sword": 0,
                    "archer": 0,
                    "hoplite": 0,
                    "chariot": 0,
                    "godsent": 0,
                    "rider": 0,
                    "slinger": 0,
                    "catapult": 0,
                    "small_transporter": 0,
                    "big_transporter": 0,
                    "manticore": 0,
                    "harpy": 0,
                    "pegasus": 0,
                    "cerberus": 0,
                    "minotaur": 0,
                    "medusa": 0,
                    "zyklop": 0,
                    "centaur": 0,
                    "fury": 0,
                    "sea_monster": 0
                },

                unitArraySea = {"bireme": 0, "trireme": 0, "attack_ship": 0, "demolition_ship": 0, "colonize_ship": 0};

            console.debug("DIO-TOOLS | getAllUnits | GROUP ARRAY", groupArray);


            if (uw.Game.hasArtemis) {
                unitArray = $.extend(unitArray, {"griffin": 0, "calydonian_boar": 0});
            }
            unitArray = $.extend(unitArray, unitArraySea);

            for (var group in groupArray) {
                if (groupArray.hasOwnProperty(group)) {
                    // Clone Object "unitArray"
                    groupUnitArray[group] = Object.create(unitArray);

                    for (var town in groupArray[group].towns) {
                        if (groupArray[group].towns.hasOwnProperty(town)) {
                            var type = {lo: 0, ld: 0, so: 0, sd: 0, fo: 0, fd: 0}; // Type for TownList

                            for (var unit in unitArray) {
                                if (unitArray.hasOwnProperty(unit)) {
                                    // All Groups: Available units
                                    var tmp = parseInt(uw.ITowns.getTown(town).units()[unit], 10);
                                    groupUnitArray[group][unit] += tmp || 0;
                                    // Only for group "All"
                                    if (group == -1) {
                                        // Bireme counter // old
                                        if (unit === "bireme" && ((biriArray[townArray[town].id] || 0) < (tmp || 0))) {
                                            biriArray[townArray[town].id] = tmp;
                                        }
                                        //TownTypes
                                        if (!uw.GameData.units[unit].is_naval) {
                                            if (uw.GameData.units[unit].flying) {
                                                type.fd += ((uw.GameData.units[unit].def_hack + uw.GameData.units[unit].def_pierce + uw.GameData.units[unit].def_distance) / 3 * (tmp || 0));
                                                type.fo += (uw.GameData.units[unit].attack * (tmp || 0));
                                            } else {
                                                type.ld += ((uw.GameData.units[unit].def_hack + uw.GameData.units[unit].def_pierce + uw.GameData.units[unit].def_distance) / 3 * (tmp || 0));
                                                type.lo += (uw.GameData.units[unit].attack * (tmp || 0));
                                            }
                                        } else {
                                            type.sd += (uw.GameData.units[unit].defense * (tmp || 0));
                                            type.so += (uw.GameData.units[unit].attack * (tmp || 0));
                                        }
                                    }
                                }
                            }
                            // Only for group "All"
                            if (group == -1) {
                                // Icon: DEF or OFF?
                                var z = ((type.sd + type.ld + type.fd) <= (type.so + type.lo + type.fo)) ? "o" : "d",
                                    temp = 0;

                                for (var t in type) {
                                    if (type.hasOwnProperty(t)) {
                                        // Icon: Land/Sea/Fly (t[0]) + OFF/DEF (z)
                                        if (temp < type[t]) {
                                            autoTownTypes[townArray[town].id] = t[0] + z;
                                            temp = type[t];
                                        }
                                        // Icon: Troops Outside (overwrite)
                                        if (temp < 1000) {
                                            autoTownTypes[townArray[town].id] = "no";
                                        }
                                    }
                                }
                                // Icon: Empty Town (overwrite)
                                var popBuilding = 0, buildVal = uw.GameData.buildings, levelArray = townArray[town].buildings().getLevels(),
                                    popMax = Math.floor(buildVal.farm.farm_factor * Math.pow(townArray[town].buildings().getBuildingLevel("farm"), buildVal.farm.farm_pow)), // Population from farm level
                                    popPlow = townArray[town].getResearches().attributes.plow ? 200 : 0,
                                    popFactor = townArray[town].getBuildings().getBuildingLevel("thermal") ? 1.1 : 1.0, // Thermal
                                    popExtra = townArray[town].getPopulationExtra();

                                for (var b in levelArray) {
                                    if (levelArray.hasOwnProperty(b)) {
                                        popBuilding += Math.round(buildVal[b].pop * Math.pow(levelArray[b], buildVal[b].pop_factor));
                                    }
                                }
                                population[town] = {};

                                population[town].max = popMax * popFactor + popPlow + popExtra;
                                population[town].buildings = popBuilding;
                                population[town].units = parseInt((population[town].max - (popBuilding + townArray[town].getAvailablePopulation()) ), 10);

                                if (population[town].units < 300) {
                                    autoTownTypes[townArray[town].id] = "po";
                                }

                                population[town].percent = Math.round(100 / (population[town].max - popBuilding) * population[town].units);
                            }
                        }
                    }
                }
            }

            // Update Available Units
            AvailableUnits.updateBullseye();
            if (GPWindowMgr.TYPE_DIO_UNITS) {
                if (Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_UNITS)) {
                    AvailableUnits.updateWindow();
                }
            }
        } catch (error) {
            errorHandling(error, "getAllUnits"); // TODO: Eventueller Fehler in Funktion
        }
    }

    function addFunctionToITowns() {
        // Copy function and prevent an error
        uw.ITowns.townGroups.getGroupsDIO = function () {
            var town_groups_towns, town_groups, groups = {};

            // #Grepolis Fix: 2.75 -> 2.76
            if (MM.collections) {
                town_groups_towns = MM.collections.TownGroupTown[0];
                town_groups = MM.collections.TownGroup[0];
            } else {
                town_groups_towns = MM.getCollections().TownGroupTown[0];
                town_groups = MM.getCollections().TownGroup[0];
            }

            town_groups_towns.each(function (town_group_town) {
                var gid = town_group_town.getGroupId(),
                    group = groups[gid],
                    town_id = town_group_town.getTownId();

                if (!group) {
                    groups[gid] = group = {
                        id: gid,
                        //name: town_groups.get(gid).getName(), // hier tritt manchmal ein Fehler auf: TypeError: Cannot read property "getName" of undefined at http://_.grepolis.com/cache/js/merged/game.js?1407322916:8298:525
                        towns: {}
                    };
                }

                group.towns[town_id] = {id: town_id};
                //groups[gid].towns[town_id]={id:town_id};
            });
            //console.log(groups);
            return groups;
        };
    }

    var AvailableUnits = {
        activate: function () {
            var default_title = DM.getl10n("place", "support_overview").options.troop_count + " (" + DM.getl10n("hercules2014", "available") + ")";

            $(".picomap_container").prepend("<div id='available_bullseye_unit' class='unit_icon90x90 " + (DATA.bullseyeUnit[DATA.bullseyeUnit.current_group] || "bireme") + "'><div class='amount'></div></div>");

            $('.picomap_overlayer').tooltip(getText("options", "ava")[0]);

            // Style
            $('<style id="dio_available_units_style">' +

                '@-webkit-keyframes Z { 0% { opacity: 0; } 100% { opacity: 1; } } ' +
                '@keyframes Z { 0% { opacity: 0; } 100% { opacity: 1; } } ' +

                '@-webkit-keyframes blurr { 0% { -webkit-filter: blur(5px); } 100% { -webkit-filter: blur(0px); } } ' +

                '.picomap_overlayer { cursor:pointer; } ' +

                '.picomap_area .bull_eye_buttons { height: 55px; } ' +

                '#sea_id { background: none; font-size:25px; cursor:default; height:50px; width:50px; position:absolute; top:70px; left:157px; z-index: 30; } ' +

                    // Available bullseye unit
                '#available_bullseye_unit { margin: 5px 28px 0px 28px; -webkit-animation: blur 2s; animation: Z 1s; } ' +

                '#available_bullseye_unit .amount { color:#826021; position:relative; top:28px; font-style:italic; width:79px; font-weight: bold; text-shadow: 0px 0px 2px black, 1px 1px 2px black, 0px 2px 2px black; -webkit-animation: blur 3s; } ' +

                '#available_bullseye_unit.big_number { font-size: 0.90em; line-height: 1.4; } ' +

                '#available_bullseye_unit.blur { -webkit-animation: blurr 0.6s; } ' +

                    // Land units
                '#available_bullseye_unit.sword		.amount	{ color:#E2D9C1; top:57px; width:90px;	} ' +
                '#available_bullseye_unit.hoplite	.amount	{ color:#E2D9C1; top:57px; width:90px;	} ' +
                '#available_bullseye_unit.archer	.amount	{ color:#E2D0C1; top:47px; width:70px;	} ' +
                '#available_bullseye_unit.chariot			{ background-position: -990px 10px;		} ' +
                '#available_bullseye_unit.rider		.amount	{ color:#DFCC6C; top:52px; width:105px;	} ' +
                '#available_bullseye_unit.chariot	.amount,' +
                '#available_bullseye_unit.slinger	.amount	{ color:#F5E8B4; top:53px; width:91px;	} ' +
                '#available_bullseye_unit.catapult	.amount	{ color:#F5F6C5; top:36px; width:87px;	} ' +
                '#available_bullseye_unit.godsent	.amount	{ color:#F5F6C5; top:57px; width:92px;	} ' +

                    // Mythic units
                '#available_bullseye_unit.medusa			.amount	{ color:#FBFFBB; top:50px; width:65px;	} ' +
                '#available_bullseye_unit.manticore		    .amount	{ color:#ECD181; top:50px; width:55px; 	} ' +
                '#available_bullseye_unit.pegasus					{ background-position: -2970px 11px;	} ' +
                '#available_bullseye_unit.pegasus			.amount	{ color:#F7F8E3; top:52px; width:90px;	} ' +
                '#available_bullseye_unit.minotaur			        { background-position: -2700px 5px;	    } ' +
                '#available_bullseye_unit.minotaur		    .amount	{ color:#EAD88A; top:58px; width:78px;	} ' +
                    //'#available_bullseye_unit.zyklop					{ background-position: -4140px 10px;	} '+
                '#available_bullseye_unit.zyklop			.amount	{ color:#EDE0B0; top:53px; width:95px;	} ' +
                '#available_bullseye_unit.harpy					    { background-position: -1800px 11px;	} ' +
                '#available_bullseye_unit.harpy			    .amount	{ color:#E7DB79; top:40px; width:78px;	} ' +
                '#available_bullseye_unit.sea_monster		.amount	{ color:#D8EA84; top:58px; width:91px;	} ' +
                '#available_bullseye_unit.cerberus		    .amount	{ color:#EC7445; top:25px; width:101px;	} ' +
                '#available_bullseye_unit.centaur					{ background-position: -810px 10px;		} ' +
                '#available_bullseye_unit.centaur			.amount	{ color:#ECE0A8; top:44px; width:83px;	} ' +
                '#available_bullseye_unit.fury			    .amount	{ color:#E0E0BC; top:57px; width:95px;	} ' +
                '#available_bullseye_unit.griffin					{ background-position: -1710px 10px;	} ' +
                '#available_bullseye_unit.griffin			.amount	{ color:#FFDC9D; top:55px; width:98px;	} ' +
                '#available_bullseye_unit.calydonian_boar	.amount	{ color:#FFDC9D; top:17px; width:85px;	} ' +

                    // Naval units
                '#available_bullseye_unit.attack_ship		.amount	{ color:#FFCB00; top:26px; width:99px;	} ' +
                '#available_bullseye_unit.bireme			.amount	{ color:#DFC677; color:azure; top:28px; width:79px;	} ' +
                '#available_bullseye_unit.trireme			.amount	{ color:#F4FFD4; top:24px; width:90px;	} ' +
                '#available_bullseye_unit.small_transporter	.amount { color:#F5F6C5; top:26px; width:84px;	} ' +
                '#available_bullseye_unit.big_transporter	.amount { color:#FFDC9D; top:27px; width:78px;	} ' +
                '#available_bullseye_unit.colonize_ship		.amount { color:#F5F6C5; top:29px; width:76px;	} ' +
                '#available_bullseye_unit.colonize_ship		.amount { color:#F5F6C5; top:29px; width:76px;	} ' +
                '#available_bullseye_unit.demolition_ship	.amount { color:#F5F6C5; top:35px; width:90px;	} ' +

                    // Available units window
                '#available_units { overflow: auto; height: 250px; } ' +
                '#available_units .unit { margin: 5px; cursor:pointer; overflow:visible; } ' +
                '#available_units .unit.active { border: 2px solid #7f653a; border-radius:30px; margin:4px; } ' +
                '#available_units .unit span { text-shadow: 1px 1px 1px black, 1px 1px 2px black;} ' +
                '#available_units hr { border: none; border-top: 1px solid rgb(8, 148, 33); margin-top: 10px; } ' +
                '#available_units .option { float: left; margin-right: 30px; width:100%; } ' +

                    //'#available_units .box_content { background:url(http://s1.directupload.net/images/140206/8jd9d3ec.png) 94% 94% no-repeat; background-size:140px; } '+

                '#available_units .drop_box { position:absolute; top: -38px; right: 83px; width:90px; z-index:10; } ' +
                '#available_units .drop_group { width: 120px; } ' +
                '#available_units .select_group.open { display:block; } ' +
                '#available_units .item-list { overflow: auto; overflow-x: hidden; } ' +
                '#available_units .arrow { width:18px; height:18px; background:url(' + drop_out.src + ') no-repeat -1px -1px; position:absolute; } ' +

                    // Available units button
                '#btn_available_units { top:86px; left:119px; z-index:10; position:absolute; } ' +
                '#btn_available_units .ico_available_units { margin:5px 0px 0px 4px; width:24px; height:24px; ' +
                'background:url(http://s1.directupload.net/images/140323/w4ekrw8b.png) no-repeat 0px 0px;background-size:100%; filter:url(#Hue1); -webkit-filter:hue-rotate(100deg);  } ' +

                '</style>').appendTo('head');

            createWindowType("DIO_UNITS", (LANG.hasOwnProperty(LID) ? getText("options", "ava")[0] : default_title), 365, 270, true, [240, 70]);

            // Set Sea-ID beside the bull eye
            $('#sea_id').prependTo('#ui_box');

            AvailableUnits.addButton();

            AvailableUnits.updateBullseye();
        },
        deactivate: function () {
            $('#available_bullseye_unit').remove();
            $('#dio_available_units_style').remove();
            $('#btn_available_units').remove();

            if (Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_UNITS)) {
                Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_UNITS).close();
            }

            $('.picomap_overlayer').unbind();

            $('#sea_id').appendTo('.picomap_container')
        },
        addButton: function () {
            var default_title = DM.getl10n("place", "support_overview").options.troop_count + " (" + DM.getl10n("hercules2014", "available") + ")";

            $('<div id="btn_available_units" class="circle_button"><div class="ico_available_units js-caption"></div></div>').appendTo(".bull_eye_buttons");

            // Events
            $('#btn_available_units').on('mousedown', function () {
                $('#btn_available_units, .ico_available_units').addClass("checked");
            }).on('mouseup', function () {
                $('#btn_available_units, .ico_available_units').removeClass("checked");
            });

            $('#btn_available_units, .picomap_overlayer').click(function () {
                if (!Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_UNITS)) {
                    AvailableUnits.openWindow();
                    $('#btn_available_units, .ico_available_units').addClass("checked");
                } else {
                    AvailableUnits.closeWindow();
                    $('#btn_available_units, .ico_available_units').removeClass("checked");
                }
            });

            // Tooltip
            $('#btn_available_units').tooltip(LANG.hasOwnProperty(LID) ? getText("labels", "uni") : default_title);
        },
        openWindow: function () {
            var groupArray = uw.ITowns.townGroups.getGroupsDIO(),

                unitArray = {
                    "sword": 0,
                    "archer": 0,
                    "hoplite": 0,
                    "slinger": 0,
                    "rider": 0,
                    "chariot": 0,
                    "catapult": 0,
                    "godsent": 0,
                    "manticore": 0,
                    "harpy": 0,
                    "pegasus": 0,
                    "griffin": 0,
                    "cerberus": 0,
                    "minotaur": 0,
                    "medusa": 0,
                    "zyklop": 0,
                    "centaur": 0,
                    "calydonian_boar": 0,
                    "fury": 0,
                    "sea_monster": 0,
                    "small_transporter": 0,
                    "big_transporter": 0,
                    "bireme": 0,
                    "attack_ship": 0,
                    "trireme": 0,
                    "demolition_ship": 0,
                    "colonize_ship": 0
                };

            if (!uw.Game.hasArtemis) {
                delete unitArray.calydonian_boar;
                delete unitArray.griffin;
            }

            var land_units_str = "", content =
                '<div id="available_units">' +
                    // Dropdown menu
                '<div class="drop_box">' +
                '<div class="drop_group dropdown default">' +
                '<div class="border-left"></div><div class="border-right"></div>' +
                '<div class="caption" name="' + groupArray[DATA.bullseyeUnit.current_group].id + '">' + ITowns.town_groups._byId[groupArray[DATA.bullseyeUnit.current_group].id].attributes.name + '</div>' +
                '<div class="arrow"></div>' +
                '</div>' +
                '<div class="select_group dropdown-list default active"><div class="item-list"></div></div>' +
                '</div>' +
                    // Content
                '<div class="box_content">';

            for (var unit in unitArray) {
                if (unitArray.hasOwnProperty(unit)) {
                    land_units_str += '<div class="unit index_unit bold unit_icon40x40 ' + unit + '"></div>';
                    if (unit == "sea_monster") {
                        land_units_str += '<div style="clear:left;"></div>'; // break
                    }
                }
            }
            content += land_units_str + '</div></div>';

            AvailableUnits.wnd = Layout.wnd.Create(GPWindowMgr.TYPE_DIO_UNITS);

            AvailableUnits.wnd.setContent(content);

            if (Game.premium_features.curator <= Timestamp.now()) {
                $('#available_units .drop_box').css({display: 'none'});
                DATA.bullseyeUnit.current_group = -1;
            }

            // Add groups to dropdown menu
            for (var group in groupArray) {
                if (groupArray.hasOwnProperty(group)) {
                    var group_name = ITowns.town_groups._byId[group].attributes.name;
                    $('<div class="option' + (group == -1 ? " sel" : "") + '" name="' + group + '">' + group_name + '</div>').appendTo('#available_units .item-list');
                }
            }

            // Update
            AvailableUnits.updateWindow();

            // Dropdown menu Handler
            $('#available_units .drop_group').click(function () {
                $('#available_units .select_group').toggleClass('open');
            });
            // Change group
            $('#available_units .select_group .option').click(function () {
                DATA.bullseyeUnit.current_group = $(this).attr("name");
                $('#available_units .select_group').removeClass('open');
                $('#available_units .select_group .option.sel').removeClass("sel");
                $(this).addClass("sel");

                $('#available_units .drop_group .caption').attr("name", DATA.bullseyeUnit.current_group);
                $('#available_units .drop_group .caption').get(0).innerHTML = this.innerHTML;

                $('#available_units .unit.active').removeClass("active");
                $('#available_units .unit.' + (DATA.bullseyeUnit[DATA.bullseyeUnit.current_group] || "bireme")).addClass("active");

                AvailableUnits.updateWindow();
                AvailableUnits.updateBullseye();
                AvailableUnits.save();
            });

            // Set active bullseye unit
            $('#available_units .unit.' + (DATA.bullseyeUnit[DATA.bullseyeUnit.current_group] || "bireme")).addClass("active");

            // Change bullseye unit
            $('#available_units .unit').click(function () {
                DATA.bullseyeUnit[DATA.bullseyeUnit.current_group] = this.className.split(" ")[4].trim();

                $('#available_units .unit.active').removeClass("active");
                $(this).addClass("active");

                AvailableUnits.updateBullseye();
                AvailableUnits.save();

            });

            // Close button event - uncheck available units button
            Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_UNITS).getJQCloseButton().get(0).onclick = function () {
                $('#btn_available_units, .ico_available_units').removeClass("checked");
            };
        },
        closeWindow: function () {
            Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_UNITS).close();
        },
        save: function () {
            saveValue(WID + "_bullseyeUnit", JSON.stringify(DATA.bullseyeUnit));
        },
        updateBullseye: function () {
            var sum = 0, str = "", fsize = ['1.4em', '1.2em', '1.15em', '1.1em', '1.0em', '0.95em'], i;
            if ($('#available_bullseye_unit').get(0)) {
                $('#available_bullseye_unit').get(0).className = "unit_icon90x90 " + (DATA.bullseyeUnit[DATA.bullseyeUnit.current_group] || "bireme");

                if (groupUnitArray[DATA.bullseyeUnit.current_group]) {
                    sum = groupUnitArray[DATA.bullseyeUnit.current_group][(DATA.bullseyeUnit[DATA.bullseyeUnit.current_group] || "bireme")];
                }
                sum = sum.toString();

                for (i = 0; i < sum.length; i++) {
                    str += "<span style='font-size:" + fsize[i] + "'>" + sum[i] + "</span>";
                }
                $('#available_bullseye_unit .amount').get(0).innerHTML = str;

                if (sum >= 100000) {
                    $('#available_bullseye_unit').addClass("big_number");
                } else {
                    $('#available_bullseye_unit').removeClass("big_number");
                }
            }
        },
        updateWindow: function () {
            $('#available_units .box_content .unit').each(function () {
                var unit = this.className.split(" ")[4];
                this.innerHTML = '<span style="font-size:0.9em">' + groupUnitArray[DATA.bullseyeUnit.current_group][unit] + '</span>';
            });
        }
    };

    /*******************************************************************************************************************************
     * Comparison box
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Compares the units of each unit type
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/
    var UnitComparison = {
        activate: function () {
            //UnitComparison.addBox();
            UnitComparison.addButton();

            // Create Window Type
            createWindowType("DIO_COMPARISON", getText("labels", "dsc"), 480, 315, true, ["center", "center", 100, 100]);

            // Style
            $('<style id="dio_comparison_style"> ' +

                    // Button
                '#dio_comparison_button { top:51px; left:120px; z-index:10; position:absolute; } ' +
                '#dio_comparison_button .ico_comparison { margin:5px 0px 0px 4px; width:24px; height:24px; ' +
                'background:url(http://666kb.com/i/cjq6cxia4ms8mn95r.png) no-repeat 0px 0px; background-size:100%; filter:url(#Hue1); -webkit-filter:hue-rotate(60deg); } ' +
                '#dio_comparison_button.checked .ico_comparison { margin-top:6px; } ' +

                    // Window
                '#dio_comparison a { float:left; background-repeat:no-repeat; background-size:25px; line-height:2; margin-right:10px; } ' +
                '#dio_comparison .box_content { text-align:center; font-style:normal; } ' +

                    // Menu tabs
                '#dio_comparison_menu .tab_icon { left: 23px;} ' +
                '#dio_comparison_menu .tab_label { margin-left: 18px; } ' +

                    // Content
                '#dio_comparison .hidden { display:none; } ' +
                '#dio_comparison table { width:480px; } ' +
                '#dio_comparison .hack .t_hack, #dio_comparison .pierce .t_pierce, #dio_comparison .distance .t_distance, #dio_comparison .sea .t_sea { display:inline-table; } ' +

                '#dio_comparison .box_content { background:url(http://s1.directupload.net/images/140206/8jd9d3ec.png) 94% 94% no-repeat; background-size:140px; } ' +

                '#dio_comparison .compare_type_icon { height:25px; width:25px; background:url(https://gpall.innogamescdn.com/images/game/units/units_info_sprite2.51.png); background-size:100%; } ' +
                '#dio_comparison .compare_type_icon.booty { background:url(http://s14.directupload.net/images/140404/ki4gwd7x.png); background-size:100%; } ' +
                '#dio_comparison .compare_type_icon.time { background:url(https://gpall.innogamescdn.com/images/game/res/time.png); background-size:100%; } ' +
                '#dio_comparison .compare_type_icon.favor { background:url(https://gpall.innogamescdn.com/images/game/res/favor.png); background-size:100%; } ' +
                '</style>').appendTo("head");
        },
        deactivate: function () {
            $('#dio_comparison_button').remove();
            $('#dio_comparison_style').remove();

            if (Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_COMPARISON)) {
                Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_COMPARISON).close();
            }
        },
        addButton: function () {
            $('<div id="dio_comparison_button" class="circle_button"><div class="ico_comparison js-caption"></div></div>').appendTo(".bull_eye_buttons");

            // Events
            /*
             $('#dio_comparison_button').on('mousedown', function(){
             $('#dio_comparison_button').addClass("checked");
             }, function(){
             $('#dio_comparison_button').removeClass("checked");
             });
             */
            $('#dio_comparison_button').on('click', function () {
                if (!Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_COMPARISON)) {
                    UnitComparison.openWindow();
                    $('#dio_comparison_button').addClass("checked");
                } else {
                    UnitComparison.closeWindow();
                    $('#dio_comparison_button').removeClass("checked");
                }
            });

            // Tooltip
            $('#dio_comparison_button').tooltip(getText("labels", "dsc"));
        },
        openWindow: function () {
            var content =
                // Title tabs
                '<ul id="dio_comparison_menu" class="menu_inner" style="top: -36px; right: 35px;">' +
                '<li><a class="submenu_link sea" href="#"><span class="left"><span class="right"><span class="middle">' +
                '<span class="tab_icon icon_small townicon_so"></span><span class="tab_label">' + getText("labels", "sea") + '</span>' +
                '</span></span></span></a></li>' +
                '<li><a class="submenu_link distance" href="#"><span class="left"><span class="right"><span class="middle">' +
                '<span class="tab_icon icon_small townicon_di"></span><span class="tab_label">' + getText("labels", "dst") + '</span>' +
                '</span></span></span></a></li>' +
                '<li><a class="submenu_link pierce" href="#"><span class="left"><span class="right"><span class="middle">' +
                '<span class="tab_icon icon_small townicon_sh"></span><span class="tab_label">' + getText("labels", "prc") + '</span>' +
                '</span></span></span></a></li>' +
                '<li><a class="submenu_link hack active" href="#"><span class="left"><span class="right"><span class="middle">' +
                '<span class="tab_icon icon_small townicon_lo"></span><span class="tab_label">' + getText("labels", "hck") + '</span>' +
                '</span></span></span></a></li>' +
                '</ul>' +
                    // Content
                '<div id="dio_comparison" style="margin-bottom:5px; font-style:italic;"><div class="box_content hack"></div></div>';

            Layout.wnd.Create(GPWindowMgr.TYPE_DIO_COMPARISON).setContent(content);

            UnitComparison.addComparisonTable("hack");
            UnitComparison.addComparisonTable("pierce");
            UnitComparison.addComparisonTable("distance");
            UnitComparison.addComparisonTable("sea");

            // Tooltips
            var labelArray = DM.getl10n("barracks"),
                labelAttack = DM.getl10n("context_menu", "titles").attack,
                labelDefense = DM.getl10n("place", "tabs")[0];

            $('.tr_att').tooltip(labelAttack);
            $('.tr_def').tooltip(labelDefense + " (Ø)");
            $('.tr_def_sea').tooltip(labelDefense);
            $('.tr_spd').tooltip(labelArray.tooltips.speed);
            $('.tr_bty').tooltip(labelArray.tooltips.booty.title);
            $('.tr_bty_sea').tooltip(labelArray.tooltips.ship_transport.title);
            $('.tr_res').tooltip(labelArray.costs + " (" +
                labelArray.cost_details.wood + " + " +
                labelArray.cost_details.stone + " + " +
                labelArray.cost_details.iron + ")"
            );
            $('.tr_fav').tooltip(labelArray.costs + " (" + labelArray.cost_details.favor + ")");
            $('.tr_tim').tooltip(labelArray.cost_details.buildtime_barracks + " (s)");
            $('.tr_tim_sea').tooltip(labelArray.cost_details.buildtime_docks + " (s)");

            UnitComparison.switchComparisonTables();

            // Close button event - uncheck available units button
            Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_COMPARISON).getJQCloseButton().get(0).onclick = function () {
                $('#dio_comparison_button').removeClass("checked");
                $('.ico_comparison').get(0).style.marginTop = "5px";
            };
        },
        closeWindow: function () {
            Layout.wnd.getOpenFirst(GPWindowMgr.TYPE_DIO_COMPARISON).close();
        },
        switchComparisonTables: function () {
            $('#dio_comparison_menu .hack, #dio_comparison_menu .pierce, #dio_comparison_menu .distance, #dio_comparison_menu .sea').click(function () {
                $('#dio_comparison .box_content').removeClass($('#dio_comparison .box_content').get(0).className.split(" ")[1]);
                console.debug(this.className.split(" ")[1]);
                $('#dio_comparison .box_content').addClass(this.className.split(" ")[1]);

                $('#dio_comparison_menu .active').removeClass("active");
                $(this).addClass("active");
            });
        },

        tooltips: [], t: 0,

        addComparisonTable: function (type) {
            var pos = {
                att: {hack: "36%", pierce: "27%", distance: "45.5%", sea: "72.5%"},
                def: {hack: "18%", pierce: "18%", distance: "18%", sea: "81.5%"}
            };
            var unitIMG = "https://gpall.innogamescdn.com/images/game/units/units_info_sprite2.51.png";
            var strArray = [
                "<td></td>",
                '<td><div class="compare_type_icon" style="background-position: 0% ' + pos.att[type] + ';"></div></td>',
                '<td><div class="compare_type_icon" style="background-position: 0% ' + pos.def[type] + ';"></div></td>',
                '<td><div class="compare_type_icon" style="background-position: 0% 63%;"></div></td>',
                (type !== "sea") ? '<td><div class="compare_type_icon booty"></div></td>' : '<td><div class="compare_type_icon" style="background-position: 0% 91%;"></div></td>',
                '<td><div class="compare_type_icon" style="background-position: 0% 54%;"></div></td>',
                '<td><div class="compare_type_icon favor"></div></td>',
                '<td><div class="compare_type_icon time"></div></td>'
            ];

            for (var e in uw.GameData.units) {
                if (uw.GameData.units.hasOwnProperty(e)) {
                    var valArray = [];

                    if (type === (uw.GameData.units[e].attack_type || "sea") && (e !== "militia")) {
                        valArray.att = Math.round(uw.GameData.units[e].attack * 10 / uw.GameData.units[e].population) / 10;
                        valArray.def = Math.round(((uw.GameData.units[e].def_hack + uw.GameData.units[e].def_pierce + uw.GameData.units[e].def_distance) * 10) / (3 * uw.GameData.units[e].population)) / 10;
                        valArray.def = valArray.def || Math.round(uw.GameData.units[e].defense * 10 / uw.GameData.units[e].population) / 10;
                        valArray.speed = uw.GameData.units[e].speed;
                        valArray.booty = Math.round(((uw.GameData.units[e].booty) * 10) / uw.GameData.units[e].population) / 10;
                        valArray.booty = valArray.booty || Math.round(((uw.GameData.units[e].capacity ? uw.GameData.units[e].capacity + 6 : 0) * 10) / uw.GameData.units[e].population) / 10;
                        valArray.favor = Math.round((uw.GameData.units[e].favor * 10) / uw.GameData.units[e].population) / 10;
                        valArray.res = Math.round((uw.GameData.units[e].resources.wood + uw.GameData.units[e].resources.stone + uw.GameData.units[e].resources.iron) / (uw.GameData.units[e].population));
                        valArray.time = Math.round(uw.GameData.units[e].build_time / uw.GameData.units[e].population);

                        // World without Artemis? -> grey griffin and boar
                        valArray.heroStyle = "";
                        valArray.heroStyleIMG = "";

                        if (!uw.Game.hasArtemis && ((e === "griffin") || (e === "calydonian_boar"))) {
                            valArray.heroStyle = "color:black;opacity: 0.4;";
                            valArray.heroStyleIMG = "filter: url(#GrayScale); -webkit-filter:grayscale(100%);";
                        }

                        strArray[0] += '<td class="un' + (UnitComparison.t) + '"><span class="unit index_unit unit_icon40x40 ' + e + '" style="' + valArray.heroStyle + valArray.heroStyleIMG + '"></span></td>';
                        strArray[1] += '<td class="bold" style="color:' + ((valArray.att > 19) ? 'green;' : ((valArray.att < 10 && valArray.att !== 0 ) ? 'red;' : 'black;')) + valArray.heroStyle + '">' + valArray.att + '</td>';
                        strArray[2] += '<td class="bold" style="color:' + ((valArray.def > 19) ? 'green;' : ((valArray.def < 10 && valArray.def !== 0 ) ? 'red;' : 'black;')) + valArray.heroStyle + '">' + valArray.def + '</td>';
                        strArray[3] += '<td class="bold" style="' + valArray.heroStyle + '">' + valArray.speed + '</td>';
                        strArray[4] += '<td class="bold" style="' + valArray.heroStyle + '">' + valArray.booty + '</td>';
                        strArray[5] += '<td class="bold" style="' + valArray.heroStyle + '">' + valArray.res + '</td>';
                        strArray[6] += '<td class="bold" style="color:' + ((valArray.favor > 0) ? 'rgb(0, 0, 214);' : 'black;') + valArray.heroStyle + ';">' + valArray.favor + '</td>';
                        strArray[7] += '<td class="bold" style="' + valArray.heroStyle + '">' + valArray.time + '</td>';

                        UnitComparison.tooltips[UnitComparison.t] = uw.GameData.units[e].name;
                        UnitComparison.t++;
                    }
                }
            }

            $('<table class="hidden t_' + type + '" cellpadding="1px">' +
                '<tr>' + strArray[0] + '</tr>' +
                '<tr class="tr_att">' + strArray[1] + '</tr><tr class="tr_def' + (type == "sea" ? "_sea" : "") + '">' + strArray[2] + '</tr>' +
                '<tr class="tr_spd">' + strArray[3] + '</tr><tr class="tr_bty' + (type == "sea" ? "_sea" : "") + '">' + strArray[4] + '</tr>' +
                '<tr class="tr_res">' + strArray[5] + '</tr><tr class="tr_fav">' + strArray[6] + '</tr><tr class="tr_tim' + (type == "sea" ? "_sea" : "") + '">' + strArray[7] + '</tr>' +
                '</table>').appendTo('#dio_comparison .box_content');

            for (var i = 0; i <= UnitComparison.t; i++) {
                $('.un' + i).tooltip(UnitComparison.tooltips[i]);
            }
        }
    };

    /*******************************************************************************************************************************
     * Reports and Messages
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Storage of the selected filter (only in German Grepolis yet)
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/

    var filter = "all";

    function saveFilter() {
        $('#dd_filter_type_list .item-list div').each(function () {
            $(this).click(function () {
                filter = $(this).attr("name");
            });
        });
        /*
         var i = 0;
         $("#report_list a").each(function () {
         //console.log((i++) +" = " + $(this).attr('data-reportid'));
         });
         */
    }

    function loadFilter() {
        if ($('#dd_filter_type_list .selected').attr("name") !== filter) {
            $('#dd_filter_type .caption').click();
            $('#dd_filter_type_list .item-list div[name=' + filter + ']').click();
        }
    }

    function removeReports() {
        $("#report_list li:contains('spioniert')").each(function () {
            //$(this).remove();
        });
    }

    var zut = 0;
    var messageArray = {};

    function filterPlayer() {
        if (!$('#message_filter_list').get(0)) {
            $('<div id="message_filter_list" style="height:300px;overflow-y:scroll; width: 790px;"></div>').appendTo('#folder_container');
            $("#message_list").get(0).style.display = "none";
        }
        if (zut < parseInt($('.es_last_page').get(0).value, 10) - 1) {
            $('.es_page_input').get(0).value = zut++;
            $('.jump_button').click();
            $("#message_list li:contains('')").each(function () {
                $(this).appendTo('#message_filter_list');
            });
        } else {
            zut = 1;
        }
    }


    /*******************************************************************************************************************************
     * World Wonder Ranking - Change
     *******************************************************************************************************************************/

    function getWorldWonderTypes() {
        $.ajax({
            type: "GET",
            url: "/game/alliance?town_id=" + uw.Game.town_id + "&action=world_wonders&h=" + uw.Game.csrfToken + "&json=%7B%22town_id%22%3A" + uw.Game.town_id + "%2C%22nlreq_id%22%3A" + uw.Game.notification_last_requested_id +
            "%7D&_=" + uw.Game.server_time,
            success: function (text) {
                try {
                    //console.log(JSON.parse(text));
                    temp = JSON.parse(text).json.data.world_wonders;
                    for (var t in temp) {
                        if (temp.hasOwnProperty(t)) {
                            wonderTypes[temp[t].wonder_type] = temp[t].full_name;
                        }
                    }
                    temp = JSON.parse(text).json.data.buildable_wonders;
                    for (var x in temp) {
                        if (temp.hasOwnProperty(x)) {
                            wonderTypes[x] = temp[x].name;
                        }
                    }
                    saveValue(MID + "_wonderTypes", JSON.stringify(wonderTypes));
                } catch (error) {
                    errorHandling(error, "getWorldWonderTypes");
                }
            }
        });
    }

    function getWorldWonders() {
        $.ajax({
            type: "GET",
            url: "/game/ranking?town_id=" + uw.Game.town_id + "&action=wonder_alliance&h=" + uw.Game.csrfToken + "&json=%7B%22type%22%3A%22all%22%2C%22town_id%22%3A" + uw.Game.town_id + "%2C%22nlreq_id%22%3A3" + uw.Game.notification_last_requested_id +
            "%7D&_=" + uw.Game.server_time
        });
    }

    var WorldWonderRanking = {
        activate: function () {
            if ($('#dio_wonder_ranking').get(0)) {
                $('#dio_wonder_ranking').remove();
            }
            $('<style id="dio_wonder_ranking" type="text/css"> .wonder_ranking { display: none; } </style>').appendTo('head');
        },
        deactivate: function () {
            if ($('#dio_wonder_ranking').get(0)) {
                $('#dio_wonder_ranking').remove();
            }
            $('<style id="dio_wonder_ranking" type="text/css"> .wonder_ranking { display: block; } </style>').appendTo('head');
        },
        change: function (html) {
            if ($('#ranking_inner tr', html)[0].children.length !== 1) { // world wonders exist?
                try {
                    var ranking = {}, temp_ally, temp_ally_id, temp_ally_link;

                    // Save world wonder ranking into array
                    $('#ranking_inner tr', html).each(function () {
                        try {
                            if (this.children[0].innerHTML) {
                                temp_ally = this.children[1].children[0].innerHTML; // das hier

                                temp_ally_id = this.children[1].children[0].onclick.toString();
                                temp_ally_id = temp_ally_id.substring(temp_ally_id.indexOf(",") + 1);
                                temp_ally_id = temp_ally_id.substring(0, temp_ally_id.indexOf(")"));

                                temp_ally_link = this.children[1].innerHTML;

                            } else {
                                //World wonder name
                                var wonder_name = this.children[3].children[0].innerHTML;

                                for (var w in wonderTypes) {
                                    if (wonderTypes.hasOwnProperty(w)) {
                                        if (wonder_name == wonderTypes[w]) {
                                            var level = this.children[4].innerHTML, // world wonder level
                                                ww_data = JSON.parse(atob(this.children[3].children[0].href.split("#")[1])), wonder_link;
                                            //console.log(ww_data);

                                            if (!ranking.hasOwnProperty(level)) {
                                                // add wonder types
                                                ranking[level] = {
                                                    colossus_of_rhodes: {},
                                                    great_pyramid_of_giza: {},
                                                    hanging_gardens_of_babylon: {},
                                                    lighthouse_of_alexandria: {},
                                                    mausoleum_of_halicarnassus: {},
                                                    statue_of_zeus_at_olympia: {},
                                                    temple_of_artemis_at_ephesus: {}
                                                };
                                            }

                                            if (!ranking[level][w].hasOwnProperty(temp_ally_id)) {
                                                ranking[level][w][temp_ally_id] = {}; // add alliance array
                                            }
                                            // island coordinates of the world wonder:
                                            ranking[level][w][temp_ally_id].ix = ww_data.ix;
                                            ranking[level][w][temp_ally_id].iy = ww_data.iy;
                                            ranking[level][w][temp_ally_id].sea = this.children[5].innerHTML; // world wonder sea

                                            wonder_link = this.children[3].innerHTML;
                                            if (temp_ally.length > 15) {
                                                temp_ally = temp_ally.substring(0, 15) + '.';
                                            }
                                            wonder_link = wonder_link.substr(0, wonder_link.indexOf(">") + 1) + temp_ally + '</a>';

                                            ranking[level][w][temp_ally_id].ww_link = wonder_link;

                                            // other data of the world wonder
                                            ranking[level][w][temp_ally_id].ally_link = temp_ally_link;
                                            ranking[level][w][temp_ally_id].ally_name = temp_ally; // alliance name
                                            ranking[level][w][temp_ally_id].name = wonder_name; // world wonder name

                                            // Save wonder coordinates for wonder icons on map
                                            if (!wonder.map[w]) {
                                                wonder.map[w] = {};
                                            }
                                            wonder.map[w][ww_data.ix + "_" + ww_data.iy] = level;
                                            saveValue(WID + "_wonder", JSON.stringify(wonder));

                                        }
                                    }
                                }
                            }
                        } catch (error) {
                            errorHandling(error, "WorldWonderRanking.change(function)");
                        }
                    });

                    if ($('#ranking_table_wrapper').get(0)) {
                        $('#ranking_fixed_table_header').get(0).innerHTML = '<tr>' +
                            '<td style="width:10px">#</td>' +
                            '<td>Colossus</td>' +
                            '<td>Pyramid</td>' +
                            '<td>Garden</td>' +
                            '<td>Lighthouse</td>' +
                            '<td>Mausoleum</td>' +
                            '<td>Statue</td>' +
                            '<td>Temple</td>' +
                            '</tr>';

                        $('#ranking_fixed_table_header').css({
                            tableLayout: 'fixed',
                            width: '100%',
                            //paddingLeft: '0px',
                            paddingRight: '15px'
                        });

                        var ranking_substr = '', z = 0;
                        for (var level = 10; level >= 1; level--) {
                            if (ranking.hasOwnProperty(level)) {
                                var complete = "";
                                if (level == 10) {
                                    complete = "background: rgba(255, 236, 108, 0.36);";
                                }

                                // Alternate table background color
                                if (z === 0) {
                                    ranking_substr += '<tr class="game_table_odd" style="' + complete + '"><td style="border-right: 1px solid #d0be97;">' + level + '</td>';
                                    z = 1;
                                } else {
                                    ranking_substr += '<tr class="game_table_even" style="' + complete + '"><td style="border-right: 1px solid #d0be97;">' + level + '</td>';
                                    z = 0;
                                }
                                for (var w in ranking[level]) {
                                    if (ranking[level].hasOwnProperty(w)) {
                                        ranking_substr += '<td>';

                                        for (var a in ranking[level][w]) {
                                            if (ranking[level][w].hasOwnProperty(a)) {
                                                ranking_substr += '<nobr>' + ranking[level][w][a].ww_link + '</nobr><br />'; // ww link
                                            }
                                        }
                                        ranking_substr += '</td>';
                                    }
                                }
                                ranking_substr += '</tr>';
                            }
                        }

                        var ranking_str = '<table id="ranking_endless_scroll" class="game_table" cellspacing="0"><tr>' +
                            '<td style="width:10px;border-right: 1px solid #d0be97;"></td>' +
                            '<td><div class="dio_wonder" style="background:' + worldWonderIcon.colossus_of_rhodes + ';margin-left:26px"></div></td>' +	// Colossus
                            '<td><div class="dio_wonder" style="background:' + worldWonderIcon.great_pyramid_of_giza + ';margin-left:19px"></div></td>' +	// Pyramid
                            '<td><div class="dio_wonder" style="background:' + worldWonderIcon.hanging_gardens_of_babylon + ';margin-left:19px"></div></td>' +	// Garden
                            '<td><div class="dio_wonder" style="background:' + worldWonderIcon.lighthouse_of_alexandria + ';margin-left:24px"></div></td>' +	// Lighthouse
                            '<td><div class="dio_wonder" style="background:' + worldWonderIcon.mausoleum_of_halicarnassus + ';margin-left:25px"></div></td>' +	// Mausoleum
                            '<td><div class="dio_wonder" style="background:' + worldWonderIcon.statue_of_zeus_at_olympia + ';margin-left:25px"></div></td>' +	// Statue
                            '<td><div class="dio_wonder" style="background:' + worldWonderIcon.temple_of_artemis_at_ephesus + ';margin-left:22px"></div></td>' +	// Temple
                            '</tr>' + ranking_substr + '</table>';

                        $('#ranking_table_wrapper').get(0).innerHTML = ranking_str;

                        $('#ranking_endless_scroll .dio_wonder').css({
                            width: "65px", height: "60px",
                            backgroundSize: "auto 100%",
                            backgroundPosition: "64px 0px"
                        });

                        $('#ranking_endless_scroll').css({
                            tableLayout: 'fixed',
                            width: '100%',
                            overflowY: 'auto',
                            overflowX: 'hidden',
                            fontSize: '0.7em',
                            lineHeight: '2'
                        });
                        $('#ranking_endless_scroll tbody').css({
                            verticalAlign: 'text-top'
                        });

                        $('#ranking_table_wrapper img').css({
                            width: "60px"
                        });
                        $('#ranking_table_wrapper').css({
                            overflowY: 'scroll'
                        });
                    }
                } catch (error) {
                    errorHandling(error, "WorldWonderRanking.change");
                }
            }
            if ($('.wonder_ranking').get(0)) {
                $('.wonder_ranking').get(0).style.display = "block";
            }
        }
    };

    /*******************************************************************************************************************************
     * World Wonder
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● click adjustment
     * | ● Share calculation (= ratio of player points to alliance points)
     * | ● Resources calculation & counter (stores amount)
     * | ● Adds missing previous & next buttons on finished world wonders (better browsing through world wonders)
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/

    // getPointRatio: Default
    function getPointRatioFromAllianceProfile() {
        if (AID) {
            $.ajax({
                type: "GET",
                url: '/game/alliance?town_id=' + uw.Game.townId + '&action=profile&h=' + uw.Game.csrfToken + '&json=%7B%22alliance_id%22%3A' + AID + '%2C%22town_id%22%3A' + uw.Game.townId +
                '%2C%22nlreq_id%22%3A' + uw.Game.notification_last_requested_id + '%7D&_=' + uw.Game.server_time,
                success: function (text) {
                    try {
                        text = text.substr(text.indexOf("/li") + 14).substr(0, text.indexOf("\ "));
                        var AP = parseInt(text, 10);
                        wonder.ratio[AID] = 100 / AP * uw.Game.player_points;
                        saveValue(WID + "_wonder", JSON.stringify(wonder));
                    } catch (error) {
                        errorHandling(error, "getPointRatioFromAllianceProfile");
                    }
                }
            });
        } else {
            wonder.ratio[AID] = -1;
            saveValue(WID + "_wonder", JSON.stringify(wonder));
        }
    }

    function getPointRatioFromAllianceRanking() {
        try {
            if (AID && $('.current_player .r_points').get(0)) {
                wonder.ratio[AID] = 100 / parseInt($('.current_player .r_points').get(0).innerHTML, 10) * uw.Game.player_points;
                saveValue(WID + "_wonder", JSON.stringify(wonder));
            }
        } catch (error) {
            errorHandling(error, "getPointRatioFromAllianceRaking");
        }
    }

    function getPointRatioFromAllianceMembers() {
        try {
            var ally_points = 0;
            $('#ally_members_body tr').each(function () {
                ally_points += parseInt($(this).children().eq(2).text(), 10) || 0;
            });
            wonder.ratio[AID] = 100 / ally_points * uw.Game.player_points;
            saveValue(WID + "_wonder", JSON.stringify(wonder));
        } catch (error) {
            errorHandling(error, "getPointRatioFromAllianceMembers");
        }
    }

    var WorldWonderCalculator = {
        activate: function () {
            // Style
            $('<style id="dio_wonder_calculator"> ' +
                '.wonder_controls { height:380px; } ' +
                '.wonder_controls .wonder_progress { margin: 0px auto 5px; } ' +
                '.wonder_controls .wonder_header { text-align:left; margin:10px -8px 12px 3px; }' +
                '.wonder_controls .build_wonder_icon { top:25px !important; }' +
                '.wonder_controls .wonder_progress_bar { top:54px; }' +
                '.wonder_controls .trade fieldset { float:right; } ' +
                '.wonder_controls .wonder_res_container { right:29px; } ' +
                '.wonder_controls .ww_ratio {position:relative; height:auto; } ' +
                '.wonder_controls fieldset.next_level_res {  height:auto; } ' +
                '.wonder_controls .town-capacity-indicator { margin-top:0px; } ' +

                '.wonder_controls .ww_ratio .progress { line-height:1; color:white; font-size:0.8em; } ' +
                '.wonder_controls .ww_perc { position:absolute; width:242px; text-align:center; } ' +
                '.wonder_controls .indicator3 { z-index:0; } ' +
                '.wonder_controls .indicator3.red { background-position:right -203px; height:10px; width:242px; } ' +
                '.wonder_controls .indicator3.green { background-position:right -355px; height:10px; width:242px; } ' +
                '.wonder_controls .all_res { background:url(https://gpall.innogamescdn.com/images/game/layout/resources_2.32.png) no-repeat 0 -90px; width:30px; height:30px; margin:0 auto; margin-left:5px; } ' +
                '.wonder_controls .town-capacity-indicator { margin-top:0px; } ' +
                '</style>').appendTo('head');
        },
        deactivate: function () {
            $('#dio_wonder_calculator').remove();
        }
    };

    // TODO: Split function...
    function getResWW() {
        try {
            var wndArray = uw.GPWindowMgr.getOpen(uw.Layout.wnd.TYPE_WONDERS);

            for (var e in wndArray) {
                if (wndArray.hasOwnProperty(e)) {
                    var wndID = "#gpwnd_" + wndArray[e].getID() + " ";

                    if ($(wndID + '.wonder_progress').get(0)) {
                        var res = 0,
                            ww_share = {total: {share: 0, sum: 0}, stage: {share: 0, sum: 0}},
                            ww_type = $(wndID + '.finished_image_small').attr('src').split("/")[6].split("_")[0], // Which world wonder?
                            res_stages = [2, 4, 6, 10, 16, 28, 48, 82, 140, 238], // Rohstoffmenge pro Rohstofftyp in 100.000 Einheiten
                            stage = parseInt($(wndID + '.wonder_expansion_stage span').get(0).innerHTML.split("/")[0], 10) + 1, // Derzeitige Füllstufe
                            speed = uw.Game.game_speed;

                        wonder.storage[AID] = wonder.storage[AID] || {};

                        wonder.storage[AID][ww_type] = wonder.storage[AID][ww_type] || {};

                        wonder.storage[AID][ww_type][stage] = wonder.storage[AID][ww_type][stage] || 0;

                        if (!$(wndID + '.ww_ratio').get(0)) {
                            $('<fieldset class="ww_ratio"></fieldset>').appendTo(wndID + '.wonder_res_container .trade');
                            $(wndID + '.wonder_header').prependTo(wndID + '.wonder_progress');
                            $(wndID + '.wonder_res_container .send_res').insertBefore(wndID + '.wonder_res_container .next_level_res');
                        }

                        for (var d in res_stages) {
                            if (res_stages.hasOwnProperty(d)) {
                                ww_share.total.sum += res_stages[d];
                            }
                        }

                        ww_share.total.sum *= speed * 300000;

                        ww_share.total.share = parseInt(wonder.ratio[AID] * (ww_share.total.sum / 100), 10);

                        ww_share.stage.sum = speed * res_stages[stage - 1] * 300000;

                        ww_share.stage.share = parseInt(wonder.ratio[AID] * (ww_share.stage.sum / 100), 10); // ( 3000 = 3 Rohstofftypen * 100000 Rohstoffe / 100 Prozent)
                        setResWW(stage, ww_type, ww_share, wndID);


                        $(wndID + '.wonder_res_container .send_resources_btn').click(function (e) {
                            try {
                                wonder.storage[AID][ww_type][stage] += parseInt($(wndID + '#ww_trade_type_wood input:text').get(0).value, 10);
                                wonder.storage[AID][ww_type][stage] += parseInt($(wndID + '#ww_trade_type_stone input:text').get(0).value, 10);
                                wonder.storage[AID][ww_type][stage] += parseInt($(wndID + '#ww_trade_type_iron input:text').get(0).value, 10);

                                setResWW(stage, ww_type, ww_share, wndID);
                                saveValue(WID + "_wonder", JSON.stringify(wonder));
                            } catch (error) {
                                errorHandling(error, "getResWW_Click");
                            }
                        });

                    } else {
                        $('<div class="prev_ww pos_Y"></div><div class="next_ww pos_Y"></div>').appendTo(wndID + '.wonder_controls');

                        $(wndID + '.wonder_finished').css({width: '100%'});

                        $(wndID + '.pos_Y').css({
                            top: '-266px'
                        });
                    }
                }
            }
        } catch (error) {
            errorHandling(error, "getResWW");
        }
    }

    function setResWW(stage, ww_type, ww_share, wndID) {
        try {
            var stage_width, total_width, res_total = 0, stage_color = "red", total_color = "red";

            for (var z in wonder.storage[AID][ww_type]) {
                if (wonder.storage[AID][ww_type].hasOwnProperty(z)) {
                    res_total += wonder.storage[AID][ww_type][z];
                }
            }

            // Progressbar
            if (ww_share.stage.share > wonder.storage[AID][ww_type][stage]) {
                stage_width = (242 / ww_share.stage.share) * wonder.storage[AID][ww_type][stage];
                stage_color = "red";
            } else {
                stage_width = 242;
                stage_color = "green"
            }
            if (ww_share.total.share > res_total) {
                total_color = "red";
                total_width = (242 / ww_share.total.share) * res_total;
            } else {
                total_width = 242;
                total_color = "green"
            }

            $(wndID + '.ww_ratio').get(0).innerHTML = "";
            $(wndID + '.ww_ratio').append(
                '<legend>' + getText("labels", "leg") + ' (<span style="color:#090">' + (Math.round(wonder.ratio[AID] * 100) / 100) + '%</span>):</legend>' +
                '<div class="town-capacity-indicator">' +
                '<div class="icon all_res"></div>' +
                '<div id="ww_town_capacity_stadium" class="tripple-progress-progressbar">' +
                '<div class="border_l"></div><div class="border_r"></div><div class="body"></div>' +
                '<div class="progress overloaded">' +
                '<div class="indicator3 ' + stage_color + '" style="width:' + stage_width + 'px"></div>' +
                '<span class="ww_perc">' + Math.round(wonder.storage[AID][ww_type][stage] / ww_share.stage.share * 100) + '%</span>' +
                '</div>' +
                '<div class="amounts">' + getText("labels", "stg") + ': <span class="curr">' + pointNumber(wonder.storage[AID][ww_type][stage]) + '</span> / ' +
                '<span class="max">' + pointNumber(Math.round(ww_share.stage.share / 1000) * 1000) + '</span></div>' +
                '</div></div>' +
                '<div class="town-capacity-indicator">' +
                '<div class="icon all_res"></div>' +
                '<div id="ww_town_capacity_total" class="tripple-progress-progressbar">' +
                '<div class="border_l"></div><div class="border_r"></div><div class="body"></div>' +
                '<div class="progress overloaded">' +
                '<div class="indicator3 ' + total_color + '" style="width:' + total_width + 'px;"></div>' +
                '<span class="ww_perc">' + Math.round(res_total / ww_share.total.share * 100) + '%</span>' +
                '</div>' +
                '<div class="amounts">' + getText("labels", "tot") + ': <span class="curr">' + pointNumber(res_total) + '</span> / ' +
                '<span class="max">' + pointNumber((Math.round(ww_share.total.share / 1000) * 1000)) + '</span></div>' +
                '</div></div>');

            $(wndID + '.ww_ratio').tooltip(
                "<table style='border-spacing:0px; text-align:right' cellpadding='5px'><tr>" +
                "<td align='right' style='border-right: 1px solid;border-bottom: 1px solid'></td>" +
                "<td style='border-right: 1px solid; border-bottom: 1px solid'><span class='bbcodes_player bold'>(" + (Math.round((wonder.ratio[AID]) * 100) / 100) + "%)</span></td>" +
                "<td style='border-bottom: 1px solid'><span class='bbcodes_ally bold'>(100%)</span></td></tr>" +
                "<tr><td class='bold' style='border-right:1px solid;text-align:center'>" + getText("labels", "stg") + "&nbsp;" + stage + "</td>" +
                "<td style='border-right: 1px solid'>" + pointNumber(Math.round(ww_share.stage.share / 1000) * 1000) + "</td>" +
                "<td>" + pointNumber(Math.round(ww_share.stage.sum / 1000) * 1000) + "</td></tr>" +
                "<tr><td class='bold' style='border-right:1px solid;text-align:center'>" + getText("labels", "tot") + "</td>" +
                "<td style='border-right: 1px solid'>" + pointNumber(Math.round(ww_share.total.share / 1000) * 1000) + "</td>" +
                "<td>" + pointNumber(Math.round(ww_share.total.sum / 1000) * 1000) + "</td>" +
                "</tr></table>");

        } catch (error) {
            errorHandling(error, "setResWW");
        }
    }

    // Adds points to numbers
    function pointNumber(number) {
        var sep;
        if (LID === "de") {
            sep = ".";
        } else {
            sep = ",";
        }

        number = number.toString();
        if (number.length > 3) {
            var mod = number.length % 3;
            var output = (mod > 0 ? (number.substring(0, mod)) : '');

            for (var i = 0; i < Math.floor(number.length / 3); i++) {
                if ((mod == 0) && (i == 0)) {
                    output += number.substring(mod + 3 * i, mod + 3 * i + 3);
                } else {
                    output += sep + number.substring(mod + 3 * i, mod + 3 * i + 3);
                }
            }
            number = output;
        }
        return number;
    }

    /*******************************************************************************************************************************
     * Farming Village Overview
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Color change on possibility of city festivals
     * ----------------------------------------------------------------------------------------------------------------------------
     * *****************************************************************************************************************************/

    function changeResColor() {
        var res, res_min, i = 0;
        $('#fto_town_list .fto_resource_count :last-child').reverseList().each(function () {
            if ($(this).parent().hasClass("stone")) {
                res_min = 18000;
            } else {
                res_min = 15000;
            }
            res = parseInt(this.innerHTML, 10);
            if ((res >= res_min) && !($(this).hasClass("town_storage_full"))) {
                this.style.color = '#0A0';
            }
            if (res < res_min) {
                this.style.color = '#000';
            }
        });
    }

    /********************************************************************************************************************************
     * Conquest Info
     * -----------------------------------------------------------------------------------------------------------------------------
     * | ● Amount of supports und attacks in the conquest window
     * | ● Layout adjustment (for reasons of clarity)
     * | - TODO: conquest window of own cities
     * -----------------------------------------------------------------------------------------------------------------------------
     * ******************************************************************************************************************************/

    function countMovements() {
        var sup = 0, att = 0;
        $('.tab_content #unit_movements .support').each(function () {
            sup++;
        });
        $('.tab_content #unit_movements .attack_land, .tab_content #unit_movements .attack_sea, .tab_content #unit_movements .attack_takeover').each(function () {
            att++;
        });

        var str = "<div id='move_counter' style=''><div style='float:left;margin-right:5px;'></div>" +
            "<div class='movement def'></div>" +
            "<div class='movement' style='color:green;'> " + sup + "</div>" +
            "<div class='movement off'> </div>" +
            "<div style='color:red;'> " + att + "</div></div>" +
            "<hr class='move_hr'>";

        if ($('.gpwindow_content .tab_content .bold').get(0)) {
            $('.gpwindow_content .tab_content .bold').append(str);
        } else {
            $('.gpwindow_content h4:eq(1)').append(str);

            // TODO: set player link ?
            /*
             $('#unit_movements li div').each(function(){

             //console.log(this.innerHTML);
             });
             */
        }

        $('<style id="dio_conquest"> ' +
            '.move_hr { margin:7px 0px 0px 0px; background-color:#5F5242; height:2px; border:0px solid; } ' +
                // Smaller movements
            '#unit_movements { font-size: 0.80em; } ' +
            '#unit_movements .incoming { width:150px; height:45px; float:left; } ' +
                // Counter
            '#move_counter { position:relative; width:100px; margin-top:-16px; left: 40%; } ' +
            '#move_counter .movement { float:left; margin:0px 5px 0px 0px; height:18px; width:18px; position:relative; } ' +
            '#move_counter .def { background:url(https://gpall.innogamescdn.com/images/game/place/losts.png); background-position:0 -36px; } ' +
            '#move_counter .off { background:url(https://gpall.innogamescdn.com/images/game/place/losts.png); background-position:0 0px; }' +
            '</style>').appendTo("head");

        /*
         $('#unit_movements div').each(function(){
         if($(this).attr('class') === "unit_movements_arrow"){
         // delete placeholder for arrow of outgoing movements (there are no outgoing movements)
         if(!this.style.background) { this.remove(); }
         } else {
         // realign texts
         $(this).css({
         margin: '3px',
         paddingLeft: '3px'
         });
         }
         });
         */
    }

    /*******************************************************************************************************************************
     * Town window
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● TownTabHandler (trade, attack, support,...)
     * | ● Sent units box
     * | ● Short duration: Display of 30% troop speed improvement in attack/support tab
     * | ● Trade options:
     * |    - Ressource marks on possibility of city festivals
     * |    - Percentual Trade: Trade button
     * |    - Recruiting Trade: Selection boxes (ressource ratio of unit type + share of the warehouse capacity of the target town)
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/
    var arrival_interval = {};
    // TODO: Change both functions in MultipleWindowHandler()
    function TownTabHandler(action) {
        var wndArray, wndID, wndA;
        wndArray = Layout.wnd.getOpen(uw.Layout.wnd.TYPE_TOWN);
        //console.log(wndArray);
        for (var e in wndArray) {
            if (wndArray.hasOwnProperty(e)) {
                //console.log(wndArray[e].getHandler());
                wndA = wndArray[e].getAction();
                wndID = "#gpwnd_" + wndArray[e].getID() + " ";
                if (!$(wndID).get(0)) {
                    wndID = "#gpwnd_" + (wndArray[e].getID() + 1) + " ";
                }
                //console.log(wndID);
                if (wndA === action) {
                    switch (action) {
                        case "trading":
                            if ($(wndID + '#trade_tab').get(0)) {
                                if (!$(wndID + '.rec_trade').get(0) && DATA.options.rec) {
                                    addRecTrade(wndID);
                                }
                                console.log(DATA.options.per);
                                if (!$(wndID + '.btn_trade').get(0) && DATA.options.per) {
                                    addPercentTrade(wndID, false);
                                }
                            }
                            //addTradeMarks(wndID, 15, 18, 15, "red"); // town festival
                            break;
                        case "support":
                        case "attack":
                            //if(!arrival_interval[wndID]){
                            if (DATA.options.way && !($('.js-casted-powers-viewport .unit_movement_boost').get(0) || $(wndID + '.short_duration').get(0))) {
                                //if(arrival_interval[wndID]) console.log("add " + wndID);
                                ShortDuration.add(wndID);
                            }
                            if (DATA.options.sen) {
                                SentUnits.add(wndID, action);
                            }
                            //}
                            break;
                        case "rec_mark":
                            //addTradeMarks(wndID, 15, 18, 15, "lime");
                            break;
                    }
                }
            }
        }
    }

    function WWTradeHandler() {
        var wndArray, wndID, wndA;
        wndArray = uw.GPWindowMgr.getOpen(uw.GPWindowMgr.TYPE_WONDERS);
        for (var e in wndArray) {
            if (wndArray.hasOwnProperty(e)) {
                wndID = "#gpwnd_" + wndArray[e].getID() + " ";
                if (DATA.options.per && !($(wndID + '.btn_trade').get(0) || $(wndID + '.next_building_phase').get(0) || $(wndID + '#ww_time_progressbar').get(0))) {
                    addPercentTrade(wndID, true);
                }
            }
        }
    }

    /*******************************************************************************************************************************
     * ● Sent units box
     *******************************************************************************************************************************/
    var SentUnits = {
        activate: function () {
            $.Observer(GameEvents.command.send_unit).subscribe('DIO_SEND_UNITS', function (e, data) {
                for (var z in data.params) {
                    if (data.params.hasOwnProperty(z) && (data.sending_type !== "")) {
                        if (uw.GameData.units[z]) {
                            sentUnitsArray[data.sending_type][z] = (sentUnitsArray[data.sending_type][z] == undefined ? 0 : sentUnitsArray[data.sending_type][z]);
                            sentUnitsArray[data.sending_type][z] += data.params[z];
                        }
                    }
                }
                //SentUnits.update(data.sending_type); ????
            });
        },
        deactivate: function () {
            $.Observer(GameEvents.command.send_unit).unsubscribe('DIO_SEND_UNITS');
        },
        add: function (wndID, action) {
            if (!$(wndID + '.sent_units_box').get(0)) {
                $('<div class="game_inner_box sent_units_box ' + action + '"><div class="game_border ">' +
                    '<div class="game_border_top"></div><div class="game_border_bottom"></div><div class="game_border_left"></div><div class="game_border_right"></div>' +
                    '<div class="game_border_corner corner1"></div><div class="game_border_corner corner2"></div>' +
                    '<div class="game_border_corner corner3"></div><div class="game_border_corner corner4"></div>' +
                    '<div class="game_header bold">' +
                    '<div class="icon_sent townicon_' + (action == "attack" ? "lo" : "ld") + '"></div><span>' + getText("labels", "lab") + ' (' + (action == "attack" ? "OFF" : "DEF") + ')</span>' +
                    '</div>' +
                    '<div class="troops"><div class="units_list"></div><hr style="width: 172px;border: 1px solid rgb(185, 142, 93);margin: 3px 0px 2px -1px;">' +
                    '<div id="btn_sent_units_reset" class="button_new">' +
                    '<div class="left"></div>' +
                    '<div class="right"></div>' +
                    '<div class="caption js-caption">' + getText("buttons", "res") + '<div class="effect js-effect"></div></div>' +
                    '</div>' +
                    '</div></div>').appendTo(wndID + '.attack_support_window');

                SentUnits.update(action);

                $(wndID + '.icon_sent').css({
                    height: '20px',
                    marginTop: '-2px',
                    width: '20px',
                    backgroundPositionY: '-26px',
                    paddingLeft: '0px',
                    marginLeft: '0px'
                });

                $(wndID + '.sent_units_box').css({
                    position: 'absolute',
                    right: '0px',
                    bottom: '16px',
                    width: '192px'
                });
                $(wndID + '.troops').css({padding: '6px 0px 6px 6px'});

                $(wndID + '#btn_sent_units_reset').click(function () {
                    // Overwrite old array
                    sentUnitsArray[action] = {};

                    SentUnits.update(action);
                });
            }
        },
        update: function (action) {
            try {
                // Remove old unit list
                $('.sent_units_box.' + action + ' .units_list').each(function () {
                    this.innerHTML = "";
                });
                // Add new unit list
                for (var x in sentUnitsArray[action]) {
                    if (sentUnitsArray[action].hasOwnProperty(x)) {
                        if ((sentUnitsArray[action][x] || 0) > 0) {
                            $('.sent_units_box.' + action + ' .units_list').each(function () {
                                $(this).append('<div class="unit_icon25x25 ' + x +
                                    (sentUnitsArray[action][x] >= 1000 ? (sentUnitsArray[action][x] >= 10000 ? " five_digit_number" : " four_digit_number") : "") + '">' +
                                    '<span class="count text_shadow">' + sentUnitsArray[action][x] + '</span>' +
                                    '</div>');
                            });
                        }
                    }
                }
                saveValue(WID + "_sentUnits", JSON.stringify(sentUnitsArray));
            } catch (error) {
                errorHandling(error, "updateSentUnitsBox");
            }
        }
    };

    /*******************************************************************************************************************************
     * ● Short duration
     *******************************************************************************************************************************/

    var DurationCalculator = {
        activate: function () {
            var speedBoosterSprite = "https://diotools.de/images/game/speed_booster.png";

            $('<style id="dio_duration_calculator_style">' +
                '.dio_speed_booster { border:1px solid #724B08; border-spacing: 0px;} ' +
                '.dio_speed_booster td { border:0; padding:2px; } ' +
                '.dio_speed_booster .checkbox_new { margin: 4px 0px 1px 3px; } ' +
                '.dio_speed_booster .odd { background: url("https://gpall.innogamescdn.com/images/game/border/brown.png") repeat scroll 0% 0% transparent; } ' +
                '.dio_speed_booster .even { background: url("https://gpall.innogamescdn.com/images/game/border/odd.png") repeat scroll 0% 0% transparent; } ' +
                '.booster_icon { width:20px; height:20px; background-image:url(' + speedBoosterSprite + ');} ' +
                '.booster_icon.improved_speed { background-position:0 0; } ' +
                '.booster_icon.cartography { background-position:-20px 0; } ' +
                '.booster_icon.meteorology { background-position:-40px 0; } ' +
                '.booster_icon.lighthouse { background-position:-60px 0; } ' +
                '.booster_icon.set_sail { background-position:-80px 0; } ' +
                '.booster_icon.atalanta { background-position:-100px 0; } ' +
                '</style>').appendTo('head');
        },
        deactivate: function () {
            $('#dio_duration_calculator_style').remove();
        },
        add: function (wndID, data) {

        }
    };


    // TODO : Style Umstellen!
    var ShortDuration = {
        activate: function () {

        },
        deactivate: function () {

        },
        add: function (wndID) {
            //console.log($(wndID + ".duration_container").get(0));
            try {
                var tooltip = (LANG.hasOwnProperty(LID) ? getText("labels", "improved_movement") : "") + " (+30% " + DM.getl10n("barracks", "tooltips").speed.trim() + ")";

                var speedBoosterSprite = "https://diotools.de/images/game/speed_booster.png";

                $('<table class="dio_duration">' +
                    '<tr><td class="way_icon"></td><td class="dio_way"></td><td class="arrival_icon"></td><td class="dio_arrival"></td><td colspan="2" class="dio_night"></td></tr>' +
                    '<tr class="short_duration_row" style="color:darkgreen">' +
                    '<td>&nbsp;╚&gt;&nbsp;</td><td><span class="short_duration">~0:00:00</span></td>' +
                    '<td>&nbsp;&nbsp;&nbsp;╚&gt;</td><td><span class="short_arrival">~00:00:00</span></td>' +
                    '<td class="short_icon"></td><td></td></tr>' +
                    '</table>').prependTo(wndID + ".duration_container");

                /*
                $('<style id="dio_speed_booster_style">' +
                    '.dio_speed_booster { border:1px solid #724B08; border-spacing: 0px;} ' +
                    '.dio_speed_booster td { border:0; padding:2px; } ' +
                    '.dio_speed_booster .checkbox_new { margin: 4px 0px 1px 3px; } ' +
                    '.dio_speed_booster .odd { background: url("https://gpall.innogamescdn.com/images/game/border/brown.png") repeat scroll 0% 0% transparent; } ' +
                    '.dio_speed_booster .even { background: url("https://gpall.innogamescdn.com/images/game/border/odd.png") repeat scroll 0% 0% transparent; } ' +
                    '.booster_icon { width:20px; height:20px; background-image:url(' + speedBoosterSprite + ');} ' +
                    '.booster_icon.improved_speed { background-position:0 0; } ' +
                    '.booster_icon.cartography { background-position:-20px 0; } ' +
                    '.booster_icon.meteorology { background-position:-40px 0; } ' +
                    '.booster_icon.lighthouse { background-position:-60px 0; } ' +
                    '.booster_icon.set_sail { background-position:-80px 0; } ' +
                    '.booster_icon.atalanta { background-position:-100px 0; } ' +
                    '</style>').appendTo('head');

                $('<table class="dio_speed_booster"><tr>' +
                    '<td class="odd"><div class="booster_icon improved_speed"></div><div class="checkbox_new checked"><div class="cbx_icon"></div></div></td>' +
                    '<td class="even"><div class="booster_icon cartography"></div><div class="checkbox_new checked"><div class="cbx_icon"></div></div></td>' +
                    '<td class="odd"><div class="booster_icon meteorology"></div><div class="checkbox_new checked"><div class="cbx_icon"></div></div></td>' +
                    '<td class="even"><div class="booster_icon lighthouse"></div><div class="checkbox_new checked"><div class="cbx_icon"></div></div></td>' +
                    '<td class="odd"><div class="booster_icon set_sail"></div><div class="checkbox_new checked"><div class="cbx_icon"></div></div></td>' +
                    '<td class="even"><div class="booster_icon atalanta"></div><div class="checkbox_new checked"><div class="cbx_icon"></div></div></td>' +
                    '</tr></table>').appendTo(wndID + ".duration_container");
                    
                    */

                $(wndID + ".nightbonus").appendTo(wndID + ".dio_night");
                $(wndID + '.way_duration').appendTo(wndID + ".dio_way");
                $(wndID + ".arrival_time").appendTo(wndID + ".dio_arrival");

                // Style TODO: Umschreiben!
                $(wndID + '.duration_container').css({
                    width: 'auto'
                });
                $(wndID + '.dio_duration').css({
                    borderSpacing: '0px',
                    marginBottom: '2px',
                    textAlign: 'right'
                });
                $(wndID + '.dio_way span,' + wndID + '.dio_arrival span').css({
                    padding: '0px 0px 0px 0px',
                    background: 'none'
                });
                $(wndID + '.short_icon').css({
                    padding: '20px 0px 0px 30px',
                    background: 'url(http://666kb.com/i/ck2c7eohpyfa3yczt.png) 11px -1px / 21px no-repeat',
                    WebkitFilter: 'hue-rotate(50deg)'
                });
                $(wndID + '.way_icon').css({
                    padding: '30px 0px 0px 30px',
                    background: 'transparent url(https://gpall.innogamescdn.com/images/game/towninfo/traveltime.png) no-repeat 0 0'
                });
                $(wndID + '.arrival_icon').css({
                    padding: '30px 0px 0px 30px',
                    background: 'transparent url(https://gpall.innogamescdn.com/images/game/towninfo/arrival.png) no-repeat 0 0'
                });
                $(wndID + '.max_booty').css({
                    padding: '0px 0px 0px 30px',
                    margin: '3px 0 4px 4px',
                    width: 'auto'
                });
                $(wndID + '.fast_boats_needed').css({
                    background: 'transparent url(http://s7.directupload.net/images/140724/4pvfuch8.png) no-repeat 0 0',
                    padding: '2px 10px 7px 24px',
                    margin: '0px 0px 0px 6px'
                });
                $(wndID + '.slow_boats_needed').css({
                    background: 'transparent url(http://s1.directupload.net/images/140724/b5xl8nmj.png) no-repeat 0 0',
                    padding: '2px 10px 7px 24px',
                    margin: '0px 0px 0px 6px'
                });

                // Tooltip
                $(wndID + '.short_duration_row').tooltip(tooltip);

                // Detection of changes
                ShortDuration.change(wndID);
                // $(wndID + '.way_duration').bind('DOMSubtreeModified', function(e) { console.log(e); }); // Alternative

            } catch (error) {
                errorHandling(error, "addShortDuration");
            }
        },
        change: function (wndID) {
            var duration = new MutationObserver(function (mutations) {
                mutations.forEach(function (mutation) {
                    if (mutation.addedNodes[0]) {
                        //console.log(mutation);
                        ShortDuration.calculate(wndID);
                    }
                });
            });
            if ($(wndID + '.way_duration').get(0)) {
                duration.observe($(wndID + '.way_duration').get(0), {
                    attributes: false,
                    childList: true,
                    characterData: false
                });
            }
        },
        //$('<style> .duration_container { display: block !important } </style>').appendTo("head");
        calculate: function (wndID) {
            //console.log(wndID);
            //console.log($(wndID + '.duration_container .way_duration').get(0));
            try {
                var setup_time = 900 / Game.game_speed,
                    duration_time = $(wndID + '.duration_container .way_duration').get(0).innerHTML.replace("~", "").split(":"),
                // TODO: hier tritt manchmal Fehler auf TypeError: Cannot read property "innerHTML" of undefined at calcShortDuration (<anonymous>:3073:86)
                    arrival_time,
                    h, m, s,
                    atalanta_factor = 0;

                var hasCartography = ITowns.getTown(Game.townId).getResearches().get("cartography");
                var hasMeteorology = ITowns.getTown(Game.townId).getResearches().get("meteorology");
                var hasSetSail = ITowns.getTown(Game.townId).getResearches().get("set_sail");

                var hasLighthouse = ITowns.getTown(Game.townId).buildings().get("lighthouse");

                // Atalanta aktiviert?
                if ($(wndID + '.unit_container.heroes_pickup .atalanta').get(0)) {
                    if ($(wndID + '.cbx_include_hero').hasClass("checked")) {
                        // Beschleunigung hängt vom Level ab, Level 1 = 11%, Level 20 = 30%
                        var atalanta_level = MM.getCollections().PlayerHero[0].models[1].get("level");

                        atalanta_factor = (atalanta_level + 10) / 100;
                    }
                }

                // Sekunden, Minuten und Stunden zusammenrechnen (-> in Sekunden)
                duration_time = ((parseInt(duration_time[0], 10) * 60 + parseInt(duration_time[1], 10)) * 60 + parseInt(duration_time[2], 10));

                // Verkürzte Laufzeit berechnen
                duration_time = ((duration_time - setup_time) * (1 + atalanta_factor)) / (1 + 0.3 + atalanta_factor) + setup_time;


                h = Math.floor(duration_time / 3600);
                m = Math.floor((duration_time - h * 3600) / 60);
                s = Math.floor(duration_time - h * 3600 - m * 60);

                if (m < 10) {
                    m = "0" + m;
                }
                if (s < 10) {
                    s = "0" + s;
                }

                $(wndID + '.short_duration').get(0).innerHTML = "~" + h + ":" + m + ":" + s;

                // Ankunftszeit errechnen
                arrival_time = Math.round((Timestamp.server() + Game.server_gmt_offset)) + duration_time;

                h = Math.floor(arrival_time / 3600);
                m = Math.floor((arrival_time - h * 3600) / 60);
                s = Math.floor(arrival_time - h * 3600 - m * 60);

                h %= 24;

                if (m < 10) {
                    m = "0" + m;
                }
                if (s < 10) {
                    s = "0" + s;
                }

                $(wndID + '.short_arrival').get(0).innerHTML = "~" + h + ":" + m + ":" + s;

                clearInterval(arrival_interval[wndID]);

                arrival_interval[wndID] = setInterval(function () {
                    arrival_time += 1;

                    h = Math.floor(arrival_time / 3600);
                    m = Math.floor((arrival_time - h * 3600) / 60);
                    s = Math.floor(arrival_time - h * 3600 - m * 60);

                    h %= 24;

                    if (m < 10) {
                        m = "0" + m;
                    }
                    if (s < 10) {
                        s = "0" + s;
                    }

                    if ($(wndID + '.short_arrival').get(0)) {
                        $(wndID + '.short_arrival').get(0).innerHTML = "~" + h + ":" + m + ":" + s;
                    } else {
                        clearInterval(arrival_interval[wndID]);
                    }
                }, 1000);

            } catch (error) {
                errorHandling(error, "ShortDuration.calculate");
            }
        }
    };

    /*******************************************************************************************************************************
     * ● Dropdown menu
     *******************************************************************************************************************************/

    // TODO: Umstellen!
    // Preload images for drop down arrow buttons
    var drop_over = new Image();
    drop_over.src = "http://s7.directupload.net/images/140107/hna95u8a.png";
    var drop_out = new Image();
    drop_out.src = "http://s14.directupload.net/images/140107/ppsz5mxk.png";

    function changeDropDownButton() {
         $('<style id="dio_style_arrow" type="text/css">' +
         '#dd_filter_type .arrow, .select_rec_unit .arrow {' +
         'width: 18px !important; height: 17px !important; background: url("http://s14.directupload.net/images/140107/ppsz5mxk.png") no-repeat 0px -1px !important;' +
         'position: absolute; top: 2px !important; right: 3px; } ' +
         '</style>').appendTo('head');

    }

    /*******************************************************************************************************************************
     * ● Recruiting Trade
     * *****************************************************************************************************************************/
    var trade_count = 0, unit = "FS", percent = "0.0"; // Recruiting Trade

    function addRecTrade(wndID) {
        var max_amount;

        $('<div class="rec_trade">' +
                // DropDown-Button for unit
            '<div class="drop_rec_unit dropdown default">' +
            '<div class="border-left"></div>' +
            '<div class="border-right"></div>' +
            '<div class="caption" name="' + unit + '">' + unit + '</div>' +
            '<div class="arrow"></div>' +
            '</div>' +
            '<div class="drop_rec_perc dropdown default">' +
                // DropDown-Button for ratio
            '<div class="border-left"></div>' +
            '<div class="border-right"></div>' +
            '<div class="caption" name="' + percent + '">' + Math.round(percent * 100) + '%</div>' +
            '<div class="arrow"></div>' +
            '</div></div><span class="rec_count" style="top:30px">(' + trade_count + ')</span>').appendTo(wndID + ".content");

        // Select boxes for unit and ratio
        $('<div class="select_rec_unit dropdown-list default active">' +
            '<div class="item-list">' +
            '<div class="option_s unit index_unit unit_icon40x40 attack_ship" name="FS"></div>' +
            '<div class="option_s unit index_unit unit_icon40x40 bireme" name="BI"></div>' +
            '<div class="option_s unit index_unit unit_icon40x40 sword" name="SK"></div>' +
            '<div class="option_s unit index_unit unit_icon40x40 slinger" name="SL"></div>' +
            '<div class="option_s unit index_unit unit_icon40x40 archer" name="BS"></div>' +
            '<div class="option_s unit index_unit unit_icon40x40 hoplite" name="HO"></div>' +
            '<div class="option_s unit index_unit unit_icon40x40 rider" name="RE"></div>' +
            '<div class="option_s unit index_unit unit_icon40x40 chariot" name="SW"></div>' +
            '</div></div>').appendTo(wndID + ".rec_trade");
        $('<div class="select_rec_perc dropdown-list default inactive">' +
            '<div class="item-list">' +
            '<div class="option sel" name="0.0">&nbsp;&nbsp;0%</div>' +
            '<div class="option" name="0.05">&nbsp;&nbsp;5%</div>' +
            '<div class="option" name="0.1">10%</div>' +
            '<div class="option" name="0.16666">17%</div>' +
            '<div class="option" name="0.2">20%</div>' +
            '<div class="option" name="0.25">25%</div>' +
            '<div class="option" name="0.33">33%</div>' +
            '<div class="option" name="0.5">50%</div>' +
            '</div></div>').appendTo(wndID + ".rec_trade");

        $(wndID + ".rec_trade [name='" + unit + "']").toggleClass("sel");

        // Styles
        $(wndID + '.rec_trade').css({position: 'absolute', left: '30px', top: '70px'});
        $(wndID + '.select_rec_unit').css({
            position: 'absolute',
            top: '20px',
            width: '84px',
            display: "none"
        });
        $(wndID + '.select_rec_perc').css({
            position: 'absolute',
            left: '50px',
            top: '20px',
            width: '50px',
            display: "none"
        });
        $(wndID + '.item-list').css({maxHeight: '400px', maxWidth: '200px', align: "right"});

        $(wndID + '.arrow').css({
            width: '18px',
            height: '18px',
            background: 'url(' + drop_out.src + ') no-repeat -1px -1px',
            position: 'absolute'
        });

        $(wndID + '.option_s').css({
            filter: "url(#GrayScale)",
            WebkitFilter: "grayscale(100%)",
            cursor: 'pointer',
            color: 'black',
            lineHeight: '14px',
            float: 'left',

            position: 'relative',
            width: '40px',
            margin: '0px',
            padding: '0px'
        });

        $('.select_rec_unit .sel').css({"filter": "url(#Sepia)", "-webkit-filter": "sepia(100%)"});

        // hover effects of the elements in the drop menus
        $(wndID + '.option_s').hover(
            function () {
                //console.log(this.className);
                $(this).css({"filter": "none", "-webkit-filter": "grayscale(0%) sepia(0%)"});
                if (!($(this).hasClass("sel"))) {
                    $('.option_s .sel').css({"filter": "url(#Sepia)", "-webkit-filter": "grayscale(0%) sepia(100%)"});
                }
            },
            function () {
                $('.select_rec_unit .option_s').css({
                    "filter": "url(#GrayScale)",
                    "-webkit-filter": "grayscale(100%) sepia(0%)"
                });
                $('.select_rec_unit .sel').css({
                    "filter": "url(#Sepia)",
                    "-webkit-filter": "grayscale(0%) sepia(100%)"
                });
            }
        );
        $(wndID + '.option').hover(
            function () {
                $(this).css({color: '#fff', background: "#328BF1"});
            },
            function () {
                $(this).css({color: '#000', background: "#FFEEC7"});
            }
        );

        // click events of the drop menu
        $(wndID + ' .select_rec_unit .option_s').each(function () {
            $(this).click(function (e) {
                $(".select_rec_unit .sel").toggleClass("sel");
                $("." + this.className.split(" ")[4]).toggleClass("sel");

                unit = $(this).attr("name");
                $('.drop_rec_unit .caption').attr("name", unit);
                $('.drop_rec_unit .caption').each(function () {
                    this.innerHTML = unit;
                });
                $(this).parent().parent().get(0).style.display = "none";
                $('.drop_rec_unit .caption').change();
            });
        });
        $(wndID + ' .select_rec_perc .option').each(function () {
            $(this).click(function (e) {
                $(this).parent().find(".sel").toggleClass("sel");
                $(this).toggleClass("sel");

                percent = $(this).attr("name");
                $('.drop_rec_perc .caption').attr("name", percent);
                $('.drop_rec_perc .caption').each(function () {
                    this.innerHTML = Math.round(percent * 100) + "%";
                });
                $(this).parent().parent().get(0).style.display = "none";
                $('.drop_rec_perc .caption').change();
            });
        });

        // show & hide drop menus on click
        $(wndID + '.drop_rec_perc').click(function (e) {
            if ($(e.target)[0].parentNode.parentNode.childNodes[3].style.display === "none") {
                $(e.target)[0].parentNode.parentNode.childNodes[3].style.display = "block";
                $(e.target)[0].parentNode.parentNode.childNodes[2].style.display = "none";
            } else {
                $(e.target)[0].parentNode.parentNode.childNodes[3].style.display = "none";
            }
        });
        $(wndID + '.drop_rec_unit').click(function (e) {
            if ($(e.target)[0].parentNode.parentNode.childNodes[2].style.display === "none") {
                $(e.target)[0].parentNode.parentNode.childNodes[2].style.display = "block";
                $(e.target)[0].parentNode.parentNode.childNodes[3].style.display = "none";
            } else {
                $(e.target)[0].parentNode.parentNode.childNodes[2].style.display = "none";
            }
        });

        $(wndID).click(function (e) {
            var clicked = $(e.target), element = $('#' + this.id + ' .select_rec_unit').get(0);
            if ((clicked[0].parentNode.className.split(" ")[1] !== "dropdown") && element) {
                element.style.display = "none";
            }
        });

        // hover arrow change
        $(wndID + '.dropdown').hover(function (e) {
            $(e.target)[0].parentNode.childNodes[3].style.background = "url('" + drop_over.src + "') no-repeat -1px -1px";
        }, function (e) {
            $(e.target)[0].parentNode.childNodes[3].style.background = "url('" + drop_out.src + "') no-repeat -1px -1px";
        });

        $(wndID + ".drop_rec_unit .caption").attr("name", unit);
        $(wndID + ".drop_rec_perc .caption").attr("name", percent);

        $(wndID + '.drop_rec_unit').tooltip(getText("labels", "rat"));
        $(wndID + '.drop_rec_perc').tooltip(getText("labels", "shr"));

        var ratio = {
            NO: {w: 0, s: 0, i: 0},
            FS: {w: 1, s: 0.2308, i: 0.6154},
            BI: {w: 1, s: 0.8750, i: 0.2250},
            SL: {w: 0.55, s: 1, i: 0.4},
            RE: {w: 0.6666, s: 0.3333, i: 1},
            SK: {w: 1, s: 0, i: 0.8947},
            HO: {w: 0, s: 0.5, i: 1},
            BS: {w: 1, s: 0, i: 0.6250},
            SW: {w: 0.4545, s: 1, i: 0.7273}
        };


        if ($('#town_capacity_wood .max').get(0)) {
            max_amount = parseInt($('#town_capacity_wood .max').get(0).innerHTML, 10);
        } else {
            max_amount = 25500;
        }

        $(wndID + '.caption').change(function (e) {
            //console.log($(this).attr('name') + ", " + unit + "; " + percent);
            if (!(($(this).attr('name') === unit) || ($(this).attr('name') === percent))) {
                //trade_count = 0;
                $('.rec_count').get(0).innerHTML = "(" + trade_count + ")";
            }

            var tmp = $(this).attr('name');

            if ($(this).parent().attr('class').split(" ")[0] === "drop_rec_unit") {
                unit = tmp;
            } else {
                percent = tmp;
            }
            var max = (max_amount - 100) / 1000;
            addTradeMarks(max * ratio[unit].w, max * ratio[unit].s, max * ratio[unit].i, "lime");

            var part = (max_amount - 1000) * parseFloat(percent); // -1000 als Puffer (sonst Überlauf wegen Restressies, die nicht eingesetzt werden können, vorallem bei FS und Biremen)
            var rArray = uw.ITowns.getTown(uw.Game.townId).getCurrentResources();
            var tradeCapacity = uw.ITowns.getTown(uw.Game.townId).getAvailableTradeCapacity();

            var wood = ratio[unit].w * part;
            var stone = ratio[unit].s * part;
            var iron = ratio[unit].i * part;

            if ((wood > rArray.wood) || (stone > rArray.stone) || (iron > rArray.iron) || ( (wood + stone + iron) > tradeCapacity)) {
                wood = stone = iron = 0;
                $('.drop_rec_perc .caption').css({color: '#f00'});
                //$('.' + e.target.parentNode.parentNode.className + ' .select_rec_perc .sel').css({color:'#f00'});
                //$('.select_rec_perc .sel').css({color:'#f00'});
            } else {
                $('.' + e.target.parentNode.parentNode.className + ' .drop_rec_perc .caption').css({color: '#000'});
            }
            $("#trade_type_wood [type='text']").select().val(wood).blur();
            $("#trade_type_stone [type='text']").select().val(stone).blur();
            $("#trade_type_iron [type='text']").select().val(iron).blur();
        });

        $('#trade_button').click(function () {
            trade_count++;
            $('.rec_count').get(0).innerHTML = "(" + trade_count + ")";

        });

        $(wndID + '.rec_count').css({
            position: 'absolute',
            display: 'block',
            left: '33px',
            top: '95px',
            width: '20px'
        });
        $(wndID + '.drop_rec_unit').css({
            position: 'absolute',
            display: 'block',
            width: '50px',
            overflow: 'visible'
        });
        $(wndID + '.drop_rec_perc').css({
            position: 'absolute',
            display: 'block',
            left: '49px',
            width: '55px',
            color: '#000'
        });
        $(wndID + '.drop_rec_perc .caption').change();
    }

    /*******************************************************************************************************************************
     * ● Ressources marks
     *******************************************************************************************************************************/
    function addTradeMarks(woodmark, stonemark, ironmark, color) {
        var max_amount, limit, wndArray = uw.GPWindowMgr.getOpen(uw.Layout.wnd.TYPE_TOWN), wndID;
        for (var e in wndArray) {
            if (wndArray.hasOwnProperty(e)) {
                wndID = "#gpwnd_" + wndArray[e].getID() + " ";
                if ($(wndID + '.town-capacity-indicator').get(0)) {

                    max_amount = $(wndID + '.amounts .max').get(0).innerHTML;

                    $('#trade_tab .c_' + color).each(function () {
                        this.remove();
                    });
                    $('#trade_tab .progress').each(function () {
                        if ($("p", this).length < 3) {
                            if ($(this).parent().get(0).id != "big_progressbar") {
                                limit = 1000 * (242 / parseInt(max_amount, 10));

                                switch ($(this).parent().get(0).id.split("_")[2]) {
                                    case "wood":
                                        limit = limit * woodmark;
                                        break;
                                    case "stone":
                                        limit = limit * stonemark;
                                        break;
                                    case "iron":
                                        limit = limit * ironmark;
                                        break;
                                }
                                $('<p class="c_' + color + '"style="position:absolute;left: ' + limit + 'px; background:' + color + ';width:2px;height:100%;margin:0px"></p>').appendTo(this);
                            }
                        }
                    });
                }
            }
        }
    }

    /*******************************************************************************************************************************
     * ● Percentual Trade
     *******************************************************************************************************************************/
    var rest_count = 0;

    function addPercentTrade(wndID, ww) {

        var a = "";
        var content = wndID + ".content";
        if (ww) {
            a = "ww_";
            content = wndID + '.trade .send_res';
        }
        $('<div class="btn btn_trade"><a class="button" href="#">' +
            '<span class="left"><span class="right">' +
            '<span class="middle mid">' +
            '<span class="img_trade"></span></span></span></span>' +
            '<span style="clear:both;"></span>' +
            '</a></div>').prependTo(content);

        $(wndID + '.btn_trade').tooltip(getText("labels", "per"));

        setPercentTrade(wndID, ww);

        // Style
        $(wndID + '.btn').css({width: '20px', overflow: 'visible', position: 'absolute', display: 'block'});

        if (!ww) {
            $(wndID + '.content').css({height: '320px'});
        }

        if (ww) {
            $(wndID + '.btn_trade').css({left: '678px', top: '154px'});
        } else {
            $(wndID + '.btn_trade').css({left: '336px', top: '135px'});
        }

        $(wndID + '.mid').css({minWidth: '26px'});

        $(wndID + '.img_trade').css({
            width: '27px',
            height: '27px',
            top: '-3px',
            float: 'left',
            position: 'relative',
            background: 'url("http://666kb.com/i/cjq6d72qk521ig1zz.png") no-repeat'
        });

    }

    var res = {};

    function setPercentTrade(wndID, ww) {
        var a = ww ? "ww_" : "", own_town = $(wndID + '.town_info').get(0) ? true : false;

        $(wndID + '.btn_trade').toggleClick(function () {
            res.wood = {};
            res.stone = {};
            res.iron = {};
            res.sum = {};

            res.sum.amount = 0;
            // Set amount of resources to 0
            setAmount(true, a, wndID);
            // Total amount of resources // TODO: ITowns.getTown(Game.townId).getCurrentResources(); ?
            for (var e in res) {
                if (res.hasOwnProperty(e) && e != "sum") {
                    res[e].rest = false;
                    res[e].amount = parseInt($('.ui_resources_bar .' + e + ' .amount').get(0).innerHTML, 10);
                    res.sum.amount += res[e].amount;
                }
            }
            // Percentage of total resources
            res.wood.percent = 100 / res.sum.amount * res.wood.amount;
            res.stone.percent = 100 / res.sum.amount * res.stone.amount;
            res.iron.percent = 100 / res.sum.amount * res.iron.amount;

            // Total trading capacity
            res.sum.cur = parseInt($(wndID + '#' + a + 'big_progressbar .caption .curr').get(0).innerHTML, 10);

            // Amount of resources on the percentage of trading capacity (%)
            res.wood.part = parseInt(res.sum.cur / 100 * res.wood.percent, 10);
            res.stone.part = parseInt(res.sum.cur / 100 * res.stone.percent, 10);
            res.iron.part = parseInt(res.sum.cur / 100 * res.iron.percent, 10);

            // Get rest warehouse capacity of each resource type
            for (var f in res) {
                if (res.hasOwnProperty(f) && f != "sum") {
                    if (!ww && own_town) { // Own town
                        var curr = parseInt($(wndID + '#town_capacity_' + f + ' .amounts .curr').get(0).innerHTML.replace('+', '').trim(), 10) || 0,
                            curr2 = parseInt($(wndID + '#town_capacity_' + f + ' .amounts .curr2').get(0).innerHTML.replace('+', '').trim(), 10) || 0,
                            max = parseInt($(wndID + '#town_capacity_' + f + ' .amounts .max').get(0).innerHTML.replace('+', '').trim(), 10) || 0;

                        res[f].cur = curr + curr2;
                        res[f].max = max - res[f].cur;

                        if (res[f].max < 0) {
                            res[f].max = 0;
                        }

                    } else { // World wonder or foreign town
                        res[f].max = 30000;
                    }
                }
            }
            // Rest of fraction (0-2 units) add to stone amount
            res.stone.part += res.sum.cur - (res.wood.part + res.stone.part + res.iron.part);

            res.sum.rest = 0;
            rest_count = 0;
            calcRestAmount();
            setAmount(false, a, wndID);
        }, function () {
            setAmount(true, a, wndID);
        });
    }

    function calcRestAmount() {
        // Subdivide rest
        if (res.sum.rest > 0) {
            for (var e in res) {
                if (res.hasOwnProperty(e) && e != "sum" && res[e].rest != true) {
                    res[e].part += res.sum.rest / (3 - rest_count);
                }
            }
            res.sum.rest = 0;
        }
        // Calculate new rest
        for (var f in res) {
            if (res.hasOwnProperty(f) && f != "sum" && res[f].rest != true) {
                if (res[f].max <= res[f].part) {
                    res[f].rest = true;
                    res.sum.rest += res[f].part - res[f].max;
                    rest_count += 1;
                    res[f].part = res[f].max;
                }
            }
        }
        // Recursion
        if (res.sum.rest > 0 && rest_count < 3) {
            calcRestAmount();
        }
    }

    function setAmount(clear, a, wndID) {
        for (var e in res) {
            if (res.hasOwnProperty(e) && e != "sum") {
                if (clear == true) {
                    res[e].part = 0;
                }
                $(wndID + "#" + a + "trade_type_" + e + ' [type="text"]').select().val(res[e].part).blur();
            }
        }
    }

    /********************************************************************************************************************************
     * Unit strength (blunt/sharp/distance) and Transport Capacity
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Unit strength: Menu
     * |	- Switching of def/off display with buttons
     * |	- Possible Selection of certain unit types
     * | ● Unit strength: Conquest
     * | ● Unit strength: Barracks
     * | ● Transport capacity: Menu
     * |	- Switching of transporter speed (+/- big transporter)
     * ----------------------------------------------------------------------------------------------------------------------------
     * ******************************************************************************************************************************/

    var def = true, blunt = 0, sharp = 0, dist = 0, shipsize = false;

    var UnitStrength = {
        // Calculate defensive strength
        calcDef: function (units) {
            var e;
            blunt = sharp = dist = 0;
            for (e in units) {
                if (units.hasOwnProperty(e)) {
                    blunt += units[e] * uw.GameData.units[e].def_hack;
                    sharp += units[e] * uw.GameData.units[e].def_pierce;
                    dist += units[e] * uw.GameData.units[e].def_distance;
                }
            }
        },
        // Calculate offensive strength
        calcOff: function (units, selectedUnits) {
            var e;
            blunt = sharp = dist = 0;
            for (e in selectedUnits) {
                if (selectedUnits.hasOwnProperty(e)) {
                    var attack = (units[e] || 0) * uw.GameData.units[e].attack;
                    switch (uw.GameData.units[e].attack_type) {
                        case 'hack':
                            blunt += attack;
                            break;
                        case 'pierce':
                            sharp += attack;
                            break;
                        case 'distance':
                            dist += attack;
                            break;
                    }
                }
            }
        },
        /*******************************************************************************************************************************
         * ● Unit strength: Unit menu
         *******************************************************************************************************************************/
        Menu: {
            activate: function () {
                $('<div id="strength" class="cont def"><hr>' +
                    '<span class="bold text_shadow cont_left strength_font">' +
                    '<table style="margin:0px;">' +
                    '<tr><td><div class="ico units_info_sprite img_hack"></td><td id="blunt">0</td></tr>' +
                    '<tr><td><div class="ico units_info_sprite img_pierce"></td><td id="sharp">0</td></tr>' +
                    '<tr><td><div class="ico units_info_sprite img_dist"></td><td id="dist">0</td></tr>' +
                    '</table>' +
                    '</span>' +
                    '<div class="cont_right">' +
                    '<img id="def_button" class="active img" src="https://gpall.innogamescdn.com/images/game/unit_overview/support.png">' +
                    '<img id="off_button" class="img" src="https://gpall.innogamescdn.com/images/game/unit_overview/attack.png">' +
                    '</div></div>').appendTo('.units_land .content');

                // Style
                $('<style id="dio_strength_style">' +
                    '#strength.def #off_button, #strength.off #def_button { filter:url(#Sepia); -webkit-filter:sepia(1); }' +
                    '#strength.off #off_button, #strength.def #def_button { filter:none; -webkit-filter:none; } ' +

                    '#strength.off .img_hack { background-position:0% 36%;} ' +
                    '#strength.def .img_hack { background-position:0%  0%;} ' +
                    '#strength.off .img_pierce { background-position:0% 27%;} ' +
                    '#strength.def .img_pierce { background-position:0%  9%;} ' +
                    '#strength.off .img_dist { background-position:0% 45%;} ' +
                    '#strength.def .img_dist { background-position:0% 18%;} ' +

                    '#strength .strength_font { font-size: 0.8em; } ' +
                    '#strength.off .strength_font { color:#edb;} ' +
                    '#strength.def .strength_font { color:#fc6;} ' +

                    '#strength .ico { height:20px; width:20px; } ' +
                    '#strength .units_info_sprite { background:url(https://gpall.innogamescdn.com/images/game/units/units_info_sprite2.51.png); background-size:100%; } ' +

                    '#strength .img_pierce { background-position:0px -20px; } ' +
                    '#strength .img_dist { background-position:0px -40px; } ' +
                    '#strength hr { margin:0px; background-color:#5F5242; height:2px; border:0px solid; } ' +
                    '#strength .cont_left { width:65%;  display:table-cell; } ' +

                    '#strength.cont { background:url(https://gpall.innogamescdn.com/images/game/layout/layout_units_nav_border.png); } ' +

                    '#strength .cont_right { width:30%; display:table-cell; vertical-align:middle; } ' +
                    '#strength .img { float:right; background:none; margin:2px 8px 2px 0px; } ' +

                    '</style>').appendTo("head");

                // Button events
                $('.units_land .units_wrapper, .btn_gods_spells .checked').click(function () {
                    setTimeout(function () {
                        UnitStrength.Menu.update();
                    }, 100);
                });

                $('#off_button').click(function () {
                    $('#strength').addClass('off').removeClass('def');

                    def = false;
                    UnitStrength.Menu.update();
                });
                $('#def_button').click(function () {
                    $('#strength').addClass('def').removeClass('off');

                    def = true;
                    UnitStrength.Menu.update();
                });
                $('#def_button, #off_button').hover(function () {
                    $(this).css('cursor', 'pointer');
                });

                UnitStrength.Menu.update();
            },
            deactivate: function () {
                $('#strength').remove();
                $('#dio_strength_style').remove();
            },
            update: function () {
                var unitsIn = uw.ITowns.getTown(uw.Game.townId).units(), units = UnitStrength.Menu.getSelected();

                // Calculation
                if (def === true) {
                    UnitStrength.calcDef(units);
                } else {
                    UnitStrength.calcOff(unitsIn, units);
                }
                $('#blunt').get(0).innerHTML = blunt;
                $('#sharp').get(0).innerHTML = sharp;
                $('#dist').get(0).innerHTML = dist;
            },
            getSelected: function () {
                var units = [];
                if ($(".units_land .units_wrapper .selected").length > 0) {
                    $(".units_land .units_wrapper .selected").each(function () {
                        units[this.className.split(" ")[1]] = this.children[0].innerHTML;
                    });
                } else {
                    $(".units_land .units_wrapper .unit").each(function () {
                        units[this.className.split(" ")[1]] = this.children[0].innerHTML;
                    });
                }
                return units;
            }
        },
        /*******************************************************************************************************************************
         * ● Unit strength: Conquest
         *******************************************************************************************************************************/
        Conquest: {
            add: function () {
                var units = [], str;

                // units of the siege
                $('#conqueror_units_in_town .unit').each(function () {
                    str = $(this).attr("class").split(" ")[4];
                    if (!uw.GameData.units[str].is_naval) {
                        units[str] = parseInt(this.children[0].innerHTML, 10);
                        //console.log($(this).attr("class").split(" ")[4]);
                    }
                });
                // calculation
                UnitStrength.calcDef(units);

                $('<div id="strength_eo" class="game_border" style="width:90px; margin: 20px; align:center;">' +
                    '<div class="game_border_top"></div><div class="game_border_bottom"></div>' +
                    '<div class="game_border_left"></div><div class="game_border_right"></div>' +
                    '<div class="game_border_corner corner1"></div><div class="game_border_corner corner2"></div>' +
                    '<div class="game_border_corner corner3"></div><div class="game_border_corner corner4"></div>' +
                    '<span class="bold" style="color:#000;font-size: 0.8em;"><table style="margin:0px;background:#f7dca2;width:100%;align:center;">' +
                    '<tr><td width="1%"><div class="ico units_info_sprite img_hack"></div></td><td id="bl" align="center" width="100%">0</td></tr>' +
                    '<tr><td><div class="ico units_info_sprite img_pierce"></div></td><td id="sh" align="center">0</td></tr>' +
                    '<tr><td><div class="ico units_info_sprite img_dist"></div></td><td id="di" align="center">0</td></tr>' +
                    '</table></span>' +
                    '</div>').appendTo('#conqueror_units_in_town');

                $('#strength_eo').tooltip('Gesamteinheitenstärke der Belagerungstruppen');

                // Veröffentlichung-Button-Text
                $('#conqueror_units_in_town .publish_conquest_public_id_wrap').css({
                    marginLeft: '130px'
                });

                $('#strength_eo .ico').css({
                    height: '20px',
                    width: '20px'
                });
                $('#strength_eo .units_info_sprite').css({
                    background: 'url(https://gpall.innogamescdn.com/images/game/units/units_info_sprite2.51.png)',
                    backgroundSize: '100%'
                });
                $('#strength_eo .img_pierce').css({backgroundPosition: '0% 9%'});
                $('#strength_eo .img_dist').css({backgroundPosition: '0% 18%'});


                $('#bl').get(0).innerHTML = blunt;
                $('#sh').get(0).innerHTML = sharp;
                $('#di').get(0).innerHTML = dist;
            }
        },
        /*******************************************************************************************************************************
         * ● Unit strength: Barracks
         *******************************************************************************************************************************/
        Barracks: {
            add: function () {
                if (!$('#strength_baracks').get(0)) {
                    var units = [], pop = 0;

                    // whole units of the town
                    $('#units .unit_order_total').each(function () {
                        units[$(this).parent().parent().attr("id")] = this.innerHTML;
                    });
                    // calculation
                    UnitStrength.calcDef(units);

                    // population space of the units
                    for (var e in units) {
                        if (units.hasOwnProperty(e)) {
                            pop += units[e] * uw.GameData.units[e].population;
                        }
                    }
                    $('<div id="strength_baracks" class="game_border" style="float:right; width:70px; align:center;">' +
                        '<div class="game_border_top"></div><div class="game_border_bottom"></div>' +
                        '<div class="game_border_left"></div><div class="game_border_right"></div>' +
                        '<div class="game_border_corner corner1"></div><div class="game_border_corner corner2"></div>' +
                        '<div class="game_border_corner corner3"></div><div class="game_border_corner corner4"></div>' +
                        '<span class="bold" style="color:#000;font-size: 0.8em;"><table style="margin:0px;background:#f7dca2;width:100%;align:center;">' +
                        '<tr><td width="1%"><div class="ico units_info_sprite img_hack"></div></td><td id="b" align="center" width="100%">0</td></tr>' +
                        '<tr><td><div class="ico units_info_sprite img_pierce"></div></td><td id="s" align="center">0</td></tr>' +
                        '<tr><td><div class="ico units_info_sprite img_dist"></div></td><td id="d" align="center">0</td></tr>' +
                        '</table></span>' +
                        '</div>').appendTo('.ui-dialog #units');

                    $('<div id="pop_baracks" class="game_border" style="float:right; width:60px; align:center;">' +
                        '<div class="game_border_top"></div><div class="game_border_bottom"></div>' +
                        '<div class="game_border_left"></div><div class="game_border_right"></div>' +
                        '<div class="game_border_corner corner1"></div><div class="game_border_corner corner2"></div>' +
                        '<div class="game_border_corner corner3"></div><div class="game_border_corner corner4"></div>' +
                        '<span class="bold" style="color:#000;font-size: 0.8em;"><table style="margin:0px;background:#f7dca2;width:100%;align:center;">' +
                        '<tr><td width="1%"><img class="ico" src="https://gpall.innogamescdn.com/images/game/res/pop.png"></td><td id="p" align="center" width="100%">0</td></tr>' +
                        '</table></span>' +
                        '</div>').appendTo('.ui-dialog #units');

                    $('.ui-dialog #units .ico').css({
                        height: '20px',
                        width: '20px'
                    });
                    $('.ui-dialog #units .units_info_sprite').css({
                        background: 'url(https://gpall.innogamescdn.com/images/game/units/units_info_sprite2.51.png)',
                        backgroundSize: '100%'
                    });
                    $('.ui-dialog #units .img_pierce').css({backgroundPosition: '0% 9%'});
                    $('.ui-dialog #units .img_dist').css({backgroundPosition: '0% 18%'});

                    //$('#pop_baracks').tooltip('Bevölkerungszahl aller Landeinheiten der Stadt');
                    //$('#strength_baracks').tooltip('Gesamteinheitenstärke stadteigener Truppen');

                    $('#b').get(0).innerHTML = blunt;
                    $('#s').get(0).innerHTML = sharp;
                    $('#d').get(0).innerHTML = dist;
                    $('#p').get(0).innerHTML = pop;
                }
            }
        }
    };

    /*******************************************************************************************************************************
     * ● Transporter capacity
     *******************************************************************************************************************************/
    var TransportCapacity = {
        activate: function () {
            // transporter display
            $('<div id="transporter" class="cont" style="height:25px;">' +
                '<table style=" margin:0px;"><tr align="center" >' +
                '<td><img id="ship_img" class="ico" src="http://s7.directupload.net/images/140724/4pvfuch8.png"></td>' +
                '<td><span id="ship" class="bold text_shadow" style="color:#FFCC66;font-size: 10px;line-height: 2.1;"></span></td>' +
                '</tr></table>' +
                '</div>').appendTo('.units_naval .content');

            $('#transporter.cont').css({
                background: 'url(https://gpall.innogamescdn.com/images/game/layout/layout_units_nav_border.png)'
            });

            $('#transporter').hover(function () {
                $(this).css('cursor', 'pointer');
            });
            $('#transporter').toggleClick(
                function () {
                    $('#ship_img').get(0).src = "http://s1.directupload.net/images/140724/b5xl8nmj.png";
                    shipsize = !shipsize;
                    TransportCapacity.update();
                },
                function () {
                    $('#ship_img').get(0).src = "http://s7.directupload.net/images/140724/4pvfuch8.png";
                    shipsize = !shipsize;
                    TransportCapacity.update();
                }
            );
            TransportCapacity.update();
        },
        deactivate: function () {
            $('#transporter').remove();
        },
        update: function () {
            var bigTransp = 0, smallTransp = 0, pop = 0, ship = 0, unit, berth, units = [];
            // Ship space (available)
            smallTransp = parseInt(uw.ITowns.getTown(parseInt(uw.Game.townId, 10)).units().small_transporter, 10);
            if (isNaN(smallTransp)) smallTransp = 0;
            if (shipsize) {
                bigTransp = parseInt(uw.ITowns.getTown(parseInt(uw.Game.townId, 10)).units().big_transporter, 10);
                if (isNaN(bigTransp)) bigTransp = 0;
            }

            // Checking: Research berth
            berth = 0;
            if (uw.ITowns.getTown(uw.Game.townId).researches().hasBerth()) {
                berth = GameData.research_bonus.berth;
            }
            ship = bigTransp * (GameData.units.big_transporter.capacity + berth) + smallTransp * (GameData.units.small_transporter.capacity + berth);

            units = uw.ITowns.getTown(uw.Game.townId).units();

            // Ship space (required)
            for (var e in units) {
                if (units.hasOwnProperty(e)) {
                    if (uw.GameData.units[e]) { // without Heroes
                        if (!(uw.GameData.units[e].is_naval || uw.GameData.units[e].flying)) {
                            pop += units[e] * uw.GameData.units[e].population;
                        }
                    }
                }
            }
            $('#ship').get(0).innerHTML = pop + "/" + ship;
        }
    };


    /*******************************************************************************************************************************
     * Simulator
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Layout adjustment
     * | ● Permanent display of the extended modifier box
     * | ● Unit strength for entered units (without modificator influence yet)
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/
    var Simulator = {
        activate: function () {
            $('<style id="dio_simulator" type="text/css">' +

                '#place_simulator { overflow: hidden !important} ' +
                '#place_simulator .game_body { height: 457px !important} ' +

                    // Bonus container
                '.place_sim_bonuses_heroes { position:absolute; right:-20px; top:24px; width: 300px;} ' +
                '.place_sim_bonuses_heroes .place_sim_showhide { display:none; } ' + // Hide modifier box button


                    //'.place_sim_wrap_mods {position: relative; right: -17px !important} '+
                '.place_sim_wrap_mods .place_simulator_table :eq(1) { width: 300px;} ' + ////////////// genauer!
                '.place_sim_wrap_mods > .place_simulator_table { width: 272px;} ' + ////////////// genauer!

                    // Wall losses
                '.place_sim_wrap_mods tr:last-child { display:none; } ' +

                    // Extended modifier box
                    //'@-webkit-keyframes 	MODBOX { 0% { opacity: 0; } 100% { opacity: 1; } } '+
                    //'@keyframes 			MODBOX { 0% { opacity: 0; } 100% { opacity: 1; } } '+

                '.place_sim_wrap_mods_extended { display: table-cell !important; -webkit-animation:MODBOX 1s; animation:MODBOX 1s; position: relative; width:272px; padding-top: 3px; opacity: 1 !important; left: 0px; top: 0px} ' +
                '.place_sim_wrap_mods_extended table tr td:eq(0) { width: 18px !important } ' +
                '.place_sim_wrap_mods_extended td { border:0px; } ' +
                '.place_sim_wrap_mods_extended tr td:first-child { border-left:0px; width:19px; padding-left:0px; } ' +
                '.place_sim_wrap_mods_extended .place_simulator_table { border:0; margin:2px; border-collapse:separate; border:1px solid #724B08; table-layout:fixed; width:100% } ' +

                '.place_simulator_table .place_image { display:block; width: 20px; height:20px; background-size:100%; margin:auto; } ' +

                '.place_simulator_table .place_image.pa_commander { background: url(https://diotools.de/images/game/advisors/advisors_22.png); background-position: 0px 44px; } ' +
                '.place_simulator_table .place_image.pa_captain { background: url(https://diotools.de/images/game/advisors/advisors_22.png); background-position: 0px 88px; } ' +
                '.place_simulator_table .place_image.pa_priest { background: url(https://diotools.de/images/game/advisors/advisors_22.png); background-position: 0px 66px; } ' +

                '.place_simulator_table .place_image.is_night { background-position: 0px -40px; } ' +
                '.place_simulator_table .place_image.research_ram { background-position: 0px -300px; } ' +
                '.place_simulator_table .place_image.research_phalanx { background-position: 0px -280px; }' +

                '.place_sim_wrap_mods_extended .place_cross { height:16px; background:none; } ' +
                '.place_sim_wrap_mods_extended .place_checkbox_field { display:table-cell; width:13px; height:13px; } ' +

                '.place_sim_wrap_mods_extended tr:last-child { display:none;} ' +

                '.place_sim_wrap_mods_extended tr:nth-of-type(3) td, .place_sim_wrap_mods_extended tr:nth-of-type(5) td { border-top: 2px solid #BFA978 !important; padding-top: 3px !important} ' +

                '.place_sim_wrap_mods_extended .game_border>div { display:none; } ' +
                '.place_sim_wrap_mods_extended .game_border { margin:0px; } ' +

                '.place_sim_wrap_mods_extended .game_border { height: 139px; overflow-y: auto; overflow-x: hidden; }' + // Größe der Modfikatorbox begrenzen

                '#place_simulator .window_inner_curtain { display: none !important } ' + // Hintergrund entfernen bei offener Modifikatorbox

                    // Unit container
                '#simulator_body .unit_container { height: 50px !important; width: 50px !important; margin: 0px 3px 0px 1px !important} ' +
                '.place_simulator_odd, .place_simulator_even { text-align: center !important} ' +
                '.place_insert_field { margin: 0px !important}  ' +

                '#place_sim_ground_units { position:absolute; bottom: 35px;} ' +

                    // Sea unit box
                '#place_sim_naval_units { position: absolute; } ' +
                '#place_sim_naval_units tbody tr:last-child { height:auto !important; }' +

                '.place_sim_select_strategies select { width: 95px !important} ' +
                '.place_sim_select_strategies { margin-left: 99px !important} ' +


                    // Land unit box
                '#place_sim_wrap_units { position: absolute !important; bottom: 35px !important} ' +

                '#simulator_body>h4 { position:absolute;bottom:188px;} ' +

                    // Select boxes
                '.place_sim_select_gods_wrap { position:absolute; bottom:185px; left:96px;} ' +

                '.place_sim_select_gods { width: 105px !important} ' +
                '.place_sim_select_gods select { width: 80px !important} ' +

                '#select_insert_units { width: 130px !important} ' +

                '.place_sim_select_gods_wrap .place_symbol, .place_sim_select_strategies .place_symbol { margin: 0px 2px 0px 5px !important} ' +
                '.place_sim_insert_units .place_symbol { background: url(https://gpall.innogamescdn.com/images/game/towninfo/traveltime.png) !important; background-size: 140% !important; background-position-y: -4px !important} ' +
                '.place_attack { float: left !important} ' +
                '#simulator_body .att { margin-left: 19px !important} ' +

                    // Hero box
                '.place_sim_heroes_container { position: absolute !important; right: 26px !important; padding-top: 3px !important; z-index: 1 !important} ' +
                '.place_sim_hero_container { width: 45px !important; height: 25px !important} ' +

                '#place_simulator .place_sim_bonuses_heroes h4:nth-of-type(2) { display:none; }' + // Heroes title

                    // - Hero container
                '.place_sim_hero_choose, .place_sim_hero_unit_container { height: 26px !important; width: 30px !important} ' +
                '#hero_defense_icon, #hero_attack_icon { height: 25px !important; width: 25px !important; margin: 0px !important} ' +
                '#hero_defense_dd, #hero_attack_dd { height: 25px !important; width: 25px !important; margin: 1px !important} ' +
                '.place_sim_hero_attack, .place_sim_hero_defense { margin-left: 3px !important} ' +
                '#hero_attack_text, #hero_defense_text { font-size: 11px !important; bottom: 0px !important} ' +
                '.place_sim_heroes_container .plus { left: 2px; top: 2px !important} ' +

                '.place_sim_heroes_container .button_new.square { left: 2px !important; } ' +


                    // - Hero spinner
                '.place_sim_heroes_container .spinner { height: 25px !important; width: 40px !important } ' +
                '.place_sim_heroes_container td:nth-child(0) { height: 30px !important} ' +
                '.place_sim_heroes_container .spinner { height: 24px !important; position:absolute !important; width:12px !important; left:29px !important; '+
                                                        'background:url(https://gpall.innogamescdn.com/images/game/border/odd.png) repeat !important; border: 1px solid rgb(107, 107, 107) !important; } ' +
                '.place_sim_heroes_container .spinner .button_down, .place_sim_heroes_container .spinner .button_up { bottom: 2px !important; cursor: pointer !important} ' +
                '.place_sim_heroes_container .spinner .border_l, .place_sim_heroes_container .spinner .border_r, .place_sim_heroes_container .spinner .body { display:none; } '+

                // Quack
                '#q_place_sim_lost_res { display: none; } ' +
                '</style>').appendTo('head');

            if($('#place_simulator').get(0)) {
                Simulator.change();
            }

        },
        deactivate: function () {
            $('#dio_simulator').remove();
            if($('#simu_table').get(0)) {
                $('#simu_table').remove();

                // Hero box
                if ($('.place_sim_heroes_container').get(0)) {
                    $('.hero_unit').each(function () {
                        $(this).addClass('unit_icon40x40').removeClass('unit_icon25x25');
                    });

                    // Hero spinner
                    $('.place_sim_heroes_container .spinner').each(function () {
                        $(this).addClass('place_sim_hero_spinner');
                    });
                }
            }
        },
        change: function () {
            // TODO: Durch CSS ersetzen...

            // Wall loss
            $('.place_sim_wrap_mods tr:eq(1) td:eq(5)').html('<span id="building_place_def_losses_wall_level" class="place_losses bold"></span>');

            // Extended modificator box
            $('.place_sim_wrap_mods_extended .power').each(function () {
                $(this).removeClass("power_icon45x45").addClass("power_icon16x16");
            });
            $('.place_sim_wrap_mods_extended td:nth-child(even)').each(function () {
                $(this).addClass("left_border place_simulator_odd");
            });
            $('.place_sim_wrap_mods_extended td:nth-child(odd)').each(function () {
                $(this).addClass("left_border place_simulator_even");
            });

            // Border entfernen
            $('.place_sim_wrap_mods_extend td:first-child').each(function () {
                $(this).removeClass("left_border");
            });

            // -> Update percentage each time
            $('.place_checkbox_field').click(function () {
                FightSimulator.closeModsExtended(); //$('.place_sim_bonuses_more_confirm').get(0).click();
            });

            // Hero world ?
            if (uw.Game.hasArtemis) {
                $('.place_sim_wrap_mods_extend tr').each(function () {
                    this.children[1].style.borderLeft = "none";
                    this.children[0].remove();
                });
            }

            // Hero box
            if ($('.place_sim_heroes_container').get(0)) {
                $('.hero_unit').each(function () {
                    $(this).removeClass('unit_icon40x40').addClass('unit_icon25x25');
                });

                // Hero spinner
                $('.place_sim_heroes_container .spinner').each(function () {
                    $(this).removeClass('place_sim_hero_spinner');
                });
            }

            setStrengthSimulator();
        }
    };

    function afterSimulation() {
        var lossArray = {att: {res: 0, fav: 0, pop: 0}, def: {res: 0, fav: 0, pop: 0}},
            wall_level = parseInt($('.place_sim_wrap_mods .place_insert_field[name="sim[mods][def][wall_level]"]').val(), 10),
            wall_damage = parseInt($('#building_place_def_losses_wall_level').get(0).innerHTML, 10),
            wall_iron = [0, 200, 429, 670, 919, 1175, 1435, 1701, 1970, 2242, 2518, 2796, 3077, 3360, 3646, 3933, 4222, 4514, 4807, 5101, 5397, 5695, 5994, 6294, 6596, 6899];

        // Calculate unit losses
        $('#place_sim_ground_units .place_losses, #place_sim_naval_units .place_losses').each(function () {
            var loss = parseInt(this.innerHTML, 10) || 0;
            console.log(this.innerHTML);
            if (loss > 0) {
                var unit = this.id.substring(26);
                var side = this.id.split("_")[2]; // att / def
                lossArray[side].res += loss * (uw.GameData.units[unit].resources.wood + uw.GameData.units[unit].resources.stone + uw.GameData.units[unit].resources.iron);
                lossArray[side].fav += loss * uw.GameData.units[unit].favor;
                lossArray[side].pop += loss * uw.GameData.units[unit].population;
            }
        });
        // Calculate wall resource losses
        for (var w = wall_level; w > wall_level - wall_damage; w--) {
            lossArray.def.res += 400 + w * 350 + wall_iron[w]; // wood amount is constant, stone amount is multiplicative and iron amount is irregular for wall levels
        }

        // Insert losses into table
        for (var x in lossArray) {
            if (lossArray.hasOwnProperty(x)) {
                for (var z in lossArray[x]) {
                    if (lossArray[x].hasOwnProperty(z)) {
                        console.log(((z === "res") && (lossArray[x][z] > 10000)) ? (Math.round(lossArray[x][z] / 1000) + "k") : lossArray[x][z]);
                        $("#" + x + "_" + z).get(0).innerHTML = ((z === "res") && (lossArray[x][z] > 10000)) ? (Math.round(lossArray[x][z] / 1000) + "k") : lossArray[x][z];

                    }
                }
            }
        }
    }

    // Stärkeanzeige: Simulator
    var unitsGround = {att: {}, def: {}}, unitsNaval = {att: {}, def: {}}, name = "";

    function setStrengthSimulator() {
        $('<div id="simu_table">' +
            '<div style="float:left; margin-right:12px;"><h4>' + getText("labels", "str") + '</h4>' +
            '<table class="place_simulator_table strength" cellpadding="0px" cellspacing="0px" style="align:center;">' +
            '<tr>' +
            '<td class="place_simulator_even"></td>' +
            '<td class="left_border place_simulator_odd"><div class="ico units_info_sprite img_hack"></div></td>' +
            '<td class="left_border place_simulator_even"><div class="ico units_info_sprite img_pierce"></div></td>' +
            '<td class="left_border place_simulator_odd"><div class="ico units_info_sprite img_dist"></div></td>' +
            '<td class="left_border place_simulator_even"><div class="ico units_info_sprite img_ship"></div></td>' +
            '</tr><tr>' +
            '<td class="place_simulator_even"><div class="place_symbol place_att"></div></td>' +
            '<td class="left_border place_simulator_odd" id="att_b">0</td>' +
            '<td class="left_border place_simulator_even" id="att_s">0</td>' +
            '<td class="left_border place_simulator_odd" id="att_d">0</td>' +
            '<td class="left_border place_simulator_even" id="att_ship">0</td>' +
            '</tr><tr>' +
            '<td class="place_simulator_even"><div class="place_symbol place_def"></div></td>' +
            '<td class="left_border place_simulator_odd" id="def_b">0</td>' +
            '<td class="left_border place_simulator_even" id="def_s">0</td>' +
            '<td class="left_border place_simulator_odd" id="def_d">0</td>' +
            '<td class="left_border place_simulator_even" id="def_ship">0</td>' +
            '</tr>' +
            '</table>' +
            '</div><div><h4>' + getText("labels", "los") + '</h4>' +
            '<table class="place_simulator_table loss" cellpadding="0px" cellspacing="0px" style="align:center;">' +
            '<tr>' +
            '<td class="place_simulator_even"></td>' +
            '<td class="left_border place_simulator_odd"><div class="ico units_info_sprite img_res"></div></td>' +
            '<td class="left_border place_simulator_even"><div class="ico units_info_sprite img_fav"></div></td>' +
            '<td class="left_border place_simulator_odd"><div class="ico units_info_sprite img_pop"></div></td>' +
            '</tr><tr>' +
            '<td class="place_simulator_even"><div class="place_symbol place_att"></div></td>' +
            '<td class="left_border place_simulator_odd" id="att_res">0</td>' +
            '<td class="left_border place_simulator_even" id="att_fav">0</td>' +
            '<td class="left_border place_simulator_odd" id="att_pop">0</td>' +
            '</tr><tr>' +
            '<td class="place_simulator_even"><div class="place_symbol place_def"></div></td>' +
            '<td class="left_border place_simulator_odd" id="def_res">0</td>' +
            '<td class="left_border place_simulator_even" id="def_fav">0</td>' +
            '<td class="left_border place_simulator_odd" id="def_pop">0</td>' +
            '</tr>' +
            '</table>' +
            '</div></div>').appendTo('#simulator_body');

        $('#simu_table').css({
            position: 'absolute',
            top: '200px',
            fontSize: '0.8em',
            width: '63%'
        });
        $('#simu_table .ico').css({
            height: '20px',
            width: '20px',
            margin: 'auto'
        });
        $('#simu_table .units_info_sprite').css({
            background: 'url(https://gpall.innogamescdn.com/images/game/units/units_info_sprite2.51.png)',
            backgroundSize: '100%'
        });
        $('#simu_table .img_hack').css({backgroundPosition: '0% 36%'});
        $('#simu_table .img_pierce').css({backgroundPosition: '0% 27%'});
        $('#simu_table .img_dist').css({backgroundPosition: '0% 45%'});
        $('#simu_table .img_ship').css({backgroundPosition: '0% 72%'});

        $('#simu_table .img_fav').css({
            background: 'url(https://gpall.innogamescdn.com/images/game/res/favor.png)',
            backgroundSize: '100%'
        });
        $('#simu_table .img_res').css({
            background: 'url(https://gpall.innogamescdn.com/images/game/units/units_info_sprite2.51.png) 0% 54%',
            backgroundSize: '100%'
        });
        $('#simu_table .img_pop').css({
            background: 'url(https://gpall.innogamescdn.com/images/game/res/pop.png)',
            backgroundSize: '100%'
        });

        $('#simu_table .left_border').css({
            width: '54px'
        });
        $('#simu_table .left_border').each(function () {
            $(this)[0].align = 'center';
        });

        $('#simu_table .strength').tooltip(getText("labels", "str") + " (" + getText("labels", "mod") + ")");
        $('#simu_table .loss').tooltip(getText("labels", "los"));

        // Klick auf Einheitenbild
        $('.index_unit').click(function () {
            var type = $(this).attr('class').split(" ")[4];
            $('.place_insert_field[name="sim[units][att][' + type + ']"]').change();
        });

        $('#place_sim_ground_units .place_insert_field, #place_sim_naval_units .place_insert_field').on('input change', function () {
            name = $(this).attr("name").replace(/\]/g, "").split("[");
            var str = this;
            //console.log(str);
            setTimeout(function () {
                var unit_type = $(str).closest('.place_simulator_table').attr("id").split("_")[2],
                    val, e;

                val = parseInt($(str).val(), 10);
                val = val || 0;

                if (unit_type == "ground") {
                    unitsGround[name[2]][name[3]] = val;

                    if (name[2] == "def") {
                        UnitStrength.calcDef(unitsGround.def);
                    } else {
                        UnitStrength.calcOff(unitsGround.att, unitsGround.att);
                    }
                    $('#' + name[2] + '_b').get(0).innerHTML = blunt;
                    $('#' + name[2] + '_s').get(0).innerHTML = sharp;
                    $('#' + name[2] + '_d').get(0).innerHTML = dist;

                } else {
                    var att = 0, def = 0;
                    unitsNaval[name[2]][name[3]] = val;

                    if (name[2] == "def") {
                        for (e in unitsNaval.def) {
                            if (unitsNaval.def.hasOwnProperty(e)) {
                                def += unitsNaval.def[e] * uw.GameData.units[e].defense;
                            }
                        }
                        $('#def_ship').get(0).innerHTML = def;
                    } else {
                        for (e in unitsNaval.att) {
                            if (unitsNaval.att.hasOwnProperty(e)) {
                                att += unitsNaval.att[e] * uw.GameData.units[e].attack;
                            }
                        }
                        $('#att_ship').get(0).innerHTML = att;
                    }
                }
            }, 100);
        });

        // Abfrage wegen eventueller Spionageweiterleitung
        getUnitInputs();
        setTimeout(function () {
            setChangeUnitInputs("def");
        }, 100);

        $('#select_insert_units').change(function () {
            var side = $(this).find('option:selected').val();
            setTimeout(function () {
                getUnitInputs();
                if (side === "att" || side === "def") {
                    setChangeUnitInputs(side);
                }
            }, 200);
        });
    }

    function getUnitInputs() {
        $('#place_sim_ground_units .place_insert_field, #place_sim_naval_units .place_insert_field').each(function () {
            name = $(this).attr("name").replace(/\]/g, "").split("[");
            var str = this;
            var unit_type = $(str).closest('.place_simulator_table').attr("id").split("_")[2],
                val, e;
            val = parseInt($(str).val(), 10);
            val = val || 0;
            if (unit_type === "ground") {
                unitsGround[name[2]][name[3]] = val;
            } else {
                var att = 0, def = 0;
                unitsNaval[name[2]][name[3]] = val;
            }
        });
    }

    function setChangeUnitInputs(side) {
        $('.place_insert_field[name="sim[units][' + side + '][godsent]"]').change();
        setTimeout(function () {
            $('.place_insert_field[name="sim[units][' + side + '][colonize_ship]"]').change();
        }, 100);
    }

    /*******************************************************************************************************************************
     * Defense form
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Adds a defense form to the bbcode bar
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/

    // Funktion aufteilen...
    function addForm(e) {
        var textareaId = "", bbcodeBarId = "";

        switch (e) {
            case "/alliance_forum/forum":
                textareaId = "#forum_post_textarea";
                bbcodeBarId = "#forum";
                break;
            case "/message/forward":
                textareaId = "#message_message";
                bbcodeBarId = "#message_bbcodes";
                break;
            case "/message/new":
                textareaId = "#message_new_message";
                bbcodeBarId = "#message_bbcodes";
                break;
            case "/message/view":
                textareaId = "#message_reply_message";
                bbcodeBarId = "#message_bbcodes";
                break;
            case "/player_memo/load_memo_content":
                textareaId = "#memo_text_area";
                bbcodeBarId = "#memo_edit";
                break;
        }

        $('<a title="Verteidigungsformular" href="#" class="dio_bbcode_option def_form" name="def_form"></a>').appendTo(bbcodeBarId + ' .bb_button_wrapper');

        $('.def_form_button').css({
            cursor: 'pointer',
            marginTop: '3px'
        });

        $(bbcodeBarId + ' .dio_bbcode_option').css({
            background: 'url("http://s14.directupload.net/images/140126/lt3hyb8j.png")',
            display: 'block',
            float: 'left',
            width: '22px',
            height: '23px',
            margin: '0 3px 0 0',
            position: 'relative'
        });
        $(bbcodeBarId + ' .def_form').css({
            backgroundPosition: '-89px 0px'
        });
        var imgArray = {
            wall: 'https://gpall.innogamescdn.com/images/game/main/wall.png',
            tower: 'https://gpall.innogamescdn.com/images/game/main/tower.png',
            hide: 'https://gpall.innogamescdn.com/images/game/main/hide.png',

            spy: 'http://s7.directupload.net/images/140114/yr993xwc.png',
            pop: 'http://s7.directupload.net/images/140114/4d6xktxm.png',

            rev1: 'http://s7.directupload.net/images/140115/9cv6otiu.png',
            rev0: 'http://s7.directupload.net/images/140115/aue4rg6i.png',
            eo1: 'http://s1.directupload.net/images/140115/fkzlipyh.png',
            eo0: 'http://s1.directupload.net/images/140115/hs2kg59c.png',
            att: 'http://s1.directupload.net/images/140115/3t6uy4te.png',
            sup: 'http://s7.directupload.net/images/140115/ty6szerx.png',

            zeus: 'http://s1.directupload.net/images/140114/cdxecrpu.png',
            hera: 'http://s1.directupload.net/images/140114/mve54v2o.png',
            athena: 'http://s14.directupload.net/images/140114/kyqyedhe.png',
            poseidon: 'http://s7.directupload.net/images/140114/tusr9oyi.png',
            hades: 'http://s7.directupload.net/images/140114/huins2gn.png',
            artemis: 'http://s7.directupload.net/images/140114/kghjhko8.png',
            nogod: 'http://s1.directupload.net/images/140114/e7vmvfap.png',

            captain: 'http://s14.directupload.net/images/140114/88gg75rc.png',
            commander: 'http://s14.directupload.net/images/140114/slbst52o.png',
            priest: 'http://s1.directupload.net/images/140114/glptekkx.png',

            phalanx: 'http://s7.directupload.net/images/140114/e97wby6z.png',
            ram: 'http://s7.directupload.net/images/140114/s854ds3w.png',

            militia: 'http://wiki.en.grepolis.com/images/9/9b/Militia_40x40.png',
            sword: 'http://wiki.en.grepolis.com/images/9/9c/Sword_40x40.png',
            slinger: 'http://wiki.en.grepolis.com/images/d/dc/Slinger_40x40.png',
            archer: 'http://wiki.en.grepolis.com/images/1/1a/Archer_40x40.png',
            hoplite: 'http://wiki.en.grepolis.com/images/b/bd/Hoplite_40x40.png',
            rider: 'http://wiki.en.grepolis.com/images/e/e9/Rider_40x40.png',
            chariot: 'http://wiki.en.grepolis.com/images/b/b8/Chariot_40x40.png',
            catapult: 'http://wiki.en.grepolis.com/images/f/f0/Catapult_40x40.png',
            godsent: 'http://wiki.de.grepolis.com/images/6/6e/Grepolis_Wiki_225.png',

            def_sum: 'http://s14.directupload.net/images/140127/6cxnis9r.png',

            minotaur: 'http://wiki.de.grepolis.com/images/7/70/Minotaur_40x40.png',
            manticore: 'http://wiki.de.grepolis.com/images/5/5e/Manticore_40x40.png',
            zyclop: 'http://wiki.de.grepolis.com/images/6/66/Zyklop_40x40.png',
            sea_monster: 'http://wiki.de.grepolis.com/images/7/70/Sea_monster_40x40.png',
            harpy: 'http://wiki.de.grepolis.com/images/8/80/Harpy_40x40.png',
            medusa: 'http://wiki.de.grepolis.com/images/d/db/Medusa_40x40.png',
            centaur: 'http://wiki.de.grepolis.com/images/5/53/Centaur_40x40.png',
            pegasus: 'http://wiki.de.grepolis.com/images/5/54/Pegasus_40x40.png',
            cerberus: 'http://wiki.de.grepolis.com/images/6/67/Zerberus_40x40.png',
            fury: 'http://wiki.de.grepolis.com/images/6/67/Erinys_40x40.png',
            griffin: 'http://wiki.de.grepolis.com/images/d/d1/Unit_greif.png',
            calydonian_boar: 'http://wiki.de.grepolis.com/images/9/93/Unit_eber.png',

            big_transporter: 'http://wiki.en.grepolis.com/images/0/04/Big_transporter_40x40.png',
            bireme: 'http://wiki.en.grepolis.com/images/4/44/Bireme_40x40.png',
            attack_ship: 'http://wiki.en.grepolis.com/images/e/e6/Attack_ship_40x40.png',
            demolition_ship: 'http://wiki.en.grepolis.com/images/e/ec/Demolition_ship_40x40.png',
            small_transporter: 'http://wiki.en.grepolis.com/images/8/85/Small_transporter_40x40.png',
            trireme: 'http://wiki.en.grepolis.com/images/a/ad/Trireme_40x40.png',
            colonize_ship: 'http://wiki.en.grepolis.com/images/d/d1/Colonize_ship_40x40.png',

            move_icon: 'https://gpall.innogamescdn.com/images/game/unit_overview/',

            bordure: 'http://s1.directupload.net/images/140126/8y6pmetk.png'
        };

        $('<div class="bb_def_chooser">' +
            '<div class="bbcode_box middle_center">' +
            '<div class="bbcode_box top_left"></div><div class="bbcode_box top_right"></div>' +
            '<div class="bbcode_box top_center"></div><div class="bbcode_box bottom_center"></div>' +
            '<div class="bbcode_box bottom_right"></div><div class="bbcode_box bottom_left"></div>' +
            '<div class="bbcode_box middle_left"></div><div class="bbcode_box middle_right"></div>' +
            '<div class="bbcode_box content clearfix" style="padding:5px">' +
            '<div id="f_uni" class="checkbox_new checked"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("labels", "det") + '</div></div><br><br>' +
            '<div id="f_prm" class="checkbox_new checked"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("labels", "prm") + '</div></div><br><br>' +
            '<div id="f_sil" class="checkbox_new checked"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("labels", "sil") + '</div></div><br><br>' +
            '<div id="f_mov" class="checkbox_new checked"><div class="cbx_icon"></div><div class="cbx_caption">' + getText("labels", "mov") + '</div></div><br><br>' +
            '<div><a class="button" id="dio_insert" href="#"><span class="left"><span class="right"><span class="middle"><small>' + getText("buttons", "ins") + '</small></span></span></span><span></span></a></div>' +
            '</div></div></div>').appendTo(bbcodeBarId + ' .bb_button_wrapper');

        $('.bb_def_chooser').css({
            display: 'none',
            top: '38px',
            left: '510px',
            position: 'absolute',
            width: '190px',
            zIndex: 10000
        });

        $(bbcodeBarId + " .bb_def_chooser .checkbox_new").click(function () {
            $(this).toggleClass("checked");
        });

        $(bbcodeBarId + ' .def_form').toggleClick(function () {
            $(this).parent().find(".bb_def_chooser").get(0).style.display = "block";
        }, function () {
            $(this).parent().find(".bb_def_chooser").get(0).style.display = "none";
        });

        $(bbcodeBarId + ' #dio_insert').click(function () {
            var textarea = $(textareaId).get(0), text = $(textarea).val(), troop_table = "", troop_img = "", troop_count = "", separator = "", move_table = "", landunit_sum = 0;

            $('.def_form').click();

            if ($('#f_uni').hasClass("checked")) {
                $('.units_land .unit, .units_naval .unit').each(function () {
                    troop_img += separator + '[img]' + imgArray[this.className.split(" ")[1]] + '[/img]';
                    troop_count += separator + '[center]' + $(this).find(".value").get(0).innerHTML + '[/center]';
                    separator = "[||]";
                });
            } else {
                $('.units_land .unit').each(function () {
                    var a = this.className.split(" ")[1], def = (uw.GameData.units[a].def_hack + uw.GameData.units[a].def_pierce + uw.GameData.units[a].def_distance) / (3 * uw.GameData.units[a].population);
                    if (def > 10) {
                        landunit_sum += parseInt($(this).find(".value").get(0).innerHTML, 10) * uw.GameData.units[a].population * ((def > 20) ? 2 : 1);
                    }
                });
                landunit_sum = (landunit_sum > 10000) ? ((Math.round(landunit_sum / 100)) / 10) + "k" : landunit_sum;

                troop_img += '[img]' + imgArray.def_sum + '[/img]';
                troop_count += '[center]' + landunit_sum + '[/center]';
                separator = "[||]";
                $('.units_naval .unit').each(function () {
                    troop_img += separator + '[img]' + imgArray[this.className.split(" ")[1]] + '[/img]';
                    troop_count += separator + '[center]' + $(this).find(".value").get(0).innerHTML + '[/center]';
                });
            }
            if (troop_img !== "") {
                troop_table = "\n[table][**]" + troop_img + "[/**][**]" + troop_count + "[/**][/table]\n";
            }

            var str = '[img]' + imgArray.bordure + '[/img]' +
                '\n\n[color=#006B00][size=12][u][b]' + getText("labels", "ttl") + ' ([url="http://adf.ly/eDM1y"]©DIO-Tools[/url])[/b][/u][/size][/color]\n\n' +
                    //'[table][**][img]'+ imgArray.sup +'[/img][||]'+
                '[size=12][town]' + uw.ITowns.getTown(uw.Game.townId).getId() + '[/town] ([player]' + uw.Game.player_name + '[/player])[/size]' +
                    //'[||][img]'+ imgArray['rev' + (uw.ITowns.getTown(uw.Game.townId).hasConqueror()?1:0)] +'[/img][/**][/table]'+
                '\n\n[i][b]' + getText("labels", "inf") + '[/b][/i]' + troop_table +
                '[table][*]' +
                '[img]' + imgArray.wall + '[/img][|]\n' +
                '[img]' + imgArray.tower + '[/img][|]\n' +
                '[img]' + imgArray.phalanx + '[/img][|]\n' +
                '[img]' + imgArray.ram + '[/img][|]\n' +
                ($('#f_prm').hasClass("checked") ? '[img]' + imgArray.commander + '[/img][|]\n' : ' ') +
                ($('#f_prm').hasClass("checked") ? '[img]' + imgArray.captain + '[/img][|]\n' : ' ') +
                ($('#f_prm').hasClass("checked") ? '[img]' + imgArray.priest + '[/img][|]\n' : ' ') +
                ($('#f_sil').hasClass("checked") ? '[center][img]' + imgArray.spy + '[/img][/center][|]\n' : ' ') +
                '[img]' + imgArray.pop + '[/img][|]\n' +
                '[img]' + imgArray[(uw.ITowns.getTown(uw.Game.townId).god() || "nogod")] + '[/img][/*]\n' +
                '[**][center]' + uw.ITowns.getTown(uw.Game.townId).buildings().getBuildingLevel("wall") + '[/center][||]' +
                '[center]' + uw.ITowns.getTown(uw.Game.townId).buildings().getBuildingLevel("tower") + '[/center][||]' +
                '[center]' + (uw.ITowns.getTown(uw.Game.townId).researches().attributes.phalanx ? '+' : '-') + '[/center][||]' +
                '[center]' + (uw.ITowns.getTown(uw.Game.townId).researches().attributes.ram ? '+' : '-') + '[/center][||]' +
                ($('#f_prm').hasClass("checked") ? '[center]' + ((uw.Game.premium_features.commander >= uw.Timestamp.now()) ? '+' : '-') + '[/center][||]' : ' ') +
                ($('#f_prm').hasClass("checked") ? '[center]' + ((uw.Game.premium_features.captain >= uw.Timestamp.now()) ? '+' : '-') + '[/center][||]' : ' ') +
                ($('#f_prm').hasClass("checked") ? '[center]' + ((uw.Game.premium_features.priest >= uw.Timestamp.now()) ? '+' : '-') + '[/center][||]' : ' ') +
                ($('#f_sil').hasClass("checked") ? '[center]' + Math.round(uw.ITowns.getTown(uw.Game.townId).getEspionageStorage() / 1000) + 'k[/center][||]' : ' ') +
                '[center]' + uw.ITowns.getTown(uw.Game.townId).getAvailablePopulation() + '[/center][||]' +
                '[center]' + $('.gods_favor_amount').get(0).innerHTML + '[/center]' +
                '[/**][/table]';

            var bb_count_str = parseInt(str.match(/\[/g).length, 10), bb_count_move = 0;

            var i = 0;
            if ($('#f_mov').hasClass("checked")) {
                move_table += '\n[i][b]' + getText("labels", "mov") + '[/b][/i]\n[table]';

                $('#toolbar_activity_commands').mouseover();

                $('#toolbar_activity_commands_list .content .command').each(function () {
                    var cl = $(this).children()[0].className.split(" ");
                    if ((cl[cl.length - 1] === "returning" || cl[cl.length - 1] === "revolt_arising" || cl[cl.length - 1] === "revolt_running") && ((bb_count_str + bb_count_move) < 480)) {
                        move_table += (i % 1) ? "" : "[**]";
                        i++;
                        move_table += "[img]" + imgArray.move_icon + cl[2] + ".png[/img][||]";
                        move_table += getArrivalTime($(this).children()[1].innerHTML) + (uw.Game.market_id === "de" ? " Uhr[||]" : " [||]");
                        move_table += "[town]" + JSON.parse(atob($(this).children()[2].firstChild.href.split("#")[1])).id + "[/town]";
                        move_table += (i % 1) ? "[||]" : "[/**]";
                    }
                    bb_count_move = parseInt(move_table.match(/\[/g).length, 10);
                });
                if ((bb_count_str + bb_count_move) > 480) {
                    move_table += '[**]...[/**]';
                }

                $('#toolbar_activity_commands').mouseout();

                //console.log((bb_count_str + bb_count_move));
                move_table += (i % 1) ? "[/**]" : "";
                move_table += "[*][|][color=#800000][size=6][i] (" + getText("labels", "dev") + ": ±1s)[/i][/size][/color][/*][/table]\n";
            }

            str += move_table + '[img]' + imgArray.bordure + '[/img]';


            $(textarea).val(text.substring(0, $(textarea).get(0).selectionStart) + str + text.substring($(textarea).get(0).selectionEnd));
        });
    }

    function getArrivalTime(duration_time) {
        /*
         var server_time = new Date((uw.Timestamp.server() + 7200) * 1000);

         duration_time = duration_time.split(":");

         s = server_time.getUTCSeconds() + parseInt(duration_time[2], 10);
         m = server_time.getUTCMinutes() + parseInt(duration_time[1], 10) + ((s>=60)? 1 : 0);
         h = server_time.getUTCHours() + parseInt(duration_time[0], 10) + ((m>=60)? 1 : 0);
         */

        var server_time = $('.server_time_area').get(0).innerHTML.split(" ")[0].split(":"), arrival_time, s, m, h;
        duration_time = duration_time.split(":");

        s = parseInt(server_time[2], 10) + parseInt(duration_time[2], 10);
        m = parseInt(server_time[1], 10) + parseInt(duration_time[1], 10) + ((s >= 60) ? 1 : 0);
        h = parseInt(server_time[0], 10) + parseInt(duration_time[0], 10) + ((m >= 60) ? 1 : 0);

        s = s % 60;
        m = m % 60;
        h = h % 24;

        s = ((s < 10) ? "0" : "") + s;
        m = ((m < 10) ? "0" : "") + m;
        h = ((h < 10) ? "0" : "") + h;

        arrival_time = h + ":" + m + ":" + s;

        return arrival_time;
    }


    /*******************************************************************************************************************************
     * Smiley box
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Display of a smiley selection box for text input fields (forum, messages, notes):
     * | ● Used smileys: http://www.greensmilies.com/smilie-album/
     * | + Own Grepolis smileys
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/

    var smileyArray = {};

    var SmileyBox = {
        loading_error: false, isHalloween: false, isXmas: false, isForum: $(".editor_textbox_container").get(0),

        activate: function () {
            $('<style id="dio_smiley">' +
                '.smiley_button { cursor:pointer; margin:3px 2px 2px 2px; } ' +

                '.smiley_box.game { z-index:5000; position:absolute; top:27px; left:430px; min-width:300px; display:none; } ' +

                    // Smiley categories
                '.smiley_box .box_header { display: table; width: 100%; text-align:center; } ' +
                '.smiley_box .group { display:table-cell; color: #0c450c; cursor: pointer; font-weight:bold; padding: 0px 2px 0px 2px; } ' +
                '.smiley_box .group.active { color: #089421; text-decoration:underline;} ' +
                '.smiley_box .group:hover { color: #14999E; } ' + // #11AD6C

                    // Special smiley categories
                '.smiley_box .halloween { color: #E25E00; } ' +
                '.smiley_box .xmas { color: darkred; } ' +

                '.smiley_box hr { margin:3px 0px 0px 0px; color:#086b18; border:1px solid; } ' +

                    // Smilies
                '.smiley_box .box_content { overflow: hidden; } ' +
                '.smiley_box .box_content .smiley { border: 1px solid rgba(0,0,0,0); border-radius: 5px;} ' +
                '.smiley_box .box_content .smiley:hover { background: rgba(8, 148, 77, 0.2); border: 1px solid rgba(0, 128, 0, 0.5); } ' +

                    // Smiley page link
                '.smiley_box .box_footer { text-align:center; margin-top:4px; } ' +
                '.smiley_box a:link, .smiley_box a:visited { color: #086b18; font-size: 0.7em; } ' +
                '.smiley_box a:hover { color: #14999E; } ' +

                    // TODO Forum ...
                '.smiley_box.forum .box_header_left { float:left; } ' +
                    //'.smiley_box.forum .group { padding-right: 10px; } '+
                '.smiley_box.forum .box_header_right { text-align:right; margin-top:2px; } ' +

                '.smiley_box.forum { max-height:90px; margin-left:5px; width:99%; min-height:10px; } ' +
                '.smiley_box.forum .box_content { overflow:overlay; min-height:70px; margin-bottom:10px; } ' +

                '.smiley_box.forum a:link, .smiley_box.forum a:visited { font-size: 1em; } ' +

                '</style>').appendTo('head');


            // Smiley categories
            smileyArray.button = ["rollsmiliey", "smile"];

            smileyArray.standard = [
                "smilenew", "i/cnfy7elqh8dotnsdp", "lol", "neutral_new", "afraid", "freddus_pacman", "auslachen2", "kolobok-sanduhr", "bussi2", "winken4", "flucht2", "panik4", "ins-auge-stechen",
                "seb_zunge", "fluch4_GREEN", "baby_junge2", "blush-reloaded6", "frown", "verlegen", "blush-pfeif", "stevieh_rolleyes", "daumendreh2", "baby_taptap",
                "sadnew", "hust", "confusednew", "idea2", "irre", "irre4", "sleep", "candle", "nicken", "no_sad",
                "thumbs-up_new", "thumbs-down_new", "bravo2", "oh-no2", "kaffee2", "drunk", "saufen", "freu-dance", "hecheln", "headstand", "rollsmiliey", "eazy_cool01", "motz", "cuinlove", "biggrin"
            ];
            smileyArray.nature = [
                "dinosaurier07", "flu-super-gau", "ben_cat", "schwein", "hundeleine01", "blume", "ben_sharky", "ben_cow", "charly_bissig", "gehirnschnecke_confused", "mttao_fische", "mttao_angler",
                "insel", "fliegeschnappen", "i/cifohy0y1cl7nckzw", /* Spinne */ "i/cifogx34asrswrcjw", /* Schiffbrüchiger */ "plapperhase", "ben_dumbo"
            ];
            smileyArray.grepolis = [
                "mttao_wassermann", "i/cigrmpfofys5xtiks", /* Hera */ "i/cifvfsu3e2sdiipn0", /* Medusa */ "i/cigmv8wnffb3v0ifg", /* Mantikor */ "i/cigrqlp2odi2kqo24", /* Zyklop */
                "i/cj1l9gndtu3nduyvi", /* Minotaurus */ "i/cj2byjendffymp88t", /* Pegasus */ "i/cj2ccmi2x8mhcoikd", /* Hydra */
                "silvester_cuinlove", "mttao_schuetze", "kleeblatt2", "wallbash", /* "glaskugel4", */ "musketiere_fechtend", /* "krone-hoch",*/ "i/cifojb85jytq5h07g", // Wikinger
                "mttao_waage2", "steckenpferd", /* "kinggrin_anbeten2", */ "i/cifohielywpedbyh8", /* Grepo Love */ "skullhaufen", "pferdehaufen" // "i/ckajscggscw4s2u60"
            ];
            smileyArray.people = [
                "seb_hut5", "opa_boese2", "star-wars-yoda1-gruen", "hexefliegend", "snob", "seb_detektiv_ani", "seb_cowboy", "devil", "segen", "pirat5", "borg", "hexe3b",
                "i/cifoqe3geok0jco5o", // Ägypter
                "i/ciforgs313z0ae1cc", // Hippie
                "eazy_polizei", "stars_elvis", "mttao_chefkoch", "nikolaus", "pirate3_biggrin", "batman_skeptisch", "tubbie1", "tubbie2", "tubbie3", "tubbie4"
            ];
            smileyArray.other = [
                "steinwerfen", "herzen02", "scream-if-you-can", "kolobok", "headbash", "liebeskummer", "bussi", "brautpaar-reis", "grab-schaufler2", "boxen2", "aufsmaul",
                "sauf", "mttao_kehren", "sm", "weckruf", "klugscheisser2", "karte2_rot", "dagegen", "party", "dafuer", "outofthebox", "pokal_gold", "koepfler", "transformer"
            ];

            SmileyBox.checkHolidaySeason();

            if (SmileyBox.isHalloween) {
                smileyArray.halloween = [
                    "zombies_alien", "zombies_lol", "zombies_rolleyes", "zombie01", "zombies_smile", "zombie02", "zombies_skeptisch", "zombies_eek", "zombies_frown",
                    "scream-if-you-can", "geistani", "pfeildurchkopf01", "grab-schaufler", "kuerbisleuchten", "mummy3",
                    "kuerbishaufen", "halloweenskulljongleur", "fledermausvampir", "frankenstein_lol", "halloween_confused", "zombies_razz",
                    "halloweenstars_freddykrueger", "zombies_cool", "geist2", "fledermaus2", "halloweenstars_dracula"
                    // "batman" "halloweenstars_lastsummer"
                ];
            }
            if (SmileyBox.isXmas) {
                smileyArray.xmas = [
                    "schneeballwerfen", "schneeball", "xmas4_advent4", "nikolaus", "weihnachtsmann_junge", "schneewerfen_wald", "weihnachtsmann_nordpol", "xmas_kilroy_kamin",
                    "xmas4_laola", "xmas4_aufsmaul", "xmas3_smile", "xmas4_paketliebe", "mttao_ruprecht_peitsche", "3hlkoenige", "santa", "xmas4_hurra2", "weihnachtsgeschenk2", "fred_weihnachten-ostern"
                    //"dafuer", "outofthebox", "pokal_gold", "koepfler", "transformer"
                ];
            }

            //smileyArray.other = smileyArray.halloween.slice();

            // Forum: Extra smiley
            if (SmileyBox.isForum) {
                smileyArray.grepolis.push("i/ckajscggscw4s2u60"); // Pacman
                smileyArray.grepolis.push("i/cowqyl57t5o255zli"); // Bugpolis
                smileyArray.grepolis.push("i/cowquq2foog1qrbee"); // Inno
            }

            SmileyBox.loadSmileys();
        },
        deactivate: function () {
            $('#dio_smiley').remove();
        },
        checkHolidaySeason: function () {
            // TODO: HolidaySpecial-Klasse stattdessen benutzen
            var daystamp = 1000 * 60 * 60 * 24, today = new Date((new Date()) % (daystamp * (365 + 1 / 4))), // without year

            // Halloween-Smileys ->15 days
                halloween_start = daystamp * 297, // 25. Oktober
                halloween_end = daystamp * 321, // 8. November
            // Xmas-Smileys -> 28 Tage
                xmas_start = daystamp * 334, // 1. Dezember
                xmas_end = daystamp * 361; // 28. Dezember

            SmileyBox.isHalloween = (today >= halloween_start) ? (today <= halloween_end) : false;

            SmileyBox.isXmas = (today >= xmas_start) ? (today <= xmas_end) : false;
        },
        // preload images
        loadSmileys: function () {
            // Replace german sign smilies
            if (LID !== "de") {
                smileyArray.other[17] = "dagegen2";
                smileyArray.other[19] = "dafuer2";
            }

            for (var e in smileyArray) {
                if (smileyArray.hasOwnProperty(e)) {
                    for (var f in smileyArray[e]) {
                        if (smileyArray[e].hasOwnProperty(f)) {
                            var src = smileyArray[e][f];

                            smileyArray[e][f] = new Image();
                            smileyArray[e][f].className = "smiley";

                            if (src.substring(0, 2) == "i/") {
                                smileyArray[e][f].src = "http://666kb.com/" + src + ".gif";
                            } else {
                                if (SmileyBox.loading_error == false) {
                                    smileyArray[e][f].src = "http://www.greensmilies.com/smile/smiley_emoticons_" + src + ".gif";
                                } else {
                                    smileyArray[e][f].src = 'http://s1.directupload.net/images/140128/93x3p4co.gif';
                                }
                            }
                            smileyArray[e][f].onerror = function () {
                                this.src = 'http://s1.directupload.net/images/140128/93x3p4co.gif';
                            };
                        }
                    }
                }
            }
        },

        // Forum smilies
        changeForumEditorLayout: function () {
            $('.blockrow').css({border: "none"});

            // Subject/Title
            $($('.section div label[for="title"]').parent()).css({float: "left", width: "36%", marginRight: "20px"});
            $($('.section div label[for="subject"]').parent()).css({float: "left", width: "36%", marginRight: "20px"});

            $('.section div input').eq(0).css({marginBottom: "-10px", marginTop: "10px"});
            $('#display_posticon').remove();

            // Posticons
            $('.posticons table').css({width: "50%" /* marginTop: "-16px"*/});
            $('.posticons').css({marginBottom: "-16px"});
            $('.posticons').insertAfter($('.section div label[for="title"]').parent());
            $('.posticons').insertAfter($('.section div label[for="subject"]').parent());
            // Posticons hint
            $('.posticons p').remove();
            // Posticons: No Icon - radio button
            $(".posticons [colspan='14']").parent().replaceWith($(".posticons [colspan='14']"));
            $(".posticons [colspan='14']").children().wrap("<nobr></nobr>");
            $(".posticons [colspan='14']").appendTo('.posticons tr:eq(0)');
            $(".posticons [colspan='4']").remove();
        },

        addForum: function () {
            $('<div class="smiley_box forum"><div>' +
                '<div class="box_header_left">' +
                '<span class="group standard active">' + getText("labels", "std") + '</span>' +
                '<span class="group grepolis">' + getText("labels", "gre") + '</span>' +
                '<span class="group nature">' + getText("labels", "nat") + '</span>' +
                '<span class="group people">' + getText("labels", "ppl") + '</span>' +
                '<span class="group other">' + getText("labels", "oth") + '</span>' +
                (SmileyBox.isHalloween ? '<span class="group halloween">' + getText("labels", "hal") + '</span>' : '') +
                (SmileyBox.isXmas ? '<span class="group xmas">' + getText("labels", "xma") + '</span>' : '') +
                '</div>' +
                '<div class="box_header_right"><a class="smiley_link" href="http://www.greensmilies.com/smilie-album/" target="_blank">WWW.GREENSMILIES.COM</a></div>' +
                '<hr>' +
                '<div class="box_content" style="overflow: hidden;"><hr></div>' +
                '</div></div><br>').insertAfter(".texteditor");

            SmileyBox.addSmileys("standard", "");

            $('.group').click(function () {
                $('.group.active').removeClass("active");
                $(this).addClass("active");
                // Change smiley group
                SmileyBox.addSmileys(this.className.split(" ")[1], "");
            });
        },

        // add smiley box
        add: function (e) {
            var bbcodeBarId = "";
            switch (e) {
                case "/alliance_forum/forum":
                    bbcodeBarId = "#forum";
                    break;
                case "/message/forward":
                    bbcodeBarId = "#message_bbcodes";
                    break;
                case "/message/new":
                    bbcodeBarId = "#message_bbcodes";
                    break;
                case "/message/view":
                    bbcodeBarId = "#message_bbcodes";//setWonderIconsOnMap
                    break;
                case "/player_memo/load_memo_content":
                    bbcodeBarId = "#memo_edit"; // old notes
                    break;
                case "/frontend_bridge/fetch":
                    bbcodeBarId = ".notes_container"; // TODO: new notes
                    break;
            }
            if (($(bbcodeBarId + ' #emots_popup_7').get(0) || $(bbcodeBarId + ' #emots_popup_15').get(0)) && PID == 84367) {
                $(bbcodeBarId + " .bb_button_wrapper").get(0).lastChild.remove();
            }
            $('<img class="smiley_button" src="http://www.greensmilies.com/smile/smiley_emoticons_smile.gif">').appendTo(bbcodeBarId + ' .bb_button_wrapper');

            $('<div class="smiley_box game">' +
                '<div class="bbcode_box middle_center"><div class="bbcode_box middle_right"></div><div class="bbcode_box middle_left"></div>' +
                '<div class="bbcode_box top_left"></div><div class="bbcode_box top_right"></div><div class="bbcode_box top_center"></div>' +
                '<div class="bbcode_box bottom_center"></div><div class="bbcode_box bottom_right"></div><div class="bbcode_box bottom_left"></div>' +
                '<div class="box_header">' +
                '<span class="group standard active">' + getText("labels", "std") + '</span>' +
                '<span class="group grepolis">' + getText("labels", "gre") + '</span>' +
                '<span class="group nature">' + getText("labels", "nat") + '</span>' +
                '<span class="group people">' + getText("labels", "ppl") + '</span>' +
                '<span class="group ' + (SmileyBox.isHalloween ? 'halloween' : (SmileyBox.isXmas ? 'xmas' : 'other')) + '">' + getText("labels", (SmileyBox.isHalloween ? 'hal' : (SmileyBox.isXmas ? 'xma' : 'oth'))) + '</span>' +
                '</div>' +
                '<hr>' +
                '<div class="box_content"></div>' +
                '<hr>' +
                '<div class="box_footer"><a href="http://www.greensmilies.com/smilie-album/" target="_blank">WWW.GREENSMILIES.COM</a></div>' +
                '</div>').appendTo(bbcodeBarId + ' .bb_button_wrapper');


            $(bbcodeBarId + ' .group').click(function () {
                $('.group.active').removeClass("active");
                $(this).addClass("active");
                // Change smiley group
                SmileyBox.addSmileys(this.className.split(" ")[1], "#" + $(this).closest('.bb_button_wrapper').parent().get(0).id);
            });

            SmileyBox.addSmileys("standard", bbcodeBarId);

            // smiley box toggle
            $(bbcodeBarId + " .smiley_button").toggleClick(
                function () {
                    this.src = smileyArray.button[0].src;
                    $(this).closest('.bb_button_wrapper').find(".smiley_box").get(0).style.display = "block";
                },
                function () {
                    this.src = smileyArray.button[1].src;
                    $(this).closest('.bb_button_wrapper').find(".smiley_box").get(0).style.display = "none";
                }
            );
        },

        // insert smileys from arrays into smiley box
        addSmileys: function (type, bbcodeBarId) {
            // reset smilies
            if ($(bbcodeBarId + " .box_content").get(0)) {
                $(bbcodeBarId + " .box_content").get(0).innerHTML = '';
            }
            // add smilies
            for (var e in smileyArray[type]) {
                if (smileyArray[type].hasOwnProperty(e)) {
                    $(smileyArray[type][e]).clone().appendTo(bbcodeBarId + " .box_content");
                    //$('<img class="smiley" src="' + smileyArray[type][e].src + '" alt="" />').appendTo(bbcodeBarId + " .box_content");
                }
            }
            $('.smiley').css({margin: '0px', padding: '2px', maxHeight: '35px', cursor: 'pointer'});

            $(bbcodeBarId + " .box_content .smiley").click(function () {
                var textarea;
                if (uw.location.pathname === "/game/index") {
                    // hide smiley box
                    $(this).closest('.bb_button_wrapper').find(".smiley_button").click();
                    // find textarea
                    textarea = $(this).closest('.gpwindow_content').find("textarea").get(0);
                } else {

                    if ($('.editor_textbox_container').get(0)) {
                        textarea = $('.editor_textbox_container .cke_contents textarea').get(0);
                    } else {
                        $(this).appendTo('iframe .forum');
                    }
                }
                var text = $(textarea).val();
                $(textarea).val(text.substring(0, $(textarea).get(0).selectionStart) + "[img]" + this.src + "[/img]" + text.substring($(textarea).get(0).selectionEnd));
            });
        }
    };

    if ($(".editor_textbox_container").get(0)) {
        SmileyBox.activate();
        SmileyBox.changeForumEditorLayout();
        SmileyBox.addForum();
    }

    /*******************************************************************************************************************************
     * Biremes counter
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Incremental update when calling a city (experimental, especially intended for siege worlds)
     * ----------------------------------------------------------------------------------------------------------------------------
     * @deprecated
     * *****************************************************************************************************************************/
    var BiremeCounter = {
        activate: function () {
            $(".picomap_container").prepend("<div id='available_bullseye_unit'><div id='bi_count'></div></div>");

            $('.picomap_overlayer').tooltip(getText("options", "bir")[0]);
            BiremeCounter.update();

            // Style
            $('<style id="dio_bireme_counter">' +
                '#available_bullseye_unit { background: url(https://gpall.innogamescdn.com/images/game/units/units_sprite_90x90_compressed.jpg); height:90px;' +
                'width:90px; position: relative; margin: 5px 28px 0px 28px; background-position: -270px 0px; } ' +
                '#bi_count { color:#826021; position:relative; top:28px; font-style:italic; width:79px; } ' +
                '#sea_id { background: none; font-size:25px; cursor:default; height:50px; width:50px; position:absolute; top:70px; left:157px; z-index: 30; } ' +
                '</style>').appendTo('head');

            // fs_count: color: #FFC374;position: relative;top: 30px;font-style: italic;width: 101px;text-shadow: 1px 1px 0px rgb(69, 0, 0);
            // manti: background-position: -1350px 180px;
            // manti-count: color: #ECD181;position: relative;top: 48px;font-style: italic;width: 52px;text-shadow: 2px 2px 0px rgb(0, 0, 0);
            // medusa:-1440px 182px;
            // med-count: color: #DEECA4;position: relative;top: 50px;font-style: italic;width: 55px;text-shadow: 2px 2px 0px rgb(0, 0, 0);

            // Set Sea-ID beside the bull eye
            $('#sea_id').prependTo('#ui_box');
        },
        deactivate: function () {
            $('#available_bullseye_unit').remove();
            $('#dio_bireme_counter').remove();
            $('#sea_id').appendTo('.picomap_container');
        },
        save: function () {
            saveValue(WID + "_biremes", JSON.stringify(biriArray));
        },
        update: function () {
            var sum = 0, e;
            if ($('#bi_count').get(0)) {
                for (e in biriArray) {
                    if (biriArray.hasOwnProperty(e)) {
                        if (!uw.ITowns.getTown(e)) { // town is no longer in possession of user
                            delete biriArray[e];
                            BiremeCounter.save();
                        } else {
                            sum += parseInt(biriArray[e], 10);
                        }
                    }
                }

                sum = sum.toString();
                var str = "", fsize = ['1.4em', '1.2em', '1.15em', '1.1em', '1.0em'], i;

                for (i = 0; i < sum.length; i++) {
                    str += "<span style='font-size:" + fsize[i] + "'>" + sum[i] + "</span>";
                }
                $('#bi_count').get(0).innerHTML = "<b>" + str + "</b>";
            }
        },
        get: function () {
            var biremeIn = parseInt(uw.ITowns.getTown(uw.Game.townId).units().bireme, 10),
                biremeOut = parseInt(uw.ITowns.getTown(uw.Game.townId).unitsOuter().bireme, 10);
            if (isNaN(biremeIn)) biremeIn = 0;
            if (isNaN(biremeOut)) biremeOut = 0;
            if (!biriArray[uw.Game.townId] || biriArray[uw.Game.townId] < (biremeIn + biremeOut)) {
                biriArray[uw.Game.townId] = biremeIn;
            }
            BiremeCounter.update();
            BiremeCounter.save();
        },
        getDocks: function () {
            var windowID = uw.BuildingWindowFactory.getWnd().getID(),
                biremeTotal = parseInt($('#gpwnd_' + windowID + ' #unit_order_tab_bireme .unit_order_total').get(0).innerHTML, 10);

            if (!isNaN(biremeTotal)) biriArray[uw.Game.townId] = biremeTotal;
            BiremeCounter.update();
            BiremeCounter.save();
        },
        getAgora: function () {
            var biremeTotal = parseInt(uw.ITowns.getTown(parseInt(uw.Game.townId, 10)).units().bireme, 10);
            if (isNaN(biremeTotal)) biremeTotal = 0;

            $('#units_beyond_list .bireme').each(function () {
                biremeTotal += parseInt(this.children[0].innerHTML, 10);
            });
            biriArray[uw.Game.townId] = biremeTotal;
            BiremeCounter.update();
            BiremeCounter.save();
        }
    };

    /*******************************************************************************************************************************
     * Favor Popup
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Improved favor popup
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/
    var FavorPopup = {
        godArray: {
            zeus: '0px',
            hera: '-152px',
            poseidon: '-101px',
            athena: '-50px',
            hades: '-203px',
            artemis: '-305px'
        }, godImg: (new Image()).src = "https://diotools.de/images/game/gods.png",

        activate: function () {
            $('.gods_favor_button_area, #favor_circular_progress').bind('mouseover mouseout', function () {
                return false;
            });
            $('.gods_area').bind('mouseover', function () {
                FavorPopup.setFavorPopup();
            });
        },

        deactivate: function () {
            $('.gods_favor_button_area, #favor_circular_progress').unbind('mouseover mouseout');
            $('.gods_area').unbind('mouseover');
        },

        setFavorPopup: function () {
            var pic_row = "", fav_row = "", prod_row = "", tooltip_str;

            for (var g in FavorPopup.godArray) {
                if (FavorPopup.godArray.hasOwnProperty(g)) {
                    if (uw.ITowns.player_gods.attributes.temples_for_gods[g]) {
                        pic_row += '<td><div style="width:50px;height:51px;background:url(' + FavorPopup.godImg + ');background-position: 0px ' + FavorPopup.godArray[g] + ';"></td>';
                        fav_row += '<td class="bold" style="color:blue">' + uw.ITowns.player_gods.attributes[g + "_favor"] + '</td>';
                        prod_row += '<td class="bold">' + uw.ITowns.player_gods.attributes.production_overview[g].production + '</td>';
                    }
                }
            }
            tooltip_str = $('<table><tr><td></td>' + pic_row + '</tr>' +
                '<tr align="center"><td><img src="https://gpall.innogamescdn.com/images/game/res/favor.png"></td>' + fav_row + '</tr>' +
                '<tr align="center"><td>+</td>' + prod_row + '</tr>' +
                '</table>');

            $('.gods_favor_button_area, #favor_circular_progress').tooltip(tooltip_str);
        }
    };

    /*******************************************************************************************************************************
     * GUI Optimization
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Modified spell box (smaller, moveable & position memory)
     * | ● Larger taskbar and minimize daily reward-window on startup
     * | ● Modify chat
     * | ● Improved display of troops and trade activity boxes (movable with position memory on startup)
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/

    var Spellbox = {
        observe: function () {
            $.Observer(uw.GameEvents.ui.layout_gods_spells.rendered).subscribe('DIO_SPELLBOX_CHANGE_OPEN', function () {
                if (spellbox.show == false) {
                    spellbox.show = true;
                    saveValue("spellbox", JSON.stringify(spellbox));
                }
                Spellbox.change();
            });
            $.Observer(uw.GameEvents.ui.layout_gods_spells.state_changed).subscribe('DIO_SPELLBOX_CLOSE', function () {
                spellbox.show = false;
                saveValue("spellbox", JSON.stringify(spellbox));
            });

            // GRCRT Bug-Fix
            if(typeof(RepConv) !== "undefined") {
                $.Observer(uw.GameEvents.ui.layout_gods_spells.rendered).unsubscribe('GRCRT_GRC_ui_layout_gods_spells_rendered');

                $.Observer(uw.GameEvents.ui.layout_gods_spells.rendered).subscribe('GRCRT_GRC_ui_layout_gods_spells_rendered', function () {
                    // PlayerGods doesn't exists at game start and the function would call an error
                    if (typeof(RepConv.models.PlayerGods) !== "undefined") {
                        RepConvTool.loadPower();
                    }
                });
            }
        },

        activate: function () {
            Spellbox.observe();
            Spellbox.change();

            $('<style id="dio_spellbox_style" type="text/css">' +
                    // Don't hide hero box, unit time box and hero coin box from GRC
                '#ui_box .nui_right_box { overflow: visible; } ' +
                    // Hide negative spells
                '#ui_box .bolt, #ui_box .earthquake, #ui_box .pest { display: none } ' +
                    // Change spell order
                '#ui_box .god_container { float: left } ' +
                '#ui_box .god_container[data-god_id="zeus"], #ui_box .god_container[data-god_id="athena"] { float: none } ' +
                    // Remove background
                '#ui_box .powers_container { background: none !important } ' +
                    // Hide god titles
                '#ui_box .content .title { display: none !important } ' +
                    // Hide border elements
                '#ui_box .gods_spells_menu .left, #ui_box .gods_spells_menu .right, #ui_box .gods_spells_menu .top, #ui_box .gods_spells_menu .bottom { display: none } ' +
                    // Layout
                '#ui_box .gods_area { height:150px } ' +

                '#ui_box .gods_spells_menu { width: 134px; position:absolute; z-index:5000; padding:30px 0px 0px -4px } ' +
                '#ui_box .gods_spells_menu .content { background:url(https://gpall.innogamescdn.com/images/game/layout/power_tile.png) 1px 4px; overflow:auto; margin:0 0 0px 0px; border:3px inset rgb(16, 87, 19); border-radius:10px } ' +

                '#ui_box .nui_units_box { display:block; margin-top:-8px; position:relative } ' +
                '#ui_box .nui_units_box .bottom_ornament { margin-top:-28px; position: relative } ' +
                '</style>').appendTo('head');

            // Draggable Box
            $("#ui_box .gods_spells_menu").draggable({
                containment: "body",
                distance: 10,
                snap: "body, .gods_area, .nui_units_box, .ui_quickbar, .nui_main_menu, .minimized_windows_area, #island_quests_overview",
                opacity: 0.7,
                stop: function () {
                    spellbox.top = this.style.top;
                    spellbox.left = this.style.left;

                    saveValue("spellbox", JSON.stringify(spellbox));
                }
            });
            $("#ui_box .gods_spells_menu").before($('#ui_box .nui_units_box'));

            // Position
            $('#ui_box .gods_spells_menu').css({
                left: spellbox.left,
                top: spellbox.top
            });

            // Active at game start?
            if (spellbox.show && !$('#ui_box .btn_gods_spells').hasClass('active')) {
                $('#ui_box .btn_gods_spells').click();
            }
        },
        deactivate: function () {
            $('#ui_box .gods_spells_menu').draggable('destroy');

            // Position
            $('#ui_box .gods_spells_menu').css({
                left: "auto",
                top: "150px"
            });

            //$("#ui_box .gods_spells_menu").appendTo('gods_area'); // ?

            $('#dio_spellbox_style').remove();

            $.Observer(GameEvents.ui.layout_gods_spells.rendered).unsubscribe('DIO_SPELLBOX_CHANGE_OPEN');
            $.Observer(GameEvents.ui.layout_gods_spells.state_changed).unsubscribe('DIO_SPELLBOX_CLOSE');
        },

        change: function () {
            //console.log("Unitsbox: "+ $(".nui_units_box").height());
            //console.log("Spellbox: "+ $(".gods_spells_menu").height());

            // Change spell order
            $('#ui_box .god_container[data-god_id="poseidon"]').prependTo('#ui_box .gods_spells_menu .content');
            $('#ui_box .god_container[data-god_id="athena"]').appendTo('#ui_box .gods_spells_menu .content');
            $('#ui_box .god_container[data-god_id="artemis"]').appendTo('#ui_box .gods_spells_menu .content');
        }

    };


    // Minimize Daily reward window on startup
    function minimizeDailyReward() {
        /*
         $.Observer(uw.GameEvents.window.open).subscribe('DIO_WINDOW', function(u,dato){});
         $.Observer(uw.GameEvents.window.reload).subscribe('DIO_WINDOW2', function(f){});
         */
        if (MutationObserver) {
            var startup = new MutationObserver(function (mutations) {
                mutations.forEach(function (mutation) {
                    if (mutation.addedNodes[0]) {
                        if ($('.daily_login').get(0)) { //  && !uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_SHOW_ON_LOGIN).isMinimized()
                            $('.daily_login').find(".minimize").click();
                            //uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_SHOW_ON_LOGIN).minimize();
                        }
                    }
                });
            });
            startup.observe($('body').get(0), {attributes: false, childList: true, characterData: false});

            setTimeout(function () {
                startup.disconnect();
            }, 3000);
        }
    }

    // Larger taskbar
    var Taskbar = {
        activate: function () {
            $('.minimized_windows_area').get(0).style.width = "150%";
            $('.minimized_windows_area').get(0).style.left = "-25%";
        },
        deactivate: function () {
            $('.minimized_windows_area').get(0).style.width = "100%";
            $('.minimized_windows_area').get(0).style.left = "0%";
        }
    };

    // Hide fade out buttons
    function hideNavElements() {
        if (Game.premium_features.curator <= Timestamp.now()) {
            $('.nav').each(function () {
                this.style.display = "none";
            });
        }
    }

    /*******************************************************************************************************************************
     * Modify Chat
     *******************************************************************************************************************************/
    var Chat = {
        interval: null,

        activate: function () {
            if (!$('#dio_flash').get(0)) {
                $('<script id="dio_flash" type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>').appendTo('head');
            }
            $('<style id="dio_chat">.nui_main_menu .chat { filter: "url(#Hue1)"; -webkit-filter: "hue-rotate(65deg)";  }</style>').appendTo('head');
            Chat.updateChatUser();
            Chat.interval = setInterval(function () {
                Chat.updateChatUser();
            }, 300000); // 5 minutes
            $('.nui_main_menu .chat').mouseover(function () {
                //Chat.popupChatUser();
            });
            // No alliance chat:
            if ($('.nui_main_menu .chat').hasClass('disabled')) {
                $('.nui_main_menu .chat').removeClass('disabled');
            }
        },
        deactivate: function () {
            $('#dio_chat').remove();
            $('.nui_main_menu .chat .indicator').get(0).style.display = 'none';

            clearInterval(Chat.interval);

            if (GPWindowMgr.getOpenFirst(Layout.wnd.TYPE_CHAT)) {
                GPWindowMgr.getOpenFirst(Layout.wnd.TYPE_CHAT).close();
            }
        },

        updateChatUser: function () {
            var market = uw.Game.market_id;
            if (gm) {
                // GM-BROWSER:
                chatUserRequest();
            } else {
                // SAFARI:
                $.ajax({
                    url: "https://diotools.de/game/chatuser_count.php?chan=Grepo" + (market === "de" ? "lisDE" : ""),
                    dataType: 'text',
                    success: function (text) {
                        $('.nui_main_menu .chat .indicator').get(0).innerHTML = text;
                        $('.nui_main_menu .chat .indicator').get(0).style.display = 'block';
                    },
                    error: function (xhr, ajaxOptions, thrownError) {
                        $('.nui_main_menu .chat .indicator').get(0).style.display = 'none';
                    }
                });
            }
        },

        popupChatUser: function () { // not used yet
            setTimeout(function () {
                GM_xmlhttpRequest({
                    method: "POST",
                    url: "http://wwwapi.iz-smart.net/modules.php?name=Chaninfo&file=nicks&chan=Grepolis" + uw.Game.market_id.toUpperCase(),
                    onload: function (response) {
                        //$('.nui_main_menu .chat .indicator').get(0).innerHTML =
                        //console.log(response.responseText);
                        //$('.nui_main_menu .chat .indicator').get(0).style.display = 'inline';
                    }
                });
            }, 0);
        },

        // Modify chat window
        open: function () {
            var host = {fr: 'irc.quakenet.org', def: 'flash.afterworkchat.de'},
                market = uw.Game.market_id, select_nick = false, chatwnd_id,
                nickname = uw.Game.player_name;

            setTimeout(function () {
                Chat.updateChatUser();
            }, 30000); // 30 seconds

            //uw.GPWindowMgr.Create(uw.Layout.wnd.TYPE_CHAT);

            //uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_CHAT).setWidth(600);
            //uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_CHAT).setHeight(300);
            //uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_CHAT).setPosition([0,'bottom']);

            //console.log(uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_CHAT));

            chatwnd_id = '#gpwnd_' + uw.GPWindowMgr.getOpenFirst(uw.Layout.wnd.TYPE_CHAT).getID();

            $('#chat').get(0).innerHTML = "";
            //$(chatwnd_id).parent().children('.gpwindow_left').remove();
            //$(chatwnd_id).parent().children('.gpwindow_right').remove();
            //$(chatwnd_id).parent().children('.gpwindow_top').remove();
            //$(chatwnd_id).parent().children('.gpwindow_bottom').remove();
            //$(chatwnd_id).parent().parent().children('.ui-dialog-titlebar').remove();

            var replaceArray = {
                // Russian:
                "Ё": "YO",
                "Й": "I",
                "Ц": "TS",
                "У": "U",
                "К": "K",
                "Е": "E",
                "Н": "N",
                "Г": "G",
                "Ш": "SH",
                "Щ": "SCH",
                "З": "Z",
                "Х": "H",
                "Ъ": "'",
                "ё": "yo",
                "й": "i",
                "ц": "ts",
                "у": "u",
                "к": "k",
                "е": "e",
                "н": "n",
                "г": "g",
                "ш": "sh",
                "щ": "sch",
                "з": "z",
                "х": "h",
                "ъ": "'",
                "Ф": "F",
                "Ы": "I",
                "В": "V",
                "А": "a",
                "П": "P",
                "Р": "R",
                "О": "O",
                "Л": "L",
                "Д": "D",
                "Ж": "ZH",
                "Э": "E",
                "ф": "f",
                "ы": "i",
                "в": "v",
                "а": "a",
                "п": "p",
                "р": "r",
                "о": "o",
                "л": "l",
                "д": "d",
                "ж": "zh",
                "э": "e",
                "Я": "Ya",
                "Ч": "CH",
                "С": "S",
                "М": "M",
                "И": "I",
                "Т": "T",
                "Ь": "'",
                "Б": "B",
                "Ю": "YU",
                "я": "ya",
                "ч": "ch",
                "с": "s",
                "м": "m",
                "и": "i",
                "т": "t",
                "ь": "'",
                "б": "b",
                "ю": "yu",

                // Greek:
                'Α': 'A',
                'Β': 'B',
                'Γ': 'G',
                'Δ': 'D',
                'Ε': 'E',
                'Ζ': 'Z',
                'Η': 'H',
                'Θ': 'Th',
                'Ι': 'I',
                'Κ': 'K',
                'Λ': 'L',
                'Μ': 'M',
                'Ν': 'N',
                'Ξ': 'J',
                'Ο': 'O',
                'Π': 'P',
                'Ρ': 'R',
                'Σ': 'S',
                'Τ': 'T',
                'Υ': 'U',
                'Φ': 'F',
                'Χ': 'Ch',
                'Ψ': 'Ps',
                'Ω': 'W',
                'Ά': 'A',
                'Έ': 'E',
                'Ή': 'H',
                'Ί': 'I',
                'Ό': 'O',
                'Ύ': 'U',
                'Ώ': 'W',
                'Ϊ': 'I',
                'α': 'a',
                'β': 'b',
                'γ': 'g',
                'δ': 'd',
                'ε': 'e',
                'ζ': 'z',
                'η': 'h',
                'θ': 'th',
                'ι': 'i',
                'κ': 'k',
                'λ': 'l',
                'μ': 'm',
                'ν': 'n',
                'ξ': 'j',
                'ο': 'o',
                'π': 'p',
                'ρ': 'r',
                'ς': 's',
                'σ': 's',
                'τ': 't',
                'υ': 'u',
                'φ': 'f',
                'χ': 'ch',
                'ψ': 'ps',
                'ω': 'w',
                'ά': 'a',
                'έ': 'e',
                'ή': 'h',
                'ί': 'i',
                'ό': 'o',
                'ύ': 'u',
                'ώ': 'w',
                'ϊ': 'i',
                'ΐ': 'i'
            };

            function replaceNick(word) {
                var temp = "", temp2 = "";
                // Step 1: Replace Special and some german chars
                word = word.replace(/[.,:,+,*]/g, "").replace(/[=,\ ,\-]/g, "_").replace(/ö/gi, "oe").replace(/ä/gi, "ae").replace(/ü/gi, "ue").replace(/ß/g, "ss");
                // Step 2: Replace russian and greek chars
                if (!word.match(/^[a-zA-Z0-9_]+$/)) {
                    temp = word.split('').map(function (char) {
                        var ch = "";
                        ch = replaceArray[char] || char;
                        return ch;
                    }).join("");
                    // Step 3: Delete all other special chars
                    if (!temp.match(/^[a-zA-Z0-9_]+$/)) {
                        for (var c = 0; c < temp.length; c++) {
                            if (temp[c].match(/^[a-zA-Z0-9_]+$/)) {
                                temp2 += temp[c];
                            }
                        }
                        select_nick = true;
                        temp = temp2;
                    }
                    word = temp;
                }
                return word;
            }

            //nickname = "kνnmδενεί-ναισυνδεδ*εμένος_Ιππέας"; // test nickname
            nickname = replaceNick(nickname);

            if (PID == 84367) {
                nickname = "DionY_";
            }

            $('<iframe src="http://flash.afterworkchat.de/1.0/FlashChat.swf' + //http://grepodio.heliohost.org/lightIRC/index.php'+
                '?host=flash.afterworkchat.de' +
                '&languagePath=http://flash.afterworkchat.de/1.0/language/' +
                '&port=6667' +
                '&policyPort=9000' +
                '&styleURL=https://diotools.de/css/green2.css' + //http://grepodio.heliohost.org/style.css'+ //
                '&emoticonPath=https://diotools.de/chat/emoticons/' + //http://www.greensmilies.com/smile/smiley_emoticons_'+
                '&emoticonList=' +
                ':)->smile.png,:(->sad.png,:O->baby.swf,:D->biggrin.png,~D->coffee.swf,:P->tongue.swf,8)->cool.png,:|->neutral.png,X)->drunk.swf,%5e%5e->grins.png,:{->cry.swf,:S->verlegen.png,' +
                ':$->blush.swf,:]->lol.swf,:*->bussi.swf,:[->fluch.swf' +
                    //'&accessKey=54a2846a460ae1703ac690d21551b997'+
                '&nick=' + nickname +
                '&nickAlternate=' + nickname + '_' +
                '&autojoin=%23GREPO,%23Grepolis' + market.toUpperCase() +
                '&showNickSelection=' + select_nick +
                '&showNavigation=true' +
                '&navigationPosition=top' +
                '&showNickSelection=false' +
                '&showIdentifySelection=false' +
                '&language=' + LID +
                '&quitMessage=CYA' +
                '&showChannelHeader=false' +
                    //'&useUserListIcons=true'+
                '&userListWidth=100' +
                '&soundAlerts=true' +
                '&soundOnNewChannelMessage=false' +
                '&showServerWindow=false' +
                '&fontSize=9' +
                '&showJoinPartMessages=false' +
                '&showMenuButton=false' +
                '&showTranslationButton=false' +
                '&showTimestamps=true' +
                    //'&showInfoMessages=false'+
                '&showRegisterNicknameButton=false' +
                '&showRichTextControls=false' +
                    //'&useUserListIcons=true'+
                '&showUserListInformationPopup=false' +
                '&showNickChangeButton=false' +
                '&showChannelCentral=false' +
                '&showOptionsButton=false' +
                '&showEmoticonsButton=true' +
                '&rememberNickname=false' +
                '" style="width:518px; height:357px; border:0px;"></iframe>').appendTo("#chat");

            /*
             $('<html><body><div id="lightIRC"><p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p></div>'+
             '<script type="text/javascript">'+
             'var params = {};'+
             'params.languagePath			= "http://flash.afterworkchat.de/1.0/language/";'+
             'params.host					= "flash.afterworkchat.de";'+
             'params.port					= 6667;'+
             'params.policyPort			= 9000;'+
             //'params.accessKey			= "54a2846a460ae1703ac690d21551b997";'+
             'params.styleURL				= "http://diotools.de/css/green2.css";'+
             'params.emoticonPath			= "http://diotools.de/chat/emoticons/";'+
             'params.emoticonList			= ":)->smile.png,:(->sad.png,:O->baby.swf,:D->biggrin.png,~D->coffee.swf,:P->tongue.swf,8)->cool.png,:|->neutral.png,X)->drunk.swf,%5e%5e->grins.png,:{->cry.swf,:S->verlegen.png,'+
             ':$->blush.swf,:]->lol.swf,:*->bussi.swf,:[->fluch.swf";'+
             'params.nick					= "'+ nickname + '";' +
             'params.autojoin				= "%23GREPO,%23Grepolis'+ market.toUpperCase() + '";' +
             'params.showNickSelection		= ' + select_nick + ';'+
             'params.showIdentifySelection = false;'+
             'params.language				= "'+ LID +'";'+
             'params.soundAlerts			= true;'+
             'params.fontSize				= "10";'+
             'params.navigationPosition	= "top";'+
             'params.showJoinPartMessages	= false;'+
             'params.showTimestamps		= true;'+
             'params.showRegisterNicknameButton = false;'+
             'params.showNickChangeButton	= true;'+
             'params.showOptionsButton		= true;'+
             'params.showServerWindow		= false;'+
             'params.showOptionsButton		= false;'+
             'params.showMenuButton		= false;'+
             'params.showTranslationButton	= false;'+
             'params.showRichTextControls	= false;'+
             'params.showChannelHeader		= false;'+
             'params.rememberNickname		= false;'+
             'params.userListWidth			= 100;' +
             'params.soundAlerts			= true;'+
             'params.soundOnNewChannelMessage = false;'+
             'swfobject.embedSWF("http://flash.afterworkchat.de/1.0/FlashChat.swf", "lightIRC", "100%", "100%", "10.0.0", "http://flash.afterworkchat.de/expressinstall.swf", params, {wmode:"transparent"});'+
             '</script></body></html>').appendTo("#chat");
             */
        }
    };

    /*******************************************************************************************************************************
     * Activity boxes
     * ----------------------------------------------------------------------------------------------------------------------------
     * | ● Show troops and trade activity boxes
     * | ● Boxes are magnetic & movable (position memory)
     * ----------------------------------------------------------------------------------------------------------------------------
     *******************************************************************************************************************************/
    var mut_toolbar, mut_command, mut_trade;

    var save_command_mouseout,
        save_commandlist_mouseout,
        save_trade_mouseout,
        save_tradelist_mouseout,

        save_command_mouseover,
        save_trade_mouseover;


    var ActivityBoxes = {
        activate: function () {
            ActivityBoxes.checkToolbarAtStart();

            $('#toolbar_activity_commands_list').css({
                left: commandbox.left + "px",
                top: commandbox.top + "px"
            });

            $('<style id="fix_lists" type="text/css">' +
                '#toolbar_activity_commands_list, #toolbar_activity_trades_list { width: 160px}' +
                '.dropdown-list .content { max-height: 329px}' +
                '</style>' +
                '<style id="dio_fix_trade" type="text/css">' +
                '#toolbar_activity_trades_list {' +
                'left:' + tradebox.left + 'px !important;' +
                'top: ' + tradebox.top + 'px !important}' +
                '</style>').appendTo('head');


            ActivityBoxes.draggableTradeBox();
            ActivityBoxes.draggableCommandBox();

            ActivityBoxes.catchToolbarEvents();
        },
        deactivate: function () {
            ActivityBoxes.hideTradeList();
            ActivityBoxes.hideCommandList();

            mut_toolbar.disconnect();
            mut_command.disconnect();
            mut_trade.disconnect();
        },
        showTradeList: function () {
            if (!$('#dio_trades_activity_style').get(0)) {
                $('#toolbar_activity_trades').mouseover();
                $('<style id="dio_trades_activity_style"> #toolbar_activity_trades_list { display: block !important; } </style>').appendTo("head");
            }
        },
        showCommandList: function () {
            if (!$('#dio_commands_activity_style').get(0)) {
                $('#toolbar_activity_commands').mouseover();
                $('<style id="dio_commands_activity_style"> #toolbar_activity_commands_list { ' +
                    'display:block !important; left:' + commandbox.left + 'px; top:' + commandbox.top + 'px; }' +
                    '</style>').appendTo("head");
            }
        },
        hideTradeList: function () {
            if ($('#dio_trades_activity_style').get(0)) {
                $('#dio_trades_activity_style').remove();
                $('#toolbar_activity_trades').mouseout();
            }
        },
        hideCommandList: function () {
            if ($('#dio_commands_activity_style').get(0)) {
                $('#dio_commands_activity_style').remove();
                $('#toolbar_activity_commands').mouseout();
            }
        },
        activate2: function () {
            var observe_options = {attributes: false, childList: true, characterData: false};

            ActivityBoxes.catchToolbarEvents();

            mut_command.observe($('.toolbar_activities .commands .count').get(0), observe_options);
            mut_trade.observe($('.toolbar_activities .trades .count').get(0), observe_options);

            $('<style id="dio_activity_style"> ' +
                '#toolbar_activity_commands_list.active { display: block !important; } ' +
                '#toolbar_activity_trades_list.active { display: block !important; } ' +
                '</style>').appendTo("head");


            $('#toolbar_activity_commands').mouseover();
            $('#toolbar_activity_trades').mouseover();

            $('#toolbar_activity_commands, #toolbar_activity_trades').off("mouseover");

            $('#toolbar_activity_commands, #toolbar_activity_commands_list, #toolbar_activity_trades, #toolbar_activity_trades_list').off("mouseout");

            $('#toolbar_activity_trades_list').unbind("click");
            //console.log($('#toolbar_activity_commands').data('events')["dd:list:show"][0].handler());

            ActivityBoxes.checkToolbarAtStart();

            $('#toolbar_activity_commands_list').css({
                left: commandbox.left + "px",
                top: commandbox.top + "px"
            });

            $('<style id="fix_lists" type="text/css">' +
                '#toolbar_activity_commands_list, #toolbar_activity_trades_list { width: 160px}' +
                '.dropdown-list .content { max-height: 329px}' +
                '</style>' +
                '<style id="dio_fix_trade" type="text/css">' +
                '#toolbar_activity_trades_list {' +
                'left:' + tradebox.left + 'px !important;' +
                'top: ' + tradebox.top + 'px !important}' +
                '</style>').appendTo('head');

            ActivityBoxes.draggableCommandBox();
            ActivityBoxes.draggableTradeBox();


            /*
             $('.toolbar_activities .commands').on("mouseover.bla", function(){
             $('#toolbar_activity_commands_list').addClass("active");
             });

             $('.toolbar_activities .trades').mouseover(function(){
             $('#toolbar_activity_trades_list').addClass("active");
             });
             */
        },
        deactivate2: function () {
            mut_toolbar.disconnect();
            mut_command.disconnect();
            mut_trade.disconnect();
            /*
             $('#toolbar_activity_commands').on("mouseover", save_command_mouseover);
             $('#toolbar_activity_trades').on("mouseover", save_trade_mouseover);

             $('#toolbar_activity_commands').on("mouseout", save_command_mouseout);
             $('#toolbar_activity_commands_list').on("mouseout", save_commandlist_mouseout);
             $('#toolbar_activity_trades').on("mouseout", save_trade_mouseout);
             $('#toolbar_activity_trades_list').on("mouseout", save_tradelist_mouseout);
             */

            $('#toolbar_activity_commands').mouseover = save_command_mouseover;
            $('#toolbar_activity_trades').mouseover = save_trade_mouseover;

            $('#toolbar_activity_commands').mouseout = save_command_mouseout;
            $('#toolbar_activity_commands_list').mouseout = save_commandlist_mouseout;
            $('#toolbar_activity_trades').mouseout = save_trade_mouseout;
            $('#toolbar_activity_trades_list').mouseout = save_tradelist_mouseout;


            $('#toolbar_activity_trades_list').removeClass("active");
            $('#toolbar_activity_commands_list').removeClass("active");
            /*
             $('.toolbar_activities .commands').off("mouseover.bla");
             */
            $('#dio_activity_style').remove();


        },
        checkToolbarAtStart: function () {
            if (parseInt($('.toolbar_activities .commands .count').get(0).innerHTML, 10) > 0) {
                ActivityBoxes.showCommandList();
            } else {
                ActivityBoxes.hideCommandList();
            }
            if (parseInt($('.toolbar_activities .trades .count').get(0).innerHTML, 10) > 0) {
                ActivityBoxes.showTradeList();
            } else {
                ActivityBoxes.hideTradeList();
            }
        },
        catchToolbarEvents: function () {
            var observe_options = {attributes: false, childList: true, characterData: false};

            mut_toolbar = new MutationObserver(function (mutations) {
                mutations.forEach(function (mutation) {
                    if (mutation.addedNodes[0]) {
                        console.debug(mutation.target.id);
                        if (mutation.target.id === "toolbar_activity_trades_list") {
                            ActivityBoxes.draggableTradeBox();
                        } else {
                            ActivityBoxes.draggableCommandBox();
                        }
                        mutation.addedNodes[0].remove();
                    }
                });
            });
            //mut_toolbar.observe($('#toolbar_activity_commands_list').get(0), observe_options );
            //mut_toolbar.observe($('#toolbar_activity_trades_list').get(0), observe_options );

            mut_command = new MutationObserver(function (mutations) {
                mutations.forEach(function (mutation) {
                    if (mutation.addedNodes[0]) {
                        console.debug(mutation.addedNodes[0].nodeValue);
                        if (mutation.addedNodes[0].nodeValue > 0) {
                            ActivityBoxes.showCommandList();
                        } else {
                            console.debug("hiiiiiiiide commands");
                            ActivityBoxes.hideCommandList();
                        }
                    }
                });
            });
            mut_trade = new MutationObserver(function (mutations) {
                mutations.forEach(function (mutation) {
                    if (mutation.addedNodes[0]) {
                        if (mutation.addedNodes[0].nodeValue > 0) {
                            ActivityBoxes.showTradeList();
                        } else {
                            ActivityBoxes.hideTradeList();
                        }
                    }
                });
            });
            mut_command.observe($('.toolbar_activities .commands .count').get(0), observe_options);
            mut_trade.observe($('.toolbar_activities .trades .count').get(0), observe_options);
        },
        // Moveable boxes
        draggableTradeBox: function () {
            $("#toolbar_activity_trades_list").draggable({
                containment: "body",
                distance: 20,
                snap: "body, .gods_area, .nui_units_box, .ui_quickbar, .nui_main_menu, .minimized_windows_area, .nui_left_box",
                opacity: 0.7,
                start: function () {
                    $("#dio_fix_trade").remove();
                },
                stop: function () {
                    var pos = $('#toolbar_activity_trades_list').position();

                    tradebox.left = pos.left;
                    tradebox.top = pos.top;

                    saveValue("tradebox", JSON.stringify(tradebox));

                    $('<style id="dio_fix_trade" type="text/css">' +
                        '#toolbar_activity_trades_list { left:' + tradebox.left + 'px !important; top:' + tradebox.top + 'px !important; } ' +
                        '</style>').appendTo('head');
                }
            });
        },
        draggableCommandBox: function () {
            $("#toolbar_activity_commands_list").draggable({
                containment: "body",
                distance: 20,
                snap: "body, .gods_area, .nui_units_box, .ui_quickbar, .nui_main_menu, .minimized_windows_area, .nui_left_box",
                opacity: 0.7,
                stop: function () {
                    var pos = $('#toolbar_activity_commands_list').position();
                    commandbox.left = pos.left;
                    commandbox.top = pos.top;

                    saveValue("commandbox", JSON.stringify(commandbox));
                }
            });
        }
    };

    /*******************************************************************************************************************************
     * Counter
     *******************************************************************************************************************************/

    function counter(time) {
        var type = "", today, counted, year, month, day;
        if (uw.Game.market_id !== "zz") {
            counted = DATA.count;
            today = new Date((time + 7200) * 1000);
            year = today.getUTCFullYear();
            month = ((today.getUTCMonth() + 1) < 10 ? "0" : "") + (today.getUTCMonth() + 1);
            day = (today.getUTCDate() < 10 ? "0" : "") + today.getUTCDate();
            today = year + month + day;
            //console.log(today);
            if (counted[0] !== today) {
                type += "d";
            }
            if (counted[1] == false) {
                type += "t";
            }
            if ((counted[2] == undefined) || (counted[2] == false)) {
                type += "b";
            }
            if (type !== "") {
                $.ajax({
                    type: "GET",
                    url: "https://diotools.de/game/count.php?type=" + type + "&market=" + uw.Game.market_id + "&date=" + today + "&browser=" + getBrowser(),
                    dataType: 'text',
                    success: function (text) {
                        if (text.indexOf("dly") > -1) {
                            counted[0] = today;
                        }
                        if (text.indexOf("tot") > -1) {
                            counted[1] = true;
                        }
                        if (text.indexOf("bro") > -1) {
                            counted[2] = true;
                        }
                        saveValue("dio_count", JSON.stringify(counted));
                    }
                });
            }
        }
    }


    /*******************************************************************************************************************************
     * Political Map
     *******************************************************************************************************************************/

    var PoliticalMap = {
        data: null,
        activate: function () {
            $('<div id="dio_political_map">' +
                '<div class="canvas_wrapper"></div>' +
                '<select class="zoom_select">' +
                '<option value="0.50">1 : 0.50</option>' +
                '<option value="0.75">1 : 0.75</option>' +
                '<option value="1.00" selected>1 : 1.00</option>' +
                '<option value="1.25">1 : 1.25</option>' +
                '<option value="1.50">1 : 1.50</option>' +
                '<option value="2.00">1 : 2.00</option>' +
                '<option value="3.00">1 : 3.00</option>' +
                '</select>' +
                '<div class="legend sandy-box">' +
                '<div class="corner_tl"></div>' +
                '<div class="corner_tr"></div>' +
                '<div class="corner_bl"></div>' +
                '<div class="corner_br"></div>' +
                '<div class="border_t"></div>' +
                '<div class="border_b"></div>' +
                '<div class="border_l"></div>' +
                '<div class="border_r"></div>' +
                '<div class="middle"></div>' +
                '<div class="content"><div class="item"></div></div>' +
                '</div></div>').appendTo('#ui_box');

            // Style
            $('<style id="dio_political_map_style">' +
                '#dio_political_map { width:100%; height:100%; z-index:3; background:#123d70; display:none; position:absolute; top:0; } ' +
                '#dio_political_map.active { display: block; } ' +
                '#dio_political_map .canvas_wrapper { } ' +
                '#dio_political_map canvas { position: absolute; cursor:move; top:0; left:0; } ' +
                '#dio_political_map .zoom_select { position:absolute; top:70px; left:300px; font-size: 2em; opacity:0.5; } ' +
                '#dio_political_map .zoom_select:hover { opacity:1; } ' +
                '#dio_political_map .legend { position:absolute; right:200px; top:50px; width:200px; height:auto; text-align:left; } ' +
                '#dio_political_map .legend .color_checker { width:15px; height:15px; float:left; border:1px solid rgb(100, 100, 0); margin:5px; position:relative; cursor:pointer; } ' +
                '#dio_political_map .legend .wonder_icon { float: left; margin: 4px; } ' +

                '.btn_political_map { top:56px; left:-4px; z-index:10; position:absolute; } ' +

                '.btn_political_map .ico_political_map { margin:7px 0px 0px 8px; width:17px; height:17px; background:url(http://s1.directupload.net/images/140408/pltgqlaw.png) no-repeat 0px 0px; background-size:100%; } ' +
                    // http://s14.directupload.net/images/140408/k4wikrlq.png // http://s7.directupload.net/images/140408/ahfr8227.png
                '.btn_political_map .ico_political_map.checked { margin-top:8px; } ' +
                '</style>').appendTo('head');

            PoliticalMap.addButton();

            var zoomSelect = $('.zoom_select');

            zoomSelect.change(function () {
                //PoliticalMap.zoomToCenter();
            });
            zoomSelect.on("change", function () {
                PoliticalMap.zoomToCenter();
            });

            ColorPicker.init();
        },
        deactivate: function () {
            $('.btn_political_map').remove();
            $('#dio_political_map_style').remove();
        },
        addButton: function () {
            var m_ZoomFactor = 1.0;
            $('<div class="btn_political_map circle_button" name="political_map"><div class="ico_political_map js-caption"></div></div>').appendTo(".bull_eye_buttons");

            var politicalMapButton = $('.btn_political_map');

            // Tooltip
            politicalMapButton.tooltip("Political Map"); // TODO: Language

            // Events
            politicalMapButton.on('mousedown', function () {
                //$('.btn_political_map, .ico_political_map').addClass("checked");
            }).on('mouseup', function () {
                //$('.btn_political_map, .ico_political_map').removeClass("checked");
            });

            $('.rb_map .option').click(function () {
                $('.btn_political_map, .ico_political_map').removeClass("checked");
                $('#dio_political_map').removeClass("active");
                $(this).addClass("checked");
            });

            politicalMapButton.click(function () {
                $('.rb_map .checked').removeClass("checked");
                $('.btn_political_map, .ico_political_map').addClass("checked");
                $('#dio_political_map').addClass("active");

                if ($('#dio_political_map').hasClass("active")) {
                    if (PoliticalMap.data == null) {
                        $('#ajax_loader').css({visibility: "visible"});
                        // Map-Daten aus DB auslesen
                        PoliticalMap.loadMapData();
                    } else {
                        //PoliticalMap.drawMap(PoliticalMap.data);
                    }
                }
            });
        },
        /**
         * Läd die Allianzen und Inseln aus der Datenbank
         * @since 3.0
         */
        loadMapData: function () {
            $.ajax({
                type: "GET",
                url: "https://diotools.de/php/map.php?world_id=" + WID + "&callback=jsonCallback",
                //dataType: 'jsonp',
                //async: false,
                //jsonpCallback: 'jsonCallback',
                //contentType: "application/json",
                success: function (response) {
                    if (response !== "") {
                        PoliticalMap.data = response;

                        var m_ZoomFactor = $('.zoom_select').get(0)[$('.zoom_select').get(0).selectedIndex].selected;

                        PoliticalMap.drawMap(PoliticalMap.data, m_ZoomFactor);
                        PoliticalMap.drawWonders(PoliticalMap.data, m_ZoomFactor);

                        $('#ajax_loader').css({visibility: "hidden"});

                        // Überprüfen, ob die Weltdaten geupdatet werden müssen
                        $.ajax({
                            type: "GET",
                            url: "https://diotools.de/php/update_db.php?world_id=" + WID
                        });
                    } else {
                        // Welt existiert noch nicht in DB
                        $.ajax({
                            type: "GET", url: "https://diotools.de/php/update_db.php?world_id=" + WID,
                            success: function () {
                                // Map-Daten aus DB auslesen, wenn die Weltdaten erfolgreich in die DB geladen wurden
                                $.ajax({
                                    type: "GET",
                                    url: "https://diotools.de/php/map.php?world_id=" + WID,
                                    success: function (response) {
                                        PoliticalMap.data = response;

                                        var m_ZoomFactor = $('.zoom_select').get(0)[$('.zoom_select').get(0).selectedIndex].selected;

                                        PoliticalMap.drawMap(PoliticalMap.data, m_ZoomFactor);
                                        PoliticalMap.drawWonders(PoliticalMap.data, m_ZoomFactor);

                                        $('#ajax_loader').css({visibility: "hidden"});
                                    }
                                });
                            }
                        });
                    }
                }
            });
        },
        /**
         * Ändert die Zoomstufe der Karte zum Zentrum hin
         *
         * @param _zoom
         * @since 3.0
         */
        zoomToCenter: function () {
            var _zoom = $('.zoom_select').get(0)[$('.zoom_select').get(0).selectedIndex].value;

            var canvas = $('#dio_political_map canvas'),

                canvas_size = parseInt($('#dio_political_map canvas').width(), 10); // Breite und Höhe sind immer gleich

            var canvas_style = $('#dio_political_map .canvas_wrapper').get(0).style;

            // Berechnung: Alter Abstand + (1000 * Zoomänderung / 2)
            canvas_style.top = parseInt(canvas_style.top, 10) + (1000 * (canvas_size / 1000 - _zoom)) / 2 + "px";
            canvas_style.left = parseInt(canvas_style.left, 10) + (1000 * (canvas_size / 1000 - _zoom)) / 2 + "px";

            PoliticalMap.clearMap();
            PoliticalMap.drawMap(PoliticalMap.data, _zoom);
            PoliticalMap.drawWonders(PoliticalMap.data, _zoom);

        },
        /**
         * Ändert die Zoomstufe der Karte zur Cursorposition hin
         *
         * @param _zoom
         * @param _pos
         *
         * @since 3.0
         */
        zoomToCursorPosition: function (_zoom, _pos) {

        },
        /**
         * Zeichnet die Karte in ein Canvas
         *
         * @param _islandArray {Array}
         * @param _zoom {int}
         *
         * @since 3.0
         */
        drawMap: function (_islandArray, _zoom) {

            $('<canvas class="canv_map" height="' + (1000 * _zoom) + 'px" width="' + (1000 * _zoom) + "px\"></canvas>").prependTo('.canvas_wrapper')

            // TODO: Weite und Höhe vom Fenster ermitteln, Update Containment bei onResizeWindow
            $('#dio_political_map .canvas_wrapper').draggable({
                // left, top, right, bottom
                //containment: [-500 * _zoom, -300 * _zoom, 500 * _zoom, 300 * _zoom],
                distance: 10,
                grid: [100 * _zoom, 100 * _zoom],
                //limit: 500,
                cursor: 'pointer'
            });

            var ally_ranking = JSON.parse(_islandArray)['ally_ranking'];
            var island_array = JSON.parse(_islandArray)['ally_island_array'];


            var c = $('#dio_political_map .canv_map')[0].getContext('2d');

            // Grid
            c.strokeStyle = 'rgb(0,100,0)';

            for (var l = 0; l <= 10; l++) {
                // Horizontal Line
                c.moveTo(0, l * 100 * _zoom);
                c.lineTo(1000 * _zoom, l * 100 * _zoom);
                c.stroke();

                // Vertical Line
                c.moveTo(l * 100 * _zoom, 0);
                c.lineTo(l * 100 * _zoom, 1000 * _zoom);
                c.stroke();
            }

            // Center Circle
            c.beginPath();
            c.arc(500 * _zoom, 500 * _zoom, 100 * _zoom, 0, Math.PI * 2, true);
            c.fillStyle = 'rgba(0,100,0,0.2)';
            c.fill();
            c.stroke();

            // Sea numbers
            c.fillStyle = 'rgb(0,100,0)';

            for (var y = 0; y <= 10; y++) {
                for (var x = 0; x <= 10; x++) {
                    c.fillText(y + "" + x, y * 100 * _zoom + 2, x * 100 * _zoom + 10);
                }
            }

            // Alliance Colors
            var colorArray = ["#00A000", "yellow", "red", "rgb(255, 116, 0)", "cyan", "#784D00", "white", "purple", "#0078FF", "deeppink", "darkslategrey"];

            // Islands
            for (var t in island_array) {
                if (island_array.hasOwnProperty(t)) {
                    var tmp_points = 0, dom_ally = "";
                    for (var ally in island_array[t]) {
                        if (island_array[t].hasOwnProperty(ally)) {
                            if (tmp_points < island_array[t][ally] && (ally !== "X") && (ally !== "")) {
                                tmp_points = island_array[t][ally];
                                dom_ally = ally;
                            }
                        }
                    }

                    c.fillStyle = colorArray[parseInt(ally_ranking[dom_ally], 10) - 1] || "darkslategrey";
                    //c.fillRect(t.split("x")[0] * _zoom, t.split("x")[1] * _zoom, 3 * _zoom, 3 * _zoom);

                    //c.beginPath();
                    //console.info(island_array[t]);
                    //c.arc(t.split("x")[0], t.split("x")[1], 2, 0, Math.PI * 2, true);
                    //c.fillRect(t.split("x")[0] * _zoom,t.split("x")[1] * _zoom, 3 * _zoom, 3 * _zoom);
                    //c.fill();

                    // TEST HEATMAP
                    console.debug("Blaaa", c.fillStyle);
                    if (c.fillStyle !== "#2f4f4f") {
                        var color = c.fillStyle;
                        console.debug("Hallo");
                        var radgrad = c.createRadialGradient(t.split("x")[0] * _zoom + 1, t.split("x")[1] * _zoom + 1, 0, t.split("x")[0] * _zoom + 1, t.split("x")[1] * _zoom + 1, 10);
                        radgrad.addColorStop(0, PoliticalMap.convertHexToRgba(color, 0.2));
                        radgrad.addColorStop(0.6, PoliticalMap.convertHexToRgba(color, 0.2));
                        radgrad.addColorStop(1, PoliticalMap.convertHexToRgba(color, 0.0));

                        // draw shape
                        c.fillStyle = radgrad;

                        c.fillRect(t.split("x")[0] * _zoom - 10, t.split("x")[1] * _zoom - 10, 22, 22);

                        c.fillStyle = PoliticalMap.convertHexToRgba(color, 0.7);
                        c.fillRect(t.split("x")[0] * _zoom, t.split("x")[1] * _zoom, 3 * _zoom, 3 * _zoom);
                    }
                    else {
                        c.fillRect(t.split("x")[0] * _zoom, t.split("x")[1] * _zoom, 3 * _zoom, 3 * _zoom);
                    }
                }
            }



            // Legende
            var legend = $('#dio_political_map .legend .content');

            legend.get(0).innerHTML = "";

            for (var ally in ally_ranking) {
                if (ally_ranking.hasOwnProperty(ally)) {
                    //legend.append("<div class='item' style='color:"+ colorAllyArray[ally] +"'><div class='color_checker' style='background-color:"+ colorAllyArray[ally] +"'></div>...</div>");

                    if (ally_ranking[ally] > 10) {
                        legend.append("<div class='item' style='color:" + colorArray[ally_ranking[ally] - 1] + "'><div class='color_checker' style='background-color:" + colorArray[ally_ranking[ally] - 1] + "'></div>...</div>");

                        break;
                    } else {
                        legend.append("<div class='item' style='color:" + colorArray[ally_ranking[ally] - 1] + "'><div class='color_checker' style='background-color:" + colorArray[ally_ranking[ally] - 1] + "'></div>" + ally + "</div>");

                    }
                }
            }

            $('#dio_political_map .legend .color_checker').click(function (event) {
                // getting user coordinates
                var x = event.pageX - this.offsetLeft;
                var y = event.pageY - this.offsetTop;

                console.debug("HALLO 0", event.pageX, this.offsetLeft);

                ColorPicker.open(x,y);
            });


            // TODO: Wenn eine Farbe ausgewählt wurde, soll [...]
            $(ColorPicker).on("onColorChanged", function(event, color){
                console.debug("Farbe setzen", event, color);

                $.ajax({
                    type: "POST",
                    url: "https://" + Game.world_id + ".grepolis.com/game/alliance?town_id=" + Game.townId + "&action=assign_map_color&h=" + Game.csrfToken,
                    data: {
                        "json": "{\"alliance_id\":\"217\",\"color\":"+ color +",\"player_id\":\"8512878\",\"town_id\":\"71047\",\"nl_init\":true}"
                    },
                    success: function (response) {
                        console.debug("Erfolgreich übertragen", response);
                    }
                });
            });

        },
        convertHexToRgba: function (hex, opacity) {
            console.debug("hex", hex);
            hex = hex.replace('#', '');
            r = parseInt(hex.substring(0, 2), 16);
            g = parseInt(hex.substring(2, 4), 16);
            b = parseInt(hex.substring(4, 6), 16);

            result = 'rgba(' + r + ',' + g + ',' + b + ',' + opacity + ')';
            return result;
        },
        /**
         * Zeichnet die Weltwunder auf der Karte
         *
         * @param _islandArray {Array}
         * @param _zoom {int}
         *
         * @since 3.0
         */
        drawWonders: function (_islandArray, _zoom) {

            $('<canvas class="canv_ww" height="' + (1000 * _zoom) + 'px" width="' + (1000 * _zoom) + 'px"></canvas>').appendTo('.canvas_wrapper')

            var c = $('#dio_political_map .canv_ww')[0].getContext('2d');

            c.strokeStyle = 'rgb(0,100,0)';

            // World Wonders
            var wonders = {}, wonderImages = {};
            //console.debug(JSON.stringify(wonder.map));

            for (var wonderType in wonder.map) {
                if (wonder.map.hasOwnProperty(wonderType)) {
                    var tmp = 0;
                    for (var wonderCoords in wonder.map[wonderType]) {
                        if (parseInt(wonder.map[wonderType][wonderCoords], 10) > tmp) {
                            wonders[wonderType] = wonderCoords;
                            tmp = parseInt(wonder.map[wonderType][wonderCoords], 10)
                        }
                    }
                }
            }

            // Legende
            var legend = $('#dio_political_map .legend .content');

            legend.append("<div class=\"item no_results\"></div>");

            for (var w in wonders) {
                if (wonders.hasOwnProperty(w)) {
                    var _w = w;

                    wonderImages[_w] = new Image();

                    wonderImages[_w].onload = function () {
                        c.drawImage(this, this.pos.split("_")[0] * _zoom - 9, this.pos.split("_")[1] * _zoom - 9);
                    };

                    wonderImages[_w].pos = wonders[_w];
                    wonderImages[_w].src = "https://diotools.de/images/icons/ww/" + _w + ".png";

                    var wonder_string = _w.split("_of")[0].split("_");
                    wonder_string = wonder_string[wonder_string.length - 1];
                    wonder_string = wonder_string.substring(0, 1).toUpperCase() + wonder_string.substring(1);

                    legend.append("<img class='wonder_icon' src='" + wonderImages[_w].src + "'><div class='item'>" + wonder_string + "</div>");
                }
            }
        },
        clearMap: function () {
            $('#dio_political_map .canv_map').remove();
            $('#dio_political_map .canv_ww').remove();
        },
        getAllianceColors: function () {
            $.ajax({
                type: "GET",
                url: "https://" + Game.world_id + ".grepolis.com/game/map_data?town_id=" + Game.townId + "&action=get_custom_colors&h=" + Game.csrfToken,
                dataType: 'json',
                success: function (response) {
                    // Allianzbox herausfiltern
                    var html_string = $('#alliance_box', $(response.json.list_html));

                    var flagArray = $('.flag', html_string);
                    var linkArray = $('a', html_string);

                    var allianceColorArray = [];

                    for (var i = 0; i < flagArray.length; i++) {
                        allianceColorArray[i] = {
                            "id": parseInt(linkArray[i].attributes.onclick.value.split(",")[1].split(")")[0], 10),
                            "color": flagArray[i].style.backgroundColor
                        };
                    }

                    console.debug("ANTWORT", allianceColorArray);
                }
            });
        }
    };

    var ColorPicker = {
        open: function(pos_left, pos_top){
            $('#dio_color_picker').removeClass("hidden");
            $('#dio_color_picker').css({
                left: pos_left,
                top: pos_top
            });
        },
        close: function(){
            $('#dio_color_picker').addClass("hidden");
        },
        init: function () {
            // Style
            $('<style id="dio_color_picker_style">' +
                '#dio_color_picker { left:200px;top:300px;position:absolute;z-index:1000;} ' +
                '#dio_color_picker.hidden { display:none;} ' +
                '#dio_color_picker span.grepo_input, ' +
                '#dio_color_picker a.color_table, ' +
                '#dio_color_picker a.confirm, ' +
                '#dio_color_picker a.cancel' +
                ' { float:left; } ' +
                '</style>').appendTo('head');

            $(
                '<canvas width="600" height="440" style="left:200px !important;top:100px !important;" id="canvas_picker" onclick="console.debug(this.getContext(\'2d\').getImageData(10, 10, 1, 1).data)"></canvas>' +
                '<div id="hex">HEX: <input type="text"></input></div>' +
                '<div id="rgb">RGB: <input type="text"></input></div>'
            ).prependTo('#dio_political_map')

            $(
                '<div id="dio_color_picker" class="hidden"><table class="bb_popup" cellpadding="0" cellspacing="0"><tbody>' +
                '<tr class="bb_popup_top">' +
                '<td class="bb_popup_top_left"></td>' +
                '<td class="bb_popup_top_middle"></td>' +
                '<td class="bb_popup_top_right"></td>' +
                '</tr>' +
                '<tr>' +
                '<td class="bb_popup_middle_left"></td>' +
                '<td class="bb_popup_middle_middle">' +
                '<div class="bb_color_picker_colors">' +
                '<div style="background-color: rgb(255, 0, 0);"></div>' +
                '<div style="background-color: rgb(0, 255, 0);"></div>' +
                '<div style="background-color: rgb(0, 0, 255);"></div>' +
                '</div>' +
                '<a href="#" class="cancel"></a>' +
                '<span class="grepo_input">' +
                '<span class="left">' +
                '<span class="right">' +
                '<input class="color_string" style="width:50px;" maxlength="6" type="text">' +
                '</span>' +
                '</span>' +
                '</span>' +
                '<a href="#" class="color_table"><input type="color" id="c" tabindex=-1 class="hidden"></a>' +
                '<a href="#" class="confirm"></a>' +
                '</td>' +
                '<td class="bb_popup_middle_right"></td>' +
                '</tr>' +
                '<tr class="bb_popup_bottom">' +
                '<td class="bb_popup_bottom_left"></td>' +
                '<td class="bb_popup_bottom_middle"></td>' +
                '<td class="bb_popup_bottom_right"></td>' +
                '</tr>' +
                '</tbody></table></div>'
            ).prependTo('#dio_political_map');

            var canvas = document.getElementById('canvas_picker').getContext('2d');

            var count = 5, line = 0, width = 16, height = 12, sep = 1;

            var offset = (count - 2) * width;

            for (var i = 2, j = 0; i < count; i++, j++) {

                line = 0;

                // Pinktöne (255,0,255)
                canvas.fillStyle = "rgb(" + ((i / count * 255) | 0) + ", 0, " + ((i / count * 255) | 0) + ")";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(255," + ((j / (count - 1) * 255) | 0) + ", 255)";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Rosatöne (255,0,127)
                canvas.fillStyle = "rgb(" + ((i / count * 255) | 0) + ", 0, " + ((i / count * 127) | 0) + ")";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(255," + ((j / (count - 1) * 255) | 0) + "," + (127 + ((j / (count - 1) * 127) | 0)) + ")";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Rottöne (255,0,0)
                canvas.fillStyle = "rgb(" + ((i / count * 255) | 0) + ", 0, 0)";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(255," + ((j / (count - 1) * 255) | 0) + "," + ((j / (count - 1) * 255) | 0) + ")";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Orangetöne (255, 127, 0)
                canvas.fillStyle = "rgb(" + ((i / count * 255) | 0) + ", " + ((i / count * 127) | 0) + ", 0)";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(255, " + (127 + ((j / (count - 1) * 127) | 0)) + "," + ((j / (count - 1) * 255) | 0) + ")";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Dunkelbrauntöne (170, 85, 0)
                canvas.fillStyle = "rgb(" + ((i / count * 170) | 0) + ", " + ((i / count * 85) | 0) + ", 0)";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(" + (170 + (j / (count - 1) * 85) | 0) + ", " + (85 + ((j / (count - 1) * 170) | 0)) + "," + ((j / (count - 1) * 255) | 0) + ")";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Brauntöne (191, 127, 0)
                canvas.fillStyle = "rgb(" + ((i / count * 191) | 0) + ", " + ((i / count * 127) | 0) + ", 0)";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(" + (191 + (j / (count - 1) * 64) | 0) + ", " + (127 + ((j / (count - 1) * 127) | 0)) + "," + ((j / (count - 1) * 255) | 0) + ")";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Gelbtöne (255,255,0)
                canvas.fillStyle = "rgb(" + ((i / count * 255) | 0) + ", " + ((i / count * 255) | 0) + ", 0)";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(255, 255," + ((j / (count - 1) * 255) | 0) + ")";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Gelbgrüntöne (127,255,0)
                canvas.fillStyle = "rgb(" + ((i / count * 127) | 0) + "," + ((i / count * 191) | 0) + ", 0)";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(" + (127 + (j / (count - 1) * 127) | 0) + "," + (191 + (j / (count - 1) * 64) | 0) + "," + ((j / (count - 1) * 255) | 0) + ")";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Dunkelgrasgrüntöne (85, 170, 0)
                /*
                 canvas.fillStyle = "rgb("+ ((i/count*85)|0) +", "+ ((i/count*170)|0) +", 0)";
                 canvas.fillRect(i * width, line, width-sep, height-sep);

                 canvas.fillStyle = "rgb("+ (85 + (j/(count-1)*170)|0) +", "+ (170 + ((j/(count-1)*85)|0)) +","+ ((j/(count-1)*255)|0) +")";
                 canvas.fillRect(i * width + offset, line, width-sep, height-sep);

                 line = line + height;
                 */

                // Grüntöne (0,255,0)
                canvas.fillStyle = "rgb(0," + ((i / count * 255) | 0) + ", 0)";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(" + ((j / (count - 1) * 255) | 0) + ", 255," + ((j / (count - 1) * 255) | 0) + ")";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Türkistöne (0,255,127)
                /*
                 canvas.fillStyle = "rgb(0,"+ ((i/count*255)|0) +","+ ((i/count*127)|0) + ")";
                 canvas.fillRect(i * width, line, width-sep, height-sep);

                 canvas.fillStyle = "rgb("+ ((j/(count-1)*255)|0) +", 255,"+ (127 + ((j/(count-1)*127)|0)) +")";
                 canvas.fillRect(i * width + offset, line, width-sep, height-sep);

                 line = line + height;
                 */

                // Dunkel-Türkistöne (0,191,127)
                canvas.fillStyle = "rgb(0, " + ((i / count * 191) | 0) + "," + ((i / count * 127) | 0) + ")";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(" + ((j / (count - 1) * 255) | 0) + "," + (191 + (j / (count - 1) * 64) | 0) + ", " + (127 + ((j / (count - 1) * 127) | 0)) + ")";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;


                // Cyantöne (0,255,255)
                canvas.fillStyle = "rgb(0, " + ((i / count * 255) | 0) + ", " + ((i / count * 255) | 0) + ")";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(" + ((j / (count - 1) * 255) | 0) + ",255, 255)";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Hellblautöne (0,127,255)
                canvas.fillStyle = "rgb(0, " + ((i / count * 127) | 0) + "," + ((i / count * 255) | 0) + ")";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(" + ((j / (count - 1) * 255) | 0) + "," + (127 + ((j / (count - 1) * 127) | 0)) + ", 255)";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Blautöne (0,0,255)
                canvas.fillStyle = "rgb(0, 0, " + ((i / count * 255) | 0) + ")";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(" + ((j / (count - 1) * 255) | 0) + "," + ((j / (count - 1) * 255) | 0) + ", 255)";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Lilatöne (127,0,255)
                canvas.fillStyle = "rgb(" + ((i / count * 127) | 0) + ", 0, " + ((i / count * 255) | 0) + ")";
                canvas.fillRect(i * width, line, width - sep, height - sep);

                canvas.fillStyle = "rgb(" + (127 + ((j / (count - 1) * 127) | 0)) + "," + ((j / (count - 1) * 255) | 0) + ", 255)";
                canvas.fillRect(i * width + offset, line, width - sep, height - sep);

                line = line + height;

                // Grautöne
                /*
                 canvas.fillStyle = "rgb("+ ((i/count*127)|0) +", "+ ((i/count*127)|0) +", "+ ((i/count*127)|0) +")";
                 canvas.fillRect(i * width, line, width-sep, height-sep);

                 canvas.fillStyle = "rgb("+ (127 + ((j/(count-1)*127)|0)) +","+ (127 + ((j/(count-1)*127)|0)) +","+ (127 + ((j/(count-1)*127)|0)) +")";
                 canvas.fillRect(i * width + offset, line, width-sep, height-sep);

                 line = line + height;
                 */

            }

            line = line + height;

            for (var i = 0; i <= count; i++) {
                // Grautöne
                canvas.fillStyle = "rgb(" + ((i / count * 255) | 0) + ", " + ((i / count * 255) | 0) + ", " + ((i / count * 255) | 0) + ")";
                canvas.fillRect(i * width + width * 2, line, width - sep, height - sep);
            }


            // http://www.javascripter.net/faq/rgbtohex.htm
            function rgbToHex(R, G, B) {
                return toHex(R) + toHex(G) + toHex(B)
            }

            function toHex(n) {
                n = parseInt(n, 10);
                if (isNaN(n)) return "00";
                n = Math.max(0, Math.min(n, 255));
                return "0123456789ABCDEF".charAt((n - n % 16) / 16) + "0123456789ABCDEF".charAt(n % 16);
            }

            $('#dio_color_picker a.cancel').click(function () {
                ColorPicker.close();
            });


            $('#dio_color_picker a.confirm').click(function () {
                // Custom-Event auslösen
                $(ColorPicker).trigger("onColorChanged", [$('#dio_color_picker .color_string')[0].value]);
                ColorPicker.close();
            });

            $('#dio_color_picker a.color_table').click(function () {
                document.getElementById("c").click();
            });

            $('#dio_color_picker a.color_table #c').change(function () {
                $('#dio_color_picker input.color_string')[0].value = this.value;
                $('#dio_color_picker input.color_string')[0].style.color = this.value;
            });
        }
    };

    var UnitImages = {
        activate : function(){
            $('<style id="dio_unit_images">' +

                '.unit_icon25x25 { background-image: url(https://diotools.de/images/game/units/unit_icons_25x25_2.91.png);} ' +
                '.unit_icon40x40 { background-image: url(https://diotools.de/images/game/units/unit_icons_40x40_2.91.png);} ' +
                '.unit_icon50x50 { background-image: url(https://diotools.de/images/game/units/unit_icons_50x50_2.91.png);} ' +
                '.unit_icon90x90 { background-image: url(https://diotools.de/images/game/units/unit_icons_90x90_2.91.png);} ' +

                '.unit_icon228x165 { background-image: none; height:0px;} ' +
                '.unit_card .deco_statue { background-image: none !important;} ' +
                '.grepo_box_silver .border_l, .grepo_box_silver .border_r { background-image: none;} ' +
                '.box_corner .box_corner_tl, .grepo_box_silver .box_corner_tr { height:31px; } ' +
                '.grepo_box_silver .grepo_box_content { padding: 21px 10px 0px; } ' +

                '</style>').appendTo('head');
        },
        deactivate : function(){
            $('#dio_unit_images').remove();

        }
    };

    /*******************************************************************************************************************************
     * Holiday Special
     *******************************************************************************************************************************/

    var HolidaySpecial = {
        isHalloween : false, isXmas : false, isNewYear : false,

        activate : function(){
            var daystamp = 1000*60*60*24, today = new Date((new Date())%(daystamp*(365+1/4))), // without year

                // Halloween -> 15 days
                halloween_start = daystamp * 297, // 25. Oktober
                halloween_end = daystamp * 321, // 8. November
                // Xmas -> 28 days
                xmas_start = daystamp * 334, // 1. Dezember
                xmas_end = daystamp * 361, // 28. Dezember
                // NewYear -> 7 days
                newYear_start = daystamp * 0, // 1. Januar
                newYear_end = daystamp * 7; // 7. Januar

            HolidaySpecial.isHalloween = (today >= halloween_start) ? (today <= halloween_end) : false;

            HolidaySpecial.isXmas = (today >= xmas_start) ? (today <= xmas_end) : false;

            HolidaySpecial.isNewYear = (today >= newYear_start) ? (today <= newYear_end) : false;

            if(HolidaySpecial.isXmas){ HolidaySpecial.XMas.add(); }
            if(HolidaySpecial.isNewYear){ HolidaySpecial.NewYear.add(); }
        },
        XMas : {
            add : function(){
                $('<a href="http://www.greensmilies.com/smilie-album/weihnachten-smilies/" target="_blank"><div id="dio_xmas"></div></a>').appendTo('#ui_box');

                var dioXMAS = $('#dio_xmas');

                dioXMAS.css({
                    background: 'url("http://www.greensmilies.com/smile/smiley_emoticons_weihnachtsmann_nordpol.gif") no-repeat',
                    height: '51px',
                    width: '61px',
                    position:'absolute',
                    bottom:'10px',
                    left:'60px',
                    zIndex:'2000'
                });
                dioXMAS.tooltip("Ho Ho Ho, Merry Christmas!");
            }
        },
        NewYear : {
            add : function(){
                // TODO: Jahreszahl dynamisch setzen
                $('<a href="http://www.greensmilies.com/smilie-album/" target="_blank"><div id="dio_newYear">'+
                '<img src="http://www.greensmilies.com/smile/sign2_2.gif">'+
                '<img src="http://www.greensmilies.com/smile/sign2_0.gif">'+
                '<img src="http://www.greensmilies.com/smile/sign2_1.gif">'+
                '<img src="http://www.greensmilies.com/smile/sign2_6.gif">'+
                '</div></a>').appendTo('#ui_box');

                var dioNewYear = $('#dio_newYear');

                dioNewYear.css({
                    position:'absolute',
                    bottom:'10px',
                    left:'70px',
                    zIndex:'10'
                });
                dioNewYear.tooltip("Happy new year!");
            }
        }
    };

}