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