|
| 1 | +// jQuery Form Validator Module: SEPA |
| 2 | +// Author: PispalanIT, Joni Saarinen |
| 3 | +// |
| 4 | +// Code based on https://github.com/arhs/iban.js/blob/master/iban.js |
| 5 | + |
| 6 | +(function($) { |
| 7 | + |
| 8 | + 'use strict'; |
| 9 | + |
| 10 | + |
| 11 | + var ibanCountryList = [ |
| 12 | + ["AD", 24, "F04F04A12"], |
| 13 | + ["AE", 23, "F03F16"], |
| 14 | + ["AL", 28, "F08A16"], |
| 15 | + ["AT", 20, "F05F11"], |
| 16 | + ["AZ", 28, "U04A20"], |
| 17 | + ["BA", 20, "F03F03F08F02"], |
| 18 | + ["BE", 16, "F03F07F02"], |
| 19 | + ["BG", 22, "U04F04F02A08"], |
| 20 | + ["BH", 22, "U04A14"], |
| 21 | + ["BR", 29, "F08F05F10U01A01"], |
| 22 | + ["CH", 21, "F05A12"], |
| 23 | + ["CR", 21, "F03F14"], |
| 24 | + ["CY", 28, "F03F05A16"], |
| 25 | + ["CZ", 24, "F04F06F10"], |
| 26 | + ["DE", 22, "F08F10"], |
| 27 | + ["DK", 18, "F04F09F01"], |
| 28 | + ["DO", 28, "U04F20"], |
| 29 | + ["EE", 20, "F02F02F11F01"], |
| 30 | + ["ES", 24, "F04F04F01F01F10"], |
| 31 | + ["FI", 18, "F06F07F01"], |
| 32 | + ["FO", 18, "F04F09F01"], |
| 33 | + ["FR", 27, "F05F05A11F02"], |
| 34 | + ["GB", 22, "U04F06F08"], |
| 35 | + ["GE", 22, "U02F16"], |
| 36 | + ["GI", 23, "U04A15"], |
| 37 | + ["GL", 18, "F04F09F01"], |
| 38 | + ["GR", 27, "F03F04A16"], |
| 39 | + ["GT", 28, "A04A20"], |
| 40 | + ["HR", 21, "F07F10"], |
| 41 | + ["HU", 28, "F03F04F01F15F01"], |
| 42 | + ["IE", 22, "U04F06F08"], |
| 43 | + ["IL", 23, "F03F03F13"], |
| 44 | + ["IS", 26, "F04F02F06F10"], |
| 45 | + ["IT", 27, "U01F05F05A12"], |
| 46 | + ["KW", 30, "U04A22"], |
| 47 | + ["KZ", 20, "F03A13"], |
| 48 | + ["LB", 28, "F04A20"], |
| 49 | + ["LC", 32, "U04F24"], |
| 50 | + ["LI", 21, "F05A12"], |
| 51 | + ["LT", 20, "F05F11"], |
| 52 | + ["LU", 20, "F03A13"], |
| 53 | + ["LV", 21, "U04A13"], |
| 54 | + ["MC", 27, "F05F05A11F02"], |
| 55 | + ["MD", 24, "U02A18"], |
| 56 | + ["ME", 22, "F03F13F02"], |
| 57 | + ["MK", 19, "F03A10F02"], |
| 58 | + ["MR", 27, "F05F05F11F02"], |
| 59 | + ["MT", 31, "U04F05A18"], |
| 60 | + ["MU", 30, "U04F02F02F12F03U03"], |
| 61 | + ["NL", 18, "U04F10"], |
| 62 | + ["NO", 15, "F04F06F01"], |
| 63 | + ["PK", 24, "U04A16"], |
| 64 | + ["PL", 28, "F08F16"], |
| 65 | + ["PS", 29, "U04A21"], |
| 66 | + ["PT", 25, "F04F04F11F02"], |
| 67 | + ["RO", 24, "U04A16"], |
| 68 | + ["RS", 22, "F03F13F02"], |
| 69 | + ["SA", 24, "F02A18"], |
| 70 | + ["SE", 24, "F03F16F01"], |
| 71 | + ["SI", 19, "F05F08F02"], |
| 72 | + ["SK", 24, "F04F06F10"], |
| 73 | + ["SM", 27, "U01F05F05A12"], |
| 74 | + ["ST", 25, "F08F11F02"], |
| 75 | + ["TL", 23, "F03F14F02"], |
| 76 | + ["TN", 24, "F02F03F13F02"], |
| 77 | + ["TR", 26, "F05F01A16"], |
| 78 | + ["VG", 24, "U04F16"], |
| 79 | + ["XK", 20, "F04F10F02"], |
| 80 | + ["AO", 25, "F21"], |
| 81 | + ["BF", 27, "F23"], |
| 82 | + ["BI", 16, "F12"], |
| 83 | + ["BJ", 28, "F24"], |
| 84 | + ["CI", 28, "U01F23"], |
| 85 | + ["CM", 27, "F23"], |
| 86 | + ["CV", 25, "F21"], |
| 87 | + ["DZ", 24, "F20"], |
| 88 | + ["IR", 26, "F22"], |
| 89 | + ["JO", 30, "A04F22"], |
| 90 | + ["MG", 27, "F23"], |
| 91 | + ["ML", 28, "U01F23"], |
| 92 | + ["MZ", 25, "F21"], |
| 93 | + ["QA", 29, "U04A21"], |
| 94 | + ["SN", 28, "U01F23"], |
| 95 | + ["UA", 29, "F25"] |
| 96 | + ]; |
| 97 | + |
| 98 | + var generalValidatorFunction = function (sepa) { |
| 99 | + sepa = sepa.toUpperCase(); |
| 100 | + sepa = sepa.replace(/\s+/g, ''); |
| 101 | + sepa = sepa.substr(4) + sepa.substr(0,4); |
| 102 | + |
| 103 | + sepa = sepa.split('').map(function(n){ |
| 104 | + var code = n.charCodeAt(0); |
| 105 | + if (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0)){ |
| 106 | + //A = 10, B = 11, ... Z = 35 |
| 107 | + return code - 'A'.charCodeAt(0) + 10; |
| 108 | + } else { |
| 109 | + return n; |
| 110 | + } |
| 111 | + }).join(''); |
| 112 | + |
| 113 | + var remainder = sepa; |
| 114 | + var block; |
| 115 | + |
| 116 | + while (remainder.length > 2) { |
| 117 | + block = remainder.slice(0, 9); |
| 118 | + remainder = (parseInt(block, 10) % 97).toString() |
| 119 | + + remainder.slice(block.length); |
| 120 | + } |
| 121 | + |
| 122 | + console.log(parseInt(remainder, 10) % 97); |
| 123 | + |
| 124 | + if (parseInt(remainder, 10) % 97 === 1){ |
| 125 | + return true; |
| 126 | + } else { |
| 127 | + return false; |
| 128 | + } |
| 129 | + }; |
| 130 | + var countryIBAN = function(sepa) { |
| 131 | + sepa = sepa.toUpperCase(); |
| 132 | + sepa = sepa.replace(/\s+/g, ''); |
| 133 | + |
| 134 | + var country_code = sepa.slice(0,2); |
| 135 | + var i = 0; |
| 136 | + var structure = ""; |
| 137 | + |
| 138 | + for (i = 0; i < ibanCountryList.length; ++i){ |
| 139 | + if (ibanCountryList[i][0] == country_code){ |
| 140 | + structure = ibanCountryList[i][2]; |
| 141 | + break; |
| 142 | + } |
| 143 | + } |
| 144 | + |
| 145 | + if (structure == ""){ |
| 146 | + return false; |
| 147 | + } |
| 148 | + |
| 149 | + var regex = structure.match(/(.{3})/g).map(function(block){ |
| 150 | + |
| 151 | + // parse each structure block (1-char + 2-digits) |
| 152 | + var format; |
| 153 | + var pattern = block.slice(0, 1); |
| 154 | + var repeats = parseInt(block.slice(1), 10); |
| 155 | + |
| 156 | + switch (pattern){ |
| 157 | + case "A": format = "0-9A-Za-z"; break; |
| 158 | + case "B": format = "0-9A-Z"; break; |
| 159 | + case "C": format = "A-Za-z"; break; |
| 160 | + case "F": format = "0-9"; break; |
| 161 | + case "L": format = "a-z"; break; |
| 162 | + case "U": format = "A-Z"; break; |
| 163 | + case "W": format = "0-9a-z"; break; |
| 164 | + } |
| 165 | + |
| 166 | + return '([' + format + ']{' + repeats + '})'; |
| 167 | + }); |
| 168 | + |
| 169 | + var regextest = new RegExp('^' + regex.join('') + '$'); |
| 170 | + |
| 171 | + return sepa.length == ibanCountryList[i][1] |
| 172 | + && regextest.test(sepa.slice(4)); |
| 173 | + }; |
| 174 | + |
| 175 | + |
| 176 | + $.formUtils.addValidator({ |
| 177 | + name: 'sepageneral', |
| 178 | + validatorFunction: generalValidatorFunction, |
| 179 | + errorMessage: '', |
| 180 | + errorMessageKey:'badSepa' |
| 181 | + }); |
| 182 | + $.formUtils.addValidator({ |
| 183 | + name: 'sepaiban', |
| 184 | + |
| 185 | + validatorFunction: function(sepa) { |
| 186 | + return countryIBAN(sepa) && generalValidatorFunction(sepa); |
| 187 | + }, |
| 188 | + errorMessage: '', |
| 189 | + errorMessageKey:'badIpan' |
| 190 | + }); |
| 191 | +})(jQuery); |
0 commit comments