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();
});