function getLimitation (f, rpm, motorAmps, motorVoltage, speed, maxSpeed, limitation)
{

  if (parseFloat (rpm.value) > parseFloat (f.motorMaxRpm.value))
  {
    limitation.value = "Motor RPM";

    maxSpeed.value = speed;

    return 1;
  }

  if (parseFloat (motorAmps.value) > parseFloat (f.controllerMaxAmps.value))
  {
    limitation.value = "Controller amps";

    maxSpeed.value = speed;

    return 1;
  }

  if (parseFloat (motorVoltage.value) > parseFloat (f.voltage.value))
  {
    limitation.value = "Battery voltage";

    maxSpeed.value = speed;

    return 1;
  }

  return 0;
}
function getTopSpeed (f, f6, gearRatio, topSpeed, limitation)
{
  var speed;
  var rpm;
  var motorAmps;
  var motorVolts;
  var torque;

  limitation.value = "no limit";
  topSpeed.value   = 200;

  for (speed = 10; speed < 200; speed = speed + 10)
  {
    rpm = getMotorRpm (f6, speed, gearRatio);

    if (parseFloat (rpm) > parseFloat (f.motorMaxRpm.value))
    {
      limitation.value = "Motor RPM";

      topSpeed.value = speed;

      break;
    }

    torque = getMotorTorque (f, f6, speed, gearRatio);

    motorAmps = getMotorCurrent (f, torque);

    if (parseFloat (motorAmps.value) > parseFloat (f.controllerMaxAmps.value))
    {
      limitation.value = "Controller amps";

      topSpeed.value = speed;

      break;
    }

    motorVolts = getMotorVoltage (f, rpm, torque);
 
    if (parseFloat (motorVolts) > parseFloat (f.voltage.value))
    {
      limitation.value = "Battery voltage";

      topSpeed.value = speed;

      break;
    }
  }

  for (speed = speed - 10; speed < 200; speed++)
  {
    rpm = getMotorRpm (f6, speed, gearRatio);

    if (parseFloat (rpm) > parseFloat (f.motorMaxRpm.value))
    {
      limitation.value = "motor RPM";

      topSpeed.value = speed;

      break;
    }

    torque = getMotorTorque (f, f6, speed, gearRatio);

    motorAmps = getMotorCurrent (f, torque);

    if (parseFloat (motorAmps.value) > parseFloat (f.controllerMaxAmps.value))
    {
      limitation.value = "Controller amps";

      topSpeed.value = speed;

      break;
    }

    motorVolts = getMotorVoltage (f, rpm, torque);
 
    if (parseFloat (motorVolts) > parseFloat (f.voltage.value))
    {
      limitation.value = "Battery voltage";

      topSpeed.value = speed;

      break;
    }
  }
}

function calcTopSpeed (d)
{
  getTopSpeed (d.forms[0], d.forms[6], d.forms[0].gearRatio1, d.forms[6].topSpeed1, d.forms[6].limitation1);
  getTopSpeed (d.forms[0], d.forms[6], d.forms[0].gearRatio2, d.forms[6].topSpeed2, d.forms[6].limitation2);
  getTopSpeed (d.forms[0], d.forms[6], d.forms[0].gearRatio3, d.forms[6].topSpeed3, d.forms[6].limitation3);
  getTopSpeed (d.forms[0], d.forms[6], d.forms[0].gearRatio4, d.forms[6].topSpeed4, d.forms[6].limitation4);
  getTopSpeed (d.forms[0], d.forms[6], d.forms[0].gearRatio5, d.forms[6].topSpeed5, d.forms[6].limitation5);
}

