]> jfr.im git - irc/quakenet/qwebirc.git/blobdiff - js/ui/baseui.js
Merge.
[irc/quakenet/qwebirc.git] / js / ui / baseui.js
index ec54d473b1e1cc064ebfc7e118468de99b7d40b7..ba3c193ff055e65a05033aedda86ff4363f6bbe6 100644 (file)
@@ -12,9 +12,9 @@ qwebirc.ui.BaseUI = new Class({
   initialize: function(parentElement, windowClass, uiName, options) {
     this.options = options;
     
-    this.windows = {};
-    this.clients = {};
-    this.windows[qwebirc.ui.CUSTOM_CLIENT] = {};
+    this.windows = new QHash();
+    this.clients = new QHash();
+    this.windows.put(qwebirc.ui.CUSTOM_CLIENT, new QHash());
     this.windowArray = [];
     this.windowClass = windowClass;
     this.parentElement = parentElement;
@@ -47,19 +47,30 @@ qwebirc.ui.BaseUI = new Class({
       document.addEvent("focus", focus);
       window.addEvent("focus", focus);
     }
+
+    qwebirc.util.__log = function(x) {
+      if(QWEBIRC_DEBUG) {
+        if(typeof console != "undefined")
+          console.log(x);
+        this.getActiveWindow().addLine(null, x);
+      }
+    }.bind(this);
   },
   newClient: function(client) {
-    client.id = this.clientId++;
+    client.id = String(this.clientId++);
     client.hilightController = new qwebirc.ui.HilightController(client);
-    
-    this.windows[client.id] = {}
-    this.clients[client.id] = client;
+    client.addEvent("signedOn", function() {
+      this.poller = new qwebirc.xdomain.Poller(this.oobMessage.bind(this));
+      this.fireEvent("signedOn", client);
+    }.bind(this));
+    this.windows.put(client.id, new QHash());
+    this.clients.put(client.id, client);
     var w = this.newWindow(client, qwebirc.ui.WINDOW_STATUS, "Status");
     this.selectWindow(w);
     if(!this.firstClient) {
       this.firstClient = true;
       w.addLine("", "qwebirc v" + qwebirc.VERSION);
-      w.addLine("", "Copyright (C) 2008-2012 Chris Porter and the qwebirc project.");
+      w.addLine("", "Copyright (C) 2008-2014 Chris Porter and the qwebirc project.");
       w.addLine("", "http://www.qwebirc.org");
       w.addLine("", "Licensed under the GNU General Public License, Version 2.");
     }
@@ -89,13 +100,14 @@ qwebirc.ui.BaseUI = new Class({
       return w;
       
     var wId = this.getWindowIdentifier(client, type, name);
-    var w = this.windows[this.getClientId(client)][wId] = new this.windowClass(this, client, type, name, wId);
+    var w = new this.windowClass(this, client, type, name, wId);
+    this.windows.get(this.getClientId(client)).put(wId, w);
     this.windowArray.push(w);
     
     return w;
   },
   getWindow: function(client, type, name) {
-    var c = this.windows[this.getClientId(client)];
+    var c = this.windows.get(this.getClientId(client));
     if(!$defined(c))
       return null;
       
@@ -106,7 +118,7 @@ qwebirc.ui.BaseUI = new Class({
   },
   getActiveIRCWindow: function(client) {
     if(!this.active || this.active.type == qwebirc.ui.WINDOW_CUSTOM) {
-      return this.windows[this.getClientId(client)][this.getWindowIdentifier(client, qwebirc.ui.WINDOW_STATUS)];
+      return this.windows.get(this.getClientId(client)).get(this.getWindowIdentifier(client, qwebirc.ui.WINDOW_STATUS));
     } else {
       return this.active;
     }
@@ -123,13 +135,13 @@ qwebirc.ui.BaseUI = new Class({
     if(index == -1)
       return null;
     
-    delete this.windows[clientId][window.identifier];
+    this.windows.get(clientId).remove(window.identifier);
     
     var window = this.windowArray[index];
     window.name = name;
     window.identifier = this.getWindowIdentifier(window.client, window.type, window.name);
     
-    this.windows[clientId][window.identifier] = this.windowArray[index];
+    this.windows.get(clientId).put(window.identifier, this.windowArray[index]);
     
     if(window.active)
       this.updateTitle(window.name + " - " + this.options.appTitle);
@@ -187,7 +199,7 @@ qwebirc.ui.BaseUI = new Class({
     }
     
     this.windowArray = this.windowArray.erase(window);
-    delete this.windows[this.getClientId(window.client)][window.identifier];
+    this.windows.get(this.getClientId(window.client)).remove(window.identifier);
   },
     /*
       this shouldn't be called by overriding classes!
@@ -197,12 +209,39 @@ qwebirc.ui.BaseUI = new Class({
       tricked into getting themselves glined
     */
   loginBox: function(callback, initialNickname, initialChannels, autoConnect, autoNick) {
-    qwebirc.ui.GenericLoginBox(this.parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
+    this.postInitialize();
+
+    this.addCustomWindow("Connection details", qwebirc.ui.ConnectPane, "connectpane", {
+      initialNickname: initialNickname, initialChannels: initialChannels, autoConnect: autoConnect, networkName: this.options.networkName, callback: callback, autoNick: autoNick
+    }, qwebirc.ui.WINDOW_CONNECT);
   },
   focusChange: function(newValue) {
     var window_ = this.getActiveWindow();
     if($defined(window_))
       window_.focusChange(newValue);
+  },
+  oobMessage: function(message) {
+    var c = message.splitMax(" ", 2);
+    if(c.length != 2)
+      return;
+
+    var command = c[0];
+    if(command != "CMD")
+      return;
+
+    var d = c[1].splitMax(" ", 2);
+    if(d.length != 2)
+      return;
+
+    var command = d[0];
+    var args = d[1];
+    if(command == "SAY") {
+      var w = this.getActiveIRCWindow();
+      if($defined(w) && (w.type == qwebirc.ui.WINDOW_CHANNEL || w.type == qwebirc.ui.WINDOW_QUERY)) {
+        w.client.exec("/SAY " + args);
+        return;
+      }
+    }
   }
 });
 
@@ -214,7 +253,7 @@ qwebirc.ui.StandardUI = new Class({
 
     this.tabCompleter = new qwebirc.ui.TabCompleterFactory(this);
     this.uiOptions = new qwebirc.ui.DefaultOptionsClass(this, options.uiOptionsArg);
-    this.customWindows = {};
+    this.customWindows = new QHash();
     
     this.__styleValues = {hue: this.uiOptions.STYLE_HUE, saturation: 0, lightness: 0};
     if($defined(this.options.hue)) this.__styleValues.hue = this.options.hue;
@@ -287,10 +326,10 @@ qwebirc.ui.StandardUI = new Class({
   newCustomWindow: function(name, select, type) {
     if(!type)
       type = qwebirc.ui.WINDOW_CUSTOM;
-      
+
     var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
     w.addEvent("close", function(w) {
-      delete this.windows[qwebirc.ui.CUSTOM_CLIENT][w.identifier];
+      this.windows.get(qwebirc.ui.CUSTOM_CLIENT).remove(w.identifier);
     }.bind(this));
     
     if(select)
@@ -298,20 +337,20 @@ qwebirc.ui.StandardUI = new Class({
 
     return w;
   },
-  addCustomWindow: function(windowName, class_, cssClass, options) {
+  addCustomWindow: function(windowName, class_, cssClass, options, type) {
     if(!$defined(options))
       options = {};
       
-    if(this.customWindows[windowName]) {
-      this.selectWindow(this.customWindows[windowName]);
+    if(this.customWindows.contains(windowName)) {
+      this.selectWindow(this.customWindows.get(windowName));
       return;
     }
     
-    var d = this.newCustomWindow(windowName, true);
-    this.customWindows[windowName] = d;
+    var d = this.newCustomWindow(windowName, true, type);
+    this.customWindows.put(windowName, d);
     
     d.addEvent("close", function() {
-      this.customWindows[windowName] = null;
+      this.customWindows.remove(windowName);
     }.bind(this));
         
     if(cssClass)
@@ -341,8 +380,8 @@ qwebirc.ui.StandardUI = new Class({
   feedbackWindow: function() {
     this.addCustomWindow("Feedback", qwebirc.ui.FeedbackPane, "feedbackpane", this.uiOptions);
   },
-  faqWindow: function() {
-    this.addCustomWindow("FAQ", qwebirc.ui.FAQPane, "faqpane", this.uiOptions);
+  helpWindow: function() {
+    this.addCustomWindow("Help!", qwebirc.ui.HelpPane, "helppane", this.uiOptions);
   },
   urlDispatcher: function(name, window) {
     if(name == "embedded")
@@ -371,7 +410,7 @@ qwebirc.ui.StandardUI = new Class({
     this.tabCompleter.reset();
   },
   setModifiableStylesheet: function(name) {
-    this.__styleSheet = new qwebirc.ui.style.ModifiableStylesheet(qwebirc.global.staticBaseURL + "css/" + name + qwebirc.FILE_SUFFIX + ".mcss");
+    this.__styleSheet = new qwebirc.ui.style.ModifiableStylesheet(qwebirc.global.staticBaseURL + "css/" + (QWEBIRC_DEBUG ? "debug/" : "") + name + qwebirc.FILE_SUFFIX + ".mcss");
     this.setModifiableStylesheetValues({});
   },
   setModifiableStylesheetValues: function(values) {
@@ -436,24 +475,8 @@ qwebirc.ui.NotificationUI = new Class({
   }
 });
 
-qwebirc.ui.NewLoginUI = new Class({
-  Extends: qwebirc.ui.NotificationUI,
-  loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
-    this.postInitialize();
-
-    /* I'd prefer something shorter and snappier! */
-    var w = this.newCustomWindow("Connection details", true, qwebirc.ui.WINDOW_CONNECT);
-    var callback = function(args) {
-      w.close();
-      callbackfn(args);
-    };
-    
-    qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
-  }
-});
-
 qwebirc.ui.QuakeNetUI = new Class({
-  Extends: qwebirc.ui.NewLoginUI,
+  Extends: qwebirc.ui.NotificationUI,
   urlDispatcher: function(name, window) {
     if(name == "qwhois") {
       return ["span", function(auth) {
@@ -466,9 +489,9 @@ qwebirc.ui.QuakeNetUI = new Class({
     if(!qwebirc.auth.loggedin())
       return;
     if(confirm("Log out?")) {
-      for(var client in this.clients) {
-        this.clients[client].quit("Logged out");
-      };
+      this.clients.each(function(k, v) {
+        v.quit("Logged out");
+      }, this);
       
       /* HACK */
       var foo = function() { document.location = qwebirc.global.dynamicBaseURL + "auth?logout=1"; };