diff --git a/converse.js b/converse.js
index 6bfe3822a..4570e715a 100644
--- a/converse.js
+++ b/converse.js
@@ -9,27 +9,48 @@
/* The following line defines global variables defined elsewhere. */
/*globals jQuery, portal_url*/
-
// AMD/global registrations
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
+
+ require.config({
+ // paths: {
+ // "patterns": "Libraries/Patterns"
+ // },
+ // define module dependencies for modules not using define
+ shim: {
+ 'Libraries/backbone': {
+ //These script dependencies should be loaded before loading
+ //backbone.js
+ deps: [
+ 'Libraries/underscore',
+ 'jquery'],
+ //Once loaded, use the global 'Backbone' as the
+ //module value.
+ exports: 'Backbone'
+ },
+
+ 'Libraries/strophe.muc': {
+ deps: ['Libraries/strophe', 'jquery']
+ },
+
+ 'Libraries/strophe.roster': {
+ deps: ['Libraries/strophe', 'jquery']
+ }
+ }
+ });
+
define([
- 'Libraries/burry.js/burry',
- "Libraries/jquery.gritter.min",
- "Libraries/jquery.cookie",
- "Libraries/jquery.ba-dotimeout.min",
+ "Libraries/burry.js/burry",
"Libraries/underscore",
- "Libraries/underscore.string/lib/underscore.string",
+ "Libraries/sjcl",
"Libraries/backbone",
- "Libraries/strophe",
"Libraries/strophe.muc",
- "Libraries/strophe.roster",
- "Libraries/diff_match_patch",
- "Libraries/jarnxmpp.core.handlers",
- "Libraries/jarnxmpp.collaboration.protocol",
- "Libraries/jarnxmpp.collaboration.collaborate"
- ], function (Burry) {
+ "Libraries/strophe.roster"
+ ], function (Burry, _s) {
var store = new Burry.Store('collective.xmpp.chat');
+ // Init underscore.str
+ _.str = _s;
// Use Mustache style syntax for variable interpolation
_.templateSettings = {
evaluate : /\{\[([\s\S]+?)\]\}/g,
@@ -561,20 +582,87 @@
});
xmppchat.ControlBoxView = xmppchat.ChatBoxView.extend({
- el: '#controlbox',
+ // XXX: Options for the (still to be done) 'settings' tab:
+ // * Show offline users
+ // * Auto-open chatbox when a message was received.
+ tagName: 'div',
+ className: 'chatbox',
+ id: 'controlbox',
events: {
- 'click a.close-controlbox-button': 'closeChat'
+ 'click a.close-controlbox-button': 'closeChat',
+ 'click ul.controlbox-tabs li a': 'switchTab'
+ },
+
+ template: _.template(
+ '
'+
+ ''+
+ ''+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ '- Available chatrooms
'+
+ '
'+
+ '
'+
+ '
'
+ ),
+
+ switchTab: function (ev) {
+ ev.preventDefault();
+ var $tab = $(ev.target),
+ $sibling = $tab.parent().siblings('li').children('a'),
+ $tab_panel = $($tab.attr('href')),
+ $sibling_panel = $($sibling.attr('href'));
+
+ $sibling_panel.fadeOut('fast', function () {
+ $sibling.removeClass('current');
+ $tab.addClass('current');
+ $tab_panel.fadeIn('fast', function () {
+ });
+ });
},
initialize: function () {
- var userspanel;
- $('ul.tabs').tabs('div.panes > div');
this.contactspanel = new xmppchat.ContactsPanel();
this.roomspanel = new xmppchat.RoomsPanel();
this.settingspanel = new xmppchat.SettingsPanel();
},
render: function () {
+ var that = this;
+ this.$el.hide('fast', function () {
+ $(this).addClass('chatbox').html(that.template(that.model.toJSON()));
+ });
return this;
}
});
@@ -799,7 +887,8 @@
that = this;
if (_.indexOf(open_chats, 'controlbox') != -1) {
- this.createChatBox('controlbox');
+ // Controlbox already exists, we just need to show it.
+ this.showChat('controlbox');
}
_.each(open_chats, $.proxy(function (jid) {
if (jid != 'controlbox') {
@@ -856,6 +945,7 @@
},
openChat: function (jid) {
+ jid = Strophe.getBareJidFromJid(jid);
if (!this.model.get(jid)) {
$.getJSON(portal_url + "/xmpp-userinfo?user_id=" + Strophe.getNodeFromJid(jid), $.proxy(function (data) {
view = this.createChatBox(jid, data);
@@ -903,10 +993,15 @@
initialize: function () {
this.options.model.on("add", function (item) {
- this.showChat(item.get('id'));
+ // The controlbox added automatically, but we don't show it
+ // automatically (only when it was open before page load or
+ // upon a click).
+ if (item.get('id') != 'controlbox') {
+ this.showChat(item.get('id'));
+ }
}, this);
-
this.views = {};
+ this.createChatBox('controlbox');
this.restoreOpenChats();
}
});
@@ -919,8 +1014,7 @@
if (!name) {
name = user_id;
}
- this.set({
- 'id': jid,
+ this.set({ 'id': jid,
'jid': jid,
'ask': ask,
'bare_jid': Strophe.getBareJidFromJid(jid),
@@ -1060,22 +1154,22 @@
rank = 4;
switch(presence_type) {
case 'offline':
- rank = 4;
+ rank = 0;
break;
case 'unavailable':
- rank = 3;
+ rank = 1;
break;
case 'away':
rank = 2;
break;
case 'busy':
- rank = 1;
+ rank = 3;
break;
case 'dnd':
- rank = 1;
+ rank = 4;
break;
case 'online':
- rank = 0;
+ rank = 5;
break;
}
return rank;
@@ -1099,10 +1193,6 @@
return (Strophe.getBareJidFromJid(jid) === Strophe.getBareJidFromJid(xmppchat.connection.jid));
},
- getRoster: function () {
- return xmppchat.connection.roster.get($.proxy(this.rosterHandler, this));
- },
-
getItem: function (id) {
return Backbone.Collection.prototype.get.call(this, id);
},
@@ -1277,7 +1367,6 @@
}
return true;
},
-
});
xmppchat.RosterView= (function (roster, _, $, console) {
@@ -1516,17 +1605,25 @@
this.fullname = chatdata.attr('fullname');
this.auto_subscribe = chatdata.attr('auto_subscribe') === "True" || false;
+ $(document).bind('jarnxmpp.connected', $.proxy(function (ev, conn) {
+ alert("Connection Failed :(");
+ }, this));
+
$(document).unbind('jarnxmpp.connected');
$(document).bind('jarnxmpp.connected', $.proxy(function () {
- // this.connection.xmlInput = function (body) { console.log(body); };
- // this.connection.xmlOutput = function (body) { console.log(body); };
-
+ this.connection.xmlInput = function (body) { console.log(body); };
+ this.connection.xmlOutput = function (body) {
+ console.log(body);
+ };
this.connection.bare_jid = Strophe.getBareJidFromJid(this.connection.jid);
this.connection.domain = Strophe.getDomainFromJid(this.connection.jid);
- // XXX: Better if configurable?
this.connection.muc_domain = 'conference.' + this.connection.domain;
+ this.storage = new this.ClientStorage({'own_jid': this.connection.bare_jid});
- this.storage = new this.ClientStorage(Strophe.getBareJidFromJid(this.connection.jid));
+ this.chatboxes = new this.ChatBoxes();
+ this.chatboxesview = new this.ChatBoxesView({
+ 'model': this.chatboxes
+ });
this.roster = new this.RosterItems();
this.rosterview = Backbone.View.extend(this.RosterView(this.roster, _, $, console));
@@ -1534,34 +1631,29 @@
$.proxy(this.roster.subscribeToSuggestedItems, this.roster),
'http://jabber.org/protocol/rosterx', 'message', null);
- this.connection.addHandler(
- $.proxy(function (presence) {
- this.presenceHandler(presence);
- return true;
- }, this.roster), null, 'presence', null);
-
this.connection.roster.registerCallback(
$.proxy(this.roster.rosterHandler, this.roster),
null, 'presence', null);
-
- this.roster.getRoster();
- this.chatboxes = new this.ChatBoxes();
- this.chatboxesview = new this.ChatBoxesView({
- 'model': this.chatboxes
- });
+ this.connection.roster.get($.proxy(function () {
+ this.connection.addHandler(
+ $.proxy(function (presence) {
+ this.presenceHandler(presence);
+ return true;
+ }, this.roster), null, 'presence', null);
- this.connection.addHandler(
- $.proxy(function (message) {
- this.chatboxesview.messageReceived(message);
- return true;
- }, this), null, 'message', 'chat');
+ this.connection.addHandler(
+ $.proxy(function (message) {
+ this.chatboxesview.messageReceived(message);
+ return true;
+ }, this), null, 'message', 'chat');
- // XMPP Status
- this.xmppstatus = new this.XMPPStatus();
- this.xmppstatusview = new this.XMPPStatusView({
- 'model': this.xmppstatus
- });
+ // XMPP Status
+ this.xmppstatus = new this.XMPPStatus();
+ this.xmppstatusview = new this.XMPPStatusView({
+ 'model': this.xmppstatus
+ });
+ }, this));
// Controlbox toggler
$toggle.bind('click', $.proxy(function (e) {