<?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 PIT Matching</title>
	
	<script type="text/javascript" src="../build/ndn-js.js"></script>

	<script type="text/javascript">
		var ndn = new NDN({port:9696,host:"localhost", verify:false});
        
                var AsyncGetClosure = function AsyncGetClosure(target) {
        	// Inherit from Closure.
			Closure.call(this);
            
            this.target = target;
		};
		
		AsyncGetClosure.prototype.upcall = function(kind, upcallInfo) {
			if (kind == Closure.UPCALL_CONTENT || kind == Closure.UPCALL_CONTENT_UNVERIFIED) {
				document.getElementById(this.target).innerHTML = 
                    DataUtils.toString(upcallInfo.contentObject.content);
                return Closure.RESULT_OK;
            }
            else
                return Closure.RESULT_ERR;
		};
		
        var name = new Name("/ndn/ucla.edu/apps/ndn-js-test/hello.txt");
        
        var interestSelector1 = new Interest();
        interestSelector1.interestLifetime = 10000;
        interestSelector1.minSuffixComponents = 3;
        interestSelector1.maxSuffixComponents = 3;
        
        var interestSelector2 = new Interest();
        interestSelector2.interestLifetime = 10000;
        interestSelector2.minSuffixComponents = 4;
        interestSelector2.maxSuffixComponents = 4;

        var interestSelector3 = new Interest();
        interestSelector3.interestLifetime = 10000;
        interestSelector3.exclude = new Exclude([Exclude.ANY, DataUtils.toNumbersFromString("zzzzzz")]);

        var interestSelector4 = new Interest();
        interestSelector4.interestLifetime = 10000;
        interestSelector4.exclude = new Exclude([DataUtils.toNumbersFromString("zzzzzz"), Exclude.ANY]);

		function run() {
            ndn.onopen = function() {
              for (var i = 0; i < 10; ++i) {
                // "col1Content0" is already fetched.
                if (i != 0)
                    ndn.expressInterest(name, new AsyncGetClosure("col1Content" + i), interestSelector1);
                ndn.expressInterest(name, new AsyncGetClosure("col2Content" + i), interestSelector2);
                ndn.expressInterest(name, new AsyncGetClosure("col3Content" + i), interestSelector3);
                ndn.expressInterest(name, new AsyncGetClosure("col4Content" + i), interestSelector4);
              }
              // For testing, make sure we don't just process in the order returned.
              DataUtils.shuffle(NDN.PITTable);
            };
            
			ndn.expressInterest(name, new AsyncGetClosure("col1Content0"), interestSelector1);
		}
	</script>	
</head>
<body >
  <button id="runBtn" onclick="run()">Run</button>
  <table style="text-align: left;" border="1" cellpadding="2" cellspacing="0">
  <tbody>
    <tr>
      <td style="vertical-align: top;">minSuffixComponents=3,<br/>maxSuffixComponents=3<br/>should be:<br/>
                                       hello</td>
      <td style="vertical-align: top;">minSuffixComponents=4,<br/>maxSuffixComponents=4<br/>should be:<br/>
                                       hello world</td>
      <td style="vertical-align: top;">exclude=*,zzzzzz<br/><br/>should be:<br/>hello</td>
      <td style="vertical-align: top;">exclude=zzzzzz,*<br/><br/>should be:<br/>hello world</td>
    </tr>
    <tr>
      <td style="vertical-align: top;"><div id="col1Content0"/></td>
      <td style="vertical-align: top;"><div id="col2Content0"/></td>
      <td style="vertical-align: top;"><div id="col3Content0"/></td>
      <td style="vertical-align: top;"><div id="col4Content0"/></td>
    </tr>
    <tr>
      <td style="vertical-align: top;"><div id="col1Content1"/></td>
      <td style="vertical-align: top;"><div id="col2Content1"/></td>
      <td style="vertical-align: top;"><div id="col3Content1"/></td>
      <td style="vertical-align: top;"><div id="col4Content1"/></td>
    </tr>
    <tr>
      <td style="vertical-align: top;"><div id="col1Content2"/></td>
      <td style="vertical-align: top;"><div id="col2Content2"/></td>
      <td style="vertical-align: top;"><div id="col3Content2"/></td>
      <td style="vertical-align: top;"><div id="col4Content2"/></td>
    </tr>
    <tr>
      <td style="vertical-align: top;"><div id="col1Content3"/></td>
      <td style="vertical-align: top;"><div id="col2Content3"/></td>
      <td style="vertical-align: top;"><div id="col3Content3"/></td>
      <td style="vertical-align: top;"><div id="col4Content3"/></td>
    </tr>
    <tr>
      <td style="vertical-align: top;"><div id="col1Content4"/></td>
      <td style="vertical-align: top;"><div id="col2Content4"/></td>
      <td style="vertical-align: top;"><div id="col3Content4"/></td>
      <td style="vertical-align: top;"><div id="col4Content4"/></td>
    </tr>
    <tr>
      <td style="vertical-align: top;"><div id="col1Content5"/></td>
      <td style="vertical-align: top;"><div id="col2Content5"/></td>
      <td style="vertical-align: top;"><div id="col3Content5"/></td>
      <td style="vertical-align: top;"><div id="col4Content5"/></td>
    </tr>
    <tr>
      <td style="vertical-align: top;"><div id="col1Content6"/></td>
      <td style="vertical-align: top;"><div id="col2Content6"/></td>
      <td style="vertical-align: top;"><div id="col3Content6"/></td>
      <td style="vertical-align: top;"><div id="col4Content6"/></td>
    </tr>
    <tr>
      <td style="vertical-align: top;"><div id="col1Content7"/></td>
      <td style="vertical-align: top;"><div id="col2Content7"/></td>
      <td style="vertical-align: top;"><div id="col3Content7"/></td>
      <td style="vertical-align: top;"><div id="col4Content7"/></td>
    </tr>
    <tr>
      <td style="vertical-align: top;"><div id="col1Content8"/></td>
      <td style="vertical-align: top;"><div id="col2Content8"/></td>
      <td style="vertical-align: top;"><div id="col3Content8"/></td>
      <td style="vertical-align: top;"><div id="col4Content8"/></td>
    </tr>
    <tr>
      <td style="vertical-align: top;"><div id="col1Content9"/></td>
      <td style="vertical-align: top;"><div id="col2Content9"/></td>
      <td style="vertical-align: top;"><div id="col3Content9"/></td>
      <td style="vertical-align: top;"><div id="col4Content9"/></td>
    </tr>
  </tbody>
  </table>	
</body>
</html>
