]>
jfr.im git - irc/quakenet/qwebirc.git/blob - js/ui/baseui.js
05bb6497b11b3e6ef9ac2652825904175dcf5331
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
;
15 this . windows
= new QHash ();
16 this . clients
= new QHash ();
17 this . windows
. put ( qwebirc
. ui
. CUSTOM_CLIENT
, new QHash ());
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
= String ( this . clientId
++);
53 client
. hilightController
= new qwebirc
. ui
. HilightController ( client
);
54 client
. addEvent ( "signedOn" , function () {
55 this . fireEvent ( "signedOn" , client
);
57 this . windows
. put ( client
. id
, new QHash ());
58 this . clients
. put ( client
. id
, client
);
59 var w
= this . newWindow ( client
, qwebirc
. ui
. WINDOW_STATUS
, "Status" );
61 if (! this . firstClient
) {
62 this . firstClient
= true ;
63 w
. addLine ( "" , "qwebirc v" + qwebirc
. VERSION
);
64 w
. addLine ( "" , "Copyright (C) 2008-2014 Chris Porter and the qwebirc project." );
65 w
. addLine ( "" , "http://www.qwebirc.org" );
66 w
. addLine ( "" , "Licensed under the GNU General Public License, Version 2." );
70 getClientId : function ( client
) {
71 if ( client
== qwebirc
. ui
. CUSTOM_CLIENT
) {
72 return qwebirc
. ui
. CUSTOM_CLIENT
;
77 getWindowIdentifier : function ( client
, type
, name
) {
78 if ( type
== qwebirc
. ui
. WINDOW_MESSAGES
)
80 if ( type
== qwebirc
. ui
. WINDOW_STATUS
)
83 if ( client
== qwebirc
. ui
. CUSTOM_CLIENT
) /* HACK */
86 return "_" + client
. toIRCLower ( name
);
88 newWindow : function ( client
, type
, name
) {
89 var w
= this . getWindow ( client
, type
, name
);
93 var wId
= this . getWindowIdentifier ( client
, type
, name
);
94 var w
= new this . windowClass ( this , client
, type
, name
, wId
);
95 this . windows
. get ( this . getClientId ( client
)). put ( wId
, w
);
96 this . windowArray
. push ( w
);
100 getWindow : function ( client
, type
, name
) {
101 var c
= this . windows
. get ( this . getClientId ( client
));
105 return c
[ this . getWindowIdentifier ( client
, type
, name
)];
107 getActiveWindow : function () {
110 getActiveIRCWindow : function ( client
) {
111 if (! this . active
|| this . active
. type
== qwebirc
. ui
. WINDOW_CUSTOM
) {
112 return this . windows
. get ( this . getClientId ( client
)). get ( this . getWindowIdentifier ( client
, qwebirc
. ui
. WINDOW_STATUS
));
117 __setActiveWindow : function ( window
) {
118 this . active
= window
;
120 renameWindow : function ( window
, name
) {
121 if ( this . getWindow ( window
. client
, window
. type
, name
))
124 var clientId
= this . getClientId ( window
. client
);
125 var index
= this . windowArray
. indexOf ( window
);
129 this . windows
. get ( clientId
). remove ( window
. identifier
);
131 var window
= this . windowArray
[ index
];
133 window
. identifier
= this . getWindowIdentifier ( window
. client
, window
. type
, window
. name
);
135 this . windows
. get ( clientId
). put ( window
. identifier
, this . windowArray
[ index
]);
138 this . updateTitle ( window
. name
+ " - " + this . options
. appTitle
);
140 window
. rename ( window
. name
);
143 selectWindow : function ( window
) {
145 this . active
. deselect ();
146 window
. select (); /* calls setActiveWindow */
147 this . updateTitle ( window
. name
+ " - " + this . options
. appTitle
);
149 updateTitle : function ( text
) {
150 document
. title
= text
;
152 nextWindow : function ( direction
) {
153 if ( this . windowArray
. length
== 0 || ! this . active
)
159 var index
= this . windowArray
. indexOf ( this . active
);
163 index
= index
+ direction
;
165 index
= this . windowArray
. length
- 1 ;
166 } else if ( index
>= this . windowArray
. length
) {
170 this . selectWindow ( this . windowArray
[ index
]);
172 prevWindow : function () {
175 __closed : function ( window
) {
177 this . active
= undefined ;
178 if ( this . windowArray
. length
== 1 ) {
179 this . windowArray
= [];
181 var index
= this . windowArray
. indexOf ( window
);
184 } else if ( index
== 0 ) {
185 this . selectWindow ( this . windowArray
[ 1 ]);
187 this . selectWindow ( this . windowArray
[ index
- 1 ]);
192 this . windowArray
= this . windowArray
. erase ( window
);
193 this . windows
. get ( this . getClientId ( window
. client
)). remove ( window
. identifier
);
196 this shouldn't be called by overriding classes!
197 they should implement their own!
198 some form of user input MUST be received before an
199 IRC connection is made, else users are going to get
200 tricked into getting themselves glined
202 loginBox : function ( callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
203 qwebirc
. ui
. GenericLoginBox ( this . parentElement
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this . options
. networkName
);
205 focusChange : function ( newValue
) {
206 var window_
= this . getActiveWindow ();
207 if ($ defined ( window_
))
208 window_
. focusChange ( newValue
);
212 qwebirc
. ui
. StandardUI
= new Class ({
213 Extends : qwebirc
. ui
. BaseUI
,
214 UICommands : qwebirc
. ui
. UI_COMMANDS
,
215 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
216 this . parent ( parentElement
, windowClass
, uiName
, options
);
218 this . tabCompleter
= new qwebirc
. ui
. TabCompleterFactory ( this );
219 this . uiOptions
= new qwebirc
. ui
. DefaultOptionsClass ( this , options
. uiOptionsArg
);
220 this . customWindows
= new QHash ();
222 this . __styleValues
= { hue : this . uiOptions
. STYLE_HUE
, saturation : 0 , lightness : 0 };
223 if ($ defined ( this . options
. hue
)) this . __styleValues
. hue
= this . options
. hue
;
224 if ($ defined ( this . options
. saturation
)) this . __styleValues
. saturation
= this . options
. saturation
;
225 if ($ defined ( this . options
. lightness
)) this . __styleValues
. lightness
= this . options
. lightness
;
227 if ( this . options
. thue
!== null ) this . __styleValues
. textHue
= this . options
. thue
;
228 if ( this . options
. tsaturation
!== null ) this . __styleValues
. textSaturation
= this . options
. tsaturation
;
229 if ( this . options
. tlightness
!== null ) this . __styleValues
. textLightness
= this . options
. tlightness
;
232 if ( Browser
. Engine
. trident
) {
237 document
. addEvent ( ev
, this . __handleHotkey
. bind ( this ));
239 __handleHotkey : function ( x
) {
240 if (! x
. alt
|| x
. control
) {
241 if ( x
. key
== "backspace" || x
. key
== "/" )
242 if (! this . getInputFocused ( x
))
247 if ( x
. key
== "a" || x
. key
== "A" ) {
249 var highestIndex
= - 1 ;
253 for ( var i
= 0 ; i
< this . windowArray
. length
; i
++) {
254 var h
= this . windowArray
[ i
]. hilighted
;
260 if ( highestIndex
> - 1 )
261 this . selectWindow ( this . windowArray
[ highestIndex
]);
262 } else if ( x
. key
>= '0' && x
. key
<= '9' ) {
265 number
= x
. key
- '0' ;
271 if ( number
>= this . windowArray
. length
)
274 this . selectWindow ( this . windowArray
[ number
]);
275 } else if ( x
. key
== "left" ) {
278 } else if ( x
. key
== "right" ) {
285 getInputFocused : function ( x
) {
286 if ($$( "input" ). indexOf ( x
. target
) == - 1 && $$( "textarea" ). indexOf ( x
. target
) == - 1 )
290 newCustomWindow : function ( name
, select
, type
) {
292 type
= qwebirc
. ui
. WINDOW_CUSTOM
;
294 var w
= this . newWindow ( qwebirc
. ui
. CUSTOM_CLIENT
, type
, name
);
295 w
. addEvent ( "close" , function ( w
) {
296 this . windows
. get ( qwebirc
. ui
. CUSTOM_CLIENT
). remove ( w
. identifier
);
300 this . selectWindow ( w
);
304 addCustomWindow : function ( windowName
, class_
, cssClass
, options
) {
305 if (!$ defined ( options
))
308 if ( this . customWindows
. contains ( windowName
)) {
309 this . selectWindow ( this . customWindows
. get ( windowName
));
313 var d
= this . newCustomWindow ( windowName
, true );
314 this . customWindows
. put ( windowName
, d
);
316 d
. addEvent ( "close" , function () {
317 this . customWindows
. remove ( windowName
);
321 d
. lines
. addClass ( "qwebirc-" + cssClass
);
323 var ew
= new class_ ( d
. lines
, options
);
324 ew
. addEvent ( "close" , function () {
330 embeddedWindow : function () {
331 this . addCustomWindow ( "Add webchat to your site" , qwebirc
. ui
. EmbedWizard
, "embeddedwizard" , { baseURL : this . options
. baseURL
, uiOptions : this . uiOptions
, optionsCallback : function () {
332 this . optionsWindow ();
335 optionsWindow : function () {
336 this . addCustomWindow ( "Options" , qwebirc
. ui
. OptionsPane
, "optionspane" , this . uiOptions
);
338 aboutWindow : function () {
339 this . addCustomWindow ( "About" , qwebirc
. ui
. AboutPane
, "aboutpane" , this . uiOptions
);
341 privacyWindow : function () {
342 this . addCustomWindow ( "Privacy policy" , qwebirc
. ui
. PrivacyPolicyPane
, "privacypolicypane" , this . uiOptions
);
344 feedbackWindow : function () {
345 this . addCustomWindow ( "Feedback" , qwebirc
. ui
. FeedbackPane
, "feedbackpane" , this . uiOptions
);
347 helpWindow : function () {
348 this . addCustomWindow ( "Help!" , qwebirc
. ui
. HelpPane
, "helppane" , this . uiOptions
);
350 urlDispatcher : function ( name
, window
) {
351 if ( name
== "embedded" )
352 return [ "a" , this . embeddedWindow
. bind ( this )];
354 if ( name
== "options" )
355 return [ "a" , this . optionsWindow
. bind ( this )];
357 /* doesn't really belong here */
358 if ( name
== "whois" ) {
359 return [ "span" , function ( nick
) {
360 if ( this . uiOptions
. QUERY_ON_NICK_CLICK
) {
361 window
. client
. exec ( "/QUERY " + nick
);
363 window
. client
. exec ( "/WHOIS " + nick
);
370 tabComplete : function ( element
) {
371 this . tabCompleter
. tabComplete ( element
);
373 resetTabComplete : function () {
374 this . tabCompleter
. reset ();
376 setModifiableStylesheet : function ( name
) {
377 this . __styleSheet
= new qwebirc
. ui
. style
. ModifiableStylesheet ( qwebirc
. global
. staticBaseURL
+ "css/" + name
+ qwebirc
. FILE_SUFFIX
+ ".mcss" );
378 this . setModifiableStylesheetValues ({});
380 setModifiableStylesheetValues : function ( values
) {
382 this . __styleValues
[ k
] = values
[ k
];
384 if (!$ defined ( this . __styleSheet
))
387 var back
= { hue : this . __styleValues
. hue
, lightness : this . __styleValues
. lightness
, saturation : this . __styleValues
. saturation
};
388 var front
= { hue : this . __styleValues
. textHue
, lightness : this . __styleValues
. textLightness
, saturation : this . __styleValues
. textSaturation
};
390 if (! this . __styleValues
. textHue
&& ! this . __styleValues
. textLightness
&& ! this . __styleValues
. textSaturation
)
398 this . __styleSheet
. set ( function () {
399 var mode
= arguments
[ 0 ];
401 var t
= colours
[ arguments
[ 2 ]];
402 var x
= new Color ( arguments
[ 1 ]);
403 var c
= x
. setHue ( t
. hue
). setSaturation ( x
. hsb
[ 1 ] + t
. saturation
). setBrightness ( x
. hsb
[ 2 ] + t
. lightness
);
404 if ( c
== "255,255,255" ) /* IE confuses white with transparent... */
407 return "rgb(" + c
+ ")" ;
408 } else if ( mode
== "o" ) {
409 return this . uiOptions
[ arguments
[ 1 ]] ? arguments
[ 2 ] : arguments
[ 3 ];
415 qwebirc
. ui
. NotificationUI
= new Class ({
416 Extends : qwebirc
. ui
. StandardUI
,
417 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
418 this . parent ( parentElement
, windowClass
, uiName
, options
);
420 this . __beeper
= new qwebirc
. ui
. Beeper ( this . uiOptions
);
421 this . __flasher
= new qwebirc
. ui
. Flasher ( this . uiOptions
);
423 this . beep
= this . __beeper
. beep
. bind ( this . __beeper
);
425 this . flash
= this . __flasher
. flash
. bind ( this . __flasher
);
426 this . cancelFlash
= this . __flasher
. cancelFlash
. bind ( this . __flasher
);
428 setBeepOnMention : function ( value
) {
430 this . __beeper
. soundInit ();
432 updateTitle : function ( text
) {
433 if ( this . __flasher
. updateTitle ( text
))
436 focusChange : function ( value
) {
438 this . __flasher
. focusChange ( value
);
442 qwebirc
. ui
. NewLoginUI
= new Class ({
443 Extends : qwebirc
. ui
. NotificationUI
,
444 loginBox : function ( callbackfn
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
445 this . postInitialize ();
447 /* I'd prefer something shorter and snappier! */
448 var w
= this . newCustomWindow ( "Connect" , true , qwebirc
. ui
. WINDOW_CONNECT
);
449 var callback = function ( args
) {
454 qwebirc
. ui
. GenericLoginBox ( w
. lines
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this . options
. networkName
);
458 qwebirc
. ui
. QuakeNetUI
= new Class ({
459 Extends : qwebirc
. ui
. NewLoginUI
,
460 urlDispatcher : function ( name
, window
) {
461 if ( name
== "qwhois" ) {
462 return [ "span" , function ( auth
) {
463 this . client
. exec ( "/MSG Q whois #" + auth
);
466 return this . parent ( name
, window
);
469 if (! qwebirc
. auth
. loggedin ())
471 if ( confirm ( "Log out?" )) {
472 this . clients
. each ( function ( k
, v
) {
473 v
. quit ( "Logged out" );
477 var foo = function () { document
. location
= qwebirc
. global
. dynamicBaseURL
+ "auth?logout=1" ; };
483 qwebirc
. ui
. RootUI
= qwebirc
. ui
. QuakeNetUI
;
485 qwebirc
. ui
. RequestTransformHTML = function ( options
) {
486 var HREF_ELEMENTS
= {
490 var update
= options
. update
;
491 var onSuccess
= options
. onSuccess
;
493 var fixUp = function ( node
) {
494 if ( node
. nodeType
!= 1 )
497 var tagName
= node
. nodeName
. toUpperCase ();
498 if ( HREF_ELEMENTS
[ tagName
]) {
499 var attr
= node
. getAttribute ( "transform_attr" );
500 var value
= node
. getAttribute ( "transform_value" );
501 if ($ defined ( attr
) && $ defined ( value
)) {
502 node
. removeAttribute ( "transform_attr" );
503 node
. removeAttribute ( "transform_value" );
504 node
. setAttribute ( attr
, qwebirc
. global
. staticBaseURL
+ value
);
508 for ( var i
= 0 ; i
< node
. childNodes
. length
; i
++)
509 fixUp ( node
. childNodes
[ i
]);
512 delete options
[ "update" ];
513 options
. onSuccess = function ( tree
, elements
, html
, js
) {
514 var container
= new Element ( "div" );
515 container
. set ( "html" , html
);
519 while ( container
. childNodes
. length
> 0 ) {
520 var x
= container
. firstChild
;
521 container
. removeChild ( x
);
522 update
. appendChild ( x
);
527 return new Request
. HTML ( options
);