formatcard

by TokenEx Support

HTML

<input type="text" id="data" />

JavaScript

data = document.getElementById("data");
data.onkeyup = formatCreditCard;

function arrayContains(needle, arrhaystack) {
  return (arrhaystack.indexOf(needle) > -1);
}

function getCardType(creditCardNumber) {
  var type;
  if (creditCardNumber.match(/^3[47]\d{13}$/)) {
    type = "americanExpress";
  } else if (creditCardNumber.match(/^(6011|65\d{2}|64[4-9]\d)\d{12}|^(62\d{14})$/)) {
    type = "discover";
  } else if (creditCardNumber.match(/^(5[1-5]\d{4}|677189|222[1-9]\d{2}|22[3-9]\d{3}|2[3-6]\d{4}|27[01]\d{3}|2720\d{2})\d{10}$/)) {
    type = "masterCard";
  } else if (creditCardNumber.match(/^4\d{12}(\d{3})?(\d{3})?$/)) {
    type = "visa";
  } else if (creditCardNumber.match(/^3(0[0-5]|[68]\d)\d{11}$/)) {
    type = "diners";
  } else if (creditCardNumber.match(/^35(28|29|[3-8]\d)\d{12}$/)) {
    type = "jcb";
  } else if (creditCardNumber.match(/^\d{13,19}$/)) {

    type = "unknown";
  } else {
    type = "invalid";
  }
  return type;
}


function formatCreditCard(event) {
  //ignore left,right, delete and backspace keys
  var keysToIgnore = [37, 38, 39, 40, 46, 8, 17, 36, 35, 16];
  var copyKeys = [65, 67];

  if (arrayContains(event.keyCode, keysToIgnore)) return true;
  if (event.ctrlKey && arrayContains(event.keyCode, copyKeys)) {
    return true;
  }


  var targ = data;
  //strip non numbers and spaces
  var currValue = targ.value.replace(/[^0-9\s]/g, "");
  targ.value = currValue;
  //strip remove non numbers 
  var cleansedValue = currValue.replace(/[^0-9]/g, "");
  //targ.value = currValue;
  var selectedIndex = targ.selectionStart;
  var origSelectedIndex = selectedIndex;
  var amex = cleansedValue.match(/^3[47]\d{0,13}$/);
  var cardType = getCardType(cleansedValue);
  // validations.setCurrentCardType(cardType);

  var numberLength = amex ? 15 : 16;

  var maxLength = Math.min(cleansedValue.length, numberLength);
  cleansedValue = cleansedValue.substring(0, maxLength);
  var chunks = [];
  if (amex) {
    chunks.push(cleansedValue.substring(0,...