/* Jappix - An open social platform These are the groupchat JS scripts for Jappix ------------------------------------------------- License: AGPL Authors: Valérian Saliou, Maranda, Eric Last revision: 13/02/12 */ // Displays the MUC admin elements function displayMucAdmin(affiliation, id, xid, statuscode) { // We must be in the "login" mode if(isAnonymous()) return; // We check if the user is a room owner or administrator to give him privileges if(affiliation == 'owner' || affiliation == 'admin') $('#' + id + ' .tools-mucadmin').show(); // We check if the room hasn't been yet created if(statuscode == 201) openThisInfo(4); // We add the click event $('#' + id + ' .tools-mucadmin').click(function() { openMucAdmin(xid, affiliation); }); } // Initializes a connection with a MUC groupchat function getMUC(room, nickname, password) { // Room hash var hash = hex_md5(room); // Reset the elements $('#' + hash + ' .muc-ask').remove(); $('#' + hash + ' .compose').show(); // No nickname? if(!nickname) { // Get some values if(!isAnonymous()) nickname = getNick(); else nickname = ANONYMOUS_NICK; // If the nickname could not be retrieved, ask it if(!nickname) generateMUCAsk('nickname', room, hash, nickname, password); } // Got our nickname? if(nickname) { // Get our general presence var show = getDB('presence-show', 1); var status = getDB('options', 'presence-status'); // Set my nick $('#' + hash).attr('data-nick', escape(nickname)); // Send the appropriate presence sendPresence(room + '/' + nickname, '', show, status, '', true, password, handleMUC); } return false; } // Handles the MUC main elements function handleMUC(presence) { // We get the xml content var xml = presence.getNode(); var from = fullXID(getStanzaFrom(presence)); var room = bareXID(from); var nickname = thisResource(from); var hash = hex_md5(room); // No ID: must fix M-Link bug if(presence.getID() == null) presence.setID(1); logThis('First MUC presence: ' + from, 3); // Catch the errors if(!handleError(xml)) { // Define some stuffs var muc_user = $(xml).find('x[xmlns="' + NS_MUC_USER + '"]'); var affiliation = muc_user.find('item').attr('affiliation'); var statuscode = parseInt(muc_user.find('status').attr('code')); // Handle my presence handlePresence(presence); // Check if I am a room owner displayMucAdmin(affiliation, hash, room, statuscode); // Tell the MUC we can notify the incoming presences $(document).oneTime('15s', function() { $('#' + hash).attr('data-initial', 'true'); }); // Enable the chatting input $(document).oneTime(10, function() { $('#' + hash + ' .message-area').removeAttr('disabled').focus(); }); } // A password is required else if($(xml).find('error[type="auth"] not-authorized').size()) generateMUCAsk('password', room, hash, nickname); // There's a nickname conflict else if($(xml).find('error[type="cancel"] conflict').size()) generateMUCAsk('nickname', room, hash); } // Generates a correct MUC asker function generateMUCAsk(type, room, hash, nickname, password) { // Generate the path to the elements var path_to = '#' + hash + ' .muc-ask'; // Define the label text var label_text; switch(type) { case 'nickname': label_text = _e("Nickname"); break; case 'password': label_text = _e("Password"); break; } // Create the HTML markup $('#' + hash + ' .compose').hide(); $('#' + hash).append( '
' + '' + '' + '
' ); // When a key is pressed in the input $(path_to + ' input').keyup(function(e) { var value_input = $(this).val(); // Enter key pressed if(e.keyCode == 13) { // trim() fixes #304 if(type == 'nickname' && trim(value_input)) { nickname = trim(value_input); return getMUC(room, nickname, password); } if(type == 'password' && value_input) { password = value_input; return getMUC(room, nickname, password); } } }); // Focus on the input $(document).oneTime(10, function() { $(path_to + ' input').focus(); }); } // Creates a new groupchat function groupchatCreate(hash, room, chan, nickname, password) { /* REF: http://xmpp.org/extensions/xep-0045.html */ logThis('New groupchat: ' + room, 3); // Create the chat content generateChat('groupchat', hash, room, chan); // Create the chat switcher generateSwitch('groupchat', hash, room, chan); // The icons-hover functions tooltipIcons(room, hash); // Click event on the add tool $('#' + hash + ' .tools-add').click(function() { // Hide the icon (to tell the user all is okay) $(this).hide(); // Add the groupchat to the user favorites addThisFavorite(room, chan); }); // Must show the add button? if(!existDB('favorites', room)) $('#' + hash + ' .tools-add').show(); // The event handlers var inputDetect = $('#' + hash + ' .message-area'); // Focus event inputDetect.focus(function() { // Clean notifications for this chat chanCleanNotify(hash); // Store focus on this chat! CHAT_FOCUS_HASH = hash; }) // Blur event inputDetect.blur(function() { // Reset storage about focus on this chat! if(CHAT_FOCUS_HASH == hash) CHAT_FOCUS_HASH = null; // Reset autocompletion resetAutocompletion(hash); }) // Lock to the input inputDetect.keydown(function(e) { // Enter key if(e.keyCode == 13) { // Add a new line if(e.shiftKey) inputDetect.val(inputDetect.val() + '\n'); // Send the message else { sendMessage(hash, 'groupchat'); // Reset the composing database entry setDB('chatstate', room, 'off'); } return false; } // Tabulation key else if(e.keyCode == 9) { createAutocompletion(hash); return false; } // Reset the autocompleter else resetAutocompletion(hash); }); // Chatstate events eventsChatState(inputDetect, room, hash, 'groupchat'); // Get the current muc informations and content getMUC(room, nickname, password); } // Generates a groupchat to join array function arrayJoinGroupchats() { // Values array var muc_arr = [GROUPCHATS_JOIN]; var new_arr = []; // Try to split it if(GROUPCHATS_JOIN.indexOf(',') != -1) muc_arr = GROUPCHATS_JOIN.split(','); for(i in muc_arr) { // Get the current value var muc_current = trim(muc_arr[i]); // No current value? if(!muc_current) continue; // Filter the current value muc_current = generateXID(muc_current, 'groupchat'); // Add the current value if(!existArrayValue(new_arr, muc_current)) new_arr.push(muc_current); } return new_arr; } // Joins the defined groupchats var JOIN_SUGGEST = []; function joinConfGroupchats() { // Nothing to join? if(!JOIN_SUGGEST) return; // Join the chats if(JOIN_SUGGEST.length) { for(g in JOIN_SUGGEST) checkChatCreate(JOIN_SUGGEST[g], 'groupchat'); } } // Checks suggest utility function suggestCheck() { var groupchat_arr = arrayJoinGroupchats(); // Must suggest the user? if((GROUPCHATS_SUGGEST == 'on') && groupchat_arr.length) { if(exists('#suggest')) return; // Create HTML code var html = '
'; html += '
' + _e("Suggested chatrooms") + '
'; html += '
'; for(g in groupchat_arr) { html += ''; html += ''; html += '' + capitaliseFirstLetter(getXIDNick(groupchat_arr[g]).htmlEnc()) + ''; html += ''; html += ''; html += ''; } html += '
'; html += ''; html += '
'; // Append HTML code $('body').append(html); // Click events $('#suggest .content a.one').click(function() { // Add/remove the active class $(this).toggleClass('active'); // We require at least one room to be chosen if(exists('#suggest .content a.one.active')) $('#suggest a.next').removeClass('disabled'); else $('#suggest a.next').addClass('disabled'); return false; }); $('#suggest a.next').click(function() { // Disabled? if($(this).hasClass('disabled')) return false; // Store groupchats to join $('#suggest .content a.one.active').each(function() { JOIN_SUGGEST.push($(this).attr('data-xid')); }); // Switch to talk UI $('#suggest').remove(); triggerConnected(); return false; }); } else { JOIN_SUGGEST = groupchat_arr; triggerConnected(); } }