]> jfr.im git - irc/quakenet/qwebirc.git/blobdiff - js/ui/baseui.js
Add about pane.
[irc/quakenet/qwebirc.git] / js / ui / baseui.js
index cf9b94de97210b1b0bb9756bd8328b68215ab250..1d4e9d856c3027ecc4355aa61e866f49498757af 100644 (file)
@@ -3,6 +3,7 @@ qwebirc.ui.WINDOW_QUERY = 2;
 qwebirc.ui.WINDOW_CHANNEL = 3;
 qwebirc.ui.WINDOW_CUSTOM = 4;
 qwebirc.ui.WINDOW_CONNECT = 5;
+qwebirc.ui.WINDOW_MESSAGES = 6;
 qwebirc.ui.CUSTOM_CLIENT = "custom";
 
 qwebirc.ui.BaseUI = new Class({
@@ -15,6 +16,7 @@ qwebirc.ui.BaseUI = new Class({
     this.setOptions(options);
     
     this.windows = {};
+    this.clients = {};
     this.windows[qwebirc.ui.CUSTOM_CLIENT] = {};
     this.windowArray = [];
     this.windowClass = windowClass;
@@ -23,9 +25,14 @@ qwebirc.ui.BaseUI = new Class({
     this.parentElement.addClass("qwebirc-" + uiName);
     this.firstClient = false;
     this.commandhistory = new qwebirc.irc.CommandHistory();
+    this.clientId = 0;
   },
   newClient: function(client) {
-    this.windows[client] = {}
+    client.id = this.clientId++;
+    client.hilightController = new qwebirc.ui.HilightController(client);
+    
+    this.windows[client.id] = {}
+    this.clients[client.id] = client;
     var w = this.newWindow(client, qwebirc.ui.WINDOW_STATUS, "Status");
     this.selectWindow(w);
     if(!this.firstClient) {
@@ -37,19 +44,48 @@ qwebirc.ui.BaseUI = new Class({
     }
     return w;
   },
-  newWindow: function(client, type, name) {
-    var identifier = name;
+  getClientId: function(client) {
+    if(client == qwebirc.ui.CUSTOM_CLIENT) {
+      return qwebirc.ui.CUSTOM_CLIENT;
+    } else {
+      return client.id;
+    }
+  },
+  getWindowIdentifier: function(type, name) {
+    if(type == qwebirc.ui.WINDOW_MESSAGES)
+      return "-M";
     if(type == qwebirc.ui.WINDOW_STATUS)
-      identifier = "";
+      return "";
+    return "_" + name.toIRCLower();
+  },
+  newWindow: function(client, type, name) {
+    var w = this.getWindow(client, type, name);
+    if($defined(w))
+      return w;
       
-    var w = this.windows[client][identifier] = new this.windowClass(this, client, type, name, identifier);
+    var wId = this.getWindowIdentifier(type, name);
+    var w = this.windows[this.getClientId(client)][wId] = new this.windowClass(this, client, type, name, wId);
     this.windowArray.push(w);
     
     return w;
   },
+  getWindow: function(client, type, name) {
+    var c = this.windows[this.getClientId(client)];
+    if(!$defined(c))
+      return null;
+      
+    return c[this.getWindowIdentifier(type, name)];
+  },
   getActiveWindow: function() {
     return this.active;
   },
+  getActiveIRCWindow: function(client) {
+    if(!this.active || this.active.type == qwebirc.ui.WINDOW_CUSTOM) {
+      return this.windows[this.getClientId(client)][this.getWindowIdentifier(qwebirc.ui.WINDOW_STATUS)];
+    } else {
+      return this.active;
+    }
+  },  
   __setActiveWindow: function(window) {
     this.active = window;
   },
@@ -59,6 +95,29 @@ qwebirc.ui.BaseUI = new Class({
     window.select();  /* calls setActiveWindow */
     document.title = window.name + " - " + this.options.appTitle;
   },
+  nextWindow: function(direction) {
+    if(this.windowArray.length == 0 || !this.active)
+      return;
+      
+    if(!direction)
+      direction = 1;
+      
+    var index = this.windowArray.indexOf(this.active);
+    if(index == -1)
+      return;
+      
+    index = index + direction;
+    if(index < 0) {
+      index = this.windowArray.length - 1;
+    } else if(index >= this.windowArray.length) {
+      index = 0;
+    }
+    
+    this.selectWindow(this.windowArray[index]);
+  },
+  prevWindow: function() {
+    this.nextWindow(-1);
+  },
   __closed: function(window) {
     if(window.active) {
       this.active = undefined;
@@ -77,7 +136,7 @@ qwebirc.ui.BaseUI = new Class({
     }
     
     this.windowArray = this.windowArray.erase(window);
-    delete this.windows[window.client][window.identifier];
+    delete this.windows[this.getClientId(window.client)][window.identifier];
   },
     /*
       this shouldn't be called by overriding classes!
@@ -95,20 +154,33 @@ qwebirc.ui.StandardUI = new Class({
   Extends: qwebirc.ui.BaseUI,
   initialize: function(parentElement, windowClass, uiName, options) {
     this.parent(parentElement, windowClass, uiName, options);
+
+    this.tabCompleter = new qwebirc.ui.TabCompleterFactory(this);
+    this.uiOptions = new qwebirc.ui.DefaultOptionsClass(this);
+    this.customWindows = {};
+    
     window.addEvent("keydown", function(x) {
       if(!x.alt || x.control)
         return;
         
+      var success = false;
       if(x.key == "a" || x.key == "A") {
+        var highestNum = 0;
+        var highestIndex = -1;
+        success = true;
+        
         new Event(x).stop();
         for(var i=0;i<this.windowArray.length;i++) {
-          if(this.windowArray[i].hilighted) {
-            this.selectWindow(this.windowArray[i]);
-            break;
+          var h = this.windowArray[i].hilighted;
+          if(h > highestNum) {
+            highestIndex = i;
+            highestNum = h;
           }
         }
+        if(highestIndex > -1)
+          this.selectWindow(this.windowArray[highestIndex]);
       } else if(x.key >= '0' && x.key <= '9') {
-        new Event(x).stop();
+        success = true;
         
         number = x.key - '0';
         if(number == 0)
@@ -120,7 +192,15 @@ qwebirc.ui.StandardUI = new Class({
           return;
           
         this.selectWindow(this.windowArray[number]);
+      } else if(x.key == "left") {
+        this.prevWindow();
+        success = true;
+      } else if(x.key == "right") {
+        this.nextWindow();
+        success = true;
       }
+      if(success)
+        new Event(x).stop();      
     }.bind(this));
   },
   newCustomWindow: function(name, select, type) {
@@ -129,7 +209,7 @@ qwebirc.ui.StandardUI = new Class({
       
     var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
     w.addEvent("close", function(w) {
-      delete this.windows[name];
+      delete this.windows[qwebirc.ui.CUSTOM_CLIENT][w.identifier];
     }.bind(this));
     
     if(select)
@@ -137,40 +217,116 @@ qwebirc.ui.StandardUI = new Class({
 
     return w;
   },
-  embeddedWindow: function() {
-    if(this.embedded) {
-      this.selectWindow(this.embedded)
+  addCustomWindow: function(windowName, class_, cssClass, options) {
+    if(!$defined(options))
+      options = {};
+      
+    if(this.customWindows[windowName]) {
+      this.selectWindow(this.customWindows[windowName]);
       return;
     }
     
-    this.embedded = this.newCustomWindow("Embedding wizard", true);
-    this.embedded.addEvent("close", function() {
-      this.embedded = null;
+    var d = this.newCustomWindow(windowName, true);
+    this.customWindows[windowName] = d;
+    
+    d.addEvent("close", function() {
+      this.customWindows[windowName] = null;
     }.bind(this));
         
-    var ew = new qwebirc.ui.EmbedWizard({parent: this.embedded.lines});
+    if(cssClass)
+      d.lines.addClass("qwebirc-" + cssClass);
+      
+    var ew = new class_(d.lines, options);
     ew.addEvent("close", function() {
-      this.embedded.close();
+      d.close();
     }.bind(this));
   },
+  embeddedWindow: function() {
+    this.addCustomWindow("Embedded Wizard", qwebirc.ui.EmbedWizard, "embeddedwizard");
+  },
+  optionsWindow: function() {
+    this.addCustomWindow("Options", qwebirc.ui.OptionsPane, "optionspane", this.uiOptions);
+  },
+  aboutWindow: function() {
+    this.addCustomWindow("About", qwebirc.ui.AboutPane, "aboutpane", this.uiOptions);
+  },
   urlDispatcher: function(name) {
     if(name == "embedded")
-      return this.embeddedWindow.bind(this);
+      return ["a", this.embeddedWindow.bind(this)];
+      
+    if(name == "options")
+      return ["a", this.optionsWindow.bind(this)];
 
     return null;
+  },
+  tabComplete: function(element) {
+    this.tabCompleter.tabComplete(element);
+  },
+  resetTabComplete: function() {
+    this.tabCompleter.reset();
   }
 });
 
-qwebirc.ui.QuakeNetUI = new Class({
+qwebirc.ui.SoundUI = new Class({
   Extends: qwebirc.ui.StandardUI,
+  initialize: function(parentElement, windowClass, uiName, options) {
+    this.parent(parentElement, windowClass, uiName, options);
+    
+    this.soundInited = false;
+    this.soundReady = false;
+    
+    this.setBeepOnMention(this.uiOptions.BEEP_ON_MENTION);    
+  },
+  soundInit: function() {
+    if(this.soundInited)
+      return;
+    if(!$defined(Browser.Plugins.Flash) || Browser.Plugins.Flash.version < 8)
+      return;
+    this.soundInited = true;
+    
+    this.soundPlayer = new qwebirc.sound.SoundPlayer();
+    this.soundPlayer.addEvent("ready", function() {
+      this.soundReady = true;
+    }.bind(this));
+    this.soundPlayer.go();
+  },
+  setBeepOnMention: function(value) {
+    if(value)
+      this.soundInit();
+    this.beepOnMention = value;
+  },
+  beep: function() {
+    if(!this.soundReady || !this.beepOnMention)
+      return;
+      
+    this.soundPlayer.beep();
+  }
+});
+
+qwebirc.ui.QuakeNetUI = new Class({
+  Extends: qwebirc.ui.SoundUI,
   urlDispatcher: function(name, window) {
     if(name == "qwhois") {
-      return function(auth) {
+      return ["span", function(auth) {
         this.client.exec("/MSG Q whois #" + auth);
-      }.bind(window);
+      }.bind(window)];
+    }
+    if(name == "whois") {
+      return ["span", function(nick) {
+        this.client.exec("/WHOIS " + nick);
+      }.bind(window)];
     }
-    
     return this.parent(name);
+  },
+  logout: function() {
+    if(!qwebirc.auth.loggedin())
+      return;
+    if(confirm("Log out?")) {
+      for(var client in this.clients) {
+        this.clients[client].quit("Logged out");
+      };
+      document.location = "/auth?logout=1";
+    }
   }
 });
 
@@ -178,6 +334,7 @@ qwebirc.ui.NewLoginUI = new Class({
   Extends: qwebirc.ui.QuakeNetUI,
   loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
     this.postInitialize();
+
     var w = this.newCustomWindow("Connect", true, qwebirc.ui.WINDOW_CONNECT);
     var callback = function(args) {
       w.close();