// (C) Imagos Consulting

var whitespace = " \t\n\r";

function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}

function isWhitespace (s)

{   var i;

    // Is s empty?
    if (isEmpty(s)) return true;

    // Search through string's characters one by one
    // until we find a non-whitespace character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);

        if (whitespace.indexOf(c) == -1) return false;
    }

    // All characters are whitespace.
    return true;
}

function isEmail (s)
{   if (isEmpty(s)) 
       if (isEmail.arguments.length == 1) return false;
       else return (isEmail.arguments[1] == true);
   
    // is s whitespace?
    if (isWhitespace(s)) return false;
    
    // there must be >= 1 character before @, so we
    // start looking at character position 1 
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;

    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;

    // look for .
    while ((i < sLength) && (s.charAt(i) != "."))
    { i++
    }

    // there must be at least one character after the .
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}	

	function isCreditCard(st) {
	  var l, sum, mul, tproduct, digit;
	  // Encoding only works on cards with less than 19 digits
	  if (st.length > 19)
	    return (false);
	  if (st.length < 15)
	    return (false);	    

	  sum = 0; mul = 1; l = st.length;
	  for (var i = 0; i < l; i++) {
	    digit = st.substring(l-i-1,l-i);
	    tproduct = parseInt(digit ,10)*mul;
	    if (tproduct >= 10)
	      sum += (tproduct % 10) + 1;
	    else
	      sum += tproduct;
	    if (mul == 1)
	      mul++;
	    else
	      mul--;
	  }
	  if ((sum % 10) == 0)
	    return (true);
	  else
	    return (false);

	} // END FUNCTION isCreditCard()
	
	function isVisa(cc)
	{
	  if (((cc.length == 16) || (cc.length == 13)) &&
	      (cc.substring(0,1) == 4))
	    return isCreditCard(cc);
	  return false;
	}  // END FUNCTION isVisa()
	
	function isMasterCard(cc)
	{
	  firstdig = cc.substring(0,1);
	  seconddig = cc.substring(1,2);
	  if ((cc.length == 16) && (firstdig == 5) &&
	      ((seconddig >= 1) && (seconddig <= 5)))
	    return isCreditCard(cc);
	  return false;

	} // END FUNCTION isMasterCard()
	
	function isAmericanExpress(cc)
	{
	  firstdig = cc.substring(0,1);
	  seconddig = cc.substring(1,2);
	  if ((cc.length == 15) && (firstdig == 3) &&
	      ((seconddig == 4) || (seconddig == 7)))
	    return isCreditCard(cc);
	  return false;

	} // END FUNCTION isAmericanExpress()
	
	function isCardMatch (cardType, cardNumber)
	{
		cardType = cardType.toUpperCase();
		var doesMatch = true;
		if ((cardType == "VISA") && (!isVisa(cardNumber)))
			doesMatch = false;
		if ((cardType == "MASTERCARD") && (!isMasterCard(cardNumber)))
			doesMatch = false;
		if ( ( (cardType == "AMERICANEXPRESS") || (cardType == "AMEX") )
	                && (!isAmericanExpress(cardNumber))) doesMatch = false;
		return doesMatch;

	}  // END FUNCTION CardMatch()	
