(function(){
var $=function(id){return document.getElementById(id)},mode='nat';
document.querySelectorAll('#atool-mode .atool-tab').forEach(function(t){t.addEventListener('click',function(){
document.querySelectorAll('#atool-mode .atool-tab').forEach(function(x){x.classList.remove('on')});t.classList.add('on');mode=t.dataset.m;
$('d-classe-wrap').style.display=mode==='nat'?'':'none'})});
function f2(n){return n.toLocaleString('fr-FR',{minimumFractionDigits:2,maximumFractionDigits:2})}
function f1(n){return n.toLocaleString('fr-FR',{maximumFractionDigits:1})}
function alphaCalc(H,Ef,classe){
var Af=classe===1?9:classe===2?18:36,notes=[];
if(Ef>H/2){notes.push('Ef supérieure à H/2 : le calcul est effectué avec Ef = H/2 = '+f2(H/2)+' m (annexe IT 246).');Ef=H/2}
var grand=function(){return(0.13*4*Math.sqrt(Af)*Math.pow(H-Ef,1.5)*0.6)/(16*Math.sqrt(Ef))};
var petit=function(){return(0.043*Math.pow(H+1.5*Math.sqrt(Af)-Ef,2.5))/(16*Math.sqrt(Ef))};
var Hl=H-Ef,D=Math.sqrt(4*Af/Math.PI),a,formule;
if(classe===3){a=grand();formule='grand feu (obligatoire en classe 3)'}
else if(Hl>2*D){a=petit();formule='petit feu (hauteur libre '+f2(Hl)+' m > 2 × D = '+f2(2*D)+' m)'}
else{a=grand();formule='grand feu (hauteur libre '+f2(Hl)+' m ≤ 2 × D = '+f2(2*D)+' m)'}
return{a:a,Ef:Ef,formule:formule,notes:notes}}
$('d-go').addEventListener('click',function(){
var S=parseFloat(String($('d-surf').value).replace(',','.')),L=parseFloat(String($('d-long').value).replace(',','.')),H=parseFloat(String($('d-h').value).replace(',','.')),EfIn=parseFloat(String($('d-ef').value).replace(',','.')),sit=$('d-sit').value,aveugle=$('d-aveugle').value==='oui',classe=parseInt($('d-classe').value,10),res=$('d-res');
res.style.display='block';
if(!S||!H||(!L&&S>1600)){res.innerHTML='
Paramètres manquants : superficie et hauteur de référence sont nécessaires (et la plus grande dimension pour les grands locaux).
';return}
var etapes=[],warns=[],kpis=[];
var oblig=(sit==='soussol'&&S>100)||(sit!=='soussol'&&S>300)||(aveugle&&S>100);
var obligTxt=oblig?'Désenfumage obligatoire (art. DF 7 § 1) : '+(sit==='soussol'&&S>100?'local de plus de 100 m² en sous-sol':aveugle&&S>100&&!(sit!=='soussol'&&S>300)?'local de plus de 100 m² sans ouverture sur l’extérieur':'local de plus de 300 m² en rez-de-chaussée ou en étage')+'.
':'Désenfumage non exigé par l’article DF 7 pour ce local ('+(sit==='soussol'?'sous-sol ≤ 100 m²':'RDC/étage ≤ 300 m²'+(aveugle?', mais vérifiez le seuil de 100 m² des locaux aveugles':''))+'). Attention : les dispositions particulières du type peuvent l’imposer quand même — le calcul ci-dessous reste indicatif.
';
var nbCantons=1,sCanton=S,lOk=true;
if(S>2000||(L&&L>60)){
var nS=Math.ceil(S/1600),nL=L?Math.ceil(L/60):1;nbCantons=Math.max(nS,nL);sCanton=S/nbCantons;
etapes.push('Local de '+f1(S)+' m²'+(L?' / '+f1(L)+' m':'')+' → découpage en '+nbCantons+' cantons aussi égaux que possible (≤ 1 600 m² et ≤ 60 m chacun), soit ~'+f1(sCanton)+' m² par canton (§ 7.1.2).');
if(sCanton<1000){warns.push('Cantons < 1 000 m² : l’IT 246 demande d’éviter autant que possible les cantons de moins de 1 000 m² — ajustez le découpage à la géométrie réelle.')}}
else{etapes.push('Local de '+f1(S)+' m²'+(L?' / '+f1(L)+' m':'')+' : pas de découpage en cantons exigé (≤ 2 000 m² et ≤ 60 m) (§ 7.1.2).')}
var sansEcran=H>8&&L&&L<=60;
var EfMin=H<=8?0.25*H:2,Ef=EfIn||EfMin;
if(sansEcran&&!EfIn&&nbCantons===1){Ef=1;etapes.push('H > 8 m et plus grande dimension ≤ 60 m : absence d’écran de cantonnement admise, taux α calculé avec Ef = 1 m (§ 7.1.2).')}
else{etapes.push('Épaisseur de fumée retenue : Ef = '+f2(Ef)+' m'+(EfIn?' (valeur saisie)':' (minimum réglementaire : '+(H<=8?'25 % de H':'2 m car H > 8 m')+')')+'.');
if(EfIn&&EfInEf inférieure au minimum : l’épaisseur de couche de fumée doit être ≥ '+f2(EfMin)+' m ('+(H<=8?'25 % de H':'2 m car H > 8 m')+') sauf réduction justifiée par le calcul du taux α (§ 7.1.2).')}}
var Hl=H-Ef;
if(Hl<1.8){warns.push('Hauteur libre de fumée '+f2(Hl)+' m < 1,80 m : la hauteur libre doit rester ≥ 1,80 m, au-dessus du linteau des portes et ≥ H/2 (§ 7.1.2). Réduisez Ef ou revoyez la conception.')}
else if(HlHauteur libre '+f2(Hl)+' m < H/2 : la hauteur libre de fumée est au moins égale à la moitié de la hauteur de référence (§ 7.1.2).')}
if(mode==='nat'){
var res1000=null,sue;
var ac=alphaCalc(H,Ef,classe);ac.notes.forEach(function(n){etapes.push(n)});
if(sCanton<=1000){
sue=sCanton/200;res1000=1000*ac.a/100;
etapes.push('Canton ≤ 1 000 m² : surface utile = 1/200 de la superficie = '+f2(sue)+' m² (§ 7.1.4 1°).');
if(res1000par canton'});
if(nbCantons>1)kpis.push({n:f2(sueTot)+' m²',l:'Surface utile totale
('+nbCantons+' cantons)'});
kpis.push({n:String(evacMin),l:'Évacuation(s) minimum
par canton (1 / 300 m²)'});
kpis.push({n:f1(dist)+' m',l:'Distance maxi de tout point
à une évacuation (4 × H, 30 m maxi)'});
etapes.push('Amenées d’air : surface libre au moins égale à la surface géométrique des évacuations'+(nbCantons>1?' des deux cantons les plus exigeants':' du local')+' (§ 7.1.4).');
if(H<2.5||H>15){warns.push('H hors de la table de l’annexe (2,50 à 15 m) : le taux α affiché est issu des formules de calcul — au-delà des bornes de la table, l’annexe interdit l’extrapolation : faites valider par une approche d’ingénierie (§ 8).')}
}else{
var vol=sCanton*H,q12=12*vol/3600,qCap=3*sCanton/100,q=Math.min(q12,qCap),capped=q12>qCap;
if(q<1.5)q=1.5;
etapes.push('Volume du canton = '+f1(sCanton)+' m² × '+f2(H)+' m = '+f1(vol)+' m³.');
etapes.push('Débit de base : 12 volumes/heure = '+f1(12*vol)+' m³/h soit '+f2(q12)+' m³/s (§ 7.2.3).');
if(capped){etapes.push('Ce débit est limité à 3 m³/s pour 100 m² : plafond = '+f2(qCap)+' m³/s (§ 7.2.3).')}
if(q===1.5&&Math.min(q12,qCap)<1.5){etapes.push('Le débit n’est jamais inférieur à 1,5 m³/s par local (§ 7.2.3).')}
kpis.push({n:f2(q)+' m³/s',l:'Débit d’extraction
par canton'});
kpis.push({n:f1(q*3600)+' m³/h',l:'soit en horaire'});
if(nbCantons>1){kpis.push({n:nbCantons+' cantons',l:'1 ventilateur pour 2 cantons maxi,
débit du plus grand (§ 7.2.3)'})}
etapes.push('Hauteur des écrans de cantonnement : ≥ '+(H<=8?'25 % de H = '+f2(0.25*H)+' m':'2 m (H > 8 m)')+' (§ 7.2.1). Amenées d’air mécaniques ou naturelles, possibles par les cantons périphériques.');
warns.push('Alimentation et commande : ventilateurs et dispositifs de commande doivent respecter le § 4 de l’IT 246 (alimentation de sécurité, mise à l’arrêt…) et la coordination avec le SSI.')}
res.innerHTML=obligTxt
+''
+''
+warns.map(function(w){return''+w+'
'}).join('')
+'Références : IT 246 (arrêté du 22 mars 2004) § 7.1 et 7.2 + annexe (table des taux α et formules), articles DF 6 à DF 8 du règlement de sécurité. Formules de l’annexe reproduites à l’identique — valeurs contrôlées sur la table officielle.
';
res.scrollIntoView({behavior:'smooth',block:'nearest'});
});
})();