2015-06-05 03:59:28 -04:00
var FFZ = window . FrankerFaceZ ,
utils = require ( '../utils' ) ,
2015-07-13 21:52:44 -04:00
constants = require ( '../constants' ) ;
2015-06-05 03:59:28 -04:00
// --------------------
// Settings
// --------------------
2015-08-14 13:21:57 -04:00
FFZ . basic _settings . delayed _chat = {
type : "select" ,
options : {
0 : "No Delay" ,
300 : "Minor (Bot Moderation; 0.3s)" ,
1200 : "Normal (Human Moderation; 1.2s)" ,
5000 : "Large (Spoiler Removal / Really Slow Mods; 5s)"
} ,
2015-08-09 23:32:29 -07:00
category : "Chat" ,
2015-08-21 19:00:48 -04:00
no _bttv : true ,
2015-08-09 23:32:29 -07:00
2015-08-21 19:00:48 -04:00
name : "Delay and Filter Chat" ,
2015-08-14 13:21:57 -04:00
help : "Delay the appearance of chat messages to allow time for moderation and completely hide removed messages." ,
2015-08-09 23:32:29 -07:00
get : function ( ) {
2015-08-14 13:21:57 -04:00
if ( ! this . settings . remove _deleted || ! this . settings . remove _bot _ban _notices )
return 0 ;
return this . settings . chat _delay ;
2015-08-09 23:32:29 -07:00
} ,
set : function ( val ) {
2015-08-14 13:21:57 -04:00
val = + val ;
this . settings . set ( 'remove_deleted' , val !== 0 ) ;
this . settings . set ( 'remove_bot_ban_notices' , val !== 0 ) ;
this . settings . set ( 'chat_delay' , val ) ;
2015-08-09 23:32:29 -07:00
}
} ;
2015-07-06 00:09:21 -04:00
FFZ . settings _info . minimal _chat = {
2015-10-17 18:05:44 -04:00
type : "select" ,
options : {
0 : "Disabled" ,
1 : "No Heading" ,
2 : "Minimalistic Input" ,
3 : "All"
} ,
value : 0 ,
2015-07-04 17:06:36 -04:00
2015-07-13 21:52:44 -04:00
category : "Chat Appearance" ,
2015-08-04 01:43:08 -04:00
2015-07-04 17:06:36 -04:00
name : "Minimalistic Chat" ,
help : "Hide all of the chat user interface, only showing messages and an input box." ,
2015-10-17 18:05:44 -04:00
process _value : function ( val ) {
if ( val === false )
return 0 ;
else if ( val === true )
return 3 ;
else if ( typeof val === "string" )
return parseInt ( val ) || 0 ;
return val ;
} ,
2015-07-04 17:06:36 -04:00
on _update : function ( val ) {
2015-10-17 18:05:44 -04:00
document . body . classList . toggle ( "ffz-minimal-chat-head" , val === 1 || val === 3 ) ;
document . body . classList . toggle ( "ffz-minimal-chat-input" , val > 1 ) ;
2015-07-04 17:06:36 -04:00
if ( this . settings . group _tabs && this . _chatv && this . _chatv . _ffz _tabs ) {
var f = this ;
setTimeout ( function ( ) {
f . _chatv && f . _chatv . $ ( '.chat-room' ) . css ( 'top' , f . _chatv . _ffz _tabs . offsetHeight + "px" ) ;
2015-07-06 00:09:21 -04:00
f . _roomv && f . _roomv . get ( 'stuckToBottom' ) && f . _roomv . _scrollToBottom ( ) ;
2015-07-04 17:06:36 -04:00
} , 0 ) ;
}
2015-08-04 01:43:08 -04:00
2015-10-17 18:05:44 -04:00
if ( ( val === 1 || val === 3 ) && this . _chatv && this . _chatv . get ( 'controller.showList' ) )
2015-07-13 21:52:44 -04:00
this . _chatv . set ( 'controller.showList' , false ) ;
2015-08-04 01:43:08 -04:00
2015-07-29 01:03:10 -04:00
// Remove the style if we have it.
2015-10-17 18:05:44 -04:00
if ( ! ( val > 1 ) && this . _chat _style ) {
2015-07-29 01:03:10 -04:00
if ( this . _inputv ) {
if ( this . _inputv . _ffz _minimal _style )
this . _inputv . _ffz _minimal _style . innerHTML = '' ;
2015-08-04 01:43:08 -04:00
2015-07-29 01:03:10 -04:00
this . _inputv . _ffz _last _height = undefined ;
}
2015-08-04 01:43:08 -04:00
2015-07-29 01:03:10 -04:00
utils . update _css ( this . _chat _style , "input_height" , '' ) ;
this . _roomv && this . _roomv . get ( 'stuckToBottom' ) && this . _roomv . _scrollToBottom ( ) ;
2015-08-04 01:43:08 -04:00
2015-10-17 18:05:44 -04:00
} else if ( val > 1 && this . _inputv )
2015-07-29 01:03:10 -04:00
this . _inputv . ffzResizeInput ( ) ;
}
} ;
2015-08-09 23:32:29 -07:00
FFZ . settings _info . chat _delay = {
type : "select" ,
options : {
0 : "No Delay" ,
2015-08-14 13:21:57 -04:00
300 : "Minor (Bot Moderation; 0.3s)" ,
1200 : "Normal (Human Moderation; 1.2s)" ,
5000 : "Large (Spoiler Removal / Really Slow Mods; 5s)"
2015-08-09 23:32:29 -07:00
} ,
value : 0 ,
category : "Chat Appearance" ,
2015-08-21 19:00:48 -04:00
no _bttv : true ,
2015-08-09 23:32:29 -07:00
name : "Artificial Chat Delay" ,
2015-08-14 13:21:57 -04:00
help : "Delay the appearance of chat messages to allow for moderation before you see them." ,
process _value : function ( val ) {
if ( typeof val === "string" )
return parseInt ( val || "0" ) ;
return val ;
} ,
2015-08-09 23:32:29 -07:00
on _update : function ( val ) {
2015-08-14 13:21:57 -04:00
if ( this . _roomv )
this . _roomv . ffzUpdateStatus ( ) ;
2015-08-09 23:32:29 -07:00
}
} ;
2015-07-29 01:03:10 -04:00
FFZ . settings _info . remove _deleted = {
type : "boolean" ,
value : false ,
no _bttv : true ,
category : "Chat Filtering" ,
name : "Remove Deleted Messages" ,
help : "Remove deleted messages from chat entirely rather than leaving behind a clickable <deleted message>." ,
on _update : function ( val ) {
if ( this . has _bttv || ! this . rooms || ! val )
return ;
for ( var room _id in this . rooms ) {
var ffz _room = this . rooms [ room _id ] ,
room = ffz _room && ffz _room . room ;
if ( ! room )
continue ;
var msgs = room . get ( 'messages' ) ,
total = msgs . get ( 'length' ) ,
i = total ,
alternate ;
2015-08-04 01:43:08 -04:00
2015-07-29 01:03:10 -04:00
while ( i -- ) {
var msg = msgs . get ( i ) ;
if ( msg . ffz _deleted || msg . deleted ) {
if ( alternate === undefined )
alternate = msg . ffz _alternate ;
2015-07-31 17:44:20 -04:00
msgs . removeAt ( i ) ;
2015-07-29 01:03:10 -04:00
continue ;
}
2015-08-04 01:43:08 -04:00
2015-07-29 01:03:10 -04:00
if ( alternate === undefined )
alternate = msg . ffz _alternate ;
else {
alternate = ! alternate ;
room . set ( 'messages.' + i + '.ffz_alternate' , alternate ) ;
}
}
}
2015-07-04 17:06:36 -04:00
}
} ;
2015-08-09 23:32:29 -07:00
FFZ . settings _info . remove _bot _ban _notices = {
type : "boolean" ,
value : false ,
2015-08-21 19:00:48 -04:00
no _bttv : true ,
2015-08-09 23:32:29 -07:00
category : "Chat Filtering" ,
name : "Remove Bot Ban Notices" ,
help : "Remove messages from bots announcing who was banned for what reason and for how long." ,
} ;
2015-06-10 18:46:04 -04:00
FFZ . settings _info . prevent _clear = {
type : "boolean" ,
value : false ,
no _bttv : true ,
2015-07-13 21:52:44 -04:00
category : "Chat Filtering" ,
2015-06-10 18:46:04 -04:00
name : "Show Deleted Messages" ,
help : "Fade deleted messages instead of replacing them, and prevent chat from being cleared." ,
on _update : function ( val ) {
if ( this . has _bttv || ! this . rooms )
return ;
for ( var room _id in this . rooms ) {
var ffz _room = this . rooms [ room _id ] ,
room = ffz _room && ffz _room . room ;
if ( ! room )
continue ;
room . get ( "messages" ) . forEach ( function ( s , n ) {
if ( val && ! s . ffz _deleted && s . deleted )
room . set ( "messages." + n + ".deleted" , false ) ;
else if ( s . ffz _deleted && ! val && ! s . deleted )
room . set ( "messages." + n + ".deleted" , true ) ;
} ) ;
}
}
} ;
FFZ . settings _info . chat _history = {
type : "boolean" ,
value : true ,
visible : false ,
2015-07-13 21:52:44 -04:00
category : "Chat Appearance" ,
2015-06-10 18:46:04 -04:00
name : "Chat History <span>Alpha</span>" ,
help : "Load previous chat messages when loading a chat room so you can see what people have been talking about. <b>This currently only works in a handful of channels due to server capacity.</b>" ,
} ;
2015-06-05 03:59:28 -04:00
FFZ . settings _info . group _tabs = {
type : "boolean" ,
value : false ,
no _bttv : true ,
2015-07-13 21:52:44 -04:00
category : "Chat Moderation" ,
2015-06-05 03:59:28 -04:00
name : "Chat Room Tabs <span>Beta</span>" ,
help : "Enhanced UI for switching the current chat room and noticing new messages." ,
on _update : function ( val ) {
var enabled = ! this . has _bttv && val ;
if ( ! this . _chatv || enabled === this . _group _tabs _state )
return ;
if ( enabled )
this . _chatv . ffzEnableTabs ( ) ;
else
this . _chatv . ffzDisableTabs ( ) ;
}
} ;
FFZ . settings _info . pinned _rooms = {
value : [ ] ,
visible : false ,
2015-07-13 21:52:44 -04:00
} ;
2015-06-05 03:59:28 -04:00
2015-07-13 21:52:44 -04:00
FFZ . settings _info . visible _rooms = {
value : [ ] ,
visible : false ,
2015-06-05 03:59:28 -04:00
} ;
2015-01-20 01:53:18 -05:00
// --------------------
// Initialization
// --------------------
FFZ . prototype . setup _chatview = function ( ) {
2015-10-17 18:05:44 -04:00
document . body . classList . toggle ( "ffz-minimal-chat-head" , this . settings . minimal _chat === 1 || this . settings . minimal _chat === 3 ) ;
document . body . classList . toggle ( "ffz-minimal-chat-input" , this . settings . minimal _chat === 2 || this . settings . minimal _chat === 3 ) ;
2015-07-04 17:06:36 -04:00
2015-06-05 03:59:28 -04:00
this . log ( "Hooking the Ember Chat controller." ) ;
var Chat = App . _ _container _ _ . lookup ( 'controller:chat' ) ,
f = this ;
if ( Chat ) {
Chat . reopen ( {
ffzUpdateChannels : function ( ) {
2015-07-13 21:52:44 -04:00
if ( ! f . _chatv )
return ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
f . _chatv . ffzRebuildMenu ( ) ;
if ( f . settings . group _tabs )
2015-06-05 03:59:28 -04:00
f . _chatv . ffzRebuildTabs ( ) ;
2015-08-04 01:43:08 -04:00
2015-07-04 17:06:36 -04:00
} . observes ( "currentChannelRoom" , "connectedPrivateGroupRooms" ) ,
removeCurrentChannelRoom : function ( ) {
if ( ! f . settings . group _tabs || f . has _bttv )
return this . _super ( ) ;
var room = this . get ( "currentChannelRoom" ) ,
2015-07-13 21:52:44 -04:00
room _id = room && room . get ( 'id' ) ,
user = f . get _user ( ) ;
2015-07-04 17:06:36 -04:00
if ( ! f . settings . pinned _rooms || f . settings . pinned _rooms . indexOf ( room _id ) === - 1 ) {
if ( room === this . get ( "currentRoom" ) )
this . blurRoom ( ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
// Don't destroy it if it's the user's room.
if ( room && user && user . login === room _id )
2015-07-04 17:06:36 -04:00
room . destroy ( ) ;
}
this . set ( "currentChannelRoom" , void 0 ) ;
}
2015-06-05 03:59:28 -04:00
} ) ;
}
2015-01-20 01:53:18 -05:00
this . log ( "Hooking the Ember Chat view." ) ;
var Chat = App . _ _container _ _ . resolve ( 'view:chat' ) ;
this . _modify _cview ( Chat ) ;
// For some reason, this doesn't work unless we create an instance of the
// chat view and then destroy it immediately.
2015-02-24 00:33:29 -05:00
try {
Chat . create ( ) . destroy ( ) ;
} catch ( err ) { }
2015-01-20 01:53:18 -05:00
// Modify all existing Chat views.
for ( var key in Ember . View . views ) {
if ( ! Ember . View . views . hasOwnProperty ( key ) )
continue ;
var view = Ember . View . views [ key ] ;
if ( ! ( view instanceof Chat ) )
continue ;
2015-06-05 03:59:28 -04:00
this . log ( "Manually updating existing Chat view." , view ) ;
2015-02-10 01:34:23 -05:00
try {
2015-06-05 03:59:28 -04:00
view . ffzInit ( ) ;
2015-02-10 01:34:23 -05:00
} catch ( err ) {
this . error ( "setup: build_ui_link: " + err ) ;
}
2015-01-20 01:53:18 -05:00
}
2015-06-05 03:59:28 -04:00
this . log ( "Hooking the Ember 'Right Column' controller. Seriously..." ) ;
var Column = App . _ _container _ _ . lookup ( 'controller:right-column' ) ;
if ( ! Column )
return ;
Column . reopen ( {
ffzFixTabs : function ( ) {
if ( f . settings . group _tabs && f . _chatv && f . _chatv . _ffz _tabs ) {
setTimeout ( function ( ) {
f . _chatv && f . _chatv . $ ( '.chat-room' ) . css ( 'top' , f . _chatv . _ffz _tabs . offsetHeight + "px" ) ;
} , 0 ) ;
}
} . observes ( "firstTabSelected" )
} ) ;
2015-01-20 01:53:18 -05:00
}
// --------------------
// Modify Chat View
// --------------------
FFZ . prototype . _modify _cview = function ( view ) {
var f = this ;
view . reopen ( {
didInsertElement : function ( ) {
this . _super ( ) ;
2015-06-05 03:59:28 -04:00
2015-02-10 01:34:23 -05:00
try {
2015-06-05 03:59:28 -04:00
this . ffzInit ( ) ;
2015-02-10 01:34:23 -05:00
} catch ( err ) {
2015-06-05 03:59:28 -04:00
f . error ( "ChatView didInsertElement: " + err ) ;
2015-02-10 01:34:23 -05:00
}
2015-01-20 01:53:18 -05:00
} ,
willClearRender : function ( ) {
2015-02-10 01:34:23 -05:00
try {
2015-06-05 03:59:28 -04:00
this . ffzTeardown ( ) ;
2015-02-10 01:34:23 -05:00
} catch ( err ) {
2015-06-05 03:59:28 -04:00
f . error ( "ChatView willClearRender: " + err ) ;
2015-02-10 01:34:23 -05:00
}
2015-06-05 03:59:28 -04:00
this . _super ( ) ;
2015-01-20 01:53:18 -05:00
} ,
2015-06-05 03:59:28 -04:00
ffzInit : function ( ) {
f . _chatv = this ;
this . $ ( '.textarea-contain' ) . append ( f . build _ui _link ( this ) ) ;
2015-08-04 01:43:08 -04:00
this . $ ( '.chat-messages' ) . find ( '.html-tooltip' ) . tipsy ( { live : true , html : true , gravity : jQuery . fn . tipsy . autoNS } ) ;
2015-06-05 03:59:28 -04:00
if ( ! f . has _bttv && f . settings . group _tabs )
this . ffzEnableTabs ( ) ;
2015-07-13 21:52:44 -04:00
this . ffzRebuildMenu ( ) ;
2015-06-05 03:59:28 -04:00
setTimeout ( function ( ) {
2015-07-13 21:52:44 -04:00
if ( f . settings . group _tabs && f . _chatv && f . _chatv . _ffz _tabs )
2015-06-05 03:59:28 -04:00
f . _chatv . $ ( '.chat-room' ) . css ( 'top' , f . _chatv . _ffz _tabs . offsetHeight + "px" ) ;
var controller = f . _chatv . get ( 'controller' ) ;
controller && controller . set ( 'showList' , false ) ;
} , 1000 ) ;
} ,
ffzTeardown : function ( ) {
if ( f . _chatv === this )
f . _chatv = null ;
this . $ ( '.textarea-contain .ffz-ui-toggle' ) . remove ( ) ;
if ( f . settings . group _tabs )
this . ffzDisableTabs ( ) ;
} ,
ffzChangeRoom : Ember . observer ( 'controller.currentRoom' , function ( ) {
2015-07-29 01:03:10 -04:00
f . update _ui _link ( ) ;
2015-07-13 21:52:44 -04:00
2015-07-29 01:03:10 -04:00
var room = this . get ( 'controller.currentRoom' ) , rows ;
room && room . resetUnreadCount ( ) ;
2015-06-05 03:59:28 -04:00
2015-07-29 01:03:10 -04:00
if ( this . _ffz _chan _table ) {
rows = jQuery ( this . _ffz _chan _table ) ;
rows . children ( '.ffz-room-row' ) . removeClass ( 'active' ) ;
if ( room )
rows . children ( '.ffz-room-row[data-room="' + room . get ( 'id' ) + '"]' ) . addClass ( 'active' ) . children ( 'span' ) . text ( '' ) ;
}
2015-08-04 01:43:08 -04:00
2015-07-29 01:03:10 -04:00
if ( this . _ffz _group _table ) {
rows = jQuery ( this . _ffz _group _table ) ;
rows . children ( '.ffz-room-row' ) . removeClass ( 'active' ) ;
if ( room )
rows . children ( '.ffz-room-row[data-room="' + room . get ( 'id' ) + '"]' ) . addClass ( 'active' ) . children ( 'span' ) . text ( '' ) ;
}
2015-06-05 03:59:28 -04:00
2015-07-29 01:03:10 -04:00
if ( ! f . has _bttv && f . settings . group _tabs && this . _ffz _tabs ) {
var tabs = jQuery ( this . _ffz _tabs ) ;
tabs . children ( '.ffz-chat-tab' ) . removeClass ( 'active' ) ;
if ( room && room . _ffz _tab ) {
room . _ffz _tab . classList . remove ( 'tab-mentioned' ) ;
room . _ffz _tab . classList . remove ( 'hidden' ) ;
room . _ffz _tab . classList . add ( 'active' ) ;
var sp = room . _ffz _tab . querySelector ( 'span' ) ;
if ( sp )
sp . innerHTML = '' ;
2015-06-05 03:59:28 -04:00
}
2015-07-29 01:03:10 -04:00
// Invite Link
var can _invite = room && room . get ( 'canInvite' ) ;
this . _ffz _invite && this . _ffz _invite . classList . toggle ( 'hidden' , ! can _invite ) ;
this . set ( 'controller.showInviteUser' , can _invite && this . get ( 'controller.showInviteUser' ) )
// Now, adjust the chat-room.
this . $ ( '.chat-room' ) . css ( 'top' , this . _ffz _tabs . offsetHeight + "px" ) ;
2015-06-05 03:59:28 -04:00
}
} ) ,
2015-07-13 21:52:44 -04:00
// Better Menu
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
ffzRebuildMenu : function ( ) {
return ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
var el = this . get ( 'element' ) ,
room _list = el && el . querySelector ( '.chat-rooms .tse-content' ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
if ( ! room _list )
return ;
if ( ! room _list . classList . contains ( 'ffz-room-list' ) ) {
room _list . classList . add ( 'ffz-room-list' ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
// Find the Pending Invitations
var headers = room _list . querySelectorAll ( '.list-header' ) ,
hdr = headers . length ? headers [ headers . length - 1 ] : undefined ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
if ( hdr ) {
hdr . classList . add ( 'ffz' ) ;
if ( hdr . nextSibling && hdr . nextSibling . classList )
hdr . nextSibling . classList . add ( 'ffz' ) ;
}
}
// Channel Table
var t = this ,
chan _table = this . _ffz _chan _table || room _list . querySelector ( '#ffz-channel-table tbody' ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
if ( ! chan _table ) {
var tbl = document . createElement ( 'table' ) ;
tbl . setAttribute ( 'cellspacing' , 0 ) ;
tbl . id = 'ffz-channel-table' ;
tbl . className = 'ffz' ;
tbl . innerHTML = '<thead><tr><th colspan="2">Channels</th><th class="ffz-row-switch">Join</th><th class="ffz-row-switch">Pin</th></tr></thead><tbody></tbody>' ;
room _list . insertBefore ( tbl , room _list . firstChild ) ;
chan _table = this . _ffz _chan _table = tbl . querySelector ( 'tbody' ) ;
}
chan _table . innerHTML = '' ;
// Current Channel
var room = this . get ( 'controller.currentChannelRoom' ) , row ;
if ( room ) {
row = this . ffzBuildRow ( this , room , true ) ;
row && chan _table . appendChild ( row ) ;
}
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
// Host Target
if ( this . _ffz _host _room ) {
row = this . ffzBuildRow ( this , this . _ffz _host _room , false , true ) ;
row && chan _table . appendChild ( row ) ;
}
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
// Pinned Rooms
for ( var i = 0 ; i < f . settings . pinned _rooms . length ; i ++ ) {
var room _id = f . settings . pinned _rooms [ i ] ;
if ( room && room . get ( 'id' ) !== room _id && this . _ffz _host !== room _id && f . rooms [ room _id ] && f . rooms [ room _id ] . room ) {
row = this . ffzBuildRow ( this , f . rooms [ room _id ] . room ) ;
row && chan _table . appendChild ( row ) ;
}
}
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
// Group Chat Table
var group _table = this . _ffz _group _table || room _list . querySelector ( '#ffz-group-table tbody' ) ;
if ( ! group _table ) {
var tbl = document . createElement ( 'table' ) ;
tbl . setAttribute ( 'cellspacing' , 0 ) ;
tbl . id = 'ffz-group-table' ;
tbl . className = 'ffz' ;
tbl . innerHTML = '<thead><tr><th colspan="2">Group Chats</th><th class="ffz-row-switch">Pin</th></tr></thead><tbody></tbody>' ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
var before = room _list . querySelector ( '#ffz-channel-table' ) ;
room _list . insertBefore ( tbl , before . nextSibling ) ;
group _table = this . _ffz _group _table = tbl . querySelector ( 'tbody' ) ;
}
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
group _table . innerHTML = '' ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
_ . each ( this . get ( 'controller.connectedPrivateGroupRooms' ) , function ( room ) {
var row = t . ffzBuildRow ( t , room ) ;
row && group _table && group _table . appendChild ( row ) ;
} ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
// Change Create Tooltip
var create _btn = el . querySelector ( '.button.create' ) ;
if ( create _btn )
create _btn . title = 'Create a Group Room' ;
} ,
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
ffzBuildRow : function ( view , room , current _channel , host _channel ) {
var row = document . createElement ( 'tr' ) ,
icon = document . createElement ( 'td' ) ,
name _el = document . createElement ( 'td' ) ,
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
btn ,
toggle _pinned = document . createElement ( 'td' ) ,
toggle _visible = document . createElement ( 'td' ) ,
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
group = room . get ( 'isGroupRoom' ) ,
current = room === view . get ( 'controller.currentRoom' ) ,
//unread = format_unread(current ? 0 : room.get('unreadCount')),
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
name = room . get ( 'tmiRoom.displayName' ) || ( group ? room . get ( 'tmiRoom.name' ) : FFZ . get _capitalization ( room . get ( 'id' ) , function ( name ) {
f . log ( "Name for Row: " + name ) ;
//unread = format_unread(current ? 0 : room.get('unreadCount'));
name _el . innerHTML = utils . sanitize ( name ) ;
} ) ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
name _el . className = 'ffz-room' ;
name _el . innerHTML = utils . sanitize ( name ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
if ( current _channel ) {
icon . innerHTML = constants . CAMERA ;
icon . title = name _el . title = "Current Channel" ;
icon . className = name _el . className = 'tooltip' ;
} else if ( host _channel ) {
icon . innerHTML = constants . EYE ;
icon . title = name _el . title = "Hosted Channel" ;
icon . className = name _el . className = 'tooltip' ;
}
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
toggle _pinned . className = toggle _visible . className = 'ffz-row-switch' ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
toggle _pinned . innerHTML = '<a class="switch' + ( f . settings . pinned _rooms . indexOf ( room . get ( 'id' ) ) !== - 1 ? ' active' : '' ) + '"><span></span></a>' ;
toggle _visible . innerHTML = '<a class="switch' + ( f . settings . visible _rooms . indexOf ( room . get ( 'id' ) ) !== - 1 ? ' active' : '' ) + '"><span></span></a>' ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
row . setAttribute ( 'data-room' , room . get ( 'id' ) ) ;
row . className = 'ffz-room-row' ;
row . classList . toggle ( 'current-channel' , current _channel ) ;
row . classList . toggle ( 'host-channel' , host _channel ) ;
row . classList . toggle ( 'group-chat' , group ) ;
row . classList . toggle ( 'active' , current ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
row . appendChild ( icon ) ;
row . appendChild ( name _el ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
if ( ! group ) {
row . appendChild ( toggle _pinned ) ;
btn = toggle _pinned . querySelector ( 'a.switch' ) ;
btn . addEventListener ( 'click' , function ( e ) {
e . preventDefault ( ) ;
e . stopPropagation && e . stopPropagation ( ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
var room _id = room . get ( 'id' ) ,
is _pinned = f . settings . pinned _rooms . indexOf ( room _id ) !== - 1 ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
if ( is _pinned )
f . _leave _room ( room _id ) ;
else
f . _join _room ( room _id ) ;
this . classList . toggle ( 'active' , ! is _pinned ) ;
} ) ;
} else {
btn = document . createElement ( 'a' ) ;
btn . className = 'leave-chat tooltip' ;
btn . innerHTML = constants . CLOSE ;
btn . title = 'Leave Group' ;
name _el . appendChild ( btn ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
btn . addEventListener ( 'click' , function ( e ) {
e . preventDefault ( ) ;
e . stopPropagation && e . stopPropagation ( ) ;
if ( ! confirm ( 'Are you sure you want to leave the group room "' + name + '"?' ) )
return ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
room . get ( 'isGroupRoom' ) && room . del ( ) ;
} ) ;
}
row . appendChild ( toggle _visible ) ;
btn = toggle _visible . querySelector ( 'a.switch' ) ;
btn . addEventListener ( 'click' , function ( e ) {
e . preventDefault ( ) ;
e . stopPropagation && e . stopPropagation ( ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
var room _id = room . get ( 'id' ) ,
visible _rooms = f . settings . visible _rooms ,
is _visible = visible _rooms . indexOf ( room _id ) !== - 1 ;
2015-08-04 01:43:08 -04:00
if ( is _visible )
2015-07-13 21:52:44 -04:00
visible _rooms . removeObject ( room _id ) ;
else
visible _rooms . push ( room _id ) ;
f . settings . set ( 'visible_rooms' , visible _rooms ) ;
this . classList . toggle ( 'active' , ! is _visible ) ;
view . ffzRebuildTabs ( ) ;
} ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
row . addEventListener ( 'click' , function ( ) {
var controller = view . get ( 'controller' ) ;
controller . focusRoom ( room ) ;
controller . set ( 'showList' , false ) ;
} ) ;
2015-08-04 01:43:08 -04:00
2015-07-13 21:52:44 -04:00
return row ;
} ,
2015-06-05 03:59:28 -04:00
// Group Tabs~!
ffzEnableTabs : function ( ) {
if ( f . has _bttv || ! f . settings . group _tabs )
return ;
// Hide the existing chat UI.
this . $ ( ".chat-header" ) . addClass ( "hidden" ) ;
// Create our own UI.
var tabs = this . _ffz _tabs = document . createElement ( "div" ) ;
tabs . id = "ffz-group-tabs" ;
this . $ ( ".chat-header" ) . after ( tabs ) ;
// List the Rooms
this . ffzRebuildTabs ( ) ;
} ,
ffzRebuildTabs : function ( ) {
if ( f . has _bttv || ! f . settings . group _tabs )
return ;
var tabs = this . _ffz _tabs || this . get ( 'element' ) . querySelector ( '#ffz-group-tabs' ) ;
if ( ! tabs )
return ;
tabs . innerHTML = "" ;
var link = document . createElement ( 'a' ) ,
view = this ;
link . className = 'button glyph-only tooltip' ;
link . title = "Chat Room Management" ;
link . innerHTML = constants . ROOMS ;
link . addEventListener ( 'click' , function ( ) {
var controller = view . get ( 'controller' ) ;
controller && controller . set ( 'showList' , ! controller . get ( 'showList' ) ) ;
} ) ;
tabs . appendChild ( link ) ;
link = document . createElement ( 'a' ) ,
link . className = 'button glyph-only tooltip invite' ;
link . title = "Invite a User" ;
link . innerHTML = constants . INVITE ;
link . addEventListener ( 'click' , function ( ) {
var controller = view . get ( 'controller' ) ;
controller && controller . set ( 'showInviteUser' , controller . get ( 'currentRoom.canInvite' ) && ! controller . get ( 'showInviteUser' ) ) ;
} ) ;
link . classList . toggle ( 'hidden' , ! this . get ( "controller.currentRoom.canInvite" ) ) ;
view . _ffz _invite = link ;
tabs . appendChild ( link ) ;
var room = this . get ( 'controller.currentChannelRoom' ) , tab ;
if ( room ) {
tab = this . ffzBuildTab ( view , room , true ) ;
tab && tabs . appendChild ( tab ) ;
2015-02-10 01:34:23 -05:00
}
2015-06-05 03:59:28 -04:00
// Check Host Target
var Channel = App . _ _container _ _ . lookup ( 'controller:channel' ) ,
Room = App . _ _container _ _ . resolve ( 'model:room' ) ;
target = Channel && Channel . get ( 'hostModeTarget' ) ;
if ( target && Room ) {
var target _id = target . get ( 'id' ) ;
if ( this . _ffz _host !== target _id ) {
2015-07-04 17:06:36 -04:00
if ( f . settings . pinned _rooms . indexOf ( this . _ffz _host ) === - 1 && this . _ffz _host _room ) {
2015-06-05 03:59:28 -04:00
if ( this . get ( 'controller.currentRoom' ) === this . _ffz _host _room )
this . get ( 'controller' ) . blurRoom ( ) ;
this . _ffz _host _room . destroy ( ) ;
}
this . _ffz _host = target _id ;
this . _ffz _host _room = Room . findOne ( target _id ) ;
}
} else if ( this . _ffz _host ) {
2015-07-04 17:06:36 -04:00
if ( f . settings . pinned _rooms . indexOf ( this . _ffz _host ) === - 1 && this . _ffz _host _room ) {
2015-06-05 03:59:28 -04:00
if ( this . get ( 'controller.currentRoom' ) === this . _ffz _host _room )
this . get ( 'controller' ) . blurRoom ( ) ;
this . _ffz _host _room . destroy ( ) ;
}
delete this . _ffz _host ;
delete this . _ffz _host _room ;
}
if ( this . _ffz _host _room ) {
tab = view . ffzBuildTab ( view , this . _ffz _host _room , false , true ) ;
tab && tabs . appendChild ( tab ) ;
}
// Pinned Rooms
for ( var i = 0 ; i < f . settings . pinned _rooms . length ; i ++ ) {
var room _id = f . settings . pinned _rooms [ i ] ;
if ( room && room . get ( 'id' ) !== room _id && this . _ffz _host !== room _id && f . rooms [ room _id ] && f . rooms [ room _id ] . room ) {
var tab = view . ffzBuildTab ( view , f . rooms [ room _id ] . room , false , false ) ;
tab && tabs . appendChild ( tab ) ;
}
}
_ . each ( this . get ( 'controller.connectedPrivateGroupRooms' ) , function ( room ) {
var tab = view . ffzBuildTab ( view , room ) ;
tab && tabs . appendChild ( tab ) ;
} ) ;
// Now, adjust the chat-room.
this . $ ( '.chat-room' ) . css ( 'top' , tabs . offsetHeight + "px" ) ;
} ,
ffzTabUnread : function ( room _id ) {
2015-07-13 21:52:44 -04:00
// TODO: Update menu.
2015-08-04 01:43:08 -04:00
2015-06-05 03:59:28 -04:00
if ( f . has _bttv || ! f . settings . group _tabs )
return ;
var tabs = this . _ffz _tabs || this . get ( 'element' ) . querySelector ( '#ffz-group-tabs' ) ,
current _id = this . get ( 'controller.currentRoom.id' ) ;
2015-07-29 01:03:10 -04:00
2015-06-05 03:59:28 -04:00
if ( ! tabs )
return ;
if ( room _id ) {
2015-07-29 01:03:10 -04:00
var room = f . rooms && f . rooms [ room _id ] && f . rooms [ room _id ] . room ,
tab = room && room . _ffz _tab ;
2015-06-05 03:59:28 -04:00
2015-07-29 01:03:10 -04:00
if ( tab ) {
var unread = utils . format _unread ( room _id === current _id ? 0 : room . get ( 'unreadCount' ) ) ;
2015-06-05 03:59:28 -04:00
tab . querySelector ( 'span' ) . innerHTML = unread ;
}
}
var children = tabs . querySelectorAll ( '.ffz-chat-tab' ) ;
for ( var i = 0 ; i < children . length ; i ++ ) {
var tab = children [ i ] ,
room _id = tab . getAttribute ( 'data-room' ) ,
2015-07-29 01:03:10 -04:00
room = f . rooms && f . rooms [ room _id ] && f . rooms [ room _id ] ;
2015-06-05 03:59:28 -04:00
if ( ! room )
continue ;
2015-07-13 21:52:44 -04:00
var unread = utils . format _unread ( room _id === current _id ? 0 : room . room . get ( 'unreadCount' ) ) ;
2015-06-05 03:59:28 -04:00
tab . querySelector ( 'span' ) . innerHTML = unread ;
}
} ,
ffzBuildTab : function ( view , room , current _channel , host _channel ) {
2015-07-04 17:06:36 -04:00
var tab = document . createElement ( 'span' ) , name , unread , icon = '' ,
2015-07-13 21:52:44 -04:00
room _id = room . get ( 'id' ) ,
2015-06-05 03:59:28 -04:00
group = room . get ( 'isGroupRoom' ) ,
2015-07-13 21:52:44 -04:00
current = room === view . get ( 'controller.currentRoom' ) ,
visible = current || f . settings . visible _rooms . indexOf ( room _id ) !== - 1 ;
2015-06-05 03:59:28 -04:00
tab . setAttribute ( 'data-room' , room . id ) ;
tab . className = 'ffz-chat-tab tooltip' ;
2015-07-13 21:52:44 -04:00
//tab.classList.toggle('hidden', ! visible);
2015-06-05 03:59:28 -04:00
tab . classList . toggle ( 'current-channel' , current _channel ) ;
tab . classList . toggle ( 'host-channel' , host _channel ) ;
tab . classList . toggle ( 'group-chat' , group ) ;
tab . classList . toggle ( 'active' , current ) ;
2015-07-13 21:52:44 -04:00
unread = utils . format _unread ( current ? 0 : room . get ( 'unreadCount' ) ) ;
2015-06-05 03:59:28 -04:00
2015-07-04 17:06:36 -04:00
name = room . get ( 'tmiRoom.displayName' ) || ( group ? room . get ( 'tmiRoom.name' ) : FFZ . get _capitalization ( room . get ( 'id' ) , function ( name ) {
2015-07-13 21:52:44 -04:00
unread = utils . format _unread ( current ? 0 : room . get ( 'unreadCount' ) ) ;
2015-07-04 17:06:36 -04:00
tab . innerHTML = icon + utils . sanitize ( name ) + '<span>' + unread + '</span>' ;
} ) ) ;
2015-06-05 03:59:28 -04:00
if ( current _channel ) {
2015-07-04 17:06:36 -04:00
icon = constants . CAMERA ;
2015-06-05 03:59:28 -04:00
tab . title = "Current Channel" ;
} else if ( host _channel ) {
2015-07-04 17:06:36 -04:00
icon = constants . EYE ;
2015-06-05 03:59:28 -04:00
tab . title = "Hosted Channel" ;
} else if ( group )
tab . title = "Group Chat" ;
else
tab . title = "Pinned Channel" ;
2015-07-04 17:06:36 -04:00
tab . innerHTML = icon + utils . sanitize ( name ) + '<span>' + unread + '</span>' ;
2015-06-05 03:59:28 -04:00
tab . addEventListener ( 'click' , function ( ) {
2015-07-13 21:52:44 -04:00
var controller = view . get ( 'controller' ) ;
controller . focusRoom ( room ) ;
controller . set ( 'showList' , false ) ;
2015-06-05 03:59:28 -04:00
} ) ;
2015-07-29 01:03:10 -04:00
room . _ffz _tab = tab ;
2015-06-05 03:59:28 -04:00
return tab ;
} ,
ffzDisableTabs : function ( ) {
if ( this . _ffz _tabs ) {
this . _ffz _tabs . parentElement . removeChild ( this . _ffz _tabs ) ;
delete this . _ffz _tabs ;
delete this . _ffz _invite ;
}
if ( this . _ffz _host ) {
2015-07-04 17:06:36 -04:00
if ( f . settings . pinned _rooms . indexOf ( this . _ffz _host ) === - 1 && this . _ffz _host _room ) {
2015-06-05 03:59:28 -04:00
if ( this . get ( 'controller.currentRoom' ) === this . _ffz _host _room )
this . get ( 'controller' ) . blurRoom ( ) ;
this . _ffz _host _room . destroy ( ) ;
}
delete this . _ffz _host ;
delete this . _ffz _host _room ;
}
// Show the old chat UI.
this . $ ( '.chat-room' ) . css ( 'top' , '' ) ;
this . $ ( ".chat-header" ) . removeClass ( "hidden" ) ;
} ,
2015-01-20 01:53:18 -05:00
} ) ;
2015-06-05 03:59:28 -04:00
}
// ----------------------
// Chat Room Connections
// ----------------------
FFZ . prototype . connect _extra _chat = function ( ) {
2015-07-13 21:52:44 -04:00
var user = this . get _user ( ) ;
if ( user && user . login ) {
// Make sure we're in the user's room.
if ( ! this . rooms [ user . login ] || this . rooms [ user . login ] . room ) {
var Room = App . _ _container _ _ . resolve ( 'model:room' ) ,
r = Room && Room . findOne ( user . login ) ;
}
}
2015-08-04 01:43:08 -04:00
2015-06-05 03:59:28 -04:00
if ( this . has _bttv )
return ;
for ( var i = 0 ; i < this . settings . pinned _rooms . length ; i ++ )
this . _join _room ( this . settings . pinned _rooms [ i ] , true ) ;
2015-07-13 21:52:44 -04:00
if ( ! this . _chatv )
return ;
if ( ! this . has _bttv && this . settings . group _tabs )
2015-06-05 03:59:28 -04:00
this . _chatv . ffzRebuildTabs ( ) ;
2015-07-13 21:52:44 -04:00
this . _chatv . ffzRebuildMenu ( ) ;
2015-06-05 03:59:28 -04:00
}
FFZ . prototype . _join _room = function ( room _id , no _rebuild ) {
var did _join = false ;
if ( this . settings . pinned _rooms . indexOf ( room _id ) === - 1 ) {
this . settings . pinned _rooms . push ( room _id ) ;
this . settings . set ( "pinned_rooms" , this . settings . pinned _rooms ) ;
did _join = true ;
}
// Make sure we're not already there.
2015-07-13 21:52:44 -04:00
if ( this . rooms [ room _id ] && this . rooms [ room _id ] . room ) {
if ( did _join && ! no _rebuild && ! this . has _bttv && this . _chatv && this . settings . group _tabs )
this . _chatv . ffzRebuildTabs ( ) ;
2015-06-05 03:59:28 -04:00
return did _join ;
2015-07-13 21:52:44 -04:00
}
2015-06-05 03:59:28 -04:00
// Okay, fine. Get it.
var Room = App . _ _container _ _ . resolve ( 'model:room' ) ,
r = Room && Room . findOne ( room _id ) ;
// Finally, rebuild the chat UI.
if ( ! no _rebuild && ! this . has _bttv && this . _chatv && this . settings . group _tabs )
this . _chatv . ffzRebuildTabs ( ) ;
2015-07-13 21:52:44 -04:00
if ( ! no _rebuild && this . _chatv )
this . _chatv . ffzRebuildMenu ( ) ;
2015-06-05 03:59:28 -04:00
return did _join ;
}
FFZ . prototype . _leave _room = function ( room _id , no _rebuild ) {
var did _leave = false ;
if ( this . settings . pinned _rooms . indexOf ( room _id ) !== - 1 ) {
this . settings . pinned _rooms . removeObject ( room _id ) ;
this . settings . set ( "pinned_rooms" , this . settings . pinned _rooms ) ;
did _leave = true ;
}
if ( ! this . rooms [ room _id ] || ! this . rooms [ room _id ] . room )
return did _leave ;
var Chat = App . _ _container _ _ . lookup ( 'controller:chat' ) ,
2015-07-13 21:52:44 -04:00
r = this . rooms [ room _id ] . room ,
user = this . get _user ( ) ;
2015-06-05 03:59:28 -04:00
if ( ! Chat || Chat . get ( 'currentChannelRoom.id' ) === room _id || ( this . _chatv && this . _chatv . _ffz _host === room _id ) )
return did _leave ;
if ( Chat . get ( 'currentRoom.id' ) === room _id )
Chat . blurRoom ( ) ;
2015-07-13 21:52:44 -04:00
// Don't leave the user's room, but update the UI.
if ( ! user || user . login !== room _id )
r . destroy ( ) ;
2015-06-05 03:59:28 -04:00
if ( ! no _rebuild && ! this . has _bttv && this . _chatv && this . settings . group _tabs )
this . _chatv . ffzRebuildTabs ( ) ;
2015-07-13 21:52:44 -04:00
if ( ! no _rebuild && this . _chatv )
this . _chatv . ffzRebuildMenu ( ) ;
2015-06-05 03:59:28 -04:00
return did _leave ;
}
// ----------------------
// Commands
// ----------------------
FFZ . chat _commands . join = function ( room , args ) {
if ( ! args || ! args . length || args . length > 1 )
return "Join Usage: /join <channel>" ;
var room _id = args [ 0 ] . toLowerCase ( ) ;
if ( room _id . charAt ( 0 ) === "#" )
room _id = room _id . substr ( 1 ) ;
if ( this . _join _room ( room _id ) )
return "Joining " + room _id + ". You will always connect to this channel's chat unless you later /part from it." ;
else
return "You have already joined " + room _id + ". Please use \"/part " + room _id + "\" to leave it." ;
}
FFZ . chat _commands . part = function ( room , args ) {
if ( ! args || ! args . length || args . length > 1 )
return "Part Usage: /part <channel>" ;
var room _id = args [ 0 ] . toLowerCase ( ) ;
if ( room _id . charAt ( 0 ) === "#" )
room _id = room _id . substr ( 1 ) ;
if ( this . _leave _room ( room _id ) )
return "Leaving " + room _id + "." ;
else if ( this . rooms [ room _id ] )
return "You do not have " + room _id + " pinned and you cannot leave the current channel or hosted channels via /part." ;
else
return "You are not in " + room _id + "." ;
2015-01-12 17:58:07 -05:00
}