function calcms2(form,index)
  // converts mass units with non-decimal paritioning, version 2, Nov 13, 2008
  // copyright Bernd Krueger, 2008-2010
{
  var kg_lb = 4.5359237e-1;     // kilogram per pound (avoirdupois) (exact, NIST)
  usfac0 = new Array(2000., 100., 1., 1./16., 1./256., 1./7000.);
  usfac1 = new Array(20., 100., 16., 16., 27.34375, 0.);
  trfac0 = new Array(1., 1./12., 1./240., 1./5760.);
  trfac1 = new Array(12., 20., 24., 0.);
  ukfac0 = new Array(2240., 112., 28., 14., 1., 1./16., 1./256., 1./7000.);
  ukfac1 = new Array(20., 4., 2., 14., 16., 16., 27.34375, 0.);
  apfac0 = new Array(1., 1./12., 1./96., 1./288., 1./5760.);
  apfac1 = new Array(12., 8., 3., 20., 0.);
  var useu;
  
  selectcol(form);
  if(index==-1) {
     v = form.storev.value;
  }
  if(index==0) {                                          // kg
     v = parseFloat(form.kgm.value); if(!isFinite(v) || v<=0) {warnings(1); return;}
  }
  if(index==1) {                                          // g
     v = parseFloat(form.grm.value); if(!isFinite(v) || v<=0) {warnings(1); return;}
     else { v = v/1000.; }
  }
  if(index==2) {                                          // t
     v = parseFloat(form.ton.value); if(!isFinite(v) || v<=0) {warnings(1); return;}
     else { v = v*1000.; }
  }
  if(index==3) {                                          // US customary
    v = 0.;
    for(var i=0; i<6; i++) {
      if(form.chavs[i].checked==true) {
        if(form.avos[i].value==' ') vus = 0.
        else vus = parseFloat(form.avos[i].value); if(!isFinite(vus)) vus=0.;
          v = v + vus*usfac0[i]; }}
     v = v * kg_lb;
     if(!isFinite(v) || v<=0) {warnings(1); return;}
  }
  if(index==4) {                                          // Troy
    v = 0.;
    for(var i=0; i<4; i++) {
      if(form.chtro[i].checked==true) {
        if(form.troy[i].value==' ') vus = 0.
        else vus = parseFloat(form.troy[i].value); if(!isFinite(vus)) vus=0.;
          v = v + vus*trfac0[i]; }}
     v = v * kg_lb / 7000. * 5760.;
     if(!isFinite(v) || v<=0) {warnings(1); return;}
  }
  if(index==5) {                                          // Imperial
    v = 0.;
    for(var i=0; i<8; i++) {
      if(form.chavk[i].checked==true) {
        if(form.avok[i].value==' ') vus = 0.
        else vus = parseFloat(form.avok[i].value); if(!isFinite(vus)) vus=0.;
          v = v + vus*ukfac0[i]; }}
     v = v * kg_lb;
     if(!isFinite(v) || v<=0) {warnings(1); return;}
  }
  if(index==6) {                                          // Apothecary
    v = 0.;
    for(var i=0; i<5; i++) {
      if(form.chapo[i].checked==true) {
        if(form.apot[i].value==' ') vus = 0.
        else vus = parseFloat(form.apot[i].value); if(!isFinite(vus)) vus=0.;
          v = v + vus*apfac0[i]; }}
     v = v * kg_lb / 7000. * 5760.;
     if(!isFinite(v) || v<=0) {warnings(1); return;}
  }
  form.storev.value = v;
                                                   // output of metric SI units
  form.kgm.value = ausga(form,v);
  form.grm.value = ausga(form,v*1000.);
  form.ton.value = ausga(form,v/1000.);

  st=1+form.stell.selectedIndex;
  mini = v * Math.pow(10,-st-1); 
            
  useu = -1;
  minus = mini/kg_lb;                                     // output of US customary units 
  for(var i=5; i>=0; i--) {                             // find smallest usable unit
    if(form.chavs[i].checked==true) {useu = i; break;}}
  if(useu>=0) {
    vus = v/kg_lb/2000.;
    for(var i=0; i<=5; i++) { 
      if(useu==i) {
        if(vus>=minus/usfac0[i]) form.avos[i].value = ausga(form,vus);
        else form.avos[i].value = ausga(form,0);
        break;}
      else {if(form.chavs[i].checked==true) {
        vusfl = Math.floor(vus);  vusro = Math.round(vus);
        if(vusfl!=vusro && vus>(vusro-minus/usfac0[i])) vusfl = vusro;
        form.avos[i].value = ausfst(vusfl,0); 
        vus = (vus - vusfl) * usfac1[i];
        if(vus<0.) vus=0.; }
        else{ vus = vus * usfac1[i];}}
  }}
  useu = -1;                                       // output Troy units 
  minus = mini/kg_lb*7000./5760.;
  for(var i=3; i>=0; i--) {                             // find smallest usable unit
    if(form.chtro[i].checked==true) {useu = i; break;}}
  if(useu>=0) {
    vus = v/kg_lb*7000./5760.;
    for(var i=0; i<=3; i++) { 
      if(useu==i) {
        if(vus>=minus/trfac0[i]) form.troy[i].value = ausga(form,vus);
        else form.troy[i].value = ausga(form,0);
        break;}
      else {if(form.chtro[i].checked==true) {
        vusfl = Math.floor(vus);  vusro = Math.round(vus);
        if(vusfl!=vusro && vus>(vusro-minus/trfac0[i])) vusfl = vusro;
        form.troy[i].value = ausfst(vusfl,0); 
        vus = (vus - vusfl) * trfac1[i];
        if(vus<0.) vus=0.; }
        else{ vus = vus * trfac1[i];}}
  }}
  useu = -1;                                       // output of Imperial units 
  minus = mini/kg_lb;
  for(var i=7; i>=0; i--) {                             // find smallest usable unit
    if(form.chavk[i].checked==true) {useu = i; break;}}
  if(useu>=0) {
    vus = v/kg_lb/2240.;
    for(var i=0; i<=7; i++) { 
      if(useu==i) {
        if(vus>=minus/ukfac0[i]) form.avok[i].value = ausga(form,vus);
        else form.avok[i].value = ausga(form,0);
        break;}
      else {if(form.chavk[i].checked==true) {
        vusfl = Math.floor(vus);  vusro = Math.round(vus);
        if(vusfl!=vusro && vus>(vusro-minus/ukfac0[i])) vusfl = vusro;
        form.avok[i].value = ausfst(vusfl,0); 
        vus = (vus - vusfl) * ukfac1[i];
        if(vus<0.) vus=0.;}
        else{ vus = vus * ukfac1[i];}}
  }}
  useu = -1;                                       // output of apothecary units 
  minus = mini/kg_lb*7000./5760.;
  for(var i=4; i>=0; i--) {                             // find smallest usable unit
    if(form.chapo[i].checked==true) {useu = i; break;}}
  if(useu>=0) {
    vus = v/kg_lb*7000./5760.;
    for(var i=0; i<=4; i++) { 
      if(useu==i) {
        if(vus>=minus/apfac0[i]) form.apot[i].value = ausga(form,vus);
        else form.apot[i].value = ausga(form,0);
        break;}
      else {if(form.chapo[i].checked==true) {
        vusfl = Math.floor(vus);  vusro = Math.round(vus);
        if(vusfl!=vusro && vus>(vusro-minus/apfac0[i])) vusfl = vusro;
        form.apot[i].value = ausfst(vusfl,0); 
        vus = (vus - vusfl) * apfac1[i];
        if(vus<0.) vus=0;}
        else{ vus = vus * apfac1[i];}}
  }}
  return;
}
function selectcol(form)
  // selects colors for ms2 converter
  // copyright Bernd Krueger, 2008-2010
{
  for(var i=0; i<6; i++) {
    if(form.chavs[i].checked==true) document.getElementsByName('avos')[i].style.backgroundColor = '#F0FFF0';
    else { document.getElementsByName('avos')[i].style.backgroundColor = '#B0C4DE';
           form.avos[i].value = ' '; }}
  for(var i=0; i<4; i++) {
    if(form.chtro[i].checked==true) document.getElementsByName('troy')[i].style.backgroundColor = 'lemonchiffon';
    else { document.getElementsByName('troy')[i].style.backgroundColor = '#B0C4DE';
           form.troy[i].value = ' '; }}
  for (var i=0; i<8; i++) {
    if(form.chavk[i].checked==true) document.getElementsByName('avok')[i].style.backgroundColor = 'ivory';
    else { document.getElementsByName('avok')[i].style.backgroundColor = '#B0C4DE'; 
           form.avok[i].value = ' '; }}
  for(var i=0; i<5; i++) {
    if(form.chapo[i].checked==true) document.getElementsByName('apot')[i].style.backgroundColor = '#AFEEEE';
    else { document.getElementsByName('apot')[i].style.backgroundColor = '#B0C4DE';
           form.apot[i].value = ' '; }}
  return;
}
function blankms2(form)
  // sets fields in mass2 converter to blank without changing chosen units
  // copyright Bernd Krueger, 2008-2010
{
  form.kgm.value = ' '; form.grm.value = ' '; form.ton.value = ' ';
  for (var i=0; i<6; i++) form.avos[i].value = ' ';
  for (var i=0; i<4; i++) form.troy[i].value = ' ';
  for (var i=0; i<8; i++) form.avok[i].value = ' ';
  for (var i=0; i<5; i++) form.apot[i].value = ' ';
  form.storev.value = 0.;
  return;
}
