]>
jfr.im git - irc/quakenet/qwebirc.git/blob - js/ui/baseui.js
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 qwebirc
. util
. __log = function ( x
) {
53 if ( typeof console
!= "undefined" )
55 this . getActiveWindow (). addLine ( null , x
);
59 newClient : function ( client
) {
60 client
. id
= String ( this . clientId
++);
61 client
. hilightController
= new qwebirc
. ui
. HilightController ( client
);
62 client
. addEvent ( "signedOn" , function () {
63 this . fireEvent ( "signedOn" , client
);
65 this . windows
. put ( client
. id
, new QHash ());
66 this . clients
. put ( client
. id
, client
);
67 var w
= this . newWindow ( client
, qwebirc
. ui
. WINDOW_STATUS
, "Status" );
69 if (! this . firstClient
) {
70 this . firstClient
= true ;
71 w
. addLine ( "" , "qwebirc v" + qwebirc
. VERSION
);
72 w
. addLine ( "" , "Copyright (C) 2008-2014 Chris Porter and the qwebirc project." );
73 w
. addLine ( "" , "http://www.qwebirc.org" );
74 w
. addLine ( "" , "Licensed under the GNU General Public License, Version 2." );
78 getClientId : function ( client
) {
79 if ( client
== qwebirc
. ui
. CUSTOM_CLIENT
) {
80 return qwebirc
. ui
. CUSTOM_CLIENT
;
85 getWindowIdentifier : function ( client
, type
, name
) {
86 if ( type
== qwebirc
. ui
. WINDOW_MESSAGES
)
88 if ( type
== qwebirc
. ui
. WINDOW_STATUS
)
91 if ( client
== qwebirc
. ui
. CUSTOM_CLIENT
) /* HACK */
94 return "_" + client
. toIRCLower ( name
);
96 newWindow : function ( client
, type
, name
) {
97 var w
= this . getWindow ( client
, type
, name
);
101 var wId
= this . getWindowIdentifier ( client
, type
, name
);
102 var w
= new this . windowClass ( this , client
, type
, name
, wId
);
103 this . windows
. get ( this . getClientId ( client
)). put ( wId
, w
);
104 this . windowArray
. push ( w
);
108 getWindow : function ( client
, type
, name
) {
109 var c
= this . windows
. get ( this . getClientId ( client
));
113 return c
[ this . getWindowIdentifier ( client
, type
, name
)];
115 getActiveWindow : function () {
118 getActiveIRCWindow : function ( client
) {
119 if (! this . active
|| this . active
. type
== qwebirc
. ui
. WINDOW_CUSTOM
) {
120 return this . windows
. get ( this . getClientId ( client
)). get ( this . getWindowIdentifier ( client
, qwebirc
. ui
. WINDOW_STATUS
));
125 __setActiveWindow : function ( window
) {
126 this . active
= window
;
128 renameWindow : function ( window
, name
) {
129 if ( this . getWindow ( window
. client
, window
. type
, name
))
132 var clientId
= this . getClientId ( window
. client
);
133 var index
= this . windowArray
. indexOf ( window
);
137 this . windows
. get ( clientId
). remove ( window
. identifier
);
139 var window
= this . windowArray
[ index
];
141 window
. identifier
= this . getWindowIdentifier ( window
. client
, window
. type
, window
. name
);
143 this . windows
. get ( clientId
). put ( window
. identifier
, this . windowArray
[ index
]);
146 this . updateTitle ( window
. name
+ " - " + this . options
. appTitle
);
148 window
. rename ( window
. name
);
151 selectWindow : function ( window
) {
153 this . active
. deselect ();
154 window
. select (); /* calls setActiveWindow */
155 this . updateTitle ( window
. name
+ " - " + this . options
. appTitle
);
157 updateTitle : function ( text
) {
158 document
. title
= text
;
160 nextWindow : function ( direction
) {
161 if ( this . windowArray
. length
== 0 || ! this . active
)
167 var index
= this . windowArray
. indexOf ( this . active
);
171 index
= index
+ direction
;
173 index
= this . windowArray
. length
- 1 ;
174 } else if ( index
>= this . windowArray
. length
) {
178 this . selectWindow ( this . windowArray
[ index
]);
180 prevWindow : function () {
183 __closed : function ( window
) {
185 this . active
= undefined ;
186 if ( this . windowArray
. length
== 1 ) {
187 this . windowArray
= [];
189 var index
= this . windowArray
. indexOf ( window
);
192 } else if ( index
== 0 ) {
193 this . selectWindow ( this . windowArray
[ 1 ]);
195 this . selectWindow ( this . windowArray
[ index
- 1 ]);
200 this . windowArray
= this . windowArray
. erase ( window
);
201 this . windows
. get ( this . getClientId ( window
. client
)). remove ( window
. identifier
);
204 this shouldn't be called by overriding classes!
205 they should implement their own!
206 some form of user input MUST be received before an
207 IRC connection is made, else users are going to get
208 tricked into getting themselves glined
210 loginBox : function ( callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
211 qwebirc
. ui
. GenericLoginBox ( this . parentElement
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this . options
. networkName
);
213 focusChange : function ( newValue
) {
214 var window_
= this . getActiveWindow ();
215 if ($ defined ( window_
))
216 window_
. focusChange ( newValue
);
220 qwebirc
. ui
. StandardUI
= new Class ({
221 Extends : qwebirc
. ui
. BaseUI
,
222 UICommands : qwebirc
. ui
. UI_COMMANDS
,
223 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
224 this . parent ( parentElement
, windowClass
, uiName
, options
);
226 this . tabCompleter
= new qwebirc
. ui
. TabCompleterFactory ( this );
227 this . uiOptions
= new qwebirc
. ui
. DefaultOptionsClass ( this , options
. uiOptionsArg
);
228 this . customWindows
= new QHash ();
230 this . __styleValues
= { hue : this . uiOptions
. STYLE_HUE
, saturation : 0 , lightness : 0 };
231 if ($ defined ( this . options
. hue
)) this . __styleValues
. hue
= this . options
. hue
;
232 if ($ defined ( this . options
. saturation
)) this . __styleValues
. saturation
= this . options
. saturation
;
233 if ($ defined ( this . options
. lightness
)) this . __styleValues
. lightness
= this . options
. lightness
;
235 if ( this . options
. thue
!== null ) this . __styleValues
. textHue
= this . options
. thue
;
236 if ( this . options
. tsaturation
!== null ) this . __styleValues
. textSaturation
= this . options
. tsaturation
;
237 if ( this . options
. tlightness
!== null ) this . __styleValues
. textLightness
= this . options
. tlightness
;
240 if ( Browser
. Engine
. trident
) {
245 document
. addEvent ( ev
, this . __handleHotkey
. bind ( this ));
247 __handleHotkey : function ( x
) {
248 if (! x
. alt
|| x
. control
) {
249 if ( x
. key
== "backspace" || x
. key
== "/" )
250 if (! this . getInputFocused ( x
))
255 if ( x
. key
== "a" || x
. key
== "A" ) {
257 var highestIndex
= - 1 ;
261 for ( var i
= 0 ; i
< this . windowArray
. length
; i
++) {
262 var h
= this . windowArray
[ i
]. hilighted
;
268 if ( highestIndex
> - 1 )
269 this . selectWindow ( this . windowArray
[ highestIndex
]);
270 } else if ( x
. key
>= '0' && x
. key
<= '9' ) {
273 number
= x
. key
- '0' ;
279 if ( number
>= this . windowArray
. length
)
282 this . selectWindow ( this . windowArray
[ number
]);
283 } else if ( x
. key
== "left" ) {
286 } else if ( x
. key
== "right" ) {
293 getInputFocused : function ( x
) {
294 if ($$( "input" ). indexOf ( x
. target
) == - 1 && $$( "textarea" ). indexOf ( x
. target
) == - 1 )
298 newCustomWindow : function ( name
, select
, type
) {
300 type
= qwebirc
. ui
. WINDOW_CUSTOM
;
302 var w
= this . newWindow ( qwebirc
. ui
. CUSTOM_CLIENT
, type
, name
);
303 w
. addEvent ( "close" , function ( w
) {
304 this . windows
. get ( qwebirc
. ui
. CUSTOM_CLIENT
). remove ( w
. identifier
);
308 this . selectWindow ( w
);
312 addCustomWindow : function ( windowName
, class_
, cssClass
, options
) {
313 if (!$ defined ( options
))
316 if ( this . customWindows
. contains ( windowName
)) {
317 this . selectWindow ( this . customWindows
. get ( windowName
));
321 var d
= this . newCustomWindow ( windowName
, true );
322 this . customWindows
. put ( windowName
, d
);
324 d
. addEvent ( "close" , function () {
325 this . customWindows
. remove ( windowName
);
329 d
. lines
. addClass ( "qwebirc-" + cssClass
);
331 var ew
= new class_ ( d
. lines
, options
);
332 ew
. addEvent ( "close" , function () {
338 embeddedWindow : function () {
339 this . addCustomWindow ( "Add webchat to your site" , qwebirc
. ui
. EmbedWizard
, "embeddedwizard" , { baseURL : this . options
. baseURL
, uiOptions : this . uiOptions
, optionsCallback : function () {
340 this . optionsWindow ();
343 optionsWindow : function () {
344 this . addCustomWindow ( "Options" , qwebirc
. ui
. OptionsPane
, "optionspane" , this . uiOptions
);
346 aboutWindow : function () {
347 this . addCustomWindow ( "About" , qwebirc
. ui
. AboutPane
, "aboutpane" , this . uiOptions
);
349 privacyWindow : function () {
350 this . addCustomWindow ( "Privacy policy" , qwebirc
. ui
. PrivacyPolicyPane
, "privacypolicypane" , this . uiOptions
);
352 feedbackWindow : function () {
353 this . addCustomWindow ( "Feedback" , qwebirc
. ui
. FeedbackPane
, "feedbackpane" , this . uiOptions
);
355 helpWindow : function () {
356 this . addCustomWindow ( "Help!" , qwebirc
. ui
. HelpPane
, "helppane" , this . uiOptions
);
358 urlDispatcher : function ( name
, window
) {
359 if ( name
== "embedded" )
360 return [ "a" , this . embeddedWindow
. bind ( this )];
362 if ( name
== "options" )
363 return [ "a" , this . optionsWindow
. bind ( this )];
365 /* doesn't really belong here */
366 if ( name
== "whois" ) {
367 return [ "span" , function ( nick
) {
368 if ( this . uiOptions
. QUERY_ON_NICK_CLICK
) {
369 window
. client
. exec ( "/QUERY " + nick
);
371 window
. client
. exec ( "/WHOIS " + nick
);
378 tabComplete : function ( element
) {
379 this . tabCompleter
. tabComplete ( element
);
381 resetTabComplete : function () {
382 this . tabCompleter
. reset ();
384 setModifiableStylesheet : function ( name
) {
385 this . __styleSheet
= new qwebirc
. ui
. style
. ModifiableStylesheet ( qwebirc
. global
. staticBaseURL
+ "css/" + ( QWEBIRC_DEBUG
? "debug/" : "" ) + name
+ qwebirc
. FILE_SUFFIX
+ ".mcss" );
386 this . setModifiableStylesheetValues ({});
388 setModifiableStylesheetValues : function ( values
) {
390 this . __styleValues
[ k
] = values
[ k
];
392 if (!$ defined ( this . __styleSheet
))
395 var back
= { hue : this . __styleValues
. hue
, lightness : this . __styleValues
. lightness
, saturation : this . __styleValues
. saturation
};
396 var front
= { hue : this . __styleValues
. textHue
, lightness : this . __styleValues
. textLightness
, saturation : this . __styleValues
. textSaturation
};
398 if (! this . __styleValues
. textHue
&& ! this . __styleValues
. textLightness
&& ! this . __styleValues
. textSaturation
)
406 this . __styleSheet
. set ( function () {
407 var mode
= arguments
[ 0 ];
409 var t
= colours
[ arguments
[ 2 ]];
410 var x
= new Color ( arguments
[ 1 ]);
411 var c
= x
. setHue ( t
. hue
). setSaturation ( x
. hsb
[ 1 ] + t
. saturation
). setBrightness ( x
. hsb
[ 2 ] + t
. lightness
);
412 if ( c
== "255,255,255" ) /* IE confuses white with transparent... */
415 return "rgb(" + c
+ ")" ;
416 } else if ( mode
== "o" ) {
417 return this . uiOptions
[ arguments
[ 1 ]] ? arguments
[ 2 ] : arguments
[ 3 ];
423 qwebirc
. ui
. NotificationUI
= new Class ({
424 Extends : qwebirc
. ui
. StandardUI
,
425 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
426 this . parent ( parentElement
, windowClass
, uiName
, options
);
428 this . __beeper
= new qwebirc
. ui
. Beeper ( this . uiOptions
);
429 this . __flasher
= new qwebirc
. ui
. Flasher ( this . uiOptions
);
431 this . beep
= this . __beeper
. beep
. bind ( this . __beeper
);
433 this . flash
= this . __flasher
. flash
. bind ( this . __flasher
);
434 this . cancelFlash
= this . __flasher
. cancelFlash
. bind ( this . __flasher
);
436 setBeepOnMention : function ( value
) {
438 this . __beeper
. soundInit ();
440 updateTitle : function ( text
) {
441 if ( this . __flasher
. updateTitle ( text
))
444 focusChange : function ( value
) {
446 this . __flasher
. focusChange ( value
);
450 qwebirc
. ui
. NewLoginUI
= new Class ({
451 Extends : qwebirc
. ui
. NotificationUI
,
452 loginBox : function ( callbackfn
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
453 this . postInitialize ();
455 /* I'd prefer something shorter and snappier! */
456 var w
= this . newCustomWindow ( "Connection details" , true , qwebirc
. ui
. WINDOW_CONNECT
);
457 var callback = function ( args
) {
462 qwebirc
. ui
. GenericLoginBox ( w
. lines
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this . options
. networkName
);
466 qwebirc
. ui
. QuakeNetUI
= new Class ({
467 Extends : qwebirc
. ui
. NewLoginUI
,
468 urlDispatcher : function ( name
, window
) {
469 if ( name
== "qwhois" ) {
470 return [ "span" , function ( auth
) {
471 this . client
. exec ( "/MSG Q whois #" + auth
);
474 return this . parent ( name
, window
);
477 if (! qwebirc
. auth
. loggedin ())
479 if ( confirm ( "Log out?" )) {
480 this . clients
. each ( function ( k
, v
) {
481 v
. quit ( "Logged out" );
485 var foo = function () { document
. location
= qwebirc
. global
. dynamicBaseURL
+ "auth?logout=1" ; };
491 qwebirc
. ui
. RootUI
= qwebirc
. ui
. QuakeNetUI
;
493 qwebirc
. ui
. RequestTransformHTML = function ( options
) {
494 var HREF_ELEMENTS
= {
498 var update
= options
. update
;
499 var onSuccess
= options
. onSuccess
;
501 var fixUp = function ( node
) {
502 if ( node
. nodeType
!= 1 )
505 var tagName
= node
. nodeName
. toUpperCase ();
506 if ( HREF_ELEMENTS
[ tagName
]) {
507 var attr
= node
. getAttribute ( "transform_attr" );
508 var value
= node
. getAttribute ( "transform_value" );
509 if ($ defined ( attr
) && $ defined ( value
)) {
510 node
. removeAttribute ( "transform_attr" );
511 node
. removeAttribute ( "transform_value" );
512 node
. setAttribute ( attr
, qwebirc
. global
. staticBaseURL
+ value
);
516 for ( var i
= 0 ; i
< node
. childNodes
. length
; i
++)
517 fixUp ( node
. childNodes
[ i
]);
520 delete options
[ "update" ];
521 options
. onSuccess = function ( tree
, elements
, html
, js
) {
522 var container
= new Element ( "div" );
523 container
. set ( "html" , html
);
527 while ( container
. childNodes
. length
> 0 ) {
528 var x
= container
. firstChild
;
529 container
. removeChild ( x
);
530 update
. appendChild ( x
);
535 return new Request
. HTML ( options
);