//**************************************************************************
// JavaScript for t_and_h_pad.html
//**************************************************************************

//**************************************************************************
// Functions for calculating T and H Pad Attenuator parameters.
//**************************************************************************

function T_Pad_Calc() {

  var RA_Std, RB_Std, Value_R1_Calc;

  document.getElementById("Value_Error").innerHTML = "";

  //**************************************************************************
	// Get the input/output impedances and the attenuation from the form.
  //**************************************************************************

  Value_Z1 = parseFloat(document.T_Pad.Value_Z1.value);
	Value_Z2 = parseFloat(document.T_Pad.Value_Z2.value);
  Value_A = parseFloat(document.T_Pad.Value_A.value);
  Value_K = Math.pow(10,(Value_A/20));

  //**************************************************************************
	// Calculate the resistor arm values.
  //**************************************************************************

  Value_R3 = Rnd((2*(Math.sqrt(Value_Z1*Value_Z2))*(Value_K/((Value_K*Value_K)-1))),2);
  Value_R1 = Rnd(Value_Z1*(((Value_K*Value_K)+1)/((Value_K*Value_K)-1)) - Value_R3,2);
  Value_R2 = Rnd(Value_Z2*(((Value_K*Value_K)+1)/((Value_K*Value_K)-1)) - Value_R3,2);

  //**************************************************************************
	// Check R1 and R2 for negative values. If either one is negative increase
	// the attenuation until the resistor values are both positive.
  //**************************************************************************

	if( Value_R1 < 0 || Value_R2 < 0 ) {
	
	  // Calculate the initial values for the loop.
		Test_A = Value_A;
    Test_K = Math.pow(10,(Test_A/20));
    Test_R3 = Rnd((2*(Math.sqrt(Value_Z1*Value_Z2))*(Test_K/((Test_K*Test_K)-1))),2);
    Test_R1 = Rnd(Value_Z1*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3,2);
    Test_R2 = Rnd(Value_Z2*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3,2);
		
		// Increase the attenuation in 0.001 db increments, until the resistor values go positive.
    do {
		  Test_A += 0.001;
      Test_K = Math.pow(10,(Test_A/20));
      Test_R3 = Rnd((2*(Math.sqrt(Value_Z1*Value_Z2))*(Test_K/((Test_K*Test_K)-1))),2);
      Test_R1 = Rnd(Value_Z1*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3,2);
      Test_R2 = Rnd(Value_Z2*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3,2);

    } while ( Test_R1 < 0 || Test_R2 < 0 )   //end do-while loop

    Data_Out = "<P class=\"calc_10\" align=\"justify\"><b>Warning:</b> The specified "
		Data_Out += "attenuation, for the impedance transformation ";
    Data_Out += "specified, can not be realized. The attenuation must be increased ";
    Data_Out += "to <b>" + Rnd(Test_A,3) + " db</b> to obtain non negative resistor values. Note that ";
    Data_Out += "<b>R1</b> or <b>R2</b> equal to zero is a special case attenuator know as ";
    Data_Out += "a Minimum Loss Attenuator.</p>";
  
	  document.getElementById("Value_Error").innerHTML = Data_Out;
	}
	
  //**************************************************************************
	// Output the scaled values to the form page.
  //**************************************************************************

  document.getElementById("T_Pad_Z1").innerHTML = R_Scale(Value_Z1);
  document.getElementById("T_Pad_Z2").innerHTML = R_Scale(Value_Z2);

  document.getElementById("T_Pad_R1").innerHTML = (Value_R1 >= 0)?"R1 = " + Value_R1 + " Ohms":"R1 = <font color=red>" + Value_R1 + "</font> Ohms";
  document.getElementById("T_Pad_R2").innerHTML = (Value_R2 >= 0)?"R2 = " + Value_R2 + " Ohms":"R2 = <font color=red>" + Value_R2 + "</font> Ohms";
  document.getElementById("T_Pad_R3").innerHTML = "R3 = " + Value_R3 + " Ohms";
  document.getElementById("T_Pad_A").innerHTML = Value_A + " db";

  //**************************************************************************
	// Find the standard value 5% resistors greater than or equal to the calculated value.
  //**************************************************************************

  Data_Out = " The nearest 5% resistor values for an attenuator with ";
  Data_Out += " Z1 = " + R_Scale(Value_Z1) + " and Z2 = " + R_Scale(Value_Z2);

  document.getElementById("T_Pad_R1_5p").innerHTML = "R1 = " + Get_Std_Res( Value_R1, "ge", "05" ) + " Ohms";
  document.getElementById("T_Pad_R2_5p").innerHTML = "R2 = " + Get_Std_Res( Value_R2, "ge", "05" ) + " Ohms";
  document.getElementById("T_Pad_R3_5p").innerHTML = "R3 = " + Get_Std_Res( Value_R3, "ge", "05" ) + " Ohms";

  //**************************************************************************
	// Calculate the parallel resistor values for each of the attenuator arms.
  //**************************************************************************
	
  document.getElementById("T_Pad_R1_A").innerHTML = comma_ins( Get_RA( Value_R1 ));
  document.getElementById("T_Pad_R1_B").innerHTML = comma_ins( Get_RB( Value_R1, Get_RA( Value_R1 ) ));
  document.getElementById("T_Pad_R1_AB").innerHTML = Rnd( Get_R_AB( Get_RA( Value_R1 ), Get_RB( Value_R1, Get_RA( Value_R1 ) ) ), 2 );
  document.getElementById("T_Pad_R1_Delta").innerHTML = Rnd( Get_R_Delta( Value_R1, Get_R_AB( Get_RA( Value_R1 ), Get_RB( Value_R1, Get_RA( Value_R1 ) ) ) ), 2);

  document.getElementById("T_Pad_R2_A").innerHTML = comma_ins( Get_RA( Value_R2 ));
  document.getElementById("T_Pad_R2_B").innerHTML = comma_ins( Get_RB( Value_R2, Get_RA( Value_R2 ) ));
  document.getElementById("T_Pad_R2_AB").innerHTML = Rnd( Get_R_AB( Get_RA( Value_R2 ), Get_RB( Value_R2, Get_RA( Value_R2 ) ) ), 2 );
  document.getElementById("T_Pad_R2_Delta").innerHTML = Rnd( Get_R_Delta( Value_R2, Get_R_AB( Get_RA( Value_R2 ), Get_RB( Value_R2, Get_RA( Value_R2 ) ) ) ), 2);

  document.getElementById("T_Pad_R3_A").innerHTML = comma_ins( Get_RA( Value_R3 ));
  document.getElementById("T_Pad_R3_B").innerHTML = comma_ins( Get_RB( Value_R3, Get_RA( Value_R3 ) ));
  document.getElementById("T_Pad_R3_AB").innerHTML = Rnd( Get_R_AB( Get_RA( Value_R3 ), Get_RB( Value_R3, Get_RA( Value_R3 ) ) ), 2 );
  document.getElementById("T_Pad_R3_Delta").innerHTML = Rnd( Get_R_Delta( Value_R3, Get_R_AB( Get_RA( Value_R3 ), Get_RB( Value_R3, Get_RA( Value_R3 ) ) ) ), 2);
}

function H_Pad_Calc() {

  var RA_Std, RB_Std, Value_R1_Calc;

  document.getElementById("Value_Error").innerHTML = "";

  //**************************************************************************
	// Get the input/output impedances and the attenuation from the form.
  //**************************************************************************

  Value_Z1 = parseFloat(document.H_Pad.Value_Z1.value);
	Value_Z2 = parseFloat(document.H_Pad.Value_Z2.value);
  Value_A = parseFloat(document.H_Pad.Value_A.value);
  Value_K = Math.pow(10,(Value_A/20));

  //**************************************************************************
	// Calculate the resistor arm values.
  //**************************************************************************

  Value_R3 = Rnd((2*(Math.sqrt(Value_Z1*Value_Z2))*(Value_K/((Value_K*Value_K)-1))),2);
  Value_R1 = Rnd((Value_Z1*(((Value_K*Value_K)+1)/((Value_K*Value_K)-1)) - Value_R3)/2,2);
  Value_R2 = Rnd((Value_Z1*(((Value_K*Value_K)+1)/((Value_K*Value_K)-1)) - Value_R3)/2,2);
  Value_R4 = Rnd((Value_Z2*(((Value_K*Value_K)+1)/((Value_K*Value_K)-1)) - Value_R3)/2,2);
  Value_R5 = Rnd((Value_Z2*(((Value_K*Value_K)+1)/((Value_K*Value_K)-1)) - Value_R3)/2,2);

  //**************************************************************************
	// Check R1 and R2 for negative values. If either one is negative increase
	// the attenuation until the resistor values are both positive.
  //**************************************************************************

	if( Value_R1 < 0 || Value_R2 < 0 || Value_R4 < 0 || Value_R5 < 0) {
	
	  // Calculate the initial values for the loop.
		Test_A = Value_A;
    Test_K = Math.pow(10,(Test_A/20));
    Test_R3 = Rnd((2*(Math.sqrt(Value_Z1*Value_Z2))*(Test_K/((Test_K*Test_K)-1))),2);
    Test_R1 = Rnd((Value_Z1*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3)/2,2);
    Test_R2 = Rnd((Value_Z1*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3)/2,2);
    Test_R4 = Rnd((Value_Z2*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3)/2,2);
    Test_R5 = Rnd((Value_Z2*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3)/2,2);

//    Test_R3 = Rnd((2*(Math.sqrt(Value_Z1*Value_Z2))*(Test_K/((Test_K*Test_K)-1))),2);
//    Test_R1 = Rnd(Value_Z1*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3,2);
//    Test_R2 = Rnd(Value_Z2*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3,2);
		
		// Increase the attenuation in 0.001 db increments, until the resistor values go positive.
    do {
		  Test_A += 0.001;
      Test_K = Math.pow(10,(Test_A/20));
      Test_R3 = Rnd((2*(Math.sqrt(Value_Z1*Value_Z2))*(Test_K/((Test_K*Test_K)-1))),2);
      Test_R1 = Rnd((Value_Z1*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3)/2,2);
      Test_R2 = Rnd((Value_Z1*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3)/2,2);
      Test_R4 = Rnd((Value_Z2*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3)/2,2);
      Test_R5 = Rnd((Value_Z2*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3)/2,2);

//      Test_R1 = Rnd(Value_Z1*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3,2);
//      Test_R2 = Rnd(Value_Z2*(((Test_K*Test_K)+1)/((Test_K*Test_K)-1)) - Test_R3,2);

    } while ( Test_R1 < 0 || Test_R2 < 0 || Test_R4 < 0 || Test_R5 < 0 )   //end do-while loop

    Data_Out = "<P class=\"calc_10\" align=\"justify\"><b>Warning:</b> The specified "
		Data_Out += "attenuation, for the impedance transformation ";
    Data_Out += "specified, can not be realized. The attenuation must be increased ";
    Data_Out += "to <b>" + Rnd(Test_A,3) + " db</b> to obtain non negative resistor values. Note that ";
    Data_Out += "<b>R1</b>, <b>R2</b>, <b>R3</b> or <b>R4</b> equal to zero is a special case attenuator know as ";
    Data_Out += "a Minimum Loss Attenuator.</p>";
  
	  document.getElementById("Value_Error").innerHTML = Data_Out;
	}
	
  //**************************************************************************
	// Output the scaled values to the form page.
  //**************************************************************************

  document.getElementById("H_Pad_Z1").innerHTML = R_Scale(Value_Z1);
  document.getElementById("H_Pad_Z2").innerHTML = R_Scale(Value_Z2);

  document.getElementById("H_Pad_R1").innerHTML = (Value_R1 >= 0)?"R1 = " + Value_R1 + " Ohms":"R1 = <font color=red>" + Value_R1 + "</font> Ohms";
  document.getElementById("H_Pad_R2").innerHTML = (Value_R2 >= 0)?"R2 = " + Value_R2 + " Ohms":"R2 = <font color=red>" + Value_R2 + "</font> Ohms";
  document.getElementById("H_Pad_R4").innerHTML = (Value_R4 >= 0)?"R4 = " + Value_R4 + " Ohms":"R4 = <font color=red>" + Value_R4 + "</font> Ohms";
  document.getElementById("H_Pad_R5").innerHTML = (Value_R5 >= 0)?"R5 = " + Value_R5 + " Ohms":"R5 = <font color=red>" + Value_R5 + "</font> Ohms";
  document.getElementById("H_Pad_R3").innerHTML = "R3 = " + Value_R3 + " Ohms";
  document.getElementById("H_Pad_A").innerHTML = Value_A + " db";

  //**************************************************************************
	// Find the standard value 5% resistors greater than or equal to the calculated value.
  //**************************************************************************

  Data_Out = " The nearest 5% resistor values for an attenuator with ";
  Data_Out += " Z1 = " + R_Scale(Value_Z1) + " and Z2 = " + R_Scale(Value_Z2);

  document.getElementById("H_Pad_R1_5p").innerHTML = "R1 = " + Get_Std_Res( Value_R1, "ge", "05" ) + " Ohms";
  document.getElementById("H_Pad_R2_5p").innerHTML = "R2 = " + Get_Std_Res( Value_R2, "ge", "05" ) + " Ohms";
  document.getElementById("H_Pad_R3_5p").innerHTML = "R3 = " + Get_Std_Res( Value_R3, "ge", "05" ) + " Ohms";
  document.getElementById("H_Pad_R4_5p").innerHTML = "R4 = " + Get_Std_Res( Value_R4, "ge", "05" ) + " Ohms";
  document.getElementById("H_Pad_R5_5p").innerHTML = "R5 = " + Get_Std_Res( Value_R5, "ge", "05" ) + " Ohms";

  //**************************************************************************
	// Calculate the parallel resistor values for each of the attenuator arms.
  //**************************************************************************
	
  document.getElementById("H_Pad_R1_A").innerHTML = comma_ins( Get_RA( Value_R1 ));
  document.getElementById("H_Pad_R1_B").innerHTML = comma_ins( Get_RB( Value_R1, Get_RA( Value_R1 ) ));
  document.getElementById("H_Pad_R1_AB").innerHTML = Rnd( Get_R_AB( Get_RA( Value_R1 ), Get_RB( Value_R1, Get_RA( Value_R1 ) ) ), 2 );
  document.getElementById("H_Pad_R1_Delta").innerHTML = Rnd( Get_R_Delta( Value_R1, Get_R_AB( Get_RA( Value_R1 ), Get_RB( Value_R1, Get_RA( Value_R1 ) ) ) ), 2);

  document.getElementById("H_Pad_R2_A").innerHTML = comma_ins( Get_RA( Value_R2 ));
  document.getElementById("H_Pad_R2_B").innerHTML = comma_ins( Get_RB( Value_R2, Get_RA( Value_R2 ) ));
  document.getElementById("H_Pad_R2_AB").innerHTML = Rnd( Get_R_AB( Get_RA( Value_R2 ), Get_RB( Value_R2, Get_RA( Value_R2 ) ) ), 2 );
  document.getElementById("H_Pad_R2_Delta").innerHTML = Rnd( Get_R_Delta( Value_R2, Get_R_AB( Get_RA( Value_R2 ), Get_RB( Value_R2, Get_RA( Value_R2 ) ) ) ), 2);

  document.getElementById("H_Pad_R3_A").innerHTML = comma_ins( Get_RA( Value_R3 ));
  document.getElementById("H_Pad_R3_B").innerHTML = comma_ins( Get_RB( Value_R3, Get_RA( Value_R3 ) ));
  document.getElementById("H_Pad_R3_AB").innerHTML = Rnd( Get_R_AB( Get_RA( Value_R3 ), Get_RB( Value_R3, Get_RA( Value_R3 ) ) ), 2 );
  document.getElementById("H_Pad_R3_Delta").innerHTML = Rnd( Get_R_Delta( Value_R3, Get_R_AB( Get_RA( Value_R3 ), Get_RB( Value_R3, Get_RA( Value_R3 ) ) ) ), 2);

  document.getElementById("H_Pad_R4_A").innerHTML = comma_ins( Get_RA( Value_R4 ));
  document.getElementById("H_Pad_R4_B").innerHTML = comma_ins( Get_RB( Value_R4, Get_RA( Value_R4 ) ));
  document.getElementById("H_Pad_R4_AB").innerHTML = Rnd( Get_R_AB( Get_RA( Value_R4 ), Get_RB( Value_R4, Get_RA( Value_R4 ) ) ), 2 );
  document.getElementById("H_Pad_R4_Delta").innerHTML = Rnd( Get_R_Delta( Value_R4, Get_R_AB( Get_RA( Value_R4 ), Get_RB( Value_R4, Get_RA( Value_R4 ) ) ) ), 2);

  document.getElementById("H_Pad_R5_A").innerHTML = comma_ins( Get_RA( Value_R5 ));
  document.getElementById("H_Pad_R5_B").innerHTML = comma_ins( Get_RB( Value_R5, Get_RA( Value_R5 ) ));
  document.getElementById("H_Pad_R5_AB").innerHTML = Rnd( Get_R_AB( Get_RA( Value_R5 ), Get_RB( Value_R5, Get_RA( Value_R5 ) ) ), 2 );
  document.getElementById("H_Pad_R5_Delta").innerHTML = Rnd( Get_R_Delta( Value_R5, Get_R_AB( Get_RA( Value_R5 ), Get_RB( Value_R5, Get_RA( Value_R5 ) ) ) ), 2);
}

//**************************************************************************
// JavaScript functions for determining the values of two standard value resistors
// Ra and Rb which, when connected in parallel, will result in a net
// resistance R  that will be within very close tolerances of almost any
// value you want.
//**************************************************************************

function Get_RA( R_Prec_In ) {
   RA_Std = Get_Std_Res( R_Prec_In, "GT", "05" );
   return RA_Std;
}

function Get_RB( R_Prec_In, RA_Std ) {
   RB_Prec = R_Prec_In * RA_Std / ( RA_Std - R_Prec_In );
   RB_Std = Get_Std_Res( RB_Prec, "GT", "05" );
   return RB_Std;
}

function Get_R_AB( RA_Std, RB_Std ) {
   R_Prec_Out = 1 /( 1 / RA_Std + 1 / RB_Std );
   return R_Prec_Out;
}

function Get_R_Delta( R_Prec_In, R_Prec_Out ) {
   R_Delta = Math.abs(R_Prec_In-R_Prec_Out)/R_Prec_In*100;
   return R_Delta;
}


