/* sol2.js

   jeu du solitaire
   solitaire français
   ------------
   "Conway's soldiers"
   "solitaire army" (Berlekamp) 
   "checker-jumping problem" (Honsberger)
   voir Sloane  A014225 pour les références :
       http://www.research.att.com/projects/OEIS?Anum=A014225
   ------------
   Le Bizarre incident du chien pendant la nuit de Mark Haddon
   (traduit oar Odile Demange)
   
    Le personnage principal, Christopher 15 ans, enquête sur le meurtre 
    du chien de sa voisine. 
    Christopher est autiste, atteint du syndrome d'Asperger, est passionné 
    par les mathématiques et la physique.
    p. 197-200
    citation extraite du roman à la page 200 : 
    << ... mais c'est un bon problème de maths à faire dans sa tête quand 
    on ne veut pas penser à autre chose parce qu'on peut le rendre aussi
    compliqué qu'il le faut pour se remplir le cerveau et en dessinant 
    un échiquier aussi grand qu'on le veut et en imaginant des déplacements
    aussi compliqués qu'on le veut. >>

   syndrome d'Asperger
   -------------------
   Association
   Aide à l'Enfance Autiste 
   http://www.autisme.net/DepartAutismPg2.html
   
   Guide pour les enseignants
   Comprendre l'élève présentant le syndrome d'Asperger
   http://www.autisme.net/DepartAutismPg2.html
   citation :
   << ... Ces enfants sont généralement perçus comme excentriques et bizarres 
   par leurs compagnons de classe. Leurs difficultés sociales les amènent 
   souvent à être des boucs émissaires. Des intérêts obsessifs alimentent 
   leur présentation bizarre. Les enfants Asperger manquent de compréhension 
   concernant les relations humaines ainsi que les règles et conventions 
   sociales. Ils sont naïfs et manquent de sens commun. Leur rigidité et 
   leur difficulté à gérer le changement les rendent anxieux et vulnérables. 
   Par ailleurs, ces enfants (la majorité des garçons) démontrent une 
   intelligence égale ou supérieure à la moyenne et possèdent d'excellentes 
   capacités mnémoniques. >>
   
   ------------
   
   Jean-Paul Davalan © 2003-2004
   <jpdvl@wanadoo.fr>

   23 Juillet 2003
   22 juin 2004
   23 Octobre 2004
   
   -----------------------------------------------------
                               j=0  1  2  3  4  5  6  7  8
           1  2  3        i=0   00 01 02 03 04 05 06
	4  5  6  7  8       1   10 11 12 13 14 15 16
     9 10 11 12 13 14 15    2   20 21 22 23 24 25 26
    16 17 18 19 20 21 22    3   30 31 32 33 34 35 36
    23 24 25 26 27 28 29    4   40 41 42 43 44 45 46
       30 31 32 33 34       5   50 51 52 53 54 55 56 
          35 36 37          6   60 61 62 63 64 65 66
	  
                               0 <= x < nbcols
			       0 <= y <= nbcols
	                       2 <= x+y <= 10
			      -4 <= x-y <=  4

   -----------------------------------------------------
*/

var sel, xpos, ypos,total, nbcols=21, DIM=25;//DIM=31;
var lettre = new Array("x","y","z");//("a","b","c","d");
//var cols = new Array("#999999","#ffffff","#ffffff","#7799bb");
var cols = new Array("#d2dbf4","#e4d1ff","#008970");
var color=Math.floor(3*Math.random());
var pre = lettre[color];
var placement=false;
var totalsv;
var histab=new Array(), nhist=0, histmax=0;

var Im = new Array();
Im[0] = new Image(); Im[0].src=pre+"0.png";
Im[1] = new Image(); Im[1].src=pre+"1.png";
Im[2] = new Image(); Im[2].src=pre+"2.png";
//Im[3] = new Image(); Im[3].src=pre+"1b.png";

var tab = new Array();
var svtab = new Array();
for(var i=0;i<nbcols;i++){
  tab[i] = new Array();
  svtab[i] = new Array();
  for(var j=0;j<nbcols;j++) {
    svtab[i][j] = 0;
    tab[i][j] = 0;
  }
}

function sve() {
//  alert("sve");
  for(var i=0;i<nbcols;i++)
    for(var j=0;j<nbcols;j++)
       svtab[i][j] = tab[i][j];
  totalsv = total;
}

function retrv() {
//  alert("retrv");
  efface();
  for(var i=0;i<nbcols;i++)
    for(var j=0;j<nbcols;j++) {
       tab[i][j] = svtab[i][j];
       document.images["im"+i+"_"+j].src = Im[tab[i][j]].src;
    }
  total = totalsv;
  document.frm.comm.value="Partie en cours";
  placement=false;
  document.frm.pl.value="JEU / billes";
  nhist=0;
  histmax=0;
}

function dw(a) {
document.write(a);
}
//"hand,move,pointer,move"
function mksol() {
  dw('<a name="sol"></a><center><table border=0 cellspacing=0 cellpadding=0 bgcolor="'+cols[color]+'">');
  for(var i=0;i<nbcols;i++) {
    dw('<tr>\n');
    for(var j=0;j<nbcols;j++) {   //  "hand", "crosshair", "text", "wait", "move", "wait", and "resize" cursor
      dw('<td nowrap><span class="bille" onmouseover=\'if(possible('+i+','+j+')&&!placement)this.style.cursor="move"\' onmouseout=\'this.style.cursor="default"\' onmousedown="eff('+i+','+j+')"><img border=0 name="im'+i+'_'+j+'" width='+DIM+' height='+DIM+' alt=""></span></td>');
    }
    dw('</tr>\n');
  }
  dw('</table></center>\n');
  init();
}

function init0() {
  var i, j;
  var u= (nbcols-(nbcols%2))/2
  for(i=0;i<nbcols;i++)
    for(j=0;j<nbcols;j++)
      tab[i][j] = 1;
  for(i=0;i<nbcols;i++)
    for(j=0;j<nbcols;j++) 
      if(i+j<u-1 ||  i+j>2*nbcols-u-1 || nbcols-i+j<u || -i+j>nbcols-u )
        tab[i][j]=2;
  tab[u][u]=0;
  
  for(i=0;i<nbcols;i++)
    for(j=0;j<nbcols;j++) {
       document.images["im"+i+"_"+j].src = Im[tab[i][j]].src
    }
  sel = false;
  placement=false;
  total=nbcols*nbcols;
  nhist=0;
  histmax=0;
}

function init1(m) {
  var i, j;
  var k=parseInt(m), u=(nbcols -(nbcols%2))/2, r;
  if(k>nbcols) k=nbcols;
  else if (k<5) k=5;
  k=(k-k%2)/2;
  document.frm.t.value=2*k+1;
  r=u-k;
  for(i=0;i<nbcols;i++)
    for(j=0;j<nbcols;j++)
      tab[i][j] = 1;
  for(i=0;i<nbcols;i++)
    for(j=0;j<nbcols;j++)
      if(i-u>k || i-u<-k || j-u>k || j-u< -k || i+j<u-1+r ||  i+j>2*nbcols-u-1-r|| nbcols-i+j<u+r || -i+j>nbcols-u-r)
        tab[i][j]=2;
  tab[u][u]=0;

  for(i=0;i<nbcols;i++)
    for(j=0;j<nbcols;j++) {
       document.images["im"+i+"_"+j].src = Im[tab[i][j]].src
    }
  sel = false;
  placement=false;
  total=nbcols*nbcols;
  nhist=0;
  histmax=0;
  sve();
}

function plein() {
  var i, j;
  var u= (nbcols-(nbcols%2))/2
  for(i=0;i<nbcols;i++)
    for(j=0;j<nbcols;j++)
      tab[i][j] = 1;
  tab[u][u]=0;

  for(i=0;i<nbcols;i++)
    for(j=0;j<nbcols;j++) {
       document.images["im"+i+"_"+j].src = Im[tab[i][j]].src
    }
  sel = false;
  placement=false;
  total=nbcols*nbcols;
}

function init() {
  init0();
  /*
  var u=(u-u%2)/2;
  tab[u][u]=0;
  document.images["im"+u+"_"+u].src = Im[0].src;
  */
}

function init2() {
  init();
  sel = false;
  placement=false;
  document.frm.pl.value="JEU / billes";//"joue / PLACE";
  document.frm.comm.value="Partie en cours";
}

function corsaire() {
  init0();
  tab[0][2]=0;
  document.images["im0_2"].src = Im[0].src;
}

function efface() {
//  alert("efface");
  var i, j;
  for(i=0;i<nbcols;i++) {
    for(j=0;j<nbcols;j++) {
      tab[i][j] = 0;
    }
  }
  /*
  tab[0][0]=2;tab[0][1]=2;tab[0][5]=2;
  tab[0][6]=2;tab[1][0]=2;tab[1][6]=2;
  tab[5][0]=2;tab[5][6]=2;tab[6][0]=2;
  tab[6][1]=2;tab[6][5]=2;tab[6][6]=2;
  tab[3][3]=0;
  */
  for(i=0;i<nbcols;i++) {
    for(j=0;j<nbcols;j++) {
       document.images["im"+i+"_"+j].src = Im[tab[i][j]].src
     //document.Images["im"+i+"_"+j].src = "a"+tab[i][j]+".png";
    }
  }
  sel = false;
  placement=true;
  document.frm.comm.value="Placement des billes";
  document.frm.pl.value="jeu / BILLES";//"joue / PLACE";
  total=0;
}

function croix() {
  efface();
  for(var i=1;i<6;i++) {
    tab[i][3]=1; tab[3][i]=1;
    document.images["im"+i+"_3"].src = Im[1].src
    document.images["im3_"+i].src = Im[1].src
  }
  total=9;
}

function pipe() {
  efface();
  for(var i=2;i<5;i++) {
    tab[i][3]=1; tab[i][4]=1;
    document.images["im"+i+"_3"].src = Im[1].src;
    document.images["im"+i+"_4"].src = Im[1].src;
  }
  tab[4][2]=1;
  document.images["im4_2"].src = Im[1].src;
  total=7;
}

function U() {
  efface();
  for(var i=2;i<5;i++) {
    for(var j=2;j<5;j++) {
      tab[i][j]=1;
      document.images["im"+i+"_"+j].src = Im[1].src;
    }
  }
  tab[2][3]=0;
  document.images["im2_3"].src = Im[0].src;
  total=8;
}
function square() {
  efface();
  for(var i=2;i<5;i++) {
    for(var j=2;j<5;j++) {
      tab[i][j]=1;
      document.images["im"+i+"_"+j].src = Im[1].src;
    }
  }
  tab[4][2]=0;
  document.images["im4_2"].src = Im[0].src;
  total=8;
}
function pl(x,y, a) {
  tab[x][y]=a; document.images["im"+x+"_"+y].src = Im[a].src;
}
function plus_() {
  efface();
  pl(2,3,1);pl(3,2,1);pl(3,3,1);pl(3,4,1);pl(4,2,1);
  pl(4,3,1);pl(5,2,1);
  total=7;
}
function f5() {
  efface();
  pl(3,4,1);pl(4,4,1);pl(3,3,1);pl(5,3,1);pl(2,2,1);pl(3,2,1);
  total=6;
}
function niveaux(k) {
  efface();
  total=0;
  for(var i=k;i<nbcols;i++) {
    for(var j=0;j<nbcols;j++) {
      pl(i,j,1);
      total++;
    }
  }
  document.frm.comm.value="Partie en cours";
  document.frm.pl.value="JEU / billes";
   placement=false;
}
function soldiers(n) {
  var i;
  efface();
  switch(n) {
    case 0 :
          pl(5,9,1);total=1;
      break;
    case 2 :
         for(i=9;i<=11;i++) pl(5,i,1);
         pl(6,11,1);
         total=4;
      break;
    case 1 :
          pl(5,10,1);pl(6,10,1);total=2;
      break;
    case 3 :
         for(i=8;i<=12;i++) pl(5,i,1);
	 for(i=6;i<=8;i++) pl(i,10,1);total=8;
      break;
    case 4 :
         for(i=7;i<=13;i++) pl(5,i,1);
	 for(i=9;i<=13;i++) pl(6,i,1);
	 for(i=8;i<=13;i++) pl(7,i,1);
	  for(i=12;i<=13;i++) pl(8,i,1);
	 total=20;
      break;
    default :
      break;
  }
  document.frm.comm.value="Partie en cours";
  document.frm.pl.value="JEU / billes";
  placement=false;
}
function possible(x,y) {
 if(tab[x][y] != 1) return false;
 if(x>=2 && tab[x-1][y]==1&&tab[x-2][y]==0) return true;
 if(y>=2 && tab[x][y-1]==1&&tab[x][y-2]==0) return true;
 if(x<=nbcols-3 && tab[x+1][y]==1&&tab[x+2][y]==0) return true;
 if(y<=nbcols-3 && tab[x][y+1]==1&&tab[x][y+2]==0) return true;
 return false;
}

function jouable(x,y) {
  var u, v, s="";
  if(x<0 || x>nbcols-1 || y<0 || y>nbcols-1 || tab[x][y] !=0 ) return false
  
  if(x==xpos+2 && y==ypos) {
     u=xpos+1; v= y;
  } else if(x==xpos-2 && y==ypos) {
     u= xpos-1;v= y;
  } else if(x==xpos && y==ypos+2) {
    u= x; v = ypos+1;
  } else if(x==xpos && y==ypos-2) {
    u=x; v=ypos-1;
  } else {
    return false;
  }
  if(tab[u][v]!=1) return false;
  tab[xpos][ypos]=0; tab[u][v]=0;
  tab[x][y]=1;
  s =xpos+" "+ypos+" "+u+" "+v+" "+x+" "+y+" ";
  histab[nhist]=s;
  nhist++;
  if(nhist>histmax) histmax=nhist;
  document.images["im"+xpos+"_"+ypos].src = Im[0].src;
  document.images["im"+u+"_"+v].src = Im[0].src;
  document.images["im"+x+"_"+y].src = Im[1].src;
  total = total-1;
  document.frm.comm.value=total+" billes";
  sel=false;
  return true;
}

function precedent() {
  if(nhist>0) {
    var h=new Array(), s=histab[nhist-1];
    h=s.split(/\s/);
    for(i=0;i<6;i++)
     h[i]=parseInt(h[i]);
    document.images["im"+h[0]+"_"+h[1]].src = Im[1].src;tab[h[0]][h[1]]=1;
    document.images["im"+h[2]+"_"+h[3]].src = Im[1].src;tab[h[2]][h[3]]=1;
    document.images["im"+h[4]+"_"+h[5]].src = Im[0].src;tab[h[4]][h[5]]=0;
    nhist = nhist-1;
    total = total+1;
    document.frm.comm.value=total+" billes";
    sel=false;
  }
}
function suivant() {
  if(nhist<histmax) {
    var  h=new Array(), s=histab[nhist];
    h=s.split(/\s/);
    for(i=0;i<6;i++)
     h[i]=parseInt(h[i]);
    document.images["im"+h[0]+"_"+h[1]].src = Im[0].src;tab[h[0]][h[1]]=0;
    document.images["im"+h[2]+"_"+h[3]].src = Im[0].src;tab[h[2]][h[3]]=0;
    document.images["im"+h[4]+"_"+h[5]].src = Im[1].src;tab[h[4]][h[5]]=1;
    nhist = nhist+1;
    total = total-1;
    document.frm.comm.value=total+" billes";
    sel=false;
  }
}

function eff(x, y) {
//  alert("eff"+x+"_"+y+" placement "+placement);
  if(placement==false) {
  var a = possible(x,y);
//  alert("eff"+x+"_"+y+" possible "+a+" sel "+sel);
  if(sel==false) {
    if(a==true) {
      xpos = x; ypos=y;
      sel = true;
    } else {
      sel = false;
    }

  } else {
    var b=jouable(x,y);
    sel = false;
    a = possible(x,y);
//    alert("eff"+x+"_"+y+" possible "+a+" jouable "+b);
    if(a==true) {
      sel = true;
      xpos=x; ypos=y;
    }
  }
  } else {
    if(tab[x][y]==1) {
      tab[x][y]=0;
      document.images["im"+x+"_"+y].src = Im[0].src;
      total=total-1;
    } else if(tab[x][y]==0) {
      tab[x][y]=1;
      total=total+1;
      document.images["im"+x+"_"+y].src = Im[1].src;
    }
  }
}

function place() {
  if(placement==true) {
    placement=false;
    document.frm.pl.value="JEU / billes";//"joue / PLACE";
    document.frm.comm.value="Partie en cours";
  } else if(placement==false) {
    //clear();
    total=0;
    placement=true;
    document.frm.pl.value="jeu / BILLES";//"JOUE / place";
    document.frm.comm.value="Placement des billes";
  }
}

