Nome:
Roberto Silva
E-mail:
roberto@email.com
Telefone:
(54) 99999-9999
Localização:
Caxias do Sul - RS
MODAL DE CADASTRO SIMPLES (CLIENTE COMPRADOR)
========================================================== */
const cadastroModal = document.getElementById('cadastroModal');
const triggers = document.querySelectorAll('.open-modal-trigger');
const closeBtn = document.getElementById('modalCloseBtn');
const formContainer = document.getElementById('modalFormContainer');
const successState = document.getElementById('modalSuccessState');
const registerForm = document.getElementById('simpleRegisterForm');
const welcomeUserName = document.getElementById('welcomeUserName');
const btnEstoqueConcluido = document.getElementById('btnEstoqueConcluido');
function openCadastroModal() {
cadastroModal.classList.add('show');
const savedUser = localStorage.getItem('busca_carro_user');
if (savedUser) {
try {
const data = JSON.parse(savedUser);
document.getElementById('formNome').value = data.nome || '';
document.getElementById('formTelefone').value = data.telefone || '';
document.getElementById('formEmail').value = data.email || '';
document.getElementById('formCidade').value = data.cidade || '';
if (data.estado) document.getElementById('formEstado').value = data.estado;
} catch(e){}
}
}
function closeCadastroModal() {
cadastroModal.classList.remove('show');
}
triggers.forEach(btn => btn.addEventListener('click', openCadastroModal));
closeBtn.addEventListener('click', closeCadastroModal);
cadastroModal.addEventListener('click', function(e) {
if (e.target === cadastroModal) {
closeCadastroModal();
}
});
const phoneInput = document.getElementById('formTelefone');
phoneInput.addEventListener('input', function(e) {
let v = e.target.value.replace(/\D/g, '');
if (v.length > 11) v = v.slice(0, 11);
if (v.length > 6) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2, 7)}-${v.slice(7)}`;
} else if (v.length > 2) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2)}`;
} else if (v.length > 0) {
e.target.value = `(${v}`;
}
});
registerForm.addEventListener('submit', function (e) {
e.preventDefault();
const nome = document.getElementById('formNome').value.trim();
const telefone = document.getElementById('formTelefone').value.trim();
const email = document.getElementById('formEmail').value.trim();
const estado = document.getElementById('formEstado').value;
const cidade = document.getElementById('formCidade').value.trim();
if (!nome || !telefone || !email || !cidade) {
alert('Por favor, preencha todos os campos para prosseguir.');
return;
}
const userData = { nome, telefone, email, estado, cidade, ts: Date.now() };
localStorage.setItem('busca_carro_user', JSON.stringify(userData));
welcomeUserName.textContent = nome.split(' ')[0] || nome;
formContainer.style.display = 'none';
successState.style.display = 'block';
});
btnEstoqueConcluido.addEventListener('click', function () {
closeCadastroModal();
setTimeout(() => {
formContainer.style.display = 'block';
successState.style.display = 'none';
const target = document.getElementById('estoque');
if (target) target.scrollIntoView({ behavior: 'smooth' });
}, 300);
});
=======
/* ==========================================================
BOTÕES CTA "BUSCA CARRO" E "EXPLORAR OPORTUNIDADES"
========================================================== */
const ctaTriggers = document.querySelectorAll('.open-modal-trigger');
ctaTriggers.forEach(btn => {
btn.addEventListener('click', function () {
const user = getCurrentUser();
if (user) {
// Se já está logado, leva diretamente ao estoque de veículos
const target = document.getElementById('estoque');
if (target) target.scrollIntoView({ behavior: 'smooth' });
} else {
// Se não está logado, abre a criação de conta simples
openUserAuthModal('register');
}
});
});==========================================================
MODAL DE AUTENTICAÇÃO / MINHA CONTA DO USUÁRIO COMUM
(SEPARADO DO PAINEL ADMIN)
========================================================== */
const userAuthModal = document.getElementById('userAuthModal');
const btnUserAuthTrigger = document.getElementById('btnUserAuthTrigger');
const userAuthModalCloseBtn = document.getElementById('userAuthModalCloseBtn');
const userLoginState = document.getElementById('userLoginState');
const userRegisterState = document.getElementById('userRegisterState');
const userAccountState = document.getElementById('userAccountState');
const btnGoToRegister = document.getElementById('btnGoToRegister');
const btnGoToLogin = document.getElementById('btnGoToLogin');
const userLoginForm = document.getElementById('userLoginForm');
const loginEmailInput = document.getElementById('loginEmail');
const loginSenhaInput = document.getElementById('loginSenha');
const userLoginError = document.getElementById('userLoginError');
const userLoginErrorText = document.getElementById('userLoginErrorText');
const userRegisterForm = document.getElementById('userRegisterForm');
const regNome = document.getElementById('regNome');
const regTelefone = document.getElementById('regTelefone');
const regEmail = document.getElementById('regEmail');
const regSenha = document.getElementById('regSenha');
const regEstado = document.getElementById('regEstado');
const regCidade = document.getElementById('regCidade');
const userRegisterError = document.getElementById('userRegisterError');
const userRegisterErrorText = document.getElementById('userRegisterErrorText');
const accNome = document.getElementById('accNome');
const accEmail = document.getElementById('accEmail');
const accTelefone = document.getElementById('accTelefone');
const accLocal = document.getElementById('accLocal');
const userAnunciosContainer = document.getElementById('userAnunciosContainer');
const btnAccAnunciarNovo = document.getElementById('btnAccAnunciarNovo');
const btnAccVerEstoque = document.getElementById('btnAccVerEstoque');
const btnUserLogout = document.getElementById('btnUserLogout');
function openUserAuthModal(initialView = null) {
userAuthModal.classList.add('show');
const user = getCurrentUser();
if (user) {
showUserAccountView(user);
} else if (initialView === 'register') {
showUserRegisterView();
} else {
showUserLoginView();
}
}
function closeUserAuthModal() {
userAuthModal.classList.remove('show');
}
function showUserLoginView() {
userLoginState.style.display = 'block';
userRegisterState.style.display = 'none';
userAccountState.style.display = 'none';
userLoginError.classList.remove('visible');
userLoginForm.reset();
setTimeout(() => loginEmailInput.focus(), 100);
}
function showUserRegisterView() {
userLoginState.style.display = 'none';
userRegisterState.style.display = 'block';
userAccountState.style.display = 'none';
userRegisterError.classList.remove('visible');
userRegisterForm.reset();
setTimeout(() => regNome.focus(), 100);
}
function showUserAccountView(user) {
userLoginState.style.display = 'none';
userRegisterState.style.display = 'none';
userAccountState.style.display = 'block';
accNome.textContent = user.nome || 'Anunciante';
accEmail.textContent = user.email || '-';
accTelefone.textContent = user.telefone || '-';
accLocal.textContent = `${user.cidade || 'Não informada'} - ${user.estado || 'RS'}`;
renderUserAnuncios(user);
}
function renderUserAnuncios(user) {
const veiculos = getVeiculos();
const userCleanTel = (user.telefone || '').replace(/\D/g, '');
const userNameLower = (user.nome || '').toLowerCase().trim();
// Procura anúncios deste usuário pelo anunciante ou telefone
const meusAnuncios = veiculos.filter(v => {
const vTel = (v.telefone || '').replace(/\D/g, '');
const vNome = (v.anunciante || '').toLowerCase().trim();
return (userCleanTel && vTel && vTel === userCleanTel) || (userNameLower && vNome.includes(userNameLower));
});
if (meusAnuncios.length === 0) {
userAnunciosContainer.innerHTML = `
Você ainda não tem veículos anunciados.
`;
return;
}
let html = '';
meusAnuncios.forEach(car => {
let badgeStatusClass = 'status-pendente';
let statusText = 'Pendente';
if (car.status === 'aprovado') {
badgeStatusClass = 'status-aprovado';
statusText = 'Aprovado / No estoque';
} else if (car.status === 'vendido') {
badgeStatusClass = 'status-vendido';
statusText = 'Vendido';
} else if (car.status === 'recusado') {
badgeStatusClass = 'status-recusado';
statusText = 'Recusado';
}
html += `
${escapeHTML(car.marca)} ${escapeHTML(car.modelo)}
${formatBRL(car.preco)}
${statusText}
`;
});
userAnunciosContainer.innerHTML = html;
}
// Eventos do Modal de Usuário
btnUserAuthTrigger.addEventListener('click', () => openUserAuthModal());
userAuthModalCloseBtn.addEventListener('click', closeUserAuthModal);
userAuthModal.addEventListener('click', (e) => {
if (e.target === userAuthModal) closeUserAuthModal();
});
btnGoToRegister.addEventListener('click', showUserRegisterView);
btnGoToLogin.addEventListener('click', showUserLoginView);
// Submissão do Login de Usuário Comum
userLoginForm.addEventListener('submit', function (e) {
e.preventDefault();
const email = loginEmailInput.value.trim().toLowerCase();
const senha = loginSenhaInput.value;
if (!email) {
userLoginErrorText.textContent = 'Informe o seu e-mail.';
userLoginError.classList.add('visible');
return;
}
const usuarios = getUsuarios();
const usuarioEncontrado = usuarios.find(u => (u.email || '').toLowerCase() === email);
if (!usuarioEncontrado) {
userLoginErrorText.textContent = 'Conta não encontrada com este e-mail. Crie seu cadastro abaixo.';
userLoginError.classList.add('visible');
return;
}
// Validação da senha se cadastrada, ou acesso liberado
if (usuarioEncontrado.senha && usuarioEncontrado.senha !== senha) {
userLoginErrorText.textContent = 'Senha incorreta para este usuário.';
userLoginError.classList.add('visible');
return;
}
// Sucesso no login
userLoginError.classList.remove('visible');
setCurrentUser(usuarioEncontrado);
showUserAccountView(usuarioEncontrado);
});
// Submissão do Cadastro de Usuário Comum
userRegisterForm.addEventListener('submit', function (e) {
e.preventDefault();
const nome = regNome.value.trim();
const telefone = regTelefone.value.trim();
const email = regEmail.value.trim().toLowerCase();
const senha = regSenha.value.trim();
const estado = regEstado.value;
const cidade = regCidade.value.trim();
if (!nome || !telefone || !email || !cidade) {
userRegisterErrorText.textContent = 'Por favor, preencha todos os campos obrigatórios.';
userRegisterError.classList.add('visible');
return;
}
const usuarios = getUsuarios();
const jaExiste = usuarios.some(u => (u.email || '').toLowerCase() === email);
if (jaExiste) {
userRegisterErrorText.textContent = 'Já existe um cadastro com este e-mail. Faça login.';
userRegisterError.classList.add('visible');
return;
}
const novoUsuario = {
id: 'usr-' + Date.now(),
nome,
telefone,
email,
senha: senha || '123',
estado,
cidade,
dataCriacao: new Date().toISOString()
};
usuarios.push(novoUsuario);
saveUsuarios(usuarios);
setCurrentUser(novoUsuario);
userRegisterError.classList.remove('visible');
showUserAccountView(novoUsuario);
});
// Logout do Usuário Comum
btnUserLogout.addEventListener('click', function () {
setCurrentUser(null);
showUserLoginView();
});
// Atalhos de dentro da Minha Conta
btnAccAnunciarNovo.addEventListener('click', function () {
closeUserAuthModal();
const currentUser = getCurrentUser();
if (currentUser) {
document.getElementById('carAnunciante').value = currentUser.nome || '';
document.getElementById('carTelefone').value = currentUser.telefone || '';
document.getElementById('carCidade').value = `${currentUser.cidade || ''} - ${currentUser.estado || ''}`;
}
openAnuncioModal();
});
btnAccVerEstoque.addEventListener('click', function () {
closeUserAuthModal();
const target = document.getElementById('estoque');
if (target) target.scrollIntoView({ behavior: 'smooth' });
});
// Máscara de telefone no cadastro
regTelefone.addEventListener('input', function(e) {
let v = e.target.value.replace(/\D/g, '');
if (v.length > 11) v = v.slice(0, 11);
if (v.length > 6) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2, 7)}-${v.slice(7)}`;
} else if (v.length > 2) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2)}`;
} else if (v.length > 0) {
e.target.value = `(${v}`;
}
});
/* ==========================================================
PAINEL ADMINISTRATIVO FUNCIONAL (SEPARADO NO RODAPÉ)
========================================================== */
const adminModal = document.getElementById('adminModal');
const btnFooterAdmin = document.getElementById('btnFooterAdmin');
const adminModalCloseBtn = document.getElementById('adminModalCloseBtn');
const adminLoginForm = document.getElementById('adminLoginForm');
const adminPasswordInput = document.getElementById('adminPasswordInput');
const adminErrorMsg = document.getElementById('adminErrorMsg');
const adminLoginSection = document.getElementById('adminLoginSection');
const adminPanelSection = document.getElementById('adminPanelSection');
const btnAdminLogout = document.getElementById('btnAdminLogout');
const adminTitleText = document.getElementById('adminTitleText');
const adminListingsContainer = document.getElementById('adminListingsContainer');
const adminTabButtons = document.querySelectorAll('.admin-tab-btn');
let currentAdminTab = 'pendente';
let isAdminLoggedIn = false;
function openAdminModal() {
adminModal.classList.add('show');
if (!isAdminLoggedIn) {
adminLoginSection.style.display = 'block';
adminPanelSection.style.display = 'none';
btnAdminLogout.style.display = 'none';
adminTitleText.textContent = 'Acesso Administrativo';
adminPasswordInput.value = '';
adminErrorMsg.classList.remove('visible');
setTimeout(() => adminPasswordInput.focus(), 150);
} else {
adminLoginSection.style.display = 'none';
adminPanelSection.style.display = 'block';
btnAdminLogout.style.display = 'inline-flex';
adminTitleText.textContent = 'Painel Administrativo';
renderAdminPanel();
}
}
function closeAdminModal() {
adminModal.classList.remove('show');
}
// O painel admin é aberto EXCLUSIVAMENTE pelo link discreto do rodapé
if (btnFooterAdmin) {
btnFooterAdmin.addEventListener('click', function(e) {
e.preventDefault();
openAdminModal();
});
}
adminModalCloseBtn.addEventListener('click', closeAdminModal);
adminModal.addEventListener('click', (e) => {
if (e.target === adminModal) closeAdminModal();
});
// Validação da senha "admin123"
adminLoginForm.addEventListener('submit', function (e) {
e.preventDefault();
const pwd = adminPasswordInput.value.trim();
if (pwd === 'admin123') {
isAdminLoggedIn = true;
adminErrorMsg.classList.remove('visible');
adminLoginSection.style.display = 'none';
adminPanelSection.style.display = 'block';
btnAdminLogout.style.display = 'inline-flex';
adminTitleText.textContent = 'Painel Administrativo';
renderAdminPanel();
} else {
adminErrorMsg.classList.add('visible');
adminPasswordInput.select();
}
});==========================================================
GERENCIAMENTO DE USUÁRIOS COMUNS (localStorage 'bcw_usuarios')
========================================================== */
const USERS_STORAGE_KEY = 'bcw_usuarios';
const CURRENT_USER_KEY = 'bcw_usuario_logado';
function initUsuariosStorage() {
const raw = localStorage.getItem(USERS_STORAGE_KEY);
if (!raw) {
// Usuários mock para facilitar login
const defaultUsers = [
{
id: 'usr-1',
nome: 'Carlos Eduardo Ramos',
email: 'carlos@exemplo.com',
senha: '123',
telefone: '(54) 99123-4567',
cidade: 'Caxias do Sul',
estado: 'RS',
dataCriacao: new Date().toISOString()
},
{
id: 'usr-2',
nome: 'Juliana Becker',
email: 'juliana@exemplo.com',
senha: '123',
telefone: '(54) 99876-5432',
cidade: 'Porto Alegre',
estado: 'RS',
dataCriacao: new Date().toISOString()
}
];
localStorage.setItem(USERS_STORAGE_KEY, JSON.stringify(defaultUsers));
return defaultUsers;
}
try {
return JSON.parse(raw) || [];
} catch (e) {
return [];
}
}
function getUsuarios() {
try {
return JSON.parse(localStorage.getItem(USERS_STORAGE_KEY)) || [];
} catch (e) {
return [];
}
}
function saveUsuarios(users) {
localStorage.setItem(USERS_STORAGE_KEY, JSON.stringify(users));
}
function getCurrentUser() {
try {
const raw = localStorage.getItem(CURRENT_USER_KEY);
return raw ? JSON.parse(raw) : null;
} catch (e) {
return null;
}
}
function setCurrentUser(user) {
if (!user) {
localStorage.removeItem(CURRENT_USER_KEY);
} else {
localStorage.setItem(CURRENT_USER_KEY, JSON.stringify(user));
}
updateUserNavButton();
}
function updateUserNavButton() {
const user = getCurrentUser();
const navText = document.getElementById('navUserText');
const navBtn = document.getElementById('btnUserAuthTrigger');
if (!navText || !navBtn) return;
if (user) {
const primeironome = (user.nome || '').trim().split(' ')[0] || 'Usuário';
navText.textContent = primeironome;
navBtn.setAttribute('title', `Conectado como ${user.nome} - Clique para abrir Minha Conta`);
} else {
navText.textContent = 'Entrar';
navBtn.setAttribute('title', 'Entrar ou criar conta');
}
}
initUsuariosStorage();
updateUserNavButton();
/* ==========================================================
GERENCIAMENTO DE DADOS (localStorage 'bcw_veiculos')
========================================================== */
const STORAGE_KEY = 'bcw_veiculos';==========================================================
GERENCIAMENTO DE DADOS (localStorage 'bcw_veiculos')
========================================================== */
const STORAGE_KEY = 'bcw_veiculos';
// Dados iniciais com exemplos realistas se não existir no storage
function initVeiculosStorage() {
const raw = localStorage.getItem(STORAGE_KEY);
if (!raw) {
const initialData = [
{
id: 'bcw-101',
marca: 'Toyota',
modelo: 'Corolla XEi 2.0 Flex',
ano: 2021,
km: '42.000 km',
preco: 108900,
fipe: 118500,
anunciante: 'Carlos Eduardo Ramos',
telefone: '(54) 99123-4567',
cidade: 'Caxias do Sul - RS',
status: 'pendente',
dataCriacao: new Date(Date.now() - 3600000 * 2).toISOString()
},
{
id: 'bcw-102',
marca: 'Jeep',
modelo: 'Compass Longitude 1.3 Turbo',
ano: 2022,
km: '31.500 km',
preco: 139000,
fipe: 149500,
anunciante: 'Juliana Becker',
telefone: '(54) 99876-5432',
cidade: 'Porto Alegre - RS',
status: 'pendente',
dataCriacao: new Date(Date.now() - 3600000 * 5).toISOString()
},
{
id: 'bcw-103',
marca: 'Volkswagen',
modelo: 'T-Cross Comfortline 1.0 TSI',
ano: 2022,
km: '28.000 km',
preco: 112000,
fipe: 121500,
anunciante: 'Marcelo Silveira',
telefone: '(54) 99282-0084',
cidade: 'Bento Gonçalves - RS',
status: 'aprovado',
dataCriacao: new Date(Date.now() - 3600000 * 24).toISOString()
},
{
id: 'bcw-104',
marca: 'Hyundai',
modelo: 'Creta Platinum 1.0 Turbo',
ano: 2023,
km: '19.000 km',
preco: 124900,
fipe: 134000,
anunciante: 'Fernanda Martins',
telefone: '(54) 99654-3210',
cidade: 'Flores da Cunha - RS',
status: 'aprovado',
dataCriacao: new Date(Date.now() - 3600000 * 36).toISOString()
},
{
id: 'bcw-105',
marca: 'Chevrolet',
modelo: 'Tracker Premier 1.2 Turbo',
ano: 2021,
km: '55.000 km',
preco: 99800,
fipe: 108000,
anunciante: 'Lucas Fagundes',
telefone: '(54) 99345-6789',
cidade: 'Farroupilha - RS',
status: 'vendido',
dataCriacao: new Date(Date.now() - 3600000 * 72).toISOString()
},
{
id: 'bcw-106',
marca: 'Fiat',
modelo: 'Mobi Like 1.0 Fire',
ano: 2019,
km: '85.000 km',
preco: 42000,
fipe: 46000,
anunciante: 'Anônimo sem contato',
telefone: '(54) 90000-0000',
cidade: 'Caxias do Sul - RS',
status: 'recusado',
dataCriacao: new Date(Date.now() - 3600000 * 96).toISOString()
}
];
saveVeiculos(initialData);
return initialData;
}
try {
return JSON.parse(raw) || [];
} catch (e) {
return [];
}
}
function getVeiculos() {
try {
return JSON.parse(localStorage.getItem(STORAGE_KEY)) || [];
} catch (e) {
return [];
}
}
function saveVeiculos(veiculos) {
localStorage.setItem(STORAGE_KEY, JSON.stringify(veiculos));
}
function formatBRL(valor) {
if (!valor) return 'R$ 0';
const num = typeof valor === 'number' ? valor : parseFloat(String(valor).replace(/\D/g, ''));
return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL', maximumFractionDigits: 0 }).format(num || 0);
}
/* ==========================================================
VITRINE DE ESTOQUE (Apenas status 'aprovado' ou 'vendido')
========================================================== */
function renderVitrineEstoque() {
const grid = document.getElementById('estoqueGrid');
if (!grid) return;
const todos = getVeiculos();
// Apenas 'aprovado' e 'vendido' aparecem no catálogo
const vitrine = todos.filter(v => v.status === 'aprovado' || v.status === 'vendido');
if (vitrine.length === 0) {
grid.innerHTML = `
Nenhum veículo encontrado
No momento não há veículos disponíveis no estoque. Novos modelos verificados serão adicionados em breve.
`;
return;
}
let html = '
';
vitrine.forEach(car => {
const isVendido = car.status === 'vendido';
const badgeClass = isVendido ? 'status-badge status-vendido' : 'status-badge status-aprovado';
const badgeText = isVendido ? 'VENDIDO' : 'ABAIXO DA FIPE';
const telDigitos = (car.telefone || '54992820084').replace(/\D/g, '');
const waLink = `https://wa.me/55${telDigitos}?text=${encodeURIComponent(`Olá! Tenho interesse no ${car.marca} ${car.modelo} anunciado no Busca Carro Web.`)}`;
html += `
${formatBRL(car.preco)}
${car.fipe ? `Ref. FIPE: ${formatBRL(car.fipe)} ` : ''}
Vendedor: ${escapeHTML(car.anunciante || 'Particular')}
${escapeHTML(car.cidade || 'RS')}
${isVendido ? `
Veículo Vendido
` : `
Tenho Interesse
`}
`;
});
html += '
';
grid.innerHTML = html;
}
function escapeHTML(str) {
if (!str) return '';
return String(str)
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
/* ==========================================================
PAINEL ADMINISTRATIVO FUNCIONAL
========================================================== */
const adminModal = document.getElementById('adminModal');
const btnAdminTrigger = document.getElementById('btnAdminTrigger');
const adminModalCloseBtn = document.getElementById('adminModalCloseBtn');
const adminLoginForm = document.getElementById('adminLoginForm');
const adminPasswordInput = document.getElementById('adminPasswordInput');
const adminErrorMsg = document.getElementById('adminErrorMsg');
const adminLoginSection = document.getElementById('adminLoginSection');
const adminPanelSection = document.getElementById('adminPanelSection');
const btnAdminLogout = document.getElementById('btnAdminLogout');
const adminTitleText = document.getElementById('adminTitleText');
const adminListingsContainer = document.getElementById('adminListingsContainer');
const adminTabButtons = document.querySelectorAll('.admin-tab-btn');
let currentAdminTab = 'pendente';
let isAdminLoggedIn = false;
function openAdminModal() {
adminModal.classList.add('show');
if (!isAdminLoggedIn) {
adminLoginSection.style.display = 'block';
adminPanelSection.style.display = 'none';
btnAdminLogout.style.display = 'none';
adminTitleText.textContent = 'Acesso Administrativo';
adminPasswordInput.value = '';
adminErrorMsg.classList.remove('visible');
setTimeout(() => adminPasswordInput.focus(), 150);
} else {
adminLoginSection.style.display = 'none';
adminPanelSection.style.display = 'block';
btnAdminLogout.style.display = 'inline-flex';
adminTitleText.textContent = 'Painel Administrativo';
renderAdminPanel();
}
}
function closeAdminModal() {
adminModal.classList.remove('show');
}
btnAdminTrigger.addEventListener('click', openAdminModal);
adminModalCloseBtn.addEventListener('click', closeAdminModal);
adminModal.addEventListener('click', (e) => {
if (e.target === adminModal) closeAdminModal();
});
// 1. LOGIN ADMIN: Validação da senha "admin123"
adminLoginForm.addEventListener('submit', function (e) {
e.preventDefault();
const pwd = adminPasswordInput.value.trim();
if (pwd === 'admin123') {
isAdminLoggedIn = true;
adminErrorMsg.classList.remove('visible');
adminLoginSection.style.display = 'none';
adminPanelSection.style.display = 'block';
btnAdminLogout.style.display = 'inline-flex';
adminTitleText.textContent = 'Painel Administrativo';
renderAdminPanel();
} else {
adminErrorMsg.classList.add('visible');
adminPasswordInput.select();
}
});
// 6. Botão "Sair do painel" para voltar à tela de login
btnAdminLogout.addEventListener('click', function () {
isAdminLoggedIn = false;
adminPasswordInput.value = '';
adminErrorMsg.classList.remove('visible');
adminPanelSection.style.display = 'none';
adminLoginSection.style.display = 'block';
btnAdminLogout.style.display = 'none';
adminTitleText.textContent = 'Acesso Administrativo';
setTimeout(() => adminPasswordInput.focus(), 150);
});
// 2. PAINEL ADMIN: Abas (Pendentes, Aprovados, Recusados, Vendidos)
adminTabButtons.forEach(btn => {
btn.addEventListener('click', function () {
adminTabButtons.forEach(b => b.classList.remove('active'));
this.classList.add('active');
currentAdminTab = this.getAttribute('data-tab');
renderAdminListings();
});
});
function updateAdminTabCounts(veiculos) {
const counts = {
pendente: 0,
aprovado: 0,
recusado: 0,
vendido: 0
};
veiculos.forEach(v => {
if (counts[v.status] !== undefined) {
counts[v.status]++;
}
});
document.getElementById('countPendente').textContent = counts.pendente;
document.getElementById('countAprovado').textContent = counts.aprovado;
document.getElementById('countRecusado').textContent = counts.recusado;
document.getElementById('countVendido').textContent = counts.vendido;
}
function renderAdminPanel() {
const veiculos = getVeiculos();
updateAdminTabCounts(veiculos);
renderAdminListings();
}
// 3, 4, 5. Renderização das listagens e ações por status
function renderAdminListings() {
const todos = getVeiculos();
updateAdminTabCounts(todos);
const filtrados = todos.filter(v => v.status === currentAdminTab);
if (filtrados.length === 0) {
adminListingsContainer.innerHTML = `
Nenhum anúncio nesta categoria.
`;
return;
}
let html = '';
filtrados.forEach(item => {
let badgeStatusHtml = '';
let actionsHtml = '';
if (item.status === 'pendente') {
badgeStatusHtml = `
PENDENTE `;
actionsHtml = `
Aprovar
Recusar
`;
} else if (item.status === 'aprovado') {
badgeStatusHtml = `
APROVADO `;
actionsHtml = `
Marcar vendido
`;
} else if (item.status === 'vendido') {
badgeStatusHtml = `
VENDIDO `;
actionsHtml = `
Reativar anúncio
`;
} else if (item.status === 'recusado') {
badgeStatusHtml = `
RECUSADO `;
actionsHtml = `
Reativar anúncio
`;
}
html += `
${escapeHTML(item.marca)} ${escapeHTML(item.modelo)} ${item.ano ? `(${escapeHTML(String(item.ano))})` : ''}
Anunciante: ${escapeHTML(item.anunciante || 'Não informado')}
Cidade: ${escapeHTML(item.cidade || 'RS')}
${item.telefone ? `Tel: ${escapeHTML(item.telefone)} ` : ''}
${formatBRL(item.preco)}
${badgeStatusHtml}
${actionsHtml}
`;
});
adminListingsContainer.innerHTML = html;
// Anexar listeners de clique nas ações
adminListingsContainer.querySelectorAll('button[data-action]').forEach(btn => {
btn.addEventListener('click', function () {
const action = this.getAttribute('data-action');
const id = this.getAttribute('data-id');
handleAdminAction(id, action);
});
});
}
function handleAdminAction(id, action) {
const veiculos = getVeiculos();
const index = veiculos.findIndex(v => v.id === id);
if (index === -1) return;
if (action === 'aprovar') {
veiculos[index].status = 'aprovado';
} else if (action === 'recusar') {
veiculos[index].status = 'recusado';
} else if (action === 'marcar-vendido') {
veiculos[index].status = 'vendido';
} else if (action === 'reativar-vendido') {
// Reativa anúncio vendido voltando para aprovado
veiculos[index].status = 'aprovado';
} else if (action === 'reativar-recusado') {
// Reativa anúncio recusado voltando para pendente conforme regra
veiculos[index].status = 'pendente';
}
saveVeiculos(veiculos);
renderAdminListings();
renderVitrineEstoque();
}
/* ==========================================================
FORMULÁRIO DE ANÚNCIO DE VEÍCULO DO USUÁRIO
========================================================== */
const anuncioModal = document.getElementById('anuncioModal');
const btnQueroAnunciarDirect = document.getElementById('btnQueroAnunciarDirect');
const anuncioModalCloseBtn = document.getElementById('anuncioModalCloseBtn');
const publicarVeiculoForm = document.getElementById('publicarVeiculoForm');
const anuncioFormContainer = document.getElementById('anuncioFormContainer');
const anuncioSuccessState = document.getElementById('anuncioSuccessState');
const btnAnuncioConcluido = document.getElementById('btnAnuncioConcluido');
function openAnuncioModal() {
anuncioModal.classList.add('show');
anuncioFormContainer.style.display = 'block';
anuncioSuccessState.style.display = 'none';
}
function closeAnuncioModal() {
anuncioModal.classList.remove('show');
}
if (btnQueroAnunciarDirect) {
btnQueroAnunciarDirect.addEventListener('click', openAnuncioModal);
}
anuncioModalCloseBtn.addEventListener('click', closeAnuncioModal);
btnAnuncioConcluido.addEventListener('click', closeAnuncioModal);
anuncioModal.addEventListener('click', (e) => {
if (e.target === anuncioModal) closeAnuncioModal();
});
// Máscara de telefone no anúncio
const carTelInput = document.getElementById('carTelefone');
carTelInput.addEventListener('input', function(e) {
let v = e.target.value.replace(/\D/g, '');
if (v.length > 11) v = v.slice(0, 11);
if (v.length > 6) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2, 7)}-${v.slice(7)}`;
} else if (v.length > 2) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2)}`;
} else if (v.length > 0) {
e.target.value = `(${v}`;
}
});
publicarVeiculoForm.addEventListener('submit', function (e) {
e.preventDefault();
const marca = document.getElementById('carMarca').value.trim();
const modelo = document.getElementById('carModelo').value.trim();
const ano = parseInt(document.getElementById('carAno').value.trim(), 10) || new Date().getFullYear();
const km = document.getElementById('carKm').value.trim() || 'Não informada';
const precoRaw = document.getElementById('carPreco').value.replace(/\D/g, '');
const fipeRaw = document.getElementById('carFipe').value.replace(/\D/g, '');
const anunciante = document.getElementById('carAnunciante').value.trim();
const telefone = document.getElementById('carTelefone').value.trim();
const cidade = document.getElementById('carCidade').value.trim();
if (!marca || !modelo || !precoRaw || !anunciante || !telefone || !cidade) {
alert('Por favor, preencha todos os campos obrigatórios do veículo.');
return;
}
const novoVeiculo = {
id: 'bcw-' + Date.now(),
marca,
modelo,
ano,
km,
preco: parseInt(precoRaw, 10),
fipe: fipeRaw ? parseInt(fipeRaw, 10) : null,
anunciante,
telefone,
cidade,
status: 'pendente', // Anúncios do usuário entram como pendentes
dataCriacao: new Date().toISOString()
};
const veiculos = getVeiculos();
veiculos.unshift(novoVeiculo);
saveVeiculos(veiculos);
// Atualizar painel admin se aberto
if (isAdminLoggedIn) {
renderAdminPanel();
}
anuncioFormContainer.style.display = 'none';
anuncioSuccessState.style.display = 'block';
publicarVeiculoForm.reset();
});
/* ==========================================================
MODAL DE CADASTRO SIMPLES (CLIENTE COMPRADOR)
========================================================== */
const cadastroModal = document.getElementById('cadastroModal');
const triggers = document.querySelectorAll('.open-modal-trigger');
const closeBtn = document.getElementById('modalCloseBtn');
const formContainer = document.getElementById('modalFormContainer');
const successState = document.getElementById('modalSuccessState');
const registerForm = document.getElementById('simpleRegisterForm');
const welcomeUserName = document.getElementById('welcomeUserName');
const btnEstoqueConcluido = document.getElementById('btnEstoqueConcluido');
function openCadastroModal() {
cadastroModal.classList.add('show');
const savedUser = localStorage.getItem('busca_carro_user');
if (savedUser) {
try {
const data = JSON.parse(savedUser);
document.getElementById('formNome').value = data.nome || '';
document.getElementById('formTelefone').value = data.telefone || '';
document.getElementById('formEmail').value = data.email || '';
document.getElementById('formCidade').value = data.cidade || '';
if (data.estado) document.getElementById('formEstado').value = data.estado;
} catch(e){}
}
}
function closeCadastroModal() {
cadastroModal.classList.remove('show');
}
triggers.forEach(btn => btn.addEventListener('click', openCadastroModal));
closeBtn.addEventListener('click', closeCadastroModal);
cadastroModal.addEventListener('click', function(e) {
if (e.target === cadastroModal) {
closeCadastroModal();
}
});
const phoneInput = document.getElementById('formTelefone');
phoneInput.addEventListener('input', function(e) {
let v = e.target.value.replace(/\D/g, '');
if (v.length > 11) v = v.slice(0, 11);
if (v.length > 6) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2, 7)}-${v.slice(7)}`;
} else if (v.length > 2) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2)}`;
} else if (v.length > 0) {
e.target.value = `(${v}`;
}
});
registerForm.addEventListener('submit', function (e) {
e.preventDefault();
const nome = document.getElementById('formNome').value.trim();
const telefone = document.getElementById('formTelefone').value.trim();
const email = document.getElementById('formEmail').value.trim();
const estado = document.getElementById('formEstado').value;
const cidade = document.getElementById('formCidade').value.trim();
if (!nome || !telefone || !email || !cidade) {
alert('Por favor, preencha todos os campos para prosseguir.');
return;
}
const userData = { nome, telefone, email, estado, cidade, ts: Date.now() };
localStorage.setItem('busca_carro_user', JSON.stringify(userData));
welcomeUserName.textContent = nome.split(' ')[0] || nome;
formContainer.style.display = 'none';
successState.style.display = 'block';
});
btnEstoqueConcluido.addEventListener('click', function () {
closeCadastroModal();
setTimeout(() => {
formContainer.style.display = 'block';
successState.style.display = 'none';
const target = document.getElementById('estoque');
if (target) target.scrollIntoView({ behavior: 'smooth' });
}, 300);
});
// 2. Buttons "QUERO COMPRAR" and "QUERO VENDER" smooth scroll and card highlight
const btnComprar = document.getElementById('btnQueroComprar');
const btnVender = document.getElementById('btnQueroVender');
const cardComprar = document.getElementById('cardComprar');
const cardVender = document.getElementById('cardVender');
if (btnComprar) {
btnComprar.addEventListener('click', function (e) {
e.preventDefault();
cardComprar.scrollIntoView({ behavior: 'smooth', block: 'center' });
highlightCard(cardComprar);
});
}
if (btnVender) {
btnVender.addEventListener('click', function (e) {
e.preventDefault();
cardVender.scrollIntoView({ behavior: 'smooth', block: 'center' });
highlightCard(cardVender);
});
}
function highlightCard(element) {
element.style.transition = 'all 0.3s ease';
element.style.borderColor = '#f97316';
element.style.boxShadow = '0 0 25px rgba(249, 115, 22, 0.45)';
setTimeout(() => {
element.style.borderColor = '';
element.style.boxShadow = '';
}, 1800);
}
// Inicialização dos veículos e vitrine
initVeiculosStorage();
renderVitrineEstoque();
// 3. Mobile menu toggle
const mobileBtn = document.getElementById('mobileMenuBtn');
const navMenu = document.getElementById('navMenu');
if (mobileBtn && navMenu) {
mobileBtn.addEventListener('click', function () {
navMenu.classList.toggle('active');
});
navMenu.querySelectorAll('a').forEach(link => {
link.addEventListener('click', () => navMenu.classList.remove('active'));
});
}
// 4. Accordion FAQ logic
const faqItems = document.querySelectorAll('.faq-item');
faqItems.forEach(item => {
const btn = item.querySelector('.faq-question');
btn.addEventListener('click', () => {
const isOpen = item.classList.contains('active');
faqItems.forEach(i => {
i.classList.remove('active');
i.querySelector('.faq-question').setAttribute('aria-expanded', 'false');
});
if (!isOpen) {
item.classList.add('active');
btn.setAttribute('aria-expanded', 'true');
}
});
});
});
=======
=======
MODAL DE CADASTRO SIMPLES (CLIENTE COMPRADOR)
========================================================== */
const cadastroModal = document.getElementById('cadastroModal');
const triggers = document.querySelectorAll('.open-modal-trigger');
const closeBtn = document.getElementById('modalCloseBtn');
const formContainer = document.getElementById('modalFormContainer');
const successState = document.getElementById('modalSuccessState');
const registerForm = document.getElementById('simpleRegisterForm');
const welcomeUserName = document.getElementById('welcomeUserName');
const btnEstoqueConcluido = document.getElementById('btnEstoqueConcluido');
function openCadastroModal() {
cadastroModal.classList.add('show');
const savedUser = localStorage.getItem('busca_carro_user');
if (savedUser) {
try {
const data = JSON.parse(savedUser);
document.getElementById('formNome').value = data.nome || '';
document.getElementById('formTelefone').value = data.telefone || '';
document.getElementById('formEmail').value = data.email || '';
document.getElementById('formCidade').value = data.cidade || '';
if (data.estado) document.getElementById('formEstado').value = data.estado;
} catch(e){}
}
}
function closeCadastroModal() {
cadastroModal.classList.remove('show');
}
triggers.forEach(btn => btn.addEventListener('click', openCadastroModal));
closeBtn.addEventListener('click', closeCadastroModal);
cadastroModal.addEventListener('click', function(e) {
if (e.target === cadastroModal) {
closeCadastroModal();
}
});
const phoneInput = document.getElementById('formTelefone');
phoneInput.addEventListener('input', function(e) {
let v = e.target.value.replace(/\D/g, '');
if (v.length > 11) v = v.slice(0, 11);
if (v.length > 6) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2, 7)}-${v.slice(7)}`;
} else if (v.length > 2) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2)}`;
} else if (v.length > 0) {
e.target.value = `(${v}`;
}
});
registerForm.addEventListener('submit', function (e) {
e.preventDefault();
const nome = document.getElementById('formNome').value.trim();
const telefone = document.getElementById('formTelefone').value.trim();
const email = document.getElementById('formEmail').value.trim();
const estado = document.getElementById('formEstado').value;
const cidade = document.getElementById('formCidade').value.trim();
if (!nome || !telefone || !email || !cidade) {
alert('Por favor, preencha todos os campos para prosseguir.');
return;
}
const userData = { nome, telefone, email, estado, cidade, ts: Date.now() };
localStorage.setItem('busca_carro_user', JSON.stringify(userData));
welcomeUserName.textContent = nome.split(' ')[0] || nome;
formContainer.style.display = 'none';
successState.style.display = 'block';
});
btnEstoqueConcluido.addEventListener('click', function () {
closeCadastroModal();
setTimeout(() => {
formContainer.style.display = 'block';
successState.style.display = 'none';
const target = document.getElementById('estoque');
if (target) target.scrollIntoView({ behavior: 'smooth' });
}, 300);
});
=======
/* ==========================================================
BOTÕES CTA "BUSCA CARRO" E "EXPLORAR OPORTUNIDADES"
========================================================== */
const ctaTriggers = document.querySelectorAll('.open-modal-trigger');
ctaTriggers.forEach(btn => {
btn.addEventListener('click', function () {
const user = getCurrentUser();
if (user) {
// Se já está logado, leva diretamente ao estoque de veículos
const target = document.getElementById('estoque');
if (target) target.scrollIntoView({ behavior: 'smooth' });
} else {
// Se não está logado, abre a criação de conta simples
openUserAuthModal('register');
}
});
});==========================================================
MODAL DE AUTENTICAÇÃO / MINHA CONTA DO USUÁRIO COMUM
(SEPARADO DO PAINEL ADMIN)
========================================================== */
const userAuthModal = document.getElementById('userAuthModal');
const btnUserAuthTrigger = document.getElementById('btnUserAuthTrigger');
const userAuthModalCloseBtn = document.getElementById('userAuthModalCloseBtn');
const userLoginState = document.getElementById('userLoginState');
const userRegisterState = document.getElementById('userRegisterState');
const userAccountState = document.getElementById('userAccountState');
const btnGoToRegister = document.getElementById('btnGoToRegister');
const btnGoToLogin = document.getElementById('btnGoToLogin');
const userLoginForm = document.getElementById('userLoginForm');
const loginEmailInput = document.getElementById('loginEmail');
const loginSenhaInput = document.getElementById('loginSenha');
const userLoginError = document.getElementById('userLoginError');
const userLoginErrorText = document.getElementById('userLoginErrorText');
const userRegisterForm = document.getElementById('userRegisterForm');
const regNome = document.getElementById('regNome');
const regTelefone = document.getElementById('regTelefone');
const regEmail = document.getElementById('regEmail');
const regSenha = document.getElementById('regSenha');
const regEstado = document.getElementById('regEstado');
const regCidade = document.getElementById('regCidade');
const userRegisterError = document.getElementById('userRegisterError');
const userRegisterErrorText = document.getElementById('userRegisterErrorText');
const accNome = document.getElementById('accNome');
const accEmail = document.getElementById('accEmail');
const accTelefone = document.getElementById('accTelefone');
const accLocal = document.getElementById('accLocal');
const userAnunciosContainer = document.getElementById('userAnunciosContainer');
const btnAccAnunciarNovo = document.getElementById('btnAccAnunciarNovo');
const btnAccVerEstoque = document.getElementById('btnAccVerEstoque');
const btnUserLogout = document.getElementById('btnUserLogout');
function openUserAuthModal(initialView = null) {
userAuthModal.classList.add('show');
const user = getCurrentUser();
if (user) {
showUserAccountView(user);
} else if (initialView === 'register') {
showUserRegisterView();
} else {
showUserLoginView();
}
}
function closeUserAuthModal() {
userAuthModal.classList.remove('show');
}
function showUserLoginView() {
userLoginState.style.display = 'block';
userRegisterState.style.display = 'none';
userAccountState.style.display = 'none';
userLoginError.classList.remove('visible');
userLoginForm.reset();
setTimeout(() => loginEmailInput.focus(), 100);
}
function showUserRegisterView() {
userLoginState.style.display = 'none';
userRegisterState.style.display = 'block';
userAccountState.style.display = 'none';
userRegisterError.classList.remove('visible');
userRegisterForm.reset();
setTimeout(() => regNome.focus(), 100);
}
function showUserAccountView(user) {
userLoginState.style.display = 'none';
userRegisterState.style.display = 'none';
userAccountState.style.display = 'block';
accNome.textContent = user.nome || 'Anunciante';
accEmail.textContent = user.email || '-';
accTelefone.textContent = user.telefone || '-';
accLocal.textContent = `${user.cidade || 'Não informada'} - ${user.estado || 'RS'}`;
renderUserAnuncios(user);
}
function renderUserAnuncios(user) {
const veiculos = getVeiculos();
const userCleanTel = (user.telefone || '').replace(/\D/g, '');
const userNameLower = (user.nome || '').toLowerCase().trim();
// Procura anúncios deste usuário pelo anunciante ou telefone
const meusAnuncios = veiculos.filter(v => {
const vTel = (v.telefone || '').replace(/\D/g, '');
const vNome = (v.anunciante || '').toLowerCase().trim();
return (userCleanTel && vTel && vTel === userCleanTel) || (userNameLower && vNome.includes(userNameLower));
});
if (meusAnuncios.length === 0) {
userAnunciosContainer.innerHTML = `
Você ainda não tem veículos anunciados.
`;
return;
}
let html = '';
meusAnuncios.forEach(car => {
let badgeStatusClass = 'status-pendente';
let statusText = 'Pendente';
if (car.status === 'aprovado') {
badgeStatusClass = 'status-aprovado';
statusText = 'Aprovado / No estoque';
} else if (car.status === 'vendido') {
badgeStatusClass = 'status-vendido';
statusText = 'Vendido';
} else if (car.status === 'recusado') {
badgeStatusClass = 'status-recusado';
statusText = 'Recusado';
}
html += `
${escapeHTML(car.marca)} ${escapeHTML(car.modelo)}
${formatBRL(car.preco)}
${statusText}
`;
});
userAnunciosContainer.innerHTML = html;
}
// Eventos do Modal de Usuário
btnUserAuthTrigger.addEventListener('click', () => openUserAuthModal());
userAuthModalCloseBtn.addEventListener('click', closeUserAuthModal);
userAuthModal.addEventListener('click', (e) => {
if (e.target === userAuthModal) closeUserAuthModal();
});
btnGoToRegister.addEventListener('click', showUserRegisterView);
btnGoToLogin.addEventListener('click', showUserLoginView);
// Submissão do Login de Usuário Comum
userLoginForm.addEventListener('submit', function (e) {
e.preventDefault();
const email = loginEmailInput.value.trim().toLowerCase();
const senha = loginSenhaInput.value;
if (!email) {
userLoginErrorText.textContent = 'Informe o seu e-mail.';
userLoginError.classList.add('visible');
return;
}
const usuarios = getUsuarios();
const usuarioEncontrado = usuarios.find(u => (u.email || '').toLowerCase() === email);
if (!usuarioEncontrado) {
userLoginErrorText.textContent = 'Conta não encontrada com este e-mail. Crie seu cadastro abaixo.';
userLoginError.classList.add('visible');
return;
}
// Validação da senha se cadastrada, ou acesso liberado
if (usuarioEncontrado.senha && usuarioEncontrado.senha !== senha) {
userLoginErrorText.textContent = 'Senha incorreta para este usuário.';
userLoginError.classList.add('visible');
return;
}
// Sucesso no login
userLoginError.classList.remove('visible');
setCurrentUser(usuarioEncontrado);
showUserAccountView(usuarioEncontrado);
});
// Submissão do Cadastro de Usuário Comum
userRegisterForm.addEventListener('submit', function (e) {
e.preventDefault();
const nome = regNome.value.trim();
const telefone = regTelefone.value.trim();
const email = regEmail.value.trim().toLowerCase();
const senha = regSenha.value.trim();
const estado = regEstado.value;
const cidade = regCidade.value.trim();
if (!nome || !telefone || !email || !cidade) {
userRegisterErrorText.textContent = 'Por favor, preencha todos os campos obrigatórios.';
userRegisterError.classList.add('visible');
return;
}
const usuarios = getUsuarios();
const jaExiste = usuarios.some(u => (u.email || '').toLowerCase() === email);
if (jaExiste) {
userRegisterErrorText.textContent = 'Já existe um cadastro com este e-mail. Faça login.';
userRegisterError.classList.add('visible');
return;
}
const novoUsuario = {
id: 'usr-' + Date.now(),
nome,
telefone,
email,
senha: senha || '123',
estado,
cidade,
dataCriacao: new Date().toISOString()
};
usuarios.push(novoUsuario);
saveUsuarios(usuarios);
setCurrentUser(novoUsuario);
userRegisterError.classList.remove('visible');
showUserAccountView(novoUsuario);
});
// Logout do Usuário Comum
btnUserLogout.addEventListener('click', function () {
setCurrentUser(null);
showUserLoginView();
});
// Atalhos de dentro da Minha Conta
btnAccAnunciarNovo.addEventListener('click', function () {
closeUserAuthModal();
const currentUser = getCurrentUser();
if (currentUser) {
document.getElementById('carAnunciante').value = currentUser.nome || '';
document.getElementById('carTelefone').value = currentUser.telefone || '';
document.getElementById('carCidade').value = `${currentUser.cidade || ''} - ${currentUser.estado || ''}`;
}
openAnuncioModal();
});
btnAccVerEstoque.addEventListener('click', function () {
closeUserAuthModal();
const target = document.getElementById('estoque');
if (target) target.scrollIntoView({ behavior: 'smooth' });
});
// Máscara de telefone no cadastro
regTelefone.addEventListener('input', function(e) {
let v = e.target.value.replace(/\D/g, '');
if (v.length > 11) v = v.slice(0, 11);
if (v.length > 6) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2, 7)}-${v.slice(7)}`;
} else if (v.length > 2) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2)}`;
} else if (v.length > 0) {
e.target.value = `(${v}`;
}
});
/* ==========================================================
PAINEL ADMINISTRATIVO FUNCIONAL (SEPARADO NO RODAPÉ)
========================================================== */
const adminModal = document.getElementById('adminModal');
const btnFooterAdmin = document.getElementById('btnFooterAdmin');
const adminModalCloseBtn = document.getElementById('adminModalCloseBtn');
const adminLoginForm = document.getElementById('adminLoginForm');
const adminPasswordInput = document.getElementById('adminPasswordInput');
const adminErrorMsg = document.getElementById('adminErrorMsg');
const adminLoginSection = document.getElementById('adminLoginSection');
const adminPanelSection = document.getElementById('adminPanelSection');
const btnAdminLogout = document.getElementById('btnAdminLogout');
const adminTitleText = document.getElementById('adminTitleText');
const adminListingsContainer = document.getElementById('adminListingsContainer');
const adminTabButtons = document.querySelectorAll('.admin-tab-btn');
let currentAdminTab = 'pendente';
let isAdminLoggedIn = false;
function openAdminModal() {
adminModal.classList.add('show');
if (!isAdminLoggedIn) {
adminLoginSection.style.display = 'block';
adminPanelSection.style.display = 'none';
btnAdminLogout.style.display = 'none';
adminTitleText.textContent = 'Acesso Administrativo';
adminPasswordInput.value = '';
adminErrorMsg.classList.remove('visible');
setTimeout(() => adminPasswordInput.focus(), 150);
} else {
adminLoginSection.style.display = 'none';
adminPanelSection.style.display = 'block';
btnAdminLogout.style.display = 'inline-flex';
adminTitleText.textContent = 'Painel Administrativo';
renderAdminPanel();
}
}
function closeAdminModal() {
adminModal.classList.remove('show');
}
// O painel admin é aberto EXCLUSIVAMENTE pelo link discreto do rodapé
if (btnFooterAdmin) {
btnFooterAdmin.addEventListener('click', function(e) {
e.preventDefault();
openAdminModal();
});
}
adminModalCloseBtn.addEventListener('click', closeAdminModal);
adminModal.addEventListener('click', (e) => {
if (e.target === adminModal) closeAdminModal();
});
// Validação da senha "admin123"
adminLoginForm.addEventListener('submit', function (e) {
e.preventDefault();
const pwd = adminPasswordInput.value.trim();
if (pwd === 'admin123') {
isAdminLoggedIn = true;
adminErrorMsg.classList.remove('visible');
adminLoginSection.style.display = 'none';
adminPanelSection.style.display = 'block';
btnAdminLogout.style.display = 'inline-flex';
adminTitleText.textContent = 'Painel Administrativo';
renderAdminPanel();
} else {
adminErrorMsg.classList.add('visible');
adminPasswordInput.select();
}
});==========================================================
GERENCIAMENTO DE USUÁRIOS COMUNS (localStorage 'bcw_usuarios')
========================================================== */
const USERS_STORAGE_KEY = 'bcw_usuarios';
const CURRENT_USER_KEY = 'bcw_usuario_logado';
function initUsuariosStorage() {
const raw = localStorage.getItem(USERS_STORAGE_KEY);
if (!raw) {
// Usuários mock para facilitar login
const defaultUsers = [
{
id: 'usr-1',
nome: 'Carlos Eduardo Ramos',
email: 'carlos@exemplo.com',
senha: '123',
telefone: '(54) 99123-4567',
cidade: 'Caxias do Sul',
estado: 'RS',
dataCriacao: new Date().toISOString()
},
{
id: 'usr-2',
nome: 'Juliana Becker',
email: 'juliana@exemplo.com',
senha: '123',
telefone: '(54) 99876-5432',
cidade: 'Porto Alegre',
estado: 'RS',
dataCriacao: new Date().toISOString()
}
];
localStorage.setItem(USERS_STORAGE_KEY, JSON.stringify(defaultUsers));
return defaultUsers;
}
try {
return JSON.parse(raw) || [];
} catch (e) {
return [];
}
}
function getUsuarios() {
try {
return JSON.parse(localStorage.getItem(USERS_STORAGE_KEY)) || [];
} catch (e) {
return [];
}
}
function saveUsuarios(users) {
localStorage.setItem(USERS_STORAGE_KEY, JSON.stringify(users));
}
function getCurrentUser() {
try {
const raw = localStorage.getItem(CURRENT_USER_KEY);
return raw ? JSON.parse(raw) : null;
} catch (e) {
return null;
}
}
function setCurrentUser(user) {
if (!user) {
localStorage.removeItem(CURRENT_USER_KEY);
} else {
localStorage.setItem(CURRENT_USER_KEY, JSON.stringify(user));
}
updateUserNavButton();
}
function updateUserNavButton() {
const user = getCurrentUser();
const navText = document.getElementById('navUserText');
const navBtn = document.getElementById('btnUserAuthTrigger');
if (!navText || !navBtn) return;
if (user) {
const primeironome = (user.nome || '').trim().split(' ')[0] || 'Usuário';
navText.textContent = primeironome;
navBtn.setAttribute('title', `Conectado como ${user.nome} - Clique para abrir Minha Conta`);
} else {
navText.textContent = 'Entrar';
navBtn.setAttribute('title', 'Entrar ou criar conta');
}
}
initUsuariosStorage();
updateUserNavButton();
/* ==========================================================
GERENCIAMENTO DE DADOS (localStorage 'bcw_veiculos')
========================================================== */
const STORAGE_KEY = 'bcw_veiculos';==========================================================
GERENCIAMENTO DE DADOS (localStorage 'bcw_veiculos')
========================================================== */
const STORAGE_KEY = 'bcw_veiculos';
// Dados iniciais com exemplos realistas se não existir no storage
function initVeiculosStorage() {
const raw = localStorage.getItem(STORAGE_KEY);
if (!raw) {
const initialData = [
{
id: 'bcw-101',
marca: 'Toyota',
modelo: 'Corolla XEi 2.0 Flex',
ano: 2021,
km: '42.000 km',
preco: 108900,
fipe: 118500,
anunciante: 'Carlos Eduardo Ramos',
telefone: '(54) 99123-4567',
cidade: 'Caxias do Sul - RS',
status: 'pendente',
dataCriacao: new Date(Date.now() - 3600000 * 2).toISOString()
},
{
id: 'bcw-102',
marca: 'Jeep',
modelo: 'Compass Longitude 1.3 Turbo',
ano: 2022,
km: '31.500 km',
preco: 139000,
fipe: 149500,
anunciante: 'Juliana Becker',
telefone: '(54) 99876-5432',
cidade: 'Porto Alegre - RS',
status: 'pendente',
dataCriacao: new Date(Date.now() - 3600000 * 5).toISOString()
},
{
id: 'bcw-103',
marca: 'Volkswagen',
modelo: 'T-Cross Comfortline 1.0 TSI',
ano: 2022,
km: '28.000 km',
preco: 112000,
fipe: 121500,
anunciante: 'Marcelo Silveira',
telefone: '(54) 99282-0084',
cidade: 'Bento Gonçalves - RS',
status: 'aprovado',
dataCriacao: new Date(Date.now() - 3600000 * 24).toISOString()
},
{
id: 'bcw-104',
marca: 'Hyundai',
modelo: 'Creta Platinum 1.0 Turbo',
ano: 2023,
km: '19.000 km',
preco: 124900,
fipe: 134000,
anunciante: 'Fernanda Martins',
telefone: '(54) 99654-3210',
cidade: 'Flores da Cunha - RS',
status: 'aprovado',
dataCriacao: new Date(Date.now() - 3600000 * 36).toISOString()
},
{
id: 'bcw-105',
marca: 'Chevrolet',
modelo: 'Tracker Premier 1.2 Turbo',
ano: 2021,
km: '55.000 km',
preco: 99800,
fipe: 108000,
anunciante: 'Lucas Fagundes',
telefone: '(54) 99345-6789',
cidade: 'Farroupilha - RS',
status: 'vendido',
dataCriacao: new Date(Date.now() - 3600000 * 72).toISOString()
},
{
id: 'bcw-106',
marca: 'Fiat',
modelo: 'Mobi Like 1.0 Fire',
ano: 2019,
km: '85.000 km',
preco: 42000,
fipe: 46000,
anunciante: 'Anônimo sem contato',
telefone: '(54) 90000-0000',
cidade: 'Caxias do Sul - RS',
status: 'recusado',
dataCriacao: new Date(Date.now() - 3600000 * 96).toISOString()
}
];
saveVeiculos(initialData);
return initialData;
}
try {
return JSON.parse(raw) || [];
} catch (e) {
return [];
}
}
function getVeiculos() {
try {
return JSON.parse(localStorage.getItem(STORAGE_KEY)) || [];
} catch (e) {
return [];
}
}
function saveVeiculos(veiculos) {
localStorage.setItem(STORAGE_KEY, JSON.stringify(veiculos));
}
function formatBRL(valor) {
if (!valor) return 'R$ 0';
const num = typeof valor === 'number' ? valor : parseFloat(String(valor).replace(/\D/g, ''));
return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL', maximumFractionDigits: 0 }).format(num || 0);
}
/* ==========================================================
VITRINE DE ESTOQUE (Apenas status 'aprovado' ou 'vendido')
========================================================== */
function renderVitrineEstoque() {
const grid = document.getElementById('estoqueGrid');
if (!grid) return;
const todos = getVeiculos();
// Apenas 'aprovado' e 'vendido' aparecem no catálogo
const vitrine = todos.filter(v => v.status === 'aprovado' || v.status === 'vendido');
if (vitrine.length === 0) {
grid.innerHTML = `
Nenhum veículo encontrado
No momento não há veículos disponíveis no estoque. Novos modelos verificados serão adicionados em breve.
`;
return;
}
let html = '
';
vitrine.forEach(car => {
const isVendido = car.status === 'vendido';
const badgeClass = isVendido ? 'status-badge status-vendido' : 'status-badge status-aprovado';
const badgeText = isVendido ? 'VENDIDO' : 'ABAIXO DA FIPE';
const telDigitos = (car.telefone || '54992820084').replace(/\D/g, '');
const waLink = `https://wa.me/55${telDigitos}?text=${encodeURIComponent(`Olá! Tenho interesse no ${car.marca} ${car.modelo} anunciado no Busca Carro Web.`)}`;
html += `
${formatBRL(car.preco)}
${car.fipe ? `Ref. FIPE: ${formatBRL(car.fipe)} ` : ''}
Vendedor: ${escapeHTML(car.anunciante || 'Particular')}
${escapeHTML(car.cidade || 'RS')}
${isVendido ? `
Veículo Vendido
` : `
Tenho Interesse
`}
`;
});
html += '
';
grid.innerHTML = html;
}
function escapeHTML(str) {
if (!str) return '';
return String(str)
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
/* ==========================================================
PAINEL ADMINISTRATIVO FUNCIONAL
========================================================== */
const adminModal = document.getElementById('adminModal');
const btnAdminTrigger = document.getElementById('btnAdminTrigger');
const adminModalCloseBtn = document.getElementById('adminModalCloseBtn');
const adminLoginForm = document.getElementById('adminLoginForm');
const adminPasswordInput = document.getElementById('adminPasswordInput');
const adminErrorMsg = document.getElementById('adminErrorMsg');
const adminLoginSection = document.getElementById('adminLoginSection');
const adminPanelSection = document.getElementById('adminPanelSection');
const btnAdminLogout = document.getElementById('btnAdminLogout');
const adminTitleText = document.getElementById('adminTitleText');
const adminListingsContainer = document.getElementById('adminListingsContainer');
const adminTabButtons = document.querySelectorAll('.admin-tab-btn');
let currentAdminTab = 'pendente';
let isAdminLoggedIn = false;
function openAdminModal() {
adminModal.classList.add('show');
if (!isAdminLoggedIn) {
adminLoginSection.style.display = 'block';
adminPanelSection.style.display = 'none';
btnAdminLogout.style.display = 'none';
adminTitleText.textContent = 'Acesso Administrativo';
adminPasswordInput.value = '';
adminErrorMsg.classList.remove('visible');
setTimeout(() => adminPasswordInput.focus(), 150);
} else {
adminLoginSection.style.display = 'none';
adminPanelSection.style.display = 'block';
btnAdminLogout.style.display = 'inline-flex';
adminTitleText.textContent = 'Painel Administrativo';
renderAdminPanel();
}
}
function closeAdminModal() {
adminModal.classList.remove('show');
}
btnAdminTrigger.addEventListener('click', openAdminModal);
adminModalCloseBtn.addEventListener('click', closeAdminModal);
adminModal.addEventListener('click', (e) => {
if (e.target === adminModal) closeAdminModal();
});
// 1. LOGIN ADMIN: Validação da senha "admin123"
adminLoginForm.addEventListener('submit', function (e) {
e.preventDefault();
const pwd = adminPasswordInput.value.trim();
if (pwd === 'admin123') {
isAdminLoggedIn = true;
adminErrorMsg.classList.remove('visible');
adminLoginSection.style.display = 'none';
adminPanelSection.style.display = 'block';
btnAdminLogout.style.display = 'inline-flex';
adminTitleText.textContent = 'Painel Administrativo';
renderAdminPanel();
} else {
adminErrorMsg.classList.add('visible');
adminPasswordInput.select();
}
});
// 6. Botão "Sair do painel" para voltar à tela de login
btnAdminLogout.addEventListener('click', function () {
isAdminLoggedIn = false;
adminPasswordInput.value = '';
adminErrorMsg.classList.remove('visible');
adminPanelSection.style.display = 'none';
adminLoginSection.style.display = 'block';
btnAdminLogout.style.display = 'none';
adminTitleText.textContent = 'Acesso Administrativo';
setTimeout(() => adminPasswordInput.focus(), 150);
});
// 2. PAINEL ADMIN: Abas (Pendentes, Aprovados, Recusados, Vendidos)
adminTabButtons.forEach(btn => {
btn.addEventListener('click', function () {
adminTabButtons.forEach(b => b.classList.remove('active'));
this.classList.add('active');
currentAdminTab = this.getAttribute('data-tab');
renderAdminListings();
});
});
function updateAdminTabCounts(veiculos) {
const counts = {
pendente: 0,
aprovado: 0,
recusado: 0,
vendido: 0
};
veiculos.forEach(v => {
if (counts[v.status] !== undefined) {
counts[v.status]++;
}
});
document.getElementById('countPendente').textContent = counts.pendente;
document.getElementById('countAprovado').textContent = counts.aprovado;
document.getElementById('countRecusado').textContent = counts.recusado;
document.getElementById('countVendido').textContent = counts.vendido;
}
function renderAdminPanel() {
const veiculos = getVeiculos();
updateAdminTabCounts(veiculos);
renderAdminListings();
}
// 3, 4, 5. Renderização das listagens e ações por status
function renderAdminListings() {
const todos = getVeiculos();
updateAdminTabCounts(todos);
const filtrados = todos.filter(v => v.status === currentAdminTab);
if (filtrados.length === 0) {
adminListingsContainer.innerHTML = `
Nenhum anúncio nesta categoria.
`;
return;
}
let html = '';
filtrados.forEach(item => {
let badgeStatusHtml = '';
let actionsHtml = '';
if (item.status === 'pendente') {
badgeStatusHtml = `
PENDENTE `;
actionsHtml = `
Aprovar
Recusar
`;
} else if (item.status === 'aprovado') {
badgeStatusHtml = `
APROVADO `;
actionsHtml = `
Marcar vendido
`;
} else if (item.status === 'vendido') {
badgeStatusHtml = `
VENDIDO `;
actionsHtml = `
Reativar anúncio
`;
} else if (item.status === 'recusado') {
badgeStatusHtml = `
RECUSADO `;
actionsHtml = `
Reativar anúncio
`;
}
html += `
${escapeHTML(item.marca)} ${escapeHTML(item.modelo)} ${item.ano ? `(${escapeHTML(String(item.ano))})` : ''}
Anunciante: ${escapeHTML(item.anunciante || 'Não informado')}
Cidade: ${escapeHTML(item.cidade || 'RS')}
${item.telefone ? `Tel: ${escapeHTML(item.telefone)} ` : ''}
${formatBRL(item.preco)}
${badgeStatusHtml}
${actionsHtml}
`;
});
adminListingsContainer.innerHTML = html;
// Anexar listeners de clique nas ações
adminListingsContainer.querySelectorAll('button[data-action]').forEach(btn => {
btn.addEventListener('click', function () {
const action = this.getAttribute('data-action');
const id = this.getAttribute('data-id');
handleAdminAction(id, action);
});
});
}
function handleAdminAction(id, action) {
const veiculos = getVeiculos();
const index = veiculos.findIndex(v => v.id === id);
if (index === -1) return;
if (action === 'aprovar') {
veiculos[index].status = 'aprovado';
} else if (action === 'recusar') {
veiculos[index].status = 'recusado';
} else if (action === 'marcar-vendido') {
veiculos[index].status = 'vendido';
} else if (action === 'reativar-vendido') {
// Reativa anúncio vendido voltando para aprovado
veiculos[index].status = 'aprovado';
} else if (action === 'reativar-recusado') {
// Reativa anúncio recusado voltando para pendente conforme regra
veiculos[index].status = 'pendente';
}
saveVeiculos(veiculos);
renderAdminListings();
renderVitrineEstoque();
}
/* ==========================================================
FORMULÁRIO DE ANÚNCIO DE VEÍCULO DO USUÁRIO
========================================================== */
const anuncioModal = document.getElementById('anuncioModal');
const btnQueroAnunciarDirect = document.getElementById('btnQueroAnunciarDirect');
const anuncioModalCloseBtn = document.getElementById('anuncioModalCloseBtn');
const publicarVeiculoForm = document.getElementById('publicarVeiculoForm');
const anuncioFormContainer = document.getElementById('anuncioFormContainer');
const anuncioSuccessState = document.getElementById('anuncioSuccessState');
const btnAnuncioConcluido = document.getElementById('btnAnuncioConcluido');
function openAnuncioModal() {
anuncioModal.classList.add('show');
anuncioFormContainer.style.display = 'block';
anuncioSuccessState.style.display = 'none';
}
function closeAnuncioModal() {
anuncioModal.classList.remove('show');
}
if (btnQueroAnunciarDirect) {
btnQueroAnunciarDirect.addEventListener('click', openAnuncioModal);
}
anuncioModalCloseBtn.addEventListener('click', closeAnuncioModal);
btnAnuncioConcluido.addEventListener('click', closeAnuncioModal);
anuncioModal.addEventListener('click', (e) => {
if (e.target === anuncioModal) closeAnuncioModal();
});
// Máscara de telefone no anúncio
const carTelInput = document.getElementById('carTelefone');
carTelInput.addEventListener('input', function(e) {
let v = e.target.value.replace(/\D/g, '');
if (v.length > 11) v = v.slice(0, 11);
if (v.length > 6) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2, 7)}-${v.slice(7)}`;
} else if (v.length > 2) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2)}`;
} else if (v.length > 0) {
e.target.value = `(${v}`;
}
});
publicarVeiculoForm.addEventListener('submit', function (e) {
e.preventDefault();
const marca = document.getElementById('carMarca').value.trim();
const modelo = document.getElementById('carModelo').value.trim();
const ano = parseInt(document.getElementById('carAno').value.trim(), 10) || new Date().getFullYear();
const km = document.getElementById('carKm').value.trim() || 'Não informada';
const precoRaw = document.getElementById('carPreco').value.replace(/\D/g, '');
const fipeRaw = document.getElementById('carFipe').value.replace(/\D/g, '');
const anunciante = document.getElementById('carAnunciante').value.trim();
const telefone = document.getElementById('carTelefone').value.trim();
const cidade = document.getElementById('carCidade').value.trim();
if (!marca || !modelo || !precoRaw || !anunciante || !telefone || !cidade) {
alert('Por favor, preencha todos os campos obrigatórios do veículo.');
return;
}
const novoVeiculo = {
id: 'bcw-' + Date.now(),
marca,
modelo,
ano,
km,
preco: parseInt(precoRaw, 10),
fipe: fipeRaw ? parseInt(fipeRaw, 10) : null,
anunciante,
telefone,
cidade,
status: 'pendente', // Anúncios do usuário entram como pendentes
dataCriacao: new Date().toISOString()
};
const veiculos = getVeiculos();
veiculos.unshift(novoVeiculo);
saveVeiculos(veiculos);
// Atualizar painel admin se aberto
if (isAdminLoggedIn) {
renderAdminPanel();
}
anuncioFormContainer.style.display = 'none';
anuncioSuccessState.style.display = 'block';
publicarVeiculoForm.reset();
});
/* ==========================================================
MODAL DE CADASTRO SIMPLES (CLIENTE COMPRADOR)
========================================================== */
const cadastroModal = document.getElementById('cadastroModal');
const triggers = document.querySelectorAll('.open-modal-trigger');
const closeBtn = document.getElementById('modalCloseBtn');
const formContainer = document.getElementById('modalFormContainer');
const successState = document.getElementById('modalSuccessState');
const registerForm = document.getElementById('simpleRegisterForm');
const welcomeUserName = document.getElementById('welcomeUserName');
const btnEstoqueConcluido = document.getElementById('btnEstoqueConcluido');
function openCadastroModal() {
cadastroModal.classList.add('show');
const savedUser = localStorage.getItem('busca_carro_user');
if (savedUser) {
try {
const data = JSON.parse(savedUser);
document.getElementById('formNome').value = data.nome || '';
document.getElementById('formTelefone').value = data.telefone || '';
document.getElementById('formEmail').value = data.email || '';
document.getElementById('formCidade').value = data.cidade || '';
if (data.estado) document.getElementById('formEstado').value = data.estado;
} catch(e){}
}
}
function closeCadastroModal() {
cadastroModal.classList.remove('show');
}
triggers.forEach(btn => btn.addEventListener('click', openCadastroModal));
closeBtn.addEventListener('click', closeCadastroModal);
cadastroModal.addEventListener('click', function(e) {
if (e.target === cadastroModal) {
closeCadastroModal();
}
});
const phoneInput = document.getElementById('formTelefone');
phoneInput.addEventListener('input', function(e) {
let v = e.target.value.replace(/\D/g, '');
if (v.length > 11) v = v.slice(0, 11);
if (v.length > 6) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2, 7)}-${v.slice(7)}`;
} else if (v.length > 2) {
e.target.value = `(${v.slice(0, 2)}) ${v.slice(2)}`;
} else if (v.length > 0) {
e.target.value = `(${v}`;
}
});
registerForm.addEventListener('submit', function (e) {
e.preventDefault();
const nome = document.getElementById('formNome').value.trim();
const telefone = document.getElementById('formTelefone').value.trim();
const email = document.getElementById('formEmail').value.trim();
const estado = document.getElementById('formEstado').value;
const cidade = document.getElementById('formCidade').value.trim();
if (!nome || !telefone || !email || !cidade) {
alert('Por favor, preencha todos os campos para prosseguir.');
return;
}
const userData = { nome, telefone, email, estado, cidade, ts: Date.now() };
localStorage.setItem('busca_carro_user', JSON.stringify(userData));
welcomeUserName.textContent = nome.split(' ')[0] || nome;
formContainer.style.display = 'none';
successState.style.display = 'block';
});
btnEstoqueConcluido.addEventListener('click', function () {
closeCadastroModal();
setTimeout(() => {
formContainer.style.display = 'block';
successState.style.display = 'none';
const target = document.getElementById('estoque');
if (target) target.scrollIntoView({ behavior: 'smooth' });
}, 300);
});
// 2. Buttons "QUERO COMPRAR" and "QUERO VENDER" smooth scroll and card highlight
const btnComprar = document.getElementById('btnQueroComprar');
const btnVender = document.getElementById('btnQueroVender');
const cardComprar = document.getElementById('cardComprar');
const cardVender = document.getElementById('cardVender');
if (btnComprar) {
btnComprar.addEventListener('click', function (e) {
e.preventDefault();
cardComprar.scrollIntoView({ behavior: 'smooth', block: 'center' });
highlightCard(cardComprar);
});
}
if (btnVender) {
btnVender.addEventListener('click', function (e) {
e.preventDefault();
cardVender.scrollIntoView({ behavior: 'smooth', block: 'center' });
highlightCard(cardVender);
});
}
function highlightCard(element) {
element.style.transition = 'all 0.3s ease';
element.style.borderColor = '#f97316';
element.style.boxShadow = '0 0 25px rgba(249, 115, 22, 0.45)';
setTimeout(() => {
element.style.borderColor = '';
element.style.boxShadow = '';
}, 1800);
}
// Inicialização dos veículos e vitrine
initVeiculosStorage();
renderVitrineEstoque();
// 3. Mobile menu toggle
const mobileBtn = document.getElementById('mobileMenuBtn');
const navMenu = document.getElementById('navMenu');
if (mobileBtn && navMenu) {
mobileBtn.addEventListener('click', function () {
navMenu.classList.toggle('active');
});
navMenu.querySelectorAll('a').forEach(link => {
link.addEventListener('click', () => navMenu.classList.remove('active'));
});
}
// 4. Accordion FAQ logic
const faqItems = document.querySelectorAll('.faq-item');
faqItems.forEach(item => {
const btn = item.querySelector('.faq-question');
btn.addEventListener('click', () => {
const isOpen = item.classList.contains('active');
faqItems.forEach(i => {
i.classList.remove('active');
i.querySelector('.faq-question').setAttribute('aria-expanded', 'false');
});
if (!isOpen) {
item.classList.add('active');
btn.setAttribute('aria-expanded', 'true');
}
});
});
});
=======
Ver Vitrine de Ofertas
Sair