]>
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
;
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-2010 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 this . postInitialize ();
179 this . addCustomWindow ( "Connection details" , qwebirc
. ui
. ConnectPane
, "connectpane" , {
180 initialNickname : initialNickname
, initialChannels : initialChannels
, autoConnect : autoConnect
, networkName : this . options
. networkName
, callback : callback
, autoNick : autoNick
181 }, qwebirc
. ui
. WINDOW_CONNECT
);
183 focusChange : function ( newValue
) {
184 var window_
= this . getActiveWindow ();
185 if ($ defined ( window_
))
186 window_
. focusChange ( newValue
);
188 signedOn : function () {
189 this . poller
= new qwebirc
. xdomain
. Poller ( this . oobMessage
. bind ( this ));
191 oobMessage : function ( message
) {
192 var c
= message
. splitMax ( " " , 2 );
200 var d
= c
[ 1 ]. splitMax ( " " , 2 );
206 if ( command
== "SAY" ) {
207 var w
= this . getActiveIRCWindow ();
208 if ($ defined ( w
) && ( w
. type
== qwebirc
. ui
. WINDOW_CHANNEL
|| w
. type
== qwebirc
. ui
. WINDOW_QUERY
)) {
209 w
. client
. exec ( "/SAY " + args
);
216 qwebirc
. ui
. StandardUI
= new Class ({
217 Extends : qwebirc
. ui
. BaseUI
,
218 UICommands : qwebirc
. ui
. UI_COMMANDS
,
219 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
220 this . parent ( parentElement
, windowClass
, uiName
, options
);
222 this . tabCompleter
= new qwebirc
. ui
. TabCompleterFactory ( this );
223 this . uiOptions
= new qwebirc
. ui
. DefaultOptionsClass ( this , options
. uiOptionsArg
);
224 this . customWindows
= {};
227 if ( Browser
. Engine
. trident
) {
232 document
. addEvent ( ev
, this . __handleHotkey
. bind ( this ));
234 __handleHotkey : function ( x
) {
235 if (! x
. alt
|| x
. control
) {
236 if ( x
. key
== "backspace" || x
. key
== "/" )
237 if (! this . getInputFocused ( x
))
242 if ( x
. key
== "a" || x
. key
== "A" ) {
244 var highestIndex
= - 1 ;
248 for ( var i
= 0 ; i
< this . windowArray
. length
; i
++) {
249 var h
= this . windowArray
[ i
]. hilighted
;
255 if ( highestIndex
> - 1 )
256 this . selectWindow ( this . windowArray
[ highestIndex
]);
257 } else if ( x
. key
>= '0' && x
. key
<= '9' ) {
260 number
= x
. key
- '0' ;
266 if ( number
>= this . windowArray
. length
)
269 this . selectWindow ( this . windowArray
[ number
]);
270 } else if ( x
. key
== "left" ) {
273 } else if ( x
. key
== "right" ) {
280 getInputFocused : function ( x
) {
281 if ($$( "input" ). indexOf ( x
. target
) == - 1 && $$( "textarea" ). indexOf ( x
. target
) == - 1 )
285 newCustomWindow : function ( name
, select
, type
) {
287 type
= qwebirc
. ui
. WINDOW_CUSTOM
;
289 var w
= this . newWindow ( qwebirc
. ui
. CUSTOM_CLIENT
, type
, name
);
290 w
. addEvent ( "close" , function ( w
) {
291 delete this . windows
[ qwebirc
. ui
. CUSTOM_CLIENT
][ w
. identifier
];
295 this . selectWindow ( w
);
299 addCustomWindow : function ( windowName
, class_
, cssClass
, options
, type
) {
300 if (!$ defined ( options
))
303 if ( this . customWindows
[ windowName
]) {
304 this . selectWindow ( this . customWindows
[ windowName
]);
308 var d
= this . newCustomWindow ( windowName
, true , type
);
309 this . customWindows
[ windowName
] = d
;
311 d
. addEvent ( "close" , function () {
312 this . customWindows
[ windowName
] = null ;
316 d
. lines
. addClass ( "qwebirc-" + cssClass
);
318 var ew
= new class_ ( d
. lines
, options
);
319 ew
. addEvent ( "close" , function () {
325 embeddedWindow : function () {
326 this . addCustomWindow ( "Add webchat to your site" , qwebirc
. ui
. EmbedWizard
, "embeddedwizard" , { baseURL : this . options
. baseURL
, uiOptions : this . uiOptions
, optionsCallback : function () {
327 this . optionsWindow ();
330 optionsWindow : function () {
331 this . addCustomWindow ( "Options" , qwebirc
. ui
. OptionsPane
, "optionspane" , this . uiOptions
);
333 aboutWindow : function () {
334 this . addCustomWindow ( "About" , qwebirc
. ui
. AboutPane
, "aboutpane" , this . uiOptions
);
336 privacyWindow : function () {
337 this . addCustomWindow ( "Privacy policy" , qwebirc
. ui
. PrivacyPolicyPane
, "privacypolicypane" , this . uiOptions
);
339 feedbackWindow : function () {
340 this . addCustomWindow ( "Feedback" , qwebirc
. ui
. FeedbackPane
, "feedbackpane" , this . uiOptions
);
342 faqWindow : function () {
343 this . addCustomWindow ( "FAQ" , qwebirc
. ui
. FAQPane
, "faqpane" , this . uiOptions
);
345 urlDispatcher : function ( name
, window
) {
346 if ( name
== "embedded" )
347 return [ "a" , this . embeddedWindow
. bind ( this )];
349 if ( name
== "options" )
350 return [ "a" , this . optionsWindow
. bind ( this )];
352 /* doesn't really belong here */
353 if ( name
== "whois" ) {
354 return [ "span" , function ( nick
) {
355 if ( this . uiOptions
. QUERY_ON_NICK_CLICK
) {
356 window
. client
. exec ( "/QUERY " + nick
);
358 window
. client
. exec ( "/WHOIS " + nick
);
365 tabComplete : function ( element
) {
366 this . tabCompleter
. tabComplete ( element
);
368 resetTabComplete : function () {
369 this . tabCompleter
. reset ();
371 setModifiableStylesheet : function ( name
) {
372 this . __styleSheet
= new qwebirc
. ui
. style
. ModifiableStylesheet ( qwebirc
. global
. staticBaseURL
+ "css/" + name
+ qwebirc
. FILE_SUFFIX
+ ".mcss" );
374 if ($ defined ( this . options
. hue
)) {
375 this . setModifiableStylesheetValues ( this . options
. hue
, 0 , 0 );
377 this . setModifiableStylesheetValues ( this . uiOptions
. STYLE_HUE
, 0 , 0 );
380 setModifiableStylesheetValues : function ( hue
, saturation
, lightness
) {
381 if (!$ defined ( this . __styleSheet
))
383 this . __styleSheet
. set ( function ( x
) {
384 return x
. setHue ( hue
). setSaturation ( x
. hsb
[ 1 ] + saturation
). setBrightness ( x
. hsb
[ 2 ] + lightness
);
389 qwebirc
. ui
. NotificationUI
= new Class ({
390 Extends : qwebirc
. ui
. StandardUI
,
391 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
392 this . parent ( parentElement
, windowClass
, uiName
, options
);
394 this . __beeper
= new qwebirc
. ui
. Beeper ( this . uiOptions
);
395 this . __flasher
= new qwebirc
. ui
. Flasher ( this . uiOptions
);
397 this . beep
= this . __beeper
. beep
. bind ( this . __beeper
);
399 this . flash
= this . __flasher
. flash
. bind ( this . __flasher
);
400 this . cancelFlash
= this . __flasher
. cancelFlash
. bind ( this . __flasher
);
402 setBeepOnMention : function ( value
) {
404 this . __beeper
. soundInit ();
406 updateTitle : function ( text
) {
407 if ( this . __flasher
. updateTitle ( text
))
410 focusChange : function ( value
) {
412 this . __flasher
. focusChange ( value
);
416 qwebirc
. ui
. QuakeNetUI
= new Class ({
417 Extends : qwebirc
. ui
. NotificationUI
,
418 urlDispatcher : function ( name
, window
) {
419 if ( name
== "qwhois" ) {
420 return [ "span" , function ( auth
) {
421 this . client
. exec ( "/MSG Q whois #" + auth
);
424 return this . parent ( name
, window
);
427 if (! qwebirc
. auth
. loggedin ())
429 if ( confirm ( "Log out?" )) {
430 for ( var client
in this . clients
) {
431 this . clients
[ client
]. quit ( "Logged out" );
435 var foo = function () { document
. location
= qwebirc
. global
. dynamicBaseURL
+ "auth?logout=1" ; };
441 qwebirc
. ui
. RootUI
= qwebirc
. ui
. QuakeNetUI
;
443 qwebirc
. ui
. RequestTransformHTML = function ( options
) {
444 var HREF_ELEMENTS
= {
448 var update
= options
. update
;
449 var onSuccess
= options
. onSuccess
;
451 var fixUp = function ( node
) {
452 if ( node
. nodeType
!= 1 )
455 var tagName
= node
. nodeName
. toUpperCase ();
456 if ( HREF_ELEMENTS
[ tagName
]) {
457 var attr
= node
. getAttribute ( "transform_attr" );
458 var value
= node
. getAttribute ( "transform_value" );
459 if ($ defined ( attr
) && $ defined ( value
)) {
460 node
. removeAttribute ( "transform_attr" );
461 node
. removeAttribute ( "transform_value" );
462 node
. setAttribute ( attr
, qwebirc
. global
. staticBaseURL
+ value
);
466 for ( var i
= 0 ; i
< node
. childNodes
. length
; i
++)
467 fixUp ( node
. childNodes
[ i
]);
470 delete options
[ "update" ];
471 options
. onSuccess = function ( tree
, elements
, html
, js
) {
472 var container
= new Element ( "div" );
473 container
. set ( "html" , html
);
477 while ( container
. childNodes
. length
> 0 ) {
478 var x
= container
. firstChild
;
479 container
. removeChild ( x
);
480 update
. appendChild ( x
);
485 return new Request
. HTML ( options
);