]>
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-2012 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 renameWindow : function ( window
, name
) {
118 if ( this . getWindow ( window
. client
, window
. type
, name
))
121 var clientId
= this . getClientId ( window
. client
);
122 var index
= this . windowArray
. indexOf ( window
);
126 delete this . windows
[ clientId
][ window
. identifier
];
128 var window
= this . windowArray
[ index
];
130 window
. identifier
= this . getWindowIdentifier ( window
. client
, window
. type
, window
. name
);
132 this . windows
[ clientId
][ window
. identifier
] = this . windowArray
[ index
];
135 this . updateTitle ( window
. name
+ " - " + this . options
. appTitle
);
137 window
. rename ( window
. name
);
140 selectWindow : function ( window
) {
142 this . active
. deselect ();
143 window
. select (); /* calls setActiveWindow */
144 this . updateTitle ( window
. name
+ " - " + this . options
. appTitle
);
146 updateTitle : function ( text
) {
147 document
. title
= text
;
149 nextWindow : function ( direction
) {
150 if ( this . windowArray
. length
== 0 || ! this . active
)
156 var index
= this . windowArray
. indexOf ( this . active
);
160 index
= index
+ direction
;
162 index
= this . windowArray
. length
- 1 ;
163 } else if ( index
>= this . windowArray
. length
) {
167 this . selectWindow ( this . windowArray
[ index
]);
169 prevWindow : function () {
172 __closed : function ( window
) {
174 this . active
= undefined ;
175 if ( this . windowArray
. length
== 1 ) {
176 this . windowArray
= [];
178 var index
= this . windowArray
. indexOf ( window
);
181 } else if ( index
== 0 ) {
182 this . selectWindow ( this . windowArray
[ 1 ]);
184 this . selectWindow ( this . windowArray
[ index
- 1 ]);
189 this . windowArray
= this . windowArray
. erase ( window
);
190 delete this . windows
[ this . getClientId ( window
. client
)][ window
. identifier
];
193 this shouldn't be called by overriding classes!
194 they should implement their own!
195 some form of user input MUST be received before an
196 IRC connection is made, else users are going to get
197 tricked into getting themselves glined
199 loginBox : function ( callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
200 qwebirc
. ui
. GenericLoginBox ( this . parentElement
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this . options
. networkName
);
202 focusChange : function ( newValue
) {
203 var window_
= this . getActiveWindow ();
204 if ($ defined ( window_
))
205 window_
. focusChange ( newValue
);
209 qwebirc
. ui
. StandardUI
= new Class ({
210 Extends : qwebirc
. ui
. BaseUI
,
211 UICommands : qwebirc
. ui
. UI_COMMANDS
,
212 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
213 this . parent ( parentElement
, windowClass
, uiName
, options
);
215 this . tabCompleter
= new qwebirc
. ui
. TabCompleterFactory ( this );
216 this . uiOptions
= new qwebirc
. ui
. DefaultOptionsClass ( this , options
. uiOptionsArg
);
217 this . customWindows
= {};
219 this . __styleValues
= { hue : this . uiOptions
. STYLE_HUE
, saturation : 0 , lightness : 0 };
220 if ($ defined ( this . options
. hue
)) this . __styleValues
. hue
= this . options
. hue
;
221 if ($ defined ( this . options
. saturation
)) this . __styleValues
. saturation
= this . options
. saturation
;
222 if ($ defined ( this . options
. lightness
)) this . __styleValues
. lightness
= this . options
. lightness
;
224 if ( this . options
. thue
!== null ) this . __styleValues
. textHue
= this . options
. thue
;
225 if ( this . options
. tsaturation
!== null ) this . __styleValues
. textSaturation
= this . options
. tsaturation
;
226 if ( this . options
. tlightness
!== null ) this . __styleValues
. textLightness
= this . options
. tlightness
;
229 if ( Browser
. Engine
. trident
) {
234 document
. addEvent ( ev
, this . __handleHotkey
. bind ( this ));
236 __handleHotkey : function ( x
) {
237 if (! x
. alt
|| x
. control
) {
238 if ( x
. key
== "backspace" || x
. key
== "/" )
239 if (! this . getInputFocused ( x
))
244 if ( x
. key
== "a" || x
. key
== "A" ) {
246 var highestIndex
= - 1 ;
250 for ( var i
= 0 ; i
< this . windowArray
. length
; i
++) {
251 var h
= this . windowArray
[ i
]. hilighted
;
257 if ( highestIndex
> - 1 )
258 this . selectWindow ( this . windowArray
[ highestIndex
]);
259 } else if ( x
. key
>= '0' && x
. key
<= '9' ) {
262 number
= x
. key
- '0' ;
268 if ( number
>= this . windowArray
. length
)
271 this . selectWindow ( this . windowArray
[ number
]);
272 } else if ( x
. key
== "left" ) {
275 } else if ( x
. key
== "right" ) {
282 getInputFocused : function ( x
) {
283 if ($$( "input" ). indexOf ( x
. target
) == - 1 && $$( "textarea" ). indexOf ( x
. target
) == - 1 )
287 newCustomWindow : function ( name
, select
, type
) {
289 type
= qwebirc
. ui
. WINDOW_CUSTOM
;
291 var w
= this . newWindow ( qwebirc
. ui
. CUSTOM_CLIENT
, type
, name
);
292 w
. addEvent ( "close" , function ( w
) {
293 delete this . windows
[ qwebirc
. ui
. CUSTOM_CLIENT
][ w
. identifier
];
297 this . selectWindow ( w
);
301 addCustomWindow : function ( windowName
, class_
, cssClass
, options
) {
302 if (!$ defined ( options
))
305 if ( this . customWindows
[ windowName
]) {
306 this . selectWindow ( this . customWindows
[ windowName
]);
310 var d
= this . newCustomWindow ( windowName
, true );
311 this . customWindows
[ windowName
] = d
;
313 d
. addEvent ( "close" , function () {
314 this . customWindows
[ windowName
] = null ;
318 d
. lines
. addClass ( "qwebirc-" + cssClass
);
320 var ew
= new class_ ( d
. lines
, options
);
321 ew
. addEvent ( "close" , function () {
327 embeddedWindow : function () {
328 this . addCustomWindow ( "Add webchat to your site" , qwebirc
. ui
. EmbedWizard
, "embeddedwizard" , { baseURL : this . options
. baseURL
, uiOptions : this . uiOptions
, optionsCallback : function () {
329 this . optionsWindow ();
332 optionsWindow : function () {
333 this . addCustomWindow ( "Options" , qwebirc
. ui
. OptionsPane
, "optionspane" , this . uiOptions
);
335 aboutWindow : function () {
336 this . addCustomWindow ( "About" , qwebirc
. ui
. AboutPane
, "aboutpane" , this . uiOptions
);
338 privacyWindow : function () {
339 this . addCustomWindow ( "Privacy policy" , qwebirc
. ui
. PrivacyPolicyPane
, "privacypolicypane" , this . uiOptions
);
341 feedbackWindow : function () {
342 this . addCustomWindow ( "Feedback" , qwebirc
. ui
. FeedbackPane
, "feedbackpane" , this . uiOptions
);
344 faqWindow : function () {
345 this . addCustomWindow ( "FAQ" , qwebirc
. ui
. FAQPane
, "faqpane" , this . uiOptions
);
347 urlDispatcher : function ( name
, window
) {
348 if ( name
== "embedded" )
349 return [ "a" , this . embeddedWindow
. bind ( this )];
351 if ( name
== "options" )
352 return [ "a" , this . optionsWindow
. bind ( this )];
354 /* doesn't really belong here */
355 if ( name
== "whois" ) {
356 return [ "span" , function ( nick
) {
357 if ( this . uiOptions
. QUERY_ON_NICK_CLICK
) {
358 window
. client
. exec ( "/QUERY " + nick
);
360 window
. client
. exec ( "/WHOIS " + nick
);
367 tabComplete : function ( element
) {
368 this . tabCompleter
. tabComplete ( element
);
370 resetTabComplete : function () {
371 this . tabCompleter
. reset ();
373 setModifiableStylesheet : function ( name
) {
374 this . __styleSheet
= new qwebirc
. ui
. style
. ModifiableStylesheet ( qwebirc
. global
. staticBaseURL
+ "css/" + name
+ qwebirc
. FILE_SUFFIX
+ ".mcss" );
375 this . setModifiableStylesheetValues ({});
377 setModifiableStylesheetValues : function ( values
) {
379 this . __styleValues
[ k
] = values
[ k
];
381 if (!$ defined ( this . __styleSheet
))
384 var back
= { hue : this . __styleValues
. hue
, lightness : this . __styleValues
. lightness
, saturation : this . __styleValues
. saturation
};
385 var front
= { hue : this . __styleValues
. textHue
, lightness : this . __styleValues
. textLightness
, saturation : this . __styleValues
. textSaturation
};
387 if (! this . __styleValues
. textHue
&& ! this . __styleValues
. textLightness
&& ! this . __styleValues
. textSaturation
)
395 this . __styleSheet
. set ( function () {
396 var mode
= arguments
[ 0 ];
398 var t
= colours
[ arguments
[ 2 ]];
399 var x
= new Color ( arguments
[ 1 ]);
400 var c
= x
. setHue ( t
. hue
). setSaturation ( x
. hsb
[ 1 ] + t
. saturation
). setBrightness ( x
. hsb
[ 2 ] + t
. lightness
);
401 if ( c
== "255,255,255" ) /* IE confuses white with transparent... */
404 return "rgb(" + c
+ ")" ;
405 } else if ( mode
== "o" ) {
406 return this . uiOptions
[ arguments
[ 1 ]] ? arguments
[ 2 ] : arguments
[ 3 ];
412 qwebirc
. ui
. NotificationUI
= new Class ({
413 Extends : qwebirc
. ui
. StandardUI
,
414 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
415 this . parent ( parentElement
, windowClass
, uiName
, options
);
417 this . __beeper
= new qwebirc
. ui
. Beeper ( this . uiOptions
);
418 this . __flasher
= new qwebirc
. ui
. Flasher ( this . uiOptions
);
420 this . beep
= this . __beeper
. beep
. bind ( this . __beeper
);
422 this . flash
= this . __flasher
. flash
. bind ( this . __flasher
);
423 this . cancelFlash
= this . __flasher
. cancelFlash
. bind ( this . __flasher
);
425 setBeepOnMention : function ( value
) {
427 this . __beeper
. soundInit ();
429 updateTitle : function ( text
) {
430 if ( this . __flasher
. updateTitle ( text
))
433 focusChange : function ( value
) {
435 this . __flasher
. focusChange ( value
);
439 qwebirc
. ui
. NewLoginUI
= new Class ({
440 Extends : qwebirc
. ui
. NotificationUI
,
441 loginBox : function ( callbackfn
, initialNickname
, initialChannels
, autoConnect
, autoNick
) {
442 this . postInitialize ();
444 /* I'd prefer something shorter and snappier! */
445 var w
= this . newCustomWindow ( "Connection details" , true , qwebirc
. ui
. WINDOW_CONNECT
);
446 var callback = function ( args
) {
451 qwebirc
. ui
. GenericLoginBox ( w
. lines
, callback
, initialNickname
, initialChannels
, autoConnect
, autoNick
, this . options
. networkName
);
455 qwebirc
. ui
. QuakeNetUI
= new Class ({
456 Extends : qwebirc
. ui
. NewLoginUI
,
457 urlDispatcher : function ( name
, window
) {
458 if ( name
== "qwhois" ) {
459 return [ "span" , function ( auth
) {
460 this . client
. exec ( "/MSG Q whois #" + auth
);
463 return this . parent ( name
, window
);
466 if (! qwebirc
. auth
. loggedin ())
468 if ( confirm ( "Log out?" )) {
469 for ( var client
in this . clients
) {
470 this . clients
[ client
]. quit ( "Logged out" );
474 var foo = function () { document
. location
= qwebirc
. global
. dynamicBaseURL
+ "auth?logout=1" ; };
480 qwebirc
. ui
. RootUI
= qwebirc
. ui
. QuakeNetUI
;
482 qwebirc
. ui
. RequestTransformHTML = function ( options
) {
483 var HREF_ELEMENTS
= {
487 var update
= options
. update
;
488 var onSuccess
= options
. onSuccess
;
490 var fixUp = function ( node
) {
491 if ( node
. nodeType
!= 1 )
494 var tagName
= node
. nodeName
. toUpperCase ();
495 if ( HREF_ELEMENTS
[ tagName
]) {
496 var attr
= node
. getAttribute ( "transform_attr" );
497 var value
= node
. getAttribute ( "transform_value" );
498 if ($ defined ( attr
) && $ defined ( value
)) {
499 node
. removeAttribute ( "transform_attr" );
500 node
. removeAttribute ( "transform_value" );
501 node
. setAttribute ( attr
, qwebirc
. global
. staticBaseURL
+ value
);
505 for ( var i
= 0 ; i
< node
. childNodes
. length
; i
++)
506 fixUp ( node
. childNodes
[ i
]);
509 delete options
[ "update" ];
510 options
. onSuccess = function ( tree
, elements
, html
, js
) {
511 var container
= new Element ( "div" );
512 container
. set ( "html" , html
);
516 while ( container
. childNodes
. length
> 0 ) {
517 var x
= container
. firstChild
;
518 container
. removeChild ( x
);
519 update
. appendChild ( x
);
524 return new Request
. HTML ( options
);