// use this PHP-script as a SOAP-proxy
// the script will make the SOAP-call and returns the response.
var g_phpURL = "http://www.suite75.net/php/soapchess.php?position=";

var IMG_PIECE_PAWN_W = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/w_pawn.gif">';
var IMG_PIECE_ROOK_W = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/w_rook.gif">';
var IMG_PIECE_KNIGHT_W = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/w_knight.gif">';
var IMG_PIECE_BISHOP_W = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/w_bishop.gif">';
var IMG_PIECE_KING_W = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/w_king.gif">';
var IMG_PIECE_QUEEN_W = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/w_queen.gif">';

var IMG_PIECE_PAWN_B = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/b_pawn.gif">';
var IMG_PIECE_ROOK_B = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/b_rook.gif">';
var IMG_PIECE_KNIGHT_B = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/b_knight.gif">';
var IMG_PIECE_BISHOP_B = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/b_bishop.gif">';
var IMG_PIECE_KING_B = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/b_king.gif">';
var IMG_PIECE_QUEEN_B = '<img src="http://radio.weblogs.com/0107414/misc/SOAPChess/b_queen.gif">';

var PIECE_PAWN_W = 1;
var PIECE_ROOK_W = 2;
var PIECE_KNIGHT_W = 3;
var PIECE_BISHOP_W = 4;
var PIECE_KING_W = 5;
var PIECE_QUEEN_W = 6;

var PIECE_PAWN_B = 7;
var PIECE_ROOK_B = 8;
var PIECE_KNIGHT_B = 9;
var PIECE_BISHOP_B = 10;
var PIECE_KING_B = 11;
var PIECE_QUEEN_B = 12;

var g_StartPosition = "rnbqkbnrpppppppp                                PPPPPPPPRNBQKBNR";
var g_CurrentPosition = "rnbqkbnrpppppppp                                PPPPPPPPRNBQKBNR";
var g_Dragging = false;
var g_StartMove;
var g_StartID;
var g_EndMove;
var g_CurrentPiece;
var g_PreviousPosition;
var g_MoveHistory = new Array();

function GetNextMove()
{
	try
	{
		var doc = new ActiveXObject( "MSXML.DOMDocument" );
		doc.async = false;
		
		if( doc.load( g_phpURL+g_CurrentPosition ) )
		{
			var nod = doc.selectSingleNode( "//return" );
			if( nod )
			{
				var dat = nod.text.split(" ");
				if( dat[1] == "OK" )
					MakeMove( dat[0] );	
				else if( dat[0] == "a1a1" || nod.text.indexOf("INVALID") != -1)
				{
					alert(nod.text);
					g_CurrentPosition = g_PreviousPosition;
					g_MoveHistory.pop();
					SetBoard();
					ShowMoves();
				}
				else
				{
					MakeMove( dat[0] );	
					alert( dat[1] );
				}
			}
			else
				ShowError(1);
		}
	}
	catch( e )
	{
		ShowError(0);	
	}
}

function MakeMove( move )
{
	try
	{
		s_move = move.substr(0,2).toUpperCase();
		e_move = move.substr(2,2).toUpperCase();
		
		var sidx = IndexByCode( s_move );
		var eidx = IndexByCode( e_move );
		
		var div_id = "FIELD_" + sidx;
		var pieceChar = GetPieceChar( document.all[div_id].innerHTML );
		var endChar = GetPieceChar( document.all["FIELD_"+eidx].innerHTML );
		
		if( pieceChar != " " )
		{
			ReplaceInPosition( sidx, eidx, pieceChar );
			SetBoard();	
		}
		
		div_id = "FIELD_" + eidx;
		pieceChar = GetPieceChar( document.all[div_id].innerHTML );
		
		if( endChar != " " )
			g_MoveHistory.push( s_move + "x" + e_move );
		else
			g_MoveHistory.push( s_move + "-" + e_move );	
			
		ShowMoves();
	}
	catch(e)
	{
		alert( "Error in MakeMove() " + e.description + " " + move );
	}
}

// takes code like 'E3'
function IndexByCode( sCode )
{
	var chars = "ABCDEFGH";
	
	var code = sCode.toUpperCase();
	var s = code.substr(0,1);
	
	var col = chars.indexOf(s);
	var row = parseInt(code.substr(1,1)) - 1;

	return ((7-row) * 8) + col;
}

function CodeByIndex( idx )
{
	var chars = "ABCDEFGH";
	var row = 9 - (parseInt(idx/8) + 1);
	//var row = ( idx % 8 ) + 1;
	var col = ( idx % 8 );
	
	var ret = chars.substr(col, 1) + row;
	window.status = ret;
	return ret;
}

function MouseClick( obj )
{
	var dat = obj.id.split("_");
	
	if( !g_Dragging )
	{
		var piececode = GetPieceChar( obj.innerHTML );
		if( piececode != " " )
		{
			g_PreviousPosition = g_CurrentPosition;
			g_StartMove = parseInt( dat[1] );
			g_StartID = CodeByIndex( g_StartMove );
			g_CurrentPiece = piececode;
			g_Dragging = true;
		}
	}
	else
	{
		g_EndMove = parseInt( dat[1] );
		var piececode = GetPieceChar( obj.innerHTML );
		
		ReplaceInPosition( g_StartMove, g_EndMove, g_CurrentPiece );
		SetBoard();
		g_Dragging = false;
		if( piececode != " " )
			g_MoveHistory.push( g_StartID + "x" + CodeByIndex( g_EndMove ) );
		else
			g_MoveHistory.push( g_StartID + "-" + CodeByIndex( g_EndMove ) );
		ShowMoves();
		//window.status = "Black is thinking...";
		window.setTimeout( "GetNextMove()", 500 );
	}
}

function ReplaceInPosition( spos, epos, endval )
{
	var tmp = new Array;
	for( var i = 0; i < 64; i++ )
	{
		if( i == spos )
			tmp.push(" ");
		else if( i == epos )
			tmp.push(endval);
		else
			tmp.push( g_CurrentPosition.substr(i,1));
	}
	g_CurrentPosition = tmp.join("");
}

function MouseOver( obj )
{
	//window.status = obj.id;
}

function MouseOut( obj )
{
	//window.status = "";
}

function CreateBoard()
{
	var cnt = 0, id = 0;
	var sClass;
	var xoffset = 140;
	var yoffset = 20;
	
	document.write( '<div id="back" class="back"></div>' );
	
	for( var i = 0; i < 8; i++ )
	{
		for( var j = 0; j < 8; j++ )
		{
			if( cnt % 2  )
				sClass = "black";
			else
				sClass = "white";
					
			var size = 30;
			var left = xoffset + j * size;
			var top = yoffset + i * size;
		
			var str = '<div class="' + sClass;
			str += '" id="FIELD_' + id + '" name="FIELD_' + id;
			str += '" onclick="MouseClick(this);return true;';
			str += '" onmouseover="MouseOver(this);return true;';
			str += '" onmouseout="MouseOut(this);return true;';
			str += '" style="{top: ' + top + ';left: ' + left + ';'
			str += 'width: ' + size + ';height: ' + size + ';}"></div>';
		
			document.write( str );
			id++;
			cnt++;
		}
		cnt++;
	}
	g_MoveHistory = new Array();
	SetBoard();
}		

function ShowMoves()
{
	var cnt = 1;
	var wmove = false;
	
	str = '<table>';
	for( var i = 0; i < g_MoveHistory.length; i++ )
	{
		if( i % 2  )
		{
			str += '<td class="moves">' + g_MoveHistory[i] + '</td></tr>';
			cnt++;
			wmove = false;
		}
		else
		{
			str += '<tr><td class="moves">'+cnt+'</td><td class="moves">' + g_MoveHistory[i] + '</td>';
			wmove = true;
		}
	}
	if( wmove )
		str += '<td class="moves">&nbsp;</td></tr></table>';
	else
		str += '</table>';
	document.all["moves"].innerHTML = str;
}

function SetBoard()
{
	for( var i = 0; i < 64; i++ )
	{
		var cur = g_CurrentPosition.substr(i,1);
		switch( cur )
		{
			case " ":
				document.all["FIELD_"+i].innerHTML = "";
				break;
			case "P":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_PAWN_W;
				break;
			case "R":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_ROOK_W;
				break;
			case "N":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_KNIGHT_W;
				break;
			case "B":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_BISHOP_W;
				break;
			case "Q":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_QUEEN_W;
				break;
			case "K":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_KING_W;
				break;
			case "p":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_PAWN_B;
				break;
			case "r":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_ROOK_B;
				break;
			case "n":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_KNIGHT_B;
				break;
			case "b":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_BISHOP_B;
				break;
			case "q":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_QUEEN_B;
				break;
			case "k":
				document.all["FIELD_"+i].innerHTML = IMG_PIECE_KING_B;
				break;
		}
	}
}

function GetPieceChar( pieceHTML )
{
	str = pieceHTML.toLowerCase();
	
	var pat = /w_pawn/gi
	if( pat.test( str ) ) return "P";
	
	pat = /w_rook/gi	
	if( pat.test( str ) ) return "R";

	pat = /w_knight/gi	
	if( pat.test( str ) ) return "N";

	pat = /w_bishop/gi	
	if( pat.test( str ) ) return "B";

	pat = /w_queen/gi	
	if( pat.test( str ) ) return "Q";
	
	pat = /w_king/gi	
	if( pat.test( str ) ) return "K";

	var pat = /b_pawn/gi
	if( pat.test( str ) ) return "p";
	
	pat = /b_rook/gi	
	if( pat.test( str ) ) return "r";

	pat = /b_knight/gi	
	if( pat.test( str ) ) return "n";

	pat = /b_bishop/gi	
	if( pat.test( str ) ) return "b";

	pat = /b_queen/gi	
	if( pat.test( str ) ) return "q";
	
	pat = /b_king/gi	
	if( pat.test( str ) ) return "k";
				
	return " ";	
}

function GetPieceHTML( pieceCode )
{
	switch( pieceCode )
	{
		case "P":
			return PIECE_PAWN_W;
			break;
		case "R":
			return PIECE_ROOK_W;
			break;
		case "N":
			return PIECE_KNIGHT_W;
			break;
		case "B":
			return PIECE_BISHOP_W;
			break;
		case "Q":
			return PIECE_QUEEN_W;
			break;
		case "K":
			return PIECE_KING_W;
			break;
			
		case "p":
			return PIECE_PAWN_B;
			break;
		case "r":
			return PIECE_ROOK_B;
			break;
		case "n":
			return PIECE_KNIGHT_B;
			break;
		case "b":
			return PIECE_BISHOP_B;
			break;
		case "q":
			return PIECE_QUEEN_B;
			break;
		case "k":
			return PIECE_KING_B;
			break;
		default:
			return " ";
			break;
	}
}

//--------------------------------------------------------------------
// show some errors
function ShowError( idx )
{
	var msg = new Array()	
	msg.push("Connection to webservice failed...\n\nPlease adjust Internet Explorer's security-settings.\n"+	
			"------------------------------------------------------------\n"+
			"HOWTO:\nIn IE's menubar, goto 'Tools->Internet Options'\n"+
			"- select tab 'Security'\n"+
			"- select the 'Internet zone'\n- press button 'Custom Level'\n"+
			"- goto option 'Access data sources across domains'\n"+
			"- select option 'Enable'\n"+
			"- click 'Ok', you will be prompted whether you are sure to change the security-settings\n"+
			"- press 'OK' once more...\n"+
			"------------------------------------------------------------\n"+
			"After adjusting you should be able to connect to the webservice."												
			);
	msg.push( "Empty request, aborting..." );	
	msg.push( "Unable to create XMLHTTP-object!" );
	alert(msg[idx]);
	delete msg;
}