// Define prototype for array IndexOf
if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}
function daysInMonth(y,m){
  currentDate=new Date(y,m,1)
  var nextMonth = new Date(y,m+1,1)
  var days= (nextMonth-currentDate)/3600000/24
  return days
}	
// Function to return ordered number (or string)
function orderIt(str){
 var theDigits = new Array()
 var tmp,i,j
 for (i=0; i < str.length; i++) theDigits[i]=str.substr(i, 1)
 for (i=0; i < theDigits.length-1; i++) {
   for (var j=i+1; j < theDigits.length; j++) {
     if (theDigits[i] > theDigits[j]) {
		   tmp = theDigits[j]
			 theDigits[j]=theDigits[i]
			 theDigits[i]=tmp
		 }
   }
 }
 return theDigits.join("")
}  
// Compute the factorial of a number;
function factorial(n) {
 var x=1,i;
 if (n==0) return 1;
 for (i=1;i<=n;i++) 
 x *= i;
return x
}

//How Many combinations;
 function NoOfCombs(N,n) {
 return Math.round(factorial(N)/(factorial(N-n)*factorial(n))<1?0:factorial(N)/(factorial(N-n)*factorial(n)));
 }

 //How Many sub winners;
 function subWins(nSel, nWin, nPlay, nComb ) {  
 // Respectively, Selections, correct, the game (eg 6 fot lotto), calculate how many eg 3's;
 return NoOfCombs(nWin,nComb) * NoOfCombs(nSel-nWin,nPlay-nComb);
 }

//Probability of getting Z out of R draws from N numbers;
 function LottoOdds(N,R,Z) {
   return factorial(R)*factorial(N-R)*factorial(R)*factorial(N-R)/factorial(Z)/factorial(R-Z)/factorial(N-2*R+Z)/factorial(R-Z)/factorial(N);
}
function formatNum(n) { 
 var jj=0, leng, strNum, Ar = new Array(), tempA, dec="";
 strNum = n.toString();
 tempA = strNum.split(".");
 strNum = tempA[0];
 if(tempA.length > 1) dec="." + tempA[1];
 leng = strNum.length;
 Ar[jj] = strNum.substr(leng-1,1);
 jj++;
 for (var ii=1;ii<leng;ii++) {
   if(ii%3==0) { Ar[jj] = ","; jj++ };
   Ar[jj] = strNum.substr(leng-ii-1,1);
	 jj++;
 }
 return Ar.reverse().join("") + dec;
}
 // function generateCombs(N,n) : Generates combinations of N numbers (1..N) into into groups of n
 // These generated combinations of numbers can then be used as indices for strings or arrays to get their possible combinations
function generateCombs(N,n) {
    // check input
 if (isNaN(N)||(N <= 0)||isNaN(n)||(n <= 0)||(n > N)){
   alert( "Error in Combinations generator") 
	 return false
 }
 var i,j
 var cA = new Array(), C = new Array(), m=0;                          
 for (i = 0; i < n; i++) cA[i] = i + 1;  // initialize as (1,2,3,..,n)
 while (true)  {       // then next combinations in lexicographical order (starting from item)
   C[m]= cA.join("-")    //for (i = 0; i < n; i++) C[m]= cA[i]
   i = n - 1; 
   while (cA[i] == (N - n + i + 1)) --i;
   if (i < 0) break; 
   ++cA[i]; m++
   for (j = i + 1; j < n; j++) cA[j] = cA[i] + j - i;
 }
return C
}

//--------- Function to generate 3-digit combinations 
function generate3(X,n){
var i, j=0
var nr,or=0,tr,tot=0, x = new Array(), genCont="", generated=new Array(), indices=new Array(),temp=new Array(), returned=new Array()

if (!document.FOCO3.NR3.checked && !document.FOCO3.OR3.checked && !document.FOCO3.TR3.checked){
  alert("Please mark at least one of the NON-REPEAT, ONE-REPEAT, or TRIPLES options")
	return
 }
for(i=0;i<X.length;i++) x[i]=X.charAt(i)
if (x.length >= 3)   {
  temp = generateCombs(x.length,3)
  for(i=0;i<temp.length;i++) indices[i]=temp[i].split("-")
  for (i=0; i<indices.length;i++) {
    for(j=0;j<indices[i].length;j++) indices[i][j] = x[parseInt(indices[i][j])-1]
	  generated[i] = indices[i].join("")//; else generated[i] = xF + ',' + indices[i]
  }
}	
//alert (generated); return
nr = generated.length
k=nr
for (i=0; i<x.length-1;i++)
  for(j=i+1;j<x.length;j++) {
	  generated[k] = x[i].toString() +  x[i].toString() +  x[j].toString()
		k++
		generated[k] = x[i].toString() +  x[j].toString() +  x[j].toString()
		k++
	}
or = generated.length - nr
k=generated.length
for (i=0; i<x.length;i++) {
  generated[k] = x[i].toString() +  x[i].toString() +  x[i].toString()
		k++
	}
tr=x.length

if (document.FOCO3.NR3.checked) {
  returned = returned.concat(generated.slice(0,nr))
  tot += nr
}
if (document.FOCO3.OR3.checked) {
 returned = returned.concat(generated.slice(nr,nr+or))
 tot += or
}
if (document.FOCO3.TR3.checked) {
 returned = returned.concat(generated.slice(nr+or))
 tot += tr
}
var returnedSt
returnedSt = returned.join(", ")
document.getElementById('CoTot3').innerHTML = tot
//document.FOCO.t4.value=tot
return returnedSt

//t3.value=tot
//return returned
}
//--------- Function to generate 4-digit combinations
function generate4(X,n){
var i, j=0, k, m
var nr, or=0, tt=0, ot=0, qd, tot=0 
var x = new Array(), genCont="", generated=new Array(), indices=new Array(),temp=new Array(),returned=new Array()

if (!document.FOCO.NR4.checked && !document.FOCO.OR4.checked && !document.FOCO.TT4.checked && !document.FOCO.OT4.checked && !document.FOCO.QD4.checked){
  alert("Please mark at least one of the NON-REPEATING, ONE-REPEATING, DUAL-DOUBLES, ONE-TRIPLED, or QUADRUPLE options")
	return
 }

for(i=0;i<X.length;i++) x[i]=X.charAt(i)
if(x.length >=4) {
  temp = generateCombs(x.length,4)
  for(i=0;i<temp.length;i++) indices[i]=temp[i].split("-")
  for (i=0; i<indices.length;i++) {
    for(j=0;j<indices[i].length;j++) indices[i][j] = x[parseInt(indices[i][j])-1]
	  generated[i] = indices[i].join("")
  }
}	

nr = generated.length
k=nr
for (i=0; i<x.length-2;i++)
  for(j=i+1;j<x.length-1;j++) 
	  for(m=j+1;m<x.length;m++) 	{
  	  generated[k] = x[i].toString() +  x[i].toString() +  x[j].toString() +  x[m].toString()
	  	k++
		  generated[k] = x[i].toString() +  x[j].toString() +  x[j].toString() +  x[m].toString()
		  k++
	  	generated[k] = x[i].toString() +  x[j].toString() +  x[m].toString() +  x[m].toString()
		  k++
		}
or = generated.length - nr
k=generated.length
for (i=0; i<x.length-1;i++)
  for(j=i+1;j<x.length;j++) {
  	generated[k] = x[i].toString() +  x[i].toString() +  x[j].toString() +  x[j].toString()
	  k++
	}
tt = generated.length - nr - or
k=generated.length
for (i=0; i<x.length-1;i++)
  for(j=i+1;j<x.length;j++)  	{
  	  generated[k] = x[i].toString() +  x[i].toString() +  x[i].toString() +  x[j].toString()
	  	k++
		  generated[k] = x[i].toString() +  x[j].toString() +  x[j].toString() +  x[j].toString()
		  k++
		}
ot = generated.length - nr - or - tt
k=generated.length
for (i=0; i<x.length;i++) {
  generated[k] = x[i].toString() +  x[i].toString() +  x[i].toString() +  x[i].toString()
		k++
	}
qd=x.length
//alert (generated); return

if (document.FOCO.NR4.checked) {
  returned = returned.concat(generated.slice(0,nr))
  tot += nr
}
if (document.FOCO.OR4.checked) {
 returned = returned.concat(generated.slice(nr,nr+or))
 tot += or
}
if (document.FOCO.TT4.checked) {
 returned = returned.concat(generated.slice(nr+or,nr+or+tt))
 tot += tt
}
if (document.FOCO.OT4.checked) {
 returned = returned.concat(generated.slice(nr+or+tt,nr+or+tt+ot))
 tot += ot
}
if (document.FOCO.QD4.checked) {
 returned = returned.concat(generated.slice(nr+or+tt+ot))
 tot += qd
}
var returnedSt
returnedSt = returned.join(", ")
document.getElementById('CoTot').innerHTML = tot
return returnedSt

}
