/* euclide.js
   Jeu des différences ou Euclide
   Différence game  (Euclid's game)

   copyright (C) 2002-2005 Jean-Paul Davalan <jpdvl@wanadoo.fr>
*/
var ncur, nmax, nparties=0, npartiesg=0,debut=1, germe;
var tab = new Array(), seq= new Array();
var Im=new Array();
var lg="fr";

function gcd(x, y) {
  var u =x, v=y, w;
  if(u==v) return u;
  if(u<v) {
    w=u;u=v;v=w;
  }
  while(v!=0) {
    w = u%v;
    u=v; v=w;
  }
  return u;
}


function initpartie() {
  var a, b, c, g;
  debut = 1;
  a = Math.floor(1+200*Math.random());
  do {
    do {
      b = Math.floor(1+200*Math.random());
    } while (b==a);
    if(a>b) {
      c=a;a=b;b=c;
    }
    germe = g = gcd(a,b);
    n = b/g;
    nmax=n;
  } while (n<3 || n >20);
  for(i=1;i<=b;i++) tab[i] = 0;
  tab[a] = 1;
  tab[b] = 1;
  seq[0] = a;
  seq[1] = b;
  tab[b-a] = 2;
  ncur = 2;
  sequence =a+" "+b;
  document.frm.diff.value="";
  document.frm.diff.focus();
  document.frm.s.value=sequence;
  document.frm.part.value=npartiesg+" / "+nparties;
}
function teste(x) {
  if(debut==2) {
    if(lg=="fr")alerte(1, "La partie est terminée.<br />Recommencez une nouvelle partie.");
    else if(lg=="en") alerte(1,"The game ended.<br />Start a new one.");
    return 0;
  }
  if(x<=0 || x!= Math.floor(x)) {
    if(lg=="fr")alerte(1,"Choisir un entier >= 1");
    else if(lg=="en") alerte(1,"Choose an integer >= 1");
    return 0;
  }
  if(x > seq[1]) {
    if(lg=="fr") alerte(1,"Choisir un entier <"+seq[1]);
    else if (lg=="en") alerte(1,"Choose an integer <"+seq[1]);
    return 0;
  }
  if(tab[x]==1) {
    if(lg=="fr") alerte(2,"Ce nombre est dans la liste.");
    else if (lg=="en") alerte(2,"This integer is already in the list.");
    return 0;
  }
  if(tab[x] != 2) {
    if(lg=="fr") alerte(2,"Ce nombre n'est pas une différence de deux des précédents.");
    else if (lg=="en") alerte(2,"This integer is not a difference of two of the precedents.");
    return 0;
  }
  return 1;
}
function differ(x) {
  tab[x] = 1;
  seq[ncur] = x;
  ncur++;
  if(ncur==nmax) return 2;
  for(i=0;i<ncur-1;i++) {
    c = seq[i] - x;
    if(c<0) c = -c;
    if(tab[c] != 1) 
      tab[c] = 2;
  }
  return 1;
}
function ordidebute() {
  var a=seq[0], b=seq[1], c;
  if(debut==2) {
    initpartie();
  }if(debut==1) {
    c = b-a;
    debut=0;
    u = differ(c);
    document.frm.s.value = document.frm.s.value+" " + c;
  } 
  alerte(1,"");
  alerte(2,"");
}
function ordijoue() {
  var i, c, test=1;
  for(i=0;test==1 && i < nmax; i++) {
    c = i*germe;
    if(tab[c]==2) {
      differ(c);
      document.frm.s.value = document.frm.s.value+" " + c;
      test=0;
    }
  }
  alerte(1,"");
  alerte(2,"");
}
function effectue() {
  var a;
  a = document.frm.diff.value;
  if(teste(a)==1) {
    differ(a);
    document.frm.s.value = document.frm.s.value+" "+a;
    document.frm.diff.value="";
    
    if(ncur==nmax) {
      nparties++;
      npartiesg++;
      document.frm.part.value = npartiesg+" / "+nparties;
      if(lg=="fr") alerte(2,"Vous avez gagné.");
      else if(lg=="en") alerte(2,"You wins.");
      debut=2;
    } else {
      ordijoue();
      if(ncur==nmax) {
        nparties++;
        document.frm.part.value = npartiesg + " / " + nparties;
        if(lg=="fr") alerte(2,"Vous avez perdu.");
	else if(lg=="en") alerte(2,"You lose.");
        debut=2;
      }
    }
  } else {
    document.frm.diff.value ="";
    document.frm.diff.focus();
  }
}

function alerte(n,s) {
  var msb1 = document.getElementById("MsgBox")
  var msb2 = document.getElementById("MsgBox2")
  if(msb1==null || msb2==null) alert(s);
  else {
    if(n==1)
    msb1.innerHTML=s;
    else {
      msb2.innerHTML=s;
      msb1.innerHTML="";
    }
  }
}

