]>
jfr.im git - irc/quakenet/qwebirc.git/blob - 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";
9 qwebirc
.ui
.BaseUI
= new Class({
11 initialize: function(parentElement
, windowClass
, uiName
, options
) {
12 this.options
= options
;
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();
26 newClient: function(client
) {
27 client
.id
= this.clientId
++;
28 client
.hilightController
= new qwebirc
.ui
.HilightController(client
);
30 this.windows
[client
.id
] = {}
31 this.clients
[client
.id
] = client
;
32 var w
= this.newWindow(client
, qwebirc
.ui
.WINDOW_STATUS
, "Status");
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");
43 getClientId: function(client
) {
44 if(client
== qwebirc
.ui
.CUSTOM_CLIENT
) {
45 return qwebirc
.ui
.CUSTOM_CLIENT
;
50 getWindowIdentifier: function(type
, name
) {
51 if(type
== qwebirc
.ui
.WINDOW_MESSAGES
)
53 if(type
== qwebirc
.ui
.WINDOW_STATUS
)
55 return "_" + name
.toIRCLower();
57 newWindow: function(client
, type
, name
) {
58 var w
= this.getWindow(client
, type
, name
);
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
);
68 getWindow: function(client
, type
, name
) {
69 var c
= this.windows
[this.getClientId(client
)];
73 return c
[this.getWindowIdentifier(type
, name
)];
75 getActiveWindow: function() {
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
)];
85 __setActiveWindow: function(window
) {
88 selectWindow: function(window
) {
90 this.active
.deselect();
91 window
.select(); /* calls setActiveWindow */
92 document
.title
= window
.name
+ " - " + this.options
.appTitle
;
94 nextWindow: function(direction
) {
95 if(this.windowArray
.length
== 0 || !this.active
)
101 var index
= this.windowArray
.indexOf(this.active
);
105 index
= index
+ direction
;
107 index
= this.windowArray
.length
- 1;
108 } else if(index
>= this.windowArray
.length
) {
112 this.selectWindow(this.windowArray
[index
]);
114 prevWindow: function() {
117 __closed: function(window
) {
119 this.active
= undefined;
120 if(this.windowArray
.length
== 1) {
121 this.windowArray
= [];
123 var index
= this.windowArray
.indexOf(window
);
126 } else if(index
== 0) {
127 this.selectWindow(this.windowArray
[1]);
129 this.selectWindow(this.windowArray
[index
- 1]);
134 this.windowArray
= this.windowArray
.erase(window
);
135 delete this.windows
[this.getClientId(window
.client
)][window
.identifier
];
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
144 loginBox: function(callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
145 qwebirc
.ui
.GenericLoginBox(this.parentElement
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this.options
.networkName
);
149 qwebirc
.ui
.StandardUI
= new Class({
150 Extends: qwebirc
.ui
.BaseUI
,
152 ["Options", "options"],
153 ["Add webchat to your site", "embedded"],
154 ["Privacy policy", "privacy"],
155 ["Feedback", "feedback"],
156 ["About qwebirc", "about"]
158 initialize: function(parentElement
, windowClass
, uiName
, options
) {
159 this.parent(parentElement
, windowClass
, uiName
, options
);
161 this.tabCompleter
= new qwebirc
.ui
.TabCompleterFactory(this);
162 this.uiOptions
= new qwebirc
.ui
.DefaultOptionsClass(this);
163 this.customWindows
= {};
165 if(Browser
.Engine
.trident
) {
170 document
.addEvent(ev
, this.__handleHotkey
.bind(this));
172 __handleHotkey: function(x
) {
173 if(!x
.alt
|| x
.control
) {
174 if(x
.key
== "backspace" || x
.key
== "/")
175 if(!this.getInputFocused(x
))
180 if(x
.key
== "a" || x
.key
== "A") {
182 var highestIndex
= -1;
186 for(var i
=0;i
<this.windowArray
.length
;i
++) {
187 var h
= this.windowArray
[i
].hilighted
;
193 if(highestIndex
> -1)
194 this.selectWindow(this.windowArray
[highestIndex
]);
195 } else if(x
.key
>= '0' && x
.key
<= '9') {
198 number
= x
.key
- '0';
204 if(number
>= this.windowArray
.length
)
207 this.selectWindow(this.windowArray
[number
]);
208 } else if(x
.key
== "left") {
211 } else if(x
.key
== "right") {
218 getInputFocused: function(x
) {
219 return $$("input").indexOf(x
.target
) > -1;
221 newCustomWindow: function(name
, select
, type
) {
223 type
= qwebirc
.ui
.WINDOW_CUSTOM
;
225 var w
= this.newWindow(qwebirc
.ui
.CUSTOM_CLIENT
, type
, name
);
226 w
.addEvent("close", function(w
) {
227 delete this.windows
[qwebirc
.ui
.CUSTOM_CLIENT
][w
.identifier
];
231 this.selectWindow(w
);
235 addCustomWindow: function(windowName
, class_
, cssClass
, options
) {
236 if(!$defined(options
))
239 if(this.customWindows
[windowName
]) {
240 this.selectWindow(this.customWindows
[windowName
]);
244 var d
= this.newCustomWindow(windowName
, true);
245 this.customWindows
[windowName
] = d
;
247 d
.addEvent("close", function() {
248 this.customWindows
[windowName
] = null;
252 d
.lines
.addClass("qwebirc-" + cssClass
);
254 var ew
= new class_(d
.lines
, options
);
255 ew
.addEvent("close", function() {
259 embeddedWindow: function() {
260 this.addCustomWindow("Embedding wizard", qwebirc
.ui
.EmbedWizard
, "embeddedwizard");
262 optionsWindow: function() {
263 this.addCustomWindow("Options", qwebirc
.ui
.OptionsPane
, "optionspane", this.uiOptions
);
265 aboutWindow: function() {
266 this.addCustomWindow("About", qwebirc
.ui
.AboutPane
, "aboutpane", this.uiOptions
);
268 privacyWindow: function() {
269 this.addCustomWindow("Privacy policy", qwebirc
.ui
.PrivacyPolicyPane
, "privacypolicypane", this.uiOptions
);
271 feedbackWindow: function() {
272 this.addCustomWindow("Feedback", qwebirc
.ui
.FeedbackPane
, "feedbackpane", this.uiOptions
);
274 urlDispatcher: function(name
) {
275 if(name
== "embedded")
276 return ["a", this.embeddedWindow
.bind(this)];
278 if(name
== "options")
279 return ["a", this.optionsWindow
.bind(this)];
283 tabComplete: function(element
) {
284 this.tabCompleter
.tabComplete(element
);
286 resetTabComplete: function() {
287 this.tabCompleter
.reset();
291 qwebirc
.ui
.SoundUI
= new Class({
292 Extends: qwebirc
.ui
.StandardUI
,
293 initialize: function(parentElement
, windowClass
, uiName
, options
) {
294 this.parent(parentElement
, windowClass
, uiName
, options
);
296 this.soundInited
= false;
297 this.soundReady
= false;
299 this.setBeepOnMention(this.uiOptions
.BEEP_ON_MENTION
);
301 soundInit: function() {
304 if(!$defined(Browser
.Plugins
.Flash
) || Browser
.Plugins
.Flash
.version
< 8)
306 this.soundInited
= true;
308 this.soundPlayer
= new qwebirc
.sound
.SoundPlayer();
309 this.soundPlayer
.addEvent("ready", function() {
310 this.soundReady
= true;
312 this.soundPlayer
.go();
314 setBeepOnMention: function(value
) {
317 this.beepOnMention
= value
;
320 if(!this.soundReady
|| !this.beepOnMention
)
323 this.soundPlayer
.beep();
327 qwebirc
.ui
.QuakeNetUI
= new Class({
328 Extends: qwebirc
.ui
.SoundUI
,
329 urlDispatcher: function(name
, window
) {
330 if(name
== "qwhois") {
331 return ["span", function(auth
) {
332 this.client
.exec("/MSG Q whois #" + auth
);
335 if(name
== "whois") {
336 return ["span", function(nick
) {
337 this.client
.exec("/WHOIS " + nick
);
340 return this.parent(name
);
343 if(!qwebirc
.auth
.loggedin())
345 if(confirm("Log out?")) {
346 for(var client
in this.clients
) {
347 this.clients
[client
].quit("Logged out");
349 document
.location
= "/auth?logout=1";
354 qwebirc
.ui
.NewLoginUI
= new Class({
355 Extends: qwebirc
.ui
.QuakeNetUI
,
356 loginBox: function(callbackfn
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
357 this.postInitialize();
359 var w
= this.newCustomWindow("Connect", true, qwebirc
.ui
.WINDOW_CONNECT
);
360 var callback = function(args
) {
365 qwebirc
.ui
.GenericLoginBox(w
.lines
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this.options
.networkName
);