<?xml version = "1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<!-- 
	See COPYING for copyright and distribution information.
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<meta charset="UTF-8">

<head>
	<title>NDN Get via WebSocket</title>
	
	<script type="text/javascript" src="../tools/build/ndn-js.js"></script>

	<script type="text/javascript">
		var ndn = new NDN({port:9696,host:"localhost"});
        ndn.transport.connectWebSocket(ndn);
        
        ndn.onopen = function() {
        	document.getElementById("testBtn").disabled = false;
        };
        
        var AsyncGetClosure = function AsyncGetClosure() {
        	// Inherit from Closure.
			Closure.call(this);
		};
		
		AsyncGetClosure.prototype.upcall = function(kind, upcallInfo) {
			//console.log("Closure.upcall() executed.");
			if (kind == Closure.UPCALL_FINAL) {
				// Do nothing.
			} else if (kind == Closure.UPCALL_CONTENT) {
				console.log("Closure.upcall: content signature verification pass.");
				var content = upcallInfo.contentObject;
				//console.log(content.name);
				nameStr = escape(content.name.getName());
				document.getElementById('content').innerHTML += "<p>Name string: " + nameStr + "</p>";
				document.getElementById('content').innerHTML += "<p>Content buffer length: " + content.content.length + "</p>";
				//console.log("In callback, nameStr: " + nameStr);
				//console.log("In callback, content: ");
				//console.log(content);
				document.getElementById('content').innerHTML += contentObjectToHtml(content);
			} else if (kind == Closure.UPCALL_CONTENT_BAD) {
				console.log("Closure.upcall: content signature verification fail.");
			} else if (kind == Closure.UPCALL_INTEREST_TIMED_OUT) {
				console.log("Closure.upcall called with interest time out.");
			}
			return Closure.RESULT_OK;
		};
		
		
		function run() {
			ndn.expressInterest(new Name(document.getElementById('interest').value), new AsyncGetClosure());
		}
		
	</script>
	
</head>
<body >

	<form>
		Please Enter an Interest:<br />
		<input id="interest" type="text" name="INTEREST" size="50" value="/%C1.M.S.localhost/%C1.M.SRV/ccnd/KEY" /> 
	</form>

	<button id="testBtn" onclick="run()" disabled="disabled">Fetch Content</button>
	
	<p id="content">Content: <br/></p>

</body>
</html>
