(function($) { $.fn.bootstrapValidator.i18n.phone = $.extend($.fn.bootstrapValidator.i18n.phone || {}, { 'default': 'Please enter a valid phone number', countryNotSupported: 'The country code %s is not supported', country: 'Please enter a valid phone number in %s', countries: { BR: 'Brazil', CN: 'China', DK: 'Denmark', ES: 'Spain', FR: 'France', GB: 'United Kingdom', MA: 'Morocco', PK: 'Pakistan', RO: 'Romania', US: 'USA' } }); $.fn.bootstrapValidator.validators.phone = { html5Attributes: { message: 'message', country: 'country' }, // The supported countries COUNTRY_CODES: ['BR', 'CN', 'DK', 'ES', 'FR', 'GB', 'MA', 'PK', 'RO', 'US'], /** * Return true if the input value contains a valid phone number for the country * selected in the options * * @param {BootstrapValidator} validator Validate plugin instance * @param {jQuery} $field Field element * @param {Object} options Consist of key: * - message: The invalid message * - country: The ISO-3166 country code. It can be * - A country code * - Name of field which its value defines the country code * - Name of callback function that returns the country code * - A callback function that returns the country code * * @returns {Boolean|Object} */ validate: function(validator, $field, options) { var value = $field.val(); if (value === '') { return true; } var country = options.country; if (typeof country !== 'string' || $.inArray(country, this.COUNTRY_CODES) === -1) { // Try to determine the country country = validator.getDynamicOption($field, country); } if (!country || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) { return { valid: false, message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.phone.countryNotSupported, country) }; } var isValid = true; switch (country.toUpperCase()) { case 'BR': // Test: http://regexr.com/399m1 value = $.trim(value); isValid = (/^(([\d]{4}[-.\s]{1}[\d]{2,3}[-.\s]{1}[\d]{2}[-.\s]{1}[\d]{2})|([\d]{4}[-.\s]{1}[\d]{3}[-.\s]{1}[\d]{4})|((\(?\+?[0-9]{2}\)?\s?)?(\(?\d{2}\)?\s?)?\d{4,5}[-.\s]?\d{4}))$/).test(value); break; case 'CN': // http://regexr.com/39dq4 value = $.trim(value); isValid = (/^((00|\+)?(86(?:-| )))?((\d{11})|(\d{3}[- ]{1}\d{4}[- ]{1}\d{4})|((\d{2,4}[- ]){1}(\d{7,8}|(\d{3,4}[- ]{1}\d{4}))([- ]{1}\d{1,4})?))$/).test(value); break; case 'DK': // Mathing DK phone numbers with country code in 1 of 3 formats and an // 8 digit phone number not starting with a 0 or 1. Can have 1 space // between each character except inside the country code. // Test: http://regex101.com/r/sS8fO4/1 value = $.trim(value); isValid = (/^(\+45|0045|\(45\))?\s?[2-9](\s?\d){7}$/).test(value); break; case 'ES': // http://regex101.com/r/rB9mA9/1 value = $.trim(value); isValid = (/^(?:(?:(?:\+|00)34\D?))?(?:9|6)(?:\d\D?){8}$/).test(value); break; case 'FR': // http://regexr.com/39a2p value = $.trim(value); isValid = (/^(?:(?:(?:\+|00)33[ ]?(?:\(0\)[ ]?)?)|0){1}[1-9]{1}([ .-]?)(?:\d{2}\1?){3}\d{2}$/).test(value); break; case 'GB': // http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers#Match_GB_telephone_number_in_any_format // Test: http://regexr.com/38uhv value = $.trim(value); 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); break; case 'MA': // http://en.wikipedia.org/wiki/Telephone_numbers_in_Morocco // Test: http://regexr.com/399n8 value = $.trim(value); isValid = (/^(?:(?:(?:\+|00)212[\s]?(?:[\s]?\(0\)[\s]?)?)|0){1}(?:5[\s.-]?[2-3]|6[\s.-]?[13-9]){1}[0-9]{1}(?:[\s.-]?\d{2}){3}$/).test(value); break; case 'PK': // http://regex101.com/r/yH8aV9/2 value = $.trim(value); isValid = (/^0?3[0-9]{2}[0-9]{7}$/).test(value); break; case 'RO': // All mobile network and land line isValid = (/^(\+4|)?(07[0-8]{1}[0-9]{1}|02[0-9]{2}|03[0-9]{2}){1}?(\s|\.|\-)?([0-9]{3}(\s|\.|\-|)){2}$/g).test(value); break; case 'US': /* falls through */ default: // Make sure US phone numbers have 10 digits // May start with 1, +1, or 1-; should discard // Area code may be delimited with (), & sections may be delimited with . or - // Test: http://regexr.com/38mqi value = value.replace(/\D/g, ''); isValid = (/^(?:(1\-?)|(\+1 ?))?\(?(\d{3})[\)\-\.]?(\d{3})[\-\.]?(\d{4})$/).test(value) && (value.length === 10); break; } return { valid: isValid, message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.phone.country, $.fn.bootstrapValidator.i18n.phone.countries[country]) }; } }; }(window.jQuery));