diff --git a/chat.js b/chat.js index 46e749c24..416a558f7 100644 --- a/chat.js +++ b/chat.js @@ -49,55 +49,6 @@ var xmppchat = (function (jarnxmpp, $, console) { callback(msgs); }; - ob.Messages.sendMessage = function (jid, text, callback) { - // 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. - // FIXME: see if @@content-transform is required - var message, - that = this; - $.getJSON(portal_url + '/content-transform?', {text: text}, function (data) { - message = $msg({to: jid, type: 'chat'}) - .c('body').t(data.text).up() - .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}); - xmppchat.connection.send(message); - that.ClientStorage.addMessage(jid, data.text, 'to'); - callback(); - }); - }; - - ob.Messages.messageReceived = function (message) { - var jid = $(message).attr('from'), - bare_jid = Strophe.getBareJidFromJid(jid), - resource = Strophe.getResourceFromJid(jid), - delayed = $(message).find('delay').length > 0, - body = $(message).children('body').text(), - event = jQuery.Event('jarnxmpp.message'); - - if (body !== "") { - var xhtml_body = $(message).find('html > body').contents(); - if (xhtml_body.length > 0) { - event.mtype = 'xhtml'; - event.body = xhtml_body.html(); - } else { - event.body = body; - event.mtype = 'text'; - } - } - event.from = jid; - event.delayed = delayed; - event.message = message; - ob.ChatPartners.add(bare_jid, resource); - if (event.body) { - ob.Messages.ClientStorage.addMessage(jid, event.body, 'from'); - } - if ((xmppchat.Storage.get(xmppchat.username+'-xmpp-status') || 'online') !== 'offline') { - // Only trigger the UI event if the user is not offline. - $(document).trigger(event); - } - return true; - }; - ob.Collections.getLastCollection = function (jid, callback) { var bare_jid = Strophe.getBareJidFromJid(jid), iq = $iq({'type':'get'}) @@ -195,7 +146,118 @@ xmppchat.ChatBoxView = Backbone.View.extend({ className: 'chatbox', events: { - 'click .close-chatbox-button': 'closeChat' + 'click .close-chatbox-button': 'closeChat', + 'keypress textarea.chat-textarea': 'keyPressed' + }, + + appendMessage: function (message) { + var time, + now = new Date(), + minutes = now.getMinutes().toString(), + list, + $chat_content; + + message = message.replace(//g,">").replace(/\"/g,"""); + list = message.match(/\b(http:\/\/www\.\S+\.\w+|www\.\S+\.\w+|http:\/\/(?=[^w]){3}\S+[\.:]\S+)[^ ]+\b/g); + if (list) { + for (i = 0; i < list.length; i++) { + message = message.replace( list[i], ""+ list[i] + "" ); + } + } + if (minutes.length==1) {minutes = '0'+minutes;} + time = now.toLocaleTimeString().substring(0,5); + $chat_content = $(this.el).find('.chat-content'); + $chat_content.append( + '
' + + ''+time+' me:  ' + + ''+message+'' + + '
'); + $chat_content.scrollTop($chat_content[0].scrollHeight); + }, + + messageReceived: function (message) { + /* XXX: event.mtype should be 'xhtml' for XHTML-IM messages, + but I only seem to get 'text'. + + XXX: Some messages might be delayed, we must get the time from the event. + */ + var body = $(message).children('body').text(), + jid = $(message).attr('from'), + composing = $(message).find('composing'), + div = $('
'), + $chat_content = $(this.el).find('.chat-content'), + user_id = Strophe.getNodeFromJid(jid); + + if (!body) { + if (composing.length > 0) { + message_html = div.addClass('chat-event').text(user_id+ ' is typing...'); + $chat_content.find('div.chat-event').remove().end().append(message_html); + } + } else { + // TODO: ClientStorage + xmppchat.Messages.ClientStorage.addMessage(jid, body, 'from'); + if (xmppchat.xmppstatus.getOwnStatus() === 'offline') { + return; + } + // only update the UI if the user is not offline + var time = (new Date()).toLocaleTimeString().substring(0,5), + text = body.replace(/
/g, ""); + + div.addClass('chat-message'); + if (($(message).find('delay').length > 0)) { + div.addClass('delayed'); + } + $chat_content.find('div.chat-event').remove(); + message_html = div.append( + ''+time+' '+user_id+':  ' + + ''+text+'' + ); + $chat_content.append(message_html); + // FIXME: + // xmppchat.UI.msg_counter += 1; + // xmppchat.UI.updateMsgCounter(); + } + $chat_content.scrollTop($chat_content[0].scrollHeight); + }, + + 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. + // FIXME: see if @@content-transform is required + var bare_jid = this.model.get('jid'); + var message = $msg({to: bare_jid, type: 'chat'}) + .c('body').t(text).up() + .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}); + xmppchat.connection.send(message); + xmppchat.Messages.ClientStorage.addMessage(bare_jid, text, 'to'); + this.appendMessage(text); + }, + + keyPressed: function (ev) { + var $textarea = $(ev.target), + message, + notify, + composing, + that = this; + + if(ev.keyCode == 13) { + message = $textarea.val(); + message = message.replace(/^\s+|\s+jQuery/g,""); + $textarea.val('').focus(); + if (message !== '') { + this.sendMessage(message); + } + $(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); + } + } }, addChatToCookie: function () { @@ -358,6 +420,7 @@ xmppchat.ChatBoxesView = Backbone.View.extend({ } this.views[jid] = view.render(); this.options.model.add(chatbox); + return view; }, closeChat: function (jid) { @@ -443,6 +506,20 @@ xmppchat.ChatBoxesView = Backbone.View.extend({ } }, + messageReceived: function (message) { + var jid = $(message).attr('from'), + bare_jid = Strophe.getBareJidFromJid(jid), + resource = Strophe.getResourceFromJid(jid), + view = this.views[bare_jid]; + + if (!view) { + view = this.createChat(bare_jid); + } + view.messageReceived(message); + // XXX: Is this the right place for this? Perhaps an event? + xmppchat.Roster.addResource(bare_jid, resource); + }, + initialize: function () { this.options.model.on("add", function (item) { this.positionNewChat(item.get('id')); @@ -450,7 +527,6 @@ xmppchat.ChatBoxesView = Backbone.View.extend({ this.views = {}; this.restoreOpenChats(); - } }); @@ -805,7 +881,7 @@ $(document).ready(function () { xmppchat.connection.bare_jid = Strophe.getBareJidFromJid(xmppchat.connection.jid); // Messages - xmppchat.connection.addHandler(xmppchat.Messages.messageReceived, null, 'message', 'chat'); + xmppchat.Roster = xmppchat.RosterClass(Strophe._connectionPlugins.roster, _, $, console); xmppchat.rosterview = Backbone.View.extend(xmppchat.RosterView(xmppchat.Roster, _, $, console)); @@ -820,6 +896,13 @@ $(document).ready(function () { 'model': xmppchat.chatboxes }); + xmppchat.connection.addHandler( + function (message) { + xmppchat.chatboxesview.messageReceived(message); + return true; + }, + null, 'message', 'chat'); + // XMPP Status xmppchat.xmppstatus = new xmppchat.XMPPStatus(); xmppchat.xmppstatusview = new xmppchat.XMPPStatusView({ diff --git a/chatui.js b/chatui.js index c0d163128..cbe362e70 100644 --- a/chatui.js +++ b/chatui.js @@ -225,108 +225,6 @@ xmppchat.UI = (function (xmppUI, $, console) { ob.addChatToCookie = function (jid) {}; - ob.addMessageToChatbox = function (event) { - /* XXX: event.mtype should be 'xhtml' for XHTML-IM messages, - but I only seem to get 'text'. - - XXX: Some messages might be delayed, we must get the time from the event. - */ - var user_id = Strophe.getNodeFromJid(event.from), - jid = Strophe.getBareJidFromJid(event.from), - that = this; - - xmppchat.Presence.getUserInfo(user_id, function (data) { - that.getChatbox(jid, function (chat) { - var chat_content = $(chat).find(".chat-content"), - now = new Date(), - time = now.toLocaleTimeString().substring(0,5), - div = $('
'), - composing = $(event.message).find('composing'), - text; - - if (event.body) { - text = event.body.replace(/
/g, ""); - div.addClass('chat-message'); - - if (event.delayed) { - div.addClass('delayed'); - } - if (user_id == that.username) { - message_html = div.append( - ''+time+' me:  ' + - ''+text+'' - ); - } else { - message_html = div.append( - ''+time+' '+data.fullname+':  ' + - ''+text+'' - ); - } - chat_content.find('div.chat-event').remove(); - chat_content.append(message_html); - xmppchat.UI.msg_counter += 1; - xmppchat.UI.updateMsgCounter(); - - } else if (composing.length > 0) { - message_html = div.addClass('chat-event').text(data.fullname + ' is typing...'); - chat_content.find('div.chat-event').remove().end().append(message_html); - } - chat_content.scrollTop(chat_content[0].scrollHeight); - }); - }); - }; - - ob.keyPressed = function (ev, textarea) { - var $textarea = jQuery(textarea), - jid = $textarea.attr('data-recipient'), // FIXME: bare jid - $chat = $textarea.parent().parent(), - message, - notify, - composing; - - if(ev.keyCode == 13) { - message = $textarea.val(); - message = message.replace(/^\s+|\s+jQuery/g,""); - $textarea.val('').focus(); - if (message !== '') { - xmppchat.Messages.sendMessage(jid, message, function () { - var time, - minutes, - now, - $chat_content; - - message = message.replace(//g,">").replace(/\"/g,"""); - list = message.match(/\b(http:\/\/www\.\S+\.\w+|www\.\S+\.\w+|http:\/\/(?=[^w]){3}\S+[\.:]\S+)[^ ]+\b/g); - if (list) { - for (i = 0; i < list.length; i++) { - message = message.replace( list[i], ""+ list[i] + "" ); - } - } - now = new Date(); - minutes = now.getMinutes().toString(); - if (minutes.length==1) {minutes = '0'+minutes;} - time = now.toLocaleTimeString().substring(0,5); - $chat_content = $chat.find('.chat-content'); - $chat_content.append( - '
' + - ''+time+' me:  ' + - ''+message+'' + - '
'); - $chat_content.scrollTop($chat_content[0].scrollHeight); - $chat.data('composing', false); - }); - } - } else { - composing = $chat.data('composing'); - if (!composing) { - notify = $msg({'to':jid, 'type': 'chat'}) - .c('composing', {'xmlns':'http://jabber.org/protocol/chatstates'}); - xmppchat.connection.send(notify); - $chat.data('composing', true); - } - } - }; - return ob; })(xmppchat.UI || {}, jQuery, console || {log: function(){}} ); @@ -334,24 +232,10 @@ xmppchat.UI = (function (xmppUI, $, console) { // Event handlers // -------------- $(document).ready(function () { - $(document).unbind('jarnxmpp.message'); - $(document).bind('jarnxmpp.message', function (event) { - xmppchat.UI.addMessageToChatbox(event); - }); - $(document).bind('xmppchat.send_presence', function (event, jid, type) { xmppchat.connection.send($pres({'type':type})); }); - $(document).unbind('jarnxmpp.presence'); - $(document).bind('jarnxmpp.presence', function (event, jid, status, presence) { - xmppchat.UI.updateOnPresence(jid, status, presence); - }); - - $('textarea.chat-textarea').live('keypress', function (ev) { - xmppchat.UI.keyPressed(ev, this); - }); - $('ul.tabs').tabs('div.panes > div'); $('div.add-xmpp-contact').click(function (ev) {