/*
ShadowValidation
Written by: � Shadow Wizard, 2006
*/

function validate(frmObj) {
	
	try {
	var arrValidated=new Array();
	var frmOk=true; // assume all is well
	for (var i=0; i<frmObj.elements.length; i++) {
		var element=frmObj.elements[i];
		var elName=element.name;
		if ((!elName)||(elName.length == 0)||(arrValidated[elName]))
			continue;

		// when validation is complete if there form not ok
		if(!frmOk && i==(frmObj.elements.length-1)) return false;
		
		arrValidated[elName] = true;
		var validationType = element.getAttribute("class");
		if ((!validationType)||(validationType.length == 0))
			continue;
		var msg=element.getAttribute("msg");
		if (!msg) msg = "";
		var arrMessages = msg.split("|");
		var arrValidationTypes = validationType.split("|");
		for (var j=0; j<arrValidationTypes.length; j++) {
			var curValidationType = arrValidationTypes[j];
			var fldOk=true;
			switch (curValidationType) {
				case "not_empty":
					fldOk = _NotEmpty(element); break;
				case "integer":
					fldOk = _Integer(element); break;
				case "phone_number":
					fldOk = _PhoneNumber(element); break;
				case "number":
					fldOk = _Number(element); break;
				case "email":
					fldOk = _Email(element); break;
				case "alphabet":
					fldOk = _AlphaBet(element); break;
				default:
					try {
						fldOk = eval(curValidationType+"(element)");
					}
					catch (ex) {
						fldOk = true;
					}
			}
			if (fldOk == false) {
				frmOk = false;
				var message="invalid value for "+element.name;
				if ((j < arrMessages.length)&&(arrMessages[j].length > 0))
					message = arrMessages[j];
				setError(element, message);
				if ((typeof element.focus == "function")||(element.focus)) {
					element.focus();
				}
				//
				
			}
			else {
				unsetError(element);
			}
		}
		
	}
	
	return frmOk;
	} catch (e) {
		alert ('err '+e);
	}
}

function _NotEmpty(objElement) {
	var strValue = GetElementValue(objElement);
	return (strValue.length > 0);
}

function _Integer(objElement) {
	var strValue = GetElementValue(objElement);
	return (!isNaN(parseInt(strValue)));
}

function _PhoneNumber(objElement) {
	var regex=/^[ 0-9()-]+$/;
	return (regex.test(objElement.value));
}
function _Number(objElement) {
	var strValue = GetElementValue(objElement);
	return (!isNaN(parseFloat(strValue)));
}

function _Email(objElement) {
	var strValue = GetElementValue(objElement);
	if (strValue.length < 5)
		return false;
	var arrTemp=strValue.split("@");
	if (arrTemp.length != 2)
		return false;
	var strLeftPart = arrTemp[0];
	var strRightPart = arrTemp[1];
	if ((strLeftPart.length == 0)||(strRightPart.length == 0))
		return false;
	arrTemp = strRightPart.split(".");
	if (arrTemp.length < 2)
		return false;
	for (var i=0; i<arrTemp.length; i++) {
		if (arrTemp[i].length == 0)
			return false;
	}
	return true;
}

function _AlphaBet(objElement) {
	var strValue = GetElementValue(objElement);
	
	if (strValue.length == 0)
		return true;
	
	var strAllowOnly = objElement.getAttribute("allow_only");
	if (!strAllowOnly)
		strAllowOnly = "";
	
	if (strAllowOnly.length == 0)
		return true;
	
	var i=0;
	var arrAllowedChars=new Array();
	while (i < strAllowOnly.length) {
		if ((i < (strAllowOnly.length-2)) && (strAllowOnly.substr(i+1, 2) == "..")) {
			for (var j=strAllowOnly.charCodeAt(i); j<=strAllowOnly.charCodeAt(i+3); j++) {
				arrAllowedChars[arrAllowedChars.length] = String.fromCharCode(j);
			}
			i += (2*2);
			continue;
		}
		arrAllowedChars[arrAllowedChars.length] = strAllowOnly.charAt(i)+"";
		i++;
	}
	
	for (var i=0; i<strValue.length; i++)
		if (InArray(arrAllowedChars, strValue.substr(i, 1)) < 0)
			return false;
	
	return true;
}

function GetElementValue(objElement) {
	var result="";
	switch (objElement.type) {
		case "text":
		case "hidden":
		case "textarea":
		case "password":
			result = objElement.value;
			break;
		case "select-one":
		case "select":
			if (objElement.selectedIndex >= 0)
				result = objElement.options[objElement.selectedIndex].value;
			break;
		case "radio":
		case "checkbox":
			for (var i=0; i<objElement.form.elements.length; i++) {
				if (objElement.form.elements[i].name == objElement.name) {
					if (objElement.form.elements[i].checked)
						result += objElement.form.elements[i].value+",";
				}
			}
			break;
	}
	return result;
}

function setError(element, strMessage) {
	if ((element.form.getAttribute("show_alert")) && (element.form.getAttribute("show_alert") != "0")) {
		alert(strMessage);
		return;
	}
	var errDiv = GetErrorContainerID(element);
	var objSpan = document.getElementById(errDiv);
	if (!objSpan) {
		if ((element.type == "radio")||(element.type == "checkbox")) {
			for (var i=0; i<element.form.elements.length; i++) {
				if (element.form.elements[i].name == element.name) {
					element = element.form.elements[i];
				}
			}
		}
		objSpan = document.createElement("div");
		objSpan.id = errDiv;
		var nodeAfter=0;
		var nodeParent = element.parentNode;
		for (var i=0; i<nodeParent.childNodes.length; i++) {
			if (nodeParent.childNodes[i] == element) {
				if (i < (nodeParent.childNodes.length-1))
					nodeAfter = nodeParent.childNodes[i+1];
				break;
			}
		}
		if ((!nodeAfter)&&(nodeParent.parentNode)) {
			nodeParent = nodeParent.parentNode;
			for (var i=0; i<nodeParent.childNodes.length; i++) {
				if (nodeParent.childNodes[i] == element.parentNode) {
					if (i < (nodeParent.childNodes.length-1))
						nodeAfter = nodeParent.childNodes[i+1];
					break;
				}
			}
		}
		if (nodeAfter)
			nodeParent.insertBefore(objSpan, nodeAfter);
		else
			document.body.appendChild(objSpan);
	}
	if (objSpan.className.length == 0)
		objSpan.className = "form_validation_error";
	objSpan.innerHTML = strMessage;
	// now highlight the box too
	element.className = "form_error";
}

function unsetError(element) {
	var errDiv = GetErrorContainerID(element);
	var objSpan = document.getElementById(errDiv);
	if (objSpan) {
		objSpan.innerHTML = "";
	}
}

function GetErrorContainerID(element) {
	var errDiv = element.getAttribute("error_container");
	if (!errDiv || errDiv.length == 0) {
		errDiv = element.name+"_val_error";
	}
	return errDiv;
}

function InArray(arr, key) {
	for (var i=0; i<arr.length; i++) {
		if (arr[i] == key) {
			return i;
		}
	}
	return -1;
}