<html> 
<head>
<script src=traversal.js language="JavaScript" type="text/JavaScript" ></script>
<title>Traversal Test</title> 
</head> 
<body>
<div id="test">
<span id="A">
    <span id="A.1">
    </span>
    <span id="A.2">
    </span>
    <span id="A.3">
    </span>
</span>
<span id="B">
    <span id="B.1">
        <span id="B.1.1">
        </span>
        <span id="B.1.2">
        </span>
    </span>
    <span id="B.2">
        <span id="B.2.1">
        </span>
    </span>
</span>
<span id="C">
    <span id="C.1">
        <span id="C.1.1">
            <span id="C.1.1.1">
            </span>
            <span id="C.1.1.2">
            </span>
            <span id="C.1.1.3">
            </span>
        </span>
        <span id="C.1.2">
            <span id="C.2.1">
            </span>
        </span>
    </span>
</span>
<span id="D">
</span>
</div>
<div style="font-family: Courier; font-size: 14; white-space: pre">
<script>
if (window.testRunner)
    testRunner.dumpAsText();

var root = document.getElementById('test');
var start = document.getElementById('A');

function testNodeFiter(n)
{
    if (n.tagName == 'SPAN') {
        if (n.id == 'B.1' || n.id == 'C.1.1')
            return NodeFilter.FILTER_REJECT;
        return NodeFilter.FILTER_ACCEPT;
    }
    return NodeFilter.FILTER_SKIP;
}

var tw1 = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, testNodeFiter, false);
document.write(dumpTreeWalker(tw1, start));

var tw2 = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, testNodeFiter, false);
document.write(dumpTreeWalker(tw2, start, document.getElementById('D'), true));

</script>
</div>
</body>
</html>
