/*	JAVASCRIPT FORM VALIDATION LIBRARY 
	Victor Damien DiCara

	v2.0 	3/20/2002	
	v3.0	9/2/2003	Backwards & Cross Compatibility
	v4.0	4/22/2004	customized for Kick Ass
	v5.0	7/2/2004	added the credit card luhn check
	v5.1	7/7/2004	fine-tuned luhnCheck()
___________________________________________________________________	*/

function isEmail( str ){
	return( /\S+@\S+\.\S+/.test(str) );
}

// 4-12 alphanumerics
function isPassword( str ){
	return( /^\w{4,12}$/.test(str) );
}

// 4-12 alphanumerics
function isUserName( str ){
	return( /^\w{4,12}$/.test(str) );
}

function isNumeric( str ){
	return( /^\d+$/.test(str) );
}

function isBlank( str ){
    return( isEmpty(str) || !/\S/.test(str) ); 
}

function isEmpty( str ){   
	return( (str == null) || (str.length == 0) );
}

function isSame( str1, str2 ){
	return( str1 == str2 );
}

function luhnCheck(cardNumber, cardType)
{
	var isValid = false;
	var ccCheckRegExp = /[^\d\- ]/;
	isValid = !ccCheckRegExp.test(cardNumber);

	if (!isValid)
	{
		return( false );
	}
	else
	{
		var cardNumbersOnly = cardNumber.replace(/(\-| )/g,"");
		var cardNumberLength = cardNumbersOnly.length;
		var lengthIsValid = false;
		var prefixIsValid = false;
		var prefixRegExp;
		
		switch(cardType)
		{
			case "mastercard":
				lengthIsValid = (cardNumberLength == 16);
				prefixRegExp = /^5[1-5]/;
				break;
			
			case "visa":
				lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
				prefixRegExp = /^4/;
				break;
			
			case "amex":
				lengthIsValid = (cardNumberLength == 15);
				prefixRegExp = /^3(4|7)/;
				break;
			
			case "discover":
				lengthIsValid = (cardNumberLength == 16);
				prefixRegExp = /^6011/;
				break;
			
			case "jcb":
				lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 15);
				prefixRegExp = /^(3|2131|1800)/;
				break;
			
			default:
				prefixRegExp = /^$/;
				alert("Card type not found");
		}
		
		prefixIsValid = prefixRegExp.test(cardNumbersOnly);
		isValid = prefixIsValid && lengthIsValid;

		if( !isValid ) return( false );

		// Luhn 10 check
		var checkSumTotal = 0;
		
		for (i = cardNumberLength-1; i >= 0; i--)
		{
			checkSumTotal += parseInt (cardNumbersOnly.charAt(i));
			i--;
			numberProduct = String((cardNumbersOnly.charAt(i) * 2));
			for (j = 0; j < numberProduct.length; j++)
			{
				checkSumTotal += parseInt(numberProduct.charAt(j));
			}
		}
		
		isValid = (checkSumTotal % 10 == 0);
		if( !isValid ) return( false );
	}
	return( true );
}