| /** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the 'License'); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an 'AS IS' BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| var amq = org.activemq.Amq; |
| |
| org.activemq.Chat = function() { |
| var last = ''; |
| |
| var user = null; |
| |
| var chatTopic = 'topic://CHAT.DEMO'; |
| |
| var chat, join, joined, phrase, members, username = null; |
| |
| var chatHandler = function(message) { |
| var type = message.getAttribute('type'); |
| var from = message.getAttribute('from'); |
| |
| switch (type) { |
| // Incoming chat message |
| case 'chat' : { |
| var text = message.childNodes[0].data; |
| |
| if (from == last) from = '...'; |
| else { |
| last = from; |
| from += ':'; |
| } |
| |
| chat.innerHTML += '<span class=\'from\'>' + from + ' </span><span class=\'text\'>' + text + '</span><br/>'; |
| break; |
| } |
| |
| // Incoming ping request, add the person's name to your list. |
| case 'ping' : { |
| members.innerHTML += '<span class="member">' + from + '</span><br/>'; |
| break; |
| } |
| |
| // someone new joined the chatroom, clear your list and |
| // broadcast your name to all users. |
| case 'join' : { |
| members.innerHTML = ''; |
| if (user != null) |
| amq.sendMessage(chatTopic, '<message type="ping" from="' + user + '"/>'); |
| chat.innerHTML += '<span class="alert"><span class="from">' + from + ' </span><span class="text">has joined the room!</span></span><br/>'; |
| break; |
| } |
| |
| // Screw you guys, I'm going home... |
| // When I (and everyone else) receive a leave message, we broadcast |
| // our own names in a ping in order to update everyone's list. |
| // todo: Make this more efficient by simply removing the person's name from the list. |
| case 'leave': { |
| members.innerHTML = ''; |
| chat.innerHTML += '<span class="alert"><span class="from">' + from + ' </span><span class="text">has left the room!</span></span><br/>'; |
| |
| // If we are the one that is leaving... |
| if (from == user) { |
| // switch the input form |
| join.className = ''; |
| joined.className = 'hidden'; |
| username.focus(); |
| |
| user = null; |
| amq.removeListener('chat', chatTopic); |
| } |
| if (user != null) |
| amq.sendMessage(chatTopic, '<message type="ping" from="' + user + '"/>'); |
| break; |
| } |
| } |
| |
| chat.scrollTop = chat.scrollHeight - chat.clientHeight; |
| }; |
| |
| var getKeyCode = function (ev) { |
| var keyc; |
| if (window.event) keyc = window.event.keyCode; |
| else keyc = ev.keyCode; |
| return keyc; |
| }; |
| |
| var addEvent = function(obj, type, fn) { |
| if (obj.addEventListener) |
| obj.addEventListener(type, fn, false); |
| else if (obj.attachEvent) { |
| obj["e"+type+fn] = fn; |
| obj[type+fn] = function() { obj["e"+type+fn]( window.event ); } |
| obj.attachEvent( "on"+type, obj[type+fn] ); |
| } |
| }; |
| |
| var initEventHandlers = function() { |
| addEvent(username, 'keyup', function(ev) { |
| var keyc = getKeyCode(ev); |
| if (keyc == 13 || keyc == 10) { |
| org.activemq.Chat.join(); |
| return false; |
| } |
| return true; |
| }); |
| |
| addEvent(document.getElementById('joinB'), 'click', function() { |
| org.activemq.Chat.join(); |
| return true; |
| }); |
| |
| addEvent(phrase, 'keyup', function(ev) { |
| var keyc = getKeyCode(ev); |
| |
| if (keyc == 13 || keyc == 10) { |
| var text = phrase.value; |
| phrase.value = ''; |
| org.activemq.Chat.chat(text); |
| return false; |
| } |
| return true; |
| }); |
| |
| addEvent(document.getElementById('sendB'), 'click', function() { |
| var text = phrase.value; |
| phrase.value = ''; |
| org.activemq.Chat.chat(text); |
| }); |
| |
| addEvent(document.getElementById('leaveB'), 'click', function() { |
| org.activemq.Chat.leave(); |
| return false; |
| }); |
| }; |
| |
| return { |
| join: function() { |
| var name = username.value; |
| if (name == null || name.length == 0) { |
| alert('Please enter a username!'); |
| } else { |
| user = name; |
| |
| amq.addListener('chat', chatTopic, chatHandler); |
| join.className = 'hidden'; |
| joined.className = ''; |
| phrase.focus(); |
| |
| amq.sendMessage(chatTopic, '<message type="join" from="' + user + '"/>'); |
| } |
| }, |
| |
| leave: function() { |
| amq.sendMessage(chatTopic, '<message type="leave" from="' + user + '"/>'); |
| }, |
| |
| chat: function(text) { |
| if (text != null && text.length > 0) { |
| // TODO more encoding? |
| text = text.replace('<', '<'); |
| text = text.replace('>', '>'); |
| |
| amq.sendMessage(chatTopic, '<message type="chat" from="' + user + '">' + text + '</message>'); |
| } |
| }, |
| |
| init: function() { |
| join = document.getElementById('join'); |
| joined = document.getElementById('joined'); |
| chat = document.getElementById('chat'); |
| members = document.getElementById('members'); |
| username = document.getElementById('username'); |
| phrase = document.getElementById('phrase'); |
| |
| if (join.className == 'hidden' && joined.className == 'hidden') { |
| join.className = ''; |
| joined.className = 'hidden'; |
| username.focus(); |
| } |
| |
| initEventHandlers(); |
| } |
| } |
| }(); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |