vendor: 6,206 bytes, lines 1-173
1(function (root, factory) { 2 if (typeof define === 'function' && define.amd) { 3 // AMD. Register as an anonymous module. 4 define(['exports'], factory); 5 } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { 6 // CommonJS 7 factory(exports); 8 } else { 9 // Browser globals 10 factory(root.IBAN = {}); 11 } 12}(this, function(exports){ 13 14 // Array.prototype.map polyfill 15 // code from https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map 16 if (!Array.prototype.map){ 17 Array.prototype.map = function(fun /*, thisArg */){ 18 "use strict"; 19 20 if (this === void 0 || this === null) 21 throw new TypeError(); 22 23 var t = Object(this); 24 var len = t.length >>> 0; 25 if (typeof fun !== "function") 26 throw new TypeError(); 27 28 var res = new Array(len); 29 var thisArg = arguments.length >= 2 ? arguments[1] : void 0; 30 for (var i = 0; i < len; i++) 31 { 32 // NOTE: Absolute correctness would demand Object.defineProperty 33 // be used. But this method is fairly new, and failure is 34 // possible only if Object.prototype or Array.prototype 35 // has a property |i| (very unlikely), so use a less-correct 36 // but more portable alternative. 37 if (i in t) 38 res[i] = fun.call(thisArg, t[i], i, t); 39 } 40 41 return res; 42 }; 43 } 44 45 var A = 'A'.charCodeAt(0), 46 Z = 'Z'.charCodeAt(0); 47 48 /** 49 * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to 50 * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616. 51 * 52 * @param {string} iban the IBAN 53 * @returns {string} the prepared IBAN 54 */ 55 function iso13616Prepare(iban) { 56 iban = iban.toUpperCase(); 57 iban = iban.substr(4) + iban.substr(0,4); 58 59 return iban.split('').map(function(n){ 60 var code = n.charCodeAt(0); 61 if (code >= A && code <= Z){ 62 // A = 10, B = 11, ... Z = 35 63 return code - A + 10; 64 } else { 65 return n; 66 } 67 }).join(''); 68 } 69 70 /** 71 * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064. 72 * 73 * @param iban 74 * @returns {number} 75 */ 76 function iso7064Mod97_10(iban) { 77 var remainder = iban, 78 block; 79 80 while (remainder.length > 2){ 81 block = remainder.slice(0, 9); 82 remainder = parseInt(block, 10) % 97 + remainder.slice(block.length); 83 } 84 85 return parseInt(remainder, 10) % 97; 86 } 87 88 /** 89 * Parse the BBAN structure used to configure each IBAN Specification and returns a matching regular expression. 90 * A structure is composed of blocks of 3 characters (one letter and 2 digits). Each block represents 91 * a logical group in the typical representation of the BBAN. For each group, the letter indicates which characters 92 * are allowed in this group and the following 2-digits number tells the length of the group. 93 * 94 * @param {string} structure the structure to parse 95 * @returns {RegExp} 96 */ 97 function parseStructure(structure){ 98 // split in blocks of 3 chars 99 var regex = structure.match(/(.{3})/g).map(function(block){ 100 101 // parse each structure block (1-char + 2-digits) 102 var format, 103 pattern = block.slice(0, 1), 104 repeats = parseInt(block.slice(1), 10); 105 106 switch (pattern){ 107 case "A": format = "0-9A-Za-z"; break; 108 case "B": format = "0-9A-Z"; break; 109 case "C": format = "A-Za-z"; break; 110 case "F": format = "0-9"; break; 111 case "L": format = "a-z"; break; 112 case "U": format = "A-Z"; break; 113 case "W": format = "0-9a-z"; break; 114 } 115 116 return '([' + format + ']{' + repeats + '})'; 117 }); 118 119 return new RegExp('^' + regex.join('') + '$'); 120 } 121 122 /** 123 * Create a new Specification for a valid IBAN number. 124 * 125 * @param countryCode the code of the country 126 * @param length the length of the IBAN 127 * @param structure the structure of the underlying BBAN (for validation and formatting) 128 * @param example an example valid IBAN 129 * @constructor 130 */ 131 function Specification(countryCode, length, structure, example){ 132 133 this.countryCode = countryCode; 134 this.length = length; 135 this.structure = structure; 136 this.example = example; 137 } 138 139 /** 140 * Lazy-loaded regex (parse the structure and construct the regular expression the first time we need it for validation) 141 */ 142 Specification.prototype._regex = function(){ 143 return this._cachedRegex || (this._cachedRegex = parseStructure(this.structure)) 144 }; 145 146 /** 147 * Check if the passed iban is valid according to this specification. 148 * 149 * @param {String} iban the iban to validate 150 * @returns {boolean} true if valid, false otherwise 151 */ 152 Specification.prototype.isValid = function(iban){ 153 return this.length == iban.length 154 && this.countryCode === iban.slice(0,2) 155 && this._regex().test(iban.slice(4)) 156 && iso7064Mod97_10(iso13616Prepare(iban)) == 1; 157 }; 158 159 /** 160 * Convert the passed IBAN to a country-specific BBAN. 161 * 162 * @param iban the IBAN to convert 163 * @param separator the separator to use between BBAN blocks 164 * @returns {string} the BBAN 165 */ 166 Specification.prototype.toBBAN = function(iban, separator) { 167 return this._regex().exec(iban.slice(4)).slice(1).join(separator); 168 }; 169 170 /** 171 * Convert the passed BBAN to an IBAN for this country specification. 172 * Please note that <i>"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account"</i>. 173 * This method implements the preferred algorithm described
173in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits 174 * 175 * @param bban the BBAN to convert to IBAN 176 * @returns {string} the IBAN 177 */ 178 Specification.prototype.fromBBAN = function(bban) { 179 if (!this.isValidBBAN(bban)){ 180 throw new Error('Invalid BBAN'); 181 } 182 183 var remainder = iso7064Mod97_10(iso13616Prepare(this.countryCode + '00' + bban)), 184 checkDigit = ('0' + (98 - remainder)).slice(-2); 185 186 return this.countryCode + checkDigit + bban; 187 }; 188 189 /** 190 * Check of the passed BBAN is valid. 191 * This function only checks the format of the BBAN (length and matching the letetr/number specs) but does not 192 * verify the check digit. 193 * 194 * @param bban the BBAN to validate 195 * @returns {boolean} true if the passed bban is a valid BBAN according to this specification, false otherwise 196 */ 197 Specification.prototype.isValidBBAN = function(bban) { 198 return this.length - 4 == bban.length 199 && this._regex().test(bban); 200 }; 201 202 var countries = {}; 203 204 function addSpecification(IBAN){ 205 countries[IBAN.countryCode] = IBAN; 206 } 207 208 addSpecification(new Specification("AD", 24, "F04F04A12", "AD1200012030200359100100")); 209 addSpecification(new Specification("AE", 23, "F03F16", "AE070331234567890123456")); 210 addSpecification(new Specification("AL", 28, "F08A16", "AL47212110090000000235698741")); 211 addSpecification(new Specification("AT", 20, "F05F11", "AT611904300234573201")); 212 addSpecification(new Specification("AZ", 28, "U04A20", "AZ21NABZ00000000137010001944")); 213 addSpecification(new Specification("BA", 20, "F03F03F08F02", "BA391290079401028494")); 214 addSpecification(new Specification("BE", 16, "F03F07F02", "BE68539007547034")); 215 addSpecification(new Specification("BG", 22, "U04F04F02A08", "BG80BNBG96611020345678")); 216 addSpecification(new Specification("BH", 22, "U04A14", "BH67BMAG00001299123456")); 217 addSpecification(new Specification("BR", 29, "F08F05F10U01A01", "BR9700360305000010009795493P1")); 218 addSpecification(new Specification("CH", 21, "F05A12", "CH9300762011623852957")); 219 addSpecification(new Specification("CR", 22, "F04F14", "CR72012300000171549015")); 220 addSpecification(new Specification("CY", 28, "F03F05A16", "CY17002001280000001200527600")); 221 addSpecification(new Specification("CZ", 24, "F04F06F10", "CZ6508000000192000145399")); 222 addSpecification(new Specification("DE", 22, "F08F10", "DE89370400440532013000")); 223 addSpecification(new Specification("DK", 18, "F04F09F01", "DK5000400440116243")); 224 addSpecification(new Specification("DO", 28, "U04F20", "DO28BAGR00000001212453611324")); 225 addSpecification(new Specification("EE", 20, "F02F02F11F01", "EE382200221020145685")); 226 addSpecification(new Specification("ES", 24, "F04F04F01F01F10", "ES9121000418450200051332")); 227 addSpecification(new Specification("FI", 18, "F06F07F01", "FI2112345600000785")); 228 addSpecification(new Specification("FO", 18, "F04F09F01", "FO6264600001631634")); 229 addSpecification(new Specification("FR", 27, "F05F05A11F02", "FR1420041010050500013M02606")); 230 addSpecification(new Specification("GB", 22, "U04F06F08", "GB29NWBK60161331926819")); 231 addSpecification(new Specification("GE", 22, "U02F16", "GE29NB0000000101904917")); 232 addSpecification(new Specification("GI", 23, "U04A15", "GI75NWBK000000007099453")); 233 addSpecification(new Specification("GL", 18, "F04F09F01", "GL8964710001000206")); 234 addSpecification(new Specification("GR", 27, "F03F04A16", "GR1601101250000000012300695")); 235 addSpecification(new Specification("GT", 28, "A04A20", "GT82TRAJ01020000001210029690")); 236 addSpecification(new Specification("HR", 21, "F07F10", "HR1210010051863000160")); 237 addSpecification(new Specification("HU", 28, "F03F04F01F15F01", "HU42117730161111101800000000")); 238 addSpecification(new Specification("IE", 22, "U04F06F08", "IE29AIBK93115212345678")); 239 addSpecification(new Specification("IL", 23, "F03F03F13", "IL620108000000099999999")); 240 addSpecification(new Specification("IS", 26, "F04F02F06F10", "IS140159260076545510730339")); 241 addSpecification(new Specification("IT", 27, "U01F05F05A12", "IT60X0542811101000000123456")); 242 addSpecification(new Specification("KW", 30, "U04A22", "KW81CBKU0000000000001234560101")); 243 addSpecification(new Specification("KZ", 20, "F03A13", "KZ86125KZT5004100100")); 244 addSpecification(new Specification("LB", 28, "F04A20", "LB62099900000001001901229114")); 245 addSpecification(new Specification("LC", 32, "U04F24", "LC07HEMM000100010012001200013015")); 246 addSpecification(new Specification("LI", 21, "F05A12", "LI21088100002324013AA")); 247 addSpecification(new Specification("LT", 20, "F05F11", "LT121000011101001000")); 248 addSpecification(new Specification("LU", 20, "F03A13", "LU280019400644750000")); 249 addSpecification(new Specification("LV", 21, "U04A13", "LV80BANK0000435195001")); 250 addSpecification(new Specification("MC", 27, "F05F05A11F02", "MC5811222000010123456789030")); 251 addSpecification(new Specification("MD", 24, "U02A18", "MD24AG000225100013104168")); 252 addSpecification(new Specification("ME", 22, "F03F13F02", "ME25505000012345678951")); 253 addSpecification(new Specification("MK", 19, "F03A10F02", "MK07250120000058984")); 254 addSpecification(new Specification("MR", 27, "F05F05F11F02", "MR1300020001010000123456753")); 255 addSpecification(new Specification("MT", 31, "U04F05A18", "MT84MALT011000012345MTLCAST001S")); 256 addSpecification(new Specification("MU", 30, "U04F02F02F12F03U03", "MU17BOMM0101101030300200000MUR")); 257 addSpecification(new Specification("NL", 18, "U04F10", "NL91ABNA0417164300")); 258 addSpecification(new Specification("NO", 15, "F04F06F01", "NO9386011117947")); 259 addSpecification(new Specification("PK", 24, "U04A16", "PK36SCBL0000001123456702")); 260 addSpecification(new Specification("PL", 28, "F08F16", "PL61109010140000071219812874")); 261 addSpecification(new Specification("PS", 29, "U04A21", "PS92PALS000000000400123456702")); 262 addSpecification(new Specification("PT", 25, "F04F04F11F02", "PT50000201231234567890154")); 263 addSpecification(new Specification("RO", 24, "U04A16", "RO49AAAA1B31007593840000")); 264 addSpecification(new Specification("RS", 22, "F03F13F02", "RS35260005601001611379")); 265 addSpecification(new Specification("SA", 24, "F02A18", "SA0380000000608010167519")); 266 addSpecification(new Specification("SE", 24, "F03F16F01", "SE4550000000058398257466")); 267 addSpecification(new Specification("SI", 19, "F05F08F02", "SI56263300012039086")); 268 addSpecification(new Specification("SK", 24, "F04F06F10", "SK3112000000198742637541")); 269 addSpecification(new Specification("SM", 27, "U01F05F05A12", "SM86U0322509800000000270100")); 270 addSpecification(new Specification("ST", 25, "F08F11F02", "ST68000100010051845310112")); 271 addSpecification(new Specification("TL", 23, "F03F14F02", "TL380080012345678910157")); 272 addSpecification(new Specification("TN", 24, "F02F03F13F02", "TN5910006035183598478831")); 273 addSpecification(new Specification("TR", 26, "F05F01A16", "TR330006100519786457841326")); 274 addSpecification(new Specification("VG", 24, "U04F16", "VG96VPVG0000012345678901"));
275 addSpecification(new Specification("XK", 20, "F04F10F02", "XK051212012345678906")); 276 277 // Angola 278 addSpecification(new Specification("AO", 25, "F21", "AO69123456789012345678901")); 279 // Burkina 280 addSpecification(new Specification("BF", 27, "F23", "BF2312345678901234567890123")); 281 // Burundi 282 addSpecification(new Specification("BI", 16, "F12", "BI41123456789012")); 283 // Benin 284 addSpecification(new Specification("BJ", 28, "F24", "BJ39123456789012345678901234")); 285 // Ivory 286 addSpecification(new Specification("CI", 28, "U01F23", "CI17A12345678901234567890123")); 287 // Cameron 288 addSpecification(new Specification("CM", 27, "F23", "CM9012345678901234567890123")); 289 // Cape Verde 290 addSpecification(new Specification("CV", 25, "F21", "CV30123456789012345678901")); 291 // Algeria 292 addSpecification(new Specification("DZ", 24, "F20", "DZ8612345678901234567890")); 293 // Iran 294 addSpecification(new Specification("IR", 26, "F22", "IR861234568790123456789012")); 295 // Jordan 296 addSpecification(new Specification("JO", 30, "A04F22", "JO15AAAA1234567890123456789012")); 297 // Madagascar 298 addSpecification(new Specification("MG", 27, "F23", "MG1812345678901234567890123")); 299 // Mali 300 addSpecification(new Specification("ML", 28, "U01F23", "ML15A12345678901234567890123")); 301 // Mozambique 302 addSpecification(new Specification("MZ", 25, "F21", "MZ25123456789012345678901")); 303 // Quatar 304 addSpecification(new Specification("QA", 29, "U04A21", "QA30AAAA123456789012345678901")); 305 // Senegal 306 addSpecification(new Specification("SN", 28, "U01F23", "SN52A12345678901234567890123")); 307 // Ukraine 308 addSpecification(new Specification("UA", 29, "F25", "UA511234567890123456789012345")); 309 310 var NON_ALPHANUM = /[^a-zA-Z0-9]/g, 311 EVERY_FOUR_CHARS =/(.{4})(?!$)/g; 312 313 /** 314 * Utility function to check if a variable is a String. 315 * 316 * @param v 317 * @returns {boolean} true if the passed variable is a String, false otherwise. 318 */ 319 function isString(v){ 320 return (typeof v == 'string' || v instanceof String); 321 } 322 323 /** 324 * Check if an IBAN is valid. 325 * 326 * @param {String} iban the IBAN to validate. 327 * @returns {boolean} true if the passed IBAN is valid, false otherwise 328 */ 329 exports.isValid = function(iban){ 330 if (!isString(iban)){ 331 return false; 332 } 333 iban = this.electronicFormat(iban); 334 var countryStructure = countries[iban.slice(0,2)]; 335 return !!countryStructure && countryStructure.isValid(iban); 336 }; 337 338 /** 339 * Convert an IBAN to a BBAN. 340 * 341 * @param iban 342 * @param {String} [separator] the separator to use between the blocks of the BBAN, defaults to ' ' 343 * @returns {string|*} 344 */ 345 exports.toBBAN = function(iban, separator){ 346 if (typeof separator == 'undefined'){ 347 separator = ' '; 348 } 349 iban = this.electronicFormat(iban); 350 var countryStructure = countries[iban.slice(0,2)]; 351 if (!countryStructure) { 352 throw new Error('No country with code ' + iban.slice(0,2)); 353 } 354 return countryStructure.toBBAN(iban, separator); 355 }; 356 357 /** 358 * Convert the passed BBAN to an IBAN for this country specification. 359 * Please note that <i>"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account"</i>. 360 * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits 361 * 362 * @param countryCode the country of the BBAN 363 * @param bban the BBAN to convert to IBAN 364 * @returns {string} the IBAN 365 */ 366 exports.fromBBAN = function(countryCode, bban){ 367 var countryStructure = countries[countryCode]; 368 if (!countryStructure) { 369 throw new Error('No country with code ' + countryCode); 370 } 371 return countryStructure.fromBBAN(this.electronicFormat(bban)); 372 }; 373 374 /** 375 * Check the validity of the passed BBAN. 376 * 377 * @param countryCode the country of the BBAN 378 * @param bban the BBAN to check the validity of 379 */ 380 exports.isValidBBAN = function(countryCode, bban){ 381 if (!isString(bban)){ 382 return false;
383 } 384 var countryStructure = countries[countryCode]; 385 return countryStructure && countryStructure.isValidBBAN(this.electronicFormat(bban)); 386 }; 387 388 /** 389 * 390 * @param iban 391 * @param separator 392 * @returns {string} 393 */ 394 exports.printFormat = function(iban, separator){ 395 if (typeof separator == 'undefined'){ 396 separator = ' '; 397 } 398 return this.electronicFormat(iban).replace(EVERY_FOUR_CHARS, "$1" + separator); 399 }; 400 401 /** 402 * 403 * @param iban 404 * @returns {string} 405 */ 406 exports.electronicFormat = function(iban){ 407 return iban.replace(NON_ALPHANUM, '').toUpperCase(); 408 }; 409 410 /** 411 * An object containing all the known IBAN specifications. 412 */ 413 exports.countries = countries; 414 415}));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.