function calcBend(term)
{
    var bendMultiplier;
    var TBdiameter;
    //var TBradius;
    var TBbendRadius;
    var error = "";
    
    switch(term)
    {
        case "short":
            TBdiameter = document.getElementById("TBdiameter");
            TBbendRadius = document.getElementById("TBbendRadius");
            bendMultiplier = 1;
            break;
        case "long":
            TBdiameter = document.getElementById("TBdiameterLong");
            TBbendRadius = document.getElementById("TBbendRadiusLong");
            bendMultiplier = 2;
            break;
        default:
            break;
    }
    
    var diameter = TBdiameter.value;
    var bendRadius = TBbendRadius.value;
	
    // bend radius given
    // D = R/100
    // bend radius is in millimeters, but diameter must be in microns, so divide by .001
    if(diameter=="" && isValid(bendRadius))
    {
	    diameter = bendRadius / (100 * bendMultiplier * .001);
    }
    // diameter given
    // R = D * 100
    // diameter is in microns, but bend radius must be in millimeters, so multiply by .001
    else if(isValid(diameter) && bendRadius=="")
    {
	    bendRadius = diameter * 100 * bendMultiplier * .001;
    }
    else
    {
	    error = buildMessage(1,1,false,false);
    }

    if(error != "")
    {
        showMessage(error);
    }
    else
    {
        TBdiameter.value = diameter;
        TBbendRadius.value = bendRadius;
    }
}

function calcNumAp()
{
    var TBnumAp = document.getElementById("TBnumAp");
    var TBcoreIndex = document.getElementById("TBcoreIndex");
    var TBcladIndex = document.getElementById("TBcladIndex");
    
    var numAp = TBnumAp.value;
    var coreIndex = TBcoreIndex.value;
    var cladIndex = TBcladIndex.value;
    
    var error = "";
	
    // numerical aperture and core index are given
    // cladIndex = √(coreIndex² - na²)
    if(isValid(coreIndex) && isValid(numAp) && cladIndex=="" )
    {
        if(Math.pow(coreIndex,2) - Math.pow(numAp, 2) <= 0)
        {
            error = "The values you selected will yield an imaginary value for the clad glass index of refraction.  Please select different numbers.";
        }
        else
        {
	        cladIndex = Math.sqrt(Math.pow(coreIndex,2) - Math.pow(numAp, 2));
	    }
    }
    // numerical aperture and clad index given
    // coreIndex = √(na² + cladIndex²)
    else if(coreIndex=="" && isValid(cladIndex) && isValid(numAp))
    {
	    coreIndex = Math.sqrt(Number(Math.pow(numAp, 2)) + Number(Math.pow(cladIndex,2)));
    }
    // core index and clad index given
    // na = √(coreIndex² - cladIndex²)
    else if(isValid(coreIndex) && isValid(cladIndex) && numAp=="")
    {
        if(Math.pow(coreIndex,2) - Math.pow(cladIndex) <= 0)
        {
            error = "The values you selected will not yield an imaginary value for numerical aperture. Please select different numbers.";
        }
        else
        {
	        numAp = Math.sqrt(Math.pow(coreIndex,2) - Math.pow(cladIndex,2));
	    }
    }
    else
    {
	    error = buildMessage(2,1, false, false);
    }
    
    if(error != "")
    {
        showMessage(error);
    }
    else
    {
        TBnumAp.value = setPrecision(numAp, 3);
        TBcoreIndex.value = setPrecision(coreIndex, 3);
        TBcladIndex.value = setPrecision(cladIndex, 3);
    }
}

function calcDegrees()
{
    var TBdegreesC = document.getElementById("TBdegreesC");
    var TBdegreesF = document.getElementById("TBdegreesF");
    
    var degreesC = TBdegreesC.value;
    var degreesF = TBdegreesF.value;
    
    var error = "";
	
    // degrees Celcius given
    // F = (C * 9/5) + 32
    if(isValid(degreesC, true, true) && degreesF=="")
    {
        degreesF = (degreesC * 9/5 ) + 32;
    }
    // degrees Fahrenheit given
    // C = (F – 32) * 5/9
    else if(isValid(degreesF, true, true) && degreesC=="")
    {
	    degreesC = ( degreesF - 32 ) * (5/9);
    }
    else
    {
	    error = buildMessage(1, 1, true, true);
    }
    
    if(error != "")
    {
        showMessage(error);
    }
    else
    {
        TBdegreesC.value = setPrecision(degreesC, 2);
        TBdegreesF.value = setPrecision(degreesF, 2);
    }
}

function calcMetric()
{
    var TBcentimeters = document.getElementById("TBcentimeters");
    var TBmeters = document.getElementById("TBmeters");
    var TBinches = document.getElementById("TBinches");
    var TBfeet = document.getElementById("TBfeet");
    
    var centimeters = TBcentimeters.value;
    var meters = TBmeters.value;
    var inches = TBinches.value;
    var feet = TBfeet.value;
    
    var error = "";

    // centimeters given
    // in = cm * .3937
    // ft = in / 12
    // m = cm / 100
    if(isValid(centimeters) && inches=="" && feet=="" && meters=="")
    {
        inches = centimeters * .3937;
        feet = inches / 12;
        meters = centimeters / 100;
    }
    // inches given
    // cm = in * 2.54
    // ft = in / 12
    // m = in * .0254
    else if(isValid(inches) && centimeters=="" && feet=="" && meters=="")
    {
        centimeters = inches * 2.54;
        feet = inches / 12;
        meters = inches * .0254;
    }
    // feet given
    // cm = ft * 30.48
    // in = ft * 12 
    // m = ft * .3048
    else if(isValid(feet) && inches=="" && centimeters=="" && meters=="")
    {
        centimeters = feet * 30.48;
        inches = feet * 12;
        meters = feet * .3048;
    }
    // meters given
    // cm = m * 100
    // in = m * 39.37
    // ft = m * 3.2808
    else if(isValid(meters) && inches=="" && feet=="" && centimeters=="")
    {
        centimeters = meters * 100;
        inches = meters * 39.37;
        feet = meters * 3.2808;
    }
    else
    {
	    error = buildMessage(1,3,false, false);
    }
    
    if(error != "")
    {
        showMessage(error);
    }
    else
    {
        TBcentimeters.value = setPrecision(centimeters, 2);
        TBinches.value = setPrecision(inches, 2);
        TBmeters.value = setPrecision(meters, 2);
        TBfeet.value = setPrecision(feet, 2);
    }
}

function calcBendRadius()
{
    var TBappliedStress = document.getElementById("TBappliedStress");
    var TBfiberRadius = document.getElementById("TBfiberRadius");
    var TBbndRadius = document.getElementById("TBbndRadius");
    var TBcoatingThickness = document.getElementById("TBcoatingThickness");
    
    var stress = TBappliedStress.value;
    var youngs = 1.02 * Math.pow(10, 7);
    var fiberRadius = TBfiberRadius.value;
    var bndRadius = TBbndRadius.value;
    var coatingThickness = TBcoatingThickness.value;
    
    var error = "";

    // calculate applied stress
    // O'a = [r / (R – t)] * E 
    if(stress=="" && isValid(fiberRadius) && isValid(bndRadius) && isValid(coatingThickness))
    {
        stress = (fiberRadius / (bndRadius - coatingThickness)) * youngs;
    }
    // calculate fiber radius
    // r = (O'a / E) (R – t)
    else if(isValid(stress) && fiberRadius=="" && isValid(bndRadius) && isValid(coatingThickness))
    {
        fiberRadius = (stress / youngs)*(bndRadius - coatingThickness);
    }
    // calculate bend radius
    // R = (r * E / O'a) + t
    else if(isValid(stress) && isValid(fiberRadius) && bndRadius=="" && isValid(coatingThickness))
    {
        bndRadius = Number(fiberRadius * youngs / stress) + Number(coatingThickness)
    }
    // calculate coating thickness
    // t = R - [(r * E) / O'a]
    else if(isValid(stress) && isValid(fiberRadius) && isValid(bndRadius) && coatingThickness=="")
    {
        coatingThickness = bndRadius - ((fiberRadius * youngs) / stress);
    }
    else
    {
	    error = buildMessage(4,1,false,false);
    }
    
    if(error != "")
    {
        showMessage(error);
    }
    else
    {
        TBappliedStress.value = setPrecision(stress, 2);
        TBfiberRadius.value = setPrecision(fiberRadius, 4);
        TBbndRadius.value = setPrecision(bndRadius, 2);
        TBcoatingThickness.value = setPrecision(coatingThickness, 4);
    }
}

function calcLaserPower()
{
    var TBenergy = document.getElementById("TBenergy");
    var TBfiberDiameter = document.getElementById("TBfiberDiameter");
    var TBpulseDuration = document.getElementById("TBpulseDuration");
    
    var energy = TBenergy.value;
    var diameter = TBfiberDiameter.value;
    var pulse = TBpulseDuration.value;
    
    var error = "";
    
    var a = 440;
    var b = .95;
    var c = .5;
    
    // E = ( a * (d)b * (t)c )
    // d = ((E / (a * (t)c))1/b)
    // t = ((E / (a * (d)b))1/c)
    
    // examples:
    //   .271j = a * (.6mm)b * (.000001s)c
    
    // energy and fiber diameter given
    // t = ( E / ( a * (d)b ) ) 1/c
    if(pulse=="" && isValid(energy) && isValid(diameter))
    {
        
        pulse = Math.pow( energy / ( a * Math.pow( diameter, b ) ), ( 1 / c ) );
    }

    // energy and pulse duration given
    // d = ( E / ( a * (t)c ) )1/b
    else if(isValid(pulse) && diameter=="" && isValid(energy))
    {
        diameter = Math.pow( energy / ( a * Math.pow( pulse, c ) ), ( 1 / b ) );
    }
    // fiber diameter and pulse duration given
    // E = ( a * (.d)b * (.t)c )
    else if(isValid(diameter) && isValid(pulse) && energy=="")
    {
        energy = a * Math.pow(diameter, b) * Math.pow( pulse, c);
    }
    else
    {
        error = buildMessage(2,1,false,false);
    }

    if(error != "")
    {
        showMessage(error);
    }
    else
    {
        TBenergy.value = setPrecision(energy, 3);
        TBfiberDiameter.value = setPrecision(diameter, 3);
        TBpulseDuration.value = setPrecision(pulse, 7);
    }
}