var focusClassNameSuffix = "Focus";
var labelTagName = "LABEL";
var firstItem;

function onLoad()
{
	document.body.onkeypress = onKeyPress;
	
	setupFocusEventHandlers();
	setupFeatureEventHandlers();
	setupCommentsEventHandlers();
	
	if (firstItem != null)
	{
		if (firstItem.value == "")
		{
			firstItem.value = "Type your responses here";
		}
		firstItem.focus();
	}
}

function onKeyPress(e)
{
	if (!e)
	{
		if (event)
		{
			e = event;
		}
	}
	
	return (e.keyCode != 13);
}

function setupFocusEventHandlers()
{
	var inputClasses = ["text", "radio", "number", "checkbox", "editableOption"];
	addFocusEventHandlers("input", inputClasses);
	
	var aClasses = ["addFeature", "removeFeature"];
	addFocusEventHandlers("a", aClasses);
	
	var textareaClasses = ["comments"];
	addFocusEventHandlers("textarea", textareaClasses);
}

function addFocusEventHandlers(tagName, classList)
{
	var nodeList = document.getElementsByTagName(tagName);
	
	for (var i = 0; i < nodeList.length; i++)
	{
		var className = nodeList[i].className;
		for (var j = 0; j < classList.length; j++)
		{
			if (className == classList[j])
			{
				nodeList[i].onfocus = onFocus;
				nodeList[i].onblur = onBlur;
			}
		}
	}
}

function setupFeatureEventHandlers()
{
	var nodeList = document.getElementsByTagName("a");
	
	for (var i = 0; i < nodeList.length; i++)
	{
		if (nodeList[i].className == "addFeature")
		{
			nodeList[i].onclick = onAddFeature;
		}
		if (nodeList[i].className == "removeFeature")
		{
			nodeList[i].onclick = onRemoveFeature;
		}
	}
}

function setupCommentsEventHandlers()
{
	var nodeList = document.getElementsByTagName("a");
	
	for (var i = 0; i < nodeList.length; i++)
	{
		if (nodeList[i].className == "comments")
		{
			nodeList[i].onclick = onAddComments;
		}
	}
}

/**
 * Event handler for when an element is focused.
 * 
 */
function onFocus()
{
	highlightLabeledElement(this);
}

function onBlur()
{
	var elem = this;
	dehighlightLabeledElement(elem);
	
	//if the element being blurred is a comments textarea, call the handler
	if (elem.nodeName.toLowerCase() == "textarea" && elem.className == "comments")
	{
		onBlurComments(elem);
	}
}

function highlightLabeledElement(elem)
{
	elem.className += focusClassNameSuffix;
	if (elem.parentNode.nodeName == labelTagName)
	{
		elem.parentNode.className += focusClassNameSuffix;
	}
	
	//Select the text if it is a textbox or textarea
	if ((elem.type == "text") || (elem.type == "textarea"))
	{
		elem.select();
	}
}

function dehighlightLabeledElement(elem)
{
	var normalClass = elem.className.substr(0, (elem.className.length - focusClassNameSuffix.length));
	var normalParentClass = elem.parentNode.className.substr(0, (elem.parentNode.className.length - focusClassNameSuffix.length)); 
	
	elem.className = normalClass;
	if (elem.parentNode.nodeName == labelTagName)
	{
		elem.parentNode.className = normalParentClass;
	}
}

function onAddFeature(e)
{
	var parent = this.parentNode;
	if (parent.nodeName == labelTagName)
	{
		var textbox = document.getElementById(parent.htmlFor);
		var num = parseInt(textbox.value, 10);
		if (isNaN(num))
			num = 0;
		num++;
		textbox.value = num;
	}
	return cancelEvent(e);
}

function onRemoveFeature(e)
{
	var parent = this.parentNode;
	if (parent.nodeName == labelTagName)
	{
		var textbox = document.getElementById(parent.htmlFor);
		var num = parseInt(textbox.value, 10);
		if (isNaN(num))
		{
			num = 0;
		}	
		num--;
		if (num < 0)
		{
			num = 0;
		}
			
		if (num == 0)
		{
			textbox.value = "";
		}
		else
		{
			textbox.value = num;
		}
	}
	return cancelEvent(e);
}

function onAddComments(e)
{
	var parent = this.parentNode;
	if (parent.nodeName == labelTagName)
	{
		var commentsbox = document.getElementById(parent.htmlFor);
		commentsbox.style.display = "inline";
		commentsbox.focus();
	}

	return cancelEvent(e);
}

function onBlurComments(commentsbox)
{
	if (commentsbox.value == "")
	{
		commentsbox.style.display = "none";
	}
}

function cancelEvent(e)
{
	if (window.event)
	{
		e = window.event;
	}
	e.returnValue = false;
	e.cancelBubble = true;
	if (e.preventDefault)
	{
		e.preventDefault();
		e.stopPropagation();
	}
	return false;
}
