<?xml version="1.0"?>

<!-- Work done for Netscape.  Public domain. -->

<?xml-stylesheet type="text/css" href="../base.css" ?>
<?xml-stylesheet type="text/css" href="../basexml.css" ?>
<?xml-stylesheet type="text/css" href="NamedNodeMap_style" ?>
<!--DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/strict.dtd"-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<title>DOM Test Suite: Interface Element</title>
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link rel="copyright" href="http://dbaron.org/legal.html" />
<link rel="stylesheet" type="text/css" href="../base.css" />
<script type="text/javascript" src="../base.js" />
<script type="text/javascript"><![CDATA[

function testElement() {
	if ( ! ( canOutputWarn() &&
	         existsWarn("document") &&
	         existsWarn("document.getElementsByTagName")
	       )) {
		return;
	}

	divouter = document.getElementsByTagName("div").item(1);

	outTaggedText("header", "Testing getElementsByTagName:");

	shouldBe("divouter.getElementsByTagName('input').length", "0");

	elemlist = divouter.getElementsByTagName("div");

	shouldBe("elemlist.length", "3");
	shouldBe("elemlist.item(0).getAttribute('id')", '"middle"');
	shouldBe("elemlist.item(1).getAttribute('id')", '"inner"');
	shouldBe("elemlist.item(2).getAttribute('id')", '"secondinner"');

	newdiv = document.createElement("div");
	newdiv.appendChild(document.createTextNode("This is the inserted div."));
	elemlist.item(0).insertBefore(newdiv, elemlist.item(2));
	shouldBe("elemlist.length", "4");
	shouldBe("elemlist.item(2)", "newdiv");
	shouldBe("elemlist.item(3).getAttribute('id')", '"secondinner"');
	shouldBe("elemlist.item(4)", "null");

	shouldBe("document.getElementsByTagName('html').item(0)", "document.documentElement");
	shouldBe("document.documentElement.getElementsByTagName('html').length", "0");

	outTaggedText("header", "Testing (get|set|remove)Attribute(|Node):");

	// TEST THAT setAttribute, setAttributeNode, removeAttribute, and
	// removeAttributeNode have desired effect on attributes.length
	// (even when attributes not retrieved again)

	tableElem=document.getElementsByTagName("table").item(0);
	attrs = tableElem.attributes;

	shouldBe("tableElem.getAttribute('class')", '"myclass"');
	shouldBe("attrs.length", "3");
	shouldBe("attrs.getNamedItem('class').value", '"myclass"');
	shouldBe("tableElem.getAttributeNode('class').value", '"myclass"');
	tableElem.removeAttribute("class");
	shouldBe("tableElem.getAttribute('class')", '""');
	shouldBe("attrs.getNamedItem('class')", "null");
	if (attrs.getNamedItem('class')) { // Mozilla SeaMonkey
		report("attrs.getNamedItem('class').value");
	}
	shouldBe("tableElem.getAttributeNode('class')", "null");
	shouldBe("attrs.length", "2");

	shouldBe("tableElem.getAttribute('id')", '""');
	shouldBe("attrs.getNamedItem('id')", "null");
	shouldBe("tableElem.getAttributeNode('id')", "null");
	tableElem.setAttribute("id", "myid");
	shouldBe("attrs.length", "3");
	shouldBe("tableElem.getAttribute('id')", '"myid"');
	shouldBe("attrs.getNamedItem('id').value", '"myid"');
	shouldBe("tableElem.getAttributeNode('id').value", '"myid"');

	shouldBe("tableElem.getAttribute('cellpadding')", "7");
	shouldBe("attrs.getNamedItem('cellpadding').value", "7");
	shouldBe("tableElem.getAttributeNode('cellpadding').value", "7");
	shouldBe("tableElem.removeAttributeNode(tableElem.getAttributeNode('cellpadding')).value", "7");
	shouldBe("attrs.length", "2");
	shouldBe("tableElem.getAttribute('cellpadding')", '""');
	shouldBe("attrs.getNamedItem('cellpadding')", "null");
	shouldBe("tableElem.getAttributeNode('cellpadding')", "null");

	shouldBe("tableElem.getAttribute('border')", "3");
	shouldBe("attrs.getNamedItem('border').value", "3");
	shouldBe("tableElem.getAttributeNode('border').value", "3");
	newAttr = document.createAttribute('border');
	newAttr.value = "12";
	shouldBe("tableElem.setAttributeNode(newAttr).value", "3");
	shouldBe("attrs.length", "2");
	shouldBe("tableElem.getAttribute('border')", "12");
	shouldBe("attrs.getNamedItem('border').value", "12");
	shouldBe("tableElem.getAttributeNode('border').value", "12");

	shouldBe("tableElem.getAttribute('lang')", '""');
	shouldBe("attrs.getNamedItem('lang')", "null");
	shouldBe("tableElem.getAttributeNode('lang')", "null");
	newAttr = document.createAttribute('lang');
	newAttr.value = "en";
	shouldBe("tableElem.setAttributeNode(newAttr)", "null");
	shouldBe("attrs.length", "3");
	shouldBe("tableElem.getAttribute('lang')", '"en"');
	shouldBe("attrs.getNamedItem('lang').value", '"en"');
	shouldBe("tableElem.getAttributeNode('lang').value", '"en"');

	shouldBe("tableElem.getAttribute('onclick')", '""');
	shouldBe("attrs.getNamedItem('onclick')", "null");
	shouldBe("tableElem.getAttributeNode('onclick')", "null");
	newAttr = document.createAttribute('onclick');
	newAttr.value = "";
	shouldBe("tableElem.setAttributeNode(newAttr)", "null");
	shouldBe("attrs.length", "4");
	shouldBe("tableElem.getAttribute('onclick')", '""');
	shouldBe("attrs.getNamedItem('onclick').value", '""');
	shouldBe("tableElem.getAttributeNode('onclick').value", '""');

	shouldBe("tableElem.getAttribute('summary')", '""');
	shouldBe("attrs.getNamedItem('summary')", "null");
	shouldBe("tableElem.getAttributeNode('summary')", "null");
	tableElem.setAttribute("summary", "");
	shouldBe("attrs.length", "5");
	shouldBe("tableElem.getAttribute('summary')", '""');
	shouldBe("attrs.getNamedItem('summary').value", '""');
	shouldBe("tableElem.getAttributeNode('summary').value", '""');

	report("attrs.item(0).name");
	report("attrs.item(1).name");
	report("attrs.item(2).name");
	report("attrs.item(3).name");
	report("attrs.item(0).value");
	report("attrs.item(1).value");
	report("attrs.item(2).value");
	report("attrs.item(3).value");
	shouldBe("attrs.item(0).name", "attrs.item(0).nodeName");
	shouldBe("attrs.item(1).name", "attrs.item(1).nodeName");
	shouldBe("attrs.item(2).name", "attrs.item(2).nodeName");
	shouldBe("attrs.item(3).name", "attrs.item(3).nodeName");
	shouldBe("attrs.item(0).value", "attrs.item(0).nodeValue");
	shouldBe("attrs.item(1).value", "attrs.item(1).nodeValue");
	shouldBe("attrs.item(2).value", "attrs.item(2).nodeValue");
	shouldBe("attrs.item(3).value", "attrs.item(3).nodeValue");

	outText("There should be a line reading 'This is the inserted div.' between");
	outText("'another div' and 'and another div'.");
	outText("The table should have changed from purple to green, its");
	outText("cellpadding from seven to the default, its border from 3");
	outText("to 12, and its language should now be set as 'en' ( if you");
	outText("can tell :-).");

	outTaggedText("header", "Tests finished.");

}

]]></script>
</head>
<body>
<h1>DOM Test Suite: Interface <a href="http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html">Element</a></h1>

<p>
	The normalize() method is tested in the test for <a
	href="Text">Text</a> and the <a href="CDATASection">first</a> and
	<a href="CDATASection_2">second</a> tests for CDATASection.
</p>

<div>
	<input type="button" onclick="testElement()" value="test Element" />
</div>

<h2>Testing area</h2>

<div id="outer">

	<p>This is a paragraph.</p>

	<div id="middle">And this is another div, with...
		<div id="inner">another div</div>
		<div id="secondinner">and another div</div>
	inside it.</div>

<table class="myclass" border="3" cellpadding="7">
	<tr>
		<td>
			Data
		</td>
		<td>
			Data
		</td>
		<td>
			Data
		</td>
	</tr>
	<tr>
		<td>
			Data
		</td>
		<td>
			Data
		</td>
		<td>
			Data
		</td>
	</tr>
	<tr>
		<td>
			Data
		</td>
		<td>
			Data
		</td>
		<td>
			Data
		</td>
	</tr>
</table>

</div>

<div id="output">
<h2>Output:</h2>

</div>

<hr title="Beginning of Footer" />
<p>(Back to
<a href="../">DOM Testing Information</a>,
<a href="../../../">David Baron</a>)</p>
<p><a href="/" title="David Baron's Homepage">LDB</a>,
<a rev="made" href="mailto:dbaron@fas.harvard.edu" title="Send e-mail to David Baron">dbaron@fas.harvard.edu</a></p>

</body></html>
