
        function d2b(form) { // Decimal to Binary
                    j = form.decimal.value;
            for (i=0; i<8; ++i) {
                          l = eval("form.a"+i);
              if (j & 1) 
                    l.status=true;
              else
                    l.status=false;
                      j >>>= 1;
                    }
            }
        function b2d(form) { // Binary to Decimal
            j=0;
            for (i=7; i>=0; --i) {
                      j <<= 1;
                          l = eval("form.a"+i);
              if (l.status) 
                    j |= 1;
                    }
            form.decimal.value=j;
            }


// Moist air calculator
var actvp=0; //vapour pressure of water in air
var activevar=0; //holds pointer to the defining variable
 //0=undefined, 1=wetbulb, 2=dewpoint, 3=RH
//line10
//standard functions for atmospheric calculations

function TtoSVP(t) //saturation vapour pressure
 {
 var svp=610.78*Math.exp(t/(t+238.3)*17.2694);
 return svp;
 }

function SVPtoT(vp) // temperature from svp (= dew point)
 {
 var w=Math.log(vp/610.78);
 var dp=w*238.3/(17.294-w);
 return dp;
 }
//line25
function VPtoKGM3(vp,t) //kg water per cubic metre of air 
                       //from vapour pressure and temperature
 {
 var kgm = 0.002167*vp/(t+273.16);
 return kgm ;
 }

function WBtoRH(t,wb)//RH from dry and wet temperatures
 {
 var rh = (TtoSVP(wb) - (t-wb)*66.7)/TtoSVP(t)*100;
 return rh;
 }
//line 38

function VPtoKGKG(vp) // approx vapour pressure to kg water/kg air at ground level 
 {
 var kgprkg=0.622*vp/(101300-vp);
 return kgprkg;
 }

// end of standard functions

//line 48 
function calculate(actvar) //parameter actvar is ID-nr. of latest input
 {
 activevar=actvar; //update global variable defining the active input
 var drytemp=0;
 var amvp=0; //ambient vapour pressure
 var relhum=0; //RH AFTER calculation
 drytemp=eval(document.data.at.value);
 if (document.data.lockdp.checked)//force calculation using dp if box is checked
  activevar=2;
  
 //calculate and show saturation vapour pressure
 var svpdry=TtoSVP(drytemp);
 document.result.svp.value = Math.round(svpdry);
 
 if (activevar==1) //use wb to calc. RH,DP
  {
  var wettemp=eval(document.data.wb.value);
  var rhfromwb = WBtoRH(drytemp, wettemp);
  document.data.rh.value=Math.round(rhfromwb);
  //now work out dewpoint
  var amvp=svpdry*rhfromwb/100;
  var dewp=SVPtoT(amvp);
  document.data.dp.value=dewp;
  }
 
 if (activevar==2) //use dewpoint to calculate RH
  {
  var dewpnt=eval(document.data.dp.value);
  var airsvp=TtoSVP(drytemp);
  var dpsvp=TtoSVP(dewpnt);
  var rhfromdp=100*dpsvp/airsvp;
  amvp=dpsvp; //update variable for later calc.
  document.data.rh.value=Math.round(rhfromdp);
  document.data.wb.value="";
  }
 
 if (activevar==3) //Rh entered, calculate dewpoint &c
  {
  var setrh=eval(document.data.rh.value);
  var vvp=TtoSVP(drytemp)*setrh/100;
  var ddp=SVPtoT(vvp); //dewpoint
  amvp=vvp; //update variable for later calc.
  document.data.dp.value=ddp;
  document.data.wb.value="";
  }

 //calculate and show values that depend on actual vapour pressure
 if (activevar!=0)
  { 
  document.result.vp.value=Math.round(amvp); 
  document.result.kgcm.value=VPtoKGM3(amvp,drytemp);
  document.result.kgkg.value=VPtoKGKG(amvp);
  }
}

function clearall(n)
 {
 if (n!=1)
  {
  document.data.at.value="";
  document.data.lockdp.checked=false;
  }
 document.data.wb.value="";
 document.data.dp.value="";
 document.data.rh.value="";
 document.result.svp.value="";
 document.result.kgcm.value="";
 document.result.vp.value="";
 document.result.kgkg.value="";
 activevar=0;
 }