$w.onReady(function () { const toNum = (v) => Number(String(v ?? "").replace(",", ".")); const r0 = (x) => Math.round(+x); // bar interi const r2 = (x) => (Math.round((+x) * 100) / 100).toFixed(2); // 2 decimali (% precise) $w("#button1").onClick(() => { // --- Input --- const V = toNum($w("#input6").value); const xEAN = toNum($w("#input5").value) / 100; // Current mix const O2v = toNum($w("#input4").value) / 100; const Hev = toNum($w("#input7").value) / 100; const P0 = toNum($w("#input8").value); // Target mix const O2t = toNum($w("#input9").value) / 100; const Het = toNum($w("#input10").value) / 100; const Pt = toNum($w("#input11").value); // --- Validations --- if ([xEAN,O2v,Hev,P0,O2t,Het,Pt].some(isNaN)) { $w("#text17").text = "Error: please fill all numeric fields."; return; } if (O2v + Hev > 1 || O2t + Het > 1) { $w("#text17").text = "Error: O2% + He% must be ≤ 100%."; return; } if (Pt <= P0) { $w("#text17").text = "Error: target pressure must be higher than current pressure."; return; } // --- Initial partial pressures --- const O2pp0 = P0 * O2v; const Hepp0 = P0 * Hev; const N2pp0 = P0 * (1 - O2v - Hev); // 1) Helium const He_pp_tar = Pt * Het; let addHe = He_pp_tar - Hepp0; if (addHe < -1e-9) { $w("#text17").text = "Impossible: current He already above target."; return; } addHe = Math.max(0, addHe); const P1 = P0 + addHe; // 2) Oxygen let addO2; if (Math.abs(1 - xEAN) < 1e-9) { addO2 = Pt * O2t - O2pp0; } else { addO2 = (Pt*O2t - O2pp0 - xEAN*Pt + xEAN*P1) / (1 - xEAN); } if (addO2 < -1e-9) addO2 = 0; const P2 = P1 + addO2; // 3) Air/EAN const addEAN = Pt - P2; if (addEAN < -1e-9) { $w("#text17").text = "Impossible: overshoot final pressure."; return; } // --- Final mix check --- const O2ppF = O2pp0 + addO2 + addEAN * xEAN; const HeppF = Hepp0 + addHe; const N2ppF = N2pp0 + addEAN * (1 - xEAN); const O2f = O2ppF / Pt; const Hef = HeppF / Pt; const N2f = 1 - O2f - Hef; // Rounded values for steps const heBars = r0(addHe); const o2Bars = r0(addO2); const eanBars = r0(addEAN); const pStart = r0(P0); const pAfterHe= r0(P0 + addHe); const pAfterO2= r0(P1 + addO2); const pFinal = r0(Pt); // Output const line1 = `STEP 1 — Helium (He): add ${heBars} bar → from ${pStart} to ${pAfterHe} bar \n`; const line2 = `STEP 2 — Oxygen (O₂): add ${o2Bars} bar → from ${pAfterHe} to ${pAfterO2} bar \n`; const line3 = `STEP 3 — Air/EAN (${(xEAN*100).toFixed(0)}% O₂): add ${eanBars} bar → from ${pAfterO2} to ${pFinal} bar \n`; $w("#text17").text = `${line1}\n${line2}\n${line3}\n\n` + `Final mix @ ${pFinal} bar:\n` + `• O₂ ≈ ${r2(O2f*100)}% | He ≈ ${r2(Hef*100)}% | N₂ ≈ ${r2(N2f*100)}%`; }); });