]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/ui/baseui.js
Add currently empty privacy policy.
[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 252 embeddedWindow: function() {
b35116e2 253 this.addCustomWindow("Embedding wizard", qwebirc.ui.EmbedWizard, "embeddedwizard");
ebb21d2e
CP
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 },
b35116e2
CP
261 privacyWindow: function() {
262 this.addCustomWindow("Privacy policy", qwebirc.ui.PrivacyPolicyPane, "privacypolicypane", this.uiOptions);
263 },
8af49135
CP
264 urlDispatcher: function(name) {
265 if(name == "embedded")
925fc357 266 return ["a", this.embeddedWindow.bind(this)];
ebb21d2e
CP
267
268 if(name == "options")
269 return ["a", this.optionsWindow.bind(this)];
8af49135
CP
270
271 return null;
3184781b
CP
272 },
273 tabComplete: function(element) {
274 this.tabCompleter.tabComplete(element);
275 },
276 resetTabComplete: function() {
277 this.tabCompleter.reset();
8af49135 278 }
381fddfd 279});
6f2e4a37 280
fb71087a 281qwebirc.ui.SoundUI = new Class({
e20e5a6b 282 Extends: qwebirc.ui.StandardUI,
fb71087a
CP
283 initialize: function(parentElement, windowClass, uiName, options) {
284 this.parent(parentElement, windowClass, uiName, options);
285
127631e0 286 this.soundInited = false;
fb71087a 287 this.soundReady = false;
fb71087a 288
127631e0 289 this.setBeepOnMention(this.uiOptions.BEEP_ON_MENTION);
fb71087a 290 },
127631e0
CP
291 soundInit: function() {
292 if(this.soundInited)
fb71087a 293 return;
127631e0
CP
294 if(!$defined(Browser.Plugins.Flash) || Browser.Plugins.Flash.version < 8)
295 return;
296 this.soundInited = true;
297
298 this.soundPlayer = new qwebirc.sound.SoundPlayer();
299 this.soundPlayer.addEvent("ready", function() {
300 this.soundReady = true;
301 }.bind(this));
302 this.soundPlayer.go();
fb71087a 303 },
127631e0
CP
304 setBeepOnMention: function(value) {
305 if(value)
306 this.soundInit();
307 this.beepOnMention = value;
308 },
309 beep: function() {
310 if(!this.soundReady || !this.beepOnMention)
fb71087a 311 return;
127631e0
CP
312
313 this.soundPlayer.beep();
fb71087a
CP
314 }
315});
316
317qwebirc.ui.QuakeNetUI = new Class({
318 Extends: qwebirc.ui.SoundUI,
2cd9e32d
CP
319 urlDispatcher: function(name, window) {
320 if(name == "qwhois") {
7cb09779 321 return ["span", function(auth) {
2cd9e32d 322 this.client.exec("/MSG Q whois #" + auth);
925fc357
CP
323 }.bind(window)];
324 }
325 if(name == "whois") {
326 return ["span", function(nick) {
327 this.client.exec("/WHOIS " + nick);
328 }.bind(window)];
2cd9e32d 329 }
2cd9e32d 330 return this.parent(name);
ffbb638d
CP
331 },
332 logout: function() {
333 if(!qwebirc.auth.loggedin())
334 return;
335 if(confirm("Log out?")) {
336 for(var client in this.clients) {
337 this.clients[client].quit("Logged out");
338 };
339 document.location = "/auth?logout=1";
340 }
2cd9e32d
CP
341 }
342});
343
344qwebirc.ui.NewLoginUI = new Class({
345 Extends: qwebirc.ui.QuakeNetUI,
6f2e4a37
CP
346 loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
347 this.postInitialize();
c38a0240 348
e20e5a6b 349 var w = this.newCustomWindow("Connect", true, qwebirc.ui.WINDOW_CONNECT);
6f2e4a37
CP
350 var callback = function(args) {
351 w.close();
352 callbackfn(args);
353 };
354
2cad083e 355 qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
6f2e4a37
CP
356 }
357});