/** * Parsley validation for the new-client modal. Does not strip or rewrite user input; * invalid values are reported via Parsley messages only. */ (function (getJq) { 'use strict'; function $(selector, context) { var jq = getJq(); if (!jq) { return { length: 0 }; } return arguments.length > 1 ? jq(selector, context) : jq(selector); } var FORM_SELECTOR = '#client_form'; var NS = '.newClientModalValidate'; var TEXT_ALLOWED = /^[A-Za-z0-9/_.\- ]*$/; var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; function isParsleyReady() { return !!window.Parsley; } function isSkippable(el) { return !el || el.disabled || el.type === 'hidden'; } function isPanOrGst(el) { var id = (el.id || '').toLowerCase(); return id === 'pan' || id === 'gst'; } function isMobile(el) { var id = (el.id || '').toLowerCase(); var name = (el.name || '').toLowerCase(); return id === 'mobile' || id === 'phone' || name === 'mobile' || name === 'phone'; } function isEmail(el) { var type = (el.type || '').toLowerCase(); var id = (el.id || '').toLowerCase(); var name = (el.name || '').toLowerCase(); return type === 'email' || id === 'email' || id === 'email2' || name === 'email' || name === 'email2'; } function isCharsetCandidate(el) { if (!el || el.tagName === 'SELECT') { return false; } var type = (el.type || '').toLowerCase(); if (type === 'file' || type === 'checkbox' || type === 'radio' || type === 'password' || type === 'submit' || type === 'button' || type === 'reset') { return false; } if (isPanOrGst(el) || isMobile(el) || isEmail(el)) { return false; } return true; } function registerValidators() { if (!isParsleyReady() || window.Parsley.__newClientModalValidatorsRegistered) { return; } window.Parsley.addValidator('newclientcharset', { validateString: function (value) { if (!value || String(value).trim() === '') { return true; } return TEXT_ALLOWED.test(String(value)); }, messages: { en: 'Only letters, numbers, spaces, and the characters / _ - . are allowed.' } }); window.Parsley.addValidator('newclientmobile10', { validateString: function (value, req, instance) { var v = String(value || '').replace(/\D/g, ''); if (!instance.$element.prop('required') && v.length === 0) { return true; } if (instance.$element.prop('required') && v.length === 0) { return true; } return v.length === 10; }, messages: { en: 'Mobile number must be exactly 10 digits (numbers only).' } }); window.Parsley.addValidator('newclientemail', { validateString: function (value) { if (!value || String(value).trim() === '') { return true; } return EMAIL_RE.test(String(value).trim()); }, messages: { en: 'Please enter a valid email address.' } }); window.Parsley.__newClientModalValidatorsRegistered = true; } function clearAttrs($el) { ['data-parsley-newclientcharset', 'data-parsley-newclientmobile10', 'data-parsley-newclientemail'].forEach(function (a) { $el.removeAttr(a); }); } function applyConstraints($form) { $form.find('input, textarea, select').each(function () { var el = this; var $el = $(el); if (isSkippable(el) || isPanOrGst(el)) { return; } clearAttrs($el); if (isMobile(el)) { $el.attr('data-parsley-newclientmobile10', 'true'); if (!$el.attr('data-parsley-trigger')) { $el.attr('data-parsley-trigger', 'input change'); } return; } if (isEmail(el)) { $el.attr('data-parsley-newclientemail', 'true'); if (!$el.attr('data-parsley-trigger')) { $el.attr('data-parsley-trigger', 'input change'); } return; } if (isCharsetCandidate(el)) { $el.attr('data-parsley-newclientcharset', 'true'); if (!$el.attr('data-parsley-trigger')) { $el.attr('data-parsley-trigger', 'input change'); } return; } if (el.tagName === 'SELECT' && !$el.attr('data-parsley-trigger')) { $el.attr('data-parsley-trigger', 'change'); } }); } function refreshParsley($form) { try { var p = $form.parsley(); if (p && typeof p.refresh === 'function') { p.refresh(); } } catch (e) { // no-op } } function validateField(el) { if (!el || isSkippable(el) || !isParsleyReady()) { return; } var $f = $(el).closest('form'); if (!$f.length) { return; } applyConstraints($f); refreshParsley($f); try { $(el).parsley().validate(); } catch (e) { // no-op } } function init() { var $form = $(FORM_SELECTOR); if (!$form.length || !isParsleyReady()) { return; } registerValidators(); applyConstraints($form); refreshParsley($form); $form.off(NS); $form.on('input' + NS, 'input:not([type=hidden]), textarea', function () { validateField(this); }); $form.on('change' + NS, 'select, input:not([type=hidden]), textarea', function () { validateField(this); }); } $(function () { init(); }); window.refreshNewClientModalValidation = function () { init(); }; })(function () { return window.jQuery; });