function validatorElem(elem,name,theType,allowNULL)
{
		this.ref = elem;
		this.name = name;
		this.theType = theType;
		this.allowNULL = allowNULL;
}	
function validator()
{
		// (DATA)
		this.elements = new Array();
		this.funcs = new Object();
		this.alertFUNC = validatorAlertFunc;
		
		// (METHODS)
		this.addElement = validatorAddElement;
		this.addFunction = validatorAddFunction;
		this.setAlertFunction = validatorSetAlertFunction;
		this.validateForm = validatorValidate;
		this.autoValidate = validatorAutoValidateForm;
		this.getElementReference = validatorGetElementReference;
		this.getElementName = validatorGetElementName;
		
		// initializers
		this.funcs["DEFAULT"] = validatorNotNull;
		this.funcs["USERNAME"] = validatorUserName;
		this.funcs["EMAIL"] = validatorEmail;
		this.funcs["USMONEY"] = validatorUSMoney;
		this.funcs["POSITIVEINT"] = validatorISPOSINT;
		this.funcs["DECIMAL"] = validatorISDECIMAL;
		this.funcs["ZIP"] = validatorIsZip;
}

function validatorAddElement(elemObj,elemName)
{
	var sValidateType;
	var allowNULL;
	if (arguments.length>2)
{
		sValidateType = arguments[2];
		if ( (arguments.length>3)&&(arguments[3] == "ALLOWNULL") ) 
{
			allowNULL = true;
		}else
{
			allowNULL = false;
		}
	}else
{
		sValidateType = "DEFAULT";
		allowNULL = false;
	}
	this.elements[this.elements.length] = new validatorElem(elemObj,elemName,sValidateType,allowNULL);
}
function validatorAddFunction(oFunctionName, sConstantName)
{
	this.funcs[sConstantName] = oFunctionName;
}
function validatorSetAlertFunction(oFunctionName)
{
	this.alertFUNC = oFunctionName;
}
function validatorValidate()
{

	var iLen = this.elements.length;
	
	var counter;
	var aErrors  = new Array();
	var iCounter;
	var oTheFunction;
	var sFormElementValue;
	var sValidationType;
	var bAllowNull;
		
	for (iCounter=0; iCounter<iLen; iCounter++)
{
			sValidationType = this.elements[iCounter].theType;
			sFormElementValue = this.elements[iCounter].ref.value;
			oTheFunction = this.funcs[sValidationType];
			bAllowNull = this.elements[iCounter].allowNULL;
			
			// do check...
			if (
					( oTheFunction(sFormElementValue) != true )
											&&
					( 
						( bAllowNull && this.funcs["DEFAULT"](sFormElementValue) ) 
											|| 
						( !bAllowNull )
					)
				)
{
						aErrors[aErrors.length] = iCounter;		
			}// if	 
	}// for
	
	if (aErrors.length>0)
{
		return this.alertFUNC(aErrors);
			
	} else 
{
	
		return true;
	}
}
function validatorGetElementReference(iIndexOfElement)
{
	return this.elements[iIndexOfElement].ref;
}
function validatorGetElementName(indexOfElement)
{
	return this.elements[indexOfElement].name;
}

function validatorAutoValidateForm(formOBJ)
{
	
	var frmElements = formOBJ.elements;
	
	for (i=0; i<frmElements.length; i++)
{
		
			
		if ( frmElements[i].ValidationType ) 
{
		
				if ( frmElements[i].ValidationAllowNull && frmElements[i].ValidationAllowNull.toUpperCase()=="TRUE")
{
					this.addElement(frmElements[i], frmElements[i].ValidationName, frmElements[i].ValidationType.toUpperCase(),"ALLOWNULL");
				}else
{
					this.addElement(frmElements[i], frmElements[i].ValidationName, frmElements[i].ValidationType.toUpperCase());
				}
		}

	}
	return this.validateForm();
	
}	


function validatorISDECIMAL(theValue)
{

	hold = parseFloat(theValue);
	hold = hold.toString();
	if (  hold == theValue  )
{
		return true;
	}else
{
		return false;
	}
}
function validatorUserName(elementVal)
{
		var reg1str = "[^0-9a-zA-z]";
		var reg1 = new RegExp(reg1str);
		if (!reg1.test(elementVal) && elementVal.length>=6) 
{
			return true;
		} else 
{
			return false;
		}
}
function validatorISPOSINT(theValue)
{
	hold = parseInt(theValue);
	if (  hold.toString() == theValue && hold >= 0 )
{
		return true;
	}else
{
		return false;
	}

}
function validatorNotNull(str)
{
	
	if (str.length == 0 )
{
		return false;
	 }else
{
		 str=str.replace(/\s/gi,"");
		 if (str.length == 0 )
{
				return false;
			}else{
				return true;
		}
	 } 
}
function validatorUserName(elementVal)
{
		var reg1str = "[^0-9a-zA-z]";
		var reg1 = new RegExp(reg1str);
		if (!reg1.test(elementVal) && elementVal.length>=6) 
{
			return true;
		} else 
{
			return false;
		}
}
function validatorEmail(elementVal)
{
		var reg1str = "(@.*@)|(\\.\\.)|(@\\.)|(\\.@)|(^\\.)";
		var reg2str = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$";
		var reg1 = new RegExp(reg1str);
		var reg2 = new RegExp(reg2str);
		if (!reg1.test(elementVal) && reg2.test(elementVal)) 
{
			return true;
		} else 
{
			return false;
		}
}
function validatorIsZip(theValue) 
{
	
	var str = theValue;
	var hold = str.replace(/\D/gi,"");
	if (  hold == theValue && (hold.length==5 || hold.length==9 || hold.length==10 ) )
{
		return true;
	}else
{
		return false;
	}	
}
function validatorUSMoney(elementVal)
{
		var regExp = /^\$?\d*\.?\d?\d?$/;
		if(regExp.test(elementVal) && validatorNotNull(elementVal))
{
			return true;
		} else 
{
			return false;
		}
}
function validatorAlertFunc(aTheArray)
{
	var sStr = "";
	var iLen = aTheArray.length;
	var iCounter
	for (iCounter=0; iCounter<iLen; iCounter++)
{
		
		sStr = sStr + "\t- " + this.getElementName(aTheArray[iCounter])+ "\n";
	}
	
	sStr = "The following fields are required or have invalid input.\n\n" + sStr;
	alert(sStr);
	return false;		
}
