Merge branch 'text_themes' of https://github.com/CoryChaplin/KiwiIRC into CoryChaplin...
[KiwiIRC.git] / client / src / models / application.js
index 05a282b602cbc18922fa833c00139dd9029b319a..feb251ef25f9a9ddaa756aab94b00def7572f01d 100644 (file)
@@ -1,49 +1,48 @@
-_kiwi.model.Application = function () {\r
-    // Set to a reference to this object within initialize()\r
-    var that = null;\r
+(function () {\r
 \r
-\r
-    var model = function () {\r
+    _kiwi.model.Application = Backbone.Model.extend({\r
         /** _kiwi.view.Application */\r
-        this.view = null;\r
+        view: null,\r
 \r
         /** _kiwi.view.StatusMessage */\r
-        this.message = null;\r
+        message: null,\r
 \r
         /* Address for the kiwi server */\r
-        this.kiwi_server = null;\r
-\r
-        this.initialize = function (options) {\r
-            that = this;\r
+        kiwi_server: null,\r
 \r
-            if (options[0].container) {\r
-                this.set('container', options[0].container);\r
+        initialize: function (options) {\r
+            if (options.container) {\r
+                this.set('container', options.container);\r
             }\r
 \r
             // The base url to the kiwi server\r
-            this.set('base_path', options[0].base_path ? options[0].base_path : '/kiwi');\r
+            this.set('base_path', options.base_path ? options.base_path : '/kiwi');\r
 \r
             // Path for the settings.json file\r
-            this.set('settings_path', options[0].settings_path ?\r
-                    options[0].settings_path :\r
+            this.set('settings_path', options.settings_path ?\r
+                    options.settings_path :\r
                     this.get('base_path') + '/assets/settings.json'\r
             );\r
 \r
             // Any options sent down from the server\r
-            this.server_settings = options[0].server_settings || {};\r
-            this.translations = options[0].translations || {};\r
+            this.server_settings = options.server_settings || {};\r
+            this.translations = options.translations || {};\r
+            this.themes = options.themes || [];\r
+\r
+            // Best guess at where the kiwi server is if not already specified\r
+            this.kiwi_server = options.kiwi_server || this.detectKiwiServer();\r
 \r
-            // Best guess at where the kiwi server is\r
-            this.detectKiwiServer();\r
+            // The applet to initially load\r
+            this.startup_applet_name = options.startup || 'kiwi_startup';\r
 \r
             // Set any default settings before anything else is applied\r
             if (this.server_settings && this.server_settings.client && this.server_settings.client.settings) {\r
                 this.applyDefaultClientSettings(this.server_settings.client.settings);\r
             }\r
-        };\r
+        },\r
 \r
 \r
-        this.start = function () {\r
+        initializeInterfaces: function () {\r
             // Set the gateway up\r
             _kiwi.gateway = new _kiwi.model.Gateway();\r
             this.bindGatewayCommands(_kiwi.gateway);\r
@@ -52,57 +51,28 @@ _kiwi.model.Application = function () {
             this.initializeGlobals();\r
 \r
             this.view.barsHide(true);\r
+        },\r
 \r
-            this.showIntialConenctionDialog();\r
-        };\r
 \r
-\r
-        this.detectKiwiServer = function () {\r
+        detectKiwiServer: function () {\r
             // If running from file, default to localhost:7777 by default\r
             if (window.location.protocol === 'file:') {\r
-                this.kiwi_server = 'http://localhost:7778';\r
+                return 'http://localhost:7778';\r
             } else {\r
                 // Assume the kiwi server is on the same server\r
-                this.kiwi_server = window.location.protocol + '//' + window.location.host;\r
+                return window.location.protocol + '//' + window.location.host;\r
             }\r
-        };\r
-\r
-\r
-        this.showIntialConenctionDialog = function() {\r
-            var connection_dialog = new _kiwi.model.NewConnection();\r
-            this.populateDefaultServerSettings(connection_dialog);\r
-\r
-            connection_dialog.view.$el.addClass('initial');\r
-            this.view.$el.find('.panel_container:first').append(connection_dialog.view.$el);\r
-\r
-            var $info = $($('#tmpl_new_connection_info').html().trim());\r
-\r
-            if ($info.html()) {\r
-                connection_dialog.view.infoBoxSet($info);\r
-                connection_dialog.view.infoBoxShow();\r
-            }\r
-\r
-            // TODO: Shouldn't really be here but it's not working in the view.. :/\r
-            // Hack for firefox browers: Focus is not given on this event loop iteration\r
-            setTimeout(function(){\r
-                connection_dialog.view.$el.find('.nick').select();\r
-            }, 0);\r
+        },\r
 \r
-            // Once connected, close this dialog and remove its own event\r
-            var fn = function() {\r
-                connection_dialog.view.$el.slideUp(function() {\r
-                    connection_dialog.view.dispose();\r
-                    connection_dialog = null;\r
 \r
-                    _kiwi.gateway.off('onconnect', fn);\r
-                });\r
-\r
-            };\r
-            _kiwi.gateway.on('onconnect', fn);\r
-        };\r
+        showStartup: function() {\r
+            this.startup_applet = _kiwi.model.Applet.load(this.startup_applet_name, {no_tab: true});\r
+            this.startup_applet.tab = this.view.$('.console');\r
+            this.startup_applet.view.show();\r
+        },\r
 \r
 \r
-        this.initializeClient = function () {\r
+        initializeClient: function () {\r
             this.view = new _kiwi.view.Application({model: this, el: this.get('container')});\r
 \r
             // Takes instances of model_network\r
@@ -122,6 +92,7 @@ _kiwi.model.Application = function () {
             this.topicbar = new _kiwi.view.TopicBar({el: this.view.$el.find('.topic')[0]});\r
 \r
             new _kiwi.view.AppToolbar({el: _kiwi.app.view.$el.find('.toolbar .app_tools')[0]});\r
+            new _kiwi.view.ChannelTools({el: _kiwi.app.view.$el.find('.channel_tools')[0]});\r
 \r
             this.message = new _kiwi.view.StatusMessage({el: this.view.$el.find('.status_message')[0]});\r
 \r
@@ -129,10 +100,10 @@ _kiwi.model.Application = function () {
 \r
             // Rejigg the UI sizes\r
             this.view.doLayout();\r
-        };\r
+        },\r
 \r
 \r
-        this.initializeGlobals = function () {\r
+        initializeGlobals: function () {\r
             _kiwi.global.connections = this.connections;\r
 \r
             _kiwi.global.panels = this.panels;\r
@@ -140,178 +111,21 @@ _kiwi.model.Application = function () {
 \r
             _kiwi.global.components.Applet = _kiwi.model.Applet;\r
             _kiwi.global.components.Panel =_kiwi.model.Panel;\r
-        };\r
+        },\r
 \r
 \r
-        this.applyDefaultClientSettings = function (settings) {\r
+        applyDefaultClientSettings: function (settings) {\r
             _.each(settings, function (value, setting) {\r
                 if (typeof _kiwi.global.settings.get(setting) === 'undefined') {\r
                     _kiwi.global.settings.set(setting, value);\r
                 }\r
             });\r
-        };\r
-\r
-\r
-        this.populateDefaultServerSettings = function (new_connection_dialog) {\r
-            var parts;\r
-            var defaults = {\r
-                nick: '',\r
-                server: '',\r
-                port: 6667,\r
-                ssl: false,\r
-                channel: '#chat',\r
-                channel_key: ''\r
-            };\r
-            var uricheck;\r
-\r
-\r
-            /**\r
-             * Get any settings set by the server\r
-             * These settings may be changed in the server selection dialog or via URL parameters\r
-             */\r
-            if (this.server_settings.client) {\r
-                if (this.server_settings.client.nick)\r
-                    defaults.nick = this.server_settings.client.nick;\r
-\r
-                if (this.server_settings.client.server)\r
-                    defaults.server = this.server_settings.client.server;\r
-\r
-                if (this.server_settings.client.port)\r
-                    defaults.port = this.server_settings.client.port;\r
-\r
-                if (this.server_settings.client.ssl)\r
-                    defaults.ssl = this.server_settings.client.ssl;\r
+        },\r
 \r
-                if (this.server_settings.client.channel)\r
-                    defaults.channel = this.server_settings.client.channel;\r
 \r
-                if (this.server_settings.client.channel_key)\r
-                    defaults.channel_key = this.server_settings.client.channel_key;\r
-            }\r
-\r
-\r
-\r
-            /**\r
-             * Get any settings passed in the URL\r
-             * These settings may be changed in the server selection dialog\r
-             */\r
-\r
-            // Any query parameters first\r
-            if (getQueryVariable('nick'))\r
-                defaults.nick = getQueryVariable('nick');\r
-\r
-            if (window.location.hash)\r
-                defaults.channel = window.location.hash;\r
-\r
-\r
-            // Process the URL part by part, extracting as we go\r
-            parts = window.location.pathname.toString().replace(this.get('base_path'), '').split('/');\r
-\r
-            if (parts.length > 0) {\r
-                parts.shift();\r
-\r
-                if (parts.length > 0 && parts[0]) {\r
-                    // Check to see if we're dealing with an irc: uri, or whether we need to extract the server/channel info from the HTTP URL path.\r
-                    uricheck = parts[0].substr(0, 7).toLowerCase();\r
-                    if ((uricheck === 'ircs%3a') || (uricheck.substr(0,6) === 'irc%3a')) {\r
-                        parts[0] = decodeURIComponent(parts[0]);\r
-                        // irc[s]://<host>[:<port>]/[<channel>[?<password>]]\r
-                        uricheck = /^irc(s)?:(?:\/\/?)?([^:\/]+)(?::([0-9]+))?(?:(?:\/)([^\?]*)(?:(?:\?)(.*))?)?$/.exec(parts[0]);\r
-                        /*\r
-                            uricheck[1] = ssl (optional)\r
-                            uricheck[2] = host\r
-                            uricheck[3] = port (optional)\r
-                            uricheck[4] = channel (optional)\r
-                            uricheck[5] = channel key (optional, channel must also be set)\r
-                        */\r
-                        if (uricheck) {\r
-                            if (typeof uricheck[1] !== 'undefined') {\r
-                                defaults.ssl = true;\r
-                                if (defaults.port === 6667) {\r
-                                    defaults.port = 6697;\r
-                                }\r
-                            }\r
-                            defaults.server = uricheck[2];\r
-                            if (typeof uricheck[3] !== 'undefined') {\r
-                                defaults.port = uricheck[3];\r
-                            }\r
-                            if (typeof uricheck[4] !== 'undefined') {\r
-                                defaults.channel = '#' + uricheck[4];\r
-                                if (typeof uricheck[5] !== 'undefined') {\r
-                                    defaults.channel_key = uricheck[5];\r
-                                }\r
-                            }\r
-                        }\r
-                        parts = [];\r
-                    } else {\r
-                        // Extract the port+ssl if we find one\r
-                        if (parts[0].search(/:/) > 0) {\r
-                            defaults.port = parts[0].substring(parts[0].search(/:/) + 1);\r
-                            defaults.server = parts[0].substring(0, parts[0].search(/:/));\r
-                            if (defaults.port[0] === '+') {\r
-                                defaults.port = parseInt(defaults.port.substring(1), 10);\r
-                                defaults.ssl = true;\r
-                            } else {\r
-                                defaults.ssl = false;\r
-                            }\r
-\r
-                        } else {\r
-                            defaults.server = parts[0];\r
-                        }\r
-\r
-                        parts.shift();\r
-                    }\r
-                }\r
-\r
-                if (parts.length > 0 && parts[0]) {\r
-                    defaults.channel = '#' + parts[0];\r
-                    parts.shift();\r
-                }\r
-            }\r
-\r
-            // If any settings have been given by the server.. override any auto detected settings\r
-            /**\r
-             * Get any server restrictions as set in the server config\r
-             * These settings can not be changed in the server selection dialog\r
-             */\r
-            if (this.server_settings && this.server_settings.connection) {\r
-                if (this.server_settings.connection.server) {\r
-                    defaults.server = this.server_settings.connection.server;\r
-                }\r
+        panels: (function() {\r
+            var active_panel;\r
 \r
-                if (this.server_settings.connection.port) {\r
-                    defaults.port = this.server_settings.connection.port;\r
-                }\r
-\r
-                if (this.server_settings.connection.ssl) {\r
-                    defaults.ssl = this.server_settings.connection.ssl;\r
-                }\r
-\r
-                if (this.server_settings.connection.channel) {\r
-                    defaults.channel = this.server_settings.connection.channel;\r
-                }\r
-\r
-                if (this.server_settings.connection.channel_key) {\r
-                    defaults.channel_key = this.server_settings.connection.channel_key;\r
-                }\r
-\r
-                if (this.server_settings.connection.nick) {\r
-                    defaults.nick = this.server_settings.connection.nick;\r
-                }\r
-            }\r
-\r
-            // Set any random numbers if needed\r
-            defaults.nick = defaults.nick.replace('?', Math.floor(Math.random() * 100000).toString());\r
-\r
-            if (getQueryVariable('encoding'))\r
-                defaults.encoding = getQueryVariable('encoding');\r
-\r
-            // Populate the server select box with defaults\r
-            new_connection_dialog.view.populateFields(defaults);\r
-        };\r
-\r
-\r
-        this.panels = (function() {\r
             var fn = function(panel_type) {\r
                 var panels;\r
 \r
@@ -328,7 +142,7 @@ _kiwi.model.Application = function () {
                 }\r
 \r
                 // Active panels / server\r
-                panels.active = this.connections.active_panel;\r
+                panels.active = active_panel;\r
                 panels.server = this.connections.active_connection ?\r
                     this.connections.active_connection.panels.server :\r
                     null;\r
@@ -338,11 +152,16 @@ _kiwi.model.Application = function () {
 \r
             _.extend(fn, Backbone.Events);\r
 \r
+            // Keep track of the active panel. Channel/query/server or applet\r
+            fn.bind('active', function (new_active_panel) {\r
+                active_panel = new_active_panel;\r
+            });\r
+\r
             return fn;\r
-        })();\r
+        })(),\r
 \r
 \r
-        this.bindGatewayCommands = function (gw) {\r
+        bindGatewayCommands: function (gw) {\r
             var that = this;\r
 \r
             gw.on('onconnect', function (event) {\r
@@ -372,13 +191,13 @@ _kiwi.model.Application = function () {
 \r
                     // Mention the disconnection on every channel\r
                     _kiwi.app.connections.forEach(function(connection) {\r
-                        connection.panels.server.addMsg('', msg, 'action quit');\r
+                        connection.panels.server.addMsg('', styleText('quit', {'%T': msg}), 'action quit');\r
 \r
                         connection.panels.forEach(function(panel) {\r
                             if (!panel.isChannel())\r
                                 return;\r
 \r
-                            panel.addMsg('', msg, 'action quit');\r
+                            panel.addMsg('', styleText('quit', {'%T': msg}), 'action quit');\r
                         });\r
                     });\r
 \r
@@ -391,7 +210,7 @@ _kiwi.model.Application = function () {
 \r
                     // Only need to mention the repeating re-connection messages on server panels\r
                     _kiwi.app.connections.forEach(function(connection) {\r
-                        connection.panels.server.addMsg('', msg, 'action quit');\r
+                        connection.panels.server.addMsg('', styleText('quit', {'%T': msg}), 'action quit');\r
                     });\r
                 });\r
 \r
@@ -407,13 +226,13 @@ _kiwi.model.Application = function () {
 \r
                     // Mention the re-connection on every channel\r
                     _kiwi.app.connections.forEach(function(connection) {\r
-                        connection.panels.server.addMsg('', msg, 'action join');\r
+                        connection.panels.server.addMsg('', styleText('rejoin', {'%T': msg}), 'action join');\r
 \r
                         connection.panels.forEach(function(panel) {\r
                             if (!panel.isChannel())\r
                                 return;\r
 \r
-                            panel.addMsg('', msg, 'action join');\r
+                            panel.addMsg('', styleText('rejoin', {'%T': msg}), 'action join');\r
                         });\r
                     });\r
 \r
@@ -442,8 +261,6 @@ _kiwi.model.Application = function () {
                 if (serv[serv.length-1] === '/')\r
                     serv = serv.substring(0, serv.length-1);\r
 \r
-                _kiwi.app.kiwi_server = serv;\r
-\r
                 // Force the jumpserver now?\r
                 if (data.force) {\r
                     // Get an interval between 5 and 6 minutes so everyone doesn't reconnect it all at once\r
@@ -458,6 +275,8 @@ _kiwi.model.Application = function () {
                         that.message.text(msg, {timeout: 8000});\r
 \r
                         setTimeout(function forcedReconnectPartTwo() {\r
+                            _kiwi.app.kiwi_server = serv;\r
+\r
                             _kiwi.gateway.reconnect(function() {\r
                                 // Reconnect all the IRC connections\r
                                 that.connections.forEach(function(con){ con.reconnect(); });\r
@@ -467,90 +286,82 @@ _kiwi.model.Application = function () {
                     }, jump_server_interval * 1000);\r
                 }\r
             });\r
-        };\r
+        },\r
 \r
 \r
 \r
         /**\r
          * Bind to certain commands that may be typed into the control box\r
          */\r
-        this.bindControllboxCommands = function (controlbox) {\r
+        bindControllboxCommands: function (controlbox) {\r
+            var that = this;\r
+\r
             // Default aliases\r
             $.extend(controlbox.preprocessor.aliases, {\r
                 // General aliases\r
-                '/p': '/part $1+',\r
-                '/me': '/action $1+',\r
-                '/j': '/join $1+',\r
-                '/q': '/query $1+',\r
-                '/w': '/whois $1+',\r
-                '/raw': '/quote $1+',\r
+                '/p':    '/part $1+',\r
+                '/me':   '/action $1+',\r
+                '/j':    '/join $1+',\r
+                '/q':    '/query $1+',\r
+                '/w':    '/whois $1+',\r
+                '/raw':  '/quote $1+',\r
 \r
                 // Op related aliases\r
-                '/op': '/quote mode $channel +o $1+',\r
-                '/deop': '/quote mode $channel -o $1+',\r
-                '/hop': '/quote mode $channel +h $1+',\r
-                '/dehop': '/quote mode $channel -h $1+',\r
-                '/voice': '/quote mode $channel +v $1+',\r
-                '/devoice': '/quote mode $channel -v $1+',\r
-                '/k': '/kick $channel $1+',\r
+                '/op':       '/quote mode $channel +o $1+',\r
+                '/deop':     '/quote mode $channel -o $1+',\r
+                '/hop':      '/quote mode $channel +h $1+',\r
+                '/dehop':    '/quote mode $channel -h $1+',\r
+                '/voice':    '/quote mode $channel +v $1+',\r
+                '/devoice':  '/quote mode $channel -v $1+',\r
+                '/k':        '/kick $channel $1+',\r
+                '/ban':      '/quote mode $channel +b $1+',\r
+                '/unban':    '/quote mode $channel -b $1+',\r
 \r
                 // Misc aliases\r
-                '/slap': '/me slaps $1 around a bit with a large trout'\r
+                '/slap':     '/me slaps $1 around a bit with a large trout'\r
             });\r
 \r
-            controlbox.on('unknown_command', unknownCommand);\r
-\r
-            controlbox.on('command', allCommands);\r
-            controlbox.on('command:msg', msgCommand);\r
-\r
-            controlbox.on('command:action', actionCommand);\r
-\r
-            controlbox.on('command:join', joinCommand);\r
-\r
-            controlbox.on('command:part', partCommand);\r
-\r
-            controlbox.on('command:nick', function (ev) {\r
-                _kiwi.gateway.changeNick(null, ev.params[0]);\r
-            });\r
-\r
-            controlbox.on('command:query', queryCommand);\r
-\r
-            controlbox.on('command:invite', inviteCommand);\r
-\r
-            controlbox.on('command:topic', topicCommand);\r
-\r
-            controlbox.on('command:notice', noticeCommand);\r
-\r
-            controlbox.on('command:quote', quoteCommand);\r
-\r
-            controlbox.on('command:kick', kickCommand);\r
-\r
-            controlbox.on('command:clear', clearCommand);\r
-\r
-            controlbox.on('command:ctcp', ctcpCommand);\r
-\r
-            controlbox.on('command:server', serverCommand);\r
-\r
-            controlbox.on('command:whois', whoisCommand);\r
-\r
-            controlbox.on('command:whowas', whowasCommand);\r
-\r
-            controlbox.on('command:encoding', encodingCommand);\r
+            // Functions to bind to controlbox events\r
+            var fn_to_bind = {\r
+                'unknown_command':     unknownCommand,\r
+                'command':             allCommands,\r
+                'command:msg':         msgCommand,\r
+                'command:action':      actionCommand,\r
+                'command:join':        joinCommand,\r
+                'command:part':        partCommand,\r
+                'command:nick':        nickCommand,\r
+                'command:query':       queryCommand,\r
+                'command:invite':      inviteCommand,\r
+                'command:topic':       topicCommand,\r
+                'command:notice':      noticeCommand,\r
+                'command:quote':       quoteCommand,\r
+                'command:kick':        kickCommand,\r
+                'command:clear':       clearCommand,\r
+                'command:ctcp':        ctcpCommand,\r
+                'command:server':      serverCommand,\r
+                'command:whois':       whoisCommand,\r
+                'command:whowas':      whowasCommand,\r
+                'command:encoding':    encodingCommand,\r
+                'command:channel':     channelCommand,\r
+                'command:applet':      appletCommand,\r
+                'command:settings':    settingsCommand,\r
+                'command:script':      scriptCommand\r
+            };\r
 \r
-            controlbox.on('command:css', function (ev) {\r
+            fn_to_bind['command:css'] = function (ev) {\r
                 var queryString = '?reload=' + new Date().getTime();\r
                 $('link[rel="stylesheet"]').each(function () {\r
                     this.href = this.href.replace(/\?.*|$/, queryString);\r
                 });\r
-            });\r
+            };\r
 \r
-            controlbox.on('command:js', function (ev) {\r
+            fn_to_bind['command:js'] = function (ev) {\r
                 if (!ev.params[0]) return;\r
                 $script(ev.params[0] + '?' + (new Date().getTime()));\r
-            });\r
+            };\r
 \r
 \r
-            controlbox.on('command:set', function (ev) {\r
+            fn_to_bind['command:set'] = function (ev) {\r
                 if (!ev.params[0]) return;\r
 \r
                 var setting = ev.params[0],\r
@@ -578,23 +389,23 @@ _kiwi.model.Application = function () {
                 }\r
 \r
                 // Read the value to the user\r
-                _kiwi.app.panels().active.addMsg('', setting + ' = ' + _kiwi.global.settings.get(setting).toString());\r
-            });\r
+                _kiwi.app.panels().active.addMsg('', styleText('set_setting', {'%T': setting + ' = ' + _kiwi.global.settings.get(setting).toString()}));\r
+            };\r
 \r
 \r
-            controlbox.on('command:save', function (ev) {\r
+            fn_to_bind['command:save'] = function (ev) {\r
                 _kiwi.global.settings.save();\r
-                _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_settings_saved').fetch());\r
-            });\r
+                _kiwi.app.panels().active.addMsg('', styleText('client_models_application_settings_saved', {'%T': translateText('client_models_application_settings_saved')}));\r
+            };\r
 \r
 \r
-            controlbox.on('command:alias', function (ev) {\r
+            fn_to_bind['command:alias'] = function (ev) {\r
                 var name, rule;\r
 \r
                 // No parameters passed so list them\r
                 if (!ev.params[1]) {\r
                     $.each(controlbox.preprocessor.aliases, function (name, rule) {\r
-                        _kiwi.app.panels().server.addMsg(' ', name + '   =>   ' + rule);\r
+                        _kiwi.app.panels().server.addMsg(' ', styleText('list_aliases', {'%T': name + '   =>   ' + rule}));\r
                     });\r
                     return;\r
                 }\r
@@ -617,37 +428,37 @@ _kiwi.model.Application = function () {
 \r
                 // Now actually add the alias\r
                 controlbox.preprocessor.aliases[name] = rule;\r
-            });\r
+            };\r
 \r
 \r
-            controlbox.on('command:ignore', function (ev) {\r
-                var list = _kiwi.gateway.get('ignore_list');\r
+            fn_to_bind['command:ignore'] = function (ev) {\r
+                var list = this.connections.active_connection.get('ignore_list');\r
 \r
                 // No parameters passed so list them\r
                 if (!ev.params[0]) {\r
                     if (list.length > 0) {\r
-                        _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_title').fetch() + ':');\r
+                        _kiwi.app.panels().active.addMsg(' ', styleText('client_models_application_ignore_title', {'%T': translateText('client_models_application_ignore_title')}));\r
                         $.each(list, function (idx, ignored_pattern) {\r
-                            _kiwi.app.panels().active.addMsg(' ', ignored_pattern);\r
+                            _kiwi.app.panels().active.addMsg(' ', styleText('ignored_pattern', {'%T': ignored_pattern}));\r
                         });\r
                     } else {\r
-                        _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_none').fetch());\r
+                        _kiwi.app.panels().active.addMsg(' ', styleText('client_models_application_ignore_none', {'%T': translateText('client_models_application_ignore_none')}));\r
                     }\r
                     return;\r
                 }\r
 \r
                 // We have a parameter, so add it\r
                 list.push(ev.params[0]);\r
-                _kiwi.gateway.set('ignore_list', list);\r
-                _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_nick').fetch(ev.params[0]));\r
-            });\r
+                this.connections.active_connection.set('ignore_list', list);\r
+                _kiwi.app.panels().active.addMsg(' ', styleText('client_models_application_ignore_nick', {'%T': translateText('client_models_application_ignore_nick', [ev.params[0]])}));\r
+            };\r
 \r
 \r
-            controlbox.on('command:unignore', function (ev) {\r
-                var list = _kiwi.gateway.get('ignore_list');\r
+            fn_to_bind['command:unignore'] = function (ev) {\r
+                var list = this.connections.active_connection.get('ignore_list');\r
 \r
                 if (!ev.params[0]) {\r
-                    _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_stop_notice').fetch());\r
+                    _kiwi.app.panels().active.addMsg(' ', styleText('client_models_application_ignore_stop_notice', {'%T': translateText('client_models_application_ignore_stop_notice')}));\r
                     return;\r
                 }\r
 \r
@@ -655,338 +466,349 @@ _kiwi.model.Application = function () {
                     return pattern === ev.params[0];\r
                 });\r
 \r
-                _kiwi.gateway.set('ignore_list', list);\r
+                this.connections.active_connection.set('ignore_list', list);\r
 \r
-                _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_stopped').fetch(ev.params[0]));\r
-            });\r
+                _kiwi.app.panels().active.addMsg(' ', styleText('client_models_application_ignore_stopped', {'%T': translateText('client_models_application_ignore_stopped', [ev.params[0]])}));\r
+            };\r
 \r
 \r
-            controlbox.on('command:applet', appletCommand);\r
-            controlbox.on('command:settings', settingsCommand);\r
-            controlbox.on('command:script', scriptCommand);\r
-        };\r
+            _.each(fn_to_bind, function(fn, event_name) {\r
+                controlbox.on(event_name, _.bind(fn, that));\r
+            });\r
+        },\r
 \r
-        // A fallback action. Send a raw command to the server\r
-        function unknownCommand (ev) {\r
-            var raw_cmd = ev.command + ' ' + ev.params.join(' ');\r
-            console.log('RAW: ' + raw_cmd);\r
-            _kiwi.gateway.raw(null, raw_cmd);\r
-        }\r
 \r
-        function allCommands (ev) {}\r
+        isChannelName: function (channel_name) {\r
+            var channel_prefix = _kiwi.gateway.get('channel_prefix');\r
 \r
-        function joinCommand (ev) {\r
-            var panels, channel_names;\r
+            if (!channel_name || !channel_name.length) return false;\r
+            return (channel_prefix.indexOf(channel_name[0]) > -1);\r
+        }\r
+    });\r
 \r
-            channel_names = ev.params.join(' ').split(',');\r
-            panels = that.connections.active_connection.createAndJoinChannels(channel_names);\r
 \r
-            // Show the last channel if we have one\r
-            if (panels.length)\r
-                panels[panels.length - 1].view.show();\r
-        }\r
 \r
-        function queryCommand (ev) {\r
-            var destination, message, panel;\r
 \r
-            destination = ev.params[0];\r
-            ev.params.shift();\r
+    // A fallback action. Send a raw command to the server\r
+    function unknownCommand (ev) {\r
+        var raw_cmd = ev.command + ' ' + ev.params.join(' ');\r
+        console.log('RAW: ' + raw_cmd);\r
+        this.connections.active_connection.gateway.raw(raw_cmd);\r
+    }\r
 \r
-            message = ev.params.join(' ');\r
+    function allCommands (ev) {}\r
 \r
-            // Check if we have the panel already. If not, create it\r
-            panel = that.connections.active_connection.panels.getByName(destination);\r
-            if (!panel) {\r
-                panel = new _kiwi.model.Query({name: destination});\r
-                that.connections.active_connection.panels.add(panel);\r
-            }\r
+    function joinCommand (ev) {\r
+        var panels, channel_names;\r
 \r
-            if (panel) panel.view.show();\r
+        channel_names = ev.params.join(' ').split(',');\r
+        panels = this.connections.active_connection.createAndJoinChannels(channel_names);\r
 \r
-            if (message) {\r
-                that.connections.active_connection.gateway.msg(panel.get('name'), message);\r
-                panel.addMsg(_kiwi.app.connections.active_connection.get('nick'), message);\r
-            }\r
+        // Show the last channel if we have one\r
+        if (panels.length)\r
+            panels[panels.length - 1].view.show();\r
+    }\r
 \r
-        }\r
+    function queryCommand (ev) {\r
+        var destination, message, panel;\r
 \r
-        function msgCommand (ev) {\r
-            var destination = ev.params[0],\r
-                panel = that.connections.active_connection.panels.getByName(destination) || that.panels().server;\r
+        destination = ev.params[0];\r
+        ev.params.shift();\r
 \r
-            ev.params.shift();\r
+        message = ev.params.join(' ');\r
 \r
-            panel.addMsg(_kiwi.app.connections.active_connection.get('nick'), ev.params.join(' '));\r
-            _kiwi.gateway.privmsg(null, destination, ev.params.join(' '));\r
+        // Check if we have the panel already. If not, create it\r
+        panel = this.connections.active_connection.panels.getByName(destination);\r
+        if (!panel) {\r
+            panel = new _kiwi.model.Query({name: destination});\r
+            this.connections.active_connection.panels.add(panel);\r
         }\r
 \r
-        function actionCommand (ev) {\r
-            if (_kiwi.app.panels().active.isServer()) {\r
-                return;\r
-            }\r
+        if (panel) panel.view.show();\r
 \r
-            var panel = _kiwi.app.panels().active;\r
-            panel.addMsg('', '* ' + _kiwi.app.connections.active_connection.get('nick') + ' ' + ev.params.join(' '), 'action');\r
-            _kiwi.gateway.action(null, panel.get('name'), ev.params.join(' '));\r
+        if (message) {\r
+            this.connections.active_connection.gateway.msg(panel.get('name'), message);\r
+            panel.addMsg(_kiwi.app.connections.active_connection.get('nick'), styleText('query', {'%T': message}));\r
         }\r
 \r
-        function partCommand (ev) {\r
-            if (ev.params.length === 0) {\r
-                _kiwi.gateway.part(null, _kiwi.app.panels().active.get('name'));\r
-            } else {\r
-                _.each(ev.params, function (channel) {\r
-                    _kiwi.gateway.part(null, channel);\r
-                });\r
-            }\r
-        }\r
+    }\r
 \r
-        function topicCommand (ev) {\r
-            var channel_name;\r
+    function msgCommand (ev) {\r
+        var message,\r
+            destination = ev.params[0],\r
+            panel = this.connections.active_connection.panels.getByName(destination) || this.panels().server;\r
 \r
-            if (ev.params.length === 0) return;\r
+        ev.params.shift();\r
+        message = formatToIrcMsg(ev.params.join(' '));\r
 \r
-            if (that.isChannelName(ev.params[0])) {\r
-                channel_name = ev.params[0];\r
-                ev.params.shift();\r
-            } else {\r
-                channel_name = _kiwi.app.panels().active.get('name');\r
-            }\r
+        panel.addMsg(_kiwi.app.connections.active_connection.get('nick'), styleText('msg', {'%T': message}));\r
+        this.connections.active_connection.gateway.msg(destination, message);\r
+    }\r
 \r
-            _kiwi.gateway.topic(null, channel_name, ev.params.join(' '));\r
+    function actionCommand (ev) {\r
+        if (_kiwi.app.panels().active.isServer()) {\r
+            return;\r
         }\r
 \r
-        function noticeCommand (ev) {\r
-            var destination;\r
+        var panel = _kiwi.app.panels().active;\r
+        panel.addMsg('', styleText('action', {'%N': _kiwi.app.connections.active_connection.get('nick'), '%T': ev.params.join(' ')}), 'action');\r
+        this.connections.active_connection.gateway.action(panel.get('name'), ev.params.join(' '));\r
+    }\r
 \r
-            // Make sure we have a destination and some sort of message\r
-            if (ev.params.length <= 1) return;\r
+    function partCommand (ev) {\r
+        var that = this;\r
 \r
-            destination = ev.params[0];\r
-            ev.params.shift();\r
-\r
-            _kiwi.gateway.notice(null, destination, ev.params.join(' '));\r
+        if (ev.params.length === 0) {\r
+            this.connections.active_connection.gateway.part(_kiwi.app.panels().active.get('name'));\r
+        } else {\r
+            _.each(ev.params, function (channel) {\r
+                that.connections.active_connection.gateway.part(channel);\r
+            });\r
         }\r
+    }\r
+\r
+    function nickCommand (ev) {\r
+        this.connections.active_connection.gateway.changeNick(ev.params[0]);\r
+    }\r
+\r
+    function topicCommand (ev) {\r
+        var channel_name;\r
+\r
+        if (ev.params.length === 0) return;\r
 \r
-        function quoteCommand (ev) {\r
-            var raw = ev.params.join(' ');\r
-            _kiwi.gateway.raw(null, raw);\r
+        if (this.isChannelName(ev.params[0])) {\r
+            channel_name = ev.params[0];\r
+            ev.params.shift();\r
+        } else {\r
+            channel_name = _kiwi.app.panels().active.get('name');\r
         }\r
 \r
-        function kickCommand (ev) {\r
-            var nick, panel = _kiwi.app.panels().active;\r
+        this.connections.active_connection.gateway.topic(channel_name, ev.params.join(' '));\r
+    }\r
 \r
-            if (!panel.isChannel()) return;\r
+    function noticeCommand (ev) {\r
+        var destination;\r
 \r
-            // Make sure we have a nick\r
-            if (ev.params.length === 0) return;\r
+        // Make sure we have a destination and some sort of message\r
+        if (ev.params.length <= 1) return;\r
 \r
-            nick = ev.params[0];\r
-            ev.params.shift();\r
+        destination = ev.params[0];\r
+        ev.params.shift();\r
 \r
-            _kiwi.gateway.kick(null, panel.get('name'), nick, ev.params.join(' '));\r
-        }\r
+        this.connections.active_connection.gateway.notice(destination, ev.params.join(' '));\r
+    }\r
 \r
-        function clearCommand (ev) {\r
-            // Can't clear a server or applet panel\r
-            if (_kiwi.app.panels().active.isServer() || _kiwi.app.panels().active.isApplet()) {\r
-                return;\r
-            }\r
+    function quoteCommand (ev) {\r
+        var raw = ev.params.join(' ');\r
+        this.connections.active_connection.gateway.raw(raw);\r
+    }\r
 \r
-            if (_kiwi.app.panels().active.clearMessages) {\r
-                _kiwi.app.panels().active.clearMessages();\r
-            }\r
-        }\r
+    function kickCommand (ev) {\r
+        var nick, panel = _kiwi.app.panels().active;\r
 \r
-        function ctcpCommand(ev) {\r
-            var target, type;\r
+        if (!panel.isChannel()) return;\r
 \r
-            // Make sure we have a target and a ctcp type (eg. version, time)\r
-            if (ev.params.length < 2) return;\r
+        // Make sure we have a nick\r
+        if (ev.params.length === 0) return;\r
 \r
-            target = ev.params[0];\r
-            ev.params.shift();\r
+        nick = ev.params[0];\r
+        ev.params.shift();\r
 \r
-            type = ev.params[0];\r
-            ev.params.shift();\r
+        this.connections.active_connection.gateway.kick(panel.get('name'), nick, ev.params.join(' '));\r
+    }\r
 \r
-            _kiwi.gateway.ctcp(null, true, type, target, ev.params.join(' '));\r
+    function clearCommand (ev) {\r
+        // Can't clear a server or applet panel\r
+        if (_kiwi.app.panels().active.isServer() || _kiwi.app.panels().active.isApplet()) {\r
+            return;\r
         }\r
 \r
-        function settingsCommand (ev) {\r
-            var settings = _kiwi.model.Applet.loadOnce('kiwi_settings');\r
-            settings.view.show();\r
+        if (_kiwi.app.panels().active.clearMessages) {\r
+            _kiwi.app.panels().active.clearMessages();\r
         }\r
+    }\r
 \r
-        function scriptCommand (ev) {\r
-            var editor = _kiwi.model.Applet.loadOnce('kiwi_script_editor');\r
-            editor.view.show();\r
-        }\r
+    function ctcpCommand(ev) {\r
+        var target, type;\r
 \r
-        function appletCommand (ev) {\r
-            if (!ev.params[0]) return;\r
+        // Make sure we have a target and a ctcp type (eg. version, time)\r
+        if (ev.params.length < 2) return;\r
 \r
-            var panel = new _kiwi.model.Applet();\r
+        target = ev.params[0];\r
+        ev.params.shift();\r
 \r
-            if (ev.params[1]) {\r
-                // Url and name given\r
-                panel.load(ev.params[0], ev.params[1]);\r
-            } else {\r
-                // Load a pre-loaded applet\r
-                if (_kiwi.applets[ev.params[0]]) {\r
-                    panel.load(new _kiwi.applets[ev.params[0]]());\r
-                } else {\r
-                    _kiwi.app.panels().server.addMsg('', _kiwi.global.i18n.translate('client_models_application_applet_notfound').fetch(ev.params[0]));\r
-                    return;\r
-                }\r
-            }\r
+        type = ev.params[0];\r
+        ev.params.shift();\r
 \r
-            _kiwi.app.connections.active_connection.panels.add(panel);\r
-            panel.view.show();\r
-        }\r
+        this.connections.active_connection.gateway.ctcp(true, type, target, ev.params.join(' '));\r
+    }\r
 \r
+    function settingsCommand (ev) {\r
+        var settings = _kiwi.model.Applet.loadOnce('kiwi_settings');\r
+        settings.view.show();\r
+    }\r
 \r
+    function scriptCommand (ev) {\r
+        var editor = _kiwi.model.Applet.loadOnce('kiwi_script_editor');\r
+        editor.view.show();\r
+    }\r
 \r
-        function inviteCommand (ev) {\r
-            var nick, channel;\r
+    function appletCommand (ev) {\r
+        if (!ev.params[0]) return;\r
 \r
-            // A nick must be specified\r
-            if (!ev.params[0])\r
-                return;\r
+        var panel = new _kiwi.model.Applet();\r
 \r
-            // Can only invite into channels\r
-            if (!_kiwi.app.panels().active.isChannel())\r
+        if (ev.params[1]) {\r
+            // Url and name given\r
+            panel.load(ev.params[0], ev.params[1]);\r
+        } else {\r
+            // Load a pre-loaded applet\r
+            if (_kiwi.applets[ev.params[0]]) {\r
+                panel.load(new _kiwi.applets[ev.params[0]]());\r
+            } else {\r
+                _kiwi.app.panels().server.addMsg('', styleText('client_models_application_applet_notfound', {'%T': translateText('client_models_application_applet_notfound', [ev.params[0]])}));\r
                 return;\r
+            }\r
+        }\r
 \r
-            nick = ev.params[0];\r
-            channel = _kiwi.app.panels().active.get('name');\r
+        _kiwi.app.connections.active_connection.panels.add(panel);\r
+        panel.view.show();\r
+    }\r
 \r
-            _kiwi.app.connections.active_connection.gateway.raw('INVITE ' + nick + ' ' + channel);\r
 \r
-            _kiwi.app.panels().active.addMsg('', '== ' + nick + ' has been invited to ' + channel, 'action');\r
-        }\r
 \r
+    function inviteCommand (ev) {\r
+        var nick, channel;\r
 \r
-        function whoisCommand (ev) {\r
-            var nick;\r
+        // A nick must be specified\r
+        if (!ev.params[0])\r
+            return;\r
 \r
-            if (ev.params[0]) {\r
-                nick = ev.params[0];\r
-            } else if (_kiwi.app.panels().active.isQuery()) {\r
-                nick = _kiwi.app.panels().active.get('name');\r
-            }\r
+        // Can only invite into channels\r
+        if (!_kiwi.app.panels().active.isChannel())\r
+            return;\r
 \r
-            if (nick)\r
-                _kiwi.app.connections.active_connection.gateway.raw('WHOIS ' + nick + ' ' + nick);\r
-        }\r
+        nick = ev.params[0];\r
+        channel = _kiwi.app.panels().active.get('name');\r
 \r
+        _kiwi.app.connections.active_connection.gateway.raw('INVITE ' + nick + ' ' + channel);\r
 \r
-        function whowasCommand (ev) {\r
-            var nick;\r
+        _kiwi.app.panels().active.addMsg('', styleText('client_models_application_has_been_invited', {'%N': nick, '%T': translateText('client_models_application_has_been_invited', [channel])}), 'action');\r
+    }\r
 \r
-            if (ev.params[0]) {\r
-                nick = ev.params[0];\r
-            } else if (_kiwi.app.panels().active.isQuery()) {\r
-                nick = _kiwi.app.panels().active.get('name');\r
-            }\r
 \r
-            if (nick)\r
-                _kiwi.app.connections.active_connection.gateway.raw('WHOWAS ' + nick);\r
-        }\r
+    function whoisCommand (ev) {\r
+        var nick;\r
 \r
-        function encodingCommand (ev) {\r
-            if (ev.params[0]) {\r
-                _kiwi.gateway.setEncoding(null, ev.params[0], function (success) {\r
-                    if (success) {\r
-                        _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_changed').fetch(ev.params[0]));\r
-                    } else {\r
-                        _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_invalid').fetch(ev.params[0]));\r
-                    }\r
-                });\r
-            } else {\r
-                _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_notspecified').fetch());\r
-                _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_usage').fetch());\r
-            }\r
+        if (ev.params[0]) {\r
+            nick = ev.params[0];\r
+        } else if (_kiwi.app.panels().active.isQuery()) {\r
+            nick = _kiwi.app.panels().active.get('name');\r
         }\r
 \r
-        function serverCommand (ev) {\r
-            var server, port, ssl, password, nick,\r
-                tmp;\r
+        if (nick)\r
+            _kiwi.app.connections.active_connection.gateway.raw('WHOIS ' + nick + ' ' + nick);\r
+    }\r
 \r
-            // If no server address given, show the new connection dialog\r
-            if (!ev.params[0]) {\r
-                tmp = new _kiwi.view.MenuBox(_kiwi.global.i18n.translate('client_models_application_connection_create').fetch());\r
-                tmp.addItem('new_connection', new _kiwi.model.NewConnection().view.$el);\r
-                tmp.show();\r
 \r
-                // Center screen the dialog\r
-                tmp.$el.offset({\r
-                    top: (that.view.$el.height() / 2) - (tmp.$el.height() / 2),\r
-                    left: (that.view.$el.width() / 2) - (tmp.$el.width() / 2)\r
-                });\r
+    function whowasCommand (ev) {\r
+        var nick;\r
 \r
-                return;\r
-            }\r
+        if (ev.params[0]) {\r
+            nick = ev.params[0];\r
+        } else if (_kiwi.app.panels().active.isQuery()) {\r
+            nick = _kiwi.app.panels().active.get('name');\r
+        }\r
 \r
-            // Port given in 'host:port' format and no specific port given after a space\r
-            if (ev.params[0].indexOf(':') > 0) {\r
-                tmp = ev.params[0].split(':');\r
-                server = tmp[0];\r
-                port = tmp[1];\r
+        if (nick)\r
+            _kiwi.app.connections.active_connection.gateway.raw('WHOWAS ' + nick);\r
+    }\r
 \r
-                password = ev.params[1] || undefined;\r
+    function encodingCommand (ev) {\r
+        if (ev.params[0]) {\r
+            _kiwi.gateway.setEncoding(null, ev.params[0], function (success) {\r
+                if (success) {\r
+                    _kiwi.app.panels().active.addMsg('', styleText('client_models_application_encoding_changed', {'%T': translateText('client_models_application_encoding_changed', [ev.params[0]])}));\r
+                } else {\r
+                    _kiwi.app.panels().active.addMsg('', styleText('client_models_application_encoding_invalid', {'%T': translateText('client_models_application_encoding_invalid', [ev.params[0]])}));\r
+                }\r
+            });\r
+        } else {\r
+            _kiwi.app.panels().active.addMsg('', styleText('client_models_application_encoding_notspecified', {'%T': translateText('client_models_application_encoding_notspecified')}));\r
+            _kiwi.app.panels().active.addMsg('', styleText('client_models_application_encoding_usage', {'%T': translateText('client_models_application_encoding_usage')}));\r
+        }\r
+    }\r
 \r
-            } else {\r
-                // Server + port given as 'host port'\r
-                server = ev.params[0];\r
-                port = ev.params[1] || 6667;\r
+    function channelCommand (ev) {\r
+        var active_panel = _kiwi.app.panels().active;\r
 \r
-                password = ev.params[2] || undefined;\r
-            }\r
+        if (!active_panel.isChannel())\r
+            return;\r
 \r
-            // + in the port means SSL\r
-            if (port.toString()[0] === '+') {\r
-                ssl = true;\r
-                port = parseInt(port.substring(1), 10);\r
-            } else {\r
-                ssl = false;\r
-            }\r
-\r
-            // Default port if one wasn't found\r
-            port = port || 6667;\r
+        new _kiwi.model.ChannelInfo({channel: _kiwi.app.panels().active});\r
+    }\r
 \r
-            // Use the same nick as we currently have\r
-            nick = _kiwi.app.connections.active_connection.get('nick');\r
+    function serverCommand (ev) {\r
+        var server, port, ssl, password, nick,\r
+            tmp;\r
 \r
-            _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_connection_connecting').fetch(server, port.toString()));\r
+        // If no server address given, show the new connection dialog\r
+        if (!ev.params[0]) {\r
+            tmp = new _kiwi.view.MenuBox(_kiwi.global.i18n.translate('client_models_application_connection_create').fetch());\r
+            tmp.addItem('new_connection', new _kiwi.model.NewConnection().view.$el);\r
+            tmp.show();\r
 \r
-            _kiwi.gateway.newConnection({\r
-                nick: nick,\r
-                host: server,\r
-                port: port,\r
-                ssl: ssl,\r
-                password: password\r
-            }, function(err, new_connection) {\r
-                if (err)\r
-                    _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_connection_error').fetch(server, port.toString(), err.toString()));\r
+            // Center screen the dialog\r
+            tmp.$el.offset({\r
+                top: (this.view.$el.height() / 2) - (tmp.$el.height() / 2),\r
+                left: (this.view.$el.width() / 2) - (tmp.$el.width() / 2)\r
             });\r
-        }\r
 \r
+            return;\r
+        }\r
 \r
+        // Port given in 'host:port' format and no specific port given after a space\r
+        if (ev.params[0].indexOf(':') > 0) {\r
+            tmp = ev.params[0].split(':');\r
+            server = tmp[0];\r
+            port = tmp[1];\r
 \r
+            password = ev.params[1] || undefined;\r
 \r
+        } else {\r
+            // Server + port given as 'host port'\r
+            server = ev.params[0];\r
+            port = ev.params[1] || 6667;\r
 \r
-        this.isChannelName = function (channel_name) {\r
-            var channel_prefix = _kiwi.gateway.get('channel_prefix');\r
+            password = ev.params[2] || undefined;\r
+        }\r
 \r
-            if (!channel_name || !channel_name.length) return false;\r
-            return (channel_prefix.indexOf(channel_name[0]) > -1);\r
-        };\r
+        // + in the port means SSL\r
+        if (port.toString()[0] === '+') {\r
+            ssl = true;\r
+            port = parseInt(port.substring(1), 10);\r
+        } else {\r
+            ssl = false;\r
+        }\r
 \r
+        // Default port if one wasn't found\r
+        port = port || 6667;\r
 \r
-    };\r
+        // Use the same nick as we currently have\r
+        nick = _kiwi.app.connections.active_connection.get('nick');\r
 \r
+        _kiwi.app.panels().active.addMsg('', styleText('client_models_application_connection_connecting', {'%T': translateText('client_models_application_connection_connecting', [server, port.toString()])}));\r
 \r
-    model = Backbone.Model.extend(new model());\r
+        _kiwi.gateway.newConnection({\r
+            nick: nick,\r
+            host: server,\r
+            port: port,\r
+            ssl: ssl,\r
+            password: password\r
+        }, function(err, new_connection) {\r
+            if (err)\r
+                _kiwi.app.panels().active.addMsg('', styleText('client_models_application_connection_error', {'%T': translateText('client_models_application_connection_error', [server, port.toString(), err.toString()])}));\r
+        });\r
+    }\r
 \r
-    return new model(arguments);\r
-};\r
+})();\r