dw_fluffos_v2/
dw_fluffos_v2/fluffos-2.9-ds2.05/
dw_fluffos_v2/fluffos-2.9-ds2.05/ChangeLog.old/
dw_fluffos_v2/fluffos-2.9-ds2.05/Win32/
dw_fluffos_v2/fluffos-2.9-ds2.05/compat/
dw_fluffos_v2/fluffos-2.9-ds2.05/compat/simuls/
dw_fluffos_v2/fluffos-2.9-ds2.05/include/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/clone/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/command/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/data/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/etc/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/include/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/inherit/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/inherit/master/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/log/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/tests/compiler/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/tests/efuns/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/tests/operators/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/u/
dw_fluffos_v2/fluffos-2.9-ds2.05/tmp/
dw_fluffos_v2/fluffos-2.9-ds2.05/windows/
dw_fluffos_v2/lib/
dw_fluffos_v2/lib/binaries/cmds/
dw_fluffos_v2/lib/binaries/cmds/creator/
dw_fluffos_v2/lib/binaries/cmds/living/
dw_fluffos_v2/lib/binaries/cmds/player/
dw_fluffos_v2/lib/binaries/d/admin/obj/
dw_fluffos_v2/lib/binaries/d/liaison/
dw_fluffos_v2/lib/binaries/global/virtual/
dw_fluffos_v2/lib/binaries/global/virtual/setup_compiler/
dw_fluffos_v2/lib/binaries/obj/handlers/autodoc/
dw_fluffos_v2/lib/binaries/obj/handlers/terrain_things/
dw_fluffos_v2/lib/binaries/obj/misc/
dw_fluffos_v2/lib/binaries/obj/misc/buckets/
dw_fluffos_v2/lib/binaries/obj/monster/
dw_fluffos_v2/lib/binaries/obj/reactions/
dw_fluffos_v2/lib/binaries/obj/reagents/
dw_fluffos_v2/lib/binaries/secure/cmds/creator/
dw_fluffos_v2/lib/binaries/secure/master/
dw_fluffos_v2/lib/binaries/std/
dw_fluffos_v2/lib/binaries/std/dom/
dw_fluffos_v2/lib/binaries/std/effects/object/
dw_fluffos_v2/lib/binaries/std/guilds/
dw_fluffos_v2/lib/binaries/std/languages/
dw_fluffos_v2/lib/binaries/std/races/
dw_fluffos_v2/lib/binaries/std/room/
dw_fluffos_v2/lib/binaries/std/room/basic/
dw_fluffos_v2/lib/binaries/std/shops/
dw_fluffos_v2/lib/binaries/std/shops/inherit/
dw_fluffos_v2/lib/binaries/www/
dw_fluffos_v2/lib/cmds/guild-race/
dw_fluffos_v2/lib/cmds/guild-race/crafts/
dw_fluffos_v2/lib/cmds/guild-race/other/
dw_fluffos_v2/lib/cmds/playtester/
dw_fluffos_v2/lib/cmds/playtester/senior/
dw_fluffos_v2/lib/d/admin/
dw_fluffos_v2/lib/d/admin/log/
dw_fluffos_v2/lib/d/admin/mapper/31-10-01/mapmaker/event/
dw_fluffos_v2/lib/d/admin/meetings/
dw_fluffos_v2/lib/d/admin/obj/
dw_fluffos_v2/lib/d/admin/room/we_care/
dw_fluffos_v2/lib/d/admin/save/
dw_fluffos_v2/lib/d/dist/
dw_fluffos_v2/lib/d/dist/mtf/
dw_fluffos_v2/lib/d/dist/pumpkin/
dw_fluffos_v2/lib/d/dist/pumpkin/chars/
dw_fluffos_v2/lib/d/dist/pumpkin/desert/
dw_fluffos_v2/lib/d/dist/pumpkin/gumboot/
dw_fluffos_v2/lib/d/dist/pumpkin/hospital/
dw_fluffos_v2/lib/d/dist/pumpkin/inherit/
dw_fluffos_v2/lib/d/dist/pumpkin/map/
dw_fluffos_v2/lib/d/dist/pumpkin/plain/
dw_fluffos_v2/lib/d/dist/pumpkin/pumpkin/
dw_fluffos_v2/lib/d/dist/pumpkin/save/
dw_fluffos_v2/lib/d/dist/pumpkin/squash/
dw_fluffos_v2/lib/d/dist/pumpkin/terrain/
dw_fluffos_v2/lib/d/dist/pumpkin/woods/
dw_fluffos_v2/lib/d/dist/start/
dw_fluffos_v2/lib/d/learning/TinyTown/buildings/
dw_fluffos_v2/lib/d/learning/TinyTown/map/
dw_fluffos_v2/lib/d/learning/TinyTown/roads/
dw_fluffos_v2/lib/d/learning/add_command/
dw_fluffos_v2/lib/d/learning/arms_and_weps/
dw_fluffos_v2/lib/d/learning/chars/
dw_fluffos_v2/lib/d/learning/cutnpaste/
dw_fluffos_v2/lib/d/learning/examples/npcs/
dw_fluffos_v2/lib/d/learning/examples/player_houses/npcs/
dw_fluffos_v2/lib/d/learning/examples/terrain_map/basic/
dw_fluffos_v2/lib/d/learning/functions/
dw_fluffos_v2/lib/d/learning/handlers/
dw_fluffos_v2/lib/d/learning/help_topics/npcs/
dw_fluffos_v2/lib/d/learning/help_topics/objects/
dw_fluffos_v2/lib/d/learning/help_topics/rcs_demo/
dw_fluffos_v2/lib/d/learning/help_topics/rooms/
dw_fluffos_v2/lib/d/learning/help_topics/rooms/crowd/
dw_fluffos_v2/lib/d/learning/help_topics/rooms/situations/
dw_fluffos_v2/lib/d/learning/items/
dw_fluffos_v2/lib/d/learning/save/
dw_fluffos_v2/lib/d/liaison/
dw_fluffos_v2/lib/d/liaison/NEWBIE/doc/
dw_fluffos_v2/lib/d/liaison/NEWBIE/save/oldlog/
dw_fluffos_v2/lib/db/
dw_fluffos_v2/lib/doc/
dw_fluffos_v2/lib/doc/creator/
dw_fluffos_v2/lib/doc/creator/autodoc/include/reaction/
dw_fluffos_v2/lib/doc/creator/autodoc/include/ritual_system/
dw_fluffos_v2/lib/doc/creator/autodoc/include/talker/
dw_fluffos_v2/lib/doc/creator/autodoc/include/terrain_map/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/baggage/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/clock/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/clothing/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/cont_save/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/corpse/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/money/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/monster/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/scabbard/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/service_provider/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/state_changer/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/wand/
dw_fluffos_v2/lib/doc/creator/autodoc/std/book_dir/
dw_fluffos_v2/lib/doc/creator/autodoc/std/key/
dw_fluffos_v2/lib/doc/creator/autodoc/std/learning/
dw_fluffos_v2/lib/doc/creator/autodoc/std/map/
dw_fluffos_v2/lib/doc/creator/autodoc/std/race/
dw_fluffos_v2/lib/doc/creator/autodoc/std/weapon_logic/
dw_fluffos_v2/lib/doc/creator/files/
dw_fluffos_v2/lib/doc/creator/policy/
dw_fluffos_v2/lib/doc/creator/room/
dw_fluffos_v2/lib/doc/effects/
dw_fluffos_v2/lib/doc/ideas/
dw_fluffos_v2/lib/doc/known_command/
dw_fluffos_v2/lib/doc/lpc/basic_manual/
dw_fluffos_v2/lib/doc/lpc/intermediate/
dw_fluffos_v2/lib/doc/new/add_command/
dw_fluffos_v2/lib/doc/new/handlers/
dw_fluffos_v2/lib/doc/new/living/
dw_fluffos_v2/lib/doc/new/living/race/
dw_fluffos_v2/lib/doc/new/living/spells/
dw_fluffos_v2/lib/doc/new/player/
dw_fluffos_v2/lib/doc/new/room/guild/
dw_fluffos_v2/lib/doc/new/room/outside/
dw_fluffos_v2/lib/doc/new/room/storeroom/
dw_fluffos_v2/lib/doc/object/
dw_fluffos_v2/lib/doc/playtesters/
dw_fluffos_v2/lib/doc/policy/
dw_fluffos_v2/lib/doc/weapons/
dw_fluffos_v2/lib/global/handlers/
dw_fluffos_v2/lib/global/virtual/setup_compiler/
dw_fluffos_v2/lib/include/
dw_fluffos_v2/lib/include/cmds/
dw_fluffos_v2/lib/include/effects/
dw_fluffos_v2/lib/include/npc/
dw_fluffos_v2/lib/include/shops/
dw_fluffos_v2/lib/net/daemon/chars/
dw_fluffos_v2/lib/net/inherit/
dw_fluffos_v2/lib/net/intermud3/
dw_fluffos_v2/lib/net/intermud3/services/
dw_fluffos_v2/lib/net/obj/
dw_fluffos_v2/lib/net/save/
dw_fluffos_v2/lib/net/smnmp/
dw_fluffos_v2/lib/net/snmp/
dw_fluffos_v2/lib/obj/amulets/
dw_fluffos_v2/lib/obj/b_day/
dw_fluffos_v2/lib/obj/examples/
dw_fluffos_v2/lib/obj/food/alcohol/
dw_fluffos_v2/lib/obj/food/chocolates/
dw_fluffos_v2/lib/obj/food/fruits/
dw_fluffos_v2/lib/obj/food/meat/
dw_fluffos_v2/lib/obj/food/nuts/
dw_fluffos_v2/lib/obj/food/seafood/
dw_fluffos_v2/lib/obj/food/vegetables/
dw_fluffos_v2/lib/obj/fungi/
dw_fluffos_v2/lib/obj/furnitures/artwork/
dw_fluffos_v2/lib/obj/furnitures/bathroom/
dw_fluffos_v2/lib/obj/furnitures/beds/
dw_fluffos_v2/lib/obj/furnitures/cabinets/
dw_fluffos_v2/lib/obj/furnitures/chairs/
dw_fluffos_v2/lib/obj/furnitures/chests/
dw_fluffos_v2/lib/obj/furnitures/clocks/
dw_fluffos_v2/lib/obj/furnitures/crockery/
dw_fluffos_v2/lib/obj/furnitures/cupboards/
dw_fluffos_v2/lib/obj/furnitures/cushions/
dw_fluffos_v2/lib/obj/furnitures/fake_plants/
dw_fluffos_v2/lib/obj/furnitures/lamps/
dw_fluffos_v2/lib/obj/furnitures/mirrors/
dw_fluffos_v2/lib/obj/furnitures/outdoor/
dw_fluffos_v2/lib/obj/furnitures/safes/
dw_fluffos_v2/lib/obj/furnitures/shelves/
dw_fluffos_v2/lib/obj/furnitures/sideboards/
dw_fluffos_v2/lib/obj/furnitures/sofas/
dw_fluffos_v2/lib/obj/furnitures/stoves/
dw_fluffos_v2/lib/obj/furnitures/tables/
dw_fluffos_v2/lib/obj/furnitures/wardrobes/
dw_fluffos_v2/lib/obj/handlers/
dw_fluffos_v2/lib/obj/handlers/autodoc/
dw_fluffos_v2/lib/obj/jewellery/anklets/
dw_fluffos_v2/lib/obj/jewellery/bracelets/
dw_fluffos_v2/lib/obj/jewellery/earrings/
dw_fluffos_v2/lib/obj/jewellery/misc/
dw_fluffos_v2/lib/obj/jewellery/necklaces/
dw_fluffos_v2/lib/obj/jewellery/rings/
dw_fluffos_v2/lib/obj/media/
dw_fluffos_v2/lib/obj/misc/buckets/
dw_fluffos_v2/lib/obj/misc/jars/
dw_fluffos_v2/lib/obj/misc/papers/
dw_fluffos_v2/lib/obj/misc/player_shop/
dw_fluffos_v2/lib/obj/misc/shops/
dw_fluffos_v2/lib/obj/misc/traps/
dw_fluffos_v2/lib/obj/monster/
dw_fluffos_v2/lib/obj/monster/godmother/
dw_fluffos_v2/lib/obj/monster/transport/
dw_fluffos_v2/lib/obj/plants/inherit/
dw_fluffos_v2/lib/obj/potions/
dw_fluffos_v2/lib/open/boards/
dw_fluffos_v2/lib/save/autodoc/
dw_fluffos_v2/lib/save/bank_accounts/
dw_fluffos_v2/lib/save/boards/frog/
dw_fluffos_v2/lib/save/books/bed_catalog/
dw_fluffos_v2/lib/save/creators/
dw_fluffos_v2/lib/save/mail/
dw_fluffos_v2/lib/save/mail/p/
dw_fluffos_v2/lib/save/soul/data/
dw_fluffos_v2/lib/save/tasks/
dw_fluffos_v2/lib/save/vaults/
dw_fluffos_v2/lib/secure/cmds/lord/
dw_fluffos_v2/lib/secure/config/
dw_fluffos_v2/lib/secure/items/
dw_fluffos_v2/lib/secure/player/
dw_fluffos_v2/lib/soul/
dw_fluffos_v2/lib/soul/i/
dw_fluffos_v2/lib/soul/j/
dw_fluffos_v2/lib/soul/k/
dw_fluffos_v2/lib/soul/o/
dw_fluffos_v2/lib/soul/q/
dw_fluffos_v2/lib/soul/to_approve/
dw_fluffos_v2/lib/soul/u/
dw_fluffos_v2/lib/soul/v/
dw_fluffos_v2/lib/soul/wish_list/
dw_fluffos_v2/lib/soul/y/
dw_fluffos_v2/lib/soul/z/
dw_fluffos_v2/lib/std/creator/
dw_fluffos_v2/lib/std/effects/
dw_fluffos_v2/lib/std/effects/attached/
dw_fluffos_v2/lib/std/effects/external/
dw_fluffos_v2/lib/std/effects/fighting/
dw_fluffos_v2/lib/std/effects/other/
dw_fluffos_v2/lib/std/environ/
dw_fluffos_v2/lib/std/guilds/
dw_fluffos_v2/lib/std/hospital/
dw_fluffos_v2/lib/std/house/
dw_fluffos_v2/lib/std/house/onebedhouse/
dw_fluffos_v2/lib/std/house/onebedhut/
dw_fluffos_v2/lib/std/house/tworoomflat/
dw_fluffos_v2/lib/std/languages/
dw_fluffos_v2/lib/std/liquids/
dw_fluffos_v2/lib/std/nationality/
dw_fluffos_v2/lib/std/nationality/accents/
dw_fluffos_v2/lib/std/nationality/accents/national/
dw_fluffos_v2/lib/std/nationality/accents/regional/
dw_fluffos_v2/lib/std/npc/goals/
dw_fluffos_v2/lib/std/npc/goals/basic/
dw_fluffos_v2/lib/std/npc/goals/misc/
dw_fluffos_v2/lib/std/npc/inherit/
dw_fluffos_v2/lib/std/npc/plans/
dw_fluffos_v2/lib/std/npc/plans/basic/
dw_fluffos_v2/lib/std/outsides/
dw_fluffos_v2/lib/std/races/shadows/
dw_fluffos_v2/lib/std/room/basic/topography/
dw_fluffos_v2/lib/std/room/controller/
dw_fluffos_v2/lib/std/room/controller/topography/
dw_fluffos_v2/lib/std/room/furniture/games/
dw_fluffos_v2/lib/std/room/furniture/inherit/
dw_fluffos_v2/lib/std/room/inherit/carriage/
dw_fluffos_v2/lib/std/room/inherit/topography/
dw_fluffos_v2/lib/std/room/punishments/
dw_fluffos_v2/lib/std/room/topography/area/
dw_fluffos_v2/lib/std/room/topography/iroom/
dw_fluffos_v2/lib/std/room/topography/milestone/
dw_fluffos_v2/lib/std/shadows/
dw_fluffos_v2/lib/std/shadows/attached/
dw_fluffos_v2/lib/std/shadows/curses/
dw_fluffos_v2/lib/std/shadows/disease/
dw_fluffos_v2/lib/std/shadows/fighting/
dw_fluffos_v2/lib/std/shadows/room/
dw_fluffos_v2/lib/std/shops/controllers/
dw_fluffos_v2/lib/std/shops/objs/
dw_fluffos_v2/lib/std/shops/player_shop/
dw_fluffos_v2/lib/std/shops/player_shop/office_code/
dw_fluffos_v2/lib/std/socket/
dw_fluffos_v2/lib/www/
dw_fluffos_v2/lib/www/external/autodoc/
dw_fluffos_v2/lib/www/external/java/telnet/Documentation/
dw_fluffos_v2/lib/www/external/java/telnet/Documentation/images/
dw_fluffos_v2/lib/www/external/java/telnet/examples/
dw_fluffos_v2/lib/www/external/java/telnet/tools/
dw_fluffos_v2/lib/www/pics/
dw_fluffos_v2/lib/www/secure/creator/
dw_fluffos_v2/lib/www/secure/editors/
dw_fluffos_v2/lib/www/secure/survey_results/
dw_fluffos_v2/win32/
#include <nomic_system.h>
#include <http.h>
#include <player_handler.h>

/*
 * Makes all the '<' turn into $gt; and the '>' the same.
 */
string htmlify(string  str) {
  return replace(str, ({ "<", "&lt;", ">", "&gt;", "\n", "<br>",
                         "&", "&amp;", " ", "%20" }));
} /* htmlify() */

string make_header(string title) {
   return "<html<head><title>" + title + "</title></head>\n"
          "<body bgcolor=#ffffff TEXT=#000030 LINK=#4a529c VLINK=#b57339>\n"
          "<font face=\"arial, helvetica\">\n"
          "<h2>Discworld MUD</h2>\n"
          "<h4><i>Where players grow and multiply</i></h4>\n"
          "<br clear=both>";
} /* make_header() */

string show_motions(string area, class http_request req) {
   class nomic_motion* motions;
   class nomic_motion motion;
   string ret;

   ret = make_header(area);

   if (NOMIC_HANDLER->is_citizen_of(area, req->user)) {
      motions = NOMIC_HANDLER->query_all_motions(area);
      if (!NOMIC_HANDLER->is_magistrate_of(area, req->user)) {
         motions = filter(motions, (: ((class nomic_motion)$1)->state == NOMIC_STATE_CITIZEN_VOTE :));
      }
      if (sizeof(motions)) {
         ret += "<h3>Voting</h3>\n<blockquote>\n";
         foreach (motion in motions) {
            ret += NOMIC_HANDLER->motion_as_html(area, motion);

            if (motion->state != NOMIC_STATE_CITIZEN_VOTE &&
                motion->state != NOMIC_STATE_COUNCIL_VOTE) {
               ret += "<h4>Not in a voting state</h4>";
            } else if (!NOMIC_HANDLER->has_voted_for_motion(area,
                                                     motion->identifier,
                                                     req->user)) {
               ret += "<h4>Vote <a href=\"nomic_rules.c?type=vote&area=" +
                      htmlify(area) + "&vote=yes&id=" + motion->identifier +
                      "\">Yes</a> | ";
               ret += "<a href=\"nomic_rules.c?type=vote&area=" +
                      htmlify(area) + "&vote=no&id=" + motion->identifier +
                      "\">No</a> | ";
               ret += "<a href=\"nomic_rules.c?type=vote&area=" +
                      htmlify(area) + "&vote=abstain&id=" + motion->identifier +
                      "\">Abstain</a></h4>";
            } else {
               ret += "<h4>Already voted</h4>";
            }
         }
         ret += "</blockquote>\n";
      }
   } else {
      ret += "You are not a citizen of " + area + ".\n";
   }
   return ret + ("/www/footer"->www_function("footer", ([ ]), req)) +
          "</body></html>";
}

string show_area(string area, class http_request req) {
   string ret;
   class nomic_rule* rules;
   int cur_type;
   class nomic_rule rule;
   string *magistrates;

   ret = make_header(area);

   magistrates = NOMIC_HANDLER->query_magistrates(area);
    
   ret += "<br>\n";

   if (sizeof(magistrates)) { 
      ret += "<b>Magistrates:</b> " + 
         query_multiple_short(map(magistrates,
         (: "<a href=\"finger.c?player=" + $1 + "\">" +
         $1 + "</a>\n" :) )) + "\n";
   }
   else {
       ret += "<b>There are no elected magistrates in " + area + ".</b>\n";
   }

   ret += "<br>\n";

   // First figure out if there is anything to vote for.
   if (NOMIC_HANDLER->is_citizen_of(area, req->user)) {
      if (NOMIC_HANDLER->query_citizen_board(area)) {
         ret += "<b>Boards:</b> <a href=\"boards.c?type=subject&board=" +
                htmlify(NOMIC_HANDLER->query_citizen_board(area)) +                             "\">Citizen board</a>";
         if (NOMIC_HANDLER->is_magistrate_of(area, req->user) &&
             NOMIC_HANDLER->query_magistrate_board(area)) {
            ret += ", <a href=\"boards.c?type=subject&board=" +
                   htmlify(NOMIC_HANDLER->query_magistrate_board(area)) +
                   "\">Magistrate board</a>";
         }
         ret += "<p>";
      }
      

      if (NOMIC_HANDLER->is_election_phase(area)) {
         ret += "There is currently an election on, you can "
                "<a href=\"nomic_rules.c?type=voting&area=" + htmlify(area) +
                "\">vote here</a>.<p>";
      }
   }

   rules = NOMIC_HANDLER->query_all_nomic_rules(area);
   rules = sort_array(rules, (: ((class nomic_rule)$1)->id -
                                ((class nomic_rule)$2)->id :) );
   cur_type = -1;
   foreach (rule in rules) {
      if (rule->type != cur_type) {
         switch (rule->type) {
         case NOMIC_TYPE_IMMUTABLE :
            ret += "<h3>Immutable rules</h3>\n"
                   "<blockquote><font color=brown>These are the unchangeable default set of rules for "
                   "the council.</font></blockquote><p>";
            break;
         case NOMIC_TYPE_CITIZEN   :
            ret += "<h3>Citizen rules</h3>\n"
                   "<blockquote><font color=brown>These are the rules that only effect the citizens of "
                   "the council.</font></blockquote><p>";
            break;
         case NOMIC_TYPE_GENERAL   :
            ret += "<h3>General rules</h3>\n"
                   "<blockquote><font color=brown>These are the rules that effect everyone in the "
                   "jurisdiction of the council.</font></blockquote><p>";
            break;
         }
         cur_type = rule->type;
      }
      ret += "<li>" + NOMIC_HANDLER->rule_as_html(rule);
      ret += "<p>\n";
   }
   return ret + ("/www/footer"->www_function("footer", ([ ]), req)) +
          "</body></html>";
} /* show_area() */

string query_main_vote_page(string area, mapping people) {
   string person;
   string ret;

   ret = "<form method=post action=\"nomic_rules.c?area=" +
          htmlify(area) + "&type=mainvote\">\n";
   foreach (person in NOMIC_HANDLER->query_can_vote_for(area)) {
      ret += "<input type=checkbox name=\"vote_" + person +
           "\" value=1";
      if (people["vote_" + person]) {
         ret += " checked";
      }
      ret += "> " + person + "<br>\n";
   }
   ret += "<input  type=hidden name=type value=mainvote>\n";
   ret += "<input  type=hidden name=area value=\"" + area + "\">\n";
   ret += "<input type=submit name=\"Vote!\">\n";
   ret += "</form>";
   return ret;
}

string show_main_vote(string area, class http_request req) {
   string ret;

   ret = make_header(area);
   ret += "<b>Current Magistrates:</b> " + 
          query_multiple_short(map(NOMIC_HANDLER->query_magistrates(area),
                                   (: "<a href=\"finger.c?player=" + $1 + "\">" +
                                      $1 + "</a>\n" :) )) + "\n";
   ret += "<br>\n";

   // First figure out if there is anything to vote for.
   if (NOMIC_HANDLER->is_citizen_of(area, req->user)) {
      if (NOMIC_HANDLER->is_election_phase(area)) {
         if (NOMIC_HANDLER->has_voted(area, req->user)) {
            ret += "You have already voted in this election.<p>\n";
         } else {
            ret += query_main_vote_page(area, ([ ]));
         }
      } else {
         ret += "Not in the election phase.\n";
      }
   }

   ret += "Show the main <a href=\"nomic_rules.c?type=area&area=" +
          htmlify(area) + "\">" + area + "</a> page.\n<p>";

   return ret + ("/www/footer"->www_function("footer", ([ ]), req)) +
          "</body></html>";
} /* show_main_vote() */

string citizen_vote(string area, class http_request req) {
   string ret;
   string person;
   int num;

   ret = make_header(area);
   ret += "<b>Current Magistrates:</b> " + 
          query_multiple_short(map(NOMIC_HANDLER->query_magistrates(area),
                                   (: "<a href=\"finger.c?player=" + $1 + "\">" +
                                      $1 + "</a>\n" :) )) + "\n";
   if (NOMIC_HANDLER->is_citizen_of(area, req->user)) {
      if (NOMIC_HANDLER->is_election_phase(area)) {
         if (NOMIC_HANDLER->has_voted(area, req->user)) {
            ret += "You have already voted in this election.<p>\n";
         } else {
            ret += "<p>You have decided to vote for:\n";
            ret += "<form method=post action=\"nomic_rules.c?area=" +
                   htmlify(area) + "&type=mainvoteconfirm\">\n";
            ret += "<ul>";
            foreach (person in NOMIC_HANDLER->query_can_vote_for(area)) {
               if (req->body->data["vote_" + person]) {
                  ret += "<li><input type=hidden name=\"vote_" + person +
                          "\" value=1>" + person + "<br>";
                  num++;
               }
            }
            ret += "</ul>";
            ret += "<input  type=hidden name=type value=mainvote>\n";
            ret += "<input  type=hidden name=area value=\"" + area + "\">\n";
            if (num > NOMIC_HANDLER->query_number_of_magistrates(area)) {
               ret += "You have voted for too many magistrates.<p></form>";
               // put the voting form in here.
               ret += query_main_vote_page(area, req->body->data);
            } else {
               if (num < NOMIC_HANDLER->query_number_of_magistrates(area)) {
                  ret += "You are voting for " + query_num(num) +
                         " magistrates out of " +
                         query_num(NOMIC_HANDLER->query_number_of_magistrates(area)) +
                         ".<p>";
               }
               ret += "<input type=submit value=\"Confirm\" name=\"Confirm\">\n";
               ret += "</form>";
            }
         }
      } else {
         ret += "Not in the election phase.\n";
      }
   }
   //ret += replace(sprintf("%O", req->body->data), ({ " ", "&nbsp;", "\n", "<br>" }));

   ret += "Show the main <a href=\"nomic_rules.c?type=area&area=" +
          htmlify(area) + "\">" + area + "</a> page.\n<p>";

   return ret + ("/www/footer"->www_function("footer", ([ ]), req)) +
          "</body></html>";
} /* citizen_vote() */

string citizen_vote_confirm(string area, class http_request req) {
   string ret;
   string person;
   string* voted;

   ret = make_header(area);
   ret += "<b>Current Magistrates:</b> " + 
          query_multiple_short(map(NOMIC_HANDLER->query_magistrates(area),
                                   (: "<a href=\"finger.c?player=" + $1 + "\">" +
                                      $1 + "</a>\n" :) )) + "\n";
   if (NOMIC_HANDLER->is_citizen_of(area, req->user)) {
      if (NOMIC_HANDLER->is_election_phase(area)) {
         if (NOMIC_HANDLER->has_voted(area, req->user)) {
            ret += "You have already voted in this election.<p>\n";
         } else {
            ret += "<p>You have decided to vote for:\n";
            ret += "<ul>";
            voted = ({ });
            foreach (person in NOMIC_HANDLER->query_can_vote_for(area)) {
               if (req->body->data["vote_" + person]) {
                  ret += "<li>" + person;
                  voted += ({ person });
               }
            }
            ret += "</ul>";
            if (sizeof(voted) > NOMIC_HANDLER->query_number_of_magistrates(area)) {
               ret += "You are trying to vote for too many magistrates.\n";
               // put the voting form in here.
               ret += query_main_vote_page(area, req->body->data);
            } else {
               if (NOMIC_HANDLER->vote_for_people(area, voted, req->user)) {
                  ret += "You have voted for " + query_num(sizeof(voted)) +
                         " magistrates out of " +
                         query_num(NOMIC_HANDLER->query_number_of_magistrates(area)) +
                         ".<p>";
               } else {
                  ret += "There was an error trying to vote.<p>";
               }
            }
         }
      } else {
         ret += "Not in the election phase.\n";
      }
   }

   ret += "Show the main <a href=\"nomic_rules.c?type=area&area=" +
          htmlify(area) + "\">" + area + "</a> page.\n<p>";

   //ret += replace(sprintf("%O", req->body->data), ({ " ", "&nbsp;", "\n", "<br>" }));
   return ret + ("/www/footer"->www_function("footer", ([ ]), req)) +
          "</body></html>";
} /* citizen_vote() */

string do_vote(string area, string vote, string id, class http_request req) {
   int vote_id;
   int int_id;
   int bad;
   class nomic_motion motion;
   string ret;

   ret = make_header(area);
   switch (vote) {
   case "yes" :
      vote_id = NOMIC_VOTE_YES;
      break;
   case "no" :
      vote_id = NOMIC_VOTE_NO;
      break;
   case "abstain" :
      vote_id = NOMIC_VOTE_ABSTAIN;
      break;
   default:
      bad = 1;
      break;
   }

   if (sscanf(id, "%d", int_id) != 1 || bad) {
      ret += "<h1>Could not find the thing to vote for " + id + "</h1>";
   } else {
      if (!NOMIC_HANDLER->has_voted_for_motion(area, int_id, 
                        req->user)) {
         // Ok, find the motion.
         motion = NOMIC_HANDLER->query_motion(area, int_id);
         if (!motion) {
            ret += "<h1>Could not find the thing to vote for " + id + "</h1>";
         } else {
            ret += NOMIC_HANDLER->motion_as_html(area, motion);
            if (NOMIC_HANDLER->vote_for_motion(area, int_id,
                     vote_id, req->user)) {
               ret += "<h4>Voted " + vote + " for the above motion.</h4>\n";
            } else {
               ret += "<h4>Failed to vote " + vote +
                      " for the above motion.</h4>\n";
            }
         }
      } else {
         ret += "<h1>Already voted for the motion " + id + "</h1>" +
                NOMIC_HANDLER->motion_as_html(area, motion);
      }
   }
   ret += "<a href=\"nomic_rules.c?type=area&area=" + htmlify(area) +
          "\">Return to " + area + "</a>";
   return ret + ("/www/footer"->www_function("footer", ([ ]), req)) +
          "</body></html>";
} /* do_vote() */

string show_all_areas(class http_request req) {
   string ret;
   string area;
   class nomic_motion* motions;

   ret = make_header("Council Areas");
   ret += "<ul>\n";
   foreach (area in NOMIC_HANDLER->query_citizenship_areas()) {
      ret += "<li>" + capitalize(area) + "\n";
      ret += "<font size=-1>[<i><a href=\"nomic_rules.c?type=area&area=" +
                htmlify(area) +
                "\">Rules</a></i>]";
      if (NOMIC_HANDLER->is_citizen_of(area, req->user) &&
          NOMIC_HANDLER->query_citizen_board(area)) {
         if (NOMIC_HANDLER->is_election_phase(area) &&
             !NOMIC_HANDLER->has_voted(area, req->user)) {
            ret += " | <i><a href=\"nomic_rules.c?type=voting&area=" +
                   htmlify(area) + "\">Magistrate Vote</a>";
         }
         motions = NOMIC_HANDLER->query_all_motions(area);
         if (!NOMIC_HANDLER->is_magistrate_of(area, req->user)) {
            motions = filter(motions, (: ((class nomic_motion)$1)->state == NOMIC_STATE_CITIZEN_VOTE :));
         }
         if (sizeof(motions)) {
            ret += " | <i><a href=\"nomic_rules.c?type=motions&area=" +
                   htmlify(area) + "\">Motions</a>";
         }
         ret += " | <i><a href=\"boards.c?type=subject&board=" +
                htmlify(NOMIC_HANDLER->query_citizen_board(area)) +
                "\">Citizen board</a>";
         if (NOMIC_HANDLER->is_magistrate_of(area, req->user) &&
             NOMIC_HANDLER->query_magistrate_board(area)) {
            ret += " | <a href=\"boards.c?type=subject&board=" +
                   htmlify(NOMIC_HANDLER->query_magistrate_board(area)) +
                   "\">Magistrate board</a>";
         }
         ret += "</i>]";
      }

      ret += "</font>";
   }
   ret += "</ul>\n";
   ret += "<h3>Help files relating to the council</h3>\n";
   ret += "<ul>\n";
   ret += "<li><a href=\"http://discworld.imaginary.com:5678/documentation.c?path=/concepts/citizenship\">Citizenship</a> - what citizenship means to you.\n";
   ret += "<li><a href=\"http://discworld.imaginary.com:5678/documentation.c?path=/room/chambers\">Council Chambers</a> - where you vote on new rules.\n";
   ret += "<li><a href=\"http://discworld.imaginary.com:5678/documentation.c?path=/room/citizenship\">Council Citizenship Room</a> - become a citizen today.\n";
   ret += "<li><a href=\"http://discworld.imaginary.com:5678/documentation.c?path=/room/cases\">Courts</a> - where you make a case and see judgements.\n";
   ret += "</ul>\n";
   return ret + ("/www/footer"->www_function("footer", ([ ]), req)) +
          "</body></html>";
} /* show_all_areas() */

// this is the function which the webserver calls
string www_request(string str, mapping args, class http_request req) {
   switch (args["type"]) {
   case "vote" :
      return do_vote(args["area"], args["vote"], args["id"], req);
   case "mainvote" :
      return citizen_vote(args["area"], req);
   case "mainvoteconfirm" :
      return citizen_vote_confirm(args["area"], req);
   case "voting" :
      return show_main_vote(args["area"], req);
   case "area" :
      return show_area(args["area"], req);
   case "motions" :
      return show_motions(args["area"], req);
   default :
      return show_all_areas(req);
   }
}