/*
Programmer: Darryl Ballard
Date Created: 5/19/2007
Last Update: 6/06/2007
Version: 1.4.2

A very simple library of regular expression based
form field validation functions

Version History:
	1.4.2:
		Added isZipCode5, isZipCode9, isPrice, isFloatingPoint
		
	1.4.1:
		Added isRoutingNumber
		
	1.4:
		Added isCardNumber, isCardNumberAmex, isCardNumberMC, isCardNumberVisa
		
	1.3:
		Changed isDigits to allDigits
		Added allLetters, isAlphanumeric, isVariableName, support for
			phone numbers using periods in isPhoneNumber7 and isPhoneNumber10
		
	1.2:
		Changed isPhoneNumber to isPhoneNumber7
		Added checkFields, isPhoneNumber10
	
	1.1:
		Fixed bug in ccExpirationMonth and ccExpirationYear
			where IE thought it was the year 3907
*/

function ffv_allDigits(str)
{
	// From 1 to any number of only digits
	var regExp = /^\d+$/;
	
	return str.match(regExp);
}

function ffv_allLetters(str)
{
	// From 1 to any number of only digits
	var regExp = /^[A-Za-z]+$/;
	
	return str.match(regExp);
}

function ffv_ccExpirationMonth(strMonth, strYear)
{
	var nMonth = parseInt(strMonth);
	var nYear = parseInt(strYear);	
	var d = new Date();
	var currentYear;
	var currentMonth;

	currentYear = d.getYear();
	currentMonth = d.getMonth() + 1; // Months start at zero (January)
	if( currentYear < 200 )
	{
		// Non-IE browser; year zero is 1900 AD
		currentYear += 1900;
	}		
	
	/*
	var msgStr = "";
	msgStr += "Field Month: " + strMonth + "\nField Year: " + strYear;
	msgStr += "\nDate Month: " + currentMonth + "\nDate Year: " + currentYear;
	alert(msgStr);
	*/
	
	if( nYear > currentYear )
	{
		// For future years, check only that the month is 1 through 12
		if( nMonth >= 1 && nMonth <= 12 )
		{
			return true;
		}		
	}

	if( nYear == currentYear )
	{
		// For this year, allow only months from current up to December
		if( nMonth > currentMonth && nMonth <= 12 )
		{
			return true;
		}
	}
	
	return false;
}

function ffv_ccExpirationYear(strYear)
{
	var nYear = parseInt(strYear);
	var d = new Date();
	var currentYear = d.getYear();
	
	if( currentYear < 200 )
	{
		// Non-IE browser; year zero is 1900 AD
		currentYear += 1900;
	}
	
	if( nYear >= currentYear && nYear < 2050 )
	{
		return true;
	}

	return false;
}

function ffv_checkFields(objForm, arrFields)
{
	for( k = 0; k < arrFields.length; k++ )
	{
		var fieldName = arrFields[k].name;
		var field = arrFields[k].field;
		var fieldMinLen = arrFields[k].minLength;

		//alert("Field: " + field);
		//alert("Field: " + field + "\nValue: " + objForm.elements[field].value);
		
		/*
		if( objForm.elements[field].value == undefined )
		{
			alert("Please select a " + fieldName);
			if( objForm.elements[field].focus )
			{
				objForm.elements[field].focus();
			}
			return true;
		}
		*/
		
		if( !objForm.elements[field] )
		{
			alert("The field " + field + " does not exist.");
			return true;
		}

		if( objForm.elements[field].value.length <= 0 )
		{
			alert("Please enter a value for " + fieldName);
			objForm.elements[field].focus();
			return true;
		}
		
		if( objForm.elements[field].value.length < fieldMinLen )
		{
			alert("Please ensure that " + fieldName + " is valid.");
			objForm.elements[field].focus();
			return true;
		}
	}
	
	return false;
}

function ffv_isAlphanumeric(str)
{
	// From 1 to any number of only digits
	var regExp = /^[A-Za-z0-9]+$/;
	
	return str.match(regExp);
}

function ffv_isAreaCode(str)
{
	// 3 digits
	var regExp = /^\d{3}$/;
	
	return str.match(regExp);
}

function ffv_isCardNumber(strCardNumber, strCardType)
{
	var regExp;
	
	switch( strCardType.toLowerCase() )
	{
	case "visa":
		regExp = /^(\d{13}|\d{16})$/;
	break;
	
	case "mc":
	case "mastercard":
	case "master card":
		regExp = /^\d{16}$/;
	break;
	
	case "amex":
	case "americanexpress":
	case "american express":
		regExp = /^\d{15}$/;
	break;
	}
	
	return strCardNumber.match(regExp);
}

function ffv_isCardNumberAmex(strCardNumber)
{
	var regExp = /^\d{15}$/;
	
	return strCardNumber.match(regExp);
}

function ffv_isCardNumberMC(strCardNumber)
{
	var regExp = /^\d{16}$/;
	
	return strCardNumber.match(regExp);
}

function ffv_isCardNumberVisa(strCardNumber)
{
	var regExp = /^(\d{13}|\d{16})$/;
	
	return strCardNumber.match(regExp);
}

function ffv_isCVV(strCVV, strCardType)
{
	var regExp;
	
	switch( strCardType.toLowerCase() )
	{
	case "visa":
	case "mc":
	case "mastercard":
	case "master card":
		regExp = /^\d{3}$/;
	break;
	
	case "amex":
	case "americanexpress":
	case "american express":
		regExp = /^\d{4}$/;
	break;
	}
	
	return strCVV.match(regExp);
}

function ffv_isEmailAddress(str)
{
	var regExp = /^.+@[^\.].*\.[a-z]{2,}$/;
	
	return str.match(regExp);
}

function ffv_isFloatingPoint(str)
{
	var regExp = /^\d+(\.\d+)?$/;
	
	return str.match(regExp);
}

function ffv_isPhoneNumber7(str)
{
	// 3 digits, a dash or period, and 4 digits
	var regExp1 = /^\d{3}(-|\.)\d{4}$/;
	
	return str.match(regExp1);
}

function ffv_isPhoneNumber10(str)
{
	// 3 digit, delimeter, 3 digits, delimeter, and 4 digits
	// Where delimeter is either a dash or a dot, but the same througout
	var regExp1 = /^\d{3}-\d{3}-\d{4}|\d{3}\.\d{3}\.\d{4}$/;

	// Open paren, 3 digits, close paren, space, 3 digits, a dash/period, 4 digits
	var regExp2 = /^\(\d{3}\) \d{3}(-|\.)\d{4}$/;

	return str.match(regExp1) || str.match(regExp2);
}

function ffv_isPIN(str)
{
	// 4 digits
	var regExp = /^\d{4}$/;
	
	return str.match(regExp);
}

function ffv_isPrice(str)
{
	// Any number of digits, optionally: a decimal point, and 2 digits
	var regExp = /^\d+(\.\d\d)?$/;
	
	return str.match(regExp);
}

function ffv_isRoutingNumber(str)
{
	// 9 digits
	var regExp = /^\d{9}$/;
	
	return str.match(regExp);
}

function ffv_isVariableName(str)
{
	// From 1 to any number of only digits
	var regExp = /^[A-Za-z_]+[A-Za-z_0-9]*$/;
	
	return str.match(regExp);
}

function ffv_isZipCode5(str)
{
	var regExp = /^\d{5}$/;
	
	return str.match(regExp);
}

function ffv_isZipCode9(str)
{
	var regExp = /^\d{5}-\d{4}$/;
	
	return str.match(regExp);
}

function ffv_isZipCode5or9(str)
{	
	return (ffv_isZipCode5(str) || ffv_isZipCode9(str));
}
