// ========================================================= // FUNÇÕES GERAIS DE UTILIDADE // ========================================================= // Função para campos que aceitam ALFA-NUMÉRICOS (CNPJ e outros novos) function cleanValueAlphanumeric(value) { return value.replace(/[^a-zA-Z0-9]/g, '').toUpperCase(); } function cleanValue(value) { return value.replace(/\D/g, ''); // Remove tudo que não for dígito } function setFieldStatus(field, isValid, message = '') { field.style.borderColor = isValid ? 'green' : (message ? 'red' : ''); field.setCustomValidity(message); field.reportValidity(); } // ========================================================= // MÁSCARAS // ========================================================= function formatCNPJ(value) { // 1. Limpa o valor (mantém alfanumérico e força MAIÚSCULAS) value = cleanValueAlphanumeric(value); // O CNPJ bruto (base + DV) tem 14 + 2 = 16 caracteres. const MAX_LENGTH = 16; if (value.length > MAX_LENGTH) { value = value.substring(0, MAX_LENGTH); } let masked = value; // Aplica a máscara: XX.XXX.XXX/XXXX-DV // A manipulação por substring é necessária por ser alfanumérico. // Ex: AA. if (masked.length > 2) masked = masked.substring(0, 2) + '.' + masked.substring(2); // Ex: AA.AAA. if (masked.length > 6) masked = masked.substring(0, 6) + '.' + masked.substring(6); // Ex: AA.AAA.AAA/ if (masked.length > 10) masked = masked.substring(0, 10) + '/' + masked.substring(10); // Ex: AA.AAA.AAA/AAAA- if (masked.length > 15) masked = masked.substring(0, 15) + '-' + masked.substring(15); // Limita o tamanho final da máscara (2 + 1 + 3 + 1 + 3 + 1 + 4 + 1 + 2 = 18) return masked.substring(0, 18); } function formatCPF(value) { value = cleanValue(value); if (value.length > 11) value = value.substring(0, 11); value = value.replace(/(\d{3})(\d)/, "$1.$2"); value = value.replace(/(\d{3})(\d)/, "$1.$2"); value = value.replace(/(\d{3})(\d{1,2})$/, "$1-$2"); return value; } function formatTel(value) { value = cleanValue(value); if (value.length > 11) value = value.substring(0, 11); // (XX) XXXX-XXXX (8 dígitos) ou (XX) XXXXX-XXXX (9 dígitos) if (value.length <= 10) { value = value.replace(/^(\d{2})(\d)/g, '($1) $2'); value = value.replace(/(\d{4})(\d)/, '$1-$2'); } else { value = value.replace(/^(\d{2})(\d)/g, '($1) $2'); value = value.replace(/(\d{5})(\d)/, '$1-$2'); } return value; } function formatData(value) { // Remove tudo que não for dígito value = value.replace(/\D/g, ''); if (value.length > 8) value = value.substring(0, 8); // Aplica a máscara: DD/MM/AAAA value = value.replace(/^(\d{2})(\d)/, "$1/$2"); value = value.replace(/(\d{2})(\d)/, "$1/$2"); return value; } // ========================================================= // APLICAÇÃO DE EVENTOS // ========================================================= document.addEventListener('DOMContentLoaded', () => { // --- CNPJ --- const cnpjField = document.getElementById('account_cnpj'); if (cnpjField) { // Máscara no input/keyup cnpjField.addEventListener('input', (e) => { e.target.value = formatCNPJ(e.target.value); }); // Validação no blur cnpjField.addEventListener('blur', (e) => { const cnpjLimpo = cleanValueAlphanumeric(e.target.value); if (cnpjLimpo.length === 14) { setFieldStatus(e.target, true); } else if (cnpjLimpo.length > 0) { setFieldStatus(e.target, false, 'O CNPJ deve ter 14 dígitos.', 'orange'); } else { setFieldStatus(e.target, true); } }); } // --- CPF --- const cpfField = document.getElementById('account_user_cpf'); if (cpfField) { // Máscara no input/keyup cpfField.addEventListener('input', (e) => { e.target.value = formatCPF(e.target.value); }); // Validação no blur cpfField.addEventListener('blur', (e) => { const cpfLimpo = cleanValue(e.target.value); if (cpfLimpo.length === 11) { setFieldStatus(e.target, true); } else if (cpfLimpo.length > 0) { setFieldStatus(e.target, false, 'O CPF deve ter 11 dígitos.', 'orange'); } else { setFieldStatus(e.target, true); } }); } // --- TELEFONE --- const telFieldsIds = ['account_user_phone', 'account_businessPhone']; telFieldsIds.forEach(id => { const telField = document.getElementById(id); if (telField) { // Máscara no input/keyup telField.addEventListener('input', (e) => { e.target.value = formatTel(e.target.value); }); // Validação básica no blur telField.addEventListener('blur', (e) => { const telLimpo = cleanValue(e.target.value); // Verifica se está vazio ou se tem 10 (8+2) ou 11 (9+2) dígitos if (telLimpo.length > 0 && telLimpo.length < 10) { setFieldStatus(e.target, false, 'Telefone incompleto. Mínimo de 10 dígitos (DDD + 8 dígitos).'); } else { setFieldStatus(e.target, true); } }); } }); // --- EMAIL --- const emailFieldsIds = ['invitation_mail', 'email-contato']; emailFieldsIds.forEach(id => { const emailField = document.getElementById(id); if (emailField) { // Validação no blur emailField.addEventListener('blur', (e) => { const emailValor = e.target.value.trim(); if (emailValor.length > 0) { const isValid = validateEmail(emailValor); setFieldStatus(e.target, isValid, isValid ? '' : 'Formato de e-mail inválido. Ex: nome@dominio.com'); } else { setFieldStatus(e.target, true); } }); } }); // --- datas --- const dataNascimentoField = document.getElementById('account_user_birthDate'); if (dataNascimentoField) { // Máscara no input dataNascimentoField.addEventListener('input', (e) => { e.target.value = formatData(e.target.value); }); } });