bootstrap_validator_rails 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/bootstrap_validator_rails/version.rb +1 -1
- data/vendor/assets/javascripts/bootstrapValidator.js +4677 -2
- data/vendor/assets/javascripts/bootstrapValidator.min.js +12 -0
- data/vendor/assets/stylesheets/bootstrapValidator.min.css +11 -0
- metadata +4 -48
- data/vendor/assets/javascripts/validator/base64.js +0 -25
- data/vendor/assets/javascripts/validator/between.js +0 -66
- data/vendor/assets/javascripts/validator/callback.js +0 -40
- data/vendor/assets/javascripts/validator/choice.js +0 -68
- data/vendor/assets/javascripts/validator/creditCard.js +0 -103
- data/vendor/assets/javascripts/validator/cusip.js +0 -55
- data/vendor/assets/javascripts/validator/cvv.js +0 -116
- data/vendor/assets/javascripts/validator/date.js +0 -118
- data/vendor/assets/javascripts/validator/different.js +0 -41
- data/vendor/assets/javascripts/validator/digits.js +0 -24
- data/vendor/assets/javascripts/validator/ean.js +0 -40
- data/vendor/assets/javascripts/validator/emailAddress.js +0 -31
- data/vendor/assets/javascripts/validator/file.js +0 -69
- data/vendor/assets/javascripts/validator/greaterThan.js +0 -61
- data/vendor/assets/javascripts/validator/grid.js +0 -37
- data/vendor/assets/javascripts/validator/hex.js +0 -25
- data/vendor/assets/javascripts/validator/hexColor.js +0 -28
- data/vendor/assets/javascripts/validator/iban.js +0 -246
- data/vendor/assets/javascripts/validator/id.js +0 -815
- data/vendor/assets/javascripts/validator/identical.js +0 -40
- data/vendor/assets/javascripts/validator/imei.js +0 -44
- data/vendor/assets/javascripts/validator/integer.js +0 -28
- data/vendor/assets/javascripts/validator/ip.js +0 -48
- data/vendor/assets/javascripts/validator/isbn.js +0 -86
- data/vendor/assets/javascripts/validator/isin.js +0 -59
- data/vendor/assets/javascripts/validator/ismn.js +0 -59
- data/vendor/assets/javascripts/validator/issn.js +0 -46
- data/vendor/assets/javascripts/validator/lessThan.js +0 -61
- data/vendor/assets/javascripts/validator/mac.js +0 -25
- data/vendor/assets/javascripts/validator/notEmpty.js +0 -32
- data/vendor/assets/javascripts/validator/numeric.js +0 -39
- data/vendor/assets/javascripts/validator/phone.js +0 -84
- data/vendor/assets/javascripts/validator/regexp.js +0 -42
- data/vendor/assets/javascripts/validator/remote.js +0 -70
- data/vendor/assets/javascripts/validator/rtn.js +0 -38
- data/vendor/assets/javascripts/validator/sedol.js +0 -40
- data/vendor/assets/javascripts/validator/siren.js +0 -28
- data/vendor/assets/javascripts/validator/siret.js +0 -38
- data/vendor/assets/javascripts/validator/step.js +0 -64
- data/vendor/assets/javascripts/validator/stringCase.js +0 -36
- data/vendor/assets/javascripts/validator/stringLength.js +0 -81
- data/vendor/assets/javascripts/validator/uri.js +0 -101
- data/vendor/assets/javascripts/validator/uuid.js +0 -46
- data/vendor/assets/javascripts/validator/vat.js +0 -1220
- data/vendor/assets/javascripts/validator/vin.js +0 -49
- data/vendor/assets/javascripts/validator/zipCode.js +0 -162
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3bcee7c8a61dd91c4e176534d1d3c5d59e2dbad
|
4
|
+
data.tar.gz: fd9254fc410ec6889354067f548c7192e5fbbdae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fa3b849f5aabed276fb214e81b1453a026ab52f1758e39ba3d9004e2bdc64e3366f61f830e9854ab868957519eb97f59290d832c771c9b150d3927fd15b6152
|
7
|
+
data.tar.gz: a6f054a0355e1123ee92cbb4bd54367025d92230af8556be114ddc05252348284f351e591323c2562bad2e7a5bfd64c74844d067b240a921599b3b6ffa25cb69
|
@@ -1,8 +1,9 @@
|
|
1
|
-
|
1
|
+
/*!
|
2
2
|
* BootstrapValidator (http://bootstrapvalidator.com)
|
3
3
|
* The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
|
4
4
|
*
|
5
|
-
* @
|
5
|
+
* @version v0.5.0, built on 2014-07-14 4:31:02 PM
|
6
|
+
* @author https://twitter.com/nghuuphuoc
|
6
7
|
* @copyright (c) 2013 - 2014 Nguyen Huu Phuoc
|
7
8
|
* @license MIT
|
8
9
|
*/
|
@@ -1801,3 +1802,4677 @@
|
|
1801
1802
|
}
|
1802
1803
|
};
|
1803
1804
|
}(window.jQuery));
|
1805
|
+
;(function($) {
|
1806
|
+
$.fn.bootstrapValidator.i18n.base64 = $.extend($.fn.bootstrapValidator.i18n.base64 || {}, {
|
1807
|
+
'default': 'Please enter a valid base 64 encoded'
|
1808
|
+
});
|
1809
|
+
|
1810
|
+
$.fn.bootstrapValidator.validators.base64 = {
|
1811
|
+
/**
|
1812
|
+
* Return true if the input value is a base 64 encoded string.
|
1813
|
+
*
|
1814
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
1815
|
+
* @param {jQuery} $field Field element
|
1816
|
+
* @param {Object} options Can consist of the following keys:
|
1817
|
+
* - message: The invalid message
|
1818
|
+
* @returns {Boolean}
|
1819
|
+
*/
|
1820
|
+
validate: function(validator, $field, options) {
|
1821
|
+
var value = $field.val();
|
1822
|
+
if (value === '') {
|
1823
|
+
return true;
|
1824
|
+
}
|
1825
|
+
|
1826
|
+
return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(value);
|
1827
|
+
}
|
1828
|
+
};
|
1829
|
+
}(window.jQuery));
|
1830
|
+
;(function($) {
|
1831
|
+
$.fn.bootstrapValidator.i18n.between = $.extend($.fn.bootstrapValidator.i18n.between || {}, {
|
1832
|
+
'default': 'Please enter a value between %s and %s',
|
1833
|
+
notInclusive: 'Please enter a value between %s and %s strictly'
|
1834
|
+
});
|
1835
|
+
|
1836
|
+
$.fn.bootstrapValidator.validators.between = {
|
1837
|
+
html5Attributes: {
|
1838
|
+
message: 'message',
|
1839
|
+
min: 'min',
|
1840
|
+
max: 'max',
|
1841
|
+
inclusive: 'inclusive'
|
1842
|
+
},
|
1843
|
+
|
1844
|
+
enableByHtml5: function($field) {
|
1845
|
+
if ('range' === $field.attr('type')) {
|
1846
|
+
return {
|
1847
|
+
min: $field.attr('min'),
|
1848
|
+
max: $field.attr('max')
|
1849
|
+
};
|
1850
|
+
}
|
1851
|
+
|
1852
|
+
return false;
|
1853
|
+
},
|
1854
|
+
|
1855
|
+
/**
|
1856
|
+
* Return true if the input value is between (strictly or not) two given numbers
|
1857
|
+
*
|
1858
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
1859
|
+
* @param {jQuery} $field Field element
|
1860
|
+
* @param {Object} options Can consist of the following keys:
|
1861
|
+
* - min
|
1862
|
+
* - max
|
1863
|
+
*
|
1864
|
+
* The min, max keys define the number which the field value compares to. min, max can be
|
1865
|
+
* - A number
|
1866
|
+
* - Name of field which its value defines the number
|
1867
|
+
* - Name of callback function that returns the number
|
1868
|
+
* - A callback function that returns the number
|
1869
|
+
*
|
1870
|
+
* - inclusive [optional]: Can be true or false. Default is true
|
1871
|
+
* - message: The invalid message
|
1872
|
+
* @returns {Boolean|Object}
|
1873
|
+
*/
|
1874
|
+
validate: function(validator, $field, options) {
|
1875
|
+
var value = $field.val();
|
1876
|
+
if (value === '') {
|
1877
|
+
return true;
|
1878
|
+
}
|
1879
|
+
|
1880
|
+
var min = $.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min),
|
1881
|
+
max = $.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max);
|
1882
|
+
|
1883
|
+
value = parseFloat(value);
|
1884
|
+
return (options.inclusive === true || options.inclusive === undefined)
|
1885
|
+
? {
|
1886
|
+
valid: value >= min && value <= max,
|
1887
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.between['default'], [min, max])
|
1888
|
+
}
|
1889
|
+
: {
|
1890
|
+
valid: value > min && value < max,
|
1891
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.between.notInclusive, [min, max])
|
1892
|
+
};
|
1893
|
+
}
|
1894
|
+
};
|
1895
|
+
}(window.jQuery));
|
1896
|
+
;(function($) {
|
1897
|
+
$.fn.bootstrapValidator.i18n.callback = $.extend($.fn.bootstrapValidator.i18n.callback || {}, {
|
1898
|
+
'default': 'Please enter a valid value'
|
1899
|
+
});
|
1900
|
+
|
1901
|
+
$.fn.bootstrapValidator.validators.callback = {
|
1902
|
+
html5Attributes: {
|
1903
|
+
message: 'message',
|
1904
|
+
callback: 'callback'
|
1905
|
+
},
|
1906
|
+
|
1907
|
+
/**
|
1908
|
+
* Return result from the callback method
|
1909
|
+
*
|
1910
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
1911
|
+
* @param {jQuery} $field Field element
|
1912
|
+
* @param {Object} options Can consist of the following keys:
|
1913
|
+
* - callback: The callback method that passes 2 parameters:
|
1914
|
+
* callback: function(fieldValue, validator, $field) {
|
1915
|
+
* // fieldValue is the value of field
|
1916
|
+
* // validator is instance of BootstrapValidator
|
1917
|
+
* // $field is the field element
|
1918
|
+
* }
|
1919
|
+
* - message: The invalid message
|
1920
|
+
* @returns {Boolean|Deferred}
|
1921
|
+
*/
|
1922
|
+
validate: function(validator, $field, options) {
|
1923
|
+
var value = $field.val();
|
1924
|
+
|
1925
|
+
if (options.callback) {
|
1926
|
+
var dfd = new $.Deferred(),
|
1927
|
+
response = $.fn.bootstrapValidator.helpers.call(options.callback, [value, validator, $field]);
|
1928
|
+
dfd.resolve($field, 'callback', 'boolean' === typeof response ? response : response.valid, 'object' === typeof response && response.message ? response.message : null);
|
1929
|
+
return dfd;
|
1930
|
+
}
|
1931
|
+
|
1932
|
+
return true;
|
1933
|
+
}
|
1934
|
+
};
|
1935
|
+
}(window.jQuery));
|
1936
|
+
;(function($) {
|
1937
|
+
$.fn.bootstrapValidator.i18n.choice = $.extend($.fn.bootstrapValidator.i18n.choice || {}, {
|
1938
|
+
'default': 'Please enter a valid value',
|
1939
|
+
less: 'Please choose %s options at minimum',
|
1940
|
+
more: 'Please choose %s options at maximum',
|
1941
|
+
between: 'Please choose %s - %s options'
|
1942
|
+
});
|
1943
|
+
|
1944
|
+
$.fn.bootstrapValidator.validators.choice = {
|
1945
|
+
html5Attributes: {
|
1946
|
+
message: 'message',
|
1947
|
+
min: 'min',
|
1948
|
+
max: 'max'
|
1949
|
+
},
|
1950
|
+
|
1951
|
+
/**
|
1952
|
+
* Check if the number of checked boxes are less or more than a given number
|
1953
|
+
*
|
1954
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
1955
|
+
* @param {jQuery} $field Field element
|
1956
|
+
* @param {Object} options Consists of following keys:
|
1957
|
+
* - min
|
1958
|
+
* - max
|
1959
|
+
*
|
1960
|
+
* At least one of two keys is required
|
1961
|
+
* The min, max keys define the number which the field value compares to. min, max can be
|
1962
|
+
* - A number
|
1963
|
+
* - Name of field which its value defines the number
|
1964
|
+
* - Name of callback function that returns the number
|
1965
|
+
* - A callback function that returns the number
|
1966
|
+
*
|
1967
|
+
* - message: The invalid message
|
1968
|
+
* @returns {Object}
|
1969
|
+
*/
|
1970
|
+
validate: function(validator, $field, options) {
|
1971
|
+
var numChoices = $field.is('select')
|
1972
|
+
? validator.getFieldElements($field.attr('data-bv-field')).find('option').filter(':selected').length
|
1973
|
+
: validator.getFieldElements($field.attr('data-bv-field')).filter(':checked').length,
|
1974
|
+
min = options.min ? ($.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min)) : null,
|
1975
|
+
max = options.max ? ($.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max)) : null,
|
1976
|
+
isValid = true,
|
1977
|
+
message = options.message || $.fn.bootstrapValidator.i18n.choice['default'];
|
1978
|
+
|
1979
|
+
if ((min && numChoices < parseInt(min, 10)) || (max && numChoices > parseInt(max, 10))) {
|
1980
|
+
isValid = false;
|
1981
|
+
}
|
1982
|
+
|
1983
|
+
switch (true) {
|
1984
|
+
case (!!min && !!max):
|
1985
|
+
message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.choice.between, [parseInt(min, 10), parseInt(max, 10)]);
|
1986
|
+
break;
|
1987
|
+
|
1988
|
+
case (!!min):
|
1989
|
+
message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.choice.less, parseInt(min, 10));
|
1990
|
+
break;
|
1991
|
+
|
1992
|
+
case (!!max):
|
1993
|
+
message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.choice.more, parseInt(max, 10));
|
1994
|
+
break;
|
1995
|
+
|
1996
|
+
default:
|
1997
|
+
break;
|
1998
|
+
}
|
1999
|
+
|
2000
|
+
return { valid: isValid, message: message };
|
2001
|
+
}
|
2002
|
+
};
|
2003
|
+
}(window.jQuery));
|
2004
|
+
;(function($) {
|
2005
|
+
$.fn.bootstrapValidator.i18n.creditCard = $.extend($.fn.bootstrapValidator.i18n.creditCard || {}, {
|
2006
|
+
'default': 'Please enter a valid credit card number'
|
2007
|
+
});
|
2008
|
+
|
2009
|
+
$.fn.bootstrapValidator.validators.creditCard = {
|
2010
|
+
/**
|
2011
|
+
* Return true if the input value is valid credit card number
|
2012
|
+
* Based on https://gist.github.com/DiegoSalazar/4075533
|
2013
|
+
*
|
2014
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2015
|
+
* @param {jQuery} $field Field element
|
2016
|
+
* @param {Object} [options] Can consist of the following key:
|
2017
|
+
* - message: The invalid message
|
2018
|
+
* @returns {Boolean}
|
2019
|
+
*/
|
2020
|
+
validate: function(validator, $field, options) {
|
2021
|
+
var value = $field.val();
|
2022
|
+
if (value === '') {
|
2023
|
+
return true;
|
2024
|
+
}
|
2025
|
+
|
2026
|
+
// Accept only digits, dashes or spaces
|
2027
|
+
if (/[^0-9-\s]+/.test(value)) {
|
2028
|
+
return false;
|
2029
|
+
}
|
2030
|
+
value = value.replace(/\D/g, '');
|
2031
|
+
|
2032
|
+
if (!$.fn.bootstrapValidator.helpers.luhn(value)) {
|
2033
|
+
return false;
|
2034
|
+
}
|
2035
|
+
|
2036
|
+
// Validate the card number based on prefix (IIN ranges) and length
|
2037
|
+
var cards = {
|
2038
|
+
AMERICAN_EXPRESS: {
|
2039
|
+
length: [15],
|
2040
|
+
prefix: ['34', '37']
|
2041
|
+
},
|
2042
|
+
DINERS_CLUB: {
|
2043
|
+
length: [14],
|
2044
|
+
prefix: ['300', '301', '302', '303', '304', '305', '36']
|
2045
|
+
},
|
2046
|
+
DINERS_CLUB_US: {
|
2047
|
+
length: [16],
|
2048
|
+
prefix: ['54', '55']
|
2049
|
+
},
|
2050
|
+
DISCOVER: {
|
2051
|
+
length: [16],
|
2052
|
+
prefix: ['6011', '622126', '622127', '622128', '622129', '62213',
|
2053
|
+
'62214', '62215', '62216', '62217', '62218', '62219',
|
2054
|
+
'6222', '6223', '6224', '6225', '6226', '6227', '6228',
|
2055
|
+
'62290', '62291', '622920', '622921', '622922', '622923',
|
2056
|
+
'622924', '622925', '644', '645', '646', '647', '648',
|
2057
|
+
'649', '65']
|
2058
|
+
},
|
2059
|
+
JCB: {
|
2060
|
+
length: [16],
|
2061
|
+
prefix: ['3528', '3529', '353', '354', '355', '356', '357', '358']
|
2062
|
+
},
|
2063
|
+
LASER: {
|
2064
|
+
length: [16, 17, 18, 19],
|
2065
|
+
prefix: ['6304', '6706', '6771', '6709']
|
2066
|
+
},
|
2067
|
+
MAESTRO: {
|
2068
|
+
length: [12, 13, 14, 15, 16, 17, 18, 19],
|
2069
|
+
prefix: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']
|
2070
|
+
},
|
2071
|
+
MASTERCARD: {
|
2072
|
+
length: [16],
|
2073
|
+
prefix: ['51', '52', '53', '54', '55']
|
2074
|
+
},
|
2075
|
+
SOLO: {
|
2076
|
+
length: [16, 18, 19],
|
2077
|
+
prefix: ['6334', '6767']
|
2078
|
+
},
|
2079
|
+
UNIONPAY: {
|
2080
|
+
length: [16, 17, 18, 19],
|
2081
|
+
prefix: ['622126', '622127', '622128', '622129', '62213', '62214',
|
2082
|
+
'62215', '62216', '62217', '62218', '62219', '6222', '6223',
|
2083
|
+
'6224', '6225', '6226', '6227', '6228', '62290', '62291',
|
2084
|
+
'622920', '622921', '622922', '622923', '622924', '622925']
|
2085
|
+
},
|
2086
|
+
VISA: {
|
2087
|
+
length: [16],
|
2088
|
+
prefix: ['4']
|
2089
|
+
}
|
2090
|
+
};
|
2091
|
+
|
2092
|
+
var type, i;
|
2093
|
+
for (type in cards) {
|
2094
|
+
for (i in cards[type].prefix) {
|
2095
|
+
if (value.substr(0, cards[type].prefix[i].length) === cards[type].prefix[i] // Check the prefix
|
2096
|
+
&& $.inArray(value.length, cards[type].length) !== -1) // and length
|
2097
|
+
{
|
2098
|
+
return true;
|
2099
|
+
}
|
2100
|
+
}
|
2101
|
+
}
|
2102
|
+
|
2103
|
+
return false;
|
2104
|
+
}
|
2105
|
+
};
|
2106
|
+
}(window.jQuery));
|
2107
|
+
;(function($) {
|
2108
|
+
$.fn.bootstrapValidator.i18n.cusip = $.extend($.fn.bootstrapValidator.i18n.cusip || {}, {
|
2109
|
+
'default': 'Please enter a valid CUSIP number'
|
2110
|
+
});
|
2111
|
+
|
2112
|
+
$.fn.bootstrapValidator.validators.cusip = {
|
2113
|
+
/**
|
2114
|
+
* Validate a CUSIP
|
2115
|
+
* Examples:
|
2116
|
+
* - Valid: 037833100, 931142103, 14149YAR8, 126650BG6
|
2117
|
+
* - Invalid: 31430F200, 022615AC2
|
2118
|
+
*
|
2119
|
+
* @see http://en.wikipedia.org/wiki/CUSIP
|
2120
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2121
|
+
* @param {jQuery} $field Field element
|
2122
|
+
* @param {Object} [options] Can consist of the following keys:
|
2123
|
+
* - message: The invalid message
|
2124
|
+
* @returns {Boolean}
|
2125
|
+
*/
|
2126
|
+
validate: function(validator, $field, options) {
|
2127
|
+
var value = $field.val();
|
2128
|
+
if (value === '') {
|
2129
|
+
return true;
|
2130
|
+
}
|
2131
|
+
|
2132
|
+
value = value.toUpperCase();
|
2133
|
+
if (!/^[0-9A-Z]{9}$/.test(value)) {
|
2134
|
+
return false;
|
2135
|
+
}
|
2136
|
+
|
2137
|
+
var converted = $.map(value.split(''), function(item) {
|
2138
|
+
var code = item.charCodeAt(0);
|
2139
|
+
return (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0))
|
2140
|
+
// Replace A, B, C, ..., Z with 10, 11, ..., 35
|
2141
|
+
? (code - 'A'.charCodeAt(0) + 10)
|
2142
|
+
: item;
|
2143
|
+
}),
|
2144
|
+
length = converted.length,
|
2145
|
+
sum = 0;
|
2146
|
+
for (var i = 0; i < length - 1; i++) {
|
2147
|
+
var num = parseInt(converted[i], 10);
|
2148
|
+
if (i % 2 !== 0) {
|
2149
|
+
num *= 2;
|
2150
|
+
}
|
2151
|
+
if (num > 9) {
|
2152
|
+
num -= 9;
|
2153
|
+
}
|
2154
|
+
sum += num;
|
2155
|
+
}
|
2156
|
+
|
2157
|
+
sum = (10 - (sum % 10)) % 10;
|
2158
|
+
return sum === converted[length - 1];
|
2159
|
+
}
|
2160
|
+
};
|
2161
|
+
}(window.jQuery));
|
2162
|
+
;(function($) {
|
2163
|
+
$.fn.bootstrapValidator.i18n.cvv = $.extend($.fn.bootstrapValidator.i18n.cvv || {}, {
|
2164
|
+
'default': 'Please enter a valid CVV number'
|
2165
|
+
});
|
2166
|
+
|
2167
|
+
$.fn.bootstrapValidator.validators.cvv = {
|
2168
|
+
html5Attributes: {
|
2169
|
+
message: 'message',
|
2170
|
+
ccfield: 'creditCardField'
|
2171
|
+
},
|
2172
|
+
|
2173
|
+
/**
|
2174
|
+
* Return true if the input value is a valid CVV number.
|
2175
|
+
*
|
2176
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2177
|
+
* @param {jQuery} $field Field element
|
2178
|
+
* @param {Object} options Can consist of the following keys:
|
2179
|
+
* - creditCardField: The credit card number field. It can be null
|
2180
|
+
* - message: The invalid message
|
2181
|
+
* @returns {Boolean}
|
2182
|
+
*/
|
2183
|
+
validate: function(validator, $field, options) {
|
2184
|
+
var value = $field.val();
|
2185
|
+
if (value === '') {
|
2186
|
+
return true;
|
2187
|
+
}
|
2188
|
+
|
2189
|
+
if (!/^[0-9]{3,4}$/.test(value)) {
|
2190
|
+
return false;
|
2191
|
+
}
|
2192
|
+
|
2193
|
+
if (!options.creditCardField) {
|
2194
|
+
return true;
|
2195
|
+
}
|
2196
|
+
|
2197
|
+
// Get the credit card number
|
2198
|
+
var creditCard = validator.getFieldElements(options.creditCardField).val();
|
2199
|
+
if (creditCard === '') {
|
2200
|
+
return true;
|
2201
|
+
}
|
2202
|
+
|
2203
|
+
creditCard = creditCard.replace(/\D/g, '');
|
2204
|
+
|
2205
|
+
// Supported credit card types
|
2206
|
+
var cards = {
|
2207
|
+
AMERICAN_EXPRESS: {
|
2208
|
+
length: [15],
|
2209
|
+
prefix: ['34', '37']
|
2210
|
+
},
|
2211
|
+
DINERS_CLUB: {
|
2212
|
+
length: [14],
|
2213
|
+
prefix: ['300', '301', '302', '303', '304', '305', '36']
|
2214
|
+
},
|
2215
|
+
DINERS_CLUB_US: {
|
2216
|
+
length: [16],
|
2217
|
+
prefix: ['54', '55']
|
2218
|
+
},
|
2219
|
+
DISCOVER: {
|
2220
|
+
length: [16],
|
2221
|
+
prefix: ['6011', '622126', '622127', '622128', '622129', '62213',
|
2222
|
+
'62214', '62215', '62216', '62217', '62218', '62219',
|
2223
|
+
'6222', '6223', '6224', '6225', '6226', '6227', '6228',
|
2224
|
+
'62290', '62291', '622920', '622921', '622922', '622923',
|
2225
|
+
'622924', '622925', '644', '645', '646', '647', '648',
|
2226
|
+
'649', '65']
|
2227
|
+
},
|
2228
|
+
JCB: {
|
2229
|
+
length: [16],
|
2230
|
+
prefix: ['3528', '3529', '353', '354', '355', '356', '357', '358']
|
2231
|
+
},
|
2232
|
+
LASER: {
|
2233
|
+
length: [16, 17, 18, 19],
|
2234
|
+
prefix: ['6304', '6706', '6771', '6709']
|
2235
|
+
},
|
2236
|
+
MAESTRO: {
|
2237
|
+
length: [12, 13, 14, 15, 16, 17, 18, 19],
|
2238
|
+
prefix: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']
|
2239
|
+
},
|
2240
|
+
MASTERCARD: {
|
2241
|
+
length: [16],
|
2242
|
+
prefix: ['51', '52', '53', '54', '55']
|
2243
|
+
},
|
2244
|
+
SOLO: {
|
2245
|
+
length: [16, 18, 19],
|
2246
|
+
prefix: ['6334', '6767']
|
2247
|
+
},
|
2248
|
+
UNIONPAY: {
|
2249
|
+
length: [16, 17, 18, 19],
|
2250
|
+
prefix: ['622126', '622127', '622128', '622129', '62213', '62214',
|
2251
|
+
'62215', '62216', '62217', '62218', '62219', '6222', '6223',
|
2252
|
+
'6224', '6225', '6226', '6227', '6228', '62290', '62291',
|
2253
|
+
'622920', '622921', '622922', '622923', '622924', '622925']
|
2254
|
+
},
|
2255
|
+
VISA: {
|
2256
|
+
length: [16],
|
2257
|
+
prefix: ['4']
|
2258
|
+
}
|
2259
|
+
};
|
2260
|
+
var type, i, creditCardType = null;
|
2261
|
+
for (type in cards) {
|
2262
|
+
for (i in cards[type].prefix) {
|
2263
|
+
if (creditCard.substr(0, cards[type].prefix[i].length) === cards[type].prefix[i] // Check the prefix
|
2264
|
+
&& $.inArray(creditCard.length, cards[type].length) !== -1) // and length
|
2265
|
+
{
|
2266
|
+
creditCardType = type;
|
2267
|
+
break;
|
2268
|
+
}
|
2269
|
+
}
|
2270
|
+
}
|
2271
|
+
|
2272
|
+
return (creditCardType === null)
|
2273
|
+
? false
|
2274
|
+
: (('AMERICAN_EXPRESS' === creditCardType) ? (value.length === 4) : (value.length === 3));
|
2275
|
+
}
|
2276
|
+
};
|
2277
|
+
}(window.jQuery));
|
2278
|
+
;(function($) {
|
2279
|
+
$.fn.bootstrapValidator.i18n.date = $.extend($.fn.bootstrapValidator.i18n.date || {}, {
|
2280
|
+
'default': 'Please enter a valid date'
|
2281
|
+
});
|
2282
|
+
|
2283
|
+
$.fn.bootstrapValidator.validators.date = {
|
2284
|
+
html5Attributes: {
|
2285
|
+
message: 'message',
|
2286
|
+
format: 'format',
|
2287
|
+
separator: 'separator'
|
2288
|
+
},
|
2289
|
+
|
2290
|
+
/**
|
2291
|
+
* Return true if the input value is valid date
|
2292
|
+
*
|
2293
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2294
|
+
* @param {jQuery} $field Field element
|
2295
|
+
* @param {Object} options Can consist of the following keys:
|
2296
|
+
* - message: The invalid message
|
2297
|
+
* - separator: Use to separate the date, month, and year.
|
2298
|
+
* By default, it is /
|
2299
|
+
* - format: The date format. Default is MM/DD/YYYY
|
2300
|
+
* The format can be:
|
2301
|
+
*
|
2302
|
+
* i) date: Consist of DD, MM, YYYY parts which are separated by the separator option
|
2303
|
+
* ii) date and time:
|
2304
|
+
* The time can consist of h, m, s parts which are separated by :
|
2305
|
+
* ii) date, time and A (indicating AM or PM)
|
2306
|
+
* @returns {Boolean}
|
2307
|
+
*/
|
2308
|
+
validate: function(validator, $field, options) {
|
2309
|
+
var value = $field.val();
|
2310
|
+
if (value === '') {
|
2311
|
+
return true;
|
2312
|
+
}
|
2313
|
+
|
2314
|
+
options.format = options.format || 'MM/DD/YYYY';
|
2315
|
+
|
2316
|
+
var formats = options.format.split(' '),
|
2317
|
+
dateFormat = formats[0],
|
2318
|
+
timeFormat = (formats.length > 1) ? formats[1] : null,
|
2319
|
+
amOrPm = (formats.length > 2) ? formats[2] : null,
|
2320
|
+
sections = value.split(' '),
|
2321
|
+
date = sections[0],
|
2322
|
+
time = (sections.length > 1) ? sections[1] : null;
|
2323
|
+
|
2324
|
+
if (formats.length !== sections.length) {
|
2325
|
+
return false;
|
2326
|
+
}
|
2327
|
+
|
2328
|
+
// Determine the separator
|
2329
|
+
var separator = options.separator;
|
2330
|
+
if (!separator) {
|
2331
|
+
separator = (date.indexOf('/') !== -1) ? '/' : ((date.indexOf('-') !== -1) ? '-' : null);
|
2332
|
+
}
|
2333
|
+
if (separator === null || date.indexOf(separator) === -1) {
|
2334
|
+
return false;
|
2335
|
+
}
|
2336
|
+
|
2337
|
+
// Determine the date
|
2338
|
+
date = date.split(separator);
|
2339
|
+
dateFormat = dateFormat.split(separator);
|
2340
|
+
if (date.length !== dateFormat.length) {
|
2341
|
+
return false;
|
2342
|
+
}
|
2343
|
+
|
2344
|
+
var year = date[$.inArray('YYYY', dateFormat)],
|
2345
|
+
month = date[$.inArray('MM', dateFormat)],
|
2346
|
+
day = date[$.inArray('DD', dateFormat)];
|
2347
|
+
|
2348
|
+
if (!year || !month || !day) {
|
2349
|
+
return false;
|
2350
|
+
}
|
2351
|
+
|
2352
|
+
// Determine the time
|
2353
|
+
var minutes = null, hours = null, seconds = null;
|
2354
|
+
if (timeFormat) {
|
2355
|
+
timeFormat = timeFormat.split(':');
|
2356
|
+
time = time.split(':');
|
2357
|
+
|
2358
|
+
if (timeFormat.length !== time.length) {
|
2359
|
+
return false;
|
2360
|
+
}
|
2361
|
+
|
2362
|
+
hours = time.length > 0 ? time[0] : null;
|
2363
|
+
minutes = time.length > 1 ? time[1] : null;
|
2364
|
+
seconds = time.length > 2 ? time[2] : null;
|
2365
|
+
|
2366
|
+
// Validate seconds
|
2367
|
+
if (seconds) {
|
2368
|
+
seconds = parseInt(seconds, 10);
|
2369
|
+
if (isNaN(seconds) || seconds < 0 || seconds > 60) {
|
2370
|
+
return false;
|
2371
|
+
}
|
2372
|
+
}
|
2373
|
+
|
2374
|
+
// Validate hours
|
2375
|
+
if (hours) {
|
2376
|
+
hours = parseInt(hours, 10);
|
2377
|
+
if (isNaN(hours) || hours < 0 || hours >= 24 || (amOrPm && hours > 12)) {
|
2378
|
+
return false;
|
2379
|
+
}
|
2380
|
+
}
|
2381
|
+
|
2382
|
+
// Validate minutes
|
2383
|
+
if (minutes) {
|
2384
|
+
minutes = parseInt(minutes, 10);
|
2385
|
+
if (isNaN(minutes) || minutes < 0 || minutes > 59) {
|
2386
|
+
return false;
|
2387
|
+
}
|
2388
|
+
}
|
2389
|
+
}
|
2390
|
+
|
2391
|
+
// Validate day, month, and year
|
2392
|
+
return $.fn.bootstrapValidator.helpers.date(year, month, day);
|
2393
|
+
}
|
2394
|
+
};
|
2395
|
+
}(window.jQuery));
|
2396
|
+
;(function($) {
|
2397
|
+
$.fn.bootstrapValidator.i18n.different = $.extend($.fn.bootstrapValidator.i18n.different || {}, {
|
2398
|
+
'default': 'Please enter a different value'
|
2399
|
+
});
|
2400
|
+
|
2401
|
+
$.fn.bootstrapValidator.validators.different = {
|
2402
|
+
html5Attributes: {
|
2403
|
+
message: 'message',
|
2404
|
+
field: 'field'
|
2405
|
+
},
|
2406
|
+
|
2407
|
+
/**
|
2408
|
+
* Return true if the input value is different with given field's value
|
2409
|
+
*
|
2410
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2411
|
+
* @param {jQuery} $field Field element
|
2412
|
+
* @param {Object} options Consists of the following key:
|
2413
|
+
* - field: The name of field that will be used to compare with current one
|
2414
|
+
* - message: The invalid message
|
2415
|
+
* @returns {Boolean}
|
2416
|
+
*/
|
2417
|
+
validate: function(validator, $field, options) {
|
2418
|
+
var value = $field.val();
|
2419
|
+
if (value === '') {
|
2420
|
+
return true;
|
2421
|
+
}
|
2422
|
+
|
2423
|
+
var compareWith = validator.getFieldElements(options.field);
|
2424
|
+
if (compareWith === null) {
|
2425
|
+
return true;
|
2426
|
+
}
|
2427
|
+
|
2428
|
+
if (value !== compareWith.val()) {
|
2429
|
+
validator.updateStatus(options.field, validator.STATUS_VALID, 'different');
|
2430
|
+
return true;
|
2431
|
+
} else {
|
2432
|
+
return false;
|
2433
|
+
}
|
2434
|
+
}
|
2435
|
+
};
|
2436
|
+
}(window.jQuery));
|
2437
|
+
;(function($) {
|
2438
|
+
$.fn.bootstrapValidator.i18n.digits = $.extend($.fn.bootstrapValidator.i18n.digits || {}, {
|
2439
|
+
'default': 'Please enter only digits'
|
2440
|
+
});
|
2441
|
+
|
2442
|
+
$.fn.bootstrapValidator.validators.digits = {
|
2443
|
+
/**
|
2444
|
+
* Return true if the input value contains digits only
|
2445
|
+
*
|
2446
|
+
* @param {BootstrapValidator} validator Validate plugin instance
|
2447
|
+
* @param {jQuery} $field Field element
|
2448
|
+
* @param {Object} [options]
|
2449
|
+
* @returns {Boolean}
|
2450
|
+
*/
|
2451
|
+
validate: function(validator, $field, options) {
|
2452
|
+
var value = $field.val();
|
2453
|
+
if (value === '') {
|
2454
|
+
return true;
|
2455
|
+
}
|
2456
|
+
|
2457
|
+
return /^\d+$/.test(value);
|
2458
|
+
}
|
2459
|
+
};
|
2460
|
+
}(window.jQuery));
|
2461
|
+
;(function($) {
|
2462
|
+
$.fn.bootstrapValidator.i18n.ean = $.extend($.fn.bootstrapValidator.i18n.ean || {}, {
|
2463
|
+
'default': 'Please enter a valid EAN number'
|
2464
|
+
});
|
2465
|
+
|
2466
|
+
$.fn.bootstrapValidator.validators.ean = {
|
2467
|
+
/**
|
2468
|
+
* Validate EAN (International Article Number)
|
2469
|
+
* Examples:
|
2470
|
+
* - Valid: 73513537, 9780471117094, 4006381333931
|
2471
|
+
* - Invalid: 73513536
|
2472
|
+
*
|
2473
|
+
* @see http://en.wikipedia.org/wiki/European_Article_Number
|
2474
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2475
|
+
* @param {jQuery} $field Field element
|
2476
|
+
* @param {Object} options Can consist of the following keys:
|
2477
|
+
* - message: The invalid message
|
2478
|
+
* @returns {Boolean}
|
2479
|
+
*/
|
2480
|
+
validate: function(validator, $field, options) {
|
2481
|
+
var value = $field.val();
|
2482
|
+
if (value === '') {
|
2483
|
+
return true;
|
2484
|
+
}
|
2485
|
+
|
2486
|
+
if (!/^(\d{8}|\d{12}|\d{13})$/.test(value)) {
|
2487
|
+
return false;
|
2488
|
+
}
|
2489
|
+
|
2490
|
+
var length = value.length,
|
2491
|
+
sum = 0,
|
2492
|
+
weight = (length === 8) ? [3, 1] : [1, 3];
|
2493
|
+
for (var i = 0; i < length - 1; i++) {
|
2494
|
+
sum += parseInt(value.charAt(i), 10) * weight[i % 2];
|
2495
|
+
}
|
2496
|
+
sum = (10 - sum % 10) % 10;
|
2497
|
+
return (sum + '' === value.charAt(length - 1));
|
2498
|
+
}
|
2499
|
+
};
|
2500
|
+
}(window.jQuery));
|
2501
|
+
;(function($) {
|
2502
|
+
$.fn.bootstrapValidator.i18n.emailAddress = $.extend($.fn.bootstrapValidator.i18n.emailAddress || {}, {
|
2503
|
+
'default': 'Please enter a valid email address'
|
2504
|
+
});
|
2505
|
+
|
2506
|
+
$.fn.bootstrapValidator.validators.emailAddress = {
|
2507
|
+
enableByHtml5: function($field) {
|
2508
|
+
return ('email' === $field.attr('type'));
|
2509
|
+
},
|
2510
|
+
|
2511
|
+
/**
|
2512
|
+
* Return true if and only if the input value is a valid email address
|
2513
|
+
*
|
2514
|
+
* @param {BootstrapValidator} validator Validate plugin instance
|
2515
|
+
* @param {jQuery} $field Field element
|
2516
|
+
* @param {Object} [options]
|
2517
|
+
* @returns {Boolean}
|
2518
|
+
*/
|
2519
|
+
validate: function(validator, $field, options) {
|
2520
|
+
var value = $field.val();
|
2521
|
+
if (value === '') {
|
2522
|
+
return true;
|
2523
|
+
}
|
2524
|
+
|
2525
|
+
// Email address regular expression
|
2526
|
+
// http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
|
2527
|
+
var emailRegExp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
2528
|
+
return emailRegExp.test(value);
|
2529
|
+
}
|
2530
|
+
};
|
2531
|
+
}(window.jQuery));
|
2532
|
+
;(function($) {
|
2533
|
+
$.fn.bootstrapValidator.i18n.file = $.extend($.fn.bootstrapValidator.i18n.file || {}, {
|
2534
|
+
'default': 'Please choose a valid file'
|
2535
|
+
});
|
2536
|
+
|
2537
|
+
$.fn.bootstrapValidator.validators.file = {
|
2538
|
+
html5Attributes: {
|
2539
|
+
extension: 'extension',
|
2540
|
+
maxsize: 'maxSize',
|
2541
|
+
message: 'message',
|
2542
|
+
type: 'type'
|
2543
|
+
},
|
2544
|
+
|
2545
|
+
/**
|
2546
|
+
* Validate upload file. Use HTML 5 API if the browser supports
|
2547
|
+
*
|
2548
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2549
|
+
* @param {jQuery} $field Field element
|
2550
|
+
* @param {Object} options Can consist of the following keys:
|
2551
|
+
* - extension: The allowed extensions, separated by a comma
|
2552
|
+
* - maxSize: The maximum size in bytes
|
2553
|
+
* - message: The invalid message
|
2554
|
+
* - type: The allowed MIME type, separated by a comma
|
2555
|
+
* @returns {Boolean}
|
2556
|
+
*/
|
2557
|
+
validate: function(validator, $field, options) {
|
2558
|
+
var value = $field.val();
|
2559
|
+
if (value === '') {
|
2560
|
+
return true;
|
2561
|
+
}
|
2562
|
+
|
2563
|
+
var ext,
|
2564
|
+
extensions = options.extension ? options.extension.toLowerCase().split(',') : null,
|
2565
|
+
types = options.type ? options.type.toLowerCase().split(',') : null,
|
2566
|
+
html5 = (window.File && window.FileList && window.FileReader);
|
2567
|
+
|
2568
|
+
if (html5) {
|
2569
|
+
// Get FileList instance
|
2570
|
+
var files = $field.get(0).files,
|
2571
|
+
total = files.length;
|
2572
|
+
for (var i = 0; i < total; i++) {
|
2573
|
+
// Check file size
|
2574
|
+
if (options.maxSize && files[i].size > parseInt(options.maxSize, 10)) {
|
2575
|
+
return false;
|
2576
|
+
}
|
2577
|
+
|
2578
|
+
// Check file extension
|
2579
|
+
ext = files[i].name.substr(files[i].name.lastIndexOf('.') + 1);
|
2580
|
+
if (extensions && $.inArray(ext.toLowerCase(), extensions) === -1) {
|
2581
|
+
return false;
|
2582
|
+
}
|
2583
|
+
|
2584
|
+
// Check file type
|
2585
|
+
if (types && $.inArray(files[i].type.toLowerCase(), types) === -1) {
|
2586
|
+
return false;
|
2587
|
+
}
|
2588
|
+
}
|
2589
|
+
} else {
|
2590
|
+
// Check file extension
|
2591
|
+
ext = value.substr(value.lastIndexOf('.') + 1);
|
2592
|
+
if (extensions && $.inArray(ext.toLowerCase(), extensions) === -1) {
|
2593
|
+
return false;
|
2594
|
+
}
|
2595
|
+
}
|
2596
|
+
|
2597
|
+
return true;
|
2598
|
+
}
|
2599
|
+
};
|
2600
|
+
}(window.jQuery));
|
2601
|
+
;(function($) {
|
2602
|
+
$.fn.bootstrapValidator.i18n.greaterThan = $.extend($.fn.bootstrapValidator.i18n.greaterThan || {}, {
|
2603
|
+
'default': 'Please enter a value greater than or equal to %s',
|
2604
|
+
notInclusive: 'Please enter a value greater than %s'
|
2605
|
+
});
|
2606
|
+
|
2607
|
+
$.fn.bootstrapValidator.validators.greaterThan = {
|
2608
|
+
html5Attributes: {
|
2609
|
+
message: 'message',
|
2610
|
+
value: 'value',
|
2611
|
+
inclusive: 'inclusive'
|
2612
|
+
},
|
2613
|
+
|
2614
|
+
enableByHtml5: function($field) {
|
2615
|
+
var min = $field.attr('min');
|
2616
|
+
if (min) {
|
2617
|
+
return {
|
2618
|
+
value: min
|
2619
|
+
};
|
2620
|
+
}
|
2621
|
+
|
2622
|
+
return false;
|
2623
|
+
},
|
2624
|
+
|
2625
|
+
/**
|
2626
|
+
* Return true if the input value is greater than or equals to given number
|
2627
|
+
*
|
2628
|
+
* @param {BootstrapValidator} validator Validate plugin instance
|
2629
|
+
* @param {jQuery} $field Field element
|
2630
|
+
* @param {Object} options Can consist of the following keys:
|
2631
|
+
* - value: Define the number to compare with. It can be
|
2632
|
+
* - A number
|
2633
|
+
* - Name of field which its value defines the number
|
2634
|
+
* - Name of callback function that returns the number
|
2635
|
+
* - A callback function that returns the number
|
2636
|
+
*
|
2637
|
+
* - inclusive [optional]: Can be true or false. Default is true
|
2638
|
+
* - message: The invalid message
|
2639
|
+
* @returns {Boolean|Object}
|
2640
|
+
*/
|
2641
|
+
validate: function(validator, $field, options) {
|
2642
|
+
var value = $field.val();
|
2643
|
+
if (value === '') {
|
2644
|
+
return true;
|
2645
|
+
}
|
2646
|
+
|
2647
|
+
var compareTo = $.isNumeric(options.value) ? options.value : validator.getDynamicOption($field, options.value);
|
2648
|
+
|
2649
|
+
value = parseFloat(value);
|
2650
|
+
return (options.inclusive === true || options.inclusive === undefined)
|
2651
|
+
? {
|
2652
|
+
valid: value >= compareTo,
|
2653
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.greaterThan['default'], compareTo)
|
2654
|
+
}
|
2655
|
+
: {
|
2656
|
+
valid: value > compareTo,
|
2657
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.greaterThan.notInclusive, compareTo)
|
2658
|
+
};
|
2659
|
+
}
|
2660
|
+
};
|
2661
|
+
}(window.jQuery));
|
2662
|
+
;(function($) {
|
2663
|
+
$.fn.bootstrapValidator.i18n.grid = $.extend($.fn.bootstrapValidator.i18n.grid || {}, {
|
2664
|
+
'default': 'Please enter a valid GRId number'
|
2665
|
+
});
|
2666
|
+
|
2667
|
+
$.fn.bootstrapValidator.validators.grid = {
|
2668
|
+
/**
|
2669
|
+
* Validate GRId (Global Release Identifier)
|
2670
|
+
* Examples:
|
2671
|
+
* - Valid: A12425GABC1234002M, A1-2425G-ABC1234002-M, A1 2425G ABC1234002 M, Grid:A1-2425G-ABC1234002-M
|
2672
|
+
* - Invalid: A1-2425G-ABC1234002-Q
|
2673
|
+
*
|
2674
|
+
* @see http://en.wikipedia.org/wiki/Global_Release_Identifier
|
2675
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2676
|
+
* @param {jQuery} $field Field element
|
2677
|
+
* @param {Object} options Can consist of the following keys:
|
2678
|
+
* - message: The invalid message
|
2679
|
+
* @returns {Boolean}
|
2680
|
+
*/
|
2681
|
+
validate: function(validator, $field, options) {
|
2682
|
+
var value = $field.val();
|
2683
|
+
if (value === '') {
|
2684
|
+
return true;
|
2685
|
+
}
|
2686
|
+
|
2687
|
+
value = value.toUpperCase();
|
2688
|
+
if (!/^[GRID:]*([0-9A-Z]{2})[-\s]*([0-9A-Z]{5})[-\s]*([0-9A-Z]{10})[-\s]*([0-9A-Z]{1})$/g.test(value)) {
|
2689
|
+
return false;
|
2690
|
+
}
|
2691
|
+
value = value.replace(/\s/g, '').replace(/-/g, '');
|
2692
|
+
if ('GRID:' === value.substr(0, 5)) {
|
2693
|
+
value = value.substr(5);
|
2694
|
+
}
|
2695
|
+
return $.fn.bootstrapValidator.helpers.mod37And36(value);
|
2696
|
+
}
|
2697
|
+
};
|
2698
|
+
}(window.jQuery));
|
2699
|
+
;(function($) {
|
2700
|
+
$.fn.bootstrapValidator.i18n.hex = $.extend($.fn.bootstrapValidator.i18n.hex || {}, {
|
2701
|
+
'default': 'Please enter a valid hexadecimal number'
|
2702
|
+
});
|
2703
|
+
|
2704
|
+
$.fn.bootstrapValidator.validators.hex = {
|
2705
|
+
/**
|
2706
|
+
* Return true if and only if the input value is a valid hexadecimal number
|
2707
|
+
*
|
2708
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2709
|
+
* @param {jQuery} $field Field element
|
2710
|
+
* @param {Object} options Consist of key:
|
2711
|
+
* - message: The invalid message
|
2712
|
+
* @returns {Boolean}
|
2713
|
+
*/
|
2714
|
+
validate: function(validator, $field, options) {
|
2715
|
+
var value = $field.val();
|
2716
|
+
if (value === '') {
|
2717
|
+
return true;
|
2718
|
+
}
|
2719
|
+
|
2720
|
+
return /^[0-9a-fA-F]+$/.test(value);
|
2721
|
+
}
|
2722
|
+
};
|
2723
|
+
}(window.jQuery));
|
2724
|
+
;(function($) {
|
2725
|
+
$.fn.bootstrapValidator.i18n.hexColor = $.extend($.fn.bootstrapValidator.i18n.hexColor || {}, {
|
2726
|
+
'default': 'Please enter a valid hex color'
|
2727
|
+
});
|
2728
|
+
|
2729
|
+
$.fn.bootstrapValidator.validators.hexColor = {
|
2730
|
+
enableByHtml5: function($field) {
|
2731
|
+
return ('color' === $field.attr('type'));
|
2732
|
+
},
|
2733
|
+
|
2734
|
+
/**
|
2735
|
+
* Return true if the input value is a valid hex color
|
2736
|
+
*
|
2737
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2738
|
+
* @param {jQuery} $field Field element
|
2739
|
+
* @param {Object} options Can consist of the following keys:
|
2740
|
+
* - message: The invalid message
|
2741
|
+
* @returns {Boolean}
|
2742
|
+
*/
|
2743
|
+
validate: function(validator, $field, options) {
|
2744
|
+
var value = $field.val();
|
2745
|
+
if (value === '') {
|
2746
|
+
return true;
|
2747
|
+
}
|
2748
|
+
return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value);
|
2749
|
+
}
|
2750
|
+
};
|
2751
|
+
}(window.jQuery));
|
2752
|
+
;(function($) {
|
2753
|
+
$.fn.bootstrapValidator.i18n.iban = $.extend($.fn.bootstrapValidator.i18n.iban || {}, {
|
2754
|
+
'default': 'Please enter a valid IBAN number',
|
2755
|
+
countryNotSupported: 'The country code %s is not supported',
|
2756
|
+
country: 'Please enter a valid IBAN number in %s',
|
2757
|
+
countries: {
|
2758
|
+
AD: 'Andorra',
|
2759
|
+
AE: 'United Arab Emirates',
|
2760
|
+
AL: 'Albania',
|
2761
|
+
AO: 'Angola',
|
2762
|
+
AT: 'Austria',
|
2763
|
+
AZ: 'Azerbaijan',
|
2764
|
+
BA: 'Bosnia and Herzegovina',
|
2765
|
+
BE: 'Belgium',
|
2766
|
+
BF: 'Burkina Faso',
|
2767
|
+
BG: 'Bulgaria',
|
2768
|
+
BH: 'Bahrain',
|
2769
|
+
BI: 'Burundi',
|
2770
|
+
BJ: 'Benin',
|
2771
|
+
BR: 'Brazil',
|
2772
|
+
CH: 'Switzerland',
|
2773
|
+
CI: 'Ivory Coast',
|
2774
|
+
CM: 'Cameroon',
|
2775
|
+
CR: 'Costa Rica',
|
2776
|
+
CV: 'Cape Verde',
|
2777
|
+
CY: 'Cyprus',
|
2778
|
+
CZ: 'Czech Republic',
|
2779
|
+
DE: 'Germany',
|
2780
|
+
DK: 'Denmark',
|
2781
|
+
DO: 'Dominican Republic',
|
2782
|
+
DZ: 'Algeria',
|
2783
|
+
EE: 'Estonia',
|
2784
|
+
ES: 'Spain',
|
2785
|
+
FI: 'Finland',
|
2786
|
+
FO: 'Faroe Islands',
|
2787
|
+
FR: 'France',
|
2788
|
+
GB: 'United Kingdom',
|
2789
|
+
GE: 'Georgia',
|
2790
|
+
GI: 'Gibraltar',
|
2791
|
+
GL: 'Greenland',
|
2792
|
+
GR: 'Greece',
|
2793
|
+
GT: 'Guatemala',
|
2794
|
+
HR: 'Croatia',
|
2795
|
+
HU: 'Hungary',
|
2796
|
+
IE: 'Ireland',
|
2797
|
+
IL: 'Israel',
|
2798
|
+
IR: 'Iran',
|
2799
|
+
IS: 'Iceland',
|
2800
|
+
IT: 'Italy',
|
2801
|
+
JO: 'Jordan',
|
2802
|
+
KW: 'Kuwait',
|
2803
|
+
KZ: 'Kazakhstan',
|
2804
|
+
LB: 'Lebanon',
|
2805
|
+
LI: 'Liechtenstein',
|
2806
|
+
LT: 'Lithuania',
|
2807
|
+
LU: 'Luxembourg',
|
2808
|
+
LV: 'Latvia',
|
2809
|
+
MC: 'Monaco',
|
2810
|
+
MD: 'Moldova',
|
2811
|
+
ME: 'Montenegro',
|
2812
|
+
MG: 'Madagascar',
|
2813
|
+
MK: 'Macedonia',
|
2814
|
+
ML: 'Mali',
|
2815
|
+
MR: 'Mauritania',
|
2816
|
+
MT: 'Malta',
|
2817
|
+
MU: 'Mauritius',
|
2818
|
+
MZ: 'Mozambique',
|
2819
|
+
NL: 'Netherlands',
|
2820
|
+
NO: 'Norway',
|
2821
|
+
PK: 'Pakistan',
|
2822
|
+
PL: 'Poland',
|
2823
|
+
PS: 'Palestinian',
|
2824
|
+
PT: 'Portugal',
|
2825
|
+
QA: 'Qatar',
|
2826
|
+
RO: 'Romania',
|
2827
|
+
RS: 'Serbia',
|
2828
|
+
SA: 'Saudi Arabia',
|
2829
|
+
SE: 'Sweden',
|
2830
|
+
SI: 'Slovenia',
|
2831
|
+
SK: 'Slovakia',
|
2832
|
+
SM: 'San Marino',
|
2833
|
+
SN: 'Senegal',
|
2834
|
+
TN: 'Tunisia',
|
2835
|
+
TR: 'Turkey',
|
2836
|
+
VG: 'Virgin Islands, British'
|
2837
|
+
}
|
2838
|
+
});
|
2839
|
+
|
2840
|
+
$.fn.bootstrapValidator.validators.iban = {
|
2841
|
+
html5Attributes: {
|
2842
|
+
message: 'message',
|
2843
|
+
country: 'country'
|
2844
|
+
},
|
2845
|
+
|
2846
|
+
// http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf
|
2847
|
+
// http://en.wikipedia.org/wiki/International_Bank_Account_Number#IBAN_formats_by_country
|
2848
|
+
REGEX: {
|
2849
|
+
'AD': 'AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}', // Andorra
|
2850
|
+
'AE': 'AE[0-9]{2}[0-9]{3}[0-9]{16}', // United Arab Emirates
|
2851
|
+
'AL': 'AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}', // Albania
|
2852
|
+
'AO': 'AO[0-9]{2}[0-9]{21}', // Angola
|
2853
|
+
'AT': 'AT[0-9]{2}[0-9]{5}[0-9]{11}', // Austria
|
2854
|
+
'AZ': 'AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}', // Azerbaijan
|
2855
|
+
'BA': 'BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}', // Bosnia and Herzegovina
|
2856
|
+
'BE': 'BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}', // Belgium
|
2857
|
+
'BF': 'BF[0-9]{2}[0-9]{23}', // Burkina Faso
|
2858
|
+
'BG': 'BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}', // Bulgaria
|
2859
|
+
'BH': 'BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}', // Bahrain
|
2860
|
+
'BI': 'BI[0-9]{2}[0-9]{12}', // Burundi
|
2861
|
+
'BJ': 'BJ[0-9]{2}[A-Z]{1}[0-9]{23}', // Benin
|
2862
|
+
'BR': 'BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]', // Brazil
|
2863
|
+
'CH': 'CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}', // Switzerland
|
2864
|
+
'CI': 'CI[0-9]{2}[A-Z]{1}[0-9]{23}', // Ivory Coast
|
2865
|
+
'CM': 'CM[0-9]{2}[0-9]{23}', // Cameroon
|
2866
|
+
'CR': 'CR[0-9]{2}[0-9]{3}[0-9]{14}', // Costa Rica
|
2867
|
+
'CV': 'CV[0-9]{2}[0-9]{21}', // Cape Verde
|
2868
|
+
'CY': 'CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}', // Cyprus
|
2869
|
+
'CZ': 'CZ[0-9]{2}[0-9]{20}', // Czech Republic
|
2870
|
+
'DE': 'DE[0-9]{2}[0-9]{8}[0-9]{10}', // Germany
|
2871
|
+
'DK': 'DK[0-9]{2}[0-9]{14}', // Denmark
|
2872
|
+
'DO': 'DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}', // Dominican Republic
|
2873
|
+
'DZ': 'DZ[0-9]{2}[0-9]{20}', // Algeria
|
2874
|
+
'EE': 'EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}', // Estonia
|
2875
|
+
'ES': 'ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}', // Spain
|
2876
|
+
'FI': 'FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}', // Finland
|
2877
|
+
'FO': 'FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}', // Faroe Islands
|
2878
|
+
'FR': 'FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}', // France
|
2879
|
+
'GB': 'GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}', // United Kingdom
|
2880
|
+
'GE': 'GE[0-9]{2}[A-Z]{2}[0-9]{16}', // Georgia
|
2881
|
+
'GI': 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}', // Gibraltar
|
2882
|
+
'GL': 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}', // Greenland
|
2883
|
+
'GR': 'GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}', // Greece
|
2884
|
+
'GT': 'GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}', // Guatemala
|
2885
|
+
'HR': 'HR[0-9]{2}[0-9]{7}[0-9]{10}', // Croatia
|
2886
|
+
'HU': 'HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}', // Hungary
|
2887
|
+
'IE': 'IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}', // Ireland
|
2888
|
+
'IL': 'IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}', // Israel
|
2889
|
+
'IR': 'IR[0-9]{2}[0-9]{22}', // Iran
|
2890
|
+
'IS': 'IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}', // Iceland
|
2891
|
+
'IT': 'IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}', // Italy
|
2892
|
+
'JO': 'JO[0-9]{2}[A-Z]{4}[0-9]{4}[0]{8}[A-Z0-9]{10}', // Jordan
|
2893
|
+
'KW': 'KW[0-9]{2}[A-Z]{4}[0-9]{22}', // Kuwait
|
2894
|
+
'KZ': 'KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}', // Kazakhstan
|
2895
|
+
'LB': 'LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}', // Lebanon
|
2896
|
+
'LI': 'LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}', // Liechtenstein
|
2897
|
+
'LT': 'LT[0-9]{2}[0-9]{5}[0-9]{11}', // Lithuania
|
2898
|
+
'LU': 'LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}', // Luxembourg
|
2899
|
+
'LV': 'LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}', // Latvia
|
2900
|
+
'MC': 'MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}', // Monaco
|
2901
|
+
'MD': 'MD[0-9]{2}[A-Z0-9]{20}', // Moldova
|
2902
|
+
'ME': 'ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', // Montenegro
|
2903
|
+
'MG': 'MG[0-9]{2}[0-9]{23}', // Madagascar
|
2904
|
+
'MK': 'MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}', // Macedonia
|
2905
|
+
'ML': 'ML[0-9]{2}[A-Z]{1}[0-9]{23}', // Mali
|
2906
|
+
'MR': 'MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}', // Mauritania
|
2907
|
+
'MT': 'MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}', // Malta
|
2908
|
+
'MU': 'MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}',// Mauritius
|
2909
|
+
'MZ': 'MZ[0-9]{2}[0-9]{21}', // Mozambique
|
2910
|
+
'NL': 'NL[0-9]{2}[A-Z]{4}[0-9]{10}', // Netherlands
|
2911
|
+
'NO': 'NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}', // Norway
|
2912
|
+
'PK': 'PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', // Pakistan
|
2913
|
+
'PL': 'PL[0-9]{2}[0-9]{8}[0-9]{16}', // Poland
|
2914
|
+
'PS': 'PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}', // Palestinian
|
2915
|
+
'PT': 'PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}', // Portugal
|
2916
|
+
'QA': 'QA[0-9]{2}[A-Z]{4}[A-Z0-9]{21}', // Qatar
|
2917
|
+
'RO': 'RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', // Romania
|
2918
|
+
'RS': 'RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', // Serbia
|
2919
|
+
'SA': 'SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}', // Saudi Arabia
|
2920
|
+
'SE': 'SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}', // Sweden
|
2921
|
+
'SI': 'SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}', // Slovenia
|
2922
|
+
'SK': 'SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}', // Slovakia
|
2923
|
+
'SM': 'SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}', // San Marino
|
2924
|
+
'SN': 'SN[0-9]{2}[A-Z]{1}[0-9]{23}', // Senegal
|
2925
|
+
'TN': 'TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', // Tunisia
|
2926
|
+
'TR': 'TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}', // Turkey
|
2927
|
+
'VG': 'VG[0-9]{2}[A-Z]{4}[0-9]{16}' // Virgin Islands, British
|
2928
|
+
},
|
2929
|
+
|
2930
|
+
/**
|
2931
|
+
* Validate an International Bank Account Number (IBAN)
|
2932
|
+
* To test it, take the sample IBAN from
|
2933
|
+
* http://www.nordea.com/Our+services/International+products+and+services/Cash+Management/IBAN+countries/908462.html
|
2934
|
+
*
|
2935
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2936
|
+
* @param {jQuery} $field Field element
|
2937
|
+
* @param {Object} options Can consist of the following keys:
|
2938
|
+
* - message: The invalid message
|
2939
|
+
* - country: The ISO 3166-1 country code. It can be
|
2940
|
+
* - A country code
|
2941
|
+
* - Name of field which its value defines the country code
|
2942
|
+
* - Name of callback function that returns the country code
|
2943
|
+
* - A callback function that returns the country code
|
2944
|
+
* @returns {Boolean|Object}
|
2945
|
+
*/
|
2946
|
+
validate: function(validator, $field, options) {
|
2947
|
+
var value = $field.val();
|
2948
|
+
if (value === '') {
|
2949
|
+
return true;
|
2950
|
+
}
|
2951
|
+
|
2952
|
+
value = value.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();
|
2953
|
+
var country = options.country;
|
2954
|
+
if (!country) {
|
2955
|
+
country = value.substr(0, 2);
|
2956
|
+
} else if (typeof country !== 'string' || !this.REGEX[country]) {
|
2957
|
+
// Determine the country code
|
2958
|
+
country = validator.getDynamicOption($field, country);
|
2959
|
+
}
|
2960
|
+
|
2961
|
+
if (!this.REGEX[country]) {
|
2962
|
+
return {
|
2963
|
+
valid: false,
|
2964
|
+
message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.iban.countryNotSupported, country)
|
2965
|
+
};
|
2966
|
+
}
|
2967
|
+
|
2968
|
+
if (!(new RegExp('^' + this.REGEX[country] + '$')).test(value)) {
|
2969
|
+
return {
|
2970
|
+
valid: false,
|
2971
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.iban.country, $.fn.bootstrapValidator.i18n.iban.countries[country])
|
2972
|
+
};
|
2973
|
+
}
|
2974
|
+
|
2975
|
+
value = value.substr(4) + value.substr(0, 4);
|
2976
|
+
value = $.map(value.split(''), function(n) {
|
2977
|
+
var code = n.charCodeAt(0);
|
2978
|
+
return (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0))
|
2979
|
+
// Replace A, B, C, ..., Z with 10, 11, ..., 35
|
2980
|
+
? (code - 'A'.charCodeAt(0) + 10)
|
2981
|
+
: n;
|
2982
|
+
});
|
2983
|
+
value = value.join('');
|
2984
|
+
|
2985
|
+
var temp = parseInt(value.substr(0, 1), 10),
|
2986
|
+
length = value.length;
|
2987
|
+
for (var i = 1; i < length; ++i) {
|
2988
|
+
temp = (temp * 10 + parseInt(value.substr(i, 1), 10)) % 97;
|
2989
|
+
}
|
2990
|
+
|
2991
|
+
return {
|
2992
|
+
valid: (temp === 1),
|
2993
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.iban.country, $.fn.bootstrapValidator.i18n.iban.countries[country])
|
2994
|
+
};
|
2995
|
+
}
|
2996
|
+
};
|
2997
|
+
}(window.jQuery));
|
2998
|
+
;(function($) {
|
2999
|
+
$.fn.bootstrapValidator.i18n.id = $.extend($.fn.bootstrapValidator.i18n.id || {}, {
|
3000
|
+
'default': 'Please enter a valid identification number',
|
3001
|
+
countryNotSupported: 'The country code %s is not supported',
|
3002
|
+
country: 'Please enter a valid %s identification number',
|
3003
|
+
countries: {
|
3004
|
+
BA: 'Bosnia and Herzegovina',
|
3005
|
+
BG: 'Bulgarian',
|
3006
|
+
BR: 'Brazilian',
|
3007
|
+
CH: 'Swiss',
|
3008
|
+
CL: 'Chilean',
|
3009
|
+
CZ: 'Czech',
|
3010
|
+
DK: 'Danish',
|
3011
|
+
EE: 'Estonian',
|
3012
|
+
ES: 'Spanish',
|
3013
|
+
FI: 'Finnish',
|
3014
|
+
HR: 'Croatian',
|
3015
|
+
IE: 'Irish',
|
3016
|
+
IS: 'Iceland',
|
3017
|
+
LT: 'Lithuanian',
|
3018
|
+
LV: 'Latvian',
|
3019
|
+
ME: 'Montenegro',
|
3020
|
+
MK: 'Macedonian',
|
3021
|
+
NL: 'Dutch',
|
3022
|
+
RO: 'Romanian',
|
3023
|
+
RS: 'Serbian',
|
3024
|
+
SE: 'Swedish',
|
3025
|
+
SI: 'Slovenian',
|
3026
|
+
SK: 'Slovak',
|
3027
|
+
SM: 'San Marino',
|
3028
|
+
ZA: 'South African'
|
3029
|
+
}
|
3030
|
+
});
|
3031
|
+
|
3032
|
+
$.fn.bootstrapValidator.validators.id = {
|
3033
|
+
html5Attributes: {
|
3034
|
+
message: 'message',
|
3035
|
+
country: 'country'
|
3036
|
+
},
|
3037
|
+
|
3038
|
+
// Supported country codes
|
3039
|
+
COUNTRY_CODES: [
|
3040
|
+
'BA', 'BG', 'BR', 'CH', 'CL', 'CZ', 'DK', 'EE', 'ES', 'FI', 'HR', 'IE', 'IS', 'LT', 'LV', 'ME', 'MK', 'NL',
|
3041
|
+
'RO', 'RS', 'SE', 'SI', 'SK', 'SM', 'ZA'
|
3042
|
+
],
|
3043
|
+
|
3044
|
+
/**
|
3045
|
+
* Validate identification number in different countries
|
3046
|
+
*
|
3047
|
+
* @see http://en.wikipedia.org/wiki/National_identification_number
|
3048
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
3049
|
+
* @param {jQuery} $field Field element
|
3050
|
+
* @param {Object} options Consist of key:
|
3051
|
+
* - message: The invalid message
|
3052
|
+
* - country: The ISO 3166-1 country code. It can be
|
3053
|
+
* - One of country code defined in COUNTRY_CODES
|
3054
|
+
* - Name of field which its value defines the country code
|
3055
|
+
* - Name of callback function that returns the country code
|
3056
|
+
* - A callback function that returns the country code
|
3057
|
+
* @returns {Boolean|Object}
|
3058
|
+
*/
|
3059
|
+
validate: function(validator, $field, options) {
|
3060
|
+
var value = $field.val();
|
3061
|
+
if (value === '') {
|
3062
|
+
return true;
|
3063
|
+
}
|
3064
|
+
|
3065
|
+
var country = options.country;
|
3066
|
+
if (!country) {
|
3067
|
+
country = value.substr(0, 2);
|
3068
|
+
} else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
|
3069
|
+
// Determine the country code
|
3070
|
+
country = validator.getDynamicOption($field, country);
|
3071
|
+
}
|
3072
|
+
|
3073
|
+
if ($.inArray(country, this.COUNTRY_CODES) === -1) {
|
3074
|
+
return { valid: false, message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.id.countryNotSupported, country) };
|
3075
|
+
}
|
3076
|
+
|
3077
|
+
var method = ['_', country.toLowerCase()].join('');
|
3078
|
+
return this[method](value)
|
3079
|
+
? true
|
3080
|
+
: {
|
3081
|
+
valid: false,
|
3082
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.id.country, $.fn.bootstrapValidator.i18n.id.countries[country.toUpperCase()])
|
3083
|
+
};
|
3084
|
+
},
|
3085
|
+
|
3086
|
+
/**
|
3087
|
+
* Validate Unique Master Citizen Number which uses in
|
3088
|
+
* - Bosnia and Herzegovina (country code: BA)
|
3089
|
+
* - Macedonia (MK)
|
3090
|
+
* - Montenegro (ME)
|
3091
|
+
* - Serbia (RS)
|
3092
|
+
* - Slovenia (SI)
|
3093
|
+
*
|
3094
|
+
* @see http://en.wikipedia.org/wiki/Unique_Master_Citizen_Number
|
3095
|
+
* @param {String} value The ID
|
3096
|
+
* @param {String} countryCode The ISO country code, can be BA, MK, ME, RS, SI
|
3097
|
+
* @returns {Boolean}
|
3098
|
+
*/
|
3099
|
+
_validateJMBG: function(value, countryCode) {
|
3100
|
+
if (!/^\d{13}$/.test(value)) {
|
3101
|
+
return false;
|
3102
|
+
}
|
3103
|
+
var day = parseInt(value.substr(0, 2), 10),
|
3104
|
+
month = parseInt(value.substr(2, 2), 10),
|
3105
|
+
year = parseInt(value.substr(4, 3), 10),
|
3106
|
+
rr = parseInt(value.substr(7, 2), 10),
|
3107
|
+
k = parseInt(value.substr(12, 1), 10);
|
3108
|
+
|
3109
|
+
// Validate date of birth
|
3110
|
+
// FIXME: Validate the year of birth
|
3111
|
+
if (day > 31 || month > 12) {
|
3112
|
+
return false;
|
3113
|
+
}
|
3114
|
+
|
3115
|
+
// Validate checksum
|
3116
|
+
var sum = 0;
|
3117
|
+
for (var i = 0; i < 6; i++) {
|
3118
|
+
sum += (7 - i) * (parseInt(value.charAt(i), 10) + parseInt(value.charAt(i + 6), 10));
|
3119
|
+
}
|
3120
|
+
sum = 11 - sum % 11;
|
3121
|
+
if (sum === 10 || sum === 11) {
|
3122
|
+
sum = 0;
|
3123
|
+
}
|
3124
|
+
if (sum !== k) {
|
3125
|
+
return false;
|
3126
|
+
}
|
3127
|
+
|
3128
|
+
// Validate political region
|
3129
|
+
// rr is the political region of birth, which can be in ranges:
|
3130
|
+
// 10-19: Bosnia and Herzegovina
|
3131
|
+
// 20-29: Montenegro
|
3132
|
+
// 30-39: Croatia (not used anymore)
|
3133
|
+
// 41-49: Macedonia
|
3134
|
+
// 50-59: Slovenia (only 50 is used)
|
3135
|
+
// 70-79: Central Serbia
|
3136
|
+
// 80-89: Serbian province of Vojvodina
|
3137
|
+
// 90-99: Kosovo
|
3138
|
+
switch (countryCode.toUpperCase()) {
|
3139
|
+
case 'BA':
|
3140
|
+
return (10 <= rr && rr <= 19);
|
3141
|
+
case 'MK':
|
3142
|
+
return (41 <= rr && rr <= 49);
|
3143
|
+
case 'ME':
|
3144
|
+
return (20 <= rr && rr <= 29);
|
3145
|
+
case 'RS':
|
3146
|
+
return (70 <= rr && rr <= 99);
|
3147
|
+
case 'SI':
|
3148
|
+
return (50 <= rr && rr <= 59);
|
3149
|
+
default:
|
3150
|
+
return true;
|
3151
|
+
}
|
3152
|
+
},
|
3153
|
+
|
3154
|
+
_ba: function(value) {
|
3155
|
+
return this._validateJMBG(value, 'BA');
|
3156
|
+
},
|
3157
|
+
_mk: function(value) {
|
3158
|
+
return this._validateJMBG(value, 'MK');
|
3159
|
+
},
|
3160
|
+
_me: function(value) {
|
3161
|
+
return this._validateJMBG(value, 'ME');
|
3162
|
+
},
|
3163
|
+
_rs: function(value) {
|
3164
|
+
return this._validateJMBG(value, 'RS');
|
3165
|
+
},
|
3166
|
+
|
3167
|
+
/**
|
3168
|
+
* Examples: 0101006500006
|
3169
|
+
*/
|
3170
|
+
_si: function(value) {
|
3171
|
+
return this._validateJMBG(value, 'SI');
|
3172
|
+
},
|
3173
|
+
|
3174
|
+
/**
|
3175
|
+
* Validate Bulgarian national identification number (EGN)
|
3176
|
+
* Examples:
|
3177
|
+
* - Valid: 7523169263, 8032056031, 803205 603 1, 8001010008, 7501020018, 7552010005, 7542011030
|
3178
|
+
* - Invalid: 8019010008
|
3179
|
+
*
|
3180
|
+
* @see http://en.wikipedia.org/wiki/Uniform_civil_number
|
3181
|
+
* @param {String} value The ID
|
3182
|
+
* @returns {Boolean}
|
3183
|
+
*/
|
3184
|
+
_bg: function(value) {
|
3185
|
+
if (!/^\d{10}$/.test(value) && !/^\d{6}\s\d{3}\s\d{1}$/.test(value)) {
|
3186
|
+
return false;
|
3187
|
+
}
|
3188
|
+
value = value.replace(/\s/g, '');
|
3189
|
+
// Check the birth date
|
3190
|
+
var year = parseInt(value.substr(0, 2), 10) + 1900,
|
3191
|
+
month = parseInt(value.substr(2, 2), 10),
|
3192
|
+
day = parseInt(value.substr(4, 2), 10);
|
3193
|
+
if (month > 40) {
|
3194
|
+
year += 100;
|
3195
|
+
month -= 40;
|
3196
|
+
} else if (month > 20) {
|
3197
|
+
year -= 100;
|
3198
|
+
month -= 20;
|
3199
|
+
}
|
3200
|
+
|
3201
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
|
3202
|
+
return false;
|
3203
|
+
}
|
3204
|
+
|
3205
|
+
var sum = 0,
|
3206
|
+
weight = [2, 4, 8, 5, 10, 9, 7, 3, 6];
|
3207
|
+
for (var i = 0; i < 9; i++) {
|
3208
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
3209
|
+
}
|
3210
|
+
sum = (sum % 11) % 10;
|
3211
|
+
return (sum + '' === value.substr(9, 1));
|
3212
|
+
},
|
3213
|
+
|
3214
|
+
/**
|
3215
|
+
* Validate Brazilian national identification number (CPF)
|
3216
|
+
* Examples:
|
3217
|
+
* - Valid: 39053344705, 390.533.447-05, 111.444.777-35
|
3218
|
+
* - Invalid: 231.002.999-00
|
3219
|
+
*
|
3220
|
+
* @see http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas
|
3221
|
+
* @param {String} value The ID
|
3222
|
+
* @returns {Boolean}
|
3223
|
+
*/
|
3224
|
+
_br: function(value) {
|
3225
|
+
if (/^1{11}|2{11}|3{11}|4{11}|5{11}|6{11}|7{11}|8{11}|9{11}|0{11}$/.test(value)) {
|
3226
|
+
return false;
|
3227
|
+
}
|
3228
|
+
if (!/^\d{11}$/.test(value) && !/^\d{3}\.\d{3}\.\d{3}-\d{2}$/.test(value)) {
|
3229
|
+
return false;
|
3230
|
+
}
|
3231
|
+
value = value.replace(/\./g, '').replace(/-/g, '');
|
3232
|
+
|
3233
|
+
var d1 = 0;
|
3234
|
+
for (var i = 0; i < 9; i++) {
|
3235
|
+
d1 += (10 - i) * parseInt(value.charAt(i), 10);
|
3236
|
+
}
|
3237
|
+
d1 = 11 - d1 % 11;
|
3238
|
+
if (d1 === 10 || d1 === 11) {
|
3239
|
+
d1 = 0;
|
3240
|
+
}
|
3241
|
+
if (d1 + '' !== value.charAt(9)) {
|
3242
|
+
return false;
|
3243
|
+
}
|
3244
|
+
|
3245
|
+
var d2 = 0;
|
3246
|
+
for (i = 0; i < 10; i++) {
|
3247
|
+
d2 += (11 - i) * parseInt(value.charAt(i), 10);
|
3248
|
+
}
|
3249
|
+
d2 = 11 - d2 % 11;
|
3250
|
+
if (d2 === 10 || d2 === 11) {
|
3251
|
+
d2 = 0;
|
3252
|
+
}
|
3253
|
+
|
3254
|
+
return (d2 + '' === value.charAt(10));
|
3255
|
+
},
|
3256
|
+
|
3257
|
+
/**
|
3258
|
+
* Validate Swiss Social Security Number (AHV-Nr/No AVS)
|
3259
|
+
* Examples:
|
3260
|
+
* - Valid: 756.1234.5678.95, 7561234567895
|
3261
|
+
*
|
3262
|
+
* @see http://en.wikipedia.org/wiki/National_identification_number#Switzerland
|
3263
|
+
* @see http://www.bsv.admin.ch/themen/ahv/00011/02185/index.html?lang=de
|
3264
|
+
* @param {String} value The ID
|
3265
|
+
* @returns {Boolean}
|
3266
|
+
*/
|
3267
|
+
_ch: function(value) {
|
3268
|
+
if (!/^756[\.]{0,1}[0-9]{4}[\.]{0,1}[0-9]{4}[\.]{0,1}[0-9]{2}$/.test(value)) {
|
3269
|
+
return false;
|
3270
|
+
}
|
3271
|
+
value = value.replace(/\D/g, '').substr(3);
|
3272
|
+
var length = value.length,
|
3273
|
+
sum = 0,
|
3274
|
+
weight = (length === 8) ? [3, 1] : [1, 3];
|
3275
|
+
for (var i = 0; i < length - 1; i++) {
|
3276
|
+
sum += parseInt(value.charAt(i), 10) * weight[i % 2];
|
3277
|
+
}
|
3278
|
+
sum = 10 - sum % 10;
|
3279
|
+
return (sum + '' === value.charAt(length - 1));
|
3280
|
+
},
|
3281
|
+
|
3282
|
+
/**
|
3283
|
+
* Validate Chilean national identification number (RUN/RUT)
|
3284
|
+
* Examples:
|
3285
|
+
* - Valid: 76086428-5, 22060449-7, 12531909-2
|
3286
|
+
*
|
3287
|
+
* @see http://en.wikipedia.org/wiki/National_identification_number#Chile
|
3288
|
+
* @see https://palena.sii.cl/cvc/dte/ee_empresas_emisoras.html for samples
|
3289
|
+
* @param {String} value The ID
|
3290
|
+
* @returns {Boolean}
|
3291
|
+
*/
|
3292
|
+
_cl: function(value) {
|
3293
|
+
if (!/^\d{7,8}[-]{0,1}[0-9K]$/i.test(value)) {
|
3294
|
+
return false;
|
3295
|
+
}
|
3296
|
+
value = value.replace(/\-/g, '');
|
3297
|
+
while (value.length < 9) {
|
3298
|
+
value = '0' + value;
|
3299
|
+
}
|
3300
|
+
var sum = 0,
|
3301
|
+
weight = [3, 2, 7, 6, 5, 4, 3, 2];
|
3302
|
+
for (var i = 0; i < 8; i++) {
|
3303
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
3304
|
+
}
|
3305
|
+
sum = 11 - sum % 11;
|
3306
|
+
if (sum === 11) {
|
3307
|
+
sum = 0;
|
3308
|
+
} else if (sum === 10) {
|
3309
|
+
sum = 'K';
|
3310
|
+
}
|
3311
|
+
return sum + '' === value.charAt(8).toUpperCase();
|
3312
|
+
},
|
3313
|
+
|
3314
|
+
/**
|
3315
|
+
* Validate Czech national identification number (RC)
|
3316
|
+
* Examples:
|
3317
|
+
* - Valid: 7103192745, 991231123
|
3318
|
+
* - Invalid: 1103492745, 590312123
|
3319
|
+
*
|
3320
|
+
* @param {String} value The ID
|
3321
|
+
* @returns {Boolean}
|
3322
|
+
*/
|
3323
|
+
_cz: function(value) {
|
3324
|
+
if (!/^\d{9,10}$/.test(value)) {
|
3325
|
+
return false;
|
3326
|
+
}
|
3327
|
+
var year = 1900 + parseInt(value.substr(0, 2), 10),
|
3328
|
+
month = parseInt(value.substr(2, 2), 10) % 50 % 20,
|
3329
|
+
day = parseInt(value.substr(4, 2), 10);
|
3330
|
+
if (value.length === 9) {
|
3331
|
+
if (year >= 1980) {
|
3332
|
+
year -= 100;
|
3333
|
+
}
|
3334
|
+
if (year > 1953) {
|
3335
|
+
return false;
|
3336
|
+
}
|
3337
|
+
} else if (year < 1954) {
|
3338
|
+
year += 100;
|
3339
|
+
}
|
3340
|
+
|
3341
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
|
3342
|
+
return false;
|
3343
|
+
}
|
3344
|
+
|
3345
|
+
// Check that the birth date is not in the future
|
3346
|
+
if (value.length === 10) {
|
3347
|
+
var check = parseInt(value.substr(0, 9), 10) % 11;
|
3348
|
+
if (year < 1985) {
|
3349
|
+
check = check % 10;
|
3350
|
+
}
|
3351
|
+
return (check + '' === value.substr(9, 1));
|
3352
|
+
}
|
3353
|
+
|
3354
|
+
return true;
|
3355
|
+
},
|
3356
|
+
|
3357
|
+
/**
|
3358
|
+
* Validate Danish Personal Identification number (CPR)
|
3359
|
+
* Examples:
|
3360
|
+
* - Valid: 2110625629, 211062-5629
|
3361
|
+
* - Invalid: 511062-5629
|
3362
|
+
*
|
3363
|
+
* @see https://en.wikipedia.org/wiki/Personal_identification_number_(Denmark)
|
3364
|
+
* @param {String} value The ID
|
3365
|
+
* @returns {Boolean}
|
3366
|
+
*/
|
3367
|
+
_dk: function(value) {
|
3368
|
+
if (!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(value)) {
|
3369
|
+
return false;
|
3370
|
+
}
|
3371
|
+
value = value.replace(/-/g, '');
|
3372
|
+
var day = parseInt(value.substr(0, 2), 10),
|
3373
|
+
month = parseInt(value.substr(2, 2), 10),
|
3374
|
+
year = parseInt(value.substr(4, 2), 10);
|
3375
|
+
|
3376
|
+
switch (true) {
|
3377
|
+
case ('5678'.indexOf(value.charAt(6)) !== -1 && year >= 58):
|
3378
|
+
year += 1800;
|
3379
|
+
break;
|
3380
|
+
case ('0123'.indexOf(value.charAt(6)) !== -1):
|
3381
|
+
case ('49'.indexOf(value.charAt(6)) !== -1 && year >= 37):
|
3382
|
+
year += 1900;
|
3383
|
+
break;
|
3384
|
+
default:
|
3385
|
+
year += 2000;
|
3386
|
+
break;
|
3387
|
+
}
|
3388
|
+
|
3389
|
+
return $.fn.bootstrapValidator.helpers.date(year, month, day);
|
3390
|
+
},
|
3391
|
+
|
3392
|
+
/**
|
3393
|
+
* Validate Estonian Personal Identification Code (isikukood)
|
3394
|
+
* Examples:
|
3395
|
+
* - Valid: 37605030299
|
3396
|
+
*
|
3397
|
+
* @see http://et.wikipedia.org/wiki/Isikukood
|
3398
|
+
* @param {String} value The ID
|
3399
|
+
* @returns {Boolean}
|
3400
|
+
*/
|
3401
|
+
_ee: function(value) {
|
3402
|
+
// Use the same format as Lithuanian Personal Code
|
3403
|
+
return this._lt(value);
|
3404
|
+
},
|
3405
|
+
|
3406
|
+
/**
|
3407
|
+
* Validate Spanish personal identity code (DNI)
|
3408
|
+
* Support i) DNI (for Spanish citizens) and ii) NIE (for foreign people)
|
3409
|
+
*
|
3410
|
+
* Examples:
|
3411
|
+
* - Valid: i) 54362315K, 54362315-K; ii) X2482300W, X-2482300W, X-2482300-W
|
3412
|
+
* - Invalid: i) 54362315Z; ii) X-2482300A
|
3413
|
+
*
|
3414
|
+
* @see https://en.wikipedia.org/wiki/National_identification_number#Spain
|
3415
|
+
* @param {String} value The ID
|
3416
|
+
* @returns {Boolean}
|
3417
|
+
*/
|
3418
|
+
_es: function(value) {
|
3419
|
+
if (!/^[0-9A-Z]{8}[-]{0,1}[0-9A-Z]$/.test(value) // DNI
|
3420
|
+
&& !/^[XYZ][-]{0,1}[0-9]{7}[-]{0,1}[0-9A-Z]$/.test(value)) { // NIE
|
3421
|
+
return false;
|
3422
|
+
}
|
3423
|
+
|
3424
|
+
value = value.replace(/-/g, '');
|
3425
|
+
var index = 'XYZ'.indexOf(value.charAt(0));
|
3426
|
+
if (index !== -1) {
|
3427
|
+
// It is NIE number
|
3428
|
+
value = index + value.substr(1) + '';
|
3429
|
+
}
|
3430
|
+
|
3431
|
+
var check = parseInt(value.substr(0, 8), 10);
|
3432
|
+
check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
|
3433
|
+
return (check === value.substr(8, 1));
|
3434
|
+
},
|
3435
|
+
|
3436
|
+
/**
|
3437
|
+
* Validate Finnish Personal Identity Code (HETU)
|
3438
|
+
* Examples:
|
3439
|
+
* - Valid: 311280-888Y, 131052-308T
|
3440
|
+
* - Invalid: 131052-308U, 310252-308Y
|
3441
|
+
*
|
3442
|
+
* @param {String} value The ID
|
3443
|
+
* @returns {Boolean}
|
3444
|
+
*/
|
3445
|
+
_fi: function(value) {
|
3446
|
+
if (!/^[0-9]{6}[-+A][0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/.test(value)) {
|
3447
|
+
return false;
|
3448
|
+
}
|
3449
|
+
var day = parseInt(value.substr(0, 2), 10),
|
3450
|
+
month = parseInt(value.substr(2, 2), 10),
|
3451
|
+
year = parseInt(value.substr(4, 2), 10),
|
3452
|
+
centuries = {
|
3453
|
+
'+': 1800,
|
3454
|
+
'-': 1900,
|
3455
|
+
'A': 2000
|
3456
|
+
};
|
3457
|
+
year = centuries[value.charAt(6)] + year;
|
3458
|
+
|
3459
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
|
3460
|
+
return false;
|
3461
|
+
}
|
3462
|
+
|
3463
|
+
var individual = parseInt(value.substr(7, 3), 10);
|
3464
|
+
if (individual < 2) {
|
3465
|
+
return false;
|
3466
|
+
}
|
3467
|
+
var n = value.substr(0, 6) + value.substr(7, 3) + '';
|
3468
|
+
n = parseInt(n, 10);
|
3469
|
+
return '0123456789ABCDEFHJKLMNPRSTUVWXY'.charAt(n % 31) === value.charAt(10);
|
3470
|
+
},
|
3471
|
+
|
3472
|
+
/**
|
3473
|
+
* Validate Croatian personal identification number (OIB)
|
3474
|
+
* Examples:
|
3475
|
+
* - Valid: 33392005961
|
3476
|
+
* - Invalid: 33392005962
|
3477
|
+
*
|
3478
|
+
* @param {String} value The ID
|
3479
|
+
* @returns {Boolean}
|
3480
|
+
*/
|
3481
|
+
_hr: function(value) {
|
3482
|
+
if (!/^[0-9]{11}$/.test(value)) {
|
3483
|
+
return false;
|
3484
|
+
}
|
3485
|
+
return $.fn.bootstrapValidator.helpers.mod11And10(value);
|
3486
|
+
},
|
3487
|
+
|
3488
|
+
/**
|
3489
|
+
* Validate Irish Personal Public Service Number (PPS)
|
3490
|
+
* Examples:
|
3491
|
+
* - Valid: 6433435F, 6433435FT, 6433435FW, 6433435OA, 6433435IH, 1234567TW, 1234567FA
|
3492
|
+
* - Invalid: 6433435E, 6433435VH
|
3493
|
+
*
|
3494
|
+
* @see https://en.wikipedia.org/wiki/Personal_Public_Service_Number
|
3495
|
+
* @param {String} value The ID
|
3496
|
+
* @returns {Boolean}
|
3497
|
+
*/
|
3498
|
+
_ie: function(value) {
|
3499
|
+
if (!/^\d{7}[A-W][AHWTX]?$/.test(value)) {
|
3500
|
+
return false;
|
3501
|
+
}
|
3502
|
+
|
3503
|
+
var getCheckDigit = function(value) {
|
3504
|
+
while (value.length < 7) {
|
3505
|
+
value = '0' + value;
|
3506
|
+
}
|
3507
|
+
var alphabet = 'WABCDEFGHIJKLMNOPQRSTUV',
|
3508
|
+
sum = 0;
|
3509
|
+
for (var i = 0; i < 7; i++) {
|
3510
|
+
sum += parseInt(value.charAt(i), 10) * (8 - i);
|
3511
|
+
}
|
3512
|
+
sum += 9 * alphabet.indexOf(value.substr(7));
|
3513
|
+
return alphabet[sum % 23];
|
3514
|
+
};
|
3515
|
+
|
3516
|
+
// 2013 format
|
3517
|
+
if (value.length === 9 && ('A' === value.charAt(8) || 'H' === value.charAt(8))) {
|
3518
|
+
return value.charAt(7) === getCheckDigit(value.substr(0, 7) + value.substr(8) + '');
|
3519
|
+
}
|
3520
|
+
// The old format
|
3521
|
+
else {
|
3522
|
+
return value.charAt(7) === getCheckDigit(value.substr(0, 7));
|
3523
|
+
}
|
3524
|
+
},
|
3525
|
+
|
3526
|
+
/**
|
3527
|
+
* Validate Iceland national identification number (Kennitala)
|
3528
|
+
* Examples:
|
3529
|
+
* - Valid: 120174-3399, 1201743399, 0902862349
|
3530
|
+
*
|
3531
|
+
* @see http://en.wikipedia.org/wiki/Kennitala
|
3532
|
+
* @param {String} value The ID
|
3533
|
+
* @returns {Boolean}
|
3534
|
+
*/
|
3535
|
+
_is: function(value) {
|
3536
|
+
if (!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(value)) {
|
3537
|
+
return false;
|
3538
|
+
}
|
3539
|
+
value = value.replace(/-/g, '');
|
3540
|
+
var day = parseInt(value.substr(0, 2), 10),
|
3541
|
+
month = parseInt(value.substr(2, 2), 10),
|
3542
|
+
year = parseInt(value.substr(4, 2), 10),
|
3543
|
+
century = parseInt(value.charAt(9), 10);
|
3544
|
+
|
3545
|
+
year = (century === 9) ? (1900 + year) : ((20 + century) * 100 + year);
|
3546
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day, true)) {
|
3547
|
+
return false;
|
3548
|
+
}
|
3549
|
+
// Validate the check digit
|
3550
|
+
var sum = 0,
|
3551
|
+
weight = [3, 2, 7, 6, 5, 4, 3, 2];
|
3552
|
+
for (var i = 0; i < 8; i++) {
|
3553
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
3554
|
+
}
|
3555
|
+
sum = 11 - sum % 11;
|
3556
|
+
return (sum + '' === value.charAt(8));
|
3557
|
+
},
|
3558
|
+
|
3559
|
+
/**
|
3560
|
+
* Validate Lithuanian Personal Code (Asmens kodas)
|
3561
|
+
* Examples:
|
3562
|
+
* - Valid: 38703181745
|
3563
|
+
* - Invalid: 38703181746, 78703181745, 38703421745
|
3564
|
+
*
|
3565
|
+
* @see http://en.wikipedia.org/wiki/National_identification_number#Lithuania
|
3566
|
+
* @see http://www.adomas.org/midi2007/pcode.html
|
3567
|
+
* @param {String} value The ID
|
3568
|
+
* @returns {Boolean}
|
3569
|
+
*/
|
3570
|
+
_lt: function(value) {
|
3571
|
+
if (!/^[0-9]{11}$/.test(value)) {
|
3572
|
+
return false;
|
3573
|
+
}
|
3574
|
+
var gender = parseInt(value.charAt(0), 10),
|
3575
|
+
year = parseInt(value.substr(1, 2), 10),
|
3576
|
+
month = parseInt(value.substr(3, 2), 10),
|
3577
|
+
day = parseInt(value.substr(5, 2), 10),
|
3578
|
+
century = (gender % 2 === 0) ? (17 + gender / 2) : (17 + (gender + 1) / 2);
|
3579
|
+
year = century * 100 + year;
|
3580
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day, true)) {
|
3581
|
+
return false;
|
3582
|
+
}
|
3583
|
+
|
3584
|
+
// Validate the check digit
|
3585
|
+
var sum = 0,
|
3586
|
+
weight = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1];
|
3587
|
+
for (var i = 0; i < 10; i++) {
|
3588
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
3589
|
+
}
|
3590
|
+
sum = sum % 11;
|
3591
|
+
if (sum !== 10) {
|
3592
|
+
return sum + '' === value.charAt(10);
|
3593
|
+
}
|
3594
|
+
|
3595
|
+
// Re-calculate the check digit
|
3596
|
+
sum = 0;
|
3597
|
+
weight = [3, 4, 5, 6, 7, 8, 9, 1, 2, 3];
|
3598
|
+
for (i = 0; i < 10; i++) {
|
3599
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
3600
|
+
}
|
3601
|
+
sum = sum % 11;
|
3602
|
+
if (sum === 10) {
|
3603
|
+
sum = 0;
|
3604
|
+
}
|
3605
|
+
return (sum + '' === value.charAt(10));
|
3606
|
+
},
|
3607
|
+
|
3608
|
+
/**
|
3609
|
+
* Validate Latvian Personal Code (Personas kods)
|
3610
|
+
* Examples:
|
3611
|
+
* - Valid: 161175-19997, 16117519997
|
3612
|
+
* - Invalid: 161375-19997
|
3613
|
+
*
|
3614
|
+
* @see http://laacz.lv/2006/11/25/pk-parbaudes-algoritms/
|
3615
|
+
* @param {String} value The ID
|
3616
|
+
* @returns {Boolean}
|
3617
|
+
*/
|
3618
|
+
_lv: function(value) {
|
3619
|
+
if (!/^[0-9]{6}[-]{0,1}[0-9]{5}$/.test(value)) {
|
3620
|
+
return false;
|
3621
|
+
}
|
3622
|
+
value = value.replace(/\D/g, '');
|
3623
|
+
// Check birth date
|
3624
|
+
var day = parseInt(value.substr(0, 2), 10),
|
3625
|
+
month = parseInt(value.substr(2, 2), 10),
|
3626
|
+
year = parseInt(value.substr(4, 2), 10);
|
3627
|
+
year = year + 1800 + parseInt(value.charAt(6), 10) * 100;
|
3628
|
+
|
3629
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day, true)) {
|
3630
|
+
return false;
|
3631
|
+
}
|
3632
|
+
|
3633
|
+
// Check personal code
|
3634
|
+
var sum = 0,
|
3635
|
+
weight = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];
|
3636
|
+
for (var i = 0; i < 10; i++) {
|
3637
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
3638
|
+
}
|
3639
|
+
sum = (sum + 1) % 11 % 10;
|
3640
|
+
return (sum + '' === value.charAt(10));
|
3641
|
+
},
|
3642
|
+
|
3643
|
+
/**
|
3644
|
+
* Validate Dutch national identification number (BSN)
|
3645
|
+
* Examples:
|
3646
|
+
* - Valid: 111222333, 941331490, 9413.31.490
|
3647
|
+
* - Invalid: 111252333
|
3648
|
+
*
|
3649
|
+
* @see https://nl.wikipedia.org/wiki/Burgerservicenummer
|
3650
|
+
* @param {String} value The ID
|
3651
|
+
* @returns {Boolean}
|
3652
|
+
*/
|
3653
|
+
_nl: function(value) {
|
3654
|
+
while (value.length < 9) {
|
3655
|
+
value = '0' + value;
|
3656
|
+
}
|
3657
|
+
if (!/^[0-9]{4}[.]{0,1}[0-9]{2}[.]{0,1}[0-9]{3}$/.test(value)) {
|
3658
|
+
return false;
|
3659
|
+
}
|
3660
|
+
value = value.replace(/\./g, '');
|
3661
|
+
if (parseInt(value, 10) === 0) {
|
3662
|
+
return false;
|
3663
|
+
}
|
3664
|
+
var sum = 0,
|
3665
|
+
length = value.length;
|
3666
|
+
for (var i = 0; i < length - 1; i++) {
|
3667
|
+
sum += (9 - i) * parseInt(value.charAt(i), 10);
|
3668
|
+
}
|
3669
|
+
sum = sum % 11;
|
3670
|
+
if (sum === 10) {
|
3671
|
+
sum = 0;
|
3672
|
+
}
|
3673
|
+
return (sum + '' === value.charAt(length - 1));
|
3674
|
+
},
|
3675
|
+
|
3676
|
+
/**
|
3677
|
+
* Validate Romanian numerical personal code (CNP)
|
3678
|
+
* Examples:
|
3679
|
+
* - Valid: 1630615123457, 1800101221144
|
3680
|
+
* - Invalid: 8800101221144, 1632215123457, 1630615123458
|
3681
|
+
*
|
3682
|
+
* @see http://en.wikipedia.org/wiki/National_identification_number#Romania
|
3683
|
+
* @param {String} value The ID
|
3684
|
+
* @returns {Boolean}
|
3685
|
+
*/
|
3686
|
+
_ro: function(value) {
|
3687
|
+
if (!/^[0-9]{13}$/.test(value)) {
|
3688
|
+
return false;
|
3689
|
+
}
|
3690
|
+
var gender = parseInt(value.charAt(0), 10);
|
3691
|
+
if (gender === 0 || gender === 7 || gender === 8) {
|
3692
|
+
return false;
|
3693
|
+
}
|
3694
|
+
|
3695
|
+
// Determine the date of birth
|
3696
|
+
var year = parseInt(value.substr(1, 2), 10),
|
3697
|
+
month = parseInt(value.substr(3, 2), 10),
|
3698
|
+
day = parseInt(value.substr(5, 2), 10),
|
3699
|
+
// The year of date is determined base on the gender
|
3700
|
+
centuries = {
|
3701
|
+
'1': 1900, // Male born between 1900 and 1999
|
3702
|
+
'2': 1900, // Female born between 1900 and 1999
|
3703
|
+
'3': 1800, // Male born between 1800 and 1899
|
3704
|
+
'4': 1800, // Female born between 1800 and 1899
|
3705
|
+
'5': 2000, // Male born after 2000
|
3706
|
+
'6': 2000 // Female born after 2000
|
3707
|
+
};
|
3708
|
+
if (day > 31 && month > 12) {
|
3709
|
+
return false;
|
3710
|
+
}
|
3711
|
+
if (gender !== 9) {
|
3712
|
+
year = centuries[gender + ''] + year;
|
3713
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
|
3714
|
+
return false;
|
3715
|
+
}
|
3716
|
+
}
|
3717
|
+
|
3718
|
+
// Validate the check digit
|
3719
|
+
var sum = 0,
|
3720
|
+
weight = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9],
|
3721
|
+
length = value.length;
|
3722
|
+
for (var i = 0; i < length - 1; i++) {
|
3723
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
3724
|
+
}
|
3725
|
+
sum = sum % 11;
|
3726
|
+
if (sum === 10) {
|
3727
|
+
sum = 1;
|
3728
|
+
}
|
3729
|
+
return (sum + '' === value.charAt(length - 1));
|
3730
|
+
},
|
3731
|
+
|
3732
|
+
/**
|
3733
|
+
* Validate Swedish personal identity number (personnummer)
|
3734
|
+
* Examples:
|
3735
|
+
* - Valid: 8112289874, 811228-9874, 811228+9874
|
3736
|
+
* - Invalid: 811228-9873
|
3737
|
+
*
|
3738
|
+
* @see http://en.wikipedia.org/wiki/Personal_identity_number_(Sweden)
|
3739
|
+
* @param {String} value The ID
|
3740
|
+
* @returns {Boolean}
|
3741
|
+
*/
|
3742
|
+
_se: function(value) {
|
3743
|
+
if (!/^[0-9]{10}$/.test(value) && !/^[0-9]{6}[-|+][0-9]{4}$/.test(value)) {
|
3744
|
+
return false;
|
3745
|
+
}
|
3746
|
+
value = value.replace(/[^0-9]/g, '');
|
3747
|
+
|
3748
|
+
var year = parseInt(value.substr(0, 2), 10) + 1900,
|
3749
|
+
month = parseInt(value.substr(2, 2), 10),
|
3750
|
+
day = parseInt(value.substr(4, 2), 10);
|
3751
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
|
3752
|
+
return false;
|
3753
|
+
}
|
3754
|
+
|
3755
|
+
// Validate the last check digit
|
3756
|
+
return $.fn.bootstrapValidator.helpers.luhn(value);
|
3757
|
+
},
|
3758
|
+
|
3759
|
+
/**
|
3760
|
+
* Validate Slovak national identifier number (RC)
|
3761
|
+
* Examples:
|
3762
|
+
* - Valid: 7103192745, 991231123
|
3763
|
+
* - Invalid: 7103192746, 1103492745
|
3764
|
+
*
|
3765
|
+
* @param {String} value The ID
|
3766
|
+
* @returns {Boolean}
|
3767
|
+
*/
|
3768
|
+
_sk: function(value) {
|
3769
|
+
// Slovakia uses the same format as Czech Republic
|
3770
|
+
return this._cz(value);
|
3771
|
+
},
|
3772
|
+
|
3773
|
+
/**
|
3774
|
+
* Validate San Marino citizen number
|
3775
|
+
*
|
3776
|
+
* @see http://en.wikipedia.org/wiki/National_identification_number#San_Marino
|
3777
|
+
* @param {String} value The ID
|
3778
|
+
* @returns {Boolean}
|
3779
|
+
*/
|
3780
|
+
_sm: function(value) {
|
3781
|
+
return /^\d{5}$/.test(value);
|
3782
|
+
},
|
3783
|
+
|
3784
|
+
/**
|
3785
|
+
* Validate South African ID
|
3786
|
+
* Example:
|
3787
|
+
* - Valid: 8001015009087
|
3788
|
+
* - Invalid: 8001015009287, 8001015009086
|
3789
|
+
*
|
3790
|
+
* @see http://en.wikipedia.org/wiki/National_identification_number#South_Africa
|
3791
|
+
* @param {String} value The ID
|
3792
|
+
* @returns {Boolean}
|
3793
|
+
*/
|
3794
|
+
_za: function(value) {
|
3795
|
+
if (!/^[0-9]{10}[0|1][8|9][0-9]$/.test(value)) {
|
3796
|
+
return false;
|
3797
|
+
}
|
3798
|
+
var year = parseInt(value.substr(0, 2), 10),
|
3799
|
+
currentYear = new Date().getFullYear() % 100,
|
3800
|
+
month = parseInt(value.substr(2, 2), 10),
|
3801
|
+
day = parseInt(value.substr(4, 2), 10);
|
3802
|
+
year = (year >= currentYear) ? (year + 1900) : (year + 2000);
|
3803
|
+
|
3804
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
|
3805
|
+
return false;
|
3806
|
+
}
|
3807
|
+
|
3808
|
+
// Validate the last check digit
|
3809
|
+
return $.fn.bootstrapValidator.helpers.luhn(value);
|
3810
|
+
}
|
3811
|
+
};
|
3812
|
+
}(window.jQuery));
|
3813
|
+
;(function($) {
|
3814
|
+
$.fn.bootstrapValidator.i18n.identical = $.extend($.fn.bootstrapValidator.i18n.identical || {}, {
|
3815
|
+
'default': 'Please enter the same value'
|
3816
|
+
});
|
3817
|
+
|
3818
|
+
$.fn.bootstrapValidator.validators.identical = {
|
3819
|
+
html5Attributes: {
|
3820
|
+
message: 'message',
|
3821
|
+
field: 'field'
|
3822
|
+
},
|
3823
|
+
|
3824
|
+
/**
|
3825
|
+
* Check if input value equals to value of particular one
|
3826
|
+
*
|
3827
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
3828
|
+
* @param {jQuery} $field Field element
|
3829
|
+
* @param {Object} options Consists of the following key:
|
3830
|
+
* - field: The name of field that will be used to compare with current one
|
3831
|
+
* @returns {Boolean}
|
3832
|
+
*/
|
3833
|
+
validate: function(validator, $field, options) {
|
3834
|
+
var value = $field.val();
|
3835
|
+
if (value === '') {
|
3836
|
+
return true;
|
3837
|
+
}
|
3838
|
+
|
3839
|
+
var compareWith = validator.getFieldElements(options.field);
|
3840
|
+
if (compareWith === null) {
|
3841
|
+
return true;
|
3842
|
+
}
|
3843
|
+
|
3844
|
+
if (value === compareWith.val()) {
|
3845
|
+
validator.updateStatus(options.field, validator.STATUS_VALID, 'identical');
|
3846
|
+
return true;
|
3847
|
+
} else {
|
3848
|
+
return false;
|
3849
|
+
}
|
3850
|
+
}
|
3851
|
+
};
|
3852
|
+
}(window.jQuery));
|
3853
|
+
;(function($) {
|
3854
|
+
$.fn.bootstrapValidator.i18n.imei = $.extend($.fn.bootstrapValidator.i18n.imei || {}, {
|
3855
|
+
'default': 'Please enter a valid IMEI number'
|
3856
|
+
});
|
3857
|
+
|
3858
|
+
$.fn.bootstrapValidator.validators.imei = {
|
3859
|
+
/**
|
3860
|
+
* Validate IMEI (International Mobile Station Equipment Identity)
|
3861
|
+
* Examples:
|
3862
|
+
* - Valid: 35-209900-176148-1, 35-209900-176148-23, 3568680000414120, 490154203237518
|
3863
|
+
* - Invalid: 490154203237517
|
3864
|
+
*
|
3865
|
+
* @see http://en.wikipedia.org/wiki/International_Mobile_Station_Equipment_Identity
|
3866
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
3867
|
+
* @param {jQuery} $field Field element
|
3868
|
+
* @param {Object} options Can consist of the following keys:
|
3869
|
+
* - message: The invalid message
|
3870
|
+
* @returns {Boolean}
|
3871
|
+
*/
|
3872
|
+
validate: function(validator, $field, options) {
|
3873
|
+
var value = $field.val();
|
3874
|
+
if (value === '') {
|
3875
|
+
return true;
|
3876
|
+
}
|
3877
|
+
|
3878
|
+
switch (true) {
|
3879
|
+
case /^\d{15}$/.test(value):
|
3880
|
+
case /^\d{2}-\d{6}-\d{6}-\d{1}$/.test(value):
|
3881
|
+
case /^\d{2}\s\d{6}\s\d{6}\s\d{1}$/.test(value):
|
3882
|
+
value = value.replace(/[^0-9]/g, '');
|
3883
|
+
return $.fn.bootstrapValidator.helpers.luhn(value);
|
3884
|
+
|
3885
|
+
case /^\d{14}$/.test(value):
|
3886
|
+
case /^\d{16}$/.test(value):
|
3887
|
+
case /^\d{2}-\d{6}-\d{6}(|-\d{2})$/.test(value):
|
3888
|
+
case /^\d{2}\s\d{6}\s\d{6}(|\s\d{2})$/.test(value):
|
3889
|
+
return true;
|
3890
|
+
|
3891
|
+
default:
|
3892
|
+
return false;
|
3893
|
+
}
|
3894
|
+
}
|
3895
|
+
};
|
3896
|
+
}(window.jQuery));
|
3897
|
+
;(function($) {
|
3898
|
+
$.fn.bootstrapValidator.i18n.integer = $.extend($.fn.bootstrapValidator.i18n.integer || {}, {
|
3899
|
+
'default': 'Please enter a valid number'
|
3900
|
+
});
|
3901
|
+
|
3902
|
+
$.fn.bootstrapValidator.validators.integer = {
|
3903
|
+
enableByHtml5: function($field) {
|
3904
|
+
return ('number' === $field.attr('type')) && ($field.attr('step') === undefined || $field.attr('step') % 1 === 0);
|
3905
|
+
},
|
3906
|
+
|
3907
|
+
/**
|
3908
|
+
* Return true if the input value is an integer
|
3909
|
+
*
|
3910
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
3911
|
+
* @param {jQuery} $field Field element
|
3912
|
+
* @param {Object} options Can consist of the following key:
|
3913
|
+
* - message: The invalid message
|
3914
|
+
* @returns {Boolean}
|
3915
|
+
*/
|
3916
|
+
validate: function(validator, $field, options) {
|
3917
|
+
var value = $field.val();
|
3918
|
+
if (value === '') {
|
3919
|
+
return true;
|
3920
|
+
}
|
3921
|
+
return /^(?:-?(?:0|[1-9][0-9]*))$/.test(value);
|
3922
|
+
}
|
3923
|
+
};
|
3924
|
+
}(window.jQuery));
|
3925
|
+
;(function($) {
|
3926
|
+
$.fn.bootstrapValidator.i18n.ip = $.extend($.fn.bootstrapValidator.i18n.ip || {}, {
|
3927
|
+
'default': 'Please enter a valid IP address',
|
3928
|
+
ipv4: 'Please enter a valid IPv4 address',
|
3929
|
+
ipv6: 'Please enter a valid IPv6 address'
|
3930
|
+
});
|
3931
|
+
|
3932
|
+
$.fn.bootstrapValidator.validators.ip = {
|
3933
|
+
html5Attributes: {
|
3934
|
+
message: 'message',
|
3935
|
+
ipv4: 'ipv4',
|
3936
|
+
ipv6: 'ipv6'
|
3937
|
+
},
|
3938
|
+
|
3939
|
+
/**
|
3940
|
+
* Return true if the input value is a IP address.
|
3941
|
+
*
|
3942
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
3943
|
+
* @param {jQuery} $field Field element
|
3944
|
+
* @param {Object} options Can consist of the following keys:
|
3945
|
+
* - ipv4: Enable IPv4 validator, default to true
|
3946
|
+
* - ipv6: Enable IPv6 validator, default to true
|
3947
|
+
* - message: The invalid message
|
3948
|
+
* @returns {Boolean|Object}
|
3949
|
+
*/
|
3950
|
+
validate: function(validator, $field, options) {
|
3951
|
+
var value = $field.val();
|
3952
|
+
if (value === '') {
|
3953
|
+
return true;
|
3954
|
+
}
|
3955
|
+
options = $.extend({}, { ipv4: true, ipv6: true }, options);
|
3956
|
+
|
3957
|
+
if (options.ipv4) {
|
3958
|
+
return {
|
3959
|
+
valid: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(value),
|
3960
|
+
message: options.message || $.fn.bootstrapValidator.i18n.ip.ipv4
|
3961
|
+
};
|
3962
|
+
} else if (options.ipv6) {
|
3963
|
+
return {
|
3964
|
+
valid: /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(value),
|
3965
|
+
message: options.message || $.fn.bootstrapValidator.i18n.ip.ipv6
|
3966
|
+
};
|
3967
|
+
}
|
3968
|
+
|
3969
|
+
return false;
|
3970
|
+
}
|
3971
|
+
};
|
3972
|
+
}(window.jQuery));
|
3973
|
+
;(function($) {
|
3974
|
+
$.fn.bootstrapValidator.i18n.isbn = $.extend($.fn.bootstrapValidator.i18n.isbn || {}, {
|
3975
|
+
'default': 'Please enter a valid ISBN number'
|
3976
|
+
});
|
3977
|
+
|
3978
|
+
$.fn.bootstrapValidator.validators.isbn = {
|
3979
|
+
/**
|
3980
|
+
* Return true if the input value is a valid ISBN 10 or ISBN 13 number
|
3981
|
+
* Examples:
|
3982
|
+
* - Valid:
|
3983
|
+
* ISBN 10: 99921-58-10-7, 9971-5-0210-0, 960-425-059-0, 80-902734-1-6, 85-359-0277-5, 1-84356-028-3, 0-684-84328-5, 0-8044-2957-X, 0-85131-041-9, 0-943396-04-2, 0-9752298-0-X
|
3984
|
+
* ISBN 13: 978-0-306-40615-7
|
3985
|
+
* - Invalid:
|
3986
|
+
* ISBN 10: 99921-58-10-6
|
3987
|
+
* ISBN 13: 978-0-306-40615-6
|
3988
|
+
*
|
3989
|
+
* @see http://en.wikipedia.org/wiki/International_Standard_Book_Number
|
3990
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
3991
|
+
* @param {jQuery} $field Field element
|
3992
|
+
* @param {Object} [options] Can consist of the following keys:
|
3993
|
+
* - message: The invalid message
|
3994
|
+
* @returns {Boolean}
|
3995
|
+
*/
|
3996
|
+
validate: function(validator, $field, options) {
|
3997
|
+
var value = $field.val();
|
3998
|
+
if (value === '') {
|
3999
|
+
return true;
|
4000
|
+
}
|
4001
|
+
|
4002
|
+
// http://en.wikipedia.org/wiki/International_Standard_Book_Number#Overview
|
4003
|
+
// Groups are separated by a hyphen or a space
|
4004
|
+
var type;
|
4005
|
+
switch (true) {
|
4006
|
+
case /^\d{9}[\dX]$/.test(value):
|
4007
|
+
case (value.length === 13 && /^(\d+)-(\d+)-(\d+)-([\dX])$/.test(value)):
|
4008
|
+
case (value.length === 13 && /^(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(value)):
|
4009
|
+
type = 'ISBN10';
|
4010
|
+
break;
|
4011
|
+
case /^(978|979)\d{9}[\dX]$/.test(value):
|
4012
|
+
case (value.length === 17 && /^(978|979)-(\d+)-(\d+)-(\d+)-([\dX])$/.test(value)):
|
4013
|
+
case (value.length === 17 && /^(978|979)\s(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(value)):
|
4014
|
+
type = 'ISBN13';
|
4015
|
+
break;
|
4016
|
+
default:
|
4017
|
+
return false;
|
4018
|
+
}
|
4019
|
+
|
4020
|
+
// Replace all special characters except digits and X
|
4021
|
+
value = value.replace(/[^0-9X]/gi, '');
|
4022
|
+
var chars = value.split(''),
|
4023
|
+
length = chars.length,
|
4024
|
+
sum = 0,
|
4025
|
+
i,
|
4026
|
+
checksum;
|
4027
|
+
|
4028
|
+
switch (type) {
|
4029
|
+
case 'ISBN10':
|
4030
|
+
sum = 0;
|
4031
|
+
for (i = 0; i < length - 1; i++) {
|
4032
|
+
sum += parseInt(chars[i], 10) * (10 - i);
|
4033
|
+
}
|
4034
|
+
checksum = 11 - (sum % 11);
|
4035
|
+
if (checksum === 11) {
|
4036
|
+
checksum = 0;
|
4037
|
+
} else if (checksum === 10) {
|
4038
|
+
checksum = 'X';
|
4039
|
+
}
|
4040
|
+
return (checksum + '' === chars[length - 1]);
|
4041
|
+
|
4042
|
+
case 'ISBN13':
|
4043
|
+
sum = 0;
|
4044
|
+
for (i = 0; i < length - 1; i++) {
|
4045
|
+
sum += ((i % 2 === 0) ? parseInt(chars[i], 10) : (parseInt(chars[i], 10) * 3));
|
4046
|
+
}
|
4047
|
+
checksum = 10 - (sum % 10);
|
4048
|
+
if (checksum === 10) {
|
4049
|
+
checksum = '0';
|
4050
|
+
}
|
4051
|
+
return (checksum + '' === chars[length - 1]);
|
4052
|
+
|
4053
|
+
default:
|
4054
|
+
return false;
|
4055
|
+
}
|
4056
|
+
}
|
4057
|
+
};
|
4058
|
+
}(window.jQuery));
|
4059
|
+
;(function($) {
|
4060
|
+
$.fn.bootstrapValidator.i18n.isin = $.extend($.fn.bootstrapValidator.i18n.isin || {}, {
|
4061
|
+
'default': 'Please enter a valid ISIN number'
|
4062
|
+
});
|
4063
|
+
|
4064
|
+
$.fn.bootstrapValidator.validators.isin = {
|
4065
|
+
// Available country codes
|
4066
|
+
// See http://isin.net/country-codes/
|
4067
|
+
COUNTRY_CODES: 'AF|AX|AL|DZ|AS|AD|AO|AI|AQ|AG|AR|AM|AW|AU|AT|AZ|BS|BH|BD|BB|BY|BE|BZ|BJ|BM|BT|BO|BQ|BA|BW|BV|BR|IO|BN|BG|BF|BI|KH|CM|CA|CV|KY|CF|TD|CL|CN|CX|CC|CO|KM|CG|CD|CK|CR|CI|HR|CU|CW|CY|CZ|DK|DJ|DM|DO|EC|EG|SV|GQ|ER|EE|ET|FK|FO|FJ|FI|FR|GF|PF|TF|GA|GM|GE|DE|GH|GI|GR|GL|GD|GP|GU|GT|GG|GN|GW|GY|HT|HM|VA|HN|HK|HU|IS|IN|ID|IR|IQ|IE|IM|IL|IT|JM|JP|JE|JO|KZ|KE|KI|KP|KR|KW|KG|LA|LV|LB|LS|LR|LY|LI|LT|LU|MO|MK|MG|MW|MY|MV|ML|MT|MH|MQ|MR|MU|YT|MX|FM|MD|MC|MN|ME|MS|MA|MZ|MM|NA|NR|NP|NL|NC|NZ|NI|NE|NG|NU|NF|MP|NO|OM|PK|PW|PS|PA|PG|PY|PE|PH|PN|PL|PT|PR|QA|RE|RO|RU|RW|BL|SH|KN|LC|MF|PM|VC|WS|SM|ST|SA|SN|RS|SC|SL|SG|SX|SK|SI|SB|SO|ZA|GS|SS|ES|LK|SD|SR|SJ|SZ|SE|CH|SY|TW|TJ|TZ|TH|TL|TG|TK|TO|TT|TN|TR|TM|TC|TV|UG|UA|AE|GB|US|UM|UY|UZ|VU|VE|VN|VG|VI|WF|EH|YE|ZM|ZW',
|
4068
|
+
|
4069
|
+
/**
|
4070
|
+
* Validate an ISIN (International Securities Identification Number)
|
4071
|
+
* Examples:
|
4072
|
+
* - Valid: US0378331005, AU0000XVGZA3, GB0002634946
|
4073
|
+
* - Invalid: US0378331004, AA0000XVGZA3
|
4074
|
+
*
|
4075
|
+
* @see http://en.wikipedia.org/wiki/International_Securities_Identifying_Number
|
4076
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4077
|
+
* @param {jQuery} $field Field element
|
4078
|
+
* @param {Object} options Can consist of the following keys:
|
4079
|
+
* - message: The invalid message
|
4080
|
+
* @returns {Boolean}
|
4081
|
+
*/
|
4082
|
+
validate: function(validator, $field, options) {
|
4083
|
+
var value = $field.val();
|
4084
|
+
if (value === '') {
|
4085
|
+
return true;
|
4086
|
+
}
|
4087
|
+
|
4088
|
+
value = value.toUpperCase();
|
4089
|
+
var regex = new RegExp('^(' + this.COUNTRY_CODES + ')[0-9A-Z]{10}$');
|
4090
|
+
if (!regex.test(value)) {
|
4091
|
+
return false;
|
4092
|
+
}
|
4093
|
+
|
4094
|
+
var converted = '',
|
4095
|
+
length = value.length;
|
4096
|
+
// Convert letters to number
|
4097
|
+
for (var i = 0; i < length - 1; i++) {
|
4098
|
+
var c = value.charCodeAt(i);
|
4099
|
+
converted += ((c > 57) ? (c - 55).toString() : value.charAt(i));
|
4100
|
+
}
|
4101
|
+
|
4102
|
+
var digits = '',
|
4103
|
+
n = converted.length,
|
4104
|
+
group = (n % 2 !== 0) ? 0 : 1;
|
4105
|
+
for (i = 0; i < n; i++) {
|
4106
|
+
digits += (parseInt(converted[i], 10) * ((i % 2) === group ? 2 : 1) + '');
|
4107
|
+
}
|
4108
|
+
|
4109
|
+
var sum = 0;
|
4110
|
+
for (i = 0; i < digits.length; i++) {
|
4111
|
+
sum += parseInt(digits.charAt(i), 10);
|
4112
|
+
}
|
4113
|
+
sum = (10 - (sum % 10)) % 10;
|
4114
|
+
return sum + '' === value.charAt(length - 1);
|
4115
|
+
}
|
4116
|
+
};
|
4117
|
+
}(window.jQuery));
|
4118
|
+
;(function($) {
|
4119
|
+
$.fn.bootstrapValidator.i18n.ismn = $.extend($.fn.bootstrapValidator.i18n.ismn || {}, {
|
4120
|
+
'default': 'Please enter a valid ISMN number'
|
4121
|
+
});
|
4122
|
+
|
4123
|
+
$.fn.bootstrapValidator.validators.ismn = {
|
4124
|
+
/**
|
4125
|
+
* Validate ISMN (International Standard Music Number)
|
4126
|
+
* Examples:
|
4127
|
+
* - Valid: M230671187, 979-0-0601-1561-5, 979 0 3452 4680 5, 9790060115615
|
4128
|
+
* - Invalid: 9790060115614
|
4129
|
+
*
|
4130
|
+
* @see http://en.wikipedia.org/wiki/International_Standard_Music_Number
|
4131
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4132
|
+
* @param {jQuery} $field Field element
|
4133
|
+
* @param {Object} options Can consist of the following keys:
|
4134
|
+
* - message: The invalid message
|
4135
|
+
* @returns {Boolean}
|
4136
|
+
*/
|
4137
|
+
validate: function(validator, $field, options) {
|
4138
|
+
var value = $field.val();
|
4139
|
+
if (value === '') {
|
4140
|
+
return true;
|
4141
|
+
}
|
4142
|
+
|
4143
|
+
// Groups are separated by a hyphen or a space
|
4144
|
+
var type;
|
4145
|
+
switch (true) {
|
4146
|
+
case /^M\d{9}$/.test(value):
|
4147
|
+
case /^M-\d{4}-\d{4}-\d{1}$/.test(value):
|
4148
|
+
case /^M\s\d{4}\s\d{4}\s\d{1}$/.test(value):
|
4149
|
+
type = 'ISMN10';
|
4150
|
+
break;
|
4151
|
+
case /^9790\d{9}$/.test(value):
|
4152
|
+
case /^979-0-\d{4}-\d{4}-\d{1}$/.test(value):
|
4153
|
+
case /^979\s0\s\d{4}\s\d{4}\s\d{1}$/.test(value):
|
4154
|
+
type = 'ISMN13';
|
4155
|
+
break;
|
4156
|
+
default:
|
4157
|
+
return false;
|
4158
|
+
}
|
4159
|
+
|
4160
|
+
if ('ISMN10' === type) {
|
4161
|
+
value = '9790' + value.substr(1);
|
4162
|
+
}
|
4163
|
+
|
4164
|
+
// Replace all special characters except digits
|
4165
|
+
value = value.replace(/[^0-9]/gi, '');
|
4166
|
+
var length = value.length,
|
4167
|
+
sum = 0,
|
4168
|
+
weight = [1, 3];
|
4169
|
+
for (var i = 0; i < length - 1; i++) {
|
4170
|
+
sum += parseInt(value.charAt(i), 10) * weight[i % 2];
|
4171
|
+
}
|
4172
|
+
sum = 10 - sum % 10;
|
4173
|
+
return (sum + '' === value.charAt(length - 1));
|
4174
|
+
}
|
4175
|
+
};
|
4176
|
+
}(window.jQuery));
|
4177
|
+
;(function($) {
|
4178
|
+
$.fn.bootstrapValidator.i18n.issn = $.extend($.fn.bootstrapValidator.i18n.issn || {}, {
|
4179
|
+
'default': 'Please enter a valid ISSN number'
|
4180
|
+
});
|
4181
|
+
|
4182
|
+
$.fn.bootstrapValidator.validators.issn = {
|
4183
|
+
/**
|
4184
|
+
* Validate ISSN (International Standard Serial Number)
|
4185
|
+
* Examples:
|
4186
|
+
* - Valid: 0378-5955, 0024-9319, 0032-1478
|
4187
|
+
* - Invalid: 0032-147X
|
4188
|
+
*
|
4189
|
+
* @see http://en.wikipedia.org/wiki/International_Standard_Serial_Number
|
4190
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4191
|
+
* @param {jQuery} $field Field element
|
4192
|
+
* @param {Object} options Can consist of the following keys:
|
4193
|
+
* - message: The invalid message
|
4194
|
+
* @returns {Boolean}
|
4195
|
+
*/
|
4196
|
+
validate: function(validator, $field, options) {
|
4197
|
+
var value = $field.val();
|
4198
|
+
if (value === '') {
|
4199
|
+
return true;
|
4200
|
+
}
|
4201
|
+
|
4202
|
+
// Groups are separated by a hyphen or a space
|
4203
|
+
if (!/^\d{4}\-\d{3}[\dX]$/.test(value)) {
|
4204
|
+
return false;
|
4205
|
+
}
|
4206
|
+
|
4207
|
+
// Replace all special characters except digits and X
|
4208
|
+
value = value.replace(/[^0-9X]/gi, '');
|
4209
|
+
var chars = value.split(''),
|
4210
|
+
length = chars.length,
|
4211
|
+
sum = 0;
|
4212
|
+
|
4213
|
+
if (chars[7] === 'X') {
|
4214
|
+
chars[7] = 10;
|
4215
|
+
}
|
4216
|
+
for (var i = 0; i < length; i++) {
|
4217
|
+
sum += parseInt(chars[i], 10) * (8 - i);
|
4218
|
+
}
|
4219
|
+
return (sum % 11 === 0);
|
4220
|
+
}
|
4221
|
+
};
|
4222
|
+
}(window.jQuery));
|
4223
|
+
;(function($) {
|
4224
|
+
$.fn.bootstrapValidator.i18n.lessThan = $.extend($.fn.bootstrapValidator.i18n.lessThan || {}, {
|
4225
|
+
'default': 'Please enter a value less than or equal to %s',
|
4226
|
+
notInclusive: 'Please enter a value less than %s'
|
4227
|
+
});
|
4228
|
+
|
4229
|
+
$.fn.bootstrapValidator.validators.lessThan = {
|
4230
|
+
html5Attributes: {
|
4231
|
+
message: 'message',
|
4232
|
+
value: 'value',
|
4233
|
+
inclusive: 'inclusive'
|
4234
|
+
},
|
4235
|
+
|
4236
|
+
enableByHtml5: function($field) {
|
4237
|
+
var max = $field.attr('max');
|
4238
|
+
if (max) {
|
4239
|
+
return {
|
4240
|
+
value: max
|
4241
|
+
};
|
4242
|
+
}
|
4243
|
+
|
4244
|
+
return false;
|
4245
|
+
},
|
4246
|
+
|
4247
|
+
/**
|
4248
|
+
* Return true if the input value is less than or equal to given number
|
4249
|
+
*
|
4250
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4251
|
+
* @param {jQuery} $field Field element
|
4252
|
+
* @param {Object} options Can consist of the following keys:
|
4253
|
+
* - value: The number used to compare to. It can be
|
4254
|
+
* - A number
|
4255
|
+
* - Name of field which its value defines the number
|
4256
|
+
* - Name of callback function that returns the number
|
4257
|
+
* - A callback function that returns the number
|
4258
|
+
*
|
4259
|
+
* - inclusive [optional]: Can be true or false. Default is true
|
4260
|
+
* - message: The invalid message
|
4261
|
+
* @returns {Boolean|Object}
|
4262
|
+
*/
|
4263
|
+
validate: function(validator, $field, options) {
|
4264
|
+
var value = $field.val();
|
4265
|
+
if (value === '') {
|
4266
|
+
return true;
|
4267
|
+
}
|
4268
|
+
|
4269
|
+
var compareTo = $.isNumeric(options.value) ? options.value : validator.getDynamicOption($field, options.value);
|
4270
|
+
|
4271
|
+
value = parseFloat(value);
|
4272
|
+
return (options.inclusive === true || options.inclusive === undefined)
|
4273
|
+
? {
|
4274
|
+
valid: value <= compareTo,
|
4275
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.lessThan['default'], compareTo)
|
4276
|
+
}
|
4277
|
+
: {
|
4278
|
+
valid: value < compareTo,
|
4279
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.lessThan.notInclusive, compareTo)
|
4280
|
+
};
|
4281
|
+
}
|
4282
|
+
};
|
4283
|
+
}(window.jQuery));
|
4284
|
+
;(function($) {
|
4285
|
+
$.fn.bootstrapValidator.i18n.mac = $.extend($.fn.bootstrapValidator.i18n.mac || {}, {
|
4286
|
+
'default': 'Please enter a valid MAC address'
|
4287
|
+
});
|
4288
|
+
|
4289
|
+
$.fn.bootstrapValidator.validators.mac = {
|
4290
|
+
/**
|
4291
|
+
* Return true if the input value is a MAC address.
|
4292
|
+
*
|
4293
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4294
|
+
* @param {jQuery} $field Field element
|
4295
|
+
* @param {Object} options Can consist of the following keys:
|
4296
|
+
* - message: The invalid message
|
4297
|
+
* @returns {Boolean}
|
4298
|
+
*/
|
4299
|
+
validate: function(validator, $field, options) {
|
4300
|
+
var value = $field.val();
|
4301
|
+
if (value === '') {
|
4302
|
+
return true;
|
4303
|
+
}
|
4304
|
+
|
4305
|
+
return /^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$/.test(value);
|
4306
|
+
}
|
4307
|
+
};
|
4308
|
+
}(window.jQuery));
|
4309
|
+
;(function($) {
|
4310
|
+
$.fn.bootstrapValidator.i18n.notEmpty = $.extend($.fn.bootstrapValidator.i18n.notEmpty || {}, {
|
4311
|
+
'default': 'Please enter a value'
|
4312
|
+
});
|
4313
|
+
|
4314
|
+
$.fn.bootstrapValidator.validators.notEmpty = {
|
4315
|
+
enableByHtml5: function($field) {
|
4316
|
+
var required = $field.attr('required') + '';
|
4317
|
+
return ('required' === required || 'true' === required);
|
4318
|
+
},
|
4319
|
+
|
4320
|
+
/**
|
4321
|
+
* Check if input value is empty or not
|
4322
|
+
*
|
4323
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4324
|
+
* @param {jQuery} $field Field element
|
4325
|
+
* @param {Object} options
|
4326
|
+
* @returns {Boolean}
|
4327
|
+
*/
|
4328
|
+
validate: function(validator, $field, options) {
|
4329
|
+
var type = $field.attr('type');
|
4330
|
+
if ('radio' === type || 'checkbox' === type) {
|
4331
|
+
return validator
|
4332
|
+
.getFieldElements($field.attr('data-bv-field'))
|
4333
|
+
.filter(':checked')
|
4334
|
+
.length > 0;
|
4335
|
+
}
|
4336
|
+
|
4337
|
+
return $.trim($field.val()) !== '';
|
4338
|
+
}
|
4339
|
+
};
|
4340
|
+
}(window.jQuery));
|
4341
|
+
;(function($) {
|
4342
|
+
$.fn.bootstrapValidator.i18n.numeric = $.extend($.fn.bootstrapValidator.i18n.numeric || {}, {
|
4343
|
+
'default': 'Please enter a valid float number'
|
4344
|
+
});
|
4345
|
+
|
4346
|
+
$.fn.bootstrapValidator.validators.numeric = {
|
4347
|
+
html5Attributes: {
|
4348
|
+
message: 'message',
|
4349
|
+
separator: 'separator'
|
4350
|
+
},
|
4351
|
+
|
4352
|
+
enableByHtml5: function($field) {
|
4353
|
+
return ('number' === $field.attr('type')) && ($field.attr('step') !== undefined) && ($field.attr('step') % 1 !== 0);
|
4354
|
+
},
|
4355
|
+
|
4356
|
+
/**
|
4357
|
+
* Validate decimal number
|
4358
|
+
*
|
4359
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4360
|
+
* @param {jQuery} $field Field element
|
4361
|
+
* @param {Object} options Consist of key:
|
4362
|
+
* - message: The invalid message
|
4363
|
+
* - separator: The decimal separator. Can be "." (default), ","
|
4364
|
+
* @returns {Boolean}
|
4365
|
+
*/
|
4366
|
+
validate: function(validator, $field, options) {
|
4367
|
+
var value = $field.val();
|
4368
|
+
if (value === '') {
|
4369
|
+
return true;
|
4370
|
+
}
|
4371
|
+
var separator = options.separator || '.';
|
4372
|
+
if (separator !== '.') {
|
4373
|
+
value = value.replace(separator, '.');
|
4374
|
+
}
|
4375
|
+
|
4376
|
+
return !isNaN(parseFloat(value)) && isFinite(value);
|
4377
|
+
}
|
4378
|
+
};
|
4379
|
+
}(window.jQuery));
|
4380
|
+
;(function($) {
|
4381
|
+
$.fn.bootstrapValidator.i18n.phone = $.extend($.fn.bootstrapValidator.i18n.phone || {}, {
|
4382
|
+
'default': 'Please enter a valid phone number',
|
4383
|
+
countryNotSupported: 'The country code %s is not supported',
|
4384
|
+
country: 'Please enter a valid phone number in %s',
|
4385
|
+
countries: {
|
4386
|
+
GB: 'United Kingdom',
|
4387
|
+
US: 'USA'
|
4388
|
+
}
|
4389
|
+
});
|
4390
|
+
|
4391
|
+
$.fn.bootstrapValidator.validators.phone = {
|
4392
|
+
html5Attributes: {
|
4393
|
+
message: 'message',
|
4394
|
+
country: 'country'
|
4395
|
+
},
|
4396
|
+
|
4397
|
+
// The supported countries
|
4398
|
+
COUNTRY_CODES: ['GB', 'US'],
|
4399
|
+
|
4400
|
+
/**
|
4401
|
+
* Return true if the input value contains a valid phone number for the country
|
4402
|
+
* selected in the options
|
4403
|
+
*
|
4404
|
+
* @param {BootstrapValidator} validator Validate plugin instance
|
4405
|
+
* @param {jQuery} $field Field element
|
4406
|
+
* @param {Object} options Consist of key:
|
4407
|
+
* - message: The invalid message
|
4408
|
+
* - country: The ISO-3166 country code. It can be
|
4409
|
+
* - A country code
|
4410
|
+
* - Name of field which its value defines the country code
|
4411
|
+
* - Name of callback function that returns the country code
|
4412
|
+
* - A callback function that returns the country code
|
4413
|
+
*
|
4414
|
+
* Currently it only supports United State (US) or United Kingdom (GB) countries
|
4415
|
+
* @returns {Boolean|Object}
|
4416
|
+
*/
|
4417
|
+
validate: function(validator, $field, options) {
|
4418
|
+
var value = $field.val();
|
4419
|
+
if (value === '') {
|
4420
|
+
return true;
|
4421
|
+
}
|
4422
|
+
|
4423
|
+
var country = options.country;
|
4424
|
+
if (typeof country !== 'string' || $.inArray(country, this.COUNTRY_CODES) === -1) {
|
4425
|
+
// Try to determine the country
|
4426
|
+
country = validator.getDynamicOption($field, country);
|
4427
|
+
}
|
4428
|
+
|
4429
|
+
if (!country || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
|
4430
|
+
return {
|
4431
|
+
valid: false,
|
4432
|
+
message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.phone.countryNotSupported, country)
|
4433
|
+
};
|
4434
|
+
}
|
4435
|
+
|
4436
|
+
var isValid = true;
|
4437
|
+
switch (country.toUpperCase()) {
|
4438
|
+
case 'GB':
|
4439
|
+
// http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers#Match_GB_telephone_number_in_any_format
|
4440
|
+
// Test: http://regexr.com/38uhv
|
4441
|
+
value = $.trim(value);
|
4442
|
+
isValid = (/^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$/).test(value);
|
4443
|
+
break;
|
4444
|
+
|
4445
|
+
case 'US':
|
4446
|
+
/* falls through */
|
4447
|
+
default:
|
4448
|
+
// Make sure US phone numbers have 10 digits
|
4449
|
+
// May start with 1, +1, or 1-; should discard
|
4450
|
+
// Area code may be delimited with (), & sections may be delimited with . or -
|
4451
|
+
// Test: http://regexr.com/38mqi
|
4452
|
+
value = value.replace(/\D/g, '');
|
4453
|
+
isValid = (/^(?:(1\-?)|(\+1 ?))?\(?(\d{3})[\)\-\.]?(\d{3})[\-\.]?(\d{4})$/).test(value) && (value.length === 10);
|
4454
|
+
break;
|
4455
|
+
}
|
4456
|
+
|
4457
|
+
return {
|
4458
|
+
valid: isValid,
|
4459
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.phone.country, $.fn.bootstrapValidator.i18n.phone.countries[country])
|
4460
|
+
};
|
4461
|
+
}
|
4462
|
+
};
|
4463
|
+
}(window.jQuery));
|
4464
|
+
;(function($) {
|
4465
|
+
$.fn.bootstrapValidator.i18n.regexp = $.extend($.fn.bootstrapValidator.i18n.regexp || {}, {
|
4466
|
+
'default': 'Please enter a value matching the pattern'
|
4467
|
+
});
|
4468
|
+
|
4469
|
+
$.fn.bootstrapValidator.validators.regexp = {
|
4470
|
+
html5Attributes: {
|
4471
|
+
message: 'message',
|
4472
|
+
regexp: 'regexp'
|
4473
|
+
},
|
4474
|
+
|
4475
|
+
enableByHtml5: function($field) {
|
4476
|
+
var pattern = $field.attr('pattern');
|
4477
|
+
if (pattern) {
|
4478
|
+
return {
|
4479
|
+
regexp: pattern
|
4480
|
+
};
|
4481
|
+
}
|
4482
|
+
|
4483
|
+
return false;
|
4484
|
+
},
|
4485
|
+
|
4486
|
+
/**
|
4487
|
+
* Check if the element value matches given regular expression
|
4488
|
+
*
|
4489
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4490
|
+
* @param {jQuery} $field Field element
|
4491
|
+
* @param {Object} options Consists of the following key:
|
4492
|
+
* - regexp: The regular expression you need to check
|
4493
|
+
* @returns {Boolean}
|
4494
|
+
*/
|
4495
|
+
validate: function(validator, $field, options) {
|
4496
|
+
var value = $field.val();
|
4497
|
+
if (value === '') {
|
4498
|
+
return true;
|
4499
|
+
}
|
4500
|
+
|
4501
|
+
var regexp = ('string' === typeof options.regexp) ? new RegExp(options.regexp) : options.regexp;
|
4502
|
+
return regexp.test(value);
|
4503
|
+
}
|
4504
|
+
};
|
4505
|
+
}(window.jQuery));
|
4506
|
+
;(function($) {
|
4507
|
+
$.fn.bootstrapValidator.i18n.remote = $.extend($.fn.bootstrapValidator.i18n.remote || {}, {
|
4508
|
+
'default': 'Please enter a valid value'
|
4509
|
+
});
|
4510
|
+
|
4511
|
+
$.fn.bootstrapValidator.validators.remote = {
|
4512
|
+
html5Attributes: {
|
4513
|
+
message: 'message',
|
4514
|
+
url: 'url',
|
4515
|
+
name: 'name'
|
4516
|
+
},
|
4517
|
+
|
4518
|
+
/**
|
4519
|
+
* Request a remote server to check the input value
|
4520
|
+
*
|
4521
|
+
* @param {BootstrapValidator} validator Plugin instance
|
4522
|
+
* @param {jQuery} $field Field element
|
4523
|
+
* @param {Object} options Can consist of the following keys:
|
4524
|
+
* - url {String|Function}
|
4525
|
+
* - type {String} [optional] Can be GET or POST (default)
|
4526
|
+
* - data {Object|Function} [optional]: By default, it will take the value
|
4527
|
+
* {
|
4528
|
+
* <fieldName>: <fieldValue>
|
4529
|
+
* }
|
4530
|
+
* - name {String} [optional]: Override the field name for the request.
|
4531
|
+
* - message: The invalid message
|
4532
|
+
* @returns {Boolean|Deferred}
|
4533
|
+
*/
|
4534
|
+
validate: function(validator, $field, options) {
|
4535
|
+
var value = $field.val();
|
4536
|
+
if (value === '') {
|
4537
|
+
return true;
|
4538
|
+
}
|
4539
|
+
|
4540
|
+
var name = $field.attr('data-bv-field'),
|
4541
|
+
data = options.data || {},
|
4542
|
+
url = options.url,
|
4543
|
+
type = options.type || 'POST';
|
4544
|
+
|
4545
|
+
// Support dynamic data
|
4546
|
+
if ('function' === typeof data) {
|
4547
|
+
data = data.call(this, validator);
|
4548
|
+
}
|
4549
|
+
|
4550
|
+
// Support dynamic url
|
4551
|
+
if ('function' === typeof url) {
|
4552
|
+
url = url.call(this, validator);
|
4553
|
+
}
|
4554
|
+
|
4555
|
+
data[options.name || name] = value;
|
4556
|
+
|
4557
|
+
var dfd = new $.Deferred();
|
4558
|
+
var xhr = $.ajax({
|
4559
|
+
type: type,
|
4560
|
+
url: url,
|
4561
|
+
dataType: 'json',
|
4562
|
+
data: data
|
4563
|
+
});
|
4564
|
+
xhr.then(function(response) {
|
4565
|
+
dfd.resolve($field, 'remote', response.valid === true || response.valid === 'true', response.message ? response.message : null);
|
4566
|
+
});
|
4567
|
+
|
4568
|
+
dfd.fail(function() {
|
4569
|
+
xhr.abort();
|
4570
|
+
});
|
4571
|
+
|
4572
|
+
return dfd;
|
4573
|
+
}
|
4574
|
+
};
|
4575
|
+
}(window.jQuery));
|
4576
|
+
;(function($) {
|
4577
|
+
$.fn.bootstrapValidator.i18n.rtn = $.extend($.fn.bootstrapValidator.i18n.rtn || {}, {
|
4578
|
+
'default': 'Please enter a valid RTN number'
|
4579
|
+
});
|
4580
|
+
|
4581
|
+
$.fn.bootstrapValidator.validators.rtn = {
|
4582
|
+
/**
|
4583
|
+
* Validate a RTN (Routing transit number)
|
4584
|
+
* Examples:
|
4585
|
+
* - Valid: 021200025, 789456124
|
4586
|
+
*
|
4587
|
+
* @see http://en.wikipedia.org/wiki/Routing_transit_number
|
4588
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4589
|
+
* @param {jQuery} $field Field element
|
4590
|
+
* @param {Object} options Can consist of the following keys:
|
4591
|
+
* - message: The invalid message
|
4592
|
+
* @returns {Boolean}
|
4593
|
+
*/
|
4594
|
+
validate: function(validator, $field, options) {
|
4595
|
+
var value = $field.val();
|
4596
|
+
if (value === '') {
|
4597
|
+
return true;
|
4598
|
+
}
|
4599
|
+
|
4600
|
+
if (!/^\d{9}$/.test(value)) {
|
4601
|
+
return false;
|
4602
|
+
}
|
4603
|
+
|
4604
|
+
var sum = 0;
|
4605
|
+
for (var i = 0; i < value.length; i += 3) {
|
4606
|
+
sum += parseInt(value.charAt(i), 10) * 3
|
4607
|
+
+ parseInt(value.charAt(i + 1), 10) * 7
|
4608
|
+
+ parseInt(value.charAt(i + 2), 10);
|
4609
|
+
}
|
4610
|
+
return (sum !== 0 && sum % 10 === 0);
|
4611
|
+
}
|
4612
|
+
};
|
4613
|
+
}(window.jQuery));
|
4614
|
+
;(function($) {
|
4615
|
+
$.fn.bootstrapValidator.i18n.sedol = $.extend($.fn.bootstrapValidator.i18n.sedol || {}, {
|
4616
|
+
'default': 'Please enter a valid SEDOL number'
|
4617
|
+
});
|
4618
|
+
|
4619
|
+
$.fn.bootstrapValidator.validators.sedol = {
|
4620
|
+
/**
|
4621
|
+
* Validate a SEDOL (Stock Exchange Daily Official List)
|
4622
|
+
* Examples:
|
4623
|
+
* - Valid: 0263494, B0WNLY7
|
4624
|
+
*
|
4625
|
+
* @see http://en.wikipedia.org/wiki/SEDOL
|
4626
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4627
|
+
* @param {jQuery} $field Field element
|
4628
|
+
* @param {Object} options Can consist of the following keys:
|
4629
|
+
* - message: The invalid message
|
4630
|
+
* @returns {Boolean}
|
4631
|
+
*/
|
4632
|
+
validate: function(validator, $field, options) {
|
4633
|
+
var value = $field.val();
|
4634
|
+
if (value === '') {
|
4635
|
+
return true;
|
4636
|
+
}
|
4637
|
+
|
4638
|
+
value = value.toUpperCase();
|
4639
|
+
if (!/^[0-9A-Z]{7}$/.test(value)) {
|
4640
|
+
return false;
|
4641
|
+
}
|
4642
|
+
|
4643
|
+
var sum = 0,
|
4644
|
+
weight = [1, 3, 1, 7, 3, 9, 1],
|
4645
|
+
length = value.length;
|
4646
|
+
for (var i = 0; i < length - 1; i++) {
|
4647
|
+
sum += weight[i] * parseInt(value.charAt(i), 36);
|
4648
|
+
}
|
4649
|
+
sum = (10 - sum % 10) % 10;
|
4650
|
+
return sum + '' === value.charAt(length - 1);
|
4651
|
+
}
|
4652
|
+
};
|
4653
|
+
}(window.jQuery));
|
4654
|
+
;(function($) {
|
4655
|
+
$.fn.bootstrapValidator.i18n.siren = $.extend($.fn.bootstrapValidator.i18n.siren || {}, {
|
4656
|
+
'default': 'Please enter a valid SIREN number'
|
4657
|
+
});
|
4658
|
+
|
4659
|
+
$.fn.bootstrapValidator.validators.siren = {
|
4660
|
+
/**
|
4661
|
+
* Check if a string is a siren number
|
4662
|
+
*
|
4663
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4664
|
+
* @param {jQuery} $field Field element
|
4665
|
+
* @param {Object} options Consist of key:
|
4666
|
+
* - message: The invalid message
|
4667
|
+
* @returns {Boolean}
|
4668
|
+
*/
|
4669
|
+
validate: function(validator, $field, options) {
|
4670
|
+
var value = $field.val();
|
4671
|
+
if (value === '') {
|
4672
|
+
return true;
|
4673
|
+
}
|
4674
|
+
|
4675
|
+
if (!/^\d{9}$/.test(value)) {
|
4676
|
+
return false;
|
4677
|
+
}
|
4678
|
+
return $.fn.bootstrapValidator.helpers.luhn(value);
|
4679
|
+
}
|
4680
|
+
};
|
4681
|
+
}(window.jQuery));
|
4682
|
+
;(function($) {
|
4683
|
+
$.fn.bootstrapValidator.i18n.siret = $.extend($.fn.bootstrapValidator.i18n.siret || {}, {
|
4684
|
+
'default': 'Please enter a valid SIRET number'
|
4685
|
+
});
|
4686
|
+
|
4687
|
+
$.fn.bootstrapValidator.validators.siret = {
|
4688
|
+
/**
|
4689
|
+
* Check if a string is a siret number
|
4690
|
+
*
|
4691
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4692
|
+
* @param {jQuery} $field Field element
|
4693
|
+
* @param {Object} options Consist of key:
|
4694
|
+
* - message: The invalid message
|
4695
|
+
* @returns {Boolean}
|
4696
|
+
*/
|
4697
|
+
validate: function(validator, $field, options) {
|
4698
|
+
var value = $field.val();
|
4699
|
+
if (value === '') {
|
4700
|
+
return true;
|
4701
|
+
}
|
4702
|
+
|
4703
|
+
var sum = 0,
|
4704
|
+
length = value.length,
|
4705
|
+
tmp;
|
4706
|
+
for (var i = 0; i < length; i++) {
|
4707
|
+
tmp = parseInt(value.charAt(i), 10);
|
4708
|
+
if ((i % 2) === 0) {
|
4709
|
+
tmp = tmp * 2;
|
4710
|
+
if (tmp > 9) {
|
4711
|
+
tmp -= 9;
|
4712
|
+
}
|
4713
|
+
}
|
4714
|
+
sum += tmp;
|
4715
|
+
}
|
4716
|
+
return (sum % 10 === 0);
|
4717
|
+
}
|
4718
|
+
};
|
4719
|
+
}(window.jQuery));
|
4720
|
+
;(function($) {
|
4721
|
+
$.fn.bootstrapValidator.i18n.step = $.extend($.fn.bootstrapValidator.i18n.step || {}, {
|
4722
|
+
'default': 'Please enter a valid step of %s'
|
4723
|
+
});
|
4724
|
+
|
4725
|
+
$.fn.bootstrapValidator.validators.step = {
|
4726
|
+
html5Attributes: {
|
4727
|
+
message: 'message',
|
4728
|
+
base: 'baseValue',
|
4729
|
+
step: 'step'
|
4730
|
+
},
|
4731
|
+
|
4732
|
+
/**
|
4733
|
+
* Return true if the input value is valid step one
|
4734
|
+
*
|
4735
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4736
|
+
* @param {jQuery} $field Field element
|
4737
|
+
* @param {Object} options Can consist of the following keys:
|
4738
|
+
* - baseValue: The base value
|
4739
|
+
* - step: The step
|
4740
|
+
* - message: The invalid message
|
4741
|
+
* @returns {Boolean|Object}
|
4742
|
+
*/
|
4743
|
+
validate: function(validator, $field, options) {
|
4744
|
+
var value = $field.val();
|
4745
|
+
if (value === '') {
|
4746
|
+
return true;
|
4747
|
+
}
|
4748
|
+
|
4749
|
+
options = $.extend({}, { baseValue: 0, step: 1 }, options);
|
4750
|
+
value = parseFloat(value);
|
4751
|
+
if (!$.isNumeric(value)) {
|
4752
|
+
return false;
|
4753
|
+
}
|
4754
|
+
|
4755
|
+
var round = function(x, precision) {
|
4756
|
+
var m = Math.pow(10, precision);
|
4757
|
+
x = x * m;
|
4758
|
+
var sign = (x > 0) | -(x < 0),
|
4759
|
+
isHalf = (x % 1 === 0.5 * sign);
|
4760
|
+
if (isHalf) {
|
4761
|
+
return (Math.floor(x) + (sign > 0)) / m;
|
4762
|
+
} else {
|
4763
|
+
return Math.round(x) / m;
|
4764
|
+
}
|
4765
|
+
},
|
4766
|
+
floatMod = function(x, y) {
|
4767
|
+
if (y === 0.0) {
|
4768
|
+
return 1.0;
|
4769
|
+
}
|
4770
|
+
var dotX = (x + '').split('.'),
|
4771
|
+
dotY = (y + '').split('.'),
|
4772
|
+
precision = ((dotX.length === 1) ? 0 : dotX[1].length) + ((dotY.length === 1) ? 0 : dotY[1].length);
|
4773
|
+
return round(x - y * Math.floor(x / y), precision);
|
4774
|
+
};
|
4775
|
+
|
4776
|
+
var mod = floatMod(value - options.baseValue, options.step);
|
4777
|
+
return {
|
4778
|
+
valid: mod === 0.0 || mod === options.step,
|
4779
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.step['default'], [options.step])
|
4780
|
+
};
|
4781
|
+
}
|
4782
|
+
};
|
4783
|
+
}(window.jQuery));
|
4784
|
+
;(function($) {
|
4785
|
+
$.fn.bootstrapValidator.i18n.stringCase = $.extend($.fn.bootstrapValidator.i18n.stringCase || {}, {
|
4786
|
+
'default': 'Please enter only lowercase characters',
|
4787
|
+
upper: 'Please enter only uppercase characters'
|
4788
|
+
});
|
4789
|
+
|
4790
|
+
$.fn.bootstrapValidator.validators.stringCase = {
|
4791
|
+
html5Attributes: {
|
4792
|
+
message: 'message',
|
4793
|
+
'case': 'case'
|
4794
|
+
},
|
4795
|
+
|
4796
|
+
/**
|
4797
|
+
* Check if a string is a lower or upper case one
|
4798
|
+
*
|
4799
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4800
|
+
* @param {jQuery} $field Field element
|
4801
|
+
* @param {Object} options Consist of key:
|
4802
|
+
* - message: The invalid message
|
4803
|
+
* - case: Can be 'lower' (default) or 'upper'
|
4804
|
+
* @returns {Object}
|
4805
|
+
*/
|
4806
|
+
validate: function(validator, $field, options) {
|
4807
|
+
var value = $field.val();
|
4808
|
+
if (value === '') {
|
4809
|
+
return true;
|
4810
|
+
}
|
4811
|
+
|
4812
|
+
var stringCase = (options['case'] || 'lower').toLowerCase();
|
4813
|
+
return {
|
4814
|
+
valid: ('upper' === stringCase) ? value === value.toUpperCase() : value === value.toLowerCase(),
|
4815
|
+
message: options.message || (('upper' === stringCase) ? $.fn.bootstrapValidator.i18n.stringCase.upper : $.fn.bootstrapValidator.i18n.stringCase['default'])
|
4816
|
+
};
|
4817
|
+
}
|
4818
|
+
};
|
4819
|
+
}(window.jQuery));
|
4820
|
+
;(function($) {
|
4821
|
+
$.fn.bootstrapValidator.i18n.stringLength = $.extend($.fn.bootstrapValidator.i18n.stringLength || {}, {
|
4822
|
+
'default': 'Please enter a value with valid length',
|
4823
|
+
less: 'Please enter less than %s characters',
|
4824
|
+
more: 'Please enter more than %s characters',
|
4825
|
+
between: 'Please enter value between %s and %s characters long'
|
4826
|
+
});
|
4827
|
+
|
4828
|
+
$.fn.bootstrapValidator.validators.stringLength = {
|
4829
|
+
html5Attributes: {
|
4830
|
+
message: 'message',
|
4831
|
+
min: 'min',
|
4832
|
+
max: 'max'
|
4833
|
+
},
|
4834
|
+
|
4835
|
+
enableByHtml5: function($field) {
|
4836
|
+
var maxLength = $field.attr('maxlength');
|
4837
|
+
if (maxLength) {
|
4838
|
+
return {
|
4839
|
+
max: parseInt(maxLength, 10)
|
4840
|
+
};
|
4841
|
+
}
|
4842
|
+
|
4843
|
+
return false;
|
4844
|
+
},
|
4845
|
+
|
4846
|
+
/**
|
4847
|
+
* Check if the length of element value is less or more than given number
|
4848
|
+
*
|
4849
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4850
|
+
* @param {jQuery} $field Field element
|
4851
|
+
* @param {Object} options Consists of following keys:
|
4852
|
+
* - min
|
4853
|
+
* - max
|
4854
|
+
* At least one of two keys is required
|
4855
|
+
* The min, max keys define the number which the field value compares to. min, max can be
|
4856
|
+
* - A number
|
4857
|
+
* - Name of field which its value defines the number
|
4858
|
+
* - Name of callback function that returns the number
|
4859
|
+
* - A callback function that returns the number
|
4860
|
+
*
|
4861
|
+
* - message: The invalid message
|
4862
|
+
* @returns {Object}
|
4863
|
+
*/
|
4864
|
+
validate: function(validator, $field, options) {
|
4865
|
+
var value = $field.val();
|
4866
|
+
if (value === '') {
|
4867
|
+
return true;
|
4868
|
+
}
|
4869
|
+
|
4870
|
+
var min = $.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min),
|
4871
|
+
max = $.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max),
|
4872
|
+
length = value.length,
|
4873
|
+
isValid = true,
|
4874
|
+
message = options.message || $.fn.bootstrapValidator.i18n.stringLength['default'];
|
4875
|
+
|
4876
|
+
if ((min && length < parseInt(min, 10)) || (max && length > parseInt(max, 10))) {
|
4877
|
+
isValid = false;
|
4878
|
+
}
|
4879
|
+
|
4880
|
+
switch (true) {
|
4881
|
+
case (!!min && !!max):
|
4882
|
+
message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.stringLength.between, [parseInt(min, 10), parseInt(max, 10)]);
|
4883
|
+
break;
|
4884
|
+
|
4885
|
+
case (!!min):
|
4886
|
+
message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.stringLength.more, parseInt(min, 10));
|
4887
|
+
break;
|
4888
|
+
|
4889
|
+
case (!!max):
|
4890
|
+
message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.stringLength.less, parseInt(max, 10));
|
4891
|
+
break;
|
4892
|
+
|
4893
|
+
default:
|
4894
|
+
break;
|
4895
|
+
}
|
4896
|
+
|
4897
|
+
return { valid: isValid, message: message };
|
4898
|
+
}
|
4899
|
+
};
|
4900
|
+
}(window.jQuery));
|
4901
|
+
;(function($) {
|
4902
|
+
$.fn.bootstrapValidator.i18n.uri = $.extend($.fn.bootstrapValidator.i18n.uri || {}, {
|
4903
|
+
'default': 'Please enter a valid URI'
|
4904
|
+
});
|
4905
|
+
|
4906
|
+
$.fn.bootstrapValidator.validators.uri = {
|
4907
|
+
html5Attributes: {
|
4908
|
+
message: 'message',
|
4909
|
+
allowlocal: 'allowLocal'
|
4910
|
+
},
|
4911
|
+
|
4912
|
+
enableByHtml5: function($field) {
|
4913
|
+
return ('url' === $field.attr('type'));
|
4914
|
+
},
|
4915
|
+
|
4916
|
+
/**
|
4917
|
+
* Return true if the input value is a valid URL
|
4918
|
+
*
|
4919
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
4920
|
+
* @param {jQuery} $field Field element
|
4921
|
+
* @param {Object} options
|
4922
|
+
* - message: The error message
|
4923
|
+
* - allowLocal: Allow the private and local network IP. Default to false
|
4924
|
+
* @returns {Boolean}
|
4925
|
+
*/
|
4926
|
+
validate: function(validator, $field, options) {
|
4927
|
+
var value = $field.val();
|
4928
|
+
if (value === '') {
|
4929
|
+
return true;
|
4930
|
+
}
|
4931
|
+
|
4932
|
+
// Credit to https://gist.github.com/dperini/729294
|
4933
|
+
//
|
4934
|
+
// Regular Expression for URL validation
|
4935
|
+
//
|
4936
|
+
// Author: Diego Perini
|
4937
|
+
// Updated: 2010/12/05
|
4938
|
+
//
|
4939
|
+
// the regular expression composed & commented
|
4940
|
+
// could be easily tweaked for RFC compliance,
|
4941
|
+
// it was expressly modified to fit & satisfy
|
4942
|
+
// these test for an URL shortener:
|
4943
|
+
//
|
4944
|
+
// http://mathiasbynens.be/demo/url-regex
|
4945
|
+
//
|
4946
|
+
// Notes on possible differences from a standard/generic validation:
|
4947
|
+
//
|
4948
|
+
// - utf-8 char class take in consideration the full Unicode range
|
4949
|
+
// - TLDs have been made mandatory so single names like "localhost" fails
|
4950
|
+
// - protocols have been restricted to ftp, http and https only as requested
|
4951
|
+
//
|
4952
|
+
// Changes:
|
4953
|
+
//
|
4954
|
+
// - IP address dotted notation validation, range: 1.0.0.0 - 223.255.255.255
|
4955
|
+
// first and last IP address of each class is considered invalid
|
4956
|
+
// (since they are broadcast/network addresses)
|
4957
|
+
//
|
4958
|
+
// - Added exclusion of private, reserved and/or local networks ranges
|
4959
|
+
//
|
4960
|
+
var allowLocal = options.allowLocal === true || options.allowLocal === 'true',
|
4961
|
+
urlExp = new RegExp(
|
4962
|
+
"^" +
|
4963
|
+
// protocol identifier
|
4964
|
+
"(?:(?:https?|ftp)://)" +
|
4965
|
+
// user:pass authentication
|
4966
|
+
"(?:\\S+(?::\\S*)?@)?" +
|
4967
|
+
"(?:" +
|
4968
|
+
// IP address exclusion
|
4969
|
+
// private & local networks
|
4970
|
+
(allowLocal
|
4971
|
+
? ''
|
4972
|
+
: ("(?!(?:10|127)(?:\\.\\d{1,3}){3})" +
|
4973
|
+
"(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" +
|
4974
|
+
"(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})")) +
|
4975
|
+
// IP address dotted notation octets
|
4976
|
+
// excludes loopback network 0.0.0.0
|
4977
|
+
// excludes reserved space >= 224.0.0.0
|
4978
|
+
// excludes network & broadcast addresses
|
4979
|
+
// (first & last IP address of each class)
|
4980
|
+
"(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" +
|
4981
|
+
"(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" +
|
4982
|
+
"(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" +
|
4983
|
+
"|" +
|
4984
|
+
// host name
|
4985
|
+
"(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)" +
|
4986
|
+
// domain name
|
4987
|
+
"(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*" +
|
4988
|
+
// TLD identifier
|
4989
|
+
"(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" +
|
4990
|
+
")" +
|
4991
|
+
// port number
|
4992
|
+
"(?::\\d{2,5})?" +
|
4993
|
+
// resource path
|
4994
|
+
"(?:/[^\\s]*)?" +
|
4995
|
+
"$", "i"
|
4996
|
+
);
|
4997
|
+
|
4998
|
+
return urlExp.test(value);
|
4999
|
+
}
|
5000
|
+
};
|
5001
|
+
}(window.jQuery));
|
5002
|
+
;(function($) {
|
5003
|
+
$.fn.bootstrapValidator.i18n.uuid = $.extend($.fn.bootstrapValidator.i18n.uuid || {}, {
|
5004
|
+
'default': 'Please enter a valid UUID number',
|
5005
|
+
version: 'Please enter a valid UUID version %s number'
|
5006
|
+
});
|
5007
|
+
|
5008
|
+
$.fn.bootstrapValidator.validators.uuid = {
|
5009
|
+
html5Attributes: {
|
5010
|
+
message: 'message',
|
5011
|
+
version: 'version'
|
5012
|
+
},
|
5013
|
+
|
5014
|
+
/**
|
5015
|
+
* Return true if and only if the input value is a valid UUID string
|
5016
|
+
*
|
5017
|
+
* @see http://en.wikipedia.org/wiki/Universally_unique_identifier
|
5018
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
5019
|
+
* @param {jQuery} $field Field element
|
5020
|
+
* @param {Object} options Consist of key:
|
5021
|
+
* - message: The invalid message
|
5022
|
+
* - version: Can be 3, 4, 5, null
|
5023
|
+
* @returns {Boolean|Object}
|
5024
|
+
*/
|
5025
|
+
validate: function(validator, $field, options) {
|
5026
|
+
var value = $field.val();
|
5027
|
+
if (value === '') {
|
5028
|
+
return true;
|
5029
|
+
}
|
5030
|
+
|
5031
|
+
// See the format at http://en.wikipedia.org/wiki/Universally_unique_identifier#Variants_and_versions
|
5032
|
+
var patterns = {
|
5033
|
+
'3': /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
|
5034
|
+
'4': /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
|
5035
|
+
'5': /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
|
5036
|
+
all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
|
5037
|
+
},
|
5038
|
+
version = options.version ? (options.version + '') : 'all';
|
5039
|
+
return {
|
5040
|
+
valid: (null === patterns[version]) ? true : patterns[version].test(value),
|
5041
|
+
message: options.version
|
5042
|
+
? $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.uuid.version, options.version)
|
5043
|
+
: (options.message || $.fn.bootstrapValidator.i18n.uuid['default'])
|
5044
|
+
};
|
5045
|
+
}
|
5046
|
+
};
|
5047
|
+
}(window.jQuery));
|
5048
|
+
;(function($) {
|
5049
|
+
$.fn.bootstrapValidator.i18n.vat = $.extend($.fn.bootstrapValidator.i18n.vat || {}, {
|
5050
|
+
'default': 'Please enter a valid VAT number',
|
5051
|
+
countryNotSupported: 'The country code %s is not supported',
|
5052
|
+
country: 'Please enter a valid %s VAT number',
|
5053
|
+
countries: {
|
5054
|
+
AT: 'Austrian',
|
5055
|
+
BE: 'Belgian',
|
5056
|
+
BG: 'Bulgarian',
|
5057
|
+
CH: 'Swiss',
|
5058
|
+
CY: 'Cypriot',
|
5059
|
+
CZ: 'Czech',
|
5060
|
+
DE: 'German',
|
5061
|
+
DK: 'Danish',
|
5062
|
+
EE: 'Estonian',
|
5063
|
+
ES: 'Spanish',
|
5064
|
+
FI: 'Finnish',
|
5065
|
+
FR: 'French',
|
5066
|
+
GB: 'United Kingdom',
|
5067
|
+
GR: 'Greek',
|
5068
|
+
EL: 'Greek',
|
5069
|
+
HU: 'Hungarian',
|
5070
|
+
HR: 'Croatian',
|
5071
|
+
IE: 'Irish',
|
5072
|
+
IT: 'Italian',
|
5073
|
+
LT: 'Lithuanian',
|
5074
|
+
LU: 'Luxembourg',
|
5075
|
+
LV: 'Latvian',
|
5076
|
+
MT: 'Maltese',
|
5077
|
+
NL: 'Dutch',
|
5078
|
+
NO: 'Norwegian',
|
5079
|
+
PL: 'Polish',
|
5080
|
+
PT: 'Portuguese',
|
5081
|
+
RO: 'Romanian',
|
5082
|
+
RU: 'Russian',
|
5083
|
+
RS: 'Serbian',
|
5084
|
+
SE: 'Swedish',
|
5085
|
+
SI: 'Slovenian',
|
5086
|
+
SK: 'Slovak'
|
5087
|
+
}
|
5088
|
+
});
|
5089
|
+
|
5090
|
+
$.fn.bootstrapValidator.validators.vat = {
|
5091
|
+
html5Attributes: {
|
5092
|
+
message: 'message',
|
5093
|
+
country: 'country'
|
5094
|
+
},
|
5095
|
+
|
5096
|
+
// Supported country codes
|
5097
|
+
COUNTRY_CODES: [
|
5098
|
+
'AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'EL', 'HU', 'IE', 'IT',
|
5099
|
+
'LV', 'LT', 'LU', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'RS', 'SK', 'SI', 'ES', 'SE', 'CH', 'GB'
|
5100
|
+
],
|
5101
|
+
|
5102
|
+
/**
|
5103
|
+
* Validate an European VAT number
|
5104
|
+
*
|
5105
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
5106
|
+
* @param {jQuery} $field Field element
|
5107
|
+
* @param {Object} options Consist of key:
|
5108
|
+
* - message: The invalid message
|
5109
|
+
* - country: The ISO 3166-1 country code. It can be
|
5110
|
+
* - One of country code defined in COUNTRY_CODES
|
5111
|
+
* - Name of field which its value defines the country code
|
5112
|
+
* - Name of callback function that returns the country code
|
5113
|
+
* - A callback function that returns the country code
|
5114
|
+
* @returns {Boolean|Object}
|
5115
|
+
*/
|
5116
|
+
validate: function(validator, $field, options) {
|
5117
|
+
var value = $field.val();
|
5118
|
+
if (value === '') {
|
5119
|
+
return true;
|
5120
|
+
}
|
5121
|
+
|
5122
|
+
var country = options.country;
|
5123
|
+
if (!country) {
|
5124
|
+
country = value.substr(0, 2);
|
5125
|
+
} else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
|
5126
|
+
// Determine the country code
|
5127
|
+
country = validator.getDynamicOption($field, country);
|
5128
|
+
}
|
5129
|
+
|
5130
|
+
if ($.inArray(country, this.COUNTRY_CODES) === -1) {
|
5131
|
+
return {
|
5132
|
+
valid: false,
|
5133
|
+
message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.vat.countryNotSupported, country)
|
5134
|
+
};
|
5135
|
+
}
|
5136
|
+
|
5137
|
+
var method = ['_', country.toLowerCase()].join('');
|
5138
|
+
return this[method](value)
|
5139
|
+
? true
|
5140
|
+
: {
|
5141
|
+
valid: false,
|
5142
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.vat.country, $.fn.bootstrapValidator.i18n.vat.countries[country.toUpperCase()])
|
5143
|
+
};
|
5144
|
+
},
|
5145
|
+
|
5146
|
+
// VAT validators
|
5147
|
+
|
5148
|
+
/**
|
5149
|
+
* Validate Austrian VAT number
|
5150
|
+
* Example:
|
5151
|
+
* - Valid: ATU13585627
|
5152
|
+
* - Invalid: ATU13585626
|
5153
|
+
*
|
5154
|
+
* @param {String} value VAT number
|
5155
|
+
* @returns {Boolean}
|
5156
|
+
*/
|
5157
|
+
_at: function(value) {
|
5158
|
+
if (!/^ATU[0-9]{8}$/.test(value)) {
|
5159
|
+
return false;
|
5160
|
+
}
|
5161
|
+
|
5162
|
+
value = value.substr(3);
|
5163
|
+
var sum = 0,
|
5164
|
+
weight = [1, 2, 1, 2, 1, 2, 1],
|
5165
|
+
temp = 0;
|
5166
|
+
|
5167
|
+
for (var i = 0; i < 7; i++) {
|
5168
|
+
temp = parseInt(value.charAt(i), 10) * weight[i];
|
5169
|
+
if (temp > 9) {
|
5170
|
+
temp = Math.floor(temp / 10) + temp % 10;
|
5171
|
+
}
|
5172
|
+
sum += temp;
|
5173
|
+
}
|
5174
|
+
|
5175
|
+
sum = 10 - (sum + 4) % 10;
|
5176
|
+
if (sum === 10) {
|
5177
|
+
sum = 0;
|
5178
|
+
}
|
5179
|
+
|
5180
|
+
return (sum + '' === value.substr(7, 1));
|
5181
|
+
},
|
5182
|
+
|
5183
|
+
/**
|
5184
|
+
* Validate Belgian VAT number
|
5185
|
+
* Example:
|
5186
|
+
* - Valid: BE0428759497
|
5187
|
+
* - Invalid: BE431150351
|
5188
|
+
*
|
5189
|
+
* @param {String} value VAT number
|
5190
|
+
* @returns {Boolean}
|
5191
|
+
*/
|
5192
|
+
_be: function(value) {
|
5193
|
+
if (!/^BE[0]{0,1}[0-9]{9}$/.test(value)) {
|
5194
|
+
return false;
|
5195
|
+
}
|
5196
|
+
|
5197
|
+
value = value.substr(2);
|
5198
|
+
if (value.length === 9) {
|
5199
|
+
value = '0' + value;
|
5200
|
+
}
|
5201
|
+
|
5202
|
+
if (value.substr(1, 1) === '0') {
|
5203
|
+
return false;
|
5204
|
+
}
|
5205
|
+
|
5206
|
+
var sum = parseInt(value.substr(0, 8), 10) + parseInt(value.substr(8, 2), 10);
|
5207
|
+
return (sum % 97 === 0);
|
5208
|
+
},
|
5209
|
+
|
5210
|
+
/**
|
5211
|
+
* Validate Bulgarian VAT number
|
5212
|
+
* Example:
|
5213
|
+
* - Valid: BG175074752,
|
5214
|
+
* BG7523169263, BG8032056031,
|
5215
|
+
* BG7542011030,
|
5216
|
+
* BG7111042925
|
5217
|
+
* - Invalid: BG175074753, BG7552A10004, BG7111042922
|
5218
|
+
*
|
5219
|
+
* @param {String} value VAT number
|
5220
|
+
* @returns {Boolean}
|
5221
|
+
*/
|
5222
|
+
_bg: function(value) {
|
5223
|
+
if (!/^BG[0-9]{9,10}$/.test(value)) {
|
5224
|
+
return false;
|
5225
|
+
}
|
5226
|
+
|
5227
|
+
value = value.substr(2);
|
5228
|
+
var sum = 0, i = 0;
|
5229
|
+
|
5230
|
+
// Legal entities
|
5231
|
+
if (value.length === 9) {
|
5232
|
+
for (i = 0; i < 8; i++) {
|
5233
|
+
sum += parseInt(value.charAt(i), 10) * (i + 1);
|
5234
|
+
}
|
5235
|
+
sum = sum % 11;
|
5236
|
+
if (sum === 10) {
|
5237
|
+
sum = 0;
|
5238
|
+
for (i = 0; i < 8; i++) {
|
5239
|
+
sum += parseInt(value.charAt(i), 10) * (i + 3);
|
5240
|
+
}
|
5241
|
+
}
|
5242
|
+
sum = sum % 10;
|
5243
|
+
return (sum + '' === value.substr(8));
|
5244
|
+
}
|
5245
|
+
// Physical persons, foreigners and others
|
5246
|
+
else if (value.length === 10) {
|
5247
|
+
// Validate Bulgarian national identification numbers
|
5248
|
+
var egn = function(value) {
|
5249
|
+
// Check the birth date
|
5250
|
+
var year = parseInt(value.substr(0, 2), 10) + 1900,
|
5251
|
+
month = parseInt(value.substr(2, 2), 10),
|
5252
|
+
day = parseInt(value.substr(4, 2), 10);
|
5253
|
+
if (month > 40) {
|
5254
|
+
year += 100;
|
5255
|
+
month -= 40;
|
5256
|
+
} else if (month > 20) {
|
5257
|
+
year -= 100;
|
5258
|
+
month -= 20;
|
5259
|
+
}
|
5260
|
+
|
5261
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
|
5262
|
+
return false;
|
5263
|
+
}
|
5264
|
+
|
5265
|
+
var sum = 0,
|
5266
|
+
weight = [2, 4, 8, 5, 10, 9, 7, 3, 6];
|
5267
|
+
for (var i = 0; i < 9; i++) {
|
5268
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5269
|
+
}
|
5270
|
+
sum = (sum % 11) % 10;
|
5271
|
+
return (sum + '' === value.substr(9, 1));
|
5272
|
+
},
|
5273
|
+
// Validate Bulgarian personal number of a foreigner
|
5274
|
+
pnf = function(value) {
|
5275
|
+
var sum = 0,
|
5276
|
+
weight = [21, 19, 17, 13, 11, 9, 7, 3, 1];
|
5277
|
+
for (var i = 0; i < 9; i++) {
|
5278
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5279
|
+
}
|
5280
|
+
sum = sum % 10;
|
5281
|
+
return (sum + '' === value.substr(9, 1));
|
5282
|
+
},
|
5283
|
+
// Finally, consider it as a VAT number
|
5284
|
+
vat = function(value) {
|
5285
|
+
var sum = 0,
|
5286
|
+
weight = [4, 3, 2, 7, 6, 5, 4, 3, 2];
|
5287
|
+
for (var i = 0; i < 9; i++) {
|
5288
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5289
|
+
}
|
5290
|
+
sum = 11 - sum % 11;
|
5291
|
+
if (sum === 10) {
|
5292
|
+
return false;
|
5293
|
+
}
|
5294
|
+
if (sum === 11) {
|
5295
|
+
sum = 0;
|
5296
|
+
}
|
5297
|
+
return (sum + '' === value.substr(9, 1));
|
5298
|
+
};
|
5299
|
+
return (egn(value) || pnf(value) || vat(value));
|
5300
|
+
}
|
5301
|
+
|
5302
|
+
return false;
|
5303
|
+
},
|
5304
|
+
|
5305
|
+
/**
|
5306
|
+
* Validate Swiss VAT number
|
5307
|
+
*
|
5308
|
+
* @param {String} value VAT number
|
5309
|
+
* @returns {Boolean}
|
5310
|
+
*/
|
5311
|
+
_ch: function(value) {
|
5312
|
+
if (!/^CHE[0-9]{9}(MWST)?$/.test(value)) {
|
5313
|
+
return false;
|
5314
|
+
}
|
5315
|
+
|
5316
|
+
value = value.substr(3);
|
5317
|
+
var sum = 0,
|
5318
|
+
weight = [5, 4, 3, 2, 7, 6, 5, 4];
|
5319
|
+
for (var i = 0; i < 8; i++) {
|
5320
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5321
|
+
}
|
5322
|
+
|
5323
|
+
sum = 11 - sum % 11;
|
5324
|
+
if (sum === 10) {
|
5325
|
+
return false;
|
5326
|
+
}
|
5327
|
+
if (sum === 11) {
|
5328
|
+
sum = 0;
|
5329
|
+
}
|
5330
|
+
|
5331
|
+
return (sum + '' === value.substr(8, 1));
|
5332
|
+
},
|
5333
|
+
|
5334
|
+
/**
|
5335
|
+
* Validate Cypriot VAT number
|
5336
|
+
* Examples:
|
5337
|
+
* - Valid: CY10259033P
|
5338
|
+
* - Invalid: CY10259033Z
|
5339
|
+
*
|
5340
|
+
* @param {String} value VAT number
|
5341
|
+
* @returns {Boolean}
|
5342
|
+
*/
|
5343
|
+
_cy: function(value) {
|
5344
|
+
if (!/^CY[0-5|9]{1}[0-9]{7}[A-Z]{1}$/.test(value)) {
|
5345
|
+
return false;
|
5346
|
+
}
|
5347
|
+
|
5348
|
+
value = value.substr(2);
|
5349
|
+
|
5350
|
+
// Do not allow to start with "12"
|
5351
|
+
if (value.substr(0, 2) === '12') {
|
5352
|
+
return false;
|
5353
|
+
}
|
5354
|
+
|
5355
|
+
// Extract the next digit and multiply by the counter.
|
5356
|
+
var sum = 0,
|
5357
|
+
translation = {
|
5358
|
+
'0': 1, '1': 0, '2': 5, '3': 7, '4': 9,
|
5359
|
+
'5': 13, '6': 15, '7': 17, '8': 19, '9': 21
|
5360
|
+
};
|
5361
|
+
for (var i = 0; i < 8; i++) {
|
5362
|
+
var temp = parseInt(value.charAt(i), 10);
|
5363
|
+
if (i % 2 === 0) {
|
5364
|
+
temp = translation[temp + ''];
|
5365
|
+
}
|
5366
|
+
sum += temp;
|
5367
|
+
}
|
5368
|
+
|
5369
|
+
sum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[sum % 26];
|
5370
|
+
return (sum + '' === value.substr(8, 1));
|
5371
|
+
},
|
5372
|
+
|
5373
|
+
/**
|
5374
|
+
* Validate Czech Republic VAT number
|
5375
|
+
* Can be:
|
5376
|
+
* i) Legal entities (8 digit numbers)
|
5377
|
+
* ii) Individuals with a RC (the 9 or 10 digit Czech birth number)
|
5378
|
+
* iii) Individuals without a RC (9 digit numbers beginning with 6)
|
5379
|
+
*
|
5380
|
+
* Examples:
|
5381
|
+
* - Valid: i) CZ25123891; ii) CZ7103192745, CZ991231123; iii) CZ640903926
|
5382
|
+
* - Invalid: i) CZ25123890; ii) CZ1103492745, CZ590312123
|
5383
|
+
*
|
5384
|
+
* @param {String} value VAT number
|
5385
|
+
* @returns {Boolean}
|
5386
|
+
*/
|
5387
|
+
_cz: function(value) {
|
5388
|
+
if (!/^CZ[0-9]{8,10}$/.test(value)) {
|
5389
|
+
return false;
|
5390
|
+
}
|
5391
|
+
|
5392
|
+
value = value.substr(2);
|
5393
|
+
|
5394
|
+
var sum = 0,
|
5395
|
+
i = 0;
|
5396
|
+
if (value.length === 8) {
|
5397
|
+
// Do not allow to start with '9'
|
5398
|
+
if (value.charAt(0) + '' === '9') {
|
5399
|
+
return false;
|
5400
|
+
}
|
5401
|
+
|
5402
|
+
sum = 0;
|
5403
|
+
for (i = 0; i < 7; i++) {
|
5404
|
+
sum += parseInt(value.charAt(i), 10) * (8 - i);
|
5405
|
+
}
|
5406
|
+
sum = 11 - sum % 11;
|
5407
|
+
if (sum === 10) {
|
5408
|
+
sum = 0;
|
5409
|
+
}
|
5410
|
+
if (sum === 11) {
|
5411
|
+
sum = 1;
|
5412
|
+
}
|
5413
|
+
|
5414
|
+
return (sum + '' === value.substr(7, 1));
|
5415
|
+
} else if (value.length === 9 && (value.charAt(0) + '' === '6')) {
|
5416
|
+
sum = 0;
|
5417
|
+
// Skip the first (which is 6)
|
5418
|
+
for (i = 0; i < 7; i++) {
|
5419
|
+
sum += parseInt(value.charAt(i + 1), 10) * (8 - i);
|
5420
|
+
}
|
5421
|
+
sum = 11 - sum % 11;
|
5422
|
+
if (sum === 10) {
|
5423
|
+
sum = 0;
|
5424
|
+
}
|
5425
|
+
if (sum === 11) {
|
5426
|
+
sum = 1;
|
5427
|
+
}
|
5428
|
+
sum = [8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 10][sum - 1];
|
5429
|
+
return (sum + '' === value.substr(8, 1));
|
5430
|
+
} else if (value.length === 9 || value.length === 10) {
|
5431
|
+
// Validate Czech birth number (Rodné číslo), which is also national identifier
|
5432
|
+
var year = 1900 + parseInt(value.substr(0, 2), 10),
|
5433
|
+
month = parseInt(value.substr(2, 2), 10) % 50 % 20,
|
5434
|
+
day = parseInt(value.substr(4, 2), 10);
|
5435
|
+
if (value.length === 9) {
|
5436
|
+
if (year >= 1980) {
|
5437
|
+
year -= 100;
|
5438
|
+
}
|
5439
|
+
if (year > 1953) {
|
5440
|
+
return false;
|
5441
|
+
}
|
5442
|
+
} else if (year < 1954) {
|
5443
|
+
year += 100;
|
5444
|
+
}
|
5445
|
+
|
5446
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
|
5447
|
+
return false;
|
5448
|
+
}
|
5449
|
+
|
5450
|
+
// Check that the birth date is not in the future
|
5451
|
+
if (value.length === 10) {
|
5452
|
+
var check = parseInt(value.substr(0, 9), 10) % 11;
|
5453
|
+
if (year < 1985) {
|
5454
|
+
check = check % 10;
|
5455
|
+
}
|
5456
|
+
return (check + '' === value.substr(9, 1));
|
5457
|
+
}
|
5458
|
+
|
5459
|
+
return true;
|
5460
|
+
}
|
5461
|
+
|
5462
|
+
return false;
|
5463
|
+
},
|
5464
|
+
|
5465
|
+
/**
|
5466
|
+
* Validate German VAT number
|
5467
|
+
* Examples:
|
5468
|
+
* - Valid: DE136695976
|
5469
|
+
* - Invalid: DE136695978
|
5470
|
+
*
|
5471
|
+
* @param {String} value VAT number
|
5472
|
+
* @returns {Boolean}
|
5473
|
+
*/
|
5474
|
+
_de: function(value) {
|
5475
|
+
if (!/^DE[0-9]{9}$/.test(value)) {
|
5476
|
+
return false;
|
5477
|
+
}
|
5478
|
+
|
5479
|
+
value = value.substr(2);
|
5480
|
+
return $.fn.bootstrapValidator.helpers.mod11And10(value);
|
5481
|
+
},
|
5482
|
+
|
5483
|
+
/**
|
5484
|
+
* Validate Danish VAT number
|
5485
|
+
* Example:
|
5486
|
+
* - Valid: DK13585628
|
5487
|
+
* - Invalid: DK13585627
|
5488
|
+
*
|
5489
|
+
* @param {String} value VAT number
|
5490
|
+
* @returns {Boolean}
|
5491
|
+
*/
|
5492
|
+
_dk: function(value) {
|
5493
|
+
if (!/^DK[0-9]{8}$/.test(value)) {
|
5494
|
+
return false;
|
5495
|
+
}
|
5496
|
+
|
5497
|
+
value = value.substr(2);
|
5498
|
+
var sum = 0,
|
5499
|
+
weight = [2, 7, 6, 5, 4, 3, 2, 1];
|
5500
|
+
for (var i = 0; i < 8; i++) {
|
5501
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5502
|
+
}
|
5503
|
+
|
5504
|
+
return (sum % 11 === 0);
|
5505
|
+
},
|
5506
|
+
|
5507
|
+
/**
|
5508
|
+
* Validate Estonian VAT number
|
5509
|
+
* Examples:
|
5510
|
+
* - Valid: EE100931558, EE100594102
|
5511
|
+
* - Invalid: EE100594103
|
5512
|
+
*
|
5513
|
+
* @param {String} value VAT number
|
5514
|
+
* @returns {Boolean}
|
5515
|
+
*/
|
5516
|
+
_ee: function(value) {
|
5517
|
+
if (!/^EE[0-9]{9}$/.test(value)) {
|
5518
|
+
return false;
|
5519
|
+
}
|
5520
|
+
|
5521
|
+
value = value.substr(2);
|
5522
|
+
var sum = 0,
|
5523
|
+
weight = [3, 7, 1, 3, 7, 1, 3, 7, 1];
|
5524
|
+
|
5525
|
+
for (var i = 0; i < 9; i++) {
|
5526
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5527
|
+
}
|
5528
|
+
|
5529
|
+
return (sum % 10 === 0);
|
5530
|
+
},
|
5531
|
+
|
5532
|
+
/**
|
5533
|
+
* Validate Spanish VAT number (NIF - Número de Identificación Fiscal)
|
5534
|
+
* Can be:
|
5535
|
+
* i) DNI (Documento nacional de identidad), for Spaniards
|
5536
|
+
* ii) NIE (Número de Identificación de Extranjeros), for foreigners
|
5537
|
+
* iii) CIF (Certificado de Identificación Fiscal), for legal entities and others
|
5538
|
+
*
|
5539
|
+
* Examples:
|
5540
|
+
* - Valid: i) ES54362315K; ii) ESX2482300W, ESX5253868R; iii) ESM1234567L, ESJ99216582, ESB58378431, ESB64717838
|
5541
|
+
* - Invalid: i) ES54362315Z; ii) ESX2482300A; iii) ESJ99216583
|
5542
|
+
*
|
5543
|
+
* @param {String} value VAT number
|
5544
|
+
* @returns {Boolean}
|
5545
|
+
*/
|
5546
|
+
_es: function(value) {
|
5547
|
+
if (!/^ES[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(value)) {
|
5548
|
+
return false;
|
5549
|
+
}
|
5550
|
+
|
5551
|
+
value = value.substr(2);
|
5552
|
+
var dni = function(value) {
|
5553
|
+
var check = parseInt(value.substr(0, 8), 10);
|
5554
|
+
check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
|
5555
|
+
return (check + '' === value.substr(8, 1));
|
5556
|
+
},
|
5557
|
+
nie = function(value) {
|
5558
|
+
var check = ['XYZ'.indexOf(value.charAt(0)), value.substr(1)].join('');
|
5559
|
+
check = parseInt(check, 10);
|
5560
|
+
check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
|
5561
|
+
return (check + '' === value.substr(8, 1));
|
5562
|
+
},
|
5563
|
+
cif = function(value) {
|
5564
|
+
var first = value.charAt(0), check;
|
5565
|
+
if ('KLM'.indexOf(first) !== -1) {
|
5566
|
+
// K: Spanish younger than 14 year old
|
5567
|
+
// L: Spanish living outside Spain without DNI
|
5568
|
+
// M: Granted the tax to foreigners who have no NIE
|
5569
|
+
check = parseInt(value.substr(1, 8), 10);
|
5570
|
+
check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
|
5571
|
+
return (check + '' === value.substr(8, 1));
|
5572
|
+
} else if ('ABCDEFGHJNPQRSUVW'.indexOf(first) !== -1) {
|
5573
|
+
var sum = 0,
|
5574
|
+
weight = [2, 1, 2, 1, 2, 1, 2],
|
5575
|
+
temp = 0;
|
5576
|
+
|
5577
|
+
for (var i = 0; i < 7; i++) {
|
5578
|
+
temp = parseInt(value.charAt(i + 1), 10) * weight[i];
|
5579
|
+
if (temp > 9) {
|
5580
|
+
temp = Math.floor(temp / 10) + temp % 10;
|
5581
|
+
}
|
5582
|
+
sum += temp;
|
5583
|
+
}
|
5584
|
+
sum = 10 - sum % 10;
|
5585
|
+
return (sum + '' === value.substr(8, 1) || 'JABCDEFGHI'[sum] === value.substr(8, 1));
|
5586
|
+
}
|
5587
|
+
|
5588
|
+
return false;
|
5589
|
+
};
|
5590
|
+
|
5591
|
+
var first = value.charAt(0);
|
5592
|
+
if (/^[0-9]$/.test(first)) {
|
5593
|
+
return dni(value);
|
5594
|
+
} else if (/^[XYZ]$/.test(first)) {
|
5595
|
+
return nie(value);
|
5596
|
+
} else {
|
5597
|
+
return cif(value);
|
5598
|
+
}
|
5599
|
+
},
|
5600
|
+
|
5601
|
+
/**
|
5602
|
+
* Validate Finnish VAT number
|
5603
|
+
* Examples:
|
5604
|
+
* - Valid: FI20774740
|
5605
|
+
* - Invalid: FI20774741
|
5606
|
+
*
|
5607
|
+
* @param {String} value VAT number
|
5608
|
+
* @returns {Boolean}
|
5609
|
+
*/
|
5610
|
+
_fi: function(value) {
|
5611
|
+
if (!/^FI[0-9]{8}$/.test(value)) {
|
5612
|
+
return false;
|
5613
|
+
}
|
5614
|
+
|
5615
|
+
value = value.substr(2);
|
5616
|
+
var sum = 0,
|
5617
|
+
weight = [7, 9, 10, 5, 8, 4, 2, 1];
|
5618
|
+
|
5619
|
+
for (var i = 0; i < 8; i++) {
|
5620
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5621
|
+
}
|
5622
|
+
|
5623
|
+
return (sum % 11 === 0);
|
5624
|
+
},
|
5625
|
+
|
5626
|
+
/**
|
5627
|
+
* Validate French VAT number (TVA - taxe sur la valeur ajoutée)
|
5628
|
+
* It's constructed by a SIREN number, prefixed by two characters.
|
5629
|
+
*
|
5630
|
+
* Examples:
|
5631
|
+
* - Valid: FR40303265045, FR23334175221, FRK7399859412, FR4Z123456782
|
5632
|
+
* - Invalid: FR84323140391
|
5633
|
+
*
|
5634
|
+
* @param {String} value VAT number
|
5635
|
+
* @returns {Boolean}
|
5636
|
+
*/
|
5637
|
+
_fr: function(value) {
|
5638
|
+
if (!/^FR[0-9A-Z]{2}[0-9]{9}$/.test(value)) {
|
5639
|
+
return false;
|
5640
|
+
}
|
5641
|
+
|
5642
|
+
value = value.substr(2);
|
5643
|
+
|
5644
|
+
if (!$.fn.bootstrapValidator.helpers.luhn(value.substr(2))) {
|
5645
|
+
return false;
|
5646
|
+
}
|
5647
|
+
|
5648
|
+
if (/^[0-9]{2}$/.test(value.substr(0, 2))) {
|
5649
|
+
// First two characters are digits
|
5650
|
+
return value.substr(0, 2) === (parseInt(value.substr(2) + '12', 10) % 97 + '');
|
5651
|
+
} else {
|
5652
|
+
// The first characters cann't be O and I
|
5653
|
+
var alphabet = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ',
|
5654
|
+
check;
|
5655
|
+
// First one is digit
|
5656
|
+
if (/^[0-9]{1}$/.test(value.charAt(0))) {
|
5657
|
+
check = alphabet.indexOf(value.charAt(0)) * 24 + alphabet.indexOf(value.charAt(1)) - 10;
|
5658
|
+
} else {
|
5659
|
+
check = alphabet.indexOf(value.charAt(0)) * 34 + alphabet.indexOf(value.charAt(1)) - 100;
|
5660
|
+
}
|
5661
|
+
return ((parseInt(value.substr(2), 10) + 1 + Math.floor(check / 11)) % 11) === (check % 11);
|
5662
|
+
}
|
5663
|
+
},
|
5664
|
+
|
5665
|
+
/**
|
5666
|
+
* Validate United Kingdom VAT number
|
5667
|
+
* Example:
|
5668
|
+
* - Valid: GB980780684
|
5669
|
+
* - Invalid: GB802311781
|
5670
|
+
*
|
5671
|
+
* @param {String} value VAT number
|
5672
|
+
* @returns {Boolean}
|
5673
|
+
*/
|
5674
|
+
_gb: function(value) {
|
5675
|
+
if (!/^GB[0-9]{9}$/.test(value) /* Standard */
|
5676
|
+
&& !/^GB[0-9]{12}$/.test(value) /* Branches */
|
5677
|
+
&& !/^GBGD[0-9]{3}$/.test(value) /* Government department */
|
5678
|
+
&& !/^GBHA[0-9]{3}$/.test(value) /* Health authority */
|
5679
|
+
&& !/^GB(GD|HA)8888[0-9]{5}$/.test(value))
|
5680
|
+
{
|
5681
|
+
return false;
|
5682
|
+
}
|
5683
|
+
|
5684
|
+
value = value.substr(2);
|
5685
|
+
var length = value.length;
|
5686
|
+
if (length === 5) {
|
5687
|
+
var firstTwo = value.substr(0, 2),
|
5688
|
+
lastThree = parseInt(value.substr(2), 10);
|
5689
|
+
return ('GD' === firstTwo && lastThree < 500) || ('HA' === firstTwo && lastThree >= 500);
|
5690
|
+
} else if (length === 11 && ('GD8888' === value.substr(0, 6) || 'HA8888' === value.substr(0, 6))) {
|
5691
|
+
if (('GD' === value.substr(0, 2) && parseInt(value.substr(6, 3), 10) >= 500)
|
5692
|
+
|| ('HA' === value.substr(0, 2) && parseInt(value.substr(6, 3), 10) < 500))
|
5693
|
+
{
|
5694
|
+
return false;
|
5695
|
+
}
|
5696
|
+
return (parseInt(value.substr(6, 3), 10) % 97 === parseInt(value.substr(9, 2), 10));
|
5697
|
+
} else if (length === 9 || length === 12) {
|
5698
|
+
var sum = 0,
|
5699
|
+
weight = [8, 7, 6, 5, 4, 3, 2, 10, 1];
|
5700
|
+
for (var i = 0; i < 9; i++) {
|
5701
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5702
|
+
}
|
5703
|
+
sum = sum % 97;
|
5704
|
+
|
5705
|
+
if (parseInt(value.substr(0, 3), 10) >= 100) {
|
5706
|
+
return (sum === 0 || sum === 42 || sum === 55);
|
5707
|
+
} else {
|
5708
|
+
return (sum === 0);
|
5709
|
+
}
|
5710
|
+
}
|
5711
|
+
|
5712
|
+
return true;
|
5713
|
+
},
|
5714
|
+
|
5715
|
+
/**
|
5716
|
+
* Validate Greek VAT number
|
5717
|
+
* Examples:
|
5718
|
+
* - Valid: GR023456780, EL094259216
|
5719
|
+
* - Invalid: EL123456781
|
5720
|
+
*
|
5721
|
+
* @param {String} value VAT number
|
5722
|
+
* @returns {Boolean}
|
5723
|
+
*/
|
5724
|
+
_gr: function(value) {
|
5725
|
+
if (!/^GR[0-9]{9}$/.test(value)) {
|
5726
|
+
return false;
|
5727
|
+
}
|
5728
|
+
|
5729
|
+
value = value.substr(2);
|
5730
|
+
if (value.length === 8) {
|
5731
|
+
value = '0' + value;
|
5732
|
+
}
|
5733
|
+
|
5734
|
+
var sum = 0,
|
5735
|
+
weight = [256, 128, 64, 32, 16, 8, 4, 2];
|
5736
|
+
for (var i = 0; i < 8; i++) {
|
5737
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5738
|
+
}
|
5739
|
+
sum = (sum % 11) % 10;
|
5740
|
+
|
5741
|
+
return (sum + '' === value.substr(8, 1));
|
5742
|
+
},
|
5743
|
+
|
5744
|
+
// EL is traditionally prefix of Greek VAT numbers
|
5745
|
+
_el: function(value) {
|
5746
|
+
if (!/^EL[0-9]{9}$/.test(value)) {
|
5747
|
+
return false;
|
5748
|
+
}
|
5749
|
+
|
5750
|
+
value = 'GR' + value.substr(2);
|
5751
|
+
return this._gr(value);
|
5752
|
+
},
|
5753
|
+
|
5754
|
+
/**
|
5755
|
+
* Validate Hungarian VAT number
|
5756
|
+
* Examples:
|
5757
|
+
* - Valid: HU12892312
|
5758
|
+
* - Invalid: HU12892313
|
5759
|
+
*
|
5760
|
+
* @param {String} value VAT number
|
5761
|
+
* @returns {Boolean}
|
5762
|
+
*/
|
5763
|
+
_hu: function(value) {
|
5764
|
+
if (!/^HU[0-9]{8}$/.test(value)) {
|
5765
|
+
return false;
|
5766
|
+
}
|
5767
|
+
|
5768
|
+
value = value.substr(2);
|
5769
|
+
var sum = 0,
|
5770
|
+
weight = [9, 7, 3, 1, 9, 7, 3, 1];
|
5771
|
+
|
5772
|
+
for (var i = 0; i < 8; i++) {
|
5773
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5774
|
+
}
|
5775
|
+
|
5776
|
+
return (sum % 10 === 0);
|
5777
|
+
},
|
5778
|
+
|
5779
|
+
/**
|
5780
|
+
* Validate Croatian VAT number
|
5781
|
+
* Examples:
|
5782
|
+
* - Valid: HR33392005961
|
5783
|
+
* - Invalid: HR33392005962
|
5784
|
+
*
|
5785
|
+
* @param {String} value VAT number
|
5786
|
+
* @returns {Boolean}
|
5787
|
+
*/
|
5788
|
+
_hr: function(value) {
|
5789
|
+
if (!/^HR[0-9]{11}$/.test(value)) {
|
5790
|
+
return false;
|
5791
|
+
}
|
5792
|
+
|
5793
|
+
value = value.substr(2);
|
5794
|
+
return $.fn.bootstrapValidator.helpers.mod11And10(value);
|
5795
|
+
},
|
5796
|
+
|
5797
|
+
/**
|
5798
|
+
* Validate Irish VAT number
|
5799
|
+
* Examples:
|
5800
|
+
* - Valid: IE6433435F, IE6433435OA, IE8D79739I
|
5801
|
+
* - Invalid: IE8D79738J
|
5802
|
+
*
|
5803
|
+
* @param {String} value VAT number
|
5804
|
+
* @returns {Boolean}
|
5805
|
+
*/
|
5806
|
+
_ie: function(value) {
|
5807
|
+
if (!/^IE[0-9]{1}[0-9A-Z\*\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(value)) {
|
5808
|
+
return false;
|
5809
|
+
}
|
5810
|
+
|
5811
|
+
value = value.substr(2);
|
5812
|
+
var getCheckDigit = function(value) {
|
5813
|
+
while (value.length < 7) {
|
5814
|
+
value = '0' + value;
|
5815
|
+
}
|
5816
|
+
var alphabet = 'WABCDEFGHIJKLMNOPQRSTUV',
|
5817
|
+
sum = 0;
|
5818
|
+
for (var i = 0; i < 7; i++) {
|
5819
|
+
sum += parseInt(value.charAt(i), 10) * (8 - i);
|
5820
|
+
}
|
5821
|
+
sum += 9 * alphabet.indexOf(value.substr(7));
|
5822
|
+
return alphabet[sum % 23];
|
5823
|
+
};
|
5824
|
+
|
5825
|
+
// The first 7 characters are digits
|
5826
|
+
if (/^[0-9]+$/.test(value.substr(0, 7))) {
|
5827
|
+
// New system
|
5828
|
+
return value.charAt(7) === getCheckDigit(value.substr(0, 7) + value.substr(8) + '');
|
5829
|
+
} else if ('ABCDEFGHIJKLMNOPQRSTUVWXYZ+*'.indexOf(value.charAt(1)) !== -1) {
|
5830
|
+
// Old system
|
5831
|
+
return value.charAt(7) === getCheckDigit(value.substr(2, 5) + value.substr(0, 1) + '');
|
5832
|
+
}
|
5833
|
+
|
5834
|
+
return true;
|
5835
|
+
},
|
5836
|
+
|
5837
|
+
/**
|
5838
|
+
* Validate Italian VAT number, which consists of 11 digits.
|
5839
|
+
* - First 7 digits are a company identifier
|
5840
|
+
* - Next 3 are the province of residence
|
5841
|
+
* - The last one is a check digit
|
5842
|
+
*
|
5843
|
+
* Examples:
|
5844
|
+
* - Valid: IT00743110157
|
5845
|
+
* - Invalid: IT00743110158
|
5846
|
+
*
|
5847
|
+
* @param {String} value VAT number
|
5848
|
+
* @returns {Boolean}
|
5849
|
+
*/
|
5850
|
+
_it: function(value) {
|
5851
|
+
if (!/^IT[0-9]{11}$/.test(value)) {
|
5852
|
+
return false;
|
5853
|
+
}
|
5854
|
+
|
5855
|
+
value = value.substr(2);
|
5856
|
+
if (parseInt(value.substr(0, 7), 10) === 0) {
|
5857
|
+
return false;
|
5858
|
+
}
|
5859
|
+
|
5860
|
+
var lastThree = parseInt(value.substr(7, 3), 10);
|
5861
|
+
if ((lastThree < 1) || (lastThree > 201) && lastThree !== 999 && lastThree !== 888) {
|
5862
|
+
return false;
|
5863
|
+
}
|
5864
|
+
|
5865
|
+
return $.fn.bootstrapValidator.helpers.luhn(value);
|
5866
|
+
},
|
5867
|
+
|
5868
|
+
/**
|
5869
|
+
* Validate Lithuanian VAT number
|
5870
|
+
* It can be:
|
5871
|
+
* - 9 digits, for legal entities
|
5872
|
+
* - 12 digits, for temporarily registered taxpayers
|
5873
|
+
*
|
5874
|
+
* Examples:
|
5875
|
+
* - Valid: LT119511515, LT100001919017, LT100004801610
|
5876
|
+
* - Invalid: LT100001919018
|
5877
|
+
*
|
5878
|
+
* @param {String} value VAT number
|
5879
|
+
* @returns {Boolean}
|
5880
|
+
*/
|
5881
|
+
_lt: function(value) {
|
5882
|
+
if (!/^LT([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(value)) {
|
5883
|
+
return false;
|
5884
|
+
}
|
5885
|
+
|
5886
|
+
value = value.substr(2);
|
5887
|
+
var length = value.length,
|
5888
|
+
sum = 0,
|
5889
|
+
i;
|
5890
|
+
for (i = 0; i < length - 1; i++) {
|
5891
|
+
sum += parseInt(value.charAt(i), 10) * (1 + i % 9);
|
5892
|
+
}
|
5893
|
+
var check = sum % 11;
|
5894
|
+
if (check === 10) {
|
5895
|
+
sum = 0;
|
5896
|
+
for (i = 0; i < length - 1; i++) {
|
5897
|
+
sum += parseInt(value.charAt(i), 10) * (1 + (i + 2) % 9);
|
5898
|
+
}
|
5899
|
+
}
|
5900
|
+
check = check % 11 % 10;
|
5901
|
+
return (check + '' === value.charAt(length - 1));
|
5902
|
+
},
|
5903
|
+
|
5904
|
+
/**
|
5905
|
+
* Validate Luxembourg VAT number
|
5906
|
+
* Examples:
|
5907
|
+
* - Valid: LU15027442
|
5908
|
+
* - Invalid: LU15027443
|
5909
|
+
*
|
5910
|
+
* @param {String} value VAT number
|
5911
|
+
* @returns {Boolean}
|
5912
|
+
*/
|
5913
|
+
_lu: function(value) {
|
5914
|
+
if (!/^LU[0-9]{8}$/.test(value)) {
|
5915
|
+
return false;
|
5916
|
+
}
|
5917
|
+
|
5918
|
+
value = value.substr(2);
|
5919
|
+
return ((parseInt(value.substr(0, 6), 10) % 89) + '' === value.substr(6, 2));
|
5920
|
+
},
|
5921
|
+
|
5922
|
+
/**
|
5923
|
+
* Validate Latvian VAT number
|
5924
|
+
* Examples:
|
5925
|
+
* - Valid: LV40003521600, LV16117519997
|
5926
|
+
* - Invalid: LV40003521601, LV16137519997
|
5927
|
+
*
|
5928
|
+
* @param {String} value VAT number
|
5929
|
+
* @returns {Boolean}
|
5930
|
+
*/
|
5931
|
+
_lv: function(value) {
|
5932
|
+
if (!/^LV[0-9]{11}$/.test(value)) {
|
5933
|
+
return false;
|
5934
|
+
}
|
5935
|
+
|
5936
|
+
value = value.substr(2);
|
5937
|
+
var first = parseInt(value.charAt(0), 10),
|
5938
|
+
sum = 0,
|
5939
|
+
weight = [],
|
5940
|
+
i,
|
5941
|
+
length = value.length;
|
5942
|
+
if (first > 3) {
|
5943
|
+
// Legal entity
|
5944
|
+
sum = 0;
|
5945
|
+
weight = [9, 1, 4, 8, 3, 10, 2, 5, 7, 6, 1];
|
5946
|
+
for (i = 0; i < length; i++) {
|
5947
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5948
|
+
}
|
5949
|
+
sum = sum % 11;
|
5950
|
+
return (sum === 3);
|
5951
|
+
} else {
|
5952
|
+
// Check birth date
|
5953
|
+
var day = parseInt(value.substr(0, 2), 10),
|
5954
|
+
month = parseInt(value.substr(2, 2), 10),
|
5955
|
+
year = parseInt(value.substr(4, 2), 10);
|
5956
|
+
year = year + 1800 + parseInt(value.charAt(6), 10) * 100;
|
5957
|
+
|
5958
|
+
if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
|
5959
|
+
return false;
|
5960
|
+
}
|
5961
|
+
|
5962
|
+
// Check personal code
|
5963
|
+
sum = 0;
|
5964
|
+
weight = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];
|
5965
|
+
for (i = 0; i < length - 1; i++) {
|
5966
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5967
|
+
}
|
5968
|
+
sum = (sum + 1) % 11 % 10;
|
5969
|
+
return (sum + '' === value.charAt(length - 1));
|
5970
|
+
}
|
5971
|
+
},
|
5972
|
+
|
5973
|
+
/**
|
5974
|
+
* Validate Maltese VAT number
|
5975
|
+
* Examples:
|
5976
|
+
* - Valid: MT11679112
|
5977
|
+
* - Invalid: MT11679113
|
5978
|
+
*
|
5979
|
+
* @param {String} value VAT number
|
5980
|
+
* @returns {Boolean}
|
5981
|
+
*/
|
5982
|
+
_mt: function(value) {
|
5983
|
+
if (!/^MT[0-9]{8}$/.test(value)) {
|
5984
|
+
return false;
|
5985
|
+
}
|
5986
|
+
|
5987
|
+
value = value.substr(2);
|
5988
|
+
var sum = 0,
|
5989
|
+
weight = [3, 4, 6, 7, 8, 9, 10, 1];
|
5990
|
+
|
5991
|
+
for (var i = 0; i < 8; i++) {
|
5992
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
5993
|
+
}
|
5994
|
+
|
5995
|
+
return (sum % 37 === 0);
|
5996
|
+
},
|
5997
|
+
|
5998
|
+
/**
|
5999
|
+
* Validate Dutch VAT number
|
6000
|
+
* Examples:
|
6001
|
+
* - Valid: NL004495445B01
|
6002
|
+
* - Invalid: NL123456789B90
|
6003
|
+
*
|
6004
|
+
* @param {String} value VAT number
|
6005
|
+
* @returns {Boolean}
|
6006
|
+
*/
|
6007
|
+
_nl: function(value) {
|
6008
|
+
if (!/^NL[0-9]{9}B[0-9]{2}$/.test(value)) {
|
6009
|
+
return false;
|
6010
|
+
}
|
6011
|
+
value = value.substr(2);
|
6012
|
+
var sum = 0,
|
6013
|
+
weight = [9, 8, 7, 6, 5, 4, 3, 2];
|
6014
|
+
for (var i = 0; i < 8; i++) {
|
6015
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
6016
|
+
}
|
6017
|
+
|
6018
|
+
sum = sum % 11;
|
6019
|
+
if (sum > 9) {
|
6020
|
+
sum = 0;
|
6021
|
+
}
|
6022
|
+
return (sum + '' === value.substr(8, 1));
|
6023
|
+
},
|
6024
|
+
|
6025
|
+
/**
|
6026
|
+
* Validate Norwegian VAT number
|
6027
|
+
*
|
6028
|
+
* @see http://www.brreg.no/english/coordination/number.html
|
6029
|
+
* @param {String} value VAT number
|
6030
|
+
* @returns {Boolean}
|
6031
|
+
*/
|
6032
|
+
_no: function(value) {
|
6033
|
+
if (!/^NO[0-9]{9}$/.test(value)) {
|
6034
|
+
return false;
|
6035
|
+
}
|
6036
|
+
value = value.substr(2);
|
6037
|
+
var sum = 0,
|
6038
|
+
weight = [3, 2, 7, 6, 5, 4, 3, 2];
|
6039
|
+
for (var i = 0; i < 8; i++) {
|
6040
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
6041
|
+
}
|
6042
|
+
|
6043
|
+
sum = 11 - sum % 11;
|
6044
|
+
if (sum === 11) {
|
6045
|
+
sum = 0;
|
6046
|
+
}
|
6047
|
+
return (sum + '' === value.substr(8, 1));
|
6048
|
+
},
|
6049
|
+
|
6050
|
+
/**
|
6051
|
+
* Validate Polish VAT number
|
6052
|
+
* Examples:
|
6053
|
+
* - Valid: PL8567346215
|
6054
|
+
* - Invalid: PL8567346216
|
6055
|
+
*
|
6056
|
+
* @param {String} value VAT number
|
6057
|
+
* @returns {Boolean}
|
6058
|
+
*/
|
6059
|
+
_pl: function(value) {
|
6060
|
+
if (!/^PL[0-9]{10}$/.test(value)) {
|
6061
|
+
return false;
|
6062
|
+
}
|
6063
|
+
|
6064
|
+
value = value.substr(2);
|
6065
|
+
var sum = 0,
|
6066
|
+
weight = [6, 5, 7, 2, 3, 4, 5, 6, 7, -1];
|
6067
|
+
|
6068
|
+
for (var i = 0; i < 10; i++) {
|
6069
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
6070
|
+
}
|
6071
|
+
|
6072
|
+
return (sum % 11 === 0);
|
6073
|
+
},
|
6074
|
+
|
6075
|
+
/**
|
6076
|
+
* Validate Portuguese VAT number
|
6077
|
+
* Examples:
|
6078
|
+
* - Valid: PT501964843
|
6079
|
+
* - Invalid: PT501964842
|
6080
|
+
*
|
6081
|
+
* @param {String} value VAT number
|
6082
|
+
* @returns {Boolean}
|
6083
|
+
*/
|
6084
|
+
_pt: function(value) {
|
6085
|
+
if (!/^PT[0-9]{9}$/.test(value)) {
|
6086
|
+
return false;
|
6087
|
+
}
|
6088
|
+
|
6089
|
+
value = value.substr(2);
|
6090
|
+
var sum = 0,
|
6091
|
+
weight = [9, 8, 7, 6, 5, 4, 3, 2];
|
6092
|
+
|
6093
|
+
for (var i = 0; i < 8; i++) {
|
6094
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
6095
|
+
}
|
6096
|
+
sum = 11 - sum % 11;
|
6097
|
+
if (sum > 9) {
|
6098
|
+
sum = 0;
|
6099
|
+
}
|
6100
|
+
return (sum + '' === value.substr(8, 1));
|
6101
|
+
},
|
6102
|
+
|
6103
|
+
/**
|
6104
|
+
* Validate Romanian VAT number
|
6105
|
+
* Examples:
|
6106
|
+
* - Valid: RO18547290
|
6107
|
+
* - Invalid: RO18547291
|
6108
|
+
*
|
6109
|
+
* @param {String} value VAT number
|
6110
|
+
* @returns {Boolean}
|
6111
|
+
*/
|
6112
|
+
_ro: function(value) {
|
6113
|
+
if (!/^RO[1-9][0-9]{1,9}$/.test(value)) {
|
6114
|
+
return false;
|
6115
|
+
}
|
6116
|
+
value = value.substr(2);
|
6117
|
+
|
6118
|
+
var length = value.length,
|
6119
|
+
weight = [7, 5, 3, 2, 1, 7, 5, 3, 2].slice(10 - length),
|
6120
|
+
sum = 0;
|
6121
|
+
for (var i = 0; i < length - 1; i++) {
|
6122
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
6123
|
+
}
|
6124
|
+
|
6125
|
+
sum = (10 * sum) % 11 % 10;
|
6126
|
+
return (sum + '' === value.substr(length - 1, 1));
|
6127
|
+
},
|
6128
|
+
|
6129
|
+
/**
|
6130
|
+
* Validate Russian VAT number (Taxpayer Identification Number - INN)
|
6131
|
+
*
|
6132
|
+
* @param {String} value VAT number
|
6133
|
+
* @returns {Boolean}
|
6134
|
+
*/
|
6135
|
+
_ru: function(value) {
|
6136
|
+
if (!/^RU([0-9]{9}|[0-9]{12})$/.test(value)) {
|
6137
|
+
return false;
|
6138
|
+
}
|
6139
|
+
|
6140
|
+
value = value.substr(2);
|
6141
|
+
var i = 0;
|
6142
|
+
if (value.length === 10) {
|
6143
|
+
var sum = 0,
|
6144
|
+
weight = [2, 4, 10, 3, 5, 9, 4, 6, 8, 0];
|
6145
|
+
for (i = 0; i < 10; i++) {
|
6146
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
6147
|
+
}
|
6148
|
+
sum = sum % 11;
|
6149
|
+
if (sum > 9) {
|
6150
|
+
sum = sum % 10;
|
6151
|
+
}
|
6152
|
+
|
6153
|
+
return (sum + '' === value.substr(9, 1));
|
6154
|
+
} else if (value.length === 12) {
|
6155
|
+
var sum1 = 0,
|
6156
|
+
weight1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0],
|
6157
|
+
sum2 = 0,
|
6158
|
+
weight2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0];
|
6159
|
+
|
6160
|
+
for (i = 0; i < 11; i++) {
|
6161
|
+
sum1 += parseInt(value.charAt(i), 10) * weight1[i];
|
6162
|
+
sum2 += parseInt(value.charAt(i), 10) * weight2[i];
|
6163
|
+
}
|
6164
|
+
sum1 = sum1 % 11;
|
6165
|
+
if (sum1 > 9) {
|
6166
|
+
sum1 = sum1 % 10;
|
6167
|
+
}
|
6168
|
+
sum2 = sum2 % 11;
|
6169
|
+
if (sum2 > 9) {
|
6170
|
+
sum2 = sum2 % 10;
|
6171
|
+
}
|
6172
|
+
|
6173
|
+
return (sum1 + '' === value.substr(10, 1) && sum2 + '' === value.substr(11, 1));
|
6174
|
+
}
|
6175
|
+
|
6176
|
+
return false;
|
6177
|
+
},
|
6178
|
+
|
6179
|
+
/**
|
6180
|
+
* Validate Serbian VAT number
|
6181
|
+
*
|
6182
|
+
* @param {String} value VAT number
|
6183
|
+
* @returns {Boolean}
|
6184
|
+
*/
|
6185
|
+
_rs: function(value) {
|
6186
|
+
if (!/^RS[0-9]{9}$/.test(value)) {
|
6187
|
+
return false;
|
6188
|
+
}
|
6189
|
+
|
6190
|
+
value = value.substr(2);
|
6191
|
+
var sum = 10,
|
6192
|
+
temp = 0;
|
6193
|
+
for (var i = 0; i < 8; i++) {
|
6194
|
+
temp = (parseInt(value.charAt(i), 10) + sum) % 10;
|
6195
|
+
if (temp === 0) {
|
6196
|
+
temp = 10;
|
6197
|
+
}
|
6198
|
+
sum = (2 * temp) % 11;
|
6199
|
+
}
|
6200
|
+
|
6201
|
+
return ((sum + parseInt(value.substr(8, 1), 10)) % 10 === 1);
|
6202
|
+
},
|
6203
|
+
|
6204
|
+
/**
|
6205
|
+
* Validate Swedish VAT number
|
6206
|
+
* Examples:
|
6207
|
+
* - Valid: SE123456789701
|
6208
|
+
* - Invalid: SE123456789101
|
6209
|
+
*
|
6210
|
+
* @param {String} value VAT number
|
6211
|
+
* @returns {Boolean}
|
6212
|
+
*/
|
6213
|
+
_se: function(value) {
|
6214
|
+
if (!/^SE[0-9]{10}01$/.test(value)) {
|
6215
|
+
return false;
|
6216
|
+
}
|
6217
|
+
|
6218
|
+
value = value.substr(2, 10);
|
6219
|
+
return $.fn.bootstrapValidator.helpers.luhn(value);
|
6220
|
+
},
|
6221
|
+
|
6222
|
+
/**
|
6223
|
+
* Validate Slovenian VAT number
|
6224
|
+
* Examples:
|
6225
|
+
* - Valid: SI50223054
|
6226
|
+
* - Invalid: SI50223055
|
6227
|
+
*
|
6228
|
+
* @param {String} value VAT number
|
6229
|
+
* @returns {Boolean}
|
6230
|
+
*/
|
6231
|
+
_si: function(value) {
|
6232
|
+
if (!/^SI[0-9]{8}$/.test(value)) {
|
6233
|
+
return false;
|
6234
|
+
}
|
6235
|
+
|
6236
|
+
value = value.substr(2);
|
6237
|
+
var sum = 0,
|
6238
|
+
weight = [8, 7, 6, 5, 4, 3, 2];
|
6239
|
+
|
6240
|
+
for (var i = 0; i < 7; i++) {
|
6241
|
+
sum += parseInt(value.charAt(i), 10) * weight[i];
|
6242
|
+
}
|
6243
|
+
sum = 11 - sum % 11;
|
6244
|
+
if (sum === 10) {
|
6245
|
+
sum = 0;
|
6246
|
+
}
|
6247
|
+
return (sum + '' === value.substr(7, 1));
|
6248
|
+
},
|
6249
|
+
|
6250
|
+
/**
|
6251
|
+
* Validate Slovak VAT number
|
6252
|
+
* Examples:
|
6253
|
+
* - Valid: SK2022749619
|
6254
|
+
* - Invalid: SK2022749618
|
6255
|
+
*
|
6256
|
+
* @param {String} value VAT number
|
6257
|
+
* @returns {Boolean}
|
6258
|
+
*/
|
6259
|
+
_sk: function(value) {
|
6260
|
+
if (!/^SK[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(value)) {
|
6261
|
+
return false;
|
6262
|
+
}
|
6263
|
+
|
6264
|
+
return (parseInt(value.substr(2), 10) % 11 === 0);
|
6265
|
+
}
|
6266
|
+
};
|
6267
|
+
}(window.jQuery));
|
6268
|
+
;(function($) {
|
6269
|
+
$.fn.bootstrapValidator.i18n.vin = $.extend($.fn.bootstrapValidator.i18n.vin || {}, {
|
6270
|
+
'default': 'Please enter a valid VIN number'
|
6271
|
+
});
|
6272
|
+
|
6273
|
+
$.fn.bootstrapValidator.validators.vin = {
|
6274
|
+
/**
|
6275
|
+
* Validate an US VIN (Vehicle Identification Number)
|
6276
|
+
*
|
6277
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
6278
|
+
* @param {jQuery} $field Field element
|
6279
|
+
* @param {Object} options Consist of key:
|
6280
|
+
* - message: The invalid message
|
6281
|
+
* @returns {Boolean}
|
6282
|
+
*/
|
6283
|
+
validate: function(validator, $field, options) {
|
6284
|
+
var value = $field.val();
|
6285
|
+
if (value === '') {
|
6286
|
+
return true;
|
6287
|
+
}
|
6288
|
+
|
6289
|
+
// Don't accept I, O, Q characters
|
6290
|
+
if (!/^[a-hj-npr-z0-9]{8}[0-9xX][a-hj-npr-z0-9]{8}$/i.test(value)) {
|
6291
|
+
return false;
|
6292
|
+
}
|
6293
|
+
|
6294
|
+
value = value.toUpperCase();
|
6295
|
+
var chars = {
|
6296
|
+
A: 1, B: 2, C: 3, D: 4, E: 5, F: 6, G: 7, H: 8,
|
6297
|
+
J: 1, K: 2, L: 3, M: 4, N: 5, P: 7, R: 9,
|
6298
|
+
S: 2, T: 3, U: 4, V: 5, W: 6, X: 7, Y: 8, Z: 9,
|
6299
|
+
'1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '0': 0
|
6300
|
+
},
|
6301
|
+
weights = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2],
|
6302
|
+
sum = 0,
|
6303
|
+
length = value.length;
|
6304
|
+
for (var i = 0; i < length; i++) {
|
6305
|
+
sum += chars[value.charAt(i) + ''] * weights[i];
|
6306
|
+
}
|
6307
|
+
|
6308
|
+
var reminder = sum % 11;
|
6309
|
+
if (reminder === 10) {
|
6310
|
+
reminder = 'X';
|
6311
|
+
}
|
6312
|
+
|
6313
|
+
return (reminder + '') === value.charAt(8);
|
6314
|
+
}
|
6315
|
+
};
|
6316
|
+
}(window.jQuery));
|
6317
|
+
;(function($) {
|
6318
|
+
$.fn.bootstrapValidator.i18n.zipCode = $.extend($.fn.bootstrapValidator.i18n.zipCode || {}, {
|
6319
|
+
'default': 'Please enter a valid zip code',
|
6320
|
+
countryNotSupported: 'The country code %s is not supported',
|
6321
|
+
country: 'Please enter a valid %s',
|
6322
|
+
countries: {
|
6323
|
+
'CA': 'Canadian postal code',
|
6324
|
+
'DK': 'Danish postal code',
|
6325
|
+
'GB': 'United Kingdom postal code',
|
6326
|
+
'IT': 'Italian postal code',
|
6327
|
+
'NL': 'Dutch postal code',
|
6328
|
+
'SE': 'Swiss postal code',
|
6329
|
+
'SG': 'Singapore postal code',
|
6330
|
+
'US': 'US zip code'
|
6331
|
+
}
|
6332
|
+
});
|
6333
|
+
|
6334
|
+
$.fn.bootstrapValidator.validators.zipCode = {
|
6335
|
+
html5Attributes: {
|
6336
|
+
message: 'message',
|
6337
|
+
country: 'country'
|
6338
|
+
},
|
6339
|
+
|
6340
|
+
COUNTRY_CODES: ['CA', 'DK', 'GB', 'IT', 'NL', 'SE', 'SG', 'US'],
|
6341
|
+
|
6342
|
+
/**
|
6343
|
+
* Return true if and only if the input value is a valid country zip code
|
6344
|
+
*
|
6345
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
6346
|
+
* @param {jQuery} $field Field element
|
6347
|
+
* @param {Object} options Consist of key:
|
6348
|
+
* - message: The invalid message
|
6349
|
+
* - country: The country
|
6350
|
+
*
|
6351
|
+
* The country can be defined by:
|
6352
|
+
* - An ISO 3166 country code
|
6353
|
+
* Currently it supports the following countries:
|
6354
|
+
* - US (United States)
|
6355
|
+
* - CA (Canada)
|
6356
|
+
* - DK (Denmark)
|
6357
|
+
* - GB (United Kingdom)
|
6358
|
+
* - IT (Italy)
|
6359
|
+
* - NL (Netherlands)
|
6360
|
+
* - SE (Sweden)
|
6361
|
+
* - SG (Singapore)
|
6362
|
+
*
|
6363
|
+
* - Name of field which its value defines the country code
|
6364
|
+
* - Name of callback function that returns the country code
|
6365
|
+
* - A callback function that returns the country code
|
6366
|
+
*
|
6367
|
+
* callback: function(value, validator, $field) {
|
6368
|
+
* // value is the value of field
|
6369
|
+
* // validator is the BootstrapValidator instance
|
6370
|
+
* // $field is jQuery element representing the field
|
6371
|
+
* }
|
6372
|
+
*
|
6373
|
+
* @returns {Boolean|Object}
|
6374
|
+
*/
|
6375
|
+
validate: function(validator, $field, options) {
|
6376
|
+
var value = $field.val();
|
6377
|
+
if (value === '' || !options.country) {
|
6378
|
+
return true;
|
6379
|
+
}
|
6380
|
+
|
6381
|
+
var country = options.country;
|
6382
|
+
if (typeof country !== 'string' || $.inArray(country, this.COUNTRY_CODES) === -1) {
|
6383
|
+
// Try to determine the country
|
6384
|
+
country = validator.getDynamicOption($field, country);
|
6385
|
+
}
|
6386
|
+
|
6387
|
+
if (!country || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
|
6388
|
+
return { valid: false, message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.zipCode.countryNotSupported, country) };
|
6389
|
+
}
|
6390
|
+
|
6391
|
+
var isValid = false;
|
6392
|
+
country = country.toUpperCase();
|
6393
|
+
switch (country) {
|
6394
|
+
case 'CA':
|
6395
|
+
isValid = /^(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z){1}\s?[0-9]{1}(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z){1}[0-9]{1}$/i.test(value);
|
6396
|
+
break;
|
6397
|
+
|
6398
|
+
case 'DK':
|
6399
|
+
isValid = /^(DK(-|\s)?)?\d{4}$/i.test(value);
|
6400
|
+
break;
|
6401
|
+
|
6402
|
+
case 'GB':
|
6403
|
+
isValid = this._gb(value);
|
6404
|
+
break;
|
6405
|
+
|
6406
|
+
// http://en.wikipedia.org/wiki/List_of_postal_codes_in_Italy
|
6407
|
+
case 'IT':
|
6408
|
+
isValid = /^(I-|IT-)?\d{5}$/i.test(value);
|
6409
|
+
break;
|
6410
|
+
|
6411
|
+
// http://en.wikipedia.org/wiki/Postal_codes_in_the_Netherlands
|
6412
|
+
case 'NL':
|
6413
|
+
isValid = /^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$/i.test(value);
|
6414
|
+
break;
|
6415
|
+
|
6416
|
+
case 'SE':
|
6417
|
+
isValid = /^(S-)?\d{3}\s?\d{2}$/i.test(value);
|
6418
|
+
break;
|
6419
|
+
|
6420
|
+
case 'SG':
|
6421
|
+
isValid = /^([0][1-9]|[1-6][0-9]|[7]([0-3]|[5-9])|[8][0-2])(\d{4})$/i.test(value);
|
6422
|
+
break;
|
6423
|
+
|
6424
|
+
case 'US':
|
6425
|
+
/* falls through */
|
6426
|
+
default:
|
6427
|
+
isValid = /^\d{4,5}([\-]?\d{4})?$/.test(value);
|
6428
|
+
break;
|
6429
|
+
}
|
6430
|
+
|
6431
|
+
return {
|
6432
|
+
valid: isValid,
|
6433
|
+
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.zipCode.country, $.fn.bootstrapValidator.i18n.zipCode.countries[country])
|
6434
|
+
};
|
6435
|
+
},
|
6436
|
+
|
6437
|
+
/**
|
6438
|
+
* Validate United Kingdom postcode
|
6439
|
+
* Examples:
|
6440
|
+
* - Standard: EC1A 1BB, W1A 1HQ, M1 1AA, B33 8TH, CR2 6XH, DN55 1PT
|
6441
|
+
* - Special cases:
|
6442
|
+
* AI-2640, ASCN 1ZZ, GIR 0AA
|
6443
|
+
*
|
6444
|
+
* @see http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom
|
6445
|
+
* @param {String} value The postcode
|
6446
|
+
* @returns {Boolean}
|
6447
|
+
*/
|
6448
|
+
_gb: function(value) {
|
6449
|
+
var firstChar = '[ABCDEFGHIJKLMNOPRSTUWYZ]', // Does not accept QVX
|
6450
|
+
secondChar = '[ABCDEFGHKLMNOPQRSTUVWXY]', // Does not accept IJZ
|
6451
|
+
thirdChar = '[ABCDEFGHJKPMNRSTUVWXY]',
|
6452
|
+
fourthChar = '[ABEHMNPRVWXY]',
|
6453
|
+
fifthChar = '[ABDEFGHJLNPQRSTUWXYZ]',
|
6454
|
+
regexps = [
|
6455
|
+
// AN NAA, ANN NAA, AAN NAA, AANN NAA format
|
6456
|
+
new RegExp('^(' + firstChar + '{1}' + secondChar + '?[0-9]{1,2})(\\s*)([0-9]{1}' + fifthChar + '{2})$', 'i'),
|
6457
|
+
// ANA NAA
|
6458
|
+
new RegExp('^(' + firstChar + '{1}[0-9]{1}' + thirdChar + '{1})(\\s*)([0-9]{1}' + fifthChar + '{2})$', 'i'),
|
6459
|
+
// AANA NAA
|
6460
|
+
new RegExp('^(' + firstChar + '{1}' + secondChar + '{1}?[0-9]{1}' + fourthChar + '{1})(\\s*)([0-9]{1}' + fifthChar + '{2})$', 'i'),
|
6461
|
+
|
6462
|
+
new RegExp('^(BF1)(\\s*)([0-6]{1}[ABDEFGHJLNPQRST]{1}[ABDEFGHJLNPQRSTUWZYZ]{1})$', 'i'), // BFPO postcodes
|
6463
|
+
/^(GIR)(\s*)(0AA)$/i, // Special postcode GIR 0AA
|
6464
|
+
/^(BFPO)(\s*)([0-9]{1,4})$/i, // Standard BFPO numbers
|
6465
|
+
/^(BFPO)(\s*)(c\/o\s*[0-9]{1,3})$/i, // c/o BFPO numbers
|
6466
|
+
/^([A-Z]{4})(\s*)(1ZZ)$/i, // Overseas Territories
|
6467
|
+
/^(AI-2640)$/i // Anguilla
|
6468
|
+
];
|
6469
|
+
for (var i = 0; i < regexps.length; i++) {
|
6470
|
+
if (regexps[i].test(value)) {
|
6471
|
+
return true;
|
6472
|
+
}
|
6473
|
+
}
|
6474
|
+
|
6475
|
+
return false;
|
6476
|
+
}
|
6477
|
+
};
|
6478
|
+
}(window.jQuery));
|