var units = 'metric';

function acosh(arg) {
    // http://kevin.vanzonneveld.net
    // +   original by: Onno Marsman
    // *     example 1: acosh(8723321.4);
    // *     returns 1: 16.674657798418625
 
    return Math.log(arg + Math.sqrt(arg*arg-1));
}

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

function showError(msg, elements) {
    var element;
    
    element = document.getElementById("warning");
    element.innerHTML = '<h2><font color=\"red\">Error: ' + msg + '</font></h2>';
    element.style.display = 'inline';
    
    if (elements) {
        for (i = 0;i < elements.length; i++) {
            element = document.getElementById(elements[i]);
            element.style.background = 'pink';
            // uncomment to clear values
            //element.value = '';
        }
    }
}

function clearError (elements) {
    var element;
    
    element = document.getElementById("warning");
    element.style.display = 'none';
    
    if (elements) {
        for (i = 0; i < elements.length; i++) {
            document.getElementById(elements[i]).style.background = '';
        }
    }
}

function clearCalc () {
    document.getElementById("resistance").value = '';
	document.getElementById("inductance").value = '';
	document.getElementById("capacitance").value = '';
			
	updatez0();
}

function switchline(obj) {
    clearError (null);
    clearCalc ();
    
   if(obj.options[obj.selectedIndex].value == 'twinline') {
      document.getElementById('twinline_area').style.display='block';
      document.getElementById('coax_area').style.display='none';
      document.getElementById('twinstrip_area').style.display='none';
      document.getElementById('microstrip_area').style.display='none';
      
      calcTwinline ();
    }  else {
        if(obj.options[obj.selectedIndex].value == 'coax'){
            document.getElementById('twinline_area').style.display='none';
            document.getElementById('coax_area').style.display='block';
            document.getElementById('twinstrip_area').style.display='none';
            document.getElementById('microstrip_area').style.display='none';

            calcCoax();
        } else {
            if (obj.options[obj.selectedIndex].value == 'twinstrip'){
            	document.getElementById('twinline_area').style.display='none';
            	document.getElementById('coax_area').style.display='none';
            	document.getElementById('twinstrip_area').style.display='block';
            	document.getElementById('microstrip_area').style.display='none';
            	
            	calcTwinstrip ();
    	    } else {
                if (obj.options[obj.selectedIndex].value == 'microstrip'){
                	document.getElementById('twinline_area').style.display='none';
                	document.getElementById('coax_area').style.display='none';
                	document.getElementById('twinstrip_area').style.display='none';
                	document.getElementById('microstrip_area').style.display='block';

                	calcMicrostrip ();
                }
            }
        }
    }     
}

function init() {
    document.getElementById('twinline_area').style.display='block';
	document.getElementById('coax_area').style.display='none';
	document.getElementById('twinstrip_area').style.display='none';
	document.getElementById('microstrip_area').style.display='none';
	
	//document.getElementById('twinline_area').style.visibility='';
	//document.getElementById('coax_area').style.visibility='hidden';
	//document.getElementById("twinstrip_area").style.visibility='hidden';
	//document.getElementById("microstrip_area").style.visibility='hidden';
}

function toggleUnits(type) {

	units = type;

	//Populate the array with all the page tags 
 	var allPageTags=document.getElementsByTagName("*"); 
 	//Cycle through the tags using a for loop 
 	for (i=0; i < allPageTags.length; i++) { 
 		if (allPageTags[i].className=='metric') {
 			allPageTags[i].style.display = (allPageTags[i].className==type)? '':'none';
 			//allPageTags[i].style.visibility = (allPageTags[i].className==type)? '':'hidden';
 		}
 		if (allPageTags[i].className=='english') {
 			allPageTags[i].style.display = (allPageTags[i].className==type)? '':'none';
 			//allPageTags[i].style.visibility = (allPageTags[i].className==type)? '':'hidden';
 			
 		}
	}

	clearCalc();
}

function updatez0() {
	var L = eval(document.getElementById("inductance").value);
	var C = eval(document.getElementById("capacitance").value);
	
	if ((typeof L == 'number') && (typeof C == 'number')) {
		if (L!=0 && C!=0) {
			var z0 = Math.sqrt(L/C);
			document.getElementById("impedance").value = z0.toPrecision(5);
		}
	} else {
	    document.getElementById("impedance").value = '';
	}
}

var mu0 = eval(1.25663706e-6);
var ep0 = eval(8.85418782e-12);

function calcCoax() {
	var a = eval(document.getElementById("coax_a").value);
	var b = eval(document.getElementById("coax_b").value);
	var sigma = eval(document.getElementById("coax_sigma").value);
	var mur = eval(document.getElementById("coax_mur").value);
	var epr = eval(document.getElementById("coax_epr").value);
	var f = eval(document.getElementById("freq").value);
	
	if ((typeof a == 'number') && (typeof b == 'number') && (typeof sigma == 'number')
			&& (typeof f == 'number') && (typeof mur == 'number') 
			&& (typeof epr == 'number')) {
		
		var mu = mu0*mur;
		var ep = ep0*epr;
	
	    var elements = new Array("coax_a", "coax_b");
	    var element;
	    
	    if (a < 0 || b < 0) {
            showError('Dimensions must be positive numbers.', elements);
            clearCalc();
            return true;
        }
        
        clearError (elements);
	    
		if (b <= a) {		    
			showError('a must be less than b', elements);
            clearCalc ();
			return true
		}

        clearError (elements);
        
        elements[0] = "coax_mur";
        elements.remove(1);
		
		if (mu <= 0) { 
		    showError ('&#956;<sub>r</sub> must be a positive number',elements);
		    clearCalc (); 
		    return false;
	    }
	    clearError(elements);
	    
	    elements[0] = "coax_epr";
	    if (ep <= 0) { 
		    showError ('&#949;<sub>r</sub> must be a positive number',elements); 
		    clearCalc ();
		    return false;
	    }
	    
	    clearError (elements);

		if (units == 'english') {
			a = a*0.0254;
			b = b*0.0254;		
		}
				
		var L = (mu/(2*Math.PI)*Math.log(b/a));
		var C = (2*eval(Math.PI)*ep/Math.log(b/a));
			
		var delta = 1/Math.sqrt(Math.PI*f*mu*sigma);
		if(delta > a) {	
			var R = 1/(sigma*Math.PI*Math.pow(a,2)) + 1/(sigma*2*Math.PI*b*delta);
		} else {
			var R = 1/(sigma*2*Math.PI*a*delta) + 1/(sigma*2*Math.PI*b*delta);
		}
		
		if (units == 'english') {
			L = L/0.0254;
			C = C/0.0254;
			R = R/0.0254;		
		}
		
		document.getElementById("resistance").value = R.toPrecision(5);
		document.getElementById("inductance").value = L.toPrecision(5);
		document.getElementById("capacitance").value = C.toPrecision(5);
				
		updatez0();
	}
}

function calcTwinline() {
	var a = eval(document.getElementById("twinline_a").value);
	var d = eval(document.getElementById("twinline_d").value);
	var sigma = eval(document.getElementById("twinline_sigma").value);
	var mur = eval(document.getElementById("twinline_mur").value);
	var epr = eval(document.getElementById("twinline_epr").value);
	var f = eval(document.getElementById("freq").value);
	
	if ((typeof a == 'number') && (typeof d == 'number') && (typeof sigma == 'number')
			&& (typeof f == 'number') && (typeof mur == 'number') 
			&& (typeof epr == 'number')) {
		
		var mu = mu0*mur;
		var ep = ep0*epr;
		
        var elements = new Array ("twinline_a", "twinline_d");
        
        if (d < 0 || a < 0) {
		    showError('Dimensions must be positive numbers.', elements);
            clearCalc();
            return true;
		}
		
		clearError (elements);
		
		if (d <= 2*a) {
			showError ('d must be greater than 2a', elements);
            clearCalc ();
            return false;
		}		
		
		clearError (elements);
		
        elements[0] = "twinline_mur";
        elements.remove(1);
		
		if (mu <= 0) { 
		    showError ('&#956;<sub>r</sub> must be a positive number',elements); 
		    clearCalc ();
		    return false;
	    }
	    clearError(elements);
	    
	    elements[0] = "twinline_epr";
	    if (ep <= 0) { 
		    showError ('&#949;<sub>r</sub> must be a positive number',elements); 
		    clearCalc ();
		    return false;
	    }
	    
	    clearError (elements);
		
		if (units == 'english') {
			a = a*0.0254;
			d = d*0.0254;		
		}
				
		var L = mu/(Math.PI)*Math.log(d/(2*a) + Math.sqrt(Math.pow(d/(2*a),2)-1));
		var C = Math.PI*ep/Math.log(d/(2*a) + Math.sqrt(Math.pow(d/(2*a),2)-1));
			
		var delta = 1/Math.sqrt(Math.PI*f*mu*sigma);
		if(delta > a) {	
			var R = 2/(sigma*Math.PI*Math.pow(a,2));
		} else {
			var R = 2/(sigma*2*Math.PI*a*delta);
		}
		
		if (units == 'english') {
			L = L/0.0254;
			C = C/0.0254;
			R = R/0.0254;		
		}
		
		document.getElementById("resistance").value = R.toPrecision(5);
		document.getElementById("inductance").value = L.toPrecision(5);
		document.getElementById("capacitance").value = C.toPrecision(5);
		
		updatez0();
	}
}

function calcTwinstrip() {
	var w = eval(document.getElementById("twinstrip_w").value);
	var t = eval(document.getElementById("twinstrip_t").value);
	var d = eval(document.getElementById("twinstrip_d").value);
	var sigma = eval(document.getElementById("twinstrip_sigma").value);
	var mur = eval(document.getElementById("twinstrip_mur").value);
	var epr = eval(document.getElementById("twinstrip_epr").value);
	var f = eval(document.getElementById("freq").value);
	
	if ((typeof w == 'number') && (typeof t == 'number') && (typeof d == 'number') 
			&& (typeof sigma == 'number') && (typeof f == 'number') && (typeof mur == 'number') 
			&& (typeof epr == 'number')) {
		
		var mu = mu0*mur;
		var ep = ep0*epr;
			
		var elements = new Array ("twinstrip_w", "twinstrip_t", "twinstrip_d");
		
		if (d < 0 || w < 0 || t < 0) {
		    showError('Dimensions must be positive numbers.', elements);
            clearCalc();
            return true;
		}
		
		clearError (elements);
		
		elements.splice(2,1);
		
		if (w <= t) {
			showError ('t must be less than w', elements);
			clearCalc ();
			return false
		}
		
		clearError (elements);
		
		elements[1] = "twinstrip_d";
		
		if (d <= w) {
		    showError('d must be larger than w', elements);
		    clearCalc ();
		    return false
		}
		
		clearError(elements);
				
		elements[0] = "twinstrip_mur";
		elements.splice(1,1);
		
		if (mu <= 0) { 
		    showError ('&#956;<sub>r</sub> must be a positive number',elements); 
		    clearCalc ();
		    return false;
	    }
	    clearError(elements);
	    
	    elements[0] = "twinstrip_epr";
	    if (ep <= 0) { 
		    showError ('&#949;<sub>r</sub> must be a positive number',elements);
		    clearCalc (); 
		    return false;
	    }
	    clearError (elements);
		
		if (units == 'english') {
			w = w*0.0254;
			t = t*0.0254;
			d = d*0.0254;		
		}
				
		var L = mu/(Math.PI)*acosh(d/w);
		var C = mu*ep/L;
			
		var delta = 1/Math.sqrt(Math.PI*f*mu*sigma);
		if(delta > t) {	
			var R = 2/(sigma*w*t);
		} else {
			var R = 2*(2/(sigma*w*delta) + 2/(sigma*(t-2*delta)*delta));
		}
		
		if (units == 'english') {
			L = L/0.0254;
			C = C/0.0254;
			R = R/0.0254;		
		}
		
		document.getElementById("resistance").value = R.toPrecision(5);
		document.getElementById("inductance").value = L.toPrecision(5);
		document.getElementById("capacitance").value = C.toPrecision(5);
		
		updatez0();
	}
}

function calcMicrostrip() {
	var w = eval(document.getElementById("microstrip_w").value);
	var t = eval(document.getElementById("microstrip_t").value);
	var h = eval(document.getElementById("microstrip_h").value);
	var sigma = eval(document.getElementById("microstrip_sigma").value);
	var mur = eval(document.getElementById("microstrip_mur").value);
	var epr = eval(document.getElementById("microstrip_epr").value);
	var f = eval(document.getElementById("freq").value);
	
	if ((typeof w == 'number') && (typeof t == 'number') && (typeof h == 'number') 
			&& (typeof sigma == 'number')	&& (typeof f == 'number') && (typeof mur == 'number') 
			&& (typeof epr == 'number')) {
		
		var mu = mu0*mur;
		var ep = ep0*epr;
		
		var elements = new Array ("microstrip_w", "microstrip_t", "microstrip_h" );
		
		if (h < 0 || w < 0 || t < 0) {
		    showError('Dimensions must be positive numbers.', elements);
            clearCalc();
            return true;
		}
		
		clearError (elements);
		
		elements.splice(2,1)
		
		if (w <= t) {
			showError('t must be less than w', elements);
            clearCalc ();
			return false
		}
		
		clearError (elements);
		
		elements[1] = "microstrip_h";
		
		if (w < 10*h) {
			showError('w must be at least 10*h', elements);
			clearCalc ();
			return false
		}
		
		clearError (elements);
		
		elements[0] = "microstrip_t";
		
		if (h < 10*t) {
			showError('h must be at least 10*t', elements);
			clearCalc ();
			return false
		}		
		
		clearError (elements);
		
		elements[0] = "microstrip_mur";
		elements.splice(1,1);
		
		if (mu <= 0) { 
		    showError ('&#956;<sub>r</sub> must be a positive number',elements); 
		    clearCalc ();
		    return false;
	    }
	    clearError(elements);
	    
	    elements[0] = "microstrip_epr";
	    if (ep <= 0) { 
		    showError ('&#949;<sub>r</sub> must be a positive number',elements); 
		    clearCalc ();
		    return false;
	    }
	    clearError (elements);
		
		if (units == 'english') {
			w = w*0.0254;
			t = t*0.0254;
			h = h*0.0254;		
		}
				
		var L = mu*h/w;
		var C = mu*ep/L;
			
		var delta = 1/Math.sqrt(Math.PI*f*mu*sigma);
		if(delta > t) {	
			var R = 1/(sigma*w*t);
		} else {
			var R = 2/(sigma*w*delta) + 2/(sigma*(t-2*delta)*delta);
		}
		
		if (units == 'english') {
			L = L/0.0254;
			C = C/0.0254;
			R = R/0.0254;		
		}
		
		document.getElementById("resistance").value = R.toPrecision(5);
		document.getElementById("inductance").value = L.toPrecision(5);
		document.getElementById("capacitance").value = C.toPrecision(5);
		
		updatez0();
	}
}

function update() {
	calcTwinline();
	calcCoax();
	calcTwinstrip();
	calcMicrostrip();
}
