//==================================================================
// The Gear-and-Overdrive Ratio Computer
//
// Features:
// - Calculates Overdrive Ratio (basic mode)
// - Calculates any pully or wheel diameter from the other arguments
//   passed to the script by Radio button selection.
// - Calculates shiftpoint (rear wheel) speeds.
//
//
//==================================================================

//------------------------------------------------------------------
  function checkNumber(input, min, max, msg) {
        var str = input.value;

        if (str == null || str.length == 0) {
                msg = msg + " não contém valor!";
                alert(msg);
                return false;
        }

        for (var i = 0; i < str.length; i++) {
            var ch = str.substring(i, i + 1)
            if ((ch < "0" || "9" < ch) && ch != '.') {
                msg = msg + " so pode conter caracteres numéricos."
                alert(msg);
                return false;
            }
        }


        var num = 0 + str
        if (num < min || max < num) {
            msg = msg + ": Tem de ser um numero entre " + min + " e " + max + ".";
            alert(msg);
            return false;
        }
        input.value = str;
        return true;
    }

//------------------------------------------------------------------
    function truncate(input) {
        var str = "" + input.value;
        return str.substring(1, 7) * 1;
    }

//------------------------------------------------------------------
   function computeField(input) {
        input.form.info.value = "Dados alterados! Volte a calcula!"
        
    }

//------------------------------------------------------------------
   function computeTarget(input) {
        if (input.value != null && input.value.length != 0)
            input.form.calculate.value = input.value;

        if (input.value == "RRT") input.form.calcbutton.value = "Diametro Pneu Tras.";
        if (input.value == "RRP") input.form.calcbutton.value = "Pully Traseira";
        if (input.value == "TRP") input.form.calcbutton.value = "Pully Tras. Cx.Vel.";
        if (input.value == "TFP") input.form.calcbutton.value = "Pully Dian. Cx.Vel.";
        if (input.value == "MRP") input.form.calcbutton.value = "Pulley Central Tras.";
        if (input.value == "MFP") input.form.calcbutton.value = "Pulley Central Dian.";
        if (input.value == "FFP") input.form.calcbutton.value = "Pully Dianteira";
        if (input.value == "FFT") input.form.calcbutton.value = "Diametro Pneu Dian.";
        if (input.value == "ODR") input.form.calcbutton.value = "Overdrive Ratio";
    }

//------------------------------------------------------------------
//      Basic Formulae:
//
//            FFT * RRP * TFP * MFP
//      ODR = ----------------------
//            RRT * TRP * MRP * FFP
//
//                          gear1engine * TRP 
//      TopSpeed1 = RPM1 * ------------------- * RRT * pi  [mm/minute]
//                          gear1axle   * RRP
//
//                          gear2engine * TRP
//      TopSpeed2 = RPM2 * ------------------- * RRT * pi  [mm/minute]
//                          gear2axle   * RRP
//
//      speedkmh = [mm/minute] * 60/1000000
//      speedmph = speedkmh * 0.621371192237
//
//                         gear1engine    gear2axle
//      shiftrpm = RPM1 * ------------ * -----------
//                         gear1axle      gear2engine
//
    function computeForm(form) {
        if (
            (form.fronttirediameter.value   == null || form.fronttirediameter.value.length   == 0) ||
            (form.frontaxlepully.value      == null || form.frontaxlepully.value.length      == 0) ||
            (form.midaxletofrontpully.value == null || form.midaxletofrontpully.value.length == 0) ||
            (form.midaxlepully.value        == null || form.midaxlepully.value.length        == 0) ||
            (form.twospeedtorearpully.value == null || form.twospeedtorearpully.value.length == 0) ||
            (form.twospeedpully.value       == null || form.twospeedpully.value.length       == 0) ||
            (form.rearaxlepully.value       == null || form.rearaxlepully.value.length       == 0) ||
            (form.reartirediameter.value    == null || form.reartirediameter.value.length    == 0) ||
            (form.calculate.value           == null || form.calculate.value.length           == 0)
             ) {
            return;
        }


        if ((form.calculate.value != "TFP" && !checkNumber(form.twospeedpully,       10, 30, "Pully Dian. Cx.Vel."))  ||
            (form.calculate.value != "TRP" && !checkNumber(form.twospeedtorearpully, 10, 40, "Pully Tras. Cx.Vel."))   ||
            (form.calculate.value != "MRP" && !checkNumber(form.midaxlepully,        20, 40, "Pulley Central Tras."))  ||
            (form.calculate.value != "MFP" && !checkNumber(form.midaxletofrontpully, 10, 20, "Pulley Central Dian.")) ||
            (form.calculate.value != "FFT" && !checkNumber(form.fronttirediameter,   55, 85, "Diametro Pneu Dian."))  ||
            (form.calculate.value != "FFP" && !checkNumber(form.frontaxlepully,      20, 30, "Pully Dianteira"))     ||
            (form.calculate.value != "RRT" && !checkNumber(form.reartirediameter,    55, 85, "Diametro Pneu Tras."))   ||
            (form.calculate.value != "RRP" && !checkNumber(form.rearaxlepully,       30, 60, "Pully Traseira"))      ||
            (form.calculate.value != "ODR" && !checkNumber(form.odr,                 0.00000001, 100, "Overdrive Ratio")) ||
            !checkNumber(form.gear1engine, 5, 60,  "Pinhão da 1ª") ||
            !checkNumber(form.gear2engine, 5, 60,  "Pinhão da 2ª") ||
            !checkNumber(form.gear1axle,   5, 100, "1ª Velocidade") ||
            !checkNumber(form.gear2axle,   5, 100, "2ª Velocidade") 
            ) {

            return;
        }
// Fetch from form:
//          ,-----(R)ear, (T)wospeed, (M)id, (F)ront axle or (E)ngine
//          |,--- (R)ear or (F)ront pully or (G)ear
//          ||,-- (P)ully, (T)ire or (1)st or (2)nd gear
        var RRT  = form.reartirediameter.value;
        var RRP  = form.rearaxlepully.value;
        var TRP  = form.twospeedtorearpully.value;
        var TFP  = form.twospeedpully.value;
        var MRP  = form.midaxlepully.value;
        var MFP  = form.midaxletofrontpully.value;
        var FFP  = form.frontaxlepully.value;
        var FFT  = form.fronttirediameter.value;
        var ODR  = form.odr.value;
        var EG1  = form.gear1engine.value;
        var EG2  = form.gear2engine.value;
        var TG1  = form.gear1axle.value;
        var TG2  = form.gear2axle.value;

        var RPM1 = form.toprpm1.value;
        var RPM2 = form.toprpm2.value;
        var pi   = 3.1415926535897932384626433832795;
   
// Calculate ratio train:
        if (form.calculate.value == "ODR") ODR = ((FFT*RRP*TFP*MFP)/(RRT*TRP*MRP*FFP));
        if (form.calculate.value == "RRT") RRT = ((FFT*RRP*TFP*MFP)/(ODR*TRP*MRP*FFP));
        if (form.calculate.value == "TRP") TRP = ((FFT*RRP*TFP*MFP)/(ODR*RRT*MRP*FFP));
        if (form.calculate.value == "MRP") MRP = ((FFT*RRP*TFP*MFP)/(ODR*RRT*TRP*FFP));
        if (form.calculate.value == "FFP") FFP = ((FFT*RRP*TFP*MFP)/(ODR*RRT*TRP*MRP));
        if (form.calculate.value == "MFP") MFP = ((ODR*RRT*TRP*MRP*FFP)/(FFT*RRP*TFP));
        if (form.calculate.value == "TFP") TFP = ((ODR*RRT*TRP*MRP*FFP)/(FFT*RRP*MFP));
        if (form.calculate.value == "FFT") FFT = ((ODR*RRT*TRP*MRP*FFP)/(RRP*TFP*MFP));
        if (form.calculate.value == "RRP") RRP = ((ODR*RRT*TRP*MRP*FFP)/(FFT*TFP*MFP));

// Calculate Speeds:
        form.speed1kmh.value = (RPM1*EG1*TRP*RRT*pi*60)/(TG1*RRP*1000000)
        form.speed2kmh.value = (RPM2*EG2*TRP*RRT*pi*60)/(TG2*RRP*1000000)
        form.speed1mph.value = form.speed1kmh.value * 0.621371192237
        form.speed2mph.value = form.speed2kmh.value * 0.621371192237

// Calculate shiftpoint rpm when shifting to 2nd gear
        form.shiftrpm.value = (RPM1*EG1*TG2)/(TG1*EG2)


// Restore to form values:
        form.reartirediameter.value    = RRT;
        form.rearaxlepully.value       = RRP;
        form.twospeedtorearpully.value = TRP;
        form.twospeedpully.value       = TFP;
        form.midaxlepully.value        = MRP;
        form.midaxletofrontpully.value = MFP;
        form.frontaxlepully.value      = FFP;
        form.fronttirediameter.value   = FFT;
        form.odr.value                 = ODR;
        form.info.value                = "Ok.";

// Strip numbers :
//      form.odr.value = truncate(form.odr) * 1;

    }

//------------------------------------------------------------------
    function clearForm(form) {
        form.midaxlepully.value        = "";
        form.twospeedpully.value       = "";
        form.fronttirediameter.value   = "";
        form.reartirediameter.value    = "";
        form.midaxletofrontpully.value = "";
        form.frontaxlepully.value      = "";
        form.twospeedtorearpully.value = "";
        form.rearaxlepully.value       = "";
        form.target.value              = "";
        form.calculate.value           = "";
    }




