// begin of validation logic
function getParentForm(htmlElement) {
	while (htmlElement && htmlElement.tagName != "FORM")
	{
		htmlElement = htmlElement.parentNode;
	}
	return htmlElement;
}

function getParentTabLabel(htmlElement) {
	while (htmlElement && htmlElement.tagName != "A" && htmlElement.id && htmlElement.id.indexOf("TabLabel") == -1)
	{
		htmlElement = htmlElement.parentNode;
	}
	return htmlElement;
}

function getParentFormId(id) {
	var htmlElement = document.getElementById(id);
	while (htmlElement && htmlElement.tagName != "FORM")
	{
		htmlElement = htmlElement.parentNode;
	}

	return htmlElement ? htmlElement.id : null;
}

function registerRequired(controlId, parentFormId, required) {
	if (required)
	{
		var pushEl = {id: controlId, message: 'this field is required'};
		
		eval("form_" + parentFormId + "_requiredFields").push(pushEl);	
	}
}

function registerRange(controlId, parentFormId, required) {
	var pushEl = {id: controlId, isRequired: required, message: 'value is not valid'};
	eval("form_" + parentFormId + "_rangeFields").push(pushEl);
}
	
function registerNumeric(controlId, parentFormId, required) {
	var pushEl = {id: controlId, isRequired: required, message: 'number is not valid'};
	eval("form_" + parentFormId + "_numericFields").push(pushEl);
}

function registerEmail(controlId, parentFormId, required) {
	var pushEl = {id: controlId, isRequired: required, message: 'email is not valid'};

	eval("form_" + parentFormId + "_emailFields").push(pushEl);
}

function submitForm(formId, errorId, validateSuccess, validateError)
{
	var errorFields = eval("form_" + formId + "_errorFields");
	
	if (validateForm(formId, errorId)) {
		if (validateSuccess != null)
		{
			eval(validateSuccess());	
		}
		document.getElementById(formId).submit();
		return true;
	}
	else {
		if (validateError != null)
		{
			eval(validateError(errorFields));	
		}
		return false;
	}
}

function clearFormErrors(formId, errorId)
{
	var errors = document.getElementById(errorId);
	var errorFields = eval("form_" + formId + "_errorFields");
	
	// remove all error messages 
	while (errors.hasChildNodes())
	{
		errors.removeChild(errors.lastChild);
	}
	
	while (errorFields.length > 0)
	{
		errorFields.pop();	
	}
	// clear error labels
	clearErrorLabels(document.getElementById(formId));
	
	// hide error list
	errors.style.display = "none";
}

function validateForm(formId, errorId)
{
	var requiredFields = eval("form_" + formId + "_requiredFields");
	var numericFields = eval("form_" + formId + "_numericFields");
	var rangeFields = eval("form_" + formId + "_rangeFields");
	var emailFields = eval("form_" + formId + "_emailFields");
	var errorFields = eval("form_" + formId + "_errorFields");
	
	var errors = document.getElementById(errorId);
	
	clearFormErrors(formId, errorId);
	
	var valid = true;

	for (var i = 0; i < requiredFields.length; i++)
	{
		if (!checkRequired(requiredFields[i],errors))
		{
			errorFields.push(requiredFields[i].id);
			valid = false;
		}
	}
	for (var i = 0; i < numericFields.length; i++)
	{
		if (!checkNumeric(numericFields[i],errors))
		{
			errorFields.push(numericFields[i].id);
			valid = false;
		}
	}
	for (var i = 0; i < rangeFields.length; i++)
	{
		if (!checkRange(rangeFields[i],errors))
		{
			errorFields.push(rangeFields[i].id);
			valid = false;
		}
	}
	
	for (var i = 0; i < emailFields.length; i++)
	{
		if (!checkEmail(emailFields[i],errors))
		{
			errorFields.push(emailFields[i].id);
			valid = false;
		}
	}
	
	errors.style.display = valid ? "none" : "";
	
	return valid;
}

function isNumeric(input, required) {
   if (!input) { 
   		return !required; 
   }
   else {
   		return (input - 0) == input && input.length > 0;
   }
}

function isValidEmail(str, required) {
	if (!str) { 
		return !required; 
	}
	else {
		var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		
		return filter.test(str);
	}
}

function checkRequired(element,errors)
{
	var htmlElement = document.getElementById(element.id);
	if (!htmlElement.value)
	{
		mark(htmlElement,element,errors,true);
		return false;
	}
	mark(htmlElement,element,errors,false);
	return true;
}

function checkEmail(element,errors)
{
	var htmlElement = document.getElementById(element.id);
	
	if (!isValidEmail(htmlElement.value, element.isRequired))
	{
		mark(htmlElement,element,errors,true);
		return false;
	}
	mark(htmlElement,element,errors,false);
	return true;
}


function checkRange(element,errors)
{
	var htmlElement = document.getElementById(element.id);
	//TODO 
	var val = htmlElement.value;
	var pos = val.indexOf("-");
	if (pos == -1) // if we number one, then just check number
	{
		if (!isNumeric(htmlElement.value, element.isRequired))
		{
			mark(htmlElement,element,errors,true);
			return false;
		}
	}
	else
	{
		values = val.split("-");
		if (values.length == 2)
		{
			if (!isNumeric(values[0], element.isRequired) || !isNumeric(values[1], element.isRequired))
			{
				mark(htmlElement,element,errors,true);
				return false;
			} 
		}
		else
		{
			mark(htmlElement,element,errors,true);
			return false;
		}
	}
	mark(htmlElement,element,errors,false);
	return true;
}

function checkNumeric(element,errors)
{
	var htmlElement = document.getElementById(element.id);

	if (!isNumeric(htmlElement.value, element.isRequired))
	{
		mark(htmlElement,element,errors,true);
		return false;
	}
	mark(htmlElement,element,errors,false);
	return true;
}

function mark(htmlElement,element,errors,hasError)
{
	while (htmlElement.parentNode && htmlElement.parentNode.tagName != "TD")
	{
		htmlElement=htmlElement.parentNode;
	}
	if (htmlElement.parentNode){htmlElement=htmlElement.parentNode}
	while(htmlElement.previousSibling && htmlElement.previousSibling.tagName != "TD")
	{
		htmlElement=htmlElement.previousSibling;
	} 
	if (htmlElement.previousSibling){htmlElement=htmlElement.previousSibling}
	if (htmlElement)
	{
		var parentTabLabel = getParentTabLabel(htmlElement);
		if (parentTabLabel)
		{
			parentTabLabel.style.color = hasError ? "red" : "black";
		} 
		hasError
		htmlElement.className = hasError ? "errorLabel" : "tdLabel";
		if (hasError) {
			// put message to struts fielderror tag
			var errorItem = document.createElement("LI");
			var errorMessage = document.createElement("SPAN");
			
			var fieldName = "";
			
			if (htmlElement.firstChild && htmlElement.firstChild.firstChild) {
				fieldName = htmlElement.firstChild.firstChild.nodeValue + ": ";
			}
			
			errorMessage.className = "errorMessage";
			errorMessage.appendChild(document.createTextNode(fieldName + element.message));
			
			errorItem.appendChild(errorMessage);
			errors.appendChild(errorItem);
		}
	}
}
// end of validation logic