var    num = 0,                /* # sequences */
       C = new Array(),                      /* De Bruijn sequence */
       N,                      /* word length */
       P,                      /* alphabet length */
       M, NS,MAXNS=10000,     /* # words NS = P^N, M = P^(N-1) */
       W = new Array(),        /* words, vertices (ham.) edges (Euler) */
       A,        /* alphabet */
       str,			/* */
       unique = false,
       app = 0,
       nresults=0;
       
function div(a, b) {
  return (a-a%b)/b;
}
function    nextelt(n, i)
{                               /* next word */
  var    j, k, r, s;
  
  r = div(n, P);
  C[i] = div(n, M); 
  W[n] = 0;
  if (i < NS - 1) {
    for (k = 0; k < P; k++) {
      s = r + k * M;
      if (W[s] != 0) {
        app++;
        if(! nextelt(s, i + 1)) return false;
      }
    }
  } else {
    num++;
    for (j = 0; j < NS; j++)
      str += A.substring(C[j],C[j]+1);
    str +="\n                                -oOo-\n";
    nresults++;
    document.frm.txt.value = str;
    if(unique || nresults >= 10) return false;
  }
  W[n] = 1;
  return true;
}
function cherche()
{
  var i;
  str="";
  document.frm.txt.value="";
  N = document.frm.len.value;
  A = document.frm.alpha.value;
  P = A.length;
  NS = 1;
  for (i = 0; i < N && NS <= MAXNS; i++) NS *= P;
  if (i < N-1 || NS > MAXNS) {
    document.frm.txt.value = "Réduisez l'alphabet ou la longueur des mots, svp.\n";
    return;
  }
  M = div(NS, P);
  for(i=0;i<NS;i++) W[i] = 1;
  nextelt(0, 0);
}
function efface() {
  document.frm.len.value="";
  document.frm.alpha.value="";
  document.frm.txt.value="";
}

