anchor.diff:  a(URL, Caption) ->
       tag(a, ["href='" ++ URL ++ "'"], Caption).
   
  +%% @doc
  +-spec center(Content :: iolist()) -> HTML :: iolist().
  +center(Content) ->
  +    tag(center, Content).
  +
  +%% @equiv form(get, Content)
  +%% @doc
  +-spec form(Content :: iolist()) -> HTML :: iolist().
  +form(Content) ->
  +    form(get, Content).
  +
  +%% @doc
  +-spec form(Method :: get | post, Content :: iolist()) -> HTML :: iolist().
  +form(Method, Content) ->
  +    tag(form, ["method=" ++ atom_to_list(Method)], Content).
  +
   %% @equiv tag(Tag, [], Value)
   %% @doc
   -spec tag(Tag :: atom() | nonempty_string(),
  
positive.code: 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>"].
  
  %% @doc
  -spec autorefresh_hook(Session :: #session{}, GameInfo :: #gameinfo{}) ->
  
negative.code:     navig_links(
        case Session#session.username of
            [_ | _] ->
                [{"/", gettext(Session, txt_home, [])},
                 {url([{?Q_PAGE, ?PAGE_EXIT}]), gettext(Session, txt_logout, [])}];
            _ ->
                [{"/", gettext(Session, txt_authenticate, [])}]
        end,
        [{prepend, gettext(Session, txt_game, []) ++ " #" ++
              integer_to_list(GameInfo#gameinfo.id) ++ ": "}]).
  