<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Reliable Chat</title>
- <link rel="stylesheet" title="Default style" href="rc.css" type="text/css"/>
- <script type="text/javascript" src="rc.js"></script>
+ <style type="text/css"><!--/*--><![CDATA[/*><!--*/
+ html, body, #outer-table, #history { width: 99.9%; height: 100%; margin: 0; padding: 0 }
+ #status { background-color: #eef }
+ #say { width: 100% }
+ #history { vertical-align: bottom }
+ img { width: 1px; height: 1px; }
+ iframe { display: none }
+ #status span { margin-right: 2em }
+ #status span.sad { background-color: #fee }
+ #status span.happy { background-color: #efe }
+ /*]]>*/--></style>
+ <script type="text/javascript"><!--//--><![CDATA[//><!--
+ var servers = ['chkno.net', 'rc2.chkno.net', 'echto.net', 'the-wes.com', 'vibrantlogic.com'];
+
+ var session = Math.random();
+ var seen = {};
+
+ function rcnick() {
+ var nick = localStorage.getItem("nick");
+ if (nick) {
+ return nick;
+ }
+ return 'anonymous';
+ }
+
+ function rcsetnick(new_nick) {
+ localStorage.setItem("nick", new_nick);
+ }
+
+ function rcserverbase(server) {
+ // Add the default port if server doesn't contain a port number already
+ if (server.indexOf(":") == -1) {
+ return "http://" + server + ":21059";
+ } else {
+ return "http://" + server;
+ }
+ }
+
+ function rcchangeserverstatus(server, new_status) {
+ var statusbar = document.getElementById("status");
+ var spans = statusbar.getElementsByTagName("span");
+ for (var i in spans) {
+ if (spans[i].firstChild && 'data' in spans[i].firstChild && spans[i].firstChild.data == server) {
+ spans[i].setAttribute("class", new_status);
+ }
+ }
+ }
+
+ function rcaddmessagetohistory(message) {
+ var d = document.createElement("div");
+ d.appendChild(document.createTextNode(message));
+ var h = document.getElementById("history");
+ h.appendChild(d);
+ window.scrollTo(0, document.body.scrollHeight);
+ return d;
+ }
+
+ function make_seen_key(id, text) {
+ return id.replace(/@/g, "@@") + "_@_" + text.replace(/@/g, "@@");
+ }
+
+ function receiveMessage(server, time, id, text) {
+ var seen_key = make_seen_key(id, text);
+ if (!(seen_key in seen)) {
+ seen[seen_key] = true;
+ rcaddmessagetohistory(text);
+ for (var i in servers) {
+ rcchangeserverstatus(servers[i], "sad");
+ }
+ }
+ rcchangeserverstatus(server, "happy");
+ }
+
+ function receiveMessageEvent(event)
+ {
+ for (var i in servers) {
+ if (event.origin === rcserverbase(servers[i])) {
+ messages = JSON.parse(event.data);
+ for (var j in messages) {
+ if ('Time' in messages[j] &&
+ 'ID' in messages[j] &&
+ 'Text' in messages[j]) {
+ receiveMessage(servers[i], messages[j]['Time'], messages[j]['ID'], messages[j]['Text']);
+ }
+ }
+ }
+ }
+ }
+
+ function rcconnect() {
+ window.addEventListener("message", receiveMessageEvent, false);
+ for (var i in servers) {
+ // Create a hidden iframe for same-origin workaround
+ var iframe = document.createElement("iframe");
+ iframe.setAttribute("src", rcserverbase(servers[i]) + "/frame");
+ document.body.insertBefore(iframe, document.body.firstChild);
+ // Status bar entry
+ var status_indicator = document.createElement("span");
+ status_indicator.appendChild(document.createTextNode(servers[i]));
+ status_indicator.setAttribute("class", "sad");
+ document.getElementById("status").appendChild(status_indicator);
+ }
+ if (rcnick() == 'anonymous') {
+ rcaddmessagetohistory("-!- Set your nick with /nick");
+ }
+ }
+
+ function rcsend(d, message) {
+ var id = new Date().getTime() + "-" + session + "-" + Math.random();
+ seen[make_seen_key(id, message)] = true;
+ var path = "/speak" +
+ "?id=" + encodeURIComponent(id) +
+ "&text=" + encodeURIComponent(message);
+ for (var i in servers) {
+ var uri = rcserverbase(servers[i]) + path;
+ var img = document.createElement("img");
+ img.setAttribute("src", uri);
+ d.appendChild(img);
+ }
+ }
+
+ function rckeydown(event) {
+ if (event.keyCode == 13) {
+ var input = document.input.say.value;
+ document.input.say.value = "";
+
+ // Check nick change
+ var message;
+ var re = /^\/nick (.*)/;
+ var match = re.exec(input);
+ if (match) {
+ message = "*** " + rcnick() + " is now known as " + match[1];
+ rcsetnick(match[1]);
+ } else {
+ message = "<" + rcnick() + "> " + input;
+ }
+
+ // Remind people to set their nick
+ if (rcnick() == 'anonymous') {
+ rcaddmessagetohistory("-!- Set your nick with /nick");
+ }
+
+ // Say the message
+ var d = rcaddmessagetohistory(message);
+ rcsend(d, message);
+ }
+ }
+ //--><!]]></script>
+
</head>
<body onload="rcconnect()">
<tr><td id="history"></td></tr>
<tr><td id="status"> </td></tr>
<tr><td><form name="input" onsubmit="return false" autocomplete="off">
- <input id="say" onkeydown="return rckeydown(event)" autocomplete="off"></input>
+ <input id="say" onkeydown="return rckeydown(event)" autocomplete="off" autofocus="autofocus"></input>
</form></td></tr>
</table>
</body>