(function($){
$(document).ready(function(){
let currencySymbol="$";
let decimalPlaces=2;
function formatString(digits, pattern){
let formatted="";
let index=0;
for (let char of pattern){
if(char==="#"){
if(index < digits.length){
formatted +=digits[index++];
}else{
break;
}}else{
formatted +=char;
}}
return formatted;
}
function formatMoneyInput(value, type, prefix,input){
let decimalSeparator=type==="C" ? ".":",";
let thousandSeparator=type==="C" ? ",":".";
let rawDigits=value.replace(/\D/g, "");
decimalPlaces=2;
if(input!==''){
decimalPlaces=Number(input.dataset.decimalPlaces)
}
if(rawDigits.length===0){
return `${prefix}0${decimalSeparator}${"0".repeat(decimalPlaces)}`;
}
while (rawDigits.length < decimalPlaces + 1){
rawDigits="0" + rawDigits;
}
let cents=rawDigits.slice(-decimalPlaces);
let wholeNumber=rawDigits.slice(0, -decimalPlaces).replace(/^0+/, "")||"0";
wholeNumber=wholeNumber.replace(/\B(?=(\d{3})+(?!\d))/g, thousandSeparator);
return `${prefix}${wholeNumber}${decimalSeparator}${cents}`;
}
function handleMoneyInput(event){
let input=event.target;
let oldValue=input.value;
let oldCursorPos=input.selectionStart;
let moneyPrefix=input.dataset.moneymaskPrefix
let moneymaskFormat=input.dataset.moneymaskFormat
let type=(moneymaskFormat==='dot' ? 'D':'C')
let newValue='';
if(input.value!='$0,00'){
newValue=formatMoneyInput(input.value, type, moneyPrefix, input);
}else{
newValue="";
}
if(input.value===newValue) return;
input.value=newValue;
let newCursorPos=oldCursorPos + (newValue.length - oldValue.length);
setCaretPosition(input, newCursorPos);
}
$(document).on("focus", ".mask-moneyc", function(){
let moneymaskFormat=$(this)[0].dataset.moneymaskFormat
let type=(moneymaskFormat==='dot' ? 'D':'C')
let decimalSeparator=type==="C" ? ".":",";
let baseFormat=`${currencySymbol}0${decimalSeparator}${"0".repeat(decimalPlaces)}`;
if($(this).val().trim()===""){
$(this).val(baseFormat);
}});
$(document).on("blur", ".mask-moneyc", function(){
let moneymaskFormat=$(this)[0].dataset.moneymaskFormat
let type=(moneymaskFormat==='dot' ? 'D':'C')
let decimalSeparator=type==="C" ? ".":",";
let baseFormat=`${currencySymbol}0${decimalSeparator}${"0".repeat(decimalPlaces)}`;
let val=$(this).val().trim();
let numericValue=val.replace(new RegExp(`[^0-9${decimalSeparator}]`, "g"), "").replace(decimalSeparator, ".");
if(parseFloat(numericValue)===0||val===baseFormat){
$(this).val("");
}});
function formatCreditCard(digits, formatType){
let cardType=detectCardType(digits);
if(cardType==="American Express"){
digits=digits.slice(0, 15);
return formatType==="space"
? formatString(digits, "#### ###### #####")
: formatString(digits, "####-######-#####");
}else{
digits=digits.slice(0, 16);
return formatType==="space"
? formatString(digits, "#### #### #### ####")
: formatString(digits, "####-####-####-####");
}}
const cardLogos={
"Visa":  fmeData.pluginUrl+ "assets/svg-icons/visa-logo.svg",
"MasterCard": fmeData.pluginUrl+ "assets/svg-icons/mastercard-logo.svg",
"American Express": fmeData.pluginUrl+ "assets/svg-icons/amex-logo.svg",
"Discover": fmeData.pluginUrl+ "assets/svg-icons/discover-logo.svg",
"JCB": fmeData.pluginUrl+ "assets/svg-icons/jcb-logo.svg",
"Diners Club": fmeData.pluginUrl+ "assets/svg-icons/cc-logo.svg",
"Maestro": fmeData.pluginUrl+ "assets/svg-icons/maestro-logo.svg",
"UnionPay": fmeData.pluginUrl+ "assets/svg-icons/cc-logo.svg",
"RuPay": fmeData.pluginUrl+ "assets/svg-icons/repay-logo.svg",
"Unknown": fmeData.pluginUrl+ "assets/svg-icons/cc-logo.svg"
};
function detectCardType(number){
const cleaned=number.replace(/\D/g, "");
const cardPatterns={
"Visa": /^4/,
"MasterCard": /^5[1-5]/,
"American Express": /^3[47]/,
"Discover": /^6(?:011|5)/,
"JCB": /^(?:2131|1800|35)/,
"Diners Club": /^3(?:0[0-5]|[689])/,
"UnionPay": /^(62|81)/,
"RuPay": /^(60|65|81|82|508)/,
"Maestro": /^(50|5[6-9]|6[0-9])/
};
for (let card in cardPatterns){
if(cardPatterns[card].test(cleaned)){
return card;
}}
return "Unknown";
}
function updateCardLogo(inputSelector){
let input=$(inputSelector);
let logo=input.siblings(".card-logo");
let cardNumber=input.val().replace(/\D/g, '');
if(cardNumber===""){
logo.hide();
}else{
let cardType=detectCardType(cardNumber);
if(cardType in cardLogos){
logo.attr("src", cardLogos[cardType]).show();
}else{
logo.hide();
}}
}
const formatFunctions={
".mask-cnpj": (digits)=> formatString(digits, "##.###.###/####-##"),
".mask-cpf": (digits)=> formatString(digits, "###.###.###-##"),
".mask-cep": (digits)=> formatString(digits, "#####-###"),
".mask-phus": (digits)=> formatString(digits, "(###) ###-####"),
".mask-ph8": (digits)=> formatString(digits, "####-####"),
".mask-ddd8": (digits)=> formatString(digits, "(##) ####-####"),
".mask-ddd9": (digits)=> formatString(digits, "(##) #####-####"),
".mask-dmy": (digits)=> formatString(digits, "##/##/####"),
".mask-mdy": (digits)=> formatString(digits, "##/##/####"),
".mask-hms": (digits)=> formatString(digits, "##:##:##"),
".mask-hm": (digits)=> formatString(digits, "##:##"),
".mask-dmyhm": (digits)=> formatString(digits, "##/##/#### ##:##"),
".mask-mdyhm": (digits)=> formatString(digits, "##/##/#### ##:##"),
".mask-my": (digits)=> formatString(digits, "##/####"),
".mask-ccs": (digits)=> formatCreditCard(digits, "space"),
".mask-cch": (digits)=> formatCreditCard(digits, "hyphen"),
".mask-ccmy": (digits)=> formatString(digits, "##/##"),
".mask-ccmyy": (digits)=> formatString(digits, "##/####"),
".mask-moneyc": (digits)=> formatMoneyInput(digits, "C",'$',''),
".mask-moneyd": (digits)=> formatMoneyInput(digits, "D",'$',''),
".mask-ipv4": (digits)=> formatString(digits, "###.###.###.###")
};
Object.entries(formatFunctions).forEach(([selector, formatFunction])=> {
$(document).on("input focus", selector, function (event){
var input=this;
var oldCaret=getCaretPosition(input);
if($(input).hasClass("mask-moneyc")||$(input).hasClass("mask-moneyd")){
let type=$(input).hasClass("mask-moneyc") ? "C":"D";
handleMoneyInput(event);
return;
}
var rawDigits=input.value.replace(/\D/g, "");
var digitIndex=getDigitIndexFromCaret(input.value, oldCaret);
var newVal=formatFunction(rawDigits);
var newCaret=mapDigitIndexToCaret(newVal, digitIndex);
if(newVal!='('){
input.value=newVal;
}else{
input.value="";
}
setCaretPosition(input, newCaret||0);
if($(input).hasClass("mask-ccs")||$(input).hasClass("mask-cch")){
updateCardLogo(input);
}});
});
function getCaretPosition(input){
return input.selectionStart;
}
function getDigitIndexFromCaret(formattedStr, caretPos){
var count=0;
for (var i=0; i < caretPos; i++){
if(/\d/.test(formattedStr.charAt(i))){
count++;
}}
return count;
}
function mapDigitIndexToCaret(formattedStr, digitIndex){
var count=0;
for (var i=0; i < formattedStr.length; i++){
if(/\d/.test(formattedStr.charAt(i))){
if(count===digitIndex){
return i;
}
count++;
}}
return formattedStr.length;
}
function setCaretPosition(elem, pos){
if(elem.setSelectionRange){
elem.focus();
elem.setSelectionRange(pos, pos);
}else if(elem.createTextRange){
var range=elem.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}}
$(document).on("keydown", "input", function (e){
if(e.key==="Backspace"){
var input=this;
if($(input).hasClass("mask-moneyc")||$(input).hasClass("mask-moneyd")){
let decimalSeparator=$(input).hasClass("mask-moneyc") ? ".":",";
let baseFormat=`${currencySymbol}0${decimalSeparator}${"0".repeat(decimalPlaces)}`;
if(input.value===baseFormat){
e.preventDefault();
return;
}
handleMoneyInput(e);
return;
}
if(input.selectionStart!==input.selectionEnd){
e.preventDefault();
input.value="";
setCaretPosition(input, 0);
return;
}
var caretPos=getCaretPosition(input);
var digitIndex=getDigitIndexFromCaret(input.value, caretPos);
if(digitIndex===0) return;
var rawDigits=input.value.replace(/\D/g, "");
var newDigits=rawDigits.slice(0, digitIndex - 1) + rawDigits.slice(digitIndex);
let matchedClass=Object.keys(formatFunctions).find(cls=> $(input).hasClass(cls.substring(1)));
if(matchedClass){
var formatted=formatFunctions[matchedClass](newDigits);
input.value=formatted;
var newCaretPos=mapDigitIndexToCaret(formatted, digitIndex - 1);
setCaretPosition(input, newCaretPos);
}}
});
function validateInput(selector, errorClass, validationFunction, errorMessage){
$(document).on("blur", selector, function (){
var input=$(this);
if(input.hasClass("hide-fme-mask-input")){
return;
}
var val=input.val();
var errorElement=input.closest('.elementor-field-group').find("." + errorClass);
if(val.length===1&&!/\d/.test(val)){
input.val("");
errorElement.hide().text("");
return;
}
if(val!==""&&!validationFunction(val)){
errorElement.text(errorMessage).css("display", "flex").hide().fadeIn(200);
}else{
errorElement.fadeOut(100, function (){
$(this).css("display", "none");
});
}});
$(document).on("input", selector, function (){
var input=$(this);
nextbtnVisibility(errorClass, input, validationFunction);
var errorElement=input.closest('.elementor-field-group').find("." + errorClass);
if(errorElement.is(":visible")){
var val=input.val();
if(validationFunction(val)){
errorElement.fadeOut(100, function (){
$(this).css("display", "none");
});
}}
});
}
const validations={
".mask-cnpj": { errorClass: "error-cnpj", validate: isValidCNPJ, msg: fmeData.errorMessages["mask-cnpj"] },
".mask-cpf": { errorClass: "error-cpf", validate: isValidCPF, msg: fmeData.errorMessages["mask-cpf"] },
".mask-cep": { errorClass: "error-cep", validate: isValidCEP, msg: fmeData.errorMessages["mask-cep"] },
".mask-phus": { errorClass: "error-phus", validate: isValidPhoneUSA, msg: fmeData.errorMessages["mask-phus"] },
".mask-ph8": { errorClass: "error-ph8", validate: isValidPhone8, msg: fmeData.errorMessages["mask-ph8"] },
".mask-ddd8": { errorClass: "error-ddd8", validate: isValidPhoneDDD8, msg: fmeData.errorMessages["mask-ddd8"] },
".mask-ddd9": { errorClass: "error-ddd9", validate: isValidPhoneDDD9, msg: fmeData.errorMessages["mask-ddd9"] },
".mask-dmy": { errorClass: "error-dmy", validate: isValidDateDMY, msg: fmeData.errorMessages["mask-dmy"] },
".mask-mdy": { errorClass: "error-mdy", validate: isValidDateMDY, msg: fmeData.errorMessages["mask-mdy"] },
".mask-hms": { errorClass: "error-hms", validate: isValidTimeHMS, msg: fmeData.errorMessages["mask-hms"] },
".mask-hm": { errorClass: "error-hm", validate: isValidTimeHM, msg: fmeData.errorMessages["mask-hm"] },
".mask-dmyhm": { errorClass: "error-dmyhm", validate: isValidDateDMYHM, msg: fmeData.errorMessages["mask-dmyhm"] },
".mask-mdyhm": { errorClass: "error-mdyhm", validate: isValidDateMDYHM, msg: fmeData.errorMessages["mask-mdyhm"] },
".mask-my": { errorClass: "error-my", validate: isValidDateMY, msg: fmeData.errorMessages["mask-my"] },
".mask-ccs": { errorClass: "error-ccs", validate: isValidCreditCard, msg: fmeData.errorMessages["mask-ccs"] },
".mask-cch": { errorClass: "error-cch", validate: isValidCreditCard, msg: fmeData.errorMessages["mask-cch"] },
".mask-ccmy": { errorClass: "error-ccmy", validate: isValidExpiryMMYY, msg: fmeData.errorMessages["mask-ccmy"] },
".mask-ccmyy": { errorClass: "error-ccmyy", validate: isValidExpiryMMYYYY, msg: fmeData.errorMessages["mask-ccmyy"] },
".mask-ipv4": { errorClass: "error-ipv4", validate: isValidIPv4, msg: fmeData.errorMessages["mask-ipv4"] }};
for (const [selector, { errorClass, validate, msg }] of Object.entries(validations)){
validateInput(selector, errorClass, validate, msg);
}
function isValidPhoneUSA(phoneStr){
return /^\(\d{3}\) \d{3}-\d{4}$/.test(phoneStr);
}
function isValidPhone8(phoneStr){
return /^\d{4}-\d{4}$/.test(phoneStr);
}
function isValidPhoneDDD8(phoneStr){
return /^\(\d{2}\) \d{4}-\d{4}$/.test(phoneStr);
}
function isValidPhoneDDD9(phoneStr){
return /^\(\d{2}\) 9\d{4}-\d{4}$/.test(phoneStr);
}
function isValidDateTime(value, format){
let regexPattern;
let expectedParts;
switch (format){
case "DMY":
regexPattern=/^(\d{2})\/(\d{2})\/(\d{4})$/;
expectedParts=["day", "month", "year"];
break;
case "MDY":
regexPattern=/^(\d{2})\/(\d{2})\/(\d{4})$/;
expectedParts=["month", "day", "year"];
break;
case "HMS":
regexPattern=/^(\d{2}):(\d{2}):(\d{2})$/;
expectedParts=["hour", "minute", "second"];
break;
case "HM":
regexPattern=/^(\d{2}):(\d{2})$/;
expectedParts=["hour", "minute"];
break;
case "DMY-HM":
regexPattern=/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2})$/;
expectedParts=["day", "month", "year", "hour", "minute"];
break;
case "MDY-HM":
regexPattern=/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2})$/;
expectedParts=["month", "day", "year", "hour", "minute"];
break;
case "MY":
regexPattern=/^(\d{2})\/(\d{4})$/;
expectedParts=["month", "year"];
break;
default:
return false;
}
let match=value.match(regexPattern);
if(!match) return false;
let parts={};
expectedParts.forEach((part, index)=> {
parts[part]=parseInt(match[index + 1], 10);
});
if(parts.year&&(parts.year < 1500||parts.year > 3000)) return false;
if(parts.month&&(parts.month < 1||parts.month > 12)) return false;
if(parts.day){
let daysInMonth=new Date(parts.year, parts.month, 0).getDate();
if(parts.day < 1||parts.day > daysInMonth) return false;
}
if(parts.hour&&(parts.hour < 0||parts.hour >=24)) return false;
if(parts.minute&&(parts.minute < 0||parts.minute >=60)) return false;
if(parts.second&&(parts.second < 0||parts.second >=60)) return false;
return true;
}
function isValidExpiryDate(value, format){
let regexPattern=format==="MM/YY" ? /^(\d{2})\/(\d{2})$/:/^(\d{2})\/(\d{4})$/;
let match=value.match(regexPattern);
if(!match) return false;
let month=parseInt(match[1], 10);
let year=parseInt(match[2], 10);
let currentYear=new Date().getFullYear();
let currentMonth=new Date().getMonth() + 1;
if(format==="MM/YY"){
year +=2000;
}
if(month < 1||month > 12) return false;
if(year < currentYear||(year===currentYear&&month < currentMonth)){
return false;
}
return true;
}
function isValidDateDMY(dateStr){ return isValidDateTime(dateStr, "DMY"); }
function isValidDateMDY(dateStr){ return isValidDateTime(dateStr, "MDY"); }
function isValidTimeHMS(timeStr){ return isValidDateTime(timeStr, "HMS"); }
function isValidTimeHM(timeStr){ return isValidDateTime(timeStr, "HM"); }
function isValidDateDMYHM(dateTimeStr){ return isValidDateTime(dateTimeStr, "DMY-HM"); }
function isValidDateMDYHM(dateTimeStr){ return isValidDateTime(dateTimeStr, "MDY-HM"); }
function isValidDateMY(dateStr){ return isValidDateTime(dateStr, "MY"); }
function isValidExpiryMMYY(dateStr){ return isValidExpiryDate(dateStr, "MM/YY"); }
function isValidExpiryMMYYYY(dateStr){ return isValidExpiryDate(dateStr, "MM/YYYY"); }
function isValidCreditCard(cardNumber){
const cleaned=cardNumber.replace(/\D/g, '');
if(cleaned.length < 15||cleaned.length > 16) return false;
let sum=0;
let shouldDouble=false;
for (let i=cleaned.length - 1; i >=0; i--){
let digit=parseInt(cleaned.charAt(i), 10);
if(shouldDouble){
digit *=2;
if(digit > 9) digit -=9;
}
sum +=digit;
shouldDouble = !shouldDouble;
}
return sum % 10===0;
}
function isValidCNPJ(cnpj){
cnpj=cnpj.replace(/\D/g, '');
if(cnpj.length!==14) return false;
if(/^(\d)\1+$/.test(cnpj)) return false;
let calcCheckDigit=(cnpj, length)=> {
let weights=length===12 ? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]:[6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
let sum=0;
for (let i=0; i < weights.length; i++){
sum +=parseInt(cnpj.charAt(i)) * weights[i];
}
let remainder=sum % 11;
return remainder < 2 ? 0:11 - remainder;
};
let firstCheck=calcCheckDigit(cnpj, 12);
let secondCheck=calcCheckDigit(cnpj, 13);
return firstCheck===parseInt(cnpj.charAt(12))&&secondCheck===parseInt(cnpj.charAt(13));
}
function isValidCPF(cpf){
cpf=cpf.replace(/\D/g, '');
if(cpf.length!==11) return false;
if(/^(\d)\1+$/.test(cpf)) return false;
let calculateDigit=(cpf, length)=> {
let sum=0;
for (let i=0; i < length; i++){
sum +=parseInt(cpf.charAt(i)) * (length + 1 - i);
}
let result=(sum * 10) % 11;
return result===10 ? 0:result;
};
let firstDigit=calculateDigit(cpf, 9);
let secondDigit=calculateDigit(cpf, 10);
return firstDigit===parseInt(cpf.charAt(9))&&secondDigit===parseInt(cpf.charAt(10));
}
function isValidCEP(cep){
return /^\d{5}-\d{3}$/.test(cep);
}
function isValidIPv4(ip){
const ipv4Pattern=/^(?:\d{1,3}\.){3}\d{1,3}$/;
if(!ipv4Pattern.test(ip)) return false;
const octets=ip.split(".");
return octets.every(octet=> {
let num=parseInt(octet, 10);
return num >=0&&num <=255;
});
}
let maskErrorArr={};
let nextBtnOriginalClicks={};
let clickStatus={};
let recaptchaEvent={};
let submitBtnEvent={};
const nextbtnVisibility=(errorClass, input, validationFunction)=> {
const closesWidget=input.closest(".elementor-widget-form");
const widgetId=closesWidget.data('id');
const inuptId=input.attr('id');
const fieldStep=input.closest(".elementor-field-type-step");
const form=input.closest(".elementor-form");
const currectStepFields=form.find(".elementor-form-fields-wrapper.elementor-labels-above").children("div:not(.elementor-hidden)").find('input, textarea, select');
const submtBtnTag=form.find("button[type='submit']");
if(!closesWidget.length||!fieldStep.length){
return;
}
const nextBtn=fieldStep.find(".e-form__buttons__wrapper__button[data-direction='next']");
if((nextBtn.length==0&&submtBtnTag.length > 0)&&(submtBtnTag.length==0&&nextBtn.length==0)){
return;
}
let val=input.val();
if(val.length===1&&!/\d/.test(val)){
val='';
}
if(val!==""&&!validationFunction(val)){
if(closesWidget.length > 0){
if(!maskErrorArr[widgetId]){
maskErrorArr[widgetId]=[];
}
if(!maskErrorArr[widgetId].includes(inuptId)){
maskErrorArr[widgetId].push(inuptId);
}}
if(!nextBtnOriginalClicks[widgetId]||!nextBtnOriginalClicks[widgetId].length){
if(nextBtn.length > 0){
const origninalClicks=jQuery._data(nextBtn[0], "events");
if(origninalClicks&&(!nextBtnOriginalClicks[widgetId]||!nextBtnOriginalClicks[widgetId].length===0)){
nextBtnOriginalClicks[widgetId]=origninalClicks&&origninalClicks.click ? origninalClicks.click.map(h=> h.handler):[];
}}
}}else{
if(maskErrorArr[widgetId]&&maskErrorArr[widgetId].includes(inuptId)){
maskErrorArr[widgetId]=maskErrorArr[widgetId].filter(item=> item!==inuptId);
}}
if(maskErrorArr[widgetId]&&maskErrorArr[widgetId].length > 0){
if(nextBtn.length > 0){
const origninalClicks=jQuery._data(nextBtn[0], "events");
if(origninalClicks&&(!nextBtnOriginalClicks[widgetId]||!nextBtnOriginalClicks[widgetId].length)){
nextBtnOriginalClicks[widgetId]=origninalClicks&&origninalClicks.click ? origninalClicks.click.map(h=> h.handler):[];
}
if(nextBtnOriginalClicks[widgetId]&&nextBtnOriginalClicks[widgetId].length > 0){
nextBtn.off("click");
}}
}else{
if(recaptchaEvent[widgetId]){
submtBtnTag.on("click", recaptchaEvent[widgetId]);
}
if(submitBtnEvent[widgetId]){
form.on("submit", submitBtnEvent[widgetId]);
}
if(nextBtnOriginalClicks[widgetId]&&nextBtnOriginalClicks[widgetId].length > 0){
let isfieldsValid=true
for (let i=0; i < currectStepFields.length; i++){
if(currectStepFields[i].checkValidity()==false){
isfieldsValid=false;
break;
}}
if(isfieldsValid){
if(nextBtn.length > 0){
nextBtn.off("click");
nextBtnOriginalClicks[widgetId].forEach(fn=> {
nextBtn.one("click", fn);
});
}}
}}
}
$(document).on("mousedown", ".e-form__buttons__wrapper__button[data-direction='next']", function(e){
const form=$(this).closest(".elementor-form");
const mask_error_div=form.find(".elementor-form-fields-wrapper.elementor-labels-above").children("div:not(.elementor-hidden)").find('div.mask-error');
const closesWidget=$(this).closest(".elementor-widget-form");
const widgetId=closesWidget.data('id');
let mask_error=false;
for(let i=0; i<mask_error_div.length; i++){
if(mask_error_div[i].value!=""&&mask_error_div[i].style.display=='flex'){
mask_error=true;
break;
}}
if(maskErrorArr[widgetId]&&!maskErrorArr[widgetId].length > 0&&!mask_error){
if(nextBtnOriginalClicks[widgetId]&&nextBtnOriginalClicks[widgetId].length > 0){
$(this).off("click");
nextBtnOriginalClicks[widgetId].forEach(fn=> {
$(this).one("click", fn);
});
}}
})
$(document).on("click", ".e-form__buttons__wrapper__button[data-direction='previous']", function(e){
const form=$(this).closest(".elementor-form");
const closesWidget=form.closest(".elementor-widget-form");
const widgetId=closesWidget.data('id');
maskErrorArr[widgetId]=[];
const currectStepFields=form.find(".elementor-form-fields-wrapper.elementor-labels-above").children("div:not(.elementor-hidden)")
const nextBtn=currectStepFields.find(".e-form__buttons__wrapper__button[data-direction='next']");
if(nextBtnOriginalClicks[widgetId]&&nextBtnOriginalClicks[widgetId].length > 0){
nextBtn.off("click");
nextBtnOriginalClicks[widgetId].forEach(fn=> {
nextBtn.one("click", fn);
});
}})
$(document).on("mousedown", ".elementor-field-type-submit", function (e){
var $submitBtn=$(this);
var $form=$submitBtn.closest("form");
const closesWidget=$form.closest(".elementor-widget-form");
const widgetId=closesWidget.data('id');
const currectStepFields=$form.find(".elementor-form-fields-wrapper.elementor-labels-above").children("div:not(.elementor-hidden)")
const previousBtn=currectStepFields.find(".e-form__buttons__wrapper__button[data-direction='previous']");
const inputMaskFields=currectStepFields.find("input.fme-mask-input");
if(previousBtn&&previousBtn.length&&inputMaskFields&&inputMaskFields.length&&maskErrorArr[widgetId]&&maskErrorArr[widgetId].length){
var $subBtnTag=$submitBtn.find("button");
var $form=$submitBtn.closest("form");
const origninalclick=jQuery._data($subBtnTag[0], "events");
if(origninalclick&&origninalclick.click){
origninalclick.click.forEach((ele)=> {
if(ele.handler.toString().trim().includes("onV3FormSubmit")){
if(!recaptchaEvent[widgetId]){
recaptchaEvent[widgetId]=ele.handler;
}}
})
}
const origninalSubmit=jQuery._data($form[0], "events");
if(origninalSubmit&&origninalSubmit.submit){
origninalSubmit.submit.forEach((ele)=> {
if(ele.handler.toString().trim().includes("resetForm")){
if(!submitBtnEvent[widgetId]){
submitBtnEvent[widgetId]=ele.handler;
}}
})
}
if(submitBtnEvent[widgetId]){
$form.off("submit", submitBtnEvent[widgetId]);
}
if(recaptchaEvent[widgetId]){
$subBtnTag.off("click", recaptchaEvent[widgetId]);
}}
})
$(document).on("click", ".elementor-field-type-submit", function (e){
var $submitBtn=$(this);
if($submitBtn.find('button').hasClass('cfkef-prevent-submit')||$submitBtn.find('button').hasClass('confirmation-pending')
){
return
}
var $form=$submitBtn.closest("form");
const closesWidget=$form.closest(".elementor-widget-form");
const widgetId=closesWidget.data('id');
const submtBtnTag=$form.find("button[type='submit']");
if($submitBtn.data("clicked")){
e.preventDefault();
return;
}
$submitBtn.data("clicked", true);
$form.find("input").trigger("blur");
$form[0].classList.add("elementor-form-waiting");
setTimeout(()=> {
let hasVisibleMaskError=false;
const $errors=$form.find(".mask-error").filter(function (){
return $(this).text().trim()!==""&&$(this).css("display")=="flex";
});
if($errors.length > 0){
hasVisibleMaskError=true;
const $firstError=$errors.first();
$("html, body").animate({
scrollTop: $firstError.offset().top - 200
}, 300);
}
const $emptyRequiredMasked=$form.find("input[required]").filter(function (){
if(!$(this).hasClass('hide-fme-mask-input')){
const val=$(this).val().trim();
const isVisible=$(this).css("display")=="flex";
return (val===""||/^[\s_\-\(\)\.:/]+$/.test(val));
}});
if($emptyRequiredMasked.length > 0){
hasVisibleMaskError=true;
const $firstEmpty=$emptyRequiredMasked.first();
$("html, body").animate({
scrollTop: $firstEmpty.offset().top - 200
}, 300);
$firstEmpty.focus();
}
if(hasVisibleMaskError){
$submitBtn.data("clicked", false);
e.preventDefault();
return;
}
if(hasVisibleMaskError){
$submitBtn.data("clicked", false);
e.preventDefault();
return;
}
if(!hasVisibleMaskError){
if(recaptchaEvent[widgetId]){
submtBtnTag.on("click", recaptchaEvent[widgetId]);
submtBtnTag.trigger("click");
}
if(submitBtnEvent[widgetId]){
$form.on("submit", submitBtnEvent[widgetId]);
submtBtnTag.trigger("click");
}
$form[0].classList.remove("elementor-form-waiting");
$submitBtn.data("clicked", false);
if(!recaptchaEvent[widgetId]){
let error_messages=$form.find('.elementor-form-fields-wrapper').find('.elementor-message');
if(error_messages&&error_messages.length==0){
$form[0].requestSubmit();
}}
}}, 500);
});
});
})(jQuery);
class InputHandler extends elementorModules.frontend.handlers.Base {
getDefaultSettings(){
return {
selectors: {
calInput: '.elementor-field-textual',
calDiv: '.elementor-field-type-text',
form: '.elementor-form'
},
};}
getDefaultElements(){
const selectors=this.getSettings('selectors');
return {
$calInput: this.$element.find(selectors.calInput),
$calDiv: this.$element.find(selectors.calDiv),
$form: this.$element.find(selectors.form),
};}
bindEvents(){
let elmWrapper=this.elements.$calDiv;
let eleInput=jQuery(elmWrapper).find('input');
if(eleInput.length===0) return;
eleInput.each((index, input)=> {
let maskClass, maskFormat, maskPrefix,maskDecimalPlaces,maskTimeMaskFormat,phoneFormat,creditCardOptions,maskAutoPlaceholder,brazilianFormats;
input.classList.forEach(className=> {
if(className.includes('mask_control_@')) maskClass=className;
if(className.includes('money_mask_format_@')) maskFormat=className;
if(className.includes('mask_prefix_@')) maskPrefix=className;
if(className.includes('mask_decimal_places_@')) maskDecimalPlaces=className;
if(className.includes('mask_time_mask_format_@')) maskTimeMaskFormat=className;
if(className.includes('fme_phone_format_@')) phoneFormat=className;
if(className.includes('credit_card_options_@')) creditCardOptions=className;
if(className.includes('mask_auto_placeholder_@')) maskAutoPlaceholder=className;
if(className.includes('fme_brazilian_formats_@')) brazilianFormats=className;
});
if(maskClass) maskClass=maskClass.split('@');
if(maskFormat) maskFormat=maskFormat.split('@');
if(maskPrefix) maskPrefix=maskPrefix.split('@');
if(maskDecimalPlaces) maskDecimalPlaces=maskDecimalPlaces.split('@');
if(maskTimeMaskFormat) maskTimeMaskFormat=maskTimeMaskFormat.split('@');
if(phoneFormat) phoneFormat=phoneFormat.split('@');
if(creditCardOptions) creditCardOptions=creditCardOptions.split('@');
if(maskAutoPlaceholder) maskAutoPlaceholder=maskAutoPlaceholder.split('@');
if(brazilianFormats) brazilianFormats=brazilianFormats.split('@');
if(!jQuery(input).data('mask')){
input.setAttribute('data-input_mask', maskClass?.[1]||'');
}
input.setAttribute('data-moneymask-format', maskFormat?.[1]||'dot');
input.setAttribute('data-moneymask-prefix', maskPrefix?.[1]||'');
input.setAttribute('data-decimal-places', maskDecimalPlaces?.[1]||'2');
input.setAttribute('data-timemask-format', maskTimeMaskFormat?.[1]||'one');
input.setAttribute('data-phone-format', phoneFormat?.[1]||'phone_usa');
input.setAttribute('data-creditcard-options', creditCardOptions?.[1]||'hyphen');
input.setAttribute('data-auto-placeholder', maskAutoPlaceholder?.[1]||'');
input.setAttribute('data-brazilian-formats', brazilianFormats?.[1]||'');
});
this.applyMasks();
}
applyMasks(){
const masks={
"ev-phone": "phone",
"ev-tel": "####-####",
"ev-tel-ddd": "(##) ####-####",
"ev-tel-ddd9": "(##) #####-####",
"ev-tel-us": "(###) ###-####",
"ev-cpf": "###.###.###-##",
"ev-cnpj": "##.###.###/####-##",
"ev-money": "###.###.###.###.###,##",
"ev-ccard": "####-####-####-####",
"ev-ccard-valid": "##/##",
"ev-cep": "#####-###",
"ev-time": "##:##:##",
"ev-date": "##/##/####",
"ev-date_time": "##/##/#### ##:##",
"ev-ip-address": "###.###.###.###",
"ev-br_fr": "brazilian_formats",
};
this.elements.$form.find('input[data-input_mask]').each(function (){
const $input=jQuery(this);
const maskKey=jQuery(this)[0].dataset.input_mask;
const timemaskFormat=jQuery(this)[0].dataset.timemaskFormat;
const phoneFormat=jQuery(this)[0].dataset.phoneFormat;
const creditcardOptions=jQuery(this)[0].dataset.creditcardOptions
const autoPlaceholder=jQuery(this)[0].dataset.autoPlaceholder
const brazilianFormats=jQuery(this)[0].dataset.brazilianFormats
if(masks[maskKey]){
if(masks[maskKey]==='phone'){
$input.attr('inputmode','tel')
}else{
$input.attr('inputmode','numeric')
}
if(masks[maskKey]==='brazilian_formats'){
switch(brazilianFormats){
case 'fme_cpf':
$input.addClass('mask-cpf');
$input.after('<div class="mask-error error-cpf"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XXX.XXX.XXX-XX')
}
break;
case 'fme_cnpj':
$input.addClass('mask-cnpj');
$input.after('<div class="mask-error error-cnpj"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX.XXX.XXX/XXXX-XX')
}
break;
case 'fme_cep':
$input.addClass('mask-cep');
$input.after('<div class="mask-error error-cep"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XXXXX-XXX')
}
break;
default:
$input.addClass('mask-cpf');
$input.after('<div class="mask-error error-cpf"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XXX.XXX.XXX-XX')
}}
}
if(masks[maskKey]==="##/##/####"){
$input.addClass('mask-dmy');
$input.after('<div class="mask-error error-dmy"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XX/XXXX')
}}
if(masks[maskKey]==="##.###.###/####-##"){
$input.addClass('mask-cnpj');
$input.after('<div class="mask-error error-cnpj"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX.XXX.XXX/XXXX-XX')
}}
if(masks[maskKey]==="###.###.###-##"){
$input.addClass('mask-cpf');
$input.after('<div class="mask-error error-cpf"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XXX.XXX.XXX-XX')
}}
if(masks[maskKey]==="#####-###"){
$input.addClass('mask-cep');
$input.after('<div class="mask-error error-cep"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XXXXX-XXX')
}}
if(masks[maskKey]==="(###) ###-####"){
$input.addClass('mask-phus');
$input.after('<div class="mask-error error-phus"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','(XXX) XXX-XXXX')
}}
if(masks[maskKey]==="phone"){
switch(phoneFormat){
case 'phone_usa':
$input.addClass('mask-phus');
$input.after('<div class="mask-error error-phus"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','(XXX) XXX-XXXX')
}
break;
case 'phone_d8':
$input.addClass('mask-ph8');
$input.after('<div class="mask-error error-ph8"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XXXX-XXXX')
}
break;
case 'phone_ddd8':
$input.addClass('mask-ddd8');
$input.after('<div class="mask-error error-ddd8"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','(XX) XXXX-XXXX')
}
break;
case 'phone_ddd9':
$input.addClass('mask-ddd9');
$input.after('<div class="mask-error error-ddd9"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','(XX) XXXXX-XXXX')
}
break;
default:
}}
if(masks[maskKey]==="####-####"){
$input.addClass('mask-ph8');
$input.after('<div class="mask-error error-ph8"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XXXX-XXXX')
}}
if(masks[maskKey]==="(##) ####-####"){
$input.addClass('mask-ddd8');
$input.after('<div class="mask-error error-ddd8"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','(XX) XXXX-XXXX')
}}
if(masks[maskKey]==="(##) #####-####"){
$input.addClass('mask-ddd9');
$input.after('<div class="mask-error error-ddd9"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','(XX) XXXXX-XXXX')
}}
if(masks[maskKey]==="##/##/####"){
$input.addClass('mask-dmy');
$input.after('<div class="mask-error error-dmy"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XX/XXXX')
}}
if(masks[maskKey]==="##:##:##"){
switch(timemaskFormat){
case 'one':
$input.addClass('mask-hm');
$input.after('<div class="mask-error error-hm"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX:XX')
}
break;
case 'two':
$input.addClass('mask-hms');
$input.after('<div class="mask-error error-hms"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX:XX:XX')
}
break;
case 'three':
$input.addClass('mask-dmy');
$input.after('<div class="mask-error error-dmy"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XX/XXXX')
}
break;
case 'four':
$input.addClass('mask-mdy');
$input.after('<div class="mask-error error-mdy"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XX/XXXX')
}
break;
case 'five':
$input.addClass('mask-dmyhm');
$input.after('<div class="mask-error error-dmyhm"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XX/XXXX XX:XX')
}
break;
case 'six':
$input.addClass('mask-mdyhm');
$input.after('<div class="mask-error error-mdyhm"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XX/XXXX XX:XX')
}
break;
case 'seven':
$input.addClass('mask-my');
$input.after('<div class="mask-error error-my"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XXXX')
}
break;
default:
$input.addClass('mask-hm');
$input.after('<div class="mask-error error-hm"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX:XX')
}}
}
if(masks[maskKey]==="##:##"){
$input.addClass('mask-hm');
$input.after('<div class="mask-error error-hm"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX:XX')
}}
if(masks[maskKey]==="##/##/#### ##:##"){
$input.addClass('mask-dmyhm');
$input.after('<div class="mask-error error-dmyhm"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XX/XXXX XX:XX')
}}
if(masks[maskKey]==="####-####-####-####"){
switch(creditcardOptions){
case 'space':
$input.addClass('mask-ccs');
$input.after('<div class="mask-error error-ccs"></div>');
const $errorDivCCS=$input.next('.error-ccs');
if($errorDivCCS.next('.card-logo').length===0){
$errorDivCCS.after('<img id="card-logo" class="card-logo" src="" alt="Card Logo">');
}
if(autoPlaceholder==='yes'){
$input.attr('placeholder', 'XXXX XXXX XXXX XXXX');
}
break;
case 'hyphen':
$input.addClass('mask-cch');
$input.after('<div class="mask-error error-cch"></div>');
const $errorDiv=$input.next('.error-cch');
if($errorDiv.next('#card-logo').length===0){
$errorDiv.after('<img id="card-logo" class="card-logo" src="" alt="Card Logo">');
}
if(autoPlaceholder==='yes'){
$input.attr('placeholder', 'XXXX-XXXX-XXXX-XXXX');
}
break;
case 'credit_card_date':
$input.addClass('mask-ccmy');
$input.after('<div class="mask-error error-ccmy"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XX')
}
break;
case 'credit_card_expiry_date':
$input.addClass('mask-ccmyy');
$input.after('<div class="mask-error error-ccmyy"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XXXX')
}
break;
default:
$input.addClass('mask-ccs');
$input.after('<div class="mask-error error-ccs"></div>');
jQuery('.mask-error').after('<img id="card-logo" class="card-logo" src="" alt="Card Logo">')
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XXXX XXXX XXXX XXXX')
}}
}
if(masks[maskKey]==="##/##"){
$input.addClass('mask-ccmy');
$input.after('<div class="mask-error error-ccmy"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XX')
}}
if(masks[maskKey]==="##/####"){
$input.addClass('mask-my');
$input.after('<div class="mask-error error-my"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XX/XXXX')
}}
if(masks[maskKey]==="###.###.###.###"){
$input.addClass('mask-ipv4');
$input.after('<div class="mask-error error-ipv4"></div>');
if(autoPlaceholder==='yes'){
$input.attr('placeholder','XXX.XXX.XXX.XXX')
}}
if(masks[maskKey]==="###.###.###.###.###,##"){
$input.addClass('mask-moneyc');
$input.after('<div class="mask-error error-moneyc"></div>');
if(autoPlaceholder==='yes'){
let moneyPrefix=($input.data('moneymask-prefix')!=="") ? $input.data('moneymask-prefix'): '$';
let format=($input.data('moneymask-format')==='dot' ? ',':'.')
$input.attr('placeholder',moneyPrefix+`0${format}00`)
}}
}});
}}
jQuery(window).on('elementor/frontend/init', ()=> {
const calHandler=($element)=> {
elementorFrontend.elementsHandler.addHandler(InputHandler, {
$element,
});
};
elementorFrontend.hooks.addAction('frontend/element_ready/form.default', calHandler);
});