|
@@ -14,7 +14,7 @@
|
|
if (console===undefined || console.log===undefined) {
|
|
if (console===undefined || console.log===undefined) {
|
|
console = { log: function () {}, error: function () {} };
|
|
console = { log: function () {}, error: function () {} };
|
|
}
|
|
}
|
|
- if (typeof define === 'function' && define.amd) {
|
|
|
|
|
|
+ if (typeof define === 'function' && define.amd) {
|
|
require.config({
|
|
require.config({
|
|
// paths: {
|
|
// paths: {
|
|
// "patterns": "Libraries/Patterns"
|
|
// "patterns": "Libraries/Patterns"
|
|
@@ -25,7 +25,7 @@
|
|
//These script dependencies should be loaded before loading
|
|
//These script dependencies should be loaded before loading
|
|
//backbone.js
|
|
//backbone.js
|
|
deps: [
|
|
deps: [
|
|
- 'Libraries/underscore',
|
|
|
|
|
|
+ 'Libraries/underscore',
|
|
'jquery'],
|
|
'jquery'],
|
|
//Once loaded, use the global 'Backbone' as the
|
|
//Once loaded, use the global 'Backbone' as the
|
|
//module value.
|
|
//module value.
|
|
@@ -44,7 +44,6 @@
|
|
|
|
|
|
define([
|
|
define([
|
|
"Libraries/burry.js/burry",
|
|
"Libraries/burry.js/burry",
|
|
- "Libraries/underscore.string",
|
|
|
|
"Libraries/jquery.tinysort",
|
|
"Libraries/jquery.tinysort",
|
|
"Libraries/jquery-ui-1.9.1.custom",
|
|
"Libraries/jquery-ui-1.9.1.custom",
|
|
"Libraries/sjcl",
|
|
"Libraries/sjcl",
|
|
@@ -63,7 +62,7 @@
|
|
return factory(jQuery, store, _, console);
|
|
return factory(jQuery, store, _, console);
|
|
}
|
|
}
|
|
);
|
|
);
|
|
- } else {
|
|
|
|
|
|
+ } else {
|
|
// Browser globals
|
|
// Browser globals
|
|
var store = new Burry.Store('collective.xmpp.chat');
|
|
var store = new Burry.Store('collective.xmpp.chat');
|
|
_.templateSettings = {
|
|
_.templateSettings = {
|
|
@@ -85,15 +84,38 @@
|
|
pad = function (num) {
|
|
pad = function (num) {
|
|
return (num < 10) ? '0' + num : '' + num;
|
|
return (num < 10) ? '0' + num : '' + num;
|
|
};
|
|
};
|
|
- return date.getUTCFullYear() + '-' +
|
|
|
|
- pad(date.getUTCMonth() + 1) + '-' +
|
|
|
|
- pad(date.getUTCDate()) + 'T' +
|
|
|
|
- pad(date.getUTCHours()) + ':' +
|
|
|
|
- pad(date.getUTCMinutes()) + ':' +
|
|
|
|
- pad(date.getUTCSeconds()) + '.000Z';
|
|
|
|
|
|
+ return date.getUTCFullYear() + '-' +
|
|
|
|
+ pad(date.getUTCMonth() + 1) + '-' +
|
|
|
|
+ pad(date.getUTCDate()) + 'T' +
|
|
|
|
+ pad(date.getUTCHours()) + ':' +
|
|
|
|
+ pad(date.getUTCMinutes()) + ':' +
|
|
|
|
+ pad(date.getUTCSeconds()) + '.000Z';
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ xmppchat.parseISO8601 = function (datestr) {
|
|
|
|
+ /* Parses string formatted as 2013-02-14T11:27:08.268Z to a Date obj.
|
|
|
|
+ */
|
|
|
|
+ var numericKeys = [1, 4, 5, 6, 7, 10, 11],
|
|
|
|
+ struct = /^\s*(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}\.?\d*)Z\s*$/.exec(datestr),
|
|
|
|
+ minutesOffset = 0;
|
|
|
|
+
|
|
|
|
+ for (var i = 0, k; (k = numericKeys[i]); ++i) {
|
|
|
|
+ struct[k] = +struct[k] || 0;
|
|
|
|
+ }
|
|
|
|
+ // allow undefined days and months
|
|
|
|
+ struct[2] = (+struct[2] || 1) - 1;
|
|
|
|
+ struct[3] = +struct[3] || 1;
|
|
|
|
+ if (struct[8] !== 'Z' && struct[9] !== undefined) {
|
|
|
|
+ minutesOffset = struct[10] * 60 + struct[11];
|
|
|
|
+
|
|
|
|
+ if (struct[9] === '+') {
|
|
|
|
+ minutesOffset = 0 - minutesOffset;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return new Date(Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]));
|
|
|
|
+ };
|
|
|
|
+
|
|
xmppchat.updateMsgCounter = function () {
|
|
xmppchat.updateMsgCounter = function () {
|
|
this.msg_counter += 1;
|
|
this.msg_counter += 1;
|
|
if (this.msg_counter > 0) {
|
|
if (this.msg_counter > 0) {
|
|
@@ -110,7 +132,7 @@
|
|
};
|
|
};
|
|
|
|
|
|
xmppchat.collections = {
|
|
xmppchat.collections = {
|
|
- /* FIXME: XEP-0136 specifies 'urn:xmpp:archive' but the mod_archive_odbc
|
|
|
|
|
|
+ /* FIXME: XEP-0136 specifies 'urn:xmpp:archive' but the mod_archive_odbc
|
|
* add-on for ejabberd wants the URL below. This might break for other
|
|
* add-on for ejabberd wants the URL below. This might break for other
|
|
* Jabber servers.
|
|
* Jabber servers.
|
|
*/
|
|
*/
|
|
@@ -128,17 +150,17 @@
|
|
.c('max')
|
|
.c('max')
|
|
.t('1');
|
|
.t('1');
|
|
|
|
|
|
- xmppchat.connection.sendIQ(iq,
|
|
|
|
|
|
+ xmppchat.connection.sendIQ(iq,
|
|
callback,
|
|
callback,
|
|
- function () {
|
|
|
|
- console.log('Error while retrieving collections');
|
|
|
|
|
|
+ function () {
|
|
|
|
+ console.log('Error while retrieving collections');
|
|
});
|
|
});
|
|
};
|
|
};
|
|
|
|
|
|
xmppchat.collections.getLastMessages = function (jid, callback) {
|
|
xmppchat.collections.getLastMessages = function (jid, callback) {
|
|
var that = this;
|
|
var that = this;
|
|
this.getLastCollection(jid, function (result) {
|
|
this.getLastCollection(jid, function (result) {
|
|
- // Retrieve the last page of a collection (max 30 elements).
|
|
|
|
|
|
+ // Retrieve the last page of a collection (max 30 elements).
|
|
var $collection = $(result).find('chat'),
|
|
var $collection = $(result).find('chat'),
|
|
jid = $collection.attr('with'),
|
|
jid = $collection.attr('with'),
|
|
start = $collection.attr('start'),
|
|
start = $collection.attr('start'),
|
|
@@ -197,7 +219,7 @@
|
|
|
|
|
|
getOpenChats: function () {
|
|
getOpenChats: function () {
|
|
var key = hex_sha1(this.get('own_jid')+'-open-chats'),
|
|
var key = hex_sha1(this.get('own_jid')+'-open-chats'),
|
|
- chats = store.get(key) || [],
|
|
|
|
|
|
+ chats = store.get(key) || [],
|
|
decrypted_chats = [],
|
|
decrypted_chats = [],
|
|
i;
|
|
i;
|
|
|
|
|
|
@@ -234,7 +256,7 @@
|
|
store.flush();
|
|
store.flush();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
-
|
|
|
|
|
|
+
|
|
xmppchat.ChatBox = Backbone.Model.extend({
|
|
xmppchat.ChatBox = Backbone.Model.extend({
|
|
initialize: function () {
|
|
initialize: function () {
|
|
this.set({
|
|
this.set({
|
|
@@ -258,15 +280,15 @@
|
|
},
|
|
},
|
|
|
|
|
|
message_template: _.template(
|
|
message_template: _.template(
|
|
- '<div class="chat-message {{extra_classes}}">' +
|
|
|
|
- '<span class="chat-message-{{sender}}">{{time}} {{username}}: </span>' +
|
|
|
|
- '<span class="chat-message-content">{{message}}</span>' +
|
|
|
|
|
|
+ '<div class="chat-message {{extra_classes}}">' +
|
|
|
|
+ '<span class="chat-message-{{sender}}">{{time}} {{username}}: </span>' +
|
|
|
|
+ '<span class="chat-message-content">{{message}}</span>' +
|
|
'</div>'),
|
|
'</div>'),
|
|
|
|
|
|
action_template: _.template(
|
|
action_template: _.template(
|
|
- '<div class="chat-message {{extra_classes}}">' +
|
|
|
|
- '<span class="chat-message-{{sender}}">{{time}}: </span>' +
|
|
|
|
- '<span class="chat-message-content">{{message}}</span>' +
|
|
|
|
|
|
+ '<div class="chat-message {{extra_classes}}">' +
|
|
|
|
+ '<span class="chat-message-{{sender}}">{{time}}: </span>' +
|
|
|
|
+ '<span class="chat-message-content">{{message}}</span>' +
|
|
'</div>'),
|
|
'</div>'),
|
|
|
|
|
|
autoLink: function (text) {
|
|
autoLink: function (text) {
|
|
@@ -279,7 +301,7 @@
|
|
var now = new Date(),
|
|
var now = new Date(),
|
|
time = now.toLocaleTimeString().substring(0,5),
|
|
time = now.toLocaleTimeString().substring(0,5),
|
|
minutes = now.getMinutes().toString(),
|
|
minutes = now.getMinutes().toString(),
|
|
- $chat_content = $(this.el).find('.chat-content');
|
|
|
|
|
|
+ $chat_content = this.$el.find('.chat-content');
|
|
|
|
|
|
var msg = xmppchat.storage.getLastMessage(this.model.get('jid'));
|
|
var msg = xmppchat.storage.getLastMessage(this.model.get('jid'));
|
|
if (typeof msg !== 'undefined') {
|
|
if (typeof msg !== 'undefined') {
|
|
@@ -293,9 +315,9 @@
|
|
if (minutes.length==1) {minutes = '0'+minutes;}
|
|
if (minutes.length==1) {minutes = '0'+minutes;}
|
|
$chat_content.find('div.chat-event').remove();
|
|
$chat_content.find('div.chat-event').remove();
|
|
$chat_content.append(this.message_template({
|
|
$chat_content.append(this.message_template({
|
|
- 'sender': 'me',
|
|
|
|
- 'time': time,
|
|
|
|
- 'message': message,
|
|
|
|
|
|
+ 'sender': 'me',
|
|
|
|
+ 'time': time,
|
|
|
|
+ 'message': message,
|
|
'username': 'me',
|
|
'username': 'me',
|
|
'extra_classes': ''
|
|
'extra_classes': ''
|
|
}));
|
|
}));
|
|
@@ -310,14 +332,14 @@
|
|
},
|
|
},
|
|
|
|
|
|
messageReceived: function (message) {
|
|
messageReceived: function (message) {
|
|
- /* XXX: event.mtype should be 'xhtml' for XHTML-IM messages,
|
|
|
|
- but I only seem to get 'text'.
|
|
|
|
|
|
+ /* XXX: event.mtype should be 'xhtml' for XHTML-IM messages,
|
|
|
|
+ but I only seem to get 'text'.
|
|
*/
|
|
*/
|
|
var body = this.autoLink($message.children('body').text()),
|
|
var body = this.autoLink($message.children('body').text()),
|
|
from = Strophe.getBareJidFromJid($message.attr('from')),
|
|
from = Strophe.getBareJidFromJid($message.attr('from')),
|
|
to = $message.attr('to'),
|
|
to = $message.attr('to'),
|
|
composing = $message.find('composing'),
|
|
composing = $message.find('composing'),
|
|
- $chat_content = $(this.el).find('.chat-content'),
|
|
|
|
|
|
+ $chat_content = this.$el.find('.chat-content'),
|
|
delayed = $message.find('delay').length > 0,
|
|
delayed = $message.find('delay').length > 0,
|
|
fullname = this.model.get('fullname'),
|
|
fullname = this.model.get('fullname'),
|
|
time, stamp, username, sender;
|
|
time, stamp, username, sender;
|
|
@@ -347,13 +369,13 @@
|
|
// XXX: Test properly (for really old messages we somehow need to show
|
|
// XXX: Test properly (for really old messages we somehow need to show
|
|
// their date as well)
|
|
// their date as well)
|
|
stamp = $message.find('delay').attr('stamp');
|
|
stamp = $message.find('delay').attr('stamp');
|
|
- time = (new Date(stamp)).toLocaleTimeString().substring(0,5);
|
|
|
|
|
|
+ time = (new Date(stamp)).toLocaleTimeString().substring(0,5);
|
|
} else {
|
|
} else {
|
|
- time = (new Date()).toLocaleTimeString().substring(0,5);
|
|
|
|
|
|
+ time = (new Date()).toLocaleTimeString().substring(0,5);
|
|
}
|
|
}
|
|
$chat_content.append(
|
|
$chat_content.append(
|
|
this.message_template({
|
|
this.message_template({
|
|
- 'sender': sender,
|
|
|
|
|
|
+ 'sender': sender,
|
|
'time': time,
|
|
'time': time,
|
|
'message': body,
|
|
'message': body,
|
|
'username': username,
|
|
'username': username,
|
|
@@ -370,11 +392,11 @@
|
|
|
|
|
|
insertClientStoredMessages: function () {
|
|
insertClientStoredMessages: function () {
|
|
var msgs = xmppchat.storage.getMessages(this.model.get('jid')),
|
|
var msgs = xmppchat.storage.getMessages(this.model.get('jid')),
|
|
- $content = this.$el.find('.chat-content'),
|
|
|
|
- prev_date, this_date, now, separator, i;
|
|
|
|
|
|
+ $content = this.$el.find('.chat-content'),
|
|
|
|
+ prev_date, this_date, now, separator, i;
|
|
|
|
|
|
for (i=0; i<_.size(msgs); i++) {
|
|
for (i=0; i<_.size(msgs); i++) {
|
|
- var msg = msgs[i],
|
|
|
|
|
|
+ var msg = msgs[i],
|
|
msg_array = msg.split(' ', 2),
|
|
msg_array = msg.split(' ', 2),
|
|
date = msg_array[0];
|
|
date = msg_array[0];
|
|
|
|
|
|
@@ -395,16 +417,16 @@
|
|
if (msg_array[1] == 'to') {
|
|
if (msg_array[1] == 'to') {
|
|
$content.append(
|
|
$content.append(
|
|
this.message_template({
|
|
this.message_template({
|
|
- 'sender': 'me',
|
|
|
|
|
|
+ 'sender': 'me',
|
|
'time': this_date.toLocaleTimeString().substring(0,5),
|
|
'time': this_date.toLocaleTimeString().substring(0,5),
|
|
- 'message': msg,
|
|
|
|
|
|
+ 'message': msg,
|
|
'username': 'me',
|
|
'username': 'me',
|
|
'extra_classes': 'delayed'
|
|
'extra_classes': 'delayed'
|
|
}));
|
|
}));
|
|
} else {
|
|
} else {
|
|
$content.append(
|
|
$content.append(
|
|
this.message_template({
|
|
this.message_template({
|
|
- 'sender': 'them',
|
|
|
|
|
|
+ 'sender': 'them',
|
|
'time': this_date.toLocaleTimeString().substring(0,5),
|
|
'time': this_date.toLocaleTimeString().substring(0,5),
|
|
'message': msg,
|
|
'message': msg,
|
|
'username': this.model.get('fullname').split(' ')[0],
|
|
'username': this.model.get('fullname').split(' ')[0],
|
|
@@ -414,25 +436,35 @@
|
|
}
|
|
}
|
|
},
|
|
},
|
|
|
|
|
|
|
|
+ addHelpMessages: function (msgs) {
|
|
|
|
+ var $chat_content = this.$el.find('.chat-content'), i;
|
|
|
|
+ for (i=0; i<msgs.length; i++) {
|
|
|
|
+ $chat_content.append($('<div class="chat-help">'+msgs[i]+'</div>'));
|
|
|
|
+ }
|
|
|
|
+ this.scrolldown();
|
|
|
|
+ },
|
|
|
|
+
|
|
sendMessage: function (text) {
|
|
sendMessage: function (text) {
|
|
// TODO: Look in ChatPartners to see what resources we have for the recipient.
|
|
// TODO: Look in ChatPartners to see what resources we have for the recipient.
|
|
// if we have one resource, we sent to only that resources, if we have multiple
|
|
// if we have one resource, we sent to only that resources, if we have multiple
|
|
// we send to the bare jid.
|
|
// we send to the bare jid.
|
|
var timestamp = (new Date()).getTime(),
|
|
var timestamp = (new Date()).getTime(),
|
|
bare_jid = this.model.get('jid'),
|
|
bare_jid = this.model.get('jid'),
|
|
- match = text.replace(/^\s*/, "").match(/^\/(.*)\s*$/), el, $chat_content;
|
|
|
|
|
|
+ match = text.replace(/^\s*/, "").match(/^\/(.*)\s*$/), el, $chat_content,
|
|
|
|
+ msgs;
|
|
|
|
|
|
if (match) {
|
|
if (match) {
|
|
if (match[1] === "clear") {
|
|
if (match[1] === "clear") {
|
|
- $(this.el).find('.chat-content').empty();
|
|
|
|
|
|
+ this.$el.find('.chat-content').empty();
|
|
xmppchat.storage.clearMessages(bare_jid);
|
|
xmppchat.storage.clearMessages(bare_jid);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
else if (match[1] === "help") {
|
|
else if (match[1] === "help") {
|
|
- $chat_content = $(this.el).find('.chat-content');
|
|
|
|
- $chat_content.append($('<div class="chat-help"><strong>/help</strong>: Show this menu</div>'));
|
|
|
|
- $chat_content.append($('<div class="chat-help"><strong>/clear</strong>: Remove messages</div>'));
|
|
|
|
- this.scrolldown();
|
|
|
|
|
|
+ msgs = [
|
|
|
|
+ '<strong>/help</strong>: Show this menu',
|
|
|
|
+ '<strong>/clear</strong>: Remove messages'
|
|
|
|
+ ];
|
|
|
|
+ this.addHelpMessages(msgs);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -467,14 +499,19 @@
|
|
if (message !== '') {
|
|
if (message !== '') {
|
|
this.sendMessage(message);
|
|
this.sendMessage(message);
|
|
}
|
|
}
|
|
- $(this.el).data('composing', false);
|
|
|
|
|
|
+ this.$el.data('composing', false);
|
|
} else {
|
|
} else {
|
|
- composing = $(this.el).data('composing');
|
|
|
|
- if (!composing) {
|
|
|
|
- notify = $msg({'to':this.model.get('jid'), 'type': 'chat'})
|
|
|
|
- .c('composing', {'xmlns':'http://jabber.org/protocol/chatstates'});
|
|
|
|
- xmppchat.connection.send(notify);
|
|
|
|
- $(this.el).data('composing', true);
|
|
|
|
|
|
+ composing = this.$el.data('composing');
|
|
|
|
+ if (!composing) {
|
|
|
|
+ if (ev.keyCode != 47) {
|
|
|
|
+ // We don't send composing messages if the message
|
|
|
|
+ // starts with forward-slash.
|
|
|
|
+ notify = $msg({'to':this.model.get('jid'), 'type': 'chat'})
|
|
|
|
+ .c('composing', {'xmlns':'http://jabber.org/protocol/chatstates'});
|
|
|
|
+ xmppchat.connection.send(notify);
|
|
|
|
+ this.$el.data('composing', true);
|
|
|
|
+ }
|
|
|
|
+ this.$el.data('composing', true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
},
|
|
@@ -527,7 +564,7 @@
|
|
'</a>' +
|
|
'</a>' +
|
|
'<p class="user-custom-message"><p/>' +
|
|
'<p class="user-custom-message"><p/>' +
|
|
'</div>' +
|
|
'</div>' +
|
|
- '<div class="chat-content"></div>' +
|
|
|
|
|
|
+ '<div class="chat-content"></div>' +
|
|
'<form class="sendXMPPMessage" action="" method="post">' +
|
|
'<form class="sendXMPPMessage" action="" method="post">' +
|
|
'<textarea ' +
|
|
'<textarea ' +
|
|
'type="text" ' +
|
|
'type="text" ' +
|
|
@@ -536,18 +573,18 @@
|
|
'</form>'),
|
|
'</form>'),
|
|
|
|
|
|
render: function () {
|
|
render: function () {
|
|
- $(this.el).attr('id', this.model.get('box_id'));
|
|
|
|
- $(this.el).html(this.template(this.model.toJSON()));
|
|
|
|
|
|
+ this.$el.attr('id', this.model.get('box_id'));
|
|
|
|
+ this.$el.html(this.template(this.model.toJSON()));
|
|
this.insertClientStoredMessages();
|
|
this.insertClientStoredMessages();
|
|
return this;
|
|
return this;
|
|
},
|
|
},
|
|
|
|
|
|
isVisible: function () {
|
|
isVisible: function () {
|
|
- return $(this.el).is(':visible');
|
|
|
|
|
|
+ return this.$el.is(':visible');
|
|
},
|
|
},
|
|
|
|
|
|
focus: function () {
|
|
focus: function () {
|
|
- $(this.el).find('.chat-textarea').focus();
|
|
|
|
|
|
+ this.$el.find('.chat-textarea').focus();
|
|
return this;
|
|
return this;
|
|
},
|
|
},
|
|
|
|
|
|
@@ -614,7 +651,7 @@
|
|
$.getJSON(portal_url + "/search-users?q=" + $(ev.target).find('input.username').val(), function (data) {
|
|
$.getJSON(portal_url + "/search-users?q=" + $(ev.target).find('input.username').val(), function (data) {
|
|
var $results_el = $('#found-users');
|
|
var $results_el = $('#found-users');
|
|
$(data).each(function (idx, obj) {
|
|
$(data).each(function (idx, obj) {
|
|
- if ($results_el.children().length > 0) {
|
|
|
|
|
|
+ if ($results_el.children().length > 0) {
|
|
$results_el.empty();
|
|
$results_el.empty();
|
|
}
|
|
}
|
|
$results_el.append(
|
|
$results_el.append(
|
|
@@ -683,7 +720,7 @@
|
|
|
|
|
|
updateRoomsList: function () {
|
|
updateRoomsList: function () {
|
|
xmppchat.connection.muc.listRooms(xmppchat.connection.muc_domain, $.proxy(function (iq) {
|
|
xmppchat.connection.muc.listRooms(xmppchat.connection.muc_domain, $.proxy(function (iq) {
|
|
- var room, name, jid, i,
|
|
|
|
|
|
+ var room, name, jid, i,
|
|
rooms = $(iq).find('query').find('item');
|
|
rooms = $(iq).find('query').find('item');
|
|
this.$el.find('#available-chatrooms').find('dd.available-chatroom').remove();
|
|
this.$el.find('#available-chatrooms').find('dd.available-chatroom').remove();
|
|
if (rooms.length) {
|
|
if (rooms.length) {
|
|
@@ -706,7 +743,7 @@
|
|
if (ev.type === 'click') {
|
|
if (ev.type === 'click') {
|
|
jid = $(ev.target).attr('data-room-jid');
|
|
jid = $(ev.target).attr('data-room-jid');
|
|
} else {
|
|
} else {
|
|
- name = _.str.strip($(ev.target).find('input.new-chatroom-name').val()).toLowerCase();
|
|
|
|
|
|
+ name = $(ev.target).find('input.new-chatroom-name').val().trim().toLowerCase();
|
|
if (name) {
|
|
if (name) {
|
|
jid = Strophe.escapeNode(name) + '@' + xmppchat.connection.muc_domain;
|
|
jid = Strophe.escapeNode(name) + '@' + xmppchat.connection.muc_domain;
|
|
} else {
|
|
} else {
|
|
@@ -761,7 +798,7 @@
|
|
$tab_panel = $($tab.attr('href')),
|
|
$tab_panel = $($tab.attr('href')),
|
|
$sibling_panel = $($sibling.attr('href'));
|
|
$sibling_panel = $($sibling.attr('href'));
|
|
|
|
|
|
- $sibling_panel.fadeOut('fast', function () {
|
|
|
|
|
|
+ $sibling_panel.fadeOut('fast', function () {
|
|
$sibling.removeClass('current');
|
|
$sibling.removeClass('current');
|
|
$tab.addClass('current');
|
|
$tab.addClass('current');
|
|
$tab_panel.fadeIn('fast', function () {
|
|
$tab_panel.fadeIn('fast', function () {
|
|
@@ -769,6 +806,11 @@
|
|
});
|
|
});
|
|
},
|
|
},
|
|
|
|
|
|
|
|
+ addHelpMessages: function (msgs) {
|
|
|
|
+ // Override addHelpMessages in ChatBoxView, for now do nothing.
|
|
|
|
+ return;
|
|
|
|
+ },
|
|
|
|
+
|
|
render: function () {
|
|
render: function () {
|
|
var that = this;
|
|
var that = this;
|
|
this.$el.hide('fast', function () {
|
|
this.$el.hide('fast', function () {
|
|
@@ -803,8 +845,8 @@
|
|
closeChatRoom: function () {
|
|
closeChatRoom: function () {
|
|
this.closeChat();
|
|
this.closeChat();
|
|
xmppchat.connection.muc.leave(
|
|
xmppchat.connection.muc.leave(
|
|
- this.model.get('jid'),
|
|
|
|
- this.model.get('nick'),
|
|
|
|
|
|
+ this.model.get('jid'),
|
|
|
|
+ this.model.get('nick'),
|
|
this.onLeave,
|
|
this.onLeave,
|
|
undefined);
|
|
undefined);
|
|
delete xmppchat.chatboxesview.views[this.model.get('jid')];
|
|
delete xmppchat.chatboxesview.views[this.model.get('jid')];
|
|
@@ -824,12 +866,13 @@
|
|
message = message.replace(/^\s+|\s+jQuery/g,"");
|
|
message = message.replace(/^\s+|\s+jQuery/g,"");
|
|
$textarea.val('').focus();
|
|
$textarea.val('').focus();
|
|
if (message !== '') {
|
|
if (message !== '') {
|
|
- this.sendGroupMessage(message);
|
|
|
|
|
|
+ this.sendChatRoomMessage(message);
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ }
|
|
},
|
|
},
|
|
|
|
|
|
- sendGroupMessage: function (body) {
|
|
|
|
|
|
+ sendChatRoomMessage: function (body) {
|
|
|
|
+ this.appendMessage(body);
|
|
var match = body.replace(/^\s*/, "").match(/^\/(.*?)(?: (.*))?$/) || [false];
|
|
var match = body.replace(/^\s*/, "").match(/^\/(.*?)(?: (.*))?$/) || [false];
|
|
switch (match[1]) {
|
|
switch (match[1]) {
|
|
case 'msg':
|
|
case 'msg':
|
|
@@ -851,7 +894,7 @@
|
|
xmppchat.connection.muc.deop(this.model.get('jid'), match[2]);
|
|
xmppchat.connection.muc.deop(this.model.get('jid'), match[2]);
|
|
break;
|
|
break;
|
|
case 'help':
|
|
case 'help':
|
|
- $chat_content = $(this.el).find('.chat-content');
|
|
|
|
|
|
+ $chat_content = this.$el.find('.chat-content');
|
|
$chat_content.append($('<div class="chat-help"><strong>/help</strong>: Show this menu</div>'));
|
|
$chat_content.append($('<div class="chat-help"><strong>/help</strong>: Show this menu</div>'));
|
|
$chat_content.append($('<div class="chat-help"><strong>/topic</strong>: Set chatroom topic</div>'));
|
|
$chat_content.append($('<div class="chat-help"><strong>/topic</strong>: Set chatroom topic</div>'));
|
|
/* TODO:
|
|
/* TODO:
|
|
@@ -893,9 +936,9 @@
|
|
xmppchat.connection.muc.join(
|
|
xmppchat.connection.muc.join(
|
|
this.model.get('jid'),
|
|
this.model.get('jid'),
|
|
this.model.get('nick'),
|
|
this.model.get('nick'),
|
|
- $.proxy(this.onMessage, this),
|
|
|
|
- $.proxy(this.onPresence, this),
|
|
|
|
- $.proxy(this.onRoster, this));
|
|
|
|
|
|
+ $.proxy(this.onChatRoomMessage, this),
|
|
|
|
+ $.proxy(this.onChatRoomPresence, this),
|
|
|
|
+ $.proxy(this.onChatRoomRoster, this));
|
|
},
|
|
},
|
|
|
|
|
|
onLeave: function () {
|
|
onLeave: function () {
|
|
@@ -905,7 +948,7 @@
|
|
}
|
|
}
|
|
},
|
|
},
|
|
|
|
|
|
- onPresence: function (presence, room) {
|
|
|
|
|
|
+ onChatRoomPresence: function (presence, room) {
|
|
var nick = room.nick,
|
|
var nick = room.nick,
|
|
from = $(presence).attr('from');
|
|
from = $(presence).attr('from');
|
|
if ($(presence).attr('type') !== 'error') {
|
|
if ($(presence).attr('type') !== 'error') {
|
|
@@ -920,11 +963,11 @@
|
|
return true;
|
|
return true;
|
|
},
|
|
},
|
|
|
|
|
|
- onMessage: function (message) {
|
|
|
|
|
|
+ onChatRoomMessage: function (message) {
|
|
var body = $(message).children('body').text(),
|
|
var body = $(message).children('body').text(),
|
|
jid = $(message).attr('from'),
|
|
jid = $(message).attr('from'),
|
|
composing = $(message).find('composing'),
|
|
composing = $(message).find('composing'),
|
|
- $chat_content = $(this.el).find('.chat-content'),
|
|
|
|
|
|
+ $chat_content = this.$el.find('.chat-content'),
|
|
sender = Strophe.unescapeNode(Strophe.getResourceFromJid(jid)),
|
|
sender = Strophe.unescapeNode(Strophe.getResourceFromJid(jid)),
|
|
subject = $(message).children('subject').text();
|
|
subject = $(message).children('subject').text();
|
|
|
|
|
|
@@ -938,7 +981,8 @@
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
if (sender === this.model.get('nick')) {
|
|
if (sender === this.model.get('nick')) {
|
|
- this.appendMessage(body);
|
|
|
|
|
|
+ // Our own message which is already appended
|
|
|
|
+ return true;
|
|
} else {
|
|
} else {
|
|
$chat_content.find('div.chat-event').remove();
|
|
$chat_content.find('div.chat-event').remove();
|
|
|
|
|
|
@@ -947,16 +991,16 @@
|
|
body = body.replace(/^\/me/, '*'+sender);
|
|
body = body.replace(/^\/me/, '*'+sender);
|
|
$chat_content.append(
|
|
$chat_content.append(
|
|
this.action_template({
|
|
this.action_template({
|
|
- 'sender': 'room',
|
|
|
|
|
|
+ 'sender': 'room',
|
|
'time': (new Date()).toLocaleTimeString().substring(0,5),
|
|
'time': (new Date()).toLocaleTimeString().substring(0,5),
|
|
- 'message': body,
|
|
|
|
|
|
+ 'message': body,
|
|
'username': sender,
|
|
'username': sender,
|
|
'extra_classes': ($(message).find('delay').length > 0) && 'delayed' || ''
|
|
'extra_classes': ($(message).find('delay').length > 0) && 'delayed' || ''
|
|
}));
|
|
}));
|
|
} else {
|
|
} else {
|
|
$chat_content.append(
|
|
$chat_content.append(
|
|
this.message_template({
|
|
this.message_template({
|
|
- 'sender': 'room',
|
|
|
|
|
|
+ 'sender': 'room',
|
|
'time': (new Date()).toLocaleTimeString().substring(0,5),
|
|
'time': (new Date()).toLocaleTimeString().substring(0,5),
|
|
'message': body,
|
|
'message': body,
|
|
'username': sender,
|
|
'username': sender,
|
|
@@ -969,7 +1013,7 @@
|
|
return true;
|
|
return true;
|
|
},
|
|
},
|
|
|
|
|
|
- onRoster: function (roster, room) {
|
|
|
|
|
|
+ onChatRoomRoster: function (roster, room) {
|
|
var controlboxview = xmppchat.chatboxesview.views.controlbox,
|
|
var controlboxview = xmppchat.chatboxesview.views.controlbox,
|
|
i;
|
|
i;
|
|
|
|
|
|
@@ -991,8 +1035,8 @@
|
|
},
|
|
},
|
|
|
|
|
|
render: function () {
|
|
render: function () {
|
|
- $(this.el).attr('id', this.model.get('box_id'));
|
|
|
|
- $(this.el).html(this.template(this.model.toJSON()));
|
|
|
|
|
|
+ this.$el.attr('id', this.model.get('box_id'));
|
|
|
|
+ this.$el.html(this.template(this.model.toJSON()));
|
|
return this;
|
|
return this;
|
|
}
|
|
}
|
|
});
|
|
});
|
|
@@ -1012,7 +1056,7 @@
|
|
}
|
|
}
|
|
_.each(open_chats, $.proxy(function (jid) {
|
|
_.each(open_chats, $.proxy(function (jid) {
|
|
if (jid != 'controlbox') {
|
|
if (jid != 'controlbox') {
|
|
- if (_.str.include(jid, xmppchat.connection.muc_domain)) {
|
|
|
|
|
|
+ if (strinclude(jid, xmppchat.connection.muc_domain)) {
|
|
this.createChatBox(jid);
|
|
this.createChatBox(jid);
|
|
} else {
|
|
} else {
|
|
this.openChat(jid);
|
|
this.openChat(jid);
|
|
@@ -1020,11 +1064,11 @@
|
|
}
|
|
}
|
|
}, this));
|
|
}, this));
|
|
},
|
|
},
|
|
-
|
|
|
|
|
|
+
|
|
isChatRoom: function (jid) {
|
|
isChatRoom: function (jid) {
|
|
return Strophe.getDomainFromJid(jid) === xmppchat.connection.muc_domain;
|
|
return Strophe.getDomainFromJid(jid) === xmppchat.connection.muc_domain;
|
|
},
|
|
},
|
|
-
|
|
|
|
|
|
+
|
|
createChatBox: function (jid, data) {
|
|
createChatBox: function (jid, data) {
|
|
var box, view;
|
|
var box, view;
|
|
if (this.isChatRoom(jid)) {
|
|
if (this.isChatRoom(jid)) {
|
|
@@ -1034,14 +1078,14 @@
|
|
});
|
|
});
|
|
} else {
|
|
} else {
|
|
box = new xmppchat.ChatBox({
|
|
box = new xmppchat.ChatBox({
|
|
- 'id': jid,
|
|
|
|
- 'jid': jid,
|
|
|
|
- 'fullname': data.fullname,
|
|
|
|
|
|
+ 'id': jid,
|
|
|
|
+ 'jid': jid,
|
|
|
|
+ 'fullname': data.fullname,
|
|
'portrait_url': data.portrait_url,
|
|
'portrait_url': data.portrait_url,
|
|
'user_profile_url': data.user_profile_url
|
|
'user_profile_url': data.user_profile_url
|
|
});
|
|
});
|
|
view = new xmppchat.ChatBoxView({
|
|
view = new xmppchat.ChatBoxView({
|
|
- model: box
|
|
|
|
|
|
+ model: box
|
|
});
|
|
});
|
|
}
|
|
}
|
|
this.views[jid] = view.render();
|
|
this.views[jid] = view.render();
|
|
@@ -1068,7 +1112,7 @@
|
|
$.getJSON(portal_url + "/xmpp-userinfo?user_id=" + Strophe.getNodeFromJid(jid), $.proxy(function (data) {
|
|
$.getJSON(portal_url + "/xmpp-userinfo?user_id=" + Strophe.getNodeFromJid(jid), $.proxy(function (data) {
|
|
view = this.createChatBox(jid, data);
|
|
view = this.createChatBox(jid, data);
|
|
}, this));
|
|
}, this));
|
|
- }
|
|
|
|
|
|
+ }
|
|
},
|
|
},
|
|
|
|
|
|
showChat: function (jid) {
|
|
showChat: function (jid) {
|
|
@@ -1081,8 +1125,8 @@
|
|
view.scrolldown();
|
|
view.scrolldown();
|
|
view.focus();
|
|
view.focus();
|
|
}
|
|
}
|
|
- view.saveChatToStorage();
|
|
|
|
}
|
|
}
|
|
|
|
+ view.saveChatToStorage();
|
|
return view;
|
|
return view;
|
|
},
|
|
},
|
|
|
|
|
|
@@ -1172,7 +1216,7 @@
|
|
'bare_jid': Strophe.getBareJidFromJid(jid),
|
|
'bare_jid': Strophe.getBareJidFromJid(jid),
|
|
'user_id': user_id,
|
|
'user_id': user_id,
|
|
'subscription': subscription,
|
|
'subscription': subscription,
|
|
- 'fullname': name,
|
|
|
|
|
|
+ 'fullname': name,
|
|
'resources': [],
|
|
'resources': [],
|
|
'presence_type': 'offline',
|
|
'presence_type': 'offline',
|
|
'status': 'offline'
|
|
'status': 'offline'
|
|
@@ -1251,15 +1295,14 @@
|
|
ask = item.get('ask'),
|
|
ask = item.get('ask'),
|
|
that = this,
|
|
that = this,
|
|
subscription = item.get('subscription');
|
|
subscription = item.get('subscription');
|
|
-
|
|
|
|
- $(this.el).addClass(item.get('presence_type'));
|
|
|
|
|
|
+ this.$el.addClass(item.get('presence_type'));
|
|
|
|
|
|
if (ask === 'subscribe') {
|
|
if (ask === 'subscribe') {
|
|
this.$el.addClass('pending-xmpp-contact');
|
|
this.$el.addClass('pending-xmpp-contact');
|
|
- $(this.el).html(this.pending_template(item.toJSON()));
|
|
|
|
|
|
+ this.$el.html(this.pending_template(item.toJSON()));
|
|
} else if (ask === 'request') {
|
|
} else if (ask === 'request') {
|
|
this.$el.addClass('requesting-xmpp-contact');
|
|
this.$el.addClass('requesting-xmpp-contact');
|
|
- $(this.el).html(this.request_template(item.toJSON()));
|
|
|
|
|
|
+ this.$el.html(this.request_template(item.toJSON()));
|
|
this.$el.delegate('button.accept-xmpp-request', 'click', function (ev) {
|
|
this.$el.delegate('button.accept-xmpp-request', 'click', function (ev) {
|
|
ev.preventDefault();
|
|
ev.preventDefault();
|
|
that.acceptRequest();
|
|
that.acceptRequest();
|
|
@@ -1277,7 +1320,7 @@
|
|
that.openChat();
|
|
that.openChat();
|
|
});
|
|
});
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
// Event handlers
|
|
// Event handlers
|
|
this.$el.delegate('a.remove-xmpp-contact','click', function (ev) {
|
|
this.$el.delegate('a.remove-xmpp-contact','click', function (ev) {
|
|
ev.preventDefault();
|
|
ev.preventDefault();
|
|
@@ -1289,7 +1332,7 @@
|
|
initialize: function () {
|
|
initialize: function () {
|
|
this.options.model.on('change', function (item, changed) {
|
|
this.options.model.on('change', function (item, changed) {
|
|
if (_.has(changed.changes, 'presence_type')) {
|
|
if (_.has(changed.changes, 'presence_type')) {
|
|
- $(this.el).attr('class', item.changed.presence_type);
|
|
|
|
|
|
+ this.$el.attr('class', item.changed.presence_type);
|
|
}
|
|
}
|
|
}, this);
|
|
}, this);
|
|
}
|
|
}
|
|
@@ -1305,7 +1348,7 @@
|
|
var presence_type = rosteritem.get('presence_type'),
|
|
var presence_type = rosteritem.get('presence_type'),
|
|
rank = 4;
|
|
rank = 4;
|
|
switch(presence_type) {
|
|
switch(presence_type) {
|
|
- case 'offline':
|
|
|
|
|
|
+ case 'offline':
|
|
rank = 0;
|
|
rank = 0;
|
|
break;
|
|
break;
|
|
case 'unavailable':
|
|
case 'unavailable':
|
|
@@ -1354,7 +1397,7 @@
|
|
model.options = options || {};
|
|
model.options = options || {};
|
|
this.add(model);
|
|
this.add(model);
|
|
},
|
|
},
|
|
-
|
|
|
|
|
|
+
|
|
addResource: function (bare_jid, resource) {
|
|
addResource: function (bare_jid, resource) {
|
|
var item = this.getItem(bare_jid),
|
|
var item = this.getItem(bare_jid),
|
|
resources;
|
|
resources;
|
|
@@ -1446,13 +1489,13 @@
|
|
if (this.isSelf(bare_jid)) {
|
|
if (this.isSelf(bare_jid)) {
|
|
if (xmppchat.connection.jid != jid) {
|
|
if (xmppchat.connection.jid != jid) {
|
|
// Another resource has changed it's status, we'll update ours as well.
|
|
// Another resource has changed it's status, we'll update ours as well.
|
|
- // FIXME: We should ideally differentiate between converse.js using
|
|
|
|
|
|
+ // FIXME: We should ideally differentiate between converse.js using
|
|
// resources and other resources (i.e Pidgin etc.)
|
|
// resources and other resources (i.e Pidgin etc.)
|
|
xmppchat.xmppstatus.set({'status': presence_type});
|
|
xmppchat.xmppstatus.set({'status': presence_type});
|
|
- }
|
|
|
|
|
|
+ }
|
|
return true;
|
|
return true;
|
|
} else if (($(presence).find('x').attr('xmlns') || '').indexOf(Strophe.NS.MUC) === 0) {
|
|
} else if (($(presence).find('x').attr('xmlns') || '').indexOf(Strophe.NS.MUC) === 0) {
|
|
- return true; // Ignore MUC
|
|
|
|
|
|
+ return true; // Ignore MUC
|
|
}
|
|
}
|
|
|
|
|
|
if ((status_message.length > 0) && (status_message.text() && (presence_type !== 'unavailable'))) {
|
|
if ((status_message.length > 0) && (status_message.text() && (presence_type !== 'unavailable'))) {
|
|
@@ -1497,10 +1540,10 @@
|
|
}
|
|
}
|
|
|
|
|
|
} else if (presence_type === 'unsubscribed') {
|
|
} else if (presence_type === 'unsubscribed') {
|
|
- /* Upon receiving the presence stanza of type "unsubscribed",
|
|
|
|
- * the user SHOULD acknowledge receipt of that subscription state
|
|
|
|
- * notification by sending a presence stanza of type "unsubscribe"
|
|
|
|
- * this step lets the user's server know that it MUST no longer
|
|
|
|
|
|
+ /* Upon receiving the presence stanza of type "unsubscribed",
|
|
|
|
+ * the user SHOULD acknowledge receipt of that subscription state
|
|
|
|
+ * notification by sending a presence stanza of type "unsubscribe"
|
|
|
|
+ * this step lets the user's server know that it MUST no longer
|
|
* send notification of the subscription state change to the user.
|
|
* send notification of the subscription state change to the user.
|
|
*/
|
|
*/
|
|
xmppchat.xmppstatus.sendPresence('unsubscribe');
|
|
xmppchat.xmppstatus.sendPresence('unsubscribe');
|
|
@@ -1508,7 +1551,7 @@
|
|
xmppchat.chatboxesview.controlbox.roster.remove(bare_jid);
|
|
xmppchat.chatboxesview.controlbox.roster.remove(bare_jid);
|
|
xmppchat.connection.roster.remove(bare_jid);
|
|
xmppchat.connection.roster.remove(bare_jid);
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
|
|
+ } else {
|
|
if ((presence_type === undefined) && (show)) {
|
|
if ((presence_type === undefined) && (show)) {
|
|
if (show.text() === 'chat') {
|
|
if (show.text() === 'chat') {
|
|
presence_type = 'online';
|
|
presence_type = 'online';
|
|
@@ -1742,7 +1785,7 @@
|
|
updateStatusUI: function (ev) {
|
|
updateStatusUI: function (ev) {
|
|
var stat = ev.get('status'),
|
|
var stat = ev.get('status'),
|
|
status_message = ev.get('status_message') || "I am " + stat;
|
|
status_message = ev.get('status_message') || "I am " + stat;
|
|
- $(this.el).find('#fancy-xmpp-status-select').html(
|
|
|
|
|
|
+ this.$el.find('#fancy-xmpp-status-select').html(
|
|
this.status_template({
|
|
this.status_template({
|
|
'presence_type': stat,
|
|
'presence_type': stat,
|
|
'status_message': status_message
|
|
'status_message': status_message
|
|
@@ -1767,20 +1810,20 @@
|
|
initialize: function () {
|
|
initialize: function () {
|
|
// Replace the default dropdown with something nicer
|
|
// Replace the default dropdown with something nicer
|
|
// -------------------------------------------------
|
|
// -------------------------------------------------
|
|
- var $select = $(this.el).find('select#select-xmpp-status'),
|
|
|
|
|
|
+ var $select = this.$el.find('select#select-xmpp-status'),
|
|
presence_type = this.model.getStatus() || 'offline',
|
|
presence_type = this.model.getStatus() || 'offline',
|
|
options = $('option', $select),
|
|
options = $('option', $select),
|
|
that = this;
|
|
that = this;
|
|
- $(this.el).html(this.choose_template());
|
|
|
|
- $(this.el).find('#fancy-xmpp-status-select')
|
|
|
|
|
|
+ this.$el.html(this.choose_template());
|
|
|
|
+ this.$el.find('#fancy-xmpp-status-select')
|
|
.html(this.status_template({
|
|
.html(this.status_template({
|
|
'status_message': "I am " + presence_type,
|
|
'status_message': "I am " + presence_type,
|
|
- 'presence_type': presence_type
|
|
|
|
|
|
+ 'presence_type': presence_type
|
|
}));
|
|
}));
|
|
// iterate through all the <option> elements and create UL
|
|
// iterate through all the <option> elements and create UL
|
|
options.each(function(){
|
|
options.each(function(){
|
|
$(that.el).find("#target dd ul").append(that.option_template({
|
|
$(that.el).find("#target dd ul").append(that.option_template({
|
|
- 'value': $(this).val(),
|
|
|
|
|
|
+ 'value': $(this).val(),
|
|
'text': $(this).text()
|
|
'text': $(this).text()
|
|
})).hide();
|
|
})).hide();
|
|
});
|
|
});
|
|
@@ -1788,7 +1831,7 @@
|
|
|
|
|
|
// Listen for status change on the model and initialize
|
|
// Listen for status change on the model and initialize
|
|
// ----------------------------------------------------
|
|
// ----------------------------------------------------
|
|
- this.options.model.on("change", $.proxy(this.updateStatusUI, this));
|
|
|
|
|
|
+ this.options.model.on("change", $.proxy(this.updateStatusUI, this));
|
|
this.model.initStatus();
|
|
this.model.initStatus();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
@@ -1796,7 +1839,8 @@
|
|
// Event handlers
|
|
// Event handlers
|
|
// --------------
|
|
// --------------
|
|
$(document).ready($.proxy(function () {
|
|
$(document).ready($.proxy(function () {
|
|
- var chatdata = jQuery('div#collective-xmpp-chat-data'),
|
|
|
|
|
|
+ var chatdata = $('div#collective-xmpp-chat-data'),
|
|
|
|
+ $connecting = $('span#connecting-to-chat'),
|
|
$toggle = $('a#toggle-online-users');
|
|
$toggle = $('a#toggle-online-users');
|
|
$toggle.unbind('click');
|
|
$toggle.unbind('click');
|
|
|
|
|
|
@@ -1809,6 +1853,8 @@
|
|
}).render();
|
|
}).render();
|
|
|
|
|
|
$(document).bind('jarnxmpp.disconnected', $.proxy(function (ev, conn) {
|
|
$(document).bind('jarnxmpp.disconnected', $.proxy(function (ev, conn) {
|
|
|
|
+ $connecting.show();
|
|
|
|
+ $toggle.hide();
|
|
console.log("Connection Failed :(");
|
|
console.log("Connection Failed :(");
|
|
}, this));
|
|
}, this));
|
|
|
|
|
|
@@ -1825,13 +1871,12 @@
|
|
this.chatboxes = new this.ChatBoxes();
|
|
this.chatboxes = new this.ChatBoxes();
|
|
this.chatboxesview = new this.ChatBoxesView({'model': this.chatboxes});
|
|
this.chatboxesview = new this.ChatBoxesView({'model': this.chatboxes});
|
|
|
|
|
|
-
|
|
|
|
this.connection.addHandler(
|
|
this.connection.addHandler(
|
|
- $.proxy(this.roster.subscribeToSuggestedItems, this.roster),
|
|
|
|
|
|
+ $.proxy(this.roster.subscribeToSuggestedItems, this.roster),
|
|
'http://jabber.org/protocol/rosterx', 'message', null);
|
|
'http://jabber.org/protocol/rosterx', 'message', null);
|
|
|
|
|
|
this.connection.roster.registerCallback(
|
|
this.connection.roster.registerCallback(
|
|
- $.proxy(this.roster.rosterHandler, this.roster),
|
|
|
|
|
|
+ $.proxy(this.roster.rosterHandler, this.roster),
|
|
null, 'presence', null);
|
|
null, 'presence', null);
|
|
|
|
|
|
this.connection.roster.get($.proxy(function () {
|
|
this.connection.roster.get($.proxy(function () {
|
|
@@ -1842,12 +1887,12 @@
|
|
}, this.roster), null, 'presence', null);
|
|
}, this.roster), null, 'presence', null);
|
|
|
|
|
|
this.connection.addHandler(
|
|
this.connection.addHandler(
|
|
- $.proxy(function (message) {
|
|
|
|
|
|
+ $.proxy(function (message) {
|
|
this.chatboxesview.messageReceived(message);
|
|
this.chatboxesview.messageReceived(message);
|
|
return true;
|
|
return true;
|
|
}, this), null, 'message', 'chat');
|
|
}, this), null, 'message', 'chat');
|
|
|
|
|
|
- // XMPP Status
|
|
|
|
|
|
+ // XMPP Status
|
|
this.xmppstatus = new this.XMPPStatus();
|
|
this.xmppstatus = new this.XMPPStatus();
|
|
this.xmppstatusview = new this.XMPPStatusView({
|
|
this.xmppstatusview = new this.XMPPStatusView({
|
|
'model': this.xmppstatus
|
|
'model': this.xmppstatus
|
|
@@ -1856,6 +1901,8 @@
|
|
|
|
|
|
// Controlbox toggler
|
|
// Controlbox toggler
|
|
if ($toggle.length) {
|
|
if ($toggle.length) {
|
|
|
|
+ $connecting.hide();
|
|
|
|
+ $toggle.show();
|
|
$toggle.bind('click', $.proxy(function (e) {
|
|
$toggle.bind('click', $.proxy(function (e) {
|
|
e.preventDefault();
|
|
e.preventDefault();
|
|
if ($("div#controlbox").is(':visible')) {
|
|
if ($("div#controlbox").is(':visible')) {
|