
/***********************************************
* Mantaro Networks, Inc. (www.mantaro.com)
* Copyright 2009
***********************************************/
//<script language="JavaScript">

function air_core_solenoid(form) // Calculates air core solenoid inductance in nH
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var d= Number(form.d.value); // Diameter in mm
		var n= Number(form.n.value); // Number of turns
		var len= Number(form.len.value); // Length in mm
		var L; // Inductance in nH
		L= d*d*n*n /(0.4572*d+1.016*len)*scale;
		form.L.value= L.toFixed(3);
	}
}

function flat_spiral_inductance(form) // Calculates air core flat spiral inductance in nH
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var d1= Number(form.d1.value); // External diameter in mm
		var d2= Number(form.d2.value); // Internal diameter in mm
		var n= Number(form.n.value); // Number of turns
		var L; // Inductance in nH
		L= 4.921*(d1+d2)*(d1+d2)*n*n /(15*d1 -7*d2)*scale;
		form.L.value= L.toFixed(3);		
	}
}

function toroid_inductance(form) // Calculates toroid inductance in nH
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var d1= Number(form.d1.value); // Outer diameter in mm
		var d2= Number(form.d2.value); // Inner diameter in mm
		var n= Number(form.n.value); // Number of turns
		var len= Number(form.len.value); // Length in mm
		var ur= Number(form.ur.value); // relative permeability
		var L; // Inductance in nH
		L= 0.2*n*n*len*ur*log(d1/d2)*scale;
		form.L.value= L.toFixed(3);		
	}
}

function mutual_inductance_lseries(form) // Calculates Mutual and Leakage inductance from Lseries
{
	with(Math) 
	{
		var L1= Number(form.L1.value); // L1 Inductance 
		var L2= Number(form.L2.value); // L2 Inductance 
		var M= Number(form.M.value); // M
		var k= Number(form.k.value); // k
		var Lseries= Number(form.Lseries.value); // Series Inductance 
		var Lshunt= Number(form.Lshunt.value); // Shunt Inductance 

		M=(Lseries-L1-L2)/2;
		k=M/Math.sqrt(L1*L2)
		form.M.value= M.toFixed(3);		
		form.k.value= k.toFixed(3);		
		form.L1_leak.value= (L1*(1-k)).toFixed(3);		
		form.L2_leak.value= (L2*(1-k)).toFixed(3);	
		form.Lshunt.value= (L1*(1-k*k)).toFixed(3);		
	}
}

function mutual_inductance_lshunt(form) // Calculates Mutual and Leakage inductance from Lshunt
{
	with(Math) 
	{
		var L1= Number(form.L1.value); // L1 Inductance 
		var L2= Number(form.L2.value); // L2 Inductance 
		var M= Number(form.M.value); // M
		var k= Number(form.k.value); // k
		var Lseries= Number(form.Lseries.value); // Series Inductance 
		var Lshunt= Number(form.Lshunt.value); // Shunt Inductance 

		k=Math.sqrt(1-Lshunt/L1);
		M=k*Math.sqrt(L1*L2);
		form.k.value= k.toFixed(3);		
		form.M.value= M.toFixed(3);		
		form.L1_leak.value= (L1*(1-k)).toFixed(3);		
		form.L2_leak.value= (L2*(1-k)).toFixed(3);		
		form.Lseries.value= (L1+L2+2*M).toFixed(3);		
	}
}

function mutual_inductance_m(form) // Calculates k and Leakage inductance from M
{
	with(Math) 
	{
		var L1= Number(form.L1.value); // L1 Inductance 
		var L2= Number(form.L2.value); // L2 Inductance 
		var M= Number(form.M.value); // M
		var k= Number(form.k.value); // k
		var Lseries= Number(form.Lseries.value); // Series Inductance 
		var Lshunt= Number(form.Lshunt.value); // Shunt Inductance 

		k=M/Math.sqrt(L1*L2)
		form.k.value= k.toFixed(3);		
		form.L1_leak.value= (L1*(1-k)).toFixed(3);		
		form.L2_leak.value= (L2*(1-k)).toFixed(3);		
		form.Lseries.value= (L1+L2+2*M).toFixed(3);		
		form.Lshunt.value= (L1*(1-k*k)).toFixed(3);		
	}
}

function mutual_inductance_k(form) // Calculates Mutual and Leakage inductance from k
{
	with(Math) 
	{
		var L1= Number(form.L1.value); // L1 Inductance 
		var L2= Number(form.L2.value); // L2 Inductance 
		var M= Number(form.M.value); // M
		var k= Number(form.k.value); // k
		var Lseries= Number(form.Lseries.value); // Series Inductance 
		var Lshunt= Number(form.Lshunt.value); // Shunt Inductance 

		M=k*Math.sqrt(L1*L2);
		form.M.value= M.toFixed(3);		
		form.L1_leak.value= (L1*(1-k)).toFixed(3);		
		form.L2_leak.value= (L2*(1-k)).toFixed(3);		
		form.Lseries.value= (L1+L2+2*M).toFixed(3);		
		form.Lshunt.value= (L1*(1-k*k)).toFixed(3);		
	}
}

function wire_inductance(form) // Calculates wire inductance in nH
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var d= Number(form.d.value); // Diameter in mm
		var len= Number(form.len.value); // Length in mm
		var L; // Inductance in nH
		L= 0.2*len*(Math.log(4*len/d)-.75)*scale;
		form.L.value= L.toFixed(3);		
	}
}

function strap_inductance(form) // Calculates strap inductance in nH
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var w= Number(form.w.value); // Width in mm
		var t= Number(form.t.value); // thickness in mm
		var len= Number(form.len.value); // Length in mm
		var L; // Inductance in nH
		L= 0.2*len*scale*(log(2*len/(w+t)) + 0.5 + 0.223*(w+t)/len);
		form.L.value= L.toFixed(3);		
	}
}

function twisted_pair_impedance(form) // Calculates twisted pair impedance in Ohms and ps/mm
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var s= Number(form.s.value); // wire separation mm
		var d= Number(form.d.value); // wire diameter in mm
		var er= Number(form.er.value); // relative dielectric constant
		var Zo; // transmission line impedance in Ohms
		var Tpd; // transmission line propagation delay in ps/mm
		var L; // Inductance per unit length
		var C; // capacitance per unit length
		Zo= 120/Math.sqrt(er) * log(s/d + Math.sqrt(s*s/d/d-1));	// Zo = 120/er^.5 * aCosh(s/d), where aCosh(x)=ln(x+(x^2-1)^.5) 
		Tpd= 3.333*Math.sqrt(er)*scale;
		L=Tpd*Zo/1000 // nH per unit Length
		C=Tpd/Zo // pF per unit Length

		form.Zo.value= Zo.toFixed(3);		

			if(scale==1.0)
		{
			 form.Text_Tpd.value= "Propagation delay, Tpd (ps/cm) =";		
			 form.Tpd.value= (Tpd*10).toFixed(3);	  
			 form.Text_L.value= "Inductance, L (nH/cm) =";		
			 form.L.value= (L*10).toFixed(3);	  
			 form.Text_C.value= "Capacitance, C (pF/cm) =";		
			 form.C.value= (C*10).toFixed(5);	  
		}	
 else
		{
			 form.Text_Tpd.value= "Propagation delay, Tpd (ps/in) =";		
			 form.Tpd.value= (Tpd*1000).toFixed(3);	  
			 form.Text_L.value= "Inductance, L (nH/in) =";		
			 form.L.value= (L*1000).toFixed(3);	  
			 form.Text_C.value= "Capacitance, C (pF/in) =";		
			 form.C.value= (C*1000).toFixed(5);	  
		}	

	}
}

function coaxial_line_impedance(form) // Calculates coaxial line impedance in Ohms and ps/mm
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var d1= Number(form.d1.value); // inner diameter
		var d2= Number(form.d2.value); // outer diameter
		var er= Number(form.er.value); // relative dielectric constant
		var ur= Number(form.ur.value); // relative magnetic permeability
		var Zo; // transmission line impedance in Ohms
		var L; // Inductance per unit length
		var C; // capacitance per unit length
		var Tpd; // transmission line propagation delay in ps/mm
		Zo= 60*Math.sqrt(ur/er)*log(d2/d1);	// Ohms
		Tpd= 3.333*Math.sqrt(er*ur)*scale; // nsec per unit Length
		L=.2*ur*log(d2/d1)*scale // nH per unit Length
		C=er/18/log(d2/d1)*scale // pF per unit Length
		form.Zo.value= Zo.toFixed(3);		
	
			if(scale==1.0)
		{
			 form.Text_Tpd.value= "Propagation delay, Tpd (ps/cm) =";		
			 form.Tpd.value= (Tpd*10).toFixed(3);	  
			 form.Text_L.value= "Inductance, L (nH/cm) =";		
			 form.L.value= (L*10).toFixed(3);	  
			 form.Text_C.value= "Capacitance, C (pF/cm) =";		
			 form.C.value= (C*10).toFixed(5);	  
		}	
 else
		{
			 form.Text_Tpd.value= "Propagation delay, Tpd (ps/in) =";		
			 form.Tpd.value= (Tpd*1000).toFixed(3);	  
			 form.Text_L.value= "Inductance, L (nH/in) =";		
			 form.L.value= (L*1000).toFixed(3);	  
			 form.Text_C.value= "Capacitance, C (pF/in) =";		
			 form.C.value= (C*1000).toFixed(5);	  
		}	
	
	}
}

function skin_depth(form) // Skin depth wire resistance in Ohms/unit Length
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var ro= Number(form.ro.value); // resissivity (nOhm*m) 
		var ur= Number(form.ur.value); // relative magnetic permeability 
		var TC= Number(form.TC.value); // temperature coefficient (ppm/C)
		var T= Number(form.T.value); // temperature (Deg C)
		var Fo= Number(form.Fo.value); // Frequency (MHz)
		var AWG= Number(form.AWG.value);; // Wire Gauge (AWG)
		var Sdepth; // Skin Depth in mm
		var D; // Wire diameter in mm
		var A; // Wire area in mm^2
		var Rdc // DC resistance per mOhms/m
		var Rac // AC resistance per mOhms/m

		ro=ro*(1+TC/1e6*(T-20)) // resistivity adjusted to operating temperture
		Sdepth= Math.sqrt(ro/(400*Math.PI*Fo*ur*Math.PI)) //Skin Depth in mm
		D= .005*Math.exp((36-AWG)/39*Math.log(92))*25.4 // Diameter in mm
		A= Math.PI*D*D/4 // Area in mm
		Rdc= ro/A // DC resistance in mOhms/m
		Rac=Math.exp(Math.log(Math.exp(7.1*Math.log(D/4/Sdepth+0.26))+1)/7.1)*Rdc // AC resistance in mOhms/m

		if(scale==1.0)
		{
		  if(Sdepth<1 && Sdepth>1e-3)
		  {
			form.Text_Sdepth.value= "Skin Depth, Sdepth (um) =";		
			form.Sdepth.value= (Sdepth*1e3).toFixed(3);	  
	  	  }
		  else if(Sdepth<=1e-3)
		  {
			form.Text_Sdepth.value= "Skin Depth, Sdepth (nm) =";		
			form.Sdepth.value= (Sdepth*1e6).toFixed(3);	  		  
		  }
		  else
		  {
			form.Text_Sdepth.value= "Skin Depth, Sdepth (mm) =";		
			form.Sdepth.value= Sdepth.toFixed(3);	  
		  }

		  form.Text_D.value= "Wire Diameter, D (mm) =";		
			form.D.value= D.toFixed(3);
		  form.Text_A.value= "Wire Area, A (mm^2) =";		
			form.A.value= A.toFixed(6);
		  form.Text_Rdc.value= "DC Resistance, Rdc (mOhms/m) =";		
			form.Rdc.value= Rdc.toFixed(3);
		  form.Text_Rac.value= "AC Resistance, Rac (mOhms/m) =";		
			form.Rac.value= Rac.toFixed(3);
		}	
		else
		{
		  if(Sdepth<25.4 && Sdepth>.0254)
		  {
			form.Text_Sdepth.value= "Skin Depth, Sdepth (mils) =";		
			form.Sdepth.value= (Sdepth/scale).toFixed(3);	  
	  	  }
		  else if(Sdepth<=.0254)
		  {
			form.Text_Sdepth.value= "Skin Depth, Sdepth (mils) =";		
			form.Sdepth.value= (Sdepth/scale).toFixed(6);	  		  
		  }
		  else
		  {
		  form.Text_Sdepth.value= "Skin Depth, Sdepth (inch) =";		
			form.Sdepth.value= (Sdepth/scale/1000).toFixed(3); 
		  }
		  form.Text_D.value= "Wire Diameter, D (mils) =";		
			form.D.value= (D/scale).toFixed(3);
		  form.Text_A.value= "Wire Area, A (mil^2) =";		
			form.A.value= (A/scale/scale).toFixed(3);
		  form.Text_Rdc.value= "DC Resistance, Rdc (mOhms/ft) =";		
			form.Rdc.value= (Rdc*scale*12).toFixed(3);
		  form.Text_Rac.value= "AC Resistance, Rac (mOhms/ft) =";		
			form.Rac.value= (Rac*scale*12).toFixed(3);
		}	
	}
}

function plane_impedance(form) // Plane Impedance (inductance, capacitance)
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mil
		var w= Number(form.w.value); // plane width (wxw square)
		var h= Number(form.h.value); // height (plane separation)
		var ur= Number(form.ur.value); // relative magnetic permeability 
		var er= Number(form.er.value); // relative dielectric constant 

		L=2*Math.PI*ur*h*scale/10// Inductance in nH
		C=8.8542*er*w*w/h*scale/1000 //Capacitance in pF

		form.L.value= L.toFixed(5);
		form.C.value= C.toFixed(2);
	}
}

function microstrip_impedance(form) // Calculates microstrip impedance in Ohms and ps/mm
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var w= Number(form.w.value); // track width 
		var t= Number(form.t.value); // track thickness 
		var h= Number(form.h.value); // dielectric thickness i
		var Er= Number(form.er.value); // relative dielectric constant
		var Zo; // transmission line impedance in Ohms
		var Tpd; // transmission line propagation delay in ps
		Zo= 87/Math.sqrt(Er + 1.41) * log(5.98*h/(0.8*w+t));	// Zo= 87/(Er+1.41)^0.5*ln(5.98*h/(0.8*w+t)) Ohms
		Tpd= 3.333*Math.sqrt(0.475*Er+.67)*scale; // Tpd=3.34*(0.475*Er+.67)^.5 psec/mm
		var L; // Inductance per unit length
		var C; // capacitance per unit length
		L=Tpd*Zo/1000 // nH per unit Length
		C=Tpd/Zo // pF per unit Length

		form.Zo.value= Zo.toFixed(3);		

		if(scale==1.0)
		{
			form.Text_Tpd.value= "Propagation Dealy, Tpd (ps/cm) =";		
			form.Tpd.value= (Tpd*10).toFixed(3);
			form.Text_L.value= "Inductance, L (nH/cm) =";		
		  form.L.value= (L*10).toFixed(3);	  
			form.Text_C.value= "Capacitance, C (pF/cm) =";		
			form.C.value= (C*10).toFixed(5);	  

		}	
		else
		{
			form.Text_Tpd.value= "Propagation Dealy, Tpd (ps/inch) =";		
			form.Tpd.value= (Tpd*1000).toFixed(2);
			form.Text_L.value= "Inductance, L (nH/in) =";		
			form.L.value= (L*1000).toFixed(3);	  
			form.Text_C.value= "Capacitance, C (pF/in) =";		
			form.C.value= (C*1000).toFixed(5);	  
		}	
	}
}

function differential_microstrip2_impedance(form) // Calculates differential microstrip impedance in Ohms
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var w= Number(form.w.value); // track width 
		var d= Number(form.d.value); // edge to edge track spacing 
		var t= Number(form.t.value); // track thickness 
		var h= Number(form.h.value); // dielectric thickness i
		var Er= Number(form.er.value); // relative dielectric constant
		var Zd; // differential transmission line impedance in Ohms

		Zo= 87/Math.sqrt(Er + 1.41) * log(5.98*h/(0.8*w+t));	// Zo= 87/(Er+1.41)^0.5*ln(5.98*h/(0.8*w+t)) Ohms
		Zd= 2*Zo * (1 - 0.48/exp(0.96*d/h));	// Z diff = 2* Zo*(1 - 0.48*e^-(0.96*d/(2*h+t))) Ohms
		form.Zd.value= Zd.toFixed(3);		
	}
}

function differential_microstrip_impedance(form) // Calculates differential microstrip impedance from Zo in Ohms
{
	with(Math) 
	{
		var d= Number(form.d.value); // edge to edge track spacing in mm
		var h= Number(form.h.value); // dielectric thickness in mm
		var Zo= Number(form.Zo.value); // single ended characteristic impedance
		var Zd; // differential transmission line impedance in Ohms
		Zd= 2*Zo * (1 - 0.48/exp(0.96*d/h));	// Z diff = 2* Zo*(1 - 0.48*e^-(0.96*d/h)) Ohms
		form.Zd.value= Zd.toFixed(3);		
	}
}

function embedded_microstrip_impedance(form) // Calculates embedded microstrip impedance in Ohms and ps
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var w= Number(form.w.value); // track width 
		var t= Number(form.t.value); // track thickness 
		var h= Number(form.h.value); // dielectric thickness to track 
		var h1= Number(form.h1.value); // dielectric thickness to top surface 
		var Er= Number(form.er.value); // relative dielectric constant
		var Erp; // effective dielectric constant
		var Zo; // transmission line impedance in Ohms
		var Tpd; // transmission line propagation delay in ps
		var L; // Inductance per unit length
		var C; // capacitance per unit length
		Erp = Er*(1-Math.exp(-1.55*h1/h));
		Zo = 60/Math.sqrt(Erp) * log(5.98*h/(0.8*w+t));
		Tpd = 2.78*Math.sqrt(Erp)*scale;
		L=Tpd*Zo/1000 // nH per unit Length
		C=Tpd/Zo // pF per unit Length

		form.Zo.value= Zo.toFixed(3);		

		if(scale==1.0)
		{
			form.Text_Tpd.value= "Propagation Dealy, Tpd (ps/cm) =";		
			form.Tpd.value= (Tpd*10).toFixed(3);
			form.Text_L.value= "Inductance, L (nH/cm) =";		
		  form.L.value= (L*10).toFixed(3);	  
			form.Text_C.value= "Capacitance, C (pF/cm) =";		
			form.C.value= (C*10).toFixed(5);	  

		}	
		else
		{
			form.Text_Tpd.value= "Propagation Dealy, Tpd (ps/inch) =";		
			form.Tpd.value= (Tpd*1000).toFixed(2);
			form.Text_L.value= "Inductance, L (nH/in) =";		
			form.L.value= (L*1000).toFixed(3);	  
			form.Text_C.value= "Capacitance, C (pF/in) =";		
			form.C.value= (C*1000).toFixed(5);	  
		}	
	}
}

function stripline_impedance(form) // Calculates stripline impedance in Ohms and ps/mm
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var w= Number(form.w.value); // track width 
		var t= Number(form.t.value); // track thickness 
		var h= Number(form.h.value); // dielectric thickness 
		var Er= Number(form.er.value); // relative dielectric constant
		var Zo; // transmission line impedance in Ohms
		var Tpd; // transmission line propagation delay in ps
		Zo= 60/Math.sqrt(Er) * log(1.9*(2*h+t)/(0.8*w+t));	// Zo= 60/(Er)^0.5*ln(1.9*(2*h+t)/(0.8*w+t)) Ohms
		Tpd= 3.333*Math.sqrt(Er)*scale; // Tpd=3.34*(0.475*Er+.67)^.5 psec/mm

		var L; // Inductance per unit length
		var C; // capacitance per unit length
		L=Tpd*Zo/1000 // nH per unit Length
		C=Tpd/Zo // pF per unit Length

		form.Zo.value= Zo.toFixed(3);		

		if(scale==1.0)
		{
			form.Text_Tpd.value= "Propagation Dealy, Tpd (ps/cm) =";		
			form.Tpd.value= (Tpd*10).toFixed(3);
			form.Text_L.value= "Inductance, L (nH/cm) =";		
		  form.L.value= (L*10).toFixed(3);	  
			form.Text_C.value= "Capacitance, C (pF/cm) =";		
			form.C.value= (C*10).toFixed(5);	  

		}	
		else
		{
			form.Text_Tpd.value= "Propagation Dealy, Tpd (ps/inch) =";		
			form.Tpd.value= (Tpd*1000).toFixed(2);
			form.Text_L.value= "Inductance, L (nH/in) =";		
			form.L.value= (L*1000).toFixed(3);	  
			form.Text_C.value= "Capacitance, C (pF/in) =";		
			form.C.value= (C*1000).toFixed(5);	  
		}	
	}
}

function differential_stripline2_impedance(form) // Calculates differential stripline impedance in Ohms
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var w= Number(form.w.value); // track width 
		var d= Number(form.d.value); // edge to edge track spacing 
		var t= Number(form.t.value); // track thickness 
		var h= Number(form.h.value); // dielectric thickness 
		var Er= Number(form.er.value); // relative dielectric constant
		var Zo; // single ended characteristic impedance
		var Zd; // differential transmission line impedance in Ohms
		Zo= 60/Math.sqrt(Er) * log(1.9*(2*h+t)/(0.8*w+t));	// Zo= 60/(Er)^0.5*ln(1.9*(2*h+t)/(0.8*w+t)) Ohms
		Zd= 2*Zo * (1 - 0.347/exp(2.9*d/(2*h+t)));	// Zdiff = 2* Zo *(1 - 0.347*e^(-2.9*d/(2*h+t))) 
		form.Zd.value= Zd.toFixed(3);		
	}
}

function differential_stripline_impedance(form) // Calculates differential stripline impedance from Zo in Ohms
{
	with(Math) 
	{
		var d= Number(form.d.value); // edge to edge track spacing
		var h= Number(form.h.value); // dielectric thickness 
		var Zo= Number(form.Zo.value); // single ended characteristic impedance
		var Zd; // differential transmission line impedance in Ohms
		Zd= 2*Zo * (1 - 0.347/exp(2.9*d/h));	// Zdiff = 2* Zo *(1 - 0.347*e^(-2.9*d/h)) 
		form.Zd.value= Zd.toFixed(3);		
	}
}

function asymmetric_stripline_impedance(form) // Calculates asymmetric stripline impedance in Ohms and ps/mm
{
	with(Math) 
	{
			var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
			var w= Number(form.w.value); // track width in mm
			var t= Number(form.t.value); // track thickness in mm
			var h= Number(form.h.value); // smaller dielectric thickness to track in mm
			var h1= Number(form.h1.value); // larger dielectric thickness to top track in mm
			var Er= Number(form.er.value); // relative dielectric constant
			var Zo; // transmission line impedance in Ohms
			var Tpd; // transmission line propagation delay in ps/mm
			Zo = 80/Math.sqrt(Er) * log(1.9*(2*h+t)/(0.8*w+t)) * (1-h/(4*h1)); // Zo= 80/(Er)^0.5*ln(1.9*(2*h+t)/(0.8*w+t))*(1-h/(4*h1)) Ohms
			Tpd = 3.333*Math.sqrt(Er)*scale;
	
			var L; // Inductance per unit length
			var C; // capacitance per unit length
			L=Tpd*Zo/1000 // nH per unit Length
			C=Tpd/Zo // pF per unit Length

			form.Zo.value= Zo.toFixed(3);		

			if(scale==1.0)
			{
				 form.Text_Tpd.value= "Propagation Dealy, Tpd (ps/cm) =";		
				 form.Tpd.value= (Tpd*10).toFixed(3);
				 form.Text_L.value= "Inductance, L (nH/cm) =";		
	  	form.L.value= (L*10).toFixed(3);	  
				 form.Text_C.value= "Capacitance, C (pF/cm) =";		
				 form.C.value= (C*10).toFixed(5);	  
			}	
			else
			{
				 form.Text_Tpd.value= "Propagation Dealy, Tpd (ps/inch) =";		
			 	form.Tpd.value= (Tpd*1000).toFixed(2);
				 form.Text_L.value= "Inductance, L (nH/in) =";		
		 		form.L.value= (L*1000).toFixed(3);	  
				 form.Text_C.value= "Capacitance, C (pF/in) =";		
				 form.C.value= (C*1000).toFixed(5);	  
			}	
	}
}

function broadside_coupled_stripline_impedance(form) // Calculates broadside coupled microstrip impedance in Ohms and ps/mm
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=0.0254;}; // 1.0=mm, 0.0254=mils
		var w= Number(form.w.value); // track width in mm
		var t= Number(form.t.value); // track thickness in mm
		var h= Number(form.h.value); // smaller dielectric thickness to track in mm
		var h1= Number(form.h1.value); // larger dielectric thickness to top track in mm
		var Er= Number(form.er.value); // relative dielectric constant
		var Zo; // transmission line impedance in Ohms
		var Tpd; // transmission line propagation delay in ps/mm
		Zo = 80/Math.sqrt(Er) * log(1.9*(2*h+t)/(0.8*w+t)) * (1-h/(4*(h+h1+t))); // Zo= 80/(Er)^0.5*ln(1.9*(2*h+t)/(0.8*w+t))*(1-h/(4*(h+h1+t))) Ohms
		Tpd = 3.333*Math.sqrt(Er)*scale;
	
			var L; // Inductance per unit length
			var C; // capacitance per unit length
			L=Tpd*Zo/1000 // nH per unit Length
			C=Tpd/Zo // pF per unit Length

			form.Zo.value= Zo.toFixed(3);		

			if(scale==1.0)
			{
				 form.Text_Tpd.value= "Propagation Dealy, Tpd (ps/cm) =";		
				 form.Tpd.value= (Tpd*10).toFixed(3);
				 form.Text_L.value= "Inductance, L (nH/cm) =";		
	  	form.L.value= (L*10).toFixed(3);	  
				 form.Text_C.value= "Capacitance, C (pF/cm) =";		
				 form.C.value= (C*10).toFixed(5);	  
			}	
			else
			{
				 form.Text_Tpd.value= "Propagation Dealy, Tpd (ps/inch) =";		
			 	form.Tpd.value= (Tpd*1000).toFixed(2);
				 form.Text_L.value= "Inductance, L (nH/in) =";		
		 		form.L.value= (L*1000).toFixed(3);	  
				 form.Text_C.value= "Capacitance, C (pF/in) =";		
				 form.C.value= (C*1000).toFixed(5);	  
			}
		}
}

function loaded_transmission_line(form) // Calculates loaded transmission line in Ohms and ps/mm
{
	with(Math) 
	{
		var scale=1.0; if(form.units[1].checked){scale=25.4;}; // 1.0=mm, 25.4=inches
		var Zo= Number(form.Zo.value); // Transmission line characteristic impedance
		var Tpd= Number(form.Tpd.value); // Transmission line propagation delay
		var Cl= Number(form.cl.value); // Total distributed load capacitance
		var len= Number(form.len.value); // Transmission line Length
		var Lo; // loaded transmission line inductance per unit length
		var Co; // unloaded transmission line capacitance per unit length
		var Zl; // loaded transmission line impedance
		var Tpdl; // loaded transmission line propagation delay
		Lo= Tpd*Zo; // Lo= Tpd*Zo pH/mm
		Co= Tpd/Zo; // Co=Tpd/Zo	 pF/mm
		Zl= Math.sqrt(Lo/(Co+Cl/len)) // Zl= (Lo/(Co+Cl/len))^.5
		Tpdl= Math.sqrt(Lo*(Co+Cl/len)) // Tpdl= (Lo*(Co+Cl/len))^.5		
		form.Zl.value= Zl.toFixed(3);		
		if(scale==1.0)
		{
			form.Text_Tpdl.value= "Loaded Propagation Dealy, Tpdl (ps/mm) =";		
			form.Tpdl.value= Tpdl.toFixed(3);
		}	
		else
		{
			form.Text_Tpdl.value= "Loaded Propagation Dealy, Tpdl (ps/inch) =";		
			form.Tpdl.value= Tpdl.toFixed(2);
		}		
	} 
}

function pi_and_tee_attenuator_pads(form) // Calculates Pi and Tee attenuator pad resistances
{
	with(Math) 
	{
		var Z1= Number(form.Z1.value); // Port 1 characteristic impedance
		var Z2= Number(form.Z2.value); // Port 2 characteristic impedance
		var A= Number(form.A.value); // Port to port attenuation (dB)
		var Pi_R1; // Pi Resistor R1
		var Pi_R2; // Pi Resistor R2
		var Pi_R3; // Pi Resistor R3
		var Tee_R1; // Tee Resistor R1
		var Tee_R2; // Tee Resistor R2
		var Tee_R3; // Tee Resistor R3
		var a; // linear gain
		var A_min; // minimum attenuation
		A_min= -20/LN10*log(Math.sqrt(Math.max(Z1,Z2)/Math.min(Z1,Z2))-Math.sqrt(Math.max(Z1,Z2)/Math.min(Z1,Z2)-1)); // Minimum attenuation
		A= Math.max(A,A_min);
		a= exp(A/20*LN10); // linear attenuation (1/gain)
		Pi_R2= (a*a-1)/2/a*Math.sqrt(Z1*Z2); // Pi Pad R2 Resistance(Ohms)
		Pi_R1= 1/((a*a+1)/Z1/(a*a-1)-1/Pi_R2); // Pi Pad R1 Resistance (Ohms)
		Pi_R3= 1/((a*a+1)/Z2/(a*a-1)-1/Pi_R2); // Pi Pad R3 Resistance (Ohms)
		Tee_R2= 2*a/(a*a-1)*Math.sqrt(Z1*Z2); // Tee Pad R2 Resistance(Ohms)
		Tee_R1= Z1*(a*a+1)/(a*a-1)-Tee_R2; // Tee Pad R1 Resistance (Ohms)
		Tee_R3= Z2*(a*a+1)/(a*a-1)-Tee_R2; // Tee Pad R3 Resistance (Ohms)
		form.A.value = A.toFixed(2);
		form.Pi_R1.value= Pi_R1.toFixed(3);		
		form.Pi_R2.value= Pi_R2.toFixed(3);		
		form.Pi_R3.value= Pi_R3.toFixed(3);		
		form.Tee_R1.value= Tee_R1.toFixed(3);		
		form.Tee_R2.value= Tee_R2.toFixed(3);		
		form.Tee_R3.value= Tee_R3.toFixed(3);		
	} 
}

function y_to_delta_transformation(form) // Transforms Y to Delta Network
{
	with(Math) 
	{
		var R1= Number(form.R1.value); // N1 Port Y Resistance
		var R2= Number(form.R2.value); // N2 Port Y Resistance
		var R3= Number(form.R3.value); // N3 Port Y Resistance
		var Ra= Number(form.Ra.value); // N3-N1 Port Delta Resistance
		var Rb= Number(form.Rb.value); // N1-N2 Port Delta Resistance
		var Rc= Number(form.Rc.value); // N2-N3 Port DeltaResistance
		var add_R= Number(form.add_R[1].checked); // 
		var Rx= Number(form.Rx.value); // Y-Delta Addtional Resistance
		var Rt= R1*R2+R2*R3+R1*R3; // temporary variable
		form.Ra.value= (Rt/R2).toFixed(3);		
		form.Rb.value= (Rt/R3).toFixed(3);		
		form.Rc.value= (Rt/R1).toFixed(3);	
	}
}

function y_delta_add_r(form) // Adds auxilliary resistor
{
	with(Math) 
	{
		var R1= Number(form.R1.value); // N1 Port Y Resistance
		var R2= Number(form.R2.value); // N2 Port Y Resistance
		var R3= Number(form.R3.value); // N3 Port Y Resistance
		var Ra= Number(form.Ra.value); // N3-N1 Port Delta Resistance
		var Rb= Number(form.Rb.value); // N1-N2 Port Delta Resistance
		var Rc= Number(form.Rc.value); // N2-N3 Port DeltaResistance
		var add_R= Number(form.add_R.value); // 
		var Rx= Number(form.Rx.value); // Y-Delta Addtional Resistance
	  var Rt; // temporary variable
	

		switch(add_R)
		{
		case 1: //Resistor in series with R1
		R1=R1+Rx;
		Rt= R1*R2+R2*R3+R1*R3;
		form.R1.value= R1.toFixed(3);
		form.Ra.value= (Rt/R2).toFixed(3);		
		form.Rb.value= (Rt/R3).toFixed(3);		
		form.Rc.value= (Rt/R1).toFixed(3);
		break;

		case 2: //Resistor in series with R2
		R2=R2+Rx;
		Rt= R1*R2+R2*R3+R1*R3;
		form.R2.value= R2.toFixed(3);
		form.Ra.value= (Rt/R2).toFixed(3);		
		form.Rb.value= (Rt/R3).toFixed(3);		
		form.Rc.value= (Rt/R1).toFixed(3);
		break;

		case 3: //Resistor in series with R3
		R3=R3+Rx;
		Rt= R1*R2+R2*R3+R1*R3;
		form.R3.value= R3.toFixed(3);
		form.Ra.value= (Rt/R2).toFixed(3);		
		form.Rb.value= (Rt/R3).toFixed(3);		
		form.Rc.value= (Rt/R1).toFixed(3);
		break;

		case 4: //Resistor in parallel with Ra
		Ra=1/(1/Ra+1/Rx);
		Rt= Ra+Rb+Rc;
		form.Ra.value= Ra.toFixed(3);
		form.R1.value= (Ra*Rb/Rt).toFixed(3);		
		form.R2.value= (Rb*Rc/Rt).toFixed(3);		
		form.R3.value= (Rc*Ra/Rt).toFixed(3);	
		break;

		case 5: //Resistor in parallel with Rb
		Rb=1/(1/Rb+1/Rx);
		Rt= Ra+Rb+Rc;
		form.Rb.value= Rb.toFixed(3);
		form.R1.value= (Ra*Rb/Rt).toFixed(3);		
		form.R2.value= (Rb*Rc/Rt).toFixed(3);		
		form.R3.value= (Rc*Ra/Rt).toFixed(3);	
		break;

		case 6: //Resistor in parallel with Rc
		Rc=1/(1/Rc+1/Rx);
		Rt= Ra+Rb+Rc;
		form.Rc.value= Rc.toFixed(3);
		form.R1.value= (Ra*Rb/Rt).toFixed(3);		
		form.R2.value= (Rb*Rc/Rt).toFixed(3);		
		form.R3.value= (Rc*Ra/Rt).toFixed(3);	
		break;
	
		}	
	}
}

function delta_to_y_transformation(form) // Transforms Delta to Y Network
{
	with(Math) 
	{
		var R1= Number(form.R1.value); // N1 Port Y Resistance
		var R2= Number(form.R2.value); // N2 Port Y Resistance
		var R3= Number(form.R3.value); // N3 Port Y Resistance
		var Ra= Number(form.Ra.value); // N3-N1 Port Delta Resistance
		var Rb= Number(form.Rb.value); // N1-N2 Port Delta Resistance
		var Rc= Number(form.Rc.value); // N2-N3 Port DeltaResistance
		var add_R= Number(form.add_R[1].checked); // 
		var Rx= Number(form.Rx.value); // Y-Delta Addtional Resistance
		var Rt= Ra+Rb+Rc; // temporary variable
		form.R1.value= (Ra*Rb/Rt).toFixed(3);		
		form.R2.value= (Rb*Rc/Rt).toFixed(3);		
		form.R3.value= (Rc*Ra/Rt).toFixed(3);	
	}
}

function one_to_n_resistive_splitter(form) // Calculates 1:N resistive splitter resistances
{
	with(Math) 
	{
		var Zo= Number(form.Zo.value); // Port characteristic impedance
		var N= Number(form.N.value); // N splits
		var A= Number(form.A.value); // Port to port attenuation (dB)
		var R1; // Tee Series Resistor R1
		var R2; // Tee Shunt Resistor R2
		var a; // linear gain
		var A_min; // minimum attenuation
		N= Math.max(Math.floor(N),1);
		A_min= 20/LN10*log(N); // Minimum attenuation
		A= Math.max(A,A_min);
		a= exp(A/20*LN10); // linear attenuation (1/gain)
		R1= Zo*(a-1)/(a+1); // Series Resistance R1(Ohms)
		R2= Zo*2*a/(a*a-a*(N-1)-N); // Sunt Resistance R2(Ohms)
		form.A.value = A.toFixed(2);
		form.N.value = N;
		form.R1.value= R1.toFixed(3);		
		form.R2.value= R2.toFixed(3);		
	} 
}

function return_loss_and_vswr(form) // Calculates return loss and VSWR
{
	with(Math) 
	{
		var Z1_R= Number(form.Z1_R.value); // Port 1 real impedance
		var Z1_I= Number(form.Z1_I.value); // Port 1 imaginary impedance
		var Z2_R= Number(form.Z2_R.value); // Port 2 real impedance
		var Z2_I= Number(form.Z2_I.value); // Port 2 imaginary impedance
		var RLM // Return loss magnitude
		var RLP // Return loss phase (deg)
		var TL // Through loss
		var VSWR // WSWR
		
		RLM = Math.sqrt(((Z1_R-Z2_R)*(Z1_R-Z2_R)+(Z1_I-Z2_I)*(Z1_I-Z2_I))/((Z1_R+Z2_R)*(Z1_R+Z2_R)+(Z1_I+Z2_I)*(Z1_I+Z2_I)));
		RLP = (Math.atan2((Z1_I-Z2_I),(Z1_R-Z2_R))-Math.atan2((Z1_I+Z2_I),(Z1_R+Z2_R)))*180/Math.PI;
		VSWR = (1+RLM)/(1-RLM);

		form.RLM.value = RLM.toFixed(3)		
		form.RLP1.value = RLP.toFixed(2);
		form.RLP2.value = RLP.toFixed(2);
		form.RL_DB.value = (20*log(RLM)/LN10).toFixed(3);
		form.TL.value = (10*log(1-RLM*RLM)/LN10).toFixed(3);
		form.VSWR.value = VSWR.toFixed(3);
	} 
}


function impedance_matching_network(form) // Calculates 2 element impedance matching network
{
	with(Math) 
	{
		var Z1_R= Number(form.Z1_R.value); // Port 1 real impedance
		var Z1_I= Number(form.Z1_I.value); // Port 1 imaginary impedance
		var Z2_R= Number(form.Z2_R.value); // Port 2 real impedance
		var Z2_I= Number(form.Z2_I.value); // Port 2 imaginary impedance
		var F= Number(form.f.value); // Operating Frequency
		var Zmax; // Indicates the higher impedance between Z1 and Z2
		var Zmin; //Indicates the lower impedance between Z1 and Z2
		var Zhigh_R;
		var Zhigh_I;
		var Zlow_R;
		var Zlow_I;
		
		if (Z1_R*Z1_R+Z1_I*Z1_I > Z2_R*Z2_R+Z2_I*Z2_I)// Select Zhigh and Zlow
			{ 	Zmax = "Z1"; Zmin = "Z2"; Zhigh_R = Z1_R; Zhigh_I = Z1_I; Zlow_R = Z2_R; Zlow_I = Z2_I;}
		else
		  { 	Zmax = "Z2"; Zmin = "Z1";	Zhigh_R = Z2_R; Zhigh_I = Z2_I; Zlow_R = Z1_R; Zlow_I = Z1_I;}

		var jL // compensates for low side imaginary part (series match to real)
		var jH_s // compensates for high side imaginary part (conductivity shunt match to real)
		var jA // series matching elemet (Real to Real Match)
		var jB // shunit matching elemet (Real to Real Match)
		var ja1 // series matching elemet, option 1 (includes seies jL)
		var jb1 // shunit matching elemet, option 1 (includes shunt jH)
		var ja2 // series matching elemet, option 2 (includes seies jL)
		var jb2 // shunit matching elemet, option 2 (includes shunt jH)
		
		jL = -Zlow_I; // Low side compensating series impedance 
		jH_s = Zhigh_I/(Zhigh_R*Zhigh_R + Zhigh_I*Zhigh_I); // High side compensating shunt impedance
		Zhigh_R =(Zhigh_R*Zhigh_R + Zhigh_I*Zhigh_I)/Zhigh_R;
		jA = Zlow_R * Math.sqrt(Zhigh_R/Zlow_R-1);
		jB = Zlow_R * Zhigh_R/jA;
		ja1 = jL+jA;
		ja2 = jL-jA;
		jb1 = -1/(jH_s + 1/jB);
		jb2 = -1/(jH_s - 1/jB);

		form.Zhigh.value = Zmax;
		form.Zlow.value = Zmin;
		form.ja1.value = ja1.toFixed(3);
		form.ja2.value = ja2.toFixed(3);
		form.jb1.value = jb1.toFixed(3);
		form.jb2.value = jb2.toFixed(3);
		
		if (ja1 >= 0)
		{ form.Text_A1.value = "Series inductance ja (nH) ="; form.LC_A1.value = (1e3*ja1/(2*PI*F)).toFixed(3); }
		else
		{ form.Text_A1.value = "Series capacitance ja (pF) ="; form.LC_A1.value = (-1e6/(2*PI*F)/ja1).toFixed(3); }

		if (jb1 >= 0)
		{ form.Text_B1.value = "Shunt inductance jb (nH) ="; form.LC_B1.value = (1e3*jb1/(2*PI*F)).toFixed(3); }
		else
		{ form.Text_B1.value = "Shunt capacitance jb (pF) ="; form.LC_B1.value = (-1e6/(2*PI*F)/jb1).toFixed(3); }

		if (ja2 >= 0)
		{ form.Text_A2.value = "Series inductance ja (nH) ="; form.LC_A2.value = (1e3*ja2/(2*PI*F)).toFixed(3); }
		else
		{ form.Text_A2.value = "Series capacitance ja (pF) ="; form.LC_A2.value = (-1e6/(2*PI*F)/ja2).toFixed(3); }

		if (jb2 >= 0)
		{ form.Text_B2.value = "Shunt inductance jb (nH) ="; form.LC_B2.value = (1e3*jb2/(2*PI*F)).toFixed(3); }
		else
		{ form.Text_B2.value = "Shunt capacitance jb (pF) ="; form.LC_B2.value = (-1e6/(2*PI*F)/jb2).toFixed(3); }

	} 
}

function series_to_parallel_conversion(form) // Converts Series to Parallel
{
	with(Math) 
	{
		var a= Number(form.a.value); // Series real impedance
		var b= Number(form.b.value); // Series imaginary impedance
		var c= Number(form.c.value); // Parallel real impedance
		var d= Number(form.d.value); // Parallel imaginary impedance
		var Z0r= Number(form.Z0r.value); // Reference real impedance
		var Z0i= Number(form.Z0i.value); // Reference imaginary impedance
		var VSWR= Number(form.VSWR.value); // VSWR
		var RLM // Return loss magnitude
	
		c = a+b*b/a;
		d = a*a/b+b;
		if(a==0){c=1e500;  d=b;} 
		if(b==0){c=a; d=1e500;} 
		if((a==0)&&(b==0)){c=0;  d=0;} 
		
		RLM = Math.sqrt(((Z0r-a)*(Z0r-a)+(Z0i-b)*(Z0i-b))/((Z0r+a)*(Z0r+a)+(Z0i+b)*(Z0i+b)));
		form.VSWR.value = ((1+RLM)/(1-RLM)).toFixed(3);

		form.c.value = c.toFixed(3);
		form.d.value = d.toFixed(3);
		form.mag.value = (Math.sqrt(a*a+b*b)).toFixed(3);
		form.phase.value = (atan2(b,a)*180/Math.PI).toFixed(2);
	} 
}

function parallel_to_series_conversion(form) // Converts Parallel to Series
{
	with(Math) 
	{
		var a= Number(form.a.value); // Series real impedance
		var b= Number(form.b.value); // Series imaginary impedance
		var c= Number(form.c.value); // Parallel real impedance
		var d= Number(form.d.value); // Parallel imaginary impedance
		var Z0r= Number(form.Z0r.value); // Reference real impedance
		var Z0i= Number(form.Z0i.value); // Reference imaginary impedance
		var VSWR= Number(form.VSWR.value); // VSWR
		var RLM // Return loss magnitude

		a = d*c*d/(c*c+d*d);	
		b = c*c*d/(c*c+d*d);
		
		RLM = Math.sqrt(((Z0r-a)*(Z0r-a)+(Z0i-b)*(Z0i-b))/((Z0r+a)*(Z0r+a)+(Z0i+b)*(Z0i+b)));
		form.VSWR.value = ((1+RLM)/(1-RLM)).toFixed(3);
		
		form.a.value = a.toFixed(3);
		form.b.value = b.toFixed(3);
		form.mag.value = (Math.sqrt(a*a+b*b)).toFixed(3);
		form.phase.value = (atan2(b,a)*180/Math.PI).toFixed(2);
	} 
}

function series_to_parallel_conversion_add_series(form) // Adds series impedance
{
	with(Math) 
	{
		var a= Number(form.a.value); // Series real impedance
		var b= Number(form.b.value); // Series imaginary impedance
		var c= Number(form.c.value); // Parallel real impedance
		var d= Number(form.d.value); // Parallel imaginary impedance
		var r= Number(form.r.value); // Additional real impedance
		var x= Number(form.x.value); // Additional imaginary impedance
		var Z0r= Number(form.Z0r.value); // Reference real impedance
		var Z0i= Number(form.Z0i.value); // Reference imaginary impedance
		var VSWR= Number(form.VSWR.value); // VSWR
		var RLM // Return loss magnitude
		
		a=a+r;
		b=b+x;
		c = a+b*b/a;
		d = a*a/b+b;
		
		RLM = Math.sqrt(((Z0r-a)*(Z0r-a)+(Z0i-b)*(Z0i-b))/((Z0r+a)*(Z0r+a)+(Z0i+b)*(Z0i+b)));
		form.VSWR.value = ((1+RLM)/(1-RLM)).toFixed(3);
  
		form.a.value = a.toFixed(3);
		form.b.value = b.toFixed(3);
		form.c.value = c.toFixed(3);
		form.d.value = d.toFixed(3);
		form.mag.value = (Math.sqrt(a*a+b*b)).toFixed(3);
		form.phase.value = (atan2(b,a)*180/Math.PI).toFixed(2);
	} 
}

function series_to_parallel_conversion_add_shunt(form) // Adds shunt impedance
{
	with(Math) 
	{
		var a= Number(form.a.value); // Series real impedance
		var b= Number(form.b.value); // Series imaginary impedance
		var c= Number(form.c.value); // Parallel real impedance
		var d= Number(form.d.value); // Parallel imaginary impedance
		var r= Number(form.r.value); // Additional real impedance
		var x= Number(form.x.value); // Additional imaginary impedance
		var Z0r= Number(form.Z0r.value); // Reference real impedance
		var Z0i= Number(form.Z0i.value); // Reference imaginary impedance
		var VSWR= Number(form.VSWR.value); // VSWR
		var RLM // Return loss magnitude
	
		c=((a*r-b*x)*(a+r)+(b*r+a*x)*(b+x))/((a+r)*(a+r)+(b+x)*(b+x));
		b=(-(a*r-b*x)*(b+x)+(b*r+a*x)*(a+r))/((a+r)*(a+r)+(b+x)*(b+x));
		a=c;
		c = a+b*b/a;
		d = a*a/b+b;
		if(a==0){c=1e500;  d=b;} 
		if(b==0){c=a; d=1e500;} 
		if((a==0)&&(b==0)){c=0;  d=0;} 
		
		RLM = Math.sqrt(((Z0r-a)*(Z0r-a)+(Z0i-b)*(Z0i-b))/((Z0r+a)*(Z0r+a)+(Z0i+b)*(Z0i+b)));
		form.VSWR.value = ((1+RLM)/(1-RLM)).toFixed(3);

		form.a.value = a.toFixed(3);
		form.b.value = b.toFixed(3);
		form.c.value = c.toFixed(3);
		form.d.value = d.toFixed(3);
		form.mag.value = (Math.sqrt(a*a+b*b)).toFixed(3);
		form.phase.value = (atan2(b,a)*180/Math.PI).toFixed(2);
	} 
}

function series_to_parallel_conversion_add_series_cap(form) // Adds series capacitance
{
	with(Math) 
	{
		var a= Number(form.a.value); // Series real impedance
		var b= Number(form.b.value); // Series imaginary impedance
		var c= Number(form.c.value); // Parallel real impedance
		var d= Number(form.d.value); // Parallel imaginary impedance
		var cap= Number(form.cap.value); // Additional capacitance
		var Freq= Number(form.Freq.value); // Operating Frequency
		var Z0r= Number(form.Z0r.value); // Reference real impedance
		var Z0i= Number(form.Z0i.value); // Reference imaginary impedance
		var VSWR= Number(form.VSWR.value); // VSWR
		var RLM // Return loss magnitude

		
		b=b-1e6/(Freq*2*Math.PI*cap);
		c = a+b*b/a;
		d = a*a/b+b;
		if(a==0){c=1e500;  d=b;} 
		if(b==0){c=a; d=1e500;} 
		if((a==0)&&(b==0)){c=0;  d=0;} 
		
		RLM = Math.sqrt(((Z0r-a)*(Z0r-a)+(Z0i-b)*(Z0i-b))/((Z0r+a)*(Z0r+a)+(Z0i+b)*(Z0i+b)));
		form.VSWR.value = ((1+RLM)/(1-RLM)).toFixed(3);
	  
		form.a.value = a.toFixed(3);
		form.b.value = b.toFixed(3);
		form.c.value = c.toFixed(3);
		form.d.value = d.toFixed(3);
		form.mag.value = (Math.sqrt(a*a+b*b)).toFixed(3);
		form.phase.value = (atan2(b,a)*180/Math.PI).toFixed(2);
	} 
}

function series_to_parallel_conversion_add_shunt_cap(form) // Adds shunt capacitance
{
	with(Math) 
	{
		var a= Number(form.a.value); // Series real impedance
		var b= Number(form.b.value); // Series imaginary impedance
		var c= Number(form.c.value); // Parallel real impedance
		var d= Number(form.d.value); // Parallel imaginary impedance
		var cap= Number(form.cap.value); // Additional capacitance
		var Freq= Number(form.Freq.value); // Operating Frequency
		var r= 0; // Additional real impedance
		var x= -1e6/(Freq*2*Math.PI*cap); // Additional imaginary impedance
		var Z0r= Number(form.Z0r.value); // Reference real impedance
		var Z0i= Number(form.Z0i.value); // Reference imaginary impedance
		var VSWR= Number(form.VSWR.value); // VSWR
		var RLM // Return loss magnitude
	
		c=((a*r-b*x)*(a+r)+(b*r+a*x)*(b+x))/((a+r)*(a+r)+(b+x)*(b+x));
		b=(-(a*r-b*x)*(b+x)+(b*r+a*x)*(a+r))/((a+r)*(a+r)+(b+x)*(b+x));
		a=c;
		c = a+b*b/a;
		d = a*a/b+b;
		if(a==0){c=1e500;  d=b;} 
		if(b==0){c=a; d=1e500;} 
		if((a==0)&&(b==0)){c=0;  d=0;} 

		RLM = Math.sqrt(((Z0r-a)*(Z0r-a)+(Z0i-b)*(Z0i-b))/((Z0r+a)*(Z0r+a)+(Z0i+b)*(Z0i+b)));
		form.VSWR.value = ((1+RLM)/(1-RLM)).toFixed(3);

		form.a.value = a.toFixed(3);
		form.b.value = b.toFixed(3);
		form.c.value = c.toFixed(3);
		form.d.value = d.toFixed(3);
		form.mag.value = (Math.sqrt(a*a+b*b)).toFixed(3);
		form.phase.value = (atan2(b,a)*180/Math.PI).toFixed(2);
	} 
}

function series_to_parallel_conversion_add_series_ind(form) // Adds series inductance
{
	with(Math) 
	{
		var a= Number(form.a.value); // Series real impedance
		var b= Number(form.b.value); // Series imaginary impedance
		var c= Number(form.c.value); // Parallel real impedance
		var d= Number(form.d.value); // Parallel imaginary impedance
		var ind= Number(form.ind.value); // Additional inductance
		var Freq= Number(form.Freq.value); // Operating Frequency
		var Z0r= Number(form.Z0r.value); // Reference real impedance
		var Z0i= Number(form.Z0i.value); // Reference imaginary impedance
		var VSWR= Number(form.VSWR.value); // VSWR
		var RLM // Return loss magnitude

		
		b=b+(Freq*2*Math.PI*ind/1000);
		c = a+b*b/a;
		d = a*a/b+b;
		if(a==0){c=1e500;  d=b;} 
		if(b==0){c=a; d=1e500;} 
		if((a==0)&&(b==0)){c=0;  d=0;} 
		
		RLM = Math.sqrt(((Z0r-a)*(Z0r-a)+(Z0i-b)*(Z0i-b))/((Z0r+a)*(Z0r+a)+(Z0i+b)*(Z0i+b)));
		form.VSWR.value = ((1+RLM)/(1-RLM)).toFixed(3);
	  
		form.a.value = a.toFixed(3);
		form.b.value = b.toFixed(3);
		form.c.value = c.toFixed(3);
		form.d.value = d.toFixed(3);
		form.mag.value = (Math.sqrt(a*a+b*b)).toFixed(3);
		form.phase.value = (atan2(b,a)*180/Math.PI).toFixed(2);
	} 
}

function series_to_parallel_conversion_add_shunt_ind(form) // Adds shunt inductance
{
	with(Math) 
	{
		var a= Number(form.a.value); // Series real impedance
		var b= Number(form.b.value); // Series imaginary impedance
		var c= Number(form.c.value); // Parallel real impedance
		var d= Number(form.d.value); // Parallel imaginary impedance
		var ind= Number(form.ind.value); // Additional inductance
		var Freq= Number(form.Freq.value); // Operating Frequency
		var r= 0; // Additional real impedance
		var x= Freq*2*Math.PI*ind/1000; // Additional imaginary impedance
		var Z0r= Number(form.Z0r.value); // Reference real impedance
		var Z0i= Number(form.Z0i.value); // Reference imaginary impedance
		var VSWR= Number(form.VSWR.value); // VSWR
		var RLM // Return loss magnitude
	
		c=((a*r-b*x)*(a+r)+(b*r+a*x)*(b+x))/((a+r)*(a+r)+(b+x)*(b+x));
		b=(-(a*r-b*x)*(b+x)+(b*r+a*x)*(a+r))/((a+r)*(a+r)+(b+x)*(b+x));
		a=c;
		c = a+b*b/a;
		d = a*a/b+b;
		if(a==0){c=1e500;  d=b;} 
		if(b==0){c=a; d=1e500;} 
		if((a==0)&&(b==0)){c=0;  d=0;} 

		RLM = Math.sqrt(((Z0r-a)*(Z0r-a)+(Z0i-b)*(Z0i-b))/((Z0r+a)*(Z0r+a)+(Z0i+b)*(Z0i+b)));
		form.VSWR.value = ((1+RLM)/(1-RLM)).toFixed(3);

		form.a.value = a.toFixed(3);
		form.b.value = b.toFixed(3);
		form.c.value = c.toFixed(3);
		form.d.value = d.toFixed(3);
		form.mag.value = (Math.sqrt(a*a+b*b)).toFixed(3);
		form.phase.value = (atan2(b,a)*180/Math.PI).toFixed(2);
	} 
}

//Complex Math Functions
function cmult(x,y) {return [x[0]*y[0]-x[1]*y[1],x[0]*y[1]+x[1]*y[0]];}
function csum(x,y)  {return [x[0]+y[0],x[1]+y[1]];}
function csub(x,y)  {return [x[0]-y[0],x[1]-y[1]];}
function ctrans(x)  {return [x[0],-x[1]];}
function cinv(x)    {return [x[0]/(x[0]*x[0]+x[1]*x[1]),-x[1]/(x[0]*x[0]+x[1]*x[1])];}
function cpar(x,y)  {return [(x[0]*y[0]+x[1]*y[1])/((x[0]+y[0])^2+(x[1]+y[1])^2) , (x[1]*y[0]-x[0]*y[1])/((x[0]+y[0])^2+(x[1]+y[1])^2)];}
function cdiv(x,y)  {return [(x[0]*y[0]+x[1]*y[1])/(y[0]^2+y[1]^2) , (x[1]*y[0]-x[0]*y[1])/(y[0]^2+y[1]^2)];}
function cmag(x)    {return x[0]*x[0]+x[1]*x[1];}
function cphase(x)  {return atan2(x[1],x[0])*180/Math.PI;}
function creal(x)   {return x[0];}
function cimag(x)   {return x[1];}

//</script>
