]>
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 this . postInitialize ();
202 this . addCustomWindow ( "Connection details" , qwebirc
. ui
. ConnectPane
, "connectpane" , {
203 initialNickname : initialNickname
, initialChannels : initialChannels
, autoConnect : autoConnect
, networkName : this . options
. networkName
, callback : callback
, autoNick : autoNick
204 }, qwebirc
. ui
. WINDOW_CONNECT
);
206 focusChange : function ( newValue
) {
207 var window_
= this . getActiveWindow ();
208 if ($ defined ( window_
))
209 window_
. focusChange ( newValue
);
211 signedOn : function () {
212 this . poller
= new qwebirc
. xdomain
. Poller ( this . oobMessage
. bind ( this ));
214 oobMessage : function ( message
) {
215 var c
= message
. splitMax ( " " , 2 );
223 var d
= c
[ 1 ]. splitMax ( " " , 2 );
229 if ( command
== "SAY" ) {
230 var w
= this . getActiveIRCWindow ();
231 if ($ defined ( w
) && ( w
. type
== qwebirc
. ui
. WINDOW_CHANNEL
|| w
. type
== qwebirc
. ui
. WINDOW_QUERY
)) {
232 w
. client
. exec ( "/SAY " + args
);
239 qwebirc
. ui
. StandardUI
= new Class ({
240 Extends : qwebirc
. ui
. BaseUI
,
241 UICommands : qwebirc
. ui
. UI_COMMANDS
,
242 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
243 this . parent ( parentElement
, windowClass
, uiName
, options
);
245 this . tabCompleter
= new qwebirc
. ui
. TabCompleterFactory ( this );
246 this . uiOptions
= new qwebirc
. ui
. DefaultOptionsClass ( this , options
. uiOptionsArg
);
247 this . customWindows
= {};
249 this . __styleValues
= { hue : this . uiOptions
. STYLE_HUE
, saturation : 0 , lightness : 0 };
250 if ($ defined ( this . options
. hue
)) this . __styleValues
. hue
= this . options
. hue
;
251 if ($ defined ( this . options
. saturation
)) this . __styleValues
. saturation
= this . options
. saturation
;
252 if ($ defined ( this . options
. lightness
)) this . __styleValues
. lightness
= this . options
. lightness
;
255 if ( Browser
. Engine
. trident
) {
260 document
. addEvent ( ev
, this . __handleHotkey
. bind ( this ));
262 __handleHotkey : function ( x
) {
263 if (! x
. alt
|| x
. control
) {
264 if ( x
. key
== "backspace" || x
. key
== "/" )
265 if (! this . getInputFocused ( x
))
270 if ( x
. key
== "a" || x
. key
== "A" ) {
272 var highestIndex
= - 1 ;
276 for ( var i
= 0 ; i
< this . windowArray
. length
; i
++) {
277 var h
= this . windowArray
[ i
]. hilighted
;
283 if ( highestIndex
> - 1 )
284 this . selectWindow ( this . windowArray
[ highestIndex
]);
285 } else if ( x
. key
>= '0' && x
. key
<= '9' ) {
288 number
= x
. key
- '0' ;
294 if ( number
>= this . windowArray
. length
)
297 this . selectWindow ( this . windowArray
[ number
]);
298 } else if ( x
. key
== "left" ) {
301 } else if ( x
. key
== "right" ) {
308 getInputFocused : function ( x
) {
309 if ($$( "input" ). indexOf ( x
. target
) == - 1 && $$( "textarea" ). indexOf ( x
. target
) == - 1 )
313 newCustomWindow : function ( name
, select
, type
) {
315 type
= qwebirc
. ui
. WINDOW_CUSTOM
;
317 var w
= this . newWindow ( qwebirc
. ui
. CUSTOM_CLIENT
, type
, name
);
318 w
. addEvent ( "close" , function ( w
) {
319 delete this . windows
[ qwebirc
. ui
. CUSTOM_CLIENT
][ w
. identifier
];
323 this . selectWindow ( w
);
327 addCustomWindow : function ( windowName
, class_
, cssClass
, options
, type
) {
328 if (!$ defined ( options
))
331 if ( this . customWindows
[ windowName
]) {
332 this . selectWindow ( this . customWindows
[ windowName
]);
336 var d
= this . newCustomWindow ( windowName
, true , type
);
337 this . customWindows
[ windowName
] = d
;
339 d
. addEvent ( "close" , function () {
340 this . customWindows
[ windowName
] = null ;
344 d
. lines
. addClass ( "qwebirc-" + cssClass
);
346 var ew
= new class_ ( d
. lines
, options
);
347 ew
. addEvent ( "close" , function () {
353 embeddedWindow : function () {
354 this . addCustomWindow ( "Add webchat to your site" , qwebirc
. ui
. EmbedWizard
, "embeddedwizard" , { baseURL : this . options
. baseURL
, uiOptions : this . uiOptions
, optionsCallback : function () {
355 this . optionsWindow ();
358 optionsWindow : function () {
359 this . addCustomWindow ( "Options" , qwebirc
. ui
. OptionsPane
, "optionspane" , this . uiOptions
);
361 aboutWindow : function () {
362 this . addCustomWindow ( "About" , qwebirc
. ui
. AboutPane
, "aboutpane" , this . uiOptions
);
364 privacyWindow : function () {
365 this . addCustomWindow ( "Privacy policy" , qwebirc
. ui
. PrivacyPolicyPane
, "privacypolicypane" , this . uiOptions
);
367 feedbackWindow : function () {
368 this . addCustomWindow ( "Feedback" , qwebirc
. ui
. FeedbackPane
, "feedbackpane" , this . uiOptions
);
370 faqWindow : function () {
371 this . addCustomWindow ( "FAQ" , qwebirc
. ui
. FAQPane
, "faqpane" , this . uiOptions
);
373 urlDispatcher : function ( name
, window
) {
374 if ( name
== "embedded" )
375 return [ "a" , this . embeddedWindow
. bind ( this )];
377 if ( name
== "options" )
378 return [ "a" , this . optionsWindow
. bind ( this )];
380 /* doesn't really belong here */
381 if ( name
== "whois" ) {
382 return [ "span" , function ( nick
) {
383 if ( this . uiOptions
. QUERY_ON_NICK_CLICK
) {
384 window
. client
. exec ( "/QUERY " + nick
);
386 window
. client
. exec ( "/WHOIS " + nick
);
393 tabComplete : function ( element
) {
394 this . tabCompleter
. tabComplete ( element
);
396 resetTabComplete : function () {
397 this . tabCompleter
. reset ();
399 setModifiableStylesheet : function ( name
) {
400 this . __styleSheet
= new qwebirc
. ui
. style
. ModifiableStylesheet ( qwebirc
. global
. staticBaseURL
+ "css/" + name
+ qwebirc
. FILE_SUFFIX
+ ".mcss" );
401 this . setModifiableStylesheetValues ({});
403 setModifiableStylesheetValues : function ( values
) {
405 this . __styleValues
[ k
] = values
[ k
];
407 if (!$ defined ( this . __styleSheet
))
410 var hue
= this . __styleValues
. hue
, lightness
= this . __styleValues
. lightness
, saturation
= this . __styleValues
. saturation
;
412 this . __styleSheet
. set ( function () {
413 var mode
= arguments
[ 0 ];
415 var x
= new Color ( arguments
[ 1 ]);
416 var c
= x
. setHue ( hue
). setSaturation ( x
. hsb
[ 1 ] + saturation
). setBrightness ( x
. hsb
[ 2 ] + lightness
);
417 if ( c
== "255,255,255" ) /* IE confuses white with transparent... */
420 return "rgb(" + c
+ ")" ;
421 } else if ( mode
== "o" ) {
422 return this . uiOptions
[ arguments
[ 1 ]] ? arguments
[ 2 ] : arguments
[ 3 ];
428 qwebirc
. ui
. NotificationUI
= new Class ({
429 Extends : qwebirc
. ui
. StandardUI
,
430 initialize : function ( parentElement
, windowClass
, uiName
, options
) {
431 this . parent ( parentElement
, windowClass
, uiName
, options
);
433 this . __beeper
= new qwebirc
. ui
. Beeper ( this . uiOptions
);
434 this . __flasher
= new qwebirc
. ui
. Flasher ( this . uiOptions
);
436 this . beep
= this . __beeper
. beep
. bind ( this . __beeper
);
438 this . flash
= this . __flasher
. flash
. bind ( this . __flasher
);
439 this . cancelFlash
= this . __flasher
. cancelFlash
. bind ( this . __flasher
);
441 setBeepOnMention : function ( value
) {
443 this . __beeper
. soundInit ();
445 updateTitle : function ( text
) {
446 if ( this . __flasher
. updateTitle ( text
))
449 focusChange : function ( value
) {
451 this . __flasher
. focusChange ( value
);
455 qwebirc
. ui
. QuakeNetUI
= new Class ({
456 Extends : qwebirc
. ui
. NotificationUI
,
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
);