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