]>
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 this . setModifiableStylesheetValues ($ defined ( this . options
. hue
) ? this . options
. hue : this . uiOptions
. STYLE_HUE
, $ defined ( this . options
. saturation
) ? this . options
. saturation : 0 , $ defined ( this . options
. lightness
) ? this . options
. lightness : 0 );
376 setModifiableStylesheetValues : function ( hue
, saturation
, lightness
) {
377 if (!$ defined ( this . __styleSheet
))
379 this . __styleSheet
. set ( function ( x
) {
380 return x
. setHue ( hue
). setSaturation ( x
. hsb
[ 1 ] + saturation
). setBrightness ( x
. hsb
[ 2 ] + lightness
);
385 qwebirc
. ui
. NotificationUI
= new Class ({
386 Extends : qwebirc
. ui
. StandardUI
,
387 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
388 this . parent ( parentElement
, windowClass
, uiName
, options
);
390 this . __beeper
= new qwebirc
. ui
. Beeper ( this . uiOptions
);
391 this . __flasher
= new qwebirc
. ui
. Flasher ( this . uiOptions
);
393 this . beep
= this . __beeper
. beep
. bind ( this . __beeper
);
395 this . flash
= this . __flasher
. flash
. bind ( this . __flasher
);
396 this . cancelFlash
= this . __flasher
. cancelFlash
. bind ( this . __flasher
);
398 setBeepOnMention : function ( value
) {
400 this . __beeper
. soundInit ();
402 updateTitle : function ( text
) {
403 if ( this . __flasher
. updateTitle ( text
))
406 focusChange : function ( value
) {
408 this . __flasher
. focusChange ( value
);
412 qwebirc
. ui
. QuakeNetUI
= new Class ({
413 Extends : qwebirc
. ui
. NotificationUI
,
414 urlDispatcher : function ( name
, window
) {
415 if ( name
== "qwhois" ) {
416 return [ "span" , function ( auth
) {
417 this . client
. exec ( "/MSG Q whois #" + auth
);
420 return this . parent ( name
, window
);
423 if (! qwebirc
. auth
. loggedin ())
425 if ( confirm ( "Log out?" )) {
426 for ( var client
in this . clients
) {
427 this . clients
[ client
]. quit ( "Logged out" );
431 var foo = function () { document
. location
= qwebirc
. global
. dynamicBaseURL
+ "auth?logout=1" ; };
437 qwebirc
. ui
. RootUI
= qwebirc
. ui
. QuakeNetUI
;
439 qwebirc
. ui
. RequestTransformHTML = function ( options
) {
440 var HREF_ELEMENTS
= {
444 var update
= options
. update
;
445 var onSuccess
= options
. onSuccess
;
447 var fixUp = function ( node
) {
448 if ( node
. nodeType
!= 1 )
451 var tagName
= node
. nodeName
. toUpperCase ();
452 if ( HREF_ELEMENTS
[ tagName
]) {
453 var attr
= node
. getAttribute ( "transform_attr" );
454 var value
= node
. getAttribute ( "transform_value" );
455 if ($ defined ( attr
) && $ defined ( value
)) {
456 node
. removeAttribute ( "transform_attr" );
457 node
. removeAttribute ( "transform_value" );
458 node
. setAttribute ( attr
, qwebirc
. global
. staticBaseURL
+ value
);
462 for ( var i
= 0 ; i
< node
. childNodes
. length
; i
++)
463 fixUp ( node
. childNodes
[ i
]);
466 delete options
[ "update" ];
467 options
. onSuccess = function ( tree
, elements
, html
, js
) {
468 var container
= new Element ( "div" );
469 container
. set ( "html" , html
);
473 while ( container
. childNodes
. length
> 0 ) {
474 var x
= container
. firstChild
;
475 container
. removeChild ( x
);
476 update
. appendChild ( x
);
481 return new Request
. HTML ( options
);