<!DOCTYPE html>
<html><head>
<meta charset="charset=windows-1251" />
<link href="ws2.css" rel="stylesheet" type="text/css" />
<title>WebSocket Test</title></head>
<body><h2>WebSocket Test</h2>
<form name="publish">
	<input type="button" id="OpCl" value="Open">
	<input type="text" name="message" value="hellomsg">
	<input type="submit" id="SndM" value="Send" disabled="1"><br>
</form>
<div id="console-div">
	Log messages
	<div id="consoleLog"></div>
	<button id="clear">Clear Log</button>
</div></body>
<script language="javascript" type="text/javascript">
var $ = function(id){return document.getElementById(id);}
var wsUri = "ws://"+window.location.host.toString()+"/web.cgi";
var ws, wstt, wsopen = 0;
$("OpCl").onclick =  function() {
	if(wsopen) {
		ws.close();
		$("OpCl").value = "Open";
	}
	else {
		ws = new WebSocket(wsUri);
		log("CONNECT: " + ws.url);
		ws.onopen = function(evt) {
			$("OpCl").value = "Close";
			$("SndM").disabled = false;
            log("CONNECTED");
			wstt = setTimeout(wsping, 2500);
		};
		ws.onclose = function(evt) {
			log("CLOSED: ("+evt.code+") "+evt.reason);
			clearTimeout(wstt);
			wsopen = 0;
			$("SndM").disabled = true;
		};
		ws.onerror = function(event) {
			logError("ERROR (" + event.data +", "+ event.code +", "+ event.reason + ")");
			wsopen = 0;
			$("SndM").disabled = true;
		};
		// ���������� �������� ���������
		ws.onmessage = function(evt) {
			var data = evt.data;
			if (typeof(data) == "string") {
				//text
				if(data != "ws:pong") logResponse("RECEIVED TEXT: " + data);
			}
			else if (data.byteLength) {
				//arraybuffer
				var u = new Uint8Array(data);
				var bytes = [];
				for (var i=0; i<u.byteLength; i++) {
					bytes.push(u[i]);
				}
				logResponse("RECEIVED ARRAY BUFFER: " + bytes);
			}
			else if (data.size) {
				//blob
				var cb = function(result) {
					logResponse("RECEIVED BLOB: " + result);
				};
			}
			else {
				logResponse("RECEIVED UNKNOWN TYPE: " + data);
			}
			clearTimeout(wstt);
			wstt = setTimeout(wsping, 2500);
		}
		wsopen = 1;
	}
}
function wsping() {ws.send("ws:ping"); wstt = setTimeout(wsping, 2500);}
var consoleLog = $("consoleLog");
$("clear").onclick = function() {
	while (consoleLog.childNodes.length > 0) {
	consoleLog.removeChild(consoleLog.lastChild);
	}
}
var log = function(message) {
	var pre = document.createElement("pre");
	pre.style.wordWrap = "break-word";
	pre.innerHTML = message;
	consoleLog.appendChild(pre);
	consoleLog.scrollTop = consoleLog.scrollHeight;
	while (consoleLog.childNodes.length > 25) {
		consoleLog.removeChild(consoleLog.firstChild);
	}
}
var logResponse = function(msg) {
	log("<span style='color:blue'>"+msg+"</span>");
}
var logSend = function(msg) {
	log("<span style='color:green'>"+msg+"</span>");
}
var logError = function(msg) {
	log("<span style='color:red'>"+msg+"</span>");
}
document.forms.publish.onsubmit = function() {
	clearTimeout(wstt);
	try {
		var text = this.message.value;
		logSend("SEND TEXT: "+text);
		ws.send(text);
	} catch (e) {
		logError("EXCEPTION: "+e);
	}
	wstt = setTimeout(wsping, 2500);
	return false;
}
</script>
</html>