// DragGuess.js
 
// args: element - the input button that triggers this event handler
function onCalculate(element) {
  form = element.form;
  
  clearValues(form);

  var usertime1 = 0;
  var userdist1 = 0;
  var usertime2 = 0;
  var userdist2 = 0;
      
  var distArray = new Array("60","330","660","1000","1320");
  for (i=1;;i++) {
    var elem = form.elements["input"+i];
    if (elem == undefined)  break;          // beyond last field
    if (elem.value != "") {
       if (!checkDouble(elem)) return false;
       if (userdist1 == 0) {
         usertime1 = parseFloat(elem.value);
         userdist1 = distArray[i-1];
       } else if (userdist2 == 0) {
         usertime2 = parseFloat(elem.value);
         userdist2 = distArray[i-1];
       } else {
         alert ("WARNING: More than 2 values entered.\n"
               +"Using the first two: "+userdist1+" ("+usertime1+") and "+userdist2+" ("+usertime2+")");
         elem.value = ""; 
       }
    }
  } 
  
  if (!checkInputs(usertime1,userdist1,usertime2,userdist2)) return false;

  var Fudge1 = 1.0;
  var Fudge2 = 1.5;
  var LeastDelta = 1000000;
  var Factor = 0;
  for (i=1.4;i<=1.8;i+=0.001) {
    var guess1 = userdist1 / ((1 - 1 / (Math.pow(usertime1,Fudge1) + Fudge2)) * Math.pow(usertime1,i));
    var guess2 = userdist2 / ((1 - 1 / (Math.pow(usertime2,Fudge1) + Fudge2)) * Math.pow(usertime2,i));
    var delta = Math.abs(guess2 - guess1);
    if (delta < LeastDelta) {
      LeastDelta = delta;
      Factor = i;
    }
  }

  
  var Cons = userdist2 / ((1 - 1 / (Math.pow(usertime2,Fudge1) + Fudge2)) * Math.pow(usertime2,Factor));

  var speedArray = new Array();
  var timeArray = new Array();
  var distArray = new Array();
  var accelArray = new Array();

  var Time15 = 0;
  var Time30 = 0;
  var Time45 = 0;
  var Time60 = 0;
  var Time75 = 0;
  var Time90 = 0;
  var Time100 = 0;
  var Time110 = 0;
  var Time125 = 0;
  var Time140 = 0;
  var TrapSpeed = 0;
  var EighthSpeed = 0;

  for (i=0;i<=2000;i++) {
    timeArray[i] = i / 10;
    distArray[i] = Cons * (1 - 1 / (Math.pow(timeArray[i],Fudge1) + Fudge2)) * Math.pow(timeArray[i],Factor);
    if (i > 0) {
      speedArray[i] = (distArray[i] - distArray[i-1]) / (timeArray[i] - timeArray[i-1]);
      speedArray[i] = speedArray[i] * 3600 / 5280;
      accelArray[i] = speedArray[i] - speedArray[i-1];
      accelArray[i] = accelArray[i] * 5280 / 3600;
      accelArray[i] = accelArray[i] / (timeArray[i] - timeArray[i-1]);
    }
  
  
 
    if (distArray[i] - 60 >= 0 && distArray[i-1] - 60 < 0) {
      var percent = Math.abs((distArray[i-1] - 60) / (distArray[i] - distArray[i-1]))
      var Speed60 = speedArray[i-1] + percent * (speedArray[i] - speedArray[i-1])
      var Calc60  = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1])
      form.mph1.value = Speed60.toFixed(1);
      form.calc1.value = Calc60.toFixed(2);
    }
    if (distArray[i] - 330 >= 0 && distArray[i-1] - 330 < 0) {
      var percent = Math.abs((distArray[i-1] - 330) / (distArray[i] - distArray[i-1]))
      var Speed330 = speedArray[i-1] + percent * (speedArray[i] - speedArray[i-1])
      var Calc330  = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1])
      form.mph2.value = Speed330.toFixed(1);
      form.calc2.value = Calc330.toFixed(2);
    }
    if (distArray[i] - 660 >= 0 && distArray[i-1] - 660 < 0) {
      var percent = Math.abs((distArray[i-1] - 660) / (distArray[i] - distArray[i-1]))
      var Speed660 = speedArray[i-1] + percent * (speedArray[i] - speedArray[i-1])
      var Calc660  = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1])
      form.mph3.value = Speed660.toFixed(1);
      form.calc3.value = Calc660.toFixed(2);
    }
    if (distArray[i] - 1000 >= 0 && distArray[i-1] - 1000 < 0) {
      var percent = Math.abs((distArray[i-1] - 1000) / (distArray[i] - distArray[i-1]))
      var Speed1000 = speedArray[i-1] + percent * (speedArray[i] - speedArray[i-1])
      var Calc1000  = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1])
      form.mph4.value = Speed1000.toFixed(1);
      form.calc4.value = Calc1000.toFixed(2);
    }
    if (distArray[i] - 1320 >= 0 && distArray[i-1] - 1320 < 0) {
      var percent = Math.abs((distArray[i-1] - 1320) / (distArray[i] - distArray[i-1]))
      var Speed1320 = speedArray[i-1] + percent * (speedArray[i] - speedArray[i-1])
      var Calc1320 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1])
      form.mph5.value = Speed1320.toFixed(1);
      form.calc5.value = Calc1320.toFixed(2);
      var lastI = i;
    }
    if (i > lastI + 25) break;

 
    if (speedArray[i] - 15 > 0 && speedArray[i-1] - 15 < 0) {
      var percent = Math.abs((speedArray[i-1] - 15) / (speedArray[i] - speedArray[i-1]));
      Time15 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1]);
      form.tomph15.value = Time15.toFixed(2);
    }
    if (speedArray[i] - 30 > 0 && speedArray[i-1] - 30 < 0) {
      var percent = Math.abs((speedArray[i-1] - 30) / (speedArray[i] - speedArray[i-1]));
      Time30 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1]);
      form.tomph30.value = Time30.toFixed(2);
    }
    if (speedArray[i] - 45 > 0 && speedArray[i-1] - 45 < 0) {
      var percent = Math.abs((speedArray[i-1] - 45) / (speedArray[i] - speedArray[i-1]));
      Time45 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1]);
      form.tomph45.value = Time45.toFixed(2);
    }
    if (speedArray[i] - 60 > 0 && speedArray[i-1] - 60 < 0) {
      var percent = Math.abs((speedArray[i-1] - 60) / (speedArray[i] - speedArray[i-1]));
      Time60 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1]);
      var Accel60 = (accelArray[i-1] - percent * Math.abs(accelArray[i] - accelArray[i-1])) / 32;
      form.tomph60.value = Time60.toFixed(2);
      form.gforce.value = Accel60.toFixed(2);
    }
    if (speedArray[i] - 75 > 0 && speedArray[i-1] - 75 < 0) {
      var percent = Math.abs((speedArray[i-1] - 75) / (speedArray[i] - speedArray[i-1]));
      Time75 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1]);
      form.tomph75.value = Time75.toFixed(2);
    }
    if (speedArray[i] - 90 > 0 && speedArray[i-1] - 90 < 0) {
      var percent = Math.abs((speedArray[i-1] - 90) / (speedArray[i] - speedArray[i-1]));
      Time90 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1]);
      form.tomph90.value = Time90.toFixed(2);
    }
    if (speedArray[i] - 100 > 0 && speedArray[i-1] - 100 < 0) {
      var percent = Math.abs((speedArray[i-1] - 100) / (speedArray[i] - speedArray[i-1]));
      Time100 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1]);
      form.tomph100.value = Time100.toFixed(2);
    }
    if (speedArray[i] - 110 > 0 && speedArray[i-1] - 110 < 0) {
      var percent = Math.abs((speedArray[i-1] - 110) / (speedArray[i] - speedArray[i-1]));
      Time110 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1]);
      form.tomph110.value = Time110.toFixed(2);
    }
    if (speedArray[i] - 125 > 0 && speedArray[i-1] - 125 < 0) {
      var percent = Math.abs((speedArray[i-1] - 125) / (speedArray[i] - speedArray[i-1]));
      Time125 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1]);
      form.tomph125.value = Time125.toFixed(2);
    }
    if (speedArray[i] - 140 > 0 && speedArray[i-1] - 140 < 0) {
      var percent = Math.abs((speedArray[i-1] - 140) / (speedArray[i] - speedArray[i-1]));
      Time140 = timeArray[i-1] + percent * (timeArray[i] - timeArray[i-1]);
      form.tomph140.value = Time140.toFixed(2);
    }
  
    if (distArray[i] > 1254 && TrapSpeed == 0) {
      TrapSpeed = speedArray[i] + 1000;
    }
    if (distArray[i] > 1320 && TrapSpeed > 1000) {
      TrapSpeed = ((TrapSpeed - 1000) + speedArray[i]) / 2;
      form.trap5.value = TrapSpeed.toFixed(1);
    }
    if (distArray[i] > 594 && EighthSpeed == 0) {
      EighthSpeed = speedArray[i] + 1000;
    }
    if (distArray[i] > 660 && EighthSpeed > 1000) {
      EighthSpeed = ((EighthSpeed - 1000) + speedArray[i]) / 2;
      form.trap3.value = EighthSpeed.toFixed(1);
    }
  
  } // End 2000 iteration loop

  if (Calc1320 > 0 && Calc60 > 0 ) {
    var Ratio = Calc1320 / Calc660;
    form.ratio.value = Ratio.toFixed(2);
  }
}

function onClear(element) {
  form = element.form;
  clearInputs(form);
  clearValues(form);
}

function clearInputs(form) {
  for (i=1;i<=5;i++) {
    var elem = form.elements["input"+i];
    if (elem == undefined)  break;          // beyond last field
    elem.value = "";
  }    
}

function clearValues(form) {
  for (i=1;i<=5;i++) {
    var elem = form.elements["mph"+i];
    if (elem == undefined)  break;          // beyond last field
    elem.value = "";
    form.elements["calc"+i].value = "";
    form.elements["trap"+i].value = "";
  }    
  form.tomph15.value = "";
  form.tomph30.value = "";
  form.tomph45.value = "";
  form.tomph60.value = "";
  form.tomph75.value = "";
  form.tomph90.value = "";
  form.tomph100.value = "";
  form.tomph110.value = "";
  form.tomph125.value = "";
  form.tomph125.value = "";
  form.tomph140.value = "";

  form.ratio.value = "";
  form.gforce.value = "";

}

//------------------------------------------------------------------------------
// Check input numbers to see if they are reasonable
//------------------------------------------------------------------------------
function checkInputs(t1,d1,t2,d2) {
  var ok = true;
  if (d1 == 60  && (t1<1 || t1>3)) ok = false;
  if (t1 > t2) ok = false;
  if (d1 == 660 && d2 == 1320) {
    var ratio = t2/t1;
    if (ratio < 1.45 || ratio > 1.65) ok = false;
  }

  if (!ok) {
     alert(" "+t1+" "+d1+" "+t2+" "+d2);
     alert ("ERROR: Values NOT within reasonable range for calculation.");
     return false;
  }
  return true;


}

//------------------------------------------------------------------------------
// Check for non-null 'double' value.  Strip lead/trail blanks if any.
//------------------------------------------------------------------------------
function checkDouble(element) {
  if (element == undefined)  return true;   // non-existent element can't be in error
  if (!stripBlanks(element,true))  return false;
  if (!checkNull(element))     return false;
  if (!checkNumeric(element))  return false;
  return true;
}

//------------------------------------------------------------------------------
// Check element for valid numeric value
//------------------------------------------------------------------------------
function checkNumeric(element) {
  if (element == undefined)  return true;   // non-existent element can't be in error
  var val = element.value;
  if (isNaN(val)) {
    alert("ERROR: Non numeric value [" + val + "] entered in numeric field.");
    focusSelect(element);
    return false;
  }
  return true;
}

//------------------------------------------------------------------------------
// Check element for null value, alert error and return false
//------------------------------------------------------------------------------
function checkNull(element) {
  if (element == undefined)  return true;   // non-existent element can't be in error
  if (element.value == "") {
    alert("ERROR: Null value in is not permitted.");
    focusSelect(element);
    return false;
  }
  return true;
}

//------------------------------------------------------------------------------
// Strip leading/trailing blanks in element.value, optionally check for embedded blanks.
// Args: element - form element to check and repair value
//       embedCheck - boolean whether to alert and return false for embedded blanks.  Default=false
//------------------------------------------------------------------------------
function stripBlanks(element) { return stripBlanks(element,false); }
function stripBlanks(element,embedCheck) {
  if (element == undefined)  return true;   // non-existent element can't be in error
  element.value = trim(element.value);
  if (embedCheck) return checkBlanks(element);
  return true;
}

//------------------------------------------------------------------------------
// Check for embedded blanks in element.value.  If found, alert and return false.  Else return true.
// Args: element - form element to check
// Return: boolean whether element is ok (free of embedded blanks)
//------------------------------------------------------------------------------
function checkBlanks(element) {
  if (element == undefined)  return true;   // non-existent element can't be in error
  if (element.value.search(" ") != -1) {
    alert("ERROR: Invalid input. [" + element.value + "] has embedded blank(s).");
    focusSelect(element);
    return false;
  }
  return true;
}

//------------------------------------------------------------------------------
// Strip leading/trailing blanks in str.
// Args: str - javascript String
//------------------------------------------------------------------------------
function trim(str) {
  if (str.search(" ") == -1)  return str;  // no " " in str
  var fr = /^\s+/g;
  var ba = /\s+$/g;
  str = str.replace(fr,"");
  str = str.replace(ba,"");
  return str;
}

//------------------------------------------------------------------------------
// Put the focus on a form element.  If text element, also select it.
//------------------------------------------------------------------------------
function focusSelect(element) {
  element.focus();
  if (element.type.toLowerCase() == "text")  element.select();
}