Skip to content

Commit 753f476

Browse files
committed
Merge pull request victorjonsson#432 from PispalanIT/master
New module
2 parents 72d3c29 + 25d071e commit 753f476

File tree

1 file changed

+199
-0
lines changed

1 file changed

+199
-0
lines changed

src/modules/sepa.js

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
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() + remainder.slice(block.length);
119+
}
120+
121+
if (parseInt(remainder, 10) % 97 === 1){
122+
return true;
123+
} else {
124+
return false;
125+
}
126+
};
127+
128+
var countryIBAN = function(sepa) {
129+
sepa = sepa.toUpperCase();
130+
sepa = sepa.replace(/\s+/g, '');
131+
132+
var country_code = sepa.slice(0,2);
133+
var i = 0;
134+
var structure = '';
135+
136+
for (i = 0; i < ibanCountryList.length; ++i){
137+
if (ibanCountryList[i][0] === country_code){
138+
structure = ibanCountryList[i][2];
139+
break;
140+
}
141+
}
142+
143+
if (structure === ''){
144+
return false;
145+
}
146+
147+
var regex = structure.match(/(.{3})/g).map(function(block){
148+
149+
// parse each structure block (1-char + 2-digits)
150+
var format;
151+
var pattern = block.slice(0, 1);
152+
var repeats = parseInt(block.slice(1), 10);
153+
154+
switch (pattern){
155+
case 'A': format = '0-9A-Za-z'; break;
156+
case 'B': format = '0-9A-Z'; break;
157+
case 'C': format = 'A-Za-z'; break;
158+
case 'F': format = '0-9'; break;
159+
case 'L': format = 'a-z'; break;
160+
case 'U': format = 'A-Z'; break;
161+
case 'W': format = '0-9a-z'; break;
162+
}
163+
164+
return '([' + format + ']{' + repeats + '})';
165+
});
166+
167+
var regextest = new RegExp('^' + regex.join('') + '$');
168+
169+
return sepa.length === ibanCountryList[i][1] && regextest.test(sepa.slice(4));
170+
};
171+
172+
173+
174+
175+
$.formUtils.addValidator({
176+
name: 'sepageneral',
177+
validatorFunction: generalValidatorFunction,
178+
errorMessage: '',
179+
errorMessageKey:'badSepa'
180+
});
181+
$.formUtils.addValidator({
182+
name: 'sepaiban',
183+
184+
validatorFunction: function(sepa) {
185+
return countryIBAN(sepa) && generalValidatorFunction(sepa);
186+
},
187+
errorMessage: '',
188+
errorMessageKey:'badIban'
189+
});
190+
$.formUtils.addValidator({
191+
name: 'bic',
192+
validatorFunction: function(bic) {
193+
var regextest = new RegExp('^[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}$');
194+
return regextest.test(bic);
195+
},
196+
errorMessage: '',
197+
errorMessageKey:'badBic'
198+
});
199+
})(jQuery);

0 commit comments

Comments
 (0)