var game = new Game(StandardInitialPosition(), 0, [], 'board', '../img/board/');
var gameurlroot = location.href.slice(0, -16) + "board.html?moves=";
var movecode = null;

var preferred_method = 0; /* 0: no evaluation; 1: 1-move evaluation */

function MakegameurlInit()
{
    game.Paint();
    AdaptUrl();
}

function MoveCodeForGame(game)
{
    var bitwriter = new BitWriter();

    bitwriter.put(preferred_method, 3);

    var position = game.initial_board;
    for(var movix in game.moves)
    {
	var move = game.moves[movix];
	var rank_outof = MoveRank(position, move, preferred_method);
	var rank = rank_outof.rank;
	var outof = rank_outof.outof;
	
	bitwriter.put_ordinal(rank, outof+1, preferred_method>0);
	position = position.move(move);
    }

    var legalcount = position.LegalMoves().length;
    bitwriter.put_ordinal(legalcount, legalcount+1, preferred_method>0);
    bitwriter.put_ordinal(4, 5); /* EOD indicator */
    return bitwriter.output();
}

function CpsMoveCodeForGame(game, messageelement, continuation)
{
    var bitwriter = new BitWriter();
    bitwriter.put(preferred_method, 3);
    var position = game.initial_board;
    var movix = 0;
    var step_ms = 10;

    var timertoken = setInterval(
	function()
	{
	    try
	    {
		if(movix < game.moves.length)
		{
		    var move = game.moves[movix];
		    var moveno = (movix-movix%2)/2;
		    var blacks_move = movix%2;
		    messageelement.innerHTML
			= moveno + (blacks_move? ". - " : ". ") + position.PrintMove(move);

		    var rank_outof = MoveRank(position, move, preferred_method);
		    var rank = rank_outof.rank;
		    var outof = rank_outof.outof;
	
		    bitwriter.put_ordinal(rank, outof+1, preferred_method>0);
		    position = position.move(move);
		    ++movix;
		}
		else
		{
		    clearInterval(timertoken);

		    var legalcount = position.LegalMoves().length;
		    bitwriter.put_ordinal(legalcount, legalcount+1, preferred_method>0);
		    bitwriter.put_ordinal(4, 5); /* EOD indicator */

		    messageelement.innerHTML = "Done.<br>Copy anchor or embedding code from below to your web page.";
		    continuation(bitwriter.output());
		}
	    }
	    catch(e)
	    {
		clearInterval(timertoken);
		throw e;
	    }
	},
	step_ms);
}



function GenerateGameUrl()
{
    var indhold = document.getElementById('pgntext').value;
    var receiver = new GamifyPgnReceiver('board','../img/board/');
    var parser = new PgnParser(indhold, receiver);
    parser.ParsePgnDatabase();
    if(receiver.borked_game_count > 0)
    {
	alert("PGN is not valid; see messages below");
	game = null;
	return;
    }
    else
    {
	var games = receiver.games;
	var ngames = games.length;
	if(ngames == 0)
	{
	    alert("No games found");
	    game = null;
	}
	else
	{
	    if(ngames > 1)
		alert("More than 1 game found - using the last one");
	    game = games[ngames-1];
	    game.current_move = game.moves.length;
	    game.Paint();
	    keymap = new Keymap({
		left: function(){game.UIPrev();},
			backspace: function(){game.UIPrev();},
			right: function(){game.UINext();},
			home: function(){game.UIBegin();},
			end: function(){game.UIEnd();}
		});
	    keymap.install(document.getElementById('board'));

	    if(false)
	    {
		alert("Computing game URL ... this may take a while");
		movecode = MoveCodeForGame(game);
		alert("Done. Copy anchor or embedding code to your web page.");
	    }
	    else
	    {
		CpsMoveCodeForGame(game,
				   document.getElementById('gen_status'),
				   function(mcode) {
				       movecode = mcode;
				       AdaptUrl();
				   });
		return;
	    }
	}
    }
    AdaptUrl();
}

function AdaptUrl()
{
    var gamelink = document.getElementById('gamelink');
    var anchortext = document.getElementById('anchortext');
    var embedtext = document.getElementById('embedtext');

    if(game === null || movecode === null)
    {
	gamelink.href = "javascript:alert('Please enter PGN first')";
	gamelink.innerHTML = "[None]";
	anchortext.value = '';
	embedtext.value = '';
    }
    else
    {
	var aurl = gameurlroot + movecode + "&ms=300&at=" + game.current_move;
	var embedurl = gameurlroot + movecode + "&ms=0&at=" + game.current_move;
	var white = game.tags.White;
	var black = game.tags.Black;
	var gametitle;
	if(!white) white = "Unknown";
	if(!black) black = "unknown";
	gametitle = white + " - " + black;
	if(game.tags.Result && game.tags.Result != '*')
	    gametitle += " " + game.tags.Result;
	gametitle = gametitle.replace('&', '&lt;').replace('<', '&lt;').replace('>', '&gt;');
	
	gamelink.innerHTML = aurl;
	gamelink.href = aurl;
	anchortext.value = '<a href="' + aurl + '" target="chessboard">' + gametitle + '</a>';
	embedtext.value = 
            '<iframe src="' + embedurl 
	    + '" width="310" height="340" marginheight="0" marginwidth="0" scrolling="no"></iframe>';
'';
    }
}
