dojo.require("dojox.cometd"); dojo.require("dojox.cometd.timestamp"); dojo.require("dojox.cometd.ack"); dojo.require("dojox.cometd.reload"); var room = { _lastUser: null, _username: null, _connected: false, _disconnecting: false, _chatSubscription: null, _membersSubscription: null, _init: function() { dojo.removeClass("join", "hidden"); dojo.addClass("joined", "hidden"); dojo.byId('username').focus(); dojo.query("#username").attr({ "autocomplete": "off" }).onkeyup(function(e) { if (e.keyCode == dojo.keys.ENTER) { room.join(dojo.byId('username').value); } }); dojo.query("#joinButton").onclick(function(e) { room.join(dojo.byId('username').value); }); dojo.query("#phrase").attr({ "autocomplete": "off" }).onkeyup(function(e) { if (e.keyCode == dojo.keys.ENTER) { room.chat(); } }); dojo.query("#sendButton").onclick(function(e) { room.chat(); }); dojo.query("#leaveButton").onclick(room, "leave"); // Check if there was a saved application state var stateCookie = org.cometd.COOKIE?org.cometd.COOKIE.get('org.cometd.demo.state'):null; var state = stateCookie ? org.cometd.JSON.fromJSON(stateCookie) : null; // Restore the state, if present if (state) { dojo.byId('username').value=state.username; setTimeout(function() { // This will perform the handshake room.join(state.username); }, 0); } }, join: function(name) { room._disconnecting = false; if (name == null || name.length == 0) { alert('Please enter a username'); return; } dojox.cometd.ackEnabled = dojo.query("#ackEnabled").attr("checked"); var cometdURL = location.protocol + "//" + location.host + config.contextPath + "/cometd"; dojox.cometd.init({ url: cometdURL, logLevel: "info" }); room._username = name; dojo.addClass("join", "hidden"); dojo.removeClass("joined", "hidden"); dojo.byId("phrase").focus(); }, _unsubscribe: function() { if (room._chatSubscription) { dojox.cometd.unsubscribe(room._chatSubscription); } room._chatSubscription = null; if (room._membersSubscription) { dojox.cometd.unsubscribe(room._membersSubscription); } room._membersSubscription = null; }, _subscribe: function() { room._chatSubscription = dojox.cometd.subscribe('/chat/demo', room.receive); room._membersSubscription = dojox.cometd.subscribe('/chat/members', room.members); }, leave: function() { dojox.cometd.batch(function() { dojox.cometd.publish("/chat/demo", { user: room._username, membership: 'leave', chat: room._username + " has left" }); room._unsubscribe(); }); dojox.cometd.disconnect(); // switch the input form dojo.removeClass("join", "hidden"); dojo.addClass("joined", "hidden"); dojo.byId("username").focus(); dojo.byId('members').innerHTML = ""; room._username = null; room._lastUser = null; room._disconnecting = true; }, chat: function() { var text = dojo.byId('phrase').value; dojo.byId('phrase').value = ''; if (!text || !text.length) return; var colons = text.indexOf("::"); if (colons > 0) { dojox.cometd.publish("/service/privatechat", { room: "/chat/demo", // This should be replaced by the room name user: room._username, chat: text.substring(colons + 2), peer: text.substring(0, colons) }); } else { dojox.cometd.publish("/chat/demo", { user: room._username, chat: text }); } }, receive: function(message) { var fromUser = message.data.user; var membership = message.data.join || message.data.leave; var text = message.data.chat; if (!membership && fromUser == room._lastUser) { fromUser = "..."; } else { room._lastUser = fromUser; fromUser += ":"; } var chat = dojo.byId('chat'); if (membership) { chat.innerHTML += "" + fromUser + " " + text + "
"; room._lastUser = null; } else if (message.data.scope == "private") { chat.innerHTML += "" + fromUser + " [private] " + text + "
"; } else { chat.innerHTML += "" + fromUser + " " + text + "
"; } chat.scrollTop = chat.scrollHeight - chat.clientHeight; }, members: function(message) { var members = dojo.byId('members'); var list = ""; for (var i in message.data) list += message.data[i] + "
"; members.innerHTML = list; }, _connectionInitialized: function() { // first time connection for this client, so subscribe and tell everybody. dojox.cometd.batch(function() { room._subscribe(); dojox.cometd.publish('/chat/demo', { user: room._username, membership: 'join', chat: room._username + ' has joined' }); }); }, _connectionEstablished: function() { // connection establish (maybe not for first time), so just // tell local user and update membership room.receive({ data: { user: 'system', chat: 'Connection to Server Opened' } }); dojox.cometd.publish('/service/members', { user: room._username, room: '/chat/demo' }); }, _connectionBroken: function() { room.receive({ data: { user: 'system', chat: 'Connection to Server Broken' } }); dojo.byId('members').innerHTML = ""; }, _connectionClosed: function() { room.receive({ data: { user: 'system', chat: 'Connection to Server Closed' } }); }, _metaHandshake: function(message) { if (message.successful) { room._connectionInitialized(); } }, _metaConnect: function(message) { if (room._disconnecting) { room._connected = false; room._connectionClosed(); } else { var wasConnected = room._connected; room._connected = message.successful === true; if (!wasConnected && room._connected) { room._connectionEstablished(); } else if (wasConnected && !room._connected) { room._connectionBroken(); } } } }; dojox.cometd.addListener("/meta/handshake", room, room._metaHandshake); dojox.cometd.addListener("/meta/connect", room, room._metaConnect); dojo.addOnLoad(room, "_init"); dojo.addOnUnload(function() { if (room._username) { dojox.cometd.reload(); org.cometd.COOKIE.set('org.cometd.demo.state', org.cometd.JSON.toJSON({ username: room._username }), { 'max-age': 5 }); } else dojox.cometd.disconnect(); });