2014-04-13 12:30:47 +00:00
/* global $, Util, connection, nickname:true, getVideoSize, getVideoPosition, showToolbar, processReplacements */
2014-02-18 19:11:27 +00:00
/ * *
* Chat related user interface .
* /
var Chat = ( function ( my ) {
var notificationInterval = false ;
var unreadMessages = 0 ;
/ * *
* Initializes chat related interface .
* /
my . init = function ( ) {
var storedDisplayName = window . localStorage . displayname ;
if ( storedDisplayName ) {
nickname = storedDisplayName ;
Chat . setChatConversationMode ( true ) ;
}
2014-04-13 12:30:47 +00:00
$ ( '#nickinput' ) . keydown ( function ( event ) {
2014-03-01 07:39:39 +00:00
if ( event . keyCode === 13 ) {
2014-02-18 19:11:27 +00:00
event . preventDefault ( ) ;
2014-02-26 15:19:39 +00:00
var val = Util . escapeHtml ( this . value ) ;
2014-02-18 19:11:27 +00:00
this . value = '' ;
if ( ! nickname ) {
nickname = val ;
window . localStorage . displayname = nickname ;
connection . emuc . addDisplayNameToPresence ( nickname ) ;
connection . emuc . sendPresence ( ) ;
Chat . setChatConversationMode ( true ) ;
return ;
}
}
} ) ;
2014-04-13 12:30:47 +00:00
$ ( '#usermsg' ) . keydown ( function ( event ) {
2014-03-01 07:39:39 +00:00
if ( event . keyCode === 13 ) {
2014-02-18 19:11:27 +00:00
event . preventDefault ( ) ;
2014-06-20 09:00:49 +00:00
var value = this . value ;
2014-02-18 19:11:27 +00:00
$ ( '#usermsg' ) . val ( '' ) . trigger ( 'autosize.resize' ) ;
this . focus ( ) ;
2014-06-20 09:00:49 +00:00
var command = new CommandsProcessor ( value ) ;
if ( command . isCommand ( ) )
{
command . processCommand ( ) ;
}
else
{
var message = Util . escapeHtml ( value ) ;
connection . emuc . sendMessage ( message , nickname ) ;
}
2014-02-18 19:11:27 +00:00
}
} ) ;
2014-04-13 12:30:47 +00:00
var onTextAreaResize = function ( ) {
2014-02-18 19:11:27 +00:00
resizeChatConversation ( ) ;
2014-10-31 11:47:12 +00:00
Chat . scrollChatToBottom ( ) ;
2014-02-18 19:11:27 +00:00
} ;
$ ( '#usermsg' ) . autosize ( { callback : onTextAreaResize } ) ;
$ ( "#chatspace" ) . bind ( "shown" ,
2014-04-13 12:30:47 +00:00
function ( ) {
2014-02-18 19:11:27 +00:00
unreadMessages = 0 ;
setVisualNotification ( false ) ;
} ) ;
2014-10-10 10:57:00 +00:00
addSmileys ( ) ;
2014-02-18 19:11:27 +00:00
} ;
/ * *
* Appends the given message to the chat conversation .
* /
2014-02-19 14:32:22 +00:00
my . updateChatConversation = function ( from , displayName , message ) {
2014-02-18 19:11:27 +00:00
var divClassName = '' ;
2014-03-01 07:39:39 +00:00
if ( connection . emuc . myroomjid === from ) {
2014-02-18 19:11:27 +00:00
divClassName = "localuser" ;
}
else {
divClassName = "remoteuser" ;
2014-08-22 15:37:11 +00:00
if ( ! Chat . isVisible ( ) ) {
2014-02-18 19:11:27 +00:00
unreadMessages ++ ;
Util . playSoundNotification ( 'chatNotification' ) ;
setVisualNotification ( true ) ;
}
}
//replace links and smileys
2014-12-07 22:41:05 +00:00
var escMessage = message . replace ( /</g , '<' ) . replace ( />/g , '>' ) . replace ( /\n/g , '<br/>' ) ; //Strophe already escapes special symbols on sending, so we escape here only tags to avoid double &
2014-02-26 15:19:39 +00:00
var escDisplayName = Util . escapeHtml ( displayName ) ;
message = processReplacements ( escMessage ) ;
2014-02-18 19:11:27 +00:00
2014-10-10 10:57:00 +00:00
var messageContainer =
'<div class="chatmessage">' +
'<img src="../images/chatArrow.svg" class="chatArrow">' +
'<div class="username ' + divClassName + '">' + escDisplayName + '</div>' +
'<div class="timestamp">' + getCurrentTime ( ) + '</div>' +
'<div class="usermessage">' + message + '</div>' +
'</div>' ;
$ ( '#chatconversation' ) . append ( messageContainer ) ;
2014-02-18 19:11:27 +00:00
$ ( '#chatconversation' ) . animate (
{ scrollTop : $ ( '#chatconversation' ) [ 0 ] . scrollHeight } , 1000 ) ;
} ;
2014-06-20 09:00:49 +00:00
/ * *
* Appends error message to the conversation
* @ param errorMessage the received error message .
* @ param originalText the original message .
* /
my . chatAddError = function ( errorMessage , originalText )
{
errorMessage = Util . escapeHtml ( errorMessage ) ;
originalText = Util . escapeHtml ( originalText ) ;
$ ( '#chatconversation' ) . append ( '<div class="errorMessage"><b>Error: </b>'
+ 'Your message' + ( originalText ? ( ' \"' + originalText + '\"' ) : "" )
+ ' was not sent.' + ( errorMessage ? ( ' Reason: ' + errorMessage ) : '' )
+ '</div>' ) ;
$ ( '#chatconversation' ) . animate (
{ scrollTop : $ ( '#chatconversation' ) [ 0 ] . scrollHeight } , 1000 ) ;
2014-07-14 10:33:57 +00:00
} ;
2014-06-20 09:00:49 +00:00
/ * *
* Sets the subject to the UI
* @ param subject the subject
* /
my . chatSetSubject = function ( subject )
{
if ( subject )
subject = subject . trim ( ) ;
$ ( '#subject' ) . html ( linkify ( Util . escapeHtml ( subject ) ) ) ;
if ( subject == "" )
{
$ ( "#subject" ) . css ( { display : "none" } ) ;
}
else
{
$ ( "#subject" ) . css ( { display : "block" } ) ;
}
2014-07-13 18:12:38 +00:00
} ;
2014-06-20 09:00:49 +00:00
2014-10-30 16:07:11 +00:00
2014-02-18 19:11:27 +00:00
/ * *
* Sets the chat conversation mode .
* /
my . setChatConversationMode = function ( isConversationMode ) {
if ( isConversationMode ) {
2014-04-13 12:30:47 +00:00
$ ( '#nickname' ) . css ( { visibility : 'hidden' } ) ;
$ ( '#chatconversation' ) . css ( { visibility : 'visible' } ) ;
$ ( '#usermsg' ) . css ( { visibility : 'visible' } ) ;
2014-10-23 11:33:45 +00:00
$ ( '#smileysarea' ) . css ( { visibility : 'visible' } ) ;
2014-02-18 19:11:27 +00:00
$ ( '#usermsg' ) . focus ( ) ;
}
} ;
/ * *
* Resizes the chat area .
* /
my . resizeChat = function ( ) {
2014-10-31 11:47:12 +00:00
var chatSize = PanelToggler . getPanelSize ( ) ;
2014-03-26 10:33:46 +00:00
$ ( '#chatspace' ) . width ( chatSize [ 0 ] ) ;
$ ( '#chatspace' ) . height ( chatSize [ 1 ] ) ;
resizeChatConversation ( ) ;
} ;
2014-08-22 15:37:11 +00:00
/ * *
* Indicates if the chat is currently visible .
* /
my . isVisible = function ( ) {
return $ ( '#chatspace' ) . is ( ":visible" ) ;
} ;
2014-10-10 10:57:00 +00:00
/ * *
* Shows and hides the window with the smileys
* /
my . toggleSmileys = function ( ) {
var smileys = $ ( '#smileysContainer' ) ;
if ( ! smileys . is ( ':visible' ) ) {
smileys . show ( "slide" , { direction : "down" , duration : 300 } ) ;
} else {
smileys . hide ( "slide" , { direction : "down" , duration : 300 } ) ;
}
$ ( '#usermsg' ) . focus ( ) ;
} ;
2014-10-31 11:47:12 +00:00
/ * *
* Scrolls chat to the bottom .
* /
my . scrollChatToBottom = function ( ) {
setTimeout ( function ( ) {
$ ( '#chatconversation' ) . scrollTop (
$ ( '#chatconversation' ) [ 0 ] . scrollHeight ) ;
} , 5 ) ;
} ;
2014-10-10 10:57:00 +00:00
/ * *
* Adds the smileys container to the chat
* /
function addSmileys ( ) {
var smileysContainer = document . createElement ( 'div' ) ;
smileysContainer . id = 'smileysContainer' ;
function addClickFunction ( smiley , number ) {
smiley . onclick = function addSmileyToMessage ( ) {
var usermsg = $ ( '#usermsg' ) ;
var message = usermsg . val ( ) ;
message += smileys [ 'smiley' + number ] ;
usermsg . val ( message ) ;
usermsg . get ( 0 ) . setSelectionRange ( message . length , message . length ) ;
Chat . toggleSmileys ( ) ;
usermsg . focus ( ) ;
} ;
}
for ( var i = 1 ; i <= 21 ; i ++ ) {
var smileyContainer = document . createElement ( 'div' ) ;
smileyContainer . id = 'smiley' + i ;
smileyContainer . className = 'smileyContainer' ;
var smiley = document . createElement ( 'img' ) ;
smiley . src = 'images/smileys/smiley' + i + '.svg' ;
smiley . className = 'smiley' ;
addClickFunction ( smiley , i ) ;
smileyContainer . appendChild ( smiley ) ;
smileysContainer . appendChild ( smileyContainer ) ;
}
$ ( "#chatspace" ) . append ( smileysContainer ) ;
}
2014-08-22 15:37:11 +00:00
2014-02-18 19:11:27 +00:00
/ * *
* Resizes the chat conversation .
* /
function resizeChatConversation ( ) {
2014-10-10 10:57:00 +00:00
var msgareaHeight = $ ( '#usermsg' ) . outerHeight ( ) ;
var chatspace = $ ( '#chatspace' ) ;
var width = chatspace . width ( ) ;
var chat = $ ( '#chatconversation' ) ;
var smileys = $ ( '#smileysarea' ) ;
smileys . height ( msgareaHeight ) ;
$ ( "#smileys" ) . css ( 'bottom' , ( msgareaHeight - 26 ) / 2 ) ;
$ ( '#smileysContainer' ) . css ( 'bottom' , msgareaHeight ) ;
chat . width ( width - 10 ) ;
chat . height ( window . innerHeight - 15 - msgareaHeight ) ;
2014-04-13 12:30:47 +00:00
}
2014-02-18 19:11:27 +00:00
/ * *
* Shows / hides a visual notification , indicating that a message has arrived .
* /
function setVisualNotification ( show ) {
var unreadMsgElement = document . getElementById ( 'unreadMessages' ) ;
2014-10-02 09:30:46 +00:00
var unreadMsgBottomElement = document . getElementById ( 'bottomUnreadMessages' ) ;
2014-02-18 19:11:27 +00:00
2014-03-26 10:33:46 +00:00
var glower = $ ( '#chatButton' ) ;
2014-10-02 09:30:46 +00:00
var bottomGlower = $ ( '#chatBottomButton' ) ;
2014-03-26 10:33:46 +00:00
2014-02-18 19:11:27 +00:00
if ( unreadMessages ) {
unreadMsgElement . innerHTML = unreadMessages . toString ( ) ;
2014-10-02 09:30:46 +00:00
unreadMsgBottomElement . innerHTML = unreadMessages . toString ( ) ;
2014-02-18 19:11:27 +00:00
2014-09-04 13:18:28 +00:00
ToolbarToggler . dockToolbar ( true ) ;
2014-03-26 10:33:46 +00:00
2014-02-18 19:11:27 +00:00
var chatButtonElement
2014-03-26 10:33:46 +00:00
= document . getElementById ( 'chatButton' ) . parentNode ;
2014-04-13 12:30:47 +00:00
var leftIndent = ( Util . getTextWidth ( chatButtonElement ) -
2014-10-02 09:30:46 +00:00
Util . getTextWidth ( unreadMsgElement ) ) / 2 ;
2014-04-13 12:30:47 +00:00
var topIndent = ( Util . getTextHeight ( chatButtonElement ) -
2014-10-27 13:07:37 +00:00
Util . getTextHeight ( unreadMsgElement ) ) / 2 - 3 ;
2014-02-18 19:11:27 +00:00
unreadMsgElement . setAttribute (
2014-10-02 09:30:46 +00:00
'style' ,
2014-04-13 12:30:47 +00:00
'top:' + topIndent +
'; left:' + leftIndent + ';' ) ;
2014-03-26 10:33:46 +00:00
2014-10-02 09:30:46 +00:00
var chatBottomButtonElement
= document . getElementById ( 'chatBottomButton' ) . parentNode ;
var bottomLeftIndent = ( Util . getTextWidth ( chatBottomButtonElement ) -
Util . getTextWidth ( unreadMsgBottomElement ) ) / 2 ;
var bottomTopIndent = ( Util . getTextHeight ( chatBottomButtonElement ) -
2014-10-27 13:07:37 +00:00
Util . getTextHeight ( unreadMsgBottomElement ) ) / 2 - 2 ;
2014-10-02 09:30:46 +00:00
unreadMsgBottomElement . setAttribute (
'style' ,
'top:' + bottomTopIndent +
'; left:' + bottomLeftIndent + ';' ) ;
2014-03-26 10:33:46 +00:00
if ( ! glower . hasClass ( 'icon-chat-simple' ) ) {
glower . removeClass ( 'icon-chat' ) ;
glower . addClass ( 'icon-chat-simple' ) ;
}
2014-02-18 19:11:27 +00:00
}
2014-03-26 10:33:46 +00:00
else {
2014-02-18 19:11:27 +00:00
unreadMsgElement . innerHTML = '' ;
2014-10-02 09:30:46 +00:00
unreadMsgBottomElement . innerHTML = '' ;
2014-03-26 10:33:46 +00:00
glower . removeClass ( 'icon-chat-simple' ) ;
glower . addClass ( 'icon-chat' ) ;
}
2014-02-18 19:11:27 +00:00
if ( show && ! notificationInterval ) {
2014-04-13 12:30:47 +00:00
notificationInterval = window . setInterval ( function ( ) {
2014-02-18 19:11:27 +00:00
glower . toggleClass ( 'active' ) ;
2014-10-02 09:30:46 +00:00
bottomGlower . toggleClass ( 'active glowing' ) ;
2014-02-18 19:11:27 +00:00
} , 800 ) ;
}
else if ( ! show && notificationInterval ) {
window . clearInterval ( notificationInterval ) ;
notificationInterval = false ;
glower . removeClass ( 'active' ) ;
2014-10-02 09:30:46 +00:00
bottomGlower . removeClass ( 'glowing' ) ;
bottomGlower . addClass ( 'active' ) ;
2014-02-18 19:11:27 +00:00
}
}
2014-10-10 10:57:00 +00:00
/ * *
* Returns the current time in the format it is shown to the user
* @ returns { string }
* /
function getCurrentTime ( ) {
var now = new Date ( ) ;
var hour = now . getHours ( ) ;
var minute = now . getMinutes ( ) ;
var second = now . getSeconds ( ) ;
if ( hour . toString ( ) . length === 1 ) {
hour = '0' + hour ;
}
if ( minute . toString ( ) . length === 1 ) {
minute = '0' + minute ;
}
if ( second . toString ( ) . length === 1 ) {
second = '0' + second ;
}
return hour + ':' + minute + ':' + second ;
}
2014-02-18 19:11:27 +00:00
return my ;
2014-03-01 07:39:39 +00:00
} ( Chat || { } ) ) ;