#!/bin/env perl
# 
#       Program: build-folio.pl
#       Version: 1.0
#      Released: 27 Oct 2002
#        Author: Steve Hawtin
#       License: GPL Copyleft
#  
#  The Build Folio program generates web pages that let you navigate a set of 
#  files and directories.  Very good at generating thumbnailed indexes of 
#  directories containing a lot of images.  The way the web pages are generated
#  can be completely controlled via configuration files.  The program is built as a 
#  Perl 5 script which by default calls the Tk package to provide a graphical 
#  front end.
#
#  Originally developed on a PC running Windows, it should be able to run 
#  anywhere.  If you are running Windows on a PC then the best version of Perl 
#  to install is the one from ActiveState. If you are running UNIX or LINUX and 
#  you don't have a Perl installtion... INSTALL PERL NOW (you will feel better 
#  for it).
#  
#  The script includes its own documentation.  Either run the program and click 
#  on the Help button, or type the command:
#  
#      build-folio.pl -dir <dir_for_docs> -help
# 
# Detailed Changes:
#      0.6   14 May 2002
#        Sent out with "Florida 2002 v1.0" CD, limited distribution
#      0.7   18 May 2002
#        General release, created project on www.freshmeat.net
#        implemented the **only** mechanism
#        ${to_top} expansion variable
#        Use filename on wflio expansions
#        Use DirTree to select directory (if Tk::DirTree module available)
#        Define (and use) require_if_present that will ignore 
#          missing CPAN packages
#        Split script into packages
#        Implement the "prune" attribute
#        Changed the order of attribute names for attributes that 
#          are indexed by other attributes (eg filetype_render_*)
#      0.8
#        Complete rewrite to give a more generic way to specify 
#          pages
#        Specify tags and attributes from exended version of HTML 4 
#          definition
#      0.9   27 Sep 2002
#        General release, updated project on www.freshmeat.net
#        Changed title to pagetitle to reduce conflicts
#        Changed names of general tag attributes (title, style, id etc)
#          to distinguish them (changed to tagtitle, tagstyle, tagid etc)
#        Removed complaint if checking for non existant page relationship
#        Fixed file names with square and curley brackets
#      1.0   
#        Fixed singlepara for top level page without subdirs
#      1.1
#        Generate thumbnail images with GD by default
#
# Todo
#   Reimplement FPage concepts
#   Complete the documentation
#   Switch to using more CPAN modules
#   Test under X11 version of Tk
#   Create "attribute browser" to allow users to interactively
#     define folio files (and check effects)
#
    use strict;
    use Time::Local;
    use Cwd;
    use Carp;

    # Here are the global variables that leak between the various packages
    # in this file
    use vars ('$operating_system','$top_dir');
    use vars ('$prog_version','$prog_release','$prog_home','$prog_name');
    
    # Global variables defined for command line options
    use vars ('$start_dir','$hide_wfolio','$dont_use_icons','$ignore_empty_dirs');
    use vars ('$force_os','$no_fpage','$no_tk','$no_progress');
    use vars ('$no_fileselect','$no_dirtree','$flag_name','$help');
    use vars ('$simple_wflio','$usage','$fpage_present');
    use vars ('$progress_steps','$no_win32API');
    
    $prog_version = "1.1";
    $prog_release = "27 Nov 2007";
    $prog_home    = "http://tsort.info/software/index.htm";
    
    # This calls a function at the end of the script.  I have put all the 
    # high level functions right down there at the bottom so that I can 
    # test prototypes for the functions (well for some anyway)
    &main();

    # If we returned from main then we are done
    exit(0);

{
package Document;

    my(%defaults_structure);
    my(%default_values,%expand);
    
sub list_categories
  {
    my($cat) = @_;
    if(!$default_values{$cat})
      {
        ::add_output("Unknown document category $cat in list\n");
        return();
      }
    return(keys(%{$default_values{$cat}}));
  }

sub lookup
  {
    my($cat,$item) = @_;
    if(!$default_values{$cat})
      {
        ::add_output("Unknown document category $cat in lookup\n");
        return();
      }
    if(!${$default_values{$cat}}{$item})
      {
        ::add_output("Unknown $cat item $item in lookup\n");
        return();
      }
    return(%{${$default_values{$cat}}{$item}});
  }

sub top_init
  {
    %defaults_structure =
      (
        "wflio"     => ["*attrib","where","default","comment"],
        "htmltag"   => ["*tag","tagsrc","comment"],
        "tagattrib" => ["*tag","*wattrib","htmlattrib","tagsrc","comment"],
        "cmdline"   => ["*flag","default","var","param","comment"],
        "icon",     => ["*name","comment"],
        "pagefun"   => ["*function","arg","comment"],
        "pagestmt"  => ["*statement","context","args","comment"],
        "pageopr"   => ["*operator","prec","comment"],
        "pdsections" => ["*section","parent","comment"],
        "pd-tag"    => ["*name","tag","comment"],
        "bi-attrib" => ["*name","comment"],
        "variable"  => ["*name","pdsections","comment"],
      );
    %expand =
      (
        # Later replaced by a better name for the program
        "prog_name" => $0,

        "flame_address" => pack("i",1835101286)."es".pack("C",64).
                           "b".pack("i3",1969386601,1952803683,1836016430),

        "table_bg"     => "\"#ccffff\"",
        "table_headbg" => "\"#66ffff\"",
        "page_text"    => "\"#000066\"",
        "page_bg"      => "\"#FFFFCC\"",
        "page_link"    => "\"#0000EE\"",
        "page_vlink"   => "\"#551A8B\"",
        "page_alink"   => "\"#FF0000\"",
        "example_text" => "\"#000000\"",
        "example_bg"   => "\"#FFFFFF\"",

        "red"          => "\"#CC0000\"",
        "green"        => "\"#009900\"",
        "blue"         => "\"#3333FF\"",

        "st"           => "<tt><b>",
        "et"           => Page::backout("<tt><b>"),
        
        "prog_version" => $::prog_version,
        "prog_release" => $::prog_release,
        "prog_home"    => $::prog_home,
        "doc_head" => <<"EndDocHead",
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   <meta name="Generator" content="{{prog_name}}">
   <meta name="Author" content="Steve Hawtin">
   <title>Build Folio Help</title>
</head>
<body text={{page_text}} bgcolor={{page_bg}} 
      link={{page_link}} vlink={{page_vlink}} alink={{page_alink}}>
EndDocHead
        "doc_foot" => <<"EndFoot",
<hr|height=1/>
<table cols=5><tr><td width=20%>&nbsp;</td><td colspan=3>
<center><font size=-1>The program was 
created by {{shawtin_href}}.  It is distributed without any warranty express
or implied.  You may copy the program unmodified under the terms of
the GPL.  You may not distribute modified copies of the program under
the same name, if you change the program in any way please distribute it
under a significantly different name (i.e. not {{st}}build-folio.pl{{et}}
and certainly not {{st}}build-folio-2.pl{{et}}).</font></center>
</td><td width=20%>&nbsp;</td></tr></table>
</body>
</html>
EndFoot

        "start_example" => <<"EndDocHead",
<table border cols=1 width="80%" bgcolor={{example_bg}} align="center">
<tr><td><font color={{example_text}}>{{st}}<pre>
EndDocHead
        "end_example" => Page::backout(<<"EndDocHead"),
<table border cols=1 width="80%" bgcolor={{example_bg}} align="center">
<tr><td><font color={{example_text}}>{{st}}<pre>
EndDocHead

# The documentation that is generated has the following shape:
#
# readme.html ..............................
#   generated
#     cmdline
#   doclist
#   shawtin
# tutorial.html ...........................
#   folio
#     folio format
#       folio regex
#     folio render
#     folio example
#   elements
#     elements attrib
#     elements sections
#     elements vars
#     elements icons
#   html
#   pagedef
#     pagedef statements
#     pagedef funs
#     pagedef example
#   fpage
#   perlscript
#     special_action
# reference.html ..........................
#   pagedef
#     attributes
#     bi-attributes
#     vars
#     statements
#     funs
#     operators
#   html
#     html tags
#     html attributes
#     tagdef ????
#     html tagsrc
#     html coltable
#
        # Getting to other files
        "intro_loc"   => '{{prog_name}}-readme.html',
        "tutorial_loc"  => '{{prog_name}}-tutorial.html',
        "ref_loc"     => '{{prog_name}}-reference.html',
        "webpage_href" => '<a href="{{prog_home}}">{{prog_home}}</a>',

        # Some key phrases with common shapes
        "program_href" => '<a href="{{intro_loc}}"><i><b>Build Folio</b></i></a>',
        "wflio_href"   => '<a href="{{intro_loc}}#wflio"><b>WFolio</b></a>',
        "cmdline_href" => '<a href="{{intro_loc}}#cmdline">command line</a>',
        "shawtin_href" => '<a href="{{intro_loc}}#shawtin">Steve Hawtin</a>',

        "tutorial_href" => '<a href="{{tutorial_loc}}"><i><b>Build Folio</b></i> tutorials</a>',
        "folio_href" =>   '<b><i><a href="{{tutorial_loc}}#folio">Folio</a></i></b>',
        "regex_href" =>   '<a href="{{tutorial_loc}}#folio regex">pattern</a>',
        "render_href" =>  '<a href="{{tutorial_loc}}#folio render">render</a>',
        "example_href" => '<a href="{{tutorial_loc}}#folio example">example <i><b>Folio</b></i> File</a>',

        "elements_href" =>  '<a href="{{tutorial_loc}}#elements"><b><i>Folio Elements</i></b></a>',
        "section_href" => '<a href="{{tutorial_loc}}#elements sections">sections</a>',
        "attrib_href" =>  '<a href="{{tutorial_loc}}#elements attrib"><b><i>Folio Attributes</i></b></a>',
        "vars_href" =>    '<a href="{{tutorial_loc}}#elements vars"><b><i>Folio Variables</i></b></a>',
        "icons_href" =>   '<a href="{{tutorial_loc}}#elements icons">icons</a>',
        
        "html_href" =>    '<a href="{{tutorial_loc}}#html">HTML</a>',

        "pagedef_href" => '<a href="{{tutorial_loc}}#pagedef"><i>page definition</i></a>',
        "funs_href" =>   '<a href="{{tutorial_loc}}#pagedef funs">page definition functions</a>',
        "statement_href" => '<a href="{{tutorial_loc}}#pagedef statements">page definition statements</a>',
        
        "fpage_href" =>   '<b><i><a href="{{tutorial_loc}}#fpage">FPage</a></i></b>',
        
        "perlscript_href" => '<a href="{{tutorial_loc}}#perlscript">Perl control</a>',
        "action_href" =>  '<a href="{{tutorial_loc}}#special_action">special actions</a>',

        "refman_href" =>  '<a href="{{ref_loc}}">reference manual</a>',

        "attribref_href" =>  '<a href="{{ref_loc}}#attributes"><b><i>Folio Attributes List</i></b></a>',
        "biattribref_href" =>  '<a href="{{ref_loc}}#bi-attributes"><b><i>Builtin Attributes List</i></b></a>',
        "varsref_href" => '<a href="{{ref_loc}}#vars">Folio Variables List</a>',
        "statementref_href" => '<a href="{{ref_loc}}#statements">page definition statement list</a>',
        "funref_href" => '<a href="{{ref_loc}}#funs">page definition functions list</a>',
        "operatorref_href" => '<a href="{{ref_loc}}#funs">page definition operators list</a>',

        "htmltag_href" => '<a href="{{ref_loc}}#html tags">HTML Tags List</a>',
        "tagattrib_href" => '<a href="{{ref_loc}}#html attributes">HTML Attributes List</a>',
        "tagsrc_href"  => '<a href="{{ref_loc}}#html tagsrc">sources</a>',
        "colours_href" => '<a href="{{ref_loc}}#html coltable">browser safe colours</a>',

        "cmdline_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Option",
                    format => '<center><b><tt>',
                  },
                  { title => "Comment",
                  },
              ],
            
            "width" => "50%",
            "foreach" => sub {sort(&list_categories("cmdline"))},
            "row" => sub 
              {
                my($attrib,%a,$def) = @_;
                %a = lookup("cmdline",$attrib);
                return(table_row("cmdline_table",$attrib,$a{comment}));
              },
          },

        "pagefun_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Function",
                    format => '<center><b><tt>',
                  },
                  { title => "Arguments",
                    format => '<center><b><tt>',
                  },
                  { title => "Description",
                  },
              ],
            
            "width" => "80%",
            "foreach" => sub {sort(&list_categories("pagefun"))},
            "row" => sub 
              {
                my($attrib,%a,$def) = @_;
                %a = lookup("pagefun",$attrib);
                return(table_row("pagefun_table",$attrib,$a{arg},$a{comment}));
              },
          },

        "pagestmt_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Statement",
                    format => '<center><b><tt>',
                  },
                  { title => "Arguments",
                    format => '<center><b><tt>',
                  },
                  { title => "Description",
                  },
              ],
            
            "width" => "80%",
            "foreach" => sub {sort(&list_categories("pagestmt"))},
            "row" => sub 
              {
                my($attrib,%a,$def) = @_;
                %a = lookup("pagestmt",$attrib);
                return(table_row("pagestmt_table",$attrib,$a{args},$a{comment}));
              },
          },

        "pageopr_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Operator",
                    format => '<center><b><tt>',
                  },
                  { title => "Description",
                  },
              ],
            
            "width" => "60%",
            "foreach" => sub {sort(&list_categories("pageopr"))},
            "row" => sub 
              {
                my($attrib,%a,$def) = @_;
                %a = lookup("pageopr",$attrib);
                return(table_row("pageopr_table",$attrib,$a{comment}));
              },
          },

        "wtag_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "WFlio Tag",
                    format => '<center><b><tt>',
                  },
                  { title => "Translates to",
                    format => '<center><b><tt>',
                  },
                  { title => "Description",
                  },
              ],
            
            "width" => "80%",
            "foreach" => sub {sort(&list_categories("pd-tag"))},
            "row" => sub 
              {
                my($attrib,%a,$def) = @_;
                %a = lookup("pd-tag",$attrib);
                $def = "<a href=\"#tagdef $a{tag}\">$a{tag}</a>";
                return(table_row("wtag_table",$attrib,$def,$a{comment}));
              },
          },

        "tag_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "{{html_href}} Tag",
                    format => '<center><b><tt>',
                  },
                  { title => "Source",
                    format => '<center><font size="-1">',
                  },
                  { title => "Comment",
                  },
              ],
            
            "width" => "40%",
            "foreach" => sub {sort(&list_categories("htmltag"))},
            "row" => sub 
              {
                my($attrib,%a,$def,$src) = @_;
                %a = lookup("htmltag",$attrib);
                $def = "<a href=\"#tagdef $attrib\">$attrib</a>";
                $src = "<a href=\"#html tagsrc\">$a{tagsrc}</a>";
                return(table_row("tag_table",$def,${src},$a{comment}));
              },
          },

        "tagattrib_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "WFolio Attrib",
                    format => '<center><b><tt>',
                  },
                  { title => "HTML Attrib",
                    format => '<center><b><tt>',
                  },
                  { title => "Source",
                    format => '<center><font size="-1">',
                  },
                  { title => "Comment",
                  },
              ],
            
            "width" => "80%",
            "foreach" => sub 
              {
                my(@ret,$f,$l);

                $l = "";
                foreach $f (sort(&list_categories("tagattrib")))
                  {
                    my($tag,$attr) = split(/:+/,$f);
                    if($tag ne $l)
                      {
                        push(@ret,"||blank||") if($l);
                        push(@ret,$tag);
                      }
                    $l = $tag;
                    push(@ret,$f);
                  }
                return(@ret);
              },
            "row" => sub 
              {
                my($attrib,%a,$watt,$def,$src) = @_;
                if($attrib eq "||blank||")
                  {
                    # A blank line
                    return(table_shape("foot",%{$expand{tagattrib_table}})."<br>".
                           table_shape("head",%{$expand{tagattrib_table}}));
                           
                  }
                elsif(!($attrib =~ /:/))
                  {
                    return("  <td bgcolor={{table_headbg}} colspan=\"4\" >".
                           "<center><a name=\"tagdef $attrib\">".
                           "{{html_href}} {{st}}$attrib\{{et}} <b>Tag</b>".
                           "</a></center></td>\n");
                  }
                ($watt) = ($attrib =~ /\:([^\:]+)$/);
                %a = lookup("tagattrib",$attrib);
                $src = "<a href=\"#html tagsrc\">$a{tagsrc}</a>";
                return(table_row("tagattrib_table",
                                  $watt,$a{htmlattrib},${src},$a{comment}));
              },
          },

        "attrib_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Attribute Name",
                    format => '<center><b><tt>',
                  },
                  { title => "Default Value",
                    format => '<center><b><font size=-1>',
                  },
                  { title => "Description",
                  },
              ],
            
            "width" => "80%",
            "foreach" => sub {sort(&list_categories("wflio"))},
            "row" => sub 
              {
                my($attrib,%a,$def) = @_;
                %a = lookup("wflio",$attrib);
                $def = $a{default};
                if($attrib =~ /pagedef$/)
                  {
                    $def = "{{pagedef_href}}";
                  }
                $def =~ s/\|/\| /g;
                $def =~ s/\&/\&amp;/g;
                $def =~ s/\</\&lt;/g;
                $def =~ s/\n/\\n /g;
                return(table_row("attrib_table",$attrib,$def,$a{comment}));
              },
          },

        "biattrib_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Attribute Name",
                    format => '<center><b><tt>',
                  },
                  { title => "Description",
                  },
              ],
            
            "width" => "60%",
            "foreach" => sub {sort(&list_categories("bi-attrib"))},
            "row" => sub 
              {
                my($attrib,%a,$def) = @_;
                %a = lookup("bi-attrib",$attrib);
                return(table_row("biattrib_table",$attrib,$a{comment}));
              },
          },

        "vars_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Variable Name",
                    format => '<center><b><tt>',
                  },
                  { title => "Sections",
                    format => '<center><b><tt>',
                  },
                  { title => "Description",
                  },
              ],
            
            "width" => "70%",
            "foreach" => sub {sort(&list_categories("variable"))},
            "row" => sub 
              {
                my($attrib,%a,$def) = @_;
                %a = lookup("variable",$attrib);
                return(table_row("vars_table",$attrib,$a{pdsections},$a{comment}));
              },
          },

        "sections_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Section Name",
                    format => '<center><b><tt>',
                  },
                  { title => "Parent Section",
                    format => '<center><b><tt>',
                  },
                  { title => "Description",
                  },
              ],
            
            "width" => "70%",
            "foreach" => sub {sort(&list_categories("pdsections"))},
            "row" => sub 
              {
                my($attrib,%a,$def) = @_;
                %a = lookup("pdsections",$attrib);
                return(table_row("sections_table",$attrib,$a{parent},$a{comment}));
              },
          },

        "icons_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Name",
                    format => '<center><b><tt>',
                  },
                  { title => "Image",
                    format => '<center>',
                  },
                  { title => "Comment",
                  },
              ],
            
            "width" => "70%",
            "foreach" => sub {sort(&list_categories("icon"))},
            "row" => sub 
              {
                my($attrib,%a,$def) = @_;
                %a = lookup("icon",$attrib);
                $def = "<img src=\"{{prog_name}}-${attrib}.gif\"/>";
                return(table_row("icons_table",$attrib,$def,$a{comment}));
              },
          },

        "linkmethod_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Name",
                    format => '<center><b><tt>',
                  },
                  { title => "Link Method",
                  },
              ],
            
            "width" => "50%",
            "foreach" => sub {return("embed","file","ignore","wflio")},
            "row" => sub 
              {
                my($attrib,%a) = @_;
                %a = 
                  (
                    "embed" => "Use the {{st}}EMBED{{et}} tag to attach to the file",
                    "file" => "Link straight to the file",
                    "ignore" => "Don't render this item",
                    "wflio" => "Create a file that displays the target, ".
                               "including navigation elements and link to that.",
                  );
                return(table_row("linkmethod_table",$attrib,$a{$attrib}));
              },
          },

        "colour_table" =>
          {
            "fun" => sub
              {
                my($ret,$i,$j,@data);

                @data = 
                  (
                    ["fff","ccc","999","666","333","000","fc0","f90",
                     "f60","f30","---","---","---","---","---","---"],
                    ["9c0","---","---","---","---","c90","fc3","fc6",
                     "f96","f63","c30","---","---","---","---","c03"],
                    ["cf0","cf3","330","660","990","cc0","ff0","c93",
                     "c63","300","600","900","c00","f00","f36","f03"],
                    ["9f0","cf6","9c3","663","993","cc3","ff3","960",
                     "930","633","933","c33","f33","c36","f69","f06"],
                    ["6f0","9f6","6c3","690","996","cc6","ff6","963",
                     "630","966","c66","f66","903","c39","f6c","f09"],
                    ["3f0","6f3","390","6c0","9f3","cc9","ff9","c96",
                     "c60","c99","f99","f39","c06","906","f3c","f0c"],
                    ["0c0","3c0","360","693","9c6","cf9","ffc","fc9",
                     "f93","fcc","f9c","c69","936","603","c09","303"],
                    ["3c3","6c6","0f0","3f3","6f6","9f9","cfc","---",
                     "---","---","c9c","969","939","909","636","606"],
                    ["060","363","090","393","696","9c9","---","---",
                     "---","fcf","f9f","f6f","f3f","f0f","c6c","c3c"],
                    ["030","0c3","063","396","6c9","9fc","cff","39f",
                     "9cf","ccf","c9f","96c","639","306","90c","c0c"],
                    ["0f3","3f6","093","0c6","3f9","9ff","9cc","06c",
                     "69c","99f","99c","93f","60c","609","c3f","c0f"],
                    ["0f6","6f9","3c6","096","6ff","6cc","699","036",
                     "369","66f","66c","669","309","93c","c6f","90f"],
                    ["0f9","6fc","3c9","3ff","3cc","399","366","069",
                     "039","33f","33c","339","336","63c","96f","60f"],
                    ["0fc","3fc","0ff","0cc","099","066","033","39c",
                     "36c","00f","00c","009","006","003","63f","30f"],
                    ["0c9","---","---","---","---","09c","3cf","6cf",
                     "69f","36f","03c","---","---","---","---","30c"],
                    ["---","---","---","---","---","---","0cf","09f",
                     "06f","03f","---","---","---","---","---","---"],
                  );
                $ret = <<"EndHeader";
<table border="1" cellpadding="2" cellspacing="0" width="80%" align=center>
<!-- Arrangement by Bob Stein, www.visibone.com coded by {{shawtin_href}}-->
EndHeader
                for($i=0;$i<=$#data;$i++)
                  {
                    my(@row,$state,$span);

                    @row = @{$data[$i]};
                    $ret .= "<tr>\n";
                    $state = "cell";
                    for($j=0;$j<=$#row;$j++)
                      {
                        my($bg,$r,$g,$b,$darkness);
                        $r = substr($row[$j],0,1);
                        $g = substr($row[$j],1,1);
                        $b = substr($row[$j],2,1);
                        if($r eq "-")
                          {
                            $span = 0 if($state eq "cell");
                            $span++;
                            $state = "blank";
                          }
                        else
                          {
                            my($bg,$contrast);
                            if($state ne "cell")
                              {
                                $ret .= "    <td colspan=\"$span\">&nbsp;</td>\n";
                                $state = "cell";
                              }
                            $bg = "$r$r$g$g$b$b";
                            $contrast = "black";
                            $contrast = "white" 
                                if(hex($r) + hex($g) + hex($b) < 24);
                            $ret .= <<"EndCell";
    <td nowrap="nowrap" bgcolor="#$bg" align="center"><font size=-1 color=$contrast>
      $bg<br>&nbsp;</font></td>
EndCell
                          }
                      }
                    $ret .= "</tr>\n";
                  }
                $ret .= "</table>\n";
                return($ret);
              },
            "width" => "95%",
          },

        "tagsrc_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Code",
                    format => '<center><font size="-1">',
                  },
                  { title => "Meaning",
                  },
              ],
            
            "width" => "40%",
            "foreach" => sub {return("3.0","4.0","4.0D","DU","IE","NN")},
            "row" => sub 
              {
                my($attrib,%a) = @_;
                %a = 
                  (
                    "3.0" => "Generally part of HTML before 4.0, now removed",
                    "4.0" => "Part of the HTML 4.0 Specification",
                    "4.0D" => "Part of the HTML 4.0 Specification but depreciated",
                    "DU"  => "Don't use",
                    "IE"  => "MicroSoft specific, should be avoided",
                    "NN"  => "Netscape specific, should be avoided",
                  );
                return(table_row("tagsrc_table",$attrib,$a{$attrib}));
              },
          },

        "attribvals_table" =>
          {
            "is_table" => 1,
            "cols" =>
              [
                  { title => "Value",
                    format => '<tt><b><center>',
                  },
                  { title => "Meaning",
                  },
              ],
            
            "width" => "70%",
            "foreach" => sub {return("0",".","**zero**","**null**","**empty**")},
            "row" => sub 
              {
                my($attrib,%a) = @_;
                %a = 
                  (
                    "0"    => "If the value is 0 or the empty string ".
                        "look for a binding higher up the directory tree",
                    "."   => "A value of dot leaves the attribute not set, ".
                        "but moves on to another attribute (rather than looking ".
                        "higher up the directory tree",
                    "**zero**" => "Numeric value {{st}}0{{et}}",
                    "**null**" => "The value is unset (don't look anywhere else)",
                    "**empty**" => "The value is an empty string",
                  );
                return(table_row("attribvals_table",$attrib,$a{$attrib}));
              },
          },

      );
  }

sub expand_entry ($)
  {
    my($item) = @_;
    my(@items);

    # Given a single item return a list, if it looks 
    # like "[one,two,three]" return three elements
    # otherwise just one
    if($item =~ s/^\[([^\]\[]+)\]$/$1/)
      {
        @items = split(/,/,$item);
      }
    else
      {
        $items[0] = $item;
      }
    return(@items);
  }

sub cart_product (@)
  {
    # Fully expand all the lists of entries to get individual
    # defaults values
    my(@in_vals) = @_;
    my(@out_vals,$i);
    @out_vals = ([]);

    for($i=0;$i<=$#in_vals;$i++)
      {
        my($item,$prev,@prev_out);
        
        @prev_out = @out_vals;
        @out_vals = ();
        
        # First time round the loop
        foreach $item (expand_entry($in_vals[$i]))
          {
            foreach $prev (@prev_out)
              {
                my(@a);
                @a = @{$prev};
                push(@a,$item);
                push(@out_vals,\@a);
              }
          }
      }
    return(@out_vals);
  }

sub add_cat ($@)
  {
    my($cat,@vals) = @_;
    my($val_ary,@items,$item);
    
    top_init() if(!%defaults_structure);

    if(!$defaults_structure{$cat})
      {
        ::add_output("Undefined structure $cat in documentation\n");
        return(0);
      }

    if(!$default_values{$cat})
      {
        $default_values{$cat} = {};
      }

    @vals = cart_product(@_);
    foreach $val_ary (@vals)
      {
        my(%a,$i,$identifier,@line);

        @line = @{$val_ary};
        %a = ();
        $identifier = "";

        if($#line != $#{$defaults_structure{$cat}}+1)
          {
            ::add_output("Expecting ".
                    $#{$defaults_structure{$cat}}+1 . 
                    " args but got ".$#line." args (".
                    @line.")");
          }

        for($i=0;$i<=$#{$defaults_structure{$cat}};$i++)
          {
            my($key);
            $key = ${$defaults_structure{$cat}}[$i];
            if($key =~ s/^\*//)
              {
                $identifier .= ":" if($identifier);
                $identifier .= $line[$i+1];
              }
            $a{$key} = $line[$i+1];
          }
        ::add_output("Missing identifier in $cat documentation\n")
            if(!$identifier);
        ::add_output("Multiple definitions of \"$identifier\" in $cat\n")
            if(${$default_values{$cat}}{$identifier});
        ${$default_values{$cat}}{$identifier} = \%a;
      }
    return(1);
  }
  
sub get_element
  {
    my($cat,$item,$field) = @_;
    if(!$default_values{$cat})
      {
        ::add_output("Unknown document category $cat in get_element\n");
        return("");
      }
    if(!${$default_values{$cat}}{$item})
      {
        ::add_output("Unknown $cat item $item in get_element\n");
        return("");
      }
    return(${${$default_values{$cat}}{$item}}{$field});
  }

sub print ()
  {
    my($prog_name,$image,$all_manual);
    my(@l,$attrib);

    top_init() if(!%defaults_structure);
    chdir($::top_dir);
    
    $prog_name = $0;
    # Remove the extension
    $prog_name =~ s/\.[^\.]+$//;
    
    # Get to the actual program name
    @l = split(/[\\\/]+/,$prog_name);
    $prog_name = $l[$#l];
    $::prog_name = $prog_name;
    
    $expand{"prog_name"} = $prog_name;

    # Fill out the default pagedefs
    foreach $attrib ("index_pagedef","wflio_pagedef")
      {
        my($val);
        Attribute::get("..",$attrib,\$val);
        $val =~ s/\</\&lt;/g;
        $val =~ s/^\n+//;
        $val =~ s/\n+$/\n/;
        $expand{$attrib} = $val;
      }

    # All the documentation is encoded within the script 
    # (OK so it is a tad clumsy but it means we have only 
    # a single file to move round).
    $all_manual = GenName::all_icons_gif();
    $all_manual .= <<'EndManualPages';
begin 644 me.jpg
M_]C_X``02D9)1@`!`@$`2`!(``#_[0$Z4&AO=&]S:&]P(#,N,``X0DE-`^T`
M`````!``2`````$``0!(`````0`!.$))30/S```````(``````````$X0DE-
M)Q````````H``0`````````".$))30/U``````!(`"]F9@`!`&QF9@`&````
M```!`"]F9@`!`*&9F@`&```````!`#(````!`%H````&```````!`#4````!
M`"T````&```````!.$))300````````"```X0DE-!`(```````(``%!(550(
M-0``````1```````````````````````````````````````````````````
M````````````````````````````````````````4$A55`@T```````$````
M`#A"24T$!@``````!P`#`````0$`__X`)T9I;&4@=W)I='1E;B!B>2!!9&]B
M92!0:&]T;W-H;W"H(#0N,`#_[@`.061O8F4`9``````!_]L`A``*!P<'"`<*
M"`@*#PH("@\2#0H*#1(4$!`2$!`4$0P,#`P,#!$,#`P,#`P,#`P,#`P,#`P,
M#`P,#`P,#`P,#`P,`0L,#!43%2(8&"(4#@X.%!0.#@X.%!$,#`P,#!$1#`P,
M#`P,$0P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`S_P``1"`!Q`'(#`1$`
M`A$!`Q$!_]T`!``/_\0!H@````<!`0$!`0``````````!`4#`@8!``<("0H+
M`0`"`@,!`0$!`0`````````!``(#!`4&!P@)"@L0``(!`P,"!`(&!P,$`@8"
M<P$"`Q$$``4A$C%!408382)Q@10RD:$'%;%"(\%2T>$S%F+P)'*"\25#-%.2
MHK)C<\(U1">3H[,V%U1D=,/2X@@F@PD*&!F$E$5&I+16TU4H&O+C\\34Y/1E
M=865I;7%U>7U9G:&EJ:VQM;F]C='5V=WAY>GM\?7Y_<X2%AH>(B8J+C(V.CX
M*3E)66EYB9FIN<G9Z?DJ.DI::GJ*FJJZRMKJ^A$``@(!`@,%!00%!@0(`P-M
M`0`"$0,$(1(Q0051$V$B!G&!D3*AL?`4P='A(T(54F)R\3,D-$."%I)3):)C
MLL('<](UXD2#%U23"`D*&!DF-D4:)V1T53?RH[/#*"G3X_.$E*2TQ-3D]&5U
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
E8E4DZ'$J%D'V<CT2@D_OC_QD/ZLBR7O]NW_UF_7A5K^N*'__V0``
`
end
begin 644 gui.jpg
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
GT4460$-WXLFU*)[>Y6ZE`CEV!YH\*QB=<G;$">">,T44544AH__9
`
end
begin 644 nn-wflio.jpg
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
=8#CI_C_+@45XO/\`\?`_W?ZT5O"ASJ]S-SL?_]D`
`
end
begin 644 ie-index.jpg
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
BUJ'_`(%/_C110!MZ>3)86TDA+NT2EF;DDX')HHHJBC__V0``
`
end
begin 644 ie-icons.jpg
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
C4_\`C5?4=7U6[LI(;K4[R>)B,I+.S*>?0FBBCL3+X7Z,_]D`
`
end
begin 644 regex.s.gif
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
%`B$``#L`
`
end
document readme.html  *********************************************************
{{doc_head}}
<h1>{{program_href}} Introduction</h1>

<pre><b>
     Program: {{prog_name}}
     Version: {{prog_version}}
    Released: {{prog_release}}
    Web Page: {{webpage_href}}
      Author: {{shawtin_href}}
     License: GPL Copyleft
</b></pre>
<p>
The Build Folio program generates web pages that let you view a set of
files and directories.  The program creates a static set of pages 
that can then be written on to a CD or packed up and emailed.  It is 
especially good at generating web pages that allow the user to navigate
directories full of photographs.  Without any configuration it generates 
a reasonable view of the directory structure, this view can also be 
customised by defining attributes, by inserting extra web layout, by 
redefining the page structure or finally by asserting additional processing 
in Perl.  Comprehensive help pages are built in to the program, it will 
generate over 100 pages of reference material.
</p><p>
This document provides a simple overview of {{program_href}}, 
you should also have the {{tutorial_href}} and 
{{refman_href}} documents.  The program is built as a Perl 5 script 
which, by default, calls the Tk package if it is installed.  If you 
are running Windows on a PC then the best version of Perl to install 
is the one from 
<a href="http://www.ActiveState.com">ActiveState</a> (download from
<a href="http://www.ActiveState.com/Products/Download/Get.plex?id=ActivePerl">here</a>).  
This program was originally created on a Windows 2000 machine running Perl
5.6, but it should work on any Perl enabled system.  I would personally
normally prefer to do my development on UNIX or LINUX but the Windows machine
is where my photographs live :-(&nbsp;
I have run the program on Solaris without Tk (i.e. with the "{{st}}-no_tk{{et}}"
command line option), I have not yet made any attempt to test the program on other
platforms.  If you do run it on other platforms please tell me what
works, and if you put in any changes to get it running please send me the
deltas.
</p>

<h1><a NAME="generated"></a>Running the program</h1>
<table WIDTH="95%" align="center">
<tr><td>
<center><img SRC="{{prog_name}}-gui.jpg"></center>
</td><td>
If you run the program on a machine where the <b><i>Tk</i></b> module is installed you 
will be presented with a main window.  Either type in the name of 
your top-level directory or browse using the {{st}}Select Top Dir{{et}} 
button.  Now hit the start button in the bottom left hand corner.  
After some processing (indicated on the process bar)
the application will show you a list of the empty directories and a row
of hashes to indicate that it has completed.  You will now find a
number of files called things like {{st}}wflio_index.htm{{et}}, 
{{st}}wflio_w00010.htm{{et}}, {{st}}wflio_i00003.gif{{et}}
and so on.  The {{st}}wflio_index.htm{{et}} files are the starting
point, double click on one of them to view it in your favorite browser
(or Internet Explorer).
</td></tr></table>

<table WIDTH="95%" align="center">
<tr><td><p>
It can take quite a while to process the directories (especially
on an older machine or when there are a lot of files).  The Progress
bar shows you how far along the process we are, the blue section shows
the generation of {{folio_href}} files, the 
green section shows the generation of {{fpage_href}}
files. Since you have just run the program on a directory that does not
contain any {{st}}fpage{{et}} description files no {{fpage_href}}
files will have been generated, so this last
half will go past quickly. 
I guess you have already found out what the Help button does (that's
why you have this document right?).
</p><p>
When you open the {{st}}wflio_index.htm{{et}} file 
you should see a web page that displays the contents of
that directory, the various subdirectories are shown first followed by
the files located within this level.  The Explorer snapshot here shows
an example.  If you select one of the icons or thumbnails you will 
be able to explore that subdirectory and so on. 
</p></td><td>
<center><img SRC="{{prog_name}}-ie-index.jpg"></center>
</td>
</tr>
</table>

<table WIDTH="95%" align="center">
<tr>
<td>
  <center><img SRC="{{prog_name}}-ie-icons.jpg"></center>
</td>
<td>
<p>
 The program is 
particularly useful
when you have directories containing many images.  The index page
will show you thumbnails of your pictures.  Selecting one of these
will take you to a page with "previous" and "next" arrows that lets you
browse the images. 
</p><p>
Here, in contrast, is an example index page where the users have created 
a {{folio_href}} file to control the way the directory is represented.  
In this case as well as changing the page background and adding an 
explanation they have used icons to represent the directories rather than images.
</p>
</td>
</tr></table>

<table WIDTH="95%" align="center">
<tr>
<td>
<p>
<a name="wflio"/>
Here is a {{wflio_href}} page.  The program generates one of these for
each image.  In addition to showing you what the image looks like these
page give you navigation arrows that allow 
you to move to the next or previous image in the sequence.
</p><p>
The program as it stands is fully functional, although the documentation 
needs a lot more work.  However, you can also customise the output 
the program produces to make it an even closer match to your needs. 
The {{tutorial_href}} shows you how, the {{refman_href}} gives a complete
set of documents that describe most of the options.
</p>
</td>
<td>
  <center><img SRC="{{prog_name}}-nn-wflio.jpg"></center>
</td>
</tr></table>

<h2><a name="cmdline"/>From the CLI</h2>
<p>
Like all good Perl scripts you do not <b>have</b> to use the GUI. 
If you do not have the <b><i>Tk</i></b> package installed the program 
will run without a GUI. 
If for some reason you want to run the program from the command line the
following options are available:
</p>

{{cmdline_table}}

<h1><a name="shawtin"></a>And finally... Cyril</h1>

<table WIDTH="100%" >
<tr>
<td>
<center><img SRC="{{prog_name}}-me.jpg" height=99 width=100></center>
</td>

<td><font size=-1>The {{st}}{{prog_name}}{{et}} program was created by
Steve Hawtin for his own personal use (and to explore ideas about organising
web pages to view photographs).  These documents were put together to
allow other people to get some value from the program.  The program
is still work in progress, there are many elements that could be considerably
improved (especially in the way that the program is written).  If
you have suggestions, praise or large quantities of cash looking for a
good home you can contact Steve at {{st}}
&lt;<font color={{page_text}}>stev</font>e&#64;t<font color={{page_text}}>sort</font>.&#100;emon.co.</tt><tt>uk>{{et}},
if you have any complaints please send them to {{st}}&lt;{{flame_address}}>{{et}}.</font>
<br><font size=-1></font>&nbsp;</td>
</tr>
</table>

{{doc_foot}}
end
document reference.html *******************************************************
{{doc_head}}
<h1>{{program_href}} Reference</h1>
This document contains various generated tables of reference material for the
{{program_href}} program:
<ul type=circle>
  <li>{{attribref_href}}</li>
  <li>{{biattribref_href}}</li>
  <li>{{varsref_href}}</li>
  <li>{{statementref_href}}</li>
  <li>{{htmltag_href}}</li>
  <li>{{tagattrib_href}}</li>
  <li>{{colours_href}}</li>
</ul>
<p>There are also a number of tables in the {{tutorial_href}}:</p>
<ul type=circle>
  <li>{{cmdline_href}} arguments</li>
  <li>{{render_href}} methods</li>
  <li>Folio {{section_href}}</li>
  <li>{{vars_href}}</li>
  <li>{{icons_href}}</li>
</ul>

<h1><a NAME="pagedef"/>Folio Page Definitions</h1>

<ul type=circle>
  <li>{{attribref_href}}</li>
</ul>

<h2><a NAME="attributes"/>Folio Attributes List</h2>

Here is a list of {{attrib_href}} that can be set.   Not all are 
applicable in all situations (and this list assumes that only the 
standard {{pagedef_href}} is used).

{{attrib_table}}

<h2><a NAME="bi-attributes"/>Folio Builtin Attributes List</h2>
<p>
Here are the {{attrib_href}} that are built in to the program:</p>

{{biattrib_table}}

<h2><a NAME="vars"/>Folio Variables List</h2>

Here is a list of {{vars_href}} that can be used.  Not all are 
applicable in all situations (and this list assumes that only the 
standard {{pagedef_href}} is used).

{{vars_table}}

<h2><a NAME="statements"/>Page definition statements</h2>

{{pagestmt_table}}

<h2><a NAME="funs"/>Page definition functions</h2>

<p>
Here are the functions that can be used as {{funs_href}}:
</p>

{{pagefun_table}}

<h2><a NAME="operators"/>Page definition operators</h2>

{{pageopr_table}}

<h1><a NAME="html"/>{{html_href}} definitions</h1>
<p>
When you insert tags into the attributes you are in fact adding 
special {{program_href}} tags, rather than HTML ones.  Here is 
a table listing all the extra tags that are defined in the standard 
{{pagedef_href}}.  Of course all the {{htmltag_href}} tags 
can be used as well:
</p>
{{wtag_table}}

<h2><a NAME="html tags"/>{{html_href}} Tags List</h2>
<p>
Here is a list of the {{html_href}} tags that the program understands:
</p>
{{tag_table}}

<h2><a NAME="html attributes"/>{{html_href}} Tag Attributes List</h2>
<p>
This section documents that attributes that {{html_href}} tags can have 
in {{program_href}}.  I have tried to gather a comprehensive set from various 
{{tagsrc_href}}.  Where documentation is inconsistent I have 
included as many versions as possible.  Some attributes have different names
in {{program_href}} than in HTML, for example the page colour is 
defined by {{st}}pagecolor{{et}}.  In your {{folio_href}} file
your tag would look like:
</p><p>
{{start_example}}
&lt;font+footer|fontsize=-1&gt;Footer&lt;/font&gt;
{{end_example}}
</p><p>
While what would be generated in the target HTML would probably be more like:
</p><p>
{{start_example}}
&lt;font size="-1" color="#cc6600"&gt;Footer&lt;/font&gt;
{{end_example}}
</p><p>
The section on {{html_href}} in the manual gives more details.  
So having said all that here are all the possible attributes for each of
the tag types:
</p>

{{tagattrib_table}}

<p><a name="html tagsrc"/>The {{html_href}} elements come from a variety of sources:</p>

{{tagsrc_table}}

<h2><a NAME="html coltable"/>Browser Safe Colours</h2>
<p>
From "Dave Raggett's Introduction to CSS", Here is a table of the browser safe 
colours and their hex values.  My thanks to Bob Stein for this arrangement.</p>

{{colour_table}}

{{doc_foot}}
end
document tutorial.html ********************************************************
{{doc_head}}
<h1>{{program_href}} Tutorials</h1>
<p>
This file contains tutorial material showing how you can customise the 
output of the {{program_href}} program.  The program can easily be controlled to adjust the 
renditions it produces of your files.  As the scope of customisation 
you desire becomes wider the difficulty of the customisation increases. 
In the current version there are six levels of customisation:
</p>
<ul type=circle>
  <li>{{folio_href}} Files</li>
  <li>Producing {{html_href}}</li>
  <li>{{elements_href}}</li>
  <li>{{pagedef_href}}</li>
  <li>{{fpage_href}} Files</li>
  <li>{{perlscript_href}}</li>
</ul>

<p>
In addition to these tutorials there is a longer {{refman_href}} that contains 
various tables showing the elements that control the page generation process:</p>
<ul type=circle>
  <li>{{attribref_href}}</li>
  <li>{{htmltag_href}}</li>
</ul>

</p><p>

<h1><a name="folio"></a>Folio files</h1>

<p>
The default output of the program produces an adequate view of the directories
and files.  However often you will want to adjust the web pages that are produced. 
This is achieved by creating {{folio_href}} files.  This section explains what
they are and how you can use them.  
Any file with a {{st}}.folio{{et}} extension that is encountered during
the processing will be read as a {{folio_href}} file.  {{folio_href}} files 
set attributes which control the web pages produced.</p>
<p>There is an {{example_href}} at the end of this section.</p>

<h2><a NAME="folio format"></a><i>Folio</i> File Format</h2>
<p>{{folio_href}} files consist of comments and attribute values. 
Comments are indicated with {{st}}#{{et}} characters.  
Each attribute value is specified with three elements: <font color={{red}}>a
path</font>; <font color={{green}}>the name of an attribute</font>; and
<font color={{blue}}>a value</font>.  Here are four examples:
</p>
{{start_example}}
<font color={{red}}>/</font>{<font color={{green}}>textcolor</font>} = <font color={{blue}}>red</font>
<font color={{red}}>source_dir</font>{<font color={{green}}>force_category</font>} = <font color={{blue}}>notype</font>
<font color={{red}}>.</font>{<font color={{green}}>embed_hide</font>} = <font color={{blue}}>"TRUE"</font>
<font color={{red}}>up.gif</font>{<font color={{green}}>thumb_width</font>} = <font color={{blue}}>**null**</font>
{{end_example}}

The first line sets the {{st}}textcolor{{et}} attribute to be red for
the root and all its children.  The second sets the file type for
all the files in {{st}}source_dir{{et}} and its children.  The
third sets the {{st}}hide{{et}} flag to {{st}}true{{et}} for
all embedded tags below here.  The fourth sets the image width for
the thumbnail of the {{st}}up.gif{{et}} file.

<p>Notice that while the relative path in the second example only affects
pages produced below this directory, the absolute path in the first example
affects all the generated pages, even those in directories above here. 
So if we were to have:</p>

{{start_example}}
/{pagecolor} = \#ff8000
.{pagecolor} = white
{{end_example}}
<p>
Then the pages below here will have white backgrounds while the other pages
will have a horrid orange colour (BTW when you pick colours you should really only
use the {{colours_href}}).  Values used by the program will come from
the most specific path, so if a file does not have an attribute set then
the directory is inspected, if the directory does not have it then its
parent is examined and so on.  Also notice that the directory separator
in Folio files is always {{st}}/{{et}} never {{st}}\{{et}}. 
This is true for paths and for values.  Also on Windows machines all
file and directory names are converted to lower case (since Windows cannot 
be trusted to maintain case when files are copied).
</p><p>
The complete {{attribref_href}} showing attributes that you can set are defined in the 
{{refman_href}}.  Any attribute whose value is 0 or the empty string will
be considered unset, so there are some "magic" values which set the attribute to 
certain special values, we have already seen the {{st}}**null**{{et}}
value being used.   In the {{st}}thumb_width{{et}}
example above the {{st}}up.gif{{et}} file will <b><font color="#FF0000">not</font></b>
have its thumbnail width set while every other file will have the thumbnail
restricted to the default width (normally 60 pixels). 
In fact you can set attributes to any of the following special
values:
</p>
{{attribvals_table}}
<p>
Each attribute must be specified on a single line, otherwise it won't
be parsed correctly.  However you can use two tricks to make values
spread across multiple lines, either continuing the line after a backslash
({{st}}\{{et}}) or using a {{st}}bash{{et}} like "{{st}}&lt;&lt;{{et}}"
construct to suck in a block text:</p>
</p>
{{start_example}}
# First restrict the file types below here
.{filetype_list} = \
        source target ignore

# Next ensure that all wflio pages in this directory have a picture 
# of me at the end
.{wflio_post_text} = &lt;&lt;EndFooter
  &lt;p>
    &lt;table|width=90%|align=center>
      &lt;tr>
        &lt;td>
          &lt;b> this page was generated at 
              $[_timenow_am] on the $[_timenow_dmy]&lt;/b>
        &lt;/td>
        &lt;td>
          &lt;a|href=http://www.nightmare-visions.com>
            &lt;img|src=me-in-shorts.jpg|border=0|width=100/>&lt;/a>
        &lt;/td>
      &lt;/tr>
    &lt;/table>
  &lt;/p>
EndFooter

{{end_example}}

As you will have seen from the above example some values may contain {{attrib_href}} or 
{{vars_href}} which are expanded at runtime. 
Variables are indicated with the "{{st}}${<i>varname</i>}{{et}}" construct while
attributes use "{{st}}$[<i>varname</i>]{{et}}".  
<p>
There are also some special {{attrib_href}}, like {{st}}icon_dir{{et}} which
can only be set for the root path:</p>

{{start_example}}
/{icon_dir} = icons
/{icon_dir} = other/icons
{{end_example}}
<p>
Each time you set this attribute the program will look in the indicated directory
for {{st}}*.gif{{et}} files to use as icons.  In addition to defining
new icons you can use this to override the {{icons_href}} default settings
which are built in to the program.
</p><p>
The final element is the {{st}}**only**{{et}} element of the path.  If the 
{{st}}folio{{et}} file has a definition like:</p>
</p>
{{start_example}}
./**only**{post_text} = Footer for page here
./{post_text} = Footer for child dirs
{{end_example}}
<p>
Then the index generated in this directory will have {{st}}Footer for page here{{et}}
at the bottom but all the child directories will have the alternate footer.

Each file or directory has a number of attributes which control how it
is displayed.  A value of "." is equivalent to null and causes the
attribute to be unset.  The complete set of {{attribref_href}} is shown in
the {{refman_href}}.
</p>
<a name="folio regex"></a>
<table WIDTH="97%" >
<tr>
<td>Patterns in the program are always specified using Perl regex. 
If you are not familiar with specifying patterns in Perl then there are
a number of excellent books on the subject such as 
"<a href="http://www.oreilly.com/catalog/regex/">Mastering
Regular Expressions, Powerful Techniques for Perl and Other Tools</a>"
by Jeffrey E. F. Friedl (published by O'Reilly).</td>

<td><a href="http://www.oreilly.com/catalog/regex/">
<img SRC="{{prog_name}}-regex.s.gif" BORDER=0 width=75 alt="Go To O'Reilly Books"></a></td>
</tr>
</table>

<h2><a NAME="folio render"></a>Render Methods</h2>
There are a number of attributes that define how elements are rendered
in the directory pages.  There are two types of render string, those
for directories and those for files.  
Directory links always connect to
the generated {{st}}wflio_index.htm{{et}} file in the target directory
hence they only need to define how they appear on the page.
File render strings contain two parts, first a specification of how we link 
to the file, then what gets placed on the directory page.  For example 
a render string of
"{{st}}file:${icon}{{et}}" will link directly to the file and will
place an icon on the index page.   The
file link methods are:
<br>&nbsp;
{{linkmethod_table}}

<p>The render string is placed on the page, however elements that are specified
with as variables (e.g. "{{st}}$[_filesize]{{et}}" would be the 
{{st}}_filesize{{et}} attribute) are replaced with the attribute's 
value.  {{varsref_href}} gives a complete set.

<p>
If a directory contains any image files these are normally used as thumbnail
images.  If however there are no images the program will attempt to 
deduce the type of the directory by adding up the number of files in each 
category under the directory (e.g. if one of its subdirectories has a lot 
of text files then the type will probably be {{st}}text{{et}}.  
You can override this category deduction by setting the 
{{st}}force_render{{et}} attribute for the directory.

<h2><a NAME="folio example"></a>Example folio files</h2>
Here is an example of a simple {{folio_href}} file which adds a few
new icon types and changes the way some directories are rendered:</p>

{{start_example}}
# Set some things to make the defaults to look better
# First replace some of the icons and load in some icons for
# the new file types we will define later
# NB icon_dir can only be set for the top level, however the
# value is relative to where this folio file is located
/{icon_dir} = icons

# Change the way the pages are drawn 
/{bgcolor} = \#ffffc0 
/{dirs_align} = center 
/{contents_align} = center 
/{page_post_text} = &lt;font size=1>&lt;b>&lt;center>\
     Index Generated ${today}&lt;/center>&lt;/b>&lt;/font>

# In the panorama directory the thumbnails should go right 
# across the page (i.e. 98% of the browser width)
/panorama{thumbs_image_width} = -98 
# And we put a &lt;HR> after every thumbnail
/panorama{contents_post_thumb} = &lt;HR>

# In the negs directory the images should be scaled to fit 
# the browser's height (90% of the height)
/negs{wflio_image_height} = -90

# Extend the filetypes to recognise sound files in six 
# different formats.  i.e. wave and mp3 files for each
# of the three children
/{filetype_list} = ignore picture web text \
    wavetom wavedick waveharry \
    mp3tom mp3dick mp3harry \
    wave mp3 folio fpage

# We recognise the new files by their names matching the 
# following patterns... 
/{filetype_pattern_wavetom}   = tom\-f\d+\w?.wav 
/{filetype_pattern_wavedick}  = dick\-f\d+.wav 
/{filetype_pattern_waveharry} = harry\-f\d+\w?.wav 
/{filetype_pattern_mp3tom}    = tom\-f\d+\w?.mp3 
/{filetype_pattern_mp3dick}   = dick\-f\d+.mp3 
/{filetype_pattern_mp3harry}  = harry\-f\d+\w?.mp3

# ...and this is how we display them in the directory pages 
# The wave files are ignored... 
/{filetype_render_wavetom}    = ignore 
/{filetype_render_wavedick}   = ignore 
/{filetype_render_waveharry}  = ignore

# ...The mp3 formats use the wave icons (rather than looking 
# for an icon called mp3tom) 
/{filetype_render_mp3tom}     = file:${wavetom_icon} 
/{filetype_render_mp3dick}    = file:${wavedick_icon} 
/{filetype_render_mp3harry}   = file:${waveharry_icon}

# This is how we used to display the wave files using images 
# of each child's face and an &lt;EMBED> tag (which is why the 
# wavetom_icon is used above see)
#/{filetype_render_wavetom}    = embed:${icon}
#/{filetype_render_wavedick}   = embed:${icon}
#/{filetype_render_waveharry}  = embed:${icon}

{{end_example}}

<h1><a name="elements"></a>Folio Page Elements</h1>

<p>
The {{folio_href}} file defines elements which affect the web files 
created.
</p>

<h2><a NAME="elements attrib"></a>Attributes</h2>
<p>
When the program attempts to find the value of an attribute for a file 
if first looks at the most specific binding then works it way back up 
the directory tree to the root.  That allows us to set a value for 
a complete tree of directories.  However {{program_href}} is more 
sophisticated than that.  When the program wants to insert a tag into the 
output, say one representing an image, the program also uses the WFolio {{html_href}}
tag name and the {{section_href}} to get the attribute names. 
In fact the program looks at the following attributes to work out 
how wide to make {{st}}img{{et}} borders:
</p>
{{start_example}}
border

embed_border
icon_border
thumb_border
wflioimg_border

index_border
index_embed_border
index_icon_border
index_thumb_border

indexdirs_border
indexdirs_icon_border
indexdirs_thumb_border

indexfiles_border
indexfiles_embed_border
indexfiles_icon_border
indexfiles_thumb_border

wflio_border
wflio_icon_border
wflio_wflioimg_border
{{end_example}}
<p>
In general the {{program_href}} program will start looking at the most closely bound
attribute and move towards the more general.  If for example we are in the 
{{st}}indexdirs{{et}} section of the index page (which is a subsection of
{{st}}index{{et}} of course) and we are attempting to 
find a suitable border width for a thumbnail image (WFolio tag 
{{st}}thumb{{et}} which becomes {{html_href}} tag 
{{st}}<a href="{{ref_loc}}#tagdef img">img</a>{{et}}) then the order will be:
</p>
{{start_example}}
indexdirs_thumb_border
index_thumb_border
thumb_border
indexdirs_border
index_border
border
{{end_example}}
<h2><a NAME="elements sections"></a>Sections</h2>
<p>
Each output file is divided into a tree of sections.  The sections 
allow the user to be specific about the scope of attributes, for example 
by setting the {{st}}indexdirs_border{{et}} attribute you confine the 
change to that part of the index file.  Here is a complete list 
of the sections defined when the using the standard {{pagedef_href}}:
</p>
{{sections_table}}

<h2><a NAME="elements vars"></a>Variables</h2>
<p>
Variables contain text values, however these can behave like integers 
list or strings.  The {{varsref_href}} gives a complete list of 
variables that are available with the standard {{pagedef_href}}.  Of 
course modifying the page definitions will create new variables. 
Variables are indicated using the {{st}}${<i>varname</i>}{{et}}
construct.  This can be used whenever text is defined for output, 
for example:
</p>
{{start_example}}
./{post_text} = &lt;&lt;EndFooter
&lt;p+footer|align=center>&lt;font|fontsize=1>&lt;b>Index for directory ${dir}&lt;/b>&lt;/font>&lt;/p>
EndFooter
{{end_example}}
<h2><a NAME="elements icons"></a>Icons</h2>
<p>
When the program generates web pages it uses a number of icons to help
the user navigate.  The initial set are built into the script as 
{{st}}gif{{et}} files.  If you don't like any of the images 
you can use the "{{st}}/{icon_dir}{{et}}"
attribute to read new {{st}}gif{{et}} files into the program. 
Any new icons that match the names here will override the built-in ones. 
You can also redefine the icons for {{fpage_href}}
files by setting the {{st}}/{icon_dir}{{et}}
in the {{st}}fpage{{et}} file (if only there was an explanation of 
{{st}}fpage{{et}} files here).
</p>
{{icons_table}}

<h1><a NAME="html">Producing HTML</h1>
<p>
In the previous section I listed some of the {{attrib_href}} that can be set to modify 
the program's behaviour.  If that was all there was to {{program_href}} it could have 
been a much simpler program. 
The program constrains the {{html_href}} you can add into your {{folio_href}} files. 
A complete {{tagattrib_href}} can be found in the {{refman_href}}. 
</p><p>
To illustrate the processing that is done on {{html_href}} output I will use 
some simple examples.  First, suppose we have the following entry in a 
{{folio_href}} file:
</p>
{{start_example}}
.{index_post_text} = &lt;img|src=face.gif|alt=Me/>
{{end_example}}
<p>
You will immediately notice that while the value is "HTML Like" it is 
not exactly HTML.  The HTML tag has attributes that are indicated with 
{{st}}|{{et}} characters, the {{st}}img{{et}} tag here has the 
{{st}}src{{et}} and {{st}}alt{{et}} attributes defined. 
This tag will be inserted on the {{wflio_href}} page just before 
the "extra information".  We can see from the {{htmltag_href}} that the 
{{st}}img{{et}} tag has the following attributes:
</p>
{{start_example}}
align
alt
border
class
controls
description
dynsrc
height
hspace
id
ismap
language
loop
lowsrc
name
onclick
ondblclick
onkeydown
onkeypress
onkeyup
onmousedown
onmousemove
onmouseout
onmouseover
onmouseup
src
startwhen
style
textdirection
title
usemap
vspace
width 
{{end_example}}
<p>
The program takes note of the {{st}}alt{{et}} and {{st}}src{{et}} 
attributes.  It then looks for attributes that have been set 
in the {{folio_href}} files.  For example, the width of the 
image could be set by assigning a value to the {{st}}img_width{{et}} 
attribute for the file.  The various combinations that we 
check were described 
in the {{attrib_href}} section. 
Once all the attributes have been gathered we can insert the 
actual tag into the target file:
</p>
{{start_example}}
&lt;img src="face.gif" alt="Me" width="10%" border="0"/>
{{end_example}}
<p>
So the HTML you attach to attributes goes through quite a bit of processing
before it is sent out to the page.  
Here is another example:
</p>
{{start_example}}
.{created_style} = &lt;font+extrainfo|fontsize=-1>
{{end_example}}
<p>
In this case the {{st}}fontsize{{et}} tag attribute that was supplied is mapped into the 
HTML {{st}}size{{et}} tag.  In addition the tag name here is mapped 
to {{st}}extrainfo{{et}}, this means that rather than looking for a
{{st}}font_fontname{{et}} attribute the program will look for 
{{st}}extrainfo_fontname{{et}}.  This lets you control the scope 
of where HTML attributes are applied.

<h1><a NAME="pagedef">Page Definitions</h1>
<p>
In the previous sections we have seen how you can set {{attrib_href}} and use
{{vars_href}} to modify the pages produced.  However of course the fundamental
shape of pages produced remains the same, that is index pages show the contents of 
the directories and {{wflio_href}} pages allow you to navigate between individual files. 
What if you want to change the shape or number of pages produced?
</p><p>
Well this is where the {{pagedef_href}} comes in.  In fact the way the page 
is rendered is controlled by the contents of a couple of {{attrib_href}}, called 
{{st}}index_pagedef{{et}} and {{st}}wflio_pagedef{{et}}.  Here is a 
perfectly acceptable page definition value for {{st}}wflio_pagedef{{et}}:</p>
{{start_example}}
new-pagedef.jpg{wflio_pagedef} = &lt;&lt;EndPageDef
<font color={{blue}}>&lt;!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<font color={{green}}>#section wflio</font>
&lt;html>&lt;head>
  &lt;title>My first pagedef&lt;/title>
&lt;/head>&lt;body>
<font color={{green}}>#if attrib_quiet:("pagetitle")</font>
  &lt;h1>$[pagetitle]&lt;/h1>
<font color={{green}}>#endif</font>
  &lt;p>File: $[_filename]
    &lt;b>&lt;small> (Created: $[_file_created])&lt;/small>&lt;/b>
  &lt;/p>
  &lt;p>
    &lt;img+wflioimg|src=$[_filename]/>
  &lt;/p>
&lt;/body>&lt;/html>
<font color={{green}}>#endsection</font></font>
EndPageDef
{{end_example}}
<p>
The page description splits into two parts, the <font color={{green}}>control flow</font> and the 
<font color={{blue}}>page contents</font>.  As you can see the control flow statements are 
indicated by lines that start with a hash character ({{st}}#{{et}}).  The rest of the 
definition is expanded to produce the <tt>HTML</tt>.
</p><p>
In the above example we can see the familiar {{attrib_href}} such as {{st}}$[pagetitle]{{et}}
and built in attributes such as {{st}}$[_file_created]{{et}} (which is replaced by a
string indicating when the referred to file was created).  
</p><p>

The previous section described elements that can be defined in 
{{folio_href}} files.  This gives the 
user control over how the various files and directories are 
rendered into {{st}}HTML{{et}}.  There is however a more 
powerful element that can be inserted into a {{folio_href}} file which we have not 
yet touched on, this is the <b>Page Definition</b>.
<p>
The page definition tells the program how to render a particular 
directory or file.  It allows the user to define the 
{{section_href}} and {{html_href}} tags that produce a page, as well 
as how the page is generated.
<p>

The page definition is an attribute of the file or directory stored 
in a {{folio_href}} file.  The program 
starts with the {{st}}index_pagedef{{et}} attribute of the directory.

<h2><a NAME="pagedef statements"></a>Page Definition Statements</h2>
<p>
The control flow is written in a BASIC like language.  Here are the valid 
statements:
</p>
{{pagestmt_table}}

<h2><a NAME="pagedef funs"></a>Page Definition Functions</h2>
<p>
Within the control flow statements there are a number of functions you can 
use:
</p>
{{pagefun_table}}

<h2><a NAME="pagedef examples"></a>Page Definition Examples</h2>
<p>
Here then are the default page definitions (as the program is shipped). 
First the index page:
</p>
{{start_example}}
{{index_pagedef}}
{{end_example}}
<p>
Next the {{wflio_href}} page:
</p>
{{start_example}}
{{wflio_pagedef}}
{{end_example}}

<h1><a NAME="fpage"></a>FPage Files</h1>
<p>
The {{folio_href}} files generate summary pages
that let the user browse the directory structure, sometimes however this
is not enough.  {{fpage_href}} files allows you to generate web
pages that gather together related elements from diverse locations and
present them in a consistent way.  In order to understand the 
{{fpage_href}} format you should first be 
familiar with the things you can do with {{folio_href}} files.
</p>
<br>&nbsp;
<br>&nbsp;
<table COLS=3 WIDTH="100%">
<tr>
<td WIDTH=33%>&nbsp;</td>

<td>
<center><font color={{red}} size=-1>At the moment the processing
on {{fpage_href}} files is not yet complete enough to be useful so
this section has not yet been written.</font></center>
</td>

<td WIDTH=33%>&nbsp;</td>
</tr>
</table>

<h1><a name="perlscript">Perl Scripting</a></h1>
<p>
Since you have the script the ultimate way you can change the behaviour of the program (or 
indeed the British spelling in the documentation) is to edit the Perl script.  If you 
have got this far and are still seriously contemplating this approach then you 
shouldn't need me to give you any hints, run up that debugger and poke around.  
</p>

<h2><a name="special_action">Special Actions</a></h2>
<p>
Well OK, there is one place where you can get {{program_href}} to perform some different actions, 
without having to understand a 10,000 line perl program.  That 
is by using the {{st}}special_action<i>n</i>{{et}} attributes.   There are nine of these, 
called {{st}}special_action1{{et}}..{{st}}special_action9{{et}}, each one is tested 
in turn (so if {{st}}special_action1{{et}} is not defined none of the others will be run). 
Each special action consists of a block of Perl code which is run for each file, the variables 
{{st}}$dir{{et}} and {{st}}$file{{et}} specify the file being tested.   You can indicate 
if your script changes the directory structure by returning a non-zero value, this will cause 
{{program_href}} to start again with the specified directory (maximum of three retries).
</p><p>
Here is an example that copies one of the files {{st}}sun.gif{{et}}, {{st}}mon.gif{{et}},
{{st}}tue.gif{{et}}, {{st}}wed.gif{{et}}, {{st}}thu.gif{{et}},
{{st}}fri.gif{{et}}, {{st}}sat.gif{{et}} or {{st}}sun.gif{{et}} to {{st}}today.gif{{et}}
depending on which day of the week it was run on.
</p>
{{start_example}}
# Here is where we define the action to take in this directory
./{special_action1} = &lt;&lt;EndAction
  {
    my($action);
    $action = 0;

    if(!-f "$dir/today.gif")
      {
        # File does not exist yet, create it
        $action = 1;
      }
    else
      {
        if($file ne "today.gif")
          {
            # This is not the right file
            return(0);
          }
        if((-M "$dir/today.gif") &lt; 0.1)
          {
            # The file was changed recently
            return(0);
          }
        # OK so the file is there and is old
        unlink "$dir/today.gif";
      }

    # We need to generate a new copy
    my($dow,$tfile,$line);
    local(*IN,*OUT);

    # Work out the local day of week
    $dow = (localtime(time))[6];

    # Translate to a file name
    $tfile = ("sun","mon","tue","wed",
              "thu","fri","sat","sun")[$dow];

    # Copy that file to today.gif
    open(IN,"$dir/$tfile.gif") or die "Cannot read $dir/$tfile.gif\n";
    binmode(IN);
    open(OUT,">$dir/today.gif") or die "Cannot write to $dir/today.gif\n";
    binmode(OUT);
    while($line = &lt;IN>)
      {
        print OUT $line;
      }
    close(IN);
    close(OUT);

    # Tell the caller something changed
    return(1);
  }
EndAction
{{end_example}}
<p>
If you come up with any good examples of things that you get special actions to do let 
me know, this will both allow me to ensure that the next release does not break 
your neat mechanism and give me a chance to steal any good ideas you have for my 
own pages.
</p>
<h2><a name="newpagefuns_action">Defining new Page Definition Functions</a></h2>
<p>
In fact here is another place where you can define things in Perl. 
You can create your own {{funs_href}}.  You have to specify the name and 
arguments of the function in the first line (start comments in line two), 
but other than that any Perl you want to call is valid.  Here are two examples:
</p>
{{start_example}}
/{pagedef_fun} = &lt;&lt;EndFunction
dirlist:()
# First line must specify function name and arguments
local(*DIR);
my($ret,@files);
opendir(DIR,".");
@files = readdir(DIR);
closedir(DIR);
$ret = join("\n",@files);
return($ret);
EndFunction

/{pagedef_fun} = &lt;&lt;EndFunction
capitalise:($arg1)
# Make the first letter of each word a capital
return(join(' ',map{ucfirst}split(' ',$arg1)));
EndFunction
{{end_example}}
<p>
Of course there is no point in doing this until you are creating your own 
{{pagedef_href}} which use the new function.
</p>
{{doc_foot}}
end
EndManualPages

    # First all the images we need
    foreach $image (split(/\nend\n/,$all_manual))
      {
        my(%t,$file_name,$base,$ext);

        if($image =~ /^\s*begin\s*\d*\s*(\S+)/i)
          {
            $image .= "\nend\n";
            ($file_name) = $image =~ /^\s*begin\s*\d*\s*(\S+)/i;
            $file_name = "${prog_name}-$file_name";
            Uue::decode($file_name,$image);
          }
        elsif($image =~ /^\s*document\s*(\S+)/i)
          {
            local(*F);
            my($part);
            $part = $1;
            $image =~ s/^\s*document[^\n]+\n//;
            open(F,">${prog_name}-$part") or 
                      (::add_output("Cannot write to ${prog_name}-$part\n"),return);
            $image = expand_manual($image);
            print F $image;
            close(F);
          }
        else
          {
            ::add_output("Unrecognised part in documents\n");
          }
      }
    
    GUI::inform_help("A help document has been saved as $::top_dir/$::prog_name-*");
    GUI::reassign_help("Quick Help",\&::display_help);
  }
  
sub expand_manual
  {
    my($line) = @_;

    while($line =~ /\{\{([^\{\}\s]+)\}\}/)
      {
        my($var,$val);

        $var = $1;
        if(!$expand{$var})
          {
            ::add_output("Unknown document entry \"$var\"\n");
            $val = "Unknown Document Entry";
          }
        elsif(ref($expand{$var}))
          {
            my($row);

            if(${$expand{$var}}{is_table})
              {
                $val = table_shape("head",%{$expand{$var}});
                foreach $row (&{${$expand{$var}}{foreach}}())
                  {
                    $val .= &{${$expand{$var}}{row}}($row);
                  }
                $val .= table_shape("foot",%{$expand{$var}});
              }
            else
              {
                $val = &{${$expand{$var}}{fun}}();
              }
          }
        else
          {
            $val = $expand{$var};
            $val =~ s/\n$//;
          }
        $line = ::replace($line,"\{\{$var\}\}",$val);
      }

    $line =~ s/\. /\.\&nbsp; /g;
    return($line);
  }

sub table_shape
  {
    my($typ,%tab_spec) = @_;
    my($val,$c);

    if($typ eq "foot")
      {
        # End of table with $col_specs[0] columns
        return("</table>\n");
      }
    # Define the table from the column specs
    if(!$tab_spec{width})
      {
        ::add_output("No width on table $typ\n");
      }
    $val = <<"EndTableHead";
<table border cellpadding=3 width="$tab_spec{width}" bgcolor={{table_bg}} align="center">
  <tr bgcolor={{table_headbg}}>
EndTableHead

    foreach $c (@{$tab_spec{cols}})
      {
        my($style);
        $style = "<td><center><b>";
        
        $val .= "    $style".${$c}{title}.Page::backout($style)."\n";
      }
    $val .= "  </tr>\n\n";
    return($val);
  }

sub table_row
  {
    my($table_name,@vals) = @_;
    my($ret,$i);

    $ret = "  <tr>\n";
    for($i=0;$i<=$#vals;$i++)
      {
        my($format,$rformat,$v);
        $format = "<td>".${${${$expand{$table_name}}{cols}}[$i]}{format};
        $format = "" if(!defined($format));
        $rformat = Page::backout($format);
        $v = $vals[$i];
        $v = "&nbsp;" if(!$v);
        $ret .= "    ".$format.$v.$rformat."\n";
      }
    $ret .= "  </tr>\n\n";
    return($ret);
  }
  
}

{
package GUI;
    my($main_win,$done_but,$report_lab,$wflio_progress);
    my($b_frame,$txt_area,$state,$t_frame,$help_button);
    my($showdir_entry,$fsdialog,$option_dialog,$opt_frame);
    my($wflio_percent_done,$wflio_files_done);
    my($fpage_progress,$fpage_percent_done);

sub inform_help ($)
  {
    my($text,$dialog) = @_;
    
    return if($::no_tk || !$main_win);

    return if(!::require_if_present("Tk::Dialog"));

    $dialog = $main_win->Dialog(-title => "$0 Help",
         -text => $text,
         -buttons => ["OK"]);
    $dialog->Show(-global);
  }

sub define_interface (&)
  {
    # Create and run the Tk interface
    my($run_fun) = @_;
    
    $main_win = new Tk::MainWindow(
        -title   => "Build Picture Folio",
      );

    $t_frame = $main_win->Frame(
      )->pack(
            -fill => 'x',
            -side => 'top',
          );

    $b_frame = $main_win->Frame(
      )->pack(
            -fill => 'x',
            -side => 'bottom'
          );

    # We want the main text area last so that it expands
    $txt_area = $main_win->Scrolled('Text',
        -scrollbars => 'oe',
      )->pack(
            -fill => 'both',
            -side => 'top'
          );

    $help_button = $t_frame->Button(
        -text => "Help",
        -command => \&::display_help,
      )->pack(
            -side => 'right',
            -fill => 'y',
          );
          
    $option_dialog = $main_win->DialogBox(
        -title => "Build Folio Options",
        -buttons => ["OK"]);
    
    $opt_frame = $option_dialog->add('Frame')->pack;
    if($::operating_system =~ /^MSWin/i)
      {
        $opt_frame->Checkbutton(
            -text => "Hide Files",
            -variable => \$::hide_wfolio,
          )->pack(
            -side => 'top'
          );
      }
    $opt_frame->Checkbutton(
            -text => "Don't List Empty Dirs",
            -variable => \$::ignore_empty_dirs,
          )->pack(
            -side => 'top'
          );
    $opt_frame->Checkbutton(
            -text => "Simple WFlio Lookup",
            -variable => \$::simple_wflio,
          )->pack(
            -side => 'top'
          );
        
    $opt_frame->Checkbutton(
            -text => "No FPage Generation",
            -variable => \$::no_fpage,
          )->pack(
            -side => 'top'
          );

    $opt_frame->Checkbutton(
            -text => "Don't Use Icons",
            -variable => \$::dont_use_icons,
          )->pack(
            -side => 'top'
          );
          
    $t_frame->Button(
        -text => "Configure",
        -command => sub {$option_dialog->Show(-global)},
      )->pack(
            -side => 'right',
            -fill => 'y',
          );

    if(!$::no_dirtree)
      {
        eval(<<'EndOverride') if($::operating_system =~ /^MSWin/i);
         # Override some funs for windows
         package Tk::DirTree;
         sub has_subdir {1}
         sub DirCmd {
             my ($w, $dir, undef) = @_;
             $dir =~ s/^(\w:)$/$1\//;
             my $h = DirHandle->new($dir) or return;
             my @names = grep( $_ ne '.' && $_ ne '..', $h->read );
             return @names;
         }
         sub add_to_tree {
             my( $w, $dir, $name, $parent ) = @_;

             my $image = $w->Getimage( $w->cget('-image') );
             my $mode = 'none';
             $mode = 'open' if $w->has_subdir( $dir );

             my @args = (-image => $image, -text => $name);
             if( $parent ) {             # Add in alphabetical order.
                 foreach my $sib ($w->infoChildren( $parent )) {
                     if( lc($sib) gt lc($dir) ) {
                         push @args, (-before => $sib);
                         last;
                     }
                 }
             }

             $w->add( $dir, @args );
             $w->setmode( $dir, $mode );
         }
EndOverride
        $t_frame->Button(
            -text => "Select Top Dir",
            -command => \&select_dir_dt,
          )->pack(
                -side => 'right',
                -fill => 'y',
              );
      }
    elsif(!$::no_fileselect)
      {
        $fsdialog = $main_win->FileSelect(
            -directory => '.',
          );

        $t_frame->Button(
            -text => "Select Top Dir",
            -command => \&select_dir_fs,
          )->pack(
                -side => 'right',
                -fill => 'y',
              );
      }

    $showdir_entry = $t_frame->Entry(
        -textvariable => \$::top_dir,
      )->pack(
            -fill => 'both',
          );

    $done_but = $b_frame->Button(
        -text    => "Start",
        -command => $run_fun,
      )->pack(
            -side => 'left',
            -fill => 'y',
          );

    if(!$::no_progress)
      {
        $wflio_progress = $b_frame->ProgressBar(
            -width => 20, -length => 50,
            -from => 0, -to => $::progress_steps,
            -colors => [0, 'blue'],
            -variable => \$wflio_percent_done,
          )->pack(
                -side => 'left'
              );

        $fpage_progress = $b_frame->ProgressBar(
            -width => 20, -length => 50,
            -from => 0, -to => $::progress_steps,
            -colors => [0, 'green'],
            -variable => \$fpage_percent_done,
          )->pack(
                -side => 'left'
              );
        FileCounts::register_progress_fun(\&move_progress,"serial","wflio","fpage");
      }

    $b_frame->Button(
        -text    => "Done",
        -command => sub {$main_win->destroy},
      )->pack(
            -side => 'right',
            -fill => 'y',
          );

    $report_lab = $b_frame->Label(
        -text    => $state,
      )->pack(
            -fill => 'both',
          );

    # Now run it
    &Tk::MainLoop;
  }
  
sub move_progress ($$)
  {
    my($section,$step) = @_;
    if($section == 0)
      {
        $wflio_percent_done = $step;
        $wflio_progress->update;
      }
    elsif($section == 1)
      {
        $fpage_percent_done = $step;
        $fpage_progress->update;
      }
  }

sub reassign_help ($$)
  {
    my($text,$fun) = @_;

    return if($::no_tk || !$main_win);
    $help_button->configure(
            -text => $text,
            -command => $fun,
          );
  }

sub select_dir_dt ()
  {
    # If we have a directory tree browser use it to select 
    # the directory
    my($status,$scrolled,$dtdialog);
    my($dtdialog_frame,$dtdialog_scrolled,$dtdialog_ok,$dtdialog_dir);

    $dtdialog = $main_win->Toplevel;
    $dtdialog->title("Choose Directory");
    $dtdialog_frame = $dtdialog->Frame->pack(
        -fill => "x",
        -side => "bottom"
      );
    $dtdialog_scrolled = $dtdialog->Scrolled('DirTree',
        -scrollbars => 'osoe',
        -width => 35,
        -height => 20,
        -selectmode => 'browse',
        -exportselection => 1,
        -browsecmd => sub {$dtdialog_dir=shift},
        -command   => sub {$dtdialog_ok = 1 },
      )->pack(-fill => "both", -expand => 1);

    if($::operating_system =~  /^MSWin/i && !$::no_win32API)
      {
        my(@drv,$d,$p);
        $p = " "x105;
        &Win32API::File::GetLogicalDriveStrings(105,$p);
        foreach $d (split(/\x00/,$p))
          {
            $d =~ s/\\//g;
            $d = lc($d);
            next if($::top_dir =~ /^$d/i);
            $dtdialog_scrolled->add_to_tree($d, $d);
          }
      }
    $dtdialog_frame->Button(-text => 'OK',
        -command => sub {$dtdialog_ok =  1}
      )->pack(-side => 'left');
    $dtdialog_frame->Button(-text => 'Cancel',
        -command => sub {$dtdialog_ok = -1}
      )->pack(-side => 'left');

    $dtdialog_ok = 0;
    $dtdialog_dir = $::top_dir;
    chdir($::top_dir);
    $dtdialog_frame->waitVariable(\$dtdialog_ok);

    if ($dtdialog_ok == 1)
      {
        if (-x $dtdialog_dir)
          {
            $dtdialog_dir =~ s/^(\w):$/$1:\//;
            $::top_dir = $dtdialog_dir;
          }
        else
          {
            ::add_output("$dtdialog_dir doesn't exist");
          }
      }
    $dtdialog->withdraw;
    $dtdialog->destroy;
  }

sub select_dir_fs ()
  {
    # If the directory tree is not loaded try and use the 
    # file selector
    my($new_dir);

    $fsdialog->configure(
        -directory => $::top_dir,
      );

    $new_dir = $fsdialog->Show;
    if($new_dir)
      {
        # Remove the disk specifier
        $new_dir =~ s#.+(\S\:[^\:]+)$#$1#;
        if($new_dir =~ s#/+[^/]+$##)
          {
          }
        else
          {
            ::add_output("Cannot parse dir from $new_dir\n");
            return;
          }
        ::add_output("Set dir $new_dir\n");
        $::top_dir = $new_dir;
        chdir($new_dir);
      }
    else
      {
        ::add_output("Canceled\n");
      }
  }

sub set_state ($;$)
  {
    my($val,$quiet) = @_;

    $state = $val;
    if(!$::no_tk && $report_lab)
      {
        $report_lab->configure(-text => $state);
        $report_lab->update;
      }
    elsif(!$quiet)
      {
        print STDERR "$state\n";
      }
  }

sub activate_done ($$)
  {
    my($state,$text) = @_;
    $done_but->configure(
        -state => $state,
        -text => $text,
      );    
  }

sub add_output ($)
  {
    my($line) = @_;
    return("") if(!$txt_area);
    $txt_area->insert('end',$line);
    $txt_area->update;
    return(1);
  }
}


{
# Keep track of how many files we have created
package FileCounts;
  my(%total_gen_file_counts,%target_gen_file_counts);
  my($progress_fun,$progress_report_strategy);
  my(@progress_sections,%progress_sections);
  my($cur_section,@cur_percent);
  my($total_file_count);
  
sub register_progress_fun (\&$@)
  {
    # Define the function to call when significant 
    # progress has been made
    my($fun,$strategy,@sections) = @_;
    my($i);
    
    $progress_fun = $fun;
    @progress_sections = @sections;
    for($i=0;$i<=$#sections;$i++)
      {
        $progress_sections{$sections[$i]} = $i+1;
      }
    $progress_report_strategy = $strategy;
  }

sub top_init ()
  {
    my($typ);
    
    # Define the fact that we have a progress bar like we do
    foreach $typ ($::flag_name."_index",$::flag_name."_wflio",
                  $::flag_name."_icon","wflio","fpage","icon","thumb")
      {
        $total_gen_file_counts{$typ} = 0;
        $target_gen_file_counts{$typ} = 1;
      }
  }

sub session_init ()
  {
    my($typ,$i);

    $total_file_count = 1;
    $cur_section = 0;
    for($i=0;$i<=$#progress_sections;$i++)
      {
        $cur_percent[$i] = 0;
        # Reset the progress indicator
        &{$progress_fun}($i,$cur_percent[$i])
                                            if($progress_fun);
      }

    foreach $typ (keys(%total_gen_file_counts))
      {
        $total_gen_file_counts{$typ} = 0;
        $target_gen_file_counts{$typ} = 0;
      }
  }

sub inc ($;$)
  {
    my($typ,$target) = @_;

    if($target)
      {
        $target_gen_file_counts{$typ}++;
      }
    else
      {
        $total_file_count++;
        $total_gen_file_counts{$typ}++;

        # Do we need to tell the GUI?
        if(($progress_report_strategy eq "parallel") ||
                   ($progress_sections{$typ} &&
                     ($progress_sections{$typ} - 1) == $cur_section))
          {
            # Update the various progress indicators in parallel
            my($section,$steps_done);
            ($steps_done,$section) = get_progress_steps($typ);
            &{$progress_fun}($section,$steps_done)
                              if($steps_done && $progress_fun);
          }
      }
  }

sub get_progress_steps ($)
  {
    my($typ,$section,$new_percent) = @_;

    # Check for both uninitalised and set to zero
    return(0) if(!$progress_sections{$typ});

    $section = $progress_sections{$typ} - 1;
    # Keep doubling the estimate if we go over (ensures no 
    # divide by zero error
    $total_gen_file_counts{$typ} = 0 if(!$total_gen_file_counts{$typ});
    $target_gen_file_counts{$typ} = 1+($total_gen_file_counts{$typ}*2)
                    if($target_gen_file_counts{$typ} < $total_gen_file_counts{$typ});

    $new_percent = int(($::progress_steps * $total_gen_file_counts{$typ})/
                                     $target_gen_file_counts{$typ});
    $new_percent = 1 if(!$new_percent);
    if($new_percent != $cur_percent[$section])
      {
        $cur_percent[$section] = $new_percent;
        return($new_percent,$section);
      }
    return(0);
  }

sub get ($;$)
  {
    my($typ,$target) = @_;
    if($target)
      {
        return($target_gen_file_counts{$typ});
      }
    else
      {
        return($total_gen_file_counts{$typ});
      }
  }

sub completed ($)
  {
    my($typ) = @_;
    my($section,$steps_done);

    # Now we have the proper count, set the target to where we got to
    $total_gen_file_counts{$typ} = 1 if($total_gen_file_counts{$typ} < 1);
    $target_gen_file_counts{$typ} = $total_gen_file_counts{$typ};

    # Push this progress indicator to the end
    ($steps_done,$section) = get_progress_steps($typ);
    &{$progress_fun}($section,$steps_done)
                              if($steps_done && $progress_fun);
    
    if($progress_report_strategy eq "serial" && 
                               $cur_section < $#progress_sections)
      {
        # Shove the next progress indicator to the place the 
        # progress indicates it should be
        $typ = $progress_sections[$cur_section];
        ($steps_done,$section) = get_progress_steps($typ);
        &{$progress_fun}($section,$steps_done)
                              if($steps_done && $progress_fun);
      }
  }
}


{
# Handle directory paths, should probably replace this 
# lot with the standard CPAN module (one day prehaps)
package Path;

sub dir_part ($)
  {
    # get the directory part of the path
    my($path) = @_;
    while(!-d $path)
      {
        if($path =~ s/\/+[^\/]*$//)
          {
          }
        else
          {
            $path = ".";
          }
      }
    return($path);
  }

sub file_part ($)
  {
    my($path,$dir) = @_;
    $dir = dir_part($path);
    $dir =~ s/\./\\\./g;
    $path =~ s/^$dir\/*//;
    return($path);
  }

{
    my($last_in,$last_out);

sub cannonicalise ($;$)
  {
    my($path,$dot,@path,$changed,$i,$abs) = @_;

    if($path && $last_in && $last_in eq $path)
      {
        return($last_out);
      }

    # Convert path to standard form
    @path = split(/\/+/,$path);
    $abs = 1 if($path =~ m#^/#);

    $changed = 1;
    while($changed)
      {
        $changed = "";
        for($i=0;$i<=$#path;$i++)
          {
            if($path[$i] eq ".")
              {
                splice(@path,$i,1);
                $changed = 1;
                last;
              }
            if($i > 0 && $path[$i] eq ".." && $path[$i-1] ne "..")
              {
                splice(@path,$i-1,2);
                $changed = 1;
                last;
              }
          }
      }

    if($abs)
      {
        if(!@path)
          {
            $path = "/";
          }
        else
          {
            $path = "/".join('/',@path);
          }
      }
    else
      {
        if(!@path)
          {
            if(!$dot || $dot ne "empty")
              {
                $path = ".";
              }
            else
              {
                $path = "";
              }
          }
        else
          {
            $path = join('/',@path);
          }
      }

    $last_in = $_[0];
    $last_out = $path;
    
    return($path);
  }
  
}
}

{
# How to render file system elements in the HTML
package Render;
    my(%dir_images);
    
sub obtain ($$)
  {
    # Work out how to render the file in index pages
    my($dir,$file) = @_;
    my($file_cat,$spec,$target_type,$ret,$target);
    my($wflio_name,$is_dir);
    
    $target = "$dir/$file";

    # If we were asked to render a directory then call the 
    # other function
    $is_dir = "";
    $is_dir = 1 if(-d $target);

    $file_cat = FileCategory::obtain($target);
    if(!$file_cat)
      {
        $file_cat = "dontknow";
        $file_cat = "dir" if($is_dir);
      }

    $spec = "";
    if($is_dir)
      {
        Attribute::get($target,"force_dirrender",\$spec,1);
      }
    else
      {
        Attribute::get($target,"force_filerender",\$spec,1);
      }

    if(!$spec)
      {
        Attribute::get($target,"force_render",\$spec,1);
      }

    if(!$spec)
      {
        if($is_dir)
          {
            if(!Attribute::get($target,"default_dirrender",\$spec,1))
              {
                Attribute::get($target,"category_${file_cat}_dirrender",\$spec,1);
              }
          }
        else
          {
            Attribute::get($target,"category_${file_cat}_filerender",\$spec,1);
          }
    
        Attribute::get($target,"category_${file_cat}_render",\$spec,1)
                                                                if(!$spec);
      }
    $spec = "file:$file" if(!$spec);
    $spec = "ignore:$file" if($spec eq "ignore");
    
    if($spec =~ /^([\w_]+):(.+)$/)
      {
        $target_type = $1;
        $ret = $2;
      }
    else
      {
        ::add_output("Cannot parse |$spec| as rendition\n");
        $target_type = 'file';
        $ret = $spec;
      }

    if($is_dir)
      {
        # Directories are always just links to the index pages
      }
    
    $wflio_name = "file not generated";
    if($target_type eq 'file')
      {
        $ret = "<a|href=\$<file>>${ret}</a>";
      }
    elsif($target_type eq 'wflio')
      {
        $dir = Path::cannonicalise($dir);
        if(!$dir_images{$dir} && -f "$dir/$file" && !-d "$dir/$file")
          {
            $dir_images{$dir} = $file;
          }
        $wflio_name = GenName::obtain($target,"wflio",$dir);
        if(!$wflio_name)
          {
            ::add_output("Cannot find wflio file for $target\n");
          }
        else
          {
            $ret = "<a|href=\$<targetname>>${ret}</a>";
          }
      }
    elsif($target_type eq 'embed')
      {
        $ret = "<embed|src=\$<file>>${ret}</embed>";
      }
    elsif($target_type eq 'ignore')
      {
        return("");
      }
    else
      {
        ::add_output("Target type $target_type not recognised\n");
        $target_type = 'file';
        $ret = "<a|href=\$<target>>${ret}</a>";
      }

    # Just simple substitutions here
    if($is_dir && $ret =~ /\$\<dir_image\>/)
      {
        my($f,$w,$best_image);

        $w = Path::cannonicalise("$dir/$file");

        if(Attribute::get($w,"index_picture",\$best_image,1) && 
                                            -f "$w/$best_image")
          {
            # A "best image" has been nominated and it exists
            $f = "<img+thumb|src=$file/$best_image|alt=$file/>";
          }
        elsif($dir_images{$w})
          {
            # We have some images in the subdir
            $f = "<img+thumb|src=$file/$dir_images{$w}|alt=$file/>";
          }
        else
          {
            # OK, no images in the immediate subdir, can we use an icon?
            $f = '$<dir_icon>';
          }
        $ret = ::replace($ret,'$<dir_image>',$f);
      }

    if($is_dir && $ret =~ /\$\<dir_icon\>/)
      {
        my($f,$category,$iname);

        $category = FileCategory::classify($dir,$file,"index");
        $iname = GenName::obtain("$dir/$category","icon",$dir);
        $iname = GenName::obtain("$dir/unknown","icon",$dir) if(!$iname);
        $f = "<img+icon|src=$iname|alt=$file/>";
        $ret = ::replace($ret,'$<dir_icon>',$f);
      }

    $ret = ::replace($ret,'$<dir>',$dir);
    $file = encode_filename($file);
    $ret = ::replace($ret,'$<file>',$file);

    $target = encode_filename($target);
    $ret = ::replace($ret,'$<path>',$target);

    $ret = ::replace($ret,'$<category>',$file_cat);
    $ret = ::replace($ret,'$<targettype>',$target_type);
    $ret = ::replace($ret,'$<targetname>',$wflio_name);
    $ret = ::replace($ret,'$<targetpath>',"$dir/$wflio_name");
    return($ret);
  }

sub encode_filename
  {
    # Do some character replacing for elements that will go into 
    # html
    my($ret) = @_;
    $ret =~ s/\%/\&#37;/g;
    $ret =~ s/\[/\&#91;/g;
    $ret =~ s/\]/\&#93;/g;
    $ret =~ s/\{/\&#123;/g;
    $ret =~ s/\}/\&#125;/g;
    
    return($ret);
  }

sub decode_filename
  {
    # 
    my($ret) = @_;
    
    return($ret);
  }

}

{
# Functions to play with uuencoded files
package Uue;

sub encode ($)
  {
    # UUencode a binary file
    my($input) = @_;
    my($line,$len,$ll,$fname,$ret);
    local(*INPUT);
    
    $ll = 45;
    open(INPUT,$input) or (::add_output("Cannot read $input\n"),return);
    binmode INPUT;
    $fname = $input;
    while($fname =~ m#/#)
      {
        $fname =~ s#^[^/]*/##;
      }
    $ret = "begin 644 $fname\n";
    do
      {
        my($p);
        $len = read INPUT,$line,$ll;
        # Buffer up to nearest set of 3 bytes
        $len = 3*(1+int(($len-1)/3)) if($len > 0);
        if($len != $ll)
          {
            # print "yy\n";
          }
        # $p = substr(pack("u$len",$line),0,2+int(($len-1)/3+1)*4);
        $p = pack("u$len",$line);
        $p = "\`\n" if(!$p);
        $ret .= $p;
      } while($len > 0);
    $ret .= "end\n";
    close(INPUT);

    return($ret);
  }

sub decode ($$)
  {
    my($name,$uue) = @_;
    my($o,$l,@lines);
    local(*OUTPUT);

    open(OUTPUT,">$name") or (::add_output("Cannot write to $name\n"),return);
    binmode(OUTPUT);
    @lines = split(/\n/,$uue);
    # Remove the "begin" line at the start
    shift(@lines);
    
    # Remove the last two lines
    if($lines[$#lines] =~ /^end$/i)
      {
        pop(@lines);
      }
    else
      {
        return(1);
      }
    if($lines[$#lines] =~ /^[\s\`]$/i)
      {
        pop(@lines);
      }
    else
      {
        return(2);
      }
    foreach $l (@lines)
      {
        my($len,$dlen,$data);
        $len = unpack("c1",$l) - 32;
        # $dlen = ($len/3)*4+1;
        # $data = unpack("u$dlen",$l."                ");
        $data = unpack("u",$l."                ");
        syswrite(OUTPUT,$data,$len);
      }
    close(OUTPUT);
    return(0);
  }

}

{
# Getting and setting wfolio attributes on files
package Attribute;

    my(%attrib_values,@sections);
    my(%automagic1);
    my($keep_list,%kept_list);
    
sub top_init ()
  {
    # For debugging purposes keep a complete list of attributes
    # searched for (set to 0 for production version)
    $keep_list = 1;

    # Some attributes can be deduced right from the filename
    %automagic1 =
      (
        "_dirname" =>
          sub ($) {
                my($f);
                $f = $_[0];
                return($f) if(-d $f);
                if($f =~ m#/#)
                  {
                    $f =~ s/\/+([^\/]*)$//;
                  }
                else
                  {
                    $f = ".";
                  }
                return($f);
              },
        "_filename" =>
          sub ($) {
                my($subst) = @_;
                return($1) if($subst =~ /\/([^\/]*)$/);
                return($subst);
              },
        "_fileext" =>
          sub {
                return $1 if($_[0] =~ /\.([^\.]+)$/);
                return("");
              },
        "_filesize" =>
          sub {
                my($subst);
                $subst = -s $_[0];
                if($subst < 2048)
                  {
                  }
                elsif($subst < 1024*2048)
                  {
                    $subst = int($subst/1024) . "k";
                  }
                elsif($subst < 1024*1024*2048)
                  {
                    $subst = int($subst/(1024*1024)) . "M";
                  }
                else
                  {
                    $subst = int($subst/(1024*1024*1024)) . "G";
                  }
                
                return($subst);
              },
        "_filerawsize" =>
          sub {
                return(-s $_[0]);
              },
        "_file_modified" =>
          sub {
                my($file_name) = @_;
                my(@stat);

                @stat = stat($file_name);
                return(Time::time2str($stat[9]));
              },
        "_file_created" =>
          sub {
                my($file_name) = @_;
                my(@stat);

                @stat = stat($file_name);
                return(Time::time2str($stat[10]));
              },
        "_thumb_file" =>
          sub {
                # Command to run without Tk
                #     perl -d build-folio.pl -no_tk -dir 2006a.cd
                my($full_path) = @_;

                # Split the path into the dir and file
                my($dir,$file);

                if($full_path =~ m#/([^/]+)$#)
                  {
                    $dir = $`;
                    $file = $1;
                  }
                else
                  {
                    $dir = ".";
                    $file = $full_path;
                  }

                # Need to extract the thumb width and height properties here
                my $thumb_name = Image::thumbnail($dir,$file);
                if(defined $thumb_name && $thumb_name ne "")
                  {
                    my $subst = '<img+thumb|src='.$thumb_name.'|alt=$[_filename@'.
                                                                      $full_path.']/>';
                    return($subst);
                  }
                else
                  {
                    my $subst = '<img+thumb|src=$[_filename@'.
                                          $full_path.']|alt=$[_filename@'.$full_path.']/>';
                    return($subst);
                  }
              },
        "_thumb_local" =>
          sub {
                my($path,$subst) = @_;
                $subst = '<img+thumb|src=$[_filename@'.$path.']|alt=$[_filename@'.$path.']/>';
                return($subst);
              },
        "_thumb_remote" =>
          sub {
                my($path) = @_;
                my($cat,$subst);
                $cat = FileCategory::classify($path,"","webify");
                if($cat eq "picture")
                  {
                    $subst = '<img+thumb|src='.$path.'|alt=$[_dirname@'.$path.']/>';
                  }
                else
                  {
                    my($dir,$icon_file);
                    $dir = Path::dir_part($path);
                    $icon_file = GenName::obtain("$dir/$cat","icon",$dir);
                    $subst = "<img+icon|src=${icon_file}|alt=${dir}/>";
                  }
                return($subst);
              },
        "_tidy_name" =>
          sub {
                my($path,$dir) = @_;
                $path = Path::file_part($path);
                $path =~ s/\.[^\.]+$//;
                $path =~ s/[\_\-\.]+/ /g;
                return($path);
              },
        "_to_root" =>
          sub {
                my($path) = @_;
                my($to_root);
                $to_root = Path::dir_part(Path::cannonicalise($path));
                $to_root =~ s#[^/]+#..#g;
                return($to_root);
              },
        "_timenow" =>
          sub {
                my($date_str);
                $date_str = Time::time2str(time);
                return($date_str);
              },
        "_timenow_dmy" =>
          sub {
                my($date_str);
                $date_str = Time::time2str(time,'$day $month $year');
                return($date_str);
              },
        "_timenow_dmysl" =>
          sub {
                my($date_str);
                $date_str = Time::time2str(time,'$day/$mon/$year');
                return($date_str);
              },
        "_timenow_mdy" =>
          sub {
                my($date_str);
                $date_str = Time::time2str(time,'$month $day $year');
                return($date_str);
              },
        "_timenow_mdysl" =>
          sub {
                my($date_str);
                $date_str = Time::time2str(time,'$mon/$day/$year');
                return($date_str);
              },
        "_timenow_24" =>
          sub {
                my($date_str);
                $date_str = Time::time2str(time,'$hour24:$min');
                return($date_str);
              },
        "_timenow_am" =>
          sub {
                my($date_str);
                $date_str = Time::time2str(time,'$hour12:$min$am');
                return($date_str);
              },
      );
  }

sub session_init ()
  {
    my($f);
    
    top_init() if(!%automagic1);
    # Clear out previous values
    $attrib_values{"wflio"} = {} if(!$attrib_values{"wflio"});
    foreach $f (keys(%{$attrib_values{"wflio"}}))
      {
        next if($f eq "..");
        ${$attrib_values{"wflio"}}{$f} = "";
      }
    @sections = ();
  }
 
sub start_section ($)
  {
    my($section) = @_;
    if($section =~ m/[^\w\d]/)
      {
        ::add_output("Cannot have non word charaters in section names ($section)\n");
        $section =~ s/[^\w\d]//g;
      }
    $section = lc($section);

    unshift(@sections,$section);
  }

sub end_section (;$)
  {
    shift(@sections);
  }

sub defaults ($;$)
  {
    if($_[1])
      {
        ${$attrib_values{$_[1]}}{".."} = $_[0];
      }
    else
      {
        ${$attrib_values{"wflio"}}{".."} = $_[0];
      }
  }

sub set ($$$;$)
  {
    my($path,$attrib,$val,$attrib_group) = @_;
    my(%nattribs);

    $path = Path::cannonicalise($path);
    $attrib = lc($attrib);    

    $attrib_group = "wflio" if(!$attrib_group);

    $attrib_values{$attrib_group} = {} if(!$attrib_values{$attrib_group});
    
    if(${$attrib_values{$attrib_group}}{$path})
      {
        %nattribs = %{${$attrib_values{$attrib_group}}{$path}};
      }
    else
      {
        %nattribs = ();
      }
    if($nattribs{$attrib})
      {
        ::add_output("Multiple values for $attrib_group $path\{$attrib\}\n")
                                     if($path ne "..");
      }
    $nattribs{$attrib} = $val;
    ${$attrib_values{$attrib_group}}{$path} = {%nattribs};
  }

{
    my($last_path,$last_attrib_group,@last_bind);
    
sub attrib_bindings ($;$attrib_group)
  {
    # Return the list of attribute bindings for a path
    my($path,$attrib_group) = @_;
    my(@binding);

    $attrib_group = "wflio" if(!$attrib_group);
    return(@last_bind) if($last_path && 
                          $path eq $last_path &&
                          $attrib_group &&
                          $attrib_group eq $last_attrib_group);
    $last_path = $path;
    $last_attrib_group = $attrib_group;
    
    while($path)
      {
        if(${$attrib_values{$attrib_group}}{$path})
          {
            push(@binding,${$attrib_values{$attrib_group}}{$path});
          }
        # OK so we didn't find a matching element there, how about one
        # level up?
        if($path eq ".")
          {
            $path = "..";
          }
        elsif($path eq "..")
          {
            $path = "";
          }
        elsif($path =~ m#/#)
          {
            $path =~ s#/+[^/]*$##;
          }
        else
          {
            $path = ".";
          }
      }
    @last_bind = @binding;
    return(@binding);
  }
}

my($attrib_group);

sub get ($$$;$)
  {
    my($path,$attrib_end,$ret_ref,$silent) = @_;
    my(%attribs,$section,$attrib,$value,$k);
    my(@bind,$path_modified);

    $path_modified = "";
    if($attrib_end =~ s/^([^\@]+)\@(.+)$/$1/)
      {
        $path = $2;
        $path_modified = 1;
      }
    $path = Path::cannonicalise($path);

    # Now that the file name has been extracted we 
    # can cannonicalise the attribute name
    $attrib_end = lc($attrib_end);

    if($attrib_end =~ /^_/)
      {
        if($automagic1{$attrib_end})
          {
            my($val);
            $value = &{$automagic1{$attrib_end}}($path);
            goto success;
          }
        elsif($attrib_end =~ /_(icon|wflink)_?/)
          {
            my($rel,$category,$part,$icondef);
            $rel  = $`;
            $category = $1;
            $part = $';

            $rel =~ s/^_+//;
            $rel = "dontknow" if(!$rel);
            if($part eq "name")
              {
                $value = $rel;
                goto success;
              }
            if($category eq "icon")
              {
                my($fname);
                if($silent)
                  {
                    if(!GenName::check("$path/$rel",$category))
                      {
                        return(0);
                      }
                  }
                $fname = GenName::obtain("$path/$rel","icon",$path);
                if($part eq "file")
                  {
                    $value = $fname;
                    goto success;
                  }
                $value = "<img+${category}|src=${fname}|alt=${rel}/>";
                goto success;
              }
            else
              {
                my($fname,$icon_name);
                if($silent)
                  {
                    if(!GenName::check($path,"${rel}_${category}"))
                      {
                        return(0);
                      }
                  }
                $value = GenName::obtain($path,"${rel}_${category}",$path);
                goto success;
              }
          }
        ::add_output("Automagic attribute $attrib_end not processed\n");
        return(0);
      }

    $path = "." if(!$path);

    if($::simple_wflio)
      {
        # Only look at root and the defaults
        $path = ".";
      }
    elsif($path eq ".")
      {
        $path = "**only**";
      }
    else
      {
        # First check for tight binding
        $path .= "/**only**";
      }
    
    @bind = attrib_bindings($path,$attrib_group);
    foreach $section (@sections,"")
      {
        my($i);
        $attrib = "${section}_${attrib_end}";
        $attrib = ${attrib_end} if(!$section);

        if($keep_list)
          {
            $kept_list{$attrib} = 1;
          }

        $value = "";
        for($i=0;$i<=$#bind;$i++)
          {
            if(${$bind[$i]}{$attrib})
              {
                $value = ${$bind[$i]}{$attrib};
                last if($value ne ".");
              }
          }

        if($value && $value ne ".")
          {
            goto success;
          }
      }

    # Woops we ran out of places to look
    ::add_output("Failed to get value for $_[0]\{$_[1]\}\n") if(!$silent);
    return(0);

success:
    # Here is how we dispatch the value
    if($value eq "**zero**")
      {
        $value = 0;
      }
    elsif($value eq "**empty**")
      {
        $value = "";
      }
    elsif($value eq "**null**")
      {
        $value = undef;
      }
    elsif($path_modified)
      {
        # Need to check out if we must tag the location
        $value = Page::tag_represents($path,$value);
      }
    ${$ret_ref} = $value;
    return(1);
  }
  
sub fpage_get
  {
    # This is slightly different from the way we get 
    # attributes for files.  We are dealing with a 
    # "virtual" structure of pages which never the less
    # has real pages in each of the parts.
    my($path,$attrib,$ret_ref) = @_;
    my($ret,$saved);
    
    $saved = $attrib_group;
    $attrib_group = "fpage";
    $ret = get($path,$attrib,$ret_ref);
    $attrib_group = $saved;
    return($ret);
  }

sub report_looked_for
  {
    # This function can be used to extract a complete list
    # of attributes looked for for debugging
    my($output,$a);
    foreach $a (sort keys(%kept_list))
      {
        $output .= "$a\n";
      }
    return($output);
  }
}

{
# Map from filesystem names to wflio objects related to them,
# for example to find index files and icons
package GenName;

    my($flag_name,$genname_iformat,$genname_wformat,$genname_tformat);
    my($genname_index,$genname_pat);
    my($genname_numdigits,$genname_digits,$genname_thumb_ext);
    my(%icons,%wfolio_pages);
    my(%page_relationships);
    my(%fpage_pages,%pagedef_pages,@pages_pending);
    my(%wflio_max_index,%wflio_page_names);
    my(%thumb_max_index,%thumb_page_names);
    my(%pruned_dirs);
    
sub examples ($)
  {
    my($set) = @_;
    if($set == 1)
      {
        return("$genname_index, \n${flag_name}_w00001.htm, ${flag_name}_i00020.gif ");
      }
    else
      {
        return("$genname_index");
      }
  }

sub top_init ($$$)
  {
    ($flag_name,$genname_numdigits,$genname_thumb_ext) = @_;
    
    $genname_digits  = "%0${genname_numdigits}d";
    $genname_wformat = "${flag_name}_w${genname_digits}.htm";
    $genname_iformat = "${flag_name}_i${genname_digits}.%s";
    $genname_tformat = "${flag_name}_t${genname_digits}.${genname_thumb_ext}";
    FPage::set_nameformat("${flag_name}_%s${genname_digits}.htm",
                           $genname_numdigits,$genname_digits);
    $genname_index   = "${flag_name}_index.htm";
    $genname_pat     = ${flag_name}.'_([\w\d]+)\.(htm|gif)';
  }

sub session_init ()
  {
    define_icons();
    @pages_pending = ();
    %wflio_page_names = ();
    %thumb_page_names = ();
    %wflio_max_index = ();
    %thumb_max_index = ();
    %page_relationships = ();
    %pruned_dirs = ();
  }

sub check ($$;$)
  {
    my($represents,$page_cat,$from_dir) = @_;
    # find out if we have one without generating a new one
    return(find($represents,$page_cat,$from_dir,"check"));
  }

sub obtain ($$;$)
  {
    my($represents,$page_cat,$from_dir) = @_;
    # find out if we have one without generating a new one
    return(find($represents,$page_cat,$from_dir,"obtain"));
  }

sub set_relation ($$$)
  {
    my($from,$relation,$to) = @_;
    my(%rel);

    # Define which page is to the left for example.
    if($page_relationships{$relation})
      {
        %rel = %{$page_relationships{$relation}};
      }
    else
      {
        %rel = ();
      }
    $from = Path::cannonicalise($from);
    $to = Path::cannonicalise($to);
    $rel{$from} = $to;
    $page_relationships{$relation} = \%rel;
  }

sub find ($$$$)
  {
    my($represents,$page_cat,$from_dir,$find_type) = @_;
    my($abs_name);
    
    $represents = Path::cannonicalise($represents);
    if($from_dir)
      {
        $from_dir = Path::cannonicalise($from_dir);
        $from_dir = Path::dir_part($from_dir);
      }
      
    if($page_cat eq "icon")
      {
        my($dir,$file);
        $dir = $represents;
        if($dir =~ s#/+([^/]+)$##)
          {
            $file = $1;
          }
        else
          {
            $file = $dir;
            $dir = ".";
          }
        $dir = Path::dir_part($dir);

        # Translate to an icon name
        if($find_type eq "check")
          {
            return("OK");
          }
        $abs_name = icon_name($file,$dir,1);
        return("") if(!$abs_name);
        $abs_name = "$dir/$abs_name" if($dir);
        goto success;
      }
    elsif($page_cat eq "thumb")
      {
        if($thumb_page_names{$represents})
          {
            if($find_type eq "check")
              {
                return("OK");
              }

            # We have already worked this one out
            $abs_name = $thumb_page_names{$represents};
            goto success;
          }
        if($find_type eq "check")
          {
            return("");
          }
        my $dir = $represents;
        my $file;
        if($dir =~ s#/+([^/]+)$##)
          {
            $file = $1;
          }
        else
          {
            $file = $dir;
            $dir = ".";
          }
        $dir = Path::dir_part($dir);

        if(!$thumb_max_index{$dir})
          {
            # Web stuff, assume program will be used by 
            # real people or americans so we start counting 
            # at 1 (rather than zero/ground!)
            $thumb_max_index{$dir} = 1;
          }

        $abs_name = sprintf("$dir/$genname_tformat",
                             $thumb_max_index{$dir}++);
        $thumb_page_names{$represents} = $abs_name;

        # We have to put off generating this page until later
        goto success;
      }
    elsif($page_cat eq "wflio" && !-d $represents)
      {
        # Generating an intermediate page that ties things together
        my($dir,$file);

        if($wflio_page_names{$represents})
          {
            if($find_type eq "check")
              {
                return("OK");
              }

            # We have already worked this one out
            $abs_name = $wflio_page_names{$represents};
            goto success;
          }

        if($find_type eq "check")
          {
            return("");
          }

        if($represents =~ /$genname_pat/)
          {
            ::add_output("Cannot have wflio file representing $represents\n");
            $abs_name = $represents;
            goto success;
          }
        $dir = $represents;
        if($dir =~ s#/+([^/]+)$##)
          {
            $file = $1;
          }
        else
          {
            $file = $dir;
            $dir = ".";
          }
        $dir = Path::dir_part($dir);

        if(!$wflio_max_index{$dir})
          {
            # Web stuff, assume program will be used by 
            # real people or americans so we start counting 
            # at 1 (rather than zero/ground!)
            $wflio_max_index{$dir} = 1;
          }

        $abs_name = sprintf("$dir/$genname_wformat",
                             $wflio_max_index{$dir}++);
        $wflio_page_names{$represents} = $abs_name;

        # We have to put off generating this page until later
        push(@pages_pending,"wflio",$represents);
        goto success;
      }
    elsif($page_cat eq "index" || $page_cat eq "wflio")
      {
        # Just find it
        if(!-d $represents)
          {
            ::add_output("Cannot generate index for non directory $represents\n");
            return("");
          }
        if(!$wfolio_pages{$represents})
          {
            # Have faith that we will be generating an index for it
            if(!$represents || $represents eq ".")
              {
                $wfolio_pages{$represents} = $genname_index;
              }
            elsif($pruned_dirs{$represents})
              {
                $wfolio_pages{$represents} = $represents."/";
              }
            else
              {
                $wfolio_pages{$represents} = "$represents/$genname_index";
              }
          }
        $abs_name = $wfolio_pages{$represents};
        if($find_type eq "check")
          {
            return("OK");
          }
        goto success;
      }
    elsif($page_relationships{$page_cat})
      {
        # We have some map for this relationship
        $abs_name = ${$page_relationships{$page_cat}}{$represents};
        if($find_type eq "check")
          {
            return("OK") if($abs_name);
            return("");
          }

        if(!$abs_name)
          {
            ::add_output("No $page_cat registered for $represents\n");
            return("");
          }
        goto success;
      }
    else
      {
        # Only complain if we were attempting to locate 
        # the value
        if($find_type eq "check")
          {
            return("");
          }
        ::add_output("Cannot yet obtain $represents as $page_cat\n");
      }
    return("");
    
    # Once more we can use goto to make sure that we always 
    # do the right mapping at the end
success:
    return(rel_path($abs_name,$from_dir)) if($from_dir);
    return($abs_name);
  }

sub set_pruned ($)
  {
    $pruned_dirs{Path::cannonicalise($_[0])} = 1;
  }

sub flush_wflio ()
  {
    # OK lets get the list of files we need to generate
    my(@pages_to_go);
    @pages_to_go = @pages_pending;
    @pages_pending = ();
    return(@pages_to_go);
  }

sub rel_path ($$$$)
  {
    my($target,$from_dir,$no_dot,$result) = @_;
    my(@target,@from);
    
    # simplest path from this dir to that target file
    @target = split(/\/+/,Path::cannonicalise($target,"empty"));
    @from = split(/\/+/,Path::cannonicalise($from_dir,"empty"));
    while($target[0] && $from[0] && ($target[0] eq $from[0]))
      {
        shift(@target);
        shift(@from);
      }
      
    $result = join('/',@from);
    $result =~ s#[^/]+#\.\.#g;
    $result = "." if(!$result && !$no_dot);
    $result .= "/" if($result);
    $result .= join('/',@target);
    
    return($result);
  }

sub is_one_of_ours ($)
  {
    my($f) = @_;
    return($f =~ /$genname_pat/i);
  }

sub icon_name ($$;$)
  {
    # There are two options, either create icons in every directory
    # or have a central place where icons are to be found.  The 
    # current preference is icons on every directory
    my($icon_name,$dir,$create) = @_;
    my(%icon,$genname,$v);
    
    if(!$icons{$icon_name})
      {
        ::add_output("Unknown icon $icon_name\n");
        return("");
      }

    %icon = %{$icons{$icon_name}};
    if(!$icon{genname})
      {
        my($orig_name,$ext);
        $orig_name = $icon{file};
        if($orig_name =~ m#\.(gif|png|jpg|jpeg|bmp)$#i)
          {
            $ext = $1;
            $icon{genname} = sprintf($genname_iformat,$icon{index},$ext);
          }
        else
          {
            ::add_output("Icons should be gif or similar ($orig_name)\n");
            $icon{genname} = sprintf($genname_iformat,$icon{index},$ext);
          }
        $icons{$icon_name} = \%icon;
      }
    $genname = $icon{genname};
    if(-f "$dir/$genname")
      {
        # Already placed one here, just give name
        return($genname);
      }
    if(!$create)
      {
        return("");
      }
    # We don't have one here, generate one from the uue data
    FileCounts::inc($::flag_name."_icon");
    $v = Uue::decode("$dir/$genname",$icon{uue});
    if($v == 1)
      {
        ::add_output("Badly formed uue data for $icon_name (missing end?)\n");
      }
    elsif($v == 2)
      {
        ::add_output("Badly formed uue data for $icon_name (missing final line?)\n");
      }
    ::set_hidden("$dir/$genname") if($::hide_wfolio);
    return($genname);
  }

# Some built in icons inserted as UUEncoded files in the script
# These will be inserted into the target directories
# as they are required

sub all_icons_gif ()
  {
    return <<'EndGIFS';
begin 644 backup.gif
M1TE&.#EA+``Z`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M____________________________________________________________
M_____________________R'Y!`D(`-<`+``````L`#H```C^`*\)'$A0G4``
M"!$>3,B0(3E!B,H)(H?H(0""&!%"I/B0XT2(&RM.K"C28[F*%S%>`V!EAI5#
M$R4&0B2HW,.*Y&S6W/AQ9D>1*5<BM$(4G!60%`7!Y$F3Y,^02#>F9&GEBA6C
M,H[:1(2N:RM9Z+ZV\AH6W:RN9=&BJUAN($N&5[Y9H?DP[=BNV0`PV[L7@%FR
MK5BUDA@4`#B&1JU(I/@U;5AF5(E"OAMX%JNS%`M;:=C2RL-R92V?10?9J%'(
M8<'>#6N1X&'$5K[1/+3Z;CJ^N`&D(^N58EN"1!L:_6B6E=>&R/V&9O4QXV:&
M<F]ZO8P.P.*(-266`]!JM'&(O]W^!C=<=6Y=WJV2)T0[]FQS@E01RQA)7:S:
ML?AE!4Y]U[?*E@D1I94@TWFEGRR"J=:5992A\QYPX[$DVT.TU:<?>NRA=18K
M)`5UD(`(#2?2?6195MQ9^`D6UF(>KF050E=DM1,Y&XYU88:K+=B5+".U&-E5
M1)%$8'=IH4BBB67-Z".(X,C8$5K&L3:11S!U-!(YOBWIDF%6G0221$XU51--
M)]WT$9F"+"E@5DW&Y->-J^W6H'=G`9"3FE5]`XY1-/FUGXGI,907>T8"T*=S
M+B4FXW;MA46=7GQ9@5J.Z&0S48O7K`E.7%HIEV%US)@F*7?%[6<=(IA*:)5<
MGJ%:%I'_Z*0#:6X9UDF82I%M*@,X-7EZG'KKL6<H.:FVU&11A%56%@`C::=4
MKZ.-Q>QV*F5*E%56R'"2GQHV)-*SW)IE79HJJ0/DL8H)D@V)#98%)SHWMO:?
M#'')-4,YVYUHW+MV88A2M4!^8Q4XR?:K[%]_48=PKP#ONN8U^1KXZL3X4;P6
MN2H)3)1+1Q';J&.[H15RR+%V92>F*PD8VU&NII47L.IM6RU+>]([X4<P7?>3
M1#DW^^RMN&:;F%9HECFFL]J)Y"Q'*`.@,5&R:8?0RP!0W=#+5)/9M,HN@4MB
MR1_S5MRX6W=FE-2478A0;J2*S6S3K`K=X\2/A;@9:BA>.(MU_DUC*S`X2?DU
MVE_,J*Q7VX[Q/?/&1,V'KW*U\;7VI#B^O;C*4:<96G4P"ZZPXO]UMO+<PIZ4
MM'815VPHRBN#([!LO5+&BM7(V8?6M-5N^HW=O.8;=L7NUO87V2IE%6"3F2EL
MH(T-YG<7\1A%R-(5%LE9H*/%?2WMO]&_-E2K;8]F9+1ZZR@KP_#)U=`WA`'6
M5<BMI",\\.,B8M!`&GO;JV/]DD@RYS&)WG,"=)W.&=!+Q!+/`*GB,R%QQ(&S
MV8F0"JC`*\!H5W3YR&<T.*./+$:#2A.$`@\CH)\\\(1A0N$#>583M_PH2!M$
=VDYD2,,9HL^%#)FA>G!E0)15ZX=`!0PB1@("`#L`
`
end
begin 644 dir.gif
M1TE&.#EA,``P`-7_`/___SDI(=9[0KUK.6-*.<9S.=9[.91S6KUS.=Z$0LY[
M.;5K,;V4<^>UC-ZMA+6,:__&E*V$8]:$0L9[.>>,0JUK,7-:0DHY*4(Q(2$8
M$/_.G'MC2J6$8_?&E%)",<ZE>^^]C,:<<YQ[6N>UA"DA&-ZUA+64:__.E-:M
M>VM:0HQS4H1K2F-2.3$I&!@8$!`0"```````````````````````````````
M`````````````````````````````````"'Y!`$`````+``````P`#``0`;_
M0(!P2"S"CLBD$EEL$I&5Z$!:&2`J""L"49A,N@*%0"`IEQ/H!$5-:;>5KPRI
M%0A<+AX/*Y7:;%8'!R(<'`\F#"$?'PZ,)0T-("`=DAT0'1H0&DEQ)"1U=WD$
M+!86?X&#A8>)BXV/DI$=E1H=)YI(G)YV>!ZBI"N`@H2&B(J,#HX@#9.4EQ"U
MFW*YH+Q[I<"HPZO&R,JPL9B71T)+"P/E"UM:!0A>!0(39`IF"1)I;!1+XS!Q
M<DO^_P"7:*AU`EJG3[M85#,5+!6Q#RA:07H5ZQ)!:'(0YE&8PMHI8:H413P&
MJ1LS3`,-2DLXRL\UD`]'<EL6*Y-%<?J03.OEL6$V_Y&MDM%,XF1(P*-(F1@Y
M0H4*@G)9N'#Y`@^>/`-FZJ59<^\-#`#_FEK1,K6+EWA9[:'Q^L^%BX,!,.P2
ME2*IDHG,*@ZT=<0M7#NA"/3YH\*GJD0.(CK">S)3P5MO<P'FQ<=:86PABY'$
M6]'2WB1^)<_EX[+P`9@A$"MV%8F9Y\=](]>93$!P:<,,&"ABM;BU:Y2@97\*
MU;'G:8>I%ZUF7/.URMFC!Z^XC'JW1-]Z:=D">^3O7-N$`Z%6O1E[I4I*F]A=
MKZ2H>^[L_[U?ZH_LN@)=%%@58(",5C0`T0=#!0M48>``9&V!GQ=5C4&&`&IM
MY0913$T1Q8%5;*'A?57!(_^!&&=$N,:(;"E!Q10(1J7@5`U.(`96]-C#U8C^
MO!"0ABN"`4\88T@`H58`/7-+-`'$%Y\EGF&T4BBC6!9,!#]!=,P(K.5UPDU#
M9J0+DZ2$A]E#BY306U[G"7D$/TM2UN5TN*T2YI@5T5(37S"XE0%T<[7D)4RZ
M%2,F:Y/$F202+F2@Y30L@/<2<HDHQ@V9LL"VCZ%I*K0F=<A9]^=$<7Z3R7-;
M4G,I;GV^"6AGM'PZ)%P[%;=GIG["V:EV2FJD1Y,,?;F*HZ?&<B669QJ*YT8+
M_4*JIK+&.0N=:-I*EY.Z(MMK12>H&EL&=(3Z[*O#E'I,LM1:.^FA"1&PYD>,
M2KDMJ3<U11K<G;96`VUUL4[[C9#PP5`IKFQ^Z>VZ9$KJ!$"W11MK@/.Y9V3"
%0P0!`#L`
`
end
begin 644 dontknow.gif
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
KNP];:S&3OAX\Z,:0NIKQIR!S3*"\U)9\;+T"%ZHR0^_>&_'+,--,4$``.P``
`
end
begin 644 down.gif
M1TE&.#EA)``N`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P``````````````````````````````````````````````````````````
M`````````````````````"'Y!`D(`-<`+``````D`"X```C^`*\)'$CP&C-I
M!Z4A5+B06<&'$`LVG,CL(#,`$3,6K%B1HL*+&D,:;&B18T6,(C.:]'@RI4J3
M,#FB=/DPILV9-`G:C(DSI\"=%8VU]*F3F="@/(GJ/&I3:$^?1Z,B-?HTYU2I
M1D$J%2BT:U:OQJK2!/OUJUB77=.JU9K1F+&V;LN"%>N6*["W#]WJW;OWJ5M@
M`_7>+<BWL-N>Q@8#0,F7H.'"C/=>6TSPKN7'A>\F%AQV,6+.FD-CWMR9\L/+
MHTEOUNSY+&K1FO^";JV1M&C0G!-[%@GLLF_0EW>GM+TZ,6KCIE/V[FW<]G+F
MR5TRG_Z\.+"S&I_[UGX=>W;NW*-4^P0?WGM(8+K(=]\Z4'OZ]^O97T/?._US
M\5OITW^/7ZDN^/_%)Y]`_Q6(GB[];55@@<(-2.""")KGTX(-.OB@+K0D.""&
1$5KX$"T=>OBAAA9*2%!``#L`
`
end
begin 644 empty.gif
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
DB=X#A3*IXTW0(Z21W`53LK\-YF0L%O3@228CPJ_DX2L!`0`[
`
end
begin 644 folio.gif
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
(/$R"TA<0`#L`
`
end
begin 644 fpage.gif
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
,LXD#69<]"DHD(``[
`
end
begin 644 ignore.gif
M1TE&.#EA,``P`,3_`/____\``/X0$/T@(/PP,/H_/_E/3_A?7_=O;_9_?_6/
MC_2?G_.OK_&^OO#.SN_>WN[N[@``````````````````````````````````
M`````````````````````````"'Y!`$`````+``````P`#``0`7_("".)!F<
M:*JF9>N.)P"M=+V*<1O;?-\#NP`P54`\()`#"CE#'2&"DP')8%H-I^9PZ.MZ
MM2X4UUOCOL[;)CD&1J?7\%QN>SI8D8[`W1H0-/8,>GL)64%C`@4%!&L#B5$^
M;69Q9&9N,&PRF1":G)MBEFY9G:.;GG.@)7*32UN6JJLVIJE"8[!?=$*VDUI!
M"$@-"`:/2T@I#D@#=4@+3'W->H8G"GL0BUG%*`1/5@X"SRJ\N;IP8&+C76IA
M0>?KJ)*KE>XZ\/)HL/4OK[>G]:+WK>[8G)/!+Y^>6N-D&23([D:D(:8:UE!8
M2"*D(&HLVL"EYL`?"`\4)&-`LF3)$P(2@AR#`.R$29((S(EK4@4"@@(+2!)`
MP),)SYC36!HX\,0.$@3,0$:#UB?!'4+$,GXK0(4)@Y4-EC9Y4B!`TIC7,B95
M(,#/49\\DVE%&13)`R5151182279-Q88-?[(JW=CN[XTXBT!W&Z>.(OI[%4<
6^`F43%B)^RU>$P\?#EN6,VL&$`(`.P``
`
end
begin 644 index.gif
M1TE&.#EA*P`@`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P`2`0`-`0<!``$``0+__P`"`````#_P`````````````````````#_P````
M`$$01P```$$L)M\`$WT`!"'Y!`D(`-<`+``````K`"````C^`*\)'$BPH,&#
M`HT!,X90(*V'NG31TM70(+"%&!4R!,"QH<2/$4,"BWBQ),:,"XUQ[%AQXL20
MND::G(E28;QX*RL.?`DS9LR9&FNN!*"3($^?-!5>#&I,)<NB`WLBI5G3*5&H
M!47^!%H36+NG6`F*3%I28].F81%.Y<KTK#%F:;-2[>K6;5RQ7#/6/<NL*=R[
M<]NZ[>OW+<.X94\*YEN8F6/$9/<6-MRW\E^L2S.;W5OYK>//EZ$F;IIR,&7+
MH!^+SER:\VG0TAS'#MVP;>O&KV'+IGU0L^O<J7<S^ZI3*(!XIE%_CLV<F32P
M"/5VY$@9^.[8-T6;?7K<>G/FT*-%9X3.4?ERY\^O0M487B"`X,[CY\3*7OW!
M]^?1MZ^X$*?.X[K-%Y9"Q!55'GCV86:,?U@!*&!:7MWU8%HJW>6>A1=B6%!`
"`#L`
`
end
begin 644 left.gif
M1TE&.#EA+@`D`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P``````````````````````````````````````````````````````````
M`````````````````````"'Y!`D(`-<`+``````N`"0```C^`*\)'$BPH$&#
MP`XJ7,APH;&'#2-*1`@1`(")&!D^!&;,8L:/%#E:O`BR),>''4F6S&B,X\F1
M*S.ZW)@R)L:6.%^JM,D0V$R4'GGVG'E2Y$ZA!'VV)(JRZ4-FQIA)G4J5F31F
M#7UJ57K2:=2O4,-6M6KUJ$!=NK9R_>DU;-2Q9,D>19L66-VM.7&B="OU[=2K
M9*6II)OV[EJ]7I_Z'7M5VM6+M`C3M:LV;]>]8!=+;5PV<F2TE-5J1=P4*EBX
MG!U?M"BY<&6F3ODN!AQ8Y4C7>+DFQ@PWL-R"MT/GSLO[=%7`J@]:%+UT-V^Q
MQS>;';C\-6G%?%'_;@A`=]'$V7LZ/Y[8'7;*D>C3JP\ZT3M0I!+9=H0?/^]T
D^@>[WL=/\>%^_@2]!V!$(@THD7\&1E13@AK]QZ!`#A84$``[
`
end
begin 644 mp3.gif
M1TE&.#EA,``P`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P``````````````````````````````````````````````````````````
M`````````````````````"'Y!`D(`-<`+``````P`#````C^`*\)'$BPH,&#
M"!,J7,BPH<.'"<]YTP9`FS=PY2!J+)C.&X"/`*JL`#ENH\9T%#^JTE:M&K5J
M?P!X2V?2H<>/5:I5>5D-4,^*-&LJ'`<2@,^<U50A_>A-J$)M(C\"F@IHQ8J<
MJJX"..?T8#D`2G%.;2FR:A55`+AU->@M9Q6<57SJ;/GG3S6*7-<.U&;W+8`5
M+,F25:430$:]`HU6*PKUZ@K"*UH",HSXVCG%5?PB_7,U,UW*B+\"4C45IV2Y
M=@L?7GN.XHH_HS]J(WQ6,ED`0;M^!;"M8N:4;EOV;*E-[=K=W\KUQ@H<@.VP
M>9U^W2:N7+E`VF;#+`I(9!6*JX7^?O5FO7R@;"%5K2PJ.WS-K^'*RR_WC7U1
M<+G%`X@_WWH@;FFE)%-)>I63377]E2,.>DU51I"!Y"183C@?@>/@@P`@V!^%
MH%UXS6[\S6<%4!X*M%MO(5H'X$PE?@A`-M^$0Q$WY:W8HHO9@!-.;Q]QL^!^
M-WZE#3CBW`22-MV8$R1OX13)W@KDH).?@].%$XZ1'ZU0CCI+;F,EEA4%PF6+
MX#`93IF,B3-E9>D`F&,XWZ`'4C=2CNEA2MWLR)X5-PY$%`#?""C;FB4*>B1-
M=I)IWT?NM9C.HAWVB5)1XP!H89\"30I24^DT6J*FLF%J$)HDB5J0H`V:.E`X
:@%6D:D$2Z@0"CC;1O3K0.4K:2E"BM@8$`#L`
`
end
begin 644 notype.gif
M1TE&.#EA.0`Y`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_PX`!`T`(@`=`7___X```(```'___P`"``0"``3_`"(`#@$`#?__````?P``
M@/__@```?P``````!`X`!"'Y!`D(`-<`+``````Y`#D```C^`*\)'$BPH$%:
M"!,J7&BPH<.'$!=*G$@+HL6+`BEJI(BQX\"-(#EZC!BRY,21#3=Z5(GRHTB!
MZJ[%G"FSYDR-+:^]G#FHI\^?0'N^[#A1W:`O0+,I7<JTJ=*C)XE*#.I4*3T`
M6+,"N$HOV[V>.AE>G#BH:C:L\[)^2;06:9E!B5K%!9!MT-"4$IFFG<>77MM!
M;]\B_1M7;JMY+/$N5#K/';T:@@$?97M4LF"V;`V'=)@W6X($-;ZXM5RY3(T+
M-2*DWJ%:]9=6)14G+/OY,^4OJ5?G5GTZ=UH`\R*052?QH,*R\VH/'G05.%_5
MJ%&WKH$U$6*)[)`6)SC5LW*V9=C^T9M';]"\W:LCL.O[96*BNH.(B\UX7&EM
MR4C912#_9:MJO@"ZT]9$K7PQSU?T)<3=<??4!IEE[-1`7B)8C==898,1F(AY
M=<4TWT)&>??9<OT!YQ=YD96(%5EK[8=@@@C!6-$@#=:&V5I;T5/>8&^1M\^*
M$IWW'WPQA:5@<;0IAZ%_]%QF'CVKK++#1-G\-D\V68#E$D=]#`)`;2-BAI6$
M;7W!U1=32O3%4O<069!*2'T)YFU7)<#79/3XPTZ:"XEV)7R<X=23G/>]%0$]
MGP$W6#:PW#/1#OUQ2!)'(1+ZF6I8U3:/9%`6A=91``SR$$LT9EJ;J9^E=509
M]$R43BO_60#WUGOQR5:<464Y9:F=[+PU418O`(OF47+59>M\@W1Y3YME62KA
M/.U)!.RT-5P%V&$=OHF33#TA!=998"8PWJ/S!+L5`+&PLN%KH1IW5T'@@BF<
MFCMD01X`D*Z22%S\LE/KEE$Y%&]M$\6RIS]HYL@.OX;1NN"[`S4+YD17K;*/
M*MD!L,I52"'22BL>T_5O8@6%./%49:0%92PK8_4QPW.]2#*\A+HWF'5]`0<`
M80VW(K)\$%^39`)4^H5?7Y>]QC``"[?BKY$Q*M10-MH0+)&$V1B=(GYR-4</
MR'+Y*]9\W&83P6<3G>K7;3=:Z+)<IQ16UX<*$D1C#41+Y*`[_E7B9QY?6<_S
M<F'\MBHUP!5%;/9$JB'ZV7A^H14X/7&M=<[''L]%]G9"VZ4WF*F)!WASR[UL
M6,.<R_BP0O+B?6F5O4[6EEQPF4X7V3(FGG:XG_56Y6@W*]WU4JDC#G5"KE_*
MFH-9_Q58[6DI]57QB$_T!3MF)X^>._[(?E2>=%']E>>XKXYD3U2WUCMJ?0OF
M3U?28RD4]=JFWE,62JUVJ38[KQ?^4UH*V*0.-Q!<T4@;TSF+/YJ2)5'E+G$8
M>=?]O)(:;;`)/@Y\($JV93?T,65\]2M?!#D8L4'@#U#F(V!+0&(0GZ10A",Q
=B0Q5F)/JS5"`-737#6&80QW*L(<K!31)#@,"`#L`
`
end
begin 644 original.gif
M1TE&.#EA2``H`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P``````````````````````````````````````````````````````````
M`````````````````````"'Y!`$``-<`+`````!(`"@`0`C_`*\)'(AN&X"#
M"`,-7,BPH<.'$",R3$"Q(L49"5K,V#@CAQ<O9,@D0G30"D(KVDIV*VD20+>6
M`&#*_';06\MM+;/)O&:Q8HL'"3AN]`B23)E'X<"56UJ.7-.EWO2,6QJ.W#AS
MYPYJD\'-"KAQX^0`FH-'3YX\VDA)[$FQ15"A';N`1)3H$3AOWZQLTZ9MV[85
M?`-O&R<ND)Y2"`%D6\SXR5DG?>4X6<LV(]R.'T,B(@G@&L)KW@Y>(R?:,X!R
MICM__ISNH#F)`Q/+GCW[$>S;N"FS;:%1*%&C91!UZQ(HG#AP,L"%"S?.::!R
M4X_'D'%PVY,J5?)4`00H4"E2HSJ1_QI/_OMX5@,KO^T]-#/=1^.,!R)'+E!S
MP]^J/'FRJIPYK.9HI8(3C"U&PEF=Y-')*&I%I-X,[&TDUUQ')=6--]ITP\T*
M5ACG(5CB,$4:``,ZD0=W!&;#%PDD@'/;@Y?]5M<C3-5HXXTXXIA.;@ZI0Q-M
MK_$HY)`+]83`D0BP<!`+3+*061EU$2FE;A;]%&-F(G$6H&O<N!:.:UN&LR4`
M8Y99SD%7U;1E-F7RQ!90ETU(!EV(=&&%##%T$^(YYC0ECE70=7-`-TK5!,AX
MJR0Z2AYSY"&''%4DNHJ#E4$(UV]0PO?G<^,\]U\Y?CU1CG?EH-/<0=UL4Z"*
M!%:!AX(JH/]':4]P7H8E72S@99PXS`5BQ1.`60=(8;R*<]!B6I&0#0#:C+*H
ML^!1:1%&<,F9J5,B6G'%7MS@Y=4W5=''RD$D.*%"@2P.N)@VI<#V8(1Q%567
M?$[1)TZG]8W:J7^?'JN-"MF=-8<32+!(@CHOOOE`G$]N5AU"JE:7$@!^:670
MPQA3;-`VN55ZD6^9)4(&PE.6#-N7M)FL,FPPT3:;."O'S%,`+KN<33=DV"9S
MR97!N3!',HY4\]!$%YUR93_!^]N<G*4&FF@C"G00:JN)QIIKIKFHE=-NLK51
MA$L+;?389,LV3M<]P8L92)D^9V^(SHUJ7XA,R;`2`$]P=Z@JW)'_TDF"XI&B
M=RGJD%QDI5?*BU2'3?UW#CE6P%W.G_F*T\5!VQVZRC.K.(J'6&<U*VU;,_P,
M]).//&+??/SVN=3-5;#"BCGDT+ZE-M[D#DX5W#BA1S=R</.$'`"@,WH""ROM
MWE%?W3M.*>2(PVLXW^1'.7U-';2"BJN2\.A9#'9S_%N7NC?2-\J!!58@@0!2
MA3?=[-<4ZV<J1D(5YZJHV%D*+M@@1$BSC%!H8+Y$?$,;*]C&A;K!P&]X8R]_
M<4XXEN(O;13H7W\`3X(4-#XKP65YCS"'.+KQC<GI)3!]2=4WNK$"<K"B-0A9
ME38.]`3&.*%=LZ(5^3B"I;JL#BS>X`8WAK:1EZ1(#QSW8@JYG."$O5A0,2MB
M4<(J`A2US8"`(!$94I("#N4D93G&:<Z^:E>J8PWH1*$CP1/X@@0<'N\!&C'=
M#*[00\Z4[8X`,%P.?6(ID,FK:9\)36>B9AJJ6>V0G8%AD-SEL?(594YX'%LV
:A`0C6Q4E=3M3&3HP4A%J@6Q.>LPDD0("`#L`
`
end
begin 644 panorama.gif
M1TE&.#EA6@`I`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P``````````````````````````````````````````````````````````
M`````````````````````"'Y!`D(`-<`+`````!:`"D```C^`*\)'$BP($%U
ML]2EFV7%"KB&$!M^BTBQHL6&#RL:W,BQXT&%LUJERQ@QG;I6"=4A5)DPI<IK
MZJZ97)BNYBR:"V&^C!GSFD6/0`<B3%>QE<*3+4V"5,ETW+B%0U?>7#D3)]-9
M,`7RU)I58U"M%%>JI!DRH=&A*4T>^L:-VPJE3*^:O%F6;,VE9Z.27>E3HA6.
M$*'&%7O4)LVK6JNLV+8MAC=SX%:B,Q>H7#E95=,9G7O7[LFH(C4;7@EQ8$.;
M/'DFG$E7L,G)7,9Z6^'-F[9N;;W).`>[FY4JX@*9V[LW*4B[=F>A"RFKU:.8
M?ZVP3$U5:F&0X=1Q"4?NM\H8N,/^;=.FS;&W;URZ.PX7#EQLI2X'3YW)DC--
MD:V:SV*EKN%.F'"E=51+*GFS2C?BA!,#.NJ8,XXWW73SS6*,51%.%>.`L\(W
MWE3A#3CHT#?8B-/]UQ-"R[6"#DI$-925:E=-)^(AYX%3Q3?AE-,@-]IHV$T@
MX'C#C3C``:=-6XUY,XXLZB`2E7(,'C9?5&,Q!9-R(046$8E,P:<2-Q'&L$TX
MWJC#)#G;@-/-;2MH4\43,;15!6/;K(#;<.ED9])PXESA6HQPQ80<1BW69&A&
M@*YVE#I5=%,%-ZN08Q*"7(!9A9O:;./H-F"JL!AY*FC*'H[EI'.>%=^4\PU4
MZ2`RUU+_ASGDD*&%9E:3?URJ0TXWBW$#SH6&[@JF-BLLI@(WGGHZGC;9D,>-
MAQMN\XVFW=2YC3GE!/(-.-]4N6A_M-)Z6KB&6G%7E^2,(XZ-3W`SGI@KO+D"
MLN,M6RR=H#;+[+$J1`BFG=U`R*LWV\PVI'0*<1,(-^B82VZMM"J4#GH76A&P
M.'J$HP>'SQ+KA+_C`/*$%<N"ND*H*F2ZC;Z9@LEKN[GYBR28M?D&D9#<.$SN
MN`^#0V<,>>#FS1,U5P$%I\@^X6%ME[JI::;DU9DRJ,A6/6_)F7KS6VTX1XAT
M.-],%*[$/.\L=;&-SEOLO-VH\"AYVC#-:\MPTSE>-\UJ:B?-_A'"39[,<,(<
M\&R<:J-SN&4CGNG)U?:Z)J\4GKR-$YRVN\VQVCQ!+)A/1-CFXI'CZ_>S$0KI
M:(2X13C1X>*R+FZ]4+OKU@I.G*Q-J"K;#374E]>+N;O)<G[CHVZY'.=BR+O%
M6+'=@/,PQ!*72UZSP%<!`[)^9Y.RZ'7[77+3?M^NM=),5Z%'%8HIQJNU=A^0
M\_.)BXOVHU3P"'<VV2!=H8=SAL]R]^'+&OK`D0?T22YJ;T)?#!(D`SJM0&?1
M@QBY-)2S>2&I6?^#&\T>PL%QA$-=Z0)$(,A1CNZ(0UWMX5#DBM46"=T(55Z+
M5Q[,X:!PN.Y6-[R5.<ZAJ6^,`QWG_@CB.=+!"G0`D16\2<<Y6%&.2)6P%.:(
M5""<(@YQ`.(AXR`'.7;(BBXBT1Q:'`<7K$`P9GDO7N`81SER&+]R&=%00#3B
M&X'(FR(JI(A!W&$ZL#69=%@F6^JB3!.YZ$4D"O&0YZ!ANL3A%F;5B8TY)`HZ
MBL@*S?#&B%[$%@UWF,=$!G$5YF#%#IM(CD!4IHF6H>$2N[A$(4Z2E8C<H3D0
M09GVP`^"B#-B*RN9#B"V`H]!G.0>O;C'-ZY"B9.A)![+,9D@>I&.K10B*Q&1
MQTW.<HVW?!Y1*HE'B6$RE(GL924GN<M*TI".45SB*LI!0U`>DI.(C&<UK8G-
MB.$0?D2LUHD<0]E%>$YR.$CD9C&7:(Y)OA*<UHQF(M$IST[2<I:;A"3\OBA*
M1+"3EN6P:"A#-)SAJ,.02]PC)U^IRU":5)4$1>D[$\E%&K(SH^:0Z,.L`%%-
M/K22/;F(3G?*4XH(<9,L=6E,L]FS4/9$(#_YBE*7:I&7NE2FMHH.199*U:IV
MQ")$W=E?K,K5K@(%E^5BHU?'2E:"0!5Q94VK5\\J+K6ZM:IL+==;Y_J5N-Z*
KKGB]ZBWCM]6\^M4T,^UK8.[ZU\*RSD4;B4AA#8O#OGK$L8NE:VD,$A``.P``
`
end
begin 644 parent.gif
M1TE&.#EA(``K`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P``````````````````````````````````````````````````````````
M`````````````````````"'Y!`D(`-<`+``````@`"L```C^`*_1ND:PH,&#
M"!,6I,50H<.'!&GID@BQXL&)NC!:M(@Q8\:-$"5Z]`C2X<B3P$HF/*D+6,N6
M*@UZ=$D3F$V;,:]EI-GRIL^8.WOZM&F,:,F70Y/^Y*CT9M&BP)ZFA)@4:E2?
M4J4Z;`HU*]&K60\J[0HVJK&L3Y\6='JU+-FSQ@#(G4N7X%BW<.GJ1?C5ZUFS
M>0%4;.L6,-RX%ON"/<P8,42_C9G!E2R8ZF+#C<\RJZP0+>;#DHV%?D@T+0#0
MJ"5OWOHWKMS,JC6+9AUU+D'1N'$S4TVY<VW;UQC''F[,MVO.UXCO%KV[><+?
MR(-K'MZ\>?3@P`\NK\[=N<'?G:E.=_=^^]IU@\RY2VN^GME!N1"KMV=?W>!Y
M[=W;KV\?4_WN_?^Y5Q)]S``(X'T/R5?@@M+4-:"!!3:8G4KT20A?3@0QZ""&
+!6TV(8?V0100`#L`
`
end
begin 644 picture.gif
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
`
end
begin 644 right.gif
M1TE&.#EA+@`D`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P``````````````````````````````````````````````````````````
M`````````````````````"'Y!`D(`-<`+``````N`"0```C^`*\)'$BPX#5C
M!A,J7,BP(#!CP!I*G*C0F$6*&#$^1)BQXT*+$#V*-`@RXLB3$"V:/.E1I4J6
M(DNFA)DQY4-@-VE.!.D2Y\J)S((*'<K,6%&C2&7>A.B3(C-I3XD6#9J4)\^;
M6('I^ID0:E"O0XU.M=J3J4^<6W7I4A@5K%"Q28^ZM)D5K5:M!J'JE8I4KM6E
M=>VJ'4QP[U>^8\GV/"MX,"VU`MM*?7O4;]G`=P?K>DSKFK2];N$FOKJ8<5K-
M`%(#B#J9ZEC+-NF>3:LZM<#/DHG"5;P1,^W:!%E/CJN8J6R?M0'DS4UYZNBY
M@9.S;>VZ>.RZP!DFW\X=P%^SJG4V5J0+,;SXBKV-93^?L.=Z]@5=2H??WN)\
@^O$?OL=/T+YY_@XA]!^`_5TS(($"<60;@@DI)UY``#L`
`
end
begin 644 text.gif
M1TE&.#EA1``S`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P````````````$`&O___P``!/___P```````````````````-',(,'>9]',
M(,'>9P```````````/___B'Y!`D(`-8`+`````!$`#,```C^`*T)'$BPH,&"
M`!(F/*@0P,&'$"-*'-CPFD6+"P4FO'BMX<2/("D"X$BRH\.1)3N:#,E29$6%
M*3&BC-FP9DN"-1/^V_E/X3^2,"_.-%FRHDR;'X=>X\ET9\V42DT:C2D4I-*F
M/*,6I2I4*T>'$S>2Q+KS:%",7Z>:/;LR(ELG5.94D5,EJUB:5-6F'>GQX5FX
M3N;FR=-T[=>]2I\650CQ[K7`@?$\R5/7J6.@--FNW<C8+TIU>*ITRB,GSQP\
M<GLN/BP4JF:@&1G.G$/E294GH:L,+JN8=5>].6%VEOT3]!R%I@=7(<K5ZV_G
M1ST#^$=Y<,)GNJLL1^QX:._G4?O^(M3Y3W>R9P"2(7K$7BITYWH-B\>Y<2>B
M+F38LU__D[MO][!=AIAL(^V$'R+K/9+@3_&UYMIEP?$U''TS`8"??@"PIQI7
M:''X6H!@C5=A?@EF^`AX;'F7$W=GS2?215T`0$:"^C$(78=Y"=A5=`;IZ!Z$
MFJDHX'=[R;;9@_!EIF-P4AG97)`0[@7B>[&YM!F4/FH57X025FG-AR!RJ-*3
M/@Y(X91#`L<BFHMY*1R81&*6XY(O3?AEF5L&B5B;\-GYYHIAXH5D8DRZ6*9A
M6_U'YXU-TH=BFEOR22B@/+XXYIQBW@CF48U:*JF0>J*XYH-G_JCEH9<^."AG
MPVUJ5IM\<G(:Z)PA_LGDK+'ZQV*=L;F*:'.9^NJ>E;M^FBNECX)H98.O`DNK
M5[S62N5KWU48)[.5BA7AJHIUR>6GVO;*Z&]*$M7GN)TN^A27[+)KZJE@M2LO
JH.O.:^]"]_JZ+9GYWIGOOP#;ZV_`!!?LD<$(&SQPP@P+W/##\UH3$``[
`
end
begin 644 tools.gif
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
=:,@\EG&6C22C+'%YMK[MDI<%&20PJS1,@00$`#L`
`
end
begin 644 unknown.gif
M1TE&.#EA+``M`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_S(``0```P4`!0````!FS`````4``@``````````,@4`!0````!FS```9%-)
M3```,&QI9FQI9@``)&H,L"'Y!`D(`-<`+``````L`"T```C^`*\)'$BP(("#
M"!,F+,BPH<-K"B-*//BPXL")!YEIU(C1HD.)&T.*E.C18$*1*%,J+"GP9,J7
M*!=Z=(E2VS:;[&[>U*9B)$*+"%]NRZFMJ$Z>-FWZ!/"09DBC-E5`38KSYD:9
M)C.BW#F4*]&N4Z_^S`I@:U*N2:4>55N4X]B+044.A:KVJU&[V[:)I0BW;$V=
M1*E.W5F4Z-Z^?I_>E$K5ZL:T9]NZY1M7Y%2VVBS?W<8VY-C*(8\>S6R6\$[/
M%)T^+@K5L6*[25$KA*F9]-/6@9>"IOT2<N.8LWGW1KLXMFZMPBT#SBM8I>KD
MS);CA`KSN?"TQ"6_M$Z[*NOFM+F0PVR,U'5X\2F+LCTM/")T9HWM)G<//?)1
MZ/23?]^//__[_Y,QM1N`_3$%T8`$GD<9@G_95)Q>O&&%GD9=S65<=6\=B!Q,
MIE$5888:)M8;;N8!QU=6O!7W&X8&-L2@1JP]:)N)0#%(WH6RM5A1<*$-IEV`
@.M8XX7%!SN3?=A&QQ!!&.:ZDY$<83?1D25&>6%)``#L`
`
end
begin 644 up.gif
M1TE&.#EA)``N`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P``````````````````````````````````````````````````````````
M`````````````````````"'Y!`D(`-<`+``````D`"X```C^`*\)'$BPH,&#
M"!,BU*6PH<-KNF@!>$C1H*Z+$RM6O(A1XT:.`#)Z5'@1F"Z3(D<NY(@QI4J"
M)V,"0_GRH,R2)UV^G,FS)S"=*GT*K4E0J$^@&HT.)3K3F$^G3G_6?&K4Z4Y@
M4;,VQ<HS*%2N7\'.1)IPZ]>S8*U6-(:V;52NP"B^92L6JEVZQL@.Q,KV;E^\
M9Z/JY9OVKV'#?(TE!'RX\6&P!QFS!>#8<,C#!1/G#7FY<E_.G.D29'L-=,;&
MS/JF3AE:\377G`NF3FV,=NW/!D,/#!E9M>_;2'F77CS[=O':>O5>*\Z\]FJB
MQJ/39J:\(;/9UYT[IPX]^W7LP(E-?A]/GGO-\NBK*T1?7GW"[]*NQR?O'B'[
M^=?K'X1??KY^@\S@%]^`W_TG6X`()NB?>`@22*!Y+S48H(,!&DB0@](,2*"%
*!)GFH7`)!00`.P``
`
end
begin 644 wave.gif
M1TE&.#EA,``P`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_P``````````````````````````````````````````````````````````
M`````````````````````"'Y!`D(`-<`+``````P`#````C^`*\)'$BPH,&#
M"!,J7,BPH<.'"<]YTP9`FS=PY2!J+)C.&X"/`*JL`#ENH\9T%#^JTE:M&K5J
M?P!X2V?2H<>/5:I5>5D-4,^*-&LJ'`<2@,^<U50A_>A-J$)M(C\"F@IHQ8J<
MJJX"..?T8#D`2G%.;2FR:A55`+AU->@M9Q6<57SJ;/GG3S6*7-<.U&;W+8`5
M+,F25:430$:]`HU6*PKUZ@K"*UH",HSXVCG%5?PB_7,U,UW*B+\"4C45IV2Y
M=@L?7GN.XHH_HS]J(WQ6,ED`0;M^!;"M8N:4;EOV;*E-[=K=W\KUQ@H<@.VP
M>9U^W2:N7+E`VF;#+`I(9!6*JX7^?O5FO7R@;"%5K2PJ.WS-K^'*RR_WC7U1
M<+G%`X@_WWH@;FFE)%-)>I63377]E2,.>DU51I"!Y"183C@?@>/@@P`@V!^%
MH%UXS6[\S6<%4!X*M%MO(5H'X$PE?@A`-M^$0Q$WY:W8HHO9@!-.;Q]QL^!^
M-WZE#3CBW`22-MV8$R1OX13)W@KDH).?@].%$XZ1'ZU0CCI+;F,EEA4%PF6+
MX#`93IF,B3-E9>D`F&,XWZ`'4C=2CNEA2MWLR)X5-PY$%`#?""C;FB4*>B1-
M=I)IWT?NM9C.HAWVB5)1XP!H89\"30I24^DT6J*FLF%J$)HDB5J0H`V:.E`X
:@%6D:D$2Z@0"CC;1O3K0.4K:2E"BM@8$`#L`
`
end
begin 644 web.gif
M1TE&.#EA-@`W`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_S(``0```P4`!0````!FS`````4``@``````````,@4`!0````!FS```9%-)
M3```,&QI9FQI9@``)&H-""'Y!`D(`-<`+``````V`#<```C^`*\)'$BPH,&#
M"!->`Z"PH<.'!@$PA$BQHD")&"56G&BQ8,:/&3>"'$F2),&0$$NJY-CP(T67
M'15JU)B2(<V8!S%>9"ESHDZ<'CG>['F2)\ZA0Q,F_7D4J=&<1IF*E+KP8=*%
M*[-2O1KQJ5:F(+NV?(J5:\^K9@=RA5F3*M:Q77V2C?LV(MRB+-/BW6E7:52>
M>LL6%8MPJ5>S*/D&];LX[DK":N<Z95P2:F/+D0N[=5LW<^'!FCNS!>T9<F>Q
M/V<>OLPZK5";KS$K)CRZM&#;N`_;#,2[=UZ:86>3OHA98F_?96%71@O8,DCD
M`%BQ<@F\]NGK98\',K[=N%2G6P')BP>@O3MO\L<O5[YN.'D@Z?!9:4>I_&;(
M]H/1OX\/O[=TE5"%%Y1^^_$G'V__)1>8@)F19YR!\#$W5V23V281A`>N-M9W
M%%*(X7'BG95858I]!"&!(6I6G5`-IL;?3.>Q1N%?)8[HG7XXRCCB7JJM=5YY
M-.ZTX'VU^3;?9SOZ!>!`/Y[WU80#?K=CC`J:9%62>+&H)&=10MFE0UP*&>:&
L0VX)5)9$.79F@&1)Z&53&G:X)IA2SCCG2T2*>6='U`6VIT,22.!G0@$!`#L`
`
end
begin 644 wfolio.gif
M1TE&.#EA,``P`+/_`,;&QL[.SM[>WN?GY^_O[\:]O?\A(?\8&/\0$/\("/\`
M`,#`P````````````````"'Y!`$```L`+``````P`#``0`3_<,E)ZPH`8\65
MSH`ECEMGGFBJ8E6IOG!LE@)AWWBN[[P^((J+;$@\!42!HK)S'%DP@&5*XY2X
MI%B64"`8>+_<[G=,+GO#9B\BH^"FW_`X.%&8`*)8J;8JN><Y>WQ.4%)W38(4
M&G\OAE5)BT6'?8^02QE"E7]X-3V=GIX#"1YMGZ6F-Z$%E)F%?:Q*DI.OC+$B
M;*]WB$Z&1%"ZNH1#5+^#>'FYQ'W&F9>(R[,<(;O/T(#2+=35T=>NVC"'J]XJ
M(=GB*%?F*U&<I^T]`@>;[O,[`P8=[/3Z`]&D^O\"%/A)!^-..8*7;A$T@6R!
EPH6!K"P4.,U<LUWH,OG2Q0O2L&16#1[V:@C2EJ&''R+RB0``.P``
`
end
begin 644 working.gif
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
"`#L`
`
end
EndGIFS
  }

{
# Simple closure to deal out unique indexes
# (if you don't know what a "closure" is you should 
# read "The Structure and Interpretation of Computer
# Programs" by Ableson and Sussman immediately)
  my($index);

sub next_index
  {
    return($index++);
  }
}  

sub define_icons ()
  {
    my($all_icon_images);
    my(@icon_names,$index,$image);
    
    @icon_names = &Document::list_categories("icon");

    for($index=0;$index<=$#icon_names;$index++)
      {
        my($name,%struct);
        $name = $icon_names[$index];
        $struct{"name"} = $name;
        $icons{$name} = \%struct;
      }
    $all_icon_images = all_icons_gif;
    foreach $image (split(/\nend\n/,$all_icon_images))
      {
        my(%t,$file_name,$base,$ext);

        $image .= "\nend\n";
        ($file_name) = $image =~ /^\s*begin\s*\d*\s*(\S+)/i;
        $base = $file_name;
        if($base =~ s/\.([^\.]+)$//)
          {
            $ext = $1;
          }
        if(!$icons{$base})
          {
            ::add_output("Builtin icon image $file_name not a named icon\n");
            next;
          }
        $icons{$base}->{"name"}=  $base;
        $icons{$base}->{"uue"} =  $image;
        $icons{$base}->{"ext"} =  $ext;
        $icons{$base}->{"file"} = $file_name;
        $icons{$base}->{"index"} = next_index;
        
        FileCounts::inc("icon");
      }
    foreach $image (@icon_names)
      {
        my($base,$ext);
        
        next if($icons{$image}->{"uue"});

        ::add_output("No icon image for $image\n");

        # The unknown icon is a gif of a question mark
        $base = "unknown"; $ext = "gif";
        $icons{$image}->{"name"} = $image;
        $icons{$image}->{"ext"} =  $ext;
        $icons{$image}->{"file"} = "$base.$ext";
        $icons{$base}->{"index"} = next_index;
        if($icons{"unknown"} && $icons{"unknown"}->{uue})
          {
            $icons{$image}->{"uue"} =  $icons{"unknown"}->{"uue"};
          }
        else
          {
            $icons{$image}->{"uue"} =  "begin 644 $base.$ext\n" . <<'EndIcon';
M1TE&.#EA+``M`/<`````````,P``9@``F0``S```_P`S```S,P`S9@`SF0`S
MS``S_P!F``!F,P!F9@!FF0!FS`!F_P"9``"9,P"99@"9F0"9S`"9_P#,``#,
M,P#,9@#,F0#,S`#,_P#_``#_,P#_9@#_F0#_S`#__S,``#,`,S,`9C,`F3,`
MS#,`_S,S`#,S,S,S9C,SF3,SS#,S_S-F`#-F,S-F9C-FF3-FS#-F_S.9`#.9
M,S.99C.9F3.9S#.9_S/,`#/,,S/,9C/,F3/,S#/,_S/_`#/_,S/_9C/_F3/_
MS#/__V8``&8`,V8`9F8`F68`S&8`_V8S`&8S,V8S9F8SF68SS&8S_V9F`&9F
M,V9F9F9FF69FS&9F_V:9`&:9,V:99F:9F6:9S&:9_V;,`&;,,V;,9F;,F6;,
MS&;,_V;_`&;_,V;_9F;_F6;_S&;__YD``)D`,YD`9ID`F9D`S)D`_YDS`)DS
M,YDS9IDSF9DSS)DS_YEF`)EF,YEF9IEFF9EFS)EF_YF9`)F9,YF99IF9F9F9
MS)F9_YG,`)G,,YG,9IG,F9G,S)G,_YG_`)G_,YG_9IG_F9G_S)G__\P``,P`
M,\P`9LP`F<P`S,P`_\PS`,PS,\PS9LPSF<PSS,PS_\QF`,QF,\QF9LQFF<QF
MS,QF_\R9`,R9,\R99LR9F<R9S,R9_\S,`,S,,\S,9LS,F<S,S,S,_\S_`,S_
M,\S_9LS_F<S_S,S___\``/\`,_\`9O\`F?\`S/\`__\S`/\S,_\S9O\SF?\S
MS/\S__]F`/]F,_]F9O]FF?]FS/]F__^9`/^9,_^99O^9F?^9S/^9___,`/_,
M,__,9O_,F?_,S/_,____`/__,___9O__F?__S/___P````T-#1H:&B@H*#4U
M-4-#0U!04%U=76MK:WAX>(:&AI.3DZ&AH:ZNKKN[N\G)R=;6UN3DY/'Q\?__
M_S(``0```P4`!0````!FS`````4``@``````````,@4`!0````!FS```9%-)
M3```,&QI9FQI9@``)&H,L"'Y!`D(`-<`+``````L`"T```C^`*\)'$BP(("#
M"!,F+,BPH<-K"B-*//BPXL")!YEIU(C1HD.)&T.*E.C18$*1*%,J+"GP9,J7
M*!=Z=(E2VS:;[&[>U*9B)$*+"%]NRZFMJ$Z>-FWZ!/"09DBC-E5`38KSYD:9
M)C.BW#F4*]&N4Z_^S`I@:U*N2:4>55N4X]B+044.A:KVJU&[V[:)I0BW;$V=
M1*E.W5F4Z-Z^?I_>E$K5ZL:T9]NZY1M7Y%2VVBS?W<8VY-C*(8\>S6R6\$[/
M%)T^+@K5L6*[25$KA*F9]-/6@9>"IOT2<N.8LWGW1KLXMFZMPBT#SBM8I>KD
MS);CA`KSN?"TQ"6_M$Z[*NOFM+F0PVR,U'5X\2F+LCTM/")T9HWM)G<//?)1
MZ/23?]^//__[_Y,QM1N`_3$%T8`$GD<9@G_95)Q>O&&%GD9=S65<=6\=B!Q,
MIE$5888:)M8;;N8!QU=6O!7W&X8&-L2@1JP]:)N)0#%(WH6RM5A1<*$-IEV`
@.M8XX7%!SN3?=A&QQ!!&.:ZDY$<83?1D25&>6%)``#L`
`
end
EndIcon
          }
      }
  }

sub load_icons ($)
  {
    my($dir) = @_;
    local(*DIR);
    my($f,@f);

    if(!-d $dir)
      {
        ::add_output("icon_dir $dir is not directory!\n");
        return;
      }
    # OK lets scan the directory and load those icons
    opendir(DIR,$dir);
    @f = readdir(DIR);
    closedir(DIR);

    foreach $f (@f)
      {
        my($base);
        $base = $f;
        # Filenames on Windows are not case sensative
        $base = lc($f) if($::operating_system =~ /^MSWin/i);
        # Ignore all images that we generated
        next if(is_one_of_ours($f));

        if($base =~ s/\.gif$//i)
          {
            my($image,$ext,$file_name);

            if(!-f "$dir/$f")
              {
                ::add_output("Cannot open $dir/$f as icon\n");
                next;
              }
            $ext = "gif";
            $file_name = "$dir/$f";
            $image = Uue::encode($file_name);

            $icons{$base}->{"name"} = $base;
            $icons{$base}->{"uue"} =  $image;
            $icons{$base}->{"ext"} =  $ext;
            $icons{$base}->{"file"} = $file_name;
            $icons{$base}->{"index"} = next_index;
            FileCounts::inc("icon");
          }
      }
  }

}

{
# Here is where we store the variables we can access in the 
# page body
package Variables;
my(%var_values,%types,%globals);

sub session_init ()
  {
    %var_values = ();
    %globals = ();
  }

sub page_init ()
  {
    %var_values = ();
  }

sub global ($$;$)
  {
    my($name,$value,$dir) = @_;

    if($dir)
      {
        $value = "$dir/$value";
      }    
    $globals{$name} = $value;
  }

sub assign ($@)
  {
    my($name,@vals) = @_;
    my($value);
    
    if(!@vals)
      {
        $value = "";
      }
    elsif($#vals <= 0)
      {
        $value = $vals[0];
      }
    else
      {
        $value = \@vals;
      }
    $var_values{$name} = $value;
  }

sub obtain ($)
  {
    my($name) = @_;
    my($val);
    
    $val = $var_values{$name};

    if(!defined $val)
      {
        $val = $globals{$name};
      }

    if(!defined $val)
      {
        ::add_output("Undefined variable $name\n");
        return("");
      }

    if(ref($val) eq "ARRAY")
      {
        if(wantarray)
          {
            return(@{$val});
          }
        else
          {
            return(join($;,@{$val}));
          }
      }
    else
      {
        return($val);
      }
  }
}

{
# Various ways to sort lists
package Sort;

sub alpha_fun
  {
    my($a_l,$b_l,$r);

    $a_l = lc($a);
    $b_l = lc($b);
    $r = ($a_l cmp $b_l);
    return $r if($r != 0);
    return($a cmp $b);
  }

sub ascii_fun
  {
    return($a cmp $b);
  }
  
sub numeric_fun
  {
    return($a <=> $b);
  }
  
sub lex_fun
  {
    # split into numeric and alpha bits
    my($a_l,$b_l,$r);

    $a_l = lc($a);
    $b_l = lc($b);
    while($a_l && $b_l)
      {
        my($a_b,$b_b);
        if($a_l =~ s/^(\d+)//)
          {
            # a is numeric
            $a_b = $1;
            if($b_l =~ s/^(\d+)//)
              {
                # b is numeric
                $b_b = $1;
                return(1) if($b_b < $a_b);
                return(-1) if($b_b > $a_b);
              }
            else
              {
                # b isn't numeric
                return(-1);
              }
          }
        elsif($b_l =~ s/^(\d+)//)
          {
            # b is numeric and a isn't
            return(1);
          }
        else
          {
            # neither is numeric
            if($a_l =~ s/^(\D+)//m)
              {
                $a_b = $1;
              }
            else
              {
                # Woops
                print STDERR "lex fun failed a\n";
              }
            if($b_l =~ s/^(\D+)//m)
              {
                $b_b = $1;
              }
            else
              {
                # Woops
                print STDERR "lex fun failed b\n";
              }
            return($a_b cmp $b_b)
                        if($a_b ne $b_b);            
          }
      }
    $r = ($a_l cmp $b_l);
    return $r if($r != 0);
    return($a cmp $b);
  }

sub lex
  {
    # OK this is a weird one, because sort passes $a and $b
    # by ref we cannot use it within any package other than 
    # main
    return(sort lex_fun @_);
  }

sub ascii
  {
    # OK this is a weird one, because sort passes $a and $b
    # by ref we cannot use it within any package other than 
    # main
    return(sort ascii_fun @_);
  }

sub alpha
  {
    # OK this is a weird one, because sort passes $a and $b
    # by ref we cannot use it within any package other than 
    # main
    return(sort alpha_fun @_);
  }

sub numeric
  {
    # OK this is a weird one, because sort passes $a and $b
    # by ref we cannot use it within any package other than 
    # main
    return(sort alpha_fun @_);
  }

sub test ()
  {
    # Test the various sorting functions
    # This function is only used to prove that the sorting
    # functions are behaving as they should
    my(@cases,$r,$f);
    @cases = ("one","two","one3","one7","one10","on",
                                  "ONE","NINE","TEN","10","7","ones6");
    printf "%7s %-7s       ascii  alpha   lex\n","","";
    foreach $a (@cases)
      {
        foreach $b (@cases)
          {
            printf "%7s %-7s  ",$a,$b;
            foreach $f ("ascii","alpha","lex")
              {
                printf " %7d",eval("\&$f");
              }
            printf "\n";
          }
      }
  }
}

{
# Working out the category of a file is simple, we 
# look at the following:
#
#     check if it one of ours
#     if 'force_category' attribute of the file is set use that
#     go through the 'category_list' attribute checking the 
#       patterns
#     if we still don't know use the 'category_default'
#
# For a directory however we look at the number of children
# in each category (going into subdirectories as well).  If 
# these files are predominently of a single type we select 
# that as the type of the directory.
#    
package FileCategory;

    my(%weights);
    
sub assign ($$;$)
  {
    my($file,$category,$weight) = @_;

    # Assigning a file type contributes to the file type
    # of its parent directories

    $weight = 1 if(!$weight || $weight <= 0);
    $file = Path::cannonicalise($file);

    while($file)
      {
        my(%file_weights);
        if(!-d $file)
          {
            $weights{$file} = $category;
          }
        elsif($weights{$file} && !ref($weights{$file}))
          {
            # We have already concluded what type this 
            # dir is
          }
        else
          {
            if(!$weights{$file})
              {
                %file_weights = ();
              }
            else
              {
                %file_weights = %{$weights{$file}};
              }
            $file_weights{$category} += $weight;
            $weights{$file} = \%file_weights;
          }
        if(!($file =~ s#/+[^/]*$##))
          {
            $file = "";
          }
      }
  }

sub obtain ($)
  {
    my($file) = @_;
    my(%file_weights,$c,@names,@counts,$i,$forced_category);

    $file = Path::cannonicalise($file);

    $forced_category = "";
    if(-d $file)
      {
        Attribute::get($file,"force_dircategory",\$forced_category,1)
      }
    else
      {
        Attribute::get($file,"force_filecategory",\$forced_category,1)
      }
    Attribute::get($file,"force_category",\$forced_category,1) if(!$forced_category);
    if($forced_category)
      {
        $weights{$file} = $forced_category;
        return($forced_category);
      }

    if(!$weights{$file})
      {
        $weights{$file} = "unknown";
        $weights{$file} = "dir" if(-d $file);
      }
    return($weights{$file}) if(!ref($weights{$file}));

    # By the time we have got here we know we have a directory
    %file_weights = %{$weights{$file}};

    # First create a sorted list of the candidate types
    foreach $c (keys(%file_weights))
      {
        for($i=0;$i<=$#counts;$i++)
          {
            if($file_weights{$c} > $counts[$i])
              {
                splice(@names,$i,0,$c);
                splice(@counts,$i,0,$file_weights{$c});
                last;
              }
          }
        if($i>$#counts)
          {
            push(@names,$c);
            push(@counts,$file_weights{$c});
          }
      }
    # Now select the first category if it has more than twice as many 
    # votes as the second
    $counts[1] = 0 if(!$counts[1]);
    if($counts[0] > 0 && $counts[0] >= 2*$counts[1])
      {
        $weights{$file} = $names[0];
      }
    else
      {
        $weights{$file} = "unknown";
        $weights{$file} = "dir" if(-d $file);
      }

    return($weights{$file});
  }

# File type classifiers

sub classify ($$$)
  {
    my($dir,$file_name,$for_purpose) = @_;
    my($val,@filetypes,$f,$name);

    $name = "$dir/$file_name";
    $name = $dir if(!$file_name);
    $name = Path::cannonicalise($name);

    if(-d $name)
      {
        return("dir") if($for_purpose eq "webify" || $for_purpose eq "fpage");
        if($weights{$name} && !ref($weights{$name}))
          {
            # Done this one already
            return($weights{$name});
          }
        return(obtain($name));
      }      

    if($weights{$name} && !ref($weights{$name}))
      {
        # Done this one already
        return($weights{$name});
      }

    # Easy file classifications
    if(GenName::is_one_of_ours($file_name))
      {
        # Don't contribute to the weights
        $weights{$name} = "wfolio";
        return("wfolio");
      }

    $val = "";
    Attribute::get($name,'force_filecategory',\$val,1);
    goto dispatch if($val);

    Attribute::get($name,'force_category',\$val,1);
    goto dispatch if($val);

    Attribute::get($name,'category_list',\$val,1);
    @filetypes = split(/\s+/,$val);
    foreach $f (@filetypes)
      {
        Attribute::get($name,"category_${f}_pattern",\$val,1);
        next if(!$val);
        if($name =~ /$val/i)
          {
            $val = $f;
            goto dispatch;
          }
      }

    if(!($file_name =~ /\./))
      {
        $val = "notype";
        goto dispatch;
      }

    Attribute::get($name,'category_default',\$val,1);
    goto dispatch if($val);
    ::add_output("Failed to find valid default category for $name\n");
    $val = "dontknow";
    
dispatch:
    # Normally goto is a bad idea, here is an occasion when it 
    # makes life easier.  We have a value (in $val) but want to 
    # register it for later
    assign($name,$val);
    return($val);
  }

}

{
# This package takes care of interpreting the page definitions
# and evaluating them.  
# Page definitions consist of mixed processing instructions and
# page layout stuff, for example:
#
#  .
#  .
#  .
#    #foreach ${metatag} split:(attrib:("metatags"))
#    #if attrib_quiet:(var:("metatag"))
#    #set ${content} attrib:(var:("metatag"))
#      <meta+${metatag}|http-equiv=${metatag}|\
#        content=${content}/>
#    #endif
#    #endforeach
#    
#    </head><body>
#    
#    #if not:(attrib_quiet:("notitle"))
#    #if attrib_quiet:("pagetitle")
#      <h1>$[pagetitle]</h1>
#    #else
#      <h1>${page_title}</h1>
#    #endif
#    #endif
#    
#      $[pre_text]
#  .
#  .
#  .
#
# All the processing instructions are indicated with a hash, 
# the list of instructions then indicate actions to take on
# expressions.  The page layout things consist of variables 
# (like ${metatag}) attributes (like $[pagetitle]) and tags (like 
# <body>).  The attributes are associated with the page being 
# rendered and the variables are set in the processing.  These
# are substituted into the output text then the tags are expanded
# (for example <body> has an attribute called "pagecolor" so we 
# look to see if this page's "body_pagecolor" attribute is set 
# and if so set it in the HTML <body> tag).
#
# See, its really quite simple   (would I lie to you :-)  )
#
    package Page;
    
    my(%page_defs,%tags);
    my(@sections,%stmt_types,%exp_funs,%exp_ops);
    my($sp,$pc,@stack,@operator_precidence);
    my($path_to_page);

sub add_stmt
  {
    my($stmt,$context,$arg) = @_;

    # The various end??? statements are there 
    # for documentation alone    
    return if(!$context);
    
    $stmt_types{$stmt} = 
      {
        "CONTEXT" => $context,
        "ARG" => $arg,
      };
  }

sub add_oper ($$)
  {
    my($opr,$prec) = @_;
    my($pat);
    $pat = $opr;
    $pat =~ s/\|/\\\|/g;
    $pat =~ s/\*/\\\*/g;
    $pat =~ s/\./\\\./g;
    $pat =~ s/\+/\\\+/g;
    $pat =~ s/\-/\\\-/g;

    $exp_ops{$opr} = 
      {
        "EXPR" => eval('sub {$_[0] '.$opr.'$_[1]}'),
        "PREC" => $prec,
        "PATTERN" => $pat,
      };
  }

sub add_fun ($)
  {
    # A new pagedef function added from the attributes
    my($spec) = @_;
    if($spec =~ s/^\s*(\w+):\(([^\)]*)\)//)
      {
        my($name,$args) = ($1,$2);
        my($str_args,$fun_def,$fun_code,@args);

        $args =~ s/^\s+//;
        $args =~ s/\s+$//;
        $str_args = $args;
        $str_args =~ s/\$//g;
        if($args)
          {
            $fun_def = 'sub {my('.$args.')=@_;'."\n".$spec.'}';
          }
        else
          {
            $fun_def = 'sub {'.$spec.'}';
          }
        $fun_code = eval($fun_def);
        if($@)
          {
            ::add_output("eval on $fun_def gave: $@\n");
          }
        @args = split(/\,/,$str_args);
        $exp_funs{$name} =
          {
            "ARGS" => $str_args,
            "RET"  => 'str',
            "EXPR" => $fun_code,
            "NUMARGS" => int(@args),
          };
      }
  }

sub top_init ()
  {
    my($fun,$op);
    
    return if(%exp_funs);

    # Define the functions that are implemented in expressions
    %exp_funs =
      (
        "regex" =>
          {
            "EXPR" => sub 
              {
                my($str,$pattern) = @_;
                return(eval("\$str =~ /$pattern/"));
              },
            "ARGS" => 'str pattern',
            "RET"  => 'str',
          },
        "backout" =>
          {
            "EXPR" => sub {return(Page::backout($_[0]))},
            "ARGS" => 'val',
            "RET"  => 'str',
          },
        "attrib"    =>
          {
            # Get the value of an attribute
            "EXPR" => sub {
                           my($val);
                           return($val) if(Attribute::get($path_to_page,$_[0],\$val));
                           return("");
                          },
            "ARGS" => 'attrib_name',
            "RET"  => 'str',
          },
        "attrib_quiet"    =>
          {
            # Get the value of an attribute, but don't complain if
            # it is not set
            "EXPR" => sub {my($val);
                           if(Attribute::get($path_to_page,$_[0],\$val,1))
                             {
                               return($val);
                             }
                           return undef;
                           },
            "ARGS" => 'attrib_name',
            "RET"  => 'str',
          },
        "not"    =>
          {
            # Logical not
            "EXPR" => sub {return("true")if(! $_[0]);return("");},
            "ARGS" => 'expr',
            "RET"  => 'str',
          },
        "cannonical" =>
          {
            # Tidy up file name
            "EXPR" => sub {return(Path::cannonicalise($_[0]))},
            "ARGS" => 'path',
            "RET"  => 'str',
          },
        "render" => 
          {
            # Create a rendition of the file and a thumbnail of it
            "EXPR" => sub 
                        {
                          my($dir,$file,$separator) = @_;
                          my($output);
                          $output = Render::obtain($dir,$file);
                          $output .= $separator if($output);
                          return($output);
                        },
            "ARGS" => 'dir file separator',
            "RET"  => 'str',
          },
        "iconfile"  =>
          {
            # Return the name of the local file representing this icon
            "EXPR" => sub 
                        {
                          my($dir,$icon_name) = @_;
                          return(GenName::obtain("$dir/$icon_name","icon",$dir));
                        },
            "ARGS" => 'dir icon_name',
            "RET"  => 'str',
          },
        "icon"  =>
          {
            # Return the name of the local file representing this icon
            "EXPR" => sub 
                        {
                          my($dir,$icon_cat,$target,$sep) = @_;
                          my($icon_file,$ret);
                          $icon_file = GenName::obtain("$dir/$icon_cat","icon",$dir);
                          $ret = "<a|href=${target}>".
                                 "<img+icon|src=${icon_file}|alt=${icon_cat}/>".
                                 "</a>${sep}";
                          return($ret);
                        },
            "ARGS" => 'dir cat target sep',
            "RET"  => 'str',
          },
        "undef"  =>
          {
            # Return the name of the local file representing this icon
            "EXPR" => sub 
                        {
                          return(undef);
                        },
            "ARGS" => '',
            "RET"  => 'str',
          },
        "is_dir"  =>
          {
            # Return true if is a directory
            "EXPR" => sub 
                        {
                          my($file) = @_;
                          return(1) if(-d $file);
                          return(0);
                        },
            "ARGS" => 'file',
            "RET"  => 'str',
          },
        "has_wflio"  =>
          {
            # Return the name of the local file representing this icon
            "EXPR" => sub 
                        {
                          my($file) = @_;
                          return(0) if(-d $file);
                          return(1) if(GenName::check($file,"wflio"));
                          return(0);
                        },
            "ARGS" => 'file',
            "RET"  => 'str',
          },
        "set_wflink"  =>
          {
            # Set an inter page relationship
            "EXPR" => sub 
                        {
                          my($from,$relation,$to) = @_;
                          return("OK") if(
                                  GenName::set_relation($from,"${relation}_wflink",$to));
                          return("");
                        },
            "ARGS" => 'filefrom relation fileto',
            "RET"  => 'str',
          },
        "genname_rel"  =>
          {
            # Generate a name within this directory that represents the 
            # target 
            "EXPR" => sub 
                        {
                          my($dest);
                          $dest = GenName::obtain($_[0],$_[1],$path_to_page);
                          return($dest);
                        },
            "ARGS" => 'target filetype',
            "RET"  => 'str',
          },
        "genname_abs"  =>
          {
            # Generate the absolute name that represents the 
            # target 
            "EXPR" => sub 
                        {
                          my($dest);
                          $dest = GenName::obtain($_[0],$_[1]);
                          return($dest);
                        },
            "ARGS" => 'target filetype',
            "RET"  => 'str',
          },
        "var"  =>
          {
            "EXPR" => sub {Variables::obtain($_[0])},
            "ARGS" => 'var_name',
            "RET"  => 'str',
          },
        "split"  =>
          {
            "EXPR" => sub {
                            # Emulate arrays with $; (wow its just like 
                            # we fell into a timewarp back to Perl 4)
                            my($input,@list);
                            $input = $_[0];
                            while($input)
                              {
                                $input =~ s/^\s+//;
                                if($input =~ s/^\"([^\"]+)\"//m)
                                  {
                                    push(@list,$1);
                                  }
                                elsif($input =~ s/^(\S+)//m)
                                  {
                                    push(@list,$1);
                                  }
                              }
                            return(join($;,@list));
                          },
            "ARGS" => 'str',
            "RET"  => 'list',
          },
        "reverse"  =>
          {
            "EXPR" => sub {
                            my(@list);
                            @list = reverse(split($;,$_[0]));
                            return(join($;,@list));
                          },
            "ARGS" => 'list',
            "RET"  => 'list',
          },
        "join" =>
          {
            "EXPR" => sub {
                            my(@list1,@list2);
                            @list1 = (split($;,$_[0]));
                            @list2 = (split($;,$_[1]));
                            return(join($;,@list1,@list2));
                          },
            "ARGS" => 'list1 list2',
            "RET"  => 'list',
          },
        "sortlex"  =>
          {
            "EXPR" => sub {
                            my(@list);
                            # This is one of those classic Perl constructs
                            # (look it up)
                            @list = split($;,$_[0]);
                            @list = Sort::lex(@list);
                            return(join($;,@list));
                          },
            "ARGS" => 'list',
            "RET"  => 'list',
          },
        "sortalpha"  =>
          {
            "EXPR" => sub {
                            my(@list);
                            # This is one of those classic Perl constructs
                            # (look it up)
                            @list = split($;,$_[0]);
                            @list = Sort::alpha(@list);
                            return(join($;,@list));
                          },
            "ARGS" => 'list',
            "RET"  => 'list',
          },
        "sortascii"  =>
          {
            "EXPR" => sub {
                            my(@list);
                            # This is one of those classic Perl constructs
                            # (look it up)
                            @list = split($;,$_[0]);
                            @list = Sort::ascii(@list);
                            return(join($;,@list));
                          },
            "ARGS" => 'list',
            "RET"  => 'list',
          },
      );

    foreach $fun (keys(%exp_funs))
      {
        my(%fun_def,@args);
        %fun_def = %{$exp_funs{$fun}};
        $fun_def{'NAME'} = $fun;
        @args = split(/\s+/,$fun_def{"ARGS"});
        $fun_def{"NUMARGS"} = $#args + 1;
        $exp_funs{$fun} = \%fun_def;
      }
    foreach $op (keys(%exp_ops))
      {
        my(%op_def,$i);
        %op_def = %{$exp_ops{$op}};
        $op_def{'NAME'} = $op;
        $i = 0;
        while($operator_precidence[$i] &&
              $exp_ops{$operator_precidence[$i]}->{PREC} &&
              $exp_ops{$operator_precidence[$i]}->{PREC} <= $op_def{'PREC'})
          {
            $i++;
          }
        splice(@operator_precidence,$i,0,$op);
        $op_def{'PATTERN'} = $op if(!$op_def{'PATTERN'});
        $exp_ops{$op} = \%op_def;
      }
  }

sub add_tag ($$)
  {
    my($tag,$within) = @_;
    my(%tagdef,%attribs);
    %tagdef = ();
    %attribs = ();
    
    $tagdef{'name'} = $tag;
    $tagdef{'within'} = $within;
    $tagdef{'attribs'} = \%attribs;

    $tags{$tag} = \%tagdef;
  }

sub add_tagattrib ($$$)
  {
    my($tag,$wfolio_name,$html_names) = @_;
    my(%tagdef,%attribs);

    if(!$tags{$tag})
      {
        ::add_output("Attempt to add tagattrib $wfolio_name before defining tag $tag\n");
        return;
      }
    %tagdef = %{$tags{$tag}};
    %attribs = %{$tagdef{'attribs'}};
    if($attribs{$wfolio_name})
      {
        ::add_output("Multiple definitions of tagattrib $wfolio_name (for $tag)\n");
      }
    $attribs{$wfolio_name} = $html_names;

    $tagdef{'attribs'} = \%attribs;
    $tags{$tag} = \%tagdef;
  }

sub backout ($)
  {
    my($val) = @_;
    my($ret);
    $ret = "";
    while($val && $val =~ m#\<#)
      {
        if($val =~ s#\<[^\>\/\<]+\/\>##)
          {
            # This is a tag that is completed
          }
        elsif($val =~ s#\<(\w+)[^\>]*\>##)
          {
            $ret = "</$1>$ret";
          }
        elsif($val =~ s#\<\W[^\>]*\>##)
          {
            # presumably some kind of comment
          }
      }
    return($ret);
  }

sub expand_text ($$)
  {
    # Expand the text that will actually go to the page
    my($page_path,$input,$output) = @_;
    
    # There are two things to do here, expand the tags (adding 
    # in the attributes we need from them) and expand the variables
    # All in all it would be safest to expand the tags first then 
    # the variables
    while($input =~ m#[<>]#)
      {
        # So we have some tags here (bare < or > need to be 
        # modified to &gt; or &lt; anyway so we shouldn't hit
        # them)
        if($input =~ s#^([^<>]*)>##)
          {
            $output .= expand_vars($page_path,$1);
            ::add_output("Unattached > in \"$1>$input\" replace with \&gt;\n");
          }
        elsif($input =~ s#^([^<>]*)<([^<>]*)$#$2#)
          {
            $output .= expand_vars($page_path,$1);
            ::add_output("Unattached < in \"$1<$input\" replace with \&lt;\n");
          }
        elsif($input =~ s#^([^<>]*)<([^<>]*)<#$2<#)
          {
            $output .= expand_vars($page_path,$1);
            ::add_output("Unattached < in \"$1<$input\" replace with \&lt;\n");
          }
        elsif($input =~ s#^([^<>]*)<\s*/\s*([^<>\s]+)\s*>##)
          {
            # Close tag, use this to keep track of where we are
            my($pre,$close) = ($1,$2);
            $output .= expand_vars($page_path,$pre)."</$close>";
            close_tag($close);
          }
        elsif($input =~ s#^([^<>]*)<\s*(\W[^<>]*)>##)
          {
            # Any tag that does not start with a \w character
            # must be a comment or similar
            my($pre,$tag) = ($1,$2);
            $output .= expand_vars($page_path,$pre)."<".
                       expand_vars($page_path,$tag).">";
          }
        elsif($input =~ s#^([^<>]*)<([^<>]*)>##)
          {
            # A real tag (with open and close)
            my($tagbody,@param,@value,$tag_type,$tag_name,%set);
            my($i,%attribs,$tag_attrib,$complete);
            my(%provided,%provided_value,$tag_path);
            
            $tag_path = $page_path;
            $tagbody = $2;
            $output .= expand_vars($tag_path,$1);

            if($tagbody =~ s#/\s*$##)
              {
                $complete = 1;
              }
            if($tagbody =~ s/^([^\|]+)\|(.+)$/$1/)
              {
                # We have some parameters to the tag, 
                # note the values in the param array
                my($i,@params);

                @params = split(/\|+/,$2);
              
                for($i=0;$i<=$#params;$i++)
                  {
                    my($var,$val);
                    
                    if($params[$i] =~ /^([^=]+)=(.*)$/)
                      {
                        $var = $1;
                        $val = $2;
                        if($var eq "**represents**")
                          {
                            $tag_path = $val;
                            next;
                          }
                        ::add_output("Parameter $var set twice in $tagbody\n")
                                if($provided{$var});
                        $provided{$var} = 1;
                        $provided_value{$var} = $val;
                      }
                    else
                      {
                        ::add_output("Attribute $params[$i] without value in $tagbody\n");
                      }
                  }
              }

            if($tagbody =~ s/^(\w+)\+//)
              {
                $tag_type = expand_vars($tag_path,$1);
                $tag_name = expand_vars($tag_path,$tagbody);
              }
            else
              {
                $tag_type = expand_vars($tag_path,$tagbody);
                $tag_name = $tag_type;
              }

            # Is the tag valid so far?
            if(!$tags{$tag_type})
              {
                $tag_type = lc($tag_type);
                if($tags{$tag_type})
                  {
                    ::add_output("Tag names are cases sensitive (change $tag_type tag)\n");
                    $tag_type = lc($tag_type);
                  }
                else
                  {
                    ::add_output("Tag $tag_type not defined!\n");
                    next;
                  }
              }

            # So we now have all the parameters we were given, what 
            # about the tag attributes?
            %attribs = %{$tags{$tag_type}->{'attribs'}};
            foreach $tag_attrib (keys(%attribs))
              {
                my(@html_attribs,$value,$hattrib);

                $value = "";
                if($provided{${tag_attrib}})
                  {
                    $value = expand_vars($tag_path,
                             $provided_value{${tag_attrib}});
                    $provided{${tag_attrib}} = 2;
                  }
                elsif(Attribute::get($tag_path,"${tag_name}_${tag_attrib}",
                                      \$value,1) && defined $value)
                  {
                  }
                elsif(Attribute::get($tag_path,${tag_attrib},
                                      \$value,1) && defined $value)
                  {
                  }
                else
                  {
                    next;
                  }

                # Given that we have a value distribute it
                @html_attribs = split(/,/,$attribs{$tag_attrib});
                foreach $hattrib (@html_attribs)
                  {
                    if(!$set{$hattrib})
                      {
                        push(@param,$hattrib);
                        push(@value,$value);
                        $set{$hattrib} = 1;
                      }
                  }
              }

            foreach $tag_attrib (keys(%provided))
              {
                ::add_output("Attribute $tag_attrib is not used in $tag_type tag\n")
                                                  if($provided{$tag_attrib} == 1);
              }

            # Finally we have everything we need to know, we can 
            # send out the tag
            $output .= "<$tag_type ";
            for($i=0;$i<=$#param;$i++)
              {
                $output .= "$param[$i]=\"".
                           expand_vars($page_path,$value[$i])."\" ";
              }
            chop($output);
            if($complete)
              {
                $output .= "/>";
              }
            else
              {
                $output .= ">";
                open_tag($tag_type);
              }
          }
      }
    $output .= expand_vars($page_path,$input);
    
    if($output =~ s#\\cont\s*$##)
      {
      }
    else
      {
        $output .= "\n";
      }
    return($output);
  }

sub interpret ($$$)
  {
    # Add a page to the list
    my($page_contents,$page_path,$fh) = @_;
    my(@parts,%cmd,@foreach_vals);

    if(!$page_defs{$page_contents})
      {
        $page_defs{$page_contents} = parse($page_contents);
      }
    @parts = @{$page_defs{$page_contents}};
    
    # Now we have a parsed page definition we can interpret it
    $pc = 1; $sp = 0;

    while($pc <= $#parts)
      {
        if(ref($parts[$pc]) eq "HASH")
          {
            # An instruction, carry it out
            %cmd = %{$parts[$pc]};
            if($cmd{'cmd'} eq "rem")
              {
                # That's the easiest one to do
              }
            elsif($cmd{'cmd'} eq "if")
              {
                # Evaluate the arg, if it is true do
                # the next bit otherwise skip to the 
                # else clause
                my($exp_val);
                
                $exp_val = expand_exp($page_path,$cmd{'exp'});
                while(!$exp_val)
                  {
                    # Keep looking at branches of the if statement
                    # until we hit one we want to go with
                    if($cmd{'else'})
                      {
                        $pc = $cmd{'else'};
                        %cmd = %{$parts[$pc]};

                        if($cmd{'cmd'} eq 'elsif')
                          {
                            $exp_val = expand_exp($page_path,$cmd{'exp'});
                          }
                        elsif($cmd{'cmd'} eq 'else')
                          {
                            $exp_val = 1;
                          }
                        else
                          {
                            # Woops
                            ::add_output("Bad within clause line $pc\n");
                            $exp_val = 1;
                          }
                      }
                    else
                      {
                        # OK so we have no else clause, give up
                        $pc = $cmd{'end'};
                        $exp_val = 1;
                      }
                  }
              }
            elsif($cmd{'cmd'} eq "elsif" || $cmd{'cmd'} eq "else")
              {
                # OK, if we have got here it must be because
                # we were executing the previous code, skip
                # to the end of the if statement
                $pc = $cmd{'end'};
              }
            elsif($cmd{'cmd'} eq "end")
              {
                # If this is a loop then we have to go back,
                # otherwise just pass through
                if($cmd{ref2} eq "foreach")
                  {
                    # Jump to the instruction after the foreach
                    # (it will be a foreach2)
                    $pc = $cmd{'from'};
                  }
                elsif($cmd{ref2} eq "while")
                  {
                    # Just jump back to the start of the loop
                    $pc = $cmd{'from'} - 1;
                  }
                elsif($cmd{ref2} eq "section")
                  {
                    # Remove a section
                    Attribute::end_section;
                  }
              }
            elsif($cmd{'cmd'} eq "foreach")
              {
                # This is the first time we have seen this 
                # statement evaluate the expression to get the list
                $foreach_vals[$pc+1] = expand_exp($page_path,$cmd{'vexp'});
              }
            elsif($cmd{'cmd'} eq "foreach2")
              {
                # If the list is empty we can give up, otherwise set 
                # the variable and go round
                my(@list);
                @list = split($;,$foreach_vals[$pc]);
                if(@list)
                  {
                    Variables::assign($cmd{'var_name'},
                            shift(@list));
                    $foreach_vals[$pc] = join($;,@list);
                  }
                else
                  {
                    $foreach_vals[$pc] = undef;
                    $pc = $cmd{'end'};
                  }
              }
            elsif($cmd{'cmd'} eq "while")
              {
                # Check the condition, skip to the end if false
                if(!expand_exp($page_path,$cmd{'exp'}))
                  {
                    $pc = $cmd{'end'};
                  }
              }
            elsif($cmd{'cmd'} eq "set")
              {
                # Set the supplied variable to the value
                Variables::assign($cmd{'var_name'},
                         expand_exp($page_path,$cmd{'exp'}));
              }
            elsif($cmd{'cmd'} eq "section")
              {
                # Start a section
                Attribute::start_section($cmd{'arg_name'});
              }
            elsif($cmd{'cmd'} eq "label")
              {
                # Ignore this while running, it is just a placeholder
              }
            elsif($cmd{'cmd'} eq "goto")
              {
                # Jump to the given label
                my($i);
                for($i=0;$i<=$#parts;$i++)
                  {
                    if(ref($parts[$i] eq "HASH" && $parts[$i]->{'cmd'} eq "label" &&
                                $parts[$i]->{'arg_name'} eq $cmd{'arg_name'}))
                      {
                        last;
                      }
                  }
                if($i>$#parts)
                  {
                    ::add_output("Failed to find label ".$cmd{'arg_name'}."\n");
                  }
                else
                  {
                    $pc = $i;
                  }
              }
            elsif($cmd{'cmd'} eq "last" || $cmd{'cmd'} eq "next")
              {
                # Jump to the end of the surrounding loop
                while($pc <= $#parts && (ref($parts[$pc]) ne "HASH" ||
                        $parts[$pc]->{'cmd'} ne "end" ||
                        $parts[$pc]->{'ref2'} eq "section"))
                  {
                    $pc++;
                  }
                $pc-- if($cmd{'cmd'} eq "next");
              }
            elsif($cmd{'cmd'} eq "output" || $cmd{'cmd'} eq "message" ||
                                   $cmd{'cmd'} eq "execute")
              {
                # Evaluate the expression and send the result out
                # (allows us to have tags defined within variables)
                my($val);
                $val = expand_exp($page_path,$cmd{'exp'});
                $val = expand_text($page_path,$val);
                if($cmd{'cmd'} eq "output")
                  {
                    print $fh $val;
                  }
                elsif($cmd{'cmd'} eq "message")
                  {
                    ::add_output($val."\n");
                  }
              }
            else
              {
                ::add_output("Bad tag ".$cmd{'cmd'}." in parsed pagedef\n");
              }
          }
        else
          {
            # Standard text, expand it and print it
            print $fh expand_text($page_path,$parts[$pc]);
          }
        $pc++;
      }
    return(GenName::flush_wflio);
  }

sub expand_exp ($$)
  {
    # By the time we have got here the expression has been unwound 
    # to a set of reverse polish that evaluates to it
    my($page_path,$input,$output,$done_action) = @_;
    my(@stack,$sp);

    $path_to_page = $page_path;
    $output = $input;
    while($output)
      {
        $output =~ s/^\s*//;
        if($output =~ s/^\"([^\"]*)\"//)
          {
            my($str_val,@unresolved,$ov);
            $str_val = $1;
            @unresolved = ();
            # Expand inline variables
            while($str_val =~ /\$\{([\w_\-]+)\}/)
              {
                my($var,$val) = ($1);
                $val = Variables::obtain($var);
                if(!$val)
                  {
                    push(@unresolved,$var);
                    $val = "~~$var~~";
                  }
                $str_val = ::replace($str_val,'${'.$var.'}',$val);
              }
            foreach $ov (@unresolved)
              {
                ::replace($str_val,"~~$ov~~",'${'.$ov.'}');
              }
            @unresolved = ();
            while($str_val =~ /\$\[([\w_\-]+)\]/)
              {
                my($var,$val) = ($1);
                if(!Attribute::get($page_path,$var,\$val))
                  {
                    push(@unresolved,$var);
                    $val = "~~$var~~";
                  }
                $str_val = ::replace($str_val,'$['.$var.']',$val);
              }
            foreach $ov (@unresolved)
              {
                ::replace($str_val,"~~$ov~~",'$['.$ov.']');
              }
            $stack[$sp++] = $str_val;
          }
        elsif($output =~ s/^(\S+)//)
          {
            my($fun) = $1;
            if($exp_funs{$fun})
              {
                my(@args,$ret,$i);
                for($i=0;$i<$exp_funs{$fun}->{NUMARGS};$i++)
                  {
                    $sp--;
                    unshift(@args,$stack[$sp]);
                  }
                $ret = &{$exp_funs{$fun}->{EXPR}}(@args);
                $stack[$sp++] = $ret;
              }
            elsif($exp_ops{$fun})
              {
                my($arg1,$arg2,$ret);
                $sp--;
                $arg2 = $stack[$sp];
                $arg1 = $stack[$sp-1];
                $ret = &{$exp_ops{$fun}->{EXPR}}($arg1,$arg2);
                $stack[$sp-1] = $ret;
              }
            else
              {
                ::add_output("Cannot expand parsed expression \"$output\"\n");
              }
          }
        elsif($output)
          {
            ::add_output("Cannot expand parsed expression \"$output\"\n");
          }
      }

    # Should be that we only have a single value by now
    if($sp > 1)
      {
        ::add_output("Expression returns too many values \"$input\"\n");
      }
    # Now we should have a value
    return($stack[0]);
  }

sub tag_represents ($$)
  {
    my($page_path,$input,$output) = @_;
    # This tag wants to be associated with the given path, rather than with
    # the path for the rest of the page, we do this by adding a magic tag
    # "**represents**" to tell us where to look for attributes later
    while($input =~ m#[<>]#)
      {
        if($input =~ s#^([^<>]*)>##)
          {
            $output .= expand_vars($page_path,$1);
            ::add_output("Unattached > in \"$1>$input\" replace with \&gt;\n");
          }
        elsif($input =~ s#^([^<>]*)<([^<>]*)$#$2#)
          {
            $output .= expand_vars($page_path,$1);
            ::add_output("Unattached < in \"$1<$input\" replace with \&lt;\n");
          }
        elsif($input =~ s#^([^<>]*)<([^<>]*)<#$2<#)
          {
            $output .= $1;
            ::add_output("Unattached < in \"$1<$input\" replace with \&lt;\n");
          }
        elsif($input =~ s#^([^<>]*)<\s*/\s*([^<>\s]+)\s*>##)
          {
            $output .= "$1</$2>";
          }
        elsif($input =~ s#^([^<>]*)<\s*(\W[^<>]*)>##)
          {
            # Any tag that does not start with a \w character
            # must be a comment or similar
            $output .= "$1<$2>";
          }
        elsif($input =~ s#^([^<>]*)<([^<>]*)>##)
          {
            # A real tag (with open and close)
            $output .= "$1<$2>";
            if($output =~ m#/>$#)
              {
                $output =~ s#/>$#|**represents**=$page_path/>#
              }
            else
              {
                $output =~ s#>$#|**represents**=$page_path>#
              }
          }
      }
    return($output.$input);
  } 

{
    # Restrict the scope of the tag stack
    my(@tags);
  
sub open_tag ($)
  {
    my($tag) = @_;
    unshift(@tags,$tag);
  }

sub close_tag ($)
  {
    my($tag) = @_;
    if($#tags < 0)
      {
        ::add_output("End tag </$tag> outside tags\n");
        return;
      }
    elsif($tag ne $tags[0])
      {
        ::add_output("End tag </$tag> does not match $tags[0]\n");
        if($#tags > 0 && $tag eq $tags[1])
          {
            # If we are close just fix it
            shift(@tags);
          }
        elsif($#tags > 1 && $tag eq $tags[2])
          {
            shift(@tags);shift(@tags);
          }
      }      
    shift(@tags);
  }

sub check_tags ()
  {
    if($#tags >= 0)
      {
        ::add_output("Unclosed tags on page ".join(',',@tags)."\n");
      }
  }
}
  
sub expand_vars ($$)
  {
    # Expand variables and attributes
    my($page_path,$input,$done_something) = @_;
    my($changed,$prev_val);
    
    $changed = 0;
    $done_something = 1;
    $prev_val = "";

    if(!$input)
      {
        # Various ways to be false
        return(undef) if(!defined($input));
        return("0") if(length($input));
        return("");
      }

    while($done_something && ($prev_val ne $input))
      {
        $done_something = 0;
        $prev_val = $input;
        while($input && $input =~ m#\$\{([^\{\}]+)\}#)
          {
            my($mark,$var,$val,$i);
            $var = $1;
            $val = Variables::obtain($var);
            $mark = "\$\{$var\}";
            while(($i = index($input,$mark))>=0)
              {
                substr($input,$i,length($mark),$val);
              }
            $done_something = 1;
            $changed = 1;
          }
        while($input && $input =~ m#\$\[([^\[\]]+)\]#)
          {
            my($mark,$var,$val,$i);
            $var = $1;
            if(!Attribute::get($page_path,$var,\$val))
              {
                $val = "";
              }
            $val = "" if(!defined($val));
            $mark = "\$\[$var\]";
            while(($i = index($input,$mark))>=0)
              {
                substr($input,$i,length($mark),$val);
              }
            $done_something = 1;
            $changed = 1;
          }
      }
    $input = expand_text($page_path,$input) if($changed && $input =~ /<.+>/);
    $input =~ s/\n+$//;
    return($input);
  }

sub parse ($)
  {
    # Extract out the text from the control flow on the page
    my($contents) = @_;
    my(@parts,$c);

    $contents =~ s#\\\s*\n\s*##g;

    # Ensure that all valid statements have positive indexes
    # (just in case we start with a loop)
    push(@parts," ");
    # First pass just split the page definition into chunks that are either 
    # text or control flow commands
    while($contents)
      {
        my($next_element,$j);
        
        if($contents =~ s/^(.+)\n//m)
          {
            $next_element = $1;
          }
        else
          {
            $next_element = $contents;
            $contents = "";
          }

        if($next_element =~ s/^\s*#\s*end(\w+)\s*$//)
          {
            my($tag,$j) = ($1);
            # scan backwards to find the coreponding start,
            for($j=$#parts;$j>=0;$j--)
              {
                if(ref($parts[$j]) eq "HASH" && !${$parts[$j]}{'end'})
                  {
                    my(%cmd,%endtag);
                    %cmd = %{$parts[$j]};
                    if(!$cmd{'end'})
                      {
                        if($tag eq $cmd{'cmd'})
                          {
                            # We have a match, close the tag,
                            # grab the bits and move on
                            $cmd{'end'} = $#parts + 1;
                            $parts[$j] = \%cmd;

                            if($tag eq 'if')
                              {
                                # Special case for 'if' statements, 
                                # we have to reassign the 'end' tags for all 
                                # the branches to here
                                my($tag_index);
                                $tag_index = $j;
                                while(defined $parts[$tag_index]->{else})
                                  {
                                    $tag_index = $parts[$tag_index]->{else};
                                    $parts[$tag_index]->{end} = $#parts + 1;
                                  }
                              }
                            elsif($tag eq 'foreach')
                              {
                                # Special case for 'foreach' statements, 
                                if($parts[$j+1]->{'cmd'} eq 'foreach2')
                                  {
                                    $parts[$j+1]->{'end'} = $#parts + 1;
                                  }
                                else
                                  {
                                    ::add_output("foreach missing foreach2\n");
                                  }
                              }
                            %endtag = 
                              (
                                "ref2" => $tag,
                                "from" => $j,
                                "end" => $#parts,
                                "cmd" => "end",
                              );
                            push(@parts,\%endtag);
                            last;
                          }
                        else
                          {
                            ::add_output("Mismatched tag ".$cmd{'cmd'}." v end$tag\n");
                          }
                      }
                  }
              }
          }
        elsif($next_element =~ s/^\s*#\s*end(\w*)//)
          {
            my($tag) = ($1);
            ::add_output("#end$tag must be on a line alone");
          }
        elsif($next_element =~ s/^\s*#\s*(\w+)\s*//)
          {
            my($tag) = (lc($1));
            my(%cmd,$arg_spec);
            
            if(!$stmt_types{$tag})
              {
                ::add_output("Unrecognised tag $tag ($next_element)\n");
                next;
              }
            # Try and extract the correct arguments
            $arg_spec = $stmt_types{$tag}->{ARG};
            %cmd = parse_args($arg_spec,$next_element);
            
            $cmd{'cmd'} = $tag;
            if(!$stmt_types{$tag})
              {
                ::add_output("Unknown tag $tag ignored ($next_element)\n");
                next;
              }
            elsif($stmt_types{$tag}->{CONTEXT} =~ /within:(\w+)/)
              {
                my($inside) = ($1);
                if($inside eq "if")
                  {
                    # This is either an elsif or an else, scan back to
                    # the previous branch and attach an else pointing here
                    my($j,$if_c,$else_c);

                    # Mark it for skipping over later
                    $cmd{'end'} = $#parts + 2;
                    
                    # We have to scan backwards to find the coresponding 
                    # if clause (the one that has not yet been closed), 
                    # then forwards to find the last elsif that belongs 
                    # to this if.  We also have to note which if we belong
                    # to so this will work next time
                    for($j=$#parts;$j>=0;$j--)
                      {
                        if(ref($parts[$j]) eq "HASH" && !$parts[$j]->{end})
                          {
                            if($parts[$j]->{cmd} eq "if")
                              {
                                $if_c = $else_c = $cmd{'if'} = $j;
                              }
                            else
                              {
                                ::add_output("Mismatched tag ".$parts[$j]->{cmd}
                                                ." v $tag\n");
                              }
                            last;
                          }
                      }
                    while($parts[$else_c]->{else})
                      {
                        $else_c = $parts[$else_c]->{else};
                      }
                    $parts[$else_c]->{else} = $#parts+1;
                  }
                else
                  {
                    ::add_output("Cannot handle within:$inside\n");
                  }
              }
            elsif($stmt_types{$tag}->{CONTEXT} eq "block")
              {
              }
            elsif($stmt_types{$tag}->{CONTEXT} eq "single")
              {
                # Mark these so we ignore them later
                # we might just as well put something valid in
                $cmd{'end'} = $#parts + 2;
              }
            else
              {
                ::add_output("Mishandled tag $tag ($next_element)\n");
              }
            push(@parts,\%cmd);
            if($tag eq 'foreach')
              {
                # Foreach tags are always followed by foreach2 tags
                my(%fe2);
                $fe2{'end'} = $#parts;
                $fe2{'cmd'} = 'foreach2';
                $fe2{'var_name'} = $cmd{'var_name'};
                push(@parts,\%fe2);
              }
          }
        elsif($next_element)
          {
            # Here is the body text
            push(@parts,$next_element);
          }
      }
    # Finally scan through to see if we have any unclosed tags
    for($c=0;$c<=$#parts;$c++)
      {
        if(ref($parts[$c]) eq "HASH" && !${$parts[$c]}{'end'})
          {
            ::add_output("Unclosed block clause $c (".
                   $parts[$c]->{'cmd'}." ".$parts[$c]->{'args'}.")\n");
          }
      }
    return(\@parts);
  }

sub parse_args ($)
  {
    my($spec,$val,%cmd,$part) = @_;
    my(@spec) = split(/\s+/,$spec);
    # Pick out the bits we want

    # OK so I admit this is a bit weak, it depends on the fact that
    # no statement uses the same category twice and it does not keep 
    # an order to the things it picks out, but it is easy and it helps 
    # make the interpretation easier too
    foreach $part (@spec)
      {
        if($part eq "ignore")
          {
            # Ignore everything else on the line
            return(%cmd);
          }
        elsif($part eq "name")
          {
            # Next thing on the line is an identifying name
            if($val =~ s/^\s*(\S+)\s*//)
              {
                $cmd{'arg_name'} = $1;
              }
            else
              {
                ::add_output("Missing name\n");
              }
          }
        elsif($part eq "var")
          {
            # Next thing on the line is an identifying name
            if($val =~ s/^\s*\$\{([^\s\}\{]+)\}\s*//)
              {
                $cmd{'var_name'} = $1;
              }
            else
              {
                ::add_output("Missing variable name\n");
              }
          }
        elsif($part eq "exp")
          {
            # Next thing on the line is an expression
            if($val =~ s/^\s*(\S.*)$//)
              {
                $cmd{'exp'} = parse_exp($1);
              }
            else
              {
                ::add_output("Missing expression\n");
              }
          }
        elsif($part eq "vexp")
          {
            # Next thing on the line is a vector expression
            if($val =~ s/^\s*(\S.*)$//)
              {
                $cmd{'vexp'} = parse_exp($1);
              }
            else
              {
                ::add_output("Missing vexpression\n");
              }
          }        
        else
          {
            ::add_output("Unrecognised part $part (within \"$spec\")\n");
          }        
      }
    return(%cmd);
  }

sub parse_exp ($)
  {
    my($input,$output,@stmts,$i,$done_something) = @_;
    # Parse an expression into a simple series of instructions
    $input =~ s/\~\{/\~\|\|\{/g;
    $done_something = 1;
    $output = $input;
    while($done_something)
      {
        my($j,$op);
        
        # Look for simple tings to do to reduce the expression
        $i = $#stmts + 1;
        $done_something = 0;

        # First the quoted strings
        if($output =~ s/\"([^\"]*)\"/\~\{$i\}\~/)
          {
            $stmts[$i] = "\"$1\"";
            $done_something = 1;
            next;
          }

        # Have to be carefull looking for numbers otherwise we get the
        # ones like ~{6}~
        if($output =~ s/(\-\d+\.?\d*)/\~\{$i\}\~/ ||
              $output =~ s/(\-?\d*\.\d+)/\~\{$i\}\~/ ||
              $output =~ s/^(\-?\d+\.?\d*)/\~\{$i\}\~/ ||
              $output =~ s/^(\-?\d*\.\d+)/\~\{$i\}\~/)
          {
            # This finds the numbers that have a - or a . or 
            # are at the start of the string
            $stmts[$i] = "\"$1\"";
            $done_something = 1;
            next;
          }

        # Next the numbers which don't follow { (don't need 
        # to be too clever here, we already have anything with 
        # - or . in it)
        if($output =~ s/([^\{])(\d+)/$1\~\{$i\}\~/)
          {
            $stmts[$i] = "\"$2\"";
            $done_something = 1;
            next;
          }

        # Variables
        if($output =~ s/\s*\$\{([\w\_\-]+)\}/\~\{$i\}\~/)
          {
            $stmts[$i] = "\"$1\" var";
            $done_something = 1;
            next;
          }

        # Attributes
        if($output =~ s/\s*\$\[([\w\_\-]+)\]/\~\{$i\}\~/)
          {
            $stmts[$i] = "\"$1\" attrib";
            $done_something = 1;
            next;
          }

        # Operators
        foreach $op (@operator_precidence)
          {
            my($op_pat);
            $op_pat = $exp_ops{$op}->{PATTERN};
            if($output =~ s/\~\{(\d+)\}\~\s*${op_pat}\s*\~\{(\d+)\}\~/\~\{$i\}\~/)
              {
                my($arg1,$arg2) = ($1,$2);
                $stmts[$i] = $stmts[$arg1] . " " . $stmts[$arg2] . " $op";
                $done_something = 1;
                last;
              }
          }

        # Check for functions with up to 5 args
        for($j=0;$j<5;$j++)
          {
            my($arg_spec);
            $arg_spec = '\~\{(\d+)\}\~\s*,' x $j;
            chop($arg_spec);
            
            if($output =~ s/([\w_\-]+)\:\(\s*$arg_spec\)/\~\{$i\}\~/)
              {
                # Function with $j arguments
                my($fun,@args,$k) = ($1,$2,$3,$4,$5,$6);
                if(check_fun($input,$fun,$j))
                  {
                    for($k=0;$k<$j;$k++)
                      {
                        $stmts[$i] .= $stmts[$args[$k]] . " ";
                      }
                    $stmts[$i] .= $fun;
                  }
                $done_something = 1;
                last;
              }
          }
        next if($done_something);

        # Brackets (which are not near functions)
        if($output =~ s/\(\s*\~\{(\d+)\}\~\s*\)/\~\{$1\}\~/)
          {
            $done_something = 1;
            next;
          }
      }
    if($output =~ /^\s*\~\{(\d+)\}\~\s*$/)
      {
        $output = $stmts[$1];
      }
    else
      {
        ::add_output("Failed to parse \"$input\" ($output)\n");
        $output = $stmts[$#stmts];
      }
    $output =~ s/\~\|\|\{/\~\{/g;
    return($output);
  }

sub check_fun ($$$)
  {
    my($input,$fun,$num_args) = @_;

    if(!$fun)
      {
        ::add_output("Empty function in \'$input\'\n");
        return "";
      }
    if(!$exp_funs{$fun})
      {
        ::add_output("Unknown function $fun in \'$input\'\n");
        return "";
      }
    if($exp_funs{$fun}->{NUMARGS} != $num_args)
      {
        ::add_output("Function $fun passed $num_args args in \'$input\'\n");
        return "";
      }
    return(1);
  }
}

{
# General way to handle command line options in Perl
package Opt;

sub usage (%)
  {
    # Tell the user what the options are and quit
    my(%options) = @_;
    my($opt,$arg_str,$var,$val,$count,$c2);

    print  STDERR "\n";
    print  STDERR "Program options with default values\n";
    for $opt (keys(%options))
      {
        print STDERR "    -$opt ";
        $arg_str = $options{$opt};
        while($arg_str !~ /^$/)
          {
            ($var,$arg_str) = split(/;/,$arg_str,2);
            ($val,$var) = split(/:/,$var);
            if($val ne "BOOL")
              {
                print STDERR "$val ";
              }
          }
        print STDERR "\n";
      }
    print STDERR "\n";
    exit;
  }

sub get (%)
  {
    # Read the command line options 
    my(%options) = @_;
    my($count,$c2,$arg_str,$var,$val,$opt);

    for $opt (keys(%options))
      {
        # First scan all the options setting the variables to the default values
        $arg_str = $options{$opt};
        $c2 = 0;
        while($arg_str)
          {
            ($var,$arg_str) = split(/;/,$arg_str,2);
            ($val,$var) = split(/:/,$var);
            if(!$var)
              {
                if($c2 == 0)
                  {
                    $var = $opt;
                  }
                else
                  {
                    $var = "$opt$c2";
                  }
              }
            if($val eq "BOOL")
              {
                eval "\$::$var = \"\"";
                ::add_output("eval 5545 returned: $@\n") if($@);
              }
            else
              {
                eval "\$::$var = \"$val\"";
                ::add_output("eval 5550 returned: $@\n") if($@);
              }    
            $c2++;
          }
      }

    # Read the options from the command line
    for ($count=0;$count <= $#ARGV;$count++)
      {
        # Ignore if does not start with a "-"
        next if ($ARGV[$count] !~ /^-/);

        # Extract and strip off leading "-"
        $opt = $ARGV[$count];
        $opt =~ s/^-//;

        # Show usage if requested
        show_usage(%options) if($opt eq "usage");

        # Show usage if not a recognised option
        $arg_str = $options{$opt};
        if( ! $arg_str )
          {
            # For this application we want to pass unrecognised options 
            # to the program
            next;
          }
        splice(@ARGV,$count,1);
        $c2 = 0;
        while($arg_str !~ /^$/)
          {
            ($var,$arg_str) = split(/;/,$arg_str,2);
            ($val,$var) = split(/:/,$var);
            if($var =~ /^$/)
              {
                if($c2 == 0)
                  {
                    $var = $opt;
                  }
                else
                  {
                    $var = "$opt$c2";
                  }
              }
            if($val eq "BOOL")
              {
                eval "\$::$var = 1";
                ::add_output("eval 5598 returned: $@\n") if($@);
              }
            else
              {
                $val = splice(@ARGV,$count,1);
                if($val =~ /^\"/)
                  {
                    ($opt,$val) = split(/\"/,$val);
                  }
                eval "\$::$var = \"$val\"";
                ::add_output("eval 5608 returned: $@\n") if($@);
              }    
            $c2++;
          }
        redo;
      }
  }
}

{

# FPage stuff has not yet been converted to use new pagedefs
# (i.e. it doesn't work)

package FPage;

# Of course the my() variables here are inaccesible to the rest 
# of the file because they are in their own block *not* because
# they are in a package (that might be important later)
my($id_char,$fpage_start,%fpage_values,$fpage_pages_done);
my(@subparts,@subpart_range);
my(@subpart_pages,%subpart_locations,@subpart_parent);
my(%fpage_elements,@sorted_indexes);
my($genname_pformat,$num_gendigits,$format_gendigits);

# This function is the way that the rest of the program gets into here
sub run_session ()
  {
    # Process the fpage information to generate the more 
    # sophisticated pages
    my(@start_points,@all_files);
    
    %fpage_values = ();
    $fpage_pages_done  = 0;

    if($num_gendigits <= 0)
      {
        ::add_output("Called fpage_process without calling FPage::set_nameformat\n");
        $num_gendigits = 5;
      }

    # Strictly speaking we could do this when we 
    # scan for the Folio files.  Do it here to keep 
    # some level of separation between the Folio and FPage 
    # processing
    GUI::set_state("Scanning for fpage files");
    fpage_scan_files(".",\@start_points,\@all_files);
    $id_char = "p";
    GUI::set_state("Generating fpage files");
    foreach $fpage_start (@start_points)
      {
        # So we know where to start, and we know what to look for
        # and we know what is there
        generate_fpages($fpage_start,\@all_files);
# fpage processing has not caught up with the 
# major rewrite yet.  Since it was not working on the previous 
# release either I won't worry
#        fpage_generate($fpage_start,\@all_files);
      }
  }

sub set_nameformat ($$$)
  {
    ($genname_pformat,$num_gendigits,$format_gendigits) = @_;
  }

sub generate_fpages ($$)
  {
    my($start_point,$file_list_ref) = @_;
    
    my(%fpage_index);
    my($index,%named_pages);
    my($to_top,$subpart,$count);

    %fpage_elements = ();
    @sorted_indexes = ();
    
    extract_subparts($start_point);

    $to_top = path_to_top($start_point);
    
    GUI::set_state("Finding fpage elements");
    return if(!locate_files($start_point,$to_top,$file_list_ref));

    # Right lets work out the page orders and paths based on the subparts
    for($count=0;$count<=$#subparts;$count++)
      {
        my($name,$range,$parent);
        $name = $subparts[$count];
        $range = $subpart_range[$count];
        $parent = $subpart_parent[$count];
        if(!$range)
          {
            my($index);
            
            if($parent)
              {
                ::add_output("Cannot have parent for rest (subpart $name)\n");
              }
            if($count < $#subparts)
              {
                ::add_output("Subpart $name grabs rest of images!\n");
              }
            # all the remaining pages in numerical order
            foreach $index (@sorted_indexes)
              {
                next if($fpage_elements{$index}->{doc_path});
                push(@{$subpart_pages[$count]},$index);
                $fpage_elements{$index}->{doc_path} = $name;
              }
          }
        else
          {
            $range =~ s/\s+$//;
            $range =~ s/,+/ /g;
            while($range)
              {
                $range =~ s/^\s+//;
                if($range =~ s/^(\d+)\.\.(\d+)\s*//)
                  {
                    my($index);
                    # Grab a range of matching pages
                    my($from,$to,$i) = expand_nums($1,$2);
                    for($i=0;$i<=$#sorted_indexes;$i++)
                      {
                        $index = $sorted_indexes[$i];
                        next if($index == $parent);
                        last if($index > $to);
                        if($index >= $from)
                          {
                            next if($fpage_elements{$index}->{doc_path});
                            push(@{$subpart_pages[$count]},$index);
                            $fpage_elements{$index}->{doc_path} = $name;
                          }
                      }
                  }
                elsif($range =~ s/(\d+)\s*//)
                  {
                    my($p) = expand_nums($1);

                    if($p == $parent)
                      {
                        ::add_output("Subpart $name names its own parent $p\n");
                        next;
                      }
                    if(!$fpage_elements{$p})
                      {
                        ::add_output("No picked image for $p\n");
                        next;
                      }
                    next if($fpage_elements{$p}->{doc_path});
                    push(@{$subpart_pages[$count]},$p);
                    $fpage_elements{$p}->{doc_path} = $name;
                  }
                else
                  {
                    ::add_output("Cannot parse range spec $range for $name\n");
                    $range =~ s/^\S+\s*//;
                  }
              }
          }
      }

    for($count=0;$count<=$#subparts;$count++)
      {
        # Right now we have classified all the pages into 
        # sequences, now we can stitch the sequences together
        my(@p,$path_name,$val,$target,$name,$parent);
        $path_name = $start_point."/".$subparts[$count];
        $name = $subparts[$count];
        $parent = $subpart_parent[$count];

        if(!$parent || $parent == 0)
          {
          }
        elsif(!$fpage_elements{$parent})
          {
            ::add_output("Subpart \"$name\" has nonexistant parent $parent\n");
          }
        elsif(!$fpage_elements{$parent}->{implied_down})
          {
            $fpage_elements{$parent}->{implied_down} = $count+1;
          }
        @p = @{$subpart_pages[$count]};
        if(!@p)
          {
            ::add_output("Cannot find pages for subpart[$count] ($path_name)\n");
            next;
          }

        $val = fpage_get($path_name,"subpart_left");
        if($parent && !$val || $val eq ".")
          {
            # If we have no explicit subpart left then we can see if
            # any of the previous subparts share our parent
            my($j);
            for($j=$count-1;$j>=0;$j--)
              {
                last if($subpart_parent[$j] == $parent);
              }
            if($j >= 0)
              {
                $val = $subparts[$j];
              }
          }
        if($val && $val ne ".")
          {
            my($this_idx,$that_idx);
            
            $this_idx = $p[0];
            if($val eq "**null**")
              {
                $fpage_elements{$this_idx}->{left} = $val;
              }
            elsif($val =~ /^\s*(\d+)\s*$/)
              {
                my($that_idx);
                
                # This is a link to a particular page
                $that_idx = expand_nums($1);
                
                $fpage_elements{$this_idx}->{left} = $that_idx;
                if($fpage_elements{$that_idx}->{right}
                     && $fpage_elements{$that_idx}->{right} != $this_idx)
                  {
                    ::add_output("Inconsistent left/right link between $that_idx and $this_idx\n");
                  }
                $fpage_elements{$that_idx}->{right} = $this_idx;
              }
            else
              {
                my(@q);
                
                @q = @{$subpart_pages[$subpart_locations{$val}]};
                if(!@q)
                  {
                    ::add_output("Cannot find pages for subpart $val\n");
                  }
                else
                  {
                    # Since this is a left link we want the last page in 
                    # the target subpart
                    $that_idx = $q[$#q];

                    $fpage_elements{$this_idx}->{left} = $that_idx;
                    if($fpage_elements{$that_idx}->{right})
                      {
                        ::add_output("Inconsistent left/right link between $that_idx and $this_idx\n");
                      }
                    $fpage_elements{$that_idx}->{right} = $this_idx;
                  }
              }
          }

        $val = fpage_get($path_name,"subpart_right");
        if($val && $val ne ".")
          {
            my($this_idx,$that_idx);
            
            $this_idx = $p[$#p];
            if($val eq "**null**")
              {
                $fpage_elements{$this_idx}->{right} = $val;
              }
            elsif($val =~ /^\s*(\d+)\s*$/)
              {
                # This is a link to a particular page
                $that_idx = expand_nums($1);
                
                $fpage_elements{$this_idx}->{right} = $that_idx;
                if($fpage_elements{$that_idx}->{left} &&
                     $fpage_elements{$that_idx}->{left} != $this_idx)
                  {
                    ::add_output("Inconsistent left/right link between $that_idx and $this_idx\n");
                  }
                $fpage_elements{$that_idx}->{left} = $this_idx;
              }
            else
              {
                my(@q);
                @q = @{$subpart_pages[$subpart_locations{$val}]};
                if(!@q)
                  {
                    ::add_output("Cannot find pages for subpart $val\n");
                  }
                else
                  {
                    $that_idx = $q[0];

                    $fpage_elements{$this_idx}->{right} = $that_idx;
                    if($fpage_elements{$that_idx}->{left} &&
                         $fpage_elements{$that_idx}->{left} != $this_idx)
                      {
                        ::add_output("Inconsistent left/right link between $that_idx and $this_idx\n");
                      }
                    $fpage_elements{$that_idx}->{left} = $this_idx;
                  }
              }
          }

        # Unlike subpart_left and subpart_right subpart_up
        # must always refer to a single page rather than a range
        $val = fpage_get($path_name,"subpart_up");
        if($parent && (!$val || $val eq "."))
          {
            $val = $parent;
          }
        if($val && $val ne ".")
          {
            my($this_idx,$that_idx,$f);
            
            if($val eq "**null**")
              {
                for($f=0;$f<=$#p;$f++)
                  {
                    $fpage_elements{$p[$f]}->{up} = $val;
                  }
              }
            elsif($val =~ /^\s*(\d+)\s*$/)
              {
                $that_idx = expand_nums($1);
                for($f=0;$f<=$#p;$f++)
                  {
                    $fpage_elements{$p[$f]}->{up} = $that_idx;
                  }
              }
            else
              {
                ::add_output("subpart_up must refer to page (not a range) in $name\n");
              }
          }
      }

    # Now process one page at a time to resolve some page 
    # specific information
    GUI::set_state("Finding fpage values");
    foreach $index (@sorted_indexes)
      {
        my(%attribs,$val,$page_id,$full_path);
        my(@elements);

        %attribs = %{$fpage_elements{$index}};
        $page_id = expand_nums($index);
        $attribs{page_id} = $page_id;
        if($attribs{doc_path} eq "." || !$attribs{doc_path})
          {
            $attribs{page_path} = "./$page_id";
            $full_path = "${start_point}/$page_id";
          }
        else
          {
            $attribs{page_path} = "./$attribs{doc_path}/$page_id";
            $full_path = "${start_point}/$attribs{doc_path}/$page_id";
          }
        $attribs{full_path} = $full_path;
 
        # Now that we know what this page is called we can 
        # find out some stuff about it
        $val = fpage_get($full_path,'page_name');
        $attribs{page_name} = $val if($val && $val ne ".");

        $val = fpage_get($full_path,'left');
        if($val eq "**null**")
          {
            $attribs{left} = $val;
          }
        elsif($val =~ /^\s*(\d+)\s*$/)
          {
            # This is a link to a particular page
            $val = expand_nums($1);
            
            $attribs{left} = $val;
            if($fpage_elements{$val}->{right} &&
                  $fpage_elements{$val}->{right} != $index)
              {
                ::add_output("Inconsistent left/right link between $index and $val\n");
              }
            else
              {
                $fpage_elements{$val}->{right} = $index;
              }
          }
        elsif($val && $val ne ".")
          {
            # Must be a subpart, need to find the rightmost page 
            # in the range
            my(@p,$that_idx,$this_idx);

            @p = @{$subpart_pages[$subpart_locations{$val}]};
            if(@p)
              {
                $that_idx = $p[$#p];
                $attribs{left} = $that_idx;
                if($fpage_elements{$that_idx}->{right} &&
                      $fpage_elements{$that_idx}->{right} != $index)
                  {
                    ::add_output("Inconsistent left/right link between $that_idx and $index\n");
                  }
                $fpage_elements{$that_idx}->{right} = $index;
              }
            else
              {
                ::add_output("Cannot find pages for subpart $val\n");
              }
          }

        $val = fpage_get($full_path,'right');
        if($val eq "**null**")
          {
            $attribs{right} = $val;
          }
        elsif($val =~ /^\s*(\d+)\s*$/)
          {
            $val = expand_nums($1);
            $attribs{right} = $val;
            if($fpage_elements{$val}->{left} &&
                $fpage_elements{$val}->{left} != $index)
              {
                ::add_output("Inconsistent right/left link between $index and $val\n");
              }
            else
              {
                $fpage_elements{$val}->{left} = $index;
              }
          }
        elsif($val && $val ne ".")
          {
            # Must be a subpart, need to find the leftmost page 
            # in the range
            my(@p,$that_idx,$this_idx);

            @p = @{$subpart_pages[$subpart_locations{$val}]};
            if(@p)
              {
                $that_idx = $p[0];
                $attribs{right} = $that_idx;
                if($fpage_elements{$that_idx}->{left} &&
                      $fpage_elements{$that_idx}->{left} != $index)
                  {
                    ::add_output("Inconsistent left/right link between $that_idx and $index\n");
                  }
                $fpage_elements{$that_idx}->{left} = $index;
              }
            else
              {
                ::add_output("Cannot find pages for subpart $val\n");
              }
          }
          
        $val = fpage_get($full_path,'thumb_page');
        if($val && $val ne ".")
          {
            $attribs{thumb_page} = $val;
          }
        else
          {
            # get the default thumb_page
            my($thumb_page);
            
            $val = fpage_get($full_path,'default_thumb_page');
            $val =~ s/\$\{([\w\_]+)\}/\$attribs\{$1\}/g;
            $thumb_page = eval($val);
            ::add_output("eval 1696 returned: $@\n") if($@);
            if(!$thumb_page || $thumb_page eq ".")
              {
                ::add_output("Failed to find thumbnail for page $index\n");
              }
            $attribs{thumb_page} = $thumb_page;
          }
        $val = fpage_get($full_path,'page_var_elements');
        if($val && $val ne ".")
          {
            my($element,$var);
            foreach $element (split(/\s+/,$val))
              {
                $val = fpage_get($full_path,$element);
                $attribs{$element} = $val if($val && $val ne ".");
              }
          }

        $val = fpage_get($full_path,'down');
        if($val eq "**null**")
          {
            $attribs{down} = $val;
          }
        elsif($val =~ /^\s*(\d+)\s*$/)
          {
            $val = expand_nums($1);
            $attribs{down} = $val;
          }
        elsif($val && $val ne ".")
          {
            my($this_idx,$that_idx,@p,$f);
            
            @p = @{$subpart_pages[$subpart_locations{$val}]};
            if(@p)
              {
                $that_idx = $p[0];
                $attribs{down} = $that_idx;
              }
            else
              {
                ::add_output("Cannot find pages for subpart $val\n");
              }
          }
        elsif($attribs{implied_down})
          {
            # This page has been nominated as a parent of a subpart
            my($c);
            $c = $attribs{implied_down};
            $attribs{down} = $subpart_pages[$c-1]->[0];
          }

        $val = fpage_get($full_path,'up');
        if($val eq "**null**")
          {
            $attribs{up} = $val;
          }
        elsif($val =~ /^\s*(\d+)\s*$/)
          {
            $val = expand_nums($1);
            $attribs{up} = $val;
          }
        elsif($val && $val ne ".")
          {
            ::add_output("up must link to single page ($val)\n");
          }

        # Finally return the attributes to the global data structure
        $fpage_elements{$index} = {%attribs};
      }
      
    foreach $subpart (sort(@subparts))
      {
        # In each unique subpart connect left and right
        my($sp_loc,$i,$val);
        
        $sp_loc = $subpart_locations{$subpart};
        for($i=0;$i<=$#{$subpart_pages[$sp_loc]};$i++)
          {
            my($this_idx);
            $this_idx = $subpart_pages[$sp_loc]->[$i];
            if($i > 0)
              {
                $fpage_elements{$this_idx}->{left} =
                                $subpart_pages[$sp_loc]->[$i-1]
                    if(!$fpage_elements{$this_idx}->{left});
              }
            if($i < $#{$subpart_pages[$sp_loc]})
              {
                $fpage_elements{$this_idx}->{right} =
                                $subpart_pages[$sp_loc]->[$i+1]
                    if(!$fpage_elements{$this_idx}->{right});
              }
          }
      }

    # finally we can generate each of the output pages
    GUI::set_state("Generating fpage contents");
    foreach $index (@sorted_indexes)
      {
        my(%attribs,$cat,$file_name,$val,$page,$dir);
        local(*F);

        $fpage_pages_done++;
        ::set_fpage_progress($fpage_pages_done,int(@sorted_indexes));
        %attribs = %{$fpage_elements{$index}};
        $dir = $start_point;
        
        foreach $cat ("left","right","up","down")
          {
            if($attribs{$cat} && $attribs{$cat} ne "." && $attribs{$cat} ne "**null**" &&
                    (!$attribs{"${cat}_page"} || $attribs{"${cat}_page"} eq "."))
              {
                $attribs{"${cat}_page"} = 
                   sprintf("./".$genname_pformat,$id_char,$attribs{$cat});
              }
          }

        $file_name = sprintf("$start_point/".$genname_pformat,$id_char,$index);
        $val = fpage_get($attribs{full_path},'page_contents');
        next if($val eq "." || !$val);
        $val =~ s/\$\{([\w\_]+)\}/\$attribs\{$1\}/g;
        eval($val);
        ::add_output("eval 1828 returned: $@\n") if($@);

        FileCounts::inc('fpage');
        open(F,">$file_name") or (::add_output("Cannot write to $file_name\n"),return);
        print F $page;
        close(F);
        ::set_hidden("$file_name") if($::hide_wfolio && $index > 1);
      }
  }

sub extract_subparts ($)
  {
    # Extract a definition of the subparts from the fpage
    # values
    my($start_point) = @_;
    my($sparts);
    
    @subparts = ();
    @subpart_range = ();
    @subpart_parent = ();
    @subpart_pages = ();
    %subpart_locations = ();
    $sparts = fpage_get($start_point,'fpage_parts');

    # Remove comments
    $sparts =~ s/\#.*\n/\n/gm;
    $sparts .= "[";
    while($sparts =~ s/^\s*\[\s*(\S+)\s*\]\s*(\d[^\[]+)\[/\[/ ||
             $sparts =~ s/^\s*\[\s*(\S+)\s*\]\s*\[$//)
      {
        my($name,$range,$parent) = ($1,$2);
        $name = "" if($name eq ".");
        if($name =~ /^(\S+)\-\>(\S+)$/)
          {
            $parent = expand_nums($1);
            $name = $2;
            push(@subpart_parent,$parent);
          }
        else
          {
            push(@subpart_parent,0);
          }
        push(@subparts,$name);
        $range =~ s/\s+$//;
        push(@subpart_range,$range);
        push(@subpart_pages,[]);
        ::add_output("Multiple definitions of fpage subpart $name\n")
                                            if($subpart_locations{$name});
        $subpart_locations{$name} = $#subparts;
      }
  }

sub path_to_top ($)
  {
    my($start_point,$to_top) = @_;
    $to_top = Path::cannonicalise($start_point);
    $to_top =~ s#[^/]+#\.\.#g;
    return($to_top);
  }

sub locate_files ($)
  {
    my($start_point,$to_top,$file_list_ref) = @_;
    my(@element_types,$candidate,@indexes,$index);

    # Fill out the structures with the elements
    @element_types = split(/\s+/,fpage_get($start_point,'fpage_file_elements'));
    foreach $candidate (@element_types)
      {
        my($pattern,$assignments,$index,$file);

        $pattern = fpage_get($start_point,"fpage_${candidate}_pattern");
        foreach $file (@{$file_list_ref})
          {
            $index = "";
            eval($pattern);
            ::add_output("eval 1329 returned: $@\n") if($@);
            if($index && $index > 0)
              {
                # We have a match
                $index = expand_nums($index);
                my(%attrib);
                if($fpage_elements{$index})
                  {
                    %attrib = %{$fpage_elements{$index}};
                  }
                else
                  {
                    %attrib = ();
                  }
                $file = "$to_top/$file";
                $file = Path::cannonicalise($file);

                $attrib{$candidate} = $file;
                $fpage_elements{$index} = {%attrib};
              }
          }
      }
    # OK now we know what the elements are, where should we put them?
    GUI::set_state("Assigning fpage locations");
    foreach $index (keys(%fpage_elements))
      {
        my(%attribs,$val,$ret);
        %attribs = %{$fpage_elements{$index}};

        # First do we want this one?
        $val = fpage_get($start_point,'page_generated_if');
        next if(!$val || $val eq ".");
        $val =~ s/\$\{([\w\_]+)\}/\$attribs\{$1\}/g;

        $ret = eval($val);
        ::add_output("eval 1362 returned: $@\n") if($@);
        next if(!$ret);

        $attribs{do_generate} = 1;
        push(@indexes,$index);
      }
    if($#indexes < 0)
      {
        ::add_output("All pages failed the generated_if test in $start_point\n");
        return("");
      }
    @sorted_indexes = sort(@indexes);
    return($#sorted_indexes);
  }

sub fpage_img
  {
    my($name,%args) = @_;
    my($flags,$k);

    if($args{'BORDER'})
      {
        $flags = "BORDER=$args{BORDER} ";
      }
    else
      {
        $flags = "BORDER=0 ";
      }
    if($args{'ALIGN'})
      {
        $flags .= "ALIGN=$args{ALIGN} ";
      }
    else
      {
        $flags .= "ALIGN=top ";
      }
    foreach $k (keys(%args))
      {
        next if($k eq "ALIGN" || $k eq "BORDER");
        $flags .= "${k}=$args{$k} ";
      }
    return("<img SRC=\"$name\" $flags>");
  }

sub expand_nums (@)
  {
    my(@o,$val);
    foreach $val (@_)
      {
        if($val < 0)
          {
            ::add_output("Negative page number $val!\n");
          }
        elsif($val == 0)
          {
            ::add_output("Zero page number being ignored!\n");
          }
        elsif($val >= (10**($num_gendigits)))
          {
            ::add_output("Page number $val is too large for ".
                          $num_gendigits." digits\n");
          }
        else
          {
            push(@o,sprintf($format_gendigits,$val));
          }
      }
    if(wantarray)
      {
        return(@o);
      }
    return($o[0]);
  }

sub process_imgmap ($$)
  {
    my($name,$area_defs) = @_;
    my(@areas,$area,$ret);
    # Remove comments
    $area_defs =~ s/\\#/&hash;/mg;
    $area_defs =~ s/#[^\n]*\n/\n/mg;
    $area_defs =~ s/\\\s*\n/ /gm;
    $area_defs =~ s/\n+//mg;
    $area_defs =~ s/\&hash;/#/mg;
    @areas = split(/\[/,$area_defs);
    foreach $area (@areas)
      {
        $area =~ s/\s+$//;
        next if(!$area);
        if($area =~ /^\s*(\d+|\*\*null\*\*)\s*\;\s*([^\]]+)\]\s*(\S+)\s*(\S.*)$/)
          {
            my($target,$alt,$typ,$coords) = ($1,$2,$3,$4);
            my($target_page);

            $coords =~ s/\s+/ /g;
            if($target eq "**null**")
              {
                # It is still worth defining the area, IE will 
                # give us the comment even if Netscape won't
                $ret .= "  <AREA SHAPE=$typ COORDS=\"$coords\" ";
                $ret .= "ALT=\"$alt\"></AREA>\n";
              }
            else
              {
                $target = expand_nums($target);
                $target_page = fpage_file($target);
                $ret .= "  <AREA SHAPE=$typ COORDS=\"$coords\" ";
                $ret .= "ALT=\"$alt\" HREF=\"$target_page\"></AREA>\n";
              }
          }
        else
          {
            ::add_output("Failed to pick out area from \"$area\"\n");
          }
      }
    return("<MAP NAME=\"$name\">\n".$ret."</MAP>\n");
  }

sub fpage_file ($)
  {
    my($index) = @_;
    return(sprintf("./".$genname_pformat,$id_char,expand_nums($index)));
  }

# Some routines used in page_contents (in fpage files)
sub contents_of
  {
    my($start_point,$file_name) = @_;
    my($ret,$l);

    if(!-f "$start_point/$file_name")
      {
        ::add_output("Cannot open $file_name\n");
        return("");
      }
    local(*F);
    open(F,"$start_point/$file_name") or 
      (::add_output("Cannot read $start_point/$file_name\n"),return);
    while($l = <F>)
      {
        $ret .= $l;
      }
    close(F);
    return($ret);
  }
  
sub action_icon
  {
    my($dir,$icon_type,$link,%extra_vars) = @_;
    if($link)
      {
        return(fpage_a($dir,$link,
              img_tag("aicon,icon,standard",$dir,::icon_name($icon_type,$dir),
                               "icon_type",$icon_type,%extra_vars)));
      }
    else
      {
        return(img_tag("aicon,icon,standard",$dir,::icon_name($icon_type,$dir),
                               "icon_type",$icon_type,%extra_vars));
      }
  }

sub expand_str
  {
    # My own version of expand_str so we dont 
    # have to worry about packages in fpage files
    return(::expand_str(@_));
  }

sub img_tag
  {
    # My own version of img_tag so we dont 
    # have to worry about packages in fpage files
    return(::img_tag(@_));
  }
  
sub fpage_a
  {
    my($name,$href,$text) = @_;
    my($val,$ret,$no_embed);

    $ret = "<A ";
        
    $val = fpage_get($name,'othera_name');
    $ret .= "NAME=$val " if($val ne ".");
    $val = fpage_get($name,'othera_rel');
    $ret .= "REL=$val " if($val ne ".");
    $val = fpage_get($name,'othera_rev');
    $ret .= "REV=$val " if($val ne ".");
    $val = fpage_get($name,'othera_title');
    $ret .= "TITLE=$val " if($val ne ".");

    $ret .= "HREF=\"$href\">$text</a>";
    return($ret);
  }

sub file_icon
  {
    my($dir,$icon_type,$link,%extra_vars) = @_;
    if($link)
      {
        return(fpage_a($dir,$link,
              img_tag("icon,standard",$dir,::icon_name($icon_type,$dir),
                               "icon_type",$icon_type,%extra_vars)));
      }
    else
      {
        return(img_tag("icon,standard",$dir,::icon_name($icon_type,$dir),
                               "icon_type",$icon_type,%extra_vars));
      }
  }

sub fpage_scan_files
  {
    my($dir,$start_list_ref,$file_list_ref) = @_;
    my($category);

    # This scan looks for possible files that fpage may be interested in
    # This function traverses the complete file tree looking for files to use
    # later.  If we fail to find any *.fpage files then we don't generate any 
    # files in the next phase.
    
    # This function is loosly based on webify_dir except 
    # during this phase we just look for files by name rather
    # than rendering them
    my(@all,$file,@dirs,$sd);
    local(*DIR,$main::simple_wflio);
    
    # Force all wflio lookups to be simple here
    $main::simple_wflio = 1;

    opendir(DIR,"$dir");
    @all = readdir(DIR);
    closedir(DIR);

    # Sorting doesn't matter so we won't
    foreach $file (@all)
      {
        my($file_category);

        next if($file =~ /^\./);

        # Filenames on Windows are not case sensative fold to lower case
        $file = lc($file) if($::operating_system =~ /^MSWin/i);

        $file_category = FileCategory::classify($dir,$file,"fpage");
 
        if($file_category eq "dir")
          {
            push(@dirs,$file);
            next;
          }
        elsif($file_category eq "ignore")
          {
            next;
          }
        elsif($file_category eq "fpage")
          {
            # This defines things shows the contents of some pages
            ::read_wfolio($dir,"$dir/$file",$start_list_ref);

            # Any directory with a fpage file is a start point
            push(@{$start_list_ref},$dir);
          }
        elsif($file_category eq "wfolio")
          {
            next;
          }
        elsif($file =~ /\d\d/)
          {
            # If the file has at least two digits it could 
            # be one of ours
            push(@{$file_list_ref},"$dir/$file");
          }
      }

    foreach $sd (@dirs)
      {
        fpage_scan_files("$dir/$sd",$start_list_ref,$file_list_ref);
      }
  }

sub fpage_get
  {
    # This is slightly different from the way we get 
    # attributes for files.  We are dealing with a 
    # "virtual" structure of pages which never the less
    # has real pages in each of the parts.
    my($path,$attrib) = @_;
    my(%attribs,@path,$with_num,$orig_path);

    $path = "." if(!$path);
    $attrib = lc($attrib);    
    @path = split(m#/+#,$path);
    if(@path && $path[$#path] =~ /^\d+$/)
      {
        $path[$#path] = expand_nums($path[$#path]);
        $with_num = 1;
      }
    $orig_path = $path;

    while($path)
      {
        if($fpage_values{$path})
          {
            my(%attribs);
            %attribs = %{$fpage_values{$path}};
            if($attribs{$attrib})
              {
                return($attribs{$attrib});
              }
          }
        if($with_num)
          {
            if($#path <= 0)
              {
                # down to the bare page number
                $path = $orig_path;
                $with_num = "";
              }
            else
              {
                # Remove the last directory (leaving the page at the end)
                splice(@path,$#path-1,1);
                $path = join('/',@path);
              }
          }
        if(!$with_num)
          {
            # OK so we didn't find a matching element there, how about one
            # level up?
            if($path =~ m#/#)
              {
                $path =~ s#/+[^/]*$##;
              }
            elsif($path eq ".")
              {
                $path = "";
              }
            else
              {
                $path = ".";
              }
          }
      }
      
    my($val);
    # We ran out of fpage values, try the wfolio values
    if(Attribute::get($orig_path,$attrib,\$val))
      {
        return($val);
      }
    return("");
  }

# End of the Fpage specific stuff, close off the block
}

{
package Time;
my(@months);

sub top_init ()
  {
    @months = 
      (
        '',
        'Jan','Feb','Mar','Apr','May','Jun',
        'Jul','Aug','Sep','Oct','Nov','Dec'
      ) if(!@months);
  }

sub time2str ($$)
  {
    # Quick hack that prints out time.  Accepts two arguments, first 
    # is system time (defaults to localtime()) the second is format
    # (defaults to net time format).  If the format is given the following
    # variables are substituted:
    #
    #     $sec      Two digit seconds
    #     $min      Two digit minutes
    #     $hour24   Two digit hour in 24 hour format
    #     $hour12   Two digit hour in 12 hour format
    #     $am       Either "am" or "pm"
    #     $day      Day of month (uses 2 chars padded with space)
    #     $mon      Month of year as number
    #     $month    Three character month (English only I'm afraid)
    #     $year     Four digit year number
    #
    # The default format is '$hour24:$min $day $month $year'
    #
    my($time,$format) = @_;
    $time = time if(!$time);
    my($s,$mi,$h,$d,$mo,$y) = localtime($time);
    my($ret);

    top_init();

    # Attempt to fix Y2K bugs
    $y += 2000 if($y < 70);
    $y += 1900 if($y < 200);

    if(!$format)
      {
        # By default use net time format
        $ret = sprintf("%02d:%02d %2d %s %04d",$h,$mi,$d,$months[$mo+1],$y);
      }
    else
      {
        my($sec,$min,$hour12,$hour24,$am,$day,$mon,$month,$year);
        $sec = sprintf("%02d",$s);
        $min = sprintf("%02d",$mi);
        $hour24 = sprintf("%02d",$h);
        $hour12 = $h;
        $hour12 = 12 if($h < 1);
        $hour12 -= 12 if($h > 12);
        $hour12 = sprintf("%02d",$hour12);
        $am = "am";
        $am = "pm" if($h >= 12);
        $day = sprintf("%2d",$d);
        $mon = sprintf("%2d",$mo+1);
        $month = $months[$mo+1];
        $year = sprintf("%04d",$y);
        $ret = eval("\"$format\"");
        # Report any evaluation error
        ::add_output("eval 3285 returned: $@\n") if($@);
      }
    return($ret);
  }
}

{
    # The script has been split into blocks to restrict the scope
    # of the global 'my' variables.  Each block (other than this one)
    # has its own package.  This is an attempt to encapsulate the 
    # various bits.  The global variables are defined outside this 
    # block using "use vars" so that the package mechanism forces us to 
    # define how to locate them explicitly.
    # For a Perl script this size this is the only way that I know
    # of to make it tractable.

    my($no_win32,$default_mil);
    
    # Global vars for the callback methods in Tk
    my(%options);

sub require_if_present ($)
  {
    # So here is a trick for discovering if the module is 
    # available (and loading it if it is).  This function returns 
    # True if the module is there and this generally sets a 
    # flag to tell the rest of the program how to behave
    my($module_name) = @_;
    my($module_found);
    
    $module_found = 0;
    
    eval(<<"LoadModule");
        # Use require so we don't load the module if it is not there
        require $module_name;
        \$module_found = 1;
LoadModule

    return($module_found);
  }

sub set_readonly ($)
  {
    my($fname) = @_;
    
    if($operating_system =~ /^MSWin/i && !$no_win32)
      {
        # Again wrapping in an eval means we don't look for
        # the module if we are not going to use it (eg on a
        # UNIX machine)  It also hides the bareword from the
        # use strict
        
        eval('use Win32::File;'.
              '&Win32::File::SetAttributes($fname,READONLY);');
      }
    else
      {
        # On UNIX just unset the write bits
        my(@stat);
        @stat = stat($fname);
        chmod($stat[2] & (~0222),$fname);
      }
  }

sub set_hidden ($)
  {
    my($fname) = @_;
    
    if($operating_system =~ /^MSWin/i)
      {
        # Again wrapping in an eval means we don't look for
        # the module if we are not going to use it (eg on a
        # UNIX machine)  It also hides the bareword from the
        # use strict
        eval('use Win32::File;'.
             '&Win32::File::SetAttributes($fname,HIDDEN);');
      }
    # UNIX doesn't have a hidden bit on the permissions
  }

sub webify_dir ($)
  {
    # We do a depth first traversal of the directories,
    # render each one and assign a category to it, then move on
    # to the parents
    my($dir,$sub_dir) = @_;
    my(@dirs,@plain_files,@all,$attempt_again,$attempt_count,@ours);
    my($file,$subdir,@genlist);

    local(*DIR);
    
    $attempt_count = 0;
    $attempt_again = 1;
    while($attempt_again)
      {
        # We have to go round again if any of the actions 
        # are triggered since that will change the filenames
        $attempt_count++;
        $attempt_again = 0;
        opendir(DIR,"$dir");
        @all = readdir(DIR);
        closedir(DIR);

        # Clear out the lists each time round
        @dirs = @plain_files = @ours = ();

        foreach $file (Sort::alpha(@all))
          {
            my($file_category,$i);
            
            # Filenames on Windows are not case sensative fold to lower case
            $file = lc($file) if($operating_system =~ /^MSWin/i);

            next if($file =~ /^\./);
            for($i = 1;$i<10;$i++)
              {
                # Look for special_action1..special_action9 for each file
                # give up looking as soon as one is not defined 
                my($action_name,$special_action,$result);
                
                $action_name = "special_action$i";
                $special_action = "";
                Attribute::get($dir,$action_name,\$special_action,1);
                last if(!$special_action);

                $result = eval($special_action);
                if($@)
                  {
                    ::add_output("eval on $dir/$file\{$action_name\} gave: $@\n")
                  }
                elsif($result && $attempt_count < 3)
                  {
                    $attempt_again = 1;
                  }
              }

            # If the special actions changed the filenames then we try
            # going round again
            next if($attempt_again);

            $file_category = FileCategory::classify($dir,$file,"webify");
            $fpage_present++ if($file_category eq "fpage");
            if($file_category eq "wfolio")
              {
                push(@ours,$file);
              }
            elsif($file_category eq "dir")
              {
                push(@dirs,$file);
              }
            elsif($file_category eq "ignore")
              {
                next;
              }
            else
              {
                push(@plain_files,$file);
              }
          }
      }

    if($#plain_files == -1 && $#dirs == -1)
      {
        add_output("Empty dir $dir\n") if(!$::ignore_empty_dirs);
        FileCategory::assign($dir,"empty");
      }

    # Remove old versions of our files
    foreach $file (@ours)
      {
        unlink("$dir/$file");
      }

    # First generate the pages in the subdirectories
    # and the counts and so on
    foreach $subdir (@dirs)
      {
        my($val);

        $val = "";
        Attribute::get("$dir/$subdir","prune",\$val,1);
        if($val)
          {
            GenName::set_pruned("$dir/$subdir");
            next;
          }
        &webify_dir("$dir/$subdir",1);
      }

    # Now we can generate the pages for this directory
    Variables::page_init;
    Variables::assign("dir_subdirs",@dirs);
    Variables::assign("dir_files",@plain_files);
    Variables::assign("dir_objects",Sort::alpha(@dirs,@plain_files));
    Variables::assign("isdir",1);
    Variables::assign("topdir",!$sub_dir);
    
    @genlist = ("index",$dir);

    while(@genlist)
      {
        local(*OUTPUT);
        my($page_type,$file_name,$page_def,$genname);

        Variables::assign("dir",$dir);
        $page_type = shift(@genlist);
        Variables::assign("pagetype",$page_type);
        $file_name = shift(@genlist);
        Variables::assign("filename",$file_name);
        Variables::assign("issubdir",$sub_dir);

        if(!Attribute::get($file_name,"${page_type}_pagedef",\$page_def))
          {
            add_output("Empty $page_type page definition for $file_name\n");
            next;
          }

        $genname = GenName::obtain($file_name,$page_type);
        if($genname)
          {
            open(OUTPUT,">$genname") or 
              (::add_output("Cannot write to $genname\n"),return);
            push(@genlist,Page::interpret($page_def,$file_name,\*OUTPUT));
            close(OUTPUT);
            ::set_hidden("$genname") 
                    if($::hide_wfolio && $page_type ne "index");
          }
        FileCounts::inc("wflio");
        FileCounts::inc("${flag_name}_${page_type}");

        Variables::page_init;
        Variables::assign("issecondary",1);
      }
  }

sub start_session ()
  {
    # We are running, this can only be called from the GUI
    my($out,$typ,$start_time);
    
    GUI::set_state("Running...");
    chdir($top_dir);
    GUI::activate_done('disabled',"Running");
    $start_time = time;
    session_init(1);

    # Generate the "standard view" of all the files in the hierarchy
    GUI::set_state("Generating WFolio Files");
    webify_dir(".");
    FileCounts::completed('wflio');
    # Now generate the specially crafted pages

    # Find elements that help (sounds, textual comments and original 
    # images).
    add_output("-"x40 . "\n");
    GUI::set_state("FPage Generation");
    FPage::run_session if(!$::no_fpage && $::fpage_present);
    # If we don't have any fpages to process we still want to 
    # say we have completed
    FileCounts::completed('fpage');
    
    # Tell the world that we are complete
    GUI::set_state("Completed");
    $out = "Web files produced\n";
    foreach $typ ("${flag_name}_index","${flag_name}_wflio",
                                 "${flag_name}_icon","wflio","fpage","icon","thumb")
      {
        my($c);
        $c = FileCounts::get($typ) - 1;
        $out .= sprintf("  %-12s: %d\n",$typ,$c);
      }
    $out .= "\n       Started: ".Time::time2str($start_time,'$hour24:$min:$sec')."\n";
    $out .= "     Completed: ".Time::time2str(time,'$hour24:$min:$sec')."\n";
    $out .= "      Duration: ".(time-$start_time)."s\n";
    $out .= "#"x40 . "\n";
    add_output($out);

    GUI::activate_done('active',"Rerun");
  }

sub add_output ($)
  {
    # Add a line on to the current output
    my($line) = @_;

    if($no_tk || !GUI::add_output($line))
      {
        print STDERR "$line";
      }
    carp($line);
  }
  
sub preprocess_scan (;$)
  {
    # Recursively look for wfolio files so 
    # we can extract the elements that define parameters for 
    # the webify and processing stages
    my($dir) = @_;
    my(@files,$f);
    local(*DIR);

    if(!$dir)
      {
        $dir = ".";
      }

    opendir(DIR,"$dir");
    @files = readdir(DIR);
    closedir(DIR);

    foreach $f (@files)
      {
        next if($f =~ m#^\.\.?$#);
        
        # Filenames on Windows are not case sensative
        $f = lc($f) if($operating_system =~ /^MSWin/i);

        # Add to the guessed total number of files we will be generating
        # (this won't be totally correct since we will be generating wflio 
        # files only for images and indexes for dirs so it will overestimate,
        # but it gives us a first pass for the progress bar)
        FileCounts::inc('wflio',1) if(!GenName::is_one_of_ours("$dir/$f"));
        if(-d "$dir/$f")
          {
            &preprocess_scan("$dir/$f");
          }
        if($f =~ /\.folio$/i)
          {
            read_wfolio($dir,"$dir/$f");
          }
      }
  }

sub read_wfolio ($$;$)
  {
    # Read all the attributes out of a folio file
    # if $start_list_ref is set then we are reading 
    # an fpage file instead
    my($dir,$file_name,$start_list_ref) = @_;
    my($line,$i);
    local(*INPUT);

    open(INPUT,$file_name) or 
      (
        # Use the obscure comma operator
        ::add_output("Cannot read from $file_name\n"),
        return
      );
      
    $i = "";
    while($line = <INPUT>)
      {
        chop($line);
        $line =~ s/^\s+//;
        $i .= $line;
        if($i =~ s#\\$##)
          {
            next;
          }
        $i =~ s/\\#/\&hash;/g;
        $i =~ s/#.*$//;
        $i =~ s/\&hash;/#/g;
        $i =~ s/\s+$//;
        next if(!$i);
        $i =~ s#\\n#\n#;
        next if(!$i);
        if($i =~ s/\<\<(\w+)$/\n/)
          {
            my($end) = ($1);
            
            $line = <INPUT>;
            while($line && !($line =~ /^\s*$end/))
              {
                $i .= $line;
                $line = <INPUT>;
              }
            if(!($line =~ /^\s*$end/))
              {
                add_output("Failed to find end matching <<$end in $dir/$file_name\n");
              }
          }

        # Allow empty an . paths to work
        $i =~ s#^\{#\.\{#;
        $i =~ s#^\.\{#\./\{#;
        
        if($i =~ s#^\s*([^\{]+)\{\s*([^\}\s]+)\s*\}\s*=\s*##)
          {
            # Set the appropriate parameter in %wfolio
            my($path,$attrib,$val) = ($1,$2,$i);
            $i = "";
            
            $path = Path::cannonicalise($path);

            # Special attributes work for both types of file
            if($path =~ m#^/+$#)
              {
                # Path is / set a global value
                if($attrib eq "icon_dir")
                  {
                    GenName::load_icons("$dir/$val");
                    next;
                  }
                elsif($attrib eq "pagedef_fun")
                  {
                    # Define a new function accesible from the pagedef
                    Page::add_fun($val);
                    next;
                  }
                elsif($attrib eq "global_var")
                  {
                    if($val =~ /^\s*\$\{([^\}\{]+)\}\s*=\s*(\S.*)$/)
                      {
                        Variables::global($1,$2);
                      }
                    else
                      {
                        ::add_output("Cannot parse global_var string $val\n");
                      }
                    next;
                  }
                elsif($attrib eq "global_var_rel")
                  {
                    if($val =~ /^\s*\$\{([^\}\{]+)\}\s*=\s*(\S.*)$/)
                      {
                        Variables::global($1,$2,$dir);
                      }
                    else
                      {
                        ::add_output("Cannot parse global_var string $val\n");
                      }
                    next;
                  }
                elsif($attrib eq "no_fpage")
                  {
                    $no_fpage = $val;
                    $no_fpage = "" if(!$val || $val eq ".");
                    next;
                  }
                elsif($attrib eq "simple_wflio")
                  {
                    $simple_wflio = $val;
                    $simple_wflio = "" if(!$val || $val eq ".");
                    next;
                  }
                elsif($attrib eq "ignore_empty_dirs")
                  {
                    $ignore_empty_dirs = $val;
                    $ignore_empty_dirs = "" if(!$val || $val eq ".");
                    next;
                  }
                elsif($attrib eq "hide_wfolio")
                  {
                    $hide_wfolio = $val;
                    $hide_wfolio = "" if(!$val || $val eq ".");
                    next;
                  }
                # If we get here then we have a value on root 
                # that we don't understand, treat it as an 
                # ordinary value
              }

            # Translate the path into the actual path
            my($real_path);
            
            if(!$path || $path eq ".")
              {
                $real_path = $dir;
              }
            elsif($path =~ s#^/##)
              {
                if($path)
                  {
                    $real_path = "./$path";
                  }
                else
                  {
                    $real_path = ".";
                  }
              }
            else
              {
                $real_path = "$dir/$path";
              }

            if($start_list_ref)
              {
                # Reading fpage file
                Attribute::set($real_path,$attrib,$val,"fpage");
                # push(@{$start_list_ref},$real_path)
                #       if($attrib eq "fpage_file_elements");
              }
            else
              {
                # Ordinary wfolio file
                Attribute::set($real_path,$attrib,$val);
              }
          }
        else
          {
            add_output("In $file_name cannot parse |$i|\n");
          }
        $i = "";
      }
    close(INPUT);
  }

sub session_init (;$)
  {
    # Some initialisation steps to run at the start of 
    # each processing session.  For example we have to
    # redefine the icons since they can be changed by 
    # running the program
    my($noisy) = @_;
    my($typ);
    
    # Initialise the file counts before defining the icons
    FileCounts::session_init;
    GenName::session_init;

    # Clear out previous values
    Attribute::session_init;

    Variables::session_init;

    GUI::set_state("Scanning for folio files") if($noisy);
    preprocess_scan();
  }

sub top_init_pre_cmdline ()
  {
    # This function is called right at the start, it is where 
    # we define variables and stuff that is needed before the 
    # command line options are parsed
    
    # I could just use $^O here but I have an aversion to 
    # putting control characters in scripts
    $operating_system = eval(sprintf('$%c',0xf));
    $default_mil = "01";

    # To help when debugging
    $,=", ";
    
    # Read the configuration
    define_config();

    Page::top_init();
  }

sub top_init_post_cmdline ()
  {
    # here are the initialisation steps that have to wait 
    # until the command line options have been loaded 
    # (because they can be modified and control the behaviour)

    FileCounts::top_init();
    GenName::top_init(${flag_name},5,Image::default_type());

    if($start_dir && $start_dir ne ".")
      {
        chdir($start_dir);
      }
    $top_dir = Cwd::getcwd();
    
    if($help)
      {
        Document::print;
        exit(0);
      }
    $operating_system = $force_os 
                    if($force_os && $force_os ne "N/A");
    
    if($operating_system =~ /^MSWin/i)
      {
        $top_dir = lc($top_dir);
        if(!require_if_present("Win32"))
          {
            $no_win32 = 1;
          }
        elsif(!require_if_present("Win32::File"))
          {
            $no_win32 = 1;
          }
        elsif(!require_if_present("Win32API::File"))
          {
            $no_win32API = 1;
          }
      }

    if(!$no_tk)
      {
        if(require_if_present("Tk"))
          {
            require_if_present("Tk::DialogBox");
            if($no_fileselect || !require_if_present("Tk::FileSelect"))
              {
                $no_fileselect = 1;
              }
            if($no_progress || !require_if_present("Tk::ProgressBar"))
              {
                $no_progress = 1;
              }
            if($no_dirtree || !require_if_present("Tk::DirTree"))
              {
                $no_dirtree = 1;
              }
          }
        else
          {
            $no_tk = 1;
          }
      }
  }

sub define_config ()
  {
    # In here we define the various elements that make the program 
    # work.  Using this rather odd structure allows us to mix up the
    # definition with the documentation (making it easier to maintain
    # even if it was more difficult to write).
    my(%attrib,@defaults,$line,$attrib);

    (@defaults) = split(/\n\>\>/,<<'EndDefaults');

>>htmltag~~a~~4.0~~
HTML Link

>>htmltag~~abbr~~4.0~~
Abbreviation Text (introduced in 4.0)

>>htmltag~~acronym~~4.0~~
Acronym Text (introduced in 4.0)

>>htmltag~~address~~4.0~~
Adress Text

>>htmltag~~applet~~4.0D~~
Applet

>>htmltag~~area~~4.0~~
Area in client side imagemap

>>htmltag~~b~~4.0~~
Bold Text

>>htmltag~~base~~4.0~~
Page base address

>>htmltag~~basefont~~4.0D~~
Basefont of Document

>>htmltag~~bdo~~4.0~~
Bidirectional Override

>>htmltag~~bgsound~~IE~~
Background Sound

>>htmltag~~big~~4.0~~
Big Text

>>htmltag~~blink~~NN~~
Blink Text (Just Say No)

>>htmltag~~blockquote~~4.0~~
Blockquote Text

>>htmltag~~body~~4.0~~
Body of the page

>>htmltag~~br~~4.0~~
Break

>>htmltag~~button~~4.0~~
Button in Form (Not Netscape)

>>htmltag~~caption~~4.0~~
Caption of table

>>htmltag~~center~~4.0D~~
Centred Text

>>htmltag~~cite~~4.0~~
Citation Text

>>htmltag~~code~~4.0~~
Code Text

>>htmltag~~col~~4.0~~
Column (Not Netscape)

>>htmltag~~colgroup~~4.0~~
Column Group

>>htmltag~~comment~~IE~~
Comment

>>htmltag~~dd~~4.0~~
Definition

>>htmltag~~del~~4.0~~
Deleted Text

>>htmltag~~dfn~~4.0~~
Defining Instance

>>htmltag~~dir~~4.0D~~
Directory Listing

>>htmltag~~div~~4.0~~
Division

>>htmltag~~dl~~4.0~~
Definition List

>>htmltag~~dt~~4.0~~
Definition Term

>>htmltag~~em~~4.0~~
Emphasised Text

>>htmltag~~embed~~3.0~~
Embeded Object

>>htmltag~~fieldset~~4.0~~
Fieldset

>>htmltag~~font~~4.0D~~
Font Style

>>htmltag~~form~~4.0~~
Input Form

>>htmltag~~frame~~4.0~~
Frame

>>htmltag~~frameset~~4.0~~
Frameset

>>htmltag~~h1~~4.0~~
Heading 1

>>htmltag~~h2~~4.0~~
Heading 2

>>htmltag~~h3~~4.0~~
Heading 3

>>htmltag~~h4~~4.0~~
Heading 4

>>htmltag~~h5~~4.0~~
Heading 5

>>htmltag~~h6~~4.0~~
Heading 6

>>htmltag~~head~~4.0~~
The document's {{html_href}} attributes

>>htmltag~~hr~~4.0~~
Horizontal Rule

>>htmltag~~html~~4.0~~
Top level entity

>>htmltag~~i~~4.0~~
Italic Text

>>htmltag~~iframe~~4.0~~
Inline Frame

>>htmltag~~ilayer~~NN~~
Inline layer

>>htmltag~~img~~4.0~~
Image

>>htmltag~~input~~4.0~~
Input

>>htmltag~~ins~~4.0~~
Inserted Text

>>htmltag~~isindex~~4.0~~
Document is searchable Index

>>htmltag~~kbd~~4.0~~
Keyboard Text

>>htmltag~~keygen~~NN~~
Assists in generating public keys

>>htmltag~~label~~4.0~~
Label in Form

>>htmltag~~layer~~NN~~
Layer

>>htmltag~~legend~~4.0~~
Legend in Form

>>htmltag~~li~~4.0~~
List Item

>>htmltag~~link~~4.0~~
Link to another page

>>htmltag~~map~~4.0~~
Image map definition

>>htmltag~~marquee~~IE~~
Marquee

>>htmltag~~menu~~4.0D~~
Menu in form

>>htmltag~~meta~~4.0~~
Meta information

>>htmltag~~multicol~~NN~~
Multi-Column Text

>>htmltag~~nobr~~3.0~~
No break section

>>htmltag~~noembed~~NN~~
Contents when embed not supported

>>htmltag~~noframes~~4.0~~
Contents for Frameless browsers

>>htmltag~~nolayer~~NN~~
Alternate text for Layerless browsers

>>htmltag~~noscript~~NN~~
Contents for scriptless browsers

>>htmltag~~object~~4.0~~
Object

>>htmltag~~ol~~4.0~~
Ordered List

>>htmltag~~optgroup~~4.0~~
Option Group in Form

>>htmltag~~option~~4.0~~
Option List in Form

>>htmltag~~p~~4.0~~
Paragraph

>>htmltag~~param~~4.0~~
Parameter

>>htmltag~~pre~~4.0~~
Preformated Text

>>htmltag~~q~~4.0~~
Quotation Text

>>htmltag~~s~~4.0D~~
Strike-Through Text

>>htmltag~~samp~~4.0~~
Sample Text

>>htmltag~~script~~4.0~~
Script on page

>>htmltag~~select~~4.0~~
Selection Menu in form

>>htmltag~~server~~NN~~
Server side JavaScript application

>>htmltag~~small~~4.0~~
Small Text

>>htmltag~~spacer~~NN~~
Spacer

>>htmltag~~span~~4.0~~
Span

>>htmltag~~strike~~4.0D~~
Strike-Through Text

>>htmltag~~strong~~4.0~~
Emphasised Text

>>htmltag~~style~~4.0~~
Text Style from Stylesheet

>>htmltag~~sub~~4.0~~
Subscript Text

>>htmltag~~sup~~4.0~~
Superscript Text

>>htmltag~~table~~4.0~~
Table

>>htmltag~~tbody~~4.0~~
Table Body

>>htmltag~~td~~4.0~~
Table data cell

>>htmltag~~textarea~~4.0~~
Text area in form

>>htmltag~~tfoot~~4.0~~
Table Footer Row

>>htmltag~~th~~4.0~~
Table Header Row

>>htmltag~~thead~~4.0~~
Table Head

>>htmltag~~title~~4.0~~
Page title

>>htmltag~~tr~~4.0~~
Table Row

>>htmltag~~tt~~4.0~~
Fixed width text

>>htmltag~~u~~4.0D~~
Underlined text

>>htmltag~~ul~~4.0~~
Unordered List

>>htmltag~~var~~4.0~~
Variable

>>htmltag~~wbr~~3.0~~
Wordbreak

>>tagattrib~~img~~dynsrc~~dynsrc~~IE~~
Dynamic Source

>>tagattrib~~img~~controls~~controls~~IE~~
Controls for multimedia

>>tagattrib~~[img,marquee]~~loop~~loop~~IE~~
Loop animation

>>tagattrib~~img~~startwhen~~start~~IE~~
When to start

>>tagattrib~~[frame,frameset]~~bordercolor~~bordercolor~~4.0~~
Colour of border (select from {{colours_href}})

>>tagattrib~~[table,td,th,tr]~~bordercolor~~bordercolor~~IE~~
3D Effects for tables (select from {{colours_href}})

>>tagattrib~~[table,td,th,tr]~~bordercolordark~~bordercolordark~~IE~~
3D Effects for tables (select from {{colours_href}})

>>tagattrib~~[table,td,th,tr]~~bordercolorlight~~bordercolorlight~~IE~~
3D Effects for tables (select from {{colours_href}})

>>tagattrib~~[a,link]~~urn~~urn~~DU~~
URN for target (since URN format is not defined don't use)

>>tagattrib~~link~~methods~~methods~~DU~~
List of processing methods, rarely used

>>tagattrib~~a~~method~~method~~DU~~
List of processing methods, rarely used

>>tagattrib~~[td,th]~~abbreviation~~abbr~~4.0~~
Abbreviation

>>tagattrib~~[form,input]~~accept-charset~~accept-charset~~4.0~~
List of supported charsets 

>>tagattrib~~[form,input]~~accept~~accept~~4.0~~
List of MIME types for file upload 

>>tagattrib~~[a,area,button,input,label,legend,textarea]~~accesskey~~accesskey~~4.0~~
Defines single key that accesses element

>>tagattrib~~form~~action~~action~~4.0~~
Server-side form handler 

>>tagattrib~~body~~activecolor~~alink~~4.0D~~
Color of selected links  (select from {{colours_href}})

>>tagattrib~~[applet,button,caption,col,colgroup,div,h1,h2,h3,h4,h5,h6,hr,iframe,img,input,legend,object,p,table,tbody,thead,tfoot,td,th,tr]~~align~~align~~4.0D~~
Vertical or horizontal alignment 

>>tagattrib~~[embed,spacer]~~align~~align~~3.0~~
Vertical or horizontal alignment 

>>tagattrib~~embed~~hide~~hidden~~3.0~~
Hide embedded object

>>tagattrib~~embed~~autostart~~autostart~~3.0~~
Automatically start embedded object set to {{st}}false{{et}} to 
not have the sound start

>>tagattrib~~embed~~units~~units~~3.0~~
Define measurement units

>>tagattrib~~[col,colgroup,tbody,thead,td,th,tfoot]~~alignchar~~char~~4.0~~
Character upon which column will align

>>tagattrib~~[area,img,input]~~alt~~alt~~4.0~~
Short description 

>>tagattrib~~[embed]~~alt~~alt~~IE~~
Short description 

>>tagattrib~~applet~~alt~~alt~~4.0D~~
Short description 

>>tagattrib~~applet~~archive~~archive~~4.0D~~
Comma-separated archive list 

>>tagattrib~~object~~archive~~archive~~4.0~~
Comma-separated archive list 

>>tagattrib~~[td,th]~~axis~~axis~~4.0~~
Comma-separated list of related headers 

>>tagattrib~~embed~~border~~border~~NN~~
Controls border width

>>tagattrib~~[embed]~~borderon~~frameborder~~NN~~
Controls border visability

>>tagattrib~~[frameset,iframe,frame]~~borderon~~frameborder~~4.0~~
Controls border visability

>>tagattrib~~[frameset]~~spacing~~framespacing~~IE~~
Spacing between frames

>>tagattrib~~[table,button]~~border~~border~~4.0~~
Controls border width

>>tagattrib~~[img,object]~~border~~border~~4.0D~~
Controls border width

>>tagattrib~~button~~buttoncolor~~bgcolor~~4.0~~
Background color for buttons (select from {{colours_href}})

>>tagattrib~~table~~cellpadding~~cellpadding~~4.0~~
Spacing within cells 

>>tagattrib~~table~~cellspacing~~cellspacing~~4.0~~
Spacing between cells 

>>tagattrib~~[col,colgroup,tbody,thead,tfoot]~~charoff~~charoff~~4.0~~
Offset for alignment char 

>>tagattrib~~[a,link,script]~~charset~~charset~~4.0~~
Char encoding of linked resource 

>>tagattrib~~input~~checked~~checked~~4.0~~
For radio buttons and check boxes 

>>tagattrib~~[blockquote,del,ins,q]~~cite~~cite~~4.0~~
URI for source document or msg 

>>tagattrib~~[a,abbr,acronym,address,applet,area,b,bdo,big,blockquote,body,br,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,font,form,frame,frameset,h1,h2,h3,h4,h5,h6,hr,i,iframe,img,input,ins,isindex,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~tagclass~~class~~4.0~~
Space-separated list of classes 

>>tagattrib~~object~~classid~~classid~~4.0~~
Identifies an implementation 

>>tagattrib~~br~~clear~~clear~~4.0D~~
Control of text flow 

>>tagattrib~~applet~~code~~code~~4.0D~~
Applet class file 

>>tagattrib~~embed~~code~~code~~IE~~
Applet class file 

>>tagattrib~~embed~~codebase~~codease~~IE~~
Optional base URI for object

>>tagattrib~~object~~codebase~~codebase~~4.0~~
Optional base URI for object

>>tagattrib~~applet~~codebase~~codebase~~4.0D~~
Optional base URI for applet 

>>tagattrib~~object~~codetype~~codetype~~4.0~~
Content type for code 

>>tagattrib~~[table,td,th,tr]~~colcolor~~bgcolor~~4.0~~
Background color (select from {{colours_href}})

>>tagattrib~~[frameset,textarea]~~charwidth~~cols~~4.0~~
Width in characters

>>tagattrib~~col~~colspan~~span~~4.0~~
Number of cols spanned by column

>>tagattrib~~[td,th]~~colspan~~colspan~~4.0~~
Number of cols spanned by cell 

>>tagattrib~~[dir,dl,menu,ol,ul]~~compact~~compact~~4.0~~
Reduced interitem spacing 

>>tagattrib~~meta~~content~~content~~4.0~~
Associated information 

>>tagattrib~~[a,area]~~coords~~coords~~4.0~~
Coordinates for use with client-side image maps

>>tagattrib~~object~~data~~data~~4.0~~
Reference to object's data 

>>tagattrib~~button~~datapagesize~~datapagesize~~4.0~~
Reserved for possible future use 

>>tagattrib~~[del,ins]~~datetime~~datetime~~4.0~~
Date and time of change 

>>tagattrib~~object~~declare~~declare~~3.0~~
Declare but don't instantiate flag 

>>tagattrib~~object~~shapes~~shapes~~4.0~~
Indicates the object contains an imagemap

>>tagattrib~~script~~defer~~defer~~4.0~~
UA may defer execution of script 

>>tagattrib~~[button,input,optgroup,option,select,textarea]~~disabled~~disabled~~4.0~~
Unavailable in this context 

>>tagattrib~~form~~enctype~~enctype~~4.0~~
"application/x-www-form-urlencoded"

>>tagattrib~~script~~event~~event~~4.0~~
Reserved for possible future use 

>>tagattrib~~[basefont,font]~~fontname~~face~~IE~~
Comma-separated list of font names 

>>tagattrib~~[basefont,font]~~fontsize~~size~~4.0~~
Base font size for FONT elements 

>>tagattrib~~[label,script]~~for~~for~~4.0~~
Matches field ID value 

>>tagattrib~~table~~frame~~frame~~4.0~~
Where to draw borders (not supported by Netscape)

>>tagattrib~~[td,th]~~headers~~headers~~4.0~~
List of id's for header cells 

>>tagattrib~~[applet,embed,iframe,img,object,spacer,table,td,th]~~height~~height~~4.0~~
Initial height 

>>tagattrib~~hr~~height~~size~~4.0~~
Height

>>tagattrib~~[a,area,base,link]~~href~~href~~4.0~~
URI for linked resource 

>>tagattrib~~[a,link]~~hreflanguage~~hreflang~~4.0~~
Language code for target

>>tagattrib~~[applet,embed,img,object,marquee,table,iframe]~~hspace~~hspace~~4.0~~
Horizontal gutter 

>>tagattrib~~meta~~http-equiv~~http-equiv~~4.0~~
HTTP response header name  

>>tagattrib~~spacer~~spacetype~~type~~NN~~
Type of space to insert

>>tagattrib~~spacer~~size~~size~~NN~~
Size of spacer (direction depends on type)

>>tagattrib~~[a,abbr,acronym,address,applet,area,b,bdo,big,blockquote,body,br,button,center,cite,code,col,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,font,form,frame,frameset,h1,h2,h3,h4,h5,h6,hr,i,iframe,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,param,pre,q,s,samp,script,select,small,span,strike,strong,style,sub,sup,table,tbody,thead,tfoot,td,textarea,th,tr,tt,u,ul,var]~~tagid~~id~~4.0~~
Document-wide unique id 

>>tagattrib~~[nobr,noembed,wbr]~~tagid~~id~~3.0~~
Document-wide unique id 

>>tagattrib~~multicol~~columns~~cols~~NN~~
Number of columns

>>tagattrib~~multicol~~gutter~~gutter~~NN~~
Space in pixels between columns

>>tagattrib~~[multicol,spacer]~~width~~width~~NN~~
Width in pixels

>>tagattrib~~[blink,ilayer,keygen,layer,nolayer,server]~~tagid~~id~~NN~~
Document-wide unique id 

>>tagattrib~~[caption,comment,isindex]~~tagid~~id~~IE~~
Document-wide unique id 

>>tagattrib~~marquee~~align~~align~~IE~~
Vertical or horizontal alignment 

>>tagattrib~~marquee~~behavior~~behavior~~IE~~
How scrolled text should behave

>>tagattrib~~marquee~~direction~~direction~~IE~~
Direction that text scrolls

>>tagattrib~~marquee~~speed~~scrollamount~~IE~~
Speed of scrolling

>>tagattrib~~marquee~~delay~~scrolldelay~~IE~~
Delay between jumps

>>tagattrib~~img~~lowsrc~~lowsrc~~3.0~~
Low resolution version of image

>>tagattrib~~[img,input]~~ismap~~ismap~~4.0~~
Use server-side image map 

>>tagattrib~~[optgroup,option]~~label~~label~~4.0~~
For use in hierarchical menus 

>>tagattrib~~[a,abbr,acronym,address,area,b,bdo,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,font,form,h1,h2,h3,h4,h5,h6,head,hr,html,i,img,input,ins,isindex,kbd,label,legend,li,link,map,menu,meta,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,style,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,title,tt,u,ul,var]~~language~~lang~~4.0~~
Language code 

>>tagattrib~~body~~linkcolor~~link~~4.0~~
Color of links  (select from {{colours_href}})

>>tagattrib~~[frame,iframe,img]~~description~~longdesc~~4.0~~
Link to long description

>>tagattrib~~[frame,iframe]~~marginheight~~marginheight~~4.0~~
Margin height in pixels 

>>tagattrib~~body~~marginheight~~topmargin,marginheight~~4.0~~
Margin height in pixels 

>>tagattrib~~body~~marginwidth~~leftmargin,marginwidth~~4.0~~
Margin widths in pixels 

>>tagattrib~~[frame,iframe]~~marginwidth~~marginwidth~~4.0~~
Margin widths in pixels 

>>tagattrib~~frameset~~borderwidth~~border~~4.0~~
Border widths in pixels 

>>tagattrib~~input~~maxlength~~maxlength~~4.0~~
Max chars for text fields 

>>tagattrib~~[link,style]~~media~~media~~4.0~~
For rendering on these media 

>>tagattrib~~form~~method~~method~~4.0~~
HTTP method used to submit the form 

>>tagattrib~~select~~multiple~~multiple~~4.0~~
Default is single selection 

>>tagattrib~~embed~~palette~~palette~~3.0~~
The color palette to use on Windows

>>tagattrib~~embed~~pluginspage~~pluginspage,pluginurl~~3.0~~
Where to obtain a matching plugin

>>tagattrib~~[a,applet,button,embed,form,frame,iframe,img,input,map,meta,object,param,select,textarea]~~name~~name~~4.0~~
Named link target

>>tagattrib~~area~~nohref~~nohref~~4.0~~
This region has no action 

>>tagattrib~~[frame,iframe]~~noresize~~noresize~~4.0~~
Allow users to resize frames? 

>>tagattrib~~hr~~noshade~~noshade~~4.0~~
Don't shade

>>tagattrib~~[td,th]~~nowrap~~nowrap~~4.0~~
Suppress word wrap 

>>tagattrib~~applet~~object~~object~~4.0~~
Serialized applet file 

>>tagattrib~~[a,area,button,input,label,select,textarea]~~onblur~~onblur~~4.0~~
The element lost the focus 

>>tagattrib~~[input,select,textarea]~~onchange~~onchange~~4.0~~
The element value was changed 

>>tagattrib~~[a,abbr,acronym,address,area,b,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,form,h1,h2,h3,h4,h5,h6,hr,i,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~onclick~~onclick~~4.0~~
A pointer button was clicked 

>>tagattrib~~[a,abbr,acronym,address,area,b,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,form,h1,h2,h3,h4,h5,h6,hr,i,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~ondblclick~~ondblclick~~4.0~~
A pointer button was double clicked 

>>tagattrib~~[a,area,button,input,label,select,textarea]~~onfocus~~onfocus~~4.0~~
The element got the focus 

>>tagattrib~~[a,abbr,acronym,address,area,b,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,form,h1,h2,h3,h4,h5,h6,hr,i,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~onkeydown~~onkeydown~~4.0~~
A key was pressed down 

>>tagattrib~~[a,abbr,acronym,address,area,b,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,form,h1,h2,h3,h4,h5,h6,hr,i,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~onkeypress~~onkeypress~~4.0~~
A key was pressed and released 

>>tagattrib~~[a,abbr,acronym,address,area,b,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,form,h1,h2,h3,h4,h5,h6,hr,i,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~onkeyup~~onkeyup~~4.0~~
A key was released 

>>tagattrib~~[body,frameset]~~onload~~onload~~4.0~~
The document has been loaded 

>>tagattrib~~[a,abbr,acronym,address,area,b,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,form,h1,h2,h3,h4,h5,h6,hr,i,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~onmousedown~~onmousedown~~4.0~~
A pointer button was pressed down 

>>tagattrib~~[a,abbr,acronym,address,area,b,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,form,h1,h2,h3,h4,h5,h6,hr,i,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~onmousemove~~onmousemove~~4.0~~
A pointer was moved within 

>>tagattrib~~[a,abbr,acronym,address,area,b,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,form,h1,h2,h3,h4,h5,h6,hr,i,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~onmouseout~~onmouseout~~4.0~~
A pointer was moved away 

>>tagattrib~~[a,abbr,acronym,address,area,b,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,form,h1,h2,h3,h4,h5,h6,hr,i,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~onmouseover~~onmouseover~~4.0~~
A pointer was moved onto 

>>tagattrib~~[a,abbr,acronym,address,area,b,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,form,h1,h2,h3,h4,h5,h6,hr,i,img,input,ins,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~onmouseup~~onmouseup~~4.0~~
A pointer button was released 

>>tagattrib~~form~~onreset~~onreset~~4.0~~
The form was reset 

>>tagattrib~~[input,textarea]~~onselect~~onselect~~4.0~~
Some text was selected 

>>tagattrib~~form~~onsubmit~~onsubmit~~4.0~~
The form was submitted 

>>tagattrib~~[body,frameset]~~onunload~~onunload~~4.0~~
The document has been removed 

>>tagattrib~~[marquee]~~pagecolor~~bgcolor~~4.0D~~
Background color  (select from {{colours_href}})

>>tagattrib~~body~~pagecolor~~bgcolor~~4.0D~~
Document background color  (select from {{colours_href}})

>>tagattrib~~[table,td,th,tr]~~backimage~~background~~3.0~~
Image to use as background for table

>>tagattrib~~body~~pageimage~~background~~4.0D~~
The background image to use

>>tagattrib~~body~~pageimageattrib~~bgproperties~~IE~~
If "fixed" will make the background image not scroll

>>tagattrib~~head~~profile~~profile~~4.0~~
Named dictionary of meta info 

>>tagattrib~~isindex~~prompt~~prompt~~4.0~~
Prompt message >

>>tagattrib~~[input,textarea]~~readonly~~readonly~~4.0~~
For text and passwd 

>>tagattrib~~[a,link]~~rellink~~rel~~IE~~
Forward link types 

>>tagattrib~~[a,link]~~revlink~~rev~~IE~~
Reverse link types 

>>tagattrib~~[frameset,textarea]~~charheight~~rows~~4.0~~
Height in characters

>>tagattrib~~textarea~~wrap~~wrap~~4.0~~
Defines if text wraps

>>tagattrib~~[td,th]~~rowspan~~rowspan~~4.0~~
Number of rows spanned by cell 

>>tagattrib~~table~~rules~~rules~~4.0~~
Rulings between rows and cols 

>>tagattrib~~meta~~scheme~~scheme~~4.0~~
Select form of content 

>>tagattrib~~[td,th]~~scope~~scope~~4.0~~
Scope covered by header cells 

>>tagattrib~~script~~scriptlanguage~~language~~4.0D~~
Predefined script language name 

>>tagattrib~~script~~scripttype~~type~~4.0~~
Type of script language (replaces language)

>>tagattrib~~embed~~mimetype~~type~~NN~~
MIME type of pluging required

>>tagattrib~~[frame,iframe]~~scrolling~~scrolling~~4.0~~
Scrollbar or none 

>>tagattrib~~option~~selected~~selected~~4.0~~
If starts selected

>>tagattrib~~[a,area]~~shape~~shape~~4.0~~
Shape of region for use with client-side image maps

>>tagattrib~~[input,select]~~size~~size~~4.0~~
Specific to each type of field 

>>tagattrib~~colgroup~~colspan~~span~~4.0~~
COL attributes affect N columns 

>>tagattrib~~[frame,embed,iframe,img,input,script]~~src~~src~~4.0~~
Source of contents

>>tagattrib~~bgsound~~src~~src~~IE~~
Source of contents

>>tagattrib~~bgsound~~loop~~loop~~IE~~
Control the looping of sound

>>tagattrib~~object~~standby~~standby~~4.0~~
Message to show while loading 

>>tagattrib~~ol~~startnumber~~start~~4.0~~
Starting sequence number 

>>tagattrib~~[a,abbr,acronym,address,applet,area,b,bdo,big,blockquote,body,br,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,font,form,frame,frameset,h1,h2,h3,h4,h5,h6,hr,i,iframe,img,input,ins,isindex,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~tagstyle~~style~~4.0~~
Associated style info 

>>tagattrib~~table~~summary~~summary~~4.0~~
Purpose/structure for speech output 

>>tagattrib~~[a,area,button,input,object,select,textarea]~~tabindex~~tabindex~~4.0~~
Position in tabbing order 

>>tagattrib~~[a,area,base,form,link]~~target~~target~~4.0~~
Name of window or frame containing target

>>tagattrib~~[basefont,font]~~textcolor~~color~~4.0~~
Text color  (select from {{colours_href}})

>>tagattrib~~body~~textcolor~~text~~4.0~~
Document text color  (select from {{colours_href}})

>>tagattrib~~[a,abbr,acronym,address,area,b,bdo,big,blockquote,body,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,font,form,h1,h2,h3,h4,h5,h6,head,hr,html,i,img,input,ins,isindex,kbd,label,legend,li,link,map,menu,meta,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,style,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,title,tt,u,ul,var]~~textdirection~~dir~~4.0~~
Direction for weak/neutral text 

>>tagattrib~~[a,abbr,acronym,address,applet,area,b,bdo,big,blockquote,body,br,button,caption,center,cite,code,colgroup,dd,del,dfn,dir,div,dl,dt,em,fieldset,font,form,frame,frameset,h1,h2,h3,h4,h5,h6,hr,i,iframe,img,input,ins,isindex,kbd,label,legend,li,link,map,menu,noframes,noscript,object,ol,optgroup,option,p,pre,q,s,samp,select,small,span,strike,strong,style,sub,sup,table,tbody,tr,thead,tfoot,td,th,textarea,tt,u,ul,var]~~tagtitle~~title~~4.0~~
Advisory title for the tag (used in stylesheets?)

>>tagattrib~~style~~languagetype~~type~~4.0~~
Content type of style language 

>>tagattrib~~[menu,ol,ul]~~bullettype~~type~~4.0D~~
Define type of bullet

>>tagattrib~~input~~inputtype~~type~~4.0~~
Type of input element (e.g. checkbox)

>>tagattrib~~[a,button,li,link,object,param]~~type~~type~~4.0~~
Advisory content type 

>>tagattrib~~[img,input,object]~~usemap~~usemap~~4.0~~
Use client-side image map 

>>tagattrib~~caption~~summary~~summary~~4.0~~
Description of table for speech or Braille

>>tagattrib~~[caption,col,colgroup,tbody,tr,thead,td,th]~~valign~~valign~~4.0~~
Vertical alignment

>>tagattrib~~li~~itemnumber~~value~~4.0~~
Sets the number (subsequent items are increments)

>>tagattrib~~[button,input,option,param]~~value~~value~~4.0~~
Sent to server when submitted 

>>tagattrib~~param~~valuetype~~valuetype~~4.0~~
How to interpret value 

>>tagattrib~~body~~visitcolor~~vlink~~4.0~~
Color of visited links  (select from {{colours_href}})

>>tagattrib~~[applet,embed,img,object,marquee,table,iframe]~~vspace~~vspace~~4.0~~
Vertical gutter 

>>tagattrib~~[applet,button,col,colgroup,embed,hr,iframe,img,object,pre,marquee,table]~~width~~width~~4.0~~
Initial width 

>>pagefun~~attrib_quiet~~attrib_name~~
Like {{st}}attrib{{et}} but does not complain if the value has not been 
defined.

>>pagefun~~attrib~~attrib_name~~
Returns the value of the attribute called {{st}}<i>variable</i>{{et}}
for the current page. 
The current section defines some places to look first, so if 
the function is called within a section called {{st}}dirindex{{et}} which 
is itself in a section called {{st}}index{{et}}, the function 
{{st}}attrib:("name"){{et}} will first try and find a value for 
{{st}}dirindex_name{{et}} then a value for {{st}}index_name{{et}}
and finally a value for {{st}}name{{et}}.  If any of these return a value
other than {{st}}.{{et}} that will be used (including the value {{st}}**null**{{et}}
which sets the result to be empty.

>>pagefun~~regex~~str pattern~~
Does a Perl regex of the pattern against the string. 
Can be used for example to determine if a string contains 
a text pattern like {{st}}regex:("one two three","two"){{et}}.

>>pagefun~~backout~~val~~
Reverses the effects of the tags in the argument.  So for example if we 
set {{st}}${start_phrase}{{et}} to {{st}}"&lt;font|fontsize=-1>&lt;b>"{{et}}
then {{st}}backout:(${start_phrase}){{et}} will work out the 
tags to undo the style changes that is {{st}}&lt;/b>&lt;/font>{{et}}

>>pagefun~~reverse~~list~~
Reverses the order of a list

>>pagefun~~not~~expr~~
Inverts the boolean value of the argument.

>>pagefun~~cannonical~~path~~
Tidies up the file name, returning a consistent version.   So 
{{st}}cannonical:("foo/bar"){{et}} returns the same value as 
{{st}}cannonical:("./jim/..///foo/bar"){{et}}.

>>pagefun~~render~~dir file separator~~
Returns a string suitable for rendering the file in the directory.  
If the result contains any text then the separator is appended.

>>pagefun~~iconfile~~dir icon_name~~
Returns the name of a file containing the selected icon within the 
target directory.

>>pagefun~~icon~~dir cat target sep~~
Returns a suitable icon that links to the target within the selected
directory.  If there are any contents the separator is appended.

>>pagefun~~join~~list1 list2~~
Concatenate two lists

>>pagefun~~undef~~~~
Returns an undefined value, used to unset variables.

>>pagefun~~is_dir~~file~~
Returns true if the file is a directory

>>pagefun~~has_wflio~~file~~
Returns a true value if the target file has an associated {{wflio_href}} file.

>>pagefun~~set_wflink~~filefrom relation fileto~~
Defines the relationship between thye two files, for example 
{{st}}set_wflink:("a.jpg","left","b.jpg"){{et}} says that the 
{{st}}b.jpg{{et}} is to the left of the {{st}}a.jpg{{et}}
file.  In this case we would also normally also set the 
reverse relationship as well ({{st}}set_wflink:("b.jpg","right","a.jpg"){{et}}).

>>pagefun~~genname_rel~~target filetype~~
Generate a name that represents the target suitable for use in the 
same directory.

>>pagefun~~genname_abs~~target filetype~~
Generate a name that represents the target suitable for use in any 
directory.

>>pagefun~~var~~var_name~~
The value of the variable

>>pagefun~~split~~list~~
Split a string into a list of values based on spaces

>>pagefun~~sortlex~~list~~
Sort a list lexographically (i.e. {{st}}a9{{et}}
come before {{st}}a10{{et}} and {{st}}B9{{et}}).

>>pagefun~~sortalpha~~list~~
Sort a list ignoring case.

>>pagefun~~sortascii~~list~~
Sort a list in ASCII order.

>>wflio~~wflio_pagedef~~~~
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
#section wflio

#if attrib_quiet:("topcomment")
<!-- $[topcomment] -->
#endif

<html><head>

#if attrib_quiet:("pagetitle")
  #set ${page_title} attrib:("pagetitle")
#else
  #set ${page_title} "WFolio File for ${filename}"
#endif
  <title>${page_title}</title>

#if attrib_quiet:("baseref")
  <base|href=$[baseref]/>
#endif

#foreach ${linkrel} sortlex:(split:(attrib:("rellinks")))
  <link+linkrel${linkrel}|rel=${linkrel}/>
#endforeach

#foreach ${linkrev} sortlex:(split:(attrib:("revlinks")))
  <link+linkrev${linkrev}|rev=${linkrev}/>
#endforeach

#foreach ${metatag} split:(attrib:("metatags"))
#if attrib_quiet:(var:("metatag"))
#set ${content} attrib:(var:("metatag"))
  <meta+${metatag}|http-equiv=${metatag}|\
    content=${content}/>
#endif
#endforeach

</head>$[start_body]

#if not:(attrib_quiet:("notitle"))
#if attrib_quiet:("pagetitle")
  <h1>$[pagetitle]</h1>
#else
  <h1>${page_title}</h1>
#endif
#endif

  $[pre_text]
  <p>
#set ${para_started} 1
#rem The connection to the index page
#if attrib_quiet:("_index_wflink")
  #set ${index_wf_file} genname_rel:("$[_dirname]/$[_index_wflink]","wflio")
  #output icon:(${filename},"index",${index_wf_file},"&nbsp")
#endif

#if attrib_quiet:("_left_wflink")
  #set ${left_wf_file} genname_rel:("$[_dirname]/$[_left_wflink]","wflio")
  #output icon:(${filename},"left",${left_wf_file},"&nbsp")
#endif

  $[filename_style]
  $[_filename]
  #output backout:($[filename_style])
  #if $[created_flag] ne "none"
    $[created_style]$[created_flag]
    #output backout:($[created_style])
  #endif
#if attrib_quiet:("_right_wflink")
  #set ${right_wf_file} genname_rel:("$[_dirname]/$[_right_wflink]","wflio")
  #output icon:(${filename},"right",${right_wf_file},"&nbsp")
#endif
  #if not:(attrib_quiet:("singlepara"))
  </p><p>
  #endif
  <img+wflioimg|src=$[_filename]/>
  #if ${para_started}
  </p>
  #endif
  $[post_text]

#output backout:($[start_body])
</html>
#endsection
~~
The {{pagedef_href}} for the {{wflio_href}} pages

>>wflio~~index_pagedef~~~~
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
#section index

#set ${cfilename} cannonical:(${filename})

#if attrib_quiet:("topcomment")
<!-- $[topcomment] -->
#endif

<html><head>

#if attrib_quiet:("pagetitle")
  #set ${page_title} attrib:("pagetitle")
#elsif ${topdir}
  #set ${page_title} "Top Generated Page"
#else
  #set ${page_title} "Generated page for ${cfilename}"
#endif
  <title>${page_title}</title>

#if attrib_quiet:("baseref")
  <base|href=$[baseref]/>
#endif

#foreach ${linkrel} sortlex:(split:(attrib:("rellinks")))
  <link+linkrel${linkrel}|rel=${linkrel}/>
#endforeach

#foreach ${linkrev} sortlex:(split:(attrib:("revlinks")))
  <link+linkrev${linkrev}|rev=${linkrev}/>
#endforeach

#foreach ${metatag} split:(attrib:("metatags"))
#if attrib_quiet:(var:("metatag"))
#set ${content} attrib:(var:("metatag"))
  <meta+${metatag}|http-equiv=${metatag}|\
    content=${content}/>
#endif
#endforeach

</head>$[start_body]

#if not:(attrib_quiet:("notitle"))
#if attrib_quiet:("pagetitle")
  <h1>$[pagetitle]</h1>
#else
  <h1>${page_title}</h1>
#endif
#endif

  $[pre_text]

#set ${para_started} ""
#if ${dir_subdirs} || not:(${topdir})

  #section indexdirs
    #set ${para_started} 1
    <p+dirspara>$[pre_dirs]
    #if not:(${topdir})
      #rem parent icon going up one level
      #set ${iconfile} iconfile:(${filename},"parent")
      #set ${imgindex} genname_rel:("${filename}/..","index")
    <a|href=${imgindex}><img+icon|src=${iconfile}|alt=parent/></a>&nbsp;
    #endif

    #foreach ${dir} ${dir_subdirs}
      \cont
      #output render:(${filename},${dir},"$[postthumb_dirs]")
    #endforeach
    $[post_dirs]
    #if not:(attrib_quiet:("singlepara"))
      </p>
      #set ${para_started} ""
    #endif
  #endsection
#endif

#set ${left_file} ""
#if ${dir_files}
  #section indexfiles
    #if not:(${para_started})
      #if not:(attrib_quiet:("singlepara"))
        #if attrib_quiet:("h1text")
  <h1>$[h1text]</h1>
        #endif
      #endif
      <p+filespara>
    #endif

    $[pre_files]
    #foreach ${file} ${dir_files}
      \cont
      #output render:(${filename},${file},"$[postthumb_files]")

      #rem Of course ${filename} is the directory name (we are generating 
      #rem the index here after all)

      #set ${path_to_file} "${filename}/${file}"
      #if has_wflio:(${path_to_file})
        #execute set_wflink:(${path_to_file},"index",${filename})
        #if ${left_file}
          #execute set_wflink:(${path_to_file},"left",${left_file})
          #execute set_wflink:(${left_file},"right",${path_to_file})
        #endif
        #set ${left_file} ${path_to_file}
      #endif
    #endforeach
    $[post_files]
    </p>
    #set ${para_started} ""
  #endsection
#endif

#if ${para_started}
  </p>
#endif

  $[post_text]

#output backout:($[start_body])
</html>
#endsection
~~
The {{pagedef_href}} for the index pages

>>pdsections~~wflio~~~~
The top section of the {{wflio_href}} page

>>pdsections~~index~~~~
The top section of the index page

>>pdsections~~indexdirs~~index~~
Where the directories are rendered on the index page

>>pdsections~~indexfiles~~index~~
Where the files are rendered on the index page

>>pd-tag~~linkrel<i>????</i>~~link~~
Define relationship between pages, the {{st}}rellinks{{et}} attribute
determines the relationship name.  use the 
{{st}}linkrel<i>????</i>_target{{et}} attribute to set the target.

>>pd-tag~~linkrev<i>????</i>~~link~~
Define reverse relationship between pages, the {{st}}revlinks{{et}} attribute
determines the relationship name

>>pd-tag~~author~~meta~~
Sets the author of the document.

>>pd-tag~~generator~~meta~~
Sets the generator program of the document.

>>pd-tag~~wflioimg~~img~~
The image used to represent a file on the {{wflio_href}} page

>>pd-tag~~dirspara~~p~~
The paragraph used to show subdirectories on the index page

>>pd-tag~~icon~~img~~
The image used to represent an icon

>>pd-tag~~filespara~~p~~
The paragraph used to show plain files on the index page

>>pd-tag~~thumb~~img~~
The thumbnail image used to represent a file or directory

>>variable~~page_title~~wflio~~
Title of the page

>>variable~~filename~~wflio,index~~
Name of file being {{render_href}}ed

>>variable~~issecondary~~wflio,index~~
Set to false if generating index page, false otherwise

>>variable~~issubdir~~wflio,index~~
Set to true if within sub-directory

>>variable~~dir_subdirs~~index~~
List of subdirectories from here

>>variable~~dir_files~~index~~
List of files within this directory

>>variable~~dir_objects~~index~~
List of files and subdirectories

>>variable~~isdir~~wflio,index~~
True if current file is a directory

>>variable~~topdir~~index~~
True if this is the root directory for this run

>>variable~~pagetype~~wflio,index~~
The type of page being generated (wflio or index)

>>variable~~index_wf_file~~wflio~~
Name of index file

>>variable~~left_wf_file~~wflio~~
Name of file to the left

>>variable~~right_wf_file~~wflio~~
Name of file to the right

>>variable~~singlepara~~wflio,index~~
Attempt to render page in a single paragraph

>>variable~~index_singlepara~~index~~
Attempt to render index page in a single paragraph

>>variable~~wflio_singlepara~~wflio,index~~
Attempt to render {{wflio_href}} page in a single paragraph

>>variable~~cfilename~~wflio,index~~
Cannonical version of the filename

>>variable~~dir~~indexdirs~~
Directory being expanded (accesable from {{st}}$[postthumb_dirs]{{et}}

>>variable~~file~~indexfiles~~
File being expanded (accesable from {{st}}$[postthumb_files]{{et}}


>>bi-attrib~~_dirname~~
Name of directory containing file

>>bi-attrib~~_filename~~
Name of file with directory part removed

>>bi-attrib~~_fileext~~
File extension

>>bi-attrib~~_filesize~~
File size, this attribute will round to the nearest kB, MB or GB and 
give sizes like "23MB"

>>bi-attrib~~_filerawsize~~
File size in bytes

>>bi-attrib~~_file_modified~~
The date on which the file was last modified

>>bi-attrib~~_file_created~~
The date on which the file was created

>>bi-attrib~~_thumb_file~~
If the file contains an image this attribute will be replaced by a pointer 
to the thumbnail image.  Must be called from the same directory.

>>bi-attrib~~_thumb_local~~
If the file contains an image this attribute will be replaced by a thumbnail.
Must be called from the same directory.

>>bi-attrib~~_thumb_remote~~
If the file contains an image this attribute will be replaced by a thumbnail.
Will supply complete path to image.

>>bi-attrib~~_tidy_name~~
Do some tidying up on the name (remove directory, replace underscores with spaces etc)

>>bi-attrib~~_to_root~~
The path from this file to the root generated page

>>bi-attrib~~_timenow~~
The time the script was run

>>bi-attrib~~_timenow_dmy~~
The time the script was run (day month year)

>>bi-attrib~~_timenow_dmysl~~
The time the script was run (day/mon/year)

>>bi-attrib~~_timenow_mdy~~
The time the script was run (month day year)

>>bi-attrib~~_timenow_mdysl~~
The time the script was run (mon/day/year)

>>bi-attrib~~_timenow_24~~
The time the script was run (hour24:min)

>>bi-attrib~~_timenow_am~~
The time the script was run (hour12:min am/pm)

>>bi-attrib~~_index_wflink~~
Name of file that is index to this one

>>bi-attrib~~_left_wflink~~
Name of file that is left of this one

>>bi-attrib~~_right_wflink~~
Name of file that is right of this one

>>wflio~~special_action1~~~~.~~
<p>
This attribute defines a "{{action_href}}" which will be called 
on every file before the index files are generated.

>>wflio~~special_action2~~~~.~~
Defines a second special action which will only come into 
effect if {{st}}special_action1{{et}} is defined.

>>wflio~~special_action3~~~~.~~
See {{st}}special_action2{{et}}

>>wflio~~special_action4~~~~.~~
See {{st}}special_action2{{et}}

>>wflio~~special_action5~~~~.~~
See {{st}}special_action2{{et}}

>>wflio~~special_action6~~~~.~~
See {{st}}special_action2{{et}}

>>wflio~~special_action7~~~~.~~
See {{st}}special_action2{{et}}

>>wflio~~special_action8~~~~.~~
See {{st}}special_action2{{et}}

>>wflio~~special_action9~~~~.~~
See {{st}}special_action2{{et}}

>>wflio~~notitle~~wflio~~.~~
If set does <b>not</b> insert title on to page

>>wflio~~wflio_notitle~~wflio~~1~~
By default don't have titles on {{wflio_href}} pages

>>wflio~~prune~~~~.~~
If this is set for a directory don't descend into the directory 
just leave the contents undisturbed

>>wflio~~rellinks~~wflio,index~~**null**~~
List of types of rellink to assert for the page

>>wflio~~revlinks~~wflio,index~~**null**~~
List of types of revlink to assert for the page

>>wflio~~pagedef_fun~~wflio,index~~.~~
A "magic" attribute.  Can
only be set for root but can be set as many times as you want. 
Allows you to create new {{funs_href}} by defining them in Perl code. 
See the {{perlscript_href}} section for more details.

>>wflio~~icon_dir~~wflio,index~~.~~
A "magic" attribute.  If it is set the program looks for icon
images in the selected directory and adds them to the usable set.  Can
only be set for root but can be set as many times as you want.

>>wflio~~global_var~~wflio,index~~.~~
A "magic" attribute.  If set the nominated variable will have that value 
for all pages (even the ones above here).  Can
only be set for root but can be set as many times as you want.

>>wflio~~global_var_rel~~wflio,index~~.~~
A "magic" attribute.  If set the nominated variable will have that value 
for all pages (even the ones above here), the value will be prepended with 
the name of the directory that the folio file is within, so you can use this to 
name a file that gets used for many directories (e.g. a background image 
used for lost of pages).  Can
only be set for root but can be set as many times as you want.

>>wflio~~no_fpage~~wflio,index~~.~~
A "magic" attribute.  If set no {{fpage_href}} files will be generated
(since {{fpage_href}} processing does not yet work this option is not heavily
usefull).

>>wflio~~simple_wflio~~wflio,index~~.~~
A "magic" attribute.  If set causes the program to only look for 
global {{attrib_href}} (rather 
than those associated with particular files and directories).  Setting
this speeds up the process, at the cost of reducing flexibility.  Can
only be set for root.

>>wflio~~hide_wfolio~~wflio,index~~.~~
A "magic" attribute.  If set true (and running on Windows) will attempt to make 
generated files hidden.  Can
only be set for root.

>>wflio~~ignore_empty_dirs~~wflio,index~~.~~
A "magic" attribute.  If set empty directories will not be reported.  Can
only be set for root.

>>wflio~~baseref~~wflio,index~~.~~
Base reference for the page

>>wflio~~metatags~~wflio,index~~generator author~~
List of metatags to assert in the page header

>>wflio~~generator~~wflio,index~~Build Folio~~
Generator program

>>wflio~~author~~wflio,index~~.~~
Who generated the page (ran the program or edited the {{folio_href}} file)

>>wflio~~topcomment~~wflio,index~~.~~
{{html_href}} comment at the top of the page

>>wflio~~index_topcomment~~index~~.~~
HTML comment at the top of the index pages

>>wflio~~wflio_topcomment~~wflio~~.~~
HTML comment at the top of the {{wflio_href}} pages

>>wflio~~border~~index~~**zero**~~
width of borders for images

>>wflio~~thumb_width~~index~~60~~
width of thumbnail images

>>wflio~~thumb_height~~index~~.~~
height of thumbnail images

>>wflio~~thumb_file_openmessage~~index~~.~~
When creating thumbnail image files the program has to read the source 
image to find out if it is worth creating a thumbnail.  Some images (especially 
JPG files) cause the GD library to crash.  If this flag is set then the 
program will print out the names of the image files it is opening 
so you can see which one caused a crash.

>>wflio~~thumb_file_minratio~~index~~10~~
this is the minimum size ratio between the area an image and its 
thumbnail.  If the requested thumbnail is too large then the 
software will link directly to the image rather than create an 
intermediate version.

>>wflio~~thumb_file_width~~index~~200~~
the width of the image file created for a thumbnail.  NB the width of the 
thumbnail image in the wfolio file will be set by thumb_width

>>wflio~~thumb_file_height~~index~~.~~
the height of the image file created for a thumbnail.  NB the height of the 
thumbnail image in the wfolio file will be set by thumb_height

>>wflio~~embed_height~~index,wflio~~20~~
Default height of embeded objects.   Since these are mostly 
sounds this is a suitable height.

>>wflio~~embed_width~~index,wflio~~150~~
Default width of embeded objects.   Since these are mostly 
sounds this is a suitable width

>>wflio~~embed_autostart~~index,wflio~~false~~
Do we want to start embedded objects on page load?

>>wflio~~index_thumb_border~~index~~.~~
The border width for thumbnail images on the index pages (use {{st}}"**zero**"{{et}}
to have no border)

>>wflio~~index_textcolor~~index~~.~~
The colour to use for text on index pages (select from {{colours_href}})

>>wflio~~wflio_textcolor~~wflio~~.~~
The colour to use for text on {{wflio_href}} pages (select from {{colours_href}})

>>wflio~~textcolor~~wflio,index~~.~~
The colour to use for text (select from {{colours_href}})

>>wflio~~index_pre_text~~index~~.~~
Text to place at top of page on the index pages

>>wflio~~filename_style~~wflio~~**null**~~
The style tags for filenames in {{wflio_href}} pages

>>wflio~~created_style~~wflio~~<b><small>~~
The style for the created note in {{wflio_href}} pages

>>wflio~~created_flag~~wflio~~&nbsp;(Created: $[_file_created])~~
The text to be placed after the file name of {{wflio_href}} pages

>>wflio~~pre_text~~wflio,index~~**null**~~
Text to place at top of page

>>wflio~~index_post_text~~index~~.~~
Text to place at bottom of index pages

>>wflio~~post_text~~wflio,index~~**null**~~
Text to place at bottom of page

>>wflio~~index_pre_dirs~~index~~.~~
Text to place before directory listing on the index pages

>>wflio~~pre_dirs~~wflio,index~~**null**~~
Text to place before directory listing

>>wflio~~index_post_dirs~~index~~.~~
Text to place after directory listing on the index pages

>>wflio~~post_dirs~~wflio,index~~**null**~~
Text to place after directory listing

>>wflio~~start_body~~wflio,index~~<body>~~
Text to start page bodies

>>wflio~~pagetitle~~wflio,index~~.~~
Title for pages

>>wflio~~index_pagetitle~~index~~.~~
Title for index pages

>>wflio~~wflio_pagetitle~~index~~.~~
Title for {{wflio_href}} pages

>>wflio~~postthumb_dirs~~index~~&nbsp;~~
separator for directory thumbnails

>>wflio~~index_pre_files~~index~~.~~
Text to place before file listing on the index pages

>>wflio~~pre_files~~wflio,index~~**null**~~
Text to place before file listing

>>wflio~~index_post_files~~index~~.~~
Text to place after file listing on the index pages

>>wflio~~post_files~~wflio,index~~**null**~~
Text to place after file listing

>>wflio~~postthumb_files~~index~~&nbsp;~~
separator for file thumbnails

>>wflio~~index_picture~~indexes~~.~~
The name of the image file to use when representing this directory 
in the index of its parent.  Setting this causes the directory 
to be shown using this picture rather than the one that happens to occur first.

>>wflio~~force_category~~indexes~~.~~
The type to use without doing any pattern checking against the file
name

>>wflio~~force_dircategory~~indexes~~.~~
The type to use without doing any pattern checking against the directory
name (overrides {{st}}force_category{{et}}

>>wflio~~force_filecategory~~indexes~~.~~
The type to use without doing any pattern checking against the file
name (overrides {{st}}force_category{{et}}

>>wflio~~category_default~~indexes~~dontknow~~
The default file type to use if no other type is identified

>>wflio~~category_list~~indexes~~ignore picture web text wave mp3 folio fpage~~
The list of file types to test for.  If this list is extended
then corresponding pattern and {{render_href}}
methods will also be required.  Note that a corresponding 
{{render_href}} method might also be needed.

>>wflio~~category_dontknow_render~~indexes~~file:$[_tidy_name@$<path>]~~
How files to {{render_href}} files whose type we can't identify

>>wflio~~category_dontknow_filerender~~indexes~~.~~
How files to {{render_href}} files whose type we can't identify

>>wflio~~force_dirrender~~indexes~~.~~
Force the program to {{render_href}} the directories using this value rather 
than matching the file's category (overrides {{st}}force_render{{et}})

>>wflio~~force_filerender~~indexes~~.~~
Force the program to {{render_href}} the files using this value rather 
than matching the file's category (overrides {{st}}force_render{{et}})

>>wflio~~force_render~~indexes~~.~~
Force the program to {{render_href}} the directories or files using this value rather 
than matching the file's category

>>wflio~~default_dirrender~~indexes~~wflio:$<dir_image>~~
The default way to {{render_href}}
directories (overrides the various category specific {{st}}_dirrender{{et}}s
if it is set

>>wflio~~category_dontknow_dirrender~~indexes~~wflio:$[_tidy_name@$<path>]~~
How files to {{render_href}} directories whose type we can't identify

>>wflio~~category_folio_pattern~~indexes~~\.(folio)$~~
The {{regex_href}} that identifies {{st}}folio{{et}}
files

>>wflio~~category_folio_render~~indexes~~file:$[_$<category>_icon@$<path>]~~
How files to {{render_href}} files whose type we can't identify

>>wflio~~category_folio_filerender~~indexes~~.~~
How to {{render_href}} folio files.

>>wflio~~category_fpage_pattern~~indexes~~\.(fpage)$~~
The {{regex_href}} that identifies {{fpage_href}}
files for generating pages

>>wflio~~category_fpage_render~~indexes~~file:$[_$<category>_icon@$<path>]~~
How to {{render_href}} {{fpage_href}} files

>>wflio~~category_fpage_filerender~~indexes~~.~~
How to {{render_href}} {{fpage_href}} files

>>wflio~~category_fpage_dirrender~~indexes~~.~~
How to {{render_href}} {{fpage_href}} files

>>wflio~~category_ignore_pattern~~indexes~~(~)$~~
If the file name matches this {{regex_href}} it is ignored
(more correctly the {{st}}category_ignore_render{{et}} is used which
normally tells the program to ignore them)

>>wflio~~category_ignore_render~~indexes~~ignore~~
How to {{render_href}} {{st}}ignore{{et}} files

>>wflio~~category_ignore_filerender~~indexes~~.~~
How to {{render_href}} {{st}}ignore{{et}} files

>>wflio~~category_ignore_dirrender~~indexes~~.~~
How to {{render_href}} {{st}}ignore{{et}} files

>>wflio~~category_mp3_pattern~~indexes~~\.(mp3)$~~
The {{regex_href}} that identifies {{st}}mp3{{et}}
files

>>wflio~~category_mp3_render~~indexes~~file:$[_wave_icon@$<path>] $[_tidy_name@$<path>]~~
How to {{render_href}} {{st}}mp3{{et}} files

>>wflio~~category_mp3_filerender~~indexes~~.~~
How to {{render_href}} {{st}}mp3{{et}} files

>>wflio~~category_mp3_dirrender~~indexes~~.~~
How to {{render_href}} {{st}}mp3{{et}} files

>>wflio~~category_notype_render~~indexes~~file:$[_tidy_name@$<path>]~~
How to {{render_href}} files with no extension

>>wflio~~category_notype_filerender~~indexes~~.~~
How to {{render_href}} files with no extension

>>wflio~~category_notype_dirrender~~indexes~~.~~
How to {{render_href}} files with no extension

>>wflio~~category_picture_pattern~~indexes~~\.(jpg|jpeg|gif|bmp)$~~
>The {{regex_href}} that identifies picture files

>>wflio~~category_picture_render~~indexes~~wflio:$[_thumb_file@$<path>]~~
How to {{render_href}} image files

>>wflio~~category_picture_filerender~~indexes~~.~~
How to {{render_href}} image files

>>wflio~~category_picture_dirrender~~indexes~~wflio:$<dir_image>~~
How to {{render_href}} image directories

>>wflio~~category_text_pattern~~indexes~~\.(txt|text)$~~
The {{regex_href}} that identifies text files

>>wflio~~category_text_render~~indexes~~file:$[_tidy_name@$<path>]~~
How to {{render_href}} text files

>>wflio~~category_text_filerender~~indexes~~.~~
How to {{render_href}} text files

>>wflio~~category_text_dirrender~~indexes~~.~~
How to {{render_href}} text files

>>wflio~~category_wave_pattern~~indexes~~\.(wav|wave)$~~
The {{regex_href}} that identifies {{st}}wave{{et}}
files

>>wflio~~category_wave_render~~indexes~~embed:$[_tidy_name@$<path>]~~
How to {{render_href}} audio files
(except {{st}}mp3{{et}})

>>wflio~~category_wave_filerender~~indexes~~.~~
How to {{render_href}} audio files
(except {{st}}mp3{{et}})

>>wflio~~category_wave_dirrender~~indexes~~.~~
How to {{render_href}} audio files
(except {{st}}mp3{{et}})

>>wflio~~category_web_pattern~~indexes~~\.(htm|html)$~~
The {{regex_href}} that identifies web files

>>wflio~~category_web_render~~indexes~~file:$[_$<category>_icon@$<path>] $[_tidy_name@$<path>]~~
How to {{render_href}} web files

>>wflio~~category_web_filerender~~indexes~~.~~
How to {{render_href}} web files

>>wflio~~category_web_dirrender~~indexes~~wflio:$[_$<category>_icon@$<path>] $[_tidy_name@$<path>]~~
How to {{render_href}} web files

>>wflio~~category_unknown_render~~indexes~~file:$[_$<category>_icon@$<path>] $[_tidy_name@$<path>]~~
How to {{render_href}} web files

>>wflio~~category_unknown_dirrender~~indexes~~wflio:$<dir_image>~~
How to {{render_href}} web files

>>wflio~~category_unknown_filerender~~indexes~~file:$[_$<category>_icon@$<path>] $[_tidy_name@$<path>]~~
How to {{render_href}} web files

>>wflio~~indexfiles_h1text~~indexes~~Files~~
Heading before listing of files

>>cmdline~~dir~~.~~start_dir~~dir~~
The start in directory {{st}}<i>dir</i>{{et}}

>>cmdline~~hide_wfolio~~BOOL~~~~~~
If set true (and running on Windows) will attempt to make 
generated files hidden.  Will not hide the index files, or any
file whose category is not {{st}}wfolio{{et}} or {{st}}icon{{et}}

>>cmdline~~ignore_empty_dirs~~BOOL~~~~~~
If set the program will not list the empty directories it 
encounters

>>cmdline~~dont_use_icons~~BOOL~~~~~~
Reduces (but does not eliminate) the number of images

>>cmdline~~force_os~~N/A~~~~~~
Force the OS name to be the value specified

>>cmdline~~no_fpage~~BOOL~~~~~~
If this is set the program will not attempt to produce 
{{fpage_href}} files

>>cmdline~~no_tk~~BOOL~~~~~~
Don't start the graphical interface, just process the files

>>cmdline~~no_progress~~BOOL~~~~~~
Don't use the Tk progress bar to display progress (for example if you 
don't have the module built for your system)

>>cmdline~~no_fileselect~~BOOL~~~~~~
Don't use the Tk FileSelection widget

>>cmdline~~progress_steps~~100~~~~~~
Number of steps in each progress section

>>cmdline~~no_dirtree~~BOOL~~~~~~
Don't use the Tk DirTree widget

>>cmdline~~genname~~wflio~~flag_name~~new_name~~
Will cause all generated files to be named with the prefix 
{{st}}<i>new_name</i>{{et}} (NB not tested, changing this could 
have strange effects)

>>cmdline~~help~~BOOL~~~~~~
Generate the help files (but you already have them!)

>>cmdline~~simple_wflio~~BOOL~~~~~~
If set causes the program to only look for global {{attrib_href}} (rather 
than those associated with particular files and directories).  Setting
this speeds up the process, at the cost of reducing flexibility.

>>icon~~backup~~
This icon indicates a directory used to backup files

>>icon~~dir~~
A directory.  This icon will not normally be used

>>icon~~dontknow~~
The file type here is unknown.  Notice that the file has an extension
(otherwise it would be a {{st}}notype{{et}} file) we just don't recognise
the what the extension name means

>>icon~~down~~
Move down a level.  Not used in the normal operation but may be
exploited by an {{fpage_href}} definition

>>icon~~empty~~
An empty directory

>>icon~~folio~~
A {{folio_href}} file

>>icon~~fpage~~
An {{fpage_href}} file

>>icon~~ignore~~
This file matches our ignore pattern.  In normal operation this
file would be ignored and the icon would never appear

>>icon~~index~~
Link back to the directory containing the thumbnails

>>icon~~left~~
The previous image in a sequence

>>icon~~mp3~~
The icon to use for {{st}}mp3{{et}} files.  Not normally used
since the {{st}}wave{{et}} icon is used instead

>>icon~~notype~~
This file has no extension.  The icon would normally not
be used since the {{st}}notype{{et}} files are usually rendered with
just the name

>>icon~~original~~
A directory containing original images.  Often these are much
larger than browsers can cope with so they should be resized

>>icon~~panorama~~
A directory containing stitched together vistas.  Normally very
wide hence they need special scaling of the thumbnails

>>icon~~parent~~
The parent directory of this one

>>icon~~picture~~
A picture.  Normally a picture file will be represented by a 
thumbnail version of the image, however there are occasions when
an icon is needed.

>>icon~~right~~
The next picture in the sequence

>>icon~~text~~
A text file

>>icon~~tools~~
A directory containing programs and scripts

>>icon~~unknown~~
This indicates an unknown icon type.  Normally occurs only when
an icon is missing

>>icon~~up~~
Move up a level.  Like down this icon is not used normally

>>icon~~wave~~
A directory containing audio files.  Normally sound files are
either linked to or embedded

>>icon~~web~~
A web page

>>icon~~wfolio~~
A file generated by the {{st}}{{prog_name}}{{et}} program. 
These are normally deleted by the program and would never appear

>>icon~~working~~
A working or temporary directory

>>pagestmt~~endwhile~~~~~~
End of while block

>>pagestmt~~endif~~~~~~
End of if block

>>pagestmt~~endsection~~~~~~
End of section

>>pagestmt~~endforeach~~~~~~
End of foreach block

>>pagestmt~~rem~~single~~ignore~~
Remark, the rest of the line is ignored

>>pagestmt~~label~~single~~name~~
Label naming a target for a goto

>>pagestmt~~goto~~single~~name~~
Jump to label

>>pagestmt~~last~~single~~~~
Jump out of enclosing loop

>>pagestmt~~next~~single~~~~
Go round the loop again

>>pagestmt~~section~~block~~name~~
Start of section

>>pagestmt~~set~~single~~var exp~~
Set a variable to a value

>>pagestmt~~output~~single~~exp~~
Put out a line to the generated file.  This lets you execute
some code and send out the result

>>pagestmt~~message~~single~~exp~~
Send a message to the user

>>pagestmt~~execute~~single~~exp~~
Execute a string as though it was a statement

>>pagestmt~~if~~block~~exp~~
If the expression is true do the first block

>>pagestmt~~elsif~~within:if~~exp~~
Else if statement, check the expression and decide if to do the next block

>>pagestmt~~else~~within:if~~~~
Else, where to go when all else fails

>>pagestmt~~foreach~~block~~var vexp~~
Do the block once for each element of the list, setting the variable 
to the value each time

>>pagestmt~~while~~block~~exp~~
Keep repeating the block until the expression is false

>>pageopr~~**~~1~~
Raise to power

>>pageopr~~*~~2~~
Multiply

>>pageopr~~/~~3~~
Divide

>>pageopr~~%~~4~~
Modulo

>>pageopr~~x~~5~~
Concatenate strings (i.e. {{st}}"ab"x5{{et}} is
{{st}}"ababababab"{{et}})

>>pageopr~~+~~5~~
Add

>>pageopr~~-~~6~~
Subtract

>>pageopr~~.~~7~~
Append two strings

>>pageopr~~<=~~8~~
Less than or equal to

>>pageopr~~<~~8~~
Less than

>>pageopr~~>~~8~~
Greater than

>>pageopr~~>=~~8~~
Greater than or equal to

>>pageopr~~lt~~9~~
Less than comparison for strings

>>pageopr~~gt~~9~~
Greater than for strings

>>pageopr~~le~~9~~
Less than or equal to for strings

>>pageopr~~ge~~9~~
Greater than or equal to for strings

>>pageopr~~!=~~10~~
Not equal

>>pageopr~~<>~~10~~
Not equal

>>pageopr~~==~~10~~
Equals (note the same as C not BASIC)

>>pageopr~~ne~~11~~
Not equal for strings

>>pageopr~~eq~~11~~
Equal strings

>>pageopr~~&~~12~~
Logical and (if you don't know the difference use &&)

>>pageopr~~^~~13~~
Exclusive or

>>pageopr~~|~~14~~
Logical or (if you don't know the difference use ||)

>>pageopr~~&&~~15~~
And

>>pageopr~~||~~16~~
Or

EndDefaults

    my(%tagtypes);
    
    foreach $line (@defaults)
      {
        my(@vals) = split(/~~/,$line);

        next if(!$line);

        # Note the elements for the documentation
        # Must call with & since the 0th element is the category
        if(!&Document::add_cat(@vals))
          {
            # Unrecognised default type, just give up
            next;
          }
        
        # Some types of defaults require setting up other 
        # structures
        if($vals[0] eq "htmltag")
          {
            # Define a new html tag
            Page::add_tag($vals[1],$vals[2]);
          }
        elsif($vals[0] eq "pagestmt")
          {
            Page::add_stmt($vals[1],$vals[2],$vals[3]);
          }
        elsif($vals[0] eq "pageopr")
          {
            Page::add_oper($vals[1],$vals[2]);
          }
        elsif($vals[0] eq "tagattrib")
          {
            # Define a new html tag attribute
            my($cat,$tags,$attrib_name,$html_name,$comment) = @vals;
            my(@tags,$tag);
            if($tags =~ s/^\[([^\]]+)\]$/$1/)
              {
                @tags = split(/,/,$tags);
              }
            else
              {
                $tags[0] = $tags;
              }
            foreach $tag (@tags)
              {
                Page::add_tagattrib($tag,$attrib_name,$html_name);
                if(${$tagtypes{"${attrib_name}"}}{$tag} || 
                         ${$tagtypes{"${html_name}"}}{$tag})
                  {
                    add_output("Multiple definition of tag ($tag,$attrib_name,$html_name)\n");
                  }
                ${$tagtypes{"${attrib_name}"}}{$tag} = 1;
                ${$tagtypes{"${html_name}"}}{$tag} = 1;
                ${$tagtypes{"${attrib_name}:${html_name}"}}{$tag} = $comment;
              }
          }
        elsif($vals[0] eq "wflio")
          {
            if($vals[1] =~ s/\[([^\]]+)\]/||/)
              {
                # sort out multiple var definitions
              }
            else
              {
                # Define the attribute default value            
                $attrib{$vals[1]} = Document::get_element("wflio",$vals[1],"default");
              }
          }
        elsif($vals[0] eq "cmdline")
          {
            my($val);

            $val = Document::get_element("cmdline",$vals[1],"default");
            if(Document::get_element("cmdline",$vals[1],"var"))
              {
                $val .= ":".Document::get_element("cmdline",$vals[1],"var");
              }
            $options{Document::get_element("cmdline",$vals[1],"flag")} = $val;
          }
      }

    Attribute::defaults(\%attrib);
  }

sub display_help ()
  {
    my($ex1,$ex2);
    $ex1 = GenName::examples(1);
    $ex2 = GenName::examples(2);

    add_output(<<"QuickHelp");
----------------------------------------------------------------------

    Version: ${prog_version}
   Released: ${prog_release}
   Web Page: ${prog_home}

The Build Folio program generates web pages that let you view a set of 
files and directories.  The generated files are called $ex1 and so on.  Select the 
directory you want to start in and click the start button.

Once the processes has completed open the $ex2 file using 
your favorite browser.

The script includes its own documentation, click again on the 
"Save Help Doc" button to write it into the directory you have 
selected above.
----------------------------------------------------------------------
QuickHelp
    GUI::reassign_help("Save Help Doc",\&Document::print);
  }

sub null
  {
    # null routine for attaching a debugger
    my($f);
    $f = time;
  }  

sub replace
  {
    my($val,$str1,$str2) = @_;

    while(index($val,$str1) >= 0)
      {
        substr($val,index($val,$str1),length($str1),$str2);
      }
    return($val);
  }

sub main ()
  {
    # Read the configuration (build into the script)...
    top_init_pre_cmdline();
    # ...now that we know what the command line options are...
    Opt::get(%options);
    # ...finally use those settings to configure the script
    top_init_post_cmdline;

    # We have two cases, with or without Tk
    if($no_tk)
      {
        # Don't want a user interface, just do the processing
        session_init(0);
        webify_dir(".");

        FPage::run_session if(!$no_fpage && $fpage_present);
      }
    else
      {
        # Put together the Tk based front end
        GUI::set_state("Gathering Parameters",1);
        GUI::define_interface(\&start_session);
      }
  }
  
}

{# This collection of elements manipulates images.  Most importantly for 
# creating small thumbnails that reduce the load on directiories with 
# large numbers of images
package Image;

my $is_started = "";

sub init
  {
    # Load all the dependent packages when this one is started
    return if($is_started ne "");
    $is_started = 1;

    # Load the GD modules (but only if this function is called
    my $module_found = 0;
    
    eval(<<"LoadModule");
        # Use require so we don't load the module if it is not there
        require GD;
        \$module_found = 1;
LoadModule

    if($module_found == 0)
      {
        add_output("Failed to find GD module");
      }
  }

sub default_type
  {
    init();
    return "gif";
  }

sub thumbnail
  {
    my($dir,$src_name) = @_;

    init();

    my($target_width,$target_height,$minratio,$openmessage);
    Attribute::get("$dir/$src_name","thumb_file_width",\$target_width,1);
    Attribute::get("$dir/$src_name","thumb_file_height",\$target_height,1);
    Attribute::get("$dir/$src_name","thumb_file_minratio",\$minratio,1);
    Attribute::get("$dir/$src_name","thumb_file_openmessage",\$openmessage,1);

    $minratio = 9 if(!defined $minratio || $minratio < 1);
    $openmessage = "" if(!defined $openmessage);

    my($x_scale,$y_scale);

    print "Open \|$dir/$src_name\|\n" if($openmessage);

    my $gd = GD::Image->new("$dir/$src_name");
    if(!defined $gd)
      {
        ::add_output("Failed to read image data from $dir/$src_name");
        return undef;
      }

    my($src_width,$src_height) = $gd->getBounds();

    if(!defined $target_width && !defined $target_height)
      {
        ::add_output("Resizize must define either width or height");
        return undef;
      }

    $target_width = int($src_width*$target_height/$src_height)
                 if(!defined $target_width || $target_width <= 0);
    $target_height = int($src_height*$target_width/$src_width)
                 if(!defined $target_height || $target_height <= 0);
    if($target_width <= 0 || $target_width >= 16000 || 
             $target_height <= 0 || $target_height >= 16000)
      {
        ::add_output("Cannot resize image to $target_width x $target_height");
        return undef;
      }
    if((($src_width*$src_height)/($target_width*$target_height)) < $minratio)
      {
        # The thumbnail image does not save enough space to be worth creating
        return undef;
      }
    my $new_gd = GD::Image->new($target_width,$target_height);

    $new_gd->copyResampled($gd,0,0,0,0,$target_width,$target_height,
                               $src_width,$src_height);
    # Now lets save it

    # I should keep a track of all the thumbnails an allocate new entries 
    # in order, but for the moment I will be a bit cruder
    my $target_filename = GenName::obtain("$dir/$src_name","thumb",$dir);
    return undef
        if(!defined $target_filename);

    if(default_type() eq "gif")
      {
        my $fh = IO::File->new(">$dir/$target_filename");
        binmode $fh;
        print $fh $new_gd->gif();
        $fh->close();
      }
    else
      {
        ::add_output("Cannot yet produce thumbnail in ".default_type().
                     " format\n");
        return undef;
      }

    # We succeeded
    FileCounts::inc('thumb');
    ::set_hidden("$dir/$target_filename") if($::hide_wfolio);

    return $target_filename;
  }
}
