blob: 53e4795b1c22f5cb56b7adfd2fb91ea25af7de4e [file] [log] [blame]
<html>
<head>
<title>Async Chat</title>
<script type='text/javascript'>
function $()
{
return document.getElementById(arguments[0]);
}
function $F()
{
return document.getElementById(arguments[0]).value;
}
function getKeyCode(ev)
{
if (window.event) return window.event.keyCode;
return ev.keyCode;
}
function xhr(method, uri, body, handler)
{
var req = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
req.onreadystatechange = function ()
{
if (req.readyState == 4 && handler)
{
eval('var o=' + req.responseText);
handler(o);
}
}
req.open(method, uri, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.send(body);
}
function send(user, message, handler, join)
{
if (message) message = message.replace('%', '%25').replace('&', '%26').replace('=', '%3D');
if (user) user = user.replace('%', '%25').replace('&', '%26').replace('=', '%3D');
var requestBody = 'user=' + user + (message ? '&message=' + message : '') + (join ? '&join=true' : '');
xhr('POST', 'chat', requestBody , handler);
}
var room = {
join: function (name)
{
this._username = name;
$('join').className = 'hidden';
$('joined').className = '';
$('phrase').focus();
send(room._username, 'has joined!', room._poll, true);
},
chat: function (text)
{
if (text != null && text.length > 0)
send(room._username, text, room._poll, false);
},
_poll: function (m)
{
//console.debug(m);
if (m.chat)
{
var chat = document.getElementById('chat');
var spanFrom = document.createElement('span');
spanFrom.className = 'from';
spanFrom.innerHTML = m.from + ':&nbsp;';
var spanText = document.createElement('span');
spanText.className = 'text';
spanText.innerHTML = m.chat;
var lineBreak = document.createElement('br');
chat.appendChild(spanFrom);
chat.appendChild(spanText);
chat.appendChild(lineBreak);
chat.scrollTop = chat.scrollHeight - chat.clientHeight;
}
send(room._username, null, room._poll, false);
},
_end: ''
};
</script>
<style type='text/css'>
div {
border: 0px solid black;
}
div#chat {
clear: both;
width: 40em;
height: 20ex;
overflow: auto;
background-color: #f0f0f0;
padding: 4px;
border: 1px solid black;
}
div#input {
clear: both;
width: 40em;
padding: 4px;
background-color: #e0e0e0;
border: 1px solid black;
border-top: 0
}
input#phrase {
width: 30em;
background-color: #e0f0f0;
}
input#username {
width: 14em;
background-color: #e0f0f0;
}
div.hidden {
display: none;
}
</style>
</head>
<body>
<div id='chat'></div>
<div id='input'>
<div id='join'>
Username:&nbsp;<input id='username' type='text'/><input id='joinB' class='button' type='submit' name='join'
value='Join'/>
</div>
<div id='joined' class='hidden'>
Chat:&nbsp;<input id='phrase' type='text'/>
<input id='sendB' class='button' type='submit' name='join' value='Send'/>
</div>
</div>
<script type='text/javascript'>
$('username').setAttribute('autocomplete', 'OFF');
$('username').onkeyup = function (ev)
{
var keyc = getKeyCode(ev);
if (keyc == 13 || keyc == 10)
{
room.join($F('username'));
return false;
}
return true;
};
$('joinB').onclick = function (event)
{
room.join($F('username'));
return false;
};
$('phrase').setAttribute('autocomplete', 'OFF');
$('phrase').onkeyup = function (ev)
{
var keyc = getKeyCode(ev);
if (keyc == 13 || keyc == 10)
{
room.chat($F('phrase'));
$('phrase').value = '';
return false;
}
return true;
};
$('sendB').onclick = function (event)
{
room.chat($F('phrase'));
$('phrase').value = '';
return false;
};
</script>
</body>
</html>