]> jfr.im git - irc/quakenet/qwebirc.git/blob - js/ui/baseui.js
7577e35fcc1924d6a5a020fc1cb9786bcc3e7ba8
[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-2009 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 UICommands: qwebirc.ui.UI_COMMANDS,
152 initialize: function(parentElement, windowClass, uiName, options) {
153 this.parent(parentElement, windowClass, uiName, options);
154
155 this.tabCompleter = new qwebirc.ui.TabCompleterFactory(this);
156 this.uiOptions = new qwebirc.ui.DefaultOptionsClass(this);
157 this.customWindows = {};
158
159 var ev;
160 if(Browser.Engine.trident) {
161 ev = "keydown";
162 } else {
163 ev = "keypress";
164 }
165 document.addEvent(ev, this.__handleHotkey.bind(this));
166 },
167 __handleHotkey: function(x) {
168 if(!x.alt || x.control) {
169 if(x.key == "backspace" || x.key == "/")
170 if(!this.getInputFocused(x))
171 new Event(x).stop();
172 return;
173 }
174 var success = false;
175 if(x.key == "a" || x.key == "A") {
176 var highestNum = 0;
177 var highestIndex = -1;
178 success = true;
179
180 new Event(x).stop();
181 for(var i=0;i<this.windowArray.length;i++) {
182 var h = this.windowArray[i].hilighted;
183 if(h > highestNum) {
184 highestIndex = i;
185 highestNum = h;
186 }
187 }
188 if(highestIndex > -1)
189 this.selectWindow(this.windowArray[highestIndex]);
190 } else if(x.key >= '0' && x.key <= '9') {
191 success = true;
192
193 number = x.key - '0';
194 if(number == 0)
195 number = 10
196
197 number = number - 1;
198
199 if(number >= this.windowArray.length)
200 return;
201
202 this.selectWindow(this.windowArray[number]);
203 } else if(x.key == "left") {
204 this.prevWindow();
205 success = true;
206 } else if(x.key == "right") {
207 this.nextWindow();
208 success = true;
209 }
210 if(success)
211 new Event(x).stop();
212 },
213 getInputFocused: function(x) {
214 if($$("input").indexOf(x.target) == -1 && $$("textarea").indexOf(x.target) == -1)
215 return false;
216 return true;
217 },
218 newCustomWindow: function(name, select, type) {
219 if(!type)
220 type = qwebirc.ui.WINDOW_CUSTOM;
221
222 var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
223 w.addEvent("close", function(w) {
224 delete this.windows[qwebirc.ui.CUSTOM_CLIENT][w.identifier];
225 }.bind(this));
226
227 if(select)
228 this.selectWindow(w);
229
230 return w;
231 },
232 addCustomWindow: function(windowName, class_, cssClass, options) {
233 if(!$defined(options))
234 options = {};
235
236 if(this.customWindows[windowName]) {
237 this.selectWindow(this.customWindows[windowName]);
238 return;
239 }
240
241 var d = this.newCustomWindow(windowName, true);
242 this.customWindows[windowName] = d;
243
244 d.addEvent("close", function() {
245 this.customWindows[windowName] = null;
246 }.bind(this));
247
248 if(cssClass)
249 d.lines.addClass("qwebirc-" + cssClass);
250
251 var ew = new class_(d.lines, options);
252 ew.addEvent("close", function() {
253 d.close();
254 }.bind(this));
255
256 d.setSubWindow(ew);
257 },
258 embeddedWindow: function() {
259 this.addCustomWindow("Embedding wizard", qwebirc.ui.EmbedWizard, "embeddedwizard");
260 },
261 optionsWindow: function() {
262 this.addCustomWindow("Options", qwebirc.ui.OptionsPane, "optionspane", this.uiOptions);
263 },
264 aboutWindow: function() {
265 this.addCustomWindow("About", qwebirc.ui.AboutPane, "aboutpane", this.uiOptions);
266 },
267 privacyWindow: function() {
268 this.addCustomWindow("Privacy policy", qwebirc.ui.PrivacyPolicyPane, "privacypolicypane", this.uiOptions);
269 },
270 feedbackWindow: function() {
271 this.addCustomWindow("Feedback", qwebirc.ui.FeedbackPane, "feedbackpane", this.uiOptions);
272 },
273 faqWindow: function() {
274 this.addCustomWindow("FAQ", qwebirc.ui.FAQPane, "faqpane", this.uiOptions);
275 },
276 urlDispatcher: function(name) {
277 if(name == "embedded")
278 return ["a", this.embeddedWindow.bind(this)];
279
280 if(name == "options")
281 return ["a", this.optionsWindow.bind(this)];
282
283 return null;
284 },
285 tabComplete: function(element) {
286 this.tabCompleter.tabComplete(element);
287 },
288 resetTabComplete: function() {
289 this.tabCompleter.reset();
290 }
291 });
292
293 qwebirc.ui.SoundUI = new Class({
294 Extends: qwebirc.ui.StandardUI,
295 initialize: function(parentElement, windowClass, uiName, options) {
296 this.parent(parentElement, windowClass, uiName, options);
297
298 this.soundInited = false;
299 this.soundReady = false;
300
301 this.setBeepOnMention(this.uiOptions.BEEP_ON_MENTION);
302 },
303 soundInit: function() {
304 if(this.soundInited)
305 return;
306 if(!$defined(Browser.Plugins.Flash) || Browser.Plugins.Flash.version < 8)
307 return;
308 this.soundInited = true;
309
310 this.soundPlayer = new qwebirc.sound.SoundPlayer();
311 this.soundPlayer.addEvent("ready", function() {
312 this.soundReady = true;
313 }.bind(this));
314 this.soundPlayer.go();
315 },
316 setBeepOnMention: function(value) {
317 if(value)
318 this.soundInit();
319 this.beepOnMention = value;
320 },
321 beep: function() {
322 if(!this.soundReady || !this.beepOnMention)
323 return;
324
325 this.soundPlayer.beep();
326 }
327 });
328
329 qwebirc.ui.QuakeNetUI = new Class({
330 Extends: qwebirc.ui.SoundUI,
331 urlDispatcher: function(name, window) {
332 if(name == "qwhois") {
333 return ["span", function(auth) {
334 this.client.exec("/MSG Q whois #" + auth);
335 }.bind(window)];
336 }
337 if(name == "whois") {
338 return ["span", function(nick) {
339 this.client.exec("/WHOIS " + nick);
340 }.bind(window)];
341 }
342 return this.parent(name);
343 },
344 logout: function() {
345 if(!qwebirc.auth.loggedin())
346 return;
347 if(confirm("Log out?")) {
348 for(var client in this.clients) {
349 this.clients[client].quit("Logged out");
350 };
351
352 /* HACK */
353 var foo = function() { document.location = "/auth?logout=1"; };
354 foo.delay(500);
355 }
356 }
357 });
358
359 qwebirc.ui.NewLoginUI = new Class({
360 Extends: qwebirc.ui.QuakeNetUI,
361 loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
362 this.postInitialize();
363
364 var w = this.newCustomWindow("Connect", true, qwebirc.ui.WINDOW_CONNECT);
365 var callback = function(args) {
366 w.close();
367 callbackfn(args);
368 };
369
370 qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
371 }
372 });