description(
"This test checks the behavior of the intersectsNode() method on the Range object.<br>" +
"It covers all configurations of the node/Range relationship and some exception conditions."
);

var range = document.createRange();
var intersects = 0;

debug("1.1 Node starts before the range and ends before the range");
range.selectNode(document.getElementById("a2"));
intersects = range.intersectsNode(document.getElementById("b1"));
shouldBeFalse("intersects");
debug("");

debug("1.2 Node starts before the range, and range ends on a 1");
range.setStart(document.getElementById("b2"), 1);
range.setEnd(document.getElementById("c2"), 1);
intersects = range.intersectsNode(document.getElementById("b2"));
shouldBeTrue("intersects");
debug("");

debug("1.3 Node starts before the range and ends within the range");
range.setStart(document.getElementById("b2"), 0);
range.setEnd(document.getElementById("c3"), 0);
intersects = range.intersectsNode(document.getElementById("a2"));
shouldBeTrue("intersects");
debug("");

debug("1.4 Range starts on 0, and node starts before range and ends in range");
range.setStart(document.getElementById("b2"), 0);
range.setEnd(document.getElementById("c2"), 1);
intersects = range.intersectsNode(document.getElementById("b2"));
shouldBeTrue("intersects");
debug("");
            
debug("1.5 Node starts and ends in range");
range.selectNode(document.getElementById("a2"));
intersects = range.intersectsNode(document.getElementById("b2"));
shouldBeTrue("intersects");
debug("");

debug("1.6 Node starts in the range, and the range ends on 1");
range.setStart(document.getElementById("b1"), 1);
range.setEnd(document.getElementById("c2"), 1);
intersects = range.intersectsNode( document.getElementById("c2"));
shouldBeTrue("intersects");
debug("");

debug("1.7 Node starts in the range, and ends after the range");
range.setStart(document.getElementById("b1"), 1);
range.setEnd(document.getElementById("c2"), 0);
intersects = range.intersectsNode( document.getElementById("c2"));
shouldBeTrue("intersects");
debug("");

debug("1.8 Range start on 1, node starts in range and ends after");
range.setStart(document.getElementById("b2"), 1);
range.setEnd(document.getElementById("c2"), 0);
intersects = range.intersectsNode( document.getElementById("c2"));
shouldBeTrue("intersects");
debug("");

debug("1.9 Node starts on range start and ends on range end");
range.selectNode(document.getElementById("a2"));
intersects = range.intersectsNode(document.getElementById("a2"));
shouldBeTrue("intersects");
debug("");

debug("1.10 Node starts after range end and ends after range end");
range.selectNode(document.getElementById("b2"));
intersects = range.intersectsNode(document.getElementById("c3"));
shouldBeFalse("intersects");
debug("");

debug("1.11 Node starts before range start and ends after range end");
range.selectNode(document.getElementById("b2"));
intersects = range.intersectsNode(document.getElementById("a2"));
shouldBeTrue("intersects");
debug("");

debug("1.12 Node starts before range start and range begins and ends on 1");
range.setEnd(document.getElementById("c2"), 1);
range.setStart(document.getElementById("c2"), 1);
intersects = range.intersectsNode(document.getElementById("c2"));
shouldBeTrue("intersects");
debug("");

debug("1.13 Range starts at 0 and ends at 1");
range.setStart(document.getElementById("b2"), 0);
range.setEnd(document.getElementById("b2"), 1);
intersects = range.intersectsNode(document.getElementById("b2"));
shouldBeTrue("intersects");
debug("");

debug("2.1 Detached Range, attached node");
var detachedRange = document.createRange();
detachedRange.detach(); // no-op.
shouldBeFalse("detachedRange.intersectsNode(document.getElementById('a1'))");
debug("");

debug("2.2 attached range, detached node");
// firefox does not throw an exception but returns 0
range.selectNode(document.getElementById("a1"));
var node = document.getElementById("b1");
node.parentNode.removeChild(node);
intersects = range.intersectsNode(node);
shouldBeFalse("intersects");
debug("");

debug("2.3 Node has no parent");
range.selectNode(document.getElementById("a2"));
shouldBeTrue("range.intersectsNode(document)");
debug("");

debug("2.4 Range has no parent");
shouldThrow("range.selectNode(document)");
debug("");

debug("2.5 Wrong documents");
// firefox does not throw an exception here instead it returns 0
var src1 = "<html>\n<head>\n<body>\n<div id=f1>f1</div>\n</body>\n</head>\n<html>";
window.frames['frame1'].document.open("text/html", "replace");
window.frames['frame1'].document.write(src1);
window.frames['frame1'].document.close();

var src2 = "<html>\n<head>\n<body>\n<div id=f2>f2</div>\n</body>\n</head>\n<html>";
window.frames['frame2'].document.open("text/html", "replace");
window.frames['frame2'].document.write(src2);
window.frames['frame2'].document.close();

var framerange = window.frames['frame1'].document.createRange();    
var F1Div = window.frames['frame1'].document.getElementById("f1");
framerange.selectNode(F1Div);
    
intersects =framerange.intersectsNode(window.frames['frame2'].document.getElementById("f2"));
shouldBeFalse("intersects");
debug("");

debug("2.6 Node deleted");
range.selectNode(document.getElementById("a2"));
var node = null;
shouldThrow("range.intersectsNode(node)");
debug("");
    
if (window.testRunner)
    testRunner.dumpAsText();
