package com.editev.chess;
import java.io.PrintStream;
import java.io.IOException;
import java.util.StringTokenizer;
import com.editev.util.StringIndentor;
import javax.servlet.*;
import javax.servlet.http.*;
import com.editev.util.Util;
import com.editev.util.Lists;
import com.editev.util.Function;
/** A GameHTML is a GameHistory that can also be displayed in HTML format.
*
* @see See the source here.
*/
public class GameHTML extends GameHistory {
/** The base URL for this servlet. */
public final String baseURL;
/** The list of previous moves, if any. */
public final String moves;
/** The base URL for moves. */
public final String moveURL;
/** The base URL for this servlet's targeted moves. */
public final String targetURL;
/** If this is the second part of a move, what is the first target square? */
public final short target;
/** An Indentor wraps a PrintStream in some useful functions for outputting HTML. */
public final StringIndentor out;
/** Is this a text-only browser? */
public final boolean textOnly;
/** Does this browser support Javascript? */
public final boolean hasJavascript;
/** Does this browser support style sheets? */
public final boolean hasStyles;
/** How often do we refresh (with a random move)? */
public final int refresh;
/** The actual game that we're representing. */
//public final GameHistory game;
/** Create a GameHTML representing a chess position and a URL.
*
* @param baseURL the base URL for this servlet
* @param moves a slash-separated string of moves.
* @param startString the "target" move, if this is the second half of a Piece move, or null otherwise.
* @param textOnly is this a text-only browser (current, just Lynx)?
* @param hasJavascript does this browser support Javascript?
* @param hasStyles does this browser support CSS style sheets?
* @param refresh How often do we refresh (with a random move)?
* @param out the PrintStream for this HTTP socket connection.
*
*/
public GameHTML(
String baseURL,
String moves,
String targetString,
boolean textOnly,
boolean hasJavascript,
boolean hasStyles,
int refresh,
//GameHistory game,
StringBuffer out
)
{
this.baseURL = baseURL;
short target = NO_MOVE;
try { target = Short.parseShort( targetString ); } catch (Exception e) {}
this. target = target;
boolean empty = (moves == null);
if (empty) {
this.moves = "";
} else {
this.moves = moves;
applyMoves( moves );
}
this.moveURL = baseURL + (empty ? "?moves=" : ("?moves=" + moves + SEPARATOR ) );
this.targetURL = baseURL + (empty ? "?target=" : ("?moves=" + moves + "&target=" ) );
this.textOnly = textOnly;
this.hasJavascript = hasJavascript;
this.hasStyles = hasStyles;
this.refresh = refresh;
this.out = new StringIndentor( out );
//this.game = game;
}
/** HTML representing black and white pieces only. */
public static final String[] PIECE_HTML = {
" ", "K", "Q", "R", "B", "N", "P", " ", "K", "Q", "R", "B", "N", "P"
};
/** HTML representing black and white pieces only. */
public static final String[] PIECE_TEXT = {
" ", "k", "q", "r", "b", "n", "p", " ", "K", "Q", "R", "B", "N", "P"
};
/** Get the HTML for this piece! */
public String getPieceHTML( byte piece ) { return textOnly ? PIECE_TEXT[ piece ] : PIECE_HTML[ piece ]; }
/** Counts the number of next moves for each square on the board. */
public final Counts counts = new Counts();
/** Counts the moves that we've already displayed. */
public short moveCount;
/** An enumerator for squares. */
public Square square = new Square();
}