// BMI & bodyfat Calculator
// Copyright - Property of DietandFitnessToday.com 2006
// No part of this document may be reproduced in any form

var bodyType= new Array(
	'Underweight',
	'Normal weight',
	'Overweight',
	'Obese'
);

function calculateBMI(){

  var frm    = document.mainForm;
  var age     = frm.age.value;
  var KG     = frm.inputKG.value;
  var pounds = frm.inputPounds.value;
  var stone  = frm.inputStone.value;
  var pnd    = frm.inputPnd.value;
  var metre  = frm.inputMetre.value;
  var inches = frm.inputInches.value;
  var feet   = frm.inputFeet.value;
  var inch   = frm.inputInch.value;
  var gender = frm.gender.options[frm.gender.selectedIndex].value;
  var ethnic = frm.ethnic.options[frm.ethnic.selectedIndex].value;

  var anum=/(^\d+$)|(^\d+\.\d+$)/;
  var wtNo = 0;
  var htNo = 0;

  if (age){
    if (!anum.test(age)){
      frm.age.focus();
      alert('Please type a valid age');
      return;
    }
  }else{
    frm.age.focus();
    alert('Please type a valid age');
    return;
  }

  // verify wt input 
  if (KG){
    wtNo++;
  }	
  if (pounds){
    wtNo++;
  }
  if (stone || pnd){
    wtNo++;
  }

  if (wtNo > 1 || wtNo == 0){
    alert('Please enter a single weight in one of three rows');
    frm.inputKG.focus();
    return;
  }

  if (KG){
    if (!anum.test(KG)){
      frm.inputKG.focus();
      alert('Please type a valid weight');
      return;
    }
  }else if(pounds){
    if (!anum.test(pounds)){
      frm.inputPounds.focus();
      alert('Please type a valid weight');
      return;
    }else{
      KG += pounds * 0.45359237;
    }
  }else if(stone||pnd){
    if (stone){
      if (!anum.test(stone)){
	frm.inputStone.focus();
	alert('Please type a valid weight');
	return;
      }else{
	KG = (+KG) + (stone * 6.35029318);
      }
    }
    if (pnd){
      if (!anum.test(pnd)){
	frm.inputPnd.focus();
	alert('Please type a valid weight');
	return;
      }else{
	KG = (+KG) + (pnd * 0.45359237);
      }
    }
  }else{
    alert('Please type a valid weight');
    return;
  }

  if (metre){
    htNo++;
  }	
  if (inches){
    htNo++;
  }
  if (feet || inch){
    htNo++;
  }

  if (htNo > 1 || htNo == 0){
    alert('Please enter a single height in one of three rows');
    frm.inputMetre.focus();
    return;
  }

  if (metre){
    if (!anum.test(metre)){
      frm.inputMetre.focus();
      alert('Please type a valid height');
      return;
    }
  }else if(inches){
    if (!anum.test(inches)){
      frm.inputInches.focus();
      alert('Please type a valid height');
      return;
    }else{
      metre = (+metre) + (inches * 0.0254);
    }
  }else if(feet||inch){
    if (feet){
      if (!anum.test(feet)){
	frm.inputFeet.focus();
	alert('Please type a valid height');
	return;
      }else{
	metre = (+metre) + (feet * 0.3048);
      }
    }
    if (inch){
      if (!anum.test(inch)){
	frm.inputInch.focus();
	alert('Please type a valid hight');
	return;
      }else{
	metre = metre + (inch * 0.0254);
	window.status = metre;
      }
    }
  }else{
    alert('Please type a valid height');
    return;
  }

  if (gender == 'male'){
    gender = 1;
  }else{
    gender = 0;
  }

  if (ethnic == 'asian'){
    ethnic = 1;
  }else{
    ethnic = 0;
  }

  var bodyfat;

  var b =  KG / (metre * metre);
  bodyfat = 76.0 - (1097.8 * (1/b)) - (20.6 * gender) + (0.053 * age) + (95 * ethnic * (1/b)) - (0.044 * ethnic * age) + (154 * gender * (1/b)) + (0.034 * gender * age);  

  var j = 0;
  if(b<18.5)j=0;
  else if(b<25)j=1;
  else if(b<30)j=2;
  else j=3;

  frm.outputBodyfat.value=sprintf(bodyfat,2);
  frm.outputBMI.value=sprintf(b,2);
  frm.outputDescription.value=bodyType[j];
}

function clearAllFields(){
  var frm = document.mainForm;
  frm.inputKG.value='';
  frm.inputPounds.value='';
  frm.inputStone.value='';
  frm.inputPnd.value='';
  frm.inputMetre.value='';
  frm.inputInches.value='';
  frm.inputFeet.value='';
  frm.inputInch.value='';

  frm.outputBMI.value='';
  frm.outputDescription.value='';
}

function sprintf(num, decimalNum){
  var tmpNum = num;

  // Return the right number of decimal places
  tmpNum *= Math.pow(10,decimalNum);
  tmpNum = Math.floor(tmpNum);
  tmpNum /= Math.pow(10,decimalNum);
  var tmpStr = new String(tmpNum);

  return tmpStr;
}

