//*******************************************************************************
//  Author: Anna Janaszkiewicz, AIS.PL
//
//  In function calculateCalories() and calc() are used formulas of authorship:
//      Author:   Greg Kondrasuk -- email:    kondrasu@xti.com
//                                            gregk@cvfn.org
//                                  homepage: http://www.xti.com/~kondrasu
//      Date:     9 April 1997
//      Description:  The GUI interface to an Java app that calculates the number
//                of calories burned on a bicycle ride.  The application is
//                an implementation of a worksheet from an article in the
//                May 1989 issue of Bicycling Magazine.
//      Copyright (C) 1997  Greg Kondrasuk
//
//*******************************************************************************

// English version
// unit: mile, feet (ft), gallon, pound (lb), mpg (miles per gallon)

var descrArrEnIm = new Array();
descrArrEnIm[0]	= new Array('How much will you save by riding<br /> your bicycle to work, rather <br />than driving your car?', 'title');
descrArrEnIm[1]	= new Array('Distance to work (miles):', 'distance');
descrArrEnIm[2]	= new Array('Number of work days:', 'work');
descrArrEnIm[3]	= new Array('Price of fuel (per gallon):', 'price');
descrArrEnIm[4]	= new Array('Fuel economy (mpg):', 'fuel');
descrArrEnIm[5]	= new Array('Savings:', 'savings');
descrArrEnIm[6]	= new Array('How many calories you burn<br />by riding your bicycle?', 'titleCal');
descrArrEnIm[7] = new Array('Time of ride (minutes):', 'time');
descrArrEnIm[8] = new Array('Body weight (lb):', 'weight');
descrArrEnIm[9] = new Array('Calories burned:', 'calories');
descrArrEnIm[10] = new Array('Reset', 'reset');

// alerts for validation
var alertsEn = new Array();
alertsEn[0]='Distance must be in format \"9,9\" or \"9.9\"!';
alertsEn[1]='Distance must be greatest than 0!';
alertsEn[2]='Number of work days must be integer!';
alertsEn[3]='Number of work days must be greatest than 0!';
alertsEn[6]='Price must be in format \"9,99\" or \"9.99\"!';
alertsEn[7]='Price must be greatest than 0!';
alertsEn[8]='Fuel economy must be integer!';
alertsEn[9]='Fuel economy must be greatest than 0!';

alertsEn[14]='Time of ride must be integer!';
alertsEn[15]='Time of ride must be greatest than 0!';
alertsEn[16]='Body weight must be integer!';
alertsEn[17]='Body weight must be greatest than 0!';

// generates calculator in html
function generateCalculator(id, filesrc){
  var descrArr = descrArrEnIm;
  var form = document.createElement('form');
  form.setAttribute('name', 'formCalc');
  var table = document.createElement('table');
  table.className = 'calcTable';
  var tbody = document.createElement('tbody');
  tbody.setAttribute('id', 'tbodyId');
  table.appendChild(tbody);
  form.appendChild(table);
  document.getElementById(id).appendChild(form);
  var tbody = document.getElementById('tbodyId');

  var tr = document.createElement('tr');
  var td = document.createElement('td');
  td.setAttribute('align', 'center');
  td.colSpan = 3;
  td.setAttribute('id', descrArr[0][1]);
  td.innerHTML = descrArr[0][0];
  tr.appendChild(td);
  tbody.appendChild(tr);
  for(i=1; i<10; i++){
    var tr = document.createElement('tr');
    var td = document.createElement('td');
    if(i==6){
      td.setAttribute('align', 'center');
	  td.colSpan = 3;
      td.setAttribute('id', descrArr[i][1]);
      td.innerHTML = descrArr[i][0];
    }else{
      var descrId = 'descr'+i;
      td.setAttribute('id', descrId);
      td.className = 'descr';
      td.setAttribute('align', 'right');
      td.innerHTML = descrArr[i][0];
      tr.appendChild(td);
      var td = document.createElement('td');
      td.setAttribute('width', '"6"');
      var inp = document.createElement('input');
      inp.setAttribute('type', 'text');
      var idInp=descrArr[i][1];
      inp.setAttribute('id', idInp);
      inp.setAttribute('name', idInp);
      inp.setAttribute('size', '6');
			inp.className = 'inp';
      if(i>0 && i<5){
        inp.onchange = function(){checkField();}
      }else if(i==5){
        inp.onclick = function(){checkField();}
      }else if(i>6 && i<9){
        inp.onchange = function(){checkFieldCalories();}
      }else if(i==9){
        inp.onclick = function(){checkFieldCalories();}
      }
      td.appendChild(inp);
      if(i==5){
        td.onmousemove = function(){setBlur();}
      }else if(i==9){
        td.onmousemove = function(){setBlur();}
      }
      tr.appendChild(td);
      var td = document.createElement('td');
      td.setAttribute('id', 'tdEmpty');
    }
    tr.appendChild(td);
    tbody.appendChild(tr);
  }
  var tr = document.createElement('tr');
  var td = document.createElement('td');
  td.setAttribute('id', 'logo');
  td.setAttribute('align', 'left');
  var ahref = document.createElement('a');
  ahref.setAttribute('href', 'http://www.ais.pl');
  var img = document.createElement('img');
  img.setAttribute('src', filesrc);
  img.setAttribute('border', '0');
  img.setAttribute('alt', 'www.ais.pl');
  ahref.appendChild(img);
  td.appendChild(ahref);
  tr.appendChild(td);
  var td = document.createElement('td');
  td.setAttribute('id', 'tdReset');
  td.setAttribute('align', 'left');
  td.setAttribute('valign', 'top');
  td.colSpan = 2;
  var button = document.createElement('input');
  button.setAttribute('id', 'buttReset');
  button.type = 'reset';
  button.setAttribute('value', descrArr[10][0]);
  td.appendChild(button);
  tr.appendChild(td);
  tbody.appendChild(tr);
  document.getElementById('savings').readOnly = true;
  document.getElementById('calories').readOnly = true;
}

function setBlur(){
  document.getElementById('savings').focus();
  document.getElementById('savings').blur();
  document.getElementById('calories').focus();
  document.getElementById('calories').blur();
}

// validation fields for savings calculator; If these values are correct, savings will be calculated.
function checkField(){
  var dist = replacePoint(document.getElementById('distance').value);
  var work = document.getElementById('work').value;
  var price = replacePoint(document.getElementById('price').value);
  var fuel = document.getElementById('fuel').value;
  if(dist!='' && work!='' && price!='' && fuel!=''){
    var dispAl = new Array();
    var count = 0;
    var flag = true;
    if(dist!=''){
     var c = isFloat(dist,1);
      if(c!=-1){
        flag = false;
        dispAl[count] = c;
        count++;
      }
    }
    if(work!=''){
      var c = isInteger(work,2);
      if(c!=-1){
        flag = false;
        dispAl[count] = c;
        count++;
      }
    }
    if(price!=''){
      var c = isFloat(price,4);
      if(c!=-1){
        flag = false;
        dispAl[count] = c;
        count++;
      }
    }
    if(fuel!=''){
      var c = isInteger(fuel,5);
      if(c!=-1){
        flag = false;
        dispAl[count] = c;
        count++;
      }
    }
    if(!flag){
      var err = '';
      for(k=0;k<count;k++){
        err += alertsEn[dispAl[k]] + '\n';
      }
      alert(err);
      return false;
    }
    calculateSavings(dist, work, price, fuel);
  }
  return true;
}

// validation fields for calories calculator; If these values are correct, calories will be calculated.
function checkFieldCalories(){
  var dist = replacePoint(document.getElementById('distance').value);
  var time = document.getElementById('time').value;
  var weight = document.getElementById('weight').value;
  if(dist!='' && time!='' && weight!=''){
    var dispAl = new Array();
    var count = 0;
    var flag = true;
    if(dist!=''){
      var c = isFloat(dist,1);
      if(c!=-1){
        flag = false;
        dispAl[count] = c;
        count++;
      }
    }
    if(time!=''){
      var c = isInteger(time,9);
      if(c!=-1){
        flag = false;
        dispAl[count] = c;
        count++;
      }
    }
    if(weight!=''){
      var c = isInteger(weight,10);
      if(c!=-1){
        flag = false;
        dispAl[count] = c;
        count++;
      }
    }
    if(!flag){
      var err = '';
      for(k=0;k<count;k++){
        err += alertsEn[dispAl[k]] + '\n';
      }
      alert(err);
      return false;
    }
    calculateCalories(dist, time, weight);
  }
  return true;
}

// calculates savings and returns result
function calculateSavings(dist, work, price, fuel){
  var distFl = parseFloat(dist);
  var priceFl = parseFloat(price);
  var workFl = parseFloat(work);
  var fuelFl = parseFloat(fuel);
  var save = eval(distFl*2*(workFl)*priceFl/fuelFl);
  document.getElementById('savings').value = save.toFixed(2).toString().replace('.',',');
  return true;
}

// calculate calories
function calculateCalories(dist, time, weight){
  var distFl = parseFloat(dist);
  var timeMinFl = parseFloat(time);
  var weightFl = parseFloat(weight);
  calc(distFl, timeMinFl, weightFl);
}

// calculates calories and returns burned calories
function calc(distFl, timeMinFl, weightFl){
  var avgSpeed = eval(2*distFl/(timeMinFl/60));
  // calculate the baseline value
  var base = eval((8.79618*Math.pow(10, -6) * Math.pow(avgSpeed, 3) -
                   1.46998*Math.pow(10, -4) * Math.pow(avgSpeed, 2) +
                   0.00359*avgSpeed + 0.00556) * weightFl);
  // surface area adjustment
  var modBase = eval(base-(weightFl-154.0)/200.0*base );
  // riding rostion adjustment
  if(avgSpeed > 15.0){
    modBase = eval(modBase+(-0.66893+0.0467*avgSpeed)*modBase);
  }
  // total calorie expenditure
  var totalCals = eval(modBase*timeMinFl);
  document.getElementById('calories').value = totalCals.toFixed(2).toString().replace('.',',');
}

// validation for integer numbers
function isInteger(inp, row){
  var alertNumber = -1;
  if(inp=='0'){
    if(row == 2) alertNumber = 3;
    if(row == 5) alertNumber = 9;
    if(row == 9) alertNumber = 15;
    if(row == 10) alertNumber = 17;
    return alertNumber;
  }
  if(inp.charAt(0)=='0' && inp.charAt(1)!='.'){
    return displayAlerts(row);
  }
  if(parseInt(inp)){
    for(i=0;i<inp.length;i++){
      if(inp.charAt(i)!='0' && !parseInt(inp.charAt(i))){
        return displayAlerts(row);
      }
    }
    return -1;
  }else{
    return displayAlerts(row);
  }
}

// returns number of alerts for errors of integer validation
function displayAlerts(row){
  if(row == 2) return 2;
  if(row == 5) return 8;
  if(row == 9) return 14;
  if(row == 10) return 16;
}

// validation for float numbers
function isFloat(inp, row){
  var alertNumber = -1;
  if(inp=='0'){
    if(row == 1) alertNumber = 1;
    if(row == 4) alertNumber = 7;
    return alertNumber;
  }
  if(parseFloat(inp)){
    var count=0;
    var dec = 0;
    var flag = true;
    var flagDec = true;
    if(inp.charAt(0)=='0' && inp.charAt(1)!='.'){
      flag = false;
    }else{
      for(i=0;i<inp.length;i++){
        if(inp.charAt(i)!='0' && !parseInt(inp.charAt(i))){
          if(inp.charAt(i)=='.'){
            count++;
          }else{
            flag = false;
          }
        }else{
          if(row==1 && count==1){
            dec++;
            if(dec>1){
              flagDec = false;
            }
          }
          if(row == 4 && count==1){
            dec++;
            if(dec>2){
              flagDec = false;
            }
          }
        }
      }
    }
    if(flag && flagDec && count<=1){
      return -1;
    }
  }
  if(row == 1) alertNumber = 0;
  if(row == 4) alertNumber = 6;
  return alertNumber;
}

// replaces commas with points
function replacePoint(word){
  if(word.toString().search(",")>=0){
    var newWord = word.toString().replace(',','.');
    return newWord;
  }
  return word;
}

