Files
Autoparts-DB/dashboard/catalog-public.min.js
consultoria-as 21959f1b37 FASE 7d: Lazy Loading + Minificación + Auto-serve minified
Cambios implementados:

1. Lazy loading de imágenes:
   - catalog.js: loading="lazy" decoding="async" en part cards y detail panel
   - inventory.js: lazy loading en imagen de detalle de item

2. Minificación de assets:
   - scripts/minify-assets.sh: minifica JS (terser) y CSS para POS y Dashboard
   - 25 archivos .min.js + 5 .min.css generados en pos/static/
   - 14 archivos .min.js + 8 .min.css generados en dashboard/

3. Nginx auto-serve minified:
   - try_files $1.min.js antes de servir .js original
   - try_files $1.min.css antes de servir .css original
   - Transparente para los templates HTML (cero cambios en HTML)

4. Cache warming script:
   - scripts/warm_vehicle_cache.py: pobla Redis con vehicle info por batches
   - Mitiga DISTINCT ON + 4 JOINs sobre 2B filas
   - Corre en background, procesa ~1.5M parts

Tests: 73/73 pasando
2026-04-27 08:34:24 +00:00

1 line
20 KiB
JavaScript

!function(){"use strict";var e={level:"brands",brand:null,model:null,year:null,engine:null,category:null,group:null,partType:null,nxGroup:null,nxSubgroup:null,nxPartType:null,region:"north-america",mode:"local"===localStorage.getItem("catalog_mode")?"local":"oem",page:1,totalPages:1};function n(){document.querySelectorAll("#modeToggle button").forEach((function(n){n.classList.toggle("is-active",n.getAttribute("data-mode")===e.mode)}))}window.setCatalogMode=function(a){if(("oem"===a||"local"===a)&&a!==e.mode){e.mode=a,localStorage.setItem("catalog_mode",a),n();var t=!(!e.engine||!e.engine.id_mye);if(e.category=e.group=e.partType=null,e.nxGroup=e.nxSubgroup=e.nxPartType=null,e.page=1,t)return e.level="categories",void v();e.brand=e.model=e.year=e.engine=null,e.level="brands",d()}},window.setRegion=function(n){e.region=n,document.querySelectorAll(".region-btn").forEach((function(e){e.classList.toggle("is-active",e.dataset.region===n)})),e.brand=e.model=e.year=e.engine=null,e.category=e.group=e.partType=null,e.nxGroup=e.nxSubgroup=e.nxPartType=null,d()};var a="/api/catalog",t=document.getElementById("content"),r=document.getElementById("breadcrumb"),o=document.getElementById("searchInput"),i=new URLSearchParams(window.location.search).get("brand");n(),i?fetch(a+"/brands?mode="+e.mode).then((function(e){return e.json()})).then((function(n){var a=n.find((function(e){return e.id_brand==i}));a?(e.brand={id:a.id_brand,name:a.name_brand},e.level="models",p()):d()})).catch((function(){d()})):d();var s=document.createElement("div");function l(){var n=[];if(n.push('<a href="javascript:void(0)" onclick="catalogNav(\'brands\')">Catalogo</a>'),e.brand&&(n.push('<span class="sep">/</span>'),n.push('<a href="javascript:void(0)" onclick="catalogNav(\'models\')">'+_(e.brand.name)+"</a>")),e.model&&(n.push('<span class="sep">/</span>'),n.push('<a href="javascript:void(0)" onclick="catalogNav(\'years\')">'+_(e.model.name)+"</a>")),e.year&&(n.push('<span class="sep">/</span>'),n.push('<a href="javascript:void(0)" onclick="catalogNav(\'engines\')">'+_(String(e.year.value))+"</a>")),e.engine){n.push('<span class="sep">/</span>');var a=e.engine.name+(e.engine.trim?" ("+e.engine.trim+")":"");n.push('<a href="javascript:void(0)" onclick="catalogNav(\'categories\')">'+_(a)+"</a>")}e.nxGroup?(n.push('<span class="sep">/</span>'),n.push('<a href="javascript:void(0)" onclick="catalogNav(\'nx_subgroups\')">'+_(e.nxGroup.name)+"</a>")):e.category&&(n.push('<span class="sep">/</span>'),n.push('<a href="javascript:void(0)" onclick="catalogNav(\'groups\')">'+_(e.category.name)+"</a>")),e.nxSubgroup?(n.push('<span class="sep">/</span>'),e.nxPartType?n.push('<a href="javascript:void(0)" onclick="catalogNav(\'nx_part_types\')">'+_(e.nxSubgroup.name)+"</a>"):n.push("<span>"+_(e.nxSubgroup.name)+"</span>")):e.group&&(n.push('<span class="sep">/</span>'),e.partType?n.push('<a href="javascript:void(0)" onclick="catalogNav(\'part_types\')">'+_(e.group.name)+"</a>"):n.push("<span>"+_(e.group.name)+"</span>")),e.nxPartType?(n.push('<span class="sep">/</span>'),n.push("<span>"+_(e.nxPartType.name)+"</span>")):e.partType&&(n.push('<span class="sep">/</span>'),n.push("<span>"+_(e.partType.name)+"</span>")),"search"===e.level&&(n.push('<span class="sep">/</span>'),n.push("<span>Busqueda</span>")),r.innerHTML=n.join("")}function c(){e.category=e.group=e.partType=null,e.nxGroup=e.nxSubgroup=e.nxPartType=null}function d(){e.level="brands",l(),t.innerHTML='<div class="loading">Cargando marcas...</div>',fetch(a+"/brands?region="+(e.region||"north-america")+"&mode="+e.mode).then((function(e){return e.json()})).then((function(e){var n='<h2>Selecciona una Marca</h2><div class="nav-grid">';e.forEach((function(e){n+='<div class="nav-card" onclick="selectBrand('+e.id_brand+",'"+x(e.name_brand)+"')\">",n+='<span class="name">'+_(e.name_brand)+"</span>",n+="</div>"})),n+="</div>",t.innerHTML=n})).catch((function(){t.innerHTML='<div class="empty">Error cargando marcas.</div>'}))}function p(){l(),t.innerHTML='<div class="loading">Cargando modelos...</div>',fetch(a+"/models?brand_id="+e.brand.id).then((function(e){return e.json()})).then((function(n){var a="<h2>"+_(e.brand.name)+' — Modelos</h2><div class="nav-grid">';n.forEach((function(e){a+='<div class="nav-card" onclick="selectModel('+e.id_model+",'"+x(e.name_model)+"')\">",a+='<span class="name">'+_(e.name_model)+"</span>",a+="</div>"})),a+="</div>",t.innerHTML=a})).catch((function(){t.innerHTML='<div class="empty">Error cargando modelos.</div>'}))}function u(){l(),t.innerHTML='<div class="loading">Cargando anos...</div>',fetch(a+"/years?model_id="+e.model.id).then((function(e){return e.json()})).then((function(n){var a="<h2>"+_(e.brand.name)+" "+_(e.model.name)+' — Anos</h2><div class="nav-grid">';n.forEach((function(e){a+='<div class="nav-card" onclick="selectYear('+e.id_year+","+e.year_car+')">',a+='<span class="name">'+e.year_car+"</span>",a+="</div>"})),a+="</div>",t.innerHTML=a})).catch((function(){t.innerHTML='<div class="empty">Error cargando anos.</div>'}))}function g(){l(),t.innerHTML='<div class="loading">Cargando motores...</div>',fetch(a+"/engines?model_id="+e.model.id+"&year_id="+e.year.id).then((function(e){return e.json()})).then((function(n){var a="<h2>"+_(e.brand.name)+" "+_(e.model.name)+" "+e.year.value+" — Motor</h2>";a+='<div class="nav-grid">',n.forEach((function(e){var n=e.name_engine+(e.trim_level?" ("+e.trim_level+")":"");a+='<div class="nav-card" onclick="selectEngine('+e.id_mye+",'"+x(e.name_engine)+"','"+x(e.trim_level||"")+"')\">",a+='<span class="name">'+_(n)+"</span>",a+="</div>"})),a+="</div>",t.innerHTML=a})).catch((function(){t.innerHTML='<div class="empty">Error cargando motores.</div>'}))}function v(){"local"===e.mode?(e.level="categories",l(),t.innerHTML='<div class="loading">Cargando categorias Local...</div>',fetch(a+"/categories?mode=local&mye_id="+e.engine.id_mye).then((function(e){return e.json()})).then((function(e){var n=e&&e.data||[];if(n.length){var a='<h2>Categorias <span style="font-size:var(--text-body-sm);color:var(--color-text-muted);">(Local · '+n.length+")</span></h2>";a+='<div class="nav-grid">',n.forEach((function(e){a+='<div class="nav-card" onclick="selectNxGroup(\''+x(e.slug)+"','"+x(e.name)+"')\">",a+='<span class="name">'+_(e.name)+"</span>",a+='<span class="count">'+e.part_count+"</span>",a+="</div>"})),a+="</div>",t.innerHTML=a}else t.innerHTML='<h2>Categorias (Local)</h2><div class="empty">Ninguna parte de este vehiculo mapea al catalogo Local.</div>'})).catch((function(){t.innerHTML='<div class="empty">Error cargando categorias Local.</div>'}))):(l(),t.innerHTML='<div class="loading">Cargando categorias...</div>',fetch(a+"/categories?mye_id="+e.engine.id_mye).then((function(e){return e.json()})).then((function(e){if(e.length){var n='<h2>Categorias</h2><div class="nav-grid">';e.forEach((function(e){n+='<div class="nav-card" onclick="selectCategory('+e.id_part_category+",'"+x(e.name)+"')\">",n+='<span class="name">'+_(e.name)+"</span>",n+='<span class="count">'+e.part_count+"</span>",n+="</div>"})),n+="</div>",t.innerHTML=n}else t.innerHTML='<h2>Categorias</h2><div class="empty">No se encontraron categorias con partes para este vehiculo.</div>'})).catch((function(){t.innerHTML='<div class="empty">Error cargando categorias.</div>'})))}function m(){e.level="groups",l(),t.innerHTML='<div class="loading">Cargando subcategorias...</div>';var n=a+"/groups?mode=local&mye_id="+e.engine.id_mye+"&category_slug="+encodeURIComponent(e.nxGroup.slug);fetch(n).then((function(e){return e.json()})).then((function(n){var a=n&&n.data||[];if(a.length){var r="<h2>"+_(e.nxGroup.name)+' <span style="font-size:var(--text-body-sm);color:var(--color-text-muted);">('+a.length+" subcategorias)</span></h2>";r+='<div class="nav-grid">',a.forEach((function(e){r+='<div class="nav-card" onclick="selectNxSubgroup(\''+x(e.slug)+"','"+x(e.name)+"')\">",r+='<span class="name">'+_(e.name)+"</span>",r+='<span class="count">'+e.part_count+"</span>",r+="</div>"})),r+="</div>",t.innerHTML=r}else t.innerHTML="<h2>"+_(e.nxGroup.name)+'</h2><div class="empty">Sin subcategorias.</div>'})).catch((function(){t.innerHTML='<div class="empty">Error cargando subcategorias.</div>'}))}function h(){e.level="part_types",l(),t.innerHTML='<div class="loading">Cargando tipos de parte...</div>';var n=a+"/part-types?mode=local&mye_id="+e.engine.id_mye+"&group_slug="+encodeURIComponent(e.nxGroup.slug)+"&subgroup_slug="+encodeURIComponent(e.nxSubgroup.slug);fetch(n).then((function(e){return e.json()})).then((function(n){var a=n&&n.data||[];if(a.length){if(1===a.length)return e.nxPartType={slug:a[0].slug,name:a[0].name},e.level="parts",e.page=1,void b();var r="<h2>"+_(e.nxSubgroup.name)+' <span style="font-size:var(--text-body-sm);color:var(--color-text-muted);">('+a.length+" tipos)</span></h2>";r+='<div class="nav-grid">',a.forEach((function(e){var n=e.sample_image?'<img src="'+_(e.sample_image)+'" alt="" style="width:24px;height:24px;object-fit:contain;margin-right:6px;vertical-align:middle;" onerror="this.style.display=\'none\'">':"";r+='<div class="nav-card" onclick="selectNxPartType(\''+x(e.slug)+"','"+x(e.name)+"')\">",r+='<span class="name">'+n+_(e.name)+"</span>",r+='<span class="count">'+e.variant_count+"</span>",r+="</div>"})),r+="</div>",t.innerHTML=r}else t.innerHTML="<h2>"+_(e.nxSubgroup.name)+'</h2><div class="empty">Sin tipos de parte.</div>'})).catch((function(){t.innerHTML='<div class="empty">Error cargando tipos de parte.</div>'}))}function y(){l(),t.innerHTML='<div class="loading">Cargando grupos...</div>',fetch(a+"/groups?mye_id="+e.engine.id_mye+"&category_id="+e.category.id).then((function(e){return e.json()})).then((function(n){if(n.length){var a="<h2>"+_(e.category.name)+'</h2><div class="nav-grid">';n.forEach((function(e){a+='<div class="nav-card" onclick="selectGroup('+e.id_part_group+",'"+x(e.name)+"')\">",a+='<span class="name">'+_(e.name)+"</span>",a+='<span class="count">'+e.part_count+"</span>",a+="</div>"})),a+="</div>",t.innerHTML=a}else t.innerHTML="<h2>"+_(e.category.name)+'</h2><div class="empty">No se encontraron sub-grupos.</div>'})).catch((function(){t.innerHTML='<div class="empty">Error cargando grupos.</div>'}))}function f(){e.level="part_types",l(),t.innerHTML='<div class="loading">Cargando tipos de parte...</div>',fetch(a+"/part-types?mye_id="+e.engine.id_mye+"&group_id="+e.group.id).then((function(e){return e.json()})).then((function(n){var a=n.data||[];if(!a.length)return e.level="parts",e.page=1,void b();if(1===a.length)return e.partType={slug:a[0].slug,name:a[0].name},e.level="parts",e.page=1,void b();var r="<h2>"+_(e.group.name)+' <span style="font-size:var(--text-body-sm);color:var(--color-text-muted);">('+a.length+" tipos)</span></h2>";r+='<div class="nav-grid">',a.forEach((function(e){var n=e.sample_image?'<img src="'+_(e.sample_image)+'" alt="" style="width:24px;height:24px;object-fit:contain;margin-right:6px;vertical-align:middle;" onerror="this.style.display=\'none\'">':"";r+='<div class="nav-card" onclick="selectPartType(\''+x(e.slug)+"','"+x(e.name)+"')\">",r+='<span class="name">'+n+_(e.name)+"</span>",r+='<span class="count">'+e.variant_count+"</span>",r+="</div>"})),r+="</div>",t.innerHTML=r})).catch((function(){t.innerHTML='<div class="empty">Error cargando tipos de parte.</div>'}))}function b(){var n;if(l(),t.innerHTML='<div class="loading">Cargando partes...</div>',e.nxGroup&&e.nxSubgroup&&e.nxPartType)n=a+"/parts?mode=local&mye_id="+e.engine.id_mye+"&page="+e.page+"&nexpart_group="+encodeURIComponent(e.nxGroup.slug)+"&nexpart_subgroup="+encodeURIComponent(e.nxSubgroup.slug)+"&nexpart_part_type="+encodeURIComponent(e.nxPartType.slug);else{var r=e.partType?"&part_type="+encodeURIComponent(e.partType.slug):"";n=a+"/parts?mye_id="+e.engine.id_mye+"&group_id="+e.group.id+"&page="+e.page+"&mode="+e.mode+r}var o=e.nxPartType?e.nxPartType.name:e.nxSubgroup?e.nxSubgroup.name:e.partType?e.partType.name:e.group?e.group.name:"Partes";fetch(n).then((function(e){return e.json()})).then((function(n){var a=n.data,r=n.pagination;e.totalPages=r.total_pages;var i="local"===e.mode;if(a.length){var s="<h2>"+_(o)+' <span style="font-size:var(--text-body-sm);color:var(--color-text-muted);">('+r.total+" partes)</span></h2>";s+='<div class="parts-list">',a.forEach((function(e){var n="";if(i&&(1===e.priority_tier?n=" part-row--tier1":2===e.priority_tier&&(n=" part-row--tier2")),s+='<div class="part-row'+n+'">',s+="<div>",i&&e.manufacturer){var a=1===e.priority_tier?'<span class="manu-tier">&#9733;</span>':"";s+='<div class="part-manu"><span class="manu-name">'+_(e.manufacturer)+"</span>"+a+"</div>"}i&&e.part_number?s+='<div class="part-oem">'+_(e.part_number)+'<span class="part-oem-sub"> &middot; OEM: '+_(e.oem_part_number)+"</span></div>":s+='<div class="part-oem">'+_(e.oem_part_number)+"</div>",s+='<div class="part-name">'+_(e.name||"")+"</div>",e.description&&(s+='<div class="part-desc">'+_(e.description)+"</div>"),i&&(e.in_stock_network?s+='<div class="part-stock part-stock--yes">En stock en '+e.bodega_count+" bodega"+(e.bodega_count>1?"s":"")+"</div>":s+='<div class="part-stock part-stock--no">Consultar disponibilidad</div>'),s+='<button class="part-detail-btn" onclick="openDetail('+e.id_part+')">Ver detalle y alternativas</button>',s+="</div>",e.image_url&&(s+='<img class="part-img" src="'+_(e.image_url)+'" alt="" loading="lazy" onerror="this.style.display=\'none\'">'),s+="</div>"})),s+="</div>",r.total_pages>1&&(s+='<div class="pagination">',s+="<button "+(e.page<=1?"disabled":'onclick="partsPage('+(e.page-1)+')"')+">&laquo; Anterior</button>",s+="<button disabled>Pagina "+e.page+" de "+r.total_pages+"</button>",s+="<button "+(e.page>=r.total_pages?"disabled":'onclick="partsPage('+(e.page+1)+')"')+">Siguiente &raquo;</button>",s+="</div>"),t.innerHTML=s}else t.innerHTML="<h2>"+_(o)+'</h2><div class="empty">No se encontraron partes.</div>'})).catch((function(){t.innerHTML='<div class="empty">Error cargando partes.</div>'}))}function _(e){if(!e)return"";var n=document.createElement("div");return n.textContent=e,n.innerHTML}function x(e){return _(e).replace(/'/g,"\\'").replace(/"/g,"&quot;")}s.style.cssText="display:none;padding:3px 10px;font-size:12px;color:var(--color-text-accent);background:var(--color-primary-muted);border:1px dashed var(--color-border-accent);border-radius:4px;margin-top:4px;",o.parentElement.after(s),o.addEventListener("input",(function(){var e=this.value.trim();if(e.length>=3){var n=function(e){if(!e)return"keyword";var n=e.trim(),a=n.replace(/[\s\-]/g,"").toUpperCase();if(/^[A-HJ-NPR-Z0-9]{17}$/.test(a))return"vin";if(/^[A-Z]{3}[-\s]?\d{3,4}$/.test(n.toUpperCase()))return"plate";if(/[a-z]/.test(n))return"keyword";var t=n.split(/\s+/);if(t.some((function(e){return/^(19|20)\d{2}$/.test(e)}))&&t.length>1)return"keyword";var r=n.toUpperCase();return/^[A-Z0-9]{2,}[\-\/][A-Z0-9]{2,}([\-\/][A-Z0-9]+)*$/.test(r)&&a.length>=6||t.length>=2&&t.every((function(e){return/^[A-Z0-9]{1,}$/.test(e)}))&&a.length>=6||/^[A-Z0-9]{8,}$/.test(a)&&/[A-Z]/.test(a)&&/\d/.test(a)?"part_number":"keyword"}(e),a={vin:"🚗 VIN detectado",plate:"🔖 Placa detectada",part_number:"🔩 Numero de parte",keyword:null};a[n]?(s.textContent=a[n],s.style.display=""):s.style.display="none"}else s.style.display="none"})),o.addEventListener("keydown",(function(e){"Enter"===e.key&&doSearch()})),window.toggleTheme=function(){var e=document.documentElement,n="industrial"===e.getAttribute("data-theme")?"modern":"industrial";e.setAttribute("data-theme",n),localStorage.setItem("nexus-theme",n)},window.doSearch=function(){var n=o.value.trim();!n||n.length<2||(e.level="search",l(),t.innerHTML='<div class="loading">Buscando...</div>',fetch(a+"/search?q="+encodeURIComponent(n)).then((function(e){return e.json()})).then((function(e){!function(e){if(l(),!e.length)return void(t.innerHTML='<h2>Busqueda</h2><div class="empty">No se encontraron resultados.</div>');var n="<h2>Resultados ("+e.length+')</h2><div class="parts-list">';e.forEach((function(e){n+='<div class="part-row">',n+="<div>",n+='<div class="part-oem">'+_(e.oem_part_number)+"</div>",n+='<div class="part-name">'+_(e.name||"")+"</div>",e.vehicle_info&&(n+='<div class="part-desc">'+_(e.vehicle_info)+"</div>"),n+='<button class="part-detail-btn" onclick="openDetail('+e.id_part+')">Ver detalle y alternativas</button>',n+="</div>",e.image_url&&(n+='<img class="part-img" src="'+_(e.image_url)+'" alt="" loading="lazy" onerror="this.style.display=\'none\'">'),n+="</div>"})),n+="</div>",t.innerHTML=n}(e)})).catch((function(){t.innerHTML='<div class="empty">Error en la busqueda.</div>'})))},window.openDetail=function(e){var n=document.getElementById("detailModal"),t=document.getElementById("detailBody");t.innerHTML='<div class="loading">Cargando detalle...</div>',n.classList.add("open"),fetch(a+"/part/"+e).then((function(e){return e.json()})).then((function(e){!function(e,n){if(!e||!e.part)return void(n.innerHTML='<div class="empty">Parte no encontrada.</div>');var a=e.part,t="";t+='<div class="part-oem" style="font-size:var(--text-h5)">'+_(a.oem_part_number)+"</div>",t+='<div class="part-name" style="font-size:var(--text-h4);margin-top:var(--space-2)">'+_(a.name||"")+"</div>",a.category_name&&(t+='<div class="part-desc">'+_(a.category_name)+(a.group_name?" / "+_(a.group_name):"")+"</div>");a.description&&(t+='<div class="part-desc" style="margin-top:var(--space-3)">'+_(a.description)+"</div>");a.image_url&&(t+='<div style="margin-top:var(--space-4);text-align:center">',t+='<img src="'+_(a.image_url)+'" alt="" style="max-width:300px;border-radius:var(--radius-md)" onerror="this.style.display=\'none\'">',t+="</div>");e.alternatives&&e.alternatives.length&&(t+='<div class="detail-section">',t+="<h4>Alternativas y Cross-References ("+e.alternatives.length+")</h4>",t+='<table class="alt-table"><thead><tr><th>Numero</th><th>Fabricante</th><th>Nombre</th><th>Tipo</th></tr></thead><tbody>',e.alternatives.forEach((function(e){t+="<tr>",t+='<td style="font-family:var(--font-mono)">'+_(e.part_number||"")+"</td>",t+="<td>"+_(e.manufacturer||"")+"</td>",t+="<td>"+_(e.name||"-")+"</td>",t+="<td>"+_("aftermarket"===e.type?"Aftermarket":"Cross-Ref")+"</td>",t+="</tr>"})),t+="</tbody></table></div>");e.bodegas&&e.bodegas.length&&(t+='<div class="detail-section">',t+="<h4>Disponibilidad en Bodegas ("+e.bodegas.length+")</h4>",t+='<table class="alt-table"><thead><tr><th>Bodega</th><th>Stock</th><th>Ubicacion</th></tr></thead><tbody>',e.bodegas.forEach((function(e){t+="<tr>",t+="<td>"+_(e.business_name||"")+"</td>",t+="<td>"+e.stock+"</td>",t+="<td>"+_(e.location||"-")+"</td>",t+="</tr>"})),t+="</tbody></table></div>");n.innerHTML=t}(e,t)})).catch((function(){t.innerHTML='<div class="empty">Error cargando detalle.</div>'}))},window.closeDetail=function(){document.getElementById("detailModal").classList.remove("open")},document.getElementById("detailModal").addEventListener("click",(function(e){e.target===this&&closeDetail()})),window.catalogNav=function(n){"brands"===n?(e.brand=e.model=e.year=e.engine=null,c(),e.level="brands",d()):"models"===n?(e.model=e.year=e.engine=null,c(),e.level="models",p()):"years"===n?(e.year=e.engine=null,c(),e.level="years",u()):"engines"===n?(e.engine=null,c(),e.level="engines",g()):"categories"===n?(c(),e.level="categories",v()):"groups"===n?(e.group=e.partType=null,e.level="groups",y()):"part_types"===n?(e.partType=null,e.level="part_types",f()):"nx_subgroups"===n?(e.nxSubgroup=e.nxPartType=null,e.level="groups",m()):"nx_part_types"===n&&(e.nxPartType=null,e.level="part_types",h())},window.selectBrand=function(n,a){e.brand={id:n,name:a},e.level="models",p()},window.selectModel=function(n,a){e.model={id:n,name:a},e.level="years",u()},window.selectYear=function(n,a){e.year={id:n,value:a},e.level="engines",g()},window.selectEngine=function(n,a,t){e.engine={id_mye:n,name:a,trim:t},e.level="categories",v()},window.selectNxGroup=function(n,a){e.nxGroup={slug:n,name:a},e.nxSubgroup=null,e.nxPartType=null,e.level="groups",m()},window.selectNxSubgroup=function(n,a){e.nxSubgroup={slug:n,name:a},e.nxPartType=null,e.level="part_types",h()},window.selectNxPartType=function(n,a){e.nxPartType={slug:n,name:a},e.level="parts",e.page=1,b()},window.selectCategory=function(n,a){e.category={id:n,name:a},e.level="groups",y()},window.selectGroup=function(n,a){e.group={id:n,name:a},e.partType=null,e.level="part_types",f()},window.selectPartType=function(n,a){e.partType={slug:n,name:a},e.level="parts",e.page=1,b()},window.partsPage=function(n){e.page=n,b(),window.scrollTo({top:0,behavior:"smooth"})}}();