{"id":228,"date":"2025-11-10T22:13:02","date_gmt":"2025-11-10T22:13:02","guid":{"rendered":"https:\/\/fans206.com\/?page_id=228"},"modified":"2025-11-10T22:40:07","modified_gmt":"2025-11-10T22:40:07","slug":"228-2","status":"publish","type":"page","link":"https:\/\/fans206.com\/?page_id=228","title":{"rendered":"Equivalencias neum\u00e1ticos"},"content":{"rendered":"    <div class=\"tire-app card\" id=\"tireApp\">\n        <h2>Buscador de neum\u00e1ticos equivalentes<\/h2>\n        <div class=\"card\">\n            <label>Medidas de entrada<\/label>\n            <div id=\"inputList\"><\/div>\n            <div style=\"margin-top:8px;\">\n                <button id=\"addRowBtn\" class=\"ghost\">\u2795 A\u00f1adir medida<\/button>\n            <\/div>\n        <\/div>\n\n        <div class=\"card\">\n            <label>Di\u00e1metros de salida (R13\u2013R22)<\/label>\n            <div class=\"checkboxes\" id=\"diameterCheckboxes\"><\/div>\n        <\/div>\n\n        <textarea id=\"availableList\" style=\"display:none;\"><\/textarea>\n\n        <div class=\"card\" style=\"margin-top:12px;\">\n            <button id=\"runBtn\">\ud83d\udd0e Buscar equivalencias<\/button>\n        <\/div>\n\n        <div class=\"card\">\n            <h3>Resultados<\/h3>\n            <div id=\"resultsInfo\" class=\"result-meta muted\">No se ha buscado todav\u00eda.<\/div>\n            <div id=\"resultsArea\"><\/div>\n        <\/div>\n    <\/div>\n\n    <style>\n    .tire-app{max-width:1000px;margin:18px auto;font-family:Arial,Helvetica,sans-serif;color:#222;}\n    .card{background:#fff;border:1px solid #e7e7e7;padding:14px;border-radius:8px;margin-bottom:12px;box-shadow:0 1px 4px rgba(0,0,0,0.03);}\n    h2{margin:0 0 8px 0;font-size:20px;}\n    label{display:block;margin:6px 0 2px;font-weight:600;font-size:13px;}\n    \n    \/* Fila de medida en una sola l\u00ednea *\/\n    .row{\n        display:flex;\n        gap:6px;\n        align-items:center;\n        margin:6px 0;\n        flex-wrap:nowrap; \/* evita que se rompa en otra l\u00ednea *\/\n    }\n\n    input[type=\"number\"]{\n        width:60px;  \/* m\u00e1s estrecho *\/\n        min-width:50px;\n        padding:6px;\n        border:1px solid #ccc;\n        border-radius:6px;\n        font-size:14px;\n        box-sizing:border-box;\n    }\n\n    .removeBtn{\n        background:#de1b1b;\n        color:white;\n        padding:4px 8px;\n        font-size:12px;\n        border-radius:4px;\n        flex-shrink:0; \/* evita que se reduzca *\/\n    }\n\n    button{background:#0b74de;color:white;padding:6px 10px;border:0;border-radius:6px;cursor:pointer;font-weight:600;font-size:14px;}\n    button.ghost{background:#f1f1f1;color:#222;margin-right:6px;}\n\n    .checkboxes{display:flex;flex-wrap:wrap;gap:6px;}\n    .checkboxes label{display:flex;align-items:center;gap:4px;font-weight:500;}\n    .result-meta{margin-top:8px;font-size:14px;}\n    table{width:100%;border-collapse:collapse;margin-top:10px;font-size:13px;}\n    table th, table td{border:1px solid #e6e6e6;padding:6px 8px;text-align:left;}\n    .muted{color:#666;font-size:13px;}\n\n    \/* Ajuste responsive para m\u00f3viles *\/\n    @media (max-width:480px){\n        input[type=\"number\"]{\n            width:50px;\n            min-width:40px;\n        }\n        .removeBtn{\n            padding:3px 6px;\n            font-size:11px;\n        }\n    }\n    <\/style>\n\n    <script>\n    document.addEventListener('DOMContentLoaded', function() {\n        function el(tag,props){ const e=document.createElement(tag); if(props) Object.assign(e,props); return e;}\n        function computeDiameterMM(w,p,r){return (r*25.4)+2*(w*(p\/100));}\n        function parseTireString(s){if(!s||!s.trim())return null;s=s.trim().replace(\/-\/g,' ');let m=s.match(\/(\\d{2,3})\\s*\\\/\\s*(\\d{2,3})\\s*[Rr]\\s*(\\d{2})\/); if(!m) return null; const w=parseInt(m[1],10),p=parseInt(m[2],10),r=parseInt(m[3],10);if(isNaN(w)||isNaN(p)||isNaN(r))return null; return {width:w,profile:p,rim:r,raw:s};}\n\n        const inputListDiv=document.getElementById('inputList'),\n              diameterCheckboxesDiv=document.getElementById('diameterCheckboxes'),\n              availableListTA=document.getElementById('availableList'),\n              runBtn=document.getElementById('runBtn'),\n              resultsArea=document.getElementById('resultsArea'),\n              resultsInfo=document.getElementById('resultsInfo'),\n              addRowBtn=document.getElementById('addRowBtn');\n\n        const DIAMETERS=Array.from({length:10},(_,i)=>13+i);\n\n        function createInputRow(w,p,r){\n            const container=el('div',{className:'row'});\n            const widthInput=el('input',{type:'number',value:w||195});\n            const profileInput=el('input',{type:'number',value:p||55});\n            const rimInput=el('input',{type:'number',value:r||15});\n            const removeBtn=el('button',{className:'removeBtn',innerText:'\ud83d\uddd1'});\n            removeBtn.addEventListener('click',function(){ container.remove(); });\n            container.appendChild(widthInput);\n            container.appendChild(profileInput);\n            container.appendChild(rimInput);\n            container.appendChild(removeBtn);\n            inputListDiv.appendChild(container);\n        }\n\n        \/\/ Precargamos las 4 medidas\n        createInputRow(195,55,15);\n        createInputRow(205,45,16);\n        createInputRow(195,45,16);\n        createInputRow(185,55,15);\n\n        \/\/ Checkbox de di\u00e1metros\n        DIAMETERS.forEach(d=>{\n            const id=`cb_r${d}`;\n            const lbl=el('label');\n            const cb=el('input'); cb.type='checkbox'; cb.id=id; cb.value=d;\n            if([15,16,17,18,19].includes(d)) cb.checked=true;\n            lbl.appendChild(cb); lbl.appendChild(document.createTextNode(`R${d}`));\n            diameterCheckboxesDiv.appendChild(lbl);\n        });\n\n        \/\/ Listado oculto de medidas realistas\n        const rimsToWidths={13:[125,135,145,155],14:[135,145,155,165,175],15:[155,165,175,185,195,205],16:[165,175,185,195,205,215],17:[175,185,195,205,215,225,235],18:[185,195,205,215,225,235,245],19:[195,205,215,225,235,245,255],20:[205,215,225,235,245,255,265],21:[215,225,235,245,255,265,275],22:[225,235,245,255,265,275,285]};\n        const commonProfiles=[30,35,40,45,50,55,60,65,70,75];\n        let lines=[];\n        Object.keys(rimsToWidths).forEach(rimStr=>{\n            const rim=parseInt(rimStr,10);\n            rimsToWidths[rim].forEach(w=>{\n                const profiles=commonProfiles.filter(p=>{if(rim<=14&&p<50)return false;if(rim>=20&&p<=35)return true;if(w<=155&&p<=35)return false;return true;});\n                profiles.forEach(p=>lines.push(`${w}\/${p} R${rim}`));\n            });\n        });\n        availableListTA.value=lines.join('\\n');\n\n        function gatherInputs(){\n            return Array.from(inputListDiv.querySelectorAll('.row')).map(row=>{\n                const ns=row.querySelectorAll('input[type=\"number\"]');\n                const w=parseInt(ns[0].value,10), p=parseInt(ns[1].value,10), r=parseInt(ns[2].value,10);\n                if(!w||!p||!r) return null;\n                return {width:w,profile:p,rim:r,diameter:computeDiameterMM(w,p,r)};\n            }).filter(Boolean);\n        }\n\n        function gatherSelectedDiameters(){\n            return Array.from(diameterCheckboxesDiv.querySelectorAll('input[type=\"checkbox\"]:checked')).map(i=>parseInt(i.value,10));\n        }\n\n        function parseAvailableList(text){\n            return text.split('\\n').map(parseTireString).filter(Boolean).map(p=>Object.assign({},p,{diameter:computeDiameterMM(p.width,p.profile,p.rim)}));\n        }\n\n        function runSearch(){\n            resultsArea.innerHTML=''; resultsInfo.innerText='';\n            const inputs=gatherInputs(); if(inputs.length===0){alert('No hay medidas'); return;}\n            const diamMin=Math.min(...inputs.map(i=>i.diameter)), diamMax=Math.max(...inputs.map(i=>i.diameter));\n            const selectedRims=gatherSelectedDiameters(); if(selectedRims.length===0){alert('Selecciona al menos un di\u00e1metro'); return;}\n            const avail=parseAvailableList(availableListTA.value);\n            const availFiltered=avail.filter(a=>selectedRims.includes(a.rim));\n            const lower=diamMin*0.97, upper=diamMax*1.03;\n            const matched=availFiltered.filter(c=>c.diameter>=lower && c.diameter<=upper);\n            resultsInfo.innerHTML=`Entradas: ${inputs.length}. Rango diam: ${diamMin.toFixed(1)} \u2014 ${diamMax.toFixed(1)} mm. Resultados: ${matched.length}.`;\n            if(matched.length===0){resultsArea.innerHTML='<div class=\"muted\">No se encontraron equivalencias.<\/div>'; return;}\n            const table=el('table'); const thead=el('thead'); const trh=el('tr'); trh.innerHTML='<th>Medida<\/th><th>Llanta<\/th><th>Di\u00e1metro mm<\/th><th>Medida<\/th>'; thead.appendChild(trh); table.appendChild(thead);\n            const tbody=el('tbody'); matched.forEach(m=>{const tr=el('tr'); tr.innerHTML=`<td>${m.width}\/${m.profile} R${m.rim}<\/td><td>R${m.rim}<\/td><td>${m.diameter.toFixed(1)}<\/td><td>${m.raw}<\/td>`; tbody.appendChild(tr);}); table.appendChild(tbody);\n            resultsArea.appendChild(table);\n        }\n\n        runBtn.addEventListener('click',runSearch);\n        addRowBtn.addEventListener('click',function(){ createInputRow(); });\n    });\n    <\/script>\n    \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-228","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/fans206.com\/index.php?rest_route=\/wp\/v2\/pages\/228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fans206.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/fans206.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/fans206.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fans206.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=228"}],"version-history":[{"count":9,"href":"https:\/\/fans206.com\/index.php?rest_route=\/wp\/v2\/pages\/228\/revisions"}],"predecessor-version":[{"id":245,"href":"https:\/\/fans206.com\/index.php?rest_route=\/wp\/v2\/pages\/228\/revisions\/245"}],"wp:attachment":[{"href":"https:\/\/fans206.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}