// Sqcnt

// global move and piece arrays here**********
var pcs=new Array();
var mov;
var sve;
var temp;
var temPc=0;
var svePc=0;

// selection control *****
var timr;
var obj;
var saved='';
var blink=0;

// global flow and logic control***********
var cp=0;
var tmr;
var tme=0;
var chkflag=0;
var tryflag=0;
var eggflag=0;
var dotflag=0;
var ns = ( navigator.appName.indexOf ("Netscape")>-1); // sniff,sniff..



function update(){
for (k=1;k<65;k++){
	q=document.getElementById('i'+k);
	p=pcs[k];
	if (p==0) {q.src='e.gif';continue;}
	if (p==6) {q.src='wk.gif';}
	if (p==5) {q.src='wq.gif';}
	if (p==4) {q.src='wr.gif';}
	if (p==3) {q.src='wb.gif';}
	if (p==2) {q.src='wn.gif';}
	if (p==7) {q.src='gd.gif';}
	}// for
}

function clrbrd(){
for (k=1;k<65;k++){pcs[k]=0;}
update();
}

function qinibrd(){
for (k=1;k<9;k++){pcs[56+k]=5;}
for (k=1;k<57;k++){pcs[k]=0;}
update();
}

function minibrd(){
var ini=new Array(4,2,3,5,6,3,2,4);
for (k=1;k<9;k++){pcs[56+k]=ini[k-1];}
for (k=1;k<57;k++){pcs[k]=0;}
update();
}





//'''''''''''''''''''''''''''''''''''''''''''' Building Instructions'''''''''''''''''''''''''''''''''''''''
var elms=new Array();

function buildboard(p,s){
q=document.createElement("TABLE");
w=document.createElement("TBODY");
q.cellSpacing=0;
q.cellPadding=0;
q.border=1;
q.id="brd";
for (var i=0;i<8;i++){
	w1=document.createElement("TR");
	for (var j=1;j<9;j++){
		w2=document.createElement("TD");
		w2.bgColor=p;
		w2.align='center';
		if ((i+j)%2==0) {w2.bgColor=s;}
		w3=document.createElement("IMG");
		k=8*i+j;
		w3.id='i'+k;
		w3.src="e.gif";
		w2.appendChild(w3);
		w1.appendChild(w2);
		} //of j
	w.appendChild(w1);
	} // of i
q.appendChild(w);
return q;
}// of buildboard

function buildbrd(){return buildboard('lightyellow','burlywood')}


function buildBtns(BtnsId,len){
w1=document.createElement("TABLE");
w2=document.createElement("TBODY");
w1.border=0;
w1.id=BtnsId;
w1.cellPadding=0;
for(var i=1;i<len+1;i++){
	w3=document.createElement("TR");
	elms[i]=document.createElement("TD");
	elms[i].id=BtnsId+i;
	w3.appendChild(elms[i]);
	w2.appendChild(w3);
	}// of for
w1.appendChild(w2);
return w1;
}//of buildBtns

function setBtn(k,txt,BtId){
p=elms[k];
p.style.width=84;//90
p.style.height=32;//35
p.align='center';
p.style.backgroundColor='transparent';
q=document.createElement("FORM");
p.appendChild(q);
r=document.createElement("INPUT");
r.id=BtId+k;
r.type='button';
r.style.width=80;
r.style.height=30;
r.style.align='center';
r.style.verticalAlign='middle';
if (!ns){
	r.style.position='relative';
	r.style.top=3;
	}
r.style.color='brown';
r.style.backgroundColor='lightyellow';
r.style.borderWidth= 'thin';
r.style.borderColor= "burlywood";
r.style.borderStyle="double";
r.style.font='10pt arial bold';
r.value=txt;
q.appendChild(r);
}


function buildMbox(bid,w,h){
q=document.createElement("DIV");
q.id=bid;
q.style.color='brown';
q.style.font='10pt arial bold';
q.style.backgroundColor='lightyellow';
q.style.borderWidth= 'thin';
q.style.borderColor= "burlywood";
q.style.borderStyle="solid";
q.style.width=w;
q.style.height=h;
p=document.createTextNode(' ');
q.appendChild(p);
return q
}


function msg(s){
q=document.getElementById('mbox');
if (q!=null){
	q.align='center';
	q.firstChild.nodeValue=s;
	}
}


function setElm(x,q){
var v=document.getElementById(x);
if (v!=null){v.appendChild(q);}
}

function clrDiv(x){
var v=document.getElementById(x);var r;
if (v!=null){while ((r=v.firstChild)!=null){v.removeChild(r);}}
}

function clrElms(){
for (var i=2;i<5;i++){clrDiv('d'+i);}
}

function clrAlms(){
clrDiv('d1');clrElms();
}

function buildlayout(){
var q=document.createElement("DIV");
q.id='d0';
q.style.position='absolute';
q.style.left='0px';
q.style.top='0px';
//q.onkeyup=keycheck
q.onclick=mclick
q.onmousedown=mdwn
q.style.backgroundColor="transparent";
var p=document.createElement("DIV");
p.id='d1';
p.style.position='absolute';
p.style.left='10px';
p.style.top='10px';
q.appendChild(p);
p=document.createElement("DIV");
p.id='d2';
p.style.position='absolute';
p.style.left='320px';
p.style.top='10px';
q.appendChild(p);
p=document.createElement("DIV");
p.id='d3';
p.style.position='absolute';
p.style.left='10px';
p.style.top='320px';
q.appendChild(p);
p=document.createElement("DIV");
p.id='d4';
p.style.position='absolute';
p.style.left='270px';
p.style.top='320px';
q.appendChild(p);
document.body.style.backgroundColor="transparent";
document.body.appendChild(q);
}


/////////////////////-------- Building Layouts --------------///////////////////////////

function qinit(){buildlayout();rinit();return}

function rinit(){
if (type==1){mst='No queens on the same rank,file or diagonal?';}
if (type==2){mst='Minimum # of squares attacked?';}
if (type==3){mst='Maximum # of squares attacked?';}
if (type==4){mst='Maximum # of white moves?';}
buildPuzz();return
}


function buildPuzz(){
clrAlms(); 
var q= buildbrd(); setElm('d1',q);
q=buildBtns('rrr',3); setElm('d2',q);
setBtn(3,'GiveUp','r');
setBtn(2,'Reset','r');
setBtn(1,'ChkIt!','r');
q=buildMbox('mbox',300,40); setElm('d3',q);
//q=buildMbox('ubulb',40,20); setElm('d4',q);
startpuzz();
tme=0;tryflag=0;
tmr=setInterval('tick()',1000);
return
}

function startpuzz(){
reset();
chkflag=0;eggflag=0;
if(type==1){unblink();qinibrd();}
if(type>1){unselect();minibrd();}
//setbulb(1);
msg(mst);
}

function tick(){
tme++;
}


 
//'''''''''''''''''''''''''''''''''''''' Move Handling '''''''''''''''''''''''''''''

//** cp=0 ***

function pcselect(x,q){
if (blink){return};
blink=1;
obj=q;
saved=q.src;
timr=setInterval('swap()',250);
}

function swap(){
if (obj.src==saved){obj.src='e.gif';}
else {obj.src=saved;}
}

function blinkem(){
if (blink){return};
blink=1;
timr=setInterval('swapem()',250);
}

function swapem(){
if (pcs[temp]==0){pcs[temp]=5;pcs[sve]=5;update();return}
pcs[temp]=0;pcs[sve]=0;update();return
}

function unblink(){
if (blink==0){return}
blink=0;
clearInterval(timr);
pcs[temp]=5;pcs[sve]=5;
update();
}

function unselect(){
if (!blink){return}
blink=0;
clearInterval(timr);
if (obj!=null){obj.src=saved;}
}


//'''''''''''''''''''''''''''''''''''''' Event Handlers Be Here '''''''''''''''''''''''''''''''''''''


function mclick(e){
if (ns){z=e.target;} else {z=event.srcElement;}
p=z.id.charAt(0);
x=parseInt(z.id.substr(1));
solclick();
return false;
}

function solclick(){

 //** Puzzle phase - main clicks**
if (p=='r'){
	if (x==3){clrdots();chkflag=0;shwsol();return}
	if (x==2){clrdots();startpuzz();return}
	if (x==1){chkit();tryflag=1;return}
	}


//** (Clicking messagebox )**
if (p=='m'){ msg ('This fine program was created by mr.mip @ 2007');eggflag=1;return}

} // of solclick

function mdwn(e){
if (ns){qq=e.target;} else {qq=event.srcElement;}
p=qq.id.charAt(0); 
if (p=='i'.charAt(0)){
	x=parseInt(qq.id.substr(1));
	soldwn(x);
	}
return false;
}

function soldwn(x){
if(dotflag){clrdots();}
chkflag=0;
p=pcs[x];

//*** It is the first click of the new move ***

if (cp==0){ 
	if (p==0){msg('No piece selected!');return}
	msg(mst);
	temp=x;temPc=p;
	mov=x;pcselect(x,qq);cp=1;return
	}//cp0

 //*** Here's to second click ***

if (cp==1){
	sve=x;svePc=pcs[x];
	if (sve==temp){unselect();cp=0;msg ('Selection canceled');return}
	if (svePc>0){msg(' Cannot move to an occupied square!');return}
	msg(mst);
	makemove();
	cp=0; 
	return
	} // of cp=1

}//soldwn

function makemove(){unselect();pcs[temp]=0;pcs[sve]=temPc;update();}

function reset(){temp=0;sve=0;temPc=0;svePc=0;mov=0;cp=0;}

//=================== movegen code from here =====================

var wmvs=new Array();var jx=0;
var sqrs=new Array();var sx=0;
var mcnt=0;var mve=0;var failflag=0;

function getwmvs(){
zmvs=new Array();clrsqrs();failflag=0;jx=0;
var w=65; var x;
while(--w>0){
	if (pcs[w]<=0){continue;}
	temp=w; temPc=pcs[w];svePc=0;mve=10000*w;
	x=w%8; if (x==0){x=8;}
	if (temPc==6){addwkm(x);waddbcasmvs();continue}
	if (temPc==5){
		addrook(x);if(failflag){return};
		addbis(x);if(failflag){return};
		continue;
		}
	if (temPc==4){addrook(x);continue}
	if (temPc==3){addbis(x);continue}
	if (temPc==2){addkni(x);}	
	}
mcnt=jx;sx=cntsqrs();
return zmvs;
}

function cntsqrs(){
var rv=0;var j=65;
while (--j>0){if (sqrs[j]==1){rv++;}}
return rv;
}

function clrsqrs(){var j=65;while(--j>0){sqrs[j]=0;}return}

function addsq(sq){sqrs[sq]=1;return}


// **********Mgen: White King mvs *****************

function addwkm(h){
var x;var pc;var mv;
if (temp>8){
	x=temp-8;pc=pcs[x];
	if (pc==0){addsq(x);zmvs[jx++]=mve+100*x;}
	x=temp-7;pc=pcs[x];
	if ((h<8)&&(pc==0)){addsq(x);zmvs[jx++]=mve+100*x;}
	x=temp-9;pc=pcs[x];
	if ((h>1)&&(pc==0)){addsq(x);zmvs[jx++]=mve+100*x;}
	}
if (temp<57){
	x=temp+7;pc=pcs[x];
	if ((h>1)&&(pc==0)){addsq(x);zmvs[jx++]=mve+100*x;}
	x=temp+8;pc=pcs[x];
	if (pc==0){addsq(x);zmvs[jx++]=mve+100*x;}
	x=temp+9;pc=pcs[x];
	if ((h<8)&&(pc==0)){addsq(x);zmvs[jx++]=mve+100*x;}
	}
if (h>1){
	x=temp-1;pc=pcs[x];
	if (pc==0){addsq(x);zmvs[jx++]=mve+100*x;}
	}
if (h<8){
	x=temp+1;pc=pcs[x];
	if (pc==0){addsq(x);zmvs[jx++]=mve+100*x;}
	}

return 
}



function waddbcasmvs(){
if ((pcs[64]==4)&&(pcs[63]==0)&&(pcs[62]==0)&&(pcs[61]==6)){addsq(63);zmvs[jx++]=616340;}
if ((pcs[57]==4)&&(pcs[58]==0)&&(pcs[59]==0)&&(pcs[60]==0)&&(pcs[61]==6)){addsq(59);zmvs[jx++]=615950;}
}

//******** Mgen aux: White pcs *************
//******** Mgen aux:aux White not in check after test *************

function addrook(h){
var p;
sve=temp-8;
while ((sve>0)&&(pcs[sve]==0)){addsq(sve);zmvs[jx++]=mve+100*sve;sve-=8;}
if((type==1)&&(pcs[sve]==5)&&(sve>0)){failflag=1;return};
sve=temp+8;
while ((sve<65)&&(pcs[sve]==0)){addsq(sve);zmvs[jx++]=mve+100*sve;sve+=8;}
if((type==1)&&(pcs[sve]==5)&&(sve<65)){failflag=1;return};
sve=temp-1; p=h-1;
while ((p>0)&&(pcs[sve]==0)){addsq(sve);zmvs[jx++]=mve+100*sve;sve-=1;p--;}
if((type==1)&&(pcs[sve]==5)&&(p>0)){failflag=1;return};
sve=temp+1;p=h+1;
while ((p<9)&&(pcs[sve]==0)){addsq(sve);zmvs[jx++]=mve+100*sve;sve+=1;p++}
if((type==1)&&(pcs[sve]==5)&&(p<9)){failflag=1;return};
}

function addbis(h){
var p;
sve=temp-9;p=h-1;
while((sve>0)&&(p>0)){
	if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve;}
	if((type==1)&&(pcs[sve]==5)){failflag=1;return}
	if(pcs[sve]>0){break}
	sve-=9;p--;
	}
sve=temp-7;p=h+1;
while((sve>0)&&(p<9)){
	if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve;}
	if((type==1)&&(pcs[sve]==5)){failflag=1;return}
	if(pcs[sve]>0){break}
	sve-=7;p++;
	}
sve=temp+7;p=h-1;
while((sve<65)&&(p>0)){
	if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve;}
	if((type==1)&&(pcs[sve]==5)){failflag=1;return}
	if(pcs[sve]>0){break}
	sve+=7;p--;
	}
sve=temp+9;p=h+1;
while((sve<65)&&(p<9)){
	if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve;}
	if((type==1)&&(pcs[sve]==5)){failflag=1;return}
	if(pcs[sve]>0){break}
	sve+=9;p++;
	}
}

function addkni(h){
sve=temp-10; if ((sve>0)&&(h>2)){
if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve};}
sve=temp-17; if ((sve>0)&&(h>1)){
if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve};}
sve=temp-15; if ((sve>0)&&(h<8)){
if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve};}
sve=temp-6; if ((sve>0)&&(h<7)){
if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve};}
sve=temp+6; if ((sve<65)&&(h>2)){
if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve};}
sve=temp+15; if((sve<65)&&(h>1)){
if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve};}
sve=temp+17; if((sve<65)&&(h<8)){
if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve};}
sve=temp+10; if((sve<65)&&(h<7)){
if(pcs[sve]==0){addsq(sve);zmvs[jx++]=mve+100*sve};}
}

function setdots(){
var j=65;
while (--j>0){if(sqrs[j]==1){pcs[j]=7;}}
dotflag=1;
update();
}

function clrdots(){
var j=65;
while (--j>0){if(pcs[j]==7){pcs[j]=0;}}
dotflag=0;
if(type==1){unblink();}
update();
}

function chkit(){
if(chkflag){return}
chkflag=1;
wmvs=getwmvs();
if(type==1){
	if(failflag){blinkem();msg('Sorry there is an error!');dotflag=1;return}
	if(!failfag){msg('Bravo! Solved in '+tme+' seconds.');return}
	}
setdots();
if(type==2){
	if (sx>8){msg(sx+' squares controlled. This is not the minimum!');return}
	if(sx<=8){msg(sx+' squares.Bravo! Solved in '+tme+' seconds.');return}
	}
if(type==3){
	if (sx<55){msg(sx+' squares controlled. This is not the maximum');return}
	if (sx==55){msg(sx+' squares.Maximum with legal moves-but not absolute max!');return}
	if(sx>=56){msg(sx+' squares.Bravo! Solved in '+tme+' seconds.');return}
	}
if(type==4){
	if(jx<100){msg(jx+' moves found. This is not the maximum.');return}
	if(jx>=100){msg(jx+' moves.Bravo! Solved in '+tme+' seconds.');return}
	}
return
}

function shwsol(){
if((!eggflag)&&((tme<900)+(tryflag==0))){msg('Sorry, solution not available yet.');return}

if(type==1){
	clrbrd();
	pcs[4]=5;
	pcs[14]=5;
	pcs[24]=5;
	pcs[27]=5;
	pcs[33]=5;
	pcs[47]=5;
	pcs[53]=5;
	pcs[58]=5;
	update();
	msg('This is one of 92 solutions');
	return
	}
if(type==2){
	clrbrd();
	pcs[1]=3;
	pcs[2]=5;
	pcs[3]=4;
	pcs[4]=2;
	pcs[9]=3;
	pcs[10]=4;
	pcs[11]=6;
	pcs[18]=2;
	update();
	msg('8 squares controlled.One of 4 solutions');
	return
	}
if(type==3){
	clrbrd();
	pcs[22]=6;
	pcs[43]=5;
	pcs[1]=4;
	pcs[64]=4;
	pcs[19]=3;
	pcs[46]=3;
	pcs[37]=2;
	pcs[28]=2;
	update();
	msg('All empty 56 squares controlled');
	return
	}
if(type==4){
	clrbrd();
	pcs[52]=6;
	pcs[42]=5;
	pcs[31]=4;
	pcs[11]=4;
	pcs[37]=3;
	pcs[36]=3;
	pcs[38]=2;
	pcs[20]=2;
	update();
	msg('Maximum 100 moves possible. One of 2 positions');
	return
	}
return
}



