// BMI 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 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 anum=/(^\d+$)|(^\d+\.\d+$)/;
  var wtNo = 0;
  var htNo = 0;

  // 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;
  }

  var b =  KG / (metre * metre);
  var j = 0;
  var idealLower = 18.5 * metre * metre;
  var idealUpper = 25 * metre * metre;
  var time;
  if (b > 25){
    time = ((b - 25) * metre * metre);
  }else if (b < 18.5){
    time = ((18.5 - b) * metre * metre);
  }else{
    time = "0";
  }
  var units = ' kg';
  if (pounds || stone|| pnd){
    idealLower = idealLower / 0.45359237;
    idealUpper = idealUpper / 0.45359237;
    units = ' pounds';
  }
  idealLower = sprintf(idealLower,2);
  idealUpper = sprintf(idealUpper,2);
  var ideal = 'between ' + idealLower + ' and ' + idealUpper + units;
  time = sprintf(time,0);

  if(b<18.5)j=0;
  else if(b<25)j=1;
  else if(b<30)j=2;
  else j=3;
  frm.outputBMI.value=sprintf(b,2);
  frm.outputDescription.value= bodyType[j];
  frm.idealWt.value = ideal;
  if (time == 0){
	time = "Weight is in normal range";
  }else{
       time = time + ' weeks';		
  }
  frm.idealTime.value = time;
}

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='';
  frm.idealWt.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;
}

