(function(){if(window.BMW && window.BMW.loaded){return}var BMW=window.BMW=window.BMW ||{};BMW.loaded=true;BMW.inits=[];BMW.add=function(fn){BMW.inits.push(fn);try{fn()}catch(e){if(window.console){console.warn('BMW init',e)}}};BMW.run=function(){for(var i=0;i=10?Math.round(V):fmt(V,1))+" L à "+d+" m"));var sp=document.createElement("span");sp.appendChild(document.createTextNode("V = 42 ÷ P abs = 42 ÷ "+fmt(P,1)+(d===0?"":" ; l'air se comprime, le volume est divisé par "+fmt(P,1))));cap.appendChild(sp);setVal(pabsEl,fmt(P,1),"bar");setVal(consoEl,String(Math.round(conso)),"L/min");setVal(m12El,fmt(conso/12,1),"bar/min");setVal(m15El,fmt(conso/15,1),"bar/min");setVal(ppo2El,fmt(ppo2,2),"bar");setVal(ppn2El,fmt(ppn2,2),"bar");ppo2El.className="bmw-v"+(ppo2>1.6?" bmw-tox":(ppo2>1.4?" bmw-warn":""));ppo2n.textContent=ppo2>1.6?"TOXICITÉ : au-delà de 1,6 bar !":(ppo2>1.4?"au-delà de la marge de 1,4 bar":"sous la marge de 1,4 bar");var hn=Math.min(GH,ppn2/6*GH),ho=Math.min(GH,ppo2/2*GH);gn2.setAttribute("y",String(GBOT-hn));gn2.setAttribute("height",String(hn));go2.setAttribute("y",String(GBOT-ho));go2.setAttribute("height",String(ho));go2.setAttribute("fill",ppo2>1.6?"#d3534a":(ppo2>1.4?"#e0a800":"#d3534a"));gn2t.textContent=fmt(ppn2,2)+" bar";go2t.textContent=fmt(ppo2,2)+" bar";go2t.setAttribute("fill",ppo2>1.4?(ppo2>1.6?"#d3534a":"#e0a800"):"#182b63");var a=Math.max(0,Math.min(1,(d-30)/10));narcz.setAttribute("opacity",String(0.45*a));narczt.setAttribute("opacity",String(a));narc.className="bmw-narc"+(d>=40?" bmw-narc-on":"");if(d40){cls="bmw-m3";txt="Espace profond (40 à 60 m) : aptitude PA60, directeur de plongée obligatoire, courbe de sécurité ≤ 5 min."}else if(d>20){cls="bmw-m2";txt="Espace lointain (20 à 40 m) : aptitude PA40 (plongeur Niveau 3). Narcose possible dès 30 m."}else{cls="bmw-m1";txt="Espace médian (0 à 20 m) : aptitude PA20, la zone des plongées d'exploration classiques."}msg.className="bmw-msg "+cls;msg.textContent=txt;var bs=btns.querySelectorAll("button");for(var k=0;k1?out+','+parts[1]:out}function mn90(prof){var t=[[20,40],[25,20],[30,10],[35,10],[40,5],[45,5]];for(var i=0;i=1);var lim=mn90(prof);var over=ok&&(lim?tFond>lim.m:true);txt('bmw-air-t-fond',ok?String(tFond):'—');q('bmw-air-t-fond').className='bmw-air-num'+((!ok||over)?' bmw-air-hot':'');txt('bmw-air-t-conso',fmt(consoFond));txt('bmw-air-t-chute',fmt(Math.round(chute*10)/10));txt('bmw-air-t-demi',ok?String(pDemi):'—');txt('bmw-air-t-rem',ok?String(pRem):'—');txt('bmw-air-t-bud',String(budget));q('bmw-air-t-demi').className='bmw-air-num'+(ok?'':' bmw-air-hot');q('bmw-air-t-rem').className='bmw-air-num'+(ok?'':' bmw-air-hot');txt('bmw-air-lg-p',pdep+' bar');txt('bmw-air-lg-d',ok?pDemi+' bar':'—');txt('bmw-air-lg-r',ok?pRem+' bar':'—');var hS=50/pdep*H;var bR=ok?budget:(pdep-50);var hR=bR/pdep*H;var hF=ok?barFond/pdep*H:0;band('bmw-air-band-s',TOP+H-hS,hS);band('bmw-air-band-r',TOP+H-hS-hR,hR);band('bmw-air-band-f',TOP+H-hS-hR-hF,hF);var yS=TOP+H-hS/2,yR=TOP+H-hS-hR/2,yF=TOP+H-hS-hR-hF/2;if(yR>yS-36){yR=yS-36}if(yF>yR-36){yF=yR-36}label('s',yS,'Réserve','50 bar');label('r',yR,'Budget remontée',budget+' bar ('+fmt(volBudget)+' L)');label('f',yF,'Air pour le fond',ok?(fmt(barFond)+' bar · '+tFond+' min'):'0 bar, rien au fond');txt('bmw-air-tank-cap','Bloc '+bloc+' L à '+pdep+' bar, '+prof+' m, '+conso+' L/min');needle('bmw-air-n-p',pdep,82);needle('bmw-air-n-d',ok?pDemi:pdep,74);needle('bmw-air-n-r',ok?pRem:50,66);needle('bmw-air-n-s',50,58);txt('bmw-air-l1','P abs = 1 + '+prof+'/10 = '+fmt(pabs)+' bar. Conso au fond = '+conso+' × '+fmt(pabs)+' = '+fmt(consoFond)+' L/min (le mano chute de '+fmt(Math.round(chute*10)/10)+' bar/min sur un '+bloc+' L).');txt('bmw-air-l2','Volume utilisable = ('+pdep+' − 50) × '+bloc+' = '+fmt(volUtil)+' L.');txt('bmw-air-l3','Remontée à 10 m/min : '+prof+'/10 = '+fmt(tRem)+' min à mi-profondeur ('+fmt(pMoy)+' bar → '+fmt(consoMoy)+' L/min) = '+fmt(volRem)+' L. Paliers : '+pal+' min × '+conso+' × 1,5 = '+fmt(volPal)+' L.');txt('bmw-air-l4','Budget remontée = '+fmt(volRem)+' + '+fmt(volPal)+' = '+fmt(volBrut)+' L ÷ '+bloc+' = '+fmt(Math.round(barBrut*10)/10)+' bar → '+budget+' bar (arrondi au-dessus, au 5 bar lisible sur le mano) = '+fmt(volBudget)+' L.');if(ok){txt('bmw-air-l5','Air pour le fond = '+fmt(volUtil)+' − '+fmt(volBudget)+' = '+fmt(volFond)+' L → '+fmt(volFond)+' ÷ '+fmt(consoFond)+' = '+fmt(Math.round(tFondBrut*10)/10)+' → '+tFond+' min au fond (arrondi en dessous).');txt('bmw-air-l6','Début de remontée = 50 + '+budget+' = '+pRem+' bar. Demi-tour = '+pdep+' − '+fmt(barFond)+'/2 = '+fmt(pdep-barFond/2)+(pDemi!==pdep-barFond/2?' → '+pDemi:'')+' bar.')}else{txt('bmw-air-l5','Air pour le fond = '+fmt(volUtil)+' − '+fmt(volBudget)+' = '+fmt(volFond)+' L : il ne reste rien pour le fond.');txt('bmw-air-l6','Pas de pressions repères : ce profil n’est pas réalisable avec ce bloc.')}setAlert('bmw-air-ko',['Ce profil n’est pas réalisable. ','L’air utilisable ne couvre même pas la remontée et les paliers : réduisez la profondeur, les minutes de paliers, ou prenez un 15 L.'],!ok);var wm=null;if(over){if(lim){wm=['Paliers obligatoires au-delà de '+lim.m+' min à '+lim.d+' m (courbe de sécurité MN90). ','Avec '+tFond+' min au fond, revoyez les minutes de paliers prévues ('+pal+' min) et refaites le calcul.']}else{wm=['Au-delà de 45 m, paliers systématiques (MN90). ','Revoyez les minutes de paliers prévues ('+pal+' min) : elles doivent couvrir les paliers obligatoires.']}}setAlert('bmw-air-warn',wm||['',''],!!wm)}function onRange(r,key){r.addEventListener('input',function(){st[key]=+r.value;render()});r.addEventListener('change',function(){st[key]=+r.value;render()})}onRange(rPdep,'pdep');onRange(rProf,'prof');onRange(rConso,'conso');onRange(rPal,'pal');q('bmw-air-bloc12').addEventListener('click',function(){st.bloc=12;render()});q('bmw-air-bloc15').addEventListener('click',function(){st.bloc=15;render()});render()}var roots=document.querySelectorAll('.bmw-air');for(var i=0;i