/* Credit Card Validator 
   Copyright (c) 2003-2004 CF Consulting Inc.
   All Rights Reserved
*/

/*************************************************************************\
boolean luhnCheck([String CardNumber])
return true if CardNumber pass the luhn check else return false.
Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
\*************************************************************************/
function luhnCheck()
    {
    var argv = luhnCheck.arguments;
    var argc = luhnCheck.arguments.length;

    var CardNumber = argc > 0 ? argv[0] : this.cardnumber;

    /*
    if (! (int)CardNumber == CardNumber)
	{
	return false;
	}
    */

    var no_digit = CardNumber.length;
    var oddoeven = no_digit & 1;
    var sum = 0;

    for (var count = 0; count < no_digit; count++)
	{
	var digit = parseInt(CardNumber.charAt(count));
	if (!((count & 1) ^ oddoeven))
	    {
	    digit *= 2;
	    if (digit > 9)
		digit -= 9;
	    }
	sum += digit;
	}

    return (sum % 10 == 0)
    }


function mod10(ccnum)
    {
    return luhnCheck(ccnum);
    }
/*
cardtypes = [\
    {'name':'Master Card', 'pattern':'^5[1-5].*$'},
    {'name':'Visa', 'pattern':'^4.*$'},
    {'name':'Amex', 'pattern':'^3(4|7).*$'},
    {'name':'Discover', 'pattern':'^6011.*$'},
    {'name':"Diner's", 'pattern':'^3(6|8|0[0-5]).*$'}]
*/

var cardtypes = [
    ['Master Card',/^5[1-5].*$/],
    ['Visa',/^4.*$/],
    ['Amex',/^3(4|7).*$/],
    ['Discover',/^6011.*$/],
    ["Diner's",/^3(6|8|0[0-5]).*$/]]

function cc_type(ccnum)
    {
    var s = "Unknown"
    for(x = 0 ; x < cardtypes.length ; x++ )
	{
	if( ccnum.search(cardtypes[x][1]) != -1)
	    {
	    s = cardtypes[x][0];
	    break;
	    }
	}
    return s;
    }

function validate_cc(widget)
    {
    var ccnum = widget.value;

    if( mod10(ccnum) )
	{
	widget.form.action.disabled = false;
	widget.form.cctype.value = cc_type(ccnum)
	}
    else
	{
	widget.form.action.disabled = true;
	widget.form.cctype.value = '* Invalid Num *';
	}
    return true;
    }

 function validate_cc_with_disable(widget)
    {
    var ccnum = widget.value;

    if( ccnum != '' && mod10(ccnum) )
	{
	widget.form.action.disabled = false;
	/* widget.form.cctype.value = cc_type(ccnum) */
	}
    else
	{
	widget.form.action.disabled = true;
	/* widget.form.cctype.value = '* Invalid Num *'; */
	}
    return true;
    }


/* This arch-tag is automatically generated. Do not remove. */
 
/*  arch-tag: d63a04ff-48e1-4531-bee1-2f4c5d00c575  */
