Kongregate One

Kongregate One - One script to rule them all. Everything here.

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             Kongregate One
// @namespace        profusiongames.com
// @author           UnknownGuardian, AlphaOverall
// @version          1.2.5
// @date             04/19/2013
// @include          http://www.kongregate.com/games/*/*
// @include          http://www.kongregate.com/accounts/*
// @description      Kongregate One - One script to rule them all. Everything here.
// ==/UserScript==




// Small Additions by AlphaOverall (http://www.kongregate.com/accounts/AlphaOverall) 2015
// Written by UnknownGuardian (http://www.kongregate.com/accounts/UnknownGuardian) 2012 - 2013
// Written by Ventero (http://www.kongregate.com/accounts/Ventero) 2009 - 2013
// Licensed under MIT/X11 license
// Copyright (c) Ventero, UnknownGuardian
// http://www.opensource.org/licenses/mit-license.php
// All terms, licenses, credits, etc from scripts used here (documented in comments) apply

// This portion of attribution only applies to code written or modified based on MrSpontaneous' implementation
// Written by MrSpontaneous (http://www.kongregate.com/accounts/MrSpontaneous) 01/03/2010

//This portion of attribution only applies to code written or modified based on skyboy's implementation.
/**
	 *
	 * Assorted Userscripts by skyboy.
	 * Visit http://github.com/skyboy for documentation, updates
	 * and more free code.
	 *
	 *
	 * Copyright (c) 2010, skyboy
	 *    All rights reserved.
	 *
	 * Permission is hereby granted, free of charge, to any person
	 * obtaining a copy of this software and associated documentation
	 * files (the "Software"), to deal in the Software with
	 * restriction, with limitation the rights to use, copy, modify,
	 * merge, publish, distribute, sublicense copies of the Software,
	 * and to permit persons to whom the Software is furnished to do so,
	 * subject to the following conditions and limitations:
	 *
	 * ^ Attribution will be given to:
	 *  	skyboy, http://www.kongregate.com/accounts/skyboy;
	 *  	http://github.com/skyboy; http://skybov.deviantart.com
	 *
	 * ^ Redistributions of source code must retain the above copyright notice,
	 * this list of conditions and the following disclaimer in all copies or
	 * substantial portions of the Software.
	 *
	 * ^ Redistributions of modified source code must be marked as such, with
	 * the modifications marked and ducumented and the modifer's name clearly
	 * listed as having modified the source code.
	 *
	 * ^ Redistributions of source code may not add to, subtract from, or in
	 * any other way modify the above copyright notice, this list of conditions,
	 * or the following disclaimer for any reason.
	 *
	 * ^ Redistributions in binary form must reproduce the above copyright
	 * notice, this list of conditions and the following disclaimer in the
	 * documentation and/or other materials provided with the distribution.
	 *
	 * THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
	 * IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
	 * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
	 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
	 * OR COPYRIGHT HOLDERS OR CONTRIBUTORS  BE LIABLE FOR ANY CLAIM, DIRECT,
	 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
	 * OR OTHER LIABILITY,(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
	 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
	 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
	 * WHETHER AN ACTION OF IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
	 * NEGLIGENCE OR OTHERWISE) ARISING FROM, OUT OF, IN CONNECTION OR
	 * IN ANY OTHER WAY OUT OF THE USE OF OR OTHER DEALINGS WITH THIS
	 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
	 */






function main()
{
    console.log("KongOne Script running.");
    var dom = (typeof unsafeWindow === "undefined"?window:unsafeWindow);
    dom.oneScriptVersion = "1.101";



    init();
    function init()
    {
        if(typeof GM_setValue === 'undefined'){
            window.GM_setValue = function(a,b){localStorage.setItem(a,b)}
            window.GM_getValue = function(a,b){var r=localStorage.getItem(a);return (r==null?b:r)}
            window.GM_deleteValue = function(a){localStorage.removeItem(a)}
        }

        var url = dom.location.href;
        url = url.substr(url.indexOf(".com/") + ".com/".length);

        if(url.indexOf("/") != -1)
            oneDirectory = url.substring(0,url.indexOf("/"));
        else
            oneDirectory = url;

        oneDirectory = oneDirectory.split("?")[0];

        dom.holodeckCheckCounter = 0
        dom.holodeckInterval = dom.setInterval(checkIfHolodeckLoaded, 100)
        dom.oneScriptsInitialize = [];

        useScript("this", "accounts", init_showScriptOptions, false, true);
        useScript("Chat Timestamp", "games", init_chatTimestamp, true, true);
        useScript("Chat PM Notifier", "games", init_PMNotifier, true, true);
        useScript("Chat Line Highlighting", "games", init_chatLineHighlighting, true, true);
        useScript("Chat Reply-command", "games", init_replyCommand, true, true);
        //useScript("Chat Reply-command (hotkey)", "games", init_replyHotkey, true, true);
        useScript("Chat Username-completion", "games", init_usernameCompletion, true, true);
        useScript("Chat Mouseover Timestamp", "games", init_chatMouseoverTimestamp, true, false);
        useScript("Chat Afk Command", "games", init_afk, true, true);
        useScript("Chat Character-limit", "games", init_chatCharacterLimit, true, true);
        useScript("Chat KongreLink", "games", init_kongreLink, true, true);
        //useScript("Chat Images", "games", init_chatImage, true, true);
        useScript("Chat Resizer", "games", init_chatResizer, true, true);
        useScript("Kongquer", "games", init_kongquer, true, true);

        addScripts(false);
    }

    function useScript(name, page, callback, requiresHolodeck, defaultEnabled)
    {
        dom.oneScriptsInitialize.push({name:name, page:page, callback:callback, requiresHolodeck:requiresHolodeck, added:false, defaultEnabled:defaultEnabled});
    }

    function checkIfHolodeckLoaded()
    {
        holodeckCheckCounter++;
        console.log("[KongOne] Checking if holodeck loaded");
        if(typeof holodeck === 'undefined')
        {

        }
        else if(holodeck.ready)
        {
            dom.clearInterval(dom.holodeckInterval);
            console.log("[KongOne] Holodeck loaded");
            addScripts(true);
        }

        if(holodeckCheckCounter > 40)
        {
            dom.clearInterval(dom.holodeckInterval);
            console.log("[KongOne] Holodeck failed to load");
        }
    }

    function addScripts(onlyHolodeckRequired)
    {
        console.log("[KongOne] Adding Scripts with holodeckRequired = " + onlyHolodeckRequired);
        dom.oneScriptsInitialize.each(function(item)
                                      {
                                          if(!item.defaultEnabled && GM_getValue("onescript-" + item.name, "null") == "null")//never been touched before
                                              GM_setValue("onescript-" + item.name, "false");

                                          if(item.requiresHolodeck == onlyHolodeckRequired && !item.added)
                                          {
                                              if(item.page == oneDirectory && GM_getValue("onescript-" + item.name, "true") == "true")
                                              {
                                                  console.log("[KongOne] Adding Script: " + item.name);
                                                  item.callback();
                                                  item.added = true;
                                              }
                                          }
                                      })
        console.log("[KongOne] Added Scripts");
    }

    //============
    // This script's UI
    //============

    function init_showScriptOptions()
    {
        console.log("init shot script")
        var div = new Element("div", {"style":"background-color:#FFF;padding: 8px;"}).update("<h2>Scripts</h2>Enable - Script Name<p></p>");
        $("profile_aside").down().insert(div);
        dom.oneScriptsInitialize.each(function(item)
                                      {
                                          if(item.name == "this")
                                              return true; //aka, continue for each loops

                                          var span = new Element("span", {"style":"margin-top: 5px !important;display: block;"});
                                          div.insert(span);

                                          var checkbox = new Element("input", {"type":"checkbox", "id":"onescript-" + item.name, "style":"margin-top:2px;vertical-align:top;margin-right:8px;"});
                                          var label = new Element("label", {"class":"pls"})
                                          checkbox.checked = GM_getValue(checkbox.id,item.defaultEnabled?"true":"false") == "true";
                                          label.update(item.name);



                                          span.insert(checkbox);
                                          span.insert(label);


                                          checkbox.onchange = toggleScript;
                                      });

    }

    function toggleScript()
    {
        console.log("[KongOne] Toggled script");
        GM_setValue(this.id,this.checked);
    }


    //============
    // Chat Timestamps
    // http://userscripts.org/scripts/review/55571
    //============

    function init_chatTimestamp()
    {
        var holodeck = dom.holodeck,
            ChatDialogue = dom.ChatDialogue;
        console.log(holodeck, " h", ChatDialogue, " c");
        if(holodeck && ChatDialogue)
        {

            ChatDialogue.prototype = dom.CDprototype||dom.ChatDialogue.prototype;

            if(!holodeck.__timestamp){
                holodeck.__timestamp = true;

                holodeck.addChatCommand("timeformat", function(l,n){
                    var k = n.match(/^\/\S+\s+(\d+)/),
                        m = "",
                        q = l.activeDialogue();
                    k && (m=k[1]);
                    if(m==12 || m==24){
                        l._timeFormat = m;
                        window.setTimeout(function(){GM_setValue("kong_timeformat", m);}, 0);
                        q.displayMessage("Timeformat", "Set to "+m+"-hour clock (hh:mm:ss"+(m==12?" AM/PM)":")"), { "class": "whisper received_whisper"}, {non_user: true});
                    } else {
                        q.displayMessage("Timeformat", "Allowed values: 12 and 24", { "class": "whisper received_whisper"}, {non_user: true});
                    }
                    return false;
                });

                holodeck.addChatCommand("tscolor", function(l,n){
                    var k = n.match(/^\/\S+\s+([0-9a-f]{6})/i),
                        z = "";
                    k&&(z = "#"+k[1]);
                    if (z){
                        updateColor(z);
                        window.setTimeout(function(){GM_setValue("kong_timestampcolor", z);}, 0);
                        l.activeDialogue().displayMessage("Timestamp", "Set font-color to "+z, { "class": "whisper received_whisper"}, {non_user: true});
                    } else {
                        l.activeDialogue().displayMessage("Timestamp", "No valid color! Format is /tscolor ###### (# = hex character)", {"class":"whisper received_whisper"}, {non_user: true})
                    }
                    return false;
                });

                holodeck.addChatCommand("toggleseconds", function(l,n){
                    if(l._showSeconds){
                        l._showSeconds = 0;
                        l.activeDialogue().displayMessage("Timestamp", "Now hiding seconds", { "class": "whisper received_whisper"}, {non_user: true});
                    }else{
                        l._showSeconds = 1;
                        l.activeDialogue().displayMessage("Timestamp", "Now showing seconds", { "class": "whisper received_whisper"}, {non_user: true})
                    }
                    window.setTimeout(function(){GM_setValue("kong_timeshowseconds", l._showSeconds);}, 0);
                    return false;
                });

                var timeformat = 12, fontcolor = "#999999", seconds = 0;
                if(typeof GM_setValue !== "function"){
                    GM_getValue = GM_setValue = function(){};
                } else {
                    timeformat = GM_getValue("kong_timeformat", 12)||12;
                    fontcolor = GM_getValue("kong_timestampcolor", "#999999")||"#999999";
                    seconds = GM_getValue("kong_timeshowseconds", 0)||0;
                }
                holodeck._timeFormat = timeformat;
                holodeck._showSeconds = seconds;

                var updateColor = (function(c){
                    var style = document.createElement("style");
                    style.setAttribute("type", "text/css");
                    function _updateColor(color){
                        style.innerHTML = "span.inline_timestamp { color: " + color + " !important; }";
                    };

                    _updateColor(c);
                    document.body.appendChild(style);
					
                    return _updateColor;
                })(fontcolor);
                ChatDialogue.MESSAGE_TEMPLATE.template = '<p class="#{classNames}"><span style="float: left;" class="inline_timestamp">[#{time}]&nbsp;</span><span style="text-decoration: underline;" username="#{username}" class="username #{userClassNames}">#{prefix}#{username}</span><span class="separator">: </span><span class="message">#{message}</span><span class="clear"></span></p>'
                ChatDialogue.MESSAGE_TEMPLATE.old_evaluate_inline = ChatDialogue.MESSAGE_TEMPLATE.evaluate;
                ChatDialogue.MESSAGE_TEMPLATE.evaluate = function(args){
                    var date = new Date();
                    var hours = date.getHours();
                    var minutes = date.getMinutes();
                    var seconds = date.getSeconds();
                    var time;
                    if (holodeck._timeFormat == 12){
                        time = (hours<10?(hours==0?"12":"0"+hours):(hours>12?(hours>21?hours-12:"0"+(hours-12)):hours))+":"+(minutes<10?"0":"")+minutes+(holodeck._showSeconds?(":"+(seconds<10?"0":"")+seconds):"")+(hours>11?" PM":" AM");
                    } else {
                        time = (hours<10?"0":"")+hours+":"+(minutes<10?"0":"")+minutes+(holodeck._showSeconds?(":"+(seconds<10?"0":"")+seconds):"");
                    }
                    args.time = time;
                    return this.old_evaluate_inline(args);
                };
            }
        }
    }


    //============
    // Chat Line Highlighting
    // http://userscripts-mirror.org/scripts/review/49868
    //============

    function init_chatLineHighlighting()
    {

        var holodeck = dom.holodeck,
            CDialogue = dom.ChatDialogue,
            CRoom = dom.ChatRoom,
            CWindow = dom.ChatWindow;

        if(CRoom && CDialogue){

            CDialogue.prototype = dom.CDprototype||dom.ChatDialogue.prototype;
            CRoom.prototype = dom.CRprototype||dom.ChatRoom.prototype;
            CWindow.prototype = dom.CWprototype||dom.ChatWindow.prototype;
            if(!CDialogue.prototype.searchWord){

                if(!String.prototype.trim){
                    String.prototype.trim = function(){
                        return this.replace(/^\s+/, "").replace(/\s+$/, "");
                    }
                }

                CDialogue.prototype.searchWord = function(a, b){
                    for (var i=0;i<b.length;i++){
                        var r = b[i].replace(/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\)/g, '\\$1'),
                            reg = new RegExp("\\b"+r+"\\b");
                        if (reg.test(a)) return true;
                    }
                    return false;
                };

                CDialogue.prototype.searchUser = function(a){
                    return this.searchWord(a, this._holodeck._hluser);
                };

                CDialogue.prototype.searchText = function(a){
                    var l = this._holodeck,
                        z = l._highlighting.concat([l._username.toLowerCase()]);
                    return this.searchWord(a, z);
                }

                CWindow.prototype.hlFriend = function(a){
                    return this._holodeck._hl_friends && this.isFriend(a);
                }

                CWindow.prototype.hlMod = function(a){
                    if(!this._holodeck._hl_mods) return;

                    return this._rooms.any(function(roomArr){
                        var room = roomArr[1];
                        var user = room.user(a);
                        return user && room.canUserModerate(user);
                    });
                }

                CWindow.prototype.friendOrMod = function(a){
                    if(a.toLowerCase() == this._holodeck._username.toLowerCase()) return "";

                    var colors = [];
                    if(this.hlMod(a)) colors.push(" hlmod");
                    if(this.hlFriend(a)) colors.push(" hlfriend");
                    if(colors.length > 1)
                        return colors[this._holodeck._hl_priority]


                        return (colors[0] || "");
                }

                CDialogue.prototype.displayUnsanitizedMessageOldHighlight = CDialogue.prototype.displayUnsanitizedMessage;

                CDialogue.prototype.displayUnsanitizedMessage = function(user, msg, attributes, options){
                    if(!attributes) attributes = {};
                    var classes = attributes["class"] || "";
                    var isWhisper = (classes.indexOf("whisper") >= 0);

                    if(!(options && options["private"]))
                        classes += this._user_manager.friendOrMod(user.toLowerCase());

                    if(!isWhisper &&
                       !this._user_manager.isMuted(user.toLowerCase()) &&
                       (this.searchUser(user.toLowerCase()) ||
                        this.searchText(msg.toLowerCase()))) {
                        classes += " highlight";
                        if(typeof this.new_private_message === "function") {
                            var oldChime = holodeck._pm_chime;
                            holodeck._pm_chime = holodeck._hl_chime;
                            this.new_private_message();
                            holodeck._pm_chime = oldChime;
                        }
                    }

                    attributes["class"] = classes;

                    this.displayUnsanitizedMessageOldHighlight(user, msg, attributes, options);
                }

                holodeck.addChatCommand("highlight", function(l,n){
                    var k = n.match(/^\/\S+\s+(.+)/),
                        z = "";
                    k&&(z = k[1])
                    if(z){
                        z = z.replace(/\s+/g, ' ').trim();
                        window.setTimeout(function(){GM_setValue("kong_highlighting", z.toLowerCase());}, 0);
                        l.activeDialogue().kongBotMessage("Now highlighting: "+z+" "+l._username);
                        l._highlighting = z.toLowerCase().split(' ');
                    }
                    return false;
                });

                holodeck.addChatCommand("hluser", function(l,n){
                    var k = n.match(/^\/\S+\s+(.+)/),
                        z = "";
                    k&&(z = k[1])
                    if(z){
                        z = z.replace(/\s+/g, ' ').trim();
                        window.setTimeout(function(){GM_setValue("kong_highlightuser", z.toLowerCase());}, 0);
                        l.activeDialogue().kongBotMessage("Now highlighting user(s): "+z);
                        l._hluser = z.toLowerCase().split(' ');
                    }
                    return false;
                });

                function generateCallback(name, stop, start){
                    return function(l, n){
                        if(l["_hl_" + name]){
                            l["_hl_" + name] = 0;
                            l.activeDialogue().kongBotMessage(stop || "Stopped highlighting messages by " + name);
                        }else{
                            l["_hl_" + name] = 1;
                            l.activeDialogue().kongBotMessage(start || "Now highlighting messages by " + name);
                        }
                        window.setTimeout(function(){GM_setValue("kong_highlight"+name, l["_hl_" + name]);}, 0);
                        return false;
                    }
                }

                holodeck.addChatCommand("hlmods", generateCallback("mods"));
                holodeck.addChatCommand("hlfriends", generateCallback("friends"));
                holodeck.addChatCommand("hlchime", generateCallback("chime", "Stopped playing the chime for highlighted messages",
                                                                    "Now playing the chime for highlighted messages"));
                holodeck.addChatCommand("hlpriority", generateCallback("priority", "Now prioritizing mods over friends", "Now prioritizing friends over mods"));

                function generateColorCallback(selector, rule, name, text, max){
                    if(!max) max = 1;
                    return function(l, n){
                        var k = n.match(/^\/\S+\s+#?([0-9a-f]{6})/i),
                            z = "",
                            count = 0;
                        if(k) z = "#" + k[1];
                        if(z){
                            for(var i = 0; i < sheet.cssRules.length; i++){
                                if(sheet.cssRules[i].selectorText.indexOf(selector) == 0){
                                    sheet.cssRules[i].style.setProperty(rule, z, "important");
                                    if(++count == max){
                                        window.setTimeout(function(){GM_setValue("kong_" + name, z);}, 0);
                                        l.activeDialogue().kongBotMessage("New " + (text||name) + ": " + z);
                                        return false;
                                    }
                                }
                            }
                        } else {
                            l.activeDialogue().kongBotMessage("No valid color! Format is /" + name + " XXXXXX (X = hex character)");
                        }
                        return false;
                    }
                };

                holodeck.addChatCommand(
                    "whispercolor",
                    generateColorCallback("#kong_game_ui .chat_message_window .whisper",
                                          "background-color",
                                          "whispercolor")
                )

                holodeck.addChatCommand(
                    "friendcolor",
                    generateColorCallback("#kong_game_ui .chat_message_window .hlfriend span.chat_message_window_username",
                                          "color",
                                          "friendcolor")
                )
                holodeck.addChatCommand(
                    "hlcolor",
                    generateColorCallback("#kong_game_ui .chat_message_window .highlight",
                                          "background-color",
                                          "hlcolor",
                                          "highlighting-color",
                                          2)
                )
                holodeck.addChatCommand(
                    "modcolor",
                    generateColorCallback("#kong_game_ui .chat_message_window .hlmod span.chat_message_window_username",
                                          "color",
                                          "modcolor")
                )

                holodeck.addChatCommand("hllist", function(l, n) {
                    var diag = l.activeDialogue();
                    function botMessage(msg) {
                        diag.displayUnsanitizedMessage("Kong Bot", msg, {"class":"whisper received_whisper"}, {non_user: true});
                    }

                    botMessage("Current highlighting settings:");

                    if(holodeck._hluser.length > 0) {
                        botMessage('Users:');
                        botMessage('Users: ' + holodeck._hluser.map(function(user) {
                            return ['<a href="#" onclick="holodeck.showMiniProfile(\'', user,
                                    '\'); return false;">', user, '</a>'].join("");
                        }).join(" "));
                    } else {
                        botMessage("No users highlighted");
                    }

                    if(holodeck._highlighting.length > 0) {
                        botMessage('Words: ' + holodeck._highlighting.join(" "));
                    } else {
                        botMessage("No words highlighted");
                    }

                    botMessage('Highlight color: <span style="color: ' + color + '">' +
                               color + '</span>');
                    botMessage('Whisper color: <span style="color: ' + wcolor + '">' +
                               wcolor + '</span>');

                    botMessage("Highlighting friends: " +
                               (holodeck._hl_friends ? "Yes" : "No") +
                               ' (color: <span style="color: ' + fcolor + '">' +
                               fcolor + '</span>)');
                    botMessage("Highlighting mods: " +
                               (holodeck._hl_mods ? "Yes" : "No") +
                               ' (color: <span style="color: ' + mcolor + '">' +
                               mcolor + '</span>)');

                    botMessage("Highlight priority: " +
                               (holodeck._hl_priority ? "Friends over mods" : "Mods over friends"));
                    botMessage("Playing chime: " +
                               (holodeck._hl_chime ?
                                (typeof holodeck._pm_chime !== "undefined" ? "Yes" :
                                 'No, <a href="http://userscripts.org/scripts/show/65622">script</a> not installed') :
                                "No"));
                    return false;
                });

                holodeck.addChatCommand("hlreset", function(l, n) {
                    var diag = l.activeDialogue();
                    diag.kongBotMessage("Resetting all highlighting preferences");

                    holodeck._chat_commands.hlcolor[0](holodeck, "/color #def6ea");
                    holodeck._chat_commands.whispercolor[0](holodeck, "/color #deeaf6");
                    holodeck._chat_commands.friendcolor[0](holodeck, "/color #006600");
                    holodeck._chat_commands.modcolor[0](holodeck, "/color #ba6328");
                    holodeck._hl_priority = 1;
                    holodeck._hl_friends = 1;
                    holodeck._hl_mods = 1;
                    holodeck._hl_chime = 1;
                    holodeck._highlighting = [];
                    holodeck._hluser = [];

                    ["highlighting", "highlightuser", "hlcolor", "whispercolor", "friendcolor",
                     "modcolor", "highlightfriends", "highlightpriority", "highlightmods",
                     "highlightchime"].forEach(function(pref) {
                         window.setTimeout(function() {
                             GM_deleteValue("kong_" + pref);
                         }, 0);
                     });

                    return false;
                });

                holodeck._chat_commands.hl = holodeck._chat_commands.highlight;
                holodeck._chat_commands.hlfriend = holodeck._chat_commands.hlfriends;

                holodeck._highlighting = [];
                holodeck._hluser = [];


                var color = "#def6ea", wcolor = "#deeaf6", fcolor = "#006600", mcolor = "#ba6328", priority = 1, friends = 1, mods = 1, chime = 1;

                if(typeof GM_setValue !== "function"){
                    GM_setValue = GM_getValue = function(){};
                } else {
                    // migrate old value
                    var temp = GM_getValue("kong_highlightcolor", "");
                    if(temp){
                        GM_setValue("kong_hlcolor", temp);
                        if(typeof GM_deleteValue === "undefined"){
                            GM_setValue("kong_highlightcolor", "");
                        } else {
                            GM_deleteValue("kong_highlightcolor");
                        }
                    }

                    var list = GM_getValue("kong_highlighting"),
                        user = GM_getValue("kong_highlightuser");
                    color = GM_getValue("kong_hlcolor", "#def6ea")||"#def6ea";
                    wcolor = GM_getValue("kong_whispercolor", "#deeaf6")||"#deeaf6";
                    fcolor = GM_getValue("kong_friendcolor", "#006600")||"#006600";
                    mcolor = GM_getValue("kong_modcolor", "#ba6328")||"#ba6328";
                    friends = GM_getValue("kong_highlightfriends", 1);
                    priority = GM_getValue("kong_highlightpriority", 1);
                    mods = GM_getValue("kong_highlightmods", 1);
                    chime = GM_getValue("kong_highlightchime", 1);
                    if(list){holodeck._highlighting = list.trim().split(' ')};
                    if(user){holodeck._hluser = user.trim().split(' ')}
                }

                holodeck._hl_friends = friends;
                holodeck._hl_mods = mods;
                holodeck._hl_chime = chime;
                holodeck._hl_priority = priority;

                // guarantee we have a non-crossdomain stylesheet
                var style = document.createElement("style");
                var head = document.getElementsByTagName("head")[0];
                (head || document.body).appendChild(style);

                // now find it...
                var sheet = null;
                for(var s = document.styleSheets.length - 1; s >= 0; --s) {
                    try{
                        if(document.styleSheets[s].cssRules && document.styleSheets[s].cssRules.length) {
                            sheet = document.styleSheets[s];
                            break;
                        }
                    }catch(e){ /* no-op */ }
                }

                if(!sheet) {
                    alert("Kongregate Chat Line Highlighting could not find a style sheet!\nPlease send a message to Ventero about this problem.");
                    return;
                }

                sheet.insertRule('#kong_game_ui .chat_message_window .whisper { background-color: '+wcolor+' !important; }', sheet.cssRules.length);
                sheet.insertRule('#kong_game_ui .chat_message_window .highlight.even { background-color: '+color+' !important; }', sheet.cssRules.length);
                sheet.insertRule('#kong_game_ui .chat_message_window .highlight { background-color: '+color+' !important; }', sheet.cssRules.length);
                sheet.insertRule('#kong_game_ui .chat_message_window .hlfriend span.chat_message_window_username { color: '+fcolor+' !important; }', sheet.cssRules.length);
                sheet.insertRule('#kong_game_ui .chat_message_window .hlmod span.chat_message_window_username { color: '+mcolor+' !important; }', sheet.cssRules.length);
				sheet.insertRule('#kong_game_ui .chat_message_window p { padding: 2px 2px 2px 2px;}', sheet.cssRules.length);
				sheet.insertRule('#kong_game_ui .chat_message_window p { margin: 0px 0px;}', sheet.cssRules.length);
            }
        }
    }


    //============
    // Reply-Command
    // http://userscripts-mirror.org/scripts/review/47963
    //============
    function init_replyCommand()
    {

        var CDialogue = dom.ChatDialogue;

        if (CDialogue){

            CDialogue.prototype = dom.CDprototype||dom.ChatDialogue.prototype;
            if(!CDialogue.prototype.oldKeyPressReply){

                CDialogue.prototype.oldKeyPressReply = CDialogue.prototype.onKeyPress;

                if(CDialogue.prototype.reply){
                    CDialogue.prototype.oldreply = CDialogue.prototype.reply
                } else {
                    CDialogue.prototype.oldreply = function(a){};
                }
                CDialogue.prototype.reply = function(a){
                    this._holodeck._reply = a;
                    this.oldreply(a);
                }

                if(!CDialogue.prototype.showReceivedPM){
                    CDialogue.prototype.showReceivedPM = CDialogue.prototype.receivedPrivateMessage;
                    CDialogue.prototype.receivedPrivateMessage = function(a){
                        if (a.data.success){
                            this.reply(a.data.from)
                        }
                        this.showReceivedPM(a);
                    }
                }

                CDialogue.prototype.onKeyPress = function (a) {
                    var z, node = (this._input_node.wrappedJSObject || this._input_node);
                    if(a.which == 32 &&
                       ((a.currentTarget.selectionStart == 2 && (z = node.getValue().match(/^\/r(.*)/i))) ||
                        (z = node.getValue().match(/^\/r\b(.*)/i)))){
                        var x=z[1]||"";
                        if (this._holodeck._reply) {
                            this.setInput("/w "+this._holodeck._reply+" "+x);
                        } else {
                            this.setInput("/w ");
                        }
                        if(a.stop) a.stop();
                        if(a.preventDefault) a.preventDefault();
                    };

                    this.oldKeyPressReply(a);
                }
            }
        }
    }


    //==========
    // Reply-Command (hotkey)
    // http://userscripts-mirror.org/scripts/review/47983
    function init_replyHotkey(){

        var holodeck = dom.holodeck,
            CDialogue = dom.ChatDialogue;

        if (CDialogue && holodeck){
            CDialogue.prototype = dom.CDprototype||dom.ChatDialogue.prototype;

            if(!CDialogue.prototype.oldKeyPressReplyHotkey){
                CDialogue.prototype.oldKeyPressReplyHotkey = CDialogue.prototype.onKeyPress;

                CDialogue.prototype.onKeyPress = function (a) {
                    var node = (this._input_node.wrappedJSObject || this._input_node);
                    if (a.which == 13) {
                        this.cnt=0;
                    } else if (a.altKey && a.which == 114) {
                        this.cnt+=1;
                        l=this._holodeck._replyHotkey.length||-1;
                        reply=this._holodeck._replyHotkey[l-this.cnt]||"";
                        if(reply && this.cnt<=l){
                            if(z=node.getValue()){
                                if(z.match(/^\/[\s]*/)){
                                    z=z.replace(/^([^\s]+)\s*[^\s]*\s*(.*)/, '/w '+reply+' $2')
                                }else{
                                    z="/w "+reply+" "+z
                                };
                                this.setInput(z)
                            }else{
                                this._holodeck.insertPrivateMessagePrefixFor(reply);
                            }
                        }else if(this.cnt>l){
                            z=node.getValue();
                            if (z=="/w "+this._holodeck._replyHotkey[0]+" "){
                                this.setInput("/w ");
                                this.cnt=0;
                            }else if(z=="" && l>0){
                                this.cnt-=1;
                                this.setInput("/w "+this._holodeck._replyHotkey[l-this.cnt]+" ");
                            }else{
                                r=z.match(/^\/[^\s]+\s+[^\s]+\s+(.*)/);
                                r&&(z=r[1]);
                                this.setInput(z);
                                this.cnt=0;
                            }
                        }
                    }
                    this.oldKeyPressReplyHotkey(a);
                }

                CDialogue.prototype.cnt=0;

                CDialogue.prototype.whisperArray = function(a,x){var i=a.indexOf(x);if(-1!==i)a.splice(i, 1);return a.concat(x);};

                if(CDialogue.prototype.reply){
                    CDialogue.prototype.oldreplyHotkey = CDialogue.prototype.reply
                } else {
                    CDialogue.prototype.oldreplyHotkey = function(a){};
                }

                CDialogue.prototype.reply = function(a){
                    this._holodeck._replyHotkey=this.whisperArray(this._holodeck._replyHotkey, a);
                    this.oldreplyHotkey(a);
                }

                if(!CDialogue.prototype.showReceivedPM){
                    CDialogue.prototype.showReceivedPM = CDialogue.prototype.receivedPrivateMessage;
                    CDialogue.prototype.receivedPrivateMessage = function(a){
                        if (a.data.success){
                            this.reply(a.data.from)
                        }
                        this.showReceivedPM(a);
                    }
                }
                holodeck._replyHotkey= new Array();
            }
        }
    }


    //============
    // Username-Completion
    // http://userscripts-mirror.org/scripts/review/49872
    // Thanks to kaedenn for the idea of adding a colon if the username is the first word in the message
    //============
    function init_usernameCompletion()
    {
        if(typeof ChatDialogue === "undefined" ||
           ChatDialogue.prototype.oldKeyPressTab) return;

        var isChrome = (navigator.appVersion.indexOf("Chrome") >= 0);
        if(isChrome) {
            ChatDialogue.prototype.initialize =
                ChatDialogue.prototype.initialize.wrap(function(old, p, i, h, u){
                    old(p, i, h, u);
                    var self = this;
                    this._input_node.observe("keydown", function(event) {
                        if(event.keyCode != 9 || event.ctrlKey || event.altKey || event.metaKey) return;
                        self.onKeyPress(event);
                    });
                })
        }

        ChatDialogue.prototype.oldKeyPressTab = ChatDialogue.prototype.onKeyPress;
        ChatDialogue.prototype.tabcnt = 0;
        ChatDialogue.prototype.done = 1;
        ChatDialogue.prototype.onKeyPress = function(a){
            if (a.keyCode != 9 || a.ctrlKey){
                this.tabcnt = 0;
                this.done = 1;
                this.oldKeyPressTab(a);
                return;
            }

            var node = (this._input_node.wrappedJSObject || this._input_node);
            if (this.tabcnt == 0 && this.done == 1){
                var inputText = node.getValue(),
                    spaceAtCaret = inputText.substr(0, node.selectionStart).lastIndexOf(' ');
                this._caretPos = node.selectionStart;
                this._start = inputText.substr(0,spaceAtCaret);
                if(this._start) this._start+=" ";

                this._currentWord = inputText.substring(spaceAtCaret+1, this._caretPos);
                this._rest = inputText.substr(this._caretPos);
            }
            this.done = 0;

            var userArray = this._holodeck.chatWindow().activeRoom()._users_list,
                possibleMatches = [],
                z = node.getValue();
            if (z.match(/\s+$/)) z=z.replace(/\s+$/, '')

            for (var i=0;i<userArray.length;i++){
                if(userArray[i].username.toLowerCase().indexOf(this._currentWord.toLowerCase())==0){
                    possibleMatches.push(userArray[i].username);
                }
            }

            if (this.tabcnt < possibleMatches.length){
                node.setValue(this._start + possibleMatches[this.tabcnt] + (this._start?" ":": ") + this._rest);
                node.selectionStart = this._caretPos + possibleMatches[this.tabcnt].length - this._currentWord.length+(this._start?1:2);
                node.selectionEnd = node.selectionStart;
                this.tabcnt+=1;
            } else {
                node.setValue(this._start + this._currentWord + this._rest);
                node.selectionStart = this._caretPos;
                node.selectionEnd = this._caretPos;
                this.tabcnt = 0
            }
            if(a.stop) a.stop();
            if(a.preventDefault) a.preventDefault();
        }
    }


    //============
    // Kongregate Chat Mouseover Timestamp
    // http://userscripts-mirror.org/scripts/review/50785
    //============
    function init_chatMouseoverTimestamp()
    {

        var holodeck = dom.holodeck,
            ChatDialogue = dom.ChatDialogue,
            $ = dom.$;

        function injectMouseover(dom, $, holodeck, ChatDialogue) {
            var message_rollover_template = new dom.Element("div", {id: "message_rollover_template", "class": "user_rollover_container spritesite", style: "display: none"});
            var message_rollover = new dom.Element("div", {"class": "user_rollover spritesite"});
            var message_rollover_inner = new dom.Element("div", {"class": "user_rollover_inner"});
            var rollover_private_message_holder = new dom.Element("p", {"class": "rollover_message_private_message_link_message_link_holder"});
            var rollover_private_message_link = new dom.Element("a", {id: "rollover_message_private_message_link", "class": "rollover_message_private_message_link", href: "#"}).update("Private Message");
            rollover_private_message_holder.appendChild(rollover_private_message_link);
            var rollover_time_text = new dom.Element("p", {id: "rollover_time_text"});
            message_rollover_inner.appendChild(rollover_time_text);
            message_rollover_inner.appendChild(rollover_private_message_holder);
            message_rollover.appendChild(message_rollover_inner);
            message_rollover_template.appendChild(message_rollover);
            $('chat_tab_pane').appendChild(message_rollover_template);

            var MessageRollover = dom.MessageRollover = function(chat_dialogue) {
                this.initialize(chat_dialogue);
                return this;
            }

            MessageRollover.prototype = {
                initialize: function(chat_dialogue){
                    this._active_dialogue = chat_dialogue;
                    this._holodeck = chat_dialogue._holodeck;
                    this._rollover_template_node = $('message_rollover_template');
                    this._private_message_node = $('rollover_message_private_message_link');
                    this._time_node = $('rollover_time_text');

                    this._private_message_observer = function(){};

                    if(this._rollover_template_node){
                        var rollover = this;
                        this._rollover_template_node.observe('mouseover', function(event){
                            rollover.stopHide();
                            dom.Event.stop(event);
                        });
                        this._rollover_template_node.observe('mouseout', function(event){
                            rollover.beginHide();
                            dom.Event.stop(event);
                        });
                    }
                },
                show: function(time, user, event){
                    if(this._hideTimer) clearTimeout(this._hideTimer);
                    this.updatePrivateMessageLink(user);
                    this.updateTimeText(time);
                    this.setRolloverPosition(event);
                    this._rollover_template_node.show();
                },
                setRolloverPosition: function(event) {
                    var messagenode = event.target;
                    var current_scroll_top = this._active_dialogue._message_window_node.scrollTop;
                    var current_message_top = messagenode.positionedOffset()[1];
                    // nudge the user rollover up a little
                    current_message_top = current_message_top - 9;

                    var new_top_val = current_message_top;
                    if ( current_scroll_top < current_message_top ) {
                        new_top_val = current_message_top - current_scroll_top;
                    }

                    var top_style_str = new_top_val + 'px';
                    this._rollover_template_node.setStyle({ top: top_style_str });

                    // set left position based on username length
                    var username_width = messagenode.getWidth();
                    var new_left_val = 20 + username_width;

                    var left_style_str = new_left_val + 'px';
                    this._rollover_template_node.setStyle({ left: left_style_str });
                },

                updatePrivateMessageLink: function(username){
                    var cw = this._holodeck.chatWindow();
                    // replace observer
                    this._private_message_node.stopObserving('click');
                    this._private_message_observer = dom.CapturesToInlineRegistration.decorate(function(event){
                        // just put /w <username> in the chat input field
                        cw.insertPrivateMessagePrefixFor(username);
                        dom.Event.stop(event);
                        return false;
                    });
                    this._private_message_node.observe('click', this._private_message_observer);
                },
                updateTimeText: function(time){
                    this._time_node.innerHTML = time;
                },
                beginHide: function() {
                    var rollover = this;
                    if(this._hideTimer){ clearTimeout(this._hideTimer); }
                    this._hideTimer = setTimeout(function() { rollover.hide(); }, 500);
                },
                stopHide: function() {
                    clearTimeout(this._hideTimer);
                },
                hide: function() {
                    this._rollover_template_node.hide();
                }
            };

            ChatDialogue.MESSAGE_TEMPLATE.template = '<p class="#{classNames}"><span username="#{username}" time="#{time}" class="username #{userClassNames}">#{prefix}#{username}</span><span class="separator">: </span><span class="message">#{message}</span><span class="clear"></span></p>';
            ChatDialogue.MESSAGE_TEMPLATE.old_evaluate = ChatDialogue.MESSAGE_TEMPLATE.evaluate;
            ChatDialogue.MESSAGE_TEMPLATE.evaluate = function(args){
                var date = new Date();
                var hours = date.getHours();
                var minutes = date.getMinutes();
                var seconds = date.getSeconds();
                var time;
                if (holodeck._timeFormat == 12){
                    time = (hours<10?(hours==0?"12":"0"+hours):(hours>12?(hours>21?hours-12:"0"+(hours-12)):hours))+":"+(minutes<10?"0":"")+minutes+":"+(seconds<10?"0":"")+seconds+(hours>11?" PM":" AM"); // 12-hour clock
                } else {
                    time = (hours<10?"0":"")+hours+":"+(minutes<10?"0":"")+minutes+":"+(seconds<10?"0":"")+seconds; //24-hour clock
                }
                args.time = time;
                return this.old_evaluate(args);
            };

            ChatDialogue.prototype.initialize =
                ChatDialogue.prototype.initialize.wrap(function(old, parent_node, onInputFunction, holodeck, user_manager){
                    old(parent_node, onInputFunction, holodeck, user_manager);
                    //var self = this;
                    //this._input_node.observe("keydown", function(event) {
                    //	if(event.keyCode != 9 || event.ctrlKey || event.altKey || event.metaKey) return;
                    //	self.onKeyPress(event);
                    //});
                    //})
                    //ChatDialogue.prototype.initialize = function(parent_node, onInputFunction, holodeck, user_manager) {
                    this._messages_until_next_collection = 0;
                    this._holodeck = holodeck;
                    this._user_manager = user_manager;
                    this._parent_node = parent_node;
                    this._messages_count = 0;
                    this._insertion_count = 0;
                    this._onInputFunction = onInputFunction;
                    this._message_rollover_manager = new MessageRollover(this);

                    // Establish references to re-used nodes
                    this._message_window_node = parent_node.down('.chat_message_window');
                    this._input_node = parent_node.down('.chat_input');

                    this._messages_to_retain = 200;

                    this._message_window_node.stopObserving();

                    this._message_window_node.observe('mouseover', function(event) {
                        var time = event.target.getAttribute("time"),
                            user = event.target.getAttribute("username");
                        if (time){
                            holodeck.activeDialogue().showMessageRollover(time, user, event);
                            dom.Event.stop(event);
                        }
                    });

                    this._message_window_node.observe('mouseout', function(event) {
                        holodeck.activeDialogue().hideMessageRollover();
                        dom.Event.stop(event);
                    });

                    // Bind event listeners
                    var dialogue = this,
                        input_node = this._input_node;
                    this._input_node.observe('keypress', function(event) { dialogue.onKeyPress(event); });
                    this._input_node.observe('focus', function(event) { dialogue.clearPrompt(); });

                    // Trigger mini-profile for clicks on usernames in chat.
                    this._message_window_node.observe('click',
                                                      function(event) {
                                                          if (event.target) {
                                                              var username = event.target.getAttribute('username');
                                                              if(username){
                                                                  event.stop();
                                                                  user_manager.showProfile(username);
                                                              }
                                                          }
                                                      });
                });

            ChatDialogue.prototype.showMessageRollover = function (time, user, event){
                this._message_rollover_manager.show(time, user, event);
            }

            ChatDialogue.prototype.hideMessageRollover = function(){
                this._message_rollover_manager.beginHide();
            }
        }

        if(holodeck && ChatDialogue){
            if(!ChatDialogue.prototype && dom.CDprototype)
                ChatDialogue.prototype = dom.CDprototype;

            if(!holodeck.__mouseover){
                holodeck.__mouseover = true;

                var script = document.createElement("script");
                script.type = "text/javascript";
                script.textContent = "(" + injectMouseover.toString() + ")(window, $, holodeck, ChatDialogue);";
                document.body.appendChild(script);
                setTimeout(function(){document.body.removeChild(script);}, 100);

                holodeck.addChatCommand("timeformat", function(l,n){
                    var k = n.match(/^\/\S+\s+(\d+)/),
                        m = "",
                        q = l.activeDialogue();
                    k && (m=k[1]);
                    if(m==12 || m==24){
                        l._timeFormat = m;
                        window.setTimeout(function(){GM_setValue("kong_timeformat", m);}, 0);
                        q.displayMessage("Timeformat", "Set to "+m+"-hour clock (hh:mm:ss"+(m==12?" AM/PM)":")"), { "class": "whisper received_whisper"}, {non_user: true});
                    } else {
                        q.displayMessage("Timeformat", "Allowed values: 12 and 24", { "class": "whisper received_whisper"}, {non_user: true});
                    }
                    return false;
                });

                var timeformat = 12;

                if(typeof GM_setValue !== "undefined"){
                    timeformat = GM_getValue("kong_timeformat", 12)||12;
                }else{
                    GM_setValue = function(){};
                }

                holodeck._timeFormat = timeformat;
            }
        }
    }


    //============
    // Kongregate Chat Afk-Commands
    // http://userscripts-mirror.org/scripts/show/48936
    //============

    function init_afk(){
        var AUTOAFK = "kongregate_autoAFKTimeout";

        var holodeck = dom.holodeck,
            CDialogue = dom.ChatDialogue,
            CRoom = dom.ChatRoom,
            CWindow = dom.ChatWindow,
            Base64 = dom.Base64;

        if(holodeck && CDialogue){
            CDialogue.prototype = dom.CDprototype||dom.ChatDialogue.prototype;
            CRoom.prototype = dom.CRprototype||dom.ChatRoom.prototype;
            CWindow.prototype = dom.CWprototype||dom.ChatWindow.prototype;

            if(!holodeck.__afk){
                holodeck.__afk = true;
                if(!holodeck.setPresenceAwayOld){
                    holodeck.setPresenceAwayOld = holodeck.setPresenceAway;
                    holodeck.setPresenceAway = function(){
                        this._afk = 1;
                        this.setPresenceAwayOld();
                    }
                }
                if(!holodeck.setPresenceChatOld){
                    holodeck.setPresenceChatOld = holodeck.setPresenceChat;
                    holodeck.setPresenceChat = function(){
                        this._afk = 0;
                        this.setPresenceChatOld();
                    }
                }

                if(!CRoom.prototype.updateUserOld_AFK){
                    CRoom.prototype.updateUserOld_AFK = CRoom.prototype.updateUser;
                    CRoom.prototype.updateUser= function(user){
                        this.updateUserOld_AFK.apply(this, arguments);
                        if(user.username == this._chat_window.username()){
                            if(this._presence != user.variables.presence){
                                switch(user.variables.presence){
                                    case "chat":
                                        if(!this._chat_window._holodeck._afktoggle)
                                            this._chat_window._holodeck._afk = 0;
                                        break;
                                    case "away":
                                        this._chat_window._holodeck._afk = 1;
                                        break;
                                }
                            }
                        }
                    }
                }

                holodeck._chat_commands.afk[0] = function (l, n) { if (l._afk == 0) {l.setPresenceAway()} else {l.setPresenceChat()} return false; }
                holodeck._chat_commands.back[0] = function(l,n){l.setPresenceChat(); return false};

                holodeck.addChatCommand("afkmessage", function (l, n){ var z = n.match(/^\/\S+\s+(.+)/); if (z){a = z[1]}else{a="I am currently AFK"} l._afkmessage = a; l.activeDialogue().kongBotMessage("AFK-message set to: "+a); return false});

                holodeck.addChatCommand("afktoggle", function(l, n){ if (l._afktoggle == 0) {l._afktoggle = 1; l.activeDialogue().kongBotMessage("Your AFK-flag won't get removed automatically")} else {l._afktoggle = 0; l.activeDialogue().kongBotMessage("Your AFK-flag will be removed automatically")} return false; });

                holodeck.addChatCommand("autoafk", function(l, n){
                    var match = n.match(/^\/autoafk\s+(\d+)/),
                        timeout = 15;

                    if(match && match[1]){
                        timeout = parseInt(match[1], 10);
                    }

                    l._autoAFK = timeout*60*1000;
                    window.setTimeout(function(){GM_setValue(AUTOAFK, timeout)}, 0);

                    if(l._autoAFKTimeout){
                        clearTimeout(l._autoAFKTimeout);
                    }

                    if(timeout){
                        l.activeDialogue().kongBotMessage("Set auto-AFK timeout to " + timeout + " minute" + (timeout > 1?"s":""));
                        l._autoAFKTimeout = setTimeout(function(a){a.setPresenceAway();}, l._autoAFK, l);
                    } else {
                        l.activeDialogue().kongBotMessage("Disabled auto-AFK");
                    }

                    return false;
                });

                holodeck.checkAFK = function(){
                    if(!this._afktoggle){
                        this._afk = 0;
                    }
                    if(this._autoAFKTimeout){
                        clearTimeout(this._autoAFKTimeout);
                    }
                    if(this._autoAFK){
                        this._autoAFKTimeout = setTimeout(function(a){a.setPresenceAway();}, this._autoAFK, this);
                    }
                }

                holodeck.addOutgoingMessageFilter(function(message, nextFunction){
                    holodeck.checkAFK();
                    nextFunction(message, nextFunction);
                });

                // Outgoing whispers aren't filtered (yet), so check them manually...
                if(!CWindow.prototype.oldSendPrivateMessageAFK){
                    CWindow.prototype.oldSendPrivateMessageAFK = CWindow.prototype.sendPrivateMessage;
                    CWindow.prototype.sendPrivateMessage = function(user, msg){
                        if(msg.indexOf(this._holodeck._afkprefix)!=0){
                            this._holodeck.checkAFK();
                        }
                        this.oldSendPrivateMessageAFK(user, msg);
                    }
                }

                // Create setTimeout on session reconnect
                if(!CWindow.prototype.onLoginOldAFK){
                    CWindow.prototype.onLoginOldAFK = CWindow.prototype.onLogin;
                    CWindow.prototype.onLogin = function(){
                        this.onLoginOldAFK();
                        if(this._holodeck._afk) {
                            this._holodeck.setPresenceAway();
                        } else {
                            this._holodeck.setPresenceChat();
                            this._holodeck.checkAFK();
                        }
                    }
                }

                if(!CDialogue.prototype.reply){
                    CDialogue.prototype.reply = function(a){}
                }

                if(!CDialogue.prototype.showReceivedPM){
                    CDialogue.prototype.showReceivedPM = CDialogue.prototype.receivedPrivateMessage;
                }

                CDialogue.prototype.receivedPrivateMessage = function(a){
                    if (a.data.success){
                        this.reply(a.data.from);
                        if(this._holodeck._afk && Base64.decode(a.data.message).indexOf(this._holodeck._afkprefix)!=0){this.sendPrivateMessage(a.data.from, this._holodeck._afkprefix+this._holodeck._afkmessage)}
                    }
                    this.showReceivedPM(a);
                }

                holodeck._afk = 0;

                holodeck._afktoggle = 0;

                holodeck._afkmessage = "I am currently AFK";

                holodeck._afkprefix = "[AFK] ";

                var autoAFK = 15;

                try{
                    if(GM_setValue){
                        autoAFK = GM_getValue(AUTOAFK, 15);
                    }else{
                        GM_setValue = function(a,b){};
                    }
                }catch(e){
                    GM_setValue = function(a,b){};
                }

                holodeck._autoAFK = autoAFK*60*1000;
                if(holodeck._autoAFK > 0){
                    holodeck._autoAFKTimeout = setTimeout(function(a){a.setPresenceAway();}, holodeck._autoAFK, holodeck);
                }
            }
        }
    }


    //============
    // Character-limit
    // http://userscripts-mirror.org/scripts/review/48979
    //============
    function init_chatCharacterLimit(){

        var CDialogue = dom.ChatDialogue;

        if(CDialogue){
            CDialogue.prototype = dom.CDprototype||dom.ChatDialogue.prototype;

            if(!CDialogue.prototype.oldKeyPressLimit){
                CDialogue.prototype.oldKeyPressLimit = CDialogue.prototype.onKeyPress;
                CDialogue.prototype.onKeyPress = function (a) {
                    var node = (this._input_node.wrappedJSObject || this._input_node);
                    this.oldKeyPressLimit(a);
                    if (node.getValue().length > 249) {
                        z = node.getValue();
                        var y = "";
                        if (n=z.match(/^(\/\S+\s+\S*\s*)(.*)/)){
                            y=n[2];
                            if (y.length>249){
                                node.setValue(n[1]+y.substr(0, 249))
                            }
                        }else{
                            node.setValue(node.getValue().substr(0, 249))
                        }
                    }
                }
            }
        };
    }


    //============
    // KongreLink (skyboy attribution applies)
    // http://userscripts-mirror.org/scripts/review/72163
    //============

    function init_kongreLink()
    {
        window.location.assign("javascript:void(holodeck.addIncomingMessageFilter(function(m,n){var REGEX=/((?:<\\S[^>]+?)?(?:>)?)?(\\b(?:(?:(ht|f)tp)s?:\\/\\/)?(((?:\\w+[.])?(?:[a-z0-9][a-z0-9\\-]{0,61}[a-z0-9]|[a-z0-9]{1,2})[.])*(a(?:c|d|e(?:ro)?|f|g|i|l|m|n|o|q|r(?:pa)?|s(?:ia)?|t|u|w|x|z)|b(?:a|b|d|e|f|g|h|i|iz|j|l|m|n|o|r|s|t|v|w|y|z)|c(?:at?|c|d|f|g|h|i|k|l|m|n|o(?:m|op)?|r|u|v|x|y|z)|d[ejkmoz]|e(?:c|du|e|g|h|r|s|t|u)|f[ijkmor]|g(?:a|b|d|e|f|g|h|i|l|m|n|ov|p|q|r|s|t|u|w|y)|h[kmnrtu]|host|i(?:d|e|l|m|n(?:fo|t)|o|q|r|s|t)|je|jm|jo|jobs|jp|k[eghimnprwyz]|l[abcikrstuvy]|moe|m(?:a|c|d|e|f|g|h|i?l|k|m|n|o(?:bi)?|p|q|r|s|t|u(?:seum)?|v|w|x|y|z)|n(?:a(?:me)?|c|et?|f|g|i|l|o|p|r|u|z)|om|org|p(?:a|e|f|g|h|k|l|m|n|ro?|s|t|w|y)|qa|r[eosuw]|s(?:a|b|c|d|e|g|h|i|j|k|l|m|n|o|r|t|u|v|y|z)|t(?:c|d|e?l|f|g|th|j|k|m|n|o|p|r(?:avel)?|t|v|w|z)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])\\b([.]\\B)?|\\d+[.]\\d+[.]\\d+[.]\\d+)(?::\\d+)?)(\\/+\\??(?:\\S+))?/ig,lF=/(?:<(\\S)[^>]+?href=[\"'])(?:\\b((?:(ht|f)tp)s?:\\/\\/)?(((?:\\S+[.])?(?:[a-z0-9][a-z0-9\\-]{0,61}[a-z0-9]|[a-z0-9]{1,2})[.])*(a(?:c|d|e(?:ro)?|f|g|i|l|m|n|o|q|r(?:pa)?|s(?:ia)?|t|u|w|x|z)|b(?:a|b|d|e|f|g|h|i|iz|j|l|m|n|o|r|s|t|v|w|y|z)|c(?:at?|c|d|f|g|h|i|k|l|m|n|o(?:m|op)?|r|u|v|x|y|z)|d[ejkmoz]|e(?:c|du|e|g|h|r|s|t|u)|f[ijkmor]|g(?:a|b|d|e|f|g|h|i|l|m|n|ov|p|q|r|s|t|u|w|y)|h[kmnrtu]|i(?:d|e|l|m|n(?:fo|t)|o|q|r|s|t)|je|jm|jo|jobs|jp|k[eghimnprwyz]|l[abcikrstuvy]|m(?:a|c|d|e|f|g|h|i?l|k|m|n|o(?:bi)?|p|q|r|s|t|u(?:seum)?|v|w|x|y|z)|n(?:a(?:me)?|c|et?|f|g|i|l|o|p|r|u|z)|om|org|p(?:a|e|f|g|h|k|l|m|n|ro?|s|t|w|y)|qa|r[eosuw]|s(?:a|b|c|d|e|g|h|i|j|k|l|m|n|o|r|t|u|v|y|z)|t(?:c|d|e?l|f|g|th|j|k|m|n|o|p|r(?:avel)?|t|v|w|z)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])\\b([.]\\B)?|\\d+[.]\\d+[.]\\d+[.]\\d+)(?::\\d+)?)?(\\/+(?:\\S+))??(?:[\"'][^>]*?>([\\s\\S]+?)<\\/\\1>)/gi,q=function(w,c,r,l){var t,a,d;w=w.substring(0,(t=r.lastIndex)-(a=c[0]).length)+(a=(\"<a \"+(l?l[1]:'')+\" href='\"+(((d=c[3])==\"ht\"||d==\"f\")?\"\":\"http://\")+(d=a).replace(/<a[^>]+?href=([\"'])([\\s\\S]+?)\\1[^>]*?>[\\s\\S]+<\\/a>/, \"$2\")+\"' target='_blank'>\"+(c[9]||d)+\"</a>\"))+w.substring(t,w.length);REGEX.lastIndex+=a.length-d.length;return w},Q=function(b){var w=b,t=REGEX.lastIndex=0,a,c,d;while(c=REGEX.exec(w)){if(c[1]||(!c[5]&&!c[7])||(c[7]&&!(c[3]||c[8])))continue;w=q(w,c,REGEX)};while(c=lF.exec(w)){c[3]='ht';w=q(w,c,lF,c[0].match(/(class=(['\"])[^>]+?\\2)[\\s\\S]*?>/i))};return w};return n(Q(m),n)}))");
    }

    //============
    // PM Notifier (MrSpontaneous attribution applies
    // http://userscripts.org/scripts/review/48979
    //============
    function init_PMNotifier()
    {
        var holodeck = dom.holodeck,
            CDialogue = dom.ChatDialogue;
        if (CDialogue)
        {
            CDialogue.prototype = dom.CDprototype||dom.ChatDialogue.prototype;
            console.log("pm1");
            if (!CDialogue.prototype.new_private_message) 
            {
                console.log("pm2");
                dom._animatedFav = false;
                dom._pmCount = 0;
                dom._baseTitle = document.title;
                dom._blurred = false;
                dom._chime = dom.document.createElement('audio');
                dom._chime.setAttribute('src', 'data:audio/wav;base64,UklGRi4IAABXQVZFZm10IBAAAAABAAEAESsAABErAAABAAgAZGF0YakHAACAgIGBgYKEh4qLjIyNjY2LioqJh4aGio2QkZGRkI6Lh4B3cXJ0dnp/g4aHiImDdm1pZmVnbHR6fYGLlZuhpKOgnp2dnJGCdWldU0pEPjgyOktaaHR+homLjZWYjn9wYFJNSUZCPkNadYuitMXU2+Dn7uXRv7KnoaCkqKagpLO8wsfJyMG7uLetlYBzaF5ZVFNVVFFWYmt1fH58dm9pZl9NOy4hFQsEBAgKDRwyQ1NldICIi4+Xm5iVkId/eHR0dHN0gZWnuMna6fX6/P/979/Ova+knpybmJWZoaOlp6elopuVk4t7bF9SSUNAP0JGR0xZZXB8g4eLjod6aVdJPjEjHyUwPUlSXnKEiYF0aF1SQjIvOEdZa3iJnaqspp6WlZOLipSlus7d5vD17t/Qv7Oup5+cpbPCztHT1dTFrZN6ZVhLPjo/SVRcW1xiZFtKNiQYEAgAAg4fMkBIUV5mZV9ZVVpjZ218kanB0tzl7Ori2M/IyMrIydDd6vX49fHt4cy0nYd5cGVdXWJpb29pZmZhVEIuHRIMBQAEDhonMTY9RkxMSkVCRk9UWWV3ip6uusPLzcrFwLu7wMPFy9fj7/j6+PTs38y4o5OJgXhzdnuAhYR/endvYU87KiAaEw8SGyYxO0BGTlJQS0VAQEZKTllrf5WsvcHBwcC8s62xvcfT4+/z9vn359PEuayhm5iTi4J3alpQTkxFPjovIRYNBQIKHC0+UGFkXltbWFRXaX+UqsPZ4+fq6uHUzs7LyMvT19HGt5+Da19YVFJWW1ZNRTwvJis2QElVX1tRS05QUmF8mbHK5vn79e7j0b60rqqorLjCv7WnkHFVRDYtKzE2NDAvLysnLDlDTVpna2NdYmptdYqlu9Dn+v/68+zeyLavq6eor7i+vbeslnZcTkAzLS0uKiUmJiIdIzE6PkRMTUQ8P0ZLU2mJpLrT7Pv8+fXs28rEwr67v8vW1Mm/uLCllHdeVlJHNichIy5AXH2NjYuKhXpsaHJ6eHFoXFVWYHF2bWFVR0FETFdbV1piZ25/l7TM1tnZ0MfDwcPN1NTKtZ6Uj4iEgHRlU0I+RElSW1tZV1NTXGp/m662uLGloKCls8DCuaaMd2lgX2JeU0Y2KyszP0xSUFBQTlJfc4uisr/Hw7y8wMfS2NTHr5OAdGtpa2pmXlNNUFVaX15bWlhWW2RziJ2uvcbGwsC+wMXHw7ikjXpsY2JmZ2ZhV05LTE5RT0lFRUVKU2Fzhpajr7Owr66usrW0rqGNe25kXl9gX1xVTUtMT1RYWFdZXGFqdYSVpbG7wsK+vLm5vL26sqibj4d/enp5dW9mXFZTUFBQS0dGR0pSYHWGjY2RnK7Ayse3opOSmJaGbFFFSVRWTDwyPVd2iIh8cHWKqr++pouAh5idjGtLP0hdZ1xGOENkj6+2rKCmwOP589aznp+rq5RrQzI7UWBbSDU2T3eaqJ+NhpOwy9G/n4eDjpaIZDodGSk8PzMgGCdLdI+XkIuWstXq5syunaGtr5p0TTg6SlZTRTc3TnWarayhnarH5fPpzK6en6SehmJBMjVCRz4sHiE5X4CRj4WBjqnH1c62npOVmpV/YEU7QlBXTjwtLUJkhZeZk5GbscnVzrunnZ6jnolpSz1BUl9fUkRATmqKoKejnqCsvsnEspyNjJOWinFUPjhATVJMQDg8TmiAjZGSl6S5zNTMu6mhpKqpm4BjT0pPWFpTS0ZNXHGAh4aDhIydrbOsnIyGipSZkoFwYVZQUVRZYGdpa25sZWNpdoynur65rqKZlpaVl56ioJmLdV9SS09bZmZcTj4xMjtIU1xbVFJWWFdZXmp/ma24vbispaixvMza39rQwK6gl4yCgYOCfHBcRzs7QEpXW1ZOR0A9Q09gdo2eqK+xqZ+Zl5qltL/AuKaOeWxlYmVrbWpjWk5HRklOVl1fXVxbV1ZbZ3eMn6y0ubq1sK6vsLa9wsTAtqaViH52c3V1cWpgVU5MTk9RVFNQUVNUVVpganeIlZ6kpaGbl5eYm6Glp6ahmY2De3JtbG5vbmpiWlVWWV1jZmZjY2VnbHJ5gImSmqCmqaijn5ybnaKmqKahmZCKhYF9enh0cW5qZmRiYmJkZmdnaGhoaWtvdX2EiYyOkZKSkZGQj5CRkpOSkIqFgHt3dXNyc3R1dnl9gYOBfXh1c3Fta2xvcnV3e4CEhoaGhoiIhoSEhomNkJSan6GhnpuZlpGMiIaGhYOCg4WGhoOBfXp1cGtnZ2dnZ2hrbm9ubGtqaWdmZmltcHN2eXx9fHp6ent7e3x/g4iMj5KWmZqamZeWlJGOi4qJiYmJiouNjY2LioiFgn98e3p5eXl5ent7e3p6enp6enp6e3x8fH19fX19fn5+fn5+f39/f39/f3+AgICAgICAgICBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgABMSVNUWAAAAElORk9JQ09QHwAAAENvcHlyaWdodCCpIENpbmVtYXRyb25pY3MgMTk5NQAASVBSRCMAAABNaWNyb3NvZnQgUGx1cyEgriBmb3IgV2luZG93cyA5NSCuAAA=');
                dom._chime.load();

                //dom.document.addEventListener("blur", function() {
                window.onblur=function(){
                    dom._blurred = true;
                    console.log("Blur1");
                };//, false);
                console.log("pm3");
                //dom.document.addEventListener("focus", function() {
                window.onfocus=function(){
                    dom._blurred = false;
                    console.log("Focus 1");
                    dom.pmReset();
                };//, false);
                console.log("pm4");
                dom.pmReset = function() {
                    if (dom._animatedFav) {
                        dom.toggleFavLink();
                    }
                    dom._pmCount = 0;
                    document.title = dom._baseTitle;
                }
                console.log("pm5");
                dom.createFavLink = function(attr) {
                    var link = document.createElement("link");
                    link.type = attr['type'];
                    link.rel = attr['rel'];
                    link.href = attr['href'];
                    return link;
                }
                console.log("pm6");
                dom.toggleFavLink = function() {
                    var head = document.getElementsByTagName("head")[0];
                    var links = head.getElementsByTagName("link");
                    for (var i=0; i<links.length; i++) {
                        var link = links[i];
                        if (link.rel=="shortcut icon") {
                            head.removeChild(link);
                        }
                    }
                    if (dom._animatedFav) {
                        head.appendChild(dom.createFavLink(dom._staticFavLinkAttr));
                    }
                    else {
                        head.appendChild(dom.createFavLink(dom._animatedFavLinkAttr));
                    }
                    dom._animatedFav = !dom._animatedFav;
                }
                console.log("pm7");
                dom._staticFavLinkAttr = {'rel':'shortcut icon',  'href':'/favicon.ico', 'type':'image/x-icon'};
                dom._animatedFavLinkAttr = { 'rel':'shortcut icon', 'href':'data:image/gif;base64,R0lGODlhIAAgAPceAGYAAJgAAJgBAZkCApoEBJkWGpkAM5krAJkpL5krM6EMDKQPEaARDaYkLassIpkrZplVM5lVZswrM8xVM8xVZsyAZsyAmcyqmcyqzP+qzMzVzP/VzP/V////zP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAhkAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAIAAgAAAI/gATBBhIsKDBgwgTKlyI0ABBgRADRBQ40MCBiRIzUgxAYYPHjyA3ZDgw0ELIkyMHQvDAsqVLlhQvvJzpgSIFmi9j4nRJMcHOlhQt/GQpgSCFCxxmXqhAoeBRmhssVDhYYeYDhDdfbkgAAGHVlxMOynx5wSFCAF9dRjAolCzDti7DEtQwsynDtC3XSszwUoOErm9nhk2w4WWGjQyz8kxA12UHhgbxsrTQgaZeyAHgDoWJOYDkoRswo8W5VXFLDJg1nyYZoPDLqXdnZijocyaEwC9vF1TtgUPsl3YLNnapYeFnxAMl0LSAMEEC3heQJxhLFnHtnaEHOgAtgOBmBAMXIGzuHqDAZoIMxg8kcH5gA/WdDQqYT59+/Pv449MfoCAgACH5BAhkAAAALAAAAAAgACAAh5kAAJwICP38/P39/f7+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifAAsIHEiwoMGDCBMqXMiw4UEAECNKhDhwokWKFS9KzKgxIsGOHgWCDClyJEeQBTs+VLlyI8KLCi22nLhQZkqYNWl+tMmQZwGcDXkCDapzKNGRGB3+REryKFMASlkaTajxZNOYPpfqzOlyZ9aZSb1ufTlWbFeDVdGmNTsUKVufbq22NSlwwMgAA+2OFMCQgF+Cfv8qHUx4YWC/Aw4TGBgQADs%3D', 'type':'image/gif'};
                console.log("pm8");
                CDialogue.prototype.new_private_message = function() {
                    console.log("got pm 1");
                    if (_blurred || (document.hidden != undefined && document.hidden) || (document.webkitHidden != undefined && document.webkitHidden)) {
                        console.log("got pm blurred");
                        dom._pmCount++;
                        if (!dom._animatedFav) {
                            dom.toggleFavLink();
                        }
                        document.title = "[" + dom._pmCount + "] " + dom._baseTitle;
                        if (holodeck._pm_chime) {
                            dom._chime.play();
                        }
                    }				
                }

                if(!CDialogue.prototype.showReceivedPM_notifier){
                    CDialogue.prototype.showReceivedPM_notifier = CDialogue.prototype.receivedPrivateMessage;
                    CDialogue.prototype.receivedPrivateMessage = function(a){
                        if (a.data.success && !this._user_manager.isMuted(a.data.from)) {
                            this.new_private_message();
                        }
                        this.showReceivedPM_notifier(a);
                    }
                }

                holodeck.addChatCommand("pmchime", function (l,n){
                    if(l._pm_chime) {
                        l._pm_chime = 0;
                        l.activeDialogue().kongBotMessage("PM chime is OFF");
                    } else {
                        l._pm_chime = 1;
                        l.activeDialogue().kongBotMessage("PM chime is ON");
                    }
                    window.setTimeout(function(){GM_setValue("kong_pmchime", l._pm_chime);}, 0);
                    return false;
                });
                try{
                    if (GM_setValue){ 
                        var pm_chime = GM_getValue("kong_pmchime", 1);
                    }else{
                        GM_setValue = function(a,b){};
                        var pm_chime = 1;
                    }
                }catch(e){
                    GM_setValue = function(a,b){};
                    var pm_chime = 1;
                }
                holodeck._pm_chime = pm_chime;
            }
        }
    }


    //============
    // PM Notifier (MrSpontaneous attribution applies
    // http://userscripts.org/scripts/review/48979
    //============
    function init_chatResizer(){
        dom.defaultWidth = 500;
        dom.defaultHeight = 600;
        dom.spaceLeft = 200;
        dom.center = true;
        dom.userListHeight = 100;

        if(!$('maingamecontent')) return;
        var initialOffsetTop = $('maingamecontent').offsetTop + $('chat_tab_pane').offsetTop;
        var initialOffsetLeft = $('maingamecontent').offsetLeft + $('chat_tab_pane').offsetLeft;
        var minimumHeight = parseInt($("game").style.height, 10) - parseInt($('main_tab_set').clientHeight, 10) - 16;
        var minimumWidth = 300;

        if(dom.holodeck){
           
            var holodeck = dom.holodeck;
            holodeck.addChatCommand("size", function(l, n){
                var m = n.match(/^\/\S+\s+(\S+)/);
                var o = n.match(/^\/\S+\s+(\d+)\s+(\d+)(?:\s+(\d+))?/)

                if(m && m[1] == "reset"){
                    l.activeDialogue().kongBotMessage("Resetting size for this game to defaults.");
                    window.setTimeout(function(){GM_deleteValue("kong_resize_"+location.pathname)}, 0);
                    setWidth(window._defaultChatWidth);
                    setHeight(window._defaultChatHeight, window._defaultUserlistHeight, window._currentGameCentered);
                    
                    return false;
                } else if(m && m[1] == "show"){
                    l.activeDialogue().kongBotMessage("Current chat size: width: " + window._currentChatWidth + "px, height: " + window._currentChatHeight + "px, userlist-height: " + window._currentChatUserlistHeight + "px.");
                    return false;
                } else if(!o){
                    l.activeDialogue().kongBotMessage("Please specify a width and a height: /size width height. Example: /size 500 500");
                    return false;
                }

                var width = parseInt(o[1], 10);
                var height = parseInt(o[2], 10);
                var listHeight = parseInt(o[3]||100, 10);
                var gameHeight = parseInt($('game').style.height, 10);
                if(width < 300){
                    l.activeDialogue().kongBotMessage("Minimum width is 300. Setting width to 300px.");
                    width = 300;
                }

                if(height < gameHeight){
                    l.activeDialogue().kongBotMessage("Minimum height is the game's height. Setting height to " + gameHeight + "px.");
                    height = gameHeight;
                }

                if(listHeight > height - 200){
                    l.activeDialogue().kongBotMessage("Userlist height is too large. Setting it to 100px");
                    listHeight = 100;
                }

                window.setTimeout(function(){GM_setValue("kong_resize_"+location.pathname, width+"/"+height+"/"+listHeight)}, 0);
                l.activeDialogue().kongBotMessage("Resizing chat to " + width + "px/" + height + "px/" + listHeight + "px");
                setWidth(width);
                setHeight(height, listHeight, window._currentGameCentered);

                return false;
            });

            holodeck.addChatCommand("defaultsize", function(l, n){
                var m = n.match(/^\/\S+\s+(\S+)/);
                var o = n.match(/^\/\S+\s+(\d+)\s+(\d+)(?:\s+(\d+))?/)
                if(m && m[1] == "reset"){
                    l.activeDialogue().kongBotMessage("Resetting default size to 500/600/100");
                    window.setTimeout(function(){GM_deleteValue("kong_resize_default")}, 0);

                    return false;
                }	else if(m && m[1] == "show"){
                    l.activeDialogue().kongBotMessage("Current chat size: width: " + window._defaultChatWidth + "px, height: " + window._defaultChatHeight + "px, userlist-height: " + window._defaultUserlistHeight + "px.");
                    return false;
                } else if(!o){
                    l.activeDialogue().kongBotMessage("Syntax /defaultsize width height userlist-height. userlist-height is optional. Example: /defaultsize 500 500 100");
                }

                var width = parseInt(o[1], 10);
                var height = parseInt(o[2], 10);
                var listHeight = parseInt(o[3]||100, 10);
                if(width < 300){
                    l.activeDialogue().kongBotMessage("Minimum width is 300. Setting width to 300px.");
                    width = 300;
                }

                if(listHeight > height){
                    l.activeDialogue().kongBotMessage("Userlist height is too large. Setting it to 100px");
                    listHeight = 100;
                }

                window.setTimeout(function(){GM_setValue("kong_resize_default", width+"/"+height+"/"+listHeight)}, 0);
                l.activeDialogue().kongBotMessage("Set default values to width: " + width + "px, height: " + height + "px, userlist-height: " + listHeight + "px.");

                return false;
            });

            holodeck.addChatCommand("centergame", function(l, n){
                var center = !window._currentGameCentered;
                if(center){
                    l.activeDialogue().kongBotMessage("Now centering the game");
                } else {
                    l.activeDialogue().kongBotMessage("Now aligning the game to the chat's bottom");
                }
                window.setTimeout(function(){GM_setValue("kong_resize_center", center?1:0)}, 0);

                centerGame(center);

                return false;
            });
            
            holodeck.addChatCommand("draggable", function(l, n){
                var chatwindow = document.getElementById("chat_container");
                //chatwindow.style.overflow = "auto";
                chatwindow.style.resize = "both";
                chatwindow.onresize = new function() {
                    var chatcontainer = document.getElementById("chat_window");
                    chatcontainer.style.width = chatwindow.style.width;
                    chatcontainer.style.height = chatwindow.style.height;
                    console.log(chatwindow.style.width);
                    l.activeDialogue().kongBotMessage("Chat window is now resizeable");
                }
                return false;
            });

        }

        var getString = "", centerVal = -1, defaults = "";
        getString = GM_getValue("kong_resize_"+location.pathname, "");
        centerVal = GM_getValue("kong_resize_center", -1);
        defaults = GM_getValue("kong_resize_default", "");

        if(defaults){
            var splitArr = defaults.split("/");
            defaultWidth = parseInt(splitArr[0], 10)||defaultWidth;
            defaultHeight = parseInt(splitArr[1], 10)||defaultHeight;
            userListHeight = parseInt(splitArr[2], 10)||userListHeight;
        }

        window._defaultChatWidth = defaultWidth;
        window._defaultChatHeight = defaultHeight;
        window._defaultUserlistHeight = userListHeight;

        var x = defaultWidth, y = defaultHeight, l = userListHeight, cg = center, override = false;

        if(centerVal != -1){
            cg = (centerVal == 1);
        }

        if(getString){
            var splitArr = getString.split("/");
            x = parseInt(splitArr[0], 10)||defaultWidth;
            y = parseInt(splitArr[1], 10)||defaultHeight;
            l = parseInt(splitArr[2], 10)||userListHeight;
            override = true;
        }

        var gameWidth = parseInt($('game').style.width, 10);
        var gameHeight = parseInt($('game').style.height, 10);

        if(x > minimumWidth){
            if(override || gameWidth + x < screen.width - spaceLeft){ // enough place to resize to specified width
                setWidth(x);
            }else{ // resize as far as possible
                var chatWidth = screen.width - gameWidth - spaceLeft;
                if(chatWidth > minimumWidth) setWidth(chatWidth);
            }
        }

        if(y > minimumHeight && y > gameHeight){
            setHeight(y, l, cg);
        } else {
            setHeight(gameHeight, l, cg);
        }
    }

    function centerGame(center){
        window._currentGameCentered = center;
        if(center){
            var gameHeight = parseInt($('game').style.height, 10);
            var mainHeight = parseInt($("maingame").style.height, 10);
            $('game').style.top = (mainHeight - gameHeight)/2+"px"
            $('game').style.position = "relative";
        }else{
            $('game').style.bottom = "0px";
            $('game').style.top = "";
            $('game').style.position = "absolute";
        }
    }
    function setHeight(height, userListHeight, center){
        if(!userListHeight) userListHeight = 100;

        window._currentChatHeight = height;
        window._currentChatUserlistHeight = userListHeight;

        var quicklinksHeight = $('quicklinks') ? $('quicklinks').parentNode.clientHeight : 26;
        var maintabHeight = $('main_tab_set').clientHeight;

        var tabPaneHeight = height - 16;
        var mainHeight = height + quicklinksHeight + maintabHeight;
        var gameHeight = parseInt($('game').style.height, 10);

        $("maingame").style.height = mainHeight + "px";
        $("maingamecontent").style.height = mainHeight + "px";
        $("flashframecontent").style.height = mainHeight + "px";
        $("chat_container").style.height = (height + maintabHeight) + "px";
        $("user_mini_profile_container").style.height = (height - 65) + "px";
        $("user_mini_profile").style.height = (height - 65) + "px";

        var messageWindows = $$(".chat_message_window");
        for(var i = 0; i < messageWindows.length; i++){
            messageWindows[i].style.height = (tabPaneHeight - userListHeight - 93)+"px"; // 93 = roomname, users in room etc.
        }

        var usersInRoom = $$(".users_in_room");
        for(i = 0; i < usersInRoom.length; i++){
            usersInRoom[i].style.height = userListHeight + "px";
        }

        var roomsList = $$(".rooms_list");
        for(i = 0; i < roomsList.length; i++){
            roomsList[i].style.height = (height - 79)+"px";
        }

        z = $("kong_game_ui").childNodes;
        for(i=0;i<z.length;i++){
            if(z[i].nodeName=="DIV"){
                z[i].style.height = tabPaneHeight + "px";
            }
        }
        if(center != -1 && center !== undefined)
            centerGame(center);
    }

    function setWidth(width){
        window._currentChatWidth = width;
        var gameWidth = parseInt($("game").style.width, 10);
        $("maingame").style.width = (gameWidth + 3 + width) + "px";
        $("maingamecontent").style.width = (gameWidth + 3 + width) + "px";
        $("flashframecontent").style.width = (gameWidth + 3 + width) + "px";
        $("chat_container").style.width = width + "px";
        $('chat_window_spinner').style.right = width/2 - 38 + "px";
        if($('high_scores_spinner'))
            $('high_scores_spinner').style.right = width/2 - 38 + "px";
        var ui = $("kong_game_ui");
        z = ui.childNodes;
        for(i=0;i<z.length;i++){
            if(z[i].tagName == "DIV")
                z[i].style.width = (width - 17) + "px";
        }
        $A(ui.querySelectorAll("textarea.chat_input")).forEach(function(el){
            el.style.width = (width - 21) + "px";
        });
    }

    function $A(c){
        return [].slice.call(c);
    }

    //===========
    // Kongquer
    // http://alphaoverall.com
    // by AlphaOverall (http://www.kongregate.com/accounts/AlphaOverall)
    // Copyright (c) 2015 AlphaOverall
    // Inspired by Kongregate Get (http://userscripts-mirror.org/scripts/review/56432)
    // Full credit to Matthew Ammann and Ventero for the /avglvl and /mostplayed commands
    //==========
    function init_kongquer() {
        if(typeof holodeck !== "undefined" && !holodeck.__urlregex){
            holodeck.__urlregex = true;
        }
        function makeLink(user){
            return '<a href="#" onclick="holodeck.showMiniProfile(\'' + user + '\'); return false;">' + user + '</a>'; 
        }
        var holodeck = dom.holodeck;
        ChatDialogue = dom.ChatDialogue;
        //
        //Test command so you don't look stupid if script doesn't load
        //
        holodeck.addChatCommand("test", function(l,n){
            l.activeDialogue().displayUnsanitizedMessage("Kong Bot", "Script is active! Have fun...", {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });
        //
        //From original Kongregate Get script (http://userscripts-mirror.org/scripts/review/56432)
        //
        holodeck.addChatCommand("avg", function(l,n){
            var roomDetails = l.chatWindow().activeRoom();
            var allUsers = roomDetails.users();
            var allLevels = 0;
            for(var i=0; i < allUsers.length; i++){
                allLevels += allUsers[i]._level;
            }
            var avgLevel = Math.round(allLevels/allUsers.length*10)/10;
            l.activeDialogue().displayUnsanitizedMessage("Average Level in Room", avgLevel , {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });
        if(holodeck && ChatDialogue && !holodeck._chat_commands.mostplayed) {	
            //Credit goes entirely to Ventero for this command. Thanks for fixing the command after the Kongregate update, Vent :)
            holodeck.addChatCommand("mostplayed", function(l,n){
                var matchArr = n.match(/\/\S+\s+(\d+)/),
                    dialog = l.activeDialogue(),
                    gamesCount = 5,
                    userList = dom.$A(l.chatWindow().activeRoom().users()),
                    usersCount = userList.length;
                if(matchArr && matchArr[1]) gamesCount = matchArr[1];
                function p(count){
                    return count == 1?"":"s";
                }
                var games = dom.$H();
                userList.each(function(user){
                    console.log(user);
                    var o = user._game_url;
                    if(!games.get(o)){
                        games.set(o, {
                            title: user._game_title,
                            count: 0,
                            user: "",
                            url: o
                        });
                    }
                    games.get(o).count++;
                    games.get(o).user = user.username;
                });

                var countArr = games.values().sort(function(a,b){
                    return +b.count - +a.count;
                }).slice(0, gamesCount);
                var totalCount = games.size();

                dialog.displayUnsanitizedMessage("Kong Bot", usersCount+" user"+p(usersCount)+" playing "+totalCount+" different game" + p(totalCount), {"class":"whisper received_whisper"}, {non_user: true});
                dialog.displayUnsanitizedMessage("Kong Bot", gamesCount + " most played game" + p(gamesCount) + ":", {"class":"whisper received_whisper"}, {non_user: true});
                countArr.each(function(obj){
                    dialog.displayUnsanitizedMessage("Kong Bot",
                                                     obj.count + " user" + p(obj.count) + " (" +
                                                     (obj.count > 1 ? "" : makeLink(obj.user) + ", ") +
                                                     (100*obj.count/usersCount).toFixed(1) + "%) " +
                                                     (obj.count > 1 ? "are" : "is") + ' playing <a href="' +
                                                     obj.url + '">' + obj.title + "</a>", {"class":"whisper received_whisper"}, {non_user: true});
                });
                return false;
            });
            holodeck._chat_commands.mp = holodeck._chat_commands.getmp = holodeck._chat_commands.mostplayed;
        }
        //
        //Rest by AlphaOverall
        //
        holodeck.addChatCommand("highlvl", function(l,n){
            var roomDetails = l.chatWindow().activeRoom();
            var allUsers = roomDetails.users();
            var highLevels = "";
            var highestLevel = 0;
            var count = 0;
            for(var i=0; i < allUsers.length; i++){
                if (allUsers[i]._level > highestLevel){
                    highestLevel = allUsers[i]._level;
                    highLevels = "<img src=\"" + allUsers[i]._chat_avatar_url + "\">" + makeLink(allUsers[i].username);
                    count = 1;
                }
                else if (allUsers[i]._level == highestLevel){
                    highLevels = highLevels + ", <img src=\"" + allUsers[i]._chat_avatar_url + "\">" + makeLink(allUsers[i].username);
                    count+=1;
                }
            }
            l.activeDialogue().displayUnsanitizedMessage("Highest Level in Room", highestLevel + ", Usercount: " + count + ", Users: " + highLevels, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("lowlvl", function(l,n){
            var roomDetails = l.chatWindow().activeRoom();
            var allUsers = roomDetails.users();
            var lowLevels = "";
            var lowestLevel = Infinity; //Just to makes sure :P
            var count = 0;
            for(var i=0; i < allUsers.length; i++){
                if (allUsers[i]._level < lowestLevel){
                    lowestLevel = allUsers[i]._level;
                    lowLevels = "<img src=\"" + allUsers[i]._chat_avatar_url + "\">" + makeLink(allUsers[i].username);
                    count = 1;
                }
                else if (allUsers[i]._level == lowestLevel){
                    count+=1;
                    lowLevels = lowLevels + ", <img src=\"" + allUsers[i]._chat_avatar_url + "\">" + makeLink(allUsers[i].username);
                }
            }
            l.activeDialogue().displayUnsanitizedMessage("Lowest Level in Room", lowestLevel + ", Usercount: " + count + ", Users: " + lowLevels, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("list", function(l,n){
            var roomDetails = l.chatWindow().activeRoom();
            var allUsers = roomDetails.users();
            var userList = "";
            var word = n.match(/^\/\S+\s+(.+)/);
            var count = 0;
            if (word){
                var toFind = word[1];
                for(var i=0; i < allUsers.length; i++){
                    if (allUsers[i].username.toLowerCase().includes(toFind.toLowerCase())){
                        if (userList == ""){
                            userList = "<img src=\"" + allUsers[i]._chat_avatar_url + "\">" + makeLink(allUsers[i].username);
                            count = 1;
                        }
                        else{
                            count+=1;
                            userList = userList + ", <img src=\"" + allUsers[i]._chat_avatar_url + "\">" + makeLink(allUsers[i].username);
                        }
                    }
                }
                l.activeDialogue().displayUnsanitizedMessage("Usernames Containing " + word[1], "Usercount: " + count + ", Users: " + userList, {"class":"whisper received_whisper"}, {non_user: true});
            }
            else{
                l.activeDialogue().displayUnsanitizedMessage("Kong Bot", "Please use this command like " + n + " cat", {"class":"whisper received_whisper"}, {non_user: true});
            }
            return false;
        });
        holodeck.addChatCommand("levels", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            var roomDetails = l.chatWindow().activeRoom();
            var allUsers = roomDetails.users();
            if (z){
                var userLevels = "";
                var levelCount = [];
                var displaymessage = "";
                if (z[1].includes("-")){
                    var inbetween = z[1].split("-");
                    console.log(inbetween[0]);
                    console.log(inbetween[1]);
                    if (inbetween[0] < inbetween[1]){
                        for (var a=inbetween[0]; a <= inbetween[1]; a++){
                            levelCount.push(a);
                        }
                    }
                    else{
                        for (var a=inbetween[1]; a <= inbetween[0]; a++){
                            levelCount.push(a);
                        }
                    }
                    displaymessage = z[1];
                }
                else{
                    var levelCount = z[1].split(" ");
                    displaymessage = levelCount.join(", ");
                }
                console.log(levelCount);
                var count = 0;
                for (var b=0; b <= levelCount.length; b++){
                    for(var i=0; i < allUsers.length; i++){
                        if (allUsers[i]._level == levelCount[b] && userLevels == ""){
                            userLevels = "<img src=\"" + allUsers[i]._chat_avatar_url + "\">" + makeLink(allUsers[i].username);
                            count = 1;
                        }
                        else if (allUsers[i]._level == levelCount[b]){
                            count+=1;
                            userLevels = userLevels + ", <img src=\"" + allUsers[i]._chat_avatar_url + "\">" + makeLink(allUsers[i].username);
                        }
                    }

                }
                l.activeDialogue().displayUnsanitizedMessage("Level " + displaymessage, "Usercount: " + count + ", Users: " + userLevels, {"class":"whisper received_whisper"}, {non_user: true});
                return false;
            }
            else{
                var levelsList = [l._active_user._attributes._object.level];
                for(var j=0; j < allUsers.length; j++){
                    for (var k=0; k <= allUsers[j]._level; k++){
                        if (allUsers[j]._level == k){
                            if (levelsList.indexOf(k) < 0){
                                levelsList.push(k);
                            }
                        }
                    }
                }
                levelsList.sort(function(a, b){return a-b});
                l.activeDialogue().displayUnsanitizedMessage("Levels", levelsList.join(", "), {"class":"whisper received_whisper"}, {non_user: true});
                return false;
            }
        });

        holodeck.addChatCommand("highfans", function(l,n){
            var roomDetails = l.chatWindow().activeRoom();
            var allUsers = roomDetails.users();
            var highFans = "";
            var highestFans = 0;
            var count = 0;
            var content;
            for(var i=0; i < allUsers.length; i++){
                var username = allUsers[i].username;
                var url = "http://www.kongregate.com/accounts/" + username +"#user_followers";
                var request = new XMLHttpRequest();
                var amount;
                request.addEventListener("load", function(evt){
                    amount = evt.responseText;
                }, false);

                request.open("GET", url, true);
                request.send();
                var div = document.createElement("div");
                div.innerHTML = amount;
                var a = div.getElementsByTagName("li");
                for (var i = 0, len = a.length; i < len; i++){
                    if (a[i].textContent.includes("fans"))
                    {
                        console.log(a[i]);
                    }
                    else { console.log(a[i] + "hahah");}
                }
            }
            l.activeDialogue().displayUnsanitizedMessage("Highest Fans in Room", content, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });
        
        holodeck.addChatCommand("developer", function(l,n){
            var roomDetails = l.chatWindow().activeRoom();
            var allUsers = roomDetails.users();
            var devs = [];
            for(var i=0; i < allUsers.length; i++){
                if (allUsers[i]._developer){
                    devs.push(makeLink(allUsers[i].username));
                }
            }
            l.activeDialogue().displayUnsanitizedMessage("Developers in room", devs.join(", "), {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("admin", function(l,n){
            var roomDetails = l.chatWindow().activeRoom();
            var allUsers = roomDetails.users();
            var admins = [];
            for(var i=0; i < allUsers.length; i++){
                if (allUsers[i]._admin){
                    admins.push(makeLink(allUsers[i].username));
                }
            }
            l.activeDialogue().displayUnsanitizedMessage("Admins in room", admins.join(", "), {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("moderator", function(l,n){
            var roomDetails = l.chatWindow().activeRoom();
            var allUsers = roomDetails.users();
            var mods = [];
            for(var i=0; i < allUsers.length; i++){
                if (allUsers[i]._moderator_room_ids.length > 0 || allUsers[i]._moderator_game_ids.length > 0){
                    mods.push(allUsers[i].username);
                }
            }
            l.activeDialogue().displayUnsanitizedMessage("Mods in room", mods.join(", "), {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        //Simple commands that will show up in user info also
        holodeck.addChatCommand("id", function(l,n){
            var user = l._active_user._attributes._object;
            l.activeDialogue().displayUnsanitizedMessage("ID", user.id, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("username", function(l,n){
            var user = l._active_user._attributes._object;
            l.activeDialogue().displayUnsanitizedMessage("Username", makeLink(user.username), {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("kreds", function(l,n){
            var user = l._active_user._attributes._object;
            l.activeDialogue().displayUnsanitizedMessage("Kreds", user.kreds_balance, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });
        holodeck.addChatCommand("level", function(l,n){
            var user = l._active_user._attributes._object;
            l.activeDialogue().displayUnsanitizedMessage("Level", user.level, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("age", function(l,n){
            var user = l._active_user._attributes._object;
            l.activeDialogue().displayUnsanitizedMessage("Age", user.age, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });
        holodeck.addChatCommand("email", function(l,n){
            var user = l._active_user._attributes._object;
            l.activeDialogue().displayUnsanitizedMessage("Name/Email", user.sender_name_or_email, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("user", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z){
                var roomDetails = l.chatWindow().activeRoom();
                var allUsers = roomDetails.users();
                for(var i=0; i < allUsers.length; i++){
                    if (i == allUsers.length-1 && allUsers[i].username != z[1]){
                        l.activeDialogue().displayUnsanitizedMessage("Kong Bot", "User not in chat... Opening mini profile", {"class":"whisper received_whisper"}, {non_user: true});
                        holodeck.showMiniProfile(z[1]);
                        return false;
                    }
                    if (allUsers[i].username == z[1]){
                        var user = allUsers[i];
                        l.activeDialogue().displayUnsanitizedMessage("Username", "<img src=\""+user._chat_avatar_url+"\"></img>" + makeLink(user.username), {"class":"whisper received_whisper"}, {non_user: true});
                        l.activeDialogue().displayUnsanitizedMessage("Level", user._level, {"class":"whisper received_whisper"}, {non_user: true});
                        if (user._moderator_room_ids.length == 0 && user._moderator_game_ids.length == 0){
                            l.activeDialogue().displayUnsanitizedMessage("Admin/Moderator/Developer/Premium",user._admin+"/false/"+user._developer+"/"+user._premium, {"class":"whisper received_whisper"}, {non_user: true});
                        }
                        else{
                            l.activeDialogue().displayUnsanitizedMessage("Admin/Moderator/Developer/Premium",user._admin+"/true/"+user._developer+"/"+user._premium, {"class":"whisper received_whisper"}, {non_user: true});
                            if (!user._admin) {
                                l.activeDialogue().displayUnsanitizedMessage("Moderator Game Ids", user._moderator_game_ids.join(", "), {"class":"whisper received_whisper"}, {non_user: true});
                                l.activeDialogue().displayUnsanitizedMessage("Moderator Room Ids", user._moderator_room_ids.join(", "), {"class":"whisper received_whisper"}, {non_user: true});
                            }
                        }
                        l.activeDialogue().displayUnsanitizedMessage("Playing", "<a href=\"http://www.kongregate.com" + user._game_url + "\" target=\"_blank\">" + user._game_title + "</a>", {"class":"whisper received_whisper"}, {non_user: true});
                        l.activeDialogue().displayUnsanitizedMessage("Presence", user._presence, {"class":"whisper received_whisper"}, {non_user: true});
                        l.activeDialogue().displayUnsanitizedMessage("Role", user._role, {"class":"whisper received_whisper"}, {non_user: true});
                        return false;
                    }
                }
            }
            else {
                var user = l._active_user._attributes._object;
                l.activeDialogue().displayUnsanitizedMessage("Username", "<img src=\""+user.avatar_url+"\">" + makeLink(user.username), {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("Age", user.age, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("Admin/Moderator/Developer/Premium",user.admin+"/"+user.moderator+"/"+user.developer+"/"+user.premium, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("ID", user.id, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("Level", user.level, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("Points for Next Level", user.points_away, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("Total Points", user.points, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("Last Level Up", user.last_levelup_at, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("Kreds", user.kreds_balance, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("Gameplays", user.gameplays_count, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("Game Ratings", user.ratings_count, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("BOTD Earned This Week", user.botds_this_week, {"class":"whisper received_whisper"}, {non_user: true});
                l.activeDialogue().displayUnsanitizedMessage("Name/Email", user.sender_name_or_email, {"class":"whisper received_whisper"}, {non_user: true});
                return false;
            }
        });

        holodeck.addChatCommand("available", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z){
                l.activeDialogue().displayUnsanitizedMessage("Kong Bot", "Availability of " + z[1] + ":<iframe src=\"httP://www.kongregate.com/accounts/availability?username=" + z[1] + "\" width=\"100%\" height=\"30\"></iframe>", {"class":"whisper received_whisper"}, {non_user: true});
            }
            return false;
        });

        holodeck.addChatCommand("info", function(l,n){
            var info = l._chat_window._active_room;
            var room = info._room;
            l.activeDialogue().displayUnsanitizedMessage("Room Name", room.name, {"class":"whisper received_whisper"}, {non_user: true});
            l.activeDialogue().displayUnsanitizedMessage("Room ID", room.id, {"class":"whisper received_whisper"}, {non_user: true});
            l.activeDialogue().displayUnsanitizedMessage("Room Owner", "<a href=\"http://www.kongregate.com/accounts/" + room.owner + "\" target=\"_blank\">" + room.owner + "</a>", {"class":"whisper received_whisper"}, {non_user: true});
            l.activeDialogue().displayUnsanitizedMessage("Room Type", room.type, {"class":"whisper received_whisper"}, {non_user: true});
            l.activeDialogue().displayUnsanitizedMessage("Favorite Room", info._favorite_room, {"class":"whisper received_whisper"}, {non_user: true});
            l.activeDialogue().displayUnsanitizedMessage("Users In Room", info._number_in_room_node.innerText, {"class":"whisper received_whisper"}, {non_user: true});
            l.activeDialogue().displayUnsanitizedMessage("Guests In Room", info._guests_in_room_node.innerText, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("botd", function(l,n){
            var kbotd = l._active_user._attributes._object;
            var typeOf = "(easy)";
            if (kbotd.botd_reward_points == 5){//Do nothing
            }
            else if (kbotd.botd_reward_points == 15) {typeOf = "(medium)";}
            else if (kbotd.botd_reward_points == 30){typeOf = "(hard)";}
            else if (kbotd.botd_reward_points == 60){typeOf = "(impossible)";}
            else {typeOf = "Points: " + kbotd.botd_reward_points;} //Just in case
            l.activeDialogue().displayUnsanitizedMessage("BOTD", "<img src=\""+kbotd.botd_icon_uri+"\"></img>" + "<a href=\"" + kbotd.botd_game_uri + "\" target=\"_blank\">" + kbotd.botd_game_name + " - " + kbotd.botd_description + "</a> " + typeOf, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("friends", function(l,n){
            var kongfriends = l._chat_window._friends;
            var final = [];
            for(var friend in kongfriends){
                final.push("<a href=\"http://www.kongregate.com/accounts/" + friend + "\" target=\"_blank\">" + friend + "</a>");
            }
            l.activeDialogue().displayUnsanitizedMessage("Friends", final.join(", "), {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });

        holodeck.addChatCommand("online", function(l,n){
            holodeck._chat_window.showOnlineFriends();
            return false;
        });

        holodeck.addChatCommand("exit", function(l,n){
            close();
            return false;
        });

        holodeck.addChatCommand("open", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z[1]) {
                m = z[1].split(" ");
                if (m[0] == "accounts"){
                    if (m[1]){
                        open("http://www.kongregate.com/accounts/" + m[1], "_blank");
                    }
                    else{
                        open("http://www.kongregate.com/accounts/" + l._active_user._attributes._object.username);
                    }
                }
                else if (m[0] == "games"){
                    if (m[1]) {
                        if (m[2]){
                            open("http://www.kongregate.com/games/" + m[1] + "/" + m[2], "_blank");
                        }
                        else{
                            l.activeDialogue().displayUnsanitizedMessage("Kong Bot", "No specified game", {"class":"whisper received_whisper"}, {non_user: true});
                        }
                    }
                    else{
                        l.activeDialogue().displayUnsanitizedMessage("Kong Bot", "No specified game creator", {"class":"whisper received_whisper"}, {non_user: true});
                    }
                }
                else {
                    open("http://www.kongregate.com/search?q=" + z[1], "_blank");
                }
            }
            else {
                open("http://www.kongregate.com/accounts/" + l._active_user._attributes._object.username);
            }
            return false;
        });

        holodeck.addChatCommand("khelp", function(l,n){
            open("http://www.kongregate.com/pages/help", "_blank");
            return false;
        });

        holodeck.addChatCommand("kong", function(l,n){
            open("http://www.kongregate.com", "_blank");
            return false;
        });
        holodeck.addChatCommand("help", function(l,n){
            open("http://www.alphaoverall.com", "_blank");
            return false;
        });
        holodeck.addChatCommand("signup", function(l,n){
            lightbox.prototype.initializeKongregateLightboxFromAjax('/accounts/new/behind_login?game_id=' + active_user.gameId(), { afterStaticContentLoad:lightbox.prototype.toggleRegistration });
            return false;
        });
        holodeck.addChatCommand("login", function(l,n){
            active_user.activateInlineLogin();
            return false;
        });
        holodeck.addChatCommand("signout", function(l,n){
            signoutFromSite();
            return false;
        });
        holodeck.addChatCommand("google", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z) {
                open("https://www.google.com/search?q=" + z[1], "_blank");
            }
            else {
                open("https://www.google.com", "_blank");
            }
            return false;
        });
        holodeck.addChatCommand("bing", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z) {
                open("https://www.bing.com/search?q=" + z[1], "_blank");
            }
            else {
                open("https://www.bing.com", "_blank");
            }
            return false;
        });
        holodeck.addChatCommand("yahoo", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z) {
                open("https://search.yahoo.com/search;_ylt=Aq7xBwaF.DQZx151DcVK87ybvZx4?p=" + z[1], "_blank");
            }
            else {
                open("https://www.yahoo.com", "_blank");
            }
            return false;
        });
        holodeck.addChatCommand("wikipedia", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z) {
                open("https://en.wikipedia.org/wiki/" + z[1].replace(" ", "_"), "_blank");
            }
            else {
                open("https://en.wikipedia.org/", "_blank");
            }
            return false;
        });
        holodeck.addChatCommand("url", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z) {
                if (!z[1].includes("http://") && !z[1].includes("https://")){
                    open("http://"+z[1], "_blank");
                }
                else {
                    open(z[1], "_blank");
                }
            }
            else {
                l.activeDialogue().displayUnsanitizedMessage("Kong Bot", "Please use command like " + n + " https://www.google.com", {"class":"whisper received_whisper"}, {non_user: true});
            }
            return false;
        });

        holodeck.addChatCommand("calculator", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            var output = "Nothing happened";
            if (z) {
                /*jshint multistr: true */
                if (z[1] == "help"){
                    l.activeDialogue().displayUnsanitizedMessage("Math Commands", "+,-,*,<br>Math.abs(a) = absolute value of a<br>Math.acos(a) = arc cosine of a<br>\
Math.asin(a) = arc sine of a<br>Math.atan(a) = arc tangent of a<br>Math.atan2(a,b) = arc tangent of a/b<br>Math.ceil(a) = integer closest to a and not less than a<br>\
Math.cos(a) = cosine of a<br>Math.exp(a) = exponent of a (Math.E to the power a)<br>Math.floor(a) = integer closest to a, not greater than a<br>Math.log(a) = log of a base e<br>\
Math.max(a,b) = the maximum of a and b<br>Math.min(a,b) = the minimum of a and b<br>Math.pow(a,b) = a to the power b<br>Math.random() = pseudorandom number 0 to 1<br>\
Math.round(a) =  integer closest to a <br> Math.sin(a) = sine of a<br>Math.sqrt(a) = square root of a<br>Math.tan(a) = tangent of a", {"class":"whisper received_whisper"}, {non_user: true});
                }
                else{
                    try {
                        output = eval(z[1]); //I know, I know, eval is evil
                        l.activeDialogue().displayUnsanitizedMessage("Calculation", z[1] + " = " + output, {"class":"whisper received_whisper"}, {non_user: true});
                    }
                    catch (err){
                        l.activeDialogue().displayUnsanitizedMessage("Kong Bot", err, {"class":"whisper received_whisper"}, {non_user: true});
                    }
                }
            }
            else {
                l.activeDialogue().displayUnsanitizedMessage("Kong Bot", "Please use command like " + n + " 4+3-8*9/3^.5", {"class":"whisper received_whisper"}, {non_user: true});
            }
            console.log(output);
            return false;
        });
        holodeck.addChatCommand("youtube", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z) {
                var m = z[1].split(" ");
                if (m[0] == "embed"){
                    var chatWindow = document.getElementsByClassName("chat_message_window");
                    var chatWin;
                    if (chatWindow[2] != undefined && chatWindow[2].offsetHeight > chatWindow[1].offsetHeight){
                        chatWin = chatWindow[2];
                    }
                    else {
                        chatWin = chatWindow[1];
                    }
                    var h = chatWin.offsetHeight;
                    if (chatWin.offsetWidth > chatWin.offsetHeight) {
                        h = chatWin.offsetHeight;
                    }
                    else{
                        h = chatWin.offsetWidth*9/16; //YouTube 16:9 aspect ratio
                    }
                    if (m[1].includes("youtu.be/")){
                        l.activeDialogue().displayUnsanitizedMessage("YouTube", "<iframe src=\"https://www.youtube.com/embed/" + m[1].split("youtu.be/")[1] + "\" width=\"100%\" height=\"" + h +"\"></iframe>", {"class":"whisper received_whisper"}, {non_user: true});
                    }
                    else if (m[1].includes("youtube.com/watch?v=")){
                        l.activeDialogue().displayUnsanitizedMessage("YouTube", "<iframe src=\"https://www.youtube.com/embed/" + m[1].split("youtube.com/watch?v=")[1] + "\" width=\"100%\" height=\"" + h + "\"></iframe>", {"class":"whisper received_whisper"}, {non_user: true});
                    }
                    else{
                        l.activeDialogue().displayUnsanitizedMessage("YouTube", "Invalid YouTube video url", {"class":"whisper received_whisper"}, {non_user: true});
                    }
                }
                else {
                    open("https://www.youtube.com/results?search_query=" + z[1], "_blank");
                } 
            }
            else {
                open("https://www.youtube.com", "_blank");
            }
            return false;
        });
        holodeck.addChatCommand("mp3", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z[1].includes(".mp3")) {
                l.activeDialogue().displayUnsanitizedMessage("MP3 Container", "<audio src=\"" + z[1] + "\" controls><embed src=\"" + z[1] + "\"	width=\"100%\" height=\"90\" loop=\"false\" autostart=\"true\"/>" +
                                                             "</audio>", {"class":"whisper received_whisper"}, {non_user: true});
            }
            else {
                l.activeDialogue().displayUnsanitizedMessage("MP3 Container", "Invalid mp3 url", {"class":"whisper received_whisper"}, {non_user: true});
            }
            return false;
        });
        holodeck.addChatCommand("img", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z[1].includes(".jpg")||z[1].includes(".jpeg")||z[1].includes(".png")||z[1].includes(".gif")||z[1].includes(".bmp")) {
                l.activeDialogue().displayUnsanitizedMessage("IMG Container", "<img src=\"" + z[1] + "\" style=\"max-width:100%; max-height:100%;\"/>", {"class":"whisper received_whisper"}, {non_user: true});
            }
            else {
                l.activeDialogue().displayUnsanitizedMessage("IMG Container", "Invalid img url", {"class":"whisper received_whisper"}, {non_user: true});
            }
            return false;
        });
        holodeck.addChatCommand("time", function(l,n){
            var today = new Date(); 
            var format = today.getDate() + "/" + (today.getMonth()+1)  + "/" + today.getFullYear() + ", " + today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
            l.activeDialogue().displayUnsanitizedMessage("Date/Time", format, {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });
        holodeck.addChatCommand("reload", function(l,n){
            location.reload();
            return false;
        });
        holodeck.addChatCommand("reloadgame", function(l,n){
            activateGame(); // Default function on Kongregate to reload/activate game
            return false;
        });
        holodeck.addChatCommand("removegame", function(l, n) {
            try {
                var gametd = document.getElementById("gameholder");
                gametd.parentNode.removeChild(gametd);
                var width = document.getElementById("chat_container").offsetWidth;
                width = (width > 550 ? width + 5 : 570) + "px";
                console.log("Resizing containers to " + width);
                document.getElementById("flashframecontent").style.width = width;
                document.getElementById("maingamecontent").style.width = width;
                var maingame = document.getElementById("maingame");
                maingame.style.width = width;
                maingame.style.height = (parseInt(maingame.style.height) + 5) + "px";
            }
            catch (e) {
                l.activeDialogue().displayUnsanitizedMessage("Kong Bot", "No Game Found / Could not resize", {"class":"whisper received_whisper"}, {non_user: true});
            }
            return false;
        });
        holodeck.addChatCommand("clear", function(l,n){
            holodeck._active_dialogue.clear();
            return false;
        });
        holodeck.addChatCommand("report", function(l,n){
            var z = n.match(/^\/\S+\s+(.+)/);
            if (z) {
                m = z[1].split(" ");
                if (m[0] == "help"){
                    l.activeDialogue().displayUnsanitizedMessage("Report Help", "To report someone, type /report username message, or just /report username. Both cases will bring up the report box in chat.", {"class":"whisper received_whisper"}, {non_user: true});
                }
                else if (m[0] == null){
                    l.activeDialogue().displayUnsanitizedMessage("Report", "Invalid report format", {"class":"whisper received_whisper"}, {non_user: true});
                }
                else {
                    var message;
                    if (m[1] != undefined) {
                        var m2 = m.join(" ");
                        message = m2.substr(m2.indexOf(' ')+1);
                    }
                    else { message = "";}
                    active_room.showChatNag(' ' +
                                                                 '<div id="new_abuse_report" class="mvm mrl"><div id="abuse_form_internal" class="cntrBasic pam">' +
                                                                 '<form accept-charset="UTF-8" action="http://www.kongregate.com/accounts/' + m[0] + '/abuse_reports" method="post" onsubmit="new Ajax.Request(\'http://www.kongregate.com/accounts/aidansos132231/abuse_reports\', {asynchronous:true, evalScripts:true, method:\'post\', parameters:Form.serialize(this)}); return false;"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"><input name="authenticity_token" type="hidden" value="ub9xDEoiIi+lRAPWsUL2yApjKAbA2XKTjRO/taF1zwE="></div>' +
                                                                 '<dl>' +
                                                                 '<dd class="report_options"><select id="select_type" label="Abuse Type" name="type" onchange="subjectChanged(\'' + m[0] + '\')">' +
                                                                 '<option value="InappropriateUsernameReport">Inappropriate Username</option>' +
                                                                 '<option value="InappropriateAvatarReport">Inappropriate Avatar</option>' +
                                                                 '<option value="InappropriateProfileReport">Offensive Profile Content</option>' +
                                                                 '<option selected="selected" value="InappropriateChatReport">Chat Behavior</option>' +
                                                                 '<option value="OtherAbuseReport">Other</option></select></dd>' +
                                                                 '<div id="description_field">' +
                                                                 '<dd class="form_block" id="abuse_report_description_block">' +
                                                                 '<dl>' +
                                                                 '<span class="error_block error" id="abuse_report_description_error_block">' +
    
                                                                 '</span>' +
                                                                 '<dd class="label_block" id="abuse_report_description_label_block">' +
                                                                 '<label for="abuse_report_description" id="abuse_report_description_label">Please describe your reason for reporting ' + m[0] + ' using as much detail as possible. We don\'t need chat logs:</label>' +
                                                                 '</dd>' +
                                                                 '<dd id="abuse_report_description_control_block" class="input_block"><textarea cols="55" id="abuse_report_description" name="abuse_report[description]" rows="4">' + message + '</textarea></dd>' +
                                                                 '</dl>' +
                                                                 '</dd>' +

                                                                 '</div>' +
                                                                 '</dl>' +

                                                                 '<p class="report_submission">' +
                                                                 '<input class="submission_button" id="abuse_form_submit" onclick="try{}catch(e){};if(!this.elem_abuse_form_submit){this.elem_abuse_form_submit=$(\'abuse_form_submit\');this.spin_abuse_form_submit=$(\'abuse_form_submit_spinner\');this.restore=function(t){return function(){t.elem_abuse_form_submit.show();t.spin_abuse_form_submit.hide();Event.stopObserving(window, \'unload\', t.restore);}}(this);}this.elem_abuse_form_submit.hide();this.spin_abuse_form_submit.show();Event.observe(window, \'unload\', this.restore);" type="submit" value="submit"><span class="spinner" id="abuse_form_submit_spinner" style="display:none" title="loading…">​</span>' +
                                                                 '<a href="#" onclick="$(\'abuse_form_internal\').remove(); return false;">cancel</a>' +
                                                                 '</p>' +
                                                                 '</form></div>' +
                                                                 '</div>', {"class":"whisper received_whisper"}, {non_user: true});
                    
                }
            }
            return false;
        });
        holodeck.addChatCommand("cry", function(l,n){
            l.activeDialogue().displayUnsanitizedMessage("You're sad!", "( -̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥᷄◞ω◟-̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥̥᷅ )", {"class":"whisper received_whisper"}, {non_user: true});
            return false;
        });
        holodeck._chat_commands.wiki = holodeck._chat_commands.wikipedia;
        holodeck._chat_commands.weep = holodeck._chat_commands.krie = holodeck._chat_commands.cry;
        holodeck._chat_commands.lol = holodeck._chat_commands.hi = holodeck._chat_commands.hmm = holodeck._chat_commands.test;
        holodeck._chat_commands.userlist = holodeck._chat_commands.username = holodeck._chat_commands.list;
        holodeck._chat_commands.date = holodeck._chat_commands.datetime = holodeck._chat_commands.now = holodeck._chat_commands.time;
        holodeck._chat_commands.math = holodeck._chat_commands.calc = holodeck._chat_commands.calculator;
        holodeck._chat_commands.goto = holodeck._chat_commands.http = holodeck._chat_commands.www = holodeck._chat_commands.url;
        holodeck._chat_commands.lvl = holodeck._chat_commands.level;
        holodeck._chat_commands.konghelp = holodeck._chat_commands.kongregatehelp = holodeck._chat_commands.khelp;
        holodeck._chat_commands.kongregate = holodeck._chat_commands.kong;
        holodeck._chat_commands.avglvl = holodeck._chat_commands.alvl = holodeck._chat_commands.avg;
        holodeck._chat_commands.close = holodeck._chat_commands.exit;
        holodeck._chat_commands.roominfo = holodeck._chat_commands.info;
        holodeck._chat_commands.friendsonline = holodeck._chat_commands.online;
        holodeck._chat_commands.u = holodeck._chat_commands.me = holodeck._chat_commands.user;
        holodeck._chat_commands.admins = holodeck._chat_commands.administrator = holodeck._chat_commands.administrators = holodeck._chat_commands.admin;
        holodeck._chat_commands.dev = holodeck._chat_commands.devs = holodeck._chat_commands.developers = holodeck._chat_commands.developer;
        holodeck._chat_commands.mod = holodeck._chat_commands.mods = holodeck._chat_commands.moderators = holodeck._chat_commands.moderator;
        holodeck._chat_commands.hlvl = holodeck._chat_commands.highlevel = holodeck._chat_commands.hlevel = holodeck._chat_commands.highlvl;
        holodeck._chat_commands.llvl = holodeck._chat_commands.lowlevel = holodeck._chat_commands.llevel = holodeck._chat_commands.lowlvl;
        holodeck._chat_commands.mp = holodeck._chat_commands.getmp = holodeck._chat_commands.mostplayed;
    }
}


// This injects our script onto the page.
// Kinda borrowed from http://userscripts.org/scripts/review/125666
// Borrowed from: http://stackoverflow.com/a/2303228
var script = document.createElement('script');
script.appendChild(document.createTextNode('('+ main +')();'));
(document.body || document.head || document.documentElement).appendChild(script);