function preload() {
 this.length = preload.arguments.length;
 for (var i=0; i<this.length; i++) {
  this[i] = new Image();
  this[i].src = preload.arguments[i];
 }
}
var bilder = new preload("schwarz.gif","gelb.gif",
 "mensch1.gif","mensch2.gif","mensch1k.gif","mensch2k.gif",
 "comp1.gif","comp2.gif","comp1k.gif","comp2k.gif");

var square_breite = 40;
var piece_toggled = false;
var comp_dran = false;
var doppelsprung = false;
var comp_move = false;
var spielende = false;
var safe_from = safe_to = null;

//------------------------------------------------------
function Brett() {
 brett = new Array();
 for (var i=0;i<8; i++) {
  brett[i] = new Array();
  for (var j=0;j<8;j++)
   brett[i][j] = Brett.arguments[8*j+i];
 }
 brett[-2] = new Array();
 brett[-1] = new Array();
 brett[8] = new Array();
 brett[9] = new Array();
}
var brett;
Brett( 1, 0, 1, 0, 1, 0, 1, 0,
       0, 1, 0, 1, 0, 1, 0, 1,
       1, 0, 1, 0, 1, 0, 1, 0,
       0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0,
       0,-1, 0,-1, 0,-1, 0,-1,
      -1, 0,-1, 0,-1, 0,-1, 0,
       0,-1, 0,-1, 0,-1, 0,-1);
      
//------------------------------------------------------
function message(str) {
 if (!spielende)
  document.disp.message.value = str;
}

//------------------------------------------------------
function gelb_frei(i,j) {
 return (((i%2)+j)%2 == 0);
}

//------------------------------------------------------
function Pos(x,y) {
 this.x = x;
 this.y = y;
}
//------------------------------------------------------
function pos(x,y) {
 c = new Pos(x,y);
 return c;
}

//------------------------------------------------------
document.write("<table border=0 cellspacing=0 cellpadding=0 width="+(square_breite*8+8)
 +"<tr><td><img src='schwarz.gif' width="+(square_breite*8+8)
 +" height=4><br></td></tr>");
for(var j=0;j<8;j++) {
 document.write("<tr><td><img src='schwarz.gif' width=4 height="+square_breite+">");
 for(var i=0;i<8;i++) {
  if (gelb_frei(i,j))
   document.write("<a href='javascript:clicked("+i+","+j+")'>");
  document.write("<img src='");
  if (brett[i][j]==1) document.write("mensch1.gif");
  else if (brett[i][j]==-1) document.write("comp1.gif");
  else if (gelb_frei(i,j)) document.write("gelb.gif");
  else document.write("schwarz.gif");
  document.write("' width="+square_breite+" height=" + square_breite + " name='space"+i+""+j+"' border=0>");
  if (gelb_frei(i,j)) document.write("</a>");
 }
 document.write("<img src='schwarz.gif' width=4 height="+square_breite+"></td></tr>");
}
document.write("<tr><td><img src='schwarz.gif' width=" + (square_breite*8+8) +
 " height=4><br></td></tr></table><br><form name='disp'>'" +
 "<textarea name='message' wrap=virtual rows=3 cols=55></textarea><br><input " +
 "type=button value=\"Neues Spiel\" onClick=\"location.href+=''\"></form>");

//------------------------------------------------------
function clicked(i,j) {
 if (comp_dran) {
  if (integ(brett[i][j])==1) toggle(i,j);
  else if (piece_toggled) move(selected,pos(i,j));
  else message("Klicken Sie zuerst auf Ihren Stein, dann dorthin, wohin er bewegt werden soll.");
 } else {
  message("Moment, Sie sind gleich dran!");
 }
}

//------------------------------------------------------
function toggle(x,y) {
 if (comp_dran) {
  if (piece_toggled)
   draw(selected.x,selected.y,"mensch1"+((brett[selected.x][selected.y]==1.1)?"k":"")+".gif");
  if (piece_toggled && (selected.x == x) && (selected.y == y)) {
   piece_toggled = false;
   if (doppelsprung) { comp_dran = doppelsprung = false; computer(); }
  } else {
   piece_toggled = true;
   draw(x,y,"mensch2"+((brett[x][y]==1.1)?"k":"")+".gif");
  }
  selected = pos(x,y);
 } else {
  if ((piece_toggled) && (integ(brett[selected_c.x][selected_c.y])==-1))
   draw(selected_c.x,selected_c.y,"comp1"+((brett[selected_c.x][selected_c.y]==-1.1)?"k":"")+".gif");
  if (piece_toggled && (selected_c.x == x) && (selected_c.y == y)) {
   piece_toggled = false;
  } else {
   piece_toggled = true;
   draw(x,y,"comp2"+((brett[x][y]==-1.1)?"k":"")+".gif");
  }
  selected_c = pos(x,y);
 }
}

//------------------------------------------------------
function draw(x,y,name) {
 document.images["space"+x+""+y].src = name;
}

//------------------------------------------------------
function integ(num) {
 if (num != null)
  return Math.round(num);
 else
  return null;
}

//------------------------------------------------------
function abs(num) {
 return Math.abs(num);
}

//------------------------------------------------------
function sign(num) {
 if (num < 0) return -1;
 else return 1;
}

//------------------------------------------------------
function concatenate(arr1,arr2) {
 for(var i=0;i<arr2.length;i++)
  arr1[arr1.length+i] = arr2[i];
 return arr1;
}

//------------------------------------------------------
function legal_move(from,to) {
 if ((to.x < 0) || (to.y < 0) || (to.x > 7) || (to.y > 7)) return false;
 piece = brett[from.x][from.y];
 distance = pos(to.x-from.x,to.y-from.y);
 if ((distance.x == 0) || (distance.y == 0)) {
  message("Sie können die Steine nur diagonal bewegen.");
  return false;
 }
 if (abs(distance.x) != abs(distance.y)) {
  message("Ungültiger Zug.");
  return false;
 }
 if (abs(distance.x) > 2) {
  message("Ungültiger Zug.");
  return false;
 }
 if ((abs(distance.x) == 1) && doppelsprung) {
  return false;
 }
 if ((brett[to.x][to.y] != 0) || (piece == 0)) {
  return false;
 }
 if ((abs(distance.x) == 2)
 && (integ(piece) != -integ(brett[from.x+sign(distance.x)][from.y+sign(distance.y)]))) {
  return false;
 }
 if ((integ(piece) == piece) && (sign(piece) != sign(distance.y))) {
  return false;
 }
 return true;
}

//------------------------------------------------------
function move(from,to) {
 comp_dran = true;
 if (legal_move(from,to)) {
  piece = brett[from.x][from.y];
  distance = pos(to.x-from.x,to.y-from.y);
  if ((abs(distance.x) == 1) && (brett[to.x][to.y] == 0)) {
   swap(from,to);
  } else if ((abs(distance.x) == 2)
  && (integ(piece) != integ(brett[from.x+sign(distance.x)][from.y+sign(distance.y)]))) {
   doppelsprung = false;
   swap(from,to);
   remove(from.x+sign(distance.x),from.y+sign(distance.y));
   if ((legal_move(to,pos(to.x+2,to.y+2)))
   || (legal_move(to,pos(to.x+2,to.y-2)))
   || (legal_move(to,pos(to.x-2,to.y-2)))
   || (legal_move(to,pos(to.x-2,to.y+2)))) {
    doppelsprung = true;
    message("Sie müssen Ihren Doppelsprung vollenden, oder klicken Sie auf Ihren Stein, wenn er stehen bleiben soll.");
   }
  }
  if ((brett[to.x][to.y] == 1) && (to.y == 7)) king_comp(to.x,to.y);
  selected = to;
  if (game_over() && !doppelsprung) {
   setTimeout("toggle("+to.x+","+to.y+");comp_dran = doppelsprung = false;computer();",1000);
  }
 }
 return true;
}

//------------------------------------------------------
function king_comp(x,y) {
 if (brett[x][y] == 1) {
  brett[x][y] = 1.1; // Sei meine Königin
  draw(x,y,"mensch2k.gif");
 } else if (brett[x][y] == -1) {
  brett[x][y] = -1.1; // Computer ist der Herrscher aller Mächte
  draw(x,y,"comp2k.gif");
 }
}

//------------------------------------------------------
function swap(from,to) {
 if (comp_dran || comp_move) {
  dummy_src = document.images["space"+to.x+""+to.y].src;
  document.images["space"+to.x+""+to.y].src = document.images["space"+from.x+""+from.y].src;
  document.images["space"+from.x+""+from.y].src = dummy_src;
 }
 dummy_num = brett[from.x][from.y];
 brett[from.x][from.y] = brett[to.x][to.y];
 brett[to.x][to.y] = dummy_num;
}

//------------------------------------------------------
function remove(x,y) {
 if (comp_dran || comp_move)
  draw(x,y,"gelb.gif");
 brett[x][y] = 0;
}

//------------------------------------------------------
function Result(val) {
 this.high = val;
 this.dir = new Array();
}

//------------------------------------------------------
function move_comp(from,to) {
 toggle(from.x,from.y);
 comp_move = true;
 swap(from,to);
 if (abs(from.x-to.x) == 2) {
  remove(from.x+sign(to.x-from.x),from.y+sign(to.y-from.y));
 }
 if ((brett[to.x][to.y] == -1) && (to.y == 0)) king_comp(to.x,to.y);
 setTimeout("selected_c = pos("+to.x+","+to.y+");piece_toggled = true;",900);
 setTimeout("bak=comp_dran;comp_dran=false;toggle("+to.x+","+to.y+");comp_dran=bak;",1000);
 if (game_over()) {
  setTimeout("comp_move = false;comp_dran = true;",600);
  message("Sie sind an der Reihe.");
 }
 return true;
}

//------------------------------------------------------
function game_over() { // false = game over)
 comp = you = false;
 for(var i=0;i<8;i++) {
  for(var j=0;j<8;j++) {
   if(integ(brett[i][j]) == -1) comp = true;
   if(integ(brett[i][j]) == 1) you = true;
  }
 }
 if (!comp) message("Jubel. Sie haben mich besiegt!");
 if (!you) message("Höhö, ich habe gewonnen.");
 spielende = (!comp || !you)
 return (!spielende);
}

//------------------------------------------------------
var jump_priority = 10;

function computer() {
 // step one - prevent any jumps
 for(var j=0;j<8;j++) {
  for(var i=0;i<8;i++) {
   if (integ(brett[i][j]) == 1) {
    if ((legal_move(pos(i,j),pos(i+2,j+2))) && (prevent(pos(i+2,j+2),pos(i+1,j+1)))) {
     return true;
    } if ((legal_move(pos(i,j),pos(i-2,j+2))) && (prevent(pos(i-2,j+2),pos(i-1,j+1)))) {
     return true;
    }
   } if (brett[i][j] == 1.1) {
    if ((legal_move(pos(i,j),pos(i-2,j-2))) && (prevent(pos(i-2,j-2),pos(i-1,j-1)))) {
     return true;
    } if ((legal_move(pos(i,j),pos(i+2,j-2))) && (prevent(pos(i+2,j-2),pos(i+1,j-1)))) {
     return true;
    }
   }
  }
 }
 for(var j=7;j>=0;j--) {
  for(var i=0;i<8;i++) {
   if (jump(i,j))
    return true;
  }
 }
 safe_from = null;
 for(var j=0;j<8;j++) {
  for(var i=0;i<8;i++) {
   if (single(i,j))
    return true;
  }
 }
 if (safe_from != null) {
  move_comp(safe_from,safe_to);
 } else {
  message("Sie haben mich besiegt!!!");
  spielende = true;
 }
 safe_from = safe_to = null;
 return false;
}

//------------------------------------------------------
function jump(i,j) {
 if (brett[i][j] == -1.1) {  
  if (legal_move(pos(i,j),pos(i+2,j+2))) {
   move_comp(pos(i,j),pos(i+2,j+2));
   setTimeout("jump("+(i+2)+","+(j+2)+");",500);
   return true;
  } if (legal_move(pos(i,j),pos(i-2,j+2))) {
   move_comp(pos(i,j),pos(i-2,j+2));
   setTimeout("jump("+(i-2)+","+(j+2)+");",500);
   return true;
  }
 } if (integ(brett[i][j]) == -1) {
  if (legal_move(pos(i,j),pos(i-2,j-2))) {
   move_comp(pos(i,j),pos(i-2,j-2));
   setTimeout("jump("+(i-2)+","+(j-2)+");",500);
   return true;
  } if (legal_move(pos(i,j),pos(i+2,j-2))) {
   move_comp(pos(i,j),pos(i+2,j-2));
   setTimeout("jump("+(i+2)+","+(j-2)+");",500);
   return true;
  }
 }
 return false;
}

//------------------------------------------------------
function single(i,j) {
 if (brett[i][j] == -1.1) {
  if (legal_move(pos(i,j),pos(i+1,j+1))) {
   safe_from = pos(i,j);
   safe_to = pos(i+1,j+1);
   if (wise(pos(i,j),pos(i+1,j+1))) {
    move_comp(pos(i,j),pos(i+1,j+1));
    return true;
   }
  } if (legal_move(pos(i,j),pos(i-1,j+1))) {
   safe_from = pos(i,j);
   safe_to = pos(i-1,j+1);
   if (wise(pos(i,j),pos(i-1,j+1))) {
    move_comp(pos(i,j),pos(i-1,j+1));
    return true;
   }
  }
 } if (integ(brett[i][j]) == -1) {
  if (legal_move(pos(i,j),pos(i+1,j-1))) {
   safe_from = pos(i,j);
   safe_to = pos(i+1,j-1);
   if (wise(pos(i,j),pos(i+1,j-1))) {
    move_comp(pos(i,j),pos(i+1,j-1));
    return true;
   }
  } if (legal_move(pos(i,j),pos(i-1,j-1))) {
   safe_from = pos(i,j);
   safe_to = pos(i-1,j-1);
   if (wise(pos(i,j),pos(i-1,j-1))) {
    move_comp(pos(i,j),pos(i-1,j-1));
    return true;
   }
  }
 }
 return false;
}

//------------------------------------------------------
function possibilities(x,y) {
 if (!jump(x,y))
  if (!single(x,y))
   return true;
  else
   return false;
 else
  return false;
}

//------------------------------------------------------
function prevent(end,s) {
 i = end.x;
 j = end.y;
 if (!possibilities(s.x,s.y))
  return true;
 else if ((integ(brett[i-1][j+1])==-1) && (legal_move(pos(i-1,j+1),pos(i,j)))) {
   return move_comp(pos(i-1,j+1),pos(i,j));
 } else if ((integ(brett[i+1][j+1])==-1) && (legal_move(pos(i+1,j+1),pos(i,j)))) {
   return move_comp(pos(i+1,j+1),pos(i,j));
 } else if ((brett[i-1][j-1]==-1.1) && (legal_move(pos(i-1,j-1),pos(i,j)))) {
   return move_comp(pos(i-1,j-1),pos(i,j));
 } else if ((brett[i+1][j-1]==-1.1) && (legal_move(pos(i+1,j-1),pos(i,j)))) {
   return move_comp(pos(i+1,j-1),pos(i,j));
 } else {
  return false;
 }
}

//------------------------------------------------------
function wise(from,to) {
 i = to.x;
 j = to.y;
 n = (j>0);
 s = (j<7);
 e = (i<7);
 w = (i>0);
 if (n&&e) ne = brett[i+1][j-1]; else ne = null;
 if (n&&w) nw = brett[i-1][j-1]; else nw = null;
 if (s&&e) se = brett[i+1][j+1]; else se = null;
 if (s&&w) sw = brett[i-1][j+1]; else sw = null;
 eval(((j-from.y != 1)?"s":"n")+((i-from.x != 1)?"e":"w")+"=0;");
 if ((sw==0) && (integ(ne)==1)) return false;
 if ((se==0) && (integ(nw)==1)) return false;
 if ((nw==0) && (se==1.1)) return false;
 if ((ne==0) && (sw==1.1)) return false;
 return true;
}
  
message("Sie fangen an.");
comp_dran = true;
