/*
 * Step Distance & Calorie Calculator V 2.0 with Imperial/Metric
 * Conversion (employs DeVaul function for MPH/METS conversion).
 * Born on October 26th, 2008.  Author: Richard W. DeVaul
 * Ph.D.  Copyright (C) 2008, AWare Technologies.  All Rights Reserved
 */

var stlCalcVersion="2.0.atc";

var sl_in_feet=2.2; /* initial stride length in feet -- woman's average  */
var mass_in_kg=74.0; /* initial body mass in kgs -- American woman's average */

function checkEnter(e){ //e is event object passed from function invocation
  var characterCode;

  if(e && e.which){ //if which property of event object is supported (NN4)
     //e = e
     characterCode = e.which //character code is contained in NN4's which property
  }
  else{
     e = event
     characterCode = e.keyCode //character code is contained in IE's keyCode property
  }

  if(characterCode == 13){ //if generated character code is equal to ascii 13 (if enter key)
    return false
  }
  else{
    return true
  }
}

function strideLengthChange() {
	var input1 = document.getElementById('stride_length');
	  var val  = makeNumber(input1.value,false,true);
	  if (val > 0 && val < 6) {
	      input1.value = val;
	      var imperial=document.getElementById('imperial');
	      if (imperial.checked) {
		  sl_in_feet=input1.value;
	      } else { 
		  sl_in_feet=input1.value*3.2808399;
	      } 
	      doCalc();
	      doCalCalc();
	  }
	  else {
	      alert(input1.value + " is not a reasonable stride length. Try again.");
	  }
    }

function stepsChange() {
	  var input2 = document.getElementById('step_number');
	  input2.value = makeNumber(input2.value,true,true);
	  if (input2.value < 0) {
	      alert("Negative steps are not allowed.  Please enter a positive number.");
	  }
	  else 
	  doCalc();
	  doCalCalc();
    }

function massChange() {
          var input3 = document.getElementById('body_mass');
	  var val  = makeNumber(input3.value,false,true);
	  if (val > 10 && val < 400) {
	      input3.value = val;
	      var imperial=document.getElementById('imperial');
	      if (imperial.checked) {
		  mass_in_kg=input3.value/2.2;
	      } else { 
		  mass_in_kg=input3.value;
	      } 
	      doCalCalc(); 
	  }
	  else {
	      alert(input3.value + " is not a reasonable body mass. Try again.");
	  }
    };

function durationChange () {
          var input4 = document.getElementById('duration');
	  input4.value = makeNumber(input4.value,false,true);
	  if (input4.value < 1) {
	      alert("Zero or negative duration is not allowed.  Please enter a positive number of minutes.");
	  }
	  else 
	  doCalCalc();
    };

function makeNumber(thing, isInteger, strict) {
    var rval = ""; /* default return value */
    var string_thing = thing.toString();
    var decimal_flag = false;
    var non_number = false;
    for (var i = 0; i < string_thing.length; i++ ) {
	var c = string_thing.charAt(i);
	switch(c) {
	case ".":
	    if (!isInteger && !decimal_flag) {
		rval+=c;
		decimal_flag=true;
		break;
	    }
	    non_number=true;
	    break;
	case "0":
	case "1":
	case "2":
	case "3":
	case "4":
	case "5":
	case "6":
	case "7":
	case "8":
	case "9":
	case "+":
	case "-":
	    rval+=c;
	    break;
	case ",":
	case " ":
	    break;
	default:
	    non_number=true;
	}
    }
    if(strict && non_number) {
	if (isInteger)
	    alert(thing+ " is not a valid integer.  Please try again.");
	else
	    alert(thing+ " is not a valid number.  Please try again.");
	return 0;
    }
    return rval;
}
	

function renderControls(divname) {
//  var handle = document.getElementById("dom_handle");
  var controls = document.createElement("div");

  var table = document.createElement('table');
      table.id='input form';
      table.setAttribute('style','background-color: #9dc6db; -moz-border-radius: 10px; -webkit-border-radius: 10px; border: 2px solid #777777; padding 10px');
//      table.setAttribute('style','-moz-border-radius: 10px; -webkit-border-radius: 10px; border: 2px solid #777777; padding 10px');
      table.setAttribute('cellpadding','5');
      table.setAttribute('cellspacing','0');
      table.setAttribute('cellPadding','5');
      table.setAttribute('cellSpacing','0');

//  var thead = document.createElement('thead');

  var thead = table.createTHead();
      thead.setAttribute('style','background-color: #9dc6db;');
      thead.setAttribute('bgColor','#9dc6db');

  var tbody = document.createElement('tbody');
      tbody.setAttribute('style','background-color: #e4e4e4');
      tbody.setAttribute('bgColor','#e4e4e4');

  var tfoot = table.createTFoot();
      tfoot.setAttribute('style','background-color: #e4e4e4');
      tfoot.setAttribute('bgColor','#e4e4e4');


  var row0 = document.createElement('tr');
      thead.appendChild(row0);

  var logo0 = row0.insertCell(-1);
//      logo0.setAttribute('align', 'right');
      logo0.align='right';
      logo0.width='215';

//  var logo1 = document.createElement('td');
  var logo1 = row0.insertCell(-1);
      logo1.width='265';

  var b0 = document.createElement('b');
      b0.setAttribute('style','font-size: 150%"');
  var title1 = document.createTextNode('Step Distance & Energy Calculator');

  var image0 = document.createElement('img');
      image0.setAttribute('src', 'http://awaretechs.com/images/StepTrakLiteBar2-149x38.png');
      image0.setAttribute('alt', 'StepTrakLite');
      image0.setAttribute('height', '38px');
      image0.setAttribute('width', '149px');
      image0.setAttribute('border', '0px');

  var a0 = document.createElement('a');
      a0.setAttribute('href', 'http://awaretechs.com/StepTrakLite.html');
      a0.appendChild(image0);
      
      logo0.appendChild(a0);
      b0.appendChild(title1)
      logo1.appendChild(b0);
      logo1.appendChild(document.createTextNode(' V' + stlCalcVersion));

  var row1 = document.createElement('tr');
      row1.setAttribute('style','background-color: #e4e4e4');
      row1.setAttribute('bgColor','#e4e4e4');
  var legend1 = document.createElement('td');
      legend1.id='slunits';
      legend1.setAttribute('align', 'right');
  var legend2 = document.createElement('td');

  var ltext1 = document.createTextNode('Stride Length (feet): ');
  var input1 = document.createElement('input');
      input1.size=4;
      input1.value = sl_in_feet+"";
      input1.id='stride_length';
      input1.onkeypress = function (e) { if (!checkEnter(e)) strideLengthChange(); };
      input1.onchange= strideLengthChange;
     
  var ltext2 = document.createTextNode('Number of Steps: ');
  var input2 = document.createElement('input');
      input2.size=8;
      input2.value = '0';
      input2.id='step_number';
      input2.onkeypress = function (e) { if (!checkEnter(e)) stepsChange(); };
      input2.onchange= stepsChange;


  legend1.appendChild(ltext1);
  legend1.appendChild(input1);
  legend2.appendChild(ltext2);
  legend2.appendChild(input2);
  row1.appendChild(legend1);
  row1.appendChild(legend2);
  tbody.appendChild(row1);

  var row2 = document.createElement('tr');
      row2.setAttribute('style','background-color: #e4e4e4');

  var box1 = document.createElement('td');
  var box2 = document.createElement('td');
  var bold = document.createElement('b');
      bold.id='result';
  var ltext3 = document.createTextNode('0 feet, 0 miles, 0km.');

  var rad1 = document.createElement('input');
      rad1.id='imperial';
      rad1.setAttribute('name','units');
      rad1.setAttribute('type','radio');
      rad1.setAttribute('value','feet');
      rad1.checked=true;
      rad1.defaultChecked=true;
      rad1.onclick= function() {  radioClick(this.value);   };

  var rad2 = document.createElement('input');
      rad2.id='metric';
      rad2.setAttribute('type','radio');
      rad2.setAttribute('name','units');
      rad2.setAttribute('value','meters');
      rad2.onclick= function() {  radioClick(this.value);  };
      rad2.checked=false;

  box1.setAttribute('align','right');
  box1.appendChild(document.createTextNode('  feet/lbs'));
  box1.appendChild(rad1);
  box1.appendChild(document.createTextNode('  meters/kg'));
  box1.appendChild(rad2);
  bold.appendChild(ltext3);
  box2.appendChild(bold)

  row2.appendChild(box1);
  row2.appendChild(box2);
  //  tbody.appendChild(row2);
  //  table.appendChild(tbody);

  /* Insert Calorie calcualtor here */

  var row3 = document.createElement('tr');
     row3.setAttribute('style','background-color: #e4e4e4');

  var legend3 = document.createElement('td');
      legend3.id='weight';
      legend3.setAttribute('align', 'right');
  var legend4 = document.createElement('td');

  var ltext4 = document.createTextNode('Body Mass (lbs): ');
  var input3 = document.createElement('input');
      input3.size=5;
      input3.value = (mass_in_kg*2.2)+"";
      input3.id='body_mass';
      input3.onchange= massChange;
      input3.onkeypress = function (e) { if (!checkEnter(e)) massChange(); };

  var ltext5 = document.createTextNode('Duration in Minutes: ');
  var input4 = document.createElement('input');
      input4.size=6;
      input4.value = '60';
      input4.id='duration';
      input4.onchange= durationChange;
      input4.onkeypress = function (e) { if (!checkEnter(e)) durationChange(); };

  legend3.appendChild(ltext4);
  legend3.appendChild(input3);
  legend4.appendChild(ltext5);
  legend4.appendChild(input4);
  row3.appendChild(legend3);
  row3.appendChild(legend4);
  tbody.appendChild(row3);

  var row4 = document.createElement('tr');
      row4.setAttribute('style','background-color: #e4e4e4');
      row4.setAttribute('bgColor','#e4e4e4');

      //  var box3 = document.createElement('td');
  var box4 = document.createElement('td');
      box4.setAttribute('style','text-align: center;')
      box4.setAttribute('colspan','2');
      box4.setAttribute('align','center');
      box4.colSpan='2';
  var b1 = document.createElement('b');
      b1.id='calresult';
  var ltext6 = document.createTextNode('Pace: 0.0 mph.  METs: 1.0.  Energy Expended: 74 Calories.');

  //  box3.appendChild(document.createTextNode('Your Ad Here'));
  b1.appendChild(ltext6);
  box4.appendChild(b1);

  //  row4.appendChild(box3);
  row4.appendChild(box4);
  tbody.appendChild(row2);
 
  tfoot.appendChild(row4);
  
  table.appendChild(thead);
  table.appendChild(tbody);
  table.appendChild(tfoot);
  controls.appendChild(table);
  
//  handle.innerHTML = "";
//  handle.appendChild(controls);


//  gadgets.window.adjustHeight();
  var mydiv=document.getElementById(divname);
  mydiv.innerHTML="";
  mydiv.appendChild(controls);

};

function radioClick (value) {
    var stride = document.getElementById('stride_length');
    var mass = document.getElementById('body_mass');
    var imperial = document.getElementById('imperial');
    var metric = document.getElementById('metric');
    if (value == 'feet') {
          stride.value=sl_in_feet;
	  mass.value=mass_in_kg*2.2;
	  imperial.checked=true;
	  metric.checked=false;
          changeUnits('feet');
    }
    else { 
          stride.value=sl_in_feet*0.3048;
	  mass.value=mass_in_kg;
	  imperial.checked=false;
	  metric.checked=true;
          changeUnits('meters');
    }      
}
  

function changeUnits(units) { 
        var td=document.getElementById('slunits');
        var insl=document.getElementById('stride_length');
        td.innerHTML="";
        td.appendChild(document.createTextNode('Stride Length (' + units + '): '));
        td.appendChild(insl);

        var td2=document.getElementById('weight');
        var insl2=document.getElementById('body_mass');
        td2.innerHTML="";
	var munit='kg';
	if (units == 'feet') munit='lbs';
        td2.appendChild(document.createTextNode('Body Mass (' + munit + '): '));
        td2.appendChild(insl2);
        doCalc(); 
        doCalCalc(); 
};

var miles_distance=0.0;

function doCalc() {
  var length=document.getElementById('stride_length');
  var steps=document.getElementById('step_number');
  var dist = length.value * steps.value;
  var units=document.getElementById('imperial');
  var update = document.getElementById('result');
  update.innerHTML = "";
  if (units.checked) {
      miles_distance =  Math.round(dist/5280 * 100)/100;
      update.appendChild(document.createTextNode(
        Math.round(dist * 100)/100 +' feet, ' + miles_distance + ' miles, ' + Math.round(dist * .03048)/100 + ' km.' ));
  } else {
      miles_distance=Math.round((dist*3.2808399)/5280 * 100)/100;
      update.appendChild(document.createTextNode(
        Math.round(dist * 100)/100 +' m, ' + miles_distance  + ' miles, ' + Math.round(dist/10)/100 + ' km.'));
  }
  
};

function doCalCalc() {
  var duration=document.getElementById('duration');
  var update=document.getElementById('calresult');

  var pace = miles_distance*60/duration.value;
  var metpace = pace;
  if (pace < 2.0) { metpace=2.0; };
  if (pace > 5.0) { metpace=5.0 + (metpace-5.0)/7.25; };
  /* The DeVaul function closely approximates published emperical METS
   * table data for walking paces over the 2.0mph to 5.0mph range, the
   * limits for which I can easily find data.  This relationship is
   * non-linear, with faster paces burning more energy per unit
   * distances over this range.  We assume a transition in gait at
   * 5mph between walking and running. The 2.0mph pace corresponds to
   * 2.5 METs, and 5.0mph to 8.0 METs, according to the data.  Running
   * at 10.9 mph corresponds to 18 METs.  Below 2.0mph we assume a
   * linear relationship between pace and METS.
   */
  var mets = 0.45 + pace + Math.pow(metpace,6.55)/15000; // DeVaul function
  if (mets < 1.0) mets = 1.0;
  var ee = mets * mass_in_kg * duration.value/60; // Standard METS calculation
  var result = 'Pace: ';
  var units=document.getElementById('imperial');
  if (units.checked) {
      result+=  Math.round(pace * 100)/100 + 'mph.  METs: ';
  }
  else {
      result+=   Math.round(pace * 160)/100 + 'kph.  METs: ';
  }
  update.innerHTML="";
  update.appendChild(document.createTextNode(result + Math.round(mets*100)/100 + '.  Energy Expended: ' + Math.round(ee) + ' Calories.'));
  
};

window.onload= function() { renderControls('DistCalc'); };
