
(function(){
var SETS={
 "Animals":["cat","dog","fox","owl","bee","frog","lion","bear","wolf","goat","duck","hen"],
 "Food":["rice","cake","milk","egg","soup","bread","apple","honey","lemon","pear","fish","jam"],
 "Home":["door","roof","lamp","sofa","bed","chair","table","clock","shelf","rug","key","cup"],
 "Nature":["tree","leaf","rain","star","hill","river","cloud","stone","grass","moon","sun","sea"]
};
var N=11,DIRS=[[0,1],[1,0],[1,1],[1,-1]];
var cat="Animals",grid,words,found,start;
function $(s){return document.querySelector(s);}
function rnd(n){return Math.floor(Math.random()*n);}
function build(){
 var pool=SETS[cat].slice().sort(function(){return Math.random()-0.5;}).slice(0,8).map(function(w){return w.toUpperCase();});
 grid=[];for(var r=0;r<N;r++){grid.push([]);for(var c=0;c<N;c++)grid[r].push("");}
 words=[];
 pool.forEach(function(w){
  var t=0,ok=false;
  while(!ok&&t<300){t++;
   var d=DIRS[rnd(DIRS.length)],r=rnd(N),c=rnd(N),i,fit=true,rr,cc;
   for(i=0;i<w.length;i++){rr=r+d[0]*i;cc=c+d[1]*i;
    if(rr<0||cc<0||rr>=N||cc>=N){fit=false;break;}
    if(grid[rr][cc]!==""&&grid[rr][cc]!==w.charAt(i)){fit=false;break;}}
   if(fit){for(i=0;i<w.length;i++){grid[r+d[0]*i][c+d[1]*i]=w.charAt(i);}words.push(w);ok=true;}
  }
 });
 var AZ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 for(var r=0;r<N;r++)for(var c=0;c<N;c++)if(grid[r][c]==="")grid[r][c]=AZ.charAt(rnd(26));
 found=[];start=null;render();
}
function lineCells(r,c,r2,c2){
 var dr=r2-r,dc=c2-c;
 if(!(dr===0||dc===0||Math.abs(dr)===Math.abs(dc)))return null;
 var len=Math.max(Math.abs(dr),Math.abs(dc));if(len===0)return null;
 var sr=dr===0?0:(dr>0?1:-1),sc=dc===0?0:(dc>0?1:-1),out=[];
 for(var i=0;i<=len;i++)out.push([r+sr*i,c+sc*i]);return out;
}
function key(r,c){return r+","+c;}
var foundCells={};
function render(){
 var g=$("#wsGrid");g.innerHTML="";g.style.gridTemplateColumns="repeat("+N+",1fr)";
 for(var r=0;r<N;r++)for(var c=0;c<N;c++){
  var b=document.createElement("button");b.textContent=grid[r][c];
  b.className=foundCells[key(r,c)]?"fnd":"";
  if(start&&start[0]===r&&start[1]===c)b.className+=" sel";
  (function(r,c){b.onclick=function(){pick(r,c);};})(r,c);
  g.appendChild(b);
 }
 $("#wsWords").innerHTML=words.map(function(w){return "<li"+(found.indexOf(w)>=0?" class='done'":"")+">"+w+"</li>";}).join("");
 var m=$("#wsMsg");
 if(found.length===words.length&&words.length>0){m.textContent="\uD83C\uDF89 You found them all!";m.className="gm-msg win";}
 else{m.textContent=found.length+" / "+words.length+" words found";m.className="gm-msg";}
}
function pick(r,c){
 if(!start){start=[r,c];render();return;}
 var path=lineCells(start[0],start[1],r,c);start=null;
 if(!path){render();return;}
 var str=path.map(function(p){return grid[p[0]][p[1]];}).join("");
 var rev=str.split("").reverse().join("");
 var hit=null;
 words.forEach(function(w){if(found.indexOf(w)<0&&(w===str||w===rev))hit=w;});
 if(hit){found.push(hit);path.forEach(function(p){foundCells[key(p[0],p[1])]=1;});}
 render();
}
document.addEventListener("DOMContentLoaded",function(){
 var cw=$("#wsCats");Object.keys(SETS).forEach(function(c){
  var b=document.createElement("button");b.textContent=c;if(c===cat)b.className="on";
  b.onclick=function(){cat=c;[].forEach.call(cw.children,function(x){x.className="";});b.className="on";foundCells={};build();};
  cw.appendChild(b);});
 $("#wsNew").onclick=function(){foundCells={};build();};
 build();
});
})();
