XmlHttpRequest = {
	getInstance: function() {
		var instance = false;
		if (typeof XMLHttpRequest != "undefined") {
			instance = new XMLHttpRequest();
		}		
		if (!instance) {		
			try {
				instance = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
					instance = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {
					instance = false;
				}
			}		
		}	
		return instance;
	}
}

var bison = new Bison();

function stringToBison(str) {
	var obj;
	try {
		obj = eval("(" + str + ")");
		return bison.serialize(obj);
	} catch (e) {
		alert("Error in expression: " + e.message);
		return false;
	}
}

function send() {
	var bisonStr = stringToBison(document.getElementById("send-box").value);
	if (bisonStr) {
		var xmlHttp = XmlHttpRequest.getInstance();
		xmlHttp.open("POST", "./bisonserver.php", true);
		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 4) {
				var obj = bison.deserialize(xmlHttp.responseText);
				document.getElementById("receive-box").innerHTML = dump(obj);
			}
		}
		xmlHttp.send(bisonStr);
	}
}

function dump(obj) {
	var objType = typeof obj;
	switch (objType) {
		case "undefined":
		case "null":
			return objType;
		case "boolean":
		case "number":
		case "string":
			return obj.toString();
		case "object":
			var dumpStr;
			if (obj instanceof Array) {
				dumpStr = "<div style=\"margin: 0; border: 1px solid #CCC\"><div style=\"margin: 0; background: #F2F2F2\">Array</div><table><tbody>"; 
			} else {
				dumpStr = "<div style=\"margin: 0; border: 1px solid #CCC\"><div style=\"margin: 0; background: #F2F2F2\">Object</div><table><tbody>"; 
			}			
			for (var member in obj) {
				dumpStr += "<tr style=\"vertical-align: top\"><td style=\"width: 50%; font-weight: bold\">" + member + "</td><td>" + dump(obj[member]) + "</td></tr>";	
			}			
			dumpStr += "</tbody></table></div>";
			return dumpStr;
	}
}