  function gammln(xx)
    { var stp= 2.50662827465;
        var  x = xx-1.0;
        var  tmp = x+5.5;
         tmp = (x+0.5)*Math.log(tmp)-tmp;
      var  ser = 1.0+76.18009173/(x+1.0)-86.50532033/(x+2.0)+24.01409822/(x+3.0)
            -1.231739516/(x+4.0)+0.120858003e-2/(x+5.0)-0.536382e-5/(x+6.0);
     var dummy= tmp+Math.log(stp*ser);
     return dummy;
     }



  function resethyp()
  {
     document.hypform.elements[0].value=6;
     document.hypform.elements[1].value=49;
     document.hypform.elements[3].value=3;
     document.hypform.elements[2].value=6;
     document.hypform.elements[5].value="";
     document.hypform.elements[7].value="";

  }

  function hypd(mwert,nwert,knwert,kwert)
    {
     var m=Math.floor(eval(mwert));
     document.hypform.elements[0].value=m;
     var n=Math.floor(eval(nwert));
     document.hypform.elements[1].value=n;
     var kn=Math.floor(eval(knwert));
     document.hypform.elements[2].value=kn;
     var k=Math.floor(eval(kwert));
     document.hypform.elements[3].value=k;
     if (n<1)  return "Error: N too small!";
     if (m>n)  return "Error: M>N";
     if (m<1)  return "Error: M too small!";
     if (kn>n) return "Error: n too big!";
     if (kn<1) return "Error: n<1!";
     if ((n>=1)&&(m<=n)&&(m>=1)&&(kn<=n)&&(kn>=1))
       {
         if ((k<0)||(k>m)||(k>kn)||(k<(kn-(n-m)))) return 0;
         if ((k>=0)&&(k<=m)&&(k<=kn)&&(k>=(kn-(n-m))))
           { var dummy=gammln(m+1)-gammln(k+1)-gammln(m-k+1)+
                       gammln(n-m+1)-gammln(kn-k+1)-gammln(n-m-kn+k+1)-
                       gammln(n+1)+gammln(kn+1)+gammln(n-kn+1);
             var dummy2= Math.exp(dummy);
             if (Math.abs(dummy2-1)<1E-9) return 1;
             if (Math.abs(dummy2-1)>=1E-9) return dummy2;
           }
       }
    }

   function hypv(mwert,nwert,knwert,kwert)
    {
     var m=Math.floor(eval(mwert));
     document.hypform.elements[0].value=m;
     var n=Math.floor(eval(nwert));
     document.hypform.elements[1].value=n;
     var kn=Math.floor(eval(knwert));
     document.hypform.elements[2].value=kn;
     var k=Math.floor(eval(kwert));
     document.hypform.elements[3].value=k;
     if (n<1)  return "Error: N too small!";
     if (m>n)  return "Error: M>N";
     if (m<1)  return "Error: M too small!";
     if (kn>n) return "Error: n too big!";
     if (kn<1) return "Error: n<1!";

     if ((n>=1)&&(m<=n)&&(m>=1)&&(kn<=n)&&(kn>=1))
       { var dummy=0;
         if (k<Math.max(0,kn-(n-m))) return 0;
         if (k>Math.min(kn,m))  return 1;
         if ((k>=Math.max(0,kn-(n-m)))&&(k<=Math.min(kn,m)))
         {
         var diff=k-Math.max(0,kn-(n-m));
         if (k<100)
         {
         for (i=Math.max(0,kn-(n-m));i<=k;i++)
         {  dummy+=hypd(m,n,kn,i);}
         if (Math.abs(dummy-1)<1E-9) dummy=1;
         return dummy;
         }
         }
         if (k>=100) return "Too much effort for Javascript!"

       }
    }


