	function alertFocusSelect(fieldName, msg)
	{
		alert(msg);
		fieldName.focus();
		if (fieldName.type.indexOf("select", 0) == -1)
			fieldName.select();
		return false;		
	}
	
	function trim(str)
	{
		return str.replace(/^\W+/,'').replace(/\W+$/,'');
	}
   
	function validEmail(email)
	{

		invalidchars = " /:,;";	// s


		
		for ( i = 0 ; i < invalidchars.length ; i++ )
		{
			badChar = invalidchars.charAt(i);	
												
			if ( email.indexOf(badChar, 0) > -1 )	
				return false;						
		}

		
		atPos = email.indexOf("@", 1);
		if ( atPos == -1 )
			return false;

		if ( email.indexOf ("@", atPos + 1 ) > -1 || email.lastIndexOf ("@", 0) > -1 )
			return false;
		
		if ( email.charAt (atPos + 1 ) == "." )
			return false;

		periodPos = email.indexOf (".", atPos);
		if ( periodPos == -1 )
			return false;
		
		if ( email.charAt (periodPos + 1) == "." )
			return false;

		if ( periodPos + 3 > email.length )
			return false;

		return true;

	}
	
	function extractDigits(mixedString)
	{
		var digitsOnly = '';
		var thisDigit = '';
		for (var i = 0; i < mixedString.length; i++)
		{
			thisDigit = mixedString.charAt(i);
			if (thisDigit >= '0' && thisDigit <= '9')
				digitsOnly = digitsOnly + thisDigit;
		}
		return digitsOnly;
	}
 
 
	function checkMod10(ccNumber)
	{
		var translateMap = '0246813579';
		var digitSum = 0;
		var translateFlag = ((ccNumber.length % 2) == 0);
		for (var i = 0; i < ccNumber.length; i++)
		{
			digitSum += parseInt(translateFlag ?
	        translateMap.charAt(ccNumber.charAt(i)) :
	        ccNumber.charAt(i) , 10)
			translateFlag = !translateFlag;
		}
		return (digitSum % 10) == 0;
	}


	function validCardType(ccNumber)
	{
		//var cardLengths = new Array ('v', 13, 'v', 16, 'm', 16, 'a', 15);
		//var cardDigits = new Array ('v', '4', 'm', '51', 'm', '52', 'm', '53', 'm', '54', 'm', '55', 'a', '34', 'a', '37');
		
		var cardLengths = new Array ('v', 13, 'v', 16, 'm', 16, 'd', 16, 'a', 15);
		var cardDigits = new Array ('v', '4', 'm', '51', 'm', '52', 'm', '53', 'm', '54', 'm', '55', 'd', '6011', 'a', '34', 'a', '37');
		
		var validCard = false;
		var correctLength = false;
		var cardType = '' ;
		
		for (var i = 0; i < cardDigits.length - 1; i += 2)
		{
			if (cardDigits[i + 1] == ccNumber.substr(0, cardDigits[i + 1].length))
			{
				validCard = true;
				cardType = cardDigits[i];
				break;
			}
		}
		if (validCard)
		{
			var cardLen = ccNumber.length;
			for (var i = 0; i < cardLengths.length - 1; i += 2)
			{
				if ((cardType == cardLengths[i]) && (cardLen == cardLengths[i + 1]))
				{
					correctLength = true;
					break;
				}
			}
			validCard = correctLength;
		}
		return validCard;
	}
	
	function isCCValidLength(ccnum)
	{

		if (ccnum.indexOf("34") == 0 || ccnum.indexOf("37") == 0)
		{
			if (ccnum.length != 15)
				return false;
		}

		else if (ccnum.indexOf("4") == 0)
		{
			if (ccnum.length != 13 && ccnum.length != 16)
				return false;
		}

		else if (ccnum.indexOf("6011") == 0 || ccnum.indexOf("51") == 0 || ccnum.indexOf("52") == 0 || ccnum.indexOf("53") == 0 || ccnum.indexOf("54") == 0 || ccnum.indexOf("55") == 0)
		{
			if (ccnum.length < 16)
				return false;
		}

		else
		{
			if (ccnum.length < 12)
				return false;
		}
		
		return true;
	}
	
	function isNum (passedVal)
	{
		for ( i = 0 ; i < passedVal.length ; i++ )
		{
			if ( passedVal.charAt(i) < "0" || passedVal.charAt(i) > "9" )
				return false
		}
		return true;
	}

	function specialValidation(form)
	{
		if (!form.specialValidation || form.specialValidation.value == "")
			return true;
		
		var specialFields = new Array();
		var temp		  = new Array();
		var fields		  = new Array();
		
		specialFields = form.specialValidation.value.split(",");
		
		for (i = 0 ; i < specialFields.length ; i++)
		{
			temp = specialFields[i].split("=");
			fields[temp[0].replace(" ", "")] = temp[1].replace(" ", "");
		}
		
		for (j = 0 ; j < form.length ; j++)
		{
			if (fields["email"] && form[fields["email"]] && form.elements[j].name == fields["email"])
			{
				if ( !validEmail (form[fields["email"]].value) )
				{
					alertFocusSelect(form[fields["email"]], "Invalid E-Mail address");
					return false;
				}
			}
		
			if (fields["email"] && fields["email2"] && form[fields["email"]] && form[fields["email2"]] && form.elements[j].name == fields["email"])
			{
				if ( form[fields["email"]].value != form[fields["email2"]].value )
				{
					alertFocusSelect(form[fields["email"]], "The two E-mail addresses you entered do not match!");
					return false;
				}
			}

			if (fields["password1"] && fields["password2"] && form[fields["password1"]] && form[fields["password2"]] && form.elements[j].name == fields["password1"])
			{
				if ( form[fields["password1"]].value != form[fields["password2"]].value )
				{
					alertFocusSelect(form[fields["password1"]], "The passwords you entered do not match!");
					return false;
				}
			}
			
			if (fields["secretAnswer1"] && fields["secretAnswer2"] && form[fields["secretAnswer1"]] && form[fields["secretAnswer2"]] && form.elements[j].name == fields["secretAnswer1"])
			{
				if ( form[fields["secretAnswer1"]].value != form[fields["secretAnswer2"]].value )
				{
					alertFocusSelect(form[fields["secretAnswer1"]], "The secret answers you entered do not match!");
					return false;
				}
			}
			
			if (fields["age"] && form[fields["age"]] && form.elements[j].name == fields["age"])
			{
				if ( !isNum (form[fields["age"]].value) )
				{
					alertFocusSelect(form[fields["age"]], "Whoops! Your age MUST be a numeric value!");
					return false;
				}
					
				if ( form[fields["age"]].value > 120 || form[fields["age"]].value < 1 )
				{
					alertFocusSelect(form[fields["age"]], "Um, how old are you again?");
					return false;
				}
			}
		
			if (fields["zip"] && form[fields["zip"]] && form.elements[j].name == fields["zip"])
			{
				if (form[fields["zip"]].value.indexOf("-") == -1)
				{
					if ( !isNum (form[fields["zip"]].value) || form[fields["zip"]].value.length != 5 )
					{
						alertFocusSelect(form[fields["zip"]], "Whoops! Invalid Zip Code!");
						return false;
					}
				}
				else
				{
					var arrTmp = form[fields["zip"]].value.split("-");
					if (form[fields["zip"]].value.length != 10 || form[fields["zip"]].value.indexOf("-") != 5 || !isNum(arrTmp[0]) || !isNum(arrTmp[1]) )
					{
						alertFocusSelect(form[fields["zip"]], "Whoops! Invalid Zip Code!");
						return false;
					}
				}
			}
		
			if (fields["phone"] && form.elements[j].name.indexOf("phone") > -1 )
			{
				var phoneFields = new Array();
				var phoneString;
				
				phoneFields = fields["phone"].split("-")
				
				if (phoneFields.length == 3)
				{
					phoneFields[0] = phoneFields[0].replace(" ", "");
					phoneFields[1] = phoneFields[1].replace(" ", "");
					phoneFields[2] = phoneFields[2].replace(" ", "");
					
					if (form[phoneFields[0]] && form[phoneFields[1]] && form[phoneFields[2]])
					{
						phoneString = form[phoneFields[0]].value + form[phoneFields[1]].value + form[phoneFields[2]].value;
					
						if (phoneString.length < 10)
						{
							alertFocusSelect(form[phoneFields[0]], "Whoops! Phone Number is Invalid Length!");
							return false;
						}
						
						if (!isNum(form[phoneFields[0]].value))
						{
							alertFocusSelect(form[phoneFields[0]], "Whoops! Phone Number must be a Numeric Value!");
							return false;
						}
						if (!isNum(form[phoneFields[1]].value))
						{
							alertFocusSelect(form[phoneFields[1]], "Whoops! Phone Number must be a Numeric Value!");
							return false;
						}
						if (!isNum(form[phoneFields[2]].value))
						{
							alertFocusSelect(form[phoneFields[2]], "Whoops! Phone Number must be a Numeric Value!");
							return false;
						}
					}
				}
			}
		
			if (fields["ccExpMonth"] && form[fields["ccExpMonth"]] && form.elements[j].name == fields["ccExpMonth"])
			{
				if (isNum(form[fields["ccExpMonth"]].value))
				{
					if (eval(form[fields["ccExpMonth"]].value) < 1 || eval(form[fields["ccExpMonth"]].value) > 12)
					{
						alertFocusSelect(form[fields["ccExpMonth"]], "Whoops! Invalid Month!");
						return false;
					}
				}
				else
				{
					alertFocusSelect(form[fields["ccExpMonth"]], "Whoops! Invalid Month!");
					return false;
				}			
			}
		
			if (fields["ccExpYear"] && form[fields["ccExpYear"]] && form.elements[j].name == fields["ccExpYear"])
			{
				if (isNum(form[fields["ccExpYear"]].value))
				{
					if (eval(form[fields["ccExpYear"]].value) < 2000 || eval(form[fields["ccExpYear"]].value) > 2999)
					{
						alertFocusSelect(form[fields["ccExpYear"]], "Whoops! Invalid Year!");
						return false;
					}
				}
				else
				{
					alertFocusSelect(form[fields["ccExpYear"]], "Whoops! Invalid Year!");
					return false;
				}			
			}
		
			if (fields["ccNum"] && form[fields["ccNum"]] && form.elements[j].name == fields["ccNum"])
			{
				var ccDigits = extractDigits(form[fields["ccNum"]].value);
				//if (!isNum(form[fields["ccNum"]].value)  || !isCCValidLength(form[fields["ccNum"]].value))
				if (!(checkMod10(ccDigits) && validCardType(ccDigits)))
				{
					alertFocusSelect(form[fields["ccNum"]], "Whoops! Invalid Credit Card Number!");
					return false;
				}
				
			}
		}

		return true;
	}
	
	function formatRegistrationForm(form)
	{
		if (form.f_telephoneNumber)
			form.f_telephoneNumber.value = "" + form.areacode.value + form.exchange.value + form.phoneLastFour.value;
		if (form.f_userPassword)
		form.f_userPassword.value = form.f_userPassword.value.toLowerCase();
	}
	
	
	function formatLoginForm(form)
	{
		form.password.value = form.password.value.toLowerCase();
	}
	
	function verifyValidLengths(form)
	{
		if (form.f_uid.value.length < 6 || form.f_uid.value.length > 20)
		{
			alertFocusSelect(form.f_uid, "The Username must be between 6 and 20 characters!");
			return false;
		}
		if (form.f_userPassword.value.length < 6 || form.f_userPassword.value.length > 16)
		{
			alertFocusSelect(form.f_userPassword, "The Password must be between 6 and 16 characters!");
			return false;
		}
		
		if (form.f_GNSecretQuestion.value.length < 5 || form.f_GNSecretQuestion.value.length > 30)
		{
			alertFocusSelect(form.f_GNSecretQuestion, "The Secret Question must be between 5 and 30 characters!");
			return false;
		}
		if (form.f_GNSecretAnswer.value.length < 2 || form.f_GNSecretAnswer.value.length > 30)
		{
			alertFocusSelect(form.f_GNSecretAnswer, "The Secret Answer must be between 2 and 30 characters!");
			return false;
		}
		
		if (form.f_GNSecretAnswer.value.indexOf(" ") > -1)
		{
			alertFocusSelect(form.f_GNSecretAnswer, "The Secret Answer Cannot Contain Spaces!");
			return false;
		}
		return true;
	}
	
	function submitForm (form)
	{
		for ( i = 0 ; i < form.length ; i++ )
		{
			if (form.elements[i].type == "text")
				form.elements[i].value = trim(form.elements[i].value);
			if (form.elements[i].mandatory == 1 && form.elements[i].type != "hidden" && form.elements[i].type != "submit" && form.elements[i].type != "reset" && form.elements[i].type != "radio")
			{
				if ( form.elements[i].value == "" )
				{
					alertFocusSelect(form.elements[i], form.elements[i].alertVal + " is Empty!");
					return false;
				}
			}
		}
		
		for ( i = 0 ; i < form.length ; i++ )
		{
			if (form.elements[i].type != "hidden" && form.elements[i].type != "submit" && form.elements[i].type != "reset" && form.elements[i].type != "radio")
			{
				if ( form.elements[i].value.indexOf("<",0) > -1 || form.elements[i].value.indexOf(">",0) > -1 )
				{
					alertFocusSelect(form.elements[i], "You entered INVALID Characters in the form");
					return false;
				}
			}
		}
			
		var result = true;
		if (submitForm.arguments.length > 1)
		{
			if (submitForm.arguments[1] == "reg")
			{
				formatRegistrationForm(form);
				result = verifyValidLengths(form);
			}
			else if (submitForm.arguments[1] == "login")
			{
				formatLoginForm(form);
			}
		}
		
		if (result)
			return specialValidation(form);
		else
			return false;
	}

