// Error coding:
//    0 = Everything OK
//    4 = Error
//    8 = Really bad error
//    12 = Oh boy, cry & die

var MIN_NUM_TEETH = 5;
var MIN_NUM_PLANETS = 1;

var FAILED = "FAILED";
var PASSED = "PASSED";

  function Calc(){
    var temp;
    var mesh_val, over_val, pd_val;
    var tsun, tplanets, tring, nplanets;

    temp = VerifyInputs();
    if (temp != 0){ BlankOutputs(); return; }

    tsun = parseInt(document.EpGear.tsun.value);
    tplanets = parseInt(document.EpGear.tplanets.value);
    tring = parseInt(document.EpGear.tring.value);
    nplanets = parseInt(document.EpGear.nplanets.value);

    if (GetMeshValidation(tsun, nplanets, tring)){ document.EpGear.meshval.value = PASSED; }else{ document.EpGear.meshval.value = FAILED; }
    if (GetPDValidation(tsun, tring, tplanets)){ document.EpGear.pdval.value = PASSED; }else{ document.EpGear.pdval.value = FAILED; }
    if (GetOverlapValidation(tsun, tplanets, nplanets)){ document.EpGear.overval.value = PASSED; }else{ document.EpGear.overval.value = FAILED; }
    if (document.EpGear.meshval.value == PASSED && document.EpGear.pdval.value == PASSED && document.EpGear.overval.value == PASSED){
      document.EpGear.overall.value = "This system can be assembled.";
    }else{
      document.EpGear.overall.value = "This system CAN NOT be assembled.";
    }

    document.EpGear.ratio.value = RoundDown(GetEpGearRatio(tring, tsun), 3);
  }

  function VerifyInputs(){
    if (!isPosInteger(EpGear.tsun.value) || isEmpty(EpGear.tsun.value) || EpGear.tsun.value < MIN_NUM_TEETH){
      alert("The number of teeth for the sun must be a postive integer greater than " + MIN_NUM_TEETH + ".");
      EpGear.tsun.focus();
      EpGear.tsun.select();
      return 4;
    }

    if (!isPosInteger(EpGear.tplanets.value) || isEmpty(EpGear.tplanets.value) || EpGear.tplanets.value < MIN_NUM_TEETH){
      alert("The number of teeth for the planets must be a postive integer greater than " + MIN_NUM_TEETH + ".");
      EpGear.tplanets.focus();
      EpGear.tplanets.select();
      return 4;
    }

    if (!isPosInteger(EpGear.tring.value) || isEmpty(EpGear.tring.value) || EpGear.tring.value < MIN_NUM_TEETH){
      alert("The number of teeth for the ring must be a postive integer greater than " + MIN_NUM_TEETH + ".");
      EpGear.tring.focus();
      EpGear.tring.select();
      return 4;
    }

    if (!isPosInteger(EpGear.nplanets.value) || isEmpty(EpGear.nplanets.value) || EpGear.nplanets.value < MIN_NUM_PLANETS){
      alert("The number of planets must be a postive integer greater than " + MIN_NUM_PLANETS + ".");
      EpGear.nplanets.focus();
      EpGear.nplanets.select();
      return 4;
    }

    return 0;
  }

  function GetMeshValidation(tsun, nplanets, tring){
    var berg;
    berg = (tsun + tring) / nplanets;
    return (berg == parseInt(berg));
  }

  function GetPDValidation(tsun, tring, tplanet){
    return (tsun + (2 * tplanet) == tring);
  }
 
  function GetOverlapValidation(tsun, tplanets, nplanets){
    var wmberg;
    var eng;

    wmberg = nplanets * 360.0 / Math.PI;
    eng = Math.asin( (tplanets + 2) / (tsun + tplanets) );
    return ( (wmberg * eng) <= 360);
  }

  function GetEpGearRatio(tring, tsun){
    if (document.EpGear.radSystem[0].checked) return ( (tring / tsun) + 1);
    if (document.EpGear.radSystem[2].checked) return (tring / tsun);
    if (document.EpGear.radSystem[1].checked) return ( (tsun / tring) + 1);
    return "ERROR! Please Refresh Web Page";
  }

  function BlankOutputs(){
    document.EpGear.meshval.value = "";
    document.EpGear.overval.value = "";
    document.EpGear.overall.value = "";
    document.EpGear.pdval.value = "";
    document.EpGear.ratio.value = "";
  }

  function openWindow(){
    var popWin = window.open("EpGearInfo.htm","Berg",'nostatus,resizable=no,width=550,height=325,top=150,left=250');
  }
