var serverResponseTime = 0;

function jsError(err){
	alert('Na stránce došlo k chybě. Z tohoto důvodu bude nově načtena.');
	window.location.reload(0);
}

function get_cookie(name)
{
    var all_cookies = document.cookie;
    var start;
    var end;
    
    if (name == undefined || typeof(name) != typeof('') || name == '') return '';
    start = all_cookies.indexOf(name+'=');
    if (start == -1) return '';
    start += name.length+1
    end = all_cookies.indexOf(';', start);
    if (end == -1) end = all_cookies.length;
    
    return all_cookies.substring(start, end);
}

function set_cookie(name, value)
{
    document.cookie = name+'='+value;
    return;
}

function page_alert(message)
{
    document.getElementById('alert-message').innerHTML = message;
    document.getElementById('alert-window').style.display = 'block';
}

function redraw_token_pieces(color){
	try{
		var pieces = get_cookie(color+'_token');
		var pieces_array = new Array('','pawn','knight','bishop','rook','queen','king');
		var len = pieces.length;
		document.getElementById(color+'_token').innerHTML = '';
		for (var i=0;i<len;i++)
		{
			document.getElementById(color+'_token').innerHTML += '<img src="images/game/'+color+'/'+pieces_array[Number(pieces.substr(i,1))]+'.png" alt="" />';
		}
		var height = Math.ceil(len/5)*34;
		if (!height) height = 34;
		if(height>68){ height = 68; }
	    document.getElementById(color+'_token').style.height = String(height)+'px';
	}catch(err){
		jsError(err);
	}
}

function displayDecTime(){
	try{
		if (current_player == 'x') return;
		if (player_times[current_player] == 0) return;
		player_times[current_player]--;
		var time_date = new Date(player_times[current_player]*1000);
		var hours = String(time_date.getUTCHours()); if (time_date.getUTCHours()<10) hours = '0'+hours;
		var minutes = String(time_date.getUTCMinutes()); if (time_date.getUTCMinutes()<10) minutes = '0'+minutes;
		var seconds = String(time_date.getUTCSeconds()); if (time_date.getUTCSeconds()<10) seconds = '0'+seconds;
		document.getElementById(current_player+'Time').innerHTML = hours+':'+minutes+':'+seconds;
		if (player_times[current_player] == 0){
			fill_playing_game_info(current_game);
		}
	}catch(err){
		jsError(err);
	}
}

function draw_board(board){
	try{
		var letters = new Array('a','b','c','d','e','f','g','h');
		var pieces = new Array('','pawn','knight','bishop','rook','queen','king');
		var src;
		var current_piece;
		var current_id;
		//var token_piece;
		var token_color;
		
		for (var i=0;i<8;i++)
			for (var j=0;j<8;j++)
			{ // pole je po sloupcich - j je cislo radku, i je cislo sloupce
				src = 'images/game/';
				current_piece = board[i][j]&7;
				current_color = board[i][j]&192;
				if (current_color == 128)
					src += 'black/';
				else
					src += 'white/';
				src += pieces[current_piece]+'.png';
				current_id = letters[i]+String(8-j);
				if (current_piece)
					document.getElementById(current_id).innerHTML = '<img src="'+src+'" alt="" />';
				else
					document.getElementById(current_id).innerHTML = '';
			}
			
	}catch(err){
		jsError(err);
	}
}

function show_warning(text){
	try{
		var el = document.getElementById('chessNote');
		if (!el || el == undefined) return;
		el.innerHTML = text;
		el.style.visibility = 'visible';
	}catch(err){
		jsError(err);
	}
}

function hide_warning(){
	try{
		var el = document.getElementById('chessNote');
		if (!el || el == undefined) return;
		el.style.visibility = 'hidden';
	}catch(err){
		jsError(err);
	}
}

function blank_handler(ajax_obj)
{
    return;
}

function login_handler(ajax_obj){
	try{
		if (!ajax_obj || !ajax_obj.xml)
		{
			// chyba odpovedi od serveru
			page_alert('Chybné přihlášení');
		}
		else
		{
			//alert(ajax_obj.xml);
			//return;
			var xmldoc = xmlParse(ajax_obj.xml);
			var rootNode = xmldoc.getNextChild('methodResponse').getNextChild('params');
			if (rootNode != null)
			{
				rootNode = rootNode.getNextChild('param').getNextChild('value').getNextChild('int');
				if (rootNode.childNodes[0].nodeValue == '0')
				{
					if (document.getElementById('rememberMe').checked)
					{
						var date = new Date();
						date.setTime(date.getTime()+(31*24*60*60*1000));
						set_cookie('login',document.getElementById('loginInput').value+'; expires='+date.toGMTString()+'; path=/');
						set_cookie('password',document.getElementById('passwordInput').value+'; expires='+date.toGMTString()+'; path=/');
						set_cookie('logged_in','true'+'; expires='+date.toGMTString()+'; path=/');
					}
					else
						set_cookie('logged_in','true');
					reload_page(ajax_obj);
				}
				else
				{
					page_alert('Chybné přihlášení. Dejte si pozor na velikost písmen!');
				}
			}
		}
		
	}catch(err){
		jsError(err);
	}
}

function echo_answer(ajax_obj)
{
    page_alert(ajax_obj.xml);
}

function clicked(cell)
{
    if (!move_allowed) return;
    if ((my_side == 'white' && current_player != 'w') || (my_side == 'black' && current_player != 'b')) return;
    // test, jestli e na danem policku obrazek a jestli je to obrazek bile figurky
    if (selected_piece != '')
    { // toto je druhe kliknuti - odeslat pozadavek
        if (cell.id != selected_piece)
        { // byl proveden pozadavek na tah (nebylo kliknuto na stejne policko dvakrat)
            //token_piece = document.getElementById(cell.id).innerHTML;
            var msg = new XMLRPCMessage('chess.move');
            msg.addParameter(current_game);
            msg.addParameter(selected_piece);
            msg.addParameter(cell.id);
            
            //alert(msg.xml());
            a = new ajax(rpc_url);
            a.send_request(msg.xml(),fill_after_move);
        }
        document.getElementById(selected_piece).style.backgroundColor = '';
        selected_piece = '';
    }
    else
    {
        if (cell.firstChild && cell.firstChild.tagName.toLowerCase() == 'img' && cell.firstChild.src.search(my_side) != -1)
        {
            selected_piece = cell.id;
            cell.style.backgroundColor = '#ffd2d2';
        }
    }
}

function game_list(ajax_obj)
{
    document.location.href = '?action=games';
    //document.location.reload(true);
}

function reload_page(ajax_obj)
{
    document.location.href = '?action=index';
    //document.location.reload(true);
}

function fill_joined_game_info(ajax_obj){
	try{
		var code;
		var response;
		var variables = new Array();
		if (!ajax_obj || !ajax_obj.xml)
		{
			// chyba odpovedi od serveru
		}
		else
		{
			//alert(ajax_obj.xml);
			var xmldoc = xmlParse(ajax_obj.xml);
			var rootNode = xmldoc.getNextChild('methodResponse').getNextChild('params');
			if (rootNode == null)
			{
				// doslo k nejake chybe
				//                         methodResponse      ->        fault       ->    value   ->    struct
				rootNode = xmldoc.getNextChild('methodResponse').getNextChild('fault').childNodes[0].childNodes[0];
				// zjistit, jestli hra existuje - pokud ne, prepnout na seznam her s alertem, ze hra byla ukoncena
				if (rootNode.childNodes[0].getNextChild('name').nodeValue == 'faultCode')
				{
					code = rootNode.childNodes[0].getNextChild('value').childNodes[0].nodeValue;
					response = rootNode.childNodes[1].getNextChild('value').childNodes[0].nodeValue;
				}
				else
				{
					code = rootNode.childNodes[1].getNextChild('value').childNodes[0].nodeValue;
					response = rootNode.childNodes[0].getNextChild('value').childNodes[0].nodeValue;
				}
				page_alert('Došlo k chybě: '+response);
			}
			else
			{ // rootNode == params    param         value         struct
				rootNode = rootNode.getNextChild('param').getNextChild('value').getNextChild('struct');
				// test na neexistujici hru je vyse
				var valueName;
				var valueValue;
				var len = rootNode.childNodes.length;
				for (var i=0;i<len;i++)
				{
					//alert(rootNode.childNodes[i].nodeName);
					if (rootNode.childNodes[i].nodeName == '#text') continue;
					valueName = rootNode.childNodes[i].getNextChild('name').childNodes[0].nodeValue;
					switch (valueName)
					{
						case 'created':
						case 'time': variables[valueName] = rootNode.childNodes[i].getNextChild('value').getNextChild('int').childNodes[0].nodeValue; break;
						case 'oponent_connected':
						case 'joined_ready': variables[valueName] = rootNode.childNodes[i].getNextChild('value').getNextChild('boolean').childNodes[0].nodeValue; break;
						case 'created_by':
						case 'state':
						case 'black':
						case 'white':
						case 'whoami':
							valueValue = rootNode.childNodes[i].getNextChild('value').getNextChild('string').childNodes[0];
							if (valueValue == undefined) variables[valueName] = '';
							else variables[valueName] = rootNode.childNodes[i].getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
							break;
					}
				}
				// kdyz jsem pripojeny hrac, zajima me jestli hra jiz nezacala, pripadne jestli zakladatel hru nezrusil
				// kdyz jsem zakladajici hrac, zajima me: jestli se nekdo pripojil, jestli je pripojeny clovek pripraven
				// nejdrive asi otestovat state (pripojeny hrac). Pokud nebude waiting, tak prepnout na hru samotnou.
				// 
				if (variables['state'] == 'canceled')
				{
					if (variables['whoami'] == variables['created_by'])
						page_alert('Vyzvaný hráč odmítl výzvu!');
					else
						page_alert('Zakladatel hru ukončil!');
					window.location.href = '?action=index';
					return;
				}
				if (variables['created_by'] == variables['whoami'])
				{
					var pos = window.location.search.search('game=');
					var searchStr = window.location.search.substr(pos);
					pos = searchStr.search(new RegExp('&'));
					var address = '?action=game&';
					if (pos!=-1) address += searchStr.substr(0,pos);
					else address += searchStr;
					if (variables['joined_ready'] == '1')
						document.getElementById('startGame').innerHTML = '<button type="button" onclick="window.location.href=\''+address+'\'">Spustit hru</button>';
					document.getElementById('blackPlayerLogin').innerHTML = variables['black'];
					document.getElementById('whitePlayerLogin').innerHTML = variables['white'];
				}
				else
				{ // pripojeny hrac - test, zda hra nezacala
					if (variables['oponent_connected'] == '1')
					{
						var pos = window.location.search.search('game=');
						var searchStr = window.location.search.substr(pos);
						pos = searchStr.search(new RegExp('&'));
						var address = '?action=game&';
						if (pos!=-1) address += searchStr.substr(0,pos);
						else address += searchStr;
						window.location.href = address;
					}
				}
			}
		}
		
	}catch(err){
		jsError(err);
	}
}

function fill_playing_game_info(ajax_obj){
	try{
		var code;
		var response;
		var variables = new Array();
		if (!ajax_obj || !ajax_obj.xml)
		{
			// chyba odpovedi od serveru
		}
		else
		{
			//alert(ajax_obj.xml);
			var xmldoc = xmlParse(ajax_obj.xml);
			var rootNode = xmldoc.getNextChild('methodResponse').getNextChild('params');
			if (rootNode == null)
			{
				// doslo k nejake chybe, napriklad byla ukoncena hra
				//                         methodResponse      ->        fault       ->    value   ->    struct
				rootNode = xmldoc.getNextChild('methodResponse').getNextChild('fault').getNextChild('value').getNextChild('struct');
				// zjistit, jestli hra existuje - pokud ne, prepnout na seznam her s alertem, ze hra byla ukoncena
				var firstPos = rootNode.getNextChildPos('member');
				if (rootNode.childNodes[firstPos].getNextChild('name').nodeValue == 'faultCode')
				{
					//code = rootNode.childNodes[firstPos].getNextChild('value').childNodes[0].nodeValue;
					response = rootNode.getNextChild('member',firstPos).getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
				}
				else
				{
					//code = rootNode.getNextChild('member',firstPos).getNextChild('value').childNodes[0].nodeValue;
					response = rootNode.childNodes[firstPos].getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
				}
				move_allowed = false;
				page_alert('Došlo k chybě: '+response);
			}
			else
			{ // rootNode == params    param         value         struct
				rootNode = rootNode.getNextChild('param').getNextChild('value').getNextChild('struct');
				// test na neexistujici hru je vyse
				var valueName;
				var valueValue;
				var len = rootNode.childNodes.length;
				
				
				// NEW - DS
				var isTrue = false;
				for (var i=0;i<len;i++){
					if(rootNode.childNodes[i].nodeName != '#text'){
						
						if(rootNode.childNodes[i].getNextChild('name').childNodes[0].nodeValue == "response_time"){
							if(serverResponseTime > rootNode.childNodes[i].getNextChild('value').getNextChild('int').childNodes[0].nodeValue*1){
								//alert('Špatný čas server - testování');
								isTrue = false;
							}else{
								isTrue = true;
								serverResponseTime = rootNode.childNodes[i].getNextChild('value').getNextChild('int').childNodes[0].nodeValue*1;
							}
						}
						
					}
				}
				// END OD NEW
	// --		
	if(isTrue){
	// --
				for (var i=0;i<len;i++)
				{
					//alert(rootNode.childNodes[i].nodeName);
					if (rootNode.childNodes[i].nodeName == '#text') continue;
					valueName = rootNode.childNodes[i].getNextChild('name').childNodes[0].nodeValue;
					switch (valueName)
					{
						case 'w_time':
						case 'b_time': variables[valueName] = rootNode.childNodes[i].getNextChild('value').getNextChild('int').childNodes[0].nodeValue; break;
						case 'w_connected':
						case 'b_connected': variables[valueName] = rootNode.childNodes[i].getNextChild('value').getNextChild('boolean').childNodes[0].nodeValue; break;
						case 'state':
						case 'b_player':
						case 'w_player':
						case 'current_player':
						case 'whoami':
						case 'draw_offered_by':
							valueValue = rootNode.childNodes[i].getNextChild('value').getNextChild('string').childNodes[0];
							if (valueValue == undefined) variables[valueName] = '';
							else variables[valueName] = rootNode.childNodes[i].getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
							break;
						case 'board':
							variables['board'] = unserialize(rootNode.childNodes[i].getNextChild('value').getNextChild('string').childNodes[0].nodeValue);
							// board_orig je pro porovnani s predchozim stavem hry
							variables['board_orig'] = rootNode.childNodes[i].getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
							break;
					}
				}
				// pripad ukonceni hry je osetren vyse
				// Testovat, zda jsem ja jeden z hracu ve hre. Pokud ne, tak nic nedelat!
				if (variables['w_player'] != variables['whoami'] && variables['b_player'] != variables['whoami']) return;
				// pokud nejsou oba hrai pripojeni, nedela se nic - tento stav muze nastat jen ze zacatku hry
				if ((variables['w_connected'] == '0' || variables['b_connected'] == '0') && variables['state'] == 'waiting') return;
				// pokud je state waiting, nekde nad hraci plochou vykreslit hlasku, ze se ceka na zahajeni hry bilym hracem
				// - muze nastat jen pokud jsou oba hraci pripojeni, ale bily jeste netahnul
				// pokud je state draw_offered, draw_accepted, checkmate nebo stalemate, vykresli nejakou hlasku
				switch (variables['state'])
				{
					case 'waiting':
						show_warning('Bílý hráč na tahu!');
						var style = document.getElementById('chessGame').style;
						if (!style || !style.display || style.display == 'none')
							if (browser == 'IE')
								style.display = '';
							else
								style.display = 'table';
						break;
					case 'check': /* pokud jsem na tahu já, zobrazit varování, že jsem v šachu */
						if (variables['current_player'] == 'w' && variables['w_player'] == variables['whoami'] ||
							variables['current_player'] == 'b' && variables['b_player'] == variables['whoami'])
							show_warning('Šach!');
						// break; - umyslne zakomentovano, potrebujeme jeste nastavit hodiny
					case 'started':
						if (!clock_ticking && variables['current_player'] == 'b')
						{ // po prvnim  reloadu spustime hodiny, pokud uz byla hra zapocata
							time_interval = window.setInterval(displayDecTime,1000);
							clock_ticking = true;
						}
						break;
					case 'draw_offered':
						if (variables['draw_offered_by'] != variables['whoami'])
							show_warning('Byla Vám nabídnuta remíza. <button type="button" onclick="accept_draw()">Přijmout</button>'); 
						break;
					case 'draw_accepted':
							page_alert('Byla dohodnuta remíza! Konec hry!');
							move_allowed = false;
							window.clearInterval(time_interval);
							window.clearInterval(refresh_interval);
						return;
					
					case 'checkmate': /* zobrazit šach-mat (ten, kdo je na řadě, prohrává) */
						var message;
						if ((variables['current_player'] == 'w' && my_side == 'white') ||
							(variables['current_player'] == 'b' && my_side == 'black'))
							message = 'Prohrál jste';
						else
							message = 'Vyhrál jste';
							
						if (variables['b_time'] == '0' || variables['w_time'] == '0'){
							message += ' na čas!';
							displayDecTime();
						}else if(variables['w_connected'] == '0' || variables['b_connected'] == '0'){
							if ((variables['w_connected'] == '0' && my_side == 'white') ||
								(variables['b_connected'] == '0' && my_side == 'black'))
								message += '! Odpojil jste se.';
							else
								message += '! Protihráč se odpojil.';
						}else{
							message = 'Šach Mat! '+message+'.';
						}
						page_alert(message);
						
						move_allowed = false;
						window.clearInterval(time_interval);
						window.clearInterval(refresh_interval);
						break;
					case 'stalemate': /* zobrazit pat */
						move_allowed = false;
						page_alert('PAT');
						window.clearInterval(time_interval);
						window.clearInterval(refresh_interval);
						break;
					case 'canceled':
						//page_alert('Váš soupeř opustil hru!');
						if ((variables['w_connected'] == '0' && my_side == 'white') || (variables['b_connected'] == '0' && my_side == 'black'))
							page_alert('Opustil jste hru!');
						else
							page_alert('Váš soupeř opustil hru!');
								
						window.location.href = '?action=index';
						return;
				}
				current_player = variables['current_player'];
				move_allowed = true;
				player_times['b'] = variables['b_time'];
				player_times['w'] = variables['w_time'];
				if (current_player != 'x')
				{ // zde jen drobna korekce hodin
					var prevPlayer = (current_player == 'w')?'b':'w';
					var time_date = new Date(player_times[prevPlayer]*1000);
					var hours = String(time_date.getUTCHours()); if (time_date.getUTCHours()<10) hours = '0'+hours;
					var minutes = String(time_date.getUTCMinutes()); if (time_date.getUTCMinutes()<10) minutes = '0'+minutes;
					var seconds = String(time_date.getUTCSeconds()); if (time_date.getUTCSeconds()<10) seconds = '0'+seconds;
					document.getElementById(prevPlayer+'Time').innerHTML = hours+':'+minutes+':'+seconds;
					document.getElementById(prevPlayer+'Time').style.color = '#000000';
					document.getElementById(current_player+'Time').style.color = '#FF0000';
					//document.getElementById(prevPlayer+'Time').innerHTML = String(time_date.getUTCHours())+':'+String(time_date.getUTCMinutes())+':'+String(time_date.getUTCSeconds());
				}
				// pokud se stav hry lisi od predchoziho, prijde prekreslit plocha
				if (previous_board != variables['board_orig'])
				{
					ds_upozorni(current_player);
					
					var prBoard = unserialize(previous_board);
					var curBoard = unserialize(variables['board_orig']);
					var i, j;
					var prevPiece, curPiece;
					var letters = new Array('a','b','c','d','e','f','g','h');
					var elStyle;
					var elStyleSpace;
					var zapsano = false;
					for (i=0;i<8;i++)
						for (j=0;j<8;j++)
						{
							prevPiece = Number(prBoard[i][j]);
							curPiece = Number(curBoard[i][j]);
							
					
							if(prBoard[i][j] !=0 && i+1<8 && prBoard[i+1][j] != 0 && curBoard[i][j]!=prBoard[i][j] && curBoard[i+1][j]!=prBoard[i+1][j] && String(prevPiece&7)=="1"){
								// Potencionální en passant (braní mimochodem)
								var token_color = my_side;
								if(zapsano == false){
									set_cookie(token_color+'_token',get_cookie(token_color+'_token')+String((prevPiece&7)));
									zapsano = true;
								}
								redraw_token_pieces(token_color);
							}
							
							if (prevPiece != curPiece) // nastavit aktivni konturu
								document.getElementById(letters[i]+String(8-j)).className += " active";
							if (prevPiece != curPiece && prevPiece != 0 && curPiece != 0)
							{ // prave mame nalezene policko, kde doslo k vyhozeni
								var token_color = ((prevPiece&192) == 64)?'white':'black';
								if(zapsano == false){
									set_cookie(token_color+'_token',get_cookie(token_color+'_token')+String((prevPiece&7)));
									zapsano = true;
								}
								redraw_token_pieces(token_color);
							}
						}
					draw_board(variables['board']);
					previous_board = variables['board_orig'];
				}
			}
	// --    
	}
	// --
		}


	}catch(err){
		jsError(err);
	}
}

function fill_after_move(ajax_obj){
	try{
		hide_warning();
		var code;
		var response;
		var variables = new Array();
		if (!ajax_obj || !ajax_obj.xml)
		{
			// chyba odpovedi od serveru
		}
		else
		{
			//alert(ajax_obj.xml);
			//return;
			var xmldoc = xmlParse(ajax_obj.xml);
			var rootNode = xmldoc.getNextChild('methodResponse').getNextChild('params');
			if (rootNode == null)
			{
				// doslo k nejake chybe, napriklad byla ukoncena hra
				//                         methodResponse      ->        fault       ->    value   ->    struct
				rootNode = xmldoc.getNextChild('methodResponse').getNextChild('fault').getNextChild('value').getNextChild('struct');
				// zjistit, jestli hra existuje - pokud ne, prepnout na seznam her s alertem, ze hra byla ukoncena
				var firstPos = rootNode.getNextChildPos('member');
				if (rootNode.childNodes[firstPos].getNextChild('name').nodeValue == 'faultCode')
				{
					//code = rootNode.childNodes[firstPos].getNextChild('value').childNodes[0].nodeValue;
					response = rootNode.getNextChild('member',firstPos).getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
				}
				else
				{
					//code = rootNode.getNextChild('member',firstPos).getNextChild('value').childNodes[0].nodeValue;
					response = rootNode.childNodes[firstPos].getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
				}
				move_allowed = false;
				page_alert('Došlo k chybě: '+response);
			}
			else
			{ // rootNode == params    param         value         struct
				rootNode = rootNode.getNextChild('param').getNextChild('value').getNextChild('struct');
				// test na neexistujici hru je vyse
				var valueName;
				var valueValue;
				var len = rootNode.childNodes.length;
				for (var i=0;i<len;i++)
				{
					//alert(rootNode.childNodes[i].nodeName);
					if (rootNode.childNodes[i].nodeName == '#text') continue;
					valueName = rootNode.childNodes[i].getNextChild('name').childNodes[0].nodeValue;
					switch (valueName)
					{
						case 'w_time':
						case 'b_time': variables[valueName] = rootNode.childNodes[i].getNextChild('value').getNextChild('int').childNodes[0].nodeValue; break;
						case 'move_correct': variables[valueName] = rootNode.childNodes[i].getNextChild('value').getNextChild('boolean').childNodes[0].nodeValue; break;
						case 'state':
						case 'draw_offered_by':
						case 'whoami':
							valueValue = rootNode.childNodes[i].getNextChild('value').getNextChild('string').childNodes[0];
							if (valueValue == undefined) variables[valueName] = '';
							else variables[valueName] = rootNode.childNodes[i].getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
							break;
						case 'board':
							variables['board'] = unserialize(rootNode.childNodes[i].getNextChild('value').getNextChild('string').childNodes[0].nodeValue);
							// board_orig je pro porovnani s predchozim stavem hry
							variables['board_orig'] = rootNode.childNodes[i].getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
							break;
					}
				}
				if (variables['move_correct'] == '0')
				{
					//page_alert('Nesprávný tah!');
					show_warning('Nesprávný tah!');
					// setTimeout("document.getElementById('alert-window').style.display = 'none';",2000);
					return;
				}
				else
					hide_warning();
				// pokud je state draw_offered, draw_accepted, checkmate nebo stalemate, vykresli nejakou hlasku
				switch (variables['state'])
				{
					case 'draw_offered':
						if (variables['draw_offered_by'] != variables['whoami'])
							show_warning('Byla Vám nabídnuta remíza. <button type="button" onclick="accept_draw()">Přijmout</button>'); 
					case 'check': // na tahu je protihrac, nemusim nic signalizovat
					case 'started':
						if (!clock_ticking)
						{ // po prvnim tahu (resp. reloadu) spustime hodiny
							time_interval = window.setInterval(displayDecTime,1000);
							clock_ticking = true;
						}
						break;
					case 'draw_accepted':
							page_alert('Byla dohodnuta remíza! Konec hry!');
							move_allowed = false;
							window.clearInterval(time_interval);
							window.clearInterval(refresh_interval);
						return;
					case 'checkmate': /* zobrazit šach-mat (ten, kdo je na řadě, prohrává) */
						// zde by mel ten, kdo tahnul, vzdy vyhrat, jelikoz nejsou povoleny tahy, kterymi by se hrac dostal do sachu
						if (variables['b_time'] == '0' || variables['w_time'] == '0')
							page_alert('Vyhrál jste na čas!');
						else if (variables['b_connected'] == '0' || variables['w_connected'] == '0')
							page_alert('Vyhrál jste! Protihráč se odpojil.');
						else
							page_alert('Šach Mat! Vyhrál jste!');
						move_allowed = false;
						window.clearInterval(time_interval);
						window.clearInterval(refresh_interval);
						break;
					case 'stalemate': /* zobrazit pat */
						move_allowed = false;
						page_alert('PAT');
						window.clearInterval(time_interval);
						window.clearInterval(refresh_interval);
						break;
				}
				// pokud se stav hry lisi od predchoziho, prijde prekreslit plocha
				// - muzeme predpokladat, ze po tahu se stav hry lisi, takze podminka neni potreba
				// if (previous_board != variables['board_orig'])
				//{
					
				if (previous_board != variables['board_orig'])	{
					//ds_upozorni(current_player);
				}
				
					var prBoard = unserialize(previous_board);
					var curBoard = unserialize(variables['board_orig']);
					var i, j;
					var prevPiece, curPiece;
					var letters = new Array('a','b','c','d','e','f','g','h');
					var elStyle;
					var elStyleSpace;
					var zapsano = false;
					for (i=0;i<8;i++)
						for (j=0;j<8;j++)
						{
							prevPiece = prBoard[i][j];
							curPiece = curBoard[i][j];
							//  kontury dat do normalniho stavu
							elStyle = document.getElementById(letters[i]+String(8-j)).className;
							elStyleSpace = elStyle.search(" ");
							
							if(prBoard[i][j] !=0 && i+1<8 && prBoard[i+1][j] != 0 && curBoard[i][j]!=prBoard[i][j] && curBoard[i+1][j]!=prBoard[i+1][j] && String(prevPiece&7)=="1"){
								// Potencionální en passant (braní mimochodem)
								var token_color = my_side=='black'?'white':'black';
								if(zapsano==false){
									set_cookie(token_color+'_token',get_cookie(token_color+'_token')+String((prevPiece&7)));
									zapsano = true;
								}
								redraw_token_pieces(token_color);
							}
							
							if (elStyleSpace != -1)
								document.getElementById(letters[i]+String(8-j)).className = elStyle.substr(0,elStyleSpace);
							if (prevPiece != curPiece && prevPiece != 0 && curPiece != 0)
							{ // prave mame nalezene policko, kde doslo k vyhozeni
								var token_color = ((prevPiece&192) == 64)?'white':'black';
								if(zapsano==false){
									set_cookie(token_color+'_token',get_cookie(token_color+'_token')+String((prevPiece&7)));
									zapsano = true;
								}
								redraw_token_pieces(token_color);
							}
						}
					draw_board(variables['board']);
					previous_board = variables['board_orig'];
				//}
				// prekresleni casomiry
				player_times['b'] = variables['b_time'];
				player_times['w'] = variables['w_time'];
				document.getElementById(current_player+'Time').style.color = '#000000';
				current_player = (current_player == 'w')?'b':'w';
				document.getElementById(current_player+'Time').style.color = '#ff0000';
				move_allowed = true;
			}
		}
		
	}catch(err){
		jsError(err);
	}
}

function parse_ping_response(ajax_obj){
	try{
		var code;
		var response;
		var variables = new Array();
		if (!ajax_obj || !ajax_obj.xml)
		{
			// chyba odpovedi od serveru
		}
		else
		{
			//alert(ajax_obj.xml);
			var xmldoc = xmlParse(ajax_obj.xml);
			var rootNode = xmldoc.getNextChild('methodResponse').getNextChild('params');
			if (rootNode == null)
			{
				// doslo k nejake chybe, napriklad byla ukoncena hra
				//                         methodResponse      ->        fault       ->    value   ->    struct
				rootNode = xmldoc.getNextChild('methodResponse').getNextChild('fault').getNextChild('value').getNextChild('struct');
				// zjistit, jestli hra existuje - pokud ne, prepnout na seznam her s alertem, ze hra byla ukoncena
				var firstPos = rootNode.getNextChildPos('member');
				if (rootNode.childNodes[firstPos].getNextChild('name').nodeValue == 'faultCode')
				{
					//code = rootNode.childNodes[firstPos].getNextChild('value').childNodes[0].nodeValue;
					response = rootNode.getNextChild('member',firstPos).getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
				}
				else
				{
					//code = rootNode.getNextChild('member',firstPos).getNextChild('value').childNodes[0].nodeValue;
					response = rootNode.childNodes[firstPos].getNextChild('value').getNextChild('string').childNodes[0].nodeValue;
				}
				move_allowed = false;
				page_alert('Došlo k chybě: '+response);
			}
			else
			{ // rootNode == params    param         value         array       data
				rootNode = rootNode.getNextChild('param').getNextChild('value').getNextChild('array').getNextChild('data');
				if (rootNode.getNextChildPos('value') != -1 && // souper je vyzvan
					window.location.href.indexOf('action=') != -1 && // je zadana nejaka akce
					window.location.href.indexOf('action=index') == -1 &&  // akce neni prehled her
					window.location.href.indexOf('action=games') == -1)
					page_alert('Byl jste pozván k nové hře! <a href="?action=games">Připojte se</a>.');
				return;
			}
		}
		
		
	}catch(err){
		jsError(err);
	}
}




function log_me_in(username,password)
{
    var msg = new XMLRPCMessage('global.login');
    msg.addParameter(username);
    msg.addParameter(password);
    
    a = new ajax(rpc_url);
    a.send_request(msg.xml(),login_handler);
    //ping_interval = window.setInterval(ping,180000);
}

function log_me_out()
{
    var msg = new XMLRPCMessage('global.logout');
    a = new ajax(rpc_url);
    a.send_request(msg.xml(),reload_page);
    window.clearInterval(ping_interval);
    set_cookie('logged_in','false');
    if (document.cookie.indexOf('login') != -1)
    {
        set_cookie('login','');
        set_cookie('password','');
    }
}

function refresh_joined_game_info(gameId)
{
    var msg = new XMLRPCMessage('global.get_waiting_game');
    msg.addParameter(gameId);
    
    a = new ajax(rpc_url);
    a.send_request(msg.xml(),fill_joined_game_info);
}

function i_am_ready(gameId)
{
    var msg = new XMLRPCMessage('global.player_ready');
    msg.addParameter(gameId);
    
    a = new ajax(rpc_url);
    a.send_request(msg.xml(),blank_handler);
}

function disconnect_me(gameId)
{
    var msg = new XMLRPCMessage('global.disconnect_player');
    msg.addParameter(gameId);
    
    a = new ajax(rpc_url);
    a.send_request(msg.xml(),game_list);
}

function refresh_playing_game_info(gameId)
{
    var msg = new XMLRPCMessage('global.get_playing_game');
    msg.addParameter(gameId);
    
    a = new ajax(rpc_url);
    a.send_request(msg.xml(),fill_playing_game_info);
}

function offer_draw()
{
    var msg = new XMLRPCMessage('chess.offer_draw');
    msg.addParameter(current_game);
    
    a = new ajax(rpc_url);
    a.send_request(msg.xml(),blank_handler);
}

function accept_draw()
{
    var msg = new XMLRPCMessage('chess.accept_draw');
    msg.addParameter(current_game);
    
    a = new ajax(rpc_url);
    a.send_request(msg.xml(),blank_handler);
}

function leave_game()
{
    var msg = new XMLRPCMessage('global.leave_game');
    msg.addParameter(current_game);
    
    a = new ajax(rpc_url);
    a.send_request(msg.xml(),blank_handler); 
}

function ping()
{
    var msg = new XMLRPCMessage('global.ping');
    
    a = new ajax(rpc_url);
    //a.send_request(msg.xml(),parse_ping_response);
    a.send_request(msg.xml(),blank_handler);
}

function chat_display_data(ajax_obj)
{
    var xmldoc = xmlParse(ajax_obj.xml);
    var rootNode = xmldoc.getNextChild('methodResponse').getNextChild('params');
    if (!rootNode) return;
    rootNode = rootNode.getNextChild('param').getNextChild('value').getNextChild('string');
    var el = document.getElementById('screen');
    el.scrollTop = el.scrollHeight;
    var data = rootNode.childNodes[0];
    if (data == null) data = "";
    else data = data.nodeValue;
    data = data.replace('&lt;','<').replace('&gt;','>');
    $("#screen").html(data);
}

function chat_update()
{
    var updateMsg = new XMLRPCMessage('chat.update');
    updateMsg.addParameter(current_game);
    
    a = new ajax(rpc_url);
    a.send_request(updateMsg.xml(),chat_display_data);

    setTimeout('chat_update()', 12000);
}

function chat_send_msg()
{
    var msg = $("#message").val();
    var len = msg.length;
    var i;
    var czech = "áäčďéěíĺľňóô öŕšťúů üýřžÁÄČĎÉĚÍĹĽŇÓÔ ÖŔŠŤÚŮ ÜÝŘŽ";
    var ascii = "aacdeeillnoo orstuu uyrzAACDEEILLNOO ORSTUU UYRZ";
    var stripped = "";
    
    for(i=0; i<len; i++)
        if (czech.indexOf(msg.charAt(i)) != -1)
            stripped += ascii.charAt(czech.indexOf(msg.charAt(i)));
        else
            stripped += msg.charAt(i);
    
    if (stripped == "") return;
    
    var sendMsg = new XMLRPCMessage('chat.msg');
    sendMsg.addParameter(current_game);
    sendMsg.addParameter(stripped);
    
    a = new ajax(rpc_url);
    a.send_request(sendMsg.xml(),function (ajax_obj) { chat_display_data(ajax_obj); $("#message").val("");});
}


