]>
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 . poller
= new qwebirc
. xdomain
. Poller ( this . oobMessage
. bind ( this ));
64 this . fireEvent ( "signedOn" , client
);
66 this . windows
. put ( client
. id
, new QHash ());
67 this . clients
. put ( client
. id
, client
);
68 var w
= this . newWindow ( client
, qwebirc
. ui
. WINDOW_STATUS
, "Status" );
70 if (! this . firstClient
) {
71 this . firstClient
= true ;
72 w
. addLine ( "" , "qwebirc v" + qwebirc
. VERSION
);
73 w
. addLine ( "" , "Copyright (C) 2008-2014 Chris Porter and the qwebirc project." );
74 w
. addLine ( "" , "http://www.qwebirc.org" );
75 w
. addLine ( "" , "Licensed under the GNU General Public License, Version 2." );
79 getClientId : function ( client
) {
80 if ( client
== qwebirc
. ui
. CUSTOM_CLIENT
) {
81 return qwebirc
. ui
. CUSTOM_CLIENT
;
86 getWindowIdentifier : function ( client
, type
, name
) {
87 if ( type
== qwebirc
. ui
. WINDOW_MESSAGES
)
89 if ( type
== qwebirc
. ui
. WINDOW_STATUS
)
92 if ( client
== qwebirc
. ui
. CUSTOM_CLIENT
) /* HACK */
95 return "_" + client
. toIRCLower ( name
);
97 newWindow : function ( client
, type
, name
) {
98 var w
= this . getWindow ( client
, type
, name
);
102 var wId
= this . getWindowIdentifier ( client
, type
, name
);
103 var w
= new this . windowClass ( this , client
, type
, name
, wId
);
104 this . windows
. get ( this . getClientId ( client
)). put ( wId
, w
);
105 this . windowArray
. push ( w
);
109 getWindow : function ( client
, type
, name
) {
110 var c
= this . windows
. get ( this . getClientId ( client
));
114 return c
[ this . getWindowIdentifier ( client
, type
, name
)];
116 getActiveWindow : function () {
119 getActiveIRCWindow : function ( client
) {
120 if (! this . active
|| this . active
. type
== qwebirc
. ui
. WINDOW_CUSTOM
) {
121 return this . windows
. get ( this . getClientId ( client
)). get ( this . getWindowIdentifier ( client
, qwebirc
. ui
. WINDOW_STATUS
));
126 __setActiveWindow : function ( window
) {
127 this . active
= window
;
129 renameWindow : function ( window
, name
) {
130 if ( this . getWindow ( window
. client
, window
. type
, name
))
133 var clientId
= this . getClientId ( window
. client
);
134 var index
= this . windowArray
. indexOf ( window
);
138 this . windows
. get ( clientId
). remove ( window
. identifier
);
140 var window
= this . windowArray
[ index
];
142 window
. identifier
= this . getWindowIdentifier ( window
. client
, window
. type
, window
. name
);
144 this . windows
. get ( clientId
). put ( window
. identifier
, this . windowArray
[ index
]);
147 this . updateTitle ( window
. name
+ " - " + this . options
. appTitle
);
149 window
. rename ( window
. name
);
152 selectWindow : function ( window
) {
154 this . active
. deselect ();
155 window
. select (); /* calls setActiveWindow */
156 this . updateTitle ( window
. name
+ " - " + this . options
. appTitle
);
158 updateTitle : function ( text
) {
159 document
. title
= text
;
161 nextWindow : function ( direction
) {
162 if ( this . windowArray
. length
== 0 || ! this . active
)
168 var index
= this . windowArray
. indexOf ( this . active
);
172 index
= index
+ direction
;
174 index
= this . windowArray
. length
- 1 ;
175 } else if ( index
>= this . windowArray
. length
) {
179 this . selectWindow ( this . windowArray
[ index
]);
181 prevWindow : function () {
184 __closed : function ( window
) {
186 this . active
= undefined ;
187 if ( this . windowArray
. length
== 1 ) {
188 this . windowArray
= [];
190 var index
= this . windowArray
. indexOf ( window
);
193 } else if ( index
== 0 ) {
194 this . selectWindow ( this . windowArray
[ 1 ]);
196 this . selectWindow ( this . windowArray
[ index
- 1 ]);
201 this . windowArray
= this . windowArray
. erase ( window
);
202 this . windows
. get ( this . getClientId ( window
. client
)). remove ( window
. identifier
);
205 this shouldn't be called by overriding classes!
206 they should implement their own!
207 some form of user input MUST be received before an
208 IRC connection is made, else users are going to get
209 tricked into getting themselves glined
211 loginBox : function ( callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
212 this . postInitialize ();
214 this . addCustomWindow ( "Connection details" , qwebirc
. ui
. ConnectPane
, "connectpane" , {
215 initialNickname : initialNickname
, initialChannels : initialChannels
, autoConnect : autoConnect
, networkName : this . options
. networkName
, callback : callback
, autoNick : autoNick
216 }, qwebirc
. ui
. WINDOW_CONNECT
);
218 focusChange : function ( newValue
) {
219 var window_
= this . getActiveWindow ();
220 if ($ defined ( window_
))
221 window_
. focusChange ( newValue
);
223 oobMessage : function ( message
) {
224 var c
= message
. splitMax ( " " , 2 );
232 var d
= c
[ 1 ]. splitMax ( " " , 2 );
238 if ( command
== "SAY" ) {
239 var w
= this . getActiveIRCWindow ();
240 if ($ defined ( w
) && ( w
. type
== qwebirc
. ui
. WINDOW_CHANNEL
|| w
. type
== qwebirc
. ui
. WINDOW_QUERY
)) {
241 w
. client
. exec ( "/SAY " + args
);
248 qwebirc
. ui
. StandardUI
= new Class ({
249 Extends : qwebirc
. ui
. BaseUI
,
250 UICommands : qwebirc
. ui
. UI_COMMANDS
,
251 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
252 this . parent ( parentElement
, windowClass
, uiName
, options
);
254 this . tabCompleter
= new qwebirc
. ui
. TabCompleterFactory ( this );
255 this . uiOptions
= new qwebirc
. ui
. DefaultOptionsClass ( this , options
. uiOptionsArg
);
256 this . customWindows
= new QHash ();
258 this . __styleValues
= { hue : this . uiOptions
. STYLE_HUE
, saturation : 0 , lightness : 0 };
259 if ($ defined ( this . options
. hue
)) this . __styleValues
. hue
= this . options
. hue
;
260 if ($ defined ( this . options
. saturation
)) this . __styleValues
. saturation
= this . options
. saturation
;
261 if ($ defined ( this . options
. lightness
)) this . __styleValues
. lightness
= this . options
. lightness
;
263 if ( this . options
. thue
!== null ) this . __styleValues
. textHue
= this . options
. thue
;
264 if ( this . options
. tsaturation
!== null ) this . __styleValues
. textSaturation
= this . options
. tsaturation
;
265 if ( this . options
. tlightness
!== null ) this . __styleValues
. textLightness
= this . options
. tlightness
;
268 if ( Browser
. Engine
. trident
) {
273 document
. addEvent ( ev
, this . __handleHotkey
. bind ( this ));
275 __handleHotkey : function ( x
) {
276 if (! x
. alt
|| x
. control
) {
277 if ( x
. key
== "backspace" || x
. key
== "/" )
278 if (! this . getInputFocused ( x
))
283 if ( x
. key
== "a" || x
. key
== "A" ) {
285 var highestIndex
= - 1 ;
289 for ( var i
= 0 ; i
< this . windowArray
. length
; i
++) {
290 var h
= this . windowArray
[ i
]. hilighted
;
296 if ( highestIndex
> - 1 )
297 this . selectWindow ( this . windowArray
[ highestIndex
]);
298 } else if ( x
. key
>= '0' && x
. key
<= '9' ) {
301 number
= x
. key
- '0' ;
307 if ( number
>= this . windowArray
. length
)
310 this . selectWindow ( this . windowArray
[ number
]);
311 } else if ( x
. key
== "left" ) {
314 } else if ( x
. key
== "right" ) {
321 getInputFocused : function ( x
) {
322 if ($$( "input" ). indexOf ( x
. target
) == - 1 && $$( "textarea" ). indexOf ( x
. target
) == - 1 )
326 newCustomWindow : function ( name
, select
, type
) {
328 type
= qwebirc
. ui
. WINDOW_CUSTOM
;
330 var w
= this . newWindow ( qwebirc
. ui
. CUSTOM_CLIENT
, type
, name
);
331 w
. addEvent ( "close" , function ( w
) {
332 this . windows
. get ( qwebirc
. ui
. CUSTOM_CLIENT
). remove ( w
. identifier
);
336 this . selectWindow ( w
);
340 addCustomWindow : function ( windowName
, class_
, cssClass
, options
, type
) {
341 if (!$ defined ( options
))
344 if ( this . customWindows
. contains ( windowName
)) {
345 this . selectWindow ( this . customWindows
. get ( windowName
));
349 var d
= this . newCustomWindow ( windowName
, true , type
);
350 this . customWindows
. put ( windowName
, d
);
352 d
. addEvent ( "close" , function () {
353 this . customWindows
. remove ( windowName
);
357 d
. lines
. addClass ( "qwebirc-" + cssClass
);
359 var ew
= new class_ ( d
. lines
, options
);
360 ew
. addEvent ( "close" , function () {
366 embeddedWindow : function () {
367 this . addCustomWindow ( "Add webchat to your site" , qwebirc
. ui
. EmbedWizard
, "embeddedwizard" , { baseURL : this . options
. baseURL
, uiOptions : this . uiOptions
, optionsCallback : function () {
368 this . optionsWindow ();
371 optionsWindow : function () {
372 this . addCustomWindow ( "Options" , qwebirc
. ui
. OptionsPane
, "optionspane" , this . uiOptions
);
374 aboutWindow : function () {
375 this . addCustomWindow ( "About" , qwebirc
. ui
. AboutPane
, "aboutpane" , this . uiOptions
);
377 privacyWindow : function () {
378 this . addCustomWindow ( "Privacy policy" , qwebirc
. ui
. PrivacyPolicyPane
, "privacypolicypane" , this . uiOptions
);
380 feedbackWindow : function () {
381 this . addCustomWindow ( "Feedback" , qwebirc
. ui
. FeedbackPane
, "feedbackpane" , this . uiOptions
);
383 helpWindow : function () {
384 this . addCustomWindow ( "Help!" , qwebirc
. ui
. HelpPane
, "helppane" , this . uiOptions
);
386 urlDispatcher : function ( name
, window
) {
387 if ( name
== "embedded" )
388 return [ "a" , this . embeddedWindow
. bind ( this )];
390 if ( name
== "options" )
391 return [ "a" , this . optionsWindow
. bind ( this )];
393 /* doesn't really belong here */
394 if ( name
== "whois" ) {
395 return [ "span" , function ( nick
) {
396 if ( this . uiOptions
. QUERY_ON_NICK_CLICK
) {
397 window
. client
. exec ( "/QUERY " + nick
);
399 window
. client
. exec ( "/WHOIS " + nick
);
406 tabComplete : function ( element
) {
407 this . tabCompleter
. tabComplete ( element
);
409 resetTabComplete : function () {
410 this . tabCompleter
. reset ();
412 setModifiableStylesheet : function ( name
) {
413 this . __styleSheet
= new qwebirc
. ui
. style
. ModifiableStylesheet ( qwebirc
. global
. staticBaseURL
+ "css/" + ( QWEBIRC_DEBUG
? "debug/" : "" ) + name
+ qwebirc
. FILE_SUFFIX
+ ".mcss" );
414 this . setModifiableStylesheetValues ({});
416 setModifiableStylesheetValues : function ( values
) {
418 this . __styleValues
[ k
] = values
[ k
];
420 if (!$ defined ( this . __styleSheet
))
423 var back
= { hue : this . __styleValues
. hue
, lightness : this . __styleValues
. lightness
, saturation : this . __styleValues
. saturation
};
424 var front
= { hue : this . __styleValues
. textHue
, lightness : this . __styleValues
. textLightness
, saturation : this . __styleValues
. textSaturation
};
426 if (! this . __styleValues
. textHue
&& ! this . __styleValues
. textLightness
&& ! this . __styleValues
. textSaturation
)
434 this . __styleSheet
. set ( function () {
435 var mode
= arguments
[ 0 ];
437 var t
= colours
[ arguments
[ 2 ]];
438 var x
= new Color ( arguments
[ 1 ]);
439 var c
= x
. setHue ( t
. hue
). setSaturation ( x
. hsb
[ 1 ] + t
. saturation
). setBrightness ( x
. hsb
[ 2 ] + t
. lightness
);
440 if ( c
== "255,255,255" ) /* IE confuses white with transparent... */
443 return "rgb(" + c
+ ")" ;
444 } else if ( mode
== "o" ) {
445 return this . uiOptions
[ arguments
[ 1 ]] ? arguments
[ 2 ] : arguments
[ 3 ];
451 qwebirc
. ui
. NotificationUI
= new Class ({
452 Extends : qwebirc
. ui
. StandardUI
,
453 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
454 this . parent ( parentElement
, windowClass
, uiName
, options
);
456 this . __beeper
= new qwebirc
. ui
. Beeper ( this . uiOptions
);
457 this . __flasher
= new qwebirc
. ui
. Flasher ( this . uiOptions
);
459 this . beep
= this . __beeper
. beep
. bind ( this . __beeper
);
461 this . flash
= this . __flasher
. flash
. bind ( this . __flasher
);
462 this . cancelFlash
= this . __flasher
. cancelFlash
. bind ( this . __flasher
);
464 setBeepOnMention : function ( value
) {
466 this . __beeper
. soundInit ();
468 updateTitle : function ( text
) {
469 if ( this . __flasher
. updateTitle ( text
))
472 focusChange : function ( value
) {
474 this . __flasher
. focusChange ( value
);
478 qwebirc
. ui
. QuakeNetUI
= new Class ({
479 Extends : qwebirc
. ui
. NotificationUI
,
480 urlDispatcher : function ( name
, window
) {
481 if ( name
== "qwhois" ) {
482 return [ "span" , function ( auth
) {
483 this . client
. exec ( "/MSG Q whois #" + auth
);
486 return this . parent ( name
, window
);
489 if (! qwebirc
. auth
. loggedin ())
491 if ( confirm ( "Log out?" )) {
492 this . clients
. each ( function ( k
, v
) {
493 v
. quit ( "Logged out" );
497 var foo = function () { document
. location
= qwebirc
. global
. dynamicBaseURL
+ "auth?logout=1" ; };
503 qwebirc
. ui
. RootUI
= qwebirc
. ui
. QuakeNetUI
;
505 qwebirc
. ui
. RequestTransformHTML = function ( options
) {
506 var HREF_ELEMENTS
= {
510 var update
= options
. update
;
511 var onSuccess
= options
. onSuccess
;
513 var fixUp = function ( node
) {
514 if ( node
. nodeType
!= 1 )
517 var tagName
= node
. nodeName
. toUpperCase ();
518 if ( HREF_ELEMENTS
[ tagName
]) {
519 var attr
= node
. getAttribute ( "transform_attr" );
520 var value
= node
. getAttribute ( "transform_value" );
521 if ($ defined ( attr
) && $ defined ( value
)) {
522 node
. removeAttribute ( "transform_attr" );
523 node
. removeAttribute ( "transform_value" );
524 node
. setAttribute ( attr
, qwebirc
. global
. staticBaseURL
+ value
);
528 for ( var i
= 0 ; i
< node
. childNodes
. length
; i
++)
529 fixUp ( node
. childNodes
[ i
]);
532 delete options
[ "update" ];
533 options
. onSuccess = function ( tree
, elements
, html
, js
) {
534 var container
= new Element ( "div" );
535 container
. set ( "html" , html
);
539 while ( container
. childNodes
. length
> 0 ) {
540 var x
= container
. firstChild
;
541 container
. removeChild ( x
);
542 update
. appendChild ( x
);
547 return new Request
. HTML ( options
);