var ajaxValidate = function (formObj,sUrl,div,showSummary, outline) {
	var formArgs = ['foo','bar','ddd'];

	var formResponseSuccess = function(o){

		if (processValidationResult(o.responseXML, div, showSummary, formObj, outline))
		{
			if (formObj.is_valid)
			{
				removeValidations(formObj)
				formObj.is_valid.value = 'true';
			}
			formObj.submit();
		}
	};

	var formResponseFailure = function(o){
	};

	var formCallback =
	{
	  success:formResponseSuccess,
	  failure:formResponseFailure,
	  argument:formArgs
	};
	YAHOO.util.Connect.setForm(formObj);
	var transaction = YAHOO.util.Connect.asyncRequest('POST', sUrl, formCallback);
}

var ajaxValidateSingle = function (elem,sUrl,validElems, outline) {
	var formArgs = ['foo','bar','ddd'];

	var formResponseSuccess = function(o){
		if (outline)
		{
			if (elem.parentNode.className == "error_box")
			{
				elem.parentNode.className = "no_error_box";
			}
		}

		for (var i = 0; i < validElems.length; i++)
		{
			var error_elem_id = validElems[i];
			if (document.getElementById('div_'+error_elem_id))
			{
				document.getElementById('div_'+error_elem_id).parentNode.removeChild(document.getElementById('div_'+error_elem_id));
				
			}
		}
		if (o.responseXML)
		{
			var errors = o.responseXML.getElementsByTagName('error');
		}
		if (errors && errors.length > 0)
		{
			for (i=0; i < errors.length; i++)
			{
				var error_elem_id = errors[i].getElementsByTagName('element')[0].childNodes[0].nodeValue;
				var error_elem = elem.form.elements[error_elem_id];
				//var error_elem = document.getElementById(error_elem_id);
				var newDiv = document.createElement('div');
				newDiv.id = 'div_'+error_elem_id;
				newDiv.className = "error";

				var newTxt = document.createTextNode(errors[i].getElementsByTagName('message')[0].childNodes[0].nodeValue);
				newDiv.appendChild(newTxt);
				if (outline)
				{
					if (elem.parentNode.className == "no_error_box")
					{
						elem.parentNode.className = "error_box";
					}
				}
				error_elem.parentNode.insertBefore(newDiv, error_elem);
				//error_elem.outerHTML = error_elem.outerHTML + newDiv.outerHTML;
			}
			return false;
		}
		else
		{
			return true;
		}
	};

	var formResponseFailure = function(o){
	};

	var formCallback =
	{
	  success:formResponseSuccess,
	  failure:formResponseFailure,
	  argument:formArgs
	};
	var validationString = '';
	for (var i = 0; i < validElems.length; i++)
	{
		validElemID = validElems[i];
		var validElem = elem.form.elements[validElemID];
		if (validElem)
		{
			validationString += '&' + validElem.name + '=' + escape(validElem.value)
		}
	}
	var post_data = elem.name + '=' + escape(elem.value) + validationString ;
	var transaction = YAHOO.util.Connect.asyncRequest('POST', sUrl, formCallback, post_data);
}

function processValidationResult( xml, div, showSummary, frm, outline )
{
	if(div.innerHTML)
		div.innerHTML = "";
	clearAllMessages(frm);
	if (!xml)
	{
		return true;
	}
	var errors = xml.getElementsByTagName('error');
	if (errors.length > 0)
	{
		for (i=0; i < errors.length; i++)
		{
			var error_elem_id = errors[i].getElementsByTagName('element')[0].childNodes[0].nodeValue;
			//var error_elem = document.getElementById(error_elem_id);
			//var error_elem = eval("document."+frm.getAttributeNode('id').nodeValue+".elements['"+error_elem_id+"']");
			//alert(error_elem_id + ' ' + frm.elements[error_elem_id] );
			var error_elem = frm.elements[error_elem_id];
			var newDiv = document.createElement('div');
			newDiv.id = 'div_'+error_elem_id;
			newDiv.className = "error";
			var newTxt = document.createTextNode(errors[i].getElementsByTagName('message')[0].childNodes[0].nodeValue);
			newDiv.appendChild(newTxt);
			if (showSummary == true) {
				div.appendChild(newDiv);
			} else {
				error_elem.parentNode.insertBefore(newDiv, error_elem);
				if (outline) {
					if (error_elem.parentNode.className == "no_error_box") {
						error_elem.parentNode.className = "error_box";
					}
				}
				//error_elem.outerHTML = error_elem.outerHTML + newDiv.outerHTML;
			}
		}
		return false;
	}
	else
	{
		return true;
	}
}

function clearAllMessages(frm)
{
	for (var i=0; i< frm.elements.length ; i++)
	{
		if (frm.elements[i].type == 'hidden')
		{
			if (frm.elements[i].id && document.getElementById('div_'+frm.elements[i].id))
			{
				var tmpDiv = document.getElementById('div_'+frm.elements[i].id);
				tmpDiv.parentNode.removeChild(tmpDiv);
			}
		}
	}
}

function removeValidations(frm)
{
	var REValid = /^valid_.*$/;
	for (var i=0; i< frm.elements.length ; i++)
	{
		if (frm.elements[i].type == 'hidden')
		{
			if (REValid.test(frm.elements[i].id))
			{
				frm.elements[i].parentNode.removeChild(frm.elements[i]);
			}
		}
	}

	//second check for array variables
	for (var i=0; i< frm.elements.length ; i++)
	{
		if (frm.elements[i].type == 'hidden')
		{
			if (REValid.test(frm.elements[i].id))
			{
				frm.elements[i].parentNode.removeChild(frm.elements[i]);
			}
		}
	}

}

function getElementOfForm(frm, element_id)
{
	for (var i=0;i < frm.childNodes.length ; i++ )
	{
		var tmpNode = frm.childNodes[i];
		alert(tmpNode.id);
		if (tmpNode.id == element_id)
		{
			return tmpNode;
		} else {
			return getElementOfForm(tmpNode, element_id);
		}
	}
}
