
var xmlHttp					;
var click_allowed	= true	;
var display_timeout	= false	;
var last_opponent_x	= 9999	;
var last_opponent_y	= 9999	;
var is_game_over	= false	;
var level			= 1		;	// MEDIUM level

function createXMLHttpRequest()
{
	if(window.ActiveXObject)
	{
		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	else if(window.XMLHttpRequest)
	{
      xmlHttp = new XMLHttpRequest();
   }
}

function close_dialog(dialog_id)
{
	document.getElementById(dialog_id).style.visibility = 'hidden';
	return false;
}

bgs=new Array(	'gradient_gay.jpg',
				'gradient_curls.jpg',
				'gradient_gold.jpg',
				'background_metal.jpg',
				'background_cracked.jpg'
				);
var bg_counter = 0;

function change_background(image_file_name)
{
	document.getElementById('background_image').style.background = 'url(' + bgs[bg_counter] + ')';
	if (++bg_counter ==bgs.length) bg_counter=0;
	return false;
}

function display_dialog(text)
{
	text =	'<b>'	+
			text	+
			'</b><br><br><br><i>Klicka i dialogrutan för att stänga den</i>';
	document.getElementById('dialog').innerHTML = text;
	document.getElementById('dialog').style.visibility = 'visible';
}

function _auto_updates()
{
	setTimeout("_auto_updates()", 1000);
}

function display_level(lvl)
{
	level = lvl;
}


function player_move(cell_id)
{
//rnd = Math.floor(Math.random()*9999999);
	if (click_allowed != true) return;
//	document.getElementById(cell_id).innerHTML = "<img src='ring_red.gif' height='14' width='14' />";
	document.getElementById(cell_id).src = img_PLAYER_marked.src;
/**
	createXMLHttpRequest();
	xmlHttp.onreadystatechange = handleStateChange;
	xmlHttp.open("GET", "gomoku_player.php?p="+escape(cell_id), true);
	xmlHttp.send(null); 
**/
	AJAX_request("gomoku_player.php?p="+escape(cell_id));
	document.getElementById('whos_turn').innerHTML =
		"<img src='tiny_red.gif' height='10' width='10' hspace='10' /> Datorn tänker...";

	click_allowed= false;
//	setTimeout("server_com_timeout()", 25000);
//	display_timeout = true;

} 

function computer_turn()
{
	AJAX_request ("gomoku_ai.php");
} 

function player_hint()
{
	if (click_allowed != true) return false;

	AJAX_request ("gomoku_hint.php");
	click_allowed= false;
	return false;
} 

function player_undo()
{
	if (click_allowed != true) return false;

	click_allowed= false;
	AJAX_request ("gomoku_undo.php");
	return false;
} 

function player_new_game(confirmed)
{
	if(confirmed==1 || is_game_over)
	{
		click_allowed= false;
		is_game_over = false;
		wipe_board();
		AJAX_request ("gomoku_new.php");
	}
	else
	{
		if (is_game_over == false)
		{
			display_dialog
			(
				'Vill du verkligen avsluta detta spel och börja om?' + 
				'<br><a href="#" onclick="javascript:player_new_game(1)"> ' + 
				'JA'	+
				'</a> <a href="#" onclick="close_dialog(\'dialog\')"> '+
				'NEJ'+'</a>'
			);
		}
	}
	return false;

}
function player_repeat()
{
	if (click_allowed != true) return false;
	if (9999 == last_opponent_x )
	{
		display_dialog ('Det finns inget senaste drag att visa.');
		return false;
	}		
	anim_counter=4;
	flash_id = last_opponent_y + '_' + last_opponent_x;
	setTimeout("computer_move_flash1()", 100);
	return false;
} 

function AJAX_request( request_argument)
{
	createXMLHttpRequest();
	xmlHttp.onreadystatechange = handleStateChange;
	xmlHttp.open("GET", request_argument, true);
	xmlHttp.send(null); 
}

function player_wins(direction, y,x)
{
	mark_winner_on_board(direction,y,x, img_PLAYER_marked.src);
}

function computer_wins(direction, y,x)
{
	mark_winner_on_board(direction,y,x, img_OPPONENT_marked.src);
}

function mark_winner_on_board(direction, y,x, highlight_image)
{
	direction			=	parseInt(direction)	;
	x					=	parseInt(x)			;
	y					=	parseInt(y)			;
	
	click_allowed		=	false				;
	is_game_over = true;
//	display_timeout		=	false				;

	switch(direction)
	{
		case 0: dx=1;dy=0; break;
		case 1: dx=0;dy=1; break;
		case 2: dx=1;dy=1; break;
		case 3: dx=1;dy=-1; break;
	}

	for(i=0; i<5; i++)
	{
		cell_id = y + '_' + x;
		document.getElementById(cell_id).src = highlight_image;
		x += dx;
		y += dy;	
	}
}

function computer_move_flash1()
{ 
//	document.getElementById(flash_id).innerHTML = "<img src='kryss_red.gif' width='14' height='14' />";
	document.getElementById(flash_id).src = img_OPPONENT_marked.src;
	setTimeout("computer_move_flash2()", 50);
}
function computer_move_flash2()
{ 
//	document.getElementById(flash_id).innerHTML = "<img src='kryss_vit.gif' width='14' height='14' />";
	document.getElementById(flash_id).src = img_OPPONENT.src;
	if (--anim_counter > 0)
	{
		setTimeout("computer_move_flash1()", 40);
	}
}


function hint_flash2()
{ 
//	document.getElementById(flash_id).innerHTML = "<img src='kryss_red.gif' width='14' height='14' />";
	document.getElementById(hint_flash_id).src = img_PLAYER.src;
	setTimeout("hint_flash1()", 100);
}
function hint_flash1()
{ 
//	document.getElementById(flash_id).innerHTML = "<img src='kryss_vit.gif' width='14' height='14' />";
	document.getElementById(hint_flash_id).src = img_EMPTY.src;
	if (--anim_counter > 0)
	{
		setTimeout("hint_flash2()", 30);
	}
	else
	{
		// Hint is finished. Back to usual function
		din_tur();
	}
}


function din_tur()
{
	click_allowed= true;
	document.getElementById('whos_turn').innerHTML =
		"<img src='smile10.gif' height='10' width='10' hspace='10' />"	+
		" Nu är det din tur igen";
}

function handleStateChange()
{
	if(xmlHttp.readyState == 4)
	{
		var response = xmlHttp.responseText;
		var param = new Array();
		
		if(response.indexOf('::' != -1))
		{
			commandlines = response.split('||');	// Separator, commands
			cmd_count = commandlines.length;
			
			for (cmd=0; cmd<cmd_count; cmd++)
			{
				param = commandlines[cmd].split('::');	// Separator, parameters
				action = param[0];

				switch(action)
				{
				case 'hint':
					anim_counter=10;
					hint_flash_id = param[1] + '_' + param[2];
					setTimeout("hint_flash1()", 500);
					document.getElementById('whos_turn').innerHTML = "Här kanske?";
					break;
					
				case 'win_player':
					player_wins(param[1], param[2],param[3]);
					break;

				case 'win_computer':
					computer_wins(param[1], param[2],param[3]);
					break;

				case 'status':
					document.getElementById('whos_turn').innerHTML = param[1];
					break;
				
				case 'set':
					if (param[3] == 'O')
					{
						setTimeout("computer_turn()", 300);
						image_code = img_PLAYER.src;
					 }
					if (param[3] == 'X')
					{
						last_opponent_x = param[2];
						last_opponent_y = param[1];
						image_code = img_OPPONENT_marked.src;
						din_tur();
						anim_counter=4;
						flash_id = param[1] + '_' + param[2];
						setTimeout("computer_move_flash1()", 200);
					 }
	
					document.getElementById(param[1]+'_'+param[2]).src = image_code; 
	
					// Disable click for taken squares
					document.getElementById(param[1]+'_'+param[2]).onclick = function(){}; 
					break;

				case 'dialog':
					display_dialog(param[1]);
					break;				

				case 'zero_move':
					click_allowed	= true;
					last_opponent_x = 9999;
					document.getElementById('move_counter').innerHTML = 0;
					break;				

// Still experimental actions...
				case 'mv':
					document.getElementById('move_counter').innerHTML = param[1];
					break;				

				case 'level':
					display_level(param[1]);
					break;				

				 case 'unset':
					document.getElementById(param[1]+'_'+param[2]).src = img_EMPTY.src; 
					// Square is playable again
					document.getElementById(param[1]+'_'+param[2]).onclick = function(){player_move(this.id)};
					break;

				}

			} // loop all commands
		}
	}
}

var wipe_position = 0;
var MAX_ROWS = 20;
var MAX_COLS = 20;

function wipe_board()
{
	wipe_position = 0;
	setTimeout("_do_wipe_close()", 1);
}

function _do_wipe_close()
{
	for(row=0; row<MAX_ROWS-1; row+=2)
	{
		cell_id = row + '_' + wipe_position;
		document.getElementById(cell_id).className='opaq0';
		document.getElementById(cell_id).onclick = function(){player_move(this.id)};
		cell_id = (row +1)+ '_' + (MAX_ROWS-1-wipe_position);
		document.getElementById(cell_id).className='opaq0';
		document.getElementById(cell_id).onclick = function(){player_move(this.id)};
	}
	if (++wipe_position<MAX_COLS)	
		setTimeout("_do_wipe_close()", 1)
	else
	{
		wipe_position = 0;
		setTimeout("_do_wipe_open()", 500);
	}
}

function _do_wipe_open()
{
	for(row=0; row<MAX_ROWS-1; row+=2)
	{
		cell_id = row + '_' + wipe_position;
		document.getElementById(cell_id).className='opaq';
		document.getElementById(cell_id).src = img_EMPTY.src; 
		
		cell_id = (row +1)+ '_' + (MAX_ROWS-1-wipe_position);
		document.getElementById(cell_id).className='opaq';
		document.getElementById(cell_id).src = img_EMPTY.src; 
	}
	if (++wipe_position<MAX_COLS)	setTimeout("_do_wipe_open()", 1)
	else din_tur();

}
	


/* Alternativa AJAX-metoder
var bustcachevar=1 //bust potential caching of external pages after initial request? (1=yes, 0=no)
var loadedobjects=""
var rootdomain="http://"+window.location.hostname
var bustcacheparameter=""

function ajaxpage(url, containerid)
{
	var page_request = false
	if (window.XMLHttpRequest) // if Mozilla, Safari etc
		page_request = new XMLHttpRequest()
	else
	if (window.ActiveXObject)
	{ // if IE
		try
		{
			page_request = new ActiveXObject("Msxml2.XMLHTTP")
		} 
	
		catch (e)
		{
			try
			{
				page_request = new ActiveXObject("Microsoft.XMLHTTP")
			}
			catch (e){}
		}
	}
	else
	return false
	page_request.onreadystatechange=function(){	loadpage(page_request, containerid)	}
	
	if (bustcachevar)
	{ //if bust caching of external page
		bustcacheparameter=(url.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime()
	}
	page_request.open('GET', url+bustcacheparameter, true)
	page_request.send(null)
}

function loadpage(page_request, containerid)
{
	if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1))
	document.getElementById(containerid).innerHTML=page_request.responseText
}

function loadobjs(){
	if (!document.getElementById)	{	return	}
	
	for (i=0; i<arguments.length; i++)
	{
		var file=arguments[i]
		var fileref=""
		if (loadedobjects.indexOf(file)==-1)
		{ //Check to see if this object has not already been added to page before proceeding
			if (file.indexOf(".js")!=-1)
			{ //If object is a js file
				fileref=document.createElement('script')
				fileref.setAttribute("type","text/javascript");
				fileref.setAttribute("src", file);
			}
			else if (file.indexOf(".css")!=-1)
			{ //If object is a css file
				fileref=document.createElement("link")
				fileref.setAttribute("rel", "stylesheet");
				fileref.setAttribute("type", "text/css");
				fileref.setAttribute("href", file);
			}
		}
		if (fileref!="")
		{
			document.getElementsByTagName("head").item(0).appendChild(fileref)
			loadedobjects+=file+" " //Remember this object as being already added to page
		}
	}
}
*/