
// You need to include these in your asp/htm file
//  #include virtual="/includes/scripts/JS_StringHandler.js"
//  #include virtual="/includes/scripts/JS_Validation.js"
	
	// Allocate global vars
	var aFieldsToValidate = new Array();

	// Const types
	// - 'Type'
	var VALIDATE_TYPE_FIRST	= -1;	// *** MIN Value Check ***
	var VALIDATE_TYPE_ANL	= 0;	// Alpha/Numeric & length
	var VALIDATE_TYPE_AL	= 1;		// Alpha & length
	var VALIDATE_TYPE_NL	= 2;		// Numeric & length
	var VALIDATE_TYPE_Z5	= 3;		// Zip-Code 5 digits
	var VALIDATE_TYPE_Z9	= 4;		// Zip-Code 9 digits
	var VALIDATE_TYPE_EM	= 5;		// E-Mail
	var VALIDATE_TYPE_PH	= 6;		// Phone
	var VALIDATE_TYPE_SS	= 6;		// SSN
	var VALIDATE_TYPE_PV	= 7;		// Same as previous field
	var VALIDATE_TYPE_LAST	= 8;	// *** MAX Value Check ***

//======================================================================
//	FUNCTION:	Validator_ControlExists
// 
//	INPUT:  	sName  (string) - Name of the 'Form' control
//
//	RETURN: 	true  - control in validation list.
//				false - isn't.
//
//	DESC:		This function checks to see if this control already
//				exists in the list.
//
//======================================================================
	function Validator_ControlExists(csName)
	{
		var bRtrn = false;

		if (typeof(csName) == "string" &&
			aFieldsToValidate.length > 0)
		{
			var cWork1 = "";
			var nPos = -1;
			for (nItem = 0; nItem < aFieldsToValidate.length; nItem++)
			{
				var aItems = aFieldsToValidate[nItem].split(":")
		
				if (aItems[0] == csName)
				{
					bRtrn = true;
					break;
				}
			}
		}

		return (bRtrn);
	}

//======================================================================
//	FUNCTION:	Validator_AddControl
// 
//	INPUT:  	sName  (string)   - Name of the 'Form' control.
//			  	nType  (integer)  - Type of validation to process.
//	  			nMinLen (integer) - Minimum length.
//
//	RETURN: 	true  - added control to validation list.
//				false - didn't.
//
//	DESC:		This function add's a control to the validation list.
//
//======================================================================
	function Validator_AddControl(sName, nType, nMinLen)
	{
		var bRtrn = false;
	
		// Check for valid param types
		if (typeof(aFieldsToValidate) == "object" &&
			typeof(sName) == "string" &&
		    typeof(nType) == "number" &&
			typeof(nMinLen) == "number")
		{
			// - Check for valid param data
			if ((Trim(sName).length > 0) &&
				(nMinLen > -1) &&
				(nMinLen < 256) &&
				(nType > VALIDATE_TYPE_FIRST) &&
				(nType < VALIDATE_TYPE_LAST))
			{
				if (!Validator_ControlExists(sName))
				{
					// Format entries
					var csItemData = "";
				
					// -  item name
					csItemData += sName;
					csItemData += ":";
					// -  item type
					csItemData += NumToString(nType);
					csItemData += ":";
					// - minimum length
					csItemData += NumToString(nMinLen);
					csItemData += ":";

					// Add 'item'		
					aFieldsToValidate = aFieldsToValidate.concat(new Array(csItemData));

					bRtrn = true;		
				}
			}
		}

		return (bRtrn);
	}


//======================================================================
//	** Helper functions **
//======================================================================
	function _Validator_Error_Message(nCode, sFieldName, sPreviousString)
	{
		var sRtrn = "";

		// Check for valid param types
		if (typeof(nCode) == "number" &&
			typeof(sFieldName) == "string" &&
			typeof(sPreviousString) == "string")
		{
			sRtrn += sPreviousString;
			if (sRtrn.length > 0) sRtrn += "\n";

			switch (nCode)
			{
			case 1 :
				sRtrn += "'" + sFieldName + "' field contains invalid data.";
				break;
			case 2 :
				sRtrn += "'" + sFieldName + "' field requires more data.";
				break;
			default :
				sRtrn += "'" + sFieldName + "' - not supported validation type.";
				break;
			}
		}

		return (sRtrn);
	}

//======================================================================
//	FUNCTION:	Validator_ValidateControls
// 
//	INPUT:  	sFormName (string) - Name of the 'Form' to prcoess list
//									 against.
//
//	RETURN: 	true  - all controls are valid.
//				false - are't.
//
//	DESC:		This function add's a control to the validation list.
//
//======================================================================
	function Validator_ValidateControls(csFormName)
	{
		var bRtrn = false;

		if (typeof(csFormName) == "string" &&
			(aFieldsToValidate.length > 0) &&
			document.forms(csFormName) != null)
		{
			var sValue = "";
			var sMessage = "";
			var nMin = 0;

			bRtrn = true;	

			// Loop & validate
			for (nItem = 0; nItem < aFieldsToValidate.length; nItem++)
			{
				// - Split out all items
				var aItems = aFieldsToValidate[nItem].split(":")
		
				// - Get document data
				if (!IsNull(document.forms(csFormName).elements(aItems[0])))
				{
					sValue = Trim(document.forms(csFormName).elements(aItems[0]).value);
					nMin = parseInt(aItems[2]);	

					// - Validate data
					switch (parseInt(aItems[1]))
					{
					// Alpha/Numeric & length
					case VALIDATE_TYPE_ANL :
						{
							if ((nMin > 0) && (sValue.length < nMin))
							{
								bRtrn = false;
								sMessage = _Validator_Error_Message(2, aItems[0], sMessage);
							}
							else
							{
								if (!IsAlphaNum(sValue))
								{
									bRtrn = false;
									sMessage = _Validator_Error_Message(1, aItems[0], sMessage);
								}
							}
							break;
						}
					// Alpha & length
					case VALIDATE_TYPE_AL :
						{

							if ((nMin > 0) && (sValue.length < nMin))
							{
								bRtrn = false;
								sMessage = _Validator_Error_Message(2, aItems[0], sMessage);
							}
							else
							{
								if (!IsAlpha(sValue))
								{
									bRtrn = false;
									sMessage = _Validator_Error_Message(1, aItems[0], sMessage);
								}
							}
							break;
						}
					// Numeric & length
					case VALIDATE_TYPE_NL :
						{
							if ((nMin > 0) && (sValue.length < nMin))
							{
								bRtrn = false;
								sMessage = _Validator_Error_Message(2, aItems[0], sMessage);
							}
							else
							{
								if (!IsNum(sValue, false))
								{
									bRtrn = false;
									sMessage = _Validator_Error_Message(1, aItems[0], sMessage);
								}
							}
							break;
						}
					// Zip-Code 5 digits
					case VALIDATE_TYPE_Z5 :
						{
							if ((nMin > 0) && (sValue.length < nMin))
							{
								bRtrn = false;
								sMessage = _Validator_Error_Message(2, aItems[0], sMessage);
							}
							else
							{
								if (!IsValid5DigitZip(sValue))
								{
									bRtrn = false;
									sMessage = _Validator_Error_Message(1, aItems[0], sMessage);
								}
							}
							break;
						}
					// Zip-Code 9 digits
					case VALIDATE_TYPE_Z9 :
						{
							if ((nMin > 0) && (sValue.length < nMin))
							{
								bRtrn = false;
								sMessage = _Validator_Error_Message(2, aItems[0], sMessage);
							}
							else
							{
								if (!IsValid5Plus4DigitZip(sValue))
								{
									bRtrn = false;
									sMessage = _Validator_Error_Message(1, aItems[0], sMessage);
								}
							}
							break;
						}
					// E-Mail
					case VALIDATE_TYPE_EM :
						{
							if ((nMin > 0) && (sValue.length < nMin))
							{
								bRtrn = false;
								sMessage = _Validator_Error_Message(2, aItems[0], sMessage);
							}
							else
							{
								if (!IsValidEmail(sValue))
								{
									bRtrn = false;
									sMessage = _Validator_Error_Message(1, aItems[0], sMessage);
								}
							}
							break;
						}
					// Phone
					case VALIDATE_TYPE_PH :
						{
							if ((nMin > 0) && (sValue.length < nMin))
							{
								bRtrn = false;
								sMessage = _Validator_Error_Message(2, aItems[0], sMessage);
							}
							else
							{
								if (!IsValidPhone(sValue))
								{
									bRtrn = false;
									sMessage = _Validator_Error_Message(1, aItems[0], sMessage);
								}
							}
							break;
						}
					// SSN
					case VALIDATE_TYPE_SS :
						{
							if ((nMin > 0) && (sValue.length < nMin))
							{
								bRtrn = false;
								sMessage = _Validator_Error_Message(2, aItems[0], sMessage);
							}
							else
							{
								if (!IsValidSSN(sValue))
								{
									bRtrn = false;
									sMessage = _Validator_Error_Message(1, aItems[0], sMessage);
								}
							}
							break;
						}
					// Same as previous field
					case VALIDATE_TYPE_PV :
						{
							bRtrn = false;
							sMessage = _Validator_Error_Message(99, aItems[0], sMessage);
							break;
						}
					}
				}
			}

			// Display error message
			if (!bRtrn) alert(sMessage);
		}
		else
		{
			alert("(Invalid data) or (No controls) to validate!!");
		}

		return (bRtrn);
	}
