The West - NERD Portrait

Displays some useful info on the portrait

// ==UserScript==
// @namespace		https://greasyfork.org/users/8637
// @name        	The West - NERD Portrait
// @author      	neversleep1911
// @description		Displays some useful info on the portrait
// @include     	http://*.the-west.*/game.php*
// @include     	https://*.the-west.*/game.php*
// @grant       	none
// @version     	1.0.2
// @copyright		Copyright (c) 2015 neversleep1911
// @license			MIT (http://opensource.org/licenses/MIT)
// ==/UserScript==

(function(func) {
    var script;
    script = document.createElement("script");
    script.setAttribute("type", "text/javascript");
    script.textContent = "(" + func.toString() + ")();";
    document.body.appendChild(script);
    document.body.removeChild(script);
})(function() {
    var Gui, I18n, NerdFormatter, NerdPortrait, Tab;
    I18n = function() {
        function I18n() {}
        var DEFAULT_LANGUAGE, STRINGS, language;
        DEFAULT_LANGUAGE = "en_US";
        STRINGS = {
            en_US: {
                buttons: {
                    save: "Save"
                },
                messages: {
                    text_saved: "Text saved",
                    enter_text: "Enter text!"
                }
            },
            de_DE: {
                buttons: {
                    save: "Speichern"
                },
                messages: {
                    text_saved: "Text gespeichert",
                    enter_text: "Text eingeben!"
                }
            },
            ru_RU: {
                buttons: {
                    save: "Сохранить"
                },
                messages: {
                    text_saved: "Текст сохранён",
                    enter_text: "Введите текст!"
                }
            }
        };
        language = DEFAULT_LANGUAGE;
        I18n.language = function() {
            return language;
        };
        I18n.setLanguage = function(lang) {
            return language = STRINGS[lang] ? lang : DEFAULT_LANGUAGE;
        };
        I18n.tr = function(id) {
            var i, len, prop, properties, string;
            string = STRINGS[language];
            properties = id.split(".");
            for (i = 0, len = properties.length; i < len; i++) {
                prop = properties[i];
                if ((string = string[prop]) === void 0) {
                    break;
                }
            }
            return string || id;
        };
        return I18n;
    }();
    Gui = function() {
        function Gui() {}
        Gui.createButton = function(options) {
            var button;
            if (options == null) {
                options = {};
            }
            if (options.icon) {
                button = new west.gui.Iconbutton(options.icon, options.onclick);
            } else {
                button = new west.gui.Button(options.text, options.onclick);
            }
            if (options.css) {
                $(button.getMainDiv()).css(options.css);
            }
            return button;
        };
        Gui.createTextarea = function(options) {
            var textarea;
            if (options == null) {
                options = {};
            }
            textarea = new west.gui.Textarea(options.content, null);
            if (options.width) {
                textarea.setWidth(options.width);
            }
            if (options.height) {
                textarea.setHeight(options.height);
            }
            if (options.css) {
                $(textarea.getMainDiv()).css(options.css);
            }
            return textarea;
        };
        Gui.createGroup = function(options) {
            var content, group, scrollPane;
            if (options == null) {
                options = {};
            }
            group = new west.gui.Groupframe("", "<div />");
            if (options.css) {
                $(group.getMainDiv()).css(options.css);
            }
            content = $(".tw2gui_groupframe_content_pane div", group.getMainDiv()).first();
            if (options.title) {
                content.append($("<h2>" + options.title + "</h2><hr style='margin-top: 2px; margin-bottom: 4px;' />"));
            }
            if (options.scrollPane) {
                scrollPane = new west.gui.Scrollpane;
                if (options.scrollPane.css) {
                    $(scrollPane.getMainDiv()).css(options.scrollPane.css);
                }
                content.append(scrollPane.getMainDiv());
                group.scrollPane = scrollPane;
                group.appendToScrollContentPane = function(content) {
                    scrollPane.appendContent(content);
                    return group;
                };
            }
            return group;
        };
        return Gui;
    }();
    NerdFormatter = function() {
        function NerdFormatter() {}
        NerdFormatter.keys = [ {
            pattern: /%ch/,
            value: function() {
                return Character.healthRegen;
            }
        }, {
            pattern: /%ce/,
            value: function() {
                return Character.energyRegen;
            }
        }, {
            pattern: /%hp/,
            value: function() {
                return Math.round(Character.health * 100 / Character.maxHealth);
            }
        }, {
            pattern: /%hr/,
            value: function() {
                return Math.round(1 / (Character.healthRegen * Character.maxHealth) * 3600).formatDuration();
            }
        }, {
            pattern: /%ht/,
            value: function() {
                return ((Character.maxHealth - Character.health) / (Character.healthRegen * Character.maxHealth) * 3600).formatDuration();
            }
        }, {
            pattern: /%ep/,
            value: function() {
                return Math.round(Character.energy * 100 / Character.maxEnergy);
            }
        }, {
            pattern: /%er/,
            value: function() {
                return Math.round(1 / (Character.healthRegen * Character.maxEnergy) * 3600).formatDuration();
            }
        }, {
            pattern: /%et/,
            value: function() {
                return ((Character.maxEnergy - Character.energy) / (Character.energyRegen * Character.maxEnergy) * 3600).formatDuration();
            }
        }, {
            pattern: /%dl/,
            value: function() {
                return Character.duelLevel;
            }
        }, {
            pattern: /%dm/,
            value: function() {
                return Math.ceil(5 * Character.duelLevel / 7);
            }
        }, {
            pattern: /%dx/,
            value: function() {
                return Math.ceil(7 * Character.duelLevel / 5);
            }
        } ];
        NerdFormatter.format = function(s) {
            var i, k, len, ref;
            ref = this.keys;
            for (i = 0, len = ref.length; i < len; i++) {
                k = ref[i];
                s = s.replace(k.pattern, k.value());
            }
            return s;
        };
        return NerdFormatter;
    }();
    NerdPortrait = function() {
        function NerdPortrait() {
            if (instance) {
                return instance;
            }
            instance = this;
            EventHandler.listen([ "health", "energy", "wear_changed", "taskqueue-updated", "position_change", "character_level_up" ], function() {
                NerdPortrait.instance().update();
            });
            this.update();
            return;
        }
        var instance;
        NerdPortrait.ID = "tw_nerd_portrait";
        NerdPortrait.NAME = "NERD Portrait";
        NerdPortrait.AUTHOR = "neversleep1911";
        NerdPortrait.WEB_SITE = "https://greasyfork.org/scripts/9505";
        NerdPortrait.MIN_GAME_VERSION = "2.22";
        NerdPortrait.MAX_GAME_VERSION = Game.version.toString();
        NerdPortrait.LSK_TEXT = "3577cb3d-1fbf-4c37-9b6a-3854a6c4c34d";
        NerdPortrait.DEFAULT_TEXT = '<div style="color: whitesmoke; position: relative; left: 10px; top: 5px; font-size: 75%; font-weight: bold; line-height: 110%;">\n' + "Health: %hp%<br />\n" + "Regen: %ch (%ht)<br />\n" + "1HP / %hr<br /><br />\n\n" + "Energy: %ep%<br />\n" + "Regen: %ce (%et)<br />\n" + "1EP / %er<br /><br />\n\n" + "Duel Level: %dl (%dm-%dx)" + "</div>";
        instance = null;
        NerdPortrait.instance = function() {
            return instance;
        };
        NerdPortrait.prototype.update = function() {
            if (!this.content) {
                $("div.character_link").append(this.content = $("<div />"));
            }
            this.content.html(NerdFormatter.format(this.text()));
        };
        NerdPortrait.prototype.text = function() {
            return this._text || (this._text = localStorage.getItem(NerdPortrait.LSK_TEXT)) || NerdPortrait.DEFAULT_TEXT;
        };
        NerdPortrait.prototype.setText = function(_text) {
            this._text = _text;
            localStorage.setItem(NerdPortrait.LSK_TEXT, this._text);
            this.update();
        };
        return NerdPortrait;
    }();
    Tab = function() {
        function Tab() {
            if (instance) {
                return instance;
            }
            instance = this;
            this.maindiv = $("<div />");
            this.maindiv.append((this.textGroup = Gui.createGroup()).getMainDiv());
            this.maindiv.append((this.actionGroup = Gui.createGroup()).getMainDiv());
            this.textGroup.appendToContentPane((this.text = Gui.createTextarea({
                width: 598,
                height: 205
            })).getMainDiv());
            this.actionGroup.appendToContentPane((this.buttonSave = Gui.createButton({
                text: I18n.tr("buttons.save")
            })).getMainDiv());
            EventHandler.listen("WINDOW_OPENED", function(uid) {
                if (uid !== "scripts") {
                    return;
                }
                Tab.instance().text.setContent(NerdPortrait.instance().text());
                $(Tab.instance().buttonSave.getMainDiv()).off("click").on("click", function() {
                    var e, text;
                    text = $.trim(Tab.instance().text.getContent());
                    if (text !== "") {
                        try {
                            NerdPortrait.instance().setText(text);
                            (new UserMessage(I18n.tr("messages.text_saved"), UserMessage.TYPE_SUCCESS)).show();
                        } catch (_error) {
                            e = _error;
                            (new UserMessage(e, UserMessage.TYPE_ERROR)).show();
                        }
                    } else {
                        (new UserMessage(I18n.tr("messages.enter_text"), UserMessage.TYPE_HINT)).show();
                    }
                    return false;
                });
            });
        }
        var instance;
        instance = null;
        Tab.instance = function() {
            return instance;
        };
        return Tab;
    }();
    $(document).ready(function() {
        var api;
        I18n.setLanguage(Game.locale);
        api = TheWestApi.register(NerdPortrait.ID, NerdPortrait.NAME, NerdPortrait.MIN_GAME_VERSION, NerdPortrait.MAX_GAME_VERSION, NerdPortrait.AUTHOR, NerdPortrait.WEB_SITE);
        api.setGui((new Tab).maindiv);
        new NerdPortrait;
        return true;
    });
});