<?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});
        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>
