`{}\[\]\\]/g, '')
.replace(/\s+/g, ' ')
.replace(/^\s+/, '')
.substring(0, limite);
}
function normalizarEmail(valor) {
if (!valor) return '';
return valor
.toString()
.replace(/\s/g, '')
.replace(/[<>`{}\[\]\\]/g, '')
.substring(0, limitesCampos.email);
}
function aplicarLimiteCampo(campo, limite, normalizador) {
if (!campo) return;
campo.setAttribute('maxlength', limite.toString());
if (campo.tagName === 'SELECT') return;
campo.addEventListener('input', function () {
this.value = normalizador(this.value, limite);
});
campo.addEventListener('paste', function (e) {
e.preventDefault();
const pastedData = (e.clipboardData || window.clipboardData).getData('text');
this.value = normalizador(pastedData, limite);
});
campo.addEventListener('blur', function () {
this.value = normalizador(this.value, limite).trim();
});
}
function campoExcedeLimite(campo, limite) {
return !!(campo && campo.value && campo.value.toString().length > limite);
}
function configurarAtributosCampos() {
const camposAtuais = obterCamposAtuais();
const configuracoes = [
{ campo: camposAtuais.nomeInput, limite: limitesCampos.nome },
{ campo: camposAtuais.empresaInput, limite: limitesCampos.empresa },
{ campo: camposAtuais.emailInput, limite: limitesCampos.email },
{ campo: camposAtuais.telefoneInput, limite: limitesCampos.telefone },
{ campo: camposAtuais.cargoInput, limite: limitesCampos.cargo },
{ campo: camposAtuais.setorInput, limite: limitesCampos.setor },
{ campo: camposAtuais.funcionariosInput, limite: limitesCampos.funcionarios }
];
configuracoes.forEach(function (item) {
if (!item.campo) return;
item.campo.setAttribute('maxlength', item.limite.toString());
});
if (camposAtuais.telefoneInput) {
camposAtuais.telefoneInput.removeAttribute('pattern');
camposAtuais.telefoneInput.setAttribute('inputmode', 'numeric');
camposAtuais.telefoneInput.setAttribute('title', 'Por favor, insira o número no formato (XX) XXXXX-XXXX');
}
if (camposAtuais.nomeInput) {
camposAtuais.nomeInput.setAttribute('title', 'Informe apenas o primeiro e o segundo nome.');
}
}
function textoArtificial(valor) {
if (!valor) return false;
const texto = valor
.toString()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.toLowerCase()
.trim();
const somenteLetras = texto.replace(/[^a-z]/g, '');
return (
/(.)\1{4,}/.test(somenteLetras) ||
(somenteLetras.length >= 8 && new Set(somenteLetras).size <= 2)
);
}
// Limita o campo nome a primeiro e segundo nome, evitando payloads longos.
function normalizarNome(nome) {
if (!nome) return '';
return nome
.toString()
.replace(/[^\p{L}\s'-]/gu, '')
.replace(/\s+/g, ' ')
.trim()
.split(' ')
.slice(0, 2)
.join(' ')
.substring(0, 60);
}
function limitarNomeDuranteDigitacao(nome) {
if (!nome) return '';
const nomeLimpo = nome
.toString()
.replace(/[^\p{L}\s'-]/gu, '')
.replace(/\s+/g, ' ')
.replace(/^\s+/, '');
const terminaComEspaco = /\s$/.test(nomeLimpo);
const partesNome = nomeLimpo.trim().split(' ').filter(Boolean).slice(0, 2);
const nomeLimitado = partesNome.join(' ');
if (partesNome.length < 2 && terminaComEspaco) {
return (nomeLimitado + ' ').substring(0, 60);
}
return nomeLimitado.substring(0, 60);
}
function nomeValido(nome) {
if (!nome) return false;
const nomeOriginal = nome.toString().trim();
const partesNomeOriginais = nomeOriginal.split(/\s+/).filter(Boolean);
const nomeNormalizado = normalizarNome(nomeOriginal);
const partesNomeNormalizadas = nomeNormalizado.split(' ').filter(Boolean);
return (
nomeOriginal === nomeNormalizado &&
!textoArtificial(nomeNormalizado) &&
partesNomeOriginais.length <= 2 &&
partesNomeNormalizadas.length >= 1 &&
partesNomeNormalizadas.length <= 2 &&
nomeNormalizado.replace(/[\s'-]/g, '').length >= 3
);
}
// Função para bloquear domínios de e-mail usados em testes/spam
function emailDominioBloqueado(email) {
if (!email) return false;
const emailNormalizado = email.toString().toLowerCase().trim();
const dominiosBloqueados = [
'sectest.com'
];
return dominiosBloqueados.some(function (dominio) {
return emailNormalizado.endsWith('@' + dominio) || emailNormalizado.includes(dominio);
});
}
// Máscara dinâmica no campo telefone
if (telefoneInput) {
// Remove o atributo pattern que está causando o bloqueio
telefoneInput.removeAttribute('pattern');
telefoneInput.setAttribute('maxlength', limitesCampos.telefone.toString());
telefoneInput.setAttribute('inputmode', 'numeric');
telefoneInput.setAttribute('title', 'Por favor, insira o número no formato (XX) XXXXX-XXXX');
// Aplica a máscara enquanto digita
telefoneInput.addEventListener('input', function () {
let cleanValue = this.value.replace(/\D/g, ''); // Remove caracteres não numéricos
// Limita a 11 dígitos
if (cleanValue.length > 11) {
cleanValue = cleanValue.substring(0, 11);
}
// Aplica a máscara ao campo
this.value = aplicarMascaraTelefone(cleanValue);
});
// Previne colar números além do limite
telefoneInput.addEventListener('paste', function (e) {
e.preventDefault();
let pastedData = (e.clipboardData || window.clipboardData).getData('text');
let cleanNumber = pastedData.replace(/\D/g, '').substring(0, 11);
this.value = aplicarMascaraTelefone(cleanNumber);
});
// Verifica ao sair do campo se o número está completo
telefoneInput.addEventListener('blur', function () {
let cleanNumber = this.value.replace(/\D/g, '');
if (cleanNumber.length < 10 || cleanNumber.length > 11) {
alert('Por favor, insira um número de telefone válido com DDD.');
this.focus();
}
});
}
aplicarLimiteCampo(empresaInput, limitesCampos.empresa, normalizarCampoTexto);
aplicarLimiteCampo(emailInput, limitesCampos.email, normalizarEmail);
aplicarLimiteCampo(cargoInput, limitesCampos.cargo, normalizarCampoTexto);
aplicarLimiteCampo(setorInput, limitesCampos.setor, normalizarCampoTexto);
aplicarLimiteCampo(funcionariosInput, limitesCampos.funcionarios, normalizarCampoTexto);
configurarAtributosCampos();
setTimeout(configurarAtributosCampos, 1000);
if (nomeInput) {
nomeInput.setAttribute('maxlength', limitesCampos.nome.toString());
nomeInput.setAttribute('title', 'Informe apenas o primeiro e o segundo nome.');
nomeInput.addEventListener('input', function () {
this.value = limitarNomeDuranteDigitacao(this.value);
});
nomeInput.addEventListener('paste', function (e) {
e.preventDefault();
const pastedData = (e.clipboardData || window.clipboardData).getData('text');
this.value = limitarNomeDuranteDigitacao(pastedData);
});
nomeInput.addEventListener('blur', function () {
this.value = normalizarNome(this.value);
});
}
document.addEventListener('input', function (event) {
const camposAtuais = obterCamposAtuais();
const campo = event.target;
if (campo === camposAtuais.telefoneInput) {
campo.value = aplicarMascaraTelefone(campo.value);
} else if (campo === camposAtuais.nomeInput) {
campo.value = limitarNomeDuranteDigitacao(campo.value);
} else if (campo === camposAtuais.empresaInput) {
campo.value = normalizarCampoTexto(campo.value, limitesCampos.empresa);
} else if (campo === camposAtuais.emailInput) {
campo.value = normalizarEmail(campo.value);
} else if (campo === camposAtuais.cargoInput) {
campo.value = normalizarCampoTexto(campo.value, limitesCampos.cargo);
} else if (campo === camposAtuais.setorInput) {
campo.value = normalizarCampoTexto(campo.value, limitesCampos.setor);
} else if (campo === camposAtuais.funcionariosInput) {
campo.value = normalizarCampoTexto(campo.value, limitesCampos.funcionarios);
}
}, true);
document.addEventListener('paste', function (event) {
const camposAtuais = obterCamposAtuais();
const campo = event.target;
const pastedData = (event.clipboardData || window.clipboardData).getData('text');
if (campo === camposAtuais.telefoneInput) {
event.preventDefault();
campo.value = aplicarMascaraTelefone(pastedData);
} else if (campo === camposAtuais.nomeInput) {
event.preventDefault();
campo.value = limitarNomeDuranteDigitacao(pastedData);
} else if (campo === camposAtuais.empresaInput) {
event.preventDefault();
campo.value = normalizarCampoTexto(pastedData, limitesCampos.empresa);
} else if (campo === camposAtuais.emailInput) {
event.preventDefault();
campo.value = normalizarEmail(pastedData);
} else if (campo === camposAtuais.cargoInput) {
event.preventDefault();
campo.value = normalizarCampoTexto(pastedData, limitesCampos.cargo);
} else if (campo === camposAtuais.setorInput) {
event.preventDefault();
campo.value = normalizarCampoTexto(pastedData, limitesCampos.setor);
} else if (campo === camposAtuais.funcionariosInput) {
event.preventDefault();
campo.value = normalizarCampoTexto(pastedData, limitesCampos.funcionarios);
}
}, true);
function bloquearEnvio(event) {
if (!event) return false;
event.preventDefault();
event.stopPropagation();
event.stopImmediatePropagation();
return false;
}
function validarFormularioAntesDoElementor(event, formAtual) {
const camposAtuais = obterCamposAtuais();
const nomeAtual = camposAtuais.nomeInput;
const empresaAtual = camposAtuais.empresaInput;
const emailAtual = camposAtuais.emailInput;
const telefoneAtual = camposAtuais.telefoneInput;
const cargoAtual = camposAtuais.cargoInput;
const setorAtual = camposAtuais.setorInput;
const funcionariosAtual = camposAtuais.funcionariosInput;
if (formAtual && !formAtual.matches(seletorFormulario)) return true;
const camposParaValidar = [
nomeAtual,
empresaAtual,
emailAtual,
telefoneAtual,
cargoAtual,
setorAtual,
funcionariosAtual
];
for (const campo of camposParaValidar) {
if (!campo || !campo.value) continue;
if (contemConteudoSuspeito(campo.value)) {
alert('Mensagem bloqueada por segurança.');
campo.focus();
return bloquearEnvio(event);
}
}
const camposComLimite = [
{ campo: nomeAtual, limite: limitesCampos.nome, mensagem: 'Nome muito longo.' },
{ campo: empresaAtual, limite: limitesCampos.empresa, mensagem: 'Nome da empresa muito longo.' },
{ campo: emailAtual, limite: limitesCampos.email, mensagem: 'E-mail muito longo.' },
{ campo: telefoneAtual, limite: limitesCampos.telefone, mensagem: 'Telefone muito longo.' },
{ campo: cargoAtual, limite: limitesCampos.cargo, mensagem: 'Cargo muito longo.' },
{ campo: setorAtual, limite: limitesCampos.setor, mensagem: 'Setor muito longo.' },
{ campo: funcionariosAtual, limite: limitesCampos.funcionarios, mensagem: 'Quantidade de funcionários muito longa.' }
];
for (const item of camposComLimite) {
if (campoExcedeLimite(item.campo, item.limite)) {
alert(item.mensagem);
item.campo.focus();
return bloquearEnvio(event);
}
}
if (emailAtual && emailDominioBloqueado(emailAtual.value)) {
alert('E-mail não permitido.');
emailAtual.focus();
return bloquearEnvio(event);
}
if (nomeAtual && !nomeValido(nomeAtual.value)) {
alert('Por favor, insira um nome real com no máximo primeiro e segundo nome.');
nomeAtual.focus();
return bloquearEnvio(event);
}
if (empresaAtual) {
const empresaNormalizada = normalizarCampoTexto(empresaAtual.value, limitesCampos.empresa).trim();
if (empresaNormalizada.length < 3 || textoArtificial(empresaNormalizada)) {
alert('Por favor, insira um nome de empresa válido.');
empresaAtual.focus();
return bloquearEnvio(event);
}
empresaAtual.value = empresaNormalizada;
}
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (emailAtual && !emailRegex.test(emailAtual.value)) {
alert('Por favor, insira um e-mail válido.');
emailAtual.focus();
return bloquearEnvio(event);
}
const telefoneLimpo = telefoneAtual ? telefoneAtual.value.replace(/\D/g, '') : '';
const telefoneRegex = /^\d{10,11}$/;
const telefoneRepetido = /^(\d)\1+$/.test(telefoneLimpo);
if (telefoneAtual && (!telefoneRegex.test(telefoneLimpo) || telefoneRepetido)) {
alert('Por favor, insira um número de telefone válido com DDD.');
telefoneAtual.focus();
return bloquearEnvio(event);
}
if (telefoneAtual) {
telefoneAtual.value = telefoneLimpo;
}
return true;
}
document.addEventListener('submit', function (event) {
const formAtual = event.target && event.target.matches(seletorFormulario) ? event.target : null;
if (!formAtual) return;
validarFormularioAntesDoElementor(event, formAtual);
}, true);
document.addEventListener('click', function (event) {
const botaoEnviar = event.target.closest('button[type="submit"], input[type="submit"]');
if (!botaoEnviar) return;
const formAtual = botaoEnviar.form || botaoEnviar.closest(seletorFormulario);
if (!formAtual || !formAtual.matches(seletorFormulario)) return;
validarFormularioAntesDoElementor(event, formAtual);
}, true);
// Validação e envio do formulário
if (form) {
form.addEventListener('submit', function (event) {
console.log('Validando o formulário...');
let isValid = true;
// Validação extra contra spam, SQL Injection, XSS e payloads suspeitos
const camposParaValidar = [
nomeInput,
empresaInput,
emailInput,
telefoneInput,
cargoInput,
setorInput,
funcionariosInput
];
for (const campo of camposParaValidar) {
if (!campo || !campo.value) continue;
if (contemConteudoSuspeito(campo.value)) {
alert('Mensagem bloqueada por segurança.');
campo.focus();
isValid = false;
break;
}
}
const camposComLimite = [
{ campo: nomeInput, limite: limitesCampos.nome, mensagem: 'Nome muito longo.' },
{ campo: empresaInput, limite: limitesCampos.empresa, mensagem: 'Nome da empresa muito longo.' },
{ campo: emailInput, limite: limitesCampos.email, mensagem: 'E-mail muito longo.' },
{ campo: telefoneInput, limite: limitesCampos.telefone, mensagem: 'Telefone muito longo.' },
{ campo: cargoInput, limite: limitesCampos.cargo, mensagem: 'Cargo muito longo.' },
{ campo: setorInput, limite: limitesCampos.setor, mensagem: 'Setor muito longo.' },
{ campo: funcionariosInput, limite: limitesCampos.funcionarios, mensagem: 'Quantidade de funcionários muito longa.' }
];
for (const item of camposComLimite) {
if (!isValid) break;
if (campoExcedeLimite(item.campo, item.limite)) {
alert(item.mensagem);
item.campo.focus();
isValid = false;
}
}
// Bloqueia e-mails de domínios usados em testes automatizados/spam
if (isValid && emailInput && emailDominioBloqueado(emailInput.value)) {
alert('E-mail não permitido.');
emailInput.focus();
isValid = false;
}
// Validação Nome (primeiro e segundo nome no máximo)
if (isValid && nomeInput && !nomeValido(nomeInput.value)) {
alert('Por favor, insira apenas o primeiro e o segundo nome.');
nomeInput.focus();
isValid = false;
}
// Validação Nome da Empresa (mínimo de 3 letras)
if (isValid && empresaInput && empresaInput.value.trim().length < 3) {
alert('Por favor, insira o nome da empresa com pelo menos 3 letras.');
empresaInput.focus();
isValid = false;
}
// Validação E-mail
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (isValid && emailInput && !emailRegex.test(emailInput.value)) {
alert('Por favor, insira um e-mail válido.');
emailInput.focus();
isValid = false;
}
// Validação Telefone
const telefoneLimpo = telefoneInput ? telefoneInput.value.replace(/\D/g, '') : '';
const telefoneRegex = /^\d{10,11}$/;
if (isValid && telefoneInput && !telefoneRegex.test(telefoneLimpo)) {
alert('Por favor, insira um número de telefone válido com DDD.');
telefoneInput.focus();
isValid = false;
}
// Impedir o envio se inválido
if (!isValid) {
console.log('Formulário inválido. Submissão bloqueada.');
event.preventDefault();
event.stopImmediatePropagation();
return;
}
// Remove a máscara antes de enviar
if (telefoneInput) {
telefoneInput.value = telefoneLimpo;
}
// Envia para o Google Tag Manager após validação
if (window.dataLayer) {
window.dataLayer.push({
'event': 'formSubmission',
'formData': {
'nome': nomeInput ? nomeInput.value : '',
'empresa': empresaInput ? empresaInput.value : '',
'email': emailInput ? emailInput.value : '',
'telefone': telefoneLimpo,
'cargo': cargoInput ? cargoInput.value : '',
'setor': setorInput ? setorInput.value : '',
'funcionarios': funcionariosInput ? funcionariosInput.value : ''
}
});
console.log('Dados enviados ao GTM:', {
'nome': nomeInput ? nomeInput.value : '',
'empresa': empresaInput ? empresaInput.value : '',
'email': emailInput ? emailInput.value : '',
'telefone': telefoneLimpo,
'cargo': cargoInput ? cargoInput.value : '',
'setor': setorInput ? setorInput.value : '',
'funcionarios': funcionariosInput ? funcionariosInput.value : ''
});
}
console.log('Formulário válido. Submissão permitida.');
});
} else {
console.error('Formulário não encontrado.');
}
});