PageSourceSearch

https://thelaunch.nl/wp-content/plugins/cool-formkit-for-elementor…/js/atomic-form-mask-init.js?ver=1.7.10

js thelaunch.nl collected 2026-10-05 09:36:32 UTC 23,384 bytes, 695 lines download raw bytes

1/**
2 * Input masks for Elementor atomic form (e-form-input), mirroring assets/js/inputmask/new-input-mask.js.
3 */
4(function ($) {
5	'use strict';
6
7	function prepareMaskInputs($root) {
8		$root.find('input.fme-mask-input').each(function () {
9			const input = this;
10			let maskClass,
11				maskFormat,
12				maskPrefix,
13				maskDecimalPlaces,
14				maskTimeMaskFormat,
15				phoneFormat,
16				creditCardOptions,
17				maskAutoPlaceholder,
18				brazilianFormats;
19
20			input.classList.forEach(function (className) {
21				if (className.includes('mask_control_@')) {
22					maskClass = className;
23				}
24				if (className.includes('money_mask_format_@')) {
25					maskFormat = className;
26				}
27				if (className.includes('mask_prefix_@')) {
28					maskPrefix = className;
29				}
30				if (className.includes('mask_decimal_places_@')) {
31					maskDecimalPlaces = className;
32				}
33				if (className.includes('mask_time_mask_format_@')) {
34					maskTimeMaskFormat = className;
35				}
36				if (className.includes('fme_phone_format_@')) {
37					phoneFormat = className;
38				}
39				if (className.includes('credit_card_options_@')) {
40					creditCardOptions = className;
41				}
42				if (className.includes('mask_auto_placeholder_@')) {
43					maskAutoPlaceholder = className;
44				}
45				if (className.includes('fme_brazilian_formats_@')) {
46					brazilianFormats = className;
47				}
48			});
49
50			if (maskClass) {
51				maskClass = maskClass.split('@');
52			}
53			if (maskFormat) {
54				maskFormat = maskFormat.split('@');
55			}
56			if (maskPrefix) {
57				maskPrefix = maskPrefix.split('@');
58			}
59			if (maskDecimalPlaces) {
60				maskDecimalPlaces = maskDecimalPlaces.split('@');
61			}
62			if (maskTimeMaskFormat) {
63				maskTimeMaskFormat = maskTimeMaskFormat.split('@');
64			}
65			if (phoneFormat) {
66				phoneFormat = phoneFormat.split('@');
67			}
68			if (creditCardOptions) {
69				creditCardOptions = creditCardOptions.split('@');
70			}
71			if (maskAutoPlaceholder) {
72				maskAutoPlaceholder = maskAutoPlaceholder.split('@');
73			}
74			if (brazilianFormats) {
75				brazilianFormats = brazilianFormats.split('@');
76			}
77
78			if (!$(input).data('mask')) {
79				input.setAttribute('data-mask', maskClass && maskClass[1] ? maskClass[1] : '');
80			}
81
82			input.setAttribute('data-moneymask-format', maskFormat && maskFormat[1] ? maskFormat[1] : 'dot');
83			input.setAttribute('data-moneymask-prefix', maskPrefix && maskPrefix[1] ? maskPrefix[1] : '');
84			input.setAttribute('data-decimal-places', maskDecimalPlaces && maskDecimalPlaces[1] ? maskDecimalPlaces[1] : '2');
85			input.setAttribute('data-timemask-format', maskTimeMaskFormat && maskTimeMaskFormat[1] ? maskTimeMaskFormat[1] : 'one');
86			input.setAttribute('data-phone-format', phoneFormat && phoneFormat[1] ? phoneFormat[1] : 'phone_usa');
87			input.setAttribute('data-creditcard-options', creditCardOptions && creditCardOptions[1] ? creditCardOptions[1] : 'hyphen');
88			input.setAttribute('data-auto-placeholder', maskAutoPlaceholder && maskAutoPlaceholder[1] ? maskAutoPlaceholder[1] : '');
89			input.setAttribute('data-brazilian-formats', brazilianFormats && brazilianFormats[1] ? brazilianFormats[1] : '');
90		});
91	}
92
93	// -------------------------------------------------------------------------
94	// Mask validation (shared CFKEF.MaskValidators), scoped to atomic forms.
95	// -------------------------------------------------------------------------
96
97	function getAtomicMaskErrorElement($input, errorClass) {
98		if ($input.hasClass('hide-fme-mask-input')) {
99			return $();
100		}
101		var $wrap = $input.closest('.ccfef-mask-wrapper');
102		if ($wrap.length) {
103			var $err = $wrap.find('.' + errorClass);
104			if (!$err.length) {
105				$err = $input.siblings('.' + errorClass);
106			}
107			if (!$err.length) {
108				$err = $input.next('.mask-error');
109			}
110			return $err;
111		}
112		return $input.closest('.elementor-field-group').find('.' + errorClass);
113	}
114
115	function isAtomicMaskField($input) {
116		return $input.closest('[data-e-type].e-form-base').length > 0;
117	}
118
119	function getAtomicFmeErrorMessages() {
120		if (typeof window.fmeData !== 'undefined' && window.fmeData.errorMessages) {
121			return window.fmeData.errorMessages;
122		}
123		return {
124			'mask-cnpj': 'Invalid CNPJ.',
125			'mask-cpf': 'Invalid CPF.',
126			'mask-cep': 'Invalid CEP (XXXXX-XXX).',
127			'mask-phus': 'Invalid number: (123) 456-7890',
128			'mask-ph8': 'Invalid number: 1234-5678',
129			'mask-ddd8': 'Invalid number: (DDD) 1234-5678',
130			'mask-ddd9': 'Invalid number: (DDD) 91234-5678',
131			'mask-dmy': 'Invalid date: dd/mm/yyyy',
132			'mask-mdy': 'Invalid date: mm/dd/yyyy',
133			'mask-hms': 'Invalid time: hh:mm:ss',
134			'mask-hm': 'Invalid time: hh:mm',
135			'mask-dmyhm': 'Invalid date: dd/mm/yyyy hh:mm',
136			'mask-mdyhm': 'Invalid date: mm/dd/yyyy hh:mm',
137			'mask-my': 'Invalid date: mm/yyyy',
138			'mask-ccs': 'Invalid credit card number.',
139			'mask-cch': 'Invalid credit card number.',
140			'mask-ccmy': 'Invalid date.',
141			'mask-ccmyy': 'Invalid date.',
142			'mask-ipv4': 'Invalid IPv4 address.',
143		};
144	}
145
146	var mv = (window.CFKEF && CFKEF.MaskValidators) || {};
147
148	/** Shared list: blur/input binding + synchronous submit-time checks */
149	var ATOMIC_MASK_VALIDATION_DEFS = [
150		{ sel: '.mask-cnpj', errorClass: 'error-cnpj', validate: mv.isValidCNPJ, key: 'mask-cnpj' },
151		{ sel: '.mask-cpf', errorClass: 'error-cpf', validate: mv.isValidCPF, key: 'mask-cpf' },
152		{ sel: '.mask-cep', errorClass: 'error-cep', validate: mv.isValidCEP, key: 'mask-cep' },
153		{ sel: '.mask-phus', errorClass: 'error-phus', validate: mv.isValidPhoneUSA, key: 'mask-phus' },
154		{ sel: '.mask-ph8', errorClass: 'error-ph8', validate: mv.isValidPhone8, key: 'mask-ph8' },
155		{ sel: '.mask-ddd8', errorClass: 'error-ddd8', validate: mv.isValidPhoneDDD8, key: 'mask-ddd8' },
156		{ sel: '.mask-ddd9', errorClass: 'error-ddd9', validate: mv.isValidPhoneDDD9, key: 'mask-ddd9' },
157		{ sel: '.mask-dmy', errorClass: 'error-dmy', validate: mv.isValidDateDMY, key: 'mask-dmy' },
158		{ sel: '.mask-mdy', errorClass: 'error-mdy', validate: mv.isValidDateMDY, key: 'mask-mdy' },
159		{ sel: '.mask-hms', errorClass: 'error-hms', validate: mv.isValidTimeHMS, key: 'mask-hms' },
160		{ sel: '.mask-hm', errorClass: 'error-hm', validate: mv.isValidTimeHM, key: 'mask-hm' },
161		{ sel: '.mask-dmyhm', errorClass: 'error-dmyhm', validate: mv.isValidDateDMYHM, key: 'mask-dmyhm' },
162		{ sel: '.mask-mdyhm', errorClass: 'error-mdyhm', validate: mv.isValidDateMDYHM, key: 'mask-mdyhm' },
163		{ sel: '.mask-my', errorClass: 'error-my', validate: mv.isValidDateMY, key: 'mask-my' },
164		{ sel: '.mask-ccs', errorClass: 'error-ccs', validate: mv.isValidCreditCard, key: 'mask-ccs' },
165		{ sel: '.mask-cch', errorClass: 'error-cch', validate: mv.isValidCreditCard, key: 'mask-cch' },
166		{ sel: '.mask-ccmy', errorClass: 'error-ccmy', validate: mv.isValidExpiryMMYY, key: 'mask-ccmy' },
167		{ sel: '.mask-ccmyy', errorClass: 'error-ccmyy', validate: mv.isValidExpiryMMYYYY, key: 'mask-ccmyy' },
168		{ sel: '.mask-ipv4', errorClass: 'error-ipv4', validate: mv.isValidIPv4, key: 'mask-ipv4' },
169	];
170
171	function findAtomicMaskDefForInput($input) {
172		var cls = '';
173		for (var i = 0; i < ATOMIC_MASK_VALIDATION_DEFS.length; i++) {
174			cls = ATOMIC_MASK_VALIDATION_DEFS[i].sel.replace(/^\./, '');
175			if ($input.hasClass(cls)) {
176				return ATOMIC_MASK_VALIDATION_DEFS[i];
177			}
178		}
179		return null;
180	}
181
182	/**
183	 * Run the same checks as blur validation; show errors and return true if submit must be blocked.
184	 */
185	function atomicFormMaskValidationBlocksSubmit($form) {
186		var msg = getAtomicFmeErrorMessages();
187		var blocked = false;
188		var $scrollTarget = null;
189
190		$form.find('input.fme-mask-input').not('.hide-fme-mask-input').each(function () {
191			var $inp = $(this);
192
193			if($inp.closest('.cfef-atomic-field-group').hasClass('cfef-hidden')){
194				return;
195			}
196
197			var val = String($inp.val() || '').trim();
198			if (val.length === 1 && !/\d/.test(val)) {
199				$inp.val('');
200				val = '';
201			}
202
203			var def = findAtomicMaskDefForInput($inp);
204			if (!def) {
205				return;
206			}
207
208			var $err = getAtomicMaskErrorElement($inp, def.errorClass);
209			if (val !== '' && !def.validate(val)) {
210				var text = msg[def.key] || def.key;
211				$err.text(text).css('display', 'flex').show();
212				blocked = true;
213				if (!$scrollTarget || !$scrollTarget.length) {
214					$scrollTarget = $err;
215				}
216			} else {
217				$err.text('').hide().css('display', 'none');
218			}
219		});
220
221		if (blocked && $scrollTarget && $scrollTarget.length) {
222			var off = $scrollTarget.offset();
223			if (off) {
224				$('html, body').animate({ scrollTop: off.top - 200 }, 300);
225			}
226		}
227
228		return blocked;
229	}
230
231	var cflAtomicMaskAllowSubmitOnce = false;
232	var atomicMaskSubmitGuardBound = false;
233
234	function bindAtomicFormMaskSubmitGuard() {
235		if (atomicMaskSubmitGuardBound) {
236			return;
237		}
238		atomicMaskSubmitGuardBound = true;
239
240		$(document).on('submit', 'form', function (e) {
241			var formEl = this;
242			var $form = $(formEl);
243			if (!$form.closest('[data-e-type].e-form-base').length) {
244				return;
245			}
246			if (!$form.find('input.fme-mask-input').not('.hide-fme-mask-input').length) {
247				return;
248			}
249
250			if (cflAtomicMaskAllowSubmitOnce) {
251				cflAtomicMaskAllowSubmitOnce = false;
252				return;
253			}
254
255			if (atomicFormMaskValidationBlocksSubmit($form)) {
256				e.preventDefault();
257				e.stopImmediatePropagation();
258				return;
259			}
260
261			e.preventDefault();
262			e.stopImmediatePropagation();
263			if (typeof formEl.requestSubmit === 'function') {
264				cflAtomicMaskAllowSubmitOnce = true;
265				formEl.requestSubmit();
266			} else {
267				formEl.submit();
268			}
269		});
270
271		$(document).on('click', '[data-e-type].e-form-base button[type="submit"]', function (e) {
272			var $btn = $(this);
273			var $actualForm = $btn.closest('form');
274			if (!$actualForm.length) {
275				return;
276			}
277			if (!$actualForm.find('input.fme-mask-input').not('.hide-fme-mask-input').length) {
278				return;
279			}
280			if (atomicFormMaskValidationBlocksSubmit($actualForm)) {
281				e.preventDefault();
282				e.stopPropagation();
283			}
284		});
285	}
286
287	function validateAtomicMaskInput(selector, errorClass, validationFunction, errorMessage) {
288		$(document).on('blur', selector, function () {
289			var $input = $(this);
290
291			if (!isAtomicMaskField($input)) {
292				return;
293			}
294			if ($input.hasClass('hide-fme-mask-input')) {
295				return;
296			}
297			var val = $input.val();
298			var $errorEl = getAtomicMaskErrorElement($input, errorClass);
299
300			if (val.length === 1 && !/\d/.test(val)) {
301				$input.val('');
302				$errorEl.hide().text('');
303				return;
304			}
305
306			if (val !== '' && !validationFunction(val)) {
307				$errorEl.text(errorMessage).css('display', 'flex').hide().fadeIn(200);
308			} else {
309				$errorEl.fadeOut(100, function () {
310					$(this).css('display', 'none');
311				});
312			}
313		});
314
315		$(document).on('input', selector, function () {
316			var $input = $(this);
317			if (!isAtomicMaskField($input)) {
318				return;
319			}
320			var $errorEl = getAtomicMaskErrorElement($input, errorClass);
321			if ($errorEl.is(':visible')) {
322				var val = $input.val();
323				if (validationFunction(val)) {
324					$errorEl.fadeOut(100, function () {
325						$(this).css('display', 'none');
326					});
327				}
328			}
329		});
330	}
331
332	var atomicMaskValidationBound = false;
333
334	function bindAtomicMaskValidation() {
335		if (atomicMaskValidationBound) {
336			return;
337		}
338		atomicMaskValidationBound = true;
339
340		var msg = getAtomicFmeErrorMessages();
341		ATOMIC_MASK_VALIDATION_DEFS.forEach(function (v) {
342			var text = msg[v.key] || v.key;
343			validateAtomicMaskInput(v.sel, v.errorClass, v.validate, text);
344		});
345	}
346
347	function applyMasksInRoot($root) {
348		const masks = {
349			'ev-phone': 'phone',
350			'ev-tel': '####-####',
351			'ev-tel-ddd': '(##) ####-####',
352			'ev-tel-ddd9': '(##) #####-####',
353			'ev-tel-us': '(###) ###-####',
354			'ev-cpf': '###.###.###-##',
355			'ev-cnpj': '##.###.###/####-##',
356			'ev-money': '###.###.###.###.###,##',
357			'ev-ccard': '####-####-####-####',
358			'ev-ccard-valid': '##/##',
359			'ev-cep': '#####-###',
360			'ev-time': '##:##:##',
361			'ev-date': '##/##/####',
362			'ev-date_time': '##/##/#### ##:##',
363			'ev-ip-address': '###.###.###.###',
364			'ev-br_fr': 'brazilian_formats',
365		};
366
367		$root.find('input[data-mask]').each(function () {
368			const $input = $(this);
369			if ($input.data('cflAtomicMaskUi')) {
370				return;
371			}
372			const maskKey = this.dataset.mask;
373			const timemaskFormat = this.dataset.timemaskFormat;
374			const phoneFormat = this.dataset.phoneFormat;
375			const creditcardOptions = this.dataset.creditcardOptions;
376			const autoPlaceholder = this.dataset.autoPlaceholder;
377			const brazilianFormats = this.dataset.brazilianFormats;
378
379			if (!masks[maskKey]) {
380				return;
381			}
382			if (masks[maskKey] === 'phone') {
383				$input.attr('inputmode', 'tel');
384			} else {
385				$input.attr('inputmode', 'numeric');
386			}
387			if (masks[maskKey] === 'brazilian_formats') {
388				switch (brazilianFormats) {
389					case 'fme_cpf':
390						$input.addClass('mask-cpf');
391						$input.after('<div class="mask-error error-cpf"></div>');
392						if (autoPlaceholder === 'yes') {
393							$input.attr('placeholder', 'XXX.XXX.XXX-XX');
394						}
395						break;
396					case 'fme_cnpj':
397						$input.addClass('mask-cnpj');
398						$input.after('<div class="mask-error error-cnpj"></div>');
399						if (autoPlaceholder === 'yes') {
400							$input.attr('placeholder', 'XX.XXX.XXX/XXXX-XX');
401						}
402						break;
403					case 'fme_cep':
404						$input.addClass('mask-cep');
405						$input.after('<div class="mask-error error-cep"></div>');
406						if (autoPlaceholder === 'yes') {
407							$input.attr('placeholder', 'XXXXX-XXX');
408						}
409						break;
410					default:
411						$input.addClass('mask-cpf');
412						$input.after('<div class="mask-error error-cpf"></div>');
413						if (autoPlaceholder === 'yes') {
414							$input.attr('placeholder', 'XXX.XXX.XXX-XX');
415						}
416				}
417			}
418			if (masks[maskKey] === '##/##/####') {
419				$input.addClass('mask-dmy');
420				$input.after('<div class="mask-error error-dmy"></div>');
421				if (autoPlaceholder === 'yes') {
422					$input.attr('placeholder', 'XX/XX/XXXX');
423				}
424			}
425			if (masks[maskKey] === '##.###.###/####-##') {
426				$input.addClass('mask-cnpj');
427				$input.after('<div class="mask-error error-cnpj"></div>');
428				if (autoPlaceholder === 'yes') {
429					$input.attr('placeholder', 'XX.XXX.XXX/XXXX-XX');
430				}
431			}
432			if (masks[maskKey] === '###.###.###-##') {
433				$input.addClass('mask-cpf');
434				$input.after('<div class="mask-error error-cpf"></div>');
435				if (autoPlaceholder === 'yes') {
436					$input.attr('placeholder', 'XXX.XXX.XXX-XX');
437				}
438			}
439			if (masks[maskKey] === '#####-###') {
440				$input.addClass('mask-cep');
441				$input.after('<div class="mask-error error-cep"></div>');
442				if (autoPlaceholder === 'yes') {
443					$input.attr('placeholder', 'XXXXX-XXX');
444				}
445			}
446			if (masks[maskKey] === '(###) ###-####') {
447				$input.addClass('mask-phus');
448				$input.after('<div class="mask-error error-phus"></div>');
449				if (autoPlaceholder === 'yes') {
450					$input.attr('placeholder', '(XXX) XXX-XXXX');
451				}
452			}
453			if (masks[maskKey] === 'phone') {
454				switch (phoneFormat) {
455					case 'phone_usa':
456						$input.addClass('mask-phus');
457						$input.after('<div class="mask-error error-phus"></div>');
458						if (autoPlaceholder === 'yes') {
459							$input.attr('placeholder', '(XXX) XXX-XXXX');
460						}
461						break;
462					case 'phone_d8':
463						$input.addClass('mask-ph8');
464						$input.after('<div class="mask-error error-ph8"></div>');
465						if (autoPlaceholder === 'yes') {
466							$input.attr('placeholder', 'XXXX-XXXX');
467						}
468						break;
469					case 'phone_ddd8':
470						$input.addClass('mask-ddd8');
471						$input.after('<div class="mask-error error-ddd8"></div>');
472						if (autoPlaceholder === 'yes') {
473							$input.attr('placeholder', '(XX) XXXX-XXXX');
474						}
475						break;
476					case 'phone_ddd9':
477						$input.addClass('mask-ddd9');
478						$input.after('<div class="mask-error error-ddd9"></div>');
479						if (autoPlaceholder === 'yes') {
480							$input.attr('placeholder', '(XX) XXXXX-XXXX');
481						}
482						break;
483					default:
484						$input.addClass('mask-ph8');
485						$input.after('<div class="mask-error error-ph8"></div>');
486						if (autoPlaceholder === 'yes') {
487							$input.attr('placeholder', 'XXXX-XXXX');
488						}
489						break;
490				}
491			}
492			if (masks[maskKey] === '####-####') {
493				$input.addClass('mask-ph8');
494				$input.after('<div class="mask-error error-ph8"></div>');
495				if (autoPlaceholder === 'yes') {
496					$input.attr('placeholder', 'XXXX-XXXX');
497				}
498			}
499			if (masks[maskKey] === '(##) ####-####') {
500				$input.addClass('mask-ddd8');
501				$input.after('<div class="mask-error error-ddd8"></div>');
502				if (autoPlaceholder === 'yes') {
503					$input.attr('placeholder', '(XX) XXXX-XXXX');
504				}
505			}
506			if (masks[maskKey] === '(##) #####-####') {
507				$input.addClass('mask-ddd9');
508				$input.after('<div class="mask-error error-ddd9"></div>');
509				if (autoPlaceholder === 'yes') {
510					$input.attr('placeholder', '(XX) XXXXX-XXXX');
511				}
512			}
513			if (masks[maskKey] === '##:##:##') {
514				switch (timemaskFormat) {
515					case 'one':
516						$input.addClass('mask-hm');
517						$input.after('<div class="mask-error error-hm"></div>');
518						if (autoPlaceholder === 'yes') {
519							$input.attr('placeholder', 'XX:XX');
520						}
521						break;
522					case 'two':
523						$input.addClass('mask-hms');
524						$input.after('<div class="mask-error error-hms"></div>');
525						if (autoPlaceholder === 'yes') {
526							$input.attr('placeholder', 'XX:XX:XX');
527						}
528						break;
529					case 'three':
530						$input.addClass('mask-dmy');
531						$input.after('<div class="mask-error error-dmy"></div>');
532						if (autoPlaceholder === 'yes') {
533							$input.attr('placeholder', 'XX/XX/XXXX');
534						}
535						break;
536					case 'four':
537						$input.addClass('mask-mdy');
538						$input.after('<div class="mask-error error-mdy"></div>');
539						if (autoPlaceholder === 'yes') {
540							$input.attr('placeholder', 'XX/XX/XXXX');
541						}
542						break;
543					case 'five':
544						$input.addClass('mask-dmyhm');
545						$input.after('<div class="mask-error error-dmyhm"></div>');
546						if (autoPlaceholder === 'yes') {
547							$input.attr('placeholder', 'XX/XX/XXXX XX:XX');
548						}
549						break;
550					case 'six':
551						$input.addClass('mask-mdyhm');
552						$input.after('<div class="mask-error error-mdyhm"></div>');
553						if (autoPlaceholder === 'yes') {
554							$input.attr('placeholder', 'XX/XX/XXXX XX:XX');
555						}
556						break;
557					case 'seven':
558						$input.addClass('mask-my');
559						$input.after('<div class="mask-error error-my"></div>');
560						if (autoPlaceholder === 'yes') {
561							$input.attr('placeholder', 'XX/XXXX');
562						}
563						break;
564					default:
565						$input.addClass('mask-hm');
566						$input.after('<div class="mask-error error-hm"></div>');
567						if (autoPlaceholder === 'yes') {
568							$input.attr('placeholder', 'XX:XX');
569						}
570				}
571			}
572			if (masks[maskKey] === '##:##') {
573				$input.addClass('mask-hm');
574				$input.after('<div class="mask-error error-hm"></div>');
575				if (autoPlaceholder === 'yes') {
576					$input.attr('placeholder', 'XX:XX');
577				}
578			}
579			if (masks[maskKey] === '##/##/#### ##:##') {
580				$input.addClass('mask-dmyhm');
581				$input.after('<div class="mask-error error-dmyhm"></div>');
582				if (autoPlaceholder === 'yes') {
583					$input.attr('placeholder', 'XX/XX/XXXX XX:XX');
584				}
585			}
586			if (masks[maskKey] === '####-####-####-####') {
587				switch (creditcardOptions) {
588					case 'space':
589						$input.addClass('mask-ccs');
590						$input.after('<div class="mask-error error-ccs"></div>');
591						const $errorDivCCS = $input.next('.error-ccs');
592						if ($errorDivCCS.next('.card-logo').length === 0) {
593							$errorDivCCS.after('<img id="card-logo" class="card-logo" src="" alt="Card Logo">');
594						}
595						if (autoPlaceholder === 'yes') {
596							$input.attr('placeholder', 'XXXX XXXX XXXX XXXX');
597						}
598						break;
599					case 'hyphen':
600						$input.addClass('mask-cch');
601						$input.after('<div class="mask-error error-cch"></div>');
602						const $errorDiv = $input.next('.error-cch');
603						if ($errorDiv.next('#card-logo').length === 0) {
604							$errorDiv.after('<img id="card-logo" class="card-logo" src="" alt="Card Logo">');
605						}
606						if (autoPlaceholder === 'yes') {
607							$input.attr('placeholder', 'XXXX-XXXX-XXXX-XXXX');
608						}
609						break;
610					case 'credit_card_date':
611						$input.addClass('mask-ccmy');
612						$input.after('<div class="mask-error error-ccmy"></div>');
613						if (autoPlaceholder === 'yes') {
614							$input.attr('placeholder', 'XX/XX');
615						}
616						break;
617					case 'credit_card_expiry_date':
618						$input.addClass('mask-ccmyy');
619						$input.after('<div class="mask-error error-ccmyy"></div>');
620						if (autoPlaceholder === 'yes') {
621							$input.attr('placeholder', 'XX/XXXX');
622						}
623						break;
624					default:
625						$input.addClass('mask-ccs');
626						$input.after('<div class="mask-error error-ccs"></div>');
627						$('.mask-error').after('<img id="card-logo" class="card-logo" src="" alt="Card Logo">');
628						if (autoPlaceholder === 'yes') {
629							$input.attr('placeholder', 'XXXX XXXX XXXX XXXX');
630						}
631				}
632			}
633			if (masks[maskKey] === '##/##') {
634				$input.addClass('mask-ccmy');
635				$input.after('<div class="mask-error error-ccmy"></div>');
636				if (autoPlaceholder === 'yes') {
637					$input.attr('placeholder', 'XX/XX');
638				}
639			}
640			if (masks[maskKey] === '##/####') {
641				$input.addClass('mask-my');
642				$input.after('<div class="mask-error error-my"></div>');
643				if (autoPlaceholder === 'yes') {
644					$input.attr('placeholder', 'XX/XXXX');
645				}
646			}
647			if (masks[maskKey] === '###.###.###.###') {
648				$input.addClass('mask-ipv4');
649				$input.after('<div class="mask-error error-ipv4"></div>');
650				if (autoPlaceholder === 'yes') {
651					$input.attr('placeholder', 'XXX.XXX.XXX.XXX');
652				}
653			}
654			if (masks[maskKey] === '###.###.###.###.###,##') {
655				$input.addClass('mask-moneyc');
656				$input.after('<div class="mask-error error-moneyc"></div>');
657				if (autoPlaceholder === 'yes') {
658					const moneyPrefix = $input.data('moneymask-prefix') !== '' ? $input.data('moneymask-prefix') : '$';
659					const format = $input.data('moneymask-format') === 'dot' ? ',' : '.';
660					$input.attr('placeholder', moneyPrefix + '0' + format + '00');
661				}
662			}
663
664			if ($input.hasClass('mask-cnpj')) {
665				$input.attr('inputmode', 'text');
666			}
667
668			$input.data('cflAtomicMaskUi', 1);
669		});
670	}
671
672	function initAtomicMasks($scope) {
673		if (!$scope || !$scope.length) {
674			return;
675		}
676		prepareMaskInputs($scope);
677		applyMasksInRoot($scope);
678	}
679
680	bindAtomicMaskValidation();
681	bindAtomicFormMaskSubmitGuard();
682
683	CFKEF.initAtomicFormModule({
684		fallbackClosest: 'form',
685		shouldInitScope: function ($el) {
686			return (
687				$el.hasClass('e-form-input-base') ||
688				$el.hasClass('ccfef-mask-wrapper') ||
689				$el.find('.elementor-field-group.mask-enabled').length > 0
690			);
691		},
692		initScope: initAtomicMasks,
693		elementReadyHooks: ['frontend/element_ready/e-form-input.default'],
694	});
695})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.