UNPKG

formvalidation

Version:

The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks

99 lines (92 loc) 3.77 kB
/** * isbn validator * * @link http://formvalidation.io/validators/isbn/ * @author https://twitter.com/nghuuphuoc * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc * @license http://formvalidation.io/license/ */ (function($) { FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, { 'en_US': { isbn: { 'default': 'Please enter a valid ISBN number' } } }); FormValidation.Validator.isbn = { /** * Return true if the input value is a valid ISBN 10 or ISBN 13 number * Examples: * - Valid: * 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 * ISBN 13: 978-0-306-40615-7 * - Invalid: * ISBN 10: 99921-58-10-6 * ISBN 13: 978-0-306-40615-6 * * @see http://en.wikipedia.org/wiki/International_Standard_Book_Number * @param {FormValidation.Base} validator The validator plugin instance * @param {jQuery} $field Field element * @param {Object} [options] Can consist of the following keys: * - message: The invalid message * @returns {Boolean} */ validate: function(validator, $field, options) { var value = validator.getFieldValue($field, 'isbn'); if (value === '') { return true; } // http://en.wikipedia.org/wiki/International_Standard_Book_Number#Overview // Groups are separated by a hyphen or a space var type; switch (true) { case /^\d{9}[\dX]$/.test(value): case (value.length === 13 && /^(\d+)-(\d+)-(\d+)-([\dX])$/.test(value)): case (value.length === 13 && /^(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(value)): type = 'ISBN10'; break; case /^(978|979)\d{9}[\dX]$/.test(value): case (value.length === 17 && /^(978|979)-(\d+)-(\d+)-(\d+)-([\dX])$/.test(value)): case (value.length === 17 && /^(978|979)\s(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(value)): type = 'ISBN13'; break; default: return false; } // Replace all special characters except digits and X value = value.replace(/[^0-9X]/gi, ''); var chars = value.split(''), length = chars.length, sum = 0, i, checksum; switch (type) { case 'ISBN10': sum = 0; for (i = 0; i < length - 1; i++) { sum += parseInt(chars[i], 10) * (10 - i); } checksum = 11 - (sum % 11); if (checksum === 11) { checksum = 0; } else if (checksum === 10) { checksum = 'X'; } return (checksum + '' === chars[length - 1]); case 'ISBN13': sum = 0; for (i = 0; i < length - 1; i++) { sum += ((i % 2 === 0) ? parseInt(chars[i], 10) : (parseInt(chars[i], 10) * 3)); } checksum = 10 - (sum % 10); if (checksum === 10) { checksum = '0'; } return (checksum + '' === chars[length - 1]); default: return false; } } }; }(jQuery));