Commit 083f76b7 authored by ichim-david's avatar ichim-david

Fixed merge conflicts for converse.js

parents 32ebfe53 ffbacad9
......@@ -2,7 +2,7 @@
$msg:false, Strophe:false, setTimeout:false, navigator:false, jarn:false, google:false, jarnxmpp:false, jQuery:false, sessionStorage:false, $iq:false, $pres:false, Image:false, */
(function (jarnxmpp, $, portal_url) {
portal_url = portal_url || '';
jarnxmpp.Storage = {
......@@ -230,9 +230,9 @@ $msg:false, Strophe:false, setTimeout:false, navigator:false, jarn:false, google
data = {};
}
$.ajax({
'url':portal_url + '/@@xmpp-loader',
'url':portal_url + '/@@xmpp-loader',
'dataType': 'json',
'data': data,
'data': data,
'success': function (data) {
if (!(('rid' in data) && ('sid' in data) && ('BOSH_SERVICE' in data))) {
return;
......
......@@ -3,44 +3,53 @@
}
#chatpanel {
z-index: 4; /*--Keeps the panel on top of all other elements--*/
position: fixed;
bottom: 0; right: 0;
z-index: 4; /*--Keeps the panel on top of all other elements--*/
position: fixed;
bottom: 0; right: 0;
height: 332px;
width: auto;
}
#toggle-controlbox {
position: fixed;
position: fixed;
font-size: 80%;
bottom: 0;
bottom: 0;
right: 0;
border-top-right-radius: 4px;
border-top-left-radius: 4px;
background: #e3e2e2;
border: 1px solid #c3c3c3;
border-bottom: none;
background: #e3e2e2;
border: 1px solid #c3c3c3;
border-bottom: none;
padding: 0.25em 0.5em;
margin-right: 1em;
height: 1.1em;
}
#toggle-online-users {
display: none;
}
#connecting-to-chat {
background: url('/spinner.gif') no-repeat;
padding-left: 1.4em;
}
.chat-head {
color: #ffffff;
color: #ffffff;
margin: 0;
font-size: 100%;
font-size: 100%;
border-top-right-radius: 4px;
border-top-left-radius: 4px;
padding: 3px 0 3px 7px;
padding: 3px 0 3px 7px;
}
.chat-head-chatbox {
background-color: rgb(89, 106, 114);
background-color: rgba(89, 106, 114, 1);
background-color: rgb(89, 106, 114);
background-color: rgba(89, 106, 114, 1);
}
.chat-head-chatroom {
background-color: #2D617A;
background-color: #2D617A;
}
.chatroom .chat-area {
......@@ -60,15 +69,15 @@
height: 272px;
background-color: white;
overflow: auto;
border-right: 1px solid #999;
border-bottom: 1px solid #999;
border-right: 1px solid #999;
border-bottom: 1px solid #999;
border-bottom-right-radius: 4px;
}
.participants ul.participant-list li {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: block;
font-size: 12px;
padding: 0.5em 0 0 0.5em;
......@@ -89,58 +98,58 @@ input.new-chatroom-name {
}
.chat-blink {
background-color: #176689;
border-right:1px solid #176689;
border-left:1px solid #176689;
background-color: #176689;
border-right:1px solid #176689;
border-left:1px solid #176689;
}
.chat-content {
padding: 0.3em;
font-size: 13px;
color: #333333;
height:193px;
overflow-y:auto;
border:1px solid #999;
font-size: 13px;
color: #333333;
height:193px;
overflow-y:auto;
border:1px solid #999;
border-bottom: 0;
border-top: 0;
background-color: #ffffff;
line-height: 1.3em;
background-color: #ffffff;
line-height: 1.3em;
}
.chat-textarea {
border: 0;
border: 0;
height: 50px;
width: 100%;
}
.chat-textarea-chatbox-selected {
border: 1px solid #578308;
margin:0;
border: 1px solid #578308;
margin:0;
}
.chat-textarea-chatroom-selected {
border: 2px solid #2D617A;
margin:0;
border: 2px solid #2D617A;
margin:0;
}
.chat-info {
color:#666666;
color:#666666;
}
.chat-message-me {
font-weight: bold;
font-weight: bold;
color: #436976;
}
.chat-message-room {
font-weight: bold;
font-weight: bold;
color: #4B7003;
white-space: nowrap;
}
.chat-message-them {
font-weight: bold;
font-weight: bold;
color: #F62817;
white-space: nowrap;
}
......@@ -149,7 +158,7 @@ input.new-chatroom-name {
color: #808080;
}
div#settings,
div#settings,
div#chatrooms {
height: 279px;
}
......@@ -160,11 +169,11 @@ p.not-implemented {
color: #808080;
}
div.delayed .chat-message-them {
div.delayed .chat-message-them {
color: #FB5D50;
}
div.delayed .chat-message-me {
div.delayed .chat-message-me {
color: #7EABBB;
}
......@@ -175,30 +184,30 @@ div.delayed .chat-message-me {
}
.chat-head .avatar {
height: 35px;
float: left;
margin-right: 6px;
height: 35px;
float: left;
margin-right: 6px;
}
div.chat-title {
height: 1.1em;
color: white;
font-weight: bold;
line-height: 15px;
display: block;
font-weight: bold;
line-height: 15px;
display: block;
margin-top: 2px;
margin-right: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-shadow: rgba(0,0,0,0.51) 0 -1px 0;
margin-right: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-shadow: rgba(0,0,0,0.51) 0 -1px 0;
}
.chat-head-chatbox,
.chat-head-chatroom {
background: linear-gradient(top, rgba(206,220,231,1) 0%,rgba(89,106,114,1) 100%);
height: 33px;
position: relative;
height: 33px;
position: relative;
}
p.user-custom-message,
......@@ -207,9 +216,9 @@ p.chatroom-topic {
font-style: italic;
height: 1.3em;
clear: right;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.activated{
......@@ -224,7 +233,7 @@ a.subscribe-to-user {
div.add-xmpp-contact {
display: block;
border:1px solid #ddd;
border:1px solid #ddd;
padding: 3px 3px 3px 3px;
margin: 0 0.5em;
clear: both;
......@@ -233,12 +242,12 @@ div.add-xmpp-contact {
}
div.add-xmpp-contact a.add-xmpp-contact {
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
padding-left: 1.5em;
}
#fancy-xmpp-status-select a.change-xmpp-status-message {
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
background: url('/pencil_icon.png') no-repeat right top;
float: right;
clear: right;
......@@ -247,13 +256,13 @@ div.add-xmpp-contact a.add-xmpp-contact {
}
#fancy-xmpp-status-select a.choose-xmpp-status {
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
padding-left: 1.5em;
width: 140px;
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
float: left;
}
......@@ -272,13 +281,13 @@ form.search-xmpp-contact input {
.oc-chat-head {
margin: 0;
color: #FFF;
color: #FFF;
border-top-right-radius: 4px;
border-top-left-radius: 4px;
height: 35px;
clear: right;
background-color: #5390C8;
padding: 3px 0 0 0;
padding: 3px 0 0 0;
}
.close-chatbox-button {
......@@ -334,24 +343,24 @@ form.search-xmpp-contact input {
#xmppchat-roster dd.current-xmpp-contact,
#xmppchat-roster dd.current-xmpp-contact:hover {
background: url(images/user_online_panel.png) no-repeat 5px 2px;
background: url(images/user_online_panel.png) no-repeat 5px 2px;
}
#xmppchat-roster dd.current-xmpp-contact.offline:hover,
#xmppchat-roster dd.current-xmpp-contact.unavailable:hover,
#xmppchat-roster dd.current-xmpp-contact.offline,
#xmppchat-roster dd.current-xmpp-contact.unavailable {
background: url(images/user_offline_panel.png) no-repeat 5px 2px;
background: url(images/user_offline_panel.png) no-repeat 5px 2px;
}
#xmppchat-roster dd.current-xmpp-contact.busy,
#xmppchat-roster dd.current-xmpp-contact.busy:hover {
background: url(images/user_busy_panel.png) no-repeat 5px 2px;
background: url(images/user_busy_panel.png) no-repeat 5px 2px;
}
#xmppchat-roster dd.current-xmpp-contact.away,
#xmppchat-roster dd.current-xmpp-contact.away:hover {
background: url(images/user_away_panel.png) no-repeat 5px 2px;
background: url(images/user_away_panel.png) no-repeat 5px 2px;
}
#xmppchat-roster dd.requesting-xmpp-contact button{
......@@ -360,7 +369,7 @@ form.search-xmpp-contact input {
#xmppchat-roster dd a {
margin-left: 2em;
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
}
.remove-xmpp-contact-dialog .ui-dialog-buttonpane {
......@@ -386,7 +395,7 @@ form.search-xmpp-contact input {
color: #666;
border: none;
padding: 0.3em 0.5em 0.3em 0.5em;
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
}
#available-chatrooms dt {
......@@ -404,8 +413,8 @@ dd.available-chatroom,
border: none;
display: block;
padding: 0 0.5em 0 0.5em;
color: #3f3f3f;
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
color: #3f3f3f;
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
}
#xmppchat-roster dd a.remove-xmpp-contact {
......@@ -417,8 +426,8 @@ dd.available-chatroom,
.chatbox,
.chatroom {
box-shadow: 1px 1px 5px 1px rgba(0,0,0,0.4);
display:none;
box-shadow: 1px 1px 5px 1px rgba(0,0,0,0.4);
display:none;
float: right;
margin-right: 15px;
z-index: 3; /* So that it's higher than the content actions */
......@@ -426,16 +435,16 @@ dd.available-chatroom,
}
.chatbox {
width: 200px;
width: 200px;
}
.chatroom {
width: 300px;
width: 300px;
height: 311px;
}
.oc-chat-content {
height:272px;
height:272px;
width: 199px;
padding: 0;
}
......@@ -456,12 +465,12 @@ dd.available-chatroom,
}
div#controlbox-panes {
background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(240,240,240,1) 100%); /* FF3.6+ */
background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(240,240,240,1) 100%); /* IE10+ */
background: -o-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(240,240,240,1) 100%); /* Opera 11.10+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(240,240,240,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(240,240,240,1) 100%); /* Chrome10+,Safari5.1+ */
background: linear-gradient(top, rgba(255,255,255,1) 0%,rgba(240,240,240,1) 100%); /* W3C */
background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(240,240,240,1) 100%); /* FF3.6+ */
background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(240,240,240,1) 100%); /* IE10+ */
background: -o-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(240,240,240,1) 100%); /* Opera 11.10+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(240,240,240,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(240,240,240,1) 100%); /* Chrome10+,Safari5.1+ */
background: linear-gradient(top, rgba(255,255,255,1) 0%,rgba(240,240,240,1) 100%); /* W3C */
background-color: white;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
......@@ -482,18 +491,18 @@ select#select-xmpp-status {
/* @group Tabs */
.chat-head #controlbox-tabs {
text-align: center;
display: inline;
overflow: hidden;
font-size: 12px;
list-style-type: none;
text-align: center;
display: inline;
overflow: hidden;
font-size: 12px;
list-style-type: none;
}
/* single tab */
.chat-head #controlbox-tabs li {
width: 40%;
width: 40%;
float:left;
text-shadow: white 0 1px 0;
text-shadow: white 0 1px 0;
}
ul#controlbox-tabs li a {
......@@ -509,27 +518,27 @@ ul#controlbox-tabs li a {
border-top-left-radius: 4px;
color:#666;
background-color:#EEE;
background: -moz-linear-gradient(top, rgba(245,245,245,1) 0%, rgba(255,255,255,1) 100%); /* FF3.6+ */
background: -ms-linear-gradient(top, rgba(245,245,245,1) 0%, rgba(255,255,255,1) 100%); /* IE10+ */
background: -o-linear-gradient(top, rgba(245,245,245,1) 0%, rgba(255,255,255,1) 100%); /* Opera 11.10+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(245,245,245,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(245,245,245,1) 0%, rgba(255,255,255,1) 100%); /* Chrome10+,Safari5.1+ */
background: linear-gradient(top, rgba(245,245,245,1) 0%, rgba(255,255,255,1) 100%); /* W3C */
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
background: -moz-linear-gradient(top, rgba(245,245,245,1) 0%, rgba(255,255,255,1) 100%); /* FF3.6+ */
background: -ms-linear-gradient(top, rgba(245,245,245,1) 0%, rgba(255,255,255,1) 100%); /* IE10+ */
background: -o-linear-gradient(top, rgba(245,245,245,1) 0%, rgba(255,255,255,1) 100%); /* Opera 11.10+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(245,245,245,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(245,245,245,1) 0%, rgba(255,255,255,1) 100%); /* Chrome10+,Safari5.1+ */
background: linear-gradient(top, rgba(245,245,245,1) 0%, rgba(255,255,255,1) 100%); /* W3C */
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
}
.chat-head #controlbox-tabs li a:hover {
color: black;
color: black;
}
.chat-head #controlbox-tabs li a {
background-color: rgba(240,240,240,1);
box-shadow: inset 0 0 8px rgba(0,0,0,0.2);
background-color: rgba(240,240,240,1);
box-shadow: inset 0 0 8px rgba(0,0,0,0.2);
}
ul#controlbox-tabs a.current, ul#controlbox-tabs a.current:hover {
box-shadow: none;
color: #000;
box-shadow: none;
color: #000;
border-bottom: 0;
height: 35px;
}
......@@ -566,7 +575,7 @@ form.sendXMPPMessage {
padding: 1px 2px 1px 1px;
}
/* status dropdown styles */
/* status dropdown styles */
dl.dropdown {
margin-right: 0.5em;
}
......@@ -582,7 +591,7 @@ input.custom-xmpp-status {
}
#fancy-xmpp-status-select {
border:1px solid #ddd;
border:1px solid #ddd;
height: 22px;
}
......@@ -590,43 +599,43 @@ input.custom-xmpp-status {
cursor:pointer; display:block; padding:5px;
}
.dropdown dd ul {
list-style:none;
padding:5px 0;
position:absolute; left:0; top:0;
border:1px solid #ddd;
.dropdown dd ul {
list-style:none;
padding:5px 0;
position:absolute; left:0; top:0;
border:1px solid #ddd;
border-top: 0;
width: 99%;
background-color: #FFF;
z-index: 4;
}
.dropdown dd ul li a:hover {
.dropdown dd ul li a:hover {
background-color: #bed6e5;
}
.dropdown span.value {
.dropdown span.value {
display:none;
}
.dropdown dd ul li a {
padding:5px 5px 5px 30px;
.dropdown dd ul li a {
padding:5px 5px 5px 30px;
display:block;
}
.dropdown a.online {
background: url(images/user_online_panel.png) no-repeat left;
.dropdown a.online {
background: url(images/user_online_panel.png) no-repeat left;
}
.dropdown a.offline {
background: url(images/user_offline_panel.png) no-repeat left;
.dropdown a.offline {
background: url(images/user_offline_panel.png) no-repeat left;
}
.dropdown a.busy {
background: url(images/user_busy_panel.png) no-repeat left;
.dropdown a.busy {
background: url(images/user_busy_panel.png) no-repeat left;
}
.dropdown a.away {
background: url(images/user_away_panel.png) no-repeat left;
.dropdown a.away {
background: url(images/user_away_panel.png) no-repeat left;
}
......@@ -14,7 +14,7 @@
if (console===undefined || console.log===undefined) {
console = { log: function () {}, error: function () {} };
}
if (typeof define === 'function' && define.amd) {
if (typeof define === 'function' && define.amd) {
require.config({
// paths: {
// "patterns": "Libraries/Patterns"
......@@ -25,7 +25,7 @@
//These script dependencies should be loaded before loading
//backbone.js
deps: [
'Libraries/underscore',
'Libraries/underscore',
'jquery'],
//Once loaded, use the global 'Backbone' as the
//module value.
......@@ -44,7 +44,6 @@
define([
"Libraries/burry.js/burry",
"Libraries/underscore.string",
"Libraries/jquery.tinysort",
"Libraries/jquery-ui-1.9.1.custom",
"Libraries/sjcl",
......@@ -63,7 +62,7 @@
return factory(jQuery, store, _, console);
}
);
} else {
} else {
// Browser globals
var store = new Burry.Store('collective.xmpp.chat');
_.templateSettings = {
......@@ -85,15 +84,38 @@
pad = function (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 () {
this.msg_counter += 1;
if (this.msg_counter > 0) {
......@@ -110,7 +132,7 @@
};
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
* Jabber servers.
*/
......@@ -128,17 +150,17 @@
.c('max')
.t('1');
xmppchat.connection.sendIQ(iq,
xmppchat.connection.sendIQ(iq,
callback,
function () {
console.log('Error while retrieving collections');
function () {
console.log('Error while retrieving collections');
});
};
xmppchat.collections.getLastMessages = function (jid, callback) {
var that = this;
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'),
jid = $collection.attr('with'),
start = $collection.attr('start'),
......@@ -197,7 +219,7 @@
getOpenChats: function () {
var key = hex_sha1(this.get('own_jid')+'-open-chats'),
chats = store.get(key) || [],
chats = store.get(key) || [],
decrypted_chats = [],
i;
......@@ -234,7 +256,7 @@
store.flush();
}
});
xmppchat.ChatBox = Backbone.Model.extend({
initialize: function () {
this.set({
......@@ -258,15 +280,15 @@
},
message_template: _.template(
'<div class="chat-message {{extra_classes}}">' +
'<span class="chat-message-{{sender}}">{{time}} {{username}}:&nbsp;</span>' +
'<span class="chat-message-content">{{message}}</span>' +
'<div class="chat-message {{extra_classes}}">' +
'<span class="chat-message-{{sender}}">{{time}} {{username}}:&nbsp;</span>' +
'<span class="chat-message-content">{{message}}</span>' +
'</div>'),
action_template: _.template(
'<div class="chat-message {{extra_classes}}">' +
'<span class="chat-message-{{sender}}">{{time}}:&nbsp;</span>' +
'<span class="chat-message-content">{{message}}</span>' +
'<div class="chat-message {{extra_classes}}">' +
'<span class="chat-message-{{sender}}">{{time}}:&nbsp;</span>' +
'<span class="chat-message-content">{{message}}</span>' +
'</div>'),
autoLink: function (text) {
......@@ -279,7 +301,7 @@
var now = new Date(),
time = now.toLocaleTimeString().substring(0,5),
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'));
if (typeof msg !== 'undefined') {
......@@ -293,9 +315,9 @@
if (minutes.length==1) {minutes = '0'+minutes;}
$chat_content.find('div.chat-event').remove();
$chat_content.append(this.message_template({
'sender': 'me',
'time': time,
'message': message,
'sender': 'me',
'time': time,
'message': message,
'username': 'me',
'extra_classes': ''
}));
......@@ -310,14 +332,14 @@
},
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()),
from = Strophe.getBareJidFromJid($message.attr('from')),
to = $message.attr('to'),
composing = $message.find('composing'),
$chat_content = $(this.el).find('.chat-content'),
$chat_content = this.$el.find('.chat-content'),
delayed = $message.find('delay').length > 0,
fullname = this.model.get('fullname'),
time, stamp, username, sender;
......@@ -347,13 +369,13 @@
// XXX: Test properly (for really old messages we somehow need to show
// their date as well)
stamp = $message.find('delay').attr('stamp');
time = (new Date(stamp)).toLocaleTimeString().substring(0,5);
time = (new Date(stamp)).toLocaleTimeString().substring(0,5);
} else {
time = (new Date()).toLocaleTimeString().substring(0,5);
time = (new Date()).toLocaleTimeString().substring(0,5);
}
$chat_content.append(
this.message_template({
'sender': sender,
'sender': sender,
'time': time,
'message': body,
'username': username,
......@@ -370,11 +392,11 @@
insertClientStoredMessages: function () {
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++) {
var msg = msgs[i],
var msg = msgs[i],
msg_array = msg.split(' ', 2),
date = msg_array[0];
......@@ -395,16 +417,16 @@
if (msg_array[1] == 'to') {
$content.append(
this.message_template({
'sender': 'me',
'sender': 'me',
'time': this_date.toLocaleTimeString().substring(0,5),
'message': msg,
'message': msg,
'username': 'me',
'extra_classes': 'delayed'
}));
} else {
$content.append(
this.message_template({
'sender': 'them',
'sender': 'them',
'time': this_date.toLocaleTimeString().substring(0,5),
'message': msg,
'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) {
// 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
// we send to the bare jid.
var timestamp = (new Date()).getTime(),
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[1] === "clear") {
$(this.el).find('.chat-content').empty();
this.$el.find('.chat-content').empty();
xmppchat.storage.clearMessages(bare_jid);
return;
}
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;
}
}
......@@ -467,14 +499,19 @@
if (message !== '') {
this.sendMessage(message);
}
$(this.el).data('composing', false);
this.$el.data('composing', false);
} 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>' +
'<p class="user-custom-message"><p/>' +
'</div>' +
'<div class="chat-content"></div>' +
'<div class="chat-content"></div>' +
'<form class="sendXMPPMessage" action="" method="post">' +
'<textarea ' +
'type="text" ' +
......@@ -536,18 +573,18 @@
'</form>'),
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();
return this;
},
isVisible: function () {
return $(this.el).is(':visible');
return this.$el.is(':visible');
},
focus: function () {
$(this.el).find('.chat-textarea').focus();
this.$el.find('.chat-textarea').focus();
return this;
},
......@@ -614,7 +651,7 @@
$.getJSON(portal_url + "/search-users?q=" + $(ev.target).find('input.username').val(), function (data) {
var $results_el = $('#found-users');
$(data).each(function (idx, obj) {
if ($results_el.children().length > 0) {
if ($results_el.children().length > 0) {
$results_el.empty();
}
$results_el.append(
......@@ -683,7 +720,7 @@
updateRoomsList: function () {
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');
this.$el.find('#available-chatrooms').find('dd.available-chatroom').remove();
if (rooms.length) {
......@@ -706,7 +743,7 @@
if (ev.type === 'click') {
jid = $(ev.target).attr('data-room-jid');
} 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) {
jid = Strophe.escapeNode(name) + '@' + xmppchat.connection.muc_domain;
} else {
......@@ -761,7 +798,7 @@
$tab_panel = $($tab.attr('href')),
$sibling_panel = $($sibling.attr('href'));
$sibling_panel.fadeOut('fast', function () {
$sibling_panel.fadeOut('fast', function () {
$sibling.removeClass('current');
$tab.addClass('current');
$tab_panel.fadeIn('fast', function () {
......@@ -769,6 +806,11 @@
});
},
addHelpMessages: function (msgs) {
// Override addHelpMessages in ChatBoxView, for now do nothing.
return;
},
render: function () {
var that = this;
this.$el.hide('fast', function () {
......@@ -803,8 +845,8 @@
closeChatRoom: function () {
this.closeChat();
xmppchat.connection.muc.leave(
this.model.get('jid'),
this.model.get('nick'),
this.model.get('jid'),
this.model.get('nick'),
this.onLeave,
undefined);
delete xmppchat.chatboxesview.views[this.model.get('jid')];
......@@ -824,12 +866,13 @@
message = message.replace(/^\s+|\s+jQuery/g,"");
$textarea.val('').focus();
if (message !== '') {
this.sendGroupMessage(message);
this.sendChatRoomMessage(message);
}
}
}
},
sendGroupMessage: function (body) {
sendChatRoomMessage: function (body) {
this.appendMessage(body);
var match = body.replace(/^\s*/, "").match(/^\/(.*?)(?: (.*))?$/) || [false];
switch (match[1]) {
case 'msg':
......@@ -851,7 +894,7 @@
xmppchat.connection.muc.deop(this.model.get('jid'), match[2]);
break;
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>/topic</strong>: Set chatroom topic</div>'));
/* TODO:
......@@ -893,9 +936,9 @@
xmppchat.connection.muc.join(
this.model.get('jid'),
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 () {
......@@ -905,7 +948,7 @@
}
},
onPresence: function (presence, room) {
onChatRoomPresence: function (presence, room) {
var nick = room.nick,
from = $(presence).attr('from');
if ($(presence).attr('type') !== 'error') {
......@@ -920,11 +963,11 @@
return true;
},
onMessage: function (message) {
onChatRoomMessage: function (message) {
var body = $(message).children('body').text(),
jid = $(message).attr('from'),
composing = $(message).find('composing'),
$chat_content = $(this.el).find('.chat-content'),
$chat_content = this.$el.find('.chat-content'),
sender = Strophe.unescapeNode(Strophe.getResourceFromJid(jid)),
subject = $(message).children('subject').text();
......@@ -938,7 +981,8 @@
}
} else {
if (sender === this.model.get('nick')) {
this.appendMessage(body);
// Our own message which is already appended
return true;
} else {
$chat_content.find('div.chat-event').remove();
......@@ -947,16 +991,16 @@
body = body.replace(/^\/me/, '*'+sender);
$chat_content.append(
this.action_template({
'sender': 'room',
'sender': 'room',
'time': (new Date()).toLocaleTimeString().substring(0,5),
'message': body,
'message': body,
'username': sender,
'extra_classes': ($(message).find('delay').length > 0) && 'delayed' || ''
}));
} else {
$chat_content.append(
this.message_template({
'sender': 'room',
'sender': 'room',
'time': (new Date()).toLocaleTimeString().substring(0,5),
'message': body,
'username': sender,
......@@ -969,7 +1013,7 @@
return true;
},
onRoster: function (roster, room) {
onChatRoomRoster: function (roster, room) {
var controlboxview = xmppchat.chatboxesview.views.controlbox,
i;
......@@ -991,8 +1035,8 @@
},
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;
}
});
......@@ -1012,7 +1056,7 @@
}
_.each(open_chats, $.proxy(function (jid) {
if (jid != 'controlbox') {
if (_.str.include(jid, xmppchat.connection.muc_domain)) {
if (strinclude(jid, xmppchat.connection.muc_domain)) {
this.createChatBox(jid);
} else {
this.openChat(jid);
......@@ -1020,11 +1064,11 @@
}
}, this));
},
isChatRoom: function (jid) {
return Strophe.getDomainFromJid(jid) === xmppchat.connection.muc_domain;
},
createChatBox: function (jid, data) {
var box, view;
if (this.isChatRoom(jid)) {
......@@ -1034,14 +1078,14 @@
});
} else {
box = new xmppchat.ChatBox({
'id': jid,
'jid': jid,
'fullname': data.fullname,
'id': jid,
'jid': jid,
'fullname': data.fullname,
'portrait_url': data.portrait_url,
'user_profile_url': data.user_profile_url
});
view = new xmppchat.ChatBoxView({
model: box
model: box
});
}
this.views[jid] = view.render();
......@@ -1068,7 +1112,7 @@
$.getJSON(portal_url + "/xmpp-userinfo?user_id=" + Strophe.getNodeFromJid(jid), $.proxy(function (data) {
view = this.createChatBox(jid, data);
}, this));
}
}
},
showChat: function (jid) {
......@@ -1081,8 +1125,8 @@
view.scrolldown();
view.focus();
}
view.saveChatToStorage();
}
view.saveChatToStorage();
return view;
},
......@@ -1172,7 +1216,7 @@
'bare_jid': Strophe.getBareJidFromJid(jid),
'user_id': user_id,
'subscription': subscription,
'fullname': name,
'fullname': name,
'resources': [],
'presence_type': 'offline',
'status': 'offline'
......@@ -1251,15 +1295,14 @@
ask = item.get('ask'),
that = this,
subscription = item.get('subscription');
$(this.el).addClass(item.get('presence_type'));
this.$el.addClass(item.get('presence_type'));
if (ask === 'subscribe') {
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') {
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) {
ev.preventDefault();
that.acceptRequest();
......@@ -1277,7 +1320,7 @@
that.openChat();
});
}
// Event handlers
this.$el.delegate('a.remove-xmpp-contact','click', function (ev) {
ev.preventDefault();
......@@ -1289,7 +1332,7 @@
initialize: function () {
this.options.model.on('change', function (item, changed) {
if (_.has(changed.changes, 'presence_type')) {
$(this.el).attr('class', item.changed.presence_type);
this.$el.attr('class', item.changed.presence_type);
}
}, this);
}
......@@ -1305,7 +1348,7 @@
var presence_type = rosteritem.get('presence_type'),
rank = 4;
switch(presence_type) {
case 'offline':
case 'offline':
rank = 0;
break;
case 'unavailable':
......@@ -1354,7 +1397,7 @@
model.options = options || {};
this.add(model);
},
addResource: function (bare_jid, resource) {
var item = this.getItem(bare_jid),
resources;
......@@ -1446,13 +1489,13 @@
if (this.isSelf(bare_jid)) {
if (xmppchat.connection.jid != jid) {
// 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.)
xmppchat.xmppstatus.set({'status': presence_type});
}
}
return true;
} 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'))) {
......@@ -1497,10 +1540,10 @@
}
} 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.
*/
xmppchat.xmppstatus.sendPresence('unsubscribe');
......@@ -1508,7 +1551,7 @@
xmppchat.chatboxesview.controlbox.roster.remove(bare_jid);
xmppchat.connection.roster.remove(bare_jid);
}
} else {
} else {
if ((presence_type === undefined) && (show)) {
if (show.text() === 'chat') {
presence_type = 'online';
......@@ -1742,7 +1785,7 @@
updateStatusUI: function (ev) {
var stat = ev.get('status'),
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({
'presence_type': stat,
'status_message': status_message
......@@ -1767,20 +1810,20 @@
initialize: function () {
// 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',
options = $('option', $select),
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({
'status_message': "I am " + presence_type,
'presence_type': presence_type
'presence_type': presence_type
}));
// iterate through all the <option> elements and create UL
options.each(function(){
$(that.el).find("#target dd ul").append(that.option_template({
'value': $(this).val(),
'value': $(this).val(),
'text': $(this).text()
})).hide();
});
......@@ -1788,7 +1831,7 @@
// 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();
}
});
......@@ -1796,7 +1839,8 @@
// Event handlers
// --------------
$(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.unbind('click');
......@@ -1809,6 +1853,8 @@
}).render();
$(document).bind('jarnxmpp.disconnected', $.proxy(function (ev, conn) {
$connecting.show();
$toggle.hide();
console.log("Connection Failed :(");
}, this));
......@@ -1825,13 +1871,12 @@
this.chatboxes = new this.ChatBoxes();
this.chatboxesview = new this.ChatBoxesView({'model': this.chatboxes});
this.connection.addHandler(
$.proxy(this.roster.subscribeToSuggestedItems, this.roster),
$.proxy(this.roster.subscribeToSuggestedItems, this.roster),
'http://jabber.org/protocol/rosterx', 'message', null);
this.connection.roster.registerCallback(
$.proxy(this.roster.rosterHandler, this.roster),
$.proxy(this.roster.rosterHandler, this.roster),
null, 'presence', null);
this.connection.roster.get($.proxy(function () {
......@@ -1842,12 +1887,12 @@
}, this.roster), null, 'presence', null);
this.connection.addHandler(
$.proxy(function (message) {
$.proxy(function (message) {
this.chatboxesview.messageReceived(message);
return true;
}, this), null, 'message', 'chat');
// XMPP Status
// XMPP Status
this.xmppstatus = new this.XMPPStatus();
this.xmppstatusview = new this.XMPPStatusView({
'model': this.xmppstatus
......@@ -1856,6 +1901,8 @@
// Controlbox toggler
if ($toggle.length) {
$connecting.hide();
$toggle.show();
$toggle.bind('click', $.proxy(function (e) {
e.preventDefault();
if ($("div#controlbox").is(':visible')) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment