anchor.diff:  move_form(Session, GameID, Hints, ActiveCells, LastPly) ->
       [tag(script, ["src='/res/echessd.js'"], ""),
        tag(script, js_init(Hints, ActiveCells, LastPly)),
  -     "<form method=post>",
  -     hidden(?Q_PAGE, ?PAGE_MOVE),
  -     hidden(?Q_GAME, GameID),
  -     gettext(Session, txt_move_caption, []) ++ ":&nbsp;" ++
  -         "<input name=move type=text size=5 id=edmv>",
  -     submit(Session, txt_move_ok_button),
  -     "<input type=reset class=btn value='" ++
  -         gettext(Session, txt_move_reset_button, []) ++
  -         "' onclick='clr();'><br>",
  -     input(Session, ?Q_COMMENT, txt_move_comment_caption, ""),
  -     "</form><br>"].
  +     table(
  +       ["cellspacing=0", "cellpadding=0", "border=0"],
  +       [[td(
  +           form(
  +             post,
  +             [hidden(?Q_PAGE, ?PAGE_MOVE),
  +              hidden(?Q_GAME, GameID),
  +              gettext(Session, txt_move_caption, []) ++ ":&nbsp;" ++
  +                  "<input name=move type=text size=5 id=edmv>",
  +              submit(Session, txt_move_ok_button),
  +              "<input type=reset class=btn value='" ++
  +                  gettext(Session, txt_move_reset_button, []) ++
  +                  "' onclick='clr();'><br>",
  +              input(Session, ?Q_COMMENT, txt_move_comment_caption, "",
  +                    ["style='width:120'"])])),
  +         td(
  +           center(
  +             [form(
  +                [hidden(?Q_PAGE, ?PAGE_GIVEUP_CONFIRM),
  +                 hidden(?Q_GAME, GameID), submit(Session, txt_do_giveup)]),
  +              form(
  +                [hidden(?Q_PAGE, ?PAGE_DRAW_CONFIRM),
  +                 hidden(?Q_GAME, GameID), submit(Session, txt_req_draw)])]))
  +        ]])].
   
   %% @doc
   -spec autorefresh_hook(Session :: #session{}, GameInfo :: #gameinfo{}) ->
  
positive.code:     io_lib:format("<input name=~w type=hidden value='~s'>",
                    [Name, EncodedValue]).
  
  %% @doc
  -spec select(Session :: #session{},
               Name :: echessd_query_parser:http_query_key(),
               CaptionTextID :: atom(),
  
negative.code: tag([_ | _] = Tag, Attrs, Value) ->
      [$<, Tag, [[$\s | V] || V <- Attrs], $>, Value, "</", Tag, $>].
  
  %% @doc Generate HTML code for a labelled checkbox input field.
  -spec checkbox(Session :: #session{},
                 ID :: nonempty_string(),
                 Name :: echessd_query_parser:http_query_key(),
                 CaptionTextID :: atom(),
                 IsChecked :: boolean()) -> HTML :: iolist().
  checkbox(Session, ID, Name, CaptionTextID, IsChecked) ->
      [io_lib:format(
         "<label for=~s><input type=checkbox id=~s name=~w", [ID, ID, Name]),
       proplists:get_value(IsChecked, [{false, ""}], " checked"), ">&nbsp;",
       gettext(Session, CaptionTextID, []), "</label>"].
  
  %% @equiv input(Session, Name, CaptionTextID, Value, [])
  %% @doc Generate HTML code for a text input field.
  -spec input(Session :: #session{},
              Name :: echessd_query_parser:http_query_key(),
              CaptionTextID :: atom(),
              Value :: any()) -> HTML :: iolist().
  input(Session, Name, CaptionTextID, Value) ->
      input(Session, Name, CaptionTextID, Value, []).
  
  %% @doc Generate HTML code for a text input field.
  -spec input(Session :: #session{},
              Name :: echessd_query_parser:http_query_key(),
              CaptionTextID :: atom(),
              Value :: any(), ExtraAttrs :: [string()]) ->
                     HTML :: iolist().
  input(Session, Name, CaptionTextID, Value, ExtraAttrs) ->
      EncodedValue =
          echessd_lib:escape_html_entities(
            echessd_query_parser:encode(Name, Value)),
      [gettext(Session, CaptionTextID, []), ": ",
       io_lib:format(
         "<input name=~w type=text value='~s' ~s>",
         [Name, EncodedValue, string:join(ExtraAttrs, " ")])].
  
  %% @doc Generate HTML code for a password input field.
  -spec password(Session :: #session{},
                 Name :: echessd_query_parser:http_query_key(),
                 CaptionTextID :: atom()) -> HTML :: iolist().
  