var PatternsDict = new Object();
PatternsDict.zipPat = /(^$)|\d{5}(-\d{4})?/;
// matches zip codes

PatternsDict.requiredZip = /^\d{5}$|^\d{5}(-\d{4})$/;
// matches zip codes

PatternsDict.requiredEmail = /\b(^(\S+@).+((\.com)|(\.net)|(\.edu)|(\.mil)|(\.gov)|(\.org)|(\..{2,2}))$)\b/gi;

// original currency pattern, did not do 1111 or $1111 or ($1000)
//PatternsDict.currencyPat = /\$\d{1,3}(,\d{3})*\.\d{2}/;
// matches $17.23 or $14,281,545.45 or ...

// a more comprehensive currency pattern, allows (1000), ($1000), -4500, -4500.00, -4,500.00
// allows null values
  PatternsDict.currencyPat = /(^$)|^-?\$?\d{1,3}(,\d{3})*(\.\d+)?$|^-?\$?\d+$|^-?\$?\d+(\.\d+)?$|^\(\$?\d{1,3}(,\d{3})*(\.\d+)?\)$|^\(?\$?\d+\)$|^\(?\$?\d+(\.\d+)?\)$|^\$?-?\d{1,3}(,\d{3})*(\.\d+)?$|^\$?-?\d+$|^\$?-?\d+(\.\d+)?$/;

//required currency pattern, does not allow nulls
  PatternsDict.currencyRequiredPat = /^-?\$?\d{1,3}(,\d{3})*(\.\d+)?$|^-?\$?\d+$|^-?\$?\d+(\.\d+)?$|^\(\$?\d{1,3}(,\d{3})*(\.\d+)?\)$|^\(?\$?\d+\)$|^\(?\$?\d+(\.\d+)?\)$|^\$?-?\d{1,3}(,\d{3})*(\.\d+)?$|^\$?-?\d+$|^\$?-?\d+(\.\d+)?$/;

  PatternsDict.timePat = /\d{2}:\d{2}/;
// matches 12:34 but also 75:83

  PatternsDict.pctPat = /(^$)|^\d*.?\d+%?$/;
// percent validator - matches 1%, 1.55%, 3, 3.5 or Null

  PatternsDict.reqPctPat = /^\d*.?\d+%?$/;
// percent validator - matches 1%, 1.55%, 3, 3.5

// the original date pattern, without validation
PatternsDict.datePat = /^\d{1,2}\/\d{1,2}\/\d{2,4}$/;
// matches 1/1/00 to 11/11/1999

// matches null or the comprehensive date pattern
PatternsDict.nullOrDate = /^$|^\d{1,2}\/\d{1,2}\/\d{2,4}$/;

// matches null or the comprehensive date pattern
PatternsDict.requiredDate = /^\d{1,2}\/\d{1,2}\/\d{2,4}$/;

PatternsDict.reportYear = /\d{4}/;
// matches 1/1/00 to 11/11/1999

PatternsDict.timePat2=/^([1-9]|1[0-2]):[0-5]\d$/;
// matches 5:04 or 12:34 but not 75:83

PatternsDict.requiredID=/^\d+$/;
// matches integer and rejects missing field

PatternsDict.integerPat=/^\d*$/;
// matches integer fields (nulls allowed)

PatternsDict.tinPat = /(^$)|^\d+-?\d+-?\d+$/;
// matches Taxpayer ID's (numbers plus 1-2 dashes)

PatternsDict.requiredIdentifyingNumber = /^\d{9}$|^\d{3}-\d{2}-\d{4}$/;
// matches 1/1/00 to 11/11/1999

PatternsDict.requiredName=/\w/;

PatternsDict.requiredAlpha=/\D/;

function y2k(number) { 
	var iNum = number
	if (iNum < 1000) {
		if (iNum > 49) {
			iNum = iNum + 1900;
		}	
		else {
			iNum = iNum + 2000;
		};
	};	
	return iNum;
}	

function isValidDate (sDate) {
	if (String(sDate).length ==0) return true;
	
	var arrParts = String(sDate).split("/");
	var day = parseInt(arrParts[1], 10);
	var month =  parseInt(arrParts[0], 10) - 1;
	var year  =  parseInt(arrParts[2], 10);
	year = y2k(year);
	var test = new Date(year, month, day);
	if ( (test.getFullYear() == year) && (month == test.getMonth()) && (day == test.getDate()) )
		return true;
	else
		return false;
 };

function validateForm(theForm){// return true if all is well
	var elArr = theForm.elements; // get all elements of the form into array
	var rgDate = /date/i;

	for(var i = 0; i < elArr.length; i++)
		{ // for each element of the form...
			var v = elArr[i].validator; // get validator, if any
			if(!v) continue; // no validator property, skip
			
			var thePat = PatternsDict[v]; // select the validating regular expr
			var gotIt = thePat.exec(elArr[i].value); // run it on value of elArr[i]
			
			if(!gotIt){
				
				alert(elArr[i].errMsg);
				var h=(elArr[i].type == 'hidden');
				if (!h) {
					elArr[i].focus();
				}
				return false;
			}
			
			if(rgDate.exec(v)) {   // Test for extended date checking

				if (!isValidDate(elArr[i].value)) { // Invalid date
					alert(elArr[i].errMsg + ' - invalid date' );
					var h=(elArr[i].type == 'hidden');
					if (!h) {
						elArr[i].focus();
					}
					return false;
				}
			}	
		} 
	return true;
}

	
function stripCharsNotInBag (s, bag)

	{   var i;
	    var returnString = "";

	    // Search through string's characters one by one.
	    // If character is in bag, append to returnString.

	    for (i = 0; i < s.length; i++)
	    {
		// Check that current character isn't whitespace.
		var c = s.charAt(i);
		if (bag.indexOf(c) != -1) returnString += c;
	    }

	    return returnString;
	}
