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.