//********************************************************************
// Credit Card Number Validator Written By: Lokesh
//                                   Date : 04/08/2004
// Uses Linh mod-10 formula to determine the validity and then
// calls different functions to check what category the number belongs
// to.
//********************************************************************

var invalid = "Invalid";
//********************************************************************
// Check the Linh Mod-10 validity

function CheckCreditCardNum(num)
{
  var len=num.length;
  var first;
  var sum=0;
  var mul=1;
  var i;
  var numAtI;
  var tempSum;
  var theway;
  var txtcard;
  theway = "";
  for(i=(len-1); i >= 0 ;--i)
  {
   numAtI = parseInt(num.charAt(i));
   tempSum = numAtI * mul;
   theway += numAtI +" x " + mul +"=" + tempSum;
   if(tempSum > 9)
   {
    first = tempSum % 10;
    theway += " => "+ 1 +" + " + first +"=";
    tempSum =  1 +  first;
    theway += tempSum +" ";
   }
   theway += "\n";
   sum += tempSum;

   if (mul == 1)
     mul++;
   else
     mul--;
  }
  theway += "----------\nSum:   "+ sum +"\n";


//*********************************************************
// Comment this line if you want to see the calculation

 
  theway = "\n";
  if(sum % 10)
  {
   if (len == 15)
   {
   	txtcard = CheckFor15(num,0);
	if ( txtcard == invalid )
	{
	   alert(theway +"The Credit Card Number: "+ num +" is not valid!! ");
	     document.book.txtcard.select()
		document.book.txtcard.focus()
           return false;
		  
        }
   }
   else
   {
    alert(theway +"The Credit Card Number: "+ num +" is not valid!! ");
   document.book.txtcard.select()
		document.book.txtcard.focus()
    return false;

   }

  }

  {
    switch(len)
    {
	case 13:
	   txtcard = CheckFor13(num);
	   break;
	case 14:
	   txtcard = CheckFor14(num);
	   break;
	case 15:
	   txtcard = CheckFor15(num,1);
	   break;
	case 16:
	   txtcard = CheckFor16(num);
	   break;
	default:
	   txtcard = invalid;
    }
    if(txtcard == invalid)
    {
	   alert(theway +"The number: "+ num +" is not valid!! ");
   	   
		document.book.txtcard.focus();
	   return false;
    }
    else
    theway+= "The number: "+ num +" is valid!! \nand it looks like it is: "+ txtcard;
  }
 
  return true;
}
	
//***********************************************************************************
// Checks for Visa..
function CheckFor13(number)
{
  if(parseInt(number.charAt(0)) == 4 )
	return "Visa";
  return invalid;
}

//************************************************************************************
// Check for Diners Club
function CheckFor14(number)
{
  if( parseInt(number.charAt(0)) != 3 )
	return invalid;
  if( (parseInt(number.charAt(1)) == 6) || (parseInt(number.charAt(1)) == 8) )
	return "Diners Club/Carte Blanche"
  if( !(parseInt(number.charAt(1)) ))
	if( (parseInt(number.charAt(2)) >= 0) && (parseInt(number.charAt(2)) <= 5))
		return "Diners Club/Carte Blanche"
  return invalid;
}

//************************************************************************************
// Check for American Express, enRoute, JCB
function CheckFor15(number, chec)
{
    if ( (number.charAt(0) == 3) && ( (number.charAt(1) == 4)||(number.charAt(1) == 7) ) && chec)
	return "American Express";
    var FirstFour =  parseInt(number.charAt(0))*1000;
	FirstFour += parseInt(number.charAt(1))*100;
	FirstFour += parseInt(number.charAt(2))*10;
	FirstFour += parseInt(number.charAt(3));
    //alert(FirstFour);
    if( (FirstFour == 2014) || (FirstFour == 2149) )
	return "enRoute";

    if( ((FirstFour == 2131) || (FirstFour == 1800)) && chec )
	return "JCB";

    return invalid;
}

//************************************************************************************
// Check for Visa, MasterCard, Discover or JCB
function CheckFor16(number)
{
  var a = parseInt(number.charAt(0));
  var b = parseInt(number.charAt(1));
  //alert (a);
  switch (a)
  {
    case 5:
        if((b > 0)&& (b < 6))
		return "MasterCard";
	else
		return invalid;
	break;
   case 4:
	return "Visa";
	break;
   case 6:
	if ( (b == 0) && ( parseInt(number.charAt(2)) == 1) && ( parseInt(number.charAt(3)) == 1))
  		return "Discover";
	else
		return invalid;
	break;
   case 3:
	return "JCB";
	break;
   default:
	return invalid;
	break;
  }
}
 
