mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2025-11-04 14:49:58 +08:00
272 lines
14 KiB
JavaScript
Executable File
272 lines
14 KiB
JavaScript
Executable File
/**
|
|
* iban validator
|
|
*
|
|
* @link http://formvalidation.io/validators/iban/
|
|
* @author https://twitter.com/nghuuphuoc
|
|
* @copyright (c) 2013 - 2015 Nguyen Huu Phuoc
|
|
* @license http://formvalidation.io/license/
|
|
*/
|
|
|
|
(function(root, factory) {
|
|
|
|
"use strict";
|
|
|
|
// AMD module is defined
|
|
if (typeof define === "function" && define.amd) {
|
|
define("validator/iban", ["jquery", "base"], factory);
|
|
} else {
|
|
// planted over the root!
|
|
factory(root.jQuery, root.FormValidation);
|
|
}
|
|
|
|
}(this, function ($, FormValidation) {
|
|
FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {
|
|
'en_US': {
|
|
iban: {
|
|
'default': 'Please enter a valid IBAN number',
|
|
country: 'Please enter a valid IBAN number in %s',
|
|
countries: {
|
|
AD: 'Andorra',
|
|
AE: 'United Arab Emirates',
|
|
AL: 'Albania',
|
|
AO: 'Angola',
|
|
AT: 'Austria',
|
|
AZ: 'Azerbaijan',
|
|
BA: 'Bosnia and Herzegovina',
|
|
BE: 'Belgium',
|
|
BF: 'Burkina Faso',
|
|
BG: 'Bulgaria',
|
|
BH: 'Bahrain',
|
|
BI: 'Burundi',
|
|
BJ: 'Benin',
|
|
BR: 'Brazil',
|
|
CH: 'Switzerland',
|
|
CI: 'Ivory Coast',
|
|
CM: 'Cameroon',
|
|
CR: 'Costa Rica',
|
|
CV: 'Cape Verde',
|
|
CY: 'Cyprus',
|
|
CZ: 'Czech Republic',
|
|
DE: 'Germany',
|
|
DK: 'Denmark',
|
|
DO: 'Dominican Republic',
|
|
DZ: 'Algeria',
|
|
EE: 'Estonia',
|
|
ES: 'Spain',
|
|
FI: 'Finland',
|
|
FO: 'Faroe Islands',
|
|
FR: 'France',
|
|
GB: 'United Kingdom',
|
|
GE: 'Georgia',
|
|
GI: 'Gibraltar',
|
|
GL: 'Greenland',
|
|
GR: 'Greece',
|
|
GT: 'Guatemala',
|
|
HR: 'Croatia',
|
|
HU: 'Hungary',
|
|
IE: 'Ireland',
|
|
IL: 'Israel',
|
|
IR: 'Iran',
|
|
IS: 'Iceland',
|
|
IT: 'Italy',
|
|
JO: 'Jordan',
|
|
KW: 'Kuwait',
|
|
KZ: 'Kazakhstan',
|
|
LB: 'Lebanon',
|
|
LI: 'Liechtenstein',
|
|
LT: 'Lithuania',
|
|
LU: 'Luxembourg',
|
|
LV: 'Latvia',
|
|
MC: 'Monaco',
|
|
MD: 'Moldova',
|
|
ME: 'Montenegro',
|
|
MG: 'Madagascar',
|
|
MK: 'Macedonia',
|
|
ML: 'Mali',
|
|
MR: 'Mauritania',
|
|
MT: 'Malta',
|
|
MU: 'Mauritius',
|
|
MZ: 'Mozambique',
|
|
NL: 'Netherlands',
|
|
NO: 'Norway',
|
|
PK: 'Pakistan',
|
|
PL: 'Poland',
|
|
PS: 'Palestine',
|
|
PT: 'Portugal',
|
|
QA: 'Qatar',
|
|
RO: 'Romania',
|
|
RS: 'Serbia',
|
|
SA: 'Saudi Arabia',
|
|
SE: 'Sweden',
|
|
SI: 'Slovenia',
|
|
SK: 'Slovakia',
|
|
SM: 'San Marino',
|
|
SN: 'Senegal',
|
|
TN: 'Tunisia',
|
|
TR: 'Turkey',
|
|
VG: 'Virgin Islands, British'
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
FormValidation.Validator.iban = {
|
|
html5Attributes: {
|
|
message: 'message',
|
|
country: 'country'
|
|
},
|
|
|
|
// http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf
|
|
// http://en.wikipedia.org/wiki/International_Bank_Account_Number#IBAN_formats_by_country
|
|
REGEX: {
|
|
AD: 'AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}', // Andorra
|
|
AE: 'AE[0-9]{2}[0-9]{3}[0-9]{16}', // United Arab Emirates
|
|
AL: 'AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}', // Albania
|
|
AO: 'AO[0-9]{2}[0-9]{21}', // Angola
|
|
AT: 'AT[0-9]{2}[0-9]{5}[0-9]{11}', // Austria
|
|
AZ: 'AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}', // Azerbaijan
|
|
BA: 'BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}', // Bosnia and Herzegovina
|
|
BE: 'BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}', // Belgium
|
|
BF: 'BF[0-9]{2}[0-9]{23}', // Burkina Faso
|
|
BG: 'BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}', // Bulgaria
|
|
BH: 'BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}', // Bahrain
|
|
BI: 'BI[0-9]{2}[0-9]{12}', // Burundi
|
|
BJ: 'BJ[0-9]{2}[A-Z]{1}[0-9]{23}', // Benin
|
|
BR: 'BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]', // Brazil
|
|
CH: 'CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}', // Switzerland
|
|
CI: 'CI[0-9]{2}[A-Z]{1}[0-9]{23}', // Ivory Coast
|
|
CM: 'CM[0-9]{2}[0-9]{23}', // Cameroon
|
|
CR: 'CR[0-9]{2}[0-9]{3}[0-9]{14}', // Costa Rica
|
|
CV: 'CV[0-9]{2}[0-9]{21}', // Cape Verde
|
|
CY: 'CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}', // Cyprus
|
|
CZ: 'CZ[0-9]{2}[0-9]{20}', // Czech Republic
|
|
DE: 'DE[0-9]{2}[0-9]{8}[0-9]{10}', // Germany
|
|
DK: 'DK[0-9]{2}[0-9]{14}', // Denmark
|
|
DO: 'DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}', // Dominican Republic
|
|
DZ: 'DZ[0-9]{2}[0-9]{20}', // Algeria
|
|
EE: 'EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}', // Estonia
|
|
ES: 'ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}', // Spain
|
|
FI: 'FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}', // Finland
|
|
FO: 'FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}', // Faroe Islands
|
|
FR: 'FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}', // France
|
|
GB: 'GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}', // United Kingdom
|
|
GE: 'GE[0-9]{2}[A-Z]{2}[0-9]{16}', // Georgia
|
|
GI: 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}', // Gibraltar
|
|
GL: 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}', // Greenland
|
|
GR: 'GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}', // Greece
|
|
GT: 'GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}', // Guatemala
|
|
HR: 'HR[0-9]{2}[0-9]{7}[0-9]{10}', // Croatia
|
|
HU: 'HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}', // Hungary
|
|
IE: 'IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}', // Ireland
|
|
IL: 'IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}', // Israel
|
|
IR: 'IR[0-9]{2}[0-9]{22}', // Iran
|
|
IS: 'IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}', // Iceland
|
|
IT: 'IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}', // Italy
|
|
JO: 'JO[0-9]{2}[A-Z]{4}[0-9]{4}[0]{8}[A-Z0-9]{10}', // Jordan
|
|
KW: 'KW[0-9]{2}[A-Z]{4}[0-9]{22}', // Kuwait
|
|
KZ: 'KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}', // Kazakhstan
|
|
LB: 'LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}', // Lebanon
|
|
LI: 'LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}', // Liechtenstein
|
|
LT: 'LT[0-9]{2}[0-9]{5}[0-9]{11}', // Lithuania
|
|
LU: 'LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}', // Luxembourg
|
|
LV: 'LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}', // Latvia
|
|
MC: 'MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}', // Monaco
|
|
MD: 'MD[0-9]{2}[A-Z0-9]{20}', // Moldova
|
|
ME: 'ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', // Montenegro
|
|
MG: 'MG[0-9]{2}[0-9]{23}', // Madagascar
|
|
MK: 'MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}', // Macedonia
|
|
ML: 'ML[0-9]{2}[A-Z]{1}[0-9]{23}', // Mali
|
|
MR: 'MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}', // Mauritania
|
|
MT: 'MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}', // Malta
|
|
MU: 'MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}', // Mauritius
|
|
MZ: 'MZ[0-9]{2}[0-9]{21}', // Mozambique
|
|
NL: 'NL[0-9]{2}[A-Z]{4}[0-9]{10}', // Netherlands
|
|
NO: 'NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}', // Norway
|
|
PK: 'PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', // Pakistan
|
|
PL: 'PL[0-9]{2}[0-9]{8}[0-9]{16}', // Poland
|
|
PS: 'PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}', // Palestinian
|
|
PT: 'PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}', // Portugal
|
|
QA: 'QA[0-9]{2}[A-Z]{4}[A-Z0-9]{21}', // Qatar
|
|
RO: 'RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', // Romania
|
|
RS: 'RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', // Serbia
|
|
SA: 'SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}', // Saudi Arabia
|
|
SE: 'SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}', // Sweden
|
|
SI: 'SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}', // Slovenia
|
|
SK: 'SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}', // Slovakia
|
|
SM: 'SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}', // San Marino
|
|
SN: 'SN[0-9]{2}[A-Z]{1}[0-9]{23}', // Senegal
|
|
TN: 'TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', // Tunisia
|
|
TR: 'TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}', // Turkey
|
|
VG: 'VG[0-9]{2}[A-Z]{4}[0-9]{16}' // Virgin Islands, British
|
|
},
|
|
|
|
/**
|
|
* Validate an International Bank Account Number (IBAN)
|
|
* To test it, take the sample IBAN from
|
|
* http://www.nordea.com/Our+services/International+products+and+services/Cash+Management/IBAN+countries/908462.html
|
|
*
|
|
* @param {FormValidation.Base} validator The validator plugin instance
|
|
* @param {jQuery} $field Field element
|
|
* @param {Object} options Can consist of the following keys:
|
|
* - message: The invalid message
|
|
* - country: The ISO 3166-1 country code. It can be
|
|
* - A country code
|
|
* - Name of field which its value defines the country code
|
|
* - Name of callback function that returns the country code
|
|
* - A callback function that returns the country code
|
|
* @returns {Boolean|Object}
|
|
*/
|
|
validate: function(validator, $field, options) {
|
|
var value = validator.getFieldValue($field, 'iban');
|
|
if (value === '') {
|
|
return true;
|
|
}
|
|
|
|
value = value.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();
|
|
var country = options.country;
|
|
if (!country) {
|
|
country = value.substr(0, 2);
|
|
} else if (typeof country !== 'string' || !this.REGEX[country]) {
|
|
// Determine the country code
|
|
country = validator.getDynamicOption($field, country);
|
|
}
|
|
|
|
var locale = validator.getLocale();
|
|
if (!this.REGEX[country]) {
|
|
return true;
|
|
}
|
|
|
|
if (!(new RegExp('^' + this.REGEX[country] + '$')).test(value)) {
|
|
return {
|
|
valid: false,
|
|
message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].iban.country, FormValidation.I18n[locale].iban.countries[country])
|
|
};
|
|
}
|
|
|
|
value = value.substr(4) + value.substr(0, 4);
|
|
value = $.map(value.split(''), function(n) {
|
|
var code = n.charCodeAt(0);
|
|
return (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0))
|
|
// Replace A, B, C, ..., Z with 10, 11, ..., 35
|
|
? (code - 'A'.charCodeAt(0) + 10)
|
|
: n;
|
|
});
|
|
value = value.join('');
|
|
|
|
var temp = parseInt(value.substr(0, 1), 10),
|
|
length = value.length;
|
|
for (var i = 1; i < length; ++i) {
|
|
temp = (temp * 10 + parseInt(value.substr(i, 1), 10)) % 97;
|
|
}
|
|
|
|
return {
|
|
valid: (temp === 1),
|
|
message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].iban.country, FormValidation.I18n[locale].iban.countries[country])
|
|
};
|
|
}
|
|
};
|
|
|
|
|
|
return FormValidation.Validator.iban;
|
|
}));
|