//CALULATED GLOBALS/////////////////////////////////////////////////////////////////
abs_bdtop=-1;
abs_bdlft=-1;
sq_side=0; //calc in doJS(a,b,c);
sq_size=0;  //passed from doJS(a,b,c);
bd_top_margin=0;  //passed from doJS(a,b,c);
bd_left_margin=0;  //passed from doJS(a,b,c);
bd_horiz_offset=0;
bd_vert_offset=0;
min_form_width=0;
max_form_width=0;
line_break=79;
col_name_ar=new Array('a','b','c','d','e','f','g','h');
std_tags=new Array('Event ','Site ','Round ','White ','Black ','Result ','Date ');//must also be updated in php
eco_ar=Array();
eco_ar["rnbqkbnr_pppppppp_8_8_8_8_PPPPPPPP_RNBQKBNR"]="[ECO \"?\"]\n[Opening \"?\"]";
img_a1 = new Image();
img_a1.src = "cset/a1f2_chess_board.gif";
img_h8 = new Image();
img_h8.src = "cset/h8f2_chess_board.gif";
img_bd = new Image();
img_bd.src = "cset/chess_board.gif";
rotate=0;
///// BOARD OBJECT/////////////////////////////////////////////////////////////
function Board()  {
   var temp_sq_name;
   this.wsrc_ar=new Array(5);
   this.bsrc_ar=new Array(5);
   this.square=new Array(64);
   this.scoresheet=new Array();
   this.comments=new Array();
   this.move=boardMove;
   this.geolegal=geoLegal;
   this.execmovever2=execMoveVer2;
   this.checkmate=checkMate;
   this.to_pgn=toPGN;
   this.lastecotagused="[ECO \"?\"]\n[Opening \"?\"]";
   this.flipboard=flipBoard;
   this.setcomment=setComment;
   this.underpromote=underPromote;
   this.locateking=locateKing;
   this.takeback=takeBackVer2;
   this.movepiece=movePiece;
   this.writepgn=writePGN;
   this.iterateboard=iterateBoard;
   for(var i=0;i<8;i++) {
      for(var j=0;j<8;j++) {
         temp_sq_name=col_name_ar[i]+(j+1);
         eval("this.square."+temp_sq_name+"= new Square(\""+temp_sq_name+"\");");
      }
	}

	this.wsrc_ar.Q=document.getElementById('d1').src;
	this.wsrc_ar.R=document.getElementById('a1').src;
	this.wsrc_ar.B=document.getElementById('c1').src;
	this.wsrc_ar.N=document.getElementById('b1').src;
	this.wsrc_ar.P=document.getElementById('a2').src;

	this.bsrc_ar.Q=document.getElementById('d8').src;
	this.bsrc_ar.R=document.getElementById('a8').src;
	this.bsrc_ar.B=document.getElementById('c8').src;
	this.bsrc_ar.N=document.getElementById('b8').src;
	this.bsrc_ar.P=document.getElementById('a7').src;
}
///// BOARD OBJECT METHODS/////////////////////////////////////////////////////
function flipBoard(){
   if(rotate==0){
      rotate=1;
      document.images[0].src = img_h8.src;
   }else{
      rotate=0;
      document.images[0].src = img_a1.src;
   }
   for(var ky in this.square){                                                                                            
      if(this.square[ky].piece==null){continue;}                                                                          
      document.getElementById(this.square[ky].piece.start_sq).style.display='block';                                   
      document.getElementById(this.square[ky].piece.start_sq).style.left=this.square[ky].locat_lt_ar[rotate][0] + 'px';
      document.getElementById(this.square[ky].piece.start_sq).style.top=this.square[ky].locat_lt_ar[rotate][1] + 'px'; 
   }
}

function setComment(){
   document.formcom.comment.value=document.formcom.comment.value.replace(/[}{]/g,'');
   if(document.formcom.comment.value!=''){
      this.scoresheet[this.scoresheet.length-1].comment='{'+document.formcom.comment.value+'}';
      document.formcom.comment.value='';
   }

   document.getElementById('comment_id').style.visibility='hidden';
   document.getElementById('notcomm_id').style.visibility='visible';
   this.writepgn();
}
 
function iterateBoard() {
   var str='',epsq='-',hmclock,temp_sq,found_id;
   var castle=Array('K','Q','k','q');
   for(rnk=8;rnk>0;rnk--){
      empty=1; 
      for(col=97;col <= 104;col++){
         temp_sq=eval("this.square."+String.fromCharCode(col)+rnk);
         if(temp_sq.piece!=null){
            empty=1;
            if(temp_sq.piece.color=='W'){
               if(temp_sq.piece.start_sq=='a1' && temp_sq.piece.moved){castle[1]='';}
               if(temp_sq.piece.start_sq=='h1' && temp_sq.piece.moved){castle[0]='';}
               if(temp_sq.piece.start_sq=='e1' && temp_sq.piece.moved){castle[0]='';castle[1]='';}
               if(temp_sq.piece.name=='P'){
                  if(this.scoresheet[this.scoresheet.length-1].to_sq_id==temp_sq.piece.curr_sq && temp_sq.piece.curr_sq.charAt(1)=='4' && this.scoresheet[this.scoresheet.length-1].fr_sq_id.charAt(1)=='2'){
                     epsq=temp_sq.piece.curr_sq.charAt(0)+'3';
                  }
               }
               str += temp_sq.piece.name.toUpperCase();   
            }else{
               if(temp_sq.piece.start_sq=='a8' && temp_sq.piece.moved){castle[3]='';}
               if(temp_sq.piece.start_sq=='h8' && temp_sq.piece.moved){castle[2]='';}
               if(temp_sq.piece.start_sq=='e8' && temp_sq.piece.moved){castle[2]='';castle[3]='';}
               if(temp_sq.piece.name=='P'){
                  if(this.scoresheet[this.scoresheet.length-1].to_sq_id==temp_sq.piece.curr_sq && temp_sq.piece.curr_sq.charAt(1)=='5' && this.scoresheet[this.scoresheet.length-1].fr_sq_id.charAt(1)=='7'){
                     epsq=temp_sq.piece.curr_sq.charAt(0)+'6';
                  }
               }
               str += temp_sq.piece.name.toLowerCase();   
            }
         }else{
            if(empty==1){
               str += '1';
               empty++;
            }else{
               str = str.substring(0,(str.length-1))+empty;
               empty++;
            }
         }
      }
      str += '_';  
   }
   str = str.substring(0,(str.length-1)); 

   if(this.scoresheet.length%2==0){
      str_full = str + ' w';
   } else {
      str_full = str + ' b';
   }   
   for(i=this.scoresheet.length-1;i>=0;i--){
      if(this.scoresheet[i].clock==1){hmclock=this.scoresheet.length-i-1;break;}
   }
   tmp=castle.join('');
   (tmp=='')?tmp=' -':tmp = ' '+tmp;
   str_full += tmp+' '+epsq+' '+hmclock+' '+Math.ceil(this.scoresheet.length/2);  
   return str_full;
}

function boardMove(fl,ft,tl,tt) {
   var special_flag;
   var retvalue=false;
   var fr_sq_id=translateNameFromCoords(fl,ft);
   var to_sq_id=translateNameFromCoords(tl,tt);
   var fr_idx_ar=translateIndicesFromCoords(fl,ft);
   var to_idx_ar=translateIndicesFromCoords(tl,tt);
   if((special_flag=this.geolegal(fr_idx_ar,to_idx_ar,fr_sq_id,to_sq_id))!='') {
      retvalue=this.execmovever2(fr_sq_id,to_sq_id,special_flag);
   }
   return retvalue;
}

function geoLegal(fr_idx_ar,to_idx_ar,fr_sq_id,to_sq_id) {
   var target_sq=eval("this.square."+to_sq_id);
   var from_sq=eval("this.square."+fr_sq_id);
   var special_flag='';
   var ep_flag=null;
   var temp_sq,temp_ar;
   var retstring='';
   if((this.scoresheet.length%2==0 && from_sq.piece.color=='B') || (this.scoresheet.length%2==1 && from_sq.piece.color=='W')) {
      return retstring;
   }
   if(from_sq.piece.name=='N') {
      var x=Math.abs(fr_idx_ar[0] - to_idx_ar[0]);
      var y=Math.abs(fr_idx_ar[1] - to_idx_ar[1]);
      if(x+y == 3 && (x==2 || y==2) && (target_sq.piece==null || target_sq.piece.color != from_sq.piece.color)) {
         retstring='ok';
      }
   }
   if (from_sq.piece.name=='B' || from_sq.piece.name=='Q') {
      if(fr_idx_ar[0]!=to_idx_ar[0] && fr_idx_ar[1]!=to_idx_ar[1]){
         var i=fr_idx_ar[0];
         var j=fr_idx_ar[1];
         while(i!=to_idx_ar[0] && j!=to_idx_ar[1] && i>=0 && i<8 && j>=0 && j<8) {
            to_idx_ar[0]>fr_idx_ar[0]?i++:i--;
            to_idx_ar[1]>fr_idx_ar[1]?j++:j--;
            temp_sq=eval("this.square."+translateNameFromIndices(i,j));
            if(temp_sq.piece!=null) {
               if(i==to_idx_ar[0] &&  j==to_idx_ar[1] && temp_sq.piece.color != from_sq.piece.color) {
                  retstring='ok';
               }
               break;
            } else if (i==to_idx_ar[0] &&  j==to_idx_ar[1]) {
               retstring='ok';
               break;
            }
         }
      }
   }
   if (from_sq.piece.name=='R' || (retstring=='' && from_sq.piece.name=='Q')) {
      if((fr_idx_ar[0]==to_idx_ar[0] && fr_idx_ar[1]!=to_idx_ar[1]) || (fr_idx_ar[0]!=to_idx_ar[0] && fr_idx_ar[1]==to_idx_ar[1])){
         var i=fr_idx_ar[0];var j=fr_idx_ar[1];
         while((i!=to_idx_ar[0] || j!=to_idx_ar[1]) && i>=0 && i<8 && j>=0 && j<8) {
            if(to_idx_ar[0]!=fr_idx_ar[0]){
               to_idx_ar[0]>fr_idx_ar[0]?i++:i--;
            } else if (to_idx_ar[1]!=fr_idx_ar[1]) {
               to_idx_ar[1]>fr_idx_ar[1]?j++:j--;
            }
            temp_sq=eval("this.square."+translateNameFromIndices(i,j));
            if(temp_sq.piece!=null) {
               if(i==to_idx_ar[0] &&  j==to_idx_ar[1] && temp_sq.piece.color != from_sq.piece.color) {
                  retstring='ok';
               }
               break;
            } else if (i==to_idx_ar[0] &&  j==to_idx_ar[1]) {
               retstring='ok';
               break;
            }
         }
      }
   }
   if (from_sq.piece.name=='P') {
      var offset,temp_id;
      from_sq.piece.color=='B'?offset=1:offset=-1;
      temp_id=translateNameFromIndices(fr_idx_ar[0],fr_idx_ar[1]+offset);
      if(fr_idx_ar[0]==to_idx_ar[0] && target_sq.piece==null) {
         if(to_idx_ar[1]-fr_idx_ar[1]==offset) {
            retstring='ok';
         } else if ((to_idx_ar[1]-fr_idx_ar[1])/2==offset && from_sq.piece.moved==false) {
            temp_id=translateNameFromIndices(fr_idx_ar[0],fr_idx_ar[1]+offset);
            temp_sq=eval("this.square."+temp_id);
            if(temp_sq.piece==null) {
               ep_flag=temp_id;
               retstring='ok';
            }
         }
      } else if (Math.abs(fr_idx_ar[0]-to_idx_ar[0])==1 && to_idx_ar[1]-fr_idx_ar[1]==offset && target_sq.piece!=null && target_sq.piece.color != from_sq.piece.color) {
         retstring='ok';
      } else if (this.ep_tgt_sq!=null) {
         var ep_idx_ar=translateIndicesFromName(this.ep_tgt_sq);
         if((ep_idx_ar[1]==2 || ep_idx_ar[1]==5) && Math.abs(ep_idx_ar[0]-fr_idx_ar[0])==1) {
            if(ep_idx_ar[0]==to_idx_ar[0] && ep_idx_ar[1]==to_idx_ar[1]) {
               retstring='ep';
            }
         }
      }
      if(retstring=='ok' && (to_idx_ar[1]==0 || to_idx_ar[1]==7)) {
         retstring='promote';
      }
   }
   if (from_sq.piece.name=='K') {
      if(Math.abs(fr_idx_ar[0]-to_idx_ar[0])<=1 && Math.abs(fr_idx_ar[1]-to_idx_ar[1])<=1 && fr_sq_id != to_sq_id) {
         if(target_sq.piece==null || target_sq.piece.color != from_sq.piece.color) {
            retstring='ok';
         }
      } else if (target_sq.piece==null && from_sq.piece.moved==false && fr_idx_ar[0]-to_idx_ar[0]==2) {
         temp_sq=eval("this.square.a"+to_sq_id.charAt(1));
         if(eval("this.square.b"+to_sq_id.charAt(1)+".piece==null")==true && eval("this.square.d"+to_sq_id.charAt(1)+".piece==null")==true && temp_sq.piece!=null && temp_sq.piece.moved==false) {
            temp_ar=sqAttack('d'+to_sq_id.charAt(1),from_sq.piece.color,null,'check');
            if(temp_ar.length==0) {
               retstring='O-O-O';
            }
         }
      } else if (target_sq.piece==null && from_sq.piece.moved==false && to_idx_ar[0]-fr_idx_ar[0]==2) {
         temp_sq=eval("this.square.h"+to_sq_id.charAt(1));
         if(eval("this.square.f"+to_sq_id.charAt(1)+".piece==null")==true && temp_sq.piece!=null && temp_sq.piece.moved==false) {
            var temp='f'+to_sq_id.charAt(1);
            temp_ar=sqAttack('f'+to_sq_id.charAt(1),from_sq.piece.color,null,'check');
            if(temp_ar.length==0) {
               retstring='O-O';
            }
         }
      }
   }
   ep_flag!=null?this.ep_tgt_sq=ep_flag:this.ep_tgt_sq=null;
   return retstring;
}

function execMoveVer2(fr_sq_id,to_sq_id,special_flag) {
   var op_color,chk_char,i,temp1,check_ar,takeon_sq,moverkfr_sq,moverkto_sq;
   var moveto_sq=eval("this.square."+to_sq_id);
   moveto_sq.piece!=null?takeon_sq=moveto_sq:takeon_sq=null;
   var movefr_sq=eval("this.square."+fr_sq_id);
   var curr_idx=this.scoresheet.length;
   this.scoresheet[curr_idx]=new Object();
   this.scoresheet[curr_idx].modsq=new Array();
   this.scoresheet[curr_idx].num=this.scoresheet.length;
   this.scoresheet[curr_idx].fr_sq_id=fr_sq_id;
   this.scoresheet[curr_idx].to_sq_id=to_sq_id;
   this.scoresheet[curr_idx].comment='';
   (movefr_sq.piece.name=='P' || moveto_sq.piece!=null)?this.scoresheet[curr_idx].clock=1:this.scoresheet[curr_idx].clock=0;
   this.scoresheet[curr_idx].pgn=this.to_pgn(fr_sq_id,to_sq_id,special_flag);
   movefr_sq.piece!=null?this.scoresheet[curr_idx].modsq.push(clonePieceOnSq(movefr_sq)):this.scoresheet[curr_idx].modsq.push(movefr_sq.sq_name);
   moveto_sq.piece!=null?this.scoresheet[curr_idx].modsq.push(clonePieceOnSq(moveto_sq)):this.scoresheet[curr_idx].modsq.push(moveto_sq.sq_name);
   this.scoresheet[curr_idx].fen='';
   switch(special_flag) {
      case 'ep'      :  to_sq_id.charAt(1)=='3'?temp1=to_sq_id.charAt(0)+'4':temp1=to_sq_id.charAt(0)+'5';
                        takeon_sq = eval("this.square."+temp1);
                        takeon_sq.piece!=null?this.scoresheet[curr_idx].modsq.push(clonePieceOnSq(takeon_sq)):this.scoresheet[curr_idx].modsq.push(takeon_sq.sq_name);
                        this.movepiece(movefr_sq,moveto_sq,takeon_sq);
                        break;
      case 'O-O'     :  this.movepiece(movefr_sq,moveto_sq,takeon_sq);
                        if(to_sq_id.charAt(1)=='1') {
                           moverkfr_sq=this.square.h1;
                           moverkto_sq=this.square.f1;
                        } else {
                           moverkfr_sq=this.square.h8;
                           moverkto_sq=this.square.f8;
                        }
                        moverkfr_sq.piece!=null?this.scoresheet[curr_idx].modsq.push(clonePieceOnSq(moverkfr_sq)):this.scoresheet[curr_idx].modsq.push(moverkfr_sq.sq_name);
                        moverkto_sq.piece!=null?this.scoresheet[curr_idx].modsq.push(clonePieceOnSq(moverkto_sq)):this.scoresheet[curr_idx].modsq.push(moverkto_sq.sq_name);
                        this.movepiece(moverkfr_sq,moverkto_sq,null);
                        break;
      case 'O-O-O'   :  this.movepiece(movefr_sq,moveto_sq,takeon_sq);
                        if(to_sq_id.charAt(1)=='1') {
                           moverkfr_sq=this.square.a1;
                           moverkto_sq=this.square.d1;
                        } else {
                           moverkfr_sq=this.square.a8;
                           moverkto_sq=this.square.d8;
                        }

                        moverkfr_sq.piece!=null?this.scoresheet[curr_idx].modsq.push(clonePieceOnSq(moverkfr_sq)):this.scoresheet[curr_idx].modsq.push(moverkfr_sq.sq_name);
                        moverkto_sq.piece!=null?this.scoresheet[curr_idx].modsq.push(clonePieceOnSq(moverkto_sq)):this.scoresheet[curr_idx].modsq.push(moverkto_sq.sq_name);
                        this.movepiece(moverkfr_sq,moverkto_sq,null);
                        break;
      case 'ok'      :  moveto_sq.piece!=null?this.movepiece(movefr_sq,moveto_sq,moveto_sq):this.movepiece(movefr_sq,moveto_sq,null);
                        break;
      case 'promote' :  moveto_sq.piece!=null?this.movepiece(movefr_sq,moveto_sq,moveto_sq):this.movepiece(movefr_sq,moveto_sq,null);
                        moveto_sq.piece=new Piece(moveto_sq.piece.start_sq, moveto_sq.piece.color,'Q');
                        moveto_sq.piece.moved=true;
                        moveto_sq.piece.curr_sq=moveto_sq.sq_name;
                        moveto_sq.piece.color=='W'?document.getElementById(moveto_sq.piece.start_sq).src=this.wsrc_ar.Q:document.getElementById(moveto_sq.piece.start_sq).src=this.bsrc_ar.Q;
                        break;
      default        :  break;
   }
   moveto_sq.piece.color=='W'?op_color='B':op_color='W';
   check_ar=sqAttack(this.locateking(op_color),op_color,null,'check');
   if(check_ar.length > 0) {
      chk_char='+';
      for(i=0;i< check_ar.length;i++) {
         if(this.checkmate(check_ar[i])==true) {
            chk_char='#';
            break;
         }
      }
      this.scoresheet[curr_idx].pgn+=chk_char;
   }
   check_ar=sqAttack(this.locateking(moveto_sq.piece.color),moveto_sq.piece.color,null,'check');
   this.scoresheet[curr_idx].fen=this.iterateboard();

   if(check_ar.length > 0) {
      this.takeback();
      return false;
   }
   return true;
}

function checkMate(ch_info) {
   var retvalue=true,hold,tsquare,neigh_ar,temp,temp1,test_ar,test_ar1,int_ar,op_color;
   if(ch_info[0]=='Q' || ch_info[0]=='R' || ch_info[0]=='B') {
      int_ar=getInterSq(ch_info[2],ch_info[3]);
   } else {
      int_ar=new Array(ch_info[2]);
   }

   ch_info[1]=='W'?op_color='B':op_color='W';
   while(int_ar.length>0) {
      int_ar.length==1?temp='check':temp='move';
      temp1=int_ar.pop();
      test_ar=sqAttack(temp1,ch_info[1],null,temp);
      if(test_ar.length>0) {
         if(test_ar.length==1 && isNextToByName(ch_info[2],ch_info[3])) {
            test_ar2=sqAttack(ch_info[2],op_color,null,'check');
            if(test_ar2.length==0) {return false;}
         } else {
            return false;
         }
      }
   }
   neigh_ar=getNeighbours(ch_info[3]);
   while(neigh_ar.length>0) {
      tsquare=eval("this.square."+ch_info[3]);
      hold=tsquare.piece;
      tsquare.piece=null;
      test_ar=sqAttack(neigh_ar.pop(),op_color,null,'check');
      tsquare.piece=hold;
      if(test_ar.length==0) {return false;}
   }
   return true;
}

function toPGN(fr_sq_id,to_sq_id,special_flag) {
   var i,op_color,temp_ar,part1='',part2='',part3='',part4='',part5='',part6='';
   var target_sq=eval("this.square."+to_sq_id);
   var from_sq=eval("this.square."+fr_sq_id);
   from_sq.piece.color=='W'?op_color='B':op_color='W';
   temp_ar=sqAttack(to_sq_id,op_color,from_sq.piece.name,'check');
   var temp1_ar=new Array();
   for(i in temp_ar) {
      if(temp_ar[i][0]==from_sq.piece.name) {temp1_ar.push(temp_ar[i]);}
   }

   if(from_sq.piece.name!='P' && temp1_ar.length>=2){
      var count;
      for(i=0,count=0;i<temp1_ar.length;i++) {
         if(fr_sq_id.charAt(0)==temp1_ar[i][2].charAt(0)) {count++;}
      }
      if(count==1) {
         part2=fr_sq_id.charAt(0);
      } else {
         for(i=0,count=0;i<temp1_ar.length;i++) {
            if(fr_sq_id.charAt(1)==temp1_ar[i][2].charAt(1)) {count++;}
         }
         count==1?part2=fr_sq_id.charAt(1):part2=fr_sq_id;
      }
   }

   if(target_sq.piece!=null || (from_sq.piece.name=='P' && fr_sq_id.charAt(0)!=to_sq_id.charAt(0))) {
      part3='x';
   }
   if(from_sq.piece.name=='P') {
      if(part3=='x') {
         part1=fr_sq_id.charAt(0);
      }
      part4=to_sq_id;
   } else {
      part1=from_sq.piece.name;
      part4=to_sq_id;
   }
   if(special_flag=='promote') {
      part5='=Q';
   } else if(special_flag=='O-O-O' || special_flag=='O-O') {
      return special_flag;
   }
   return (part1+part2+part3+part4+part5+part6);
}

function underPromote() {
   if(this.scoresheet.length==0){return true;}
   var tcsq,temp_sq,chk_char,i,temp_pchar,temp_pcolor,check_ar,op_color;
   var find_eq=this.scoresheet[this.scoresheet.length-1].pgn.lastIndexOf('=');
   if(find_eq>=0) {
      temp_sq=eval("this.square."+this.scoresheet[this.scoresheet.length-1].to_sq_id);
      switch(temp_sq.piece.name) {
         case 'Q':   temp_pchar='R';break;
         case 'R':   temp_pchar='B';break;
         case 'B':   temp_pchar='N';break;
         case 'N':   temp_pchar='Q';break;
         default:    temp_pchar='Q';break;
      }
      tcsq=temp_sq.piece.curr_sq;
      temp_sq.piece=eval("new Piece(\"" + temp_sq.piece.start_sq + "\",\"" + temp_sq.piece.color +"\",\""+temp_pchar+"\")");
      temp_sq.piece.curr_sq=tcsq;
      temp_sq.piece.color=='W'?temp_pcolor='w':temp_pcolor='b';
      document.getElementById(temp_sq.piece.start_sq).src=eval("this." + temp_pcolor + "src_ar." + temp_pchar);
      this.scoresheet[this.scoresheet.length-1].pgn=this.scoresheet[this.scoresheet.length-1].pgn.substring(0,find_eq+1) + temp_pchar;// + this.scoresheet[this.scoresheet.length-1].pgn.substring(find_eq+2,find_eq+10);

      temp_sq.piece.color=='W'?op_color='B':op_color='W';
      check_ar=sqAttack(this.locateking(op_color),op_color,null,'check');
      if(check_ar.length > 0) {
         chk_char='+';
         for(i=0;i< check_ar.length;i++) {
            if(this.checkmate(check_ar[i])==true) {
               chk_char='#';
               break;
            }
         }
         this.scoresheet[this.scoresheet.length-1].pgn+=chk_char;
      }
      this.writepgn();
   }
   return true;
}

function locateKing(my_color) {
   var temp_sq,found_id;
   for(found_id in this.square) {
      temp_sq=eval("this.square."+found_id);
      if(temp_sq.piece!=null && temp_sq.piece.name=='K' && temp_sq.piece.color==my_color) {
         return found_id;
      }
   }
}

function takeBackVer2() {
   if(this.scoresheet.length>0) {
      var restore_thing,temp_src,temp_sq;
      var back_ar=this.scoresheet.pop();
      while(back_ar.modsq.length>0) {
         restore_thing=back_ar.modsq.pop();
         if(typeof restore_thing=='object') {
            temp_sq=eval("this.square."+restore_thing.curr_sq);
            temp_sq.piece=restore_thing;
            document.getElementById(temp_sq.piece.start_sq).style.display='block';
            document.getElementById(temp_sq.piece.start_sq).style.left=temp_sq.locat_lt_ar[rotate][0] + 'px';
            document.getElementById(temp_sq.piece.start_sq).style.top=temp_sq.locat_lt_ar[rotate][1] + 'px';
         } else {
            eval("this.square."+restore_thing+".piece=null");
         }
      }
      if(back_ar.pgn.indexOf('=')>=0) {
         temp_sq.piece.color=='W'?temp_src=this.wsrc_ar.P:temp_src=this.bsrc_ar.P;
         document.getElementById(temp_sq.piece.start_sq).src=temp_src;
      }
      this.writepgn();
   } else {
      document.formid.tarea.value='';
   }
}

function movePiece(fr_s,to_s,tk_s) {
   if(tk_s != null) {
      tk_s.deletepiece();
   }
   to_s.piece=fr_s.piece;
   to_s.piece.moved=true;
   to_s.piece.curr_sq=to_s.sq_name;
   fr_s.piece=null;
   document.getElementById(to_s.piece.start_sq).style.display='block';
   document.getElementById(to_s.piece.start_sq).style.left=to_s.locat_lt_ar[rotate][0] + 'px';
   document.getElementById(to_s.piece.start_sq).style.top=to_s.locat_lt_ar[rotate][1] + 'px';

}

function writePGN() {
   var temp_str='',all_fen='';
   var record,potential_break,last_break,i;
   for(i=0;i<this.scoresheet.length;i++) {
      all_fen += this.scoresheet[i].fen+'\n';
      if(i%2==0) {
         temp_str+=1+i/2+'. ';
      }
      temp_str+=this.scoresheet[i].pgn+' ';
      if(this.scoresheet[i].comment != ''){
         temp_str+=this.scoresheet[i].comment+' ';
      }
      //alert(temp);
   }
   for(i=0,potential_break=0,last_break=0;i<temp_str.length;i++) {
      if(temp_str.charAt(i)==' ' && temp_str.charAt(i-1)!='.') {
         if(i-last_break>line_break) {
            last_break=potential_break;
            temp_str=temp_str.substring(0,potential_break)+'\n'+temp_str.substring(potential_break+1);
         } else {
            potential_break=i;
         }
      }
   }

//   document.formid.tarea.value =    makeTags() + "\n\n" + temp_str;
   document.formid.tarea.value =    makeTags() + "\n\n" + temp_str;
   document.formid.fen.value = all_fen;
   telm=getElement('entry_form_score');
   telm.scrollTop = telm.scrollHeight;
   //entry_form_score
}
///// SQUARE OBJECT////////////////////////////////////////////////////////////
function Square(n) {
   this.sq_name=n;
   this.locat_lt_ar=new Array(2);
   this.locat_lt_ar[0]=translateCoordsFromName(this.sq_name,false);
   this.locat_lt_ar[1]=translateCoordsFromName(this.sq_name,true);
   this.deletepiece=deletePiece;
   var temp_ar=translateIndicesFromName(this.sq_name);
   switch(temp_ar[1]) {
      case 7:  switch(temp_ar[0]) {
                  case 0: this.piece= new Piece(this.sq_name,'W','R'); break;
                  case 1: this.piece= new Piece(this.sq_name,'W','N'); break;
                  case 2: this.piece= new Piece(this.sq_name,'W','B'); break;
                  case 3: this.piece= new Piece(this.sq_name,'W','Q'); break;
                  case 4: this.piece= new Piece(this.sq_name,'W','K'); break;
                  case 5: this.piece= new Piece(this.sq_name,'W','B'); break;
                  case 6: this.piece= new Piece(this.sq_name,'W','N'); break;
                  case 7: this.piece= new Piece(this.sq_name,'W','R'); break;
                  default:       break;
               }
               break;
      case 6:  this.piece=new Piece(this.sq_name,'W','P'); break;
      case 1:  this.piece=new Piece(this.sq_name,'B','P'); break;
      case 0:  switch(temp_ar[0]) {
                  case 0: this.piece= new Piece(this.sq_name,'B','R'); break;
                  case 1: this.piece= new Piece(this.sq_name,'B','N'); break;
                  case 2: this.piece= new Piece(this.sq_name,'B','B'); break;
                  case 3: this.piece= new Piece(this.sq_name,'B','Q'); break;
                  case 4: this.piece= new Piece(this.sq_name,'B','K'); break;
                  case 5: this.piece= new Piece(this.sq_name,'B','B'); break;
                  case 6: this.piece= new Piece(this.sq_name,'B','N'); break;
                  case 7: this.piece= new Piece(this.sq_name,'B','R'); break;
                  default:       break;
               }
               break;
      default:  this.piece=null; break;
   }
}
///// SQUARE OBJECT METHODS////////////////////////////////////////////////////
function deletePiece() {
   if(this.piece!=null) {
      document.getElementById(this.piece.start_sq).style.display='none';
      this.piece=null;
   }
}
///// PIECE OBJECT/////////////////////////////////////////////////////////////qw
function Piece(sq_name,color,piece_nam) {
   this.moved=false;
   this.name=piece_nam;
   this.color=color;
   var icon= 'cset/'+color+this.name+'35.gif';
   this.icon=icon.toLowerCase();
   this.start_sq=sq_name;
   this.curr_sq=sq_name;
}
//GLOBAL PGN METHODS////////////////////////////////////////////////////////////////
function pawnChk(i,j,threat,coar,a_color,mode) {
   if(i>=0 && i<8 && j>=0 && j<8) {
      var temp_sq=eval("G.square."+translateNameFromIndices(i,j));
      if(temp_sq.piece!=null && temp_sq.piece.color==a_color && temp_sq.piece.name=='P') {
         threat.push(new Array(temp_sq.piece.name,temp_sq.piece.color,translateNameFromIndices(i,j),translateNameFromIndices(coar[0],coar[1],'pch')));
      }
   }
}

function knightChk(i,j,threat,coar,a_color,mode) {
   if(i>=0 && i<8 && j>=0 && j<8) {
      var temp_sq=eval("G.square."+translateNameFromIndices(i,j));
      if(temp_sq.piece!=null && temp_sq.piece.color==a_color && temp_sq.piece.name=='N') {
         threat.push(new Array(temp_sq.piece.name,temp_sq.piece.color,translateNameFromIndices(i,j),translateNameFromIndices(coar[0],coar[1],'nch')));
      }
   }
}

function rankChk(i,j,threat,coar,a_color,mode) {
   if(i==coar[0] && j==coar[1]) {
      return true;
   }
   var temp_sq=eval("G.square."+translateNameFromIndices(i,j));
   if(temp_sq.piece!=null) {
      if(temp_sq.piece.color==a_color && (temp_sq.piece.name=='R' || temp_sq.piece.name=='Q' ||(mode=='check' && temp_sq.piece.name=='K' && isNextTo(i,j,coar[0],coar[1],'rch')))) {
         threat.push(new Array(temp_sq.piece.name,temp_sq.piece.color,translateNameFromIndices(i,j),translateNameFromIndices(coar[0],coar[1])));
      }
      return false;
   }
   return true;
}

function diagChk(i,j,threat,coar,a_color,mode) {
   if(i==coar[0]&&j==coar[1]) {
      return true;
   }
   var temp_sq=eval("G.square."+translateNameFromIndices(i,j));
   if(temp_sq.piece!=null) {
      if(temp_sq.piece.color==a_color && (temp_sq.piece.name=='B' || temp_sq.piece.name=='Q' ||(mode=='check' && temp_sq.piece.name=='K' && isNextTo(i,j,coar[0],coar[1],'dch')))) {
         threat.push(new Array(temp_sq.piece.name,temp_sq.piece.color,translateNameFromIndices(i,j),translateNameFromIndices(coar[0],coar[1])));
      }
      return false;
   }
   return true;
}

function isNextTo(a1,b1,a2,b2) {
   if(Math.abs(a1-a2)==1 || Math.abs(b1-b2)==1) {
      return true;
   }
   return false;
}

function isNextToByName(n1,n2) {
   var a_ar=translateIndicesFromName(n1);
   var b_ar=translateIndicesFromName(n2);
   if(Math.abs(a_ar[0]-b_ar[0])==1 || Math.abs(a_ar[1]-b_ar[1])==1) {
      return true;
   }
   return false;
}

function translateIndicesFromCoords(arg_lft,arg_top) {
   if(rotate==0){
      var temp_lft=Math.floor((arg_lft-abs_bdlft)/sq_size);
      var temp_top=Math.floor((arg_top-abs_bdtop)/sq_size);
   }else{
      var temp_lft=7-Math.floor((arg_lft-abs_bdlft)/sq_size);
      var temp_top=7-Math.floor((arg_top-abs_bdtop)/sq_size);
   }
   return new Array(temp_lft,temp_top);
}

function translateIndicesFromName(n) {
  for(var i=0;i<8;i++) {
      if(col_name_ar[i]==n.charAt(0)) {
         var idx_lft=i;var idx_rt_lft=7-i;
         var idx_top=(8-n.charAt(1));var idx_rt_top=n.charAt(1)-1;
         return new Array(idx_lft,idx_top);
      }
   }
}

function translateCoordsFromName(a,flipped) {
   for(var i=0;i<8;i++) {
      if(col_name_ar[i]==a.charAt(0)) {
         var temp_lft=abs_bdlft+(i*sq_size);
         var temp_top=abs_bdtop+((8-a.charAt(1))*sq_size);
         if(flipped){
            var temp_rt_lft=sq_side-temp_lft+bd_horiz_offset;              
            var temp_rt_top=sq_side-temp_top-sq_size;
            return new Array(temp_rt_lft,temp_rt_top);
         }
         return new Array(temp_lft,temp_top);
      }
   }
}

function translateNameFromIndices(idx_lft,idx_top) {
      return (col_name_ar[idx_lft]+(8-idx_top));
}

function translateNameFromCoords(arg_lft,arg_top) {
   var temp_lft=arg_lft-abs_bdlft;
   var temp_top=arg_top-abs_bdtop;
   if(rotate==0){
      return (col_name_ar[Math.floor(temp_lft/sq_size)]+(8-Math.floor(temp_top/sq_size)));
   }else{
      return (col_name_ar[7-Math.floor(temp_lft/sq_size)]+(Math.floor(temp_top/sq_size)+1));
   }
}

function clonePieceOnSq(sq) {
   var i,ob,si='',st='';
   if(sq.piece!=null) {
      eval("ob=new Piece(\""+sq.piece.start_sq+"\",\""+sq.piece.color+"\",\""+sq.piece.name+"\")");
      for(i in sq.piece) {
         ob[i] = sq.piece[i];
      }
      return ob;
   }
   return null;
}

function getInterSq(fid,tid) {
   var num,i,j,d0,d1,ret_ar=new Array();
   var fii=translateIndicesFromName(fid);
   var tii=translateIndicesFromName(tid);
   var d0=0,d1=0;
   if(fii[0]>tii[0]) {
      d0=-1;
   }else if (fii[0]<tii[0]) {
      d0=1;
   }
   if(fii[1]>tii[1]) {
      d1=-1;
   }else if (fii[1]<tii[1]) {
      d1=1;
   }
   for(i=fii[0],j=fii[1],num=0;i!=tii[0]||j!=tii[1];i+=d0,j+=d1) {
      num++;if(num>12){return;}
      ret_ar.push(translateNameFromIndices(i,j));
   }
   return ret_ar;
}

function sqAttack(tgtsq_id,my_color,only_piece,mode) {
   var i,j,temp_sq,a_color;
   var coar=translateIndicesFromName(tgtsq_id);
   var threat=new Array();
   my_color=='W'?a_color='B':a_color='W';
   if(only_piece==null || only_piece=='R' || only_piece=='Q') {
      for(i=coar[0],j=coar[1];i<8  && rankChk(i,j,threat,coar,a_color,mode)==true;i++) {}
      for(i=coar[0],j=coar[1];j<8  && rankChk(i,j,threat,coar,a_color,mode)==true;j++) {}
      for(i=coar[0],j=coar[1];i>=0 && rankChk(i,j,threat,coar,a_color,mode)==true;i--) {}
      for(i=coar[0],j=coar[1];j>=0 && rankChk(i,j,threat,coar,a_color,mode)==true;j--) {}
   }
   if(only_piece==null || only_piece=='B' || only_piece=='Q') {
      for(i=coar[0],j=coar[1];i<8  && j<8  && diagChk(i,j,threat,coar,a_color,mode)==true;i++,j++) {}
      for(i=coar[0],j=coar[1];i>=0 && j<8  && diagChk(i,j,threat,coar,a_color,mode)==true;i--,j++) {}
      for(i=coar[0],j=coar[1];i<8  && j>=0 && diagChk(i,j,threat,coar,a_color,mode)==true;i++,j--) {}
      for(i=coar[0],j=coar[1];i>=0 && j>=0 && diagChk(i,j,threat,coar,a_color,mode)==true;i--,j--) {}
   }
   if(only_piece==null || only_piece=='N') {
      i=coar[0]+2;j=coar[1]+1;knightChk(i,j,threat,coar,a_color,mode);
      i=coar[0]+2;j=coar[1]-1;knightChk(i,j,threat,coar,a_color,mode);
      i=coar[0]-2;j=coar[1]+1;knightChk(i,j,threat,coar,a_color,mode);
      i=coar[0]-2;j=coar[1]-1;knightChk(i,j,threat,coar,a_color,mode);
      i=coar[0]+1;j=coar[1]+2;knightChk(i,j,threat,coar,a_color,mode);
      i=coar[0]+1;j=coar[1]-2;knightChk(i,j,threat,coar,a_color,mode);
      i=coar[0]-1;j=coar[1]+2;knightChk(i,j,threat,coar,a_color,mode);
      i=coar[0]-1;j=coar[1]-2;knightChk(i,j,threat,coar,a_color,mode);
   }
   if(only_piece==null || only_piece=='P') {
      if(a_color=='W') {
         if(mode=='check') {
            i=coar[0]+1;j=coar[1]+1;pawnChk(i,j,threat,coar,a_color,mode);
            i=coar[0]-1;j=coar[1]+1;pawnChk(i,j,threat,coar,a_color,mode);
         } else {
            i=coar[0];j=coar[1]+1;pawnChk(i,j,threat,coar,a_color,mode);
         }
      } else {
         if(mode=='check') {
            i=coar[0]+1;j=coar[1]-1;pawnChk(i,j,threat,coar,a_color,mode);
            i=coar[0]-1;j=coar[1]-1;pawnChk(i,j,threat,coar,a_color,mode);
         } else {
            i=coar[0];j=coar[1]-1;pawnChk(i,j,threat,coar,a_color,mode);
         }
      }
   }
   return threat;
}

function getNeighbours(sq_id) {
   var sq_co=translateIndicesFromName(sq_id);
   var temp,temp_sq,i,j,ret_ar=new Array();
   temp_sq=eval("G.square."+sq_id);
   if(temp_sq.piece==null) {return ret_ar;}
   var my_color=temp_sq.piece.color;
   for(i=sq_co[0]-1;i<=sq_co[0]+1;i++) {
      for(j=sq_co[1]-1;j<=sq_co[1]+1;j++) {
         if(i>=0 && i<8 && j>=0 && j<8) {
            temp=translateNameFromIndices(i,j);
            temp_sq=eval("G.square."+temp);
            if(temp_sq.piece!=null) {
               if(temp_sq.piece.color!=my_color) {
                  ret_ar.push(temp);
               }
            } else {
                  ret_ar.push(temp);
            }
         }
      }
   }
   return ret_ar;
}

function makeTags() {
   var i,j,eotags,tmp,new_str='',pgn_tags='',look_asc;
   for(i=1;i<8;i++) {
      str=eval("document.formid.t"+i+".value");
      pgn_tags+="["+std_tags[i-1]+"\""+cleanStr(str)+"\"]\n";
   }
   if(G.scoresheet.length>0){
      eotags=getTagsFromFen(G.scoresheet[G.scoresheet.length-1].fen);
   }else{
      eotags=getTagsFromFen('');
   }
   tmp=eotags.split("\n");
   document.formid.s8.value=tmp[0];
   document.formid.t8.value=getTagInfo(tmp[0])
   document.formid.s9.value=tmp[1];
   document.formid.t9.value=getTagInfo(tmp[1])   
   return (pgn_tags+=eotags);
}

function cleanStr(str) {
   var j,look_asc,new_str='';
   for(j=0;j<str.length;j++) {
      look_asc=str.charCodeAt(j);
      if(look_asc!=34 && look_asc!=91 && look_asc!=93 && look_asc!=58 && look_asc<=122 && look_asc>=32) {
         new_str+=str.charAt(j);
      }
   }
   while(new_str.charAt(0)==' ') {
      new_str=new_str.substring(1);
   }
   while(new_str.charAt(new_str.length-1)==' ') {
      new_str=new_str.substring(0,(new_str.length-2));
   }
   for(j=0;j<std_tags.length;j++) {
      if((look_asc=new_str.indexOf(std_tags[j]))==0) {
         new_str=new_str.substring(std_tags[j].length);
         while(new_str.charAt(0)==' ') {
            new_str=new_str.substring(1);
         }
      }
   }
   if(new_str.length==0){new_str='?';}
   return new_str;
}

function getTagInfo(tag){
   return tag.substring(tag.indexOf('"')+1,tag.lastIndexOf('"'));
}

function todayDate(flag) {
   var year;
   var today = new Date();
   var date  = today.getDate();
   var month = today.getMonth()+1;
   var number=today.getYear();
   month<10?month='0'+month:month;
   date<10?date='0'+date:date;
   number<1000 ?year=number + 1900:year=number;
   switch(flag){
      case 'ymd':return (year + '.' + month +'.'+date);break;
      case 'ym'  :return (year + '.' + month +'.??');break;
      case 'y'   :return (year + '.??.??');break;
      case ''    :return ('????.??.??');break;
      default    :return;break;
   }
}

function trimFen(fen){
   temp=fen.split('/');
   fen=temp.join('_');
   temp=fen.indexOf(' ');
   if(temp>0){fen=fen.substring(0,temp);}
   return fen;
}

function getTagsFromFen(fen){
   if(fen==''){fen="rnbqkbnr_pppppppp_8_8_8_8_PPPPPPPP_RNBQKBNR";}
   fen=trimFen(fen);
   var limit=0;
   while(limit<20 && fen.charAt(fen.length-1)==' '){fen=fen.substr(0,fen.length-1);limit++;}
   if(eco_ar[fen]){
      G.lastecotagused=eco_ar[fen];
      return eco_ar[fen];
   }else{
      return G.lastecotagused;
   }   
}
//DHTML STUFF///////////////////////////////////////////////////////////////////////
function Browser() {
  var ua, s, i;
  this.isIE    = false;
  this.isNS    = false;
  this.version = null;
  ua = navigator.userAgent;
  s = "MSIE";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isIE = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  s = "Netscape6/";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  s = "Gecko";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = 6.1;
    return;
  }
}

var dragObj = new Object();
dragObj.px_top=abs_bdtop;
dragObj.px_lft=abs_bdlft;

function dragStart(event,id_val) {
   var el;
   var x, y;
   if (browser.isIE) {
      dragObj.elNode = window.event.srcElement;
      x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
      y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
   }else if (browser.isNS) {
      dragObj.elNode = event.target;
      x = event.clientX + window.scrollX;
      y = event.clientY + window.scrollY;
   }
   dragObj.cursorStartX = x;
   dragObj.cursorStartY = y;
   dragObj.elStartLeft  = parseInt(dragObj.elNode.style.left, 10);
   dragObj.elStartTop   = parseInt(dragObj.elNode.style.top,  10);

   if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
   if (isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;

   if (browser.isIE) {
      document.attachEvent("onmousemove", dragGo);
      document.attachEvent("onmouseup",   dragStop);
      window.event.cancelBubble = true;
      window.event.returnValue = false;
   }else if (browser.isNS) {
      document.addEventListener("mousemove", dragGo,   true);
      document.addEventListener("mouseup",   dragStop, true);
      event.preventDefault();
   }
}

function dragGo(event) {
   var x, y;
   if (browser.isIE) {
      x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
      y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
   }else if (browser.isNS) {
      x = event.clientX + window.scrollX;
      y = event.clientY + window.scrollY;
   }
   dragObj.px_lft=dragObj.elStartLeft + x - dragObj.cursorStartX;
   dragObj.px_top=dragObj.elStartTop + y - dragObj.cursorStartY;
   dragObj.elNode.style.left = dragObj.px_lft + "px";
   dragObj.elNode.style.top  = dragObj.px_top + "px";

   if (browser.isIE) {
      window.event.cancelBubble = true;
      window.event.returnValue = false;
   }else if (browser.isNS) {
      event.preventDefault();
   }
}

function dragStop(event) {
   dragObj.px_lft=abs_bdlft+(sq_size*Math.floor((dragObj.px_lft-abs_bdlft+(sq_size/2))/sq_size));
   dragObj.px_top=abs_bdtop+(sq_size*Math.floor((dragObj.px_top-abs_bdtop+(sq_size/2))/sq_size));
   if (browser.isIE) {
      document.detachEvent("onmousemove",dragGo);
      document.detachEvent("onmouseup",dragStop);
   }else if (browser.isNS) {
      document.removeEventListener("mousemove",dragGo,true);
      document.removeEventListener("mouseup",dragStop,true);
   }
   if(dragObj.px_top<abs_bdtop || dragObj.px_lft<abs_bdlft || dragObj.px_top>abs_bdtop+sq_side-sq_size || dragObj.px_lft>abs_bdlft+sq_side-sq_size) {
      dragObj.elNode.style.top=dragObj.elStartTop+'px';
      dragObj.elNode.style.left=dragObj.elStartLeft +'px';
   } else {
      if(G.move(dragObj.elStartLeft,dragObj.elStartTop,dragObj.px_lft,dragObj.px_top)) {
         dragObj.elNode.style.top=dragObj.px_top+'px';
         dragObj.elNode.style.left=dragObj.px_lft +'px';         
         G.writepgn();
      } else {
         dragObj.elNode.style.top=dragObj.elStartTop+'px';
         dragObj.elNode.style.left=dragObj.elStartLeft +'px';
      }
   }
}

function keyDespatch(e) {
   if (!e){
      var key_id=window.event.keyCode;
      var tag_id=window.event.srcElement.tagName;
      var tag_nm =window.event.srcElement.className;
   } else {
      var key_id=e.which;
      var tag_id =e.target.tagName;
      var tag_nm =e.target.className;
   }
   if(key_id==42 && tag_id!='INPUT') {
      (!e)?window.event.cancelBubble = true:e.stopPropagation();
      G.underpromote();
      return false;
   }
   if(key_id==45 && tag_id!='INPUT') {
      (!e)?window.event.cancelBubble = true:e.stopPropagation();
      G.takeback();
      return false;
   }
   if(key_id==94 && tag_id!='INPUT') {
      (!e)?window.event.cancelBubble = true:e.stopPropagation();
      G.flipboard();
      return false;
   }
   if(key_id==113) {
      (!e)?window.event.cancelBubble = true:e.stopPropagation();
      doJS();
      return false;
   }

   if(key_id==13 && tag_id=='INPUT') {
      if(tag_nm='dedit') {
         chkDate();
      }
      G.writepgn();
      return true;
   }
   return true;
}

function actWrapper(xx){
   if(xx=='b'){
      G.takeback();
   }else if(xx=='u'){
      G.underpromote();
   }else if(xx=='f'){
      G.flipboard();
   }else if(xx=='c'){
      commentDialog();
   }else if(xx=='s'){
      G.setcomment();
   }  
   
}
function upDate(x) {
   var temp_ar;
   if(x.type=='text') {
      if(x.name.indexOf('t7')==0) {
         chkDate();
      } else {
         x.value=cleanStr(x.value);
      }
   } else {
      var inp=eval("document.formid.t"+x.name.charAt(1));
      inp.value=cleanStr(x.options[x.selectedIndex].text);
      if(x.name=='s7'){
         var temp_ar=inp.value.split('.');
         document.formid.t7_yr.value=temp_ar[0];
         document.formid.t7_mo.value=temp_ar[1];
         document.formid.t7_dy.value=temp_ar[2];
      }
   }
   G.writepgn();
}

function y2k(number) { return (number < 1000) ? number + 1900 : number; }

function valiDate (day,month,year) {
   var retdate=new Array('????','??','??');
   var today = new Date();
   var i_year = ((!year || isNaN(year) || year<1900 || year>y2k(today.getYear()))? y2k(today.getYear()):year);
   var i_month = ((!month || isNaN(year) || month<1 || month>12)? today.getMonth():month-1);
   var i_day = ((!day || isNaN(day) || day<1 || day>31)? today.getDate():day);
   var test = new Date(i_year,i_month,i_day);
   if(y2k(test.getYear()) == year) {
      retdate[0]=year.toString();
      if(test.getMonth()==month-1) {
         month<10?retdate[1]='0'+month.toString():retdate[1]=month.toString();
         if (test.getDate()==day) {
            day<10?retdate[2]='0'+day.toString():retdate[2]=day.toString();
         }
      }
   }
   retdate[3]=retdate[0]+'.'+retdate[1]+'.'+retdate[2];
   return retdate;
}

function chkDate() {
   var today = new Date();
   var i_year=cleanStr(document.formid.t7_yr.value);
   (isNaN(i_year) || i_year<1900 || i_year>y2k(today.getYear()+1))?document.formid.t7_yr.value='????':document.formid.t7_yr.value=i_year;
   var i_month=cleanStr(document.formid.t7_mo.value);
   (isNaN(i_month) || i_month<1 || i_month>12)?document.formid.t7_mo.value='??':document.formid.t7_mo.value=i_month.toString();
   if(document.formid.t7_mo.value.length==1){document.formid.t7_mo.value='0'+document.formid.t7_mo.value;}
   var i_day=cleanStr(document.formid.t7_dy.value);
   (isNaN(i_day) || i_day<1 || i_day>31)?document.formid.t7_dy.value='??':document.formid.t7_dy.value=i_day.toString();
   if(document.formid.t7_dy.value.length==1){document.formid.t7_dy.value='0'+document.formid.t7_dy.value;}
   document.formid.t7.value=document.formid.t7_yr.value+'.'+document.formid.t7_mo.value+'.'+document.formid.t7_dy.value;
}

function getElement(id){
   if(document.getElementById){
      return document.getElementById(id);
   }else if(document.all){
      return document.all[id];
   }else if(document.layers){
      return document.layers[id];
   }else{
      return null;
   }
}

function findPos(obj) {
   if(typeof obj == 'string'){
      obj=getElement(obj);
   }
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function getStyle(el, strCssRule){
    var oElm=getElement(el);
    var strValue = "";
    if(document.defaultView && document.defaultView.getComputedStyle){
        strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
    } else if(oElm.currentStyle){
        strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
            return p1.toUpperCase();
        });
        strValue = oElm.currentStyle[strCssRule];
    }    
    return strValue;
}

function commentDialog(){
   if(G.scoresheet.length < 1){
      alert('Scoresheet must have at least one move to add a comment.');
   }else{
      document.formcom.comment.value='';
     
      if(document.getElementById('comment_id').style.visibility!='visible'){
         document.getElementById('notcomm_id').style.visibility='hidden';
         document.getElementById('comment_id').style.visibility='visible';
      }else{
         document.getElementById('notcomm_id').style.visibility='visible';
         document.getElementById('comment_id').style.visibility='hidden';
      }
   }
}
//JS KICKOFF///////////////////////////////////////////////////////////////////
function doJS(a,b,c,d,e,f,g,h,mind) {
   browser = new Browser();// Global object to hold drag information.
   var i,t_t,t_s;
   sq_size=a;
   bd_left_margin=b;
   bd_top_margin=c;
   bd_horiz_offset=d;
   bd_vert_offset=e;
   line_break=f;
   min_form_width=g;
   max_form_width=h;
   form_submittable=1;
   min_submitlength=mind*2;
   var safety_margin=40;
   if (window.screen) {
      window.resizeTo(screen.availWidth,screen.availHeight)
      window.moveTo(0,0);
   }
   if(document.body.clientWidth){
      avail_w = document.body.clientWidth;
   }else{
      avail_w = innerWidth;
   }

   var su_1=parseInt(getStyle('entry_mid','padding-left'));
   var su_2=parseInt(getStyle('entry_form','padding-left'));
   var su_3=parseInt(getStyle('entry_form','padding-right'));
   var calc_width=avail_w - su_1 - su_2 - su_3 - safety_margin;
   
   if(calc_width < min_form_width) {
      alert('Screen resolution not high enough to view this page properly');
      getElement('entry_form').style.width=min_form_width+'px';
   } else if (calc_width < max_form_width) {
      getElement('entry_form').style.width=calc_width+'px';
   } else {
      getElement('entry_form').style.width=max_form_width+'px';
   }
   getElement('entry_form').style.visibility='visible';   

   sq_side=sq_size*8;

   //places pieces
   for(i=0;i<8;i++) {
      for(j=1;j<=8;j++){
         if(j>2 && j<7){continue;}
         t=sq_side-(j*sq_size)+bd_vert_offset;
         l=i*sq_size+bd_horiz_offset;
         temp_obj=getElement(col_name_ar[i]+j);
         temp_obj.style.left=(bd_left_margin+l)+'px';
         temp_obj.style.top=(bd_top_margin+t)+'px';
         temp_obj.style.visibility='visible';
      }
   }

   abs_bdtop=parseInt(getElement('a8').style.top, 10);
   abs_bdlft=parseInt(getElement('a8').style.left, 10);
   G=new Board();
   document.formid.reset();
   window.document.onkeypress = keyDespatch;
   document.formid.s7.options[0].text = "[Date \"????.??.??\"]";
   document.formid.s7.options[1].text = "[Date \""+todayDate('ymd')+"\"]";
   document.formid.s7.options[2].text = "[Date \""+todayDate('ym')+"\"]";
   document.formid.s7.options[3].text = "[Date \""+todayDate('y')+"\"]";
   for(i=1;i<8;i++) {
      t_t=eval("document.formid.t"+i);
      t_s=eval("document.formid.s"+i+".options[0].text");
      t_t.value=t_s.substring(t_s.indexOf('"')+1,t_s.lastIndexOf('"'));
      if(i==7) {
         var temp=t_t.value.split('.');
         document.formid.t7_yr.value=temp[0];
         document.formid.t7_mo.value=temp[1];
         document.formid.t7_dy.value=temp[2];
      }
   }
   for(i in G.square) {
      if(G.square[i].piece!=null) {
         document.getElementById(G.square[i].sq_name).style.display='block';
         document.getElementById(G.square[i].sq_name).style.left=G.square[i].locat_lt_ar[rotate][0] + 'px';
         document.getElementById(G.square[i].sq_name).style.top=G.square[i].locat_lt_ar[rotate][1] + 'px';
      }
   }
   if(browser.isIE){getElement('dhtmlfloatie').style.filter='alpha(opacity=0)';}
}
//Throttle submit/////////////////////////////////////////////////////////////////
function submitGame(){
   if(G.scoresheet.length<min_submitlength){
      alert("Game must be at least "+min_submitlength/2+" moves to be valid");
      return;
   }
   if(form_submittable==1){
      document.formid.submit();
      form_submittable=0;
   } else {
      //alert("Please wait until stuff has been done");
   }   
}
//Tooltips///////////////////////////////////////////////////////////////////////

var floattext=new Array();
floattext[0]="<span class=blend>The name of the player should be as it would appear in a telephone directory, that is with the family or last name first. If a first name or first initial is available, it is separated from the family name by a comma and a space. Finally, one or more middle initials may appear.<p> Wherever a comma appears, the very next character should be a space. Wherever an initial appears, the very next character should be a period.<br><br>Examples:<ul><li>Smith, J.<li>Smith, John<li>Smith<li>Smith, John H.</ul></span>";
floattext[1]="<span class=blend>The Site tag value should include city and region names along with a standard name for the country. The use of the IOC (International Olympic Committee) three letter names is suggested for those countries where such codes are available (AUS: Australia). A comma may be used to separate a city from a region. No comma is needed to separate a city or region from the IOC country code.</span>";

var floatiewidth="200px"; //default width of floatie in px
var floatieheight=""; //default height of floatie in px. Set to "" to let floatie content dictate height.
var floatiebgcolor="#dcdcdc"; //default bgcolor of floatie
var fadespeed=70; //speed of fade (5 or above). Smaller=faster.
var baseopacity=0;
function slowhigh(which2){
   imgobj=which2;
   browserdetect=which2.filters? "ie" : typeof which2.style.MozOpacity=="string"? "mozilla" : "";
   instantset(baseopacity);
   highlighting=setInterval("gradualfade(imgobj)",fadespeed);
}

function instantset(degree){
   cleartimer();
   if (browserdetect=="mozilla"){
      imgobj.style.MozOpacity=degree/100;
   }else if (browserdetect=="ie"){
      imgobj.filters.alpha.opacity=degree;
   }
}

function cleartimer(){
   if (window.highlighting){ clearInterval(highlighting);}
}

function gradualfade(cur2){
   if (browserdetect=="mozilla" && cur2.style.MozOpacity<1){
      cur2.style.MozOpacity=Math.min(parseFloat(cur2.style.MozOpacity)+0.1, 0.99);
   }else if(browserdetect=="ie" && cur2.filters.alpha.opacity<100){
      cur2.filters.alpha.opacity+=10;
   }else if (window.highlighting){
      clearInterval(highlighting);
   }
}

function ietruebody(){
   return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body;
}

function paramexists(what){
   return(typeof what!="undefined" && what!="");
}

function showfloatie(thetext, optbgColor, optWidth, optHeight){
   var dsocx=(window.pageXOffset)? pageXOffset: ietruebody().scrollLeft;
   var dsocy=(window.pageYOffset)? pageYOffset : ietruebody().scrollTop;
   var floatobj=document.getElementById("dhtmlfloatie");
   floatobj.style.left="-900px";
   floatobj.style.display="block";
   floatobj.style.backgroundColor=paramexists(optbgColor)? optbgColor : floatiebgcolor;
   floatobj.style.width=paramexists(optWidth)? optWidth+"px" : floatiewidth;
   floatobj.style.height=paramexists(optHeight)? optHeight+"px" : floatieheight!=""? floatieheight : "";
   floatobj.innerHTML=thetext;
   var floatWidth=floatobj.offsetWidth>0? floatobj.offsetWidth : floatobj.style.width;
   var floatHeight=floatobj.offsetHeight>0? floatobj.offsetHeight : floatobj.style.width;
   var winWidth=document.all&&!window.opera? ietruebody().clientWidth : window.innerWidth-20;
   var winHeight=document.all&&!window.opera? ietruebody().clientHeight : window.innerHeight;
   //floatobj.style.left=dsocx+winWidth-floatWidth-5+"px";
   floatobj.style.left=20+"px";
   floatobj.style.top=5+"px";
   slowhigh(floatobj);
}

function hidefloatie(){
   var floatobj=document.getElementById("dhtmlfloatie");
   floatobj.style.display="none";
}
