var BOSH_SERVICE = 'http://alias.fr.nf/http-bind'; var server_component = 'object.alias.fr.nf' var connection = null; jQuery.expr[':'].Contains = function(a,i,m){ return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0; }; function log(msg, color) { $('#log').append($('
').css('background-color', color).text(msg)); } function rawInput(data) { log('RECV: ' + data, '#FBB6B4'); } function rawOutput(data) { log('SENT: ' + data, '#B5BBFB'); } function getRoster() { var roster = $iq({type : 'get'}).c('query', {xmlns : Strophe.NS.ROSTER}); connection.sendIQ(roster, onRoster); } function getPresence(contact) { if ( contact.hasClass("online") ) return 2; else if ( contact.hasClass("away") ) return 1; else return 0; } function jid_to_id(jid) { return Strophe.getBareJidFromJid(jid).replace(/[@.]/g,'-'); } function getJID(contact) { return contact.find('.roster-jid').text(); } function getHome(contact) { var name = Base64.encode(getJID(contact)) + '@' + server_component; var iq = $iq({type : 'get', to : name}).c('query', {xmlns : 'alias:query', type:'content'}); connection.sendIQ(iq, onHome); } function onHome(iq) { var content = $(iq).find('content').text(); $('#main').html(content); } function insertContact(contact) { var presence = getPresence(contact); var jid = getJID(contact); var contacts = $('#roster li'); if (contacts.length > 0) { var inserted = false; contacts.each(function () { var locpres = getPresence($(this)); var locjid = getJID($(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(){getHome($(this));}); } function onPresence(presence) { var who = $(presence).attr('from'); var type = $(presence).attr('type'); if (type !== 'error') { var contact = $('#'+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(); insertContact(contact); } return true; } function onRoster(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 = jid_to_id(jid); var contact = $("
  • " + "
    " + name + "
    " + "
    " + jid + "
  • "); insertContact(contact); }); connection.addHandler(onPresence,null,'presence', null, null, null, null); connection.send($pres()); return true; } function onConnect(status) { var jid = $('#jid').get(0).value; if ( status == Strophe.Status.CONNECTING ) { log('Strophe is connecting.'); } else if ( status == Strophe.Status.CONNFAIL ) { log('Strophe failed to connect.'); } else if ( status == Strophe.Status.DISCONNECTING ) { log('Strophe is disconnecting.'); } else if ( status == Strophe.Status.DISCONNECTED ) { log('Strophe is disconnected.'); } else if ( status == Strophe.Status.CONNECTED ) { log('Strophe is connected.'); getRoster(); $('#password').val(''); $('#login').dialog('close'); $('#status').append($('Disconnect')); $('#connect').click(function(){ connection.disconnect(); $('#roster ul').empty(); $('#login').dialog('open'); $(this).remove(); }); } } $(document).ready(function(){ connection = new Strophe.Connection(BOSH_SERVICE); connection.rawInput = rawInput; connection.rawOutput = rawOutput; $('#login').dialog({ autoOpen: true, modal: true, title: 'Connect', buttons: { 'Connect' : function () { connection.connect($('#jid').get(0).value, $('#pass').get(0).value, onConnect);} } }); $('#bottomup').click(function(){ $(this).next().slideToggle(); }); $('#rosterfilter').keyup(function() { var filter = $(this).val(); $('#roster ul li div.roster-name:not(:Contains("' + filter + '"))').parent().hide(); $('#roster ul li div.roster-name:Contains("' + filter + '")').parent().show(); }); });