
                  W H A T ' S   N E W 

MiniVend 3.14-5 adds fix for condition which allowed arbitrary select on
userdb with scan/ one-click search. A new NoSearch directive is added. It 
should be set to a space-separated list of wildcard expressions matching
search files and databases which you do not want searched. For example,
to not allow search of userdb or any db containing "secret", put in:

	NoSearch  ^userdb*  *secret*

The default value is ^userdb*.

---------------

MiniVend 3.14-4 adds file globbing to #include lines.

MiniVend 3.14-3 is a simple bug-fix release close on the heels
of the short-lived 3.14-2 (session id stuff not quite fixed
completely, forgot to transfer one line of code).

    * Removes "index" warnings that appear in 5.004 perls.

	* Added code to bypass retired IDs in session

MiniVend 3.14-2 is a simple bug-fix release close on the heels
of the defective 3.14-1 (session id stuff not really fixed).

    * Bug in session naming REALLY fixed, one which could cause users
      information to be displayed to others.

	  Keeps a DBM file of retired session ids.

      If you use WideOpen, you should change your catalog.cfg
      file to read:

            SessionExpire 15 minutes

MiniVend 3.14-1 is a simple bug-fix release.

    * Bug in session naming fixed, one which could cause users
      information to be displayed to others.

      If you use WideOpen, you should change your catalog.cfg
      file to read:

            SessionExpire 15 minutes

    * Debug mode somewhat fixed (thanks to Stefan Hornburg)

    * [page form=...] fixed.

    * Now correctly reads Apache httpd.conf parameters with
      surrounding quotes.

MiniVend 3.14 is a bug fix release with a couple of new features:

    * You can now specify a database in minivend.cfg. It becomes
      global and is available in all catalogs. It also remains connected
      all of the time, so no connection overhead exists. Careful; 
      it is writable by any catalog unless you use WRITE_CONTROL
      defined below.

    * Added write control to all databases including SQL. If you wish to
      control writing of a global database, or to a certain catalog within
      a series of subcatalogs, or make one read only, you can do so.

      To enable write control:

        Database   products  WRITE_CONTROL  1

      Once that is done, you can make a database read only, which won't
      allow writing even if [tag flag write]products[/tag] is specified:

        Database   products  READ_ONLY  1

      If you want to have control with [tag flag write]products[/tag]:

        Database   products  WRITE_TAGGED  1

      If you want to limit write to certain catalogs, you can set:

        Database   products  WRITE_CATALOG  simple=0, sample=1

      The "simple" catalog will not be able to write, while "sample"
      will if [tag flag write]products[/tag] is enabled.

      If you want a database to be always writable without having
      to specify [tag flag write] ... [/tag], then you can
      define:

        Database   products  WRITE_ALWAYS  1

      The default behavior of SQL datbases is equivalent to
      WRITE_ALWAYS, while the default for GDBM_File, DB_File,
      and Memory databases is equivalent to:

        Database   products  WRITE_CONTROL 1
        Database   products  WRITE_TAGGED  1

      As a side effect, I also removed the server error if a write
      fails on a DBM database. It simply doesn't write and logs
      the problem.

    * Added a DbSearch.pm module which adds a new search type called
      "db". This searches a SQL database with MiniVend search types,
      or searches a MiniVend database instead of the ASCII file.

      If it is a SQL table being searched, you can specify a coordinated
      search and any "==" or "eq" operators will be used to filter the
      initial search return. Otherwise, all rows of the database are
      scanned upon each search. This can get slow, so you won't want to
      do this for large tables.

      The major difference between this and the TextSearch type is that
      you must set base_directory to the table name/identifier of the
      default database being searched; it defaults to 'products', which
      is probably not what you want. This sets the field specifications
      for the SQL qualification, so you must be careful. You can search
      multiple tables, which will work well if the column names and orders
      are the same. It will not work well if they are different, so it will
      be rare when you want to search multiple tables.

    Bug fixes:

    * Set default for NewReport to "yes", which prevents the occasional
      problem with returning a bogus error report if mv_order_report is
      not set.
    
    * Fixed some weirdness in parsing certain search parameters, notably
      mv_sql_query and index search specifications.

    * Changed sort variables to globals so that sorting should be
      reliable. I hope.

    * Fixed quantity problem for [price code].

    * Made mv_order_subject work for order routing.

    * Order tracking now can be done in order routing.

MiniVend 3.12 is a major release with multiple new features,
particularly in the area of user access control.

New features: 

    * Major rework of the "simple" demo. (The HTML in that demo
      was circa 1995 when the first work on MiniVend was done.)
      Made it into the cookie-cutter style favored today, and
      combined frames/non-frames demo.

    * Added a new demo, "flycat". Documentation is sparse, will
      remain sparse, and is totally located in the README.flycat
      page.

    * Rolled the former demonstration add-on feature UserDB.pm
      into the main distribution. Added a [userdb ....] tag which
      performs operations like login, logout, password change, etc.

    * UserDB is now completely documented. It has many new 
      features.

    * Added four types of access control based on User database
      login. The preferred method uses a .access_gate file to specify
      per-page access -- this is demonstrated in the demo with the
      [page reconfig/reconfig] page and is completely documented.
      Another simple method allows checking of page names before loading;
      a db_acl allows checking for read/write permission on a database;
      and a file_acl allows read/write checking on file names. The two
      latter ones are only enforced by your own programs; the simple
      integrated method can be automatic.

    * CookieLogin directive allows you to set a cookie with the
      username and password of a user for auto-login. 

    * [set-cookie name value expire] and [read-cookie name] tags added.

    * Added a feature I have been thinking about for a long time -- 
      form-linked page refs. If you want to order an item with configurable
      size/color by a link, you can now do:

        [page form="
                mv_order_item=99-102
                mv_order_size=L
                mv_order_quantity=1
                mv_separate_items=1
                mv_todo=refresh"] Order t-shirt in Large size </A>

      It was so simple to add I don't know why I didn't before now.

      You must have TolerateGet set (which is now the default) and
      all normal MiniVend form caveats apply -- you must have an action,
      you must supply a page if you don't want to go to the default,
      etc.

      You can theoretically submit any form with this; it is best
      if none of the included values have newlines. You can also
      use it for submitting foreign forms if you like; it will
      not touch the href if it begins with http:, ftp:, or the
      like.

      The [area ...] tag works the same way, though the deprecated
      [pagetarget ....] and [areatarget ...] were left out.

    * Added user-definable fields and command scripts to the command-line
      makecat procedure.

    * Added rudimentary documentation on building your own catalog
      template.

    * Added [import table type] tag for importing database
      records. Supports all types including NOTES, the best mode to
      use for inline text. Also supports import directly from a file.

    * Glimpse now fully supports coordinated searching, though
      you must make sure you have at least one regular-expression
      based match.

    * Added support for file upload/download. A demonstration is
      included in the simple demo.

    * [sql-param ...] and [item-param ...] now both support named
      fields.

    * Totally removed support for the old Msql.pm module. If you
      still use this, use an older version or update to DBI.

    * You can set an UPPERCASE parameter in the Database directive:

        Database   products   UPPERCASE  1

      You want to apply this to SQL only.

      This allows lowercase field references in [item-field column]
      and [item-data table column] (and sql- and loop- too). This
      should make it easier to get things working with Oracle
      and other DBs which won't return a lowercase field name for
      fetchrow_hashref. Note that this is not used in [item-param
      field] where you should know what the name is.

    * There is an [if-param name] and [if-sql-param name] tag
      ala [if-field ...] and [if-data ...].

    * Added a [value-extended ...] tag which allows access to 
      the array values of a form variable.

    * In my continuing quest to get people to use the UserTag
      capability, provided a few new ones in the demos -- notably
      a summary tag that is employed to total shipping weight in
      the demo, and a [table-font] [/table-font] tag which removes
      the onerous chore of setting a default font for every table
      cell.

    * Added multi-field searching for the coordinated search.
      You may pass a field like ":0..9" and have it search
      fields 0 through 9 for that search term only.

    * Added [next-anchor], [prev-anchor], and [page-anchor] container
      tags for complete configurability of [more-list][/more-list] 
      area. This also closes complaints about no spacing between
      Previous and first page; prior behavior kept for compatibility.

    * Added a Storable interface selectable at software
      configuration time. If Storable is installed, and the
      file _db_storable is present in the MiniVend software root,
      (or the environment variable MINIVEND_STORABLE_DB is true)
      then Storable will be used not only for sessions but for
      all GDBM and DB_File storage. THIS BREAKS EXISTING CATALOGS.
      If you want to use Storable only for sessions, just set
      the environment variable $ENV{MINIVEND_STORABLE} to 1 as usual.
      You can also create a _session_storable file in the MiniVend root.

    * Verified the DBI interface to work with DBD::XBase (subject
      to the usual limitations like fieldname length), which
      allows XBASE/DBF files to be used directly. This is probably
      not useful for anything except an import interface; something
      like:

        [tag export products_dbf products.asc TAB][/tag]

      This would allow a user to upload a DBF file and
      then import that into a standard TAB-delimited.

    * Added a perhaps more convenient Locale language facility,
      which looks like:

        [LC] This is the default text
                [de_DE] Text for de_DE locale [/de_DE]
                [en_US] Text for en_US locale [/en_US]
                [fr_FR] Text for fr_FR locale [/fr_FR]
        [/LC]

Bugs fixed:

    * [setlocale] currency and persist parameters were
      swapped; fixed.

    * Multiple selection checks that contained non-word characters
      would not be re-selected upon building an item-accessories
      box. Fixed.

    * Memory databases were getting imported too often, fixed
      bug in database initalization routines.

    * Fixed ownership problems in the mv_admin catalog; the
      installation should work flawlessly as root providing parent
      directories have the proper permission.

    * Due to persistent Perl problems with signal handling, the
      default demo is now distributed with PIDcheck enabled.
      New behavior when PIDcheck is in force is to reset the
      number of active servers based on the presence of PID files,
      while still rate-limiting to MaxServers iterations between
      housekeeping checks. The SafeSignals directive is deleted
      (it will generate a deprecated warning but allow startup
      to continue).

      This problem would occasionally cause busy servers to
      "freeze" as they reached and failed to go below the MaxServers 
      level.

      If the PIDcheck directive is set, the number of servers will
      be automatically adjusted every HouseKeeping seconds according
      to the pid files.  The recommended value for PIDcheck is now
      180-600 seconds; the demos will come set to 300.

    * Fixed "bad search column" error when searching the first
      column of the products file or key column of a file.

    * Fixed security hole allowing user-specification of absolute
      search file names.

    * Fixed error with CyberCash number formatting when 
      using a non-english number format (i.e. spaces and
      commas in non-english places).

    * mv_sort_field works even without mv_sort_command.

    * Indexing works for Windows.

MiniVend 3.11 is a major release enhancing many aspects of installation,
product pricing, secure authorization, searching, and database updates.

    * New experimental internal HTTP server means very fast
      request handling direct from the browser, and built-in
      internal security for admin tasks and protected catalog
      pages. Will authorize users from the add-in userdb database
      or any other MiniVend database. Supports crypt, minimal
      access logging.

      This internal HTTP server is not meant for production use.
      It may have difficulty with MS Internet Explod^Her.

    * New catalog configuration "wizard" and admin interface
      built in. The installation should be a one-step
      operation, completely automatic providing you have
      the MIME::Base64 and URI::URL modules.

    * New mv_admin catalog implements HTTP-based reconfiguration
      from a central place. Tags provided for you to gate it
      for individual users.

    * CPAN module installation improved.

    * The makecat script now can be completely run from the command
      line, no interactive steps necessary. Values can be partially
      filled in from the command line and you will be prompted
      for the rest. A "guess" mode returns a reference as a
      string guessing certain parameters from the ones you
      supply. And you can do a --nocopy test run to check the
      results before you actually copy the files.

      Unfortunately the only documentation is the usage message.

    * Makecat program adds catalogs to a running server.
    
    * German error messages added to error locale file (thanks to
      Karsten Mueller).

    * New CommonAdjust price setting scheme allows chained
      conditional lookups in pricing, shipping, and taxing. Added
      mv_price attribute for easy setting of prices in embedded
      Perl. Added [discount-subtotal] tag which will reliably give
      an item subtotal with discounts applied. New mv_discount
      attribute allows individual line item discounts.

    * TemplateDir (both local and global) allows missing
      pages to "fall back" to other places. This allows
      a catalog distribution that might only contain one
      or two pages.

    * Added LocaleDatabase, VariableDatabase, and DbDatabase;
      these allow setting of the Locale, Variable, and Database
      directives from a database table. This will allow maintenance
      improvements (they still only change value on startup or
      reconfigure.)

      LocaleDatabase is implemented in the demo.

    * Added support for CyberCash 3 (thanks to Gunnar Hellekson),
      AUTHORIZE.NET, and PAYMENTNOW.COM.

    * New [goto LABEL] and [label LABEL] allow chunks of a 
      page to be skipped.

    * DB_File databases can be automatically compacted with
      the expire program; a standalone "compact" script is
      also provided.

    * Added PIDcheck global directive to allow monitoring of
      "hung" processes. This should make MiniVend more reliable
      especially in combination with Glimpse searching.

    * Text search engine now will combine binary searching with
      database-based searches. New mv_search_map allows reliable
      coordinated searchspecs even with empty search specifications.

    * Fixed multi-page sorting problems that were in MiniVend
      since 3.00.

    * Added new WideOpen directive so that catalogs can individually
      be set to tolerate no IP address qualification. It is named
      that because that is what you will be; you should not use this
      if you ever store unencrypted credit cards (or other sensitive
      info). It is also recommend that you shorten your expire time
      to a small number of hours, maybe even 1 or 2.

    * Added new FallbackIP directive to allow quasi-cookie capability
      by IP address and browser id string. Use if you have lots of
      users who don't take/give cookies. Suggest also that expire
      times be made short, though two users would have to have the
      same exact browser string and IP address. It will work with
      cookies if they have them.

    * Added va=var=value parameter to one-click search so you
      can set a value with a link.

    * Allow deletes with form database maintenance (mv_data_*).
      Added mv_data_decode to gate HTML::Entities decoding of data;
      this will allow easy and reliable display of multi-line fields
      in a <TEXTAREA>.

    * Added "expireall" script that expires all catalogs
      in minivend.cfg by calling expire -c <name> [-r].

    * Fixed longstanding "untie attempted" bug.

    * Fixed mv_save_session so it actually will send the
      user back to their saved session.

MiniVend 3.10 is a bug-fix release with a few minor updates.

    * New IpQuad global directive allows removal of any IP address
      qualification from the session name, allowing transferred
      sessions from server to server. Just set
      
        DomainTail No
        IpHead     Yes
        IpQuad     0

      in minivend.cfg and transfer of sessions from AOL or WebTV
      should now be possible. This makes it possible to use different
      domains for the secure server and the non-secure server, even
      when the browser will not set cookies outside the current
      domain.

      IMPORTANT NOTE: Remember that security is compromised
      greatly by this; it should be used in combination with
      PGP-encrypted credit card information with CreditCardAuto,
      or with MiniVend's internal CyberCash routines. YOU SHOULD
      NEVER STORE ANY UNENCRYPTED CREDIT CARD INFORMATION ANYWHERE
      WHEN USING THIS WORKAROUND.

    * New URLDECODE tag, specific to the new/HTML tag style, provides
      unescape and URL translation services for <A HREF...> and
      <IMG ....> tags. If you use FrontPage or other
      HTML editors they will translate spaces to %20 within
      an image SRC or anchor HREF. Now you can do:

        <IMG MV=urldecode SRC="[value%20saved_image]"> 

      Flypages and search lists are done automatically.

    * HTML-style CHECKED and SELECTED now works properly.

    * Fixed EXCEL import mode so it also strips paired double quotes.

    * Lotus NOTES format can now be exported.

    * Now can have separate language and currency locales,
      using the mv_currency scratch variable just as with mv_locale;
      and with [setlocale locale=fr_FR currency=en_US].

    * New Global Locale tag gives global default for error
      messages. Error messages are numbered by module, and can
      be changed. A default file locale.error will define the
      usable keys; it is not configured in by default.

    * Error messages are numbered and the current locale can
      be used to generate many of them. This is not yet complete,
      but should be much improved. See the locale.error file for
      a list of keys to define for translation.

    * MiniVend should work with the Storable module version
      0.6@3 or higher, greatly increasing speed of session
      storage and recall. To use, install at least that version
      and set the environment variable MINIVEND_STORABLE to 1.

MiniVend 3.09 is a release that optimizes speed and adds features
that allow operation with some HTML editors.

    * SQL optimizations make dramatic differences in table
      construction speed. MiniVend now uses internal structures to
      maintain SQL column headings. This means that if you change
      your SQL table structure, you must restart Minivend, but you
      gain quite a bit of speed.

      [if-data]/[item-data], [(if-)?loop-data], and [(if-)?sql-data]
      tags are optimized across rows in the corresponding iterative
      list. This means that two selects are done where dozens might
      have been done before. Speed really increases.

      This optimization works for [if-field]/[item-field] and friends
      as well if there is only one products table (i.e. you didn't
      set ProductFiles). If you have more than one, you should use
      [item-data products ...] instead of [item-field ...] for best
      speed when appropriate.

    * To improve page response time, you can specify a SEND=1
      attribute to any new-syntax MiniVend tag -- it sends the
      output that has accumulated to that point. If you have named
      your link program to begin with nph- (i.e. nph-simple instead
      of simple) the program will start sending output immediately.
      This can greatly improve apparent response time on large search
      or loop lists.

      The nph-executable can also be optionally used with an
      alias:

      Catalog simple /catalogs/simple /cgi-bin/simple /cgi-bin/nph-simple

      If you reduce your vlink buffer size to 512 bytes, this will
      improve likelihood of immediate response at some cost in CPU
      utilization. (This change requires editing vlink.c and compiling --
      don't worry about it if you don't know how to do that.)

    * Search cache is *much* improved.  Paging and caching should now
      be completely reliable. If the user hits reload, it will refresh the
      page, as Pragma: no-cache is honored. Search paging is cached as well.
      You can invalidate the cache for the next page only with 
      [set mv_no_cache]1[/set].

    * You can encase a set of links in:

        [set mv_no_count]1[/set]
        [page whatever]A page[/page]
        [page whereever]Also a page[/page]
        [set mv_no_count]0[/set]

      The link count will be updated but not appended, making links
      repeatable. This allows the browser to highlight visited links,
      especially nice for paged searches.

    * The last search can be reproduced with the [data session last_search]
      via [page href="[data session last_search]"]. This includes
      links to different pages of a multi-page search return.

    * If you don't have the MD5 module for some reason (get it!)
      MV does some better cache key generation with checksums,
      reducing the likelihood of a collision.

    * Fixed spurious "ClearCache" error at startup.

    * MiniVend tags can now be contained within HTML tags, allowing MV
      to work somewhat with most any HTML editor. The problem before was
      that tags could not be placed between table rows with certain HTML
      editors (like FrontPage and Netscape Composer). It is triggered by
      including MV="tag arg arg.." as the *first* attribute of the HTML tag.
      (Actually it can be later in the tag if no ] or > characters intervene.)
      For example:

        <TABLE>
        <TR MV="loop" MV.search="ml=2000/se=Impressionists/sf=category">
        <TD> [loop-field title] </TD>
        <TD> [loop-code] </TD>
        </TR>
        </TABLE>

      will display:

        Sunflowers       00-341 
        The Starry Night 00-342 

      Arguments can be combined with tags if there is whitespace
      in the first mv="tag arg.." call:

        <TABLE>
        <TR MV="loop 1 2 3">
        <TD> [loop-code] </TD>
        <TD> row </TD>
        </TR>
        </TABLE>

      will display:

        1 row
        2 row
        3 row

      There are some differences in operations depending on the tag --
      for instance, <A MV="page somepage" HREF="some_other_page.html">
      will replace the instance of HREF with its own HREF. This allows
      hrefs to work both for static HTML and MiniVend pages.

      Also, <TR MV="if value whatever"> will pair with the matching
      </TR>, but also "look ahead" for an [elsif ...] and [else] in
      the next table rows (or tag set -- could be <LI MV="if ...">
      </LI>, etc).

      The <PRE MV="perl"> </PRE> combination will work for
      cognitively-challenged HTML editors like Netscape Composer -- it
      will retranslate the entities that it auto-translates. And you can
      use <PARAM MV="if whatever"> </PARAM> <PARAM MV="else"> </PARAM> --
      Netscape and Microsoft editors won't auto-delete those when they
      read the file.  ( I really have learned to hate Netscape Composer
      during the testing of this -- when loading a page, it deletes many
      things it doesn't understand, without asking or even *telling* you.
      Sheesh. Microsoft FrontPage, much to my surprise, is much better --
      it allows you to add extended attributes keeps them in the tag. There
      might be hope for it yet. In fact, look for me to add a "MiniVend"
      menu for the FrontPage editor in the release.)

      A special case comes with <SELECT ...> since the <OPTION> tag doesn't
      support extended attributes (at least in FrontPage) there is now an
      attribute MV.OPTION=varname for the loop tag. It has the effect of
      SELECTED to the <OPTION> which is has the same value as the loop-code.
      It will work limited circumstances like:

        <SELECT MV=loop MV.ARG="__SHIPMODES__" MV.OPTION="mv_shipmode">
            <OPTION VALUE="[loop-code]">
                [shipping-desc [loop-code]] [shipping [loop-code]
        </SELECT>

      or
      
        <SELECT MV=loop NAME=country
            MV.SEARCH="se=./ra=yes/fi=country.txt">
            MV.OPTION="country" >
                                    <OPTION> [loop-code]
        </SELECT>

      Bear in mind this is very preliminary editor support, there will
      be lots of anomalies and deficiencies. More shall be revealed....

    * Now can test for more than one condition via [and ...] and
      [or ...]. This works like:

        [if value whatever]
        [or value whomever]
        [and value however]
            Do it. 2 out of 3 is enough.
        [/if]

      The last condition pertains, and there is no parentheses,
      so you can't do [if ...][and ....][or ...]. But you could
      still do:

        [if value whomever]
        [and value whatever]
            Do it. 2 out of 3 is enough.
        [elsif value whomever]
        [and value however]
            Do it. 2 out of 3 is enough.
        [/elsif]
        [/if]

    * If conditions not containing an operator now have the 
      comparison optimized away, removing a call to Safe. This
      means much faster compares for things like [if value whatever]
      and [if data table::column::row], where there is no equality
      or regex pattern check.

    * UPS-style lookup now can have up to 27 zones, can handle
      alphanumeric postal codes (i.e. Canada), can use more than
      three significant digits, can multiply weights by a factor
      for pound/kg conversion, and is much better documented.

    * [body ...] tag now accepts additional arguments to modify
      a preset scheme. [body 1 TEXT=GREEN] will send the preset
      scheme "1" with an additional parameter. Also can put in
      an HTML body tag with <BODY MV="body 1 TEXT=GREEN"> to make
      HTML editor processing easier.

    * SQL search type can now be specified in a profile, a demi-bug
      fixed.

    * Greatly improved independent field matching that supports
      the standard Perl operators plus "em" for exact match. Full
      case sensitivity is included.

    * When doing independent field matching a suitable qualifying
      search is made when available. This greatly speeds searches
      that depend on several conditions.

    * [subtotal], [total-cost], [salestax], [shipping], and [price]
      tags now all have a "noformat" option which just returns a raw
      number.

    * [price ...] tag fixed to fit documented behavior.

    * Precision error in [salestax] fixed. Salestax and shipping
      now use Locale->frac_digits places of precision (normally 2). Be
      careful if you use frac_digits less than 2 -- if you want
      even-dollar pricing you could instead use price_picture for
      currency formatting and keep frac_digits at 2.

    * [random], [rotate], [calc] and [currency] tags now auto-interpolate in
       new mode.

    * UPS-style lookup now can be used in up to 27 originating zones
      in one catalog, non-numeric lookups are allowed, and lookups can
      be more than three characters in length.

    * Shipping can now be set to use the PriceDivide setting for
      currency rate conversion, either global or individual.

    * A new import format, Lotus Notes/structured text, is added.
      Very useful for editing databases by hand.

    * UseModifier can be set in scratch variables with a simple
      [set mv_UseModifier]size color[/set], so you can have any number
      of options for an item without having to set them all.

    * Added order profile checks for "state", "province",
      "province_or_state", "postcode", "ca_postcode", and "zip". Sorry,
      only US/Canada supported, but you can add a check yourself
      in a GlobalSub:

GlobalSub <<EOF
sub set_up_extra_check {
    BEGIN {
        package Vend::Order;
        sub _pt_postcode {
            # $ref is to Vend::Session->{'values'} hash
            # $var is the passed name of the variable
            # $val is current value of checked variable
            my($ref, $var, $val) = @_;
            
            if ($ref->{country} =~ /^(PT|portugal)$/i) {
                return $val =~ /^\d\d\d\d$/ ?  1 : 0;
            }
            else {
                return 1;
            }
        }
    }
}
EOF

      Now you can specify in an order profile:

          postcode=pt_postcode
      
      There must be an underscore preceding the routine name in this
      case. Very elaborate checks are possible, of course. If some user
      takes on the polyglot it would be appreciated if they contribute
      the routines.

      To you MiniVend hackers out there, this is a general technicque you can
      use to override MV subroutines. For the most part, I try to keep the
      same call interface, and this should make updates *much* easier.

    * You can set a form variable value with the new "set" attribute
      for the [value ...] and [default ...] tags. 
         
      Set the variable name to "Mike Heins" and do not return a value:

         [value name=name set="Mike Heins"]

      Set the country to "US", but only if not already defined, and return
      the value:

         [default name=country default=US set=1]
      
      New syntax only, for safety reasons.

    * Added a -r option to the "expire" script. When using GDBM
      sessions (and only GDBM) this will recover disk space and
      shrink a large session file.


MiniVend 3.08 is a maintenance release, but as usual adds a few
features:

    * Syntax of [search] tag much improved. Added auto
      search for loop tag, allowing specification with
      [loop search="se=searchstring/sf=searchfield"].
      Use of search profiles is improved.

    * Microsoft did not fix Excel in Office '97 as earlier
      reported -- its TAB-delimited exports still surround
      any field containing a comma with quotes. A new import
      parameter has been added to deal with this.

    * ProductFiles added to the list of directives updated
      with a locale change.

    * "display" option added to [item-accessories ...] tag,
      to display only the *label* for the selected option.

    * Radio and check box options added to [item-accessories ...]
      tag. These display checkbox or radio groups for options. Can
      also group boxes in tables, including columns if passed a
      numerical parameter.

    * Can now select options based on database field keyed
      on something besides item code.

    Fixes for:

    * MiniVend used MakeMaker to install some distributed copies
      of non-core Perl modules (and a modified Carp.pm). If you
      installed with the parameter UNINST=1 then it would remove
      the module.  That is bad news, and it is fixed. The module
      Carp.pm was removed from the distribution, and other modules
      are installed only by copying if appropriate versions are
      not available, and are only installed in a private library
      directory.

    * Continuing "tar" problems with makecat. The system tar
      program is now used for UNIX machines.

    * Bad domain passing in a cookie. This should remove the
      last problems with proxy servers losing sessions, providing
      the secure server and regular HTTP server are in the same
      domain for cookie purposes.

    * Update of shopping cart caused loss of session only when
      in master item/sub-item mode. Fixed.

MiniVend 3.07 is a major release adding complete POSIX-style
I18N features and many other tag language enhancements.

    * Complete multiple currency sets based on locale. Uses
      standard POSIX definitions.

    * POSIX gettext/LC_MESSAGES style message display
      for multiple language capabilities. A script called
      localize is included which helps build Locale definitions.

    * Price number display greatly enhanced.

    * Sort lists now can specify a beginning entry
      and a length, allowing pageable browse lists. Previous
      versions needed to be done entirely in Perl. Demo
      includes example.

    * Simple demo now uses NewTags by default. Several
      deficiencies cleaned up.  Locale example (French front
      page and currency) example given. Several additional
      examples given. Examples using deprecated features
      changed to use current features.

    * Added simple user login facility as an add-on module.
      documented in UserDB.pm and shown in the demo. This is
      also a useful example of how you can add your own extensions
      to MiniVend.

    * All iterative lists now have an [item-next] and [item-last]
      (or [loop-next] and [loop-last]) capability for exiting and
      skipping entries in loops.

    * PriceAdjustment now handles embedded MiniVend
      tags, allowing completely flexible product pricing.

    * OrderProfile and SearchProfile now can be specified
      in the page.

    * Cookies now set for every path and domain in Mall
      mode.

    It also fixes some bugs/deficiencies:

    * Static builds handle #name anchors when you use
      [pagetarget page#name].

    * Fixed simple demo so scratch directory 'tmp' gets
      created on new install.

    * Documentation corrections.

    * Search [more-list] did not work under Windows -- fixed.

MiniVend 3.06 fixes some bugs with 3.05 and adds some features.

    * Catalog permissions configuration for multi-user,
      multi-catalog servers greatly improved.

    * Added [if ordered ...] back in, inadvertantly deleted
      in 3.05.

    * Added ! comparisons for [if ....][/if], [if-data ...],
      [if-field ...] and the like.

    * Made UserTag available globally in minivend.cfg.

    * Only call CPAN if it was previously used by somebody.

    * PriceAdjustment can now be absolute, where an 
      adjustment value of =10.99 will set the price
      directly to 10.99. Previously the adjustment was
      only relative to the single price for the item.

    * Added new CONTINUE modifier to allow more flexible
      specification of long database fields during ASCII
      import. DITTO format allows you to add additional text
      on the next line, while UNIX accepts \ as a line
      continuation. This allows you to maintain very
      large description fields while still remaining within
      the 255 character limit of many databases and
      spreadsheets.

    * Added passed default to [default variable]
      tag, now can be [default variable passed-default].

    * We can't always use POSIX::strftime anymore because of
      bad RedHat 5.0 Perl release. 8-( A substitute routine is
      provided and should be selected if POSIX::strftime doesn't
      work. Instructions provided for making a good Perl, should
      build OK.

    * Added grouped items with mv_order_group. Using this,
      Sub-items can be tied to a master item placed on a
      form-based order.  The first mv_order_item defined
      becomes the master, additional are sub-items. All
      sub-items are deleted when a master item is deleted
      from the cart.

    * Fixed path problems with database/search path
      resolution.

    * Fixed VendURL mangling when going to a SecureURL
      with a different SCRIPT_NAME.

    * [compat] [/compat] tag pairs are stripped from [old]
      pages.

    * Static pages were shown to all browsers -- now only
      shown to those which have given us back our cookie.

    * [loop ...] lists are now reliably nested with 
      [loop with="-a" arg="A B C"] or [loop-a 1 2 3].

    * Tag end parsing fixed for [loop ...] and others that
      auto-interpolate.

    * Finally added a real debug facility, with multi-level
      control and in-page display. Messages are still crude,
      though, and user input is encouraged.

    * Errors during catalog configuration are now
      displayed to the console on startup.

    * Slightly refined [more-list] to accept a different
      border for selected and non-selected pages when using
      images.

    * Added error message in Windows install to prevent the
      large number of questions from users who try to install
      MiniVend without Perl 5.004 on the machine.

    * CYGWIN.DLL now installed in SYSTEMROOT/system, not just
      C:/windows/system.

    * Tested on Windows NT 4.0 x386.

MiniVend 3.05 is a major update that adds the following:

    * Windows95/NT and UNIX versions unified, many changes
      to handle line-ending differences

    * SendMailProgram and EncryptProgram now accept 'none'
      as parameters, avoid the need for external programs.

    * Removed all autoloading options

    * Added rotate "floor"

    * Makecat program just a bit smarter about some things

    * No UNIX command dependencies

    * Removed sample demo from distribution, too outdated

    * Catalogs can be added online

    * Mode indicator file mode.{inet,unix} in MVROOT/etc

    * Removed final vestiges of DES encryption

    * Workaround for DBI <= 0.90 AutoCommit problem

    * Went to multi-README files

    Bug fixes include:

    * Numerous fixes to sql_search (mv_searchtype=sql)

    * Fixed tag_sort bug for multiple sorting of search lists

    * Fixed [tag sql] query [/tag] to match docs

    * Fixed missing Global variables

    * Fixed close_database, no more SQL disconnect warnings

    * Fixed bug in Windows file-based sessions

MiniVend 3.04 is a minor release to fix bugs in 3.03:

    * If file test was failing on a Safe trap. Fixed.

    * PIPE databases did not work in 3.03 (only) -- they now
      work well even for searching.

    * Major bug in new parser fixed, now virtually every
      tag should be parsed by MiniVend in 'NewTags Yes'
      mode.  Switching to the new parser is recommended,
      as new features will not be added to the old parser.

    * New [elsif ...] addition to [if ...] was not
      documented or announced.

    * Perl 5.003 should run MiniVend without changes.

    * Escape mechanism for values works properly.

    * [include file] tag added.

    * UserTag now accepts Interpolate option.

    * Other minor bug fixes.

MiniVend 3.03 has many bug fixes and feature set improvements.

There is one incompatible change:

    * If you are using Static builds, you must now define
      'Static Yes' in the catalog.cfg file to get static
      pages to build or run.  This was done to provide a
      single "on/off" switch for static builds.

As well as adding the following features/fixes:

    * The new tag syntax is more reliable and trouble-free, 
      and a UserTag directive allows user-defined tags. For example,
      you can do:

        UserTag  caps  Routine  sub { return "\U@_" }
        UserTag  caps  HasEndTag

      and have "[caps]uppercase[/caps]" become "UPPERCASE".

      In addition, almost all old-style tags will be parsed
      properly by the new tag parser.

    * Sorting has been improved and regularized. All iterative
      lists may be sorted with the same syntax, and all may be sorted
      on any database field entry.

        [search-list]
        [sort products:category products:name:f]
        ...
        [/search-list]

      The above will sort a search return on two fields in
      the database -- and will work the same for shopping carts,
      loop lists, and [tag each products].
 
      There are unlimited levels of sort, and all sorts may individually
      have options for numeric, case-insensitive, and reverse. See the
      section SORTING in minivend.html.

    * Added [on-change name] tag to allow conditional nested search
      display.

    * Salestax bug fixed, 'default' now works.

    * AllowGlobal lets certain "trusted" catalogs define global
      subroutines. AdminSub restricts certain subroutine names.

    * ImageAlias does the same thing for MiniVend images that
      Apache/NCSA does with Alias.

    * A robot defense now allows you to limit the number of line
      items in the shopping cart or cut off access to a host that
      accesses a certain number of pages without at least one 30 
      second pause. Implemented with OrderLineLimit and RobotLimit
      directives on a per-catalog basis, and the LockoutCommand
      directive as a global parameter.

    * SQL numerical types are now handled properly if you set the
      NUMERIC option in catalog.cfg, i.e.:
        
        Database  products  NUMERIC price
        Database  inventory NUMERIC on_hand

    * The server will now fall back to UNIX mode only if the
      TcpPort (7786 by default) is occupied and it cannot bind().
      This does not apply if MiniVend was started in INET mode only,
      but there will now be a better log message indicating the
      server is stopped.

    * Started allowing a lower case POST method -- many browsers
      seem to violate the HTTP spec in that regard. This mitigates
      the common "interaction error" problem.

    * Fixed bug in CyberCash processing that allowed only the
      'mauthcapture' mode.

    * Deleted SearchOverMsg directive -- you must now set 
      mv_search_over_msg directly if you want to use it.

MiniVend 3.02 adds full SQL support. In addition, several minor
demo flaws have been polished, and some bugs in the new geographic
shipping changes have been fixed.

Changes include:

    * Full SQL support, including for ODBC, using the powerful
      DBI/DBD interface. It should operate on all DBI-compliant drivers -- it
      has been tested with MySQL, mSQL, Solid, ODBC, and PostgreSQL.

    * All database documentation greatly improved.

    * Geographic qualification for shipping works.

    * mv_credit_card_valid now returned as blank false value
      instead of 0 false value.

    * =true added to order profile checks, will pass on Yes|True|1
      and fail on anything else.

MiniVend 3.00 is greatly changed from MiniVend 2.03, though catalogs
should be almost completely compatible. The exceptions are one or two
pricing and shipping database changes.  In both cases, there is available
backward compatibility. 

Changes include:

    * Installation has been changed to fit the Perl model
      of 'perl Makefile.PL; make; make test; make install'.
      You can also just type './configure' to perform this
      in one step.

      Perl 5.004 allows retrieval and installation of MiniVend
      with 'perl -MCPAN -e 'install Vend::Cart' at the 
      command line.

    * Catalog builder program improved to read Apache/NCSA-style
      configuration files and supply some intelligent defaults.
      Command-line editing and history are supported when teh
      Term::Readline package is available.

    * Optional modules automatically fetched with CPAN module
      if available.

    * A powerful static page building capability is in place.
      This allows completely automated generation of static HTML
      pages based on MiniVend databases.  Use it to build static
      category lists and product pages that will load quickly without
      the necessity of MiniVend parsing them.

    * Dynamic page parsing speed is increased by about 30% when
      using the standard syntax.

    * Multiple product databases allow the breakout of product lines,
      new-used product separation, multi-vendor order routing, and
      more.  The database an item is ordered from is kept with the
      item in the shopping cart, so items ordered with the same part
      number from different databases will not overwrite each other.

    * Database tables are now writeable.  Atomic incrementation is
      supported, which means that reliable inventory counts can be
      kept.  Form-based database updates are expanded to encompass
      all databases, not just mSQL.

    * Transactions can be logged to an arbitrary file in an arbitrary
      format with [tag log file]data[/tag].

    * Databases can be exported to an ASCII file with the [tag export ...]
      [/tag] construct.

    * Shipping is much improved, with built-in subroutine calls, 
      error messages for out of bounds condtions, drop-in UPS zone
      files, configurable handling charges, UPS cost rounding, geographic
      qualification, and more regular syntax.

    * Item attribute selection greatly improved, with automated building
      of the item attribute selection.  Item attributes can easily be 
      specified at the time of order.

    * Item attributes can cause price adjustments on either an
      item basis or attribute basis.

    * Uses Data::Dumper's C-based uneval code when available,
      improving session storage speed.

    * Database tables are only actually opened when referenced,
      improving speed greatly on systems that have a large number
      of tables in the database.

    * Experimental DBI/DBD example interface provided, which
      will allow attachment of supported SQL databases like Solid,
      Oracle, or Sybase. THIS IS EARLY ALPHA SOFTWARE. Use only on
      an experimental basis, never with live data.

    * Search engine has improved coordinated matching, with full
      field-independent case-sensitivity, substring matching, and
      negation.

    * Search speed greatly improved when doing complex
      field-coordinated searches.

    * The FullUrl directive allows different virtual hosts to have
      link programs with the same name, i.e. all named /cgi-bin/shop.

    * A new (and still experimental) page syntax allows more regular
      parsing of tags, removing some of the interpolation-order anomalies
      inherent in the old-style tags. It can be invoked on individual
      pages with the [new] tag.

    * Search cacheing is much improved, and searches can be pre-built
      when using the static page build capability.

    * Pages can be cached, which especially improves performance of
      large parsed pages. Static build is preferred to cache, but
      with large databases it is not practical to build every item
      in advance.

    * Supports Perl 5.004 transparently, making runtime changes to
      affected modules.

    * Better security with the NoAbsolute, AdminPage, .access, and
      AdminDatabase tags.

    * Improved handling of cookies, with savable sessions and dynamic
      expire times.

    * Mailed orders may have MIME attachements. Though the author
      loathes routinely-used MIME, it has value as a way to attach
      an encrypted credit card number for easy processing by an
      order entry workstation.

    * Search sorting bugs fixed.

    * New $Safe{'cgi'}->{form_value} access in embedded Perl allows
      complex conditional search or order routines to be more
      intelligent with regard to user input.

    * New FormIgnore directive allows certain variables to be
      expunged from the user session.

    * Discounted prices can be displayed directly
      with [discount-price].

    * Cookies can be configured for expiration times and multiple
      servers in a domain.

    * Runs with taint checking enabled, even when using
      most embedded Perl code.

    * Many other minor bug fixes, improvements, and changes.

-------------------------------------------------------------


