/* 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); }