/** * Parsley validation for the leads form. 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 TEXT_ALLOWED = /^[A-Za-z0-9/_.\- ]*$/; var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; var FORM_SELECTOR = '#leads_form_id'; var NS = '.leadsFormValidate'; var MESSAGES = { text: 'Only letters, numbers, spaces, and the characters / _ - . are allowed.', mobile: 'Mobile number must be exactly 10 digits (numbers only).', email: 'Please enter a valid email address.' }; function isParsleyReady() { return !!window.Parsley; } function isSkippableField(el) { if (!el || el.disabled || el.type === 'hidden') { return true; } if (el.classList && el.classList.contains('select2-search__field')) { return true; } return false; } function isVisibleForValidation(el) { if (isSkippableField(el)) { return false; } var jq = getJq(); if (!jq) { return true; } var $el = jq(el); if (!$el.length || !$el.is(':visible')) { return false; } return $el.closest('.form-group, .dynamic-form-row, .claim-row, .col-md-4, .col-md-12').filter(function () { var display = jq(this).css('display'); return display === 'none'; }).length === 0; } function isEmptyValue(val) { if (val == null || val === '') { return true; } if (Array.isArray(val)) { return val.length === 0; } return String(val).trim() === ''; } function isPanOrGstField(el) { if (!el) { return false; } var id = (el.id || '').toLowerCase(); return id === 'pan' || id === 'gst'; } function isEmailField(el) { if (!el) { return false; } var id = (el.id || '').toLowerCase(); var name = (el.name || '').toLowerCase(); var type = (el.type || '').toLowerCase(); return id === 'contact_person_email' || name === 'contact_person_email' || type === 'email'; } function isMobileField(el) { if (!el) { return false; } var id = (el.id || '').toLowerCase(); var name = (el.name || '').toLowerCase(); return id === 'contact_person_mobile' || name === 'contact_person_mobile'; } 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 (isPanOrGstField(el) || isEmailField(el) || isMobileField(el)) { return false; } return true; } function registerValidators() { if (!isParsleyReady() || window.Parsley.__leadsFormValidatorsRegistered) { return; } window.Parsley.addValidator('leadscharset', { validateString: function (value) { if (!value || String(value).trim() === '') { return true; } return TEXT_ALLOWED.test(String(value)); }, messages: { en: MESSAGES.text } }); window.Parsley.addValidator('leadsmobile10', { 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 false; } return v.length === 10; }, messages: { en: MESSAGES.mobile } }); window.Parsley.addValidator('leadsemail', { validateString: function (value) { if (!value || String(value).trim() === '') { return true; } return EMAIL_RE.test(String(value).trim()); }, messages: { en: MESSAGES.email } }); window.Parsley.__leadsFormValidatorsRegistered = true; } function clearAttrs($el) { ['data-parsley-leadscharset', 'data-parsley-leadsmobile10', 'data-parsley-leadsemail'].forEach(function (a) { $el.removeAttr(a); }); } function applyConstraints($form) { if (!$form || !$form.length) { return; } $form.find('input, textarea, select').each(function () { var el = this; var $el = $(el); if (isSkippableField(el) || isPanOrGstField(el)) { return; } clearAttrs($el); if (isMobileField(el)) { $el.attr('data-parsley-leadsmobile10', 'true'); if (!$el.attr('data-parsley-trigger')) { $el.attr('data-parsley-trigger', 'input change'); } return; } if (isEmailField(el)) { $el.attr('data-parsley-leadsemail', 'true'); if (!$el.attr('data-parsley-trigger')) { $el.attr('data-parsley-trigger', 'input change'); } return; } if (isCharsetCandidate(el)) { $el.attr('data-parsley-leadscharset', '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) { if (!$form || !$form.length || !isParsleyReady()) { return; } try { var instance = $form.parsley(); if (instance && typeof instance.refresh === 'function') { instance.refresh(); } } catch (e) { // no-op } } function validateField(field) { if (!field || !isVisibleForValidation(field) || !isParsleyReady()) { return; } var $field = $(field); var $form = $field.closest('form'); if (!$form.length || typeof $field.parsley !== 'function') { return; } applyConstraints($form); refreshParsley($form); try { $field.parsley().validate(); } catch (e) { // no-op } } function prepareHiddenFieldsForSubmit($form) { if (!$form || !$form.length) { return; } $form.find('input, textarea, select').each(function () { var el = this; var $el = $(el); if (isVisibleForValidation(el)) { return; } $el.removeAttr('required').prop('required', false); clearAttrs($el); try { if (typeof $el.parsley === 'function') { var fieldInstance = $el.parsley(); if (fieldInstance && typeof fieldInstance.reset === 'function') { fieldInstance.reset(); } } } catch (e) { // no-op } }); } function getInvalidFields($form) { var invalid = []; if (!$form || !$form.length || !isParsleyReady()) { return invalid; } var instance = $form.parsley(); if (!instance) { return invalid; } instance.fields.forEach(function (field) { if (field.isValid()) { return; } var el = field.$element[0]; if (!isVisibleForValidation(el)) { return; } var val = field.$element.val(); invalid.push({ id: field.$element.attr('id') || '', name: field.$element.attr('name') || '', label: (field.$element.closest('.form-group, .mb-3, .col-md-4, .col-lg-4').find('label').first().text() || '').trim(), messages: field.getErrorsMessages ? field.getErrorsMessages() : [], isEmpty: isEmptyValue(val) }); }); return invalid; } function init() { var $form = $(FORM_SELECTOR); if (!$form.length || !isParsleyReady()) { return; } registerValidators(); prepareHiddenFieldsForSubmit($form); 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.refreshLeadsFormValidation = function () { init(); }; window.prepareLeadsFormForSubmit = function () { var $form = $(FORM_SELECTOR); if (!$form.length || !isParsleyReady()) { return; } registerValidators(); prepareHiddenFieldsForSubmit($form); applyConstraints($form); refreshParsley($form); }; window.getLeadsFormInvalidFields = function () { return getInvalidFields($(FORM_SELECTOR)); }; })(function () { return window.jQuery; });