Applets + settings applet example
authorDarren <darren@darrenwhitlen.com>
Fri, 14 Sep 2012 18:49:41 +0000 (19:49 +0100)
committerDarren <darren@darrenwhitlen.com>
Fri, 14 Sep 2012 18:49:41 +0000 (19:49 +0100)
12 files changed:
client_backbone/dev/app.js
client_backbone/dev/applet_settings.js [new file with mode: 0644]
client_backbone/dev/build.js
client_backbone/dev/model_applet.js [new file with mode: 0644]
client_backbone/dev/model_application.js
client_backbone/dev/model_misc.js [deleted file]
client_backbone/dev/model_panel.js
client_backbone/dev/view.js
client_backbone/index.html
client_backbone/kiwi.js
client_backbone/kiwi.min.js
client_backbone/style.css

index c55267ec5d54461367cc3c58afca6d6c408db119..329b3a0571798369ef28ed6ecc6396b762d62bea 100644 (file)
@@ -6,6 +6,7 @@ var kiwi = {};
 \r
 kiwi.model = {};\r
 kiwi.view = {};\r
+kiwi.applets = {};\r
 \r
 \r
 /**\r
diff --git a/client_backbone/dev/applet_settings.js b/client_backbone/dev/applet_settings.js
new file mode 100644 (file)
index 0000000..4dc4e0c
--- /dev/null
@@ -0,0 +1,23 @@
+kiwi.applets.Settings = Backbone.View.extend({\r
+    events: {\r
+        'click .save': 'saveSettings'\r
+    },\r
+\r
+    initialize: function (options) {\r
+        this.$el = $($('#tmpl_applet_settings').html());\r
+        this.title = 'Settings';\r
+        window.s = this;\r
+    },\r
+    \r
+    saveSettings: function () {\r
+        var theme = $('.theme', this.$el).val(),\r
+            containers = $('#panels > .panel_container');\r
+\r
+        // Clear any current theme\r
+        containers.removeClass(function (i, css) {\r
+            return (css.match (/\btheme_\S+/g) || []).join(' ');\r
+        });\r
+\r
+        if (theme) containers.addClass('theme_' + theme);\r
+    }\r
+});
\ No newline at end of file
index 0f26fe966583e69cd9dcfee46495cebe9e1b0665..8ec86d4e59ba70f891c9bbb4e47a6301cdf738f5 100644 (file)
@@ -24,6 +24,9 @@ var src = concat([
     __dirname + '/model_panellist.js',\r
     __dirname + '/model_channel.js',\r
     __dirname + '/model_server.js',\r
+    __dirname + '/model_applet.js',\r
+\r
+    __dirname + '/applet_settings.js',\r
 \r
     __dirname + '/utils.js',\r
     __dirname + '/view.js'\r
diff --git a/client_backbone/dev/model_applet.js b/client_backbone/dev/model_applet.js
new file mode 100644 (file)
index 0000000..b9610d5
--- /dev/null
@@ -0,0 +1,44 @@
+kiwi.model.Applet = kiwi.model.Panel.extend({\r
+    // Used to determine if this is an applet panel. Applet panel tabs are treated\r
+    // differently than others\r
+    applet: true,\r
+\r
+    initialize: function (attributes) {\r
+        // Temporary name\r
+        var name = "applet_"+(new Date().getTime().toString()) + Math.ceil(Math.random()*100).toString();\r
+        this.view = new kiwi.view.Applet({model: this, name: name});\r
+\r
+        this.set({\r
+            "name": name\r
+        }, {"silent": true});\r
+    },\r
+\r
+    // Load an applet within this panel\r
+    load: function (applet_object, applet_name) {\r
+        if (typeof applet_object === 'object') {\r
+            this.set('title', applet_object.title || 'Something..');\r
+            this.view.$el.html('');\r
+            this.view.$el.append(applet_object.$el);\r
+\r
+        } else if (typeof applet_object === 'string') {\r
+            // Treat this as a URL to an applet script and load it\r
+            this.loadFromUrl(applet_object, applet_name);\r
+        }\r
+    },\r
+\r
+    loadFromUrl: function(applet_url, applet_name) {\r
+        var that = this;\r
+\r
+        this.view.$el.html('Loading..');\r
+        $script(applet_url, function () {\r
+            // Check if the applet loaded OK\r
+            if (!kiwi.applets[applet_name]) {\r
+                that.view.$el.html('Not found');\r
+                return;\r
+            }\r
+\r
+            // Load a new instance of this applet\r
+            that.load(new kiwi.applets[applet_name]());\r
+        });\r
+    }\r
+});
\ No newline at end of file
index 96661b3eda65f4c99465f0b4b1ebc84a6a54bba5..648da47637890b2884eeb548149a504641f69e1d 100644 (file)
@@ -507,7 +507,12 @@ kiwi.model.Application = Backbone.Model.extend(new (function () {
             });\r
         });\r
 \r
-        controlbox.on('command_theme', this.themeCommand);\r
+        controlbox.on('command_js', function (ev) {\r
+            if (!ev.params[0]) return;\r
+            $script(ev.params[0] + '?' + (new Date().getTime()));\r
+        });\r
+\r
+        controlbox.on('command_settings', this.settingsCommand);\r
     };\r
 \r
     // A fallback action. Send a raw command to the server\r
@@ -619,16 +624,12 @@ kiwi.model.Application = Backbone.Model.extend(new (function () {
         kiwi.gateway.notice(destination, ev.params.join(' '));\r
     };\r
 \r
-    this.themeCommand = function (ev) {\r
-        var theme = ev.params[0] || false,\r
-            containers = $('#panels > .panel_container');\r
-\r
-        // Clear any current theme\r
-        containers.removeClass(function (i, css) {\r
-            return (css.match (/\btheme_\S+/g) || []).join(' ');\r
-        });\r
-\r
-        if (theme) containers.addClass('theme_' + theme);\r
+    this.settingsCommand = function (ev) {\r
+        var panel = new kiwi.model.Applet();\r
+        panel.load(new kiwi.applets.Settings());\r
+        \r
+        kiwi.app.panels.add(panel);\r
+        panel.view.show();\r
     };\r
 \r
 \r
diff --git a/client_backbone/dev/model_misc.js b/client_backbone/dev/model_misc.js
deleted file mode 100644 (file)
index 2e18c58..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-kiwi.model.Misc = kiwi.model.Panel.extend({\r
-    // Used to determine if this is a misc panel. Misc panel tabs are treated\r
-    // differently than others\r
-    misc: true,\r
-\r
-    initialize: function (attributes) {\r
-        // Temporary name\r
-        var name = "misc_"+(new Date().getTime().toString()) + Math.ceil(Math.random()*100).toString();\r
-        this.view = new kiwi.view.Misc({model: this, name: name});\r
-\r
-        this.set({\r
-            "name": name\r
-        }, {"silent": true});\r
-    },\r
-\r
-    html: function (html) {\r
-        this.view.$el.append(html);\r
-    }\r
-});
\ No newline at end of file
index 3d58156ee79f7d25e5b6b1529301a5c7aa300459..571ceb4ce1813f507483624d5fadea2b83800452 100644 (file)
@@ -76,11 +76,11 @@ kiwi.model.Panel = Backbone.Model.extend({
         var channel_prefix = kiwi.gateway.get('channel_prefix'),\r
             this_name = this.get('name');\r
 \r
-        if (this.isMisc() || !this_name) return false;\r
+        if (this.isApplet() || !this_name) return false;\r
         return (channel_prefix.indexOf(this_name[0]) > -1);\r
     },\r
 \r
-    isMisc: function () {\r
-        return this.misc ? true : false;\r
+    isApplet: function () {\r
+        return this.applet ? true : false;\r
     }\r
 });
\ No newline at end of file
index 678aeac7d33dd830dd5bbf8fe4f4a2c8477728ed..e8e0eb0b44a3df89ab417ddb4e55d645a6cb6a4a 100644 (file)
@@ -163,6 +163,7 @@ kiwi.view.Panel = Backbone.View.extend({
 \r
     initializePanel: function (options) {\r
         this.$el.css('display', 'none');\r
+        options = options || {};\r
 \r
         // Containing element for this panel\r
         if (options.container) {\r
@@ -281,8 +282,11 @@ kiwi.view.Panel = Backbone.View.extend({
     }\r
 });\r
 \r
-kiwi.view.Misc = kiwi.view.Panel.extend({\r
-    className: 'misc'\r
+kiwi.view.Applet = kiwi.view.Panel.extend({\r
+    className: 'applet',\r
+    initialize: function (options) {\r
+        this.initializePanel(options);\r
+    }\r
 });\r
 \r
 kiwi.view.Channel = kiwi.view.Panel.extend({\r
@@ -307,7 +311,7 @@ kiwi.view.Channel = kiwi.view.Panel.extend({
 \r
 // Model for this = kiwi.model.PanelList\r
 kiwi.view.Tabs = Backbone.View.extend({\r
-    tabs_misc: null,\r
+    tabs_applets: null,\r
     tabs_msg: null,\r
 \r
     events: {\r
@@ -322,7 +326,7 @@ kiwi.view.Tabs = Backbone.View.extend({
 \r
         this.model.on('active', this.panelActive, this);\r
 \r
-        this.tabs_misc = $('ul.misc', this.$el);\r
+        this.tabs_applets = $('ul.applets', this.$el);\r
         this.tabs_msg = $('ul.channels', this.$el);\r
         window.t = this;\r
 \r
@@ -347,7 +351,7 @@ kiwi.view.Tabs = Backbone.View.extend({
 \r
             panel.tab\r
                 .data('panel_id', panel.cid)\r
-                .appendTo(panel.isMisc() ? this.tabs_misc : this.tabs_msg);\r
+                .appendTo(panel.isApplet() ? this.tabs_applets : this.tabs_msg);\r
         });\r
 \r
         kiwi.app.view.doLayout();\r
@@ -357,7 +361,7 @@ kiwi.view.Tabs = Backbone.View.extend({
         // Add a tab to the panel\r
         panel.tab = $('<li><span>' + (panel.get("title") || panel.get("name")) + '</span></li>');\r
         panel.tab.data('panel_id', panel.cid)\r
-            .appendTo(panel.isMisc() ? this.tabs_misc : this.tabs_msg);\r
+            .appendTo(panel.isApplet() ? this.tabs_applets : this.tabs_msg);\r
 \r
         kiwi.app.view.doLayout();\r
     },\r
@@ -371,7 +375,7 @@ kiwi.view.Tabs = Backbone.View.extend({
     panelActive: function (panel) {\r
         // Remove any existing tabs or part images\r
         $('img', this.$el).remove();\r
-        this.tabs_misc.children().removeClass('active');\r
+        this.tabs_applets.children().removeClass('active');\r
         this.tabs_msg.children().removeClass('active');\r
 \r
         panel.tab.addClass('active');\r
index 1828bab36215c5b6b41c45e110930497b8cc2776..a73c661e7391f5d09cb53af212bc2c798fe0d46f 100644 (file)
@@ -13,7 +13,7 @@
         <div id="toolbar">
             <div id="tabs">
                 <ul class="panellist channels"></ul>
-                <ul class="panellist misc"></ul>
+                <ul class="panellist applets"></ul>
             </div>
 
             <div id="topic">
         </div>
     </script>
 
+    <script type="text/x-jquery-tmpl" id="tmpl_applet_settings">
+        <div>
+            <select class="theme">
+                <option value="default">Default</option>
+                <option value="relaxed">Relaxed</option>
+            </select>
+            <button class="save">Save</button>
+        </div>
+    </script>
+
 
 <script>
 /* Script loader (https://github.com/ded/script.js) */
                 [
                     'dev/model_channel.js',
                     'dev/model_server.js',
-                    'dev/model_misc.js'
+                    'dev/model_applet.js'
                 ],
 
+                ['dev/applet_settings.js'],
+
                 [
                     'dev/utils.js',
                     'dev/view.js'
                 ]
             ]);
         } else {
-            scripts.push('kiwi.min.js');
+            scripts.push('kiwi.js');
         }
 
 
index 89511a9b9242272d27ccc75dab5e6615422a150d..b3de0cbaa057f1654a5f87cf337aa6d6399f1036 100644 (file)
@@ -8,6 +8,7 @@ var kiwi = {};
 \r
 kiwi.model = {};\r
 kiwi.view = {};\r
+kiwi.applets = {};\r
 \r
 \r
 /**\r
@@ -466,6 +467,56 @@ kiwi.model.Application = Backbone.Model.extend(new (function () {
                 panel.addMsg(event.nick, 'idle for ' + idle_time, 'whois');\r
             }\r
         });\r
+\r
+\r
+        gw.on('onirc_error', function (data) {\r
+            var panel, tmp;\r
+\r
+            if (data.channel !== undefined && !(panel = kiwi.app.panels.getByName(data.channel))) {\r
+                panel = kiwi.app.panels.server;\r
+            }\r
+\r
+            switch (data.error) {\r
+            case 'banned_from_channel':\r
+                panel.addMsg(' ', '=== You are banned from ' + data.channel + '. ' + data.reason, 'status');\r
+                kiwi.app.message.text('You are banned from ' + data.channel + '. ' + data.reason);\r
+                break;\r
+            case 'bad_channel_key':\r
+                panel.addMsg(' ', '=== Bad channel key for ' + data.channel, 'status');\r
+                kiwi.app.message.text('Bad channel key or password for ' + data.channel);\r
+                break;\r
+            case 'invite_only_channel':\r
+                panel.addMsg(' ', '=== ' + data.channel + ' is invite only.', 'status');\r
+                kiwi.app.message.text(data.channel + ' is invite only');\r
+                break;\r
+            case 'channel_is_full':\r
+                panel.addMsg(' ', '=== ' + data.channel + ' is full.', 'status');\r
+                kiwi.app.message.text(data.channel + ' is full');\r
+                break;\r
+            case 'chanop_privs_needed':\r
+                panel.addMsg(' ', '=== ' + data.reason, 'status');\r
+                kiwi.app.message.text(data.reason + ' (' + data.channel + ')');\r
+                break;\r
+            case 'no_such_nick':\r
+                tmp = kiwi.app.panels.getByName(data.nick);\r
+                if (tmp) {\r
+                    tmp.addMsg(' ', '=== ' + data.nick + ': ' + data.reason, 'status');\r
+                } else {\r
+                    kiwi.app.panels.server.addMsg(' ', '=== ' + data.nick + ': ' + data.reason, 'status');\r
+                }\r
+                break;\r
+            case 'nickname_in_use':\r
+                kiwi.app.panels.server.addMsg(' ', '=== The nickname ' + data.nick + ' is already in use. Please select a new nickname', 'status');\r
+                if (kiwi.app.panels.server !== kiwi.app.panels.active) {\r
+                    kiwi.app.message.text('The nickname "' + data.nick + '" is already in use. Please select a new nickname');\r
+                }\r
+                // TODO: Show a nick change box or something\r
+                break;\r
+            default:\r
+                // We don't know what data contains, so don't do anything with it.\r
+                //kiwi.front.tabviews.server.addMsg(null, ' ', '=== ' + data, 'status');\r
+            }\r
+        });\r
     };\r
 \r
 \r
@@ -506,7 +557,12 @@ kiwi.model.Application = Backbone.Model.extend(new (function () {
             });\r
         });\r
 \r
-        controlbox.on('command_theme', this.themeCommand);\r
+        controlbox.on('command_js', function (ev) {\r
+            if (!ev.params[0]) return;\r
+            $script(ev.params[0] + '?' + (new Date().getTime()));\r
+        });\r
+\r
+        controlbox.on('command_settings', this.settingsCommand);\r
     };\r
 \r
     // A fallback action. Send a raw command to the server\r
@@ -618,16 +674,12 @@ kiwi.model.Application = Backbone.Model.extend(new (function () {
         kiwi.gateway.notice(destination, ev.params.join(' '));\r
     };\r
 \r
-    this.themeCommand = function (ev) {\r
-        var theme = ev.params[0] || false,\r
-            containers = $('#panels > .panel_container');\r
-\r
-        // Clear any current theme\r
-        containers.removeClass(function (i, css) {\r
-            return (css.match (/\btheme_\S+/g) || []).join(' ');\r
-        });\r
-\r
-        if (theme) containers.addClass('theme_' + theme);\r
+    this.settingsCommand = function (ev) {\r
+        var panel = new kiwi.model.Applet();\r
+        panel.load(new kiwi.applets.Settings());\r
+        \r
+        kiwi.app.panels.add(panel);\r
+        panel.view.show();\r
     };\r
 \r
 \r
@@ -790,7 +842,7 @@ kiwi.model.Gateway = Backbone.Model.extend(new (function () {
     *   Parses the response from the server\r
     */\r
     this.parse = function (item) {\r
-        //console.log('gateway event', item);\r
+        console.log('gateway event', item);\r
         if (item.event !== undefined) {\r
             that.trigger('on' + item.event, item);\r
 \r
@@ -1293,12 +1345,12 @@ kiwi.model.Panel = Backbone.Model.extend({
         var channel_prefix = kiwi.gateway.get('channel_prefix'),\r
             this_name = this.get('name');\r
 \r
-        if (!this.isMisc || !this_name) return false;\r
+        if (this.isApplet() || !this_name) return false;\r
         return (channel_prefix.indexOf(this_name[0]) > -1);\r
     },\r
 \r
-    isMisc: function () {\r
-        return this.misc ? true : false;\r
+    isApplet: function () {\r
+        return this.applet ? true : false;\r
     }\r
 });
 
@@ -1390,6 +1442,77 @@ kiwi.model.Server = kiwi.model.Panel.extend({
 });
 
 
+kiwi.model.Applet = kiwi.model.Panel.extend({\r
+    // Used to determine if this is an applet panel. Applet panel tabs are treated\r
+    // differently than others\r
+    applet: true,\r
+\r
+    initialize: function (attributes) {\r
+        // Temporary name\r
+        var name = "applet_"+(new Date().getTime().toString()) + Math.ceil(Math.random()*100).toString();\r
+        this.view = new kiwi.view.Applet({model: this, name: name});\r
+\r
+        this.set({\r
+            "name": name\r
+        }, {"silent": true});\r
+    },\r
+\r
+    // Load an applet within this panel\r
+    load: function (applet_object, applet_name) {\r
+        if (typeof applet_object === 'object') {\r
+            this.set('title', applet_object.title || 'Something..');\r
+            this.view.$el.html('');\r
+            this.view.$el.append(applet_object.$el);\r
+\r
+        } else if (typeof applet_object === 'string') {\r
+            // Treat this as a URL to an applet script and load it\r
+            this.loadFromUrl(applet_object, applet_name);\r
+        }\r
+    },\r
+\r
+    loadFromUrl: function(applet_url, applet_name) {\r
+        var that = this;\r
+\r
+        this.view.$el.html('Loading..');\r
+        $script(applet_url, function () {\r
+            // Check if the applet loaded OK\r
+            if (!kiwi.applets[applet_name]) {\r
+                that.view.$el.html('Not found');\r
+                return;\r
+            }\r
+\r
+            // Load a new instance of this applet\r
+            that.load(new kiwi.applets[applet_name]());\r
+        });\r
+    }\r
+});
+
+
+kiwi.applets.Settings = Backbone.View.extend({\r
+    events: {\r
+        'click .save': 'saveSettings'\r
+    },\r
+\r
+    initialize: function (options) {\r
+        this.$el = $($('#tmpl_applet_settings').html());\r
+        this.title = 'Settings';\r
+        window.s = this;\r
+    },\r
+    \r
+    saveSettings: function () {\r
+        var theme = $('.theme', this.$el).val(),\r
+            containers = $('#panels > .panel_container');\r
+\r
+        // Clear any current theme\r
+        containers.removeClass(function (i, css) {\r
+            return (css.match (/\btheme_\S+/g) || []).join(' ');\r
+        });\r
+\r
+        if (theme) containers.addClass('theme_' + theme);\r
+    }\r
+});
+
+
 /*jslint devel: true, browser: true, continue: true, sloppy: true, forin: true, plusplus: true, maxerr: 50, indent: 4, nomen: true, regexp: true*/
 /*globals $, front, gateway, Utilityview */
 
@@ -2198,6 +2321,7 @@ kiwi.view.Panel = Backbone.View.extend({
 \r
     initializePanel: function (options) {\r
         this.$el.css('display', 'none');\r
+        options = options || {};\r
 \r
         // Containing element for this panel\r
         if (options.container) {\r
@@ -2316,8 +2440,11 @@ kiwi.view.Panel = Backbone.View.extend({
     }\r
 });\r
 \r
-kiwi.view.Misc = kiwi.view.Panel.extend({\r
-    className: 'misc'\r
+kiwi.view.Applet = kiwi.view.Panel.extend({\r
+    className: 'applet',\r
+    initialize: function (options) {\r
+        this.initializePanel(options);\r
+    }\r
 });\r
 \r
 kiwi.view.Channel = kiwi.view.Panel.extend({\r
@@ -2342,7 +2469,7 @@ kiwi.view.Channel = kiwi.view.Panel.extend({
 \r
 // Model for this = kiwi.model.PanelList\r
 kiwi.view.Tabs = Backbone.View.extend({\r
-    tabs_misc: null,\r
+    tabs_applets: null,\r
     tabs_msg: null,\r
 \r
     events: {\r
@@ -2357,7 +2484,7 @@ kiwi.view.Tabs = Backbone.View.extend({
 \r
         this.model.on('active', this.panelActive, this);\r
 \r
-        this.tabs_misc = $('ul.misc', this.$el);\r
+        this.tabs_applets = $('ul.applets', this.$el);\r
         this.tabs_msg = $('ul.channels', this.$el);\r
         window.t = this;\r
 \r
@@ -2382,7 +2509,7 @@ kiwi.view.Tabs = Backbone.View.extend({
 \r
             panel.tab\r
                 .data('panel_id', panel.cid)\r
-                .appendTo(panel.isMisc() ? this.tabs_misc : this.tabs_msg);\r
+                .appendTo(panel.isApplet() ? this.tabs_applets : this.tabs_msg);\r
         });\r
 \r
         kiwi.app.view.doLayout();\r
@@ -2392,7 +2519,7 @@ kiwi.view.Tabs = Backbone.View.extend({
         // Add a tab to the panel\r
         panel.tab = $('<li><span>' + (panel.get("title") || panel.get("name")) + '</span></li>');\r
         panel.tab.data('panel_id', panel.cid)\r
-            .appendTo(panel.isMisc() ? this.tabs_misc : this.tabs_msg);\r
+            .appendTo(panel.isApplet() ? this.tabs_applets : this.tabs_msg);\r
 \r
         kiwi.app.view.doLayout();\r
     },\r
@@ -2406,7 +2533,7 @@ kiwi.view.Tabs = Backbone.View.extend({
     panelActive: function (panel) {\r
         // Remove any existing tabs or part images\r
         $('img', this.$el).remove();\r
-        this.tabs_misc.children().removeClass('active');\r
+        this.tabs_applets.children().removeClass('active');\r
         this.tabs_msg.children().removeClass('active');\r
 \r
         panel.tab.addClass('active');\r
@@ -2430,7 +2557,8 @@ kiwi.view.Tabs = Backbone.View.extend({
         var panel = this.model.getByCid(tab.data('panel_id'));\r
 \r
         // Only need to part if it's a channel\r
-        if (panel.isChannel()) {\r
+        // If the nicklist is empty, we haven't joined the channel as yet\r
+        if (panel.isChannel() && panel.get('members').models.length > 0) {\r
             kiwi.gateway.part(panel.get('name'));\r
         } else {\r
             panel.close();\r
@@ -2661,6 +2789,7 @@ kiwi.view.StatusMessage = Backbone.View.extend({
         // Defaults\r
         opt = opt || {};\r
         opt.type = opt.type || '';\r
+        opt.timeout = opt.timeout || 5000;\r
 \r
         this.$el.text(text).attr('class', opt.type);\r
         this.$el.slideDown(kiwi.app.view.doLayout);\r
@@ -2672,6 +2801,7 @@ kiwi.view.StatusMessage = Backbone.View.extend({
         // Defaults\r
         opt = opt || {};\r
         opt.type = opt.type || '';\r
+        opt.timeout = opt.timeout || 5000;\r
 \r
         this.$el.html(text).attr('class', opt.type);\r
         this.$el.slideDown(kiwi.app.view.doLayout);\r
index ea644a795a510bbdff7e55e04e1b07b3d95147b0..ea1e46256e597748f942450873b4adffe9674da4 100644 (file)
@@ -1 +1 @@
-(function(a){function c(a){var b,c;window.console?(c=window.console.log,window.console.log=function(){a&&c.apply(console,arguments)}):(b=window.opera?window.opera.postError:alert,window.console={},window.console.log=function(c){a&&b(c)})}function d(a){var b="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz",c="",d,e;for(d=0;d<a;d++)e=Math.floor(Math.random()*b.length),c+=b.substring(e,e+1);return c}function e(a){var b,c,d,e,f,g;return b=Math.floor(a/3600),e=a%3600,c=Math.floor(e/60),f=e%60,d=Math.ceil(f),g={h:b,m:c,s:d},g}function f(a,b,c){var d,e,f,g,h,i;b/=100,c/=100;if(b==0)g=h=i=c*255;else{function j(a,b,c){var d;return c<0?c+=1:c>1&&(c-=1),6*c<1?d=a+(b-a)*c*6:2*c<1?d=b:3*c<2?d=a+(b-a)*(2/3-c)*6:d=a,255*d}c<=.5?e=c*(b+1):e=c+b-c*b,d=c*2-e,f=a/360,g=j(d,e,f+1/3),h=j(d,e,f),i=j(d,e,f-1/3)}return[g,h,i]}function g(a){var b,c;if(!a||typeof a!="string")return"";if(a.indexOf(String.fromCharCode(2))!==-1){c="<b>";while(a.indexOf(String.fromCharCode(2))!==-1)a=a.replace(String.fromCharCode(2),c),c=c==="<b>"?"</b>":"<b>";c==="</b>"&&(a+="</b>")}if(a.indexOf(String.fromCharCode(31))!==-1){c="<u>";while(a.indexOf(String.fromCharCode(31))!==-1)a=a.replace(String.fromCharCode(31),c),c=c==="<u>"?"</u>":"<u>";c==="</u>"&&(a+="</u>")}return a=function(a){var b,c,d,e,f,g,h,i,j,k;b="",c=function(a){var b=/^\x03([0-9][0-5]?)(,([0-9][0-5]?))?/;return b.exec(a)},d=function(a){switch(parseInt(a,10)){case 0:return"#FFFFFF";case 1:return"#000000";case 2:return"#000080";case 3:return"#008000";case 4:return"#FF0000";case 5:return"#800040";case 6:return"#800080";case 7:return"#FF8040";case 8:return"#FFFF00";case 9:return"#80FF00";case 10:return"#008080";case 11:return"#00FFFF";case 12:return"#0000FF";case 13:return"#FF55FF";case 14:return"#808080";case 15:return"#C0C0C0";default:return null}};if(a.indexOf("\ 3")!==-1){e=a.indexOf("\ 3"),b=a.substr(0,e);while(e<a.length)f=c(a.substr(e,6)),f?(g=a.indexOf("\ 3",e+1),h=a.indexOf(String.fromCharCode(15),e+1),h!==-1&&(g===-1?g=h:g=g<h?g:h),g===-1&&(g=a.length),i=d(f[1]),j=d(f[3]),k=a.substring(e+1+f[1].length+(j!==null?f[2].length+1:0),g),b+='<span style="'+(i!==null?"color: "+i+"; ":"")+(j!==null?"background-color: "+j+";":"")+'">'+k+"</span>",e=g):(a[e]!=="\ 3"&&a[e]!==String.fromCharCode(15)&&(b+=a[e]),e++);return b}return a}(a),a}var b={};b.model={},b.view={},b.global={gateway:undefined,user:undefined,server:undefined,channels:undefined,start:function(a){return a=a||{},b.app=new b.model.Application(a),a.kiwi_server&&(b.app.kiwi_server=a.kiwi_server),b.app.start(),!0},utils:undefined},typeof a!="undefined"&&(a.kiwi=b.global),b.model.Application=Backbone.Model.extend(new function(){function d(b){a.panels.server.server_login.showError()}var a=this,c={};this.panels=null,this.view,this.message,this.kiwi_server=null,this.initialize=function(){a=this,this.detectKiwiServer()},this.start=function(){!!getQueryVariable("debug"),b.gateway=new b.model.Gateway,this.bindGatewayCommands(b.gateway),this.initializeClient(),this.view.barsHide(!0),this.panels.server.server_login.bind("server_connect",function(e){var f=this;c=e,f.networkConnecting(),$script(a.kiwi_server+"/socket.io/socket.io.js?ts="+(new Date).getTime(),function(){if(!window.io){d();return}b.gateway.set("kiwi_server",a.kiwi_server+"/kiwi"),b.gateway.set("nick",e.nick),b.gateway.connect(e.server,e.port,e.ssl,e.password,function(){})})})},this.detectKiwiServer=function(){if(window.location.protocol==="file")this.kiwi_server="http://localhost:7777";else{var a=window.location.protocol==="https"?"https":"http";this.kiwi_server=a+"://"+window.location.host+":"+(window.location.port||"80")}},this.initializeClient=function(){this.view=new b.view.Application({model:this,el:this.get("container")}),this.panels=new b.model.PanelList,this.controlbox=new b.view.ControlBox({el:$("#controlbox")[0]}),this.bindControllboxCommands(this.controlbox),this.topicbar=new b.view.TopicBar({el:$("#topic")[0]}),this.message=new b.view.StatusMessage({el:$("#status_message")[0]}),this.panels.server.view.show(),this.view.doLayout(),this.panels.server.server_login.populateFields({nick:getQueryVariable("nick")||"kiwi_"+Math.ceil(Math.random()*1e4).toString(),server:getQueryVariable("server")||"irc.kiwiirc.com",port:6667,ssl:!1,channel:window.location.hash||"#test"})},this.bindGatewayCommands=function(d){d.on("onmotd",function(b){a.panels.server.addMsg(b.server,b.msg,"motd")}),d.on("onconnect",function(d){a.view.barsShow(),c.channel&&b.gateway.join(c.channel)}),function(){var b=0;d.on("disconnect",function(c){a.message.text("You have been disconnected. Attempting to reconnect.."),b=1}),d.on("reconnecting",function(b){a.message.text("You have been disconnected. Attempting to reconnect again in "+b.delay/1e3+" seconds..")}),d.on("connect",function(c){if(b!==1)return;a.message.text("It's OK, you're connected again :)",{timeout:5e3}),b=0})}(),d.on("onjoin",function(c){var d,e,f;d=a.panels.getByName(c.channel),d||(d=new b.model.Channel({name:c.channel}),a.panels.add(d)),e=d.get("members");if(!e)return;f=new b.model.Member({nick:c.nick,ident:c.ident,hostname:c.hostname}),e.add(f)}),d.on("onpart",function(c){var d,e,f,g={};g.type="part",g.message=c.message||"",d=a.panels.getByName(c.channel);if(!d)return;if(c.nick===b.gateway.get("nick")){d.close();return}e=d.get("members");if(!e)return;f=e.getByNick(c.nick);if(!f)return;e.remove(f,g)}),d.on("onquit",function(b){var c,d,e={};e.type="quit",e.message=b.message||"",$.each(a.panels.models,function(a,d){if(!d.isChannel())return;c=d.get("members").getByNick(b.nick),c&&d.get("members").remove(c,e)})}),d.on("onkick",function(c){var d,e,f,g={};g.type="kick",g.by=c.nick,g.message=c.message||"",d=a.panels.getByName(c.channel);if(!d)return;e=d.get("members");if(!e)return;f=e.getByNick(c.kicked);if(!f)return;e.remove(f,g),c.kicked===b.gateway.get("nick")&&e.reset([])}),d.on("onmsg",function(c){var d,e=c.channel==b.gateway.get("nick");e?(d=a.panels.getByName(c.nick),d||(d=new b.model.Channel({name:c.nick}),a.panels.add(d))):(d=a.panels.getByName(c.channel),d||(d=a.panels.server)),d.addMsg(c.nick,c.msg)}),d.on("onnotice",function(b){var c;c=a.panels.getByName(b.target)||a.panels.getByName(b.nick),c||(c=a.panels.server),c.addMsg("["+(b.nick||"")+"]",b.msg)}),d.on("onaction",function(c){var d,e=c.channel==b.gateway.get("nick");e?(d=a.panels.getByName(c.nick),d||(d=new b.model.Channel({name:c.nick}),a.panels.add(d))):(d=a.panels.getByName(c.channel),d||(d=a.panels.server)),d.addMsg("","* "+c.nick+" "+c.msg,"action")}),d.on("ontopic",function(c){var d;d=a.panels.getByName(c.channel);if(!d)return;d.set("topic",c.topic),d.get("name")===b.app.panels.active.get("name")&&a.topicbar.setCurrentTopic(c.topic)}),d.on("ontopicsetby",function(b){var c,d;c=a.panels.getByName(b.channel);if(!c)return;d=(new Date(b.when*1e3)).toLocaleString(),c.addMsg("","Topic set by "+b.nick+" at "+d,"topic")}),d.on("onuserlist",function(c){var d;d=a.panels.getByName(c.channel);if(!d)return;d.temp_userlist=d.temp_userlist||[],_.each(c.users,function(a){var c=new b.model.Member({nick:a.nick,modes:a.modes});d.temp_userlist.push(c)})}),d.on("onuserlist_end",function(b){var c;c=a.panels.getByName(b.channel);if(!c)return;c.get("members").reset(c.temp_userlist||[]),delete c.temp_userlist}),d.on("onmode",function(b){var c,d,e;if(!b.channel)return;c=a.panels.getByName(b.channel);if(!c)return;d=c.get("members");if(!d)return;e=d.getByNick(b.effected_nick);if(!e)return;b.mode[0]==="+"?e.addMode(b.mode.substr(1)):b.mode[0]==="-"&&e.removeMode(b.mode.substr(1))}),d.on("onnick",function(b){var c;$.each(a.panels.models,function(a,d){if(!d.isChannel())return;c=d.get("members").getByNick(b.nick),c&&(c.set("nick",b.newnick),d.addMsg("","== "+b.nick+" is now known as "+b.newnick,"action nick"))})}),d.on("onwhois",function(a){var c,d="",f;if(a.end)return;typeof a.idle!="undefined"&&(d=e(parseInt(a.idle,10)),d=d.h.toString().lpad(2,"0")+":"+d.m.toString().lpad(2,"0")+":"+d.s.toString().lpad(2,"0")),f=b.app.panels.active,a.msg?f.addMsg(a.nick,a.msg,"whois"):a.logon?(c=new Date,c.setTime(a.logon*1e3),c=c.toLocaleString(),f.addMsg(a.nick,"idle for "+d+", signed on "+c,"whois")):f.addMsg(a.nick,"idle for "+d,"whois")})},this.bindControllboxCommands=function(a){a.on("unknown_command",this.unknownCommand),a.on("command",this.allCommands),a.on("command_msg",this.msgCommand),a.on("command_action",this.actionCommand),a.on("command_me",this.actionCommand),a.on("command_join",this.joinCommand),a.on("command_j",this.joinCommand),a.on("command_part",this.partCommand),a.on("command_p",this.partCommand),a.on("command_nick",function(a){b.gateway.changeNick(a.params[0])}),a.on("command_query",this.queryCommand),a.on("command_q",this.queryCommand),a.on("command_topic",this.topicCommand),a.on("command_notice",this.noticeCommand),a.on("command_css",function(a){var b="?reload="+(new Date).getTime();$('link[rel="stylesheet"]').each(function(){this.href=this.href.replace(/\?.*|$/,b)})}),a.on("command_theme",this.themeCommand)},this.unknownCommand=function(a){var c=a.command+" "+a.params.join(" ");console.log("RAW: "+c),b.gateway.raw(c)},this.allCommands=function(a){console.log("allCommands",a)},this.joinCommand=function(c){var d,e;e=c.params.join(" ").split(","),$.each(e,function(c,e){e=e.trim(),d=a.panels.getByName(e),d||(d=new b.model.Channel({name:e}),b.app.panels.add(d)),b.gateway.join(e)}),d&&d.view.show()},this.queryCommand=function(c){var d,e;d=c.params[0],e=a.panels.getByName(d),e||(e=new b.model.Channel({name:d}),b.app.panels.add(e)),e&&e.view.show()},this.msgCommand=function(c){var d=c.params[0],e=a.panels.getByName(d)||a.panels.server;c.params.shift(),e.addMsg(b.gateway.get("nick"),c.params.join(" ")),b.gateway.privmsg(d,c.params.join(" "))},this.actionCommand=function(a){if(b.app.panels.active===b.app.panels.server)return;var c=b.app.panels.active;c.addMsg("","* "+b.gateway.get("nick")+" "+a.params.join(" "),"action"),b.gateway.action(c.get("name"),a.params.join(" "))},this.partCommand=function(a){a.params.length===0?b.gateway.part(b.app.panels.active.get("name")):_.each(a.params,function(a){b.gateway.part(a)})},this.topicCommand=function(c){var d;if(c.params.length===0)return;a.isChannelName(c.params[0])?(d=c.params[0],c.params.shift()):d=b.app.panels.active.get("name"),b.gateway.topic(d,c.params.join(" "))},this.noticeCommand=function(a){var c;if(a.params.length<=1)return;c=a.params[0],a.params.shift(),b.gateway.notice(c,a.params.join(" "))},this.themeCommand=function(a){var b=a.params[0]||!1,c=$("#panels > .panel_container");c.removeClass(function(a,b){return(b.match(/\btheme_\S+/g)||[]).join(" ")}),b&&c.addClass("theme_"+b)},this.isChannelName=function(a){var c=b.gateway.get("channel_prefix");return!a||!a.length?!1:c.indexOf(a[0])>-1}}),b.model.Gateway=Backbone.Model.extend(new function(){var a=this;this.defaults={name:"Server",address:"",nick:"",channel_prefix:"#",user_prefixes:["~","&","@","+"],kiwi_server:"http://localhost:7778/kiwi"},this.initialize=function(){a=this,this.socket=this.get("socket"),this.session_id="",network=this},this.connect=function(b,c,d,e,f){this.socket=io.connect(this.get("kiwi_server"),{"try multiple transports":!0,"connect timeout":3e3,"max reconnection attempts":7,"reconnection delay":2e3}),this.socket.on("connect_failed",function(a){console.debug("Unable to connect Socket.IO",a),console.log("kiwi.gateway.socket.on('connect_failed')"),this.socket.disconnect(),this.emit("connect_fail",{reason:a})}),this.socket.on("error",function(a){this.emit("connect_fail",{reason:a}),console.log("kiwi.gateway.socket.on('error')",{reason:a})}),this.socket.on("connecting",function(b){console.log("kiwi.gateway.socket.on('connecting')"),this.emit("connecting"),a.trigger("connecting")}),this.socket.on("connect",function(){this.emit("irc connect",a.get("nick"),b,c,d,e,f),a.trigger("connect",{})}),this.socket.on("too_many_connections",function(){this.emit("connect_fail",{reason:"too_many_connections"})}),this.socket.on("message",this.parse),this.socket.on("disconnect",function(){a.trigger("disconnect",{}),console.log("kiwi.gateway.socket.on('disconnect')")}),this.socket.on("close",function(){console.log("kiwi.gateway.socket.on('close')")}),this.socket.on("reconnecting",function(b,c){console.log("kiwi.gateway.socket.on('reconnecting')"),a.trigger("reconnecting",{delay:b,attempts:c})}),this.socket.on("reconnect_failed",function(){console.log("kiwi.gateway.socket.on('reconnect_failed')")})},this.parse=function(b){if(b.event!==undefined){a.trigger("on"+b.event,b);switch(b.event){case"options":$.each(b.options,function(b,c){switch(b){case"CHANTYPES":a.set("channel_prefix",c.charAt(0));break;case"NETWORK":a.set("name",c);break;case"PREFIX":a.set("user_prefixes",c)}});break;case"connect":a.set("nick",b.nick);break;case"nick":b.nick===a.get("nick")&&a.set("nick",b.newnick);break;case"kiwi":this.emit("kiwi."+b.namespace,b.data)}}},this.sendData=function(a,b){this.socket.emit("message",{sid:this.session_id,data:JSON.stringify(a)},b)},this.privmsg=function(a,b,c){var d={method:"privmsg",args:{target:a,msg:b}};this.sendData(d,c)},this.notice=function(a,b,c){var d={method:"notice",args:{target:a,msg:b}};this.sendData(d,c)},this.ctcp=function(a,b,c,d,e){var f={method:"ctcp",args:{request:a,type:b,target:c,params:d}};this.sendData(f,e)},this.action=function(a,b,c){this.ctcp(!0,"ACTION",a,b,c)},this.join=function(a,b,c){var d={method:"join",args:{channel:a,key:b}};this.sendData(d,c)},this.part=function(a,b){var c={method:"part",args:{channel:a}};this.sendData(c,b)},this.topic=function(a,b,c){var d={method:"topic",args:{channel:a,topic:b}};this.sendData(d,c)},this.kick=function(a,b,c,d){var e={method:"kick",args:{channel:a,nick:b,reason:c}};this.sendData(e,d)},this.quit=function(a,b){a=a||"";var c={method:"quit",args:{message:a}};this.sendData(c,b)},this.raw=function(a,b){a={method:"raw",args:{data:a}},this.sendData(a,b)},this.changeNick=function(a,b){var c={method:"nick",args:{nick:a}};this.sendData(c,b)},this.kiwi=function(a,b,c){b={method:"kiwi",args:{target:a,data:b}},this.sendData(b,c)}}),b.model.Member=Backbone.Model.extend({sortModes:function(a){return a.sort(function(a,c){var d,e,f,g=b.gateway.get("user_prefixes");for(f=0;f<g.length;f++)g[f].mode===a&&(d=f);for(f=0;f<g.length;f++)g[f].mode===c&&(e=f);return d<e?-1:d>e?1:0})},initialize:function(a){var b,c,d;b=this.stripPrefix(this.get("nick")),c=this.get("modes"),c=c||[],this.sortModes(c),this.set({nick:b,modes:c,prefix:this.getPrefix(c)},{silent:!0})},addMode:function(a){var b=a.split(""),c,d;c=this.get("modes"),$.each(b,function(a,b){c.push(b)}),c=this.sortModes(c),this.set({prefix:this.getPrefix(c),modes:c})},removeMode:function(a){var b=a.split(""),c,d;c=this.get("modes"),c=_.reject(c,function(a){return _.indexOf(b,a)!==-1}),this.set({prefix:this.getPrefix(c),modes:c})},getPrefix:function(a){var c="",d=b.gateway.get("user_prefixes");return typeof a[0]!="undefined"&&(c=_.detect(d,function(b){return b.mode===a[0]}),c=c?c.symbol:""),c},stripPrefix:function(a){var c=a,d,e,f,g=b.gateway.get("user_prefixes");d=0;for(e=0;e<a.length;e++)for(f=0;f<g.length;f++)if(a.charAt(e)===g[f].symbol){d++;break}return c.substr(d)},displayNick:function(a){var b=this.get("nick");return a&&this.get("ident")&&(b+=" ["+this.get("ident")+"@"+this.get("hostname")+"]"),b}}),b.model.MemberList=Backbone.Collection.extend({model:b.model.Member,comparator:function(a,c){var d,e,f,g,h,i,j,k=b.gateway.get("user_prefixes");e=a.get("modes"),f=c.get("modes");if(e.length>0){if(f.length===0)return-1;g=h=-1;for(d=0;d<k.length;d++)k[d].mode===e[0]&&(g=d);for(d=0;d<k.length;d++)k[d].mode===f[0]&&(h=d);if(g<h)return-1;if(g>h)return 1}else if(f.length>0)return 1;return i=a.get("nick").toLocaleUpperCase(),j=c.get("nick").toLocaleUpperCase(),i<j?-1:i>j?1:(console.log("Something's gone wrong somewhere - two users have the same nick!"),0)},initialize:function(a){this.view=new b.view.MemberList({model:this})},getByNick:function(a){if(typeof a!="string")return;return this.find(function(b){return a.toLowerCase()===b.get("nick").toLowerCase()})}}),b.model.Panel=Backbone.Model.extend({initialize:function(a){var c=this.get("name")||"";this.view=new b.view.Panel({model:this,name:c}),this.set({scrollback:[],name:c},{silent:!0})},addMsg:function(a,b,c,d){var e,f,g;d=d||{};if(!d||typeof d.time=="undefined")g=new Date,d.time=g.getHours().toString().lpad(2,"0")+":"+g.getMinutes().toString().lpad(2,"0")+":"+g.getSeconds().toString().lpad(2,"0");if(!d||typeof d.style=="undefined")d.style="";e={msg:b,time:d.time,nick:a,chan:this.get("name"),type:c,style:d.style};if(!e)return;typeof e.type!="string"&&(e.type=""),typeof e.msg!="string"&&(e.msg=""),f=this.get("scrollback"),f.push(e),f.length>250&&f.splice(250),this.set({scrollback:f},{silent:!0}),this.trigger("msg",e)},close:function(){this.view.remove(),delete this.view;var a=this.get("members");a&&(a.reset([]),this.unset("members")),this.destroy(),this.cid===b.app.panels.active.cid&&b.app.panels.server.view.show()},isChannel:function(){var a=b.gateway.get("channel_prefix"),c=this.get("name");return!this.isMisc||!c?!1:a.indexOf(c[0])>-1},isMisc:function(){return this.misc?!0:!1}}),b.model.PanelList=Backbone.Collection.extend({model:b.model.Panel,active:null,comparator:function(a){return a.get("name")},initialize:function(){this.view=new b.view.Tabs({el:$("#tabs")[0],model:this}),this.add(new b.model.Server({name:b.gateway.get("name")})),this.server=this.getByName(b.gateway.get("name")),this.bind("active",function(a){this.active=a},this)},getByName:function(a){if(typeof a!="string")return;return this.find(function(b){return a.toLowerCase()===b.get("name").toLowerCase()})}}),b.model.Channel=b.model.Panel.extend({initialize:function(a){var c=this.get("name")||"",d;this.view=new b.view.Channel({model:this,name:c}),this.set({members:new b.model.MemberList,name:c,scrollback:[],topic:""},{silent:!0}),d=this.get("members"),d.bind("add",function(a){this.addMsg(" ","--> "+a.displayNick(!0)+" has joined","action join")},this),d.bind("remove",function(a,b,c){var d=c.message?"("+c.message+")":"";c.type==="quit"?this.addMsg(" ","<-- "+a.displayNick(!0)+" has quit "+d,"action quit"):c.type==="kick"?this.addMsg(" ","<-- "+a.displayNick(!0)+" was kicked by "+c.by+" "+d,"action kick"):this.addMsg(" ","<-- "+a.displayNick(!0)+" has left "+d,"action part")},this)}}),b.model.Server=b.model.Panel.extend({server_login:null,initialize:function(a){var c="Server";this.view=new b.view.Panel({model:this,name:c}),this.set({scrollback:[],name:c},{silent:!0}),this.server_login=new b.view.ServerSelect,this.view.$el.append(this.server_login.$el),this.server_login.show()}}),typeof String.prototype.trim=="undefined"&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),typeof String.prototype.lpad=="undefined"&&(String.prototype.lpad=function(a,b){var c="",d;for(d=0;d<a;d++)c+=b;return(c+this).slice(-a)});var h=[{name:"images",onaddmsg:function(a,b){return a.msg?(a.msg=a.msg.replace(/^((https?\:\/\/|ftp\:\/\/)|(www\.))(\S+)(\w{2,4})(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?(\.jpg|\.jpeg|\.gif|\.bmp|\.png)$/gi,function(b){a.event_bubbles=!1;var c='<img class="link_img_a" src="'+b+'" height="100%" width="100%" />';return'<a class="link_ext link_img" target="_blank" rel="nofollow" href="'+b+'" style="height:50px;width:50px;display:block">'+c+'<div class="tt box"></div></a>'}),a):a}},{name:"html_safe",onaddmsg:function(a,b){return a.msg=$("<div/>").text(a.msg).html(),a.nick=$("<div/>").text(a.nick).html(),a}},{name:"activity",onaddmsg:function(a,b){return a}},{name:"highlight",onaddmsg:function(a,b){return a}},{name:"linkify_plain",onaddmsg:function(a,b){return a.msg?(a.msg=a.msg.replace(/((https?\:\/\/|ftp\:\/\/)|(www\.))(\S+)(\w{2,4})(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/gi,function(a){var b;return a.match(/(\.jpg|\.jpeg|\.gif|\.bmp|\.png)$/)?a:(b=a,a.match("^https?://")?b=a:a="http://"+a,'<a class="link_ext" target="_blank" rel="nofollow" href="'+a+'">'+b+"</a>")}),a):a}},{name:"lftobr",onaddmsg:function(a,b){return a.msg?(a.msg=a.msg.replace(/\n/gi,function(a){return"<br/>"}),a):a}},{name:"nick_colour",onaddmsg:function(a,b){if(!a.msg)return a;var c=this.randColour();return a.nick='<span style="color:'+c+';">'+a.nick+"</span>",a},randColour:function(){var a=this.rand(-250,0),b=this.rand(30,100),c=this.rand(20,70);return"hsl("+a+","+b+"%,"+c+"%)"},rand:function(a,b){return parseInt(Math.random()*(b-a+1),10)+a}},{name:"kiwitest",oninit:function(a,b){console.log("registering namespace"),$(gateway).bind("kiwi.lol.browser",function(a,b){console.log("YAY kiwitest"),console.log(b)})}}];b.plugs={},b.plugs.loaded={},b.plugs.loadPlugin=function(a){var c;return typeof a.name!="string"?!1:(c=b.plugs.run("plugin_load",{plugin:a}),typeof c=="object"&&(b.plugs.loaded[c.plugin.name]=c.plugin,b.plugs.loaded[c.plugin.name].local_data=new b.dataStore("kiwi_plugin_"+c.plugin.name)),b.plugs.run("init",{},{run_only:c.plugin.name}),!0)},b.plugs.unloadPlugin=function(a){if(typeof b.plugs.loaded[a]!="object")return;b.plugs.run("unload",{},{run_only:a}),delete b.plugs.loaded[a]},b.plugs.run=function(a,c,d){var e=c,f,g;c=typeof c=="undefined"?{}:c,d=typeof d=="undefined"?{}:d;for(g in b.plugs.loaded){if(typeof d.run_only=="string"&&d.run_only!==g)continue;if(typeof b.plugs.loaded[g]["on"+a]=="function")try{f=b.plugs.loaded[g]["on"+a](e,d);if(f===null)return null;e=f;if(typeof e.event_bubbles=="boolean"&&e.event_bubbles===!1)return delete e.event_bubbles,e}catch(h){}}return e},b.dataStore=function(a){var b=a;this.get=function(b){return $.jStorage.get(a+"_"+b)},this.set=function(b,c){return $.jStorage.set(a+"_"+b,c)}},b.data=new b.dataStore("kiwi"),function(a){function i(){if("localStorage"in window)try{window.localStorage&&(c=window.localStorage,h="localStorage")}catch(a){}else if("globalStorage"in window)try{window.globalStorage&&(c=window.globalStorage[window.location.hostname],h="globalStorage")}catch(b){}else{d=document.createElement("link");if(!d.addBehavior){d=null;return}d.style.behavior="url(#default#userData)",document.getElementsByTagName("head")[0].appendChild(d),d.load("jStorage");var e="{}";try{e=d.getAttribute("jStorage")}catch(f){}c.jStorage=e,h="userDataBehavior"}j()}function j(){if(c.jStorage)try{b=g(String(c.jStorage))}catch(a){c.jStorage="{}"}else c.jStorage="{}";e=c.jStorage?String(c.jStorage).length:0}function k(){try{c.jStorage=f(b),d&&(d.setAttribute("jStorage",c.jStorage),d.save("jStorage")),e=c.jStorage?String(c.jStorage).length:0}catch(a){}}function l(a){if(!a||typeof a!="string"&&typeof a!="number")throw new TypeError("Key name must be string or numeric");return!0}if(!a||!(a.toJSON||Object.toJSON||window.JSON))throw new Error("jQuery, MooTools or Prototype needs to be loaded before jStorage!");var b={},c={jStorage:"{}"},d=null,e=0,f=a.toJSON||Object.toJSON||window.JSON&&(JSON.encode||JSON.stringify),g=a.evalJSON||window.JSON&&(JSON.decode||JSON.parse)||function(a){return String(a).evalJSON()},h=!1;_XMLService={isXML:function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1},encode:function(a){if(!this.isXML(a))return!1;try{return(new XMLSerializer).serializeToString(a)}catch(b){try{return a.xml}catch(c){}}return!1},decode:function(a){var b="DOMParser"in window&&(new DOMParser).parseFromString||window.ActiveXObject&&function(a){var b=new ActiveXObject("Microsoft.XMLDOM");return b.async="false",b.loadXML(a),b},c;return b?(c=b.call("DOMParser"in window&&new DOMParser||window,a,"text/xml"),this.isXML(c)?c:!1):!1}},a.jStorage={version:"0.1.5.1",set:function(a,c){return l(a),_XMLService.isXML(c)&&(c={_is_xml:!0,xml:_XMLService.encode(c)}),b[a]=c,k(),c},get:function(a,c){return l(a),a in b?b[a]&&typeof b[a]=="object"&&b[a]._is_xml&&b[a]._is_xml?_XMLService.decode(b[a].xml):b[a]:typeof c=="undefined"?null:c},deleteKey:function(a){return l(a),a in b?(delete b[a],k(),!0):!1},flush:function(){return b={},k(),!0},storageObj:function(){function a(){}return a.prototype=b,new a},index:function(){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c);return a},storageSize:function(){return e},currentBackend:function(){return h},storageAvailable:function(){return!!h},reInit:function(){var a,b;if(d&&d.addBehavior){a=document.createElement("link"),d.parentNode.replaceChild(a,d),d=a,d.style.behavior="url(#default#userData)",document.getElementsByTagName("head")[0].appendChild(d),d.load("jStorage"),b="{}";try{b=d.getAttribute("jStorage")}catch(e){}c.jStorage=b,h="userDataBehavior"}j()}},i()}(window.jQuery||window.$),b.view.MemberList=Backbone.View.extend({tagName:"ul",events:{"click .nick":"nickClick"},initialize:function(a){this.model.bind("all",this.render,this),$(this.el).appendTo("#memberlists")},render:function(){var a=$(this.el);a.empty(),this.model.forEach(function(b){$('<li><a class="nick"><span class="prefix">'+b.get("prefix")+"</span>"+b.get("nick")+"</a></li>").appendTo(a).data("member",b)})},nickClick:function(a){var c=$(a.currentTarget).parent("li"),d=c.data("member"),e=new b.view.UserBox;e.member=d,$(".userbox",this.$el).remove(),c.append(e.$el)},show:function(){$("#memberlists").children().removeClass("active"),$(this.el).addClass("active")}}),b.view.UserBox=Backbone.View.extend({member:{},events:{"click .query":"queryClick","click .info":"infoClick"},initialize:function(){this.$el=$($("#tmpl_userbox").html())},queryClick:function(a){var c=new b.model.Channel({name:this.member.get("nick")});b.app.panels.add(c),c.view.show()},infoClick:function(a){b.gateway.raw("WHOIS "+this.member.get("nick"))}}),b.view.ServerSelect=Backbone.View.extend({events:{"submit form":"submitLogin","click .show_more":"showMore"},initialize:function(){this.$el=$($("#tmpl_server_select").html()),b.gateway.bind("onconnect",this.networkConnected,this),b.gateway.bind("connecting",this.networkConnecting,this)},submitLogin:function(a){var b={nick:$(".nick",this.$el).val(),server:$(".server",this.$el).val(),port:$(".port",this.$el).val(),ssl:$(".ssl",this.$el).prop("checked"),password:$(".password",this.$el).val(),channel:$(".channel",this.$el).val()};return this.trigger("server_connect",b),!1},showMore:function(a){$(".more",this.$el).slideDown("fast")},populateFields:function(a){var b,c,d;a=a||{},b=a.nick||"",c=a.server||"",port=a.port||6667,ssl=a.ssl||0,password=a.password||"",d=a.channel||"",$(".nick",this.$el).val(b),$(".server",this.$el).val(c),$(".port",this.$el).val(port),$(".ssl",this.$el).prop("checked",ssl),$(".password",this.$el).val(password),$(".channel",this.$el).val(d)},hide:function(){this.$el.slideUp()},show:function(){this.$el.show(),$(".nick",this.$el).focus()},setStatus:function(a,b){$(".status",this.$el).text(a).attr("class","status").addClass(b).show()},clearStatus:function(){$(".status",this.$el).hide()},networkConnected:function(a){this.setStatus("Connected :)","ok"),$("form",this.$el).hide()},networkConnecting:function(a){this.setStatus("Connecting..","ok")},showError:function(a){this.setStatus("Error connecting","error"),$("form",this.$el).show()}}),b.view.Panel=Backbone.View.extend({tagName:"div",className:"messages",events:{"click .chan":"chanClick"},$container:null,initialize:function(a){this.initializePanel(a)},initializePanel:function(a){this.$el.css("display","none"),a.container?this.$container=$(a.container):this.$container=$("#panels .container1"),this.$el.appendTo(this.$container),this.model.bind("msg",this.newMsg,this),this.msg_count=0,this.model.set({view:this},{silent:!0})},render:function(){this.$el.empty(),this.model.get("backscroll").forEach(this.newMsg)},newMsg:function(a){var c,d,e=this.$el,h;a.msg=$("<div />").text(a.msg).html(),c=new RegExp("\\B(["+b.gateway.get("channel_prefix")+"][^ ,.\\007]+)","g"),a.msg=a.msg.replace(c,function(a){return'<a class="chan">'+a+"</a>"}),a.msg=a.msg.replace(/((https?\:\/\/|ftp\:\/\/)|(www\.))(\S+)(\w{2,4})(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]*))?/gi,function(a){var b;return a.match(/^www\./)&&(a="http://"+a),b=a,b.length>100&&(b=b.substr(0,100)+"..."),'<a class="link_ext" target="_blank" rel="nofollow" href="'+a+'">'+b+"</a>"}),a.msg=g(a.msg),h=function(a){var b=0,c;return _.map(a.split(""),function(a){b+=a.charCodeAt(0)}),c=f(b%255,70,35),c=c[2]|c[1]<<8|c[0]<<16,"#"+c.toString(16)}(a.nick),a.nick_style="color:"+h+";",d='<div class="msg <%= type %>"><div class="time"><%- time %></div><div class="nick" style="<%= nick_style %>"><%- nick %></div><div class="text" style="<%= style %>"><%= msg %> </div></div>',e.append(_.template(d,a)),this.scrollToBottom(),this.msg_count++,this.msg_count>250&&($(".msg:first",this.$el).remove(),this.msg_count--)},chanClick:function(a){b.gateway.join($(a.srcElement).text())},show:function(){var a=this.$el;this.$container.children().css("display","none"),a.css("display","block");var c=this.model.get("members");c?(c.view.show(),this.$container.parent().css("right","200px")):($("#memberlists").children().removeClass("active"),this.$container.parent().css("right","0")),this.scrollToBottom(),this.trigger("active",this.model),b.app.panels.trigger("active",this.model)},scrollToBottom:function(){this.$container[0].scrollTop=this.$container[0].scrollHeight}}),b.view.Misc=b.view.Panel.extend({className:"misc"}),b.view.Channel=b.view.Panel.extend({initialize:function(a){this.initializePanel(a),this.model.bind("change:topic",this.topic,this)},topic:function(a){if(typeof a!="string"||!a)a=this.model.get("topic");this.model.addMsg("","=== Topic for "+this.model.get("name")+" is: "+a,"topic"),b.app.panels.active===this&&b.app.topicbar.setCurrentTopic(this.model.get("topic"))}}),b.view.Tabs=Backbone.View.extend({tabs_misc:null,tabs_msg:null,events:{"click li":"tabClick","click li img":"partClick"},initialize:function(){this.model.on("add",this.panelAdded,this),this.model.on("remove",this.panelRemoved,this),this.model.on("reset",this.render,this),this.model.on("active",this.panelActive,this),this.tabs_misc=$("ul.misc",this.$el),this.tabs_msg=$("ul.channels",this.$el),window.t=this,b.gateway.on("change:name",function(a,b){$("span",this.model.server.tab).text(b)},this)},render:function(){var a=this;this.tabs_msg.empty(),this.model.server.tab.data("panel_id",this.model.server.cid).appendTo(this.tabs_msg),this.model.forEach(function(b){if(b==a.model.server)return;b.tab.data("panel_id",b.cid).appendTo(b.isMisc()?this.tabs_misc:this.tabs_msg)}),b.app.view.doLayout()},panelAdded:function(a){a.tab=$("<li><span>"+(a.get("title")||a.get("name"))+"</span></li>"),a.tab.data("panel_id",a.cid).appendTo(a.isMisc()?this.tabs_misc:this.tabs_msg),b.app.view.doLayout()},panelRemoved:function(a){a.tab.remove(),delete a.tab,b.app.view.doLayout()},panelActive:function(a){$("img",this.$el).remove(),this.tabs_misc.children().removeClass("active"),this.tabs_msg.children().removeClass("active"),a.tab.addClass("active"),a.tab.append('<img src="img/redcross.png" />')},tabClick:function(a){var b=$(a.currentTarget),c=this.model.getByCid(b.data("panel_id"));if(!c)return;c.view.show()},partClick:function(a){var c=$(a.currentTarget).parent(),d=this.model.getByCid(c.data("panel_id"));d.isChannel()?b.gateway.part(d.get("name")):d.close()},next:function(){var a=b.app.panels.active.tab.next();a.length||(a=$("li:first",this.tabs_msgs)),a.click()},prev:function(){var a=b.app.panels.active.tab.prev();a.length||(a=$("li:last",this.tabs_msgs)),a.click()}}),b.view.TopicBar=Backbone.View.extend({events:{"keydown input":"process"},initialize:function(){b.app.panels.bind("active",function(a){this.setCurrentTopic(a.get("topic"))},this)},process:function(a){var c=$(a.currentTarget),d=c.val();if(a.keyCode!==13)return;b.app.panels.active.isChannel()&&b.gateway.topic(b.app.panels.active.get("name"),d)},setCurrentTopic:function(a){a=a||"",a=$("<div>").html(g(a)),$("input",this.$el).val(a.text())}}),b.view.ControlBox=Backbone.View.extend({buffer:[],buffer_pos:0,tabcomplete:{active:!1,data:[],prefix:""},events:{"keydown input":"process"},initialize:function(){var a=this;b.gateway.bind("change:nick",function(){$(".nick",a.$el).text(this.get("nick"))})},process:function(a){var c=this,d=$(a.currentTarget),e=d.val(),f;navigator.appVersion.indexOf("Mac")!==-1?f=a.ctrlKey:f=a.altKey,this.tabcomplete.active&&a.keyCode!==9&&(this.tabcomplete.active=!1,this.tabcomplete.data=[],this.tabcomplete.prefix="");switch(!0){case a.keyCode===13:e=e.trim(),e&&(this.processInput(d.val()),this.buffer.push(d.val()),this.buffer_pos=this.buffer.length),d.val("");break;case a.keyCode===38:this.buffer_pos>0&&(this.buffer_pos--,d.val(this.buffer[this.buffer_pos]));break;case a.keyCode===40:this.buffer_pos<this.buffer.length&&(this.buffer_pos++,d.val(this.buffer[this.buffer_pos]));break;case a.keyCode===37&&f:return b.app.panels.view.prev(),!1;case a.keyCode===39&&f:return b.app.panels.view.next(),!1;case a.keyCode===9:this.tabcomplete.active=!0;if(_.isEqual(this.tabcomplete.data,[])){var g=[];$.each(b.app.panels.active.get("members").models,function(a,b){if(!b)return;g.push(b.get("nick"))}),g=_.sortBy(g,function(a){return a}),this.tabcomplete.data=g}if(e[d[0].selectionStart-1]===" ")return!1;return function(){var a=e.substring(0,d[0].selectionStart).split(" "),b,f,g,h,i=a[a.length-1];this.tabcomplete.prefix===""&&(this.tabcomplete.prefix=i),this.tabcomplete.data=_.select(this.tabcomplete.data,function(a){return a.toLowerCase().indexOf(c.tabcomplete.prefix.toLowerCase())===0}),this.tabcomplete.data.length>0&&(f=d[0].selectionStart-i.length,b=e.substr(0,f),g=this.tabcomplete.data.shift(),this.tabcomplete.data.push(g),b+=g,b+=e.substr(d[0].selectionStart),d.val(b),d[0].setSelectionRange?d[0].setSelectionRange(f+g.length,f+g.length):d[0].createTextRange&&(h=d[0].createTextRange(),h.collapse(!0),h.moveEnd("character",f+g.length),h.moveStart("character",f+g.length),h.select()))}.apply(this),!1}},processInput:function(a){var c,d=a.split(" ");d[0][0]==="/"?(c=d[0].substr(1).toLowerCase(),d=d.splice(1)):(c="msg",d.unshift(b.app.panels.active.get("name"))),this.trigger("command",{command:c,params:d}),this.trigger("command_"+c,{command:c,params:d}),this._callbacks["command_"+c]||this.trigger("unknown_command",{command:c,params:d})}}),b.view.StatusMessage=Backbone.View.extend({tmr:null,initialize:function(){this.$el.hide()},text:function(a,c){c=c||{},c.type=c.type||"",this.$el.text(a).attr("class",c.type),this.$el.slideDown(b.app.view.doLayout),c.timeout&&this.doTimeout(c.timeout)},html:function(a,c){c=c||{},c.type=c.type||"",this.$el.html(text).attr("class",c.type),this.$el.slideDown(b.app.view.doLayout),c.timeout&&this.doTimeout(c.timeout)},hide:function(){this.$el.slideUp(b.app.view.doLayout)},doTimeout:function(a){this.tmr&&clearTimeout(this.tmr);var b=this;this.tmr=setTimeout(function(){b.hide()},a)}}),b.view.Application=Backbone.View.extend({initialize:function(){$(window).resize(this.doLayout),$("#toolbar").resize(this.doLayout),$("#controlbox").resize(this.doLayout),this.doLayout(),$(document).keydown(this.setKeyFocus)},setKeyFocus:function(a){if(a.ctrlKey||a.altKey)return;if(a.target.tagName.toLowerCase()==="input")return;$("#controlbox .inp").focus()},doLayout:function(){var a=$("#panels"),b=$("#memberlists"),c=$("#toolbar"),d=$("#controlbox"),e={top:c.outerHeight(!0),bottom:d.outerHeight(!0)};a.css(e),b.css(e)},barsHide:function(a){var b=this;a?($("#toolbar").slideUp(0),$("#controlbox").slideUp(0)):($("#toolbar").slideUp(),$("#controlbox").slideUp(function(){b.doLayout()}))},barsShow:function(a){var b=this;a?($("#toolbar").slideDown(0),$("#controlbox").slideDown(0),this.doLayout()):($("#toolbar").slideDown(),$("#controlbox").slideDown(function(){b.doLayout()}))}})})(window)
\ No newline at end of file
+(function(a){function c(a){var b,c;window.console?(c=window.console.log,window.console.log=function(){a&&c.apply(console,arguments)}):(b=window.opera?window.opera.postError:alert,window.console={},window.console.log=function(c){a&&b(c)})}function d(a){var b="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz",c="",d,e;for(d=0;d<a;d++)e=Math.floor(Math.random()*b.length),c+=b.substring(e,e+1);return c}function e(a){var b,c,d,e,f,g;return b=Math.floor(a/3600),e=a%3600,c=Math.floor(e/60),f=e%60,d=Math.ceil(f),g={h:b,m:c,s:d},g}function f(a,b,c){var d,e,f,g,h,i;b/=100,c/=100;if(b==0)g=h=i=c*255;else{function j(a,b,c){var d;return c<0?c+=1:c>1&&(c-=1),6*c<1?d=a+(b-a)*c*6:2*c<1?d=b:3*c<2?d=a+(b-a)*(2/3-c)*6:d=a,255*d}c<=.5?e=c*(b+1):e=c+b-c*b,d=c*2-e,f=a/360,g=j(d,e,f+1/3),h=j(d,e,f),i=j(d,e,f-1/3)}return[g,h,i]}function g(a){var b,c;if(!a||typeof a!="string")return"";if(a.indexOf(String.fromCharCode(2))!==-1){c="<b>";while(a.indexOf(String.fromCharCode(2))!==-1)a=a.replace(String.fromCharCode(2),c),c=c==="<b>"?"</b>":"<b>";c==="</b>"&&(a+="</b>")}if(a.indexOf(String.fromCharCode(31))!==-1){c="<u>";while(a.indexOf(String.fromCharCode(31))!==-1)a=a.replace(String.fromCharCode(31),c),c=c==="<u>"?"</u>":"<u>";c==="</u>"&&(a+="</u>")}return a=function(a){var b,c,d,e,f,g,h,i,j,k;b="",c=function(a){var b=/^\x03([0-9][0-5]?)(,([0-9][0-5]?))?/;return b.exec(a)},d=function(a){switch(parseInt(a,10)){case 0:return"#FFFFFF";case 1:return"#000000";case 2:return"#000080";case 3:return"#008000";case 4:return"#FF0000";case 5:return"#800040";case 6:return"#800080";case 7:return"#FF8040";case 8:return"#FFFF00";case 9:return"#80FF00";case 10:return"#008080";case 11:return"#00FFFF";case 12:return"#0000FF";case 13:return"#FF55FF";case 14:return"#808080";case 15:return"#C0C0C0";default:return null}};if(a.indexOf("\ 3")!==-1){e=a.indexOf("\ 3"),b=a.substr(0,e);while(e<a.length)f=c(a.substr(e,6)),f?(g=a.indexOf("\ 3",e+1),h=a.indexOf(String.fromCharCode(15),e+1),h!==-1&&(g===-1?g=h:g=g<h?g:h),g===-1&&(g=a.length),i=d(f[1]),j=d(f[3]),k=a.substring(e+1+f[1].length+(j!==null?f[2].length+1:0),g),b+='<span style="'+(i!==null?"color: "+i+"; ":"")+(j!==null?"background-color: "+j+";":"")+'">'+k+"</span>",e=g):(a[e]!=="\ 3"&&a[e]!==String.fromCharCode(15)&&(b+=a[e]),e++);return b}return a}(a),a}var b={};b.model={},b.view={},b.applets={},b.global={gateway:undefined,user:undefined,server:undefined,channels:undefined,start:function(a){return a=a||{},b.app=new b.model.Application(a),a.kiwi_server&&(b.app.kiwi_server=a.kiwi_server),b.app.start(),!0},utils:undefined},typeof a!="undefined"&&(a.kiwi=b.global),b.model.Application=Backbone.Model.extend(new function(){function d(b){a.panels.server.server_login.showError()}var a=this,c={};this.panels=null,this.view,this.message,this.kiwi_server=null,this.initialize=function(){a=this,this.detectKiwiServer()},this.start=function(){!!getQueryVariable("debug"),b.gateway=new b.model.Gateway,this.bindGatewayCommands(b.gateway),this.initializeClient(),this.view.barsHide(!0),this.panels.server.server_login.bind("server_connect",function(e){var f=this;c=e,f.networkConnecting(),$script(a.kiwi_server+"/socket.io/socket.io.js?ts="+(new Date).getTime(),function(){if(!window.io){d();return}b.gateway.set("kiwi_server",a.kiwi_server+"/kiwi"),b.gateway.set("nick",e.nick),b.gateway.connect(e.server,e.port,e.ssl,e.password,function(){})})})},this.detectKiwiServer=function(){if(window.location.protocol==="file")this.kiwi_server="http://localhost:7777";else{var a=window.location.protocol==="https"?"https":"http";this.kiwi_server=a+"://"+window.location.host+":"+(window.location.port||"80")}},this.initializeClient=function(){this.view=new b.view.Application({model:this,el:this.get("container")}),this.panels=new b.model.PanelList,this.controlbox=new b.view.ControlBox({el:$("#controlbox")[0]}),this.bindControllboxCommands(this.controlbox),this.topicbar=new b.view.TopicBar({el:$("#topic")[0]}),this.message=new b.view.StatusMessage({el:$("#status_message")[0]}),this.panels.server.view.show(),this.view.doLayout(),this.panels.server.server_login.populateFields({nick:getQueryVariable("nick")||"kiwi_"+Math.ceil(Math.random()*1e4).toString(),server:getQueryVariable("server")||"irc.kiwiirc.com",port:6667,ssl:!1,channel:window.location.hash||"#test"})},this.bindGatewayCommands=function(d){d.on("onmotd",function(b){a.panels.server.addMsg(b.server,b.msg,"motd")}),d.on("onconnect",function(d){a.view.barsShow(),c.channel&&b.gateway.join(c.channel)}),function(){var b=0;d.on("disconnect",function(c){a.message.text("You have been disconnected. Attempting to reconnect.."),b=1}),d.on("reconnecting",function(b){a.message.text("You have been disconnected. Attempting to reconnect again in "+b.delay/1e3+" seconds..")}),d.on("connect",function(c){if(b!==1)return;a.message.text("It's OK, you're connected again :)",{timeout:5e3}),b=0})}(),d.on("onjoin",function(c){var d,e,f;d=a.panels.getByName(c.channel),d||(d=new b.model.Channel({name:c.channel}),a.panels.add(d)),e=d.get("members");if(!e)return;f=new b.model.Member({nick:c.nick,ident:c.ident,hostname:c.hostname}),e.add(f)}),d.on("onpart",function(c){var d,e,f,g={};g.type="part",g.message=c.message||"",d=a.panels.getByName(c.channel);if(!d)return;if(c.nick===b.gateway.get("nick")){d.close();return}e=d.get("members");if(!e)return;f=e.getByNick(c.nick);if(!f)return;e.remove(f,g)}),d.on("onquit",function(b){var c,d,e={};e.type="quit",e.message=b.message||"",$.each(a.panels.models,function(a,d){if(!d.isChannel())return;c=d.get("members").getByNick(b.nick),c&&d.get("members").remove(c,e)})}),d.on("onkick",function(c){var d,e,f,g={};g.type="kick",g.by=c.nick,g.message=c.message||"",d=a.panels.getByName(c.channel);if(!d)return;e=d.get("members");if(!e)return;f=e.getByNick(c.kicked);if(!f)return;e.remove(f,g),c.kicked===b.gateway.get("nick")&&e.reset([])}),d.on("onmsg",function(c){var d,e=c.channel==b.gateway.get("nick");e?(d=a.panels.getByName(c.nick),d||(d=new b.model.Channel({name:c.nick}),a.panels.add(d))):(d=a.panels.getByName(c.channel),d||(d=a.panels.server)),d.addMsg(c.nick,c.msg)}),d.on("onnotice",function(b){var c;c=a.panels.getByName(b.target)||a.panels.getByName(b.nick),c||(c=a.panels.server),c.addMsg("["+(b.nick||"")+"]",b.msg)}),d.on("onaction",function(c){var d,e=c.channel==b.gateway.get("nick");e?(d=a.panels.getByName(c.nick),d||(d=new b.model.Channel({name:c.nick}),a.panels.add(d))):(d=a.panels.getByName(c.channel),d||(d=a.panels.server)),d.addMsg("","* "+c.nick+" "+c.msg,"action")}),d.on("ontopic",function(c){var d;d=a.panels.getByName(c.channel);if(!d)return;d.set("topic",c.topic),d.get("name")===b.app.panels.active.get("name")&&a.topicbar.setCurrentTopic(c.topic)}),d.on("ontopicsetby",function(b){var c,d;c=a.panels.getByName(b.channel);if(!c)return;d=(new Date(b.when*1e3)).toLocaleString(),c.addMsg("","Topic set by "+b.nick+" at "+d,"topic")}),d.on("onuserlist",function(c){var d;d=a.panels.getByName(c.channel);if(!d)return;d.temp_userlist=d.temp_userlist||[],_.each(c.users,function(a){var c=new b.model.Member({nick:a.nick,modes:a.modes});d.temp_userlist.push(c)})}),d.on("onuserlist_end",function(b){var c;c=a.panels.getByName(b.channel);if(!c)return;c.get("members").reset(c.temp_userlist||[]),delete c.temp_userlist}),d.on("onmode",function(b){var c,d,e;if(!b.channel)return;c=a.panels.getByName(b.channel);if(!c)return;d=c.get("members");if(!d)return;e=d.getByNick(b.effected_nick);if(!e)return;b.mode[0]==="+"?e.addMode(b.mode.substr(1)):b.mode[0]==="-"&&e.removeMode(b.mode.substr(1))}),d.on("onnick",function(b){var c;$.each(a.panels.models,function(a,d){if(!d.isChannel())return;c=d.get("members").getByNick(b.nick),c&&(c.set("nick",b.newnick),d.addMsg("","== "+b.nick+" is now known as "+b.newnick,"action nick"))})}),d.on("onwhois",function(a){var c,d="",f;if(a.end)return;typeof a.idle!="undefined"&&(d=e(parseInt(a.idle,10)),d=d.h.toString().lpad(2,"0")+":"+d.m.toString().lpad(2,"0")+":"+d.s.toString().lpad(2,"0")),f=b.app.panels.active,a.msg?f.addMsg(a.nick,a.msg,"whois"):a.logon?(c=new Date,c.setTime(a.logon*1e3),c=c.toLocaleString(),f.addMsg(a.nick,"idle for "+d+", signed on "+c,"whois")):f.addMsg(a.nick,"idle for "+d,"whois")}),d.on("onirc_error",function(a){var c,d;a.channel!==undefined&&!(c=b.app.panels.getByName(a.channel))&&(c=b.app.panels.server);switch(a.error){case"banned_from_channel":c.addMsg(" ","=== You are banned from "+a.channel+". "+a.reason,"status"),b.app.message.text("You are banned from "+a.channel+". "+a.reason);break;case"bad_channel_key":c.addMsg(" ","=== Bad channel key for "+a.channel,"status"),b.app.message.text("Bad channel key or password for "+a.channel);break;case"invite_only_channel":c.addMsg(" ","=== "+a.channel+" is invite only.","status"),b.app.message.text(a.channel+" is invite only");break;case"channel_is_full":c.addMsg(" ","=== "+a.channel+" is full.","status"),b.app.message.text(a.channel+" is full");break;case"chanop_privs_needed":c.addMsg(" ","=== "+a.reason,"status"),b.app.message.text(a.reason+" ("+a.channel+")");break;case"no_such_nick":d=b.app.panels.getByName(a.nick),d?d.addMsg(" ","=== "+a.nick+": "+a.reason,"status"):b.app.panels.server.addMsg(" ","=== "+a.nick+": "+a.reason,"status");break;case"nickname_in_use":b.app.panels.server.addMsg(" ","=== The nickname "+a.nick+" is already in use. Please select a new nickname","status"),b.app.panels.server!==b.app.panels.active&&b.app.message.text('The nickname "'+a.nick+'" is already in use. Please select a new nickname');break;default:}})},this.bindControllboxCommands=function(a){a.on("unknown_command",this.unknownCommand),a.on("command",this.allCommands),a.on("command_msg",this.msgCommand),a.on("command_action",this.actionCommand),a.on("command_me",this.actionCommand),a.on("command_join",this.joinCommand),a.on("command_j",this.joinCommand),a.on("command_part",this.partCommand),a.on("command_p",this.partCommand),a.on("command_nick",function(a){b.gateway.changeNick(a.params[0])}),a.on("command_query",this.queryCommand),a.on("command_q",this.queryCommand),a.on("command_topic",this.topicCommand),a.on("command_notice",this.noticeCommand),a.on("command_css",function(a){var b="?reload="+(new Date).getTime();$('link[rel="stylesheet"]').each(function(){this.href=this.href.replace(/\?.*|$/,b)})}),a.on("command_js",function(a){if(!a.params[0])return;$script(a.params[0]+"?"+(new Date).getTime())}),a.on("command_settings",this.settingsCommand)},this.unknownCommand=function(a){var c=a.command+" "+a.params.join(" ");console.log("RAW: "+c),b.gateway.raw(c)},this.allCommands=function(a){console.log("allCommands",a)},this.joinCommand=function(c){var d,e;e=c.params.join(" ").split(","),$.each(e,function(c,e){e=e.trim(),d=a.panels.getByName(e),d||(d=new b.model.Channel({name:e}),b.app.panels.add(d)),b.gateway.join(e)}),d&&d.view.show()},this.queryCommand=function(c){var d,e;d=c.params[0],e=a.panels.getByName(d),e||(e=new b.model.Channel({name:d}),b.app.panels.add(e)),e&&e.view.show()},this.msgCommand=function(c){var d=c.params[0],e=a.panels.getByName(d)||a.panels.server;c.params.shift(),e.addMsg(b.gateway.get("nick"),c.params.join(" ")),b.gateway.privmsg(d,c.params.join(" "))},this.actionCommand=function(a){if(b.app.panels.active===b.app.panels.server)return;var c=b.app.panels.active;c.addMsg("","* "+b.gateway.get("nick")+" "+a.params.join(" "),"action"),b.gateway.action(c.get("name"),a.params.join(" "))},this.partCommand=function(a){a.params.length===0?b.gateway.part(b.app.panels.active.get("name")):_.each(a.params,function(a){b.gateway.part(a)})},this.topicCommand=function(c){var d;if(c.params.length===0)return;a.isChannelName(c.params[0])?(d=c.params[0],c.params.shift()):d=b.app.panels.active.get("name"),b.gateway.topic(d,c.params.join(" "))},this.noticeCommand=function(a){var c;if(a.params.length<=1)return;c=a.params[0],a.params.shift(),b.gateway.notice(c,a.params.join(" "))},this.settingsCommand=function(a){var c=new b.model.Applet;c.load(new b.applets.Settings),b.app.panels.add(c),c.view.show()},this.isChannelName=function(a){var c=b.gateway.get("channel_prefix");return!a||!a.length?!1:c.indexOf(a[0])>-1}}),b.model.Gateway=Backbone.Model.extend(new function(){var a=this;this.defaults={name:"Server",address:"",nick:"",channel_prefix:"#",user_prefixes:["~","&","@","+"],kiwi_server:"http://localhost:7778/kiwi"},this.initialize=function(){a=this,this.socket=this.get("socket"),this.session_id="",network=this},this.connect=function(b,c,d,e,f){this.socket=io.connect(this.get("kiwi_server"),{"try multiple transports":!0,"connect timeout":3e3,"max reconnection attempts":7,"reconnection delay":2e3}),this.socket.on("connect_failed",function(a){console.debug("Unable to connect Socket.IO",a),console.log("kiwi.gateway.socket.on('connect_failed')"),this.socket.disconnect(),this.emit("connect_fail",{reason:a})}),this.socket.on("error",function(a){this.emit("connect_fail",{reason:a}),console.log("kiwi.gateway.socket.on('error')",{reason:a})}),this.socket.on("connecting",function(b){console.log("kiwi.gateway.socket.on('connecting')"),this.emit("connecting"),a.trigger("connecting")}),this.socket.on("connect",function(){this.emit("irc connect",a.get("nick"),b,c,d,e,f),a.trigger("connect",{})}),this.socket.on("too_many_connections",function(){this.emit("connect_fail",{reason:"too_many_connections"})}),this.socket.on("message",this.parse),this.socket.on("disconnect",function(){a.trigger("disconnect",{}),console.log("kiwi.gateway.socket.on('disconnect')")}),this.socket.on("close",function(){console.log("kiwi.gateway.socket.on('close')")}),this.socket.on("reconnecting",function(b,c){console.log("kiwi.gateway.socket.on('reconnecting')"),a.trigger("reconnecting",{delay:b,attempts:c})}),this.socket.on("reconnect_failed",function(){console.log("kiwi.gateway.socket.on('reconnect_failed')")})},this.parse=function(b){console.log("gateway event",b);if(b.event!==undefined){a.trigger("on"+b.event,b);switch(b.event){case"options":$.each(b.options,function(b,c){switch(b){case"CHANTYPES":a.set("channel_prefix",c.charAt(0));break;case"NETWORK":a.set("name",c);break;case"PREFIX":a.set("user_prefixes",c)}});break;case"connect":a.set("nick",b.nick);break;case"nick":b.nick===a.get("nick")&&a.set("nick",b.newnick);break;case"kiwi":this.emit("kiwi."+b.namespace,b.data)}}},this.sendData=function(a,b){this.socket.emit("message",{sid:this.session_id,data:JSON.stringify(a)},b)},this.privmsg=function(a,b,c){var d={method:"privmsg",args:{target:a,msg:b}};this.sendData(d,c)},this.notice=function(a,b,c){var d={method:"notice",args:{target:a,msg:b}};this.sendData(d,c)},this.ctcp=function(a,b,c,d,e){var f={method:"ctcp",args:{request:a,type:b,target:c,params:d}};this.sendData(f,e)},this.action=function(a,b,c){this.ctcp(!0,"ACTION",a,b,c)},this.join=function(a,b,c){var d={method:"join",args:{channel:a,key:b}};this.sendData(d,c)},this.part=function(a,b){var c={method:"part",args:{channel:a}};this.sendData(c,b)},this.topic=function(a,b,c){var d={method:"topic",args:{channel:a,topic:b}};this.sendData(d,c)},this.kick=function(a,b,c,d){var e={method:"kick",args:{channel:a,nick:b,reason:c}};this.sendData(e,d)},this.quit=function(a,b){a=a||"";var c={method:"quit",args:{message:a}};this.sendData(c,b)},this.raw=function(a,b){a={method:"raw",args:{data:a}},this.sendData(a,b)},this.changeNick=function(a,b){var c={method:"nick",args:{nick:a}};this.sendData(c,b)},this.kiwi=function(a,b,c){b={method:"kiwi",args:{target:a,data:b}},this.sendData(b,c)}}),b.model.Member=Backbone.Model.extend({sortModes:function(a){return a.sort(function(a,c){var d,e,f,g=b.gateway.get("user_prefixes");for(f=0;f<g.length;f++)g[f].mode===a&&(d=f);for(f=0;f<g.length;f++)g[f].mode===c&&(e=f);return d<e?-1:d>e?1:0})},initialize:function(a){var b,c,d;b=this.stripPrefix(this.get("nick")),c=this.get("modes"),c=c||[],this.sortModes(c),this.set({nick:b,modes:c,prefix:this.getPrefix(c)},{silent:!0})},addMode:function(a){var b=a.split(""),c,d;c=this.get("modes"),$.each(b,function(a,b){c.push(b)}),c=this.sortModes(c),this.set({prefix:this.getPrefix(c),modes:c})},removeMode:function(a){var b=a.split(""),c,d;c=this.get("modes"),c=_.reject(c,function(a){return _.indexOf(b,a)!==-1}),this.set({prefix:this.getPrefix(c),modes:c})},getPrefix:function(a){var c="",d=b.gateway.get("user_prefixes");return typeof a[0]!="undefined"&&(c=_.detect(d,function(b){return b.mode===a[0]}),c=c?c.symbol:""),c},stripPrefix:function(a){var c=a,d,e,f,g=b.gateway.get("user_prefixes");d=0;for(e=0;e<a.length;e++)for(f=0;f<g.length;f++)if(a.charAt(e)===g[f].symbol){d++;break}return c.substr(d)},displayNick:function(a){var b=this.get("nick");return a&&this.get("ident")&&(b+=" ["+this.get("ident")+"@"+this.get("hostname")+"]"),b}}),b.model.MemberList=Backbone.Collection.extend({model:b.model.Member,comparator:function(a,c){var d,e,f,g,h,i,j,k=b.gateway.get("user_prefixes");e=a.get("modes"),f=c.get("modes");if(e.length>0){if(f.length===0)return-1;g=h=-1;for(d=0;d<k.length;d++)k[d].mode===e[0]&&(g=d);for(d=0;d<k.length;d++)k[d].mode===f[0]&&(h=d);if(g<h)return-1;if(g>h)return 1}else if(f.length>0)return 1;return i=a.get("nick").toLocaleUpperCase(),j=c.get("nick").toLocaleUpperCase(),i<j?-1:i>j?1:(console.log("Something's gone wrong somewhere - two users have the same nick!"),0)},initialize:function(a){this.view=new b.view.MemberList({model:this})},getByNick:function(a){if(typeof a!="string")return;return this.find(function(b){return a.toLowerCase()===b.get("nick").toLowerCase()})}}),b.model.Panel=Backbone.Model.extend({initialize:function(a){var c=this.get("name")||"";this.view=new b.view.Panel({model:this,name:c}),this.set({scrollback:[],name:c},{silent:!0})},addMsg:function(a,b,c,d){var e,f,g;d=d||{};if(!d||typeof d.time=="undefined")g=new Date,d.time=g.getHours().toString().lpad(2,"0")+":"+g.getMinutes().toString().lpad(2,"0")+":"+g.getSeconds().toString().lpad(2,"0");if(!d||typeof d.style=="undefined")d.style="";e={msg:b,time:d.time,nick:a,chan:this.get("name"),type:c,style:d.style};if(!e)return;typeof e.type!="string"&&(e.type=""),typeof e.msg!="string"&&(e.msg=""),f=this.get("scrollback"),f.push(e),f.length>250&&f.splice(250),this.set({scrollback:f},{silent:!0}),this.trigger("msg",e)},close:function(){this.view.remove(),delete this.view;var a=this.get("members");a&&(a.reset([]),this.unset("members")),this.destroy(),this.cid===b.app.panels.active.cid&&b.app.panels.server.view.show()},isChannel:function(){var a=b.gateway.get("channel_prefix"),c=this.get("name");return this.isApplet()||!c?!1:a.indexOf(c[0])>-1},isApplet:function(){return this.applet?!0:!1}}),b.model.PanelList=Backbone.Collection.extend({model:b.model.Panel,active:null,comparator:function(a){return a.get("name")},initialize:function(){this.view=new b.view.Tabs({el:$("#tabs")[0],model:this}),this.add(new b.model.Server({name:b.gateway.get("name")})),this.server=this.getByName(b.gateway.get("name")),this.bind("active",function(a){this.active=a},this)},getByName:function(a){if(typeof a!="string")return;return this.find(function(b){return a.toLowerCase()===b.get("name").toLowerCase()})}}),b.model.Channel=b.model.Panel.extend({initialize:function(a){var c=this.get("name")||"",d;this.view=new b.view.Channel({model:this,name:c}),this.set({members:new b.model.MemberList,name:c,scrollback:[],topic:""},{silent:!0}),d=this.get("members"),d.bind("add",function(a){this.addMsg(" ","--> "+a.displayNick(!0)+" has joined","action join")},this),d.bind("remove",function(a,b,c){var d=c.message?"("+c.message+")":"";c.type==="quit"?this.addMsg(" ","<-- "+a.displayNick(!0)+" has quit "+d,"action quit"):c.type==="kick"?this.addMsg(" ","<-- "+a.displayNick(!0)+" was kicked by "+c.by+" "+d,"action kick"):this.addMsg(" ","<-- "+a.displayNick(!0)+" has left "+d,"action part")},this)}}),b.model.Server=b.model.Panel.extend({server_login:null,initialize:function(a){var c="Server";this.view=new b.view.Panel({model:this,name:c}),this.set({scrollback:[],name:c},{silent:!0}),this.server_login=new b.view.ServerSelect,this.view.$el.append(this.server_login.$el),this.server_login.show()}}),b.model.Applet=b.model.Panel.extend({applet:!0,initialize:function(a){var c="applet_"+(new Date).getTime().toString()+Math.ceil(Math.random()*100).toString();this.view=new b.view.Applet({model:this,name:c}),this.set({name:c},{silent:!0})},load:function(a,b){typeof a=="object"?(this.set("title",a.title||"Something.."),this.view.$el.html(""),this.view.$el.append(a.$el)):typeof a=="string"&&this.loadFromUrl(a,b)},loadFromUrl:function(a,c){var d=this;this.view.$el.html("Loading.."),$script(a,function(){if(!b.applets[c]){d.view.$el.html("Not found");return}d.load(new b.applets[c])})}}),b.applets.Settings=Backbone.View.extend({events:{"click .save":"saveSettings"},initialize:function(a){this.$el=$($("#tmpl_applet_settings").html()),this.title="Settings",window.s=this},saveSettings:function(){var a=$(".theme",this.$el).val(),b=$("#panels > .panel_container");b.removeClass(function(a,b){return(b.match(/\btheme_\S+/g)||[]).join(" ")}),a&&b.addClass("theme_"+a)}}),typeof String.prototype.trim=="undefined"&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),typeof String.prototype.lpad=="undefined"&&(String.prototype.lpad=function(a,b){var c="",d;for(d=0;d<a;d++)c+=b;return(c+this).slice(-a)});var h=[{name:"images",onaddmsg:function(a,b){return a.msg?(a.msg=a.msg.replace(/^((https?\:\/\/|ftp\:\/\/)|(www\.))(\S+)(\w{2,4})(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?(\.jpg|\.jpeg|\.gif|\.bmp|\.png)$/gi,function(b){a.event_bubbles=!1;var c='<img class="link_img_a" src="'+b+'" height="100%" width="100%" />';return'<a class="link_ext link_img" target="_blank" rel="nofollow" href="'+b+'" style="height:50px;width:50px;display:block">'+c+'<div class="tt box"></div></a>'}),a):a}},{name:"html_safe",onaddmsg:function(a,b){return a.msg=$("<div/>").text(a.msg).html(),a.nick=$("<div/>").text(a.nick).html(),a}},{name:"activity",onaddmsg:function(a,b){return a}},{name:"highlight",onaddmsg:function(a,b){return a}},{name:"linkify_plain",onaddmsg:function(a,b){return a.msg?(a.msg=a.msg.replace(/((https?\:\/\/|ftp\:\/\/)|(www\.))(\S+)(\w{2,4})(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/gi,function(a){var b;return a.match(/(\.jpg|\.jpeg|\.gif|\.bmp|\.png)$/)?a:(b=a,a.match("^https?://")?b=a:a="http://"+a,'<a class="link_ext" target="_blank" rel="nofollow" href="'+a+'">'+b+"</a>")}),a):a}},{name:"lftobr",onaddmsg:function(a,b){return a.msg?(a.msg=a.msg.replace(/\n/gi,function(a){return"<br/>"}),a):a}},{name:"nick_colour",onaddmsg:function(a,b){if(!a.msg)return a;var c=this.randColour();return a.nick='<span style="color:'+c+';">'+a.nick+"</span>",a},randColour:function(){var a=this.rand(-250,0),b=this.rand(30,100),c=this.rand(20,70);return"hsl("+a+","+b+"%,"+c+"%)"},rand:function(a,b){return parseInt(Math.random()*(b-a+1),10)+a}},{name:"kiwitest",oninit:function(a,b){console.log("registering namespace"),$(gateway).bind("kiwi.lol.browser",function(a,b){console.log("YAY kiwitest"),console.log(b)})}}];b.plugs={},b.plugs.loaded={},b.plugs.loadPlugin=function(a){var c;return typeof a.name!="string"?!1:(c=b.plugs.run("plugin_load",{plugin:a}),typeof c=="object"&&(b.plugs.loaded[c.plugin.name]=c.plugin,b.plugs.loaded[c.plugin.name].local_data=new b.dataStore("kiwi_plugin_"+c.plugin.name)),b.plugs.run("init",{},{run_only:c.plugin.name}),!0)},b.plugs.unloadPlugin=function(a){if(typeof b.plugs.loaded[a]!="object")return;b.plugs.run("unload",{},{run_only:a}),delete b.plugs.loaded[a]},b.plugs.run=function(a,c,d){var e=c,f,g;c=typeof c=="undefined"?{}:c,d=typeof d=="undefined"?{}:d;for(g in b.plugs.loaded){if(typeof d.run_only=="string"&&d.run_only!==g)continue;if(typeof b.plugs.loaded[g]["on"+a]=="function")try{f=b.plugs.loaded[g]["on"+a](e,d);if(f===null)return null;e=f;if(typeof e.event_bubbles=="boolean"&&e.event_bubbles===!1)return delete e.event_bubbles,e}catch(h){}}return e},b.dataStore=function(a){var b=a;this.get=function(b){return $.jStorage.get(a+"_"+b)},this.set=function(b,c){return $.jStorage.set(a+"_"+b,c)}},b.data=new b.dataStore("kiwi"),function(a){function i(){if("localStorage"in window)try{window.localStorage&&(c=window.localStorage,h="localStorage")}catch(a){}else if("globalStorage"in window)try{window.globalStorage&&(c=window.globalStorage[window.location.hostname],h="globalStorage")}catch(b){}else{d=document.createElement("link");if(!d.addBehavior){d=null;return}d.style.behavior="url(#default#userData)",document.getElementsByTagName("head")[0].appendChild(d),d.load("jStorage");var e="{}";try{e=d.getAttribute("jStorage")}catch(f){}c.jStorage=e,h="userDataBehavior"}j()}function j(){if(c.jStorage)try{b=g(String(c.jStorage))}catch(a){c.jStorage="{}"}else c.jStorage="{}";e=c.jStorage?String(c.jStorage).length:0}function k(){try{c.jStorage=f(b),d&&(d.setAttribute("jStorage",c.jStorage),d.save("jStorage")),e=c.jStorage?String(c.jStorage).length:0}catch(a){}}function l(a){if(!a||typeof a!="string"&&typeof a!="number")throw new TypeError("Key name must be string or numeric");return!0}if(!a||!(a.toJSON||Object.toJSON||window.JSON))throw new Error("jQuery, MooTools or Prototype needs to be loaded before jStorage!");var b={},c={jStorage:"{}"},d=null,e=0,f=a.toJSON||Object.toJSON||window.JSON&&(JSON.encode||JSON.stringify),g=a.evalJSON||window.JSON&&(JSON.decode||JSON.parse)||function(a){return String(a).evalJSON()},h=!1;_XMLService={isXML:function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1},encode:function(a){if(!this.isXML(a))return!1;try{return(new XMLSerializer).serializeToString(a)}catch(b){try{return a.xml}catch(c){}}return!1},decode:function(a){var b="DOMParser"in window&&(new DOMParser).parseFromString||window.ActiveXObject&&function(a){var b=new ActiveXObject("Microsoft.XMLDOM");return b.async="false",b.loadXML(a),b},c;return b?(c=b.call("DOMParser"in window&&new DOMParser||window,a,"text/xml"),this.isXML(c)?c:!1):!1}},a.jStorage={version:"0.1.5.1",set:function(a,c){return l(a),_XMLService.isXML(c)&&(c={_is_xml:!0,xml:_XMLService.encode(c)}),b[a]=c,k(),c},get:function(a,c){return l(a),a in b?b[a]&&typeof b[a]=="object"&&b[a]._is_xml&&b[a]._is_xml?_XMLService.decode(b[a].xml):b[a]:typeof c=="undefined"?null:c},deleteKey:function(a){return l(a),a in b?(delete b[a],k(),!0):!1},flush:function(){return b={},k(),!0},storageObj:function(){function a(){}return a.prototype=b,new a},index:function(){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c);return a},storageSize:function(){return e},currentBackend:function(){return h},storageAvailable:function(){return!!h},reInit:function(){var a,b;if(d&&d.addBehavior){a=document.createElement("link"),d.parentNode.replaceChild(a,d),d=a,d.style.behavior="url(#default#userData)",document.getElementsByTagName("head")[0].appendChild(d),d.load("jStorage"),b="{}";try{b=d.getAttribute("jStorage")}catch(e){}c.jStorage=b,h="userDataBehavior"}j()}},i()}(window.jQuery||window.$),b.view.MemberList=Backbone.View.extend({tagName:"ul",events:{"click .nick":"nickClick"},initialize:function(a){this.model.bind("all",this.render,this),$(this.el).appendTo("#memberlists")},render:function(){var a=$(this.el);a.empty(),this.model.forEach(function(b){$('<li><a class="nick"><span class="prefix">'+b.get("prefix")+"</span>"+b.get("nick")+"</a></li>").appendTo(a).data("member",b)})},nickClick:function(a){var c=$(a.currentTarget).parent("li"),d=c.data("member"),e=new b.view.UserBox;e.member=d,$(".userbox",this.$el).remove(),c.append(e.$el)},show:function(){$("#memberlists").children().removeClass("active"),$(this.el).addClass("active")}}),b.view.UserBox=Backbone.View.extend({member:{},events:{"click .query":"queryClick","click .info":"infoClick"},initialize:function(){this.$el=$($("#tmpl_userbox").html())},queryClick:function(a){var c=new b.model.Channel({name:this.member.get("nick")});b.app.panels.add(c),c.view.show()},infoClick:function(a){b.gateway.raw("WHOIS "+this.member.get("nick"))}}),b.view.ServerSelect=Backbone.View.extend({events:{"submit form":"submitLogin","click .show_more":"showMore"},initialize:function(){this.$el=$($("#tmpl_server_select").html()),b.gateway.bind("onconnect",this.networkConnected,this),b.gateway.bind("connecting",this.networkConnecting,this)},submitLogin:function(a){var b={nick:$(".nick",this.$el).val(),server:$(".server",this.$el).val(),port:$(".port",this.$el).val(),ssl:$(".ssl",this.$el).prop("checked"),password:$(".password",this.$el).val(),channel:$(".channel",this.$el).val()};return this.trigger("server_connect",b),!1},showMore:function(a){$(".more",this.$el).slideDown("fast")},populateFields:function(a){var b,c,d;a=a||{},b=a.nick||"",c=a.server||"",port=a.port||6667,ssl=a.ssl||0,password=a.password||"",d=a.channel||"",$(".nick",this.$el).val(b),$(".server",this.$el).val(c),$(".port",this.$el).val(port),$(".ssl",this.$el).prop("checked",ssl),$(".password",this.$el).val(password),$(".channel",this.$el).val(d)},hide:function(){this.$el.slideUp()},show:function(){this.$el.show(),$(".nick",this.$el).focus()},setStatus:function(a,b){$(".status",this.$el).text(a).attr("class","status").addClass(b).show()},clearStatus:function(){$(".status",this.$el).hide()},networkConnected:function(a){this.setStatus("Connected :)","ok"),$("form",this.$el).hide()},networkConnecting:function(a){this.setStatus("Connecting..","ok")},showError:function(a){this.setStatus("Error connecting","error"),$("form",this.$el).show()}}),b.view.Panel=Backbone.View.extend({tagName:"div",className:"messages",events:{"click .chan":"chanClick"},$container:null,initialize:function(a){this.initializePanel(a)},initializePanel:function(a){this.$el.css("display","none"),a=a||{},a.container?this.$container=$(a.container):this.$container=$("#panels .container1"),this.$el.appendTo(this.$container),this.model.bind("msg",this.newMsg,this),this.msg_count=0,this.model.set({view:this},{silent:!0})},render:function(){this.$el.empty(),this.model.get("backscroll").forEach(this.newMsg)},newMsg:function(a){var c,d,e=this.$el,h;a.msg=$("<div />").text(a.msg).html(),c=new RegExp("\\B(["+b.gateway.get("channel_prefix")+"][^ ,.\\007]+)","g"),a.msg=a.msg.replace(c,function(a){return'<a class="chan">'+a+"</a>"}),a.msg=a.msg.replace(/((https?\:\/\/|ftp\:\/\/)|(www\.))(\S+)(\w{2,4})(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]*))?/gi,function(a){var b;return a.match(/^www\./)&&(a="http://"+a),b=a,b.length>100&&(b=b.substr(0,100)+"..."),'<a class="link_ext" target="_blank" rel="nofollow" href="'+a+'">'+b+"</a>"}),a.msg=g(a.msg),h=function(a){var b=0,c;return _.map(a.split(""),function(a){b+=a.charCodeAt(0)}),c=f(b%255,70,35),c=c[2]|c[1]<<8|c[0]<<16,"#"+c.toString(16)}(a.nick),a.nick_style="color:"+h+";",d='<div class="msg <%= type %>"><div class="time"><%- time %></div><div class="nick" style="<%= nick_style %>"><%- nick %></div><div class="text" style="<%= style %>"><%= msg %> </div></div>',e.append(_.template(d,a)),this.scrollToBottom(),this.msg_count++,this.msg_count>250&&($(".msg:first",this.$el).remove(),this.msg_count--)},chanClick:function(a){b.gateway.join($(a.srcElement).text())},show:function(){var a=this.$el;this.$container.children().css("display","none"),a.css("display","block");var c=this.model.get("members");c?(c.view.show(),this.$container.parent().css("right","200px")):($("#memberlists").children().removeClass("active"),this.$container.parent().css("right","0")),this.scrollToBottom(),this.trigger("active",this.model),b.app.panels.trigger("active",this.model)},scrollToBottom:function(){this.$container[0].scrollTop=this.$container[0].scrollHeight}}),b.view.Applet=b.view.Panel.extend({className:"applet",initialize:function(a){this.initializePanel(a)}}),b.view.Channel=b.view.Panel.extend({initialize:function(a){this.initializePanel(a),this.model.bind("change:topic",this.topic,this)},topic:function(a){if(typeof a!="string"||!a)a=this.model.get("topic");this.model.addMsg("","=== Topic for "+this.model.get("name")+" is: "+a,"topic"),b.app.panels.active===this&&b.app.topicbar.setCurrentTopic(this.model.get("topic"))}}),b.view.Tabs=Backbone.View.extend({tabs_applets:null,tabs_msg:null,events:{"click li":"tabClick","click li img":"partClick"},initialize:function(){this.model.on("add",this.panelAdded,this),this.model.on("remove",this.panelRemoved,this),this.model.on("reset",this.render,this),this.model.on("active",this.panelActive,this),this.tabs_applets=$("ul.applets",this.$el),this.tabs_msg=$("ul.channels",this.$el),window.t=this,b.gateway.on("change:name",function(a,b){$("span",this.model.server.tab).text(b)},this)},render:function(){var a=this;this.tabs_msg.empty(),this.model.server.tab.data("panel_id",this.model.server.cid).appendTo(this.tabs_msg),this.model.forEach(function(b){if(b==a.model.server)return;b.tab.data("panel_id",b.cid).appendTo(b.isApplet()?this.tabs_applets:this.tabs_msg)}),b.app.view.doLayout()},panelAdded:function(a){a.tab=$("<li><span>"+(a.get("title")||a.get("name"))+"</span></li>"),a.tab.data("panel_id",a.cid).appendTo(a.isApplet()?this.tabs_applets:this.tabs_msg),b.app.view.doLayout()},panelRemoved:function(a){a.tab.remove(),delete a.tab,b.app.view.doLayout()},panelActive:function(a){$("img",this.$el).remove(),this.tabs_applets.children().removeClass("active"),this.tabs_msg.children().removeClass("active"),a.tab.addClass("active"),a.tab.append('<img src="img/redcross.png" />')},tabClick:function(a){var b=$(a.currentTarget),c=this.model.getByCid(b.data("panel_id"));if(!c)return;c.view.show()},partClick:function(a){var c=$(a.currentTarget).parent(),d=this.model.getByCid(c.data("panel_id"));d.isChannel()&&d.get("members").models.length>0?b.gateway.part(d.get("name")):d.close()},next:function(){var a=b.app.panels.active.tab.next();a.length||(a=$("li:first",this.tabs_msgs)),a.click()},prev:function(){var a=b.app.panels.active.tab.prev();a.length||(a=$("li:last",this.tabs_msgs)),a.click()}}),b.view.TopicBar=Backbone.View.extend({events:{"keydown input":"process"},initialize:function(){b.app.panels.bind("active",function(a){this.setCurrentTopic(a.get("topic"))},this)},process:function(a){var c=$(a.currentTarget),d=c.val();if(a.keyCode!==13)return;b.app.panels.active.isChannel()&&b.gateway.topic(b.app.panels.active.get("name"),d)},setCurrentTopic:function(a){a=a||"",a=$("<div>").html(g(a)),$("input",this.$el).val(a.text())}}),b.view.ControlBox=Backbone.View.extend({buffer:[],buffer_pos:0,tabcomplete:{active:!1,data:[],prefix:""},events:{"keydown input":"process"},initialize:function(){var a=this;b.gateway.bind("change:nick",function(){$(".nick",a.$el).text(this.get("nick"))})},process:function(a){var c=this,d=$(a.currentTarget),e=d.val(),f;navigator.appVersion.indexOf("Mac")!==-1?f=a.ctrlKey:f=a.altKey,this.tabcomplete.active&&a.keyCode!==9&&(this.tabcomplete.active=!1,this.tabcomplete.data=[],this.tabcomplete.prefix="");switch(!0){case a.keyCode===13:e=e.trim(),e&&(this.processInput(d.val()),this.buffer.push(d.val()),this.buffer_pos=this.buffer.length),d.val("");break;case a.keyCode===38:this.buffer_pos>0&&(this.buffer_pos--,d.val(this.buffer[this.buffer_pos]));break;case a.keyCode===40:this.buffer_pos<this.buffer.length&&(this.buffer_pos++,d.val(this.buffer[this.buffer_pos]));break;case a.keyCode===37&&f:return b.app.panels.view.prev(),!1;case a.keyCode===39&&f:return b.app.panels.view.next(),!1;case a.keyCode===9:this.tabcomplete.active=!0;if(_.isEqual(this.tabcomplete.data,[])){var g=[];$.each(b.app.panels.active.get("members").models,function(a,b){if(!b)return;g.push(b.get("nick"))}),g=_.sortBy(g,function(a){return a}),this.tabcomplete.data=g}if(e[d[0].selectionStart-1]===" ")return!1;return function(){var a=e.substring(0,d[0].selectionStart).split(" "),b,f,g,h,i=a[a.length-1];this.tabcomplete.prefix===""&&(this.tabcomplete.prefix=i),this.tabcomplete.data=_.select(this.tabcomplete.data,function(a){return a.toLowerCase().indexOf(c.tabcomplete.prefix.toLowerCase())===0}),this.tabcomplete.data.length>0&&(f=d[0].selectionStart-i.length,b=e.substr(0,f),g=this.tabcomplete.data.shift(),this.tabcomplete.data.push(g),b+=g,b+=e.substr(d[0].selectionStart),d.val(b),d[0].setSelectionRange?d[0].setSelectionRange(f+g.length,f+g.length):d[0].createTextRange&&(h=d[0].createTextRange(),h.collapse(!0),h.moveEnd("character",f+g.length),h.moveStart("character",f+g.length),h.select()))}.apply(this),!1}},processInput:function(a){var c,d=a.split(" ");d[0][0]==="/"?(c=d[0].substr(1).toLowerCase(),d=d.splice(1)):(c="msg",d.unshift(b.app.panels.active.get("name"))),this.trigger("command",{command:c,params:d}),this.trigger("command_"+c,{command:c,params:d}),this._callbacks["command_"+c]||this.trigger("unknown_command",{command:c,params:d})}}),b.view.StatusMessage=Backbone.View.extend({tmr:null,initialize:function(){this.$el.hide()},text:function(a,c){c=c||{},c.type=c.type||"",c.timeout=c.timeout||5e3,this.$el.text(a).attr("class",c.type),this.$el.slideDown(b.app.view.doLayout),c.timeout&&this.doTimeout(c.timeout)},html:function(a,c){c=c||{},c.type=c.type||"",c.timeout=c.timeout||5e3,this.$el.html(text).attr("class",c.type),this.$el.slideDown(b.app.view.doLayout),c.timeout&&this.doTimeout(c.timeout)},hide:function(){this.$el.slideUp(b.app.view.doLayout)},doTimeout:function(a){this.tmr&&clearTimeout(this.tmr);var b=this;this.tmr=setTimeout(function(){b.hide()},a)}}),b.view.Application=Backbone.View.extend({initialize:function(){$(window).resize(this.doLayout),$("#toolbar").resize(this.doLayout),$("#controlbox").resize(this.doLayout),this.doLayout(),$(document).keydown(this.setKeyFocus)},setKeyFocus:function(a){if(a.ctrlKey||a.altKey)return;if(a.target.tagName.toLowerCase()==="input")return;$("#controlbox .inp").focus()},doLayout:function(){var a=$("#panels"),b=$("#memberlists"),c=$("#toolbar"),d=$("#controlbox"),e={top:c.outerHeight(!0),bottom:d.outerHeight(!0)};a.css(e),b.css(e)},barsHide:function(a){var b=this;a?($("#toolbar").slideUp(0),$("#controlbox").slideUp(0)):($("#toolbar").slideUp(),$("#controlbox").slideUp(function(){b.doLayout()}))},barsShow:function(a){var b=this;a?($("#toolbar").slideDown(0),$("#controlbox").slideDown(0),this.doLayout()):($("#toolbar").slideDown(),$("#controlbox").slideDown(function(){b.doLayout()}))}})})(window)
\ No newline at end of file
index f395169cee29914c92869284ff9b625f8e5e56d3..df54b5d81c0fec6db5b29c1aeed0f104341e7f0f 100644 (file)
@@ -204,8 +204,8 @@ body {
 /* Relaxed theme */
 .panel_container.theme_relaxed .messages .msg { border-bottom: 1px solid #DEDEDE; font-family:arial; font-size:0.9em; }
 .panel_container.theme_relaxed .messages .msg .time { width:6em; float:left; color:#777; display:none; }
-.panel_container.theme_relaxed .messages .msg .nick { width:7em; float:left; font-size:12px; font-family:Arial; text-align:left; padding: 5px; }
-.panel_container.theme_relaxed .messages .msg .text { margin-left:8em; border-left: 1px solid #DEDEDE; white-space:pre-wrap; word-wrap:break-word; font-family:Arial; padding:5px; }
+.panel_container.theme_relaxed .messages .msg .nick { width:11em; float:left; font-size:12px; font-family:Arial; text-align:left; padding: 5px; }
+.panel_container.theme_relaxed .messages .msg .text { margin-left:12em; border-left: 1px solid #DEDEDE; white-space:pre-wrap; word-wrap:break-word; font-family:Arial; padding:5px; }
 
 .panel_container.theme_relaxed .messages .msg.action .nick { display:none; }
 .panel_container.theme_relaxed .messages .msg.action .text { margin-left:9em; color:#009900; border-left:none; font-style:italic; }