/src/additional/iban.js

https://github.com/hellolwq/jquery-validation · JavaScript · 122 lines · 104 code · 3 blank · 15 comment · 8 complexity · ca8519846b3aa6baecbb5bb7d38603a2 MD5 · raw file

  1. /**
  2. * IBAN is the international bank account number.
  3. * It has a country - specific format, that is checked here too
  4. */
  5. jQuery.validator.addMethod("iban", function(value, element) {
  6. // some quick simple tests to prevent needless work
  7. if (this.optional(element)) {
  8. return true;
  9. }
  10. if (!(/^([a-zA-Z0-9]{4} ){2,8}[a-zA-Z0-9]{1,4}|[a-zA-Z0-9]{12,34}$/.test(value))) {
  11. return false;
  12. }
  13. // check the country code and find the country specific format
  14. var iban = value.replace(/ /g,'').toUpperCase(); // remove spaces and to upper case
  15. var countrycode = iban.substring(0,2);
  16. var bbancountrypatterns = {
  17. 'AL': "\\d{8}[\\dA-Z]{16}",
  18. 'AD': "\\d{8}[\\dA-Z]{12}",
  19. 'AT': "\\d{16}",
  20. 'AZ': "[\\dA-Z]{4}\\d{20}",
  21. 'BE': "\\d{12}",
  22. 'BH': "[A-Z]{4}[\\dA-Z]{14}",
  23. 'BA': "\\d{16}",
  24. 'BR': "\\d{23}[A-Z][\\dA-Z]",
  25. 'BG': "[A-Z]{4}\\d{6}[\\dA-Z]{8}",
  26. 'CR': "\\d{17}",
  27. 'HR': "\\d{17}",
  28. 'CY': "\\d{8}[\\dA-Z]{16}",
  29. 'CZ': "\\d{20}",
  30. 'DK': "\\d{14}",
  31. 'DO': "[A-Z]{4}\\d{20}",
  32. 'EE': "\\d{16}",
  33. 'FO': "\\d{14}",
  34. 'FI': "\\d{14}",
  35. 'FR': "\\d{10}[\\dA-Z]{11}\\d{2}",
  36. 'GE': "[\\dA-Z]{2}\\d{16}",
  37. 'DE': "\\d{18}",
  38. 'GI': "[A-Z]{4}[\\dA-Z]{15}",
  39. 'GR': "\\d{7}[\\dA-Z]{16}",
  40. 'GL': "\\d{14}",
  41. 'GT': "[\\dA-Z]{4}[\\dA-Z]{20}",
  42. 'HU': "\\d{24}",
  43. 'IS': "\\d{22}",
  44. 'IE': "[\\dA-Z]{4}\\d{14}",
  45. 'IL': "\\d{19}",
  46. 'IT': "[A-Z]\\d{10}[\\dA-Z]{12}",
  47. 'KZ': "\\d{3}[\\dA-Z]{13}",
  48. 'KW': "[A-Z]{4}[\\dA-Z]{22}",
  49. 'LV': "[A-Z]{4}[\\dA-Z]{13}",
  50. 'LB': "\\d{4}[\\dA-Z]{20}",
  51. 'LI': "\\d{5}[\\dA-Z]{12}",
  52. 'LT': "\\d{16}",
  53. 'LU': "\\d{3}[\\dA-Z]{13}",
  54. 'MK': "\\d{3}[\\dA-Z]{10}\\d{2}",
  55. 'MT': "[A-Z]{4}\\d{5}[\\dA-Z]{18}",
  56. 'MR': "\\d{23}",
  57. 'MU': "[A-Z]{4}\\d{19}[A-Z]{3}",
  58. 'MC': "\\d{10}[\\dA-Z]{11}\\d{2}",
  59. 'MD': "[\\dA-Z]{2}\\d{18}",
  60. 'ME': "\\d{18}",
  61. 'NL': "[A-Z]{4}\\d{10}",
  62. 'NO': "\\d{11}",
  63. 'PK': "[\\dA-Z]{4}\\d{16}",
  64. 'PS': "[\\dA-Z]{4}\\d{21}",
  65. 'PL': "\\d{24}",
  66. 'PT': "\\d{21}",
  67. 'RO': "[A-Z]{4}[\\dA-Z]{16}",
  68. 'SM': "[A-Z]\\d{10}[\\dA-Z]{12}",
  69. 'SA': "\\d{2}[\\dA-Z]{18}",
  70. 'RS': "\\d{18}",
  71. 'SK': "\\d{20}",
  72. 'SI': "\\d{15}",
  73. 'ES': "\\d{20}",
  74. 'SE': "\\d{20}",
  75. 'CH': "\\d{5}[\\dA-Z]{12}",
  76. 'TN': "\\d{20}",
  77. 'TR': "\\d{5}[\\dA-Z]{17}",
  78. 'AE': "\\d{3}\\d{16}",
  79. 'GB': "[A-Z]{4}\\d{14}",
  80. 'VG': "[\\dA-Z]{4}\\d{16}"
  81. };
  82. var bbanpattern = bbancountrypatterns[countrycode];
  83. // As new countries will start using IBAN in the
  84. // future, we only check if the countrycode is known.
  85. // This prevents false negatives, while almost all
  86. // false positives introduced by this, will be caught
  87. // by the checksum validation below anyway.
  88. // Strict checking should return FALSE for unknown
  89. // countries.
  90. if (typeof bbanpattern !== 'undefined') {
  91. var ibanregexp = new RegExp("^[A-Z]{2}\\d{2}" + bbanpattern + "$", "");
  92. if (!(ibanregexp.test(iban))) {
  93. return false; // invalid country specific format
  94. }
  95. }
  96. // now check the checksum, first convert to digits
  97. var ibancheck = iban.substring(4,iban.length) + iban.substring(0,4);
  98. var ibancheckdigits = "";
  99. var leadingZeroes = true;
  100. var charAt;
  101. for (var i =0; i<ibancheck.length; i++) {
  102. charAt = ibancheck.charAt(i);
  103. if (charAt !== "0") {
  104. leadingZeroes = false;
  105. }
  106. if (!leadingZeroes) {
  107. ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(charAt);
  108. }
  109. }
  110. // calculate the result of: ibancheckdigits % 97
  111. var cRest = '';
  112. var cOperator = '';
  113. for (var p=0; p<ibancheckdigits.length; p++) {
  114. var cChar = ibancheckdigits.charAt(p);
  115. cOperator = '' + cRest + '' + cChar;
  116. cRest = cOperator % 97;
  117. }
  118. return cRest === 1;
  119. }, "Please specify a valid IBAN");