]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/ui/baseui.js
Colours now use CSS.
[irc/quakenet/qwebirc.git] / js / ui / baseui.js
1 qwebirc.ui.WINDOW_STATUS = 1;
2 qwebirc.ui.WINDOW_QUERY = 2;
3 qwebirc.ui.WINDOW_CHANNEL = 3;
4 qwebirc.ui.WINDOW_CUSTOM = 4;
5 qwebirc.ui.WINDOW_CONNECT = 5;
6 qwebirc.ui.WINDOW_MESSAGES = 6;
7 qwebirc.ui.CUSTOM_CLIENT = "custom";
8
9 qwebirc.ui.BaseUI = new Class({
10 Implements: [Events],
11 initialize: function(parentElement, windowClass, uiName, options) {
12 this.options = options;
13
14 this.windows = {};
15 this.clients = {};
16 this.windows[qwebirc.ui.CUSTOM_CLIENT] = {};
17 this.windowArray = [];
18 this.windowClass = windowClass;
19 this.parentElement = parentElement;
20 this.parentElement.addClass("qwebirc");
21 this.parentElement.addClass("qwebirc-" + uiName);
22 this.firstClient = false;
23 this.commandhistory = new qwebirc.irc.CommandHistory();
24 this.clientId = 0;
25 },
26 newClient: function(client) {
27 client.id = this.clientId++;
28 client.hilightController = new qwebirc.ui.HilightController(client);
29
30 this.windows[client.id] = {}
31 this.clients[client.id] = client;
32 var w = this.newWindow(client, qwebirc.ui.WINDOW_STATUS, "Status");
33 this.selectWindow(w);
34 if(!this.firstClient) {
35 this.firstClient = true;
36 w.addLine("", "qwebirc v" + qwebirc.VERSION);
37 w.addLine("", "Copyright (C) 2008 Chris Porter. All rights reserved.");
38 w.addLine("", "http://webchat.quakenet.org/");
39 w.addLine("", "This is BETA quality software, please report bugs to slug@quakenet.org");
40 }
41 return w;
42 },
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 },
50 getWindowIdentifier: function(type, name) {
51 if(type == qwebirc.ui.WINDOW_MESSAGES)
52 return "-M";
53 if(type == qwebirc.ui.WINDOW_STATUS)
54 return "";
55 return "_" + name.toIRCLower();
56 },
57 newWindow: function(client, type, name) {
58 var w = this.getWindow(client, type, name);
59 if($defined(w))
60 return w;
61
62 var wId = this.getWindowIdentifier(type, name);
63 var w = this.windows[this.getClientId(client)][wId] = new this.windowClass(this, client, type, name, wId);
64 this.windowArray.push(w);
65
66 return w;
67 },
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 },
75 getActiveWindow: function() {
76 return this.active;
77 },
78 getActiveIRCWindow: function(client) {
79 if(!this.active || this.active.type == qwebirc.ui.WINDOW_CUSTOM) {
80 return this.windows[this.getClientId(client)][this.getWindowIdentifier(qwebirc.ui.WINDOW_STATUS)];
81 } else {
82 return this.active;
83 }
84 },
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 */
92 document.title = window.name + " - " + this.options.appTitle;
93 },
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 },
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);
124 if(index == -1) {
125 return;
126 } else if(index == 0) {
127 this.selectWindow(this.windowArray[1]);
128 } else {
129 this.selectWindow(this.windowArray[index - 1]);
130 }
131 }
132 }
133
134 this.windowArray = this.windowArray.erase(window);
135 delete this.windows[this.getClientId(window.client)][window.identifier];
136 },
137 /*
138 this shouldn't be called by overriding classes!
139 they should implement their own!
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 */
144 loginBox: function(callback, initialNickname, initialChannels, autoConnect, autoNick) {
145 qwebirc.ui.GenericLoginBox(this.parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
146 }
147 });
148
149 qwebirc.ui.StandardUI = new Class({
150 Extends: qwebirc.ui.BaseUI,
151 initialize: function(parentElement, windowClass, uiName, options) {
152 this.parent(parentElement, windowClass, uiName, options);
153
154 this.tabCompleter = new qwebirc.ui.TabCompleterFactory(this);
155 this.uiOptions = new qwebirc.ui.DefaultOptionsClass(this);
156 this.customWindows = {};
157
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;
184 }
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
194
195 number = number - 1;
196
197 if(number >= this.windowArray.length)
198 return;
199
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) {
212 return $$("input").indexOf(x.target) > -1;
213 },
214 newCustomWindow: function(name, select, type) {
215 if(!type)
216 type = qwebirc.ui.WINDOW_CUSTOM;
217
218 var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
219 w.addEvent("close", function(w) {
220 delete this.windows[qwebirc.ui.CUSTOM_CLIENT][w.identifier];
221 }.bind(this));
222
223 if(select)
224 this.selectWindow(w);
225
226 return w;
227 },
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]);
234 return;
235 }
236
237 var d = this.newCustomWindow(windowName, true);
238 this.customWindows[windowName] = d;
239
240 d.addEvent("close", function() {
241 this.customWindows[windowName] = null;
242 }.bind(this));
243
244 if(cssClass)
245 d.lines.addClass("qwebirc-" + cssClass);
246
247 var ew = new class_(d.lines, options);
248 ew.addEvent("close", function() {
249 d.close();
250 }.bind(this));
251 },
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 },
258 aboutWindow: function() {
259 this.addCustomWindow("About", qwebirc.ui.AboutPane, "aboutpane", this.uiOptions);
260 },
261 urlDispatcher: function(name) {
262 if(name == "embedded")
263 return ["a", this.embeddedWindow.bind(this)];
264
265 if(name == "options")
266 return ["a", this.optionsWindow.bind(this)];
267
268 return null;
269 },
270 tabComplete: function(element) {
271 this.tabCompleter.tabComplete(element);
272 },
273 resetTabComplete: function() {
274 this.tabCompleter.reset();
275 }
276 });
277
278 qwebirc.ui.SoundUI = new Class({
279 Extends: qwebirc.ui.StandardUI,
280 initialize: function(parentElement, windowClass, uiName, options) {
281 this.parent(parentElement, windowClass, uiName, options);
282
283 this.soundInited = false;
284 this.soundReady = false;
285
286 this.setBeepOnMention(this.uiOptions.BEEP_ON_MENTION);
287 },
288 soundInit: function() {
289 if(this.soundInited)
290 return;
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();
300 },
301 setBeepOnMention: function(value) {
302 if(value)
303 this.soundInit();
304 this.beepOnMention = value;
305 },
306 beep: function() {
307 if(!this.soundReady || !this.beepOnMention)
308 return;
309
310 this.soundPlayer.beep();
311 }
312 });
313
314 qwebirc.ui.QuakeNetUI = new Class({
315 Extends: qwebirc.ui.SoundUI,
316 urlDispatcher: function(name, window) {
317 if(name == "qwhois") {
318 return ["span", function(auth) {
319 this.client.exec("/MSG Q whois #" + auth);
320 }.bind(window)];
321 }
322 if(name == "whois") {
323 return ["span", function(nick) {
324 this.client.exec("/WHOIS " + nick);
325 }.bind(window)];
326 }
327 return this.parent(name);
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 }
338 }
339 });
340
341 qwebirc.ui.NewLoginUI = new Class({
342 Extends: qwebirc.ui.QuakeNetUI,
343 loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
344 this.postInitialize();
345
346 var w = this.newCustomWindow("Connect", true, qwebirc.ui.WINDOW_CONNECT);
347 var callback = function(args) {
348 w.close();
349 callbackfn(args);
350 };
351
352 qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
353 }
354 });