]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/ui/baseui.js
Colours now use CSS.
[irc/quakenet/qwebirc.git] / js / ui / baseui.js
CommitLineData
e20e5a6b
CP
1qwebirc.ui.WINDOW_STATUS = 1;
2qwebirc.ui.WINDOW_QUERY = 2;
3qwebirc.ui.WINDOW_CHANNEL = 3;
4qwebirc.ui.WINDOW_CUSTOM = 4;
5qwebirc.ui.WINDOW_CONNECT = 5;
f74802c5 6qwebirc.ui.WINDOW_MESSAGES = 6;
e20e5a6b 7qwebirc.ui.CUSTOM_CLIENT = "custom";
9e769c12 8
e20e5a6b 9qwebirc.ui.BaseUI = new Class({
2cad083e 10 Implements: [Events],
a59dc700 11 initialize: function(parentElement, windowClass, uiName, options) {
2cad083e 12 this.options = options;
a59dc700 13
9e769c12 14 this.windows = {};
ffbb638d 15 this.clients = {};
e20e5a6b 16 this.windows[qwebirc.ui.CUSTOM_CLIENT] = {};
9e769c12
CP
17 this.windowArray = [];
18 this.windowClass = windowClass;
19 this.parentElement = parentElement;
20 this.parentElement.addClass("qwebirc");
21 this.parentElement.addClass("qwebirc-" + uiName);
e8db8558 22 this.firstClient = false;
e20e5a6b 23 this.commandhistory = new qwebirc.irc.CommandHistory();
ffbb638d 24 this.clientId = 0;
9e769c12
CP
25 },
26 newClient: function(client) {
ffbb638d 27 client.id = this.clientId++;
96f28062
CP
28 client.hilightController = new qwebirc.ui.HilightController(client);
29
ffbb638d
CP
30 this.windows[client.id] = {}
31 this.clients[client.id] = client;
e20e5a6b 32 var w = this.newWindow(client, qwebirc.ui.WINDOW_STATUS, "Status");
9e769c12 33 this.selectWindow(w);
e8db8558
CP
34 if(!this.firstClient) {
35 this.firstClient = true;
e20e5a6b 36 w.addLine("", "qwebirc v" + qwebirc.VERSION);
4094890f 37 w.addLine("", "Copyright (C) 2008 Chris Porter. All rights reserved.");
e8db8558 38 w.addLine("", "http://webchat.quakenet.org/");
4094890f 39 w.addLine("", "This is BETA quality software, please report bugs to slug@quakenet.org");
e8db8558 40 }
9e769c12
CP
41 return w;
42 },
ffbb638d
CP
43 getClientId: function(client) {
44 if(client == qwebirc.ui.CUSTOM_CLIENT) {
45 return qwebirc.ui.CUSTOM_CLIENT;
46 } else {
47 return client.id;
48 }
49 },
f74802c5
CP
50 getWindowIdentifier: function(type, name) {
51 if(type == qwebirc.ui.WINDOW_MESSAGES)
52 return "-M";
e20e5a6b 53 if(type == qwebirc.ui.WINDOW_STATUS)
f74802c5 54 return "";
26c81b65 55 return "_" + name.toIRCLower();
f74802c5
CP
56 },
57 newWindow: function(client, type, name) {
58 var w = this.getWindow(client, type, name);
59 if($defined(w))
60 return w;
9e769c12 61
f74802c5
CP
62 var wId = this.getWindowIdentifier(type, name);
63 var w = this.windows[this.getClientId(client)][wId] = new this.windowClass(this, client, type, name, wId);
9e769c12
CP
64 this.windowArray.push(w);
65
66 return w;
67 },
f74802c5
CP
68 getWindow: function(client, type, name) {
69 var c = this.windows[this.getClientId(client)];
70 if(!$defined(c))
71 return null;
72
73 return c[this.getWindowIdentifier(type, name)];
74 },
9e769c12
CP
75 getActiveWindow: function() {
76 return this.active;
77 },
1d42a76f
CP
78 getActiveIRCWindow: function(client) {
79 if(!this.active || this.active.type == qwebirc.ui.WINDOW_CUSTOM) {
f74802c5 80 return this.windows[this.getClientId(client)][this.getWindowIdentifier(qwebirc.ui.WINDOW_STATUS)];
1d42a76f
CP
81 } else {
82 return this.active;
83 }
84 },
9e769c12
CP
85 __setActiveWindow: function(window) {
86 this.active = window;
87 },
88 selectWindow: function(window) {
89 if(this.active)
90 this.active.deselect();
91 window.select(); /* calls setActiveWindow */
a59dc700 92 document.title = window.name + " - " + this.options.appTitle;
9e769c12 93 },
ff4befd8
CP
94 nextWindow: function(direction) {
95 if(this.windowArray.length == 0 || !this.active)
96 return;
97
98 if(!direction)
99 direction = 1;
100
101 var index = this.windowArray.indexOf(this.active);
102 if(index == -1)
103 return;
104
105 index = index + direction;
106 if(index < 0) {
107 index = this.windowArray.length - 1;
108 } else if(index >= this.windowArray.length) {
109 index = 0;
110 }
111
112 this.selectWindow(this.windowArray[index]);
113 },
114 prevWindow: function() {
115 this.nextWindow(-1);
116 },
9e769c12
CP
117 __closed: function(window) {
118 if(window.active) {
119 this.active = undefined;
120 if(this.windowArray.length == 1) {
121 this.windowArray = [];
122 } else {
123 var index = this.windowArray.indexOf(window);
6f2e4a37
CP
124 if(index == -1) {
125 return;
126 } else if(index == 0) {
9e769c12
CP
127 this.selectWindow(this.windowArray[1]);
128 } else {
129 this.selectWindow(this.windowArray[index - 1]);
130 }
9e769c12
CP
131 }
132 }
133
404cfb58 134 this.windowArray = this.windowArray.erase(window);
ffbb638d 135 delete this.windows[this.getClientId(window.client)][window.identifier];
eb9b087b 136 },
eb9b087b
CP
137 /*
138 this shouldn't be called by overriding classes!
66de775f 139 they should implement their own!
eb9b087b
CP
140 some form of user input MUST be received before an
141 IRC connection is made, else users are going to get
142 tricked into getting themselves glined
143 */
66de775f 144 loginBox: function(callback, initialNickname, initialChannels, autoConnect, autoNick) {
2cad083e 145 qwebirc.ui.GenericLoginBox(this.parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
9e769c12
CP
146 }
147});
381fddfd 148
e20e5a6b
CP
149qwebirc.ui.StandardUI = new Class({
150 Extends: qwebirc.ui.BaseUI,
381fddfd
CP
151 initialize: function(parentElement, windowClass, uiName, options) {
152 this.parent(parentElement, windowClass, uiName, options);
3184781b
CP
153
154 this.tabCompleter = new qwebirc.ui.TabCompleterFactory(this);
fb71087a 155 this.uiOptions = new qwebirc.ui.DefaultOptionsClass(this);
ebb21d2e
CP
156 this.customWindows = {};
157
20157c51
CP
158 if(Browser.Engine.trident) {
159 ev = "keydown";
160 } else {
161 ev = "keypress";
162 }
163 document.addEvent(ev, this.__handleHotkey.bind(this));
164 },
165 __handleHotkey: function(x) {
166 if(!x.alt || x.control) {
167 if(x.key == "backspace" || x.key == "/")
168 if(!this.getInputFocused(x))
169 new Event(x).stop();
170 return;
171 }
172 var success = false;
173 if(x.key == "a" || x.key == "A") {
174 var highestNum = 0;
175 var highestIndex = -1;
176 success = true;
177
178 new Event(x).stop();
179 for(var i=0;i<this.windowArray.length;i++) {
180 var h = this.windowArray[i].hilighted;
181 if(h > highestNum) {
182 highestIndex = i;
183 highestNum = h;
381fddfd 184 }
20157c51
CP
185 }
186 if(highestIndex > -1)
187 this.selectWindow(this.windowArray[highestIndex]);
188 } else if(x.key >= '0' && x.key <= '9') {
189 success = true;
190
191 number = x.key - '0';
192 if(number == 0)
193 number = 10
424608ac 194
20157c51
CP
195 number = number - 1;
196
197 if(number >= this.windowArray.length)
198 return;
381fddfd 199
20157c51
CP
200 this.selectWindow(this.windowArray[number]);
201 } else if(x.key == "left") {
202 this.prevWindow();
203 success = true;
204 } else if(x.key == "right") {
205 this.nextWindow();
206 success = true;
207 }
208 if(success)
209 new Event(x).stop();
210 },
211 getInputFocused: function(x) {
96a805a2 212 return $$("input").indexOf(x.target) > -1;
841a451d 213 },
8af49135
CP
214 newCustomWindow: function(name, select, type) {
215 if(!type)
e20e5a6b 216 type = qwebirc.ui.WINDOW_CUSTOM;
8af49135 217
e20e5a6b 218 var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
8af49135 219 w.addEvent("close", function(w) {
f74802c5 220 delete this.windows[qwebirc.ui.CUSTOM_CLIENT][w.identifier];
8af49135
CP
221 }.bind(this));
222
223 if(select)
224 this.selectWindow(w);
6c19eb8f 225
8af49135
CP
226 return w;
227 },
ebb21d2e
CP
228 addCustomWindow: function(windowName, class_, cssClass, options) {
229 if(!$defined(options))
230 options = {};
231
232 if(this.customWindows[windowName]) {
233 this.selectWindow(this.customWindows[windowName]);
8af49135 234 return;
841a451d 235 }
8af49135 236
ebb21d2e
CP
237 var d = this.newCustomWindow(windowName, true);
238 this.customWindows[windowName] = d;
239
240 d.addEvent("close", function() {
241 this.customWindows[windowName] = null;
8af49135
CP
242 }.bind(this));
243
ebb21d2e 244 if(cssClass)
e1a91a8a 245 d.lines.addClass("qwebirc-" + cssClass);
ebb21d2e
CP
246
247 var ew = new class_(d.lines, options);
8af49135 248 ew.addEvent("close", function() {
ebb21d2e 249 d.close();
8af49135 250 }.bind(this));
841a451d 251 },
ebb21d2e
CP
252 embeddedWindow: function() {
253 this.addCustomWindow("Embedded Wizard", qwebirc.ui.EmbedWizard, "embeddedwizard");
254 },
255 optionsWindow: function() {
256 this.addCustomWindow("Options", qwebirc.ui.OptionsPane, "optionspane", this.uiOptions);
257 },
e1a91a8a
CP
258 aboutWindow: function() {
259 this.addCustomWindow("About", qwebirc.ui.AboutPane, "aboutpane", this.uiOptions);
260 },
8af49135
CP
261 urlDispatcher: function(name) {
262 if(name == "embedded")
925fc357 263 return ["a", this.embeddedWindow.bind(this)];
ebb21d2e
CP
264
265 if(name == "options")
266 return ["a", this.optionsWindow.bind(this)];
8af49135
CP
267
268 return null;
3184781b
CP
269 },
270 tabComplete: function(element) {
271 this.tabCompleter.tabComplete(element);
272 },
273 resetTabComplete: function() {
274 this.tabCompleter.reset();
8af49135 275 }
381fddfd 276});
6f2e4a37 277
fb71087a 278qwebirc.ui.SoundUI = new Class({
e20e5a6b 279 Extends: qwebirc.ui.StandardUI,
fb71087a
CP
280 initialize: function(parentElement, windowClass, uiName, options) {
281 this.parent(parentElement, windowClass, uiName, options);
282
127631e0 283 this.soundInited = false;
fb71087a 284 this.soundReady = false;
fb71087a 285
127631e0 286 this.setBeepOnMention(this.uiOptions.BEEP_ON_MENTION);
fb71087a 287 },
127631e0
CP
288 soundInit: function() {
289 if(this.soundInited)
fb71087a 290 return;
127631e0
CP
291 if(!$defined(Browser.Plugins.Flash) || Browser.Plugins.Flash.version < 8)
292 return;
293 this.soundInited = true;
294
295 this.soundPlayer = new qwebirc.sound.SoundPlayer();
296 this.soundPlayer.addEvent("ready", function() {
297 this.soundReady = true;
298 }.bind(this));
299 this.soundPlayer.go();
fb71087a 300 },
127631e0
CP
301 setBeepOnMention: function(value) {
302 if(value)
303 this.soundInit();
304 this.beepOnMention = value;
305 },
306 beep: function() {
307 if(!this.soundReady || !this.beepOnMention)
fb71087a 308 return;
127631e0
CP
309
310 this.soundPlayer.beep();
fb71087a
CP
311 }
312});
313
314qwebirc.ui.QuakeNetUI = new Class({
315 Extends: qwebirc.ui.SoundUI,
2cd9e32d
CP
316 urlDispatcher: function(name, window) {
317 if(name == "qwhois") {
7cb09779 318 return ["span", function(auth) {
2cd9e32d 319 this.client.exec("/MSG Q whois #" + auth);
925fc357
CP
320 }.bind(window)];
321 }
322 if(name == "whois") {
323 return ["span", function(nick) {
324 this.client.exec("/WHOIS " + nick);
325 }.bind(window)];
2cd9e32d 326 }
2cd9e32d 327 return this.parent(name);
ffbb638d
CP
328 },
329 logout: function() {
330 if(!qwebirc.auth.loggedin())
331 return;
332 if(confirm("Log out?")) {
333 for(var client in this.clients) {
334 this.clients[client].quit("Logged out");
335 };
336 document.location = "/auth?logout=1";
337 }
2cd9e32d
CP
338 }
339});
340
341qwebirc.ui.NewLoginUI = new Class({
342 Extends: qwebirc.ui.QuakeNetUI,
6f2e4a37
CP
343 loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
344 this.postInitialize();
c38a0240 345
e20e5a6b 346 var w = this.newCustomWindow("Connect", true, qwebirc.ui.WINDOW_CONNECT);
6f2e4a37
CP
347 var callback = function(args) {
348 w.close();
349 callbackfn(args);
350 };
351
2cad083e 352 qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
6f2e4a37
CP
353 }
354});