<!-- script start

// IQ calculator, etc.
function setSource(eSource)
{
    // Store source enumerator for calculate()
    document.eminentform.eSource.value = eSource;
}

function calculate(formObj)
{
    // Handle calculation flow
    var eSource = document.eminentform.eSource.value;

    if(parseInt(eSource) == 0)
    {
        if(!calculate_cattell_fr_terman(formObj)) return;
        calculate_wechsler_fr_terman(formObj);
	    calculate_gre_fr_terman(formObj);
        calculate_stddev_fr_terman(formObj);
        calculate_sat_fr_terman(formObj);
        calculate_perc_fr_stddev(formObj);
        calculate_rarity_fr_perc(formObj);
    }
    else
    if(parseInt(eSource) == 1)
    {
        if(!calculate_terman_fr_cattell(formObj)) return;
        calculate_wechsler_fr_terman(formObj);
	    calculate_gre_fr_terman(formObj);
        calculate_stddev_fr_terman(formObj);
        calculate_sat_fr_terman(formObj);
        calculate_perc_fr_stddev(formObj);
        calculate_rarity_fr_perc(formObj);
    }	
    else
    if(parseInt(eSource) == 2)
    {
        if(!calculate_terman_fr_stddev(formObj)) return;
        calculate_cattell_fr_terman(formObj)
        calculate_wechsler_fr_terman(formObj);
        calculate_sat_fr_terman(formObj);
	    calculate_gre_fr_terman(formObj);
        calculate_perc_fr_stddev(formObj);
        calculate_rarity_fr_perc(formObj);
    }
    else
    if(parseInt(eSource) == 3)
    {
        if(!calculate_stddev_fr_perc(formObj)) return;
        calculate_terman_fr_stddev(formObj);
        calculate_wechsler_fr_terman(formObj);
        calculate_sat_fr_terman(formObj);
	    calculate_gre_fr_terman(formObj);
        calculate_cattell_fr_terman(formObj)
        calculate_rarity_fr_perc(formObj);
    }
    else
    if(parseInt(eSource) == 5)
    {
        if(!calculate_perc_fr_rarity(formObj)) return;
        calculate_stddev_fr_perc(formObj);
        calculate_terman_fr_stddev(formObj);
        calculate_cattell_fr_terman(formObj)
        calculate_wechsler_fr_terman(formObj);
        calculate_sat_fr_terman(formObj);
	    calculate_gre_fr_terman(formObj);
    }
    else
    if(parseInt(eSource) == 6)
    {
      if(!calculate_terman_fr_wechsler(formObj)) return;
	    calculate_gre_fr_terman(formObj);
        calculate_cattell_fr_terman(formObj)
        calculate_stddev_fr_terman(formObj);
        calculate_sat_fr_terman(formObj);
        calculate_perc_fr_stddev(formObj);
        calculate_rarity_fr_perc(formObj);
    }
    else
    if(parseInt(eSource) == 8)
    {
        if(!calculate_terman_fr_gre(formObj)) return;
        calculate_wechsler_fr_terman(formObj);
        calculate_cattell_fr_terman(formObj);
        calculate_stddev_fr_terman(formObj);
        calculate_sat_fr_terman(formObj);
        calculate_perc_fr_stddev(formObj);
        calculate_rarity_fr_perc(formObj);
    }
    else
    if(parseInt(eSource) == 9)
    {
        if(!calculate_terman_fr_sat(formObj)) return;
        calculate_cattell_fr_terman(formObj);
        calculate_stddev_fr_terman(formObj);
        calculate_wechsler_fr_terman(formObj);
	    calculate_gre_fr_terman(formObj);
        calculate_perc_fr_stddev(formObj);
        calculate_rarity_fr_perc(formObj);
    }
}

function calculate_terman_fr_cattell(formObj)
{
    // Use divisor 1.5 for mapping to Terman IQ
    var cattellVal;
    var termanVal;

    if(formObj.cattellVal.value == "") formObj.cattellVal.value = 100;

    cattellVal	= parseFloat(formObj.cattellVal.value);
    if(cattellVal < 0)
    {
        alert("IQ Cattell must be >= 0");
        clearValues(formObj);
        formObj.cattellVal.focus();
        return false;
    }
    termanVal	= Math.round((cattellVal + 50.0)/1.5);

    formObj.termanVal.value = termanVal;

    return true;
}

function calculate_cattell_fr_terman(formObj)
{
    // Use multiplier 1.5 for mapping to Cattell IQ
    var termanVal;
    var cattellVal;

    if(formObj.termanVal.value == "") formObj.termanVal.value = 100;

    termanVal	= parseFloat(formObj.termanVal.value);
    if(termanVal < 0)
    {
        alert("IQ Stanford-Binet must be >= 0");
        clearValues(formObj);
        formObj.termanVal.focus();
        return false;
    }
    cattellVal	= Math.round(1.5 * termanVal - 50.0);

    formObj.cattellVal.value = cattellVal;

    return true;
}

function calculate_terman_fr_stddev(formObj)
{
    // Use 16 Terman IQ points for each standard deviation
    var stdVal;
    var termanVal;

    if(formObj.stdVal.value == "") formObj.stdVal.value = 0;

    stdVal = parseFloat(formObj.stdVal.value);
    if(stdVal < -6.25)
    {
        alert("Standard deviation must be >= -6.25");
        clearValues(formObj);
        formObj.stdVal.focus();
        return false;
    }
    termanVal = Math.round(stdVal * 16) + 100;

    formObj.termanVal.value = termanVal;

    return true;
}

function calculate_stddev_fr_terman(formObj)
{
    // Use 16 Terman IQ points for each standard deviation
    var termanVal;
    var stdVal;

    if(formObj.termanVal.value == "") formObj.termanVal.value = 100;

    termanVal	= parseFloat(formObj.termanVal.value);
    stdVal	= (termanVal - 100)/16;

    formObj.stdVal.value = stdVal;
}

function calculate_perc_fr_stddev(formObj)
{
    // Calculate percentile from standard deviation
    // using Normal Distribution.
    // Q(x):e(x) < 7.5 * 10^-8
    var stdVal;
    var Fx;
    var x;
    var t;
    var Qx;
    var perc;
    var b1 = 0.31938153;
    var b2 = -0.356563782;
    var b3 = 1.781477937;
    var b4 = -1.821255978;
    var b5 = 1.330274429;
    var r = 0.2316419;

    if(formObj.stdVal.value == "") formObj.stdVal.value = 0;

    stdVal = parseFloat(formObj.stdVal.value);

    with(Math)
    {
        x = abs(stdVal);

        // Density function
        Fx = 1/sqrt(2*PI)*exp(-pow(x,2)/2);

        // Compute tail area (Qx) using polynomial approximation
        t = 1/(1+r*x);

        Qx = Fx*(b1*t + b2*pow(t,2) + b3*pow(t,3) + b4*pow(t,4) + b5*pow(t,5));

        if(stdVal < 0)
            Qx = 1 - Qx;
    }

    // Percentile from tail area
    perc = (1-Qx)*100;
    perc = round(perc, 3);

    formObj.percVal.value = perc;
}

function calculate_stddev_fr_perc(formObj)
{
    // Calculate standard deviation from percentile
    // using inverse Normal Distribution.
    // x:e(Q(x)) < 4.5 * 10^-4
    var percVal;
    var Qx;
    var t;
    var x;
    var c0 = 2.515517;
    var c1 = 0.802853;
    var c2 = 0.010328;
    var d1 = 1.432788;
    var d2 = 0.189269;
    var d3 = 0.001308;

    if(formObj.percVal.value == "") formObj.percVal.value = 50.0001;
    
    percVal = parseFloat(formObj.percVal.value);

    if(percVal < 13 || percVal > 99.9999999999)
    {
        alert("Percentile must be >= 13 and <= 99.999999999");
        clearValues(formObj);
        formObj.percVal.focus();
        return false;
    }

    with(Math)
    {
        // Tail area from percentile
        Qx = 1-percVal/100;
        // Compute standard deviation (x) using rational approximation
        t = sqrt(log(1/pow(Qx,2)));

        x = t - (c0 + c1*t + c2*pow(t,2))/(1 + d1*t + d2*pow(t,2) + d3*pow(t,3));
    }

    x	= round(x, 3);

    formObj.stdVal.value = x;

    return true;
}

function calculate_rarity_fr_perc(formObj)
{
    // Calculate rarity from percentile:
    // 1/X
    var percVal;
    var rarityVal;

    if(formObj.percVal.value == "") formObj.percVal.value = 2;

    percVal	= parseFloat(formObj.percVal.value);

    rarityVal	= Math.round(1/(1-(percVal/100)));

    formObj.rarityVal.value = rarityVal;
}

function calculate_perc_fr_rarity(formObj)
{
    // Calculate percentile from rarity:
    // Inverse 1/X
    var rarityVal;
    var percVal;

    if(formObj.rarityVal.value == "") formObj.rarityVal.value = 2;

    rarityVal	= parseFloat(formObj.rarityVal.value);
    if(rarityVal < 2)
    {
        alert("Rarity must be >= 2");
        clearValues(formObj);
        formObj.rarityVal.focus();
        return false;
    }

    percVal	= 100*(rarityVal-1)/rarityVal;
    percVal	= round(percVal, 3);

    formObj.percVal.value = percVal;

    return true;
}

function calculate_wechsler_fr_terman(formObj)
{
    // Use divisor 16/15 for mapping to Wechsler IQ
    var termanVal;
    var wechslerVal;

    if(formObj.termanVal.value == "") formObj.termanVal.value = 100;

    termanVal	= parseFloat(formObj.termanVal.value);

    wechslerVal	= Math.round(15 * (termanVal - 100)/16 + 100);

    formObj.wechslerVal.value = wechslerVal;
}

function calculate_terman_fr_wechsler(formObj)
{
    // Use multiplier 16/15 for mapping to Terman IQ
    var wechslerVal;
    var termanVal;

    if(formObj.wechslerVal.value == "") formObj.wechslerVal.value = 100;
	
    wechslerVal	= parseFloat(formObj.wechslerVal.value);

    if(wechslerVal < 0)
    {
        alert("IQ Wechsler must be >= 0");
        clearValues(formObj);
        formObj.wechslerVal.focus();
        return false;
    }
    termanVal	= Math.round(16 * (wechslerVal - 100)/15 + 100);

    formObj.termanVal.value = termanVal;

    return true;
}

function calculate_gre_fr_terman(formObj)
{
    // Used Rodrigo de la Jara's formula
    var termanVal;
    var greVal;

    if(formObj.termanVal.value == "") formObj.termanVal.value = 100;

    termanVal	= parseFloat(formObj.termanVal.value);

    greVal		= Math.round((termanVal - 26.8)/0.085);

    formObj.greVal.value = greVal;
}

function calculate_terman_fr_gre(formObj)
{
    // Used Rodrigo de la Jara's formula
    var greVal;
    var termanVal;

    if(formObj.greVal.value == "") formObj.greVal.value = 861;
	
    greVal		= parseFloat(formObj.greVal.value);

    if(greVal < 70)
    {
        alert("GRE score must be >= 70");
        clearValues(formObj);
        formObj.greVal.focus();
        return false;
    }

    termanVal	= Math.round(26.8 + 0.085 * greVal);

    formObj.termanVal.value = termanVal;

    return true;
}
        
function calculate_sat_fr_terman(formObj)
{
    // Used Rodrigo de la Jara's formula
    var termanVal;
    var satVal;

    if(formObj.termanVal.value == "") formObj.termanVal.value = 100;

    termanVal	= parseFloat(formObj.termanVal.value);

    satVal		= Math.round((termanVal - 2.918)/0.1033);

    formObj.satVal.value = satVal;
}

function calculate_terman_fr_sat(formObj)
{
    // Used Rodrigo de la Jara's formula
    var satVal;
    var termanVal;

    if(formObj.satVal.value == "") formObj.satVal.value = 940;
	
    satVal		= parseFloat(formObj.satVal.value);

    if(satVal < 290)
    {
        alert("SAT score must be >= 290");
        clearValues(formObj);
        formObj.satVal.focus();
        return false;
    }

    termanVal	= Math.round(2.918 + 0.1033 * satVal);

    formObj.termanVal.value = termanVal;

    return true;
}

function clearValues(formObj)
{
    formObj.termanVal.value  = "";
    formObj.cattellVal.value = "";
    formObj.wechslerVal.value = "";
    formObj.greVal.value = "";
    formObj.satVal.value = "";
    formObj.stdVal.value = "";
    formObj.percVal.value = "";
    formObj.rarityVal.value = "";
}
function round(num, d) { 
    n = Math.pow(10, !d ? 2 : d);
    return Math.round(num*n) / n;
}

// script end -->
