var bCheckmate = false;
var moveEnabled = false;
var gameTimeout = false;
var gameResigned = false;
var gameDraw = false;
var gameOutOfSync = false;
var whiteTurn = false;
var inRequest = false;
var actMoveFrom;
var actMoveTo;
var tmpMoveFrom;
var tmpMoveTo;
var initialized = 0;
var gSID;
var gGameID;
var iAm;

var baseTime = 0;

function initializeGame(sid,gameID) {
    appendToIngameChatWindowInternal("myBot","Willkommen in der Partie "+gameID,0);
    appendToIngameChatWindowInternal("myBot","Gib /help für weitere Befehle ein.",0);
    appendToIngameChatWindowInternal("myBot","Synchronisiere die Partie mit dem Gegner...",0);
    var msg = $('ingamemessage');
    msg.focus();
    gSID = sid;
    gGameID = gameID;    
    window.setTimeout("gameListener('"+sid+"',"+gameID+")",1000);        
}

function gameListener(sid,gameID) {
  if(!gameOutOfSync)
  {
    var pars = 'action=get&sid='+sid+'&gameID='+gameID+'&init='+initialized+'&timestamp='+ new Date();;
    new Ajax.Request('/cgi-bin/gameGet2.pl', {
    method:'get', 
    parameters: pars, 
      onSuccess:  function( transport, json )
      {
        initialized = 1;        
        if(json.serverCommand)
        {
          manageGameServerCommands(json);
        }
      
        if(json.notice)
        {          
          appendToIngameChatWindow(json);
        } 
      
        if(json.append)
        {
          appendToIngameChatWindow(json);
        }
        
        if(json.checkmate)
        {          
          checkmate();
        } 
        
        if(json.outOfSync)
        {
          outOfSync();
        }                                          
      }
    });  
    window.setTimeout("gameListener('"+sid+"',"+gameID+")",10000);
  }
}

function manageGameServerCommands(json)
{
  if(json.serverCommand.match(/^\/updateBoard/g))
  {      
    if(json.refreshAll == 1) /* reload */ 
    {      
      if(json.fromRequest)
      {
        inRequest = false;
      }
            
      gSID =  json.sid;
      gGameID = json.gameID;

      if(json.move > 0)
      { 
        updateBoard(json);
      }

      baseTime = json.baseTime; 
      iAm = json.i_am;
      initClocks();
            
      if(json.myTurn == 1)
      {
       moveEnabled = true;
       if(iAm == "white")
       {
        whiteTurn = true;
       }
       else
       {
        whiteTurn = false;
       }
      }
      else
      {
       moveEnabled = false;
       if(iAm == "white")
       {
        whiteTurn = false;
       }
       else
       {
        whiteTurn = true;
       }
      }
      updateLiveHistoryFull(json.pgn);
      
       if(!json.fromRequest)
       {
        appendToIngameChatWindowInternal("myBot","Partie wurde erfolgreich nachgeladen.",0);
       }
       
       if(json.remis_request_to)
       {
        drawRequested();
       }
       
       if(json.remis_requester)
       {
        drawWaiting();
       }
                  
    }
    else
    {
      updateBoard(json);
      updateLiveHistoryFull(json.pgn);
      whiteTurn = !whiteTurn;
     
      if(whiteTurn && iAm == "white")
      {
        moveEnabled = true;
      }
      else if(!whiteTurn && iAm == "black")
      {
        moveEnabled = true;
      }
      else
      {
        moveEnabled = false;
      }
    }       
    updateClocks(json);
    showInCheck(json.inCheck);
    show2Move();    
  }
  else if(json.serverCommand.match(/^\/remisAccepted/g))
  {
    endGameRemis();
  }
  else if(json.serverCommand.match(/^\/startGame/g))
  {
    baseTime = json.baseTime; 
    initClocks();
    iAm = json.i_am;

    if(json.myTurn == 1)
    {
     moveEnabled = true;
     if(iAm == "white")
     {
      whiteTurn = true;
     }
     else
     {
      whiteTurn = false;
     }
    }
    else
    {
     moveEnabled = false;
     if(iAm == "white")
     {
      whiteTurn = false;
     }
     else
     {
      whiteTurn = true;
     }
    }
    updateClocks(json); 
    appendToIngameChatWindowInternal("myBot","Partie wurde erfolgreich gestartet...",0); 
  }
  else if(json.serverCommand.match(/^\/gameTimedOut/g))
  {
    moveEnabled = false;
    gameTimeout = true;
    appendToIngameChatWindowInternal("myBot",'Dieses Spiel wurde beendet. Klicken Sie <a href="/cgi-bin/schach.pl?show=live_lobby">[hier]</a> um in die Lobby zurückzukehren.',0);
    appendToIngameChatWindowInternal("myBot","In 2 Minuten werden Sie automatisch in die Lobby umgeleitet",0);
    window.setTimeout("return2Lobby()",120000);
  }
  else if(json.serverCommand.match(/^\/enemyResigned/g))
  {
    gameResigned = true;
    appendToIngameChatWindowInternal("myBot",'Ihr Gegner hat aufgegeben. Klicken Sie <a href="/cgi-bin/schach.pl?show=live_lobby">[hier]</a> um in die Lobby zurückzukehren.',0);
    appendToIngameChatWindowInternal("myBot","In 2 Minuten werden Sie automatisch in die Lobby umgeleitet",0);
    window.setTimeout("return2Lobby()",120000);
  }
  else if(json.serverCommand.match(/^\/gameResigned/g))
  {
    gameResigned = true;
    appendToIngameChatWindowInternal("myBot",'Sie haben aufgegeben. Klicken Sie <a href="/cgi-bin/schach.pl?show=live_lobby">[hier]</a> um in die Lobby zurückzukehren.',0);
    appendToIngameChatWindowInternal("myBot","In 2 Minuten werden Sie automatisch in die Lobby umgeleitet",0);
    window.setTimeout("return2Lobby()",120000);
  }
  else if(json.serverCommand.match(/^\/drawWaiting/g))
  {
    drawWaiting();
  }
  else if(json.serverCommand.match(/^\/drawRequested/g))
  {
    drawRequested();
  }
  else if(json.serverCommand.match(/^\/showPromSel/g))
  {
    showPromotionSel();
  }
  else if(json.serverCommand.match(/^\/kick/g))
  {
    window.setTimeout("return2Index()",0);
  }


}

function liveGameConnect(pars) {
  pars += '&timestamp='+ new Date();
  new Ajax.Request('/cgi-bin/gameGet2.pl', {
  method:'get', 
  parameters: pars, 
    onSuccess:  function( transport, json )
    {      
        if(json.serverCommand)
        {
          manageGameServerCommands(json);
        }
        
        appendToIngameChatWindow(json);
        
        if(json.checkmate)
        {
          checkmate();
        }                      
    }
  });
}

function submitIngameMessage(sid,gameID) {
  var msg = $('ingamemessage');
  if(msg.value != "")
  {
    if(msg.value.match(/^\/+/g)) {
      parseIngameCommand(msg.value,sid,gameID);
      msg.value = "";
      msg.focus();
    }
    else
    {  
      sendIngameMessage(msg.value,sid,gameID);
      msg.value = "";
      msg.focus();
    }
  }
}

function parseIngameCommand(cmd,sid,gameID)
{
  if(cmd.match(/^\/help/g))
  {
    appendToIngameChatWindowInternal("myBot","-------",0);
    appendToIngameChatWindowInternal("myBot","/help Ruft die Hilfe auf",0);
    appendToIngameChatWindowInternal("myBot","/update Aktualisiert die Partie",0);
    appendToIngameChatWindowInternal("myBot","/resign Partie aufgeben",0);
    appendToIngameChatWindowInternal("myBot","/draw Stellt ein Remis Angebot",0);
    appendToIngameChatWindowInternal("myBot","-------",0);  
  }
  else if(cmd.match(/^\/update/g))
  {
      var pars = 'action=updater&sid='+sid+'&gameID='+gameID;	
      liveGameConnect(pars); 
  }
  else if(cmd.match(/^\/resign/g))
  {
      var ret = confirm('Sind Sie sicher das sie Aufgeben möchten ?'); 
      if(ret)
      {
        Resign();
      }
  }
}

function sendIngameMessage(msg,sid,gameID) {
  msg = parseText(msg); 
  var pars = 'action=sendIngameMessage&msg='+msg+'&sid='+sid+'&gameID='+gameID;
  liveGameConnect(pars);
}


function appendToIngameChatWindowInternal(name,message,type)
{
  var obj = $('IngameChat');	
	if(type == 0)
	{
	 obj.innerHTML += "&lt;"+name+"&gt; "+message+"<br />";

	}
	else if(type == 1)
	{
	 obj.innerHTML += "<span class=\"redError\">&lt;myBot&gt; "+message+"</span><br />";
	 
  }
  var obj = $('pIngameChat');
	obj.scrollTop = obj.scrollHeight;	  
}

function appendToIngameChatWindow(json)
{
  if(json.error)
  {
	 var obj = $('IngameChat');
   obj.innerHTML += "<span class=\"redError\">&lt;myBot&gt; "+json.error+"</span><br />";
	}
	else if(json.notice)
  {
	 var obj = $('IngameChat');
   obj.innerHTML += "<span class=\"chatNotice\">&lt;myBot&gt; "+json.notice+"</span><br />";
	}
	else
	{
	 var obj = $('IngameChat');
	 json.append = unParseText(json.append);
	 obj.innerHTML += json.append;
	}
	var obj = $('pIngameChat');
	obj.scrollTop = obj.scrollHeight;
}

function liveMove(sid,gameID)
{
  if(!bCheckmate && moveEnabled && !gameResigned && !gameDraw)
  {
    var from = $('moveFrom');
    var to = $('moveTo');
      
    if(from != "" && to != "")
    {
      var pars = 'action=liveMove&moveFrom='+from.value+'&moveTo='+to.value+'&sid='+sid+'&gameID='+gameID;
      liveGameConnect(pars);
    }
    actMoveFrom = from.value;
    actMoveTo = to.value;
           
    from.value = "";
    to.value = "";    
  }
  else
  {
    if(bCheckmate || gameResigned || gameDraw)
    {
      appendToIngameChatWindowInternal("myBot","Diese Partie ist beendet.",1);
    }
    else
    {
      appendToIngameChatWindowInternal("myBot","Sie sind nicht an der Reihe.",1);
    }
     
  }
}

function updateLiveHistoryFull(pgn)
{
  var length = pgn.length;
  var pgntable;
  var j = 1; 
  pgntable = '<table>';
  for(var i = 0;i < length;i++)
  {   
    if(i & 1)
    {
      pgntable += '<td class="livehistblack">'+pgn[i]+'</td></tr>';
    }
    else
    {
      pgntable += '<tr><td>'+j+'</td><td class="livehistwhite">'+pgn[i]+'</td>';
      j++;
    }
    
  }
  var obj = $('liveHistory');
  obj.innerHTML = pgntable;
  
  obj = $('livepgnbox');
  obj.scrollTop = obj.scrollHeight; 
}

function checkmate()
{
  bCheckmate = true;
  
  appendToIngameChatWindowInternal("myBot",'Schachmatt. Klicken Sie <a href="/cgi-bin/schach.pl?show=live_lobby">[hier]</a> um in die Lobby zurückzukehren.',0);
  appendToIngameChatWindowInternal("myBot","In 2 Minuten werden Sie automatisch in die Lobby umgeleitet",0);
  window.setTimeout("return2Lobby()",120000);  
  
}

function outOfSync()
{
  gameOutOfSync = true;
  
  appendToIngameChatWindowInternal("myBot",'Ihr Gegner konnte nicht synchronisiert werden, sie haben gewonnen. Klicken Sie <a href="/cgi-bin/schach.pl?show=live_lobby">[hier]</a> um in die Lobby zurückzukehren.',0);
  appendToIngameChatWindowInternal("myBot","In 2 Minuten werden Sie automatisch in die Lobby umgeleitet",0);
  window.setTimeout("return2Lobby()",120000);  
}

function parseText(text)
{
  text = text.replace(/\?/g,"QUEST");
  text = text.replace(/%/g,"PERCENT");
  return text;
}

function unParseText(text)
{
  text = text.replace(/QUEST/g,"?");
  text = text.replace(/PERCENT/g,"%");
  return text;
}

function submitMessageResign() 
{
  var ret = confirm('Sind Sie sicher das sie Aufgeben möchten ?'); 
  if(ret)
  {
    Resign();
  }
}

function Resign()
{
  var pars = 'action=resignGame&sid='+gSID+'&gameID='+gGameID;
  liveGameConnect(pars);
}

/* clocks */

function initClocks()
{
  	var obj = $('lwc');
    obj.innerHTML = (baseTime /60) + ":00";
    
    var obj2 = $('lbc');
    obj2.innerHTML = (baseTime /60) + ":00";
}              

function updateClocks(json)
{
  if(json.refreshAll)
  {
    var absSeconds = baseTime - json.wTime;
  	var relSeconds = absSeconds % 60;
  	var absMinutes = Math.abs(Math.round((absSeconds - 30)/60));
  	var coSeconds ="" + ((relSeconds > 9) ? relSeconds : "0" + relSeconds);
  	var coMinutes ="" + ((absMinutes > 9) ? absMinutes : "0" + absMinutes);
  	var obj = $('lwc');
    obj.innerHTML = coMinutes + ":" + coSeconds;
  
    absSeconds = baseTime - json.bTime;
  	relSeconds = absSeconds % 60;
  	absMinutes = Math.abs(Math.round((absSeconds - 30)/60));
  	coSeconds ="" + ((relSeconds > 9) ? relSeconds : "0" + relSeconds);
  	coMinutes ="" + ((absMinutes > 9) ? absMinutes : "0" + absMinutes);
  	obj = $('lbc');
    obj.innerHTML = coMinutes + ":" + coSeconds;
  }
  
  if(whiteTurn)
  {
    startTimerWhite(json.wTime);
  }
  else
  {
    startTimerBlack(json.bTime);
  }
}

function startTimerWhite(time) {

  if(!gameOutOfSync && !bCheckmate && !gameResigned && !inRequest && !gameDraw && !gameTimeout)
  {
  	if(baseTime == time) { 
      return false;
    }
  	
  	time++;  	
  	var absSeconds = baseTime - time;
  	var relSeconds = absSeconds % 60;
  	var absMinutes = Math.abs(Math.round((absSeconds - 30)/60));
  	var coSeconds ="" + ((relSeconds > 9) ? relSeconds : "0" + relSeconds);
  	var coMinutes ="" + ((absMinutes > 9) ? absMinutes : "0" + absMinutes);
  	

 	  var obj = $('lwc');
    obj.innerHTML = coMinutes + ":" + coSeconds;
  	if(whiteTurn)
    {
  	 window.setTimeout('startTimerWhite('+time+')',1000);
    }
  }
}

function startTimerBlack(time) {

  if(!gameOutOfSync && !bCheckmate && !gameResigned && !inRequest && !gameDraw && !gameTimeout)
  {
  	if(baseTime == time) { 
      return false;
    }
  	
  	time++;  	
  	var absSeconds = baseTime - time;
  	var relSeconds = absSeconds % 60;
  	var absMinutes = Math.abs(Math.round((absSeconds - 30)/60));
  	var coSeconds ="" + ((relSeconds > 9) ? relSeconds : "0" + relSeconds);
  	var coMinutes ="" + ((absMinutes > 9) ? absMinutes : "0" + absMinutes);
  	
	  var obj = $('lbc');
    obj.innerHTML = coMinutes + ":" + coSeconds; 
    if(!whiteTurn)
    {	
  	 window.setTimeout('startTimerBlack('+time+')',1000);
  	}
  }
}

function return2Lobby()
{
  window.location = "/cgi-bin/schach.pl?show=live_lobby";
}

function return2Index()
{
  window.location = "/cgi-bin/schach.pl?show=index";
}

function showInCheck(inCheck)
{
  if(inCheck == 1)
  {
    var obj = $('inCheck');
    obj.innerHTML = "Schach";
  }
  else
  {
    var obj = $('inCheck');
    obj.innerHTML = "";     
  }    
}

function show2Move()
{
  var obj;
  if(moveEnabled)
  {
    obj = $('p2move');
    obj.innerHTML = "Ich bin am Zug";     
  }
  else
  {
    var obj = $('p2move');
    obj.innerHTML = "";    
  }    
}

function drawWaiting()
{
    moveEnabled = false;
    inRequest = true;
    appendToIngameChatWindowInternal("myBot","Ihr Gegner hat 2 Minuten Zeit Ihre Anfrage zu beantworten. Das Spiel wurde angehalten.",0);
}

function drawRequested()
{
    moveEnabled = false;
    inRequest = true;
    appendToIngameChatWindowInternal("myBot","Ihr bietet Ihnen ein Remis an. Sie haben maximal 2 Minuten Zeit diese Anfrage zu beantworten. Die Partie wurde angehalten. Wollen Sie dieses annehmen ? <a href=\"#\" onclick=\"javascript:acceptDraw();\">Annehmen</a>&nbsp;<a href=\"#\" onclick=\"javascript:declineDraw();\">Ablehnen</a>",1); 
}

function declineDraw() 
{
    var pars = 'action=answerRemis&sid='+gSID+'&gameID='+gGameID+'&remis=0';      
    liveGameConnect(pars); 
}

function acceptDraw() 
{
    var pars = 'action=answerRemis&sid='+gSID+'&gameID='+gGameID+'&remis=1';      
    liveGameConnect(pars);  
}

function endGameRemis()
{
  gameDraw = true;
  
  appendToIngameChatWindowInternal("myBot",'Partie ended Remis. Klicken Sie <a href="/cgi-bin/schach.pl?show=live_lobby">[hier]</a> um in die Lobby zurückzukehren.',0);
  appendToIngameChatWindowInternal("myBot","In 2 Minuten werden Sie automatisch in die Lobby umgeleitet",0);
  window.setTimeout("return2Lobby()",120000); 
}

function remis()
{
  if(moveEnabled)
  {
    var ret = confirm('Sind Sie sicher das sie ein Remis anbieten möchten ?'); 
    if(ret)
    {
      var pars = 'action=offerRemis&sid='+gSID+'&gameID='+gGameID;      
      liveGameConnect(pars); 
    }
  }
  else
  {
    appendToIngameChatWindowInternal("myBot","Sie können nur ein Remis Angebot stellen, wenn Sie an der Reihe sind.",1);
  }
}

function reloadBoard()
{
  initialized = 0;
}

function showPromotionSel()
{
  appendToIngameChatWindowInternal("myBot","Dieser Zug hat eine Bauernumwandlung zur Folge,bitte wählen Sie in welche Figur Ihr Bauer umgewandelt werden soll: <a href=\"#\" onclick=\"javascript:selectPromPiece(1);\">Dame</a>&nbsp;<a href=\"#\" onclick=\"javascript:selectPromPiece(2);\">Turm</a>&nbsp;<a href=\"#\" onclick=\"javascript:selectPromPiece(3);\">Springer</a>&nbsp;<a href=\"#\" onclick=\"javascript:selectPromPiece(4);\">Läufer</a>&nbsp;",1);
}

function selectPromPiece(piece)
{
  var pars = 'action=liveMove&moveFrom='+actMoveFrom+'&moveTo='+actMoveTo+'&sid='+gSID+'&gameID='+gGameID+'&prompiece='+piece;
  liveGameConnect(pars);  
}

function selectPieceLive(piece)
{
  var obj;
  
  if(moveEnabled)
  {
    obj = $(piece);

    if(tmpMoveFrom)
    {
      if(piece == tmpMoveFrom)
      {
        tmpMoveFrom = '';
        obj = $(piece);
        obj.border = 0;    
      }
      else
      {
        tmpMoveTo = piece;
        obj = $(piece);
        obj.border = 1;
        actMoveFrom = tmpMoveFrom;
        actMoveTo = tmpMoveTo;
            
        var pars = 'action=liveMove&moveFrom='+actMoveFrom+'&moveTo='+actMoveTo+'&sid='+gSID+'&gameID='+gGameID;
        liveGameConnect(pars);
        
        obj = $(tmpMoveTo);
        obj.border = 0;
        
        obj = $(tmpMoveFrom);
        obj.border = 0;
        
        tmpMoveFrom = '';
        tmpMoveTo = '';           
      }  
    }
    else
    {
      if((iAm == "white" && obj.src.match(/white/g)) || (iAm == "black" && obj.src.match(/black/g)))
      {   
        tmpMoveFrom = piece;
        obj = $(piece);
        obj.border = 1;
      }      
    }
  }
}
