<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <title>Reliable Chat</title>
  <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()">
	<table id="outer-table">
		<tr><td id="history"></td></tr>
		<tr><td id="status">&nbsp;</td></tr>
		<tr><td><form name="input" onsubmit="return false" autocomplete="off">
			<input id="say" onkeydown="return rckeydown(event)" autocomplete="off"></input>
			</form></td></tr>
	</table>
</body>
</html>