function isPosNumber(v) {
  var vstr = v + "";
  if (vstr != "") {
    oneDecimal = false;
    for (var i = 0; i < vstr.length; i++) {
      var oneChar = vstr.charAt(i);
      if (oneChar == "." && !oneDecimal) {
        oneDecimal = true;
        continue;
      }
      if (oneChar < "0" || oneChar > "9") {
        return false;
      }
    }
  }
  return true;
}

function isTime(v) {
  var vstr = v + "";
  if (vstr != "") {
    var vArray = vstr.split(":");
    if (vArray.length > 3) return false;
    else if (vArray.length == 3) {
      if (!isPosInteger(vArray[0])) return false;
      if (!isPosInteger(vArray[1]) || vArray[1] >= 60) return false;
      if (!isPosNumber(vArray[2]) || vArray[2] >= 60) return false;
    }
    else if (vArray.length == 2) {
      if (!isPosInteger(vArray[0]) || vArray[1] >= 60) return false;
      if (!isPosNumber(vArray[1]) || vArray[1] >= 60) return false;
    }
    else if (vArray.length == 1) {
      if (!isPosNumber(vArray[0]) || vArray[1] >= 60) return false;
    }
  }
  return true;
}

function isPosInteger(v) {
  var vstr = v + "";
  if (vstr != "") {
    for (var i = 0; i < vstr.length; i++) {
      if (vstr.charAt(i) < "0" || vstr.charAt(i) > 9) return false;
    }
  }
  return true;
}

function validate(form) {
  if (!isPosNumber(form.dist.value)) {
    clearfield(form.dist);
    alert('Distance must be a positive integer or decimal number');
    return false;
  }
  if (!isTime(form.time.value)) {
    clearfield(form.time);
    alert('Time must be numeric and of the form hh:mm:ss');
    return false;
  }
  if (!isTime(form.pace.value)) {
    clearfield(form.pace);
    alert('Pace must be numeric and of the form hh:mm:ss');
    return false;
  }
  return true;
}

function clearfield(field) {
  field.value = "";
}

function format(expr, decplaces) {
  var str = "" + Math.round(eval(expr) * Math.pow(10, decplaces));
  while (str.length <= decplaces) str = "0" + str;
  var decpoint = str.length - decplaces;
  var right = str.substring(decpoint, str.length);
  if (right == "00") right = ""; else right = "." + right;
  return str.substring(0, decpoint) + right;
}

function fieldcount(form) {
  var fields = 0;
  if (form.time.value != "") fields++;
  if (form.dist.value != "") fields++;
  if (form.pace.value != "") fields++;
  return fields;
}

function checkform(form, v) {
  var numfields = fieldcount(form);
  if (numfields == 2 && v == "") {
    if (validate(form)) calculate(form);
  }
}

function calculate(form) {
var h1, m1, s1, h2, m2, s2, time1, time2, dist;
var empty = "";

var timestr = form.time.value;
var timearray = timestr.split(":");

if (timestr != "") {
  var timecount = timearray.length;
  for (var j = 0; j < timearray.length; j++) {
    if (timearray[j] == "") timearray[j] = 0;
  }
  if (timecount == 3) {
    s1 = parseInt(timearray[2], 10);
    m1 = parseInt(timearray[1], 10);
    h1 = parseInt(timearray[0], 10);
  }
  else if (timecount == 2) {
    s1 = parseInt(timearray[1], 10);
    m1 = parseInt(timearray[0], 10);
    h1 = 0;
  }
  else if (timecount == 1) {
    s1 = parseInt(timearray[0], 10);
    m1 = 0;
    h1 = 0;
  }
}
time1 = (h1 * 60) + m1 + (s1 / 60);

var pacestr = form.pace.value;
var pacearray = pacestr.split(":");

if (pacestr != "") {
  var pacecount = pacearray.length;
  for (var k = 0; k < pacearray.length; k++) {
    if (pacearray[k] == "") pacearray[k] = 0;
  }
  if (pacecount == 3) {
    s2 = parseInt(pacearray[2], 10);
    m2 = parseInt(pacearray[1], 10);
    h2 = parseInt(pacearray[0], 10);
  }
  else if (pacecount == 2) {
    s2 = parseInt(pacearray[1], 10);
    m2 = parseInt(pacearray[0], 10);
    h2 = 0;
  }
  else if (pacecount == 1) {
    s2 = parseInt(pacearray[0], 10);
    m2 = 0;
    h2 = 0;
  } 
}
time2 = (h2 * 60) + m2 + (s2 / 60);

if (form.dist.value != "") {
  if (form.disttype.selectedIndex == 0) dist = form.dist.value * 1000;
  else if (form.disttype.selectedIndex == 1) dist = form.dist.value * 1609.34;
  else if (form.disttype.selectedIndex == 2) dist = form.dist.value;
  else if (form.disttype.selectedIndex == 3) dist = form.dist.value / 1.093616;
  
  if (timestr == "") empty = "time"; else empty = "pace";
}
else empty = "dist";

var h, m, s;
var hstr, mstr, sstr;
var thepace = 0;

if (empty == "pace") {
  //time1 / dist --> minutes / meters
  if (form.pacetype.selectedIndex == 0) thepace = (time1 / dist) * 1000; //per kilometer
  else thepace = (time1 / dist) * 1609.34; //per mile
  h = parseInt(thepace / 60, 10);
  m = parseInt(thepace % 60, 10);
  s = parseInt((thepace - parseInt(thepace)) * 60, 10);
  if (h < 10) hstr = "0" + h; else hstr = h;
  if (m < 10) mstr = "0" + m; else mstr = m;
  if (s < 10) sstr = "0" + s; else sstr = s;
  if (isNaN(hstr)) hstr = "00";
  if (isNaN(mstr)) mstr = "00";
  if (isNaN(sstr)) sstr = "00";
  form.pace.value = hstr + ":" + mstr + ":" + sstr;
}
else if (empty == "dist") {
  if (form.pacetype.selectedIndex == 0) { //per kilometer
    var kilometers = time1 / time2;
    if (form.disttype.selectedIndex == 0) form.dist.value = format(kilometers, 2); //kilometers
    else if (form.disttype.selectedIndex == 1) form.dist.value = format(kilometers * .62137274, 2); //miles
    else if (form.disttype.selectedIndex == 2) form.dist.value = format(kilometers * 1000, 2); //meters
    else form.dist.value = format(kilometers * 1093.6160165, 2); //yards 
  }  
  else { //per mile
    var miles = time1 / time2; 
    if (form.disttype.selectedIndex == 0) form.dist.value = format(miles * 1.60934, 2);
    else if (form.disttype.selectedIndex == 1) form.dist.value = format(miles, 2);
    else if (form.disttype.selectedIndex == 2) form.dist.value = format(miles * 1609.34, 2);
    else form.dist.value = format(miles * 1760, 2);
  }
}
else if (empty == "time") {
  var tempdist = form.dist.value;
  
  if (form.pacetype.selectedIndex == 0) { //per kilometer
    if (form.disttype.selectedIndex == 1) tempdist *= 1.60934; //miles
    else if (form.disttype.selectedIndex == 2) tempdist /= 1000; //meters
    else if (form.disttype.selectedIndex == 3) tempdist /= 1093.6160165; //yards
  }
  else { //per mile
    if (form.disttype.selectedIndex == 0) tempdist *= .62137274; //k
    else if (form.disttype.selectedIndex == 2) tempdist /= 1609.34;
    else if (form.disttype.selectedIndex == 3) tempdist /= 1760;
  }
  thepace = tempdist * time2;
  h = parseInt(thepace / 60, 10);
  m = parseInt(thepace % 60, 10);
  s = parseInt((thepace - parseInt(thepace)) * 60, 10);
  if (h < 10) hstr = "0" + h; else hstr = h;
  if (m < 10) mstr = "0" + m; else mstr = m;
  if (s < 10) sstr = "0" + s; else sstr = s;
  if (isNaN(hstr)) hstr = "00";
  if (isNaN(mstr)) mstr = "00";
  if (isNaN(sstr)) sstr = "00";
  form.time.value = hstr + ":" + mstr + ":" + sstr;
}
}
