/* Jappix - An open social platform These are the mucadmin JS scripts for Jappix ------------------------------------------------- License: AGPL Authors: Valérian Saliou, Maranda */ // Bundle var MUCAdmin = (function () { /** * Alias of this * @private */ var self = {}; /** * Opens the MUC admin popup * @public * @param {string} xid * @param {string} aff * @return {undefined} */ self.open = function(xid, aff) { try { // Popup HTML content var html_full = '
' + Common._e("MUC administration") + '
' + '
' + '
' + '
' + Common._e("You administrate this room") + '
' + '
' + xid + '
' + '
' + '
' + '
' + '
' + '' + Common._e("Subject") + '' + '' + '' + '
' + '
' + '
' + '
' + '' + Common._e("Configuration") + '' + '
' + '
' + '
' + '
' + '
' + '' + Common._e("Authorizations") + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
' + '
' + '
' + '' + Common._e("Others") + '' + '' + '' + Common._e("Yes, let's do it!") + '' + '
' + '
' + '
' + '
' + '
' + '
' + '' + Common._e("Save") + '' + '' + Common._e("Cancel") + '' + '
'; var html_partial = '
' + Common._e("MUC administration") + '
' + '
' + '
' + '
' + Common._e("You administrate this room") + '
' + '
' + xid + '
' + '
' + '
' + '
' + '
' + '' + Common._e("Authorizations") + '' + '' + '' + '' + '' + '
' + '
' + '
' + '
' + '
' + '
' + '' + Common._e("Save") + '' + '' + Common._e("Cancel") + '' + '
'; // Create the popup if(aff == 'owner') Popup.create('mucadmin', html_full); if(aff == 'admin') Popup.create('mucadmin', html_partial); // Associate the events self.instance(); // We get the affiliated user's privileges if(aff == 'owner') { self.query(xid, 'member'); self.query(xid, 'owner'); self.query(xid, 'admin'); self.query(xid, 'outcast'); // We query the room to edit DataForm.go(xid, 'muc', '', '', 'mucadmin'); } else if(aff == 'admin') { self.query(xid, 'member'); self.query(xid, 'outcast'); } } catch(e) { Console.error('MUCAdmin.open', e); } }; /** * Closes the MUC admin popup * @public * @return {boolean} */ self.close = function() { try { // Destroy the popup Popup.destroy('mucadmin'); } catch(e) { Console.error('MUCAdmin.close', e); } finally { return false; } }; /** * Removes a MUC admin input * @public * @param {string} element * @return {boolean} */ self.removeInput = function(element) { try { var path = $(element).parent(); // We first hide the container of the input path.hide(); // Then, we add a special class to the input path.find('input').addClass('aut-dustbin'); } catch(e) { Console.error('MUCAdmin.removeInput', e); } finally { return false; } }; /** * Adds a MUC admin input * @public * @param {type} xid * @param {type} affiliation * @return {boolean} */ self.addInput = function(xid, affiliation) { try { var hash = hex_md5(xid + affiliation); // Add the HTML code $('#mucadmin .aut-' + affiliation + ' .aut-add').after( '
' + '' + '[-]' + '
' ); // Click event $('#mucadmin .' + hash + ' .aut-remove').click(function() { return self.removeInput(this); }); // Focus on the input we added if(!xid) { $(document).oneTime(10, function() { $('#mucadmin .' + hash + ' input').focus(); }); } } catch(e) { Console.error('MUCAdmin.addInput', e); } finally { return false; } }; /** * Handles the MUC admin form * @public * @param {object} iq * @return {undefined} */ self.handleAuth = function(iq) { try { // We got the authorizations results $(iq.getQuery()).find('item').each(function() { // We parse the received xml var xid = $(this).attr('jid'); var affiliation = $(this).attr('affiliation'); // We create one input for one XID self.addInput(xid, affiliation); }); // Hide the wait icon $('#mucadmin .wait').hide(); Console.log('MUC admin items received: ' + Common.fullXID(Common.getStanzaFrom(iq))); } catch(e) { Console.error('MUCAdmin.handleAuth', e); } }; /** * Queries the MUC admin form * @public * @param {string} xid * @param {string} type * @return {undefined} */ self.query = function(xid, type) { try { // Show the wait icon $('#mucadmin .wait').show(); // New IQ var iq = new JSJaCIQ(); iq.setTo(xid); iq.setType('get'); var iqQuery = iq.setQuery(NS_MUC_ADMIN); iqQuery.appendChild(iq.buildNode('item', {'affiliation': type, 'xmlns': NS_MUC_ADMIN})); con.send(iq, self.handleAuth); } catch(e) { Console.error('MUCAdmin.query', e); } }; /** * Sends the new chat-room topic * @public * @param {string} xid * @return {undefined} */ self.sendTopic = function(xid) { try { // We get the new topic var topic = $('.mucadmin-topic textarea').val(); // We send the new topic if not blank if(topic) { var m = new JSJaCMessage(); m.setTo(xid); m.setType('groupchat'); m.setSubject(topic); con.send(m); Console.info('MUC admin topic sent: ' + topic); } } catch(e) { Console.error('MUCAdmin.sendTopic', e); } }; /** * Sends the MUC admin auth form * @public * @param {string} xid * @return {undefined} */ self.sendAuth = function(xid) { try { // We define the values array var types = new Array('member', 'owner', 'admin', 'outcast'); $.each(types, function(i) { // We get the current type var tType = types[i]; // We loop for all the elements $('.mucadmin-aut .aut-' + tType + ' input').each(function() { // We get the needed values var value = $(this).val(); var affiliation = ($(this).hasClass('aut-dustbin') && value) ? 'none' : tType; // Submit affiliation if(value && affiliation) { self.setAffiliation(xid, value, affiliation); } }); }); Console.info('MUC admin authorizations form sent: ' + xid); } catch(e) { Console.error('MUCAdmin.sendAuth', e); } }; /** * Sets the affiliation for a given user * @public * @param {string} muc_xid * @param {string} user_xid * @param {string} affiliation * @return {undefined} */ self.setAffiliation = function(muc_xid, user_xid, affiliation) { try { // If no affiliation set, assume it's 'none' affiliation = affiliation || 'none'; // Go Go Go!! var iq = new JSJaCIQ(); iq.setTo(muc_xid); iq.setType('set'); var iqQuery = iq.setQuery(NS_MUC_ADMIN); var item = iqQuery.appendChild(iq.buildNode('item', { 'jid': user_xid, 'affiliation': affiliation, 'xmlns': NS_MUC_ADMIN })); con.send(iq, Errors.handleReply); } catch(e) { Console.error('MUCAdmin.setAffiliation', e); } }; /** * Checks if the MUC room was destroyed * @public * @param {object} iq * @return {undefined} */ self.handleDestroyIQ = function(iq) { try { if(!Errors.handleReply(iq)) { // We close the groupchat var room = Common.fullXID(Common.getStanzaFrom(iq)); var hash = hex_md5(room); Interface.quitThisChat(room, hash, 'groupchat'); // We close the muc admin popup self.close(); // We tell the user that all is okay Board.openThisInfo(5); // We remove the user's favorite if(DataStore.existDB(Connection.desktop_hash, 'favorites', room)) { Favorites.removeThis(room, Common.explodeThis('@', room, 0)); } Console.info('MUC admin destroyed: ' + room); } // We hide the wait icon $('#mucadmin .wait').hide(); } catch(e) { Console.error('MUCAdmin.handleDestroyIQ', e); } }; /** * Destroys a MUC room * @public * @param {string} xid * @return {boolean} */ self.destroyIQ = function(xid) { try { // We ask the server to delete the room var iq = new JSJaCIQ(); iq.setTo(xid); iq.setType('set'); var iqQuery = iq.setQuery(NS_MUC_OWNER); iqQuery.appendChild(iq.buildNode('destroy', {'xmlns': NS_MUC_OWNER})); con.send(iq, self.handleDestroyIQ); Console.info('MUC admin destroy sent: ' + xid); } catch(e) { Console.error('MUCAdmin.destroyIQ', e); } finally { return false; } }; /** * Performs the MUC room destroy functions * @public * @return {undefined} */ self.destroy = function() { try { // We get the XID of the current room var xid = $('#mucadmin .mucadmin-head-jid').text(); // We show the wait icon $('#mucadmin .wait').show(); // We send the iq self.destroyIQ(xid); } catch(e) { Console.error('MUCAdmin.destroy', e); } }; /** * Sends all the MUC admin stuffs * @public * @return {undefined} */ self.send = function() { try { // We get the XID of the current room var xid = $('#mucadmin .mucadmin-head-jid').text(); // We change the room topic self.sendTopic(xid); // We send the needed queries DataForm.send('x', 'submit', 'submit', $('#mucadmin .mucadmin-results').attr('data-session'), xid, '', '', 'mucadmin'); self.sendAuth(xid); } catch(e) { Console.error('MUCAdmin.send', e); } }; /** * Saves the MUC admin elements * @public * @return {boolean} */ self.save = function() { try { // We send the new options self.send(); // And we quit the popup return self.close(); } catch(e) { Console.error('MUCAdmin.save', e); } }; /** * Plugin launcher * @public * @return {undefined} */ self.instance = function() { try { // Click events $('#mucadmin .bottom .finish').click(function() { if($(this).is('.cancel')) { return self.close(); } if($(this).is('.save')) { return self.save(); } }); } catch(e) { Console.error('MUCAdmin.instance', e); } }; /** * Return class scope */ return self; })();