// JavaScript Document

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

	//////////////////////////////////////////////////////////////////////////////////////
	function att_actual_dB(r2, r3, r_load, r_in)
	{
			r3_par_r_load = par(r3,r_load);

			v_att = r3_par_r_load/(r2+r3_par_r_load) ;

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

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

	// check for -ve impedances
		if(z_in_ideal < 0)
		{
			z_in_ideal=-z_in_ideal;
			document.PI_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.PI_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/10);

	// verify that this will be possible, and alert user if not.
		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)
		{
			// not possible so alert user
			att_ideal = att_min;

			att_ideal_dB = 20*Math.log(att_min_voltage)/Math.log(10);

			document.PI_attenuator_form.att_ideal_dB.value = parseFloat(att_ideal_dB);
			alert("Sorry. This cannot be done without negative resistors.  Attenuation adjusted to "+att_ideal_dB+" dB" );

		}


		if(att_ideal_dB == 0)
		{

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

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

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

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

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

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

		}
		else
		{
		// calculate ideal values

			r2_ideal = 0.5 * (att_ideal - 1.0)* Math.sqrt(z_in_ideal*z_out_ideal/att_ideal);

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

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

		// write answers to form

			document.PI_attenuator_form.r1_ideal.value  = parseFloat( r1_ideal.toPrecision(6) );
			document.PI_attenuator_form.r2_ideal.value  = parseFloat( r2_ideal.toPrecision(6) );
			document.PI_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(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(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(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(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(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.PI_attenuator_form.r1_E12.value  = parseFloat(r1_E12.toPrecision(3));
				document.PI_attenuator_form.r2_E12.value  = parseFloat(r2_E12.toPrecision(3));
				document.PI_attenuator_form.r3_E12.value  = parseFloat(r3_E12.toPrecision(3));

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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