var resultsHead, resultsBody, nodeName = "nodeName";

// HTML 5 Shiv
// http://ejohn.org/blog/html5-shiv/
document.createElement("section");
document.createElement("SECTION");

window.onload = function(){
	resultsHead = document.getElementById("results-head");
	resultsBody = document.getElementById("results-body");

	if ( location.search ) {
		nodeName = (location.search + "").slice(1);
	}

	runTest("HTML", function(){
		return document.getElementById("test").childNodes;
	});

	runTest("HTML createElement", function(){
		return [
			document.createElement("div"),
			document.createElement("DIV"),
			document.createElement("section"),
			document.createElement("SECTION")
		];
	});

	runTest("innerHTML", function(){
		var test = document.getElementById("test");
		test.innerHTML = "<div></div><DIV></DIV><section></section><SECTION></SECTION>";
		return test.childNodes;
	});

	var xhr = window.XMLHttpRequest? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

	xhr.open("GET", "test.xml", false);
	xhr.send(null);

	var xml = xhr.responseXML;

	runTest("XML", function(){
		return xml.documentElement.childNodes;
	});

	runTest("XML createElement", function(){
		return [
			xml.createElement("div"),
			xml.createElement("DIV"),
			xml.createElement("section"),
			xml.createElement("SECTION")
		];
	});

	runTest("HTML via importNode", function(){
		var test = document.getElementById("test");
		while ( test.firstChild ) {
			test.removeChild( test.firstChild );
		}

		var nodes = xml.documentElement.childNodes, node;
		for ( var i = 0; i < nodes.length; i++ ) {
			node = document.importNode( nodes[i], false );
			test.appendChild( node );
		}

		return test.childNodes;
	});

	runTest("HTML via adoptNode", function(){
		var test = document.getElementById("test");
		while ( test.firstChild ) {
			test.removeChild( test.firstChild );
		}

		var nodes = xml.documentElement.childNodes, node;
		while ( nodes.length ) {
			node = document.adoptNode( nodes[0] );
			test.appendChild( node );
		}

		return test.childNodes;
	});

	xhr = window.XMLHttpRequest? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

	xhr.open("GET", "xhtml.xml", false);
	xhr.send(null);

	xml = xhr.responseXML;

	runTest("XML (XHTML)", function(){
		return xml.getElementsByTagName("div")[0].childNodes;
	});

	runTest("XHTML via importNode", function(){
		var test = document.getElementById("test");
		while ( test.firstChild ) {
			test.removeChild( test.firstChild );
		}

		var nodes = xml.getElementsByTagName("div")[0].childNodes, node;
		for ( var i = 0; i < nodes.length; i++ ) {
			node = document.importNode( nodes[i], false );
			test.appendChild( node );
		}

		return test.childNodes;
	});

};

function runTest(name, fn){
	var results, tr = document.createElement("tr"), td, result, contains,
		check, th = document.createElement("th"), htmlContains;

	th.appendChild( document.createTextNode( name ) );
	tr.appendChild( th );

	try {
		results = fn();

		for ( var i = 0; i < results.length; i++ ) {
			result = results[i][ nodeName ];
			check = resultsHead.childNodes[i + 1].firstChild.nodeValue;
			contains = check.indexOf( result ) > -1;
			htmlContains = check.toUpperCase().indexOf( result ) > -1;

			td = document.createElement("td");
			td.className = (isXML( document ) ? contains : name.indexOf("XML") < 0 && htmlContains || name.indexOf("XML") > -1 && contains) ? "pass" : "fail";
			td.appendChild( document.createTextNode( result ) );
			tr.appendChild( td );
		}
	} catch(e) {
		td = document.createElement("td");
		td.colSpan = "4";
		td.className = "error";
		td.appendChild( document.createTextNode( "Error: " + e.message ) );
		tr.appendChild( td );
	}

	resultsBody.appendChild( tr );
}

function isXML( elem ) {
	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
	return documentElement ? documentElement.nodeName !== "HTML" : false;
}
