/***********************************************************/
/************** I N I T _ F I E L D ( ) ********************/
/***********************************************************/
function init_field() {
         /* farbe löschen */
         for( y = 0; y < C_ROW; y++ ){
              for( x = 0; x < C_COL; x++ ){
                  if((x+y)%2 == 0) farbe = farbey; else farbe=farbex;
                   change_color(x,y,farbe);
              }
         }
         if( document.all ) { document.all.player1.parentElement.setAttribute("bgcolor",farbeq,"true");
                              document.all.player2.parentElement.setAttribute("bgcolor",farbeq,"true"); }
         if( document.layers ) { document.player1.bgColor=farbeq ;
                                 document.player2.bgColor=farbeq ; }
         act_player=0;
         /* schwarz aufstellen */
         for( y = 0; y < 3; y++ ){
              for( x = 0; x < C_COL; x+=2 ){
                   setxy(x+(y%2),y,schwarz);
              }
         }
         /* mittelfelder löschen */
         for( y = 3; y < C_ROW-1; y++ ){
              for( x = 0; x < C_COL; x+=2 ){
                   setxy(x+(y%2),y,empty);
              }
         }
         /* weiss aufstellen */
         for( y = C_ROW-1; y > C_ROW-4; y-- ){
              for( x = 0; x < C_COL; x+=2 ){
                   setxy(x+(y%2),y,weiss);
              }
         }
}

/**********************************************************/
/******* B E G I N N E R ( ) ******************************/
/**********************************************************/
function beginner(player) {
         if( act_player == 1 || act_player == 2 ) return;
         if( act_player == 4 && player == 1 ) return;
         if( act_player == 5 && player == 2 ) return;

         init_field();
         if( player==1 ) set_player(1);
         if( player==2 ) set_player( other_player(1) );
}

/**********************************************************/
/******* O T H E R _ P L A Y E R ( ) *********************/
/**********************************************************/
function other_player(player) {
         if( player != 1 ) return 1;
         if( player == 1 ) {
             if( document.fmodus.elements[0].checked == true ) { return 2; } else { return 3; }
         }
}

/**********************************************************/
/******* T E S T _ K I N G ( ) ****************************/
/**********************************************************/
function test_king(x,y,player) {
         if( player == 1 && y == 0          && statusxy(x,y) == 30 ) return 1;
         if( player != 1 && y == (C_ROW -1) && statusxy(x,y) == 20 ) return 1;
         return -1;
}

/**********************************************************/
/******* S E T _ K I N G ( ) ******************************/
/**********************************************************/
function set_king(x,y,player) {
         if( test_king(x,y,player) == -1 ) return -1;
         if( player == 1 ) setxy(x,y,weissdame);
         if( player != 1 ) setxy(x,y,schwarzdame);
         return 0;
}

/**********************************************************/
/******* C H A N G E _ C O L O R ( ) **********************/
/**********************************************************/
function change_color(x,y,color) {
         if( document.all ) { document.all.tags("span")[firstspan+(y*C_COL)+x].parentElement.setAttribute("bgcolor",color,"true");
         }
         if( document.layers ) {
                  document.layers[firstlayer+(y*C_COL)+x].bgColor=color ;
         }
}

/**********************************************************/
/*********** I S _ F A R B E S ( ) ************************/
/**********************************************************/
function is_farbes(x,y) {
         if( document.all ) { if( document.all.tags("span")[firstspan+(y*C_COL)+x].parentElement.getAttribute("bgcolor","true").toUpperCase() == farbes.toUpperCase() ) return true;
         }
         if( document.layers ) {
                  if( document.layers[firstlayer+(y*C_COL)+x].bgColor == 255 ) return true;
         }
         return false;
}

/**********************************************************/
/******* S E T _ P L A Y E R ( ) **************************/
/**********************************************************/
function set_player(player) {
    if( player == 1 ) { /*** Menschlicher Spieler ***/
       act_player=1; mark_x = -1; mark_y = -1;
       check_game(1);
       /*** Anzeige, wer dran ist ***/
       if( document.all ) { document.all.player1.parentElement.setAttribute("bgcolor",farbep,"true");
                            document.all.player2.parentElement.setAttribute("bgcolor",farbeq,"true"); }
       if( document.layers ) { document.player1.bgColor=farbep ;
                               document.player2.bgColor=farbeq ; }
       return;
    }

    if( player == 2 ) { /*** Menschlicher Spieler 2 (Gegner) ***/
       act_player=2; mark_x = -1; mark_y = -1;
       check_game(2);
       if( document.all ) { document.all.player2.parentElement.setAttribute("bgcolor",farbep,"true");
                            document.all.player1.parentElement.setAttribute("bgcolor",farbeq,"true"); }
       if( document.layers ) { document.player2.bgColor=farbep ;
                              document.player1.bgColor=farbeq ; }
       return;
    }

    if( player == 3 ) { /*** Computer Spieler 2 (Gegner) ***/
       if( document.all ) { document.all.player2.parentElement.setAttribute("bgcolor",farbep,"true");
                            document.all.player1.parentElement.setAttribute("bgcolor",farbeq,"true"); }
       if( document.layers ) { document.player2.bgColor=farbep ;
                              document.player1.bgColor=farbeq ; }
       if( mark_x != -1 && mark_y != -1 ) change_color(mark_x, mark_y, farbey);
       act_player=3; mark_x = -1; mark_y = -1;
       return;
    }

    if( player == 4 || player == 5 ) { /*** Doppelzug möglich ***/
       if( document.all ) { document.all.player2.parentElement.setAttribute("bgcolor",farbep,"true");
                            document.all.player1.parentElement.setAttribute("bgcolor",farbep,"true"); }
       if( document.layers ) { document.player2.bgColor=farbep ;
                              document.player1.bgColor=farbep ; }
       if( mark_x != -1 && mark_y != -1 ) change_color(mark_x, mark_y, farbey);
       if( double_x != -1 && double_y != -1 ) change_color(double_x, double_y, farbem);
       mark_x = double_x; mark_y = double_y;
       act_player=player;
       return;
    }
}

/***********************************************************/
/************** S E T X Y ( ) ******************************/
/***********************************************************/
function setxy(x,y,image) {
           readxyobject(x,y).src=image.src;
}

/**********************************************************/
/******* R E A D X Y O B J E C T ( ) **********************/
/**********************************************************/
function readxyobject(x,y) {
            if( document.all) return document.images[firstfield+(y*C_COL)+x];
            if( document.layers ) return document.layers[firstlayer+(y*C_COL)+x].background;
}

/**********************************************************/
/******* S T A T U S X Y ( ) ******************************/
/**********************************************************/
function statusxy(x,y) {
         if( x<0 || y<0 ) return -1;
         myobject = readxyobject(x,y);
         if( myobject.src.indexOf(wimg) != -1 )     return 30; /* leer */
         if( myobject.src.indexOf(emptyimg) != -1 ) return 10; /* leer */
         if( myobject.src.indexOf(wdimg) != -1 )    return 31; /* leer */
         if( myobject.src.indexOf(simg) != -1 )     return 20; /* leer */
         if( myobject.src.indexOf(sdimg) != -1 )    return 21; /* leer */
         return 10;
}

/**********************************************************/
/********* C H E C K _ G A M E ( ) ************************/
/**********************************************************/
function check_game(player) {
         /* Teste ob Spiel für Spieler vorbei ist, oder ob "player" gezwungen ist zu springen */
         move_ctr = 0; /* zählt Anzahl der Züge für spieler*/
         is_jump = 0;
         for( my_x=0; my_x < C_COL; my_x++ ) {
              for( my_y=0; my_y < C_ROW; my_y++ ) {
                   if( (my_stat = statusxy(my_x,my_y)) == -1 ) continue;
                   if((my_x+my_y)%2 == 0) farbe = farbey; else farbe=farbex;
                   change_color(my_x, my_y, farbe);
                   if( my_stat == 10 ) continue;
                   for( nr=0; (next_stat = next_move(my_x,my_y,player,nr)) != -1; nr++) {
                        move_ctr++;
                        if( next_stat == 1 || next_stat == 3 ) {
                            is_jump = 1;
                            change_color(my_x, my_y, farbes);
                        }
                   }
              }
         }
         if(move_ctr == 0) alert("Spieler "+other_player(player)+" hat gewonnen!");
}

/**********************************************************/
/********* M O V E 2 X Y ( ) ******************************/
/**********************************************************/
function move2xy(x,y) {
         if( (m2_stat = statusxy(x,y)) == -1 ) return;

         /* Schnelleinstieg ins Spiel, ohne erst Stein auszuwählen */
         if( act_player == 0 ) {
             if( m2_stat == 30 || m2_stat == 31 ) set_player(1);
             if( m2_stat == 20 || m2_stat == 21 ) set_player(other_player(1));
         }

         if( act_player == 4 && ( m2_stat == 20 || m2_stat == 21 ) ) set_player(other_player(1));
         if( act_player == 5 && ( m2_stat == 30 || m2_stat == 31 ) ) set_player(1);
         if( (act_player == 4 && ( m2_stat == 30 || m2_stat == 31 )) ||
             (act_player == 5 && ( m2_stat == 20 || m2_stat == 21 )) ) return;
         if( act_player == 4 ) player = 1;
         if( act_player == 5 ) player = 2;
         if( act_player != 4 && act_player != 5 ) player = act_player;

         /* wenn Sprung möglich, dann darf nur dieser aktiviert werden */
         if( m2_stat != 10 && is_jump == 1 && !is_farbes(x,y) ) return;

         /* Leeres Feld kann nur aktiviert werden, wenn schon was markiert! */
         if( mark_x==-1 && mark_y==-1 && m2_stat == 10) return;

         /* richtiger Stein markiert ? */
         if( player == 1 && ( m2_stat == 20 || m2_stat == 21 ) ) return;
         if( player != 1 && ( m2_stat == 30 || m2_stat == 31 ) ) return;

         if( mark_x==-1 && mark_y==-1 && m2_stat != 10) { /* aktivieren */
                  mark_x=x; mark_y=y;
                  change_color(x,y,farbem);
                  return;
         }
         if( mark_x==x && mark_y==y  && m2_stat != 10 ) { /* deaktivieren */
                  mark_x=-1; mark_y=-1;
                  farbe = ( is_jump == 1 )? farbes : farbey;
                  change_color(x,y,farbe);
                  return;
         }

         if( mark_x!=x || mark_y!=y ) { /* neuen aktivieren oder stein setzen */
             if( m2_stat != 10 ) { /* neu aktivieren */
                  change_color(x,y,farbem);
                  farbe = ( is_jump == 1 )? farbes : farbey;
                  change_color(mark_x,mark_y,farbe);
                  mark_x=x; mark_y=y;
                  return;
             }
             if( m2_stat == 10 ) { /* stein bewegen */
                   if( (new_player = make_move(mark_x,mark_y,x,y,player) ) == -1 ) return;
                   set_player( new_player );
             }

         }
}

/**********************************************************/
/************ M O V E T Y P E ( ) *************************/
/**********************************************************/
function move_type(mark_x, mark_y,x,y,player) {
         /*** Folgende Typen sind definiert ***/
         /*** -1 = Zug verboten bzw. gar nicht möglich ***/
         /***  0 = einfaches setzen eines Steines ***/
         /***  1 = einfacher sprung eines Steines über den eines Gegners ***/
         /***  2 = setzen einer Dame ***/
         /***  3 = Sprung einer Dame über einen Stein eines Gegners ***/

         if( mark_x < 0 || mark_y < 0 || x < 0 || y < 0 || player < 1 ) return -1;
         if( mark_x >= C_COL || mark_y >= C_ROW || x >= C_COL || y >= C_ROW ) return -1;

         /* Quell und Zielfeld holen und testen ob überhaupt gültig */
         if( (mark_stat = statusxy(mark_x,mark_y)) == -1 ) return -1;
         if( (mt_stat = statusxy(x,y)) == -1 ) return -1;

         /* leeres Feld markieren macht keinen Sinn */
         if( mark_stat == 10 ) return -1;
         if( mt_stat != 10 ) return -1;

         /* richtiger Stein markiert ? */
         if( player == 1 && ( mark_stat == 20 || mark_stat == 21 ) ) return -1;
         if( player != 1 && ( mark_stat == 30 || mark_stat == 31 ) ) return -1;

         /* ein einfacher Zug? */
         if( mark_stat == 20 || mark_stat == 30 ) {
             /* maximal 2 felder entfernt und nur nach vorn vom markierten möglich */
             diff_x = mark_x - x; diff_y = mark_y - y;
             if( Math.abs(diff_x) == 1 && Math.abs(diff_y) == 1 ) {
                 /* ging zu auch nach vorne? */
                 if( player == 1 && diff_y < 0 ) return -1;
                 if( player != 1 && diff_y > 0 ) return -1;
                 return 0;
             }
             if( Math.abs(diff_x) == 2 && Math.abs(diff_y) == 2 ) {
                 /* ging zu auch nach vorne? */
                 if( player == 1 && diff_y < 0 ) return -1;
                 if( player != 1 && diff_y > 0 ) return -1;
                 /* Übersprungenes Feld prüfen! d.h. es muss vom Gegner sein */
                 delete_x = x + (diff_x/2); delete_y = y + (diff_y/2);
                 jump_stat = statusxy( delete_x, delete_y )
                 if( player == 1 && ( jump_stat == 20 || jump_stat == 21 ) ) return 1;
                 if( player != 1 && ( jump_stat == 30 || jump_stat == 31 ) ) return 1;
             }
             return -1;
         }

         /* ein Dame-Zug? */
         if( mark_stat == 21 || mark_stat == 31 ) {
             diff_x = mark_x - x; diff_y = mark_y - y;
             /* Richtung und Entfernung sind egal, bloß diagonal muss es sein, d.h. diff_x = diff_y */
             if( Math.abs(diff_x) != Math.abs(diff_y) ) return -1;
             /* Suche nach eventuellen Steinen unterwegs! Es darf nur maximal ein einziger gegnerischer
                Stein im Weg liegen */
             abs_diff = Math.abs(diff_x); /* Aboluter Abstand */
             delta_x = diff_x / abs_diff; delta_y = diff_y / abs_diff;
             delete_x = -1; delete_y = -1; /* Anzahl Steine im Weg, bei eigenem sofort ein return -1 */
             for( king_step = 1; king_step < abs_diff; king_step++ ) {
                  tmp_stat = statusxy( x+(king_step*delta_x), y+(king_step*delta_y) )
                  if( (player == 1 && ( tmp_stat == 20 || tmp_stat == 21 )) ||
                      (player != 1 && ( tmp_stat == 30 || tmp_stat == 31 )) ) {
                              if( delete_x != -1 && delete_y != -1 ) return -1;
                              delete_x = x+(king_step*delta_x);
                              delete_y = y+(king_step*delta_y);
                  }
                  if( (player == 1 && ( tmp_stat == 30 || tmp_stat == 31 )) ||
                      (player != 1 && ( tmp_stat == 20 || tmp_stat == 21 )) ) return -1;
             }
             if( delete_x == -1 && delete_y == -1 ) return 2;
             if( delete_x != -1 && delete_y != -1 ) return 3;
             return -1;
         }

}

/**********************************************************/
/******* M A K E _ M O V E () *****************************/
/**********************************************************/
function make_move(mark_x, mark_y,x,y,player) {
         if( (type = move_type( mark_x, mark_y,x,y, player)) == -1 ) return -1;
         if( (act_player == 4 || act_player == 5) && type != 1 && type != 3 ) return -1;

         if( type == 0 ) { /* einfacher Zug, nichts muss gelöscht werden */
                  setxy(x,y,readxyobject(mark_x,mark_y));
                  setxy(mark_x,mark_y,empty);
                  set_king(x,y,player);
                  return other_player(player);
         }
         if( type == 1 ) { /* Sprung, mittlerer muss gelöscht werden */
                  setxy(x,y,readxyobject(mark_x,mark_y));
                  setxy(mark_x,mark_y,empty);
                  setxy(delete_x,delete_y,empty);
                  if( set_king(x,y,player) == -1 ) {
                      /* Ist doppelsprung möglich? */
                      for( nr=0; (next_type=next_move(x,y,player,nr)) != -1; nr++) {
                           if( next_type == 1 || next_type == 3 ) {
                               double_x = x; double_y = y;
                               return (player == 1)? 4 : 5;
                           }
                      }
                  }
                  return other_player(player);
         }
         if( type == 2 ) { /* Dame Zug, nichts muss gelöscht werden */
                  setxy(x,y,readxyobject(mark_x,mark_y));
                  setxy(mark_x,mark_y,empty);
                  return other_player(player);
         }
         if( type == 3 ) { /* Dame Sprung, mittlerer muss gelöscht werden */
                  setxy(x,y,readxyobject(mark_x,mark_y));
                  setxy(mark_x,mark_y,empty);
                  setxy(delete_x,delete_y,empty);
                  /* Ist doppelsprung möglich? */
                  for( nr=0; (next_type=next_move(x,y,player,nr)) != -1; nr++) {
                       if( next_type == 1 || next_type == 3 ) {
                           double_x = x; double_y = y;
                           return (player == 1)? 4 : 5;
                       }
                  }
                  return other_player(player);
         }
}

/**********************************************************/
/******* N E X T _ M O V E () *****************************/
/**********************************************************/
function next_move(x,y,player,nr) {
         /* von x,y ausgehend den nr-ten sprung finden */
         /* gefüllt wird next_x, next_y, next_type, delete_x, delete_y */
         /* Rückgabewert -1 == kein weiterer Sprung möglich */
         if( x < 0 || y < 0 ) return -1;
         if( (nm_stat = statusxy(x,y)) == -1 ) return -1;

         my_nr = 0;
         /* Wenn stein KEINE dame, dann nur max 2 entfernt */
         if( nm_stat == 20 || nm_stat == 30 ) {
             next_x = x+1; next_y = y+1; next_type = move_type(x,y,next_x,next_y,player);
             if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             next_x = x+1; next_y = y-1; next_type = move_type(x,y,next_x,next_y,player);
             if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             next_x = x-1; next_y = y-1; next_type = move_type(x,y,next_x,next_y,player);
             if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             next_x = x-1; next_y = y+1; next_type = move_type(x,y,next_x,next_y,player);
             if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             next_x = x+2; next_y = y+2; next_type = move_type(x,y,next_x,next_y,player);
             if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             next_x = x+2; next_y = y-2; next_type = move_type(x,y,next_x,next_y,player);
             if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             next_x = x-2; next_y = y-2; next_type = move_type(x,y,next_x,next_y,player);
             if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             next_x = x-2; next_y = y+2; next_type = move_type(x,y,next_x,next_y,player);
             if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
         }

         /* Wenn stein eine dame, dann alle entfernungen möglich */
         if( nm_stat == 21 || nm_stat == 31 ) {
             /* nach links oben */
             for(next_x=x-1, next_y=y-1; next_x>=0 && next_y>=0 && next_x<C_COL && next_y<C_ROW; next_x--, next_y-- ) {
                 next_type = move_type(x,y,next_x,next_y,player);
                 if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             }
             /* nach rechts oben */
             for(next_x=x+1, next_y=y-1; next_x>=0 && next_y>=0 && next_x<C_COL && next_y<C_ROW; next_x++, next_y-- ) {
                 next_type = move_type(x,y,next_x,next_y,player);
                 if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             }
             /* nach links unten */
             for(next_x=x-1, next_y=y+1; next_x>=0 && next_y>=0 && next_x<C_COL && next_y<C_ROW; next_x--, next_y++ ) {
                 next_type = move_type(x,y,next_x,next_y,player);
                 if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             }
             /* nach rechts unten */
             for(next_x=x+1, next_y=y+1; next_x>=0 && next_y>=0 && next_x<C_COL && next_y<C_ROW; next_x++, next_y++ ) {
                 next_type = move_type(x,y,next_x,next_y,player);
                 if( next_type != -1 ) { if (my_nr == nr ) { return next_type; } else { my_nr++; } }
             }
         }
         return -1;

}
