function RoundDP(x, dp) {
// Rounds x to dp decimal places.
    var powten = Math.pow(10, dp);
    return (Math.round(x*powten)/powten)
}

function RoundSF(x, sf) {
// Rounds x to sf significant figures, but max 6 decimal places.
    if (x==0) return 0;
    with (Math) {
        var magnitude = ceil(log(abs(x))/LN10);	// digits before decimal point
	var dp = max(0, min(6, sf-magnitude));	// no rounding left of the .
	return RoundDP(x, dp)
    }
}

//--------------STANDARD NORMAL DISTRIBUTION FUNCTIONS -------------------------

function backwardNormal(p) {
        if (p<0 || p>1) form.z.value=""
    else {
	var normType = getTail(0);
	var negative = checkneg(p, normType);
	p = diddle(p, normType, 'half', negative);
	var z = Norm_z(p);
	if (negative) z=-z;
	form.z.value=RoundSF(z, 4)
    }
}		

function Norm_z(p) {
// Beasley Springer approx. to inverse norm, Applied Stats. 26, 118-121.
// See: J.H.Maindonald "Statistical Computation" p.295.
// Returns z given a half-middle tail type p.

    var a0= 2.5066282,  a1=-18.6150006,  a2= 41.3911977,   a3=-25.4410605,
	b1=-8.4735109,  b2= 23.0833674,  b3=-21.0622410,   b4=  3.1308291, 
	c0=-2.7871893,  c1= -2.2979648,  c2=  4.8501413,   c3=  2.3212128,
	d1= 3.5438892,  d2=  1.6370678, r, z;

    if (p>0.42) {
	r=Math.sqrt(-Math.log(0.5-p));
	z=(((c3*r+c2)*r+c1)*r+c0)/((d2*r+d1)*r+1)
    }
    else {	
	r=p*p;
	z=p*(((a3*r+a2)*r+a1)*r+a0)/((((b4*r+b3)*r+b2)*r+b1)*r+1)
    }
    return z
}

function checkNumber(input, min, max, msg)
{
     /* Thanks to JavaScript for Dummies for the following function */
     msg = msg + " has an invalid data entry:  " + input.value;
     var str = input.value

     for (var i=0; i<str.length; i++){
        var ch = str.substring(i,i+1)
        if((ch<"0" || "9"<ch) && (ch != '.') && (ch != '-')){
            alert(msg)
            return false
        }
      }
      var num = str
      if(num<min || max<num) {
        alert(msg + " not in range [" + min + "..." + max + "]")
        return false
      }
      input.value = str
      return true
}

function ThreeDec(x)
{
	x = RoundDP(x, 3) 
	return x
}

function normal_cdf(z)
{
     /* Thanks to Jan de Leeuw for the following function */
     t = (z > 0) ? z : (-z)
     p = 1 - Math.pow((1+t*(0.049867347 + t*(0.0211410061 
         + t*(0.0032776263 + t*(0.0000380036 + t*(0.0000488906 
         + t*(0.000005383))))))), -16) / 2
     t = (z > 0) ? p : 1-p
     return t
}

function a_below(form)
{
     if (checkNumber(form.score, -9999, 9999, "Score")&&
         checkNumber(form.mu, -9999, 9999, "Mu")&&
         checkNumber(form.sigma, .001, 9999, "Sigma")){
            z = (form.score.value - form.mu.value)/form.sigma.value 
            form.area.value = ThreeDec(normal_cdf(z))
     } 
}

function a_between(form)
{
     if (checkNumber(form.lscore, -9999, 9999, "Score")&&
         checkNumber(form.hscore, -9999, 9999, "Score")&&
         checkNumber(form.mu, -9999, 9999, "Mu")&&
         checkNumber(form.sigma, .001, 9999, "Sigma")){
     zl = (form.lscore.value - form.mu.value)/form.sigma.value
     zh = (form.hscore.value - form.mu.value)/form.sigma.value
     form.area1.value = ThreeDec(normal_cdf(zh)-normal_cdf(zl))
     }
}

function scores(form)
{
     if (checkNumber(form.area1, .0001, .9999, "Area")&&
         checkNumber(form.mu, -9999, 9999, "Mu")&&
         checkNumber(form.sigma, .001, 9999, "Sigma")){
			var p = eval(form.area1.value)/2;
			var z = Norm_z(p);
			var z1=RoundSF(eval(form.mu.value) - eval( z * form.sigma.value ),4)
			var z2=RoundSF(eval(form.mu.value) + eval( z * form.sigma.value ),4)
			form.lscore.value= z1;
			form.hscore.value=z2;
     }
}

function scoreb(form)
{
		if (checkNumber(form.area, .0001, .9999, "Area")&&
			checkNumber(form.mu, -9999, 9999, "Mu")&&
			checkNumber(form.sigma, .001, 9999, "Sigma")){
		    var p = eval(form.area.value);
			var p1=(p>.5)?p-1/2:(1/2-p)
			var z = Norm_z(p1);
		if (p<.5) z=-z;
			form.score.value=RoundSF(eval(form.mu.value) + eval( z * form.sigma.value ),4)
     }
}


