]>
jfr.im git - irc/quakenet/qwebirc.git/blob - js/ui/baseui.js
93e371b4dcac67c3a9c21ee9677079e7284381c9
1 qwebirc
.ui
.WINDOW_STATUS
= 0x01;
2 qwebirc
.ui
.WINDOW_QUERY
= 0x02;
3 qwebirc
.ui
.WINDOW_CHANNEL
= 0x04;
4 qwebirc
.ui
.WINDOW_CUSTOM
= 0x08;
5 qwebirc
.ui
.WINDOW_CONNECT
= 0x10;
6 qwebirc
.ui
.WINDOW_MESSAGES
= 0x20;
8 qwebirc
.ui
.CUSTOM_CLIENT
= "custom";
10 qwebirc
.ui
.BaseUI
= new Class({
12 initialize: function(parentElement
, windowClass
, uiName
, options
) {
13 this.options
= options
;
17 this.windows
[qwebirc
.ui
.CUSTOM_CLIENT
] = {};
18 this.windowArray
= [];
19 this.windowClass
= windowClass
;
20 this.parentElement
= parentElement
;
21 this.parentElement
.addClass("qwebirc");
22 this.parentElement
.addClass("qwebirc-" + uiName
);
23 this.firstClient
= false;
24 this.commandhistory
= new qwebirc
.irc
.CommandHistory();
27 this.windowFocused
= true;
29 if(Browser
.Engine
.trident
) {
30 var checkFocus = function() {
31 var hasFocus
= document
.hasFocus();
32 if(hasFocus
!= this.windowFocused
) {
33 this.windowFocused
= hasFocus
;
34 this.focusChange(hasFocus
);
38 checkFocus
.periodical(100, this);
40 var blur = function() { if(this.windowFocused
) { this.windowFocused
= false; this.focusChange(false); } }.bind(this);
41 var focus = function() { if(!this.windowFocused
) { this.windowFocused
= true; this.focusChange(true); } }.bind(this);
43 /* firefox requires both */
45 document
.addEvent("blur", blur
);
46 window
.addEvent("blur", blur
);
47 document
.addEvent("focus", focus
);
48 window
.addEvent("focus", focus
);
51 newClient: function(client
) {
52 client
.id
= this.clientId
++;
53 client
.hilightController
= new qwebirc
.ui
.HilightController(client
);
55 this.windows
[client
.id
] = {}
56 this.clients
[client
.id
] = client
;
57 var w
= this.newWindow(client
, qwebirc
.ui
.WINDOW_STATUS
, "Status");
59 if(!this.firstClient
) {
60 this.firstClient
= true;
61 w
.addLine("", "qwebirc v" + qwebirc
.VERSION
);
62 w
.addLine("", "Copyright (C) 2008-2009 Chris Porter and the qwebirc project.");
63 w
.addLine("", "http://www.qwebirc.org");
64 w
.addLine("", "Licensed under the GNU General Public License, Version 2.");
68 getClientId: function(client
) {
69 if(client
== qwebirc
.ui
.CUSTOM_CLIENT
) {
70 return qwebirc
.ui
.CUSTOM_CLIENT
;
75 getWindowIdentifier: function(client
, type
, name
) {
76 if(type
== qwebirc
.ui
.WINDOW_MESSAGES
)
78 if(type
== qwebirc
.ui
.WINDOW_STATUS
)
81 if(client
== qwebirc
.ui
.CUSTOM_CLIENT
) /* HACK */
84 return "_" + client
.toIRCLower(name
);
86 newWindow: function(client
, type
, name
) {
87 var w
= this.getWindow(client
, type
, name
);
91 var wId
= this.getWindowIdentifier(client
, type
, name
);
92 var w
= this.windows
[this.getClientId(client
)][wId
] = new this.windowClass(this, client
, type
, name
, wId
);
93 this.windowArray
.push(w
);
97 getWindow: function(client
, type
, name
) {
98 var c
= this.windows
[this.getClientId(client
)];
102 return c
[this.getWindowIdentifier(client
, type
, name
)];
104 getActiveWindow: function() {
107 getActiveIRCWindow: function(client
) {
108 if(!this.active
|| this.active
.type
== qwebirc
.ui
.WINDOW_CUSTOM
) {
109 return this.windows
[this.getClientId(client
)][this.getWindowIdentifier(client
, qwebirc
.ui
.WINDOW_STATUS
)];
114 __setActiveWindow: function(window
) {
115 this.active
= window
;
117 selectWindow: function(window
) {
119 this.active
.deselect();
120 window
.select(); /* calls setActiveWindow */
121 this.updateTitle(window
.name
+ " - " + this.options
.appTitle
);
123 updateTitle: function(text
) {
124 document
.title
= text
;
126 nextWindow: function(direction
) {
127 if(this.windowArray
.length
== 0 || !this.active
)
133 var index
= this.windowArray
.indexOf(this.active
);
137 index
= index
+ direction
;
139 index
= this.windowArray
.length
- 1;
140 } else if(index
>= this.windowArray
.length
) {
144 this.selectWindow(this.windowArray
[index
]);
146 prevWindow: function() {
149 __closed: function(window
) {
151 this.active
= undefined;
152 if(this.windowArray
.length
== 1) {
153 this.windowArray
= [];
155 var index
= this.windowArray
.indexOf(window
);
158 } else if(index
== 0) {
159 this.selectWindow(this.windowArray
[1]);
161 this.selectWindow(this.windowArray
[index
- 1]);
166 this.windowArray
= this.windowArray
.erase(window
);
167 delete this.windows
[this.getClientId(window
.client
)][window
.identifier
];
170 this shouldn't be called by overriding classes!
171 they should implement their own!
172 some form of user input MUST be received before an
173 IRC connection is made, else users are going to get
174 tricked into getting themselves glined
176 loginBox: function(callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
177 qwebirc
.ui
.GenericLoginBox(this.parentElement
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this.options
.networkName
);
179 focusChange: function(newValue
) {
180 var window_
= this.getActiveWindow();
181 if($defined(window_
))
182 window_
.focusChange(newValue
);
186 qwebirc
.ui
.StandardUI
= new Class({
187 Extends: qwebirc
.ui
.BaseUI
,
188 UICommands: qwebirc
.ui
.UI_COMMANDS
,
189 initialize: function(parentElement
, windowClass
, uiName
, options
) {
190 this.parent(parentElement
, windowClass
, uiName
, options
);
192 this.tabCompleter
= new qwebirc
.ui
.TabCompleterFactory(this);
193 this.uiOptions
= new qwebirc
.ui
.DefaultOptionsClass(this);
194 this.customWindows
= {};
197 if(Browser
.Engine
.trident
) {
202 document
.addEvent(ev
, this.__handleHotkey
.bind(this));
204 __handleHotkey: function(x
) {
205 if(!x
.alt
|| x
.control
) {
206 if(x
.key
== "backspace" || x
.key
== "/")
207 if(!this.getInputFocused(x
))
212 if(x
.key
== "a" || x
.key
== "A") {
214 var highestIndex
= -1;
218 for(var i
=0;i
<this.windowArray
.length
;i
++) {
219 var h
= this.windowArray
[i
].hilighted
;
225 if(highestIndex
> -1)
226 this.selectWindow(this.windowArray
[highestIndex
]);
227 } else if(x
.key
>= '0' && x
.key
<= '9') {
230 number
= x
.key
- '0';
236 if(number
>= this.windowArray
.length
)
239 this.selectWindow(this.windowArray
[number
]);
240 } else if(x
.key
== "left") {
243 } else if(x
.key
== "right") {
250 getInputFocused: function(x
) {
251 if($$("input").indexOf(x
.target
) == -1 && $$("textarea").indexOf(x
.target
) == -1)
255 newCustomWindow: function(name
, select
, type
) {
257 type
= qwebirc
.ui
.WINDOW_CUSTOM
;
259 var w
= this.newWindow(qwebirc
.ui
.CUSTOM_CLIENT
, type
, name
);
260 w
.addEvent("close", function(w
) {
261 delete this.windows
[qwebirc
.ui
.CUSTOM_CLIENT
][w
.identifier
];
265 this.selectWindow(w
);
269 addCustomWindow: function(windowName
, class_
, cssClass
, options
) {
270 if(!$defined(options
))
273 if(this.customWindows
[windowName
]) {
274 this.selectWindow(this.customWindows
[windowName
]);
278 var d
= this.newCustomWindow(windowName
, true);
279 this.customWindows
[windowName
] = d
;
281 d
.addEvent("close", function() {
282 this.customWindows
[windowName
] = null;
286 d
.lines
.addClass("qwebirc-" + cssClass
);
288 var ew
= new class_(d
.lines
, options
);
289 ew
.addEvent("close", function() {
295 embeddedWindow: function() {
296 this.addCustomWindow("Embedding wizard", qwebirc
.ui
.EmbedWizard
, "embeddedwizard", {baseURL: this.options
.baseURL
});
298 optionsWindow: function() {
299 this.addCustomWindow("Options", qwebirc
.ui
.OptionsPane
, "optionspane", this.uiOptions
);
301 aboutWindow: function() {
302 this.addCustomWindow("About", qwebirc
.ui
.AboutPane
, "aboutpane", this.uiOptions
);
304 privacyWindow: function() {
305 this.addCustomWindow("Privacy policy", qwebirc
.ui
.PrivacyPolicyPane
, "privacypolicypane", this.uiOptions
);
307 feedbackWindow: function() {
308 this.addCustomWindow("Feedback", qwebirc
.ui
.FeedbackPane
, "feedbackpane", this.uiOptions
);
310 faqWindow: function() {
311 this.addCustomWindow("FAQ", qwebirc
.ui
.FAQPane
, "faqpane", this.uiOptions
);
313 urlDispatcher: function(name
, window
) {
314 if(name
== "embedded")
315 return ["a", this.embeddedWindow
.bind(this)];
317 if(name
== "options")
318 return ["a", this.optionsWindow
.bind(this)];
320 /* doesn't really belong here */
321 if(name
== "whois") {
322 return ["span", function(nick
) {
323 this.client
.exec("/WHOIS " + nick
);
329 tabComplete: function(element
) {
330 this.tabCompleter
.tabComplete(element
);
332 resetTabComplete: function() {
333 this.tabCompleter
.reset();
335 setModifiableStylesheet: function(name
) {
336 this.__styleSheet
= new qwebirc
.ui
.style
.ModifiableStylesheet("/css/" + name
+ qwebirc
.FILE_SUFFIX
+ ".mcss");
338 if($defined(this.options
.hue
)) {
339 this.setModifiableStylesheetValues(this.options
.hue
, 0, 0);
341 this.setModifiableStylesheetValues(this.uiOptions
.STYLE_HUE
, 0, 0);
344 setModifiableStylesheetValues: function(hue
, saturation
, lightness
) {
345 if(!$defined(this.__styleSheet
))
347 this.__styleSheet
.set(function(x
) {
348 return x
.setHue(hue
).setSaturation(x
.hsb
[1] + saturation
).setBrightness(x
.hsb
[2] + lightness
);
353 qwebirc
.ui
.NotificationUI
= new Class({
354 Extends: qwebirc
.ui
.StandardUI
,
355 initialize: function(parentElement
, windowClass
, uiName
, options
) {
356 this.parent(parentElement
, windowClass
, uiName
, options
);
358 this.__beeper
= new qwebirc
.ui
.Beeper(this.uiOptions
);
359 this.__flasher
= new qwebirc
.ui
.Flasher(this.uiOptions
);
361 this.beep
= this.__beeper
.beep
.bind(this.__beeper
);
363 this.flash
= this.__flasher
.flash
.bind(this.__flasher
);
364 this.cancelFlash
= this.__flasher
.cancelFlash
.bind(this.__flasher
);
366 setBeepOnMention: function(value
) {
368 this.__beeper
.soundInit();
370 updateTitle: function(text
) {
371 if(this.__flasher
.updateTitle(text
))
374 focusChange: function(value
) {
376 this.__flasher
.focusChange(value
);
380 qwebirc
.ui
.NewLoginUI
= new Class({
381 Extends: qwebirc
.ui
.NotificationUI
,
382 loginBox: function(callbackfn
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
383 this.postInitialize();
385 var w
= this.newCustomWindow("Connect", true, qwebirc
.ui
.WINDOW_CONNECT
);
386 var callback = function(args
) {
391 qwebirc
.ui
.GenericLoginBox(w
.lines
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this.options
.networkName
);
395 qwebirc
.ui
.QuakeNetUI
= new Class({
396 Extends: qwebirc
.ui
.NewLoginUI
,
397 urlDispatcher: function(name
, window
) {
398 if(name
== "qwhois") {
399 return ["span", function(auth
) {
400 this.client
.exec("/MSG Q whois #" + auth
);
403 return this.parent(name
, window
);
406 if(!qwebirc
.auth
.loggedin())
408 if(confirm("Log out?")) {
409 for(var client
in this.clients
) {
410 this.clients
[client
].quit("Logged out");
414 var foo = function() { document
.location
= "/auth?logout=1"; };
420 qwebirc
.ui
.RootUI
= qwebirc
.ui
.QuakeNetUI
;