//Testing paired observations online. Also for matched samples using non-
//parametric statistics tests
//copyright: Daan G Uitenbroek PhD

function truncate(real,places)  // truncates 'real' numbers n 'places' behind the decimal dot
{
var multi=Math.pow(10,places);
return (Math.round(real*multi)/multi)
}

function cut(real,lenght)  // changes scientific into normal notation and cuts to size
{
var str=""+real;
var r="0.";
var pt=str.indexOf("e");
if (pt>0 ) 
    {
     var a=str.substring(0,1)+str.substring(2,pt+1);
     for (var index=1;index<=(str.substring(pt+2,pt+5)*1-1);index++)
        r+=0;
     var st=r+a;
     for (var index=st.length;index<=lenght;index++)
      st+="0";
     return (st.substring(0,lenght));
     };
for (var index=str.length;index<=lenght;index++)
      str+="0";
pt=str.indexOf(".");
if (pt==0) str="0"+str    //solves that newer versions of Netscape give inconsistent
// numeric notations
return str.substring(0,lenght);
}

function zprob(zval)  
{
if ((zval>5.0)||(zval<-5.0)) outp=0
else
{
if (zval == 0.0)     
     var x  = 0.0;        
else      
     {  
     var y = 0.5 * Math.abs (zval);        
     if (y >= (10000* 0.5))        
             x=1.0;  
     else if (y < 1.0)         
     {         
     var w = y*y;          
     x = ((((((((0.000124818987 * w  
          -0.001075204047) * w +0.005198775019) * w  
          -0.019198292004) * w +0.059054035642) * w  
          -0.151968751364) * w +0.319152932694) * w  
          -0.531923007300) * w +0.797884560593) * y * 2.0;     
     }         
     else      
     {  
     y -= 2.0;         
     x  = (((((((((((((-0.000045255659 * y  
          +0.000152529290) * y -0.000019538132) * y  
          -0.000676904986) * y +0.001390604284) * y  
          -0.000794620820) * y -0.002034254874) * y  
          +0.006549791214) * y -0.010557625006) * y  
          +0.011630447319) * y -0.009279453341) * y  
          +0.005353579108) * y -0.002141268741) * y  
          +0.000535310849) * y +0.999936657524*1;      
     }          
     }  
var outp=((zval > 0.0 ? ((x*1+1.0*1) * 0.5) : ((1.0 -x) * 0.5))) 
if ((outp>1)||(outp<-1)) (outp=1) 
}
return (outp) 
} 

function odd(number)
{
var isodd=0*1;
if (Math.round(number/2+0.00001)==number/2)  isodd=1*1;
return isodd
}

function c2prob(chi2,df)
{
var add=0;
var mult=1;
if (odd(df)<0.5)
 {
      add=1;
      mult=Math.sqrt(2/chi2/3.14159265359);
   }
var denominator=1;
for (var index=df;index>1;index-=2)
         denominator=denominator*index;
var numerator=Math.pow(chi2,((df*1+add*1)/2))*Math.exp(chi2*-1/2);
sum=1*1;
m=1*1;

for (var count=df*1+2*1;m>0.00000000001;count+=2)
   {
      m=(m*chi2)/count;
      sum=sum*1+m*1;
   }
return (1-sum*mult*numerator/denominator);
}

function probv(b,s,tval,ioe,df)  //support function for tprob
{
  var a=tval/Math.sqrt(df);
  if (ioe>0.5)
     {
       if (df==1) s=0;
       var hulp= 0.5*1+(a*b*s+Math.atan(a))/Math.PI;
       return hulp
     }
  else
   var hulp=0.5*1+0.5*a*Math.sqrt(b)*s;
   return hulp
}

function tprob(tval,df)
{
writeln="\n";
if (navigator.appVersion.lastIndexOf('Win') != -1) writeln="\r\n";

if (df>5000) df=5000;
var s=1/1;
var c=1/1;
var f=1/1;
var ioe=Math.round(Math.round(df/2+0.1*1)-df/2+0.1*1); //takes the modules
var b=df/(df*1+tval*tval);
var fk=2*1+ioe*1;
var pval=989;
if ((df-2)<2) 
   pval=probv(b,s,tval,ioe,df);
for (index=fk;index<(df-1);index+=2)
  {
    c=c*b*(fk-1)/fk;
    s=s*1+c*1;
    if (s==f) pval=probv(b,s,tval,ioe,df);
    f=s;
    fk=fk*1+2*1;
  }
if (pval==989) pval=probv(b,s,tval,ioe,df);
return pval
}

function odd(number)
{
var isodd=0*1;
if (Math.round(number/2+0.00001)==number/2)  isodd=1*1;
return isodd
}

function bino(x,n)
{
writeln="\n";
if (navigator.appVersion.lastIndexOf('Win') != -1) writeln="\r\n";

var p0=Math.exp(Math.log(1-0.5)*n)    //(1/0.5)^n
var tot=1-p0;
for (var index=0;index<x-1;index++) 
     {p0*=((n-index)/(index+1))*(0.5/(1-0.5));
     tot-=p0 
     }
return tot;
}

function tt(N1,R1,sd)
{
writeln="\n";
if (navigator.appVersion.lastIndexOf('Win') != -1) writeln="\r\n";

if (sd==0) {var pvalue=tprob(R1,(N1-1))}
   else
      {var tval=R1*Math.sqrt(N1)/sd;
        document.form1.outp.value +="The t-value for this difference "+truncate(tval,3)+writeln
        var pvalue=tprob(tval,(N1-1));      }

document.form1.outp.value +="p-value= "+cut(pvalue,7)+"; (1-p="+cut((1-pvalue),7)+")"+writeln
document.form1.outp.value +="(Multiply p-value with two for two-sided testing)"+writeln
return
}

function wt(N1,R1)
{
writeln="\n";
if (navigator.appVersion.lastIndexOf('Win') != -1) writeln="\r\n";

var exptd=N1*(N1*1+1*1)/4
var sdexpt=Math.sqrt(N1*(N1*1+1*1)*(N1*2+1*1)/24)
document.form1.outp.value +="expected sum of ranked difference= "+truncate(exptd,2)+writeln
document.form1.outp.value +="standard deviation "+truncate(sdexpt,2)+writeln
var zvalue=(R1-exptd)/sdexpt
var pvalue=zprob(zvalue)
document.form1.outp.value +="z-value= "+truncate(zvalue,3)+" (p= "+cut(pvalue,7)+")"+"(1-p= "+cut(1-pvalue,6)+")"+writeln
document.form1.outp.value +="(Multiply p-value with two for two-sided testing)"
return
}

function st(N1,R1)
{
writeln="\n";
if (navigator.appVersion.lastIndexOf('Win') != -1) writeln="\r\n";

document.form1.outp.value +="expected number of possitive signs "+(N1/2)+writeln
document.form1.outp.value +="probability to get "+R1+" or more signs"+writeln
var pvalue=bino(R1,N1)
document.form1.outp.value +="possitive= "+cut(pvalue,7)+" (1-p= "+cut(1-pvalue,6)+")"+writeln
return
}

function mcn(N2,R2,NN)
{
writeln="\n";
if (navigator.appVersion.lastIndexOf('Win') != -1) writeln="\r\n";

var N1=N2*1
var R1=R2*1

if (NN>0.5)
  {N1=N2*(NN-R2)/NN
   R1=R2*(NN-N2)/NN};

var cval=(N1-R1)*(N1-R1)/(N1*1+R1*1)
document.form1.outp.value +="Chi2 for equal number of changers in "+writeln+"both groups "+truncate(cval,3)+writeln
var prcval=c2prob(cval,1)
document.form1.outp.value +="probability "+cut(prcval,5)+writeln+writeln
var cval=(Math.abs(N1-R1)-1)*(Math.abs(N1-R1)-1)/(N1*1+R1*1)
document.form1.outp.value +="Yates Chi2 with continuity correction "+truncate(cval,3)+writeln
var prcval=c2prob(cval,1)
document.form1.outp.value +="probability "+cut(prcval,5)+writeln+writeln
if (R1<N1) {N2=N1; N1=R1; R1=N2}
var pvalue=bino(R1,(N1*1+R1*1))
document.form1.outp.value +="Binomial alternative (Probability of "+writeln+"getting "+R1+" or more out of "+(N1*1+R1*1)+")"+writeln
                                                  +"equals: "+cut(pvalue,7)+" (1-p= "+cut(1-pvalue,6)+")"+writeln
return
}

function ClearOutp() 
{
writeln="\n";
if (navigator.appVersion.lastIndexOf('Win') != -1) writeln="\r\n";

document.form1.outp.value ="cleared"+writeln;
}

