forked from friendica/friendica-addons
298 lines
8.8 KiB
JavaScript
298 lines
8.8 KiB
JavaScript
/*
|
|
|
|
Jappix - An open social platform
|
|
These are the chat JS scripts for Jappix
|
|
|
|
-------------------------------------------------
|
|
|
|
License: AGPL
|
|
Authors: Vanaryon, Eric
|
|
Last revision: 16/10/11
|
|
|
|
*/
|
|
|
|
// Correctly opens a new chat
|
|
function checkChatCreate(xid, type, nickname, password, title) {
|
|
// No XID?
|
|
if(!xid)
|
|
return false;
|
|
|
|
// We generate some stuffs
|
|
var hash = hex_md5(xid);
|
|
var name;
|
|
|
|
// Gets the name of the user/title of the room
|
|
if(title)
|
|
name = title;
|
|
|
|
else {
|
|
// Private groupchat chat
|
|
if(type == 'private')
|
|
name = thisResource(xid);
|
|
|
|
// XMPP-ID
|
|
else if(xid.indexOf('@') != -1)
|
|
name = getBuddyName(xid);
|
|
|
|
// Gateway
|
|
else
|
|
name = xid;
|
|
}
|
|
|
|
// If the target div does not exist
|
|
if(!exists('#' + hash)) {
|
|
// We check the type of the chat to open
|
|
if((type == 'chat') || (type == 'private'))
|
|
chatCreate(hash, xid, name, type);
|
|
|
|
else if(type == 'groupchat') {
|
|
// Try to read the room stored configuration
|
|
if(!isAnonymous() && (!nickname || !password || !title)) {
|
|
// Catch the room data
|
|
var fData = $(XMLFromString(getDB('favorites', xid)));
|
|
var fNick = fData.find('nick').text();
|
|
var fPwd = fData.find('password').text();
|
|
var fName = fData.find('name').text();
|
|
|
|
// Apply the room data
|
|
if(!nickname && fNick)
|
|
nickname = fNick;
|
|
if(!password && fPwd)
|
|
password = fPwd;
|
|
if(!title && fName)
|
|
name = fName;
|
|
}
|
|
|
|
groupchatCreate(hash, xid, name, nickname, password);
|
|
}
|
|
}
|
|
|
|
// Switch to the newly-created chat
|
|
switchChan(hash);
|
|
|
|
return false;
|
|
}
|
|
|
|
// Generates the chat DOM elements
|
|
function generateChat(type, id, xid, nick) {
|
|
// Generate some stuffs
|
|
var path = '#' + id + ' .';
|
|
var escaped_xid = escape(xid);
|
|
|
|
// Special code
|
|
var specialAttributes, specialAvatar, specialName, specialCode, specialLink, specialDisabled, specialStyle;
|
|
|
|
// Groupchat special code
|
|
if(type == 'groupchat') {
|
|
specialAttributes = ' data-type="groupchat"';
|
|
specialAvatar = '';
|
|
specialName = '<p class="bc-infos"><b>' + _e("Subject") + '</b> <span class="muc-topic">' + _e("no subject defined for this room.") + '</span></p>';
|
|
specialCode = '<div class="content groupchat-content" id="chat-content-' + id + '"></div><div class="list"><div class="moderator role"><p class="title">' + _e("Moderators") + '</p></div><div class="participant role"><p class="title">' + _e("Participants") + '</p></div><div class="visitor role"><p class="title">' + _e("Visitors") + '</p></div><div class="none role"><p class="title">' + _e("Others") + '</p></div></div>';
|
|
specialLink = '<a href="#" class="tools-mucadmin tools-tooltip talk-images chat-tools-content" title="' + _e("Administration panel for this room") + '"></a>';
|
|
specialStyle = '';
|
|
|
|
// Is this a gateway?
|
|
if(xid.match(/%/))
|
|
specialDisabled = '';
|
|
else
|
|
specialDisabled = ' disabled=""';
|
|
}
|
|
|
|
// Chat (or other things?!) special code
|
|
else {
|
|
specialAttributes = ' data-type="chat"';
|
|
specialAvatar = '<div class="avatar-container"><img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" /></div>';
|
|
specialName = '<div class="bc-pep"></div><p class="bc-infos"><span class="unavailable show talk-images"></span></p>';
|
|
specialCode = '<div class="content" id="chat-content-' + id + '"></div>';
|
|
specialLink = '<a href="#" class="tools-archives tools-tooltip talk-images chat-tools-content" title="' + _e("View chat history") + '"></a><a href="#" class="tools-infos tools-tooltip talk-images chat-tools-content" title="' + _e("Show user profile") + '"></a>';
|
|
specialStyle = ' style="display: none;"';
|
|
specialDisabled = '';
|
|
}
|
|
|
|
// Not a groupchat private chat, we can use the buddy add icon
|
|
if((type == 'chat') || (type == 'groupchat')) {
|
|
var addTitle;
|
|
|
|
if(type == 'chat')
|
|
addTitle = _e("Add this contact to your friends");
|
|
else
|
|
addTitle = _e("Add this groupchat to your favorites");
|
|
|
|
specialLink += '<a href="#" class="tools-add tools-tooltip talk-images chat-tools-content" title="' + addTitle + '"></a>';
|
|
}
|
|
|
|
// IE DOM parsing bug fix
|
|
var specialStylePicker = '<div class="chat-tools-content chat-tools-style"' + specialStyle + '>' +
|
|
'<a href="#" class="tools-style tools-tooltip talk-images"></a>' +
|
|
'</div>';
|
|
|
|
if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 9))
|
|
specialStylePicker = '';
|
|
|
|
// Append the chat HTML code
|
|
$('#page-engine').append(
|
|
'<div id="' + id + '" class="page-engine-chan chat one-counter"' + specialAttributes + ' data-xid="' + escaped_xid + '">' +
|
|
'<div class="top ' + id + '">' +
|
|
specialAvatar +
|
|
|
|
'<div class="name">' +
|
|
'<p class="bc-name bc-name-nick">' + nick.htmlEnc() + '</p>' +
|
|
specialName +
|
|
'</div>' +
|
|
'</div>' +
|
|
|
|
specialCode +
|
|
|
|
'<div class="text">' +
|
|
'<div class="footer">' +
|
|
'<div class="chat-tools-content chat-tools-smileys">' +
|
|
'<a href="#" class="tools-smileys tools-tooltip talk-images"></a>' +
|
|
'</div>' +
|
|
|
|
specialStylePicker +
|
|
|
|
'<div class="chat-tools-content chat-tools-file">' +
|
|
'<a href="#" class="tools-file tools-tooltip talk-images"></a>' +
|
|
'</div>' +
|
|
|
|
'<div class="chat-tools-content chat-tools-save">' +
|
|
'<a href="#" class="tools-save tools-tooltip talk-images"></a>' +
|
|
'</div>' +
|
|
|
|
'<a href="#" class="tools-clear tools-tooltip talk-images chat-tools-content" title="' + _e("Clean current chat") + '"></a>' +
|
|
|
|
specialLink +
|
|
'</div>' +
|
|
|
|
'<div class="compose">' +
|
|
'<textarea class="message-area focusable" ' + specialDisabled + ' data-to="' + escaped_xid + '" /></textarea>' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'</div>'
|
|
);
|
|
|
|
// Click event: chat cleaner
|
|
$(path + 'tools-clear').click(function() {
|
|
cleanChat(id);
|
|
});
|
|
|
|
// Click event: user-infos
|
|
$(path + 'tools-infos').click(function() {
|
|
openUserInfos(xid);
|
|
});
|
|
}
|
|
|
|
// Generates the chat switch elements
|
|
function generateSwitch(type, id, xid, nick) {
|
|
// Path to the element
|
|
var chat_switch = '#page-switch .';
|
|
|
|
// Special code
|
|
var specialClass = ' unavailable';
|
|
var show_close = true;
|
|
|
|
// Groupchat
|
|
if(type == 'groupchat') {
|
|
specialClass = ' groupchat-default';
|
|
|
|
if(isAnonymous() && (xid == generateXID(ANONYMOUS_ROOM, 'groupchat')))
|
|
show_close = false;
|
|
}
|
|
|
|
// Generate the HTML code
|
|
var html = '<div class="' + id + ' switcher chan" onclick="return switchChan(\'' + encodeOnclick(id) + '\')">' +
|
|
'<div class="icon talk-images' + specialClass + '"></div>' +
|
|
|
|
'<div class="name">' + nick.htmlEnc() + '</div>';
|
|
|
|
// Show the close button if not MUC and not anonymous
|
|
if(show_close)
|
|
html += '<div class="exit" title="' + _e("Close this tab") + '" onclick="return quitThisChat(\'' + encodeOnclick(xid) + '\', \'' + encodeOnclick(id) + '\', \'' + encodeOnclick(type) + '\');">x</div>';
|
|
|
|
// Close the HTML
|
|
html += '</div>';
|
|
|
|
// Append the HTML code
|
|
$(chat_switch + 'chans, ' + chat_switch + 'more-content').append(html);
|
|
}
|
|
|
|
// Cleans given the chat lines
|
|
function cleanChat(chat) {
|
|
$('#page-engine #' + chat + ' .content .one-group').remove();
|
|
|
|
$(document).oneTime(10, function() {
|
|
$('#page-engine #' + chat + ' .text .message-area').focus();
|
|
});
|
|
}
|
|
|
|
// Creates a new chat
|
|
function chatCreate(hash, xid, nick, type) {
|
|
logThis('New chat: ' + xid, 3);
|
|
|
|
// Create the chat content
|
|
generateChat(type, hash, xid, nick);
|
|
|
|
// Create the chat switcher
|
|
generateSwitch(type, hash, xid, nick);
|
|
|
|
// If the user is not in our buddy-list
|
|
if(type == 'chat') {
|
|
// Add button
|
|
if(!exists('#buddy-list .buddy[data-xid=' + escape(xid) + ']'))
|
|
$('#' + hash + ' .tools-add').click(function() {
|
|
// Hide the icon (to tell the user all is okay)
|
|
$(this).hide();
|
|
|
|
// Send the subscribe request
|
|
addThisContact(xid, nick);
|
|
}).show();
|
|
|
|
// Archives button
|
|
else if(enabledArchives() || enabledArchives('auto') || enabledArchives('manual') || enabledArchives('manage'))
|
|
$('#' + hash + ' .tools-archives').click(function() {
|
|
// Open the archives popup
|
|
openArchives();
|
|
|
|
// Get the archives for this user
|
|
$('#archives .filter .friend').val(xid);
|
|
updateArchives();
|
|
}).show();
|
|
}
|
|
|
|
// We catch the user's informations (like this avatar, vcard, and so on...)
|
|
getUserInfos(hash, xid, nick, type);
|
|
|
|
// The icons-hover functions
|
|
tooltipIcons(xid, hash);
|
|
|
|
// The event handlers
|
|
var inputDetect = $('#page-engine #' + hash + ' .message-area');
|
|
|
|
inputDetect.focus(function() {
|
|
chanCleanNotify(hash);
|
|
})
|
|
|
|
inputDetect.keypress(function(e) {
|
|
// Enter key
|
|
if(e.keyCode == 13) {
|
|
// Add a new line
|
|
if(e.shiftKey)
|
|
inputDetect.val(inputDetect.val() + '\n');
|
|
|
|
// Send the message
|
|
else {
|
|
// Send the message
|
|
sendMessage(hash, 'chat');
|
|
|
|
// Reset the composing database entry
|
|
setDB('chatstate', xid, 'off');
|
|
}
|
|
|
|
return false;
|
|
}
|
|
});
|
|
|
|
// Chatstate events
|
|
eventsChatState(inputDetect, xid, hash);
|
|
}
|