]>
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 qwebirc
. ui
. GenericLoginBox ( this . parentElement
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this . options
. networkName
);
179 focusChange : function ( newValue
) {
180 var window_
= this . getActiveWindow ();
181 if ($ defined ( window_
))
182 window_
. focusChange ( newValue
);
186 qwebirc
. ui
. StandardUI
= new Class ({
187 Extends : qwebirc
. ui
. BaseUI
,
188 UICommands : qwebirc
. ui
. UI_COMMANDS
,
189 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
190 this . parent ( parentElement
, windowClass
, uiName
, options
);
192 this . tabCompleter
= new qwebirc
. ui
. TabCompleterFactory ( this );
193 this . uiOptions
= new qwebirc
. ui
. DefaultOptionsClass ( this , options
. uiOptionsArg
);
194 this . customWindows
= {};
197 if ( Browser
. Engine
. trident
) {
202 document
. addEvent ( ev
, this . __handleHotkey
. bind ( this ));
204 __handleHotkey : function ( x
) {
205 if (! x
. alt
|| x
. control
) {
206 if ( x
. key
== "backspace" || x
. key
== "/" )
207 if (! this . getInputFocused ( x
))
212 if ( x
. key
== "a" || x
. key
== "A" ) {
214 var highestIndex
= - 1 ;
218 for ( var i
= 0 ; i
< this . windowArray
. length
; i
++) {
219 var h
= this . windowArray
[ i
]. hilighted
;
225 if ( highestIndex
> - 1 )
226 this . selectWindow ( this . windowArray
[ highestIndex
]);
227 } else if ( x
. key
>= '0' && x
. key
<= '9' ) {
230 number
= x
. key
- '0' ;
236 if ( number
>= this . windowArray
. length
)
239 this . selectWindow ( this . windowArray
[ number
]);
240 } else if ( x
. key
== "left" ) {
243 } else if ( x
. key
== "right" ) {
250 getInputFocused : function ( x
) {
251 if ($$( "input" ). indexOf ( x
. target
) == - 1 && $$( "textarea" ). indexOf ( x
. target
) == - 1 )
255 newCustomWindow : function ( name
, select
, type
) {
257 type
= qwebirc
. ui
. WINDOW_CUSTOM
;
259 var w
= this . newWindow ( qwebirc
. ui
. CUSTOM_CLIENT
, type
, name
);
260 w
. addEvent ( "close" , function ( w
) {
261 delete this . windows
[ qwebirc
. ui
. CUSTOM_CLIENT
][ w
. identifier
];
265 this . selectWindow ( w
);
269 addCustomWindow : function ( windowName
, class_
, cssClass
, options
) {
270 if (!$ defined ( options
))
273 if ( this . customWindows
[ windowName
]) {
274 this . selectWindow ( this . customWindows
[ windowName
]);
278 var d
= this . newCustomWindow ( windowName
, true );
279 this . customWindows
[ windowName
] = d
;
281 d
. addEvent ( "close" , function () {
282 this . customWindows
[ windowName
] = null ;
286 d
. lines
. addClass ( "qwebirc-" + cssClass
);
288 var ew
= new class_ ( d
. lines
, options
);
289 ew
. addEvent ( "close" , function () {
295 embeddedWindow : function () {
296 this . addCustomWindow ( "Add webchat to your site" , qwebirc
. ui
. EmbedWizard
, "embeddedwizard" , { baseURL : this . options
. baseURL
, uiOptions : this . uiOptions
, optionsCallback : function () {
297 this . optionsWindow ();
300 optionsWindow : function () {
301 this . addCustomWindow ( "Options" , qwebirc
. ui
. OptionsPane
, "optionspane" , this . uiOptions
);
303 aboutWindow : function () {
304 this . addCustomWindow ( "About" , qwebirc
. ui
. AboutPane
, "aboutpane" , this . uiOptions
);
306 privacyWindow : function () {
307 this . addCustomWindow ( "Privacy policy" , qwebirc
. ui
. PrivacyPolicyPane
, "privacypolicypane" , this . uiOptions
);
309 feedbackWindow : function () {
310 this . addCustomWindow ( "Feedback" , qwebirc
. ui
. FeedbackPane
, "feedbackpane" , this . uiOptions
);
312 faqWindow : function () {
313 this . addCustomWindow ( "FAQ" , qwebirc
. ui
. FAQPane
, "faqpane" , this . uiOptions
);
315 urlDispatcher : function ( name
, window
) {
316 if ( name
== "embedded" )
317 return [ "a" , this . embeddedWindow
. bind ( this )];
319 if ( name
== "options" )
320 return [ "a" , this . optionsWindow
. bind ( this )];
322 /* doesn't really belong here */
323 if ( name
== "whois" ) {
324 return [ "span" , function ( nick
) {
325 if ( this . uiOptions
. QUERY_ON_NICK_CLICK
) {
326 window
. client
. exec ( "/QUERY " + nick
);
328 window
. client
. exec ( "/WHOIS " + nick
);
335 tabComplete : function ( element
) {
336 this . tabCompleter
. tabComplete ( element
);
338 resetTabComplete : function () {
339 this . tabCompleter
. reset ();
341 setModifiableStylesheet : function ( name
) {
342 this . __styleSheet
= new qwebirc
. ui
. style
. ModifiableStylesheet ( qwebirc
. global
. staticBaseURL
+ "css/" + name
+ qwebirc
. FILE_SUFFIX
+ ".mcss" );
344 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 );
346 setModifiableStylesheetValues : function ( hue
, saturation
, lightness
) {
347 if (!$ defined ( this . __styleSheet
))
349 this . __styleSheet
. set ( function ( x
) {
350 return x
. setHue ( hue
). setSaturation ( x
. hsb
[ 1 ] + saturation
). setBrightness ( x
. hsb
[ 2 ] + lightness
);
355 qwebirc
. ui
. NotificationUI
= new Class ({
356 Extends : qwebirc
. ui
. StandardUI
,
357 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
358 this . parent ( parentElement
, windowClass
, uiName
, options
);
360 this . __beeper
= new qwebirc
. ui
. Beeper ( this . uiOptions
);
361 this . __flasher
= new qwebirc
. ui
. Flasher ( this . uiOptions
);
363 this . beep
= this . __beeper
. beep
. bind ( this . __beeper
);
365 this . flash
= this . __flasher
. flash
. bind ( this . __flasher
);
366 this . cancelFlash
= this . __flasher
. cancelFlash
. bind ( this . __flasher
);
368 setBeepOnMention : function ( value
) {
370 this . __beeper
. soundInit ();
372 updateTitle : function ( text
) {
373 if ( this . __flasher
. updateTitle ( text
))
376 focusChange : function ( value
) {
378 this . __flasher
. focusChange ( value
);
382 qwebirc
. ui
. NewLoginUI
= new Class ({
383 Extends : qwebirc
. ui
. NotificationUI
,
384 loginBox : function ( callbackfn
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
385 this . postInitialize ();
387 /* I'd prefer something shorter and snappier! */
388 var w
= this . newCustomWindow ( "Connection details" , true , qwebirc
. ui
. WINDOW_CONNECT
);
389 var callback = function ( args
) {
394 qwebirc
. ui
. GenericLoginBox ( w
. lines
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this . options
. networkName
);
398 qwebirc
. ui
. QuakeNetUI
= new Class ({
399 Extends : qwebirc
. ui
. NewLoginUI
,
400 urlDispatcher : function ( name
, window
) {
401 if ( name
== "qwhois" ) {
402 return [ "span" , function ( auth
) {
403 this . client
. exec ( "/MSG Q whois #" + auth
);
406 return this . parent ( name
, window
);
409 if (! qwebirc
. auth
. loggedin ())
411 if ( confirm ( "Log out?" )) {
412 for ( var client
in this . clients
) {
413 this . clients
[ client
]. quit ( "Logged out" );
417 var foo = function () { document
. location
= qwebirc
. global
. dynamicBaseURL
+ "auth?logout=1" ; };
423 qwebirc
. ui
. RootUI
= qwebirc
. ui
. QuakeNetUI
;
425 qwebirc
. ui
. RequestTransformHTML = function ( options
) {
426 var HREF_ELEMENTS
= {
430 var update
= options
. update
;
431 var onSuccess
= options
. onSuccess
;
433 var fixUp = function ( node
) {
434 if ( node
. nodeType
!= 1 )
437 var tagName
= node
. nodeName
. toUpperCase ();
438 if ( HREF_ELEMENTS
[ tagName
]) {
439 var attr
= node
. getAttribute ( "transform_attr" );
440 var value
= node
. getAttribute ( "transform_value" );
441 if ($ defined ( attr
) && $ defined ( value
)) {
442 node
. removeAttribute ( "transform_attr" );
443 node
. removeAttribute ( "transform_value" );
444 node
. setAttribute ( attr
, qwebirc
. global
. staticBaseURL
+ value
);
448 for ( var i
= 0 ; i
< node
. childNodes
. length
; i
++)
449 fixUp ( node
. childNodes
[ i
]);
452 delete options
[ "update" ];
453 options
. onSuccess = function ( tree
, elements
, html
, js
) {
454 var container
= new Element ( "div" );
455 container
. set ( "html" , html
);
459 while ( container
. childNodes
. length
> 0 ) {
460 var x
= container
. firstChild
;
461 container
. removeChild ( x
);
462 update
. appendChild ( x
);
467 return new Request
. HTML ( options
);