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();
},
/**
* Return the name of a contact
*/
getName : function(contact) {
return contact.find('.roster-name').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);
},
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 = $("
"
+ "
" + name + "
"
+ "
" + jid + "
");
Alias.insertContact(contact);
});
Alias.connection.addHandler(Alias.onPresence,null,'presence', null, null, null, null);
Alias.connection.send($pres());
return true;
},
onConnect: function(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.');
Alias.getRoster();
$('#password').val('');
$('#login').dialog('close');
$('#status').append($('Disconnect'));
$('#connect').click(function(){
Alias.connection.disconnect();
$('#roster ul').empty();
$('#login').dialog('open');
$(this).remove();
});
}
},
onMessage: function (message) {
var full_jid = $(message).attr('from');
var jid = Strophe.getBareJidFromJid(full_jid);
var jid_id = Alias.jid_to_id(jid);
if ($('#chat-' + jid_id).length === 0) {
$('#tabs').tabs('add', '#chat-' + jid_id, jid);
$('#chat-' + jid_id).append(
"" +
"");
}
$('#chat-' + jid_id).data({jid: full_jid});
var body = $(message).find("html > body");
if (body.length === 0) {
body = $(message).find('body');
if (body.length > 0) {
body = body.text();
} else {
body = null;
}
} else {
body = body.contents();
var span = $("");
body.each(function () {
if (document.importNode) {
$(document.importNode(this, true)).appendTo(span);
} else {
// IE workaround
span.append(this.xml);
}
});
body = span;
}
if (body) {
// add the new message
$('#chat-' + jid_id + ' .chat-messages').append(
"
" +
Strophe.getNodeFromJid(jid) +
"
");
$('#chat-' + jid_id + ' .chat-message:last .chat-text')
.append(body);
}
return true;
}
};
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');
}
jQuery.expr[':'].Contains = function(a,i,m){
return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};
$(document).ready(function(){
var connection = new Strophe.Connection(BOSH_SERVICE);
connection.rawInput = rawInput;
connection.rawOutput = rawOutput;
Alias.connection = connection;
Alias.connection.addHandler(Alias.onMessage, null, "message", "chat");
$('#login').dialog({
autoOpen: true,
modal: true,
title: 'Connect',
buttons: {
'Connect' : function () {
Alias.connection.connect($('#jid').get(0).value,
$('#pass').get(0).value,
Alias.onConnect);}
}
});
$('#bottomup').click(function(){
$(this).next().slideToggle();
});
$('#tabs').tabs();
$('#tabs').bind('tabsshow',function(event,ui){
$(ui.panel).find('input').focus();
$(ui.tab).parent().removeClass('ui-state-focus');
});
$('#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();
});
$('.roster-contact').live('click', function(){
log('test');
var jid = Alias.getID($(this));
var name = Alias.getName($(this));
var id = Alias.jid_to_id(jid);
if ($('#chat-' + id).length === 0) {
$('#tabs').tabs('add', '#chat-' + id, name);
$('#chat-' + id).append(
"" +
"");
$('#chat-' + id).data('jid', jid);
}
$('#tabs').tabs('select', '#chat-' + id);
$('#chat-' + id + ' input').focus();
});
$('.chat-input').live('keypress', function (ev) {
var jid = $(this).parent().data('jid');
if (ev.which === 13) {
ev.preventDefault();
var body = $(this).val();
var message = $msg({to: jid, "type": "chat"})
.c('body').t(body).up()
.c('active', {xmlns: "http://jabber.org/protocol/chatstates"});
Alias.connection.send(message);
$(this).parent().find('.chat-messages').append(
"
" +
Strophe.getNodeFromJid(Alias.connection.jid) +
"" + body +
"