
function SetSelect(s, v)
{
var i;
for(i=0; i<s.options.length; i++)
    { if(s.options[i].value==v) { s.selectedIndex=i; break; }
    }
}

function GetSelect(s)
{
if(!(s.selectedIndex>=0)) return(null);
var v=s.options[s.selectedIndex].value;
if(v==null || v=="") return(null);
var v2=parseInt(v,10);
return((isNaN(v2)) ? v : v2);
}

function SetRadio(s, v)
{
var i;
for(i=0; i<s.length; i++)
    { if(s[i].value==v) { s[i].checked=1; break; }
    }
}

function GetRadio(s)
{
var i;
for(i=0; i<s.length; i++)
    { if(s[i].checked==1) return(s[i].value);
    }
return(0);
}

//desuet
function GetSelectedInt(s)
{ return(parseInt(s.options[s.selectedIndex].value,10));
}

//desuet
function SetIndex(s, v)
{ SetSelect(s, v);
}




var _tn=0;
var _ttn=0;

function GetNum(champ, fmt, flag)
{ _ttn=TestNum(champ,fmt, flag); return(_tn);
}

function TestNum(champ, fmt, flag)
{
var ret=0;
var s=""+champ;
var i1,i2,c;

_tn=0;
i1=0;
i2=s.length;
//for(; i1<i2; i1++) { c=s.charAt(i1); if(c!=' ' && c!='\t') { break; } }
//for(; i2>i1; i2--) { c=s.charAt(i2-1); if(c!=' ' && c!='\t') { break; } }

if(i1<i2)
  {
    var MaxEntier,MaxDeci,NegOK=0,NbEntier=0,NbDeci=0,iVirg=0,i,s2="";

    if(fmt<0)
        { NegOK=1;
          fmt=-fmt;
        }
    MaxEntier=fmt/10;
    MaxDeci  =fmt%10;

    for(i=i1; i<i2; i++)
        { c=s.charAt(i);
          if(c==' ' && flag!=null && (flag & 0x0001))
              { continue;
              }
          if(c>='0' && c<='9')
              { if(iVirg) { NbDeci++; if(NbDeci>MaxDeci) { ret=-3; break; } }
                else { NbEntier++; if(NbEntier>MaxEntier) { ret=-2; break; } }
              }
          else
          if(c=='.' || c==',')
              { if(iVirg) { ret=-1; break; }
                iVirg=i+1;
                c='.';
              }
          else
          if(c=='-')
              { if(!NegOK || i>i1) { ret=-4; break; }
              }
          else{ ret=-1;
                break;
              }
          s2+=c;
        }
    if(!ret)
        { _tn=(iVirg) ? parseFloat(s2) : parseInt(s2,10);
          ret=1;
        }
  }
return(ret);
}



function FormateVal(val, NbDeci, flag)
{
var s="";

if(val!=null && !isNaN(val))
    {
      var l,i,tmp,signe;

      var separe=" ";
      if(flag!=null)
          { if(flag & 0x0001) separe="&nbsp;"; else
            if(flag & 0x0002) separe="."; else
            if(flag & 0x0004) separe="";
          }

      if(NbDeci==2) { val=val*100.0; } else
      if(NbDeci>0) { for(i=0; i<NbDeci; i++) { val=val*10; } }
      else{ NbDeci=0; }

      val=Math.round(val);

      if(val<0) { val=-val; signe=1; } else{ signe=0; }
      s=val.toString();

      l=s.length;
      for(i=NbDeci+1-l; i>0; i--) s="0"+s;

      tmp=l-NbDeci;
      if(tmp>3 && separe.length>0)
          { for(i=0; i<5; i++)
                { if (tmp<4) break;
                  tmp-=3;
                  s=s.substring(0, tmp)+separe+s.substring(tmp, l);
                  l+=separe.length;
                }
          }
      if(NbDeci>0)
          { l=s.length;
            s=s.substring(0, l-NbDeci)+","+s.substring(l-NbDeci, l);
          }
      if(signe) s="-"+s;
    }

return(s);
}


var gIsChange1=0;

function ffff_OC(sName)
{

gIsChange1=1;

var f=document.ffff;

if(sName==null || sName=="TypeAchat")
    {
      var TypeAchat=parseInt(f.TypeAchat.options[f.TypeAchat.selectedIndex].value);

      var c=f.terrain;
      if(TypeAchat==1)  // 1=terrain+construct
          {
            c.disabled=false;
            c.style.backgroundColor="#FFFFFF";
          }
      else{ c.value="";
            c.disabled=true;
            c.style.backgroundColor="#CCCCCC";
          }

      var c=f.logement;
      if(TypeAchat>=1 && TypeAchat!=5)  // sauf travaux seuls
          {
            c.disabled=false;
            c.style.backgroundColor="#FFFFFF";
          }
      else{ c.value="";
            c.disabled=true;
            c.style.backgroundColor="#CCCCCC";
          }

      var c=f.travaux;
      if(TypeAchat==4 || TypeAchat==5)  // ancien et/ou travaux
          {
            c.disabled=false;
            c.style.backgroundColor="#FFFFFF";
          }
      else{ c.value="";
            c.disabled=true;
            c.style.backgroundColor="#CCCCCC";
          }

      var c=f.NbLogement;
      if(TypeAchat==2 || TypeAchat==3) // NEUF
          {
            c.disabled=false;
            c.style.backgroundColor="#FFFFFF";
            if(c.selectedIndex<0)
                 { c.selectedIndex=0;
                 }
          }
      else{ c.value="";
            c.disabled=true;
            c.style.backgroundColor="#CCCCCC";
          }

      var c=f.PretPth;
      if(TypeAchat>0)
          {
            c.disabled=false;
            c.style.backgroundColor="#FFFFFF";
          }
      else{ c.value="";
            c.disabled=true;
            c.style.backgroundColor="#CCCCCC";
          }
    }

}



function BeforeSubmit(f,IsAlert)
{
var ers="";

var TypeAchat=parseInt(f.TypeAchat.options[f.TypeAchat.selectedIndex].value);
var terrain  =GetNum(f.terrain.value ,80); var t_terrain =_ttn;
var logement =GetNum(f.logement.value,80); var t_logement=_ttn;
var travaux  =GetNum(f.travaux.value ,80); var t_travaux =_ttn;
var PretPth  =GetNum(f.PretPth.value ,80); var t_PretPth =_ttn;

if(TypeAchat<1 || TypeAchat>5)
    { ers="Précisez le type d'acquisition !";
    }
else
if(t_terrain <0) { ers="Cout du terrain : saisie invalide" ; } else
if(t_logement<0) { ers="Cout du logement : saisie invalide"; } else
if(t_travaux <0) { ers="Cout des travaux : saisie invalide"; } else
if(t_PretPth <0) { ers="Montant du prêt : saisie invalide" ; }
else
if(TypeAchat==1 && (terrain==0 && logement==0))
    { ers="Précisez le coût du terrain et/ou du logement !";
    }
else
if((TypeAchat==2 || TypeAchat==3) && logement<=0)
    { ers="Précisez le coût du logement !";
    }
else
if(TypeAchat==4 && (logement==0 && travaux==0))
    { ers="Précisez le coût du logement et/ou des travaux !";
    }
else
if(!gIsChange1)
    { ///ers="Résultats déjà calculés !";
    }
if(ers!="")
    { self.alert(ers);
    }

return((ers!="") ? false : true);
}


function OnBtnSubmit(f)
{
if(BeforeSubmit(f,1)==true)
    { ///f.submit();
      BodyOnLoad(1);
    }
}


function MainGetForm()
{
var fd=new Object();

var f=document.ffff;
fd.TypeAchat  =parseInt(f.TypeAchat.options[f.TypeAchat.selectedIndex].value);
fd.terrain    =GetNum(f.terrain.value , 80);
fd.logement   =GetNum(f.logement.value, 80);
fd.travaux    =GetNum(f.travaux.value , 80);
fd.PretPth    =GetNum(f.PretPth.value , 80);
fd.IsNegocie  =(f.IsNegocie.checked) ? 1:0;

fd.NbLogement=1;
if(f.NbLogement.selectedIndex>=0)
    { fd.NbLogement=parseInt(f.NbLogement.options[f.NbLogement.selectedIndex].value);
    }

return(fd);
}



function MainGetBareme()
{
var brm=
{ ModeCalculHypo: 2,
  TauxTva:        19.6,
  ProportMini:    65.60,
  EmolFixeAncien: 470.00,
  EmolFixeNeufT:  370.00,
  EmolFixePret:   180.00,
  EmolFixePpd:    130.00,
  DeboursAchat:   430.00,
  DeboursPret:    40.00,
  EnregFixe125:   125.00,
  EnregFixe25:    25.00,

  NegociePlafond: 45735.00,
  NegocieTaux1:   5,
  NegocieTaux2:   2.5,

  SalaireMini1:   15.00,
  SalaireMini2:   8.00,
  SalaireTaux1:   0.10,
  SalaireTaux2:   0.05,
  TauxTD:         3.60,
  TauxTC:         1.20,
  TauxPF:         0.60,
  TauxFA:         2.50,
  TauxTE20:       0.20,
  TauxTE10:       0.10,

  s1:[ { plafond:  6500.00, taux: 4.000 },
       { plafond: 17000.00, taux: 1.650 },
       { plafond: 30000.00, taux: 1.100 },
       { plafond:     0.00, taux: 0.825 }
     ],
  s2:[ { plafond:  6500.00, taux: 2.000 },
       { plafond: 17000.00, taux: 1.100 },
       { plafond: 30000.00, taux: 1.750 },
       { plafond:     0.00, taux: 0.550 }
     ]
};

return(brm);
}


function NotaireCalculFrais(brm, assiette, type, IsNegociation, NbHabitation)
{
var   CoeffSerie;  // appliqué à s1,s2 : 1/3, 2/3 ...
var   tempd;

var   FraisNotaire=0;

if(type!=1 && type!=2 && type!=3 && type!=4)
    { return(FraisNotaire);
    }

if(assiette<=0)
    { return(FraisNotaire);
    }

if(type==2 || type==3) // NEUF
    {
           if(NbHabitation<=10) CoeffSerie=1.0;
      else if(NbHabitation<25 ) CoeffSerie=4.0/5.0;
      else if(NbHabitation<100) CoeffSerie=2.0/3.0;
      else if(NbHabitation<250) CoeffSerie=1.0/2.0;
      else if(NbHabitation<500) CoeffSerie=2.0/5.0;
      else                      CoeffSerie=1.0/3.0;
    }
else{ CoeffSerie=1.0;
    }

var emolument=NotaireEmolFromSerie(brm, assiette, 1, CoeffSerie);

emolument+=(type==1 || type==2 || type==3)
          ? brm.EmolFixeNeufT
          : brm.EmolFixeAncien;

if(IsNegociation)
    {
      if(assiette<=brm.NegociePlafond)
          { tempd=assiette*(brm.NegocieTaux1/100);
          }
      else{ tempd=brm.NegociePlafond;
            tempd=(tempd*(brm.NegocieTaux1/100))
                 +((assiette-tempd)*(brm.NegocieTaux2/100));
          }
      emolument+=tempd;
    }

var debours=brm.DeboursAchat;

tempd=assiette*(brm.SalaireTaux1/100);
if(tempd<brm.SalaireMini1) tempd=brm.SalaireMini1;
debours+=tempd;

var tva1=emolument*(brm.TauxTva/100);
var enreg=0;

if(type==1 || type==4) // TERRAIN ou ANCIEN
    {
      var TauxTD=brm.TauxTD*(1+(brm.TauxFA/100));
      enreg=assiette*((TauxTD+brm.TauxTC+brm.TauxTE20)/100);
    }
else
if(type==2 || type==3)
    {
      var TauxPF=brm.TauxPF*(1+(brm.TauxFA/100));
      enreg=assiette*((TauxPF+brm.TauxTE10)/100);
    }

tempd=emolument+debours+enreg+tva1;

FraisNotaire=Math.floor(tempd/10)*10; // arrondi a 10 Euro

return(FraisNotaire);
}




function NotaireCalculHypo(brm, Pth, PcPel, PasPtz, PpdMax)
{
var tempd;
var FraisNotaire=0;
var TotalPret=Pth+PcPel+PasPtz;

if(TotalPret<=0)
    { return(FraisNotaire);
    }

if(PpdMax<=0) PpdMax=0;

var emolument;

emolument=NotaireEmolFromSerie(brm, TotalPret, 1, 1.0/3.0);

emolument+=(PcPel>0 || PasPtz>0 || Pth>PpdMax)
          ? brm.EmolFixePret
          : brm.EmolFixePpd;

var enreg=0;

if(Pth>PpdMax)
    {
      var TauxPF=brm.TauxPF*(1+(brm.TauxFA/100));
      enreg=(((Pth-PpdMax)*1.20)*((TauxPF+brm.TauxTE10)/100));
    }

if(PcPel>0 || PasPtz>0 || Pth>PpdMax)
    { enreg+=brm.EnregFixe125;
    }

var debours=brm.DeboursPret;

tempd=TotalPret;
if(tempd>0)
    { tempd*=1.20*(brm.SalaireTaux2/100);
      if(tempd<brm.SalaireMini2) tempd=brm.SalaireMini2;
      debours+=tempd;
    }

var tva1=emolument*(brm.TauxTva/100);

tempd=emolument+debours+enreg+tva1;

FraisNotaire=Math.floor(tempd/5)*5; // arrondi a 5 euro

return(FraisNotaire);
}


function NotaireEmolFromSerie(brm, assiette, NumSerie, coeff)
{
var emolument=0;


if(assiette>0)
    {
      var serie=(NumSerie==2) ? brm.s2 : brm.s1;

      for(var num=0; ; num++)
          {
            var plafond=serie[num].plafond;
            var tempd=(plafond!=0 && assiette>plafond) ? plafond : assiette;

            if(num>0) tempd-=serie[num-1].plafond;
            emolument+=tempd*(serie[num].taux/100);
            if(plafond==0 || assiette<=plafond) break;
          }

      emolument*=coeff;

      if(emolument<brm.ProportMini)
          { emolument=brm.ProportMini;
          }
    }

return(emolument);
}







function GetResultFnfg(fdata)
{
var brm=MainGetBareme();
var r=new Object();

r.FnTotal  =0;
r.FgTotal  =0;

r.S_FnTotal="";
r.S_FgTotal="";

if(fdata.TypeAchat>0)
    {
      var CoutAchat=(fdata.TypeAchat==1) ? fdata.terrain : fdata.logement;

      if(CoutAchat>0)
          {
            r.FnTotal=NotaireCalculFrais(brm,
                                         CoutAchat,
                                         fdata.TypeAchat,
                                         fdata.IsNegocie,
                                         fdata.NbLogement);

            r.S_FnTotal=FormateVal(r.FnTotal, 0)+"&nbsp;€";
          }

      if(fdata.PretPth>0)
          {
            var PpdMax=0;

            if(fdata.TypeAchat==1)
                { PpdMax=fdata.terrain;
                }
            else
            if(fdata.TypeAchat==3 || // neuf cle en main
               fdata.TypeAchat==4)   // ancien
                { PpdMax=fdata.logement;
                }

            r.FgTotal=NotaireCalculHypo(brm, fdata.PretPth, 0, 0, PpdMax);
            r.S_FgTotal=FormateVal(r.FgTotal, 0)+"&nbsp;€";
          }
    }

return(r);
}


function BodyOnLoad(IsLoaded)
{
gIsChange1=0;

if(IsLoaded!=1)
    { ffff_OC(null);
      gIsChange1=0;
    }

var f=document.ffff;
var fdata=MainGetForm();
var result=GetResultFnfg(fdata);

document.getElementById("result_FnTotal"     ).innerHTML=result.S_FnTotal   ;
document.getElementById("result_FgTotal"     ).innerHTML=result.S_FgTotal   ;
}