Не уверены, что правильно выбрали защиту для вашего авто? Сообщите нам VIN-код и мы подберем 100% совместимые варианты!Написать
График работы:

Пн-Пт: 9:00 - 18:00

Сб-Вс: 10:00 - 15:00

0
Мой заказ
Добавьте товары в корзину
Желания
Добавьте товары в желания
Добавьте товары для сравнения

Защита двигателя Ram

Продолжая посещение сайта, вы соглашаетесь с использованием файлов cookie и с Публичным договором (Офертой).

(function () { if (!window.CustomApp) return; CustomApp.safeRun(() => { addReviewRating(GLOBAL.isMobile); }); CustomApp.safeRun(() => { addCartProductOptions(); }); document.addEventListener('DOMContentLoaded', () => { if (GLOBAL.isMobile) { warmMenu(); CustomApp.safeRun(() => { initPopUpBackButton(); }); CustomApp.safeRun(() => { initMenuLevels(); }); } CustomApp.safeRun(() => { fixFooter(); }); }); async function addReviewRating(isMobile) { const selector = isMobile ? '.main-nav__link' : '.site-menu__link'; const CACHE_KEY = 'horo_store_rating'; const CACHE_TIME_KEY = 'horo_store_rating_time'; const ONE_DAY = 1000 * 60 * 60 * 24 * 7; const cachedRating = localStorage.getItem(CACHE_KEY); const cachedTime = localStorage.getItem(CACHE_TIME_KEY); const now = Date.now(); async function applyRating(ratingValue) { const menuItem = await CustomApp.waitForElement(selector + '[href="/vidhuky-pro-mahazyn/"], ' + selector + '[href="/ru/vidhuky-pro-mahazyn/"]'); if (!menuItem) return; menuItem.setAttribute('data-rating', ratingValue); } if (cachedRating && cachedTime && (now - cachedTime < ONE_DAY)) { applyRating(cachedRating); } else { fetch('/vidhuky-pro-mahazyn/') .then(response => response.text()) .then(html => { const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); const scoreElement = doc.querySelector('.store-reviews__rating-value'); if (scoreElement) { const rawText = scoreElement.innerText.replace(',', '.'); const ratingMatch = rawText.match(/\d+(\.\d+)?/); if (ratingMatch) { const finalRating = ratingMatch[0]; localStorage.setItem(CACHE_KEY, finalRating); localStorage.setItem(CACHE_TIME_KEY, now); applyRating(finalRating); } } }) .catch(err => console.error(err)); } } async function addCartProductOptions() { const SPECIAL_FEATURES = [ { label: 'Webasto', test: /webasto/i }, { label: 'EcoBoost', test: /eco\s*boost/i } ]; const PRODUCT_LINES_REGEXP = /\b(Standart|ALuOX|ZiPoFlex|WhiteCover)\b/g; function getSpecialFeatures(title = '') { return SPECIAL_FEATURES.filter(feature => feature.test.test(title)).map(feature => feature.label); } function splitKolchugaTitle(title) { const normalizedTitle = String(title || '').trim().replace(/\s+/g, ' '); const match = normalizedTitle.match(/^(.*?)\s+для\s+(.*?)\s+KOLCHUGA\s*(.*)$/i); if (!match) return { zone: '', car: '', line: '' }; return { zone: match[1].trim(), car: match[2].trim(), line: match[3].trim() }; } function getFeatureNote(note = '', title = '') { note = String(note || '').trim(); const tags = getSpecialFeatures(title).filter(label => { const feature = SPECIAL_FEATURES.find(f => f.label === label); return feature && !feature.test.test(note); }); return [...tags, note].filter(Boolean).join(', '); } function createSpecsFromAlt(alt) { const parts = String(alt || '').split('##SPECS##'); if (parts.length < 2) return null; const titlePart = parts[0] || ''; const specs = parts[1].split('|').map(item => item.trim()).filter(Boolean); if (!specs.length) return null; const wrapper = document.createElement('div'); wrapper.className = 'catalog-card-specs cart-card-specs'; specs.forEach(spec => { const separatorIndex = spec.indexOf(':'); if (separatorIndex === -1) return; const name = spec.slice(0, separatorIndex).trim(); let value = spec.slice(separatorIndex + 1).trim(); if (!name || !value) return; const nameLower = name.toLowerCase(); if (nameLower.includes('примітка') || nameLower.includes('примечание')) { value = getFeatureNote(value, titlePart); } const item = document.createElement('div'); item.className = 'catalog-card-specs__item'; const nameEl = document.createElement('div'); nameEl.className = 'catalog-card-specs__name'; nameEl.textContent = name; const valueEl = document.createElement('div'); valueEl.className = 'catalog-card-specs__value'; valueEl.textContent = value; item.append(nameEl, valueEl); wrapper.append(item); }); return wrapper.children.length ? wrapper : null; } function insertSpecs({ item, imgSelector, titleSelector, source }) { const img = item.querySelector(imgSelector); const title = item.querySelector(titleSelector); if (!img?.alt || !title) return; const alt = img.alt; const existingBlock = item.querySelector(`.cart-card-specs[data-specs-source="${source}"]`); if (existingBlock?.dataset.specsAlt === alt) return; if (existingBlock) { existingBlock.remove(); } const specsBlock = createSpecsFromAlt(alt); if (!specsBlock) return; specsBlock.dataset.specsSource = source; specsBlock.dataset.specsAlt = alt; title.insertAdjacentElement('afterend', specsBlock); } function formatProductLineTitle(title) { if (!title) return; const rawText = title.textContent.trim(); if (!rawText || title.dataset.formattedTitle === rawText) return; title.innerHTML = rawText.replace(PRODUCT_LINES_REGEXP, '$1'); title.dataset.formattedTitle = rawText; } function trimRecommendedTitle(link, uniqueCarCount, lineCount) { if (!link) return; const rawText = link.textContent.trim(); if (!rawText) return; let shortText = rawText; if (uniqueCarCount === 1) shortText = shortText.replace(/\s+для[\s\S]*?(?=\s+KOLCHUGA\b)/i, '').trim(); if (lineCount === 1) shortText = shortText.replace(/\s+KOLCHUGA\b[\s\S]*$/i, '').trim(); shortText = shortText.replace(/\s+KOLCHUGA\b/i, '').trim(); if (!shortText || shortText === rawText) return; link.dataset.originalTitle = rawText; link.textContent = shortText; } function initCartOptions() { const cart = document.querySelector('#cart'); if (!cart) return; const itemInfo = []; const uniqueCars = new Set(); const uniqueLine = new Set(); let notHide; const items = cart.querySelectorAll('.cart-item'); items.forEach(item => { const title = item.querySelector('.cart-title, .cart-item__title a'); const titleText = title ? title.textContent.trim() : ''; const itemInfoEntry = splitKolchugaTitle(titleText); itemInfo.push(itemInfoEntry); uniqueCars.add(itemInfoEntry.car); uniqueLine.add(itemInfoEntry.line); formatProductLineTitle(title); insertSpecs({ item, imgSelector: '.cart-image img[alt], img[alt]', titleSelector: '.cart-title, .cart-item__title a', source: 'cart-item' }); }); const recommendedItems = cart.querySelectorAll('.cart-recommended-items .productsSlider-i, .cart__related-goods .carousel__item'); recommendedItems.forEach(item => { item?.classList?.remove('hide'); const titleLink = item.querySelector('.productsSlider-title .a-link, .catalog-card__title .link'); const titleText = titleLink ? (titleLink.dataset.originalTitle || titleLink.textContent.trim()) : ''; const { zone, car, line } = splitKolchugaTitle(titleText); const itemInfoEntry = itemInfo.find(info => (info.zone.includes('двиг') && zone.includes('двиг') || info.zone.replace(/[АМ]КПП/gi, 'КПП') == zone.replace(/[АМ]КПП/gi, 'КПП')) && info.car === car && info.line === line); if (itemInfoEntry) { item?.classList?.add('hide'); return; } notHide = true; trimRecommendedTitle(titleLink, uniqueCars.size, uniqueLine.size); formatProductLineTitle(titleLink) insertSpecs({ item, imgSelector: '.productsSlider-image img[alt], img[alt]', titleSelector: '.productsSlider-title, .catalog-card__title .link', source: 'recommended-item' }); }); if (!notHide) { cart.querySelector('.cart-recommended, .cart__related-goods')?.classList?.add('hide'); } else { cart.querySelector('.cart-recommended, .cart__related-goods')?.classList?.remove('hide'); } const recommendedHead = cart.querySelector('.cart-recommended .h3, .cart__related-goods .heading'); if (uniqueCars.size === 1) { const soloCar = uniqueCars.values().next().value; if (recommendedHead && uniqueCars && !recommendedHead.textContent.includes(soloCar)) { recommendedHead.textContent += ` для ${soloCar}`; } } } let initFrame = null; let cartObserver = null; let observedCart = null; function scheduleInit() { if (initFrame) cancelAnimationFrame(initFrame); initFrame = requestAnimationFrame(() => { initFrame = null; if (cartObserver) { cartObserver.disconnect(); } initCartOptions(); if (cartObserver && observedCart?.isConnected) { cartObserver.observe(observedCart, { childList: true, subtree: true }); } }); } function startCartObserver() { CustomApp.waitForElement('#cart').then(cart => { if (!cart) return; observedCart = cart; cartObserver = new MutationObserver(() => { scheduleInit(); }); cartObserver.observe(cart, { childList: true, subtree: true }); scheduleInit(); }); } startCartObserver(); } async function warmMenu() { try { const menus = ['menu', 'catalog-navigation']; async function waitApi(name, timeout = 5000) { const start = Date.now(); while (Date.now() - start < timeout) { const api = window.App?.mmenu?.getAPI?.(name); if (api) return api; await CustomApp.delay(100); } return null; } for (const name of menus) { const apiWarm = await waitApi(name); if (!apiWarm) continue; apiWarm.close(); if (name === 'menu') { window.App?.mmenu?.bindFirstOpenEvent?.(name, function () { window.App?.MenuExpander?.batchCreate?.(['#' + name + ' .j-catalog-nav']); }); } } } catch (e) { console.error(e); } } async function initPopUpBackButton() { const stack = []; let lvl = 0; function isMmenuOpen() { return !!document.documentElement.classList.contains('mm-opening'); } function getMmenuLevel(classList) { if (classList.contains('mm-highest')) lvl++; if (classList.contains('mm-opened')) lvl--; return lvl; } function isPhotoSwipeOpen() { return !!document.querySelector('.pswp.pswp--visible'); } function isLineupPopUpOpen() { return !!document.querySelector('.lineup-select.is-open'); } function isModalsOpen() { return !!document.querySelector('.modal.is-visible.is-active'); } function isSalesDriveOpen() { return !!document.querySelector('.salesdrive-button-holder_open'); } function isRingostatOpen() { const btn = document.querySelector('.rngst_phone_button'); if (!btn) return false; return getComputedStyle(btn).display === 'none'; } function closePhotoSwipe() { if (!isPhotoSwipeOpen()) return; document.activeElement?.blur?.(); const btn = document.querySelector('.pswp__button--close'); if (btn) { btn.click(); } else { document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', code: 'Escape', keyCode: 27, bubbles: true })); } } function closeLineupPopUp() { if (!isLineupPopUpOpen()) return; document.activeElement?.blur?.(); const btn = document.querySelector('.lineup-select__close'); if (btn) { btn.click(); } else { document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', code: 'Escape', keyCode: 27, bubbles: true })); } } function closeModals() { if (!isModalsOpen()) return; document.activeElement?.blur?.(); const btn = document.querySelector('.modal.is-visible.is-active [data-modal-close]'); if (btn) return btn.click(); } function closeSalesDrive() { if (!isSalesDriveOpen()) return; document.activeElement?.blur?.(); const btn = document.querySelector('.salesdrive-tools-close'); if (btn) return btn.click(); } function closeMmenu(lvl) { if (!isMmenuOpen()) return; document.activeElement?.blur?.(); const currentElement = document.querySelector('.mm-menu.mm-opened').querySelector('.mm-current'); const btn = lvl > 1 ? currentElement.querySelector('.mm-btn.mm-prev') : currentElement.querySelector('[data-panel-close]'); if (btn) return btn.click(); } function closeRingostat() { if (!isRingostatOpen()) return; document.activeElement?.blur?.(); const wrapper = document.querySelector('#wrapper_id'); if (wrapper) wrapper.remove(); const btn = document.querySelector('.rngst_phone_button'); if (btn) btn.style.display = 'block'; } function closeLayer(last) { const { source, event } = last; if (source === 'PhotoViewer') return closePhotoSwipe(); if (source === 'LineupPopUp') return closeLineupPopUp(); if (source === 'Mmenu') return closeMmenu(event); if (source === 'Ringstat') return closeRingostat(); if (source === 'Modals') return closeModals(); if (source === 'SalesDrive') return closeSalesDrive(); } let isManualBack = false; function syncStack(source, event) { const last = stack[stack.length - 1]; if (event === 0) { while (last && stack[stack.length - 1]?.source === source) { stack.pop(); isManualBack = true; if (history.state?.source) history.back(); // console.log('SYNC BACK (manual close):', source); // console.log(...stack); } return; } if (last && last.source === source && last.event === event) return; if (last && source === 'Mmenu' && last.source === source) { if (event < last.event) { stack.pop(); isManualBack = true; if (history.state?.source) history.back(); // console.log('SYNC BACK (manual lvl down):', event); // console.log(...stack); return; } } const layer = { source, event }; stack.push(layer); history.pushState(layer, ''); //console.log('PUSH:', layer); //console.log(...stack); } window.addEventListener('popstate', () => { if (isManualBack) { isManualBack = false; return; } const last = stack.pop(); if (!last) return; // console.log('BACK -> close:', last); closeLayer(last); // console.log(...stack); }); new MutationObserver(() => { const event = isMmenuOpen() ? 1 : 0; lvl = event; syncStack('Mmenu', event); }).observe(document.body, { attributes: true, attributeFilter: ['style'] }); const initMmenuBinding = () => { const MAX_WAIT_MS = 20000; const CHECK_INTERVAL = 250; const menus = ['menu', 'catalog-navigation', 'cart-drawer', 'installments-cart', 'auth', 'contacts', 'comment-add']; const boundMenus = new Set(); menus.forEach(menu => { const start = Date.now(); const waitAndBind = () => { if (boundMenus.has(menu)) return; const api = window.App?.mmenu?.getAPI?.(menu); if (api && typeof api.bind === 'function') { boundMenus.add(menu); api.bind('openPanel', (e) => { if (!isMmenuOpen()) return; const event = getMmenuLevel(e[0].classList); syncStack('Mmenu', event); }); return; } if (Date.now() - start < MAX_WAIT_MS) { setTimeout(waitAndBind, CHECK_INTERVAL); } }; waitAndBind(); }); }; CustomApp.waitForElement('.lineup-select').then(lineupButton => { if (lineupButton) { new MutationObserver(() => { const event = isLineupPopUpOpen() ? 1 : 0; syncStack('LineupPopUp', event); }).observe(lineupButton, { attributes: true, attributeFilter: ['class'] }); } }); CustomApp.waitForElement('.rngst_phone_button').then(ringBtn => { if (!ringBtn) return; new MutationObserver(() => { const event = isRingostatOpen() ? 1 : 0; syncStack('Ringstat', event); }).observe(ringBtn, { attributes: true, attributeFilter: ['style'] }); }); CustomApp.waitForElement('.salesdrive-button-holder.salesdrive-button-holder_bottom_right').then(salesDriveBtn => { if (!salesDriveBtn) return; new MutationObserver(() => { const event = isSalesDriveOpen() ? 1 : 0; syncStack('SalesDrive', event); }).observe(salesDriveBtn, { attributes: true, attributeFilter: ['class'] }); }); initMmenuBinding(); const pswp = document.querySelector('.pswp'); if (pswp) { new MutationObserver(() => { const event = isPhotoSwipeOpen() ? 1 : 0; syncStack('PhotoViewer', event); }).observe(pswp, { attributes: true, attributeFilter: ['class'] }); } const modals = [...document.querySelectorAll('.modal')]; if (modals.length) { modals.forEach(modal => { new MutationObserver((e) => { const eventClasses = e[0]?.target?.classList; if (eventClasses?.contains('is-hidden')) return; const event = eventClasses.contains('is-visible') ? 1 : 0; syncStack('Modals', event); }).observe(modal, { attributes: true, attributeFilter: ['class'] }); }) } } function initMenuLevels(attempts = 0) { const MAX_ATTEMPTS = 30; const MENUS = ['menu', 'catalog-navigation']; function getPanelLevel(root, panel) { let level = 1; let current = panel; while (current) { const prev = current.querySelector('.mm-prev, .mm-btn--prev, [data-panel-prev]'); if (!prev) break; const href = prev.getAttribute('href'); if (!href) { level++; break; } const parent = root.querySelector(href); if (!parent || parent === current) { level++; break; } current = parent; level++; } return level; } function markPanel(root, panel) { if (!panel) return; const level = getPanelLevel(root, panel); panel.classList.remove('level-1', 'level-2', 'level-3', 'level-4', 'level-5'); panel.classList.add(`level-${level}`); } let hasReadyMenu = false; MENUS.forEach(name => { const root = document.querySelector('#' + name); const api = window.App?.mmenu?.getAPI?.(name); if (!root || !api) return; hasReadyMenu = true; if (root.dataset.menuLevelsReady === '1') return; root.dataset.menuLevelsReady = '1'; const firstPanel = root.querySelector('div.mm-panel'); markPanel(root, firstPanel); api.bind('openPanel', e => { const panel = e?.[0] || e?.panel || e; if (!panel || !panel.classList) return; markPanel(root, panel); }); }); if (!hasReadyMenu && attempts < MAX_ATTEMPTS) { setTimeout(() => { initMenuLevels(attempts + 1); }, 250); } } function fixFooter() { const footer = document.querySelector('.footer__development, .footer__bottom'); if (footer) footer.removeAttribute('style'); } })();