// JavaScript Document

function par(r1, r2)			// checked ok
	{
		return 1.0/( (1.0/r1)+(1.0/r2) );
	}
	//////////////////////////////////////////////////////////////////////////////////////
	function z_actual(r1, r2, r3, r_load)	// checked ok
	{
		z = r1 + par(r2,(r3+r_load) );
		return (z);
	}

	//////////////////////////////////////////////////////////////////////////////////////
	function att_actual_dB(r1, r2, r3, r_load, r_in)	//checked, not sure!
	{
			r2_r3_rload = par( (r3+r_load), r2);

			v_att1 = r2_r3_rload/(r2_r3_rload+r1) ;
			v_att  = v_att1*r_load/(r_load+r3);

			// power = v^2/r_load
			p_att = v_att*v_att*r_in/r_load
			return (-10*Math.log(p_att)/Math.LN10);
	}

	//////////////////////////////////////////////////////////////////////////////////////
	function calculate()
	{
	// read values from form
		att_ideal_dB = parseFloat(document.T_attenuator_form.att_ideal_dB.value);
		z_in_ideal   = parseFloat(document.T_attenuator_form.z_in_ideal.value);
		z_out_ideal  = parseFloat(document.T_attenuator_form.z_out_ideal.value);

	
	// check for -ve impedances
		if(z_in_ideal < 0)
		{
			z_in_ideal=-z_in_ideal;
			document.T_attenuator_form.z_in_ideal.value = parseFloat(z_in_ideal);
			alert("I cannot handle negative impedances. Sign will be ignored and input impedance set to "+z_in_ideal+" Ohms");
		}

		if(z_out_ideal < 0)
		{
			z_out_ideal=-z_out_ideal;
			document.T_attenuator_form.z_out_ideal.value = parseFloat(z_out_ideal);
			alert("I cannot handle negative impedances. Sign will be ignored and output impedance set to "+z_out_ideal+" Ohms");
		}

		att_ideal = Math.pow(10, att_ideal_dB*0.1);
		
		// check for minimum attenuation
		if(z_in_ideal > z_out_ideal)
		{
			att_min_voltage = Math.sqrt(z_in_ideal/z_out_ideal) + Math.sqrt(z_in_ideal/z_out_ideal - 1);
			att_min = att_min_voltage*att_min_voltage;
		}
		else
		{
			att_min_voltage = Math.sqrt(z_out_ideal/z_in_ideal) + Math.sqrt(z_out_ideal/z_in_ideal - 1);
			att_min = att_min_voltage*att_min_voltage;
		}
		
		
		if(att_ideal < att_min)
		{
			att_ideal = att_min+0.000000001;
			att_ideal_dB = 10* Math.log(att_ideal) / Math.LN10;
			document.T_attenuator_form.att_ideal_dB.value = att_ideal_dB;
			
			alert("Atteniation too low for matching.  Attenuation has been set to minimum possible value of "+ att_ideal_dB.toPrecision(3));

		}
		

		if(att_ideal_dB == 0)
		{

			//document.T_attenuator_form.linear_att_ideal.value = parseFloat(att_ideal);
			document.T_attenuator_form.r1_ideal.value  = "Zero";
			document.T_attenuator_form.r2_ideal.value  = "Not Fitted";
			document.T_attenuator_form.r3_ideal.value  = "Zero";

			document.T_attenuator_form.r1_E12.value  = "Zero";
			document.T_attenuator_form.r2_E12.value  = "Not Fitted";
			document.T_attenuator_form.r3_E12.value  = "Zero";

			document.T_attenuator_form.r1_E24.value  = "Zero";
			document.T_attenuator_form.r2_E24.value  = "Not Fitted";
			document.T_attenuator_form.r3_E24.value  = "Zero";

			document.T_attenuator_form.r1_E48.value  = "Zero";
			document.T_attenuator_form.r2_E48.value  = "Not Fitted";
			document.T_attenuator_form.r3_E48.value  = "Zero";

			document.T_attenuator_form.r1_E96.value  = "Zero";
			document.T_attenuator_form.r2_E96.value  = "Not Fitted";
			document.T_attenuator_form.r3_E96.value  = "Zero";

			document.T_attenuator_form.r1_E192.value  = "Zero";
			document.T_attenuator_form.r2_E192.value  = "Not Fitted";
			document.T_attenuator_form.r3_E192.value  = "Zero";

		}
		else
		{
		// calculate ideal values
			r2_ideal = 2.0*Math.sqrt(z_in_ideal*z_out_ideal*att_ideal)/(att_ideal - 1.0);

			r3_ideal = z_out_ideal * (att_ideal+1) / (att_ideal - 1.0) - r2_ideal;

			r1_ideal = z_in_ideal * (att_ideal+1) / (att_ideal - 1.0) - r2_ideal;

		// write answers to form
			
			document.T_attenuator_form.r1_ideal.value = parseFloat( r1_ideal.toPrecision(6) );
			document.T_attenuator_form.r2_ideal.value = parseFloat( r2_ideal.toPrecision(6) );
			document.T_attenuator_form.r3_ideal.value = parseFloat( r3_ideal.toPrecision(6) );

		// calculate preferred values

			if( (r1_ideal >= 0) && (r2_ideal >=0) && (r3_ideal >=0) )
			{
				r1_E12 = nearestE12(r1_ideal);
				r2_E12 = nearestE12(r2_ideal);
				r3_E12 = nearestE12(r3_ideal);

				r1_E24 = nearestE24(r1_ideal);
				r2_E24 = nearestE24(r2_ideal);
				r3_E24 = nearestE24(r3_ideal);

				r1_E48 = nearestE48(r1_ideal);
				r2_E48 = nearestE48(r2_ideal);
				r3_E48 = nearestE48(r3_ideal);
				
				r1_E96 = nearestE96(r1_ideal);
				r2_E96 = nearestE96(r2_ideal);
				r3_E96 = nearestE96(r3_ideal);

				r1_E192 = nearestE192(r1_ideal);
				r2_E192 = nearestE192(r2_ideal);
				r3_E192 = nearestE192(r3_ideal);
			
				att_dB_E12 = att_actual_dB(r1_E12, r2_E12, r3_E12, z_out_ideal, z_in_ideal);
				Z_in_E12   = z_actual(r1_E12, r2_E12, r3_E12, z_out_ideal);
				Z_out_E12  = z_actual(r3_E12, r2_E12, r1_E12, z_in_ideal);

				att_dB_E24 = att_actual_dB(r1_E24, r2_E24, r3_E24, z_out_ideal, z_in_ideal);
				Z_in_E24   = z_actual(r1_E24, r2_E24, r3_E24, z_out_ideal);
				Z_out_E24  = z_actual(r3_E24, r2_E24, r1_E24, z_in_ideal);

				att_dB_E48 = att_actual_dB(r1_E48, r2_E48, r3_E48, z_out_ideal, z_in_ideal);
				Z_in_E48   = z_actual(r1_E48, r2_E48, r3_E48, z_out_ideal);
				Z_out_E48  = z_actual(r3_E48, r2_E48, r1_E48, z_in_ideal);

				att_dB_E96 = att_actual_dB(r1_E96, r2_E96, r3_E96, z_out_ideal, z_in_ideal);
				Z_in_E96   = z_actual(r1_E96, r2_E96, r3_E96, z_out_ideal);
				Z_out_E96  = z_actual(r3_E96, r2_E96, r1_E96, z_in_ideal);

				att_dB_E192 = att_actual_dB(r1_E192, r2_E192, r3_E192, z_out_ideal, z_in_ideal);
				Z_in_E192   = z_actual(r1_E192, r2_E192, r3_E192, z_out_ideal);
				Z_out_E192  = z_actual(r3_E192, r2_E192, r1_E192, z_in_ideal);


				document.T_attenuator_form.r1_E12.value  = parseFloat(r1_E12.toPrecision(3));
				document.T_attenuator_form.r2_E12.value  = parseFloat(r2_E12.toPrecision(3));
				document.T_attenuator_form.r3_E12.value  = parseFloat(r3_E12.toPrecision(3));

				document.T_attenuator_form.r1_E24.value  = parseFloat(r1_E24.toPrecision(3));
				document.T_attenuator_form.r2_E24.value  = parseFloat(r2_E24.toPrecision(3));
				document.T_attenuator_form.r3_E24.value  = parseFloat(r3_E24.toPrecision(3));

				document.T_attenuator_form.r1_E48.value  = parseFloat(r1_E48.toPrecision(3));
				document.T_attenuator_form.r2_E48.value  = parseFloat(r2_E48.toPrecision(3));
				document.T_attenuator_form.r3_E48.value  = parseFloat(r3_E48.toPrecision(3));

				document.T_attenuator_form.r1_E96.value  = parseFloat(r1_E96.toPrecision(3));
				document.T_attenuator_form.r2_E96.value  = parseFloat(r2_E96.toPrecision(3));
				document.T_attenuator_form.r3_E96.value  = parseFloat(r3_E96.toPrecision(3));

				document.T_attenuator_form.r1_E192.value  = parseFloat(r1_E192.toPrecision(3));
				document.T_attenuator_form.r2_E192.value  = parseFloat(r2_E192.toPrecision(3));
				document.T_attenuator_form.r3_E192.value  = parseFloat(r3_E192.toPrecision(3));
				
				answer_precision = 5;
				
				document.T_attenuator_form.att_dB_E12.value = parseFloat( att_dB_E12.toPrecision(answer_precision) );
				document.T_attenuator_form.Z_in_E12.value   = parseFloat( Z_in_E12.toPrecision(answer_precision) );
				document.T_attenuator_form.Z_out_E12.value  = parseFloat( Z_out_E12.toPrecision(answer_precision) );

				document.T_attenuator_form.att_dB_E24.value = parseFloat( att_dB_E24.toPrecision(answer_precision) );
				document.T_attenuator_form.Z_in_E24.value   = parseFloat( Z_in_E24.toPrecision(answer_precision) );
				document.T_attenuator_form.Z_out_E24.value  = parseFloat( Z_out_E24.toPrecision(answer_precision) );

				document.T_attenuator_form.att_dB_E48.value = parseFloat( att_dB_E48.toPrecision(answer_precision) );
				document.T_attenuator_form.Z_in_E48.value   = parseFloat( Z_in_E48.toPrecision(answer_precision) );
				document.T_attenuator_form.Z_out_E48.value  = parseFloat( Z_out_E48.toPrecision(answer_precision) );

				document.T_attenuator_form.att_dB_E96.value = parseFloat( att_dB_E96.toPrecision(answer_precision) );
				document.T_attenuator_form.Z_in_E96.value   = parseFloat( Z_in_E96.toPrecision(answer_precision) );
				document.T_attenuator_form.Z_out_E96.value  = parseFloat( Z_out_E96.toPrecision(answer_precision) );

				document.T_attenuator_form.att_dB_E192.value = parseFloat( att_dB_E192.toPrecision(answer_precision) );
				document.T_attenuator_form.Z_in_E192.value   = parseFloat( Z_in_E192.toPrecision(answer_precision) );
				document.T_attenuator_form.Z_out_E192.value  = parseFloat( Z_out_E192.toPrecision(answer_precision) );

			}
			else
			{
				document.T_attenuator_form.r1_E12.value  = "Error"
				document.T_attenuator_form.r2_E12.value  = "Error"
				document.T_attenuator_form.r3_E12.value  = "Error"

				document.T_attenuator_form.r1_E24.value  = "Error"
				document.T_attenuator_form.r2_E24.value  = "Error"
				document.T_attenuator_form.r3_E24.value  = "Error"

				document.T_attenuator_form.r1_E48.value  = "Error"
				document.T_attenuator_form.r2_E48.value  = "Error"
				document.T_attenuator_form.r3_E48.value  = "Error"

				document.T_attenuator_form.r1_E96.value  = "Error"
				document.T_attenuator_form.r2_E96.value  = "Error"
				document.T_attenuator_form.r3_E96.value  = "Error"

				document.T_attenuator_form.r1_E192.value  = "Error"
				document.T_attenuator_form.r2_E192.value  = "Error"
				document.T_attenuator_form.r3_E192.value  = "Error"


				document.T_attenuator_form.att_dB_E12.value = "Error"
				document.T_attenuator_form.Z_in_E12.value   = "Error"
				document.T_attenuator_form.Z_out_E12.value  = "Error"

				document.T_attenuator_form.att_dB_E24.value = "Error"
				document.T_attenuator_form.Z_in_E24.value   = "Error"
				document.T_attenuator_form.Z_out_E24.value  = "Error"

				document.T_attenuator_form.att_dB_E48.value = "Error"
				document.T_attenuator_form.Z_in_E48.value   = "Error"
				document.T_attenuator_form.Z_out_E48.value  = "Error"

				document.T_attenuator_form.att_dB_E96.value = "Error"
				document.T_attenuator_form.Z_in_E96.value   = "Error"
				document.T_attenuator_form.Z_out_E96.value  = "Error"

				document.T_attenuator_form.att_dB_E192.value = "Error"
				document.T_attenuator_form.Z_in_E192.value   = "Error"
				document.T_attenuator_form.Z_out_E192.value  = "Error"
			}
		}
	}

