]> jfr.im git - irc/quakenet/qwebirc.git/blobdiff - js/ui/baseui.js
Colours now use CSS.
[irc/quakenet/qwebirc.git] / js / ui / baseui.js
index 9b6a4bc066192d507760d340677682f09517aa6e..52b148c0d879bdb4d839ce19c1090ea4184ab25b 100644 (file)
@@ -3,16 +3,13 @@ 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({
-  Implements: [Events, Options],
-  options: {
-    appTitle: "QuakeNet Web IRC",
-    singleWindow: true
-  },
+  Implements: [Events],
   initialize: function(parentElement, windowClass, uiName, options) {
-    this.setOptions(options);
+    this.options = options;
     
     this.windows = {};
     this.clients = {};
@@ -50,22 +47,37 @@ qwebirc.ui.BaseUI = new Class({
       return client.id;
     }
   },
-  newWindow: function(client, type, name) {
-    var identifier = name;
+  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[this.getClientId(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)][""];
+      return this.windows[this.getClientId(client)][this.getWindowIdentifier(qwebirc.ui.WINDOW_STATUS)];
     } else {
       return this.active;
     }
@@ -130,7 +142,7 @@ 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);
+    qwebirc.ui.GenericLoginBox(this.parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
   }
 });
 
@@ -140,52 +152,64 @@ qwebirc.ui.StandardUI = new Class({
     this.parent(parentElement, windowClass, uiName, options);
 
     this.tabCompleter = new qwebirc.ui.TabCompleterFactory(this);
-    this.uiOptions = new qwebirc.ui.DefaultOptionsClass();
+    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++) {
-          var h = this.windowArray[i].hilighted;
-          if(h > highestNum) {
-            highestIndex = i;
-            highestNum = h;
-          }
+    if(Browser.Engine.trident) {
+      ev = "keydown";
+    } else {
+      ev = "keypress";
+    }
+    document.addEvent(ev, this.__handleHotkey.bind(this));
+  },
+  __handleHotkey: function(x) {
+    if(!x.alt || x.control) {
+      if(x.key == "backspace" || x.key == "/")
+        if(!this.getInputFocused(x))
+          new Event(x).stop();
+      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++) {
+        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') {
-        success = true;
+      }
+      if(highestIndex > -1)
+        this.selectWindow(this.windowArray[highestIndex]);
+    } else if(x.key >= '0' && x.key <= '9') {
+      success = true;
+      
+      number = x.key - '0';
+      if(number == 0)
+        number = 10
         
-        number = x.key - '0';
-        if(number == 0)
-          number = 10
-          
-        number = number - 1;
+      number = number - 1;
+      
+      if(number >= this.windowArray.length)
+        return;
         
-        if(number >= this.windowArray.length)
-          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));
+      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();
+  },
+  getInputFocused: function(x) {
+    return $$("input").indexOf(x.target) > -1;
   },
   newCustomWindow: function(name, select, type) {
     if(!type)
@@ -193,7 +217,7 @@ qwebirc.ui.StandardUI = new Class({
       
     var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
     w.addEvent("close", function(w) {
-      delete this.windows[qwebirc.ui.CUSTOM_CLIENT][name];
+      delete this.windows[qwebirc.ui.CUSTOM_CLIENT][w.identifier];
     }.bind(this));
     
     if(select)
@@ -218,7 +242,7 @@ qwebirc.ui.StandardUI = new Class({
     }.bind(this));
         
     if(cssClass)
-      d.lines.addClass(cssClass);
+      d.lines.addClass("qwebirc-" + cssClass);
       
     var ew = new class_(d.lines, options);
     ew.addEvent("close", function() {
@@ -231,6 +255,9 @@ qwebirc.ui.StandardUI = new Class({
   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 ["a", this.embeddedWindow.bind(this)];
@@ -248,8 +275,44 @@ qwebirc.ui.StandardUI = new Class({
   }
 });
 
-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 ["span", function(auth) {
@@ -286,6 +349,6 @@ qwebirc.ui.NewLoginUI = new Class({
       callbackfn(args);
     };
     
-    qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick);
+    qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
   }
 });