]> git.mxchange.org Git - friendica-addons.git/blobdiff - jappixmini/jappix/js/chat.js
jappixmini: include jappix source
[friendica-addons.git] / jappixmini / jappix / js / chat.js
diff --git a/jappixmini/jappix/js/chat.js b/jappixmini/jappix/js/chat.js
new file mode 100644 (file)
index 0000000..c67bfac
--- /dev/null
@@ -0,0 +1,297 @@
+/*
+
+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);
+}