var BOSH_SERVICE = 'http://alias.fr.nf/http-bind'; var server_component = 'object.alias.fr.nf'; /** * Alias namespace */ var Alias = { /** * Status constants */ Status: { ONLINE: 2, AWAY: 1, OFFLINE: 0 }, /** * Strophe xmpp connection */ connection: null, /** * Send a roster request to server */ getRoster: function() { var roster = $iq({type : 'get'}).c('query', {xmlns : Strophe.NS.ROSTER}); Alias.connection.sendIQ(roster, Alias.onRoster); }, /** * Return the status of a contact * @param contact a jquery object * @returns {Number} the status number * @see Alias.Status */ getPresence: function(contact) { if ( contact.hasClass("online") ) return Alias.Status["ONLINE"]; else if ( contact.hasClass("away") ) return Alias.Status["AWAY"]; else return Alias.Status["OFFLINE"]; }, /** * Convert a jid to an id string suitable for css id * @param {String} jid * @returns {String} id */ jid_to_id: function(jid) { return Strophe.getBareJidFromJid(jid).replace(/[@.]/g,'-'); }, /** * Return the id of a contact * @param contact jquery object * @returns {String} id */ getID: function(contact) { return contact.find('.roster-jid').text(); }, /** * Get the home node of a contact * @param contact jquery object */ getHome: function(contact) { var name = Base64.encode(Alias.getID(contact)) + '@' + server_component; var iq = $iq({type : 'get', to : name}).c('query', {xmlns : 'alias:query', type:'content'}); Alias.connection.sendIQ(iq, Alias.onHome); }, /** * Called when receiving home node, display in the main div * @param iq XML object */ onHome: function(iq) { var content = $(iq).find('content').text(); $('#main').html(content); }, /** * Insert a contact keeping the sorting of the roster * The contacts are sorted based on their status and on their names * @param contact jQuery object */ insertContact: function(contact) { var presence = Alias.getPresence(contact); var jid = Alias.getID(contact); var contacts = $('#roster li'); if (contacts.length > 0) { var inserted = false; contacts.each(function () { var locpres = Alias.getPresence($(this)); var locjid = Alias.getID($(this)); if (presence > locpres) { $(this).before(contact); inserted = true; return false; } else if ( (presence == locpres) && (jid < locjid) ) { $(this).before(contact); inserted = true; return false; } }); if (!inserted) $('#roster ul').append(contact); } else $('#roster ul').append(contact); contact.click(function(){Alias.getHome($(this));}); }, onPresence: function(presence) { var who = $(presence).attr('from'); var type = $(presence).attr('type'); if (type !== 'error') { var contact = $('#' + Alias.jid_to_id(who)); contact.removeClass('online away offline'); if (type === 'unavailable') { contact.addClass('offline'); } else { var show = $(presence).find('show').text(); if (show === '' || show === '') { contact.addClass('online'); } else { contact.addClass('away'); } } contact.remove(); Alias.insertContact(contact); } return true; }, onRoster: function(iq) { $('#roster li').remove(); var elems = iq.getElementsByTagName('query'); var query = elems[0]; Strophe.forEachChild(query, 'item', function(item) { var jid = item.getAttribute('jid'); var name = item.getAttribute('name') || jid; var id = Alias.jid_to_id(jid); var contact = $("