Katalog Na placu Top 20 Szukaj Porównaj 0 Aktualności
1418
Dostępnych pojazdów
100%
Pełna obsługa importu
12-16 tyg.
Czas dostawy

Jak to działa?

Import auta z Chin w 4 prostych krokach

01

Wybierz pojazd

Przeglądaj nasze oferty importowe z Chin. Filtruj wg ceny, roku i typu napędu.

02

Sprawdź cenę

Użyj naszego kalkulatora, aby poznać pełny koszt importu z cłem, VAT-em i dostawą.

03

Złóż zamówienie

Wpłać zaliczkę przelewem bankowym i potwierdź zamówienie. My zajmiemy się resztą.

04

Odbierz auto

Po 12-16 tygodniach Twój pojazd jest gotowy do odbioru – zarejestrowany.

Wszystkie parametry

`; document.getElementById('car-details').innerHTML = html; window.otherParams = params.filter(p => p.is_basic != 1); } function openModal() { if (!window.otherParams || window.otherParams.length === 0) { showToast('Brak dodatkowych parametrów dla tego pojazdu.', 'error'); return; } const modalBody = document.getElementById('modal-params'); const modalTitle = document.querySelector('#params-modal .mp-modal__title'); modalTitle.textContent = 'Pozostałe parametry'; const groups = {}; window.otherParams.forEach(p => { if (!groups[p.group_id]) { groups[p.group_id] = { name: p.group_name, params: [] }; } groups[p.group_id].params.push(p); }); modalBody.innerHTML = `
${Object.values(groups).map(group => `

${group.name}

${group.params.map(p => `
${p.param_name} ${p.value}
`).join('')}
`).join('')}
`; document.getElementById('params-modal').classList.add('show'); document.body.style.overflow = 'hidden'; } function closeModal() { document.getElementById('params-modal').classList.remove('show'); document.body.style.overflow = ''; } // ==================== ON STOCK ==================== async function loadOnStock() { const grid = document.getElementById('onstock-grid'); grid.innerHTML = `

Ładowanie...

`; const cars = await fetchAPI('on_stock'); if (!cars || cars.length === 0) { grid.innerHTML = '

Brak aut na placu

'; return; } grid.innerHTML = cars.map(car => renderCarCard(car)).join(''); } // ==================== TOP IMPORT ==================== async function loadTopImport() { const grid = document.getElementById('topimport-grid'); grid.innerHTML = `

Ładowanie...

`; const cars = await fetchAPI('top_import'); if (!cars || cars.length === 0) { grid.innerHTML = '

Brak aut w TOP 20

'; return; } grid.innerHTML = cars.map(car => renderCarCard(car, true)).join(''); } function renderCarCard(car, showPrice = false) { let badge = ''; if (car.is_on_stock == 1) { badge = 'Na placu'; } else if (car.is_top_import == 1) { badge = 'Import'; } let priceText = ''; if (showPrice && car.import_price_pln) { priceText = `
${Number(car.import_price_pln).toLocaleString('pl-PL')} PLN
`; } return `
${badge ? `
${badge}
` : ''}
${car.version_name || ''} ${car.year}
${priceText}
`; } // ==================== SEARCH ==================== async function initSearch() { if (state.brands.length === 0) { state.brands = await fetchAPI('brands') || []; } // Wypełnij select marki w formularzu wyszukiwania const searchSelect = document.getElementById('search-brand'); searchSelect.innerHTML = '' + state.brands.map(b => ``).join(''); // Wypełnij select marki w formularzu hero const heroSelect = document.getElementById('hero-brand'); heroSelect.innerHTML = '' + state.brands.map(b => ``).join(''); // Event listener dla zmiany marki w formularzu wyszukiwania searchSelect.addEventListener('change', async function() { const brandName = this.value; const modelSelect = document.getElementById('search-model'); if (!brandName) { modelSelect.innerHTML = ''; return; } modelSelect.innerHTML = ''; try { const response = await fetch(`api/api.php?action=models_for_brand&brand=${encodeURIComponent(brandName)}`); const data = await response.json(); if (data.success && data.data) { modelSelect.innerHTML = '' + data.data.map(m => ``).join(''); } else { modelSelect.innerHTML = ''; } } catch (error) { console.error('[DEBUG] Error loading search models:', error); modelSelect.innerHTML = ''; } }); // Event listener dla zmiany marki w formularzu hero heroSelect.addEventListener('change', async function() { const brandName = this.value; const modelSelect = document.getElementById('hero-model'); if (!brandName) { modelSelect.innerHTML = ''; return; } modelSelect.innerHTML = ''; try { const response = await fetch(`api/api.php?action=models_for_brand&brand=${encodeURIComponent(brandName)}`); const data = await response.json(); if (data.success && data.data) { modelSelect.innerHTML = '' + data.data.map(m => ``).join(''); } else { modelSelect.innerHTML = ''; } } catch (error) { console.error('[DEBUG] Error loading hero models:', error); modelSelect.innerHTML = ''; } }); } async function performSearch(page = 1) { const results = document.getElementById('search-results'); const pagination = document.getElementById('search-pagination'); results.innerHTML = `

Szukanie...

`; pagination.innerHTML = ''; const params = {}; const brand = document.getElementById('search-brand').value; const model = document.getElementById('search-model').value; const body = document.getElementById('search-body').value; const fuel = document.getElementById('search-fuel').value; const powerMin = document.getElementById('search-power-min').value; const rangeMin = document.getElementById('search-range-min').value; const year = document.getElementById('search-year').value; console.log('[DEBUG performSearch] brand:', brand, 'model:', model, 'year:', year); if (brand) params.brand = brand; if (model) params.model = model; if (body) params.body_type = body; if (fuel) params.fuel = fuel; if (powerMin) params.power_min = powerMin; if (rangeMin) params.range_min = rangeMin; if (year) params.year = year; params.page = page; params.limit = 20; state.searchParams = params; state.searchPage = page; const response = await fetchAPI('search', params); if (!response) return; state.searchResults = response.data || []; state.searchTotal = response.total || state.searchResults.length; state.searchTotalPages = response.total_pages || 1; if (state.searchResults.length === 0) { results.innerHTML = '

Nie znaleziono wyników

'; return; } results.innerHTML = state.searchResults.map(car => renderCarCard(car)).join(''); renderPagination(); } function renderPagination() { const pagination = document.getElementById('search-pagination'); const { searchPage, searchTotalPages, searchTotal } = state; if (searchTotalPages <= 1) { pagination.innerHTML = `
Znaleziono: ${searchTotal} wyników
`; return; } let html = ''; const from = (searchPage - 1) * 20 + 1; const to = Math.min(searchPage * 20, searchTotal); html += `
Wyniki ${from}-${to} z ${searchTotal}
`; html += ``; const maxVisible = 5; let startPage = Math.max(1, searchPage - Math.floor(maxVisible / 2)); let endPage = Math.min(searchTotalPages, startPage + maxVisible - 1); if (endPage - startPage < maxVisible - 1) { startPage = Math.max(1, endPage - maxVisible + 1); } if (startPage > 1) { html += ``; if (startPage > 2) { html += `...`; } } for (let i = startPage; i <= endPage; i++) { html += ``; } if (endPage < searchTotalPages) { if (endPage < searchTotalPages - 1) { html += `...`; } html += ``; } html += ``; pagination.innerHTML = html; } // ==================== COMPARE ==================== async function addToCompare(carId) { if (state.compareList.length >= 3) { showToast('Maksymalnie 3 auta do porównania', 'error'); return; } if (state.compareList.find(c => c.car.id === carId)) { showToast('To auto jest już dodane', 'error'); return; } const car = await fetchAPI('car', { id: carId }); if (car) { state.compareList.push(car); renderCompareSlots(); showToast('Dodano do porównania', 'success'); } } function addToComparePrompt() { if (state.compareList.length >= 3) { showToast('Maksymalnie 3 auta', 'error'); return; } showSection('catalog'); showToast('Wybierz auto z katalogu, aby dodać do porównania', 'success'); } function removeFromCompare(carId) { state.compareList = state.compareList.filter(c => c.car.id !== carId); renderCompareSlots(); } function clearCompare() { state.compareList = []; renderCompareSlots(); } function updateCompareBadge() { const badge = document.getElementById('compare-badge'); const count = state.compareList.length; if (badge) { badge.textContent = count; if (count > 0) { badge.classList.add('visible'); badge.classList.remove('pulse'); void badge.offsetWidth; badge.classList.add('pulse'); } else { badge.classList.remove('visible'); } } const mobileBadge = document.getElementById('mobile-compare-badge'); if (mobileBadge) { mobileBadge.textContent = count; if (count > 0) { mobileBadge.classList.add('visible'); } else { mobileBadge.classList.remove('visible'); } } } function renderCompareSlots() { const slots = document.getElementById('compare-slots'); const table = document.getElementById('compare-table'); updateCompareBadge(); let html = ''; for (let i = 0; i < 3; i++) { if (state.compareList[i]) { const car = state.compareList[i].car; const versionYear = car.version_name ? `${car.version_name} (${car.year})` : car.year; html += `
${versionYear}
${car.brand_name}
${car.model_name}
`; } else { html += `
+

Kliknij, aby dodać auto

`; } } slots.innerHTML = html; if (state.compareList.length >= 2) { renderCompareTable(); table.style.display = 'block'; } else { table.style.display = 'none'; } } function renderCompareTable() { const table = document.getElementById('compare-table'); const allData = state.compareList.map(d => d); const allParams = new Set(); allData.forEach(d => { d.params.forEach(p => allParams.add(p.param_name)); }); let html = ''; allData.forEach(d => { const versionYear = d.car.version_name ? `${d.car.version_name} (${d.car.year})` : d.car.year; html += ``; }); html += ''; allParams.forEach(paramName => { // Pobierz wszystkie wartości dla tego parametru const values = allData.map(d => { const param = d.params.find(p => p.param_name === paramName); return param ? param.value : null; }); // Sprawdź czy wartości są różne (ignorujemy null/-) const nonNullValues = values.filter(v => v !== null && v !== '-'); const hasDifference = nonNullValues.length > 1 && new Set(nonNullValues).size > 1; const rowStyle = hasDifference ? 'background: rgba(229, 57, 53, 0.05);' : ''; const cellStyle = hasDifference ? 'font-weight: 600;' : ''; html += ``; allData.forEach(d => { const param = d.params.find(p => p.param_name === paramName); html += ``; }); html += ''; }); html += '
Parametr${d.car.brand_name} ${d.car.model_name}
${versionYear}
${paramName}${param ? param.value : '-'}
'; table.innerHTML = html; } // ==================== NEWS ==================== async function loadNews() { const list = document.getElementById('news-list'); list.innerHTML = `

Ładowanie...

`; const news = await fetchAPI('news'); if (!news || news.length === 0) { list.innerHTML = '

Brak aktualności

'; return; } list.innerHTML = news.map(item => { const carBadge = item.car_id && item.model_name ? ` ${item.brand_name || ''} ${item.model_name} ${item.year || ''} ` : ''; return `
${new Date(item.created_at).toLocaleDateString('pl-PL')}

${item.title}

${carBadge}

${item.content || ''}

`; }).join(''); } // ==================== BACK NAVIGATION ==================== function goBackFromVersions() { if (state.currentModel) { showSection('models'); } else { showSection('catalog'); } } function goBackFromDetails() { if (state.currentModel && state.currentBrand) { document.getElementById('versions-title').textContent = `${state.currentBrand.name} ${state.currentModel}`; showSection('versions'); } else { showSection('catalog'); } } // ==================== TOAST ==================== function showToast(message, type = 'info') { const toast = document.getElementById('toast'); toast.textContent = message; toast.className = `mp-toast ${type}`; toast.classList.add('show'); setTimeout(() => toast.classList.remove('show'), 3000); } // ==================== SCROLL ANIMATIONS ==================== function handleScrollAnimations() { const elements = document.querySelectorAll('.mp-fade-in:not(.is-visible)'); elements.forEach(el => { const rect = el.getBoundingClientRect(); if (rect.top < window.innerHeight - 100) { el.classList.add('is-visible'); } }); } // ==================== HEADER SCROLL ==================== function handleHeaderScroll() { const header = document.getElementById('site-header'); if (window.scrollY > 50) { header.classList.add('scrolled'); } else { header.classList.remove('scrolled'); } } // ==================== INIT ==================== document.addEventListener('DOMContentLoaded', () => { // Modal close on backdrop click document.getElementById('params-modal').addEventListener('click', (e) => { if (e.target.classList.contains('mp-modal')) { closeModal(); } }); // Modal close on ESC document.addEventListener('keydown', (e) => { if (e.key === 'Escape') closeModal(); }); // Mobile menu toggle document.getElementById('mobile-menu-toggle').addEventListener('click', toggleMobileNav); // Scroll animations window.addEventListener('scroll', () => { handleScrollAnimations(); handleHeaderScroll(); }); // Initial check for animations handleScrollAnimations(); // Load brands for hero search loadBrandsForHero(); }); async function loadBrandsForHero() { const brands = await fetchAPI('brands'); if (brands) { const brandSelect = document.getElementById('hero-brand'); brandSelect.innerHTML = '' + brands.map(b => ``).join(''); // Dodaj event listener dla zmiany marki brandSelect.addEventListener('change', function() { loadHeroModels(this.value); loadHeroYears(); }); // Załaduj lata produkcji loadHeroYears(); } } async function loadHeroModels(brandName) { const modelSelect = document.getElementById('hero-model'); console.log('[DEBUG] loadHeroModels wywołana z brandName:', brandName); if (!brandName) { modelSelect.innerHTML = ''; console.log('[DEBUG] Brand pusty - czyszczę modele'); return; } modelSelect.innerHTML = ''; try { const url = `api/api.php?action=models_for_brand&brand=${encodeURIComponent(brandName)}`; console.log('[DEBUG] Wywołuję API:', url); const response = await fetch(url); const data = await response.json(); console.log('[DEBUG] Odpowiedź API:', data); if (data.success && data.data) { console.log('[DEBUG] Modele znalezione:', data.data.length, data.data); modelSelect.innerHTML = '' + data.data.map(m => ``).join(''); } else { console.log('[DEBUG] Brak modeli w odpowiedzi - data:', data); modelSelect.innerHTML = ''; } } catch (error) { console.error('[DEBUG] Error loading models:', error); modelSelect.innerHTML = ''; } // Dodaj event listener dla zmiany modelu modelSelect.addEventListener('change', loadHeroYears); } async function loadHeroYears() { const brandSelect = document.getElementById('hero-brand'); const modelSelect = document.getElementById('hero-model'); const yearSelect = document.getElementById('hero-year'); const brand = brandSelect.value; const model = modelSelect.value; console.log('[DEBUG] loadHeroYears - brand:', brand, 'model:', model); try { let url = 'api/api.php?action=available_years'; if (brand) url += `&brand=${encodeURIComponent(brand)}`; if (model) url += `&model=${encodeURIComponent(model)}`; console.log('[DEBUG] loadHeroYears URL:', url); const response = await fetch(url); const data = await response.json(); console.log('[DEBUG] loadHeroYears response:', data); if (data.success && data.data) { yearSelect.innerHTML = '' + data.data.map(y => ``).join(''); } else { yearSelect.innerHTML = ''; } } catch (error) { console.error('[DEBUG] Error loading years:', error); } }