//*******************************************************************************
//  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
//
//*******************************************************************************

// Polish version
// unit: km, meter, liter, kg

var descrArrPlKm = new Array();
descrArrPlKm[0]	= new Array('Ile zaoszczędzisz, jadąc do pracy<br />rowerem zamiast samochodem?', 'title');
descrArrPlKm[1]	= new Array('Odległość do pracy (km):', 'distance');
descrArrPlKm[2]	= new Array('Liczba dni pracy:', 'work');
descrArrPlKm[3]	= new Array('Cena paliwa (za litr):', 'price');
descrArrPlKm[4]	= new Array('Spalanie (litr/100km):', 'fuel');
descrArrPlKm[5]	= new Array('Oszczędność:', 'savings');
descrArrPlKm[6]	= new Array('Ile spalisz kalorii, jadąc rowerem?', 'titleCal');
descrArrPlKm[7] = new Array('Czas jazdy (minuty):', 'time');
descrArrPlKm[8] = new Array('Masa ciała (kg):', 'weight');
descrArrPlKm[9] = new Array('Spalone kalorie:', 'calories');
descrArrPlKm[10] = new Array('Wyczyść', 'reset');

// alerts for validation
var alertsPl = new Array();
alertsPl[0]='Odległość musi być w formacie \"9,9\" lub \"9.9\"!';
alertsPl[1]='Odległość musi być większa od 0!';
alertsPl[2]='Liczba dni pracy musi być liczbą całkowitą!';
alertsPl[3]='Liczba dni pracy musi być większa od 0!';
alertsPl[6]='Cena musi być w formacie \"9,99\" lub \"9.99\"!';
alertsPl[7]='Cena musi być większa od 0!';
alertsPl[8]='Spalanie musi być liczbą całkowitą!';
alertsPl[9]='Spalanie musi być większe od 0!';

alertsPl[14]='Czas jazdy musi być liczbą całkowitą!';
alertsPl[15]='Czas jazdy musi być większy od 0!';
alertsPl[16]='Masa ciała musi być liczbą całkowitą!';
alertsPl[17]='Masa ciała musi być większa od 0!';

// generates calculator in html
function generateCalculator(id, filesrc){
  var descrArr = descrArrPlKm;
  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');
      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('id', 'ais4');
  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 += alertsPl[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 += alertsPl[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/100);
  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);
  distFl = eval(distFl*0.621371192); // multiplied by 1 mile
  weightFl = eval(weightFl*2.20462262); // multiplied by 1 pound
  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;
}
