SET_DHTML(CURSOR_MOVE, RESIZABLE 
	,"x11"+VERTICAL+HORIZONTAL 
	,"x21"+VERTICAL+HORIZONTAL 
	,"x31"+VERTICAL+HORIZONTAL 
	,"x41"+VERTICAL+HORIZONTAL 
	,"x51"+VERTICAL+HORIZONTAL 
	,"x61"+VERTICAL+HORIZONTAL 
	,"x71"+VERTICAL+HORIZONTAL 
	,"x81"+VERTICAL+HORIZONTAL 
	,"x91"+VERTICAL+HORIZONTAL 
	,"k1"+VERTICAL+HORIZONTAL 
	,"k2"+VERTICAL+HORIZONTAL 
	,"k3"+VERTICAL+HORIZONTAL 
	,"k4"+VERTICAL+HORIZONTAL 
	,"k5"+VERTICAL+HORIZONTAL 
	,"k6"+VERTICAL+HORIZONTAL 
	,"k7"+VERTICAL+HORIZONTAL 
	,"k8"+VERTICAL+HORIZONTAL 
	,"k9"+VERTICAL+HORIZONTAL 
	,"green"   
	,"pink"   
	,"trsp"   
	,"rbox"   
	,"cyan"   
	,"nono"   
	,"box"   
	,"lyel"   
	,"tree"   
	,"house"   
		,"sboard", "comment"+NO_DRAG);
var MZ =(navigator.appName.indexOf("Netscape") != -1);
var IE = document.all?true:false; SSP=' , '; var NOTE="Note :";
  var sijk,si,sj,sk,mi,mj,mk ,xi,xj,xk; xput="X_Put:";  inited=0; 	var DDTG='000000';

  setCell( DDtg, "     Grid info here !!"  );

  var nxx0=''; var dx=34; var dy=34; var zchk=''; var msy=0; var XD=6;
  var msx=0; var ddx,www,wwx,wmm ,xobj,pobj,xx,yy; var si,sj,sk,ccc;
  var nxx=':'; var mmm='0123456789';  var hint1=-1; var KKEY='X???:3:80';
  var yss=dd.elements['sboard'].y ; var y0=yss+dx/2;
  var xss=dd.elements['sboard'].x ; var x0=xss+dy/2;
  var ysp= yss + dd.elements['sboard'].defh +5; 
  var xsp= xss + dd.elements['sboard'].defw +5;  
  var tt="k1:k2:k3:k4:k5:k6:k7:k8:k9:green:pink:trsp:rbox:cyan:nono:box:lyel:tree:house"; var KIDS=0;
  var xsz=dd.elements['x11'].w; var ysz=dd.elements['x11'].h;
  var xsf= (dx-xsz)/3-3; var ysf=(dx-ysz)/2; var xpz=dx-2; var ypz=dy-2;
  var imgss=[]; var chkss=1; var copied=0;  imgss=tt.split(":");
  pp_imgs();  					// position all images
  var PZ,SS,WPZ2,WPZ,PZ1,PZ2,PZX; var SSs=[]; var PPZs=[];
  var kkey,ikey,jkey,kobj,ckey,keyimg;  var clue='green';
  getPZ0(); getPZ(1); WPZ=PZ;PZX=PZ;  if(0) alert(WPZ);		// get Current puzzle
  if(1) pLoadPZ(WPZ);   var PUTs=[]; PUTs[0]=''; var WPZs=[]; WPZs[0]=WPZ; WPZi=0;
  var nss=SSs.length -1;
  sCell('axx',nss+" solutions / Date: "+DDTG ); 
  setCell( DDtg, "  (" +DDTG+")"  );
  setCell( nsoul,nss  ); if(0) loadPZ();
  if(0) kids('2468'); //wobj=dd.elements.x1;
//======================================================================
function test(){ alert(WPZ+"\n"+xput);}
function krand(){  //generate length-n number   
   var xnn=getCell('NNum');
   if(xnn<=0 || xnn>8 ) xnn=4; nn=9-xnn;
   var cc=':'; var ntry=0; var nx=cc.length; var tx=0;
   while( nx<=nn ){ ntry++; tx+=ntry;
      var tt=Math.floor( Math.random()*9 +0.9999);
      if (cc.indexOf(tt)<0){nx++; cc+=tt;} if(ntry>200) nx=nn+1; }
   cc=cc.substr(1);
   if(0) alert( cc+SSP+ntry+SSP +tx );    
   return cc; }
function kid2(nn){  // make kid-version
    if(nn<=0) nn=4; if(KIDS>0){ clean('tree'); clean('house'); loadPZ(); }
    var cc= krand(nn); kids(cc); }
function kids(aa){  // make kid-version
   var nn=aa.length; if(nn<=0){ aa='2468'; nn=4; }   if(0)alert( WPZ);
   var bbs=[]; var bbb='BBB'; KIDS++;   
   var cc=SSs[1].substr(kkey,1); WPZ=sstr(WPZ,cc,kkey,1);
   for( var k=0; k<nn; k++){ cc=aa.substr(k,1);
      for(var x=1; x<=9; x++ ){ var nm='x'+cc+1+x; 
          dd.elements[nm].hide(); clean(nm); } 
      for( var w=0; w<81; w++ ){
        if(SSs[1].substr(w,1)==cc){ WPZ=sstr(WPZ,cc,w,1); bbb=bbb+":"+w;}
	 }} bbs=bbb.split(":"); 
   copied=0; pp_imgs(); var tt='TT'; if(1) pLoadPZ(WPZ); var trhs='tree';
   for( var k=1; k<=bbs.length ;k++){ var cc=parseInt(bbs[k]);
      if(cc>=0){  var j=Math.floor(cc/9); var i= cc-j*9; 
        var rr=Math.random(); trhs='tree'; //if(rr>0.8) trhs='house'; 
	var xp=x0+dx*i; var yp=y0+dy*j; tt=tt +" :" +cc ;	 
	dd.elements[trhs].copy(); 
	var zz=dd.elements[trhs].copies.length-1; if(0)alert(tt);
	var zimg=dd.elements[trhs].copies[zz]; zimg.moveTo(xp+2,yp+2);
	
	zimg.resizeTo(zimg.defw ,zimg.defh); if(0) zimg.resizeTo(dx-4,dy-4);
	zimg.setZ(60); zimg.show(); if(0) zimg.setDraggable(false);
       }}  if(1) setCell( nsoul,1  ); if(0)alert(tt); }
function getPZ(ii){  if(ii>PPZs.length) ii=1; var ppz= PPZs[ii];
	SSs= ppz.split(";"); PZ=SSs[0];  return PZ; }
function upknum(uu){ var tt=parseInt(getCell(knum)) +uu;
   if( tt<0 ) tt=PPZs.length-2; if( tt>=PPZs.length-1) tt=0; 
   if(0) alert( PPZs.length );  setCell(knum,tt); return 1; }
function upto(bb,aa,cc){ var tt=parseInt(getCell(bb));  var t2=tt; 
    if(! cc) cc=tt+1; tt+=aa; if(tt>cc) tt=0; 
    if(tt<0) tt=cc; setCell(bb,tt); return 1; }
function hintss(){ chk_SS( WPZ,0 );  if( zchk ) return; 
   if( chkss ){ var tt= hint_sn(WPZ); if(tt) return 1;
   		    tt= hint_sc(WPZ); if(tt) return 1;
 		chk_SS( WPZ,1 ); return; }
  	else{ alert("check answer only for original puzzle"); return; }}
function hint_sc(wpz){ //var tt=nums(WPZ,'rc',2,2); alert(tt); return; 
    var i,j,k,sp,cc,xx;   var npp='0:1:2:9:10:11:18:19:20'.split(":");
    var nbb='0:3:6:27:30:33:54:57:60'.split(":"); 

    for(j=0; j<9; j++ ){ sp=''; xx= nums(wpz,'r',0,j); var himg='rbox';
        for(i=0; i<9; i++ ){ k=j*9+i; cc=wpz.substr(k,1);
   		if( mmm.indexOf(cc)<0 ) sp+=k+":" ;} 
        	var tt=chk_sp(xx,sp,i,j,himg); if(tt) return 1 ; 
	sp=''; xx= nums(wpz,'c',j,0);  
        for(i=0; i<9; i++ ){ k=i*9+j; cc=wpz.substr(k,1);
   		if( mmm.indexOf(cc)<0 ) sp+=k+":" ;} 
        	tt=chk_sp(xx,sp,i,j,himg); if(tt) return 1 ;  
		
	var kx=parseInt(nbb[j]); var jx=Math.floor(kx/9); var ix=kx-jx*9;	
        sp=''; xx= nums(wpz,'b',ix,jx); if(0) alert( kx +","+xx);
	for(i=0; i<9; i++ ){ k=kx+parseInt(npp[i]); 
	cc=wpz.substr(k,1);
   		if( mmm.indexOf(cc)<0 ) sp+=k+":" ;} //sp.replace(":",'');
		sCell('bxx',xx+"/"+sp+","+ix+jx); himg='pink';
        	tt=chk_sp(xx,sp,i,j,himg);if(tt) return 1 ; 
	}}
function xminus(xx){ var yy=':';
  for(var i=1; i<=9; i++){if(xx.indexOf(i)<0) yy+=i;}
  yy=yy.substr(1);return yy;}
  
function chk_sp(cc,spp,ii,jj,crr){  // check if single-spot   
   var wpz=WPZ; var sps=spp.split(/:/); sps.pop(); 
   var i,j,k,xx,jx,ik,kx,zz; var spz; var sp1=[];
   var kks='0123456789'.split(""); if(0) alert( kks); 
   var cx=xminus(cc); var pps=[];  ;
   for( i=0; i<sps.length; i++){ kx=sps[i]; 
	  jx=Math.floor(kx/9); ix=kx-jx*9;
	  xx=nums(wpz,'rcb',ix,jx); var tt=xminus(xx);zz+=":"+tt; 
	  pps[pps.length]=tt;
	   }
   var nn=':';
   for( i=1; i<=9; i++){ var tt=knt(i,zz); nn+=tt; }
   if(nn.indexOf('1')>=0){ //if(crr=='pink') alert( spp+ "  " + nn );
      var xn=nn.indexOf('1'); var tt=zz; var xk=-1; var pos;
	for(j=0; j<pps.length; j++){ if( pps[j].indexOf(xn)>-1) pos=j;}
	kx=sps[pos]; jx=Math.floor(kx/9); ix=kx-jx*9;
      var nxt= do_mark2( xn,ix,jx,kx,crr); 
	if(0) alert(xn +" = "+ix+","+jx); return 1;
      }  return 0;
   } 
function do_mark2( xx,si,sj,sk,cxx){ // mark box
    sk= sj*9 +si; var xp= x0+si*dx; var yp=y0+2+sj*dy;
    if(hint1< 0){ hint1=sk; dd.elements[cxx].copy(); 
      var nn=dd.elements[cxx].copies.length -1;
      var tt=dd.elements[cxx].copies[nn]; tt.setZ(0);
	  tt.moveTo(xp,yp-1); if(1) return 1; }
    hint1=-1; var nxa='x'+xx+'1';   
	var c2=10; var find=0; var nmm;
	while( (! find ) && c2>=0 ){ 
	      c2--; var nxt=nxa+c2; if(0) sCell('axx',nxt+cxx); 
	      nmm=dd.elements[nxt];
	      if( nmm.x<(xsp+dx*5) && nmm.x>=(xsp-dx) ) find=1; }
	  nmm.moveTo (xp,yp+1);
        xput+= sk+","+nxt+":"; WPZ=sstr(WPZ,xx,sk,1);}
function sstr( str,str2,kk,nn){  // replace substr(str,kk,nn) with str2
    var xx= str.substr(0,kk)+str2+ str.substr(kk+nn); return xx; }  
function xskip(){   
   for(j=0; j< cx.length; j++ ){ k=cx.substr(j,1);
        var nn=sps.length; 
	  if( cc.indexOf(k)<0 ){ if(0) alert( cc +"=="+k + '=' +spp );
	      spz=spp; sp1=spp.split(/:/); sp1.pop();
            for( i=0; i< sps.length; i++){  kx=sps[i]; 
		   jx=Math.floor(kx/9); ix=kx-jx*9;
			xx=nums(wpz,'rcb',ix,jx); var zz=xminus(xx);
		   if( xx.indexOf(k)>0 ){ nn--; sp1[i]='' ;}
		     else{ if(1) alert( kx +" --" + xx );}
		    }
		sp2=sp1.join(""); 
		if(nn<=1){ if(1) alert( 'ssp '+k +' '+ sp2 +"=="+spz +" kx=" ,kx);
		   jx=Math.floor(sp2/9); ix=sp2-jx*9;
		   alert( 'CCC '+ix +' '+ jx );
		   do_mark( cc,ix,jx,kx,'pink'); } 
   	}}}
function hint_sn(wpz){ //var tt=nums(WPZ,'rc',2,2); alert(tt); return; 
    for(var j=0; j<9; j++ ){
    for(var i=0; i<9; i++ ){ var k=j*9+i;
        var xx= nums(wpz,'rcb',i,j); var cc=wpz.substr(k,1);
	  if( mmm.indexOf(cc)<0 && xx.length==8 ){ var tt=xminus(xx);
              var nxt= do_mark2( tt,i,j,k,'rbox'); 
	      if(1) return 1; }}}
    return 0; }
function nums( wpz,rcb,ii,jj ){  // get all idx in box
   var ccc='';
   if( rcb.indexOf('b')>-1){
   	var ks=Math.floor(jj/3)*27 +Math.floor(ii/3)*3;
   	 var kps=""; var npp='0:1:2:9:10:11:18:19:20'.split(":");
   	for( var x=0; x<9; x++ ){  var tt=npp[x]; var kp=ks + parseInt(npp[x]);  
        kps+= ":"+kp; var cc= wpz.substr(kp,1);
	  if( mmm.indexOf(cc)>-1) ccc+=cc; }}
   if( rcb.indexOf('r')>-1 ){ //row string
       for(var i=0; i<9; i++){ var cc= wpz.substr(jj*9+i,1);
	  if( mmm.indexOf(cc)>-1 && ccc.indexOf(cc)<0 ) ccc+=cc; }}
   if( rcb.indexOf('c')>-1 ){ //column string
       for(var i=0; i<9; i++){ var cc= wpz.substr(i*9+ii,1);
	  if( mmm.indexOf(cc)>-1 && ccc.indexOf(cc)<0 ) ccc+=cc; }}
   return ccc; }
   
function do_mark( xx,i,j,k,cxx){ // mark box
   var xp= x0+i*dx; var yp=y0+j*dy;
   dd.elements[cxx].copy(); var nn=dd.elements[cxx].copies.length -1;
   dd.elements[cxx].copies[nn].moveTo(xp,yp);
   return;}


   
function setPT(aa){ var ptx=parseInt(getCell(aa)); ptx++; setCell(aa,ptx);
	WPZs[ptx]=WPZ; PUTs[ptx]=xput;
	if(0) alert("Setting BreakPoint"+ptx+"\n"+WPZ ); }
function draw(){ pp_imgs(); 
	 pLoadPZ(PZX); if(1) pLoadDD(WPZ,PZX); } 
function getPT(aa){ PZX=WPZs[0]; var tt=getCell(bkpt); 
	 WPZ=WPZs[tt]; xput=PUTs[tt]; if(0) alert(tt+"=="+WPZ); 
  	 if(0) alert( tt+"==\n"+WPZ+"==\n"+PZX );
	 pp_imgs(); pLoadPZ(PZX); if(1) pLoadDD(WPZ,PZX); } 
function clrPT(aa,n){  // clear all break point
  	//PUTs=[]; PUTs[0]=''; WPZs=[]; WPZs[0]=PZX; if(0) alert( WPZs.length );
	var tt=WPZs.length; if(n>tt) n=tt; if(n<1) n=tt-1;
	if(tt>1){ for(var i=0; i< n; i++){ PUTs.pop(); WPZs.pop(); tt--;} }
	var tx=WPZs.length -1;
  	 setCell( aa,tx ); }
function cleanUp(){ clean('nono'); if(0) alert('CleanUP ' + zchk);
	if( ! zchk ) return 1; var npz=rm_bad(WPZ,xput,zchk); 
	if(kkey){ dd.elements[kobj].setDraggable(true);
		dd.elements[kobj].moveTo(xsp,ysp); clean('cyan'); kkey='';}
	if(0) alert(npz); xput="X_Put:"; zchk=''; WPZ=npz; pp_imgs(); 
	pLoadPZ(PZX); pLoadDD(WPZ,PZX); return 1; }
function rm_bad( wpz,xput,bad ){ clean('pink'); // remove bad numbers
    var bbs=bad.split(":"); if(0){ alert( bad+"/"+bbs.length +" \n" +xput);}
    for( var i=1; i< bbs.length; i++ ){
       var tt=":"+bbs[i]+","; var ix=xput.indexOf(tt); var nk=tt.length;
       var ximg=xput.substr(ix+nk+1,4); var xn=parseInt(ximg.substr(1,1));
       var xp=parseInt(xput.substr(ix+1,nk-2)); 
       xput=xput.substr(0,ix) +xput.substr(ix+nk+5); if(0) alert(xput);
	 if( ! xput ) ii=bbs.length;
       if(xp>=0) wpz= wpz.substr(0,xp)+"." +wpz.substr(xp+1); 
	 if(0) alert( xp +"="+wpz +"\n"+bad+"="+xput );
       }  if(0) alert("="+wpz); if(0){ alert( bad+"/"+bbs.length +" \n" +xput);}
    return wpz; }	   
function upto2(bb,aa,cc){ var tt=parseInt(getCell(bb));  var t2=tt; 
    var max=cc.length; tt+=aa; if(tt>=max) tt=0; 
    if(tt<0) tt=max-1; setCell(bb,tt); return 1; }
function loadPZ(){ var pn=parseInt(getCell('knum')) +1; 
	if(1) clean('tree'); if(1) clean('house');
	if(0) clrPT(bkpt,0); getPZ(pn); WPZ=PZ;PZX=PZ;  
    bad=''; xput=''; chkss=1; pp_imgs(); var img=dd.elements['cyan']; ccimg(img);  
    if(kkey){ dd.elements[kobj].setDraggable(true);
		dd.elements[kobj].moveTo(xsp,yss); if(0) clean('cyan'); }
    if(1) pLoadPZ(PZX); }
function reDraw(){ pp_imgs(); pLoadPZ(WPZs[0]); pLoadDD(WPZ,WPZs[0]); }
function innPZ(){ var mmm=' 123456789'; // user input puzzle
    var tx =window.prompt(" Input a puzzle string 123456789 and others",WPZ );
    var tt= tx+".............................................";
    for (var i=0; i< tt.length; i++){ var c=tt.substr(i,1); 
	  if( c==' ' ){ tt=tt.substr(0,i)+tt.substr(i+1); i--; }
 	  if( mmm.indexOf(c)<0 ){ tt=tt.substr(0,i)+'.'+tt.substr(i+1); }}
    WPZ=tt.substr(0,81); pp_imgs(); 
    pLoadPZ(WPZ); chkss=0; //if(1) alert(WPZ);
    return 1;
    }
function img_mv(aa){  // move image to hidden spot and hide
	dd.elements[aa].moveTo (xss,yss); dd.elements[aa].hide(); }
function pp_imgs(){ var xp,yp; xput=''; bad=''; nxx=':'; // position all images
  dd.elements['sboard'].setDraggable(false); 
  for( var ii=0; ii< imgss.length; ii++){ img_mv( imgss[ii] ); }
   for (var i=1; i<=9; i++){ 
       xp= xsp+dx; var nn= 'x'+i+'1'; yp= y0+i*dy-dy*0.6;
	 if(! copied){ if(0) alert( "Do copies" );
	    //dd.elements[nn].resizeTo(17,17); 
	    dd.elements[nn].copy(9); 
          dd.elements[nn].moveTo (xp,ysp);  
          dd.elements[nn].hide(); } 
	 for (var j=0; j<9; j++){ nxx= nxx+ ":" +i+j;
	     if(0) dd.elements[nn].copies[j].resizeTo(xpz,ypz);
           dd.elements[nn].copies[j].moveTo (xp+7-j,yp-12+j);
	   dd.elements[nn].copies[j].show();
	   }
	 dd.elements[nn].copies[8].moveTo (xsp,yp+5 ); } 
	 if( copied ){ nxx=nxx0; }
	   else{ nxx0=nxx; if(0) alert( "Do copies"+nxx ); copied=1; }
	clean('rbox'); clean('nono'); clean('box'); 
	clean('green'); clean('pink'); } 
//----------------------------------------
function pLoadDD(pz,px){ if(0) alert(pz);
  for(var j=0; j<9; j++){ if(0) alert( idx,i,j,k );
  for(var i=0; i<9; i++){ var k= j*9+i;      
    	var c= pz.substr(k,1);  var x=px.substr(k,1);
	var idz= mmm.indexOf(x); var idx= mmm.indexOf(c);
	if( idx>=0 && idz<0 ) pSetClue(c,i,j,k,'pink',0); 
	}}}


function pLoadPZ(pz){ if(0) alert(pz);
  if(pz.length <81) return;
  var knn,keyk,knum; var kshow= KKEY.indexOf('KX');
  for(var j=0; j<9; j++){ if(0) alert( idx,i,j,k );
   for(var i=0; i<9; i++){ var k= j*9+i;      
    	var c= pz.substr(k,1); var sbd='##ZYXWVU';
	var idx= sbd.indexOf(c); 
	if(idx>=0){ keyk=k; knn=idx; if(kshow<0) pSetKey( idx,i,j,k ); }
	 else{ idx= mmm.indexOf(c); if(idx>=0) pSetClue( c,i,j,k,clue,1);} 
	}} 
  if( kshow>=0){  // do naked-key
     	knum=KKEY.substr(kshow+2,knn );
	if(0) alert( 'Key-show KKEY  = '+KKEY );
	 pSetKey2( knn,keyk ,knum );
	}}
function pSetKey2( n,k,keys ){   // setup key-spot
    var j= parseInt(k/9); var i=k-j*9;
	kkey=k; jkey=j; ikey=i; var knx=keys.length;
    var xp= x0+ i*dx +2 ; var yp= y0+j*dy+2;
	var iimg=dd.elements['cyan']; iimg.show(); 
	iimg.resizeTo(dx-3,dy-4); 
	iimg.moveTo (xp,yp); iimg.setDraggable(false);
	var mx='k'+n; kobj=mx; var xpps; var ypp=7;
	var xa=10; var ya=14; if(knx<=3) yp+=ya/2; 
	if( knx<=3){ xpps='0:1:2'.split(":"); }
	if( knx==4){ xpps='0:1:0:1'.split(":"); ypp=2; }
	if( knx==5){ xpps='0:1:2:0.5:1.5'.split(":"); ypp=3;}
     for( var ix=0; ix<keys.length; ix++){
		var mx='k'+keys.substr(ix,1); kobj=mx; 
	var yb=0; if(ix>=ypp) yb=ya; 
	iimg=dd.elements[mx]; iimg.show(); iimg.resizeTo(xa,ya);  
	iimg.moveTo(xp+xpps[ix]*xa, yp+ yb );  
	}	return 1;	 
        }
function pSetClue(c,i,j,k ,mrk,ndg){  // set clue
  var p=0; var vv=nxx.indexOf( ':'+c+p ); 
  while( vv<0 && p<10 ){ p++; vv=nxx.indexOf( ':'+c+p );} 
  if( p>10 ){ alert( "problem "+p +"/c="+vv +"\n"+nxx ); return ; }
  nxx= nxx.substr(0,vv+1) +nxx.substr(vv+4); 
  var img='x'+c+p; var tt='x'+c+1; 
  var xp= x0+ i*dx +xsf ; var yp= y0+j*dy+ysf ;
  dd.elements[mrk].copy(); 
  var cc=dd.elements[mrk].copies.length;
  var bgx=dd.elements[mrk].copies[cc-1]; 
    var iimg= dd.elements[tt].copies[p];  var mzz=14;
 bgx.moveTo(xp+iimg.w-18,yp+iimg.h-18); bgx.resizeTo(14,14)
  //bgx.moveBy(bgx.w-10,bgx.h-10);
  dd.elements[mrk].copies[cc-1].setDraggable(false);
  dd.elements[mrk].copies[cc-1].setZ(0);

  iimg.setZ(19); iimg.moveTo(xp,yp); 
  if(ndg){ iimg.setDraggable(false); } // not draggable 
     else{ xput=xput+ ":"+k+","+iimg.name; }
  }	
function pSetKey( n,i,j,k){   // setup key-spot
	kkey=k; jkey=j; ikey=i; 
  //var xp= x0+ i*dx +xsf+2 ; var yp= y0+j*dy+ysf ;
  var xp= x0+ i*dx +2 ; var yp= y0+j*dy+2;
	var iimg=dd.elements['cyan']; iimg.show(); 
	iimg.resizeTo(dx-2,dy-4);
	iimg.moveTo (xp,yp); iimg.setDraggable(false);
	var mx='k'+n; kobj=mx; if(0)alert( mx+'SK'+i+','+j+' X'+n );
	iimg=dd.elements[mx]; iimg.show(); iimg.resizeTo(12,16);  
	iimg.moveTo(xp+dx-13,yp+dx-17); //iimg.moveTo(xp-xsf,yp-ysf); 
	if(0) iimg.setDraggable(false);
	return 1; }
function clean(iii){   if(0) alert( 'clean called'); // clean-up bad-cells
     var cc=dd.elements[iii].copies.length; 
     for( var i=0; i< cc; i++ ){ var img=dd.elements[iii].copies[i];
       	ccimg(img); }}
function ccimg(img){ img.setDraggable(true); img.moveTo(xsp,yss); img.hide();}
function chk_SS(pzz,ssn) {  // check how many solutions still available
    if(0) alert(pzz); var zn=pzz.length;  
    if( zn<81){ alert(" Bad woking puzzle"+zn ); return 1; }
    var ns=SSs.length; if(0) alert( "Orig NSS= "+ ns); 
    var ok=0; var chk=''; var xchk=''; var xm=99; var kss=-1;
    if(kkey>-1){  // with a key
       for( var i=1; i< ns; i++){ var ss=SSs[i]; 
          if(ss.substr(kkey,1)==pzz.substr(kkey,1)) kss=i;}}
    var i1=1; var i2=ns; 
    if(kss>0) { i1=kss; i2=kss+1; }
    for( var i=i1; i< i2; i++){ 
       var ss=SSs[i]; xchk=cmp(pzz,ss); 
	 if( xchk ){ var xerr=xchk.split(":"); var nerr=xerr.length;
	     if( nerr<=xm ){ xm=nerr; zchk=xchk; }
	     if(0) alert(xchk +"  No Good"); if(0) mark(xchk); }
	   else{ ok++; }
	 }  	 
    if(1) setCell(nsoul,ok); //  sCell('axx',ok +" solutions");
    if( ok>0 ){ zchk=''; if(ssn) alert ( "Number of solutions = "+ok) ;}
    if( ok<=0 ){ mark(zchk); if(0) alert( zchk ); }
    } 
function cmp( pzz,ss){  // if pzz all in ss ??
    var chk=''; if(0) alert( "Orig NSS= "+ ss); 
    for( j=0; j<81; j++){ var cc=pzz.substr(j,1);   // each character
	 if( mmm.indexOf(cc)>0 ){ if(0) alert( "checking   "+cc ); 
	 if( ss.substr(j,1).indexOf(cc)<0 ){  chk= chk +":" +j; }}}
    return chk;
    }
//========================================================
function xxijk(){  // get ijk info
	var xx= dd.obj.x+17  -x0 ; mi= Math.floor(xx/dx) ;  
	var yy= dd.obj.y+17  -y0 ; mj= Math.floor(yy/dy) ;  
	mk= mj*9 +mi ; sCell( 'bxx',mk); 
	if( mi<0 || mj<0 || mi>8 || mj>8 ) mk=-1; 
  return mk; }
function my_PickFunc(){ 
  var msk=xxijk(); var tt=":"+msk+","; 
  //if(1) alert( "Number picked "+msk );
  sCell('bxx',tt+mi+mj );  
  if( msk>=0 && msk<81 && xput.indexOf(tt)>=0 ){ if(0) alert( xput+" == "+msk);
  	WPZ=WPZ.substr(0,msk) +'.'+WPZ.substr(msk+1);
	var t2=xput.indexOf(tt); var nk= tt.length;
	xput=xput.substr(0,t2)+':'+xput.substr(t2+nk+6);
 		if(0) alert( xput+" == "+nk);
  	if(0) sCell('axx',xput );  sCell('bxx',WPZ.substr(msk-3,9) ); 
		if(0) alert( "Number picked "+msk ); }
   }
function reset1(){  nxx=nxx0;
   for (var i=1; i<=9; i++){ 
       xp=x0+380; var nn= 'x'+i+'1'; yp=y0+i*34-40;
       dd.elements[nn].moveTo (xp,ysp);  
       dd.elements[nn].hide();  
       dd.elements[nn].copies[8].moveTo (x0+340,yp );  
	 for (var j=0; j<8; j++){  
           dd.elements[nn].copies[j].moveTo (xp-j,yp+j );  
   	 }}  
	clean('nono'); clean('box');  
  }
		
function testbad( aa,bb ){  badPZ(); pLoadPZ(PZ); WPZ=PZ;  }
function chk_row( nn,ix,jj ){  // check if conflict in row
   ccc='  = ';  var ii= jj*9;
   for( var x=0; x<9; x++ ){ ccc= ccc + WPZ.substr(x+ii,1); }
   return knt(nn,ccc); }
function chk_col( nn,ii,jx ){  // check if conflict in row
   ccc='  = ';  
   for( var x=0; x<9; x++ ){ ccc= ccc + WPZ.substr(x*9+ii,1); }
   var nc= knt(nn,ccc); if(0) alert( ccc +"==have "+nc  +" "+nn ); 	  
   return nc; }
function chk_box( nn,ii,jj ){  // check if conflict in box
   ccc='  = '; var ks=Math.floor(jj/3)*27 +Math.floor(ii/3)*3;
   var npp='0:1:2:9:10:11:18:19:20'.split(":");
   for( var x=0; x<9; x++ ){  var tt=npp[x]; var kp=ks + parseInt(npp[x]) ;
        ccc= ccc + WPZ.substr(kp,1); 
	  if(0) alert( ccc+ "-" + kp +" = " +WPZ.substr(kp) +"\n" +WPZ);}
   var nc= knt(nn,ccc); if(0) alert( ks + " ==" +ccc+" have "+nc  +" "+nn ); 	  
   return nc; }
   
   
   
function chkPZ(){  // move number into initial puzzle position
    var ppp= PZ; var nnn='q123456789';
    var pzx=ppp.split(""); var inv='';
    for(var j=0; j<9; j++){ 
        for(var i=0; i<9; i++){ var k= j*9+i; 	     
    		var c= PZ.substr(k,1); var idx= nnn.indexOf(c);
		if(idx>=0){ 	 
		   var nx=chk_row(c,i,j); var jp=j+1; 
		       var tt="\n\t Row#"+jp+" have \t"+ccc;
		       if( nx>1 && inv.indexOf(tt)<0 ){ inv=inv+tt;}
		    nx=chk_col(c,i,j); var ip=i+1;tt="\n\t Col#"+ip+" have \t"+ccc;
		       if( nx>1 && inv.indexOf(tt)<0 ){ inv=inv+tt;}
		    nx=chk_box(c,i,j); var bp=Math.floor(i/3)+Math.floor(j/3)*3+1;
		       tt="\n\t Box#"+bp+" have \t"+ccc;
		       if(nx>1 && inv.indexOf(tt)<0){ inv=inv+tt; }
		   }}}
	if( inv.indexOf('#') >= 0 ) { alert("Invalid puzzle\n" +inv); exit; }
	   else{ alert("No internal conflict in puzzle" ); exit; }	   		   	
     return 1;  
    }
function chkCell(c,i,j,run ){  // check if number if cell OK
   var inv='';
		   var nx=chk_row(c,i,j); var jp=j+1; if(run) alert( ccc ); 
		       var tt="\n\t Row#"+jp+" have \t"+ccc;
		       if( nx>1 && inv.indexOf(tt)<0 ){ inv=inv+tt;}
		    nx=chk_col(c,i,j); var ip=i+1;tt="\n\t Col#"+ip+" have \t"+ccc;
		       if( nx>1 && inv.indexOf(tt)<0 ){ inv=inv+tt;}
		    nx=chk_box(c,i,j); var bp=Math.floor(i/3)+Math.floor(j/3)*3+1;
		       tt="\n\t Box#"+bp+" have \t"+ccc;
		       if(nx>1 && inv.indexOf(tt)<0){ inv=inv+tt; }
	if(run){ alert( 'Dbug '+c +' '+i +',' +j ); }		 
   return inv; }
function test2( aa,bb  ){ setCell( num, pp ); }
function my_DropFunc(){  
   var x00=dd.obj.x ; var y00=dd.obj.y ; var cc=0;
      var mmx=":x1:x2:x3:x4:x5:x6:x7:x8:x9:";
	var xx= dd.obj.x+17 -x0 ; 
	var yy= dd.obj.y+17 -y0; 
		si= Math.floor(xx/dx) ; var xi= si * dx + x0 +xsf;
		sj= Math.floor(yy/dy) ; var yj= sj * dy + y0 +ysf;  clean('nono'); 
	sk= sj*9 +si ;  if(sk>=0 && sk<81) dd.obj.moveTo (xi,yj);
	if( si<0 || si>8 || sj<0 || sj>8 ) return;
	if( hint1==sk ) hint1=0;
	var aa=dd.obj.name; var cc=aa.substr(1,1); var cn=parseInt(cc);
	//var c2= parseInt(aa.substr(3,1)); 
	var nxa=aa.substr(0,3); var nmm=dd.elements[nxa];
	var c2=10; var find=0; 
	while( (! find ) && c2>=0 ){ 
	      c2--; var nxt=nxa+c2; var nmm=dd.elements[nxt];
	      if( nmm.x<(xsp+dx*4) && nmm.x>=(xsp-dx) ) find=1; }
	var yj0= nmm.y;  yj= sj * dy + y0 -20; yj0= y0+ (cn-0.6)*dy ;
	if( kkey == sk ){ if(0) alert( "use "+ cc +" as KEY ");
	      ckey=cn;	if(0) alert( ckey + " == key ");    
	   	dd.elements[kobj].hide(); }
	var n1=chk_row(cc,si,sj); var vv=''; 
	if( mmm.indexOf( WPZ.substr(sk,1))>-1 ) vv="NotEMPTY";	
	if( n1>0 ){ vv=vv+"ROW: Invalid move "+ccc ; } 
	    else{ n1=chk_col(cc,si,sj); 
	      if (n1>0){ vv=vv+"COL: Invalid move "+ccc; }
	 	  else{ n1=chk_box(cc,si,sj);
	          if (n1>0){ vv=vv+"BOX: Invalid move "+ccc; }}} 
	if( vv!='' ){ if(0) alert(vv); dd.obj.moveTo( xsp,yj0+5 ); }
	  else{ if( find ){ nmm.moveTo( xsp,yj0+5) ;  hint1=-1; } 
	        ssijk( sk,cc,aa ); if(0) sCell( 'axx',xput ); }
    	if(0) chk_SS(WPZ); }
function ssijk(sk,cc,aa){ 
      WPZ=WPZ.substr(0,sk)+cc+WPZ.substr(sk+1); 
	xput=":"+sk+","+cc+aa ;
	if(0) sCell( 'axx',xput );	 } // DISabled
function gCell(aa){  // get mouse
    var xx=document.FORM2[aa].value; 
    return xx;}
function sCell(aa,bb){  // get mouse
    document.FORM2[aa].value=bb; 
    return 1;} 
function setCell (cell, value) { //set cell value
   //if (document.all)
   if(IE) cell.innerText = value;
      else if (document.getElementById)
   cell.replaceChild(document.createTextNode(value), cell.firstChild);
   }
function getCell (cellOrId) {
  var cell = typeof cellOrId == 'string' ? 
    //( document.all ? document.all[cellOrId] 
      ( IE ? document.all[cellOrId] 
		: document.getElementById(cellOrId) ) : cellOrId;
    //if (document.all)  return cell.innerText;
  if (IE)  return cell.innerText;
    else { //document.getElementById(cellOrId); return;
    	cell.normalize();
    	if (cell.firstChild.nodeType == 3)
		return cell.firstChild.nodeValue;
    	  else return '';
  	}}
function xgetCell (cellOrId) {
  var cell = typeof cellOrId == 'string' ? 
    //( document.all ? document.all[cellOrId] 
      ( IE ? document.all[cellOrId] 
		: document.getElementById(cellOrId) ) : cellOrId;
    //if (document.all)  return cell.innerText;
  if (IE)  return cell.innerText;
    else {
    	cell.normalize();
    	if (cell.firstChild.nodeType == 3)
		return cell.firstChild.nodeValue;
    	  else return '';
  	}}
function getMousePosition(e) {
  var _x; var _y;
  if (!IE) { _x = e.pageX; _y = e.pageY; }
  if (IE){ _x = event.clientX + document.body.scrollLeft;
           _y = event.clientY + document.body.scrollTop;  }
    if( _x.xsp || _y> ysp || _y< yss ) return;
   return true; }
function knt(c,ccx){  // count number of c in ccc
   var ccc='==='+ccx;
   var ix=ccc.indexOf(c); var nc=0;
   while(ix>-1){ ccc=ccc.substr(0,ix)+ccc.substr(ix+1);
   	nc++; ix=ccc.indexOf(c);} return nc;
   if(0) alert( ccx +"==" +ccc+" have "+nc  +" "+c ); 	  
    }  	  
function mark(chk){  // marking BAD cells
   var bbs= chk.split(":")
   for (var i=1; i< bbs.length; i++){
       var xk=parseInt(bbs[i]); if(0) alert( 'bad '+xk); 
	 var xp= (xk - Math.floor(xk/9)*9+ 0.5 )*dx + xss;
	 var yp=  yss+ ( Math.floor(xk/9)+ 0.5 )*dy ;
	 if(0) alert( xp +'  bad '+xk +" yy= " +ysp);
	   var tt='nono';  
	   //dd.elements['nono'].moveTo (xp,yp);
	   dd.elements[tt].copy(); var cc=dd.elements[tt].copies.length;
	   dd.elements[tt].copies[cc-1].moveTo (xp,yp); 
	 if(0) alert( yp+" Copy nono == " +cc );  
	   }
    }
