var form, refLink, didInit;

function initTest ()
{
	if (didInit)
	{
		return;
	}
	
	form = document.getElementById("main_form");
	
	if (form != null)
	{
		didInit = true;
	}
	
	var mTabs = document.createElement("ul");
	mTabs.id = "tabs";
	
	var tabDefaults = ["html", "css", "ecmascript"];
	
	var defaultTab = "html";
	
	for (var i=0; i < tabDefaults.length; i++)
	{
		var m = document.getElementById(tabDefaults[i]);
	
		if (m != undefined && m.value != "")
		{
			defaultTab = tabDefaults[i];
			break;
		}
	}
	
	var l = form.getElementsByTagName("fieldset");
	for (var i=0; i < l.length; i++)
	{
		var mFieldset = l.item(i);
		if (mFieldset.className == "tab")
		{
			mFieldset.className = (mFieldset.id == defaultTab+"_fieldset") ? "tab on" : "tab off";
			
			var mTab = document.createElement("li");
			mTab.id = mFieldset.id.split("_")[0]+"_tab";
			mTab.className = (mFieldset.id == defaultTab+"_fieldset") ? "on" : "off";
			addEvent(mTab, "click", tabSelect);
			mTab.appendChild(document.createTextNode(getTextContent(mFieldset.getElementsByTagName("legend").item(0))));
			mTabs.appendChild(mTab);
			
			mFieldset.removeChild(mFieldset.getElementsByTagName("legend").item(0));
		}
	}
	
	form.insertBefore(mTabs, form.getElementsByTagName("fieldset").item(0));
	
	// Validation.
	
	addEvent(document.getElementById("validate_html"), "click", validateMarkup);
	addEvent(document.getElementById("validate_css"), "click", validateCSS);
}

function tabSelect (e)
{
	var obj = e.target !== undefined ? e.target : e.srcElement !== undefined ? e.srcElement : this;
	if (obj.nodeType == 3)
	{
		obj = obj.parentNode;
	}
	
	var l = document.getElementById("tabs").getElementsByTagName("li");
	for (var i=0; i < l.length; i++)
	{
		l.item(i).className = "off";
	}
	obj.className = "on";
	
	l = document.getElementById("main_form").getElementsByTagName("fieldset");
	for (var i=0; i < l.length; i++)
	{
		l.item(i).className = "tab off";
	}
	document.getElementById(obj.id.split("_")[0]+"_fieldset").className = "tab on";
}

function checkLength (e)
{
	if (window !== undefined && window.alert !== undefined)
	{
		var total = 0;
		
		var l = ["html_type", "html", "css", "ecmascript"];
		
		for (var i in l)
		{
			total += document.getElementsByName(l[i]).item(0).value.length;
		}
		
		if (total >= 16384)
		{
			var kB = Math.round(total / 1024);
			
			window.alert("Your content is too long ("+kB+" kB). A maximum of 16 kB is allowed.\n\nPlease reduce your test case to help conserve bandwidth.");
			
			return false;
		}
	}
	
	return true;
}

function validateMarkup (e)
{
	var form, m;
	
	form = document.createElement("form");
	form.action = "http://validator.w3.org/check";
	form.method = "post";
	form.target = "test_frame";
	form.style.display = "none";
	
	m = document.createElement("input");
	m.type = "hidden";
	m.name = "fragment";
	m.value = document.getElementById("html").value;
	form.appendChild(m);
	
	document.body.appendChild(form);
	form.submit();
	document.body.removeChild(form);
	
	if (e.preventDefault)
	{
		e.preventDefault();
	}
	
	return false;
}

function validateCSS (e)
{
	var form, m;
	
	form = document.createElement("form");
	form.action = "http://jigsaw.w3.org/css-validator/validator";
	form.method = "post";
	form.target = "test_frame";
	form.enctype = "multipart/form-data";
	form.style.display = "none";
	
	m = document.createElement("input");
	m.type = "hidden";
	m.name = "text";
	m.value = document.getElementById("css").value;
	form.appendChild(m);
	
	document.body.appendChild(form);
	form.submit();
	document.body.removeChild(form);
	
	if (e.preventDefault)
	{
		e.preventDefault();
	}
	
	return false;
}

/* Stock functions */

function addEvent (obj, e, f)
{
	if (obj.addEventListener) // Standard method
	{
		obj.addEventListener(e, f, false);
	}
	else if (obj.attachEvent) // Trident
	{
		obj.attachEvent("on"+e, f);
	}
}

function getTextContent (obj)
{
	var content = "";
	
	if (obj.textContent) // Standard method
	{
		content = obj.textContent;
	}
	else // Fetch the text manually (KHTML, Presto, Trident)
	{
		var lChildren = obj.childNodes;
		for (var i=0; i < lChildren.length; i++)
		{
			var mChild = lChildren.item(i);
			if (mChild.hasChildNodes())
			{
				content += getTextContent(mChild);
			}
			else
			{
				content += mChild.data;
			}
		}
	}
	
	return content;
}

