47aeff9a1cda1aa940df38339ee78dfce0ea8f2e
[minivend.git] / dist / WHATSNEW
1
2                   W H A T ' S   N E W 
3
4 MiniVend 3.15 incorporates some new features -- I couldn't resist. 8-)
5
6     * A new ASP-style syntax is supported:
7
8         <HTML MV=mvasp><BODY>This is HTML</BODY>
9         <%
10             $Document->write('This is code');
11         %>
12         HTML again.
13         <%
14             $Document->write('Code again.');
15         %>
16
17     * A new Perl object set is there to support the ASP, but
18       it also is available via
19
20         [perl arg=new]
21             $Document->write("Your name is $Values->{name}");
22         [/perl]
23
24       Objects supported are:
25
26             $CGI->{key}              Hash reference to submitted values
27             $Document->write()       Writes to page
28             $Carts->{cartname}       Direct reference to shopping carts
29             $Config->{key}           Direct reference to $Vend::Cfg
30             $Items->[n]              Direct reference to current cart
31             $Scratch->{key}          Direct reference to scratch area
32             $Session->{key}          Direct reference to session area
33             $Tag->tagname(@args)     Call a tag as a routine (UserTag too!)
34             $Values->{key}           Direct reference to user form values
35             &Log($msg)               Log to the error log
36
37     * Tag parameters quoted with parameter=`code` are the equivalent of 
38       parameter="[calc]code[/calc]".
39
40     * Tag parameters can be quoted with | to strip whitespace:
41     
42         [page  href=|
43                     [value name="whatever"]
44                     |]
45
46         is equivalent to 
47
48         [page  href="[value name="whatever"]"]
49
50     * Tag parameters can be quoted with | to strip whitespace:
51     
52         [page  href=|
53                     [value name="whatever"]
54                     |]
55
56         is equivalent to 
57
58         [page  href="[value name="whatever"]"]
59
60     * Tag parameters can be quoted with @ to insert a scratch
61       value:
62     
63         [value name=foo set=@bar@]
64         [value name=foo set="[scratch bar]"]
65
66       This can be useful when setting large values into variables,
67       as it is much more efficient than the previous method.
68
69     * Input values filters can be set up by quoting with ! and
70       an operation:
71     
72         <INPUT TYPE=text NAME=phone VALUE="[value name=!phone:digits!]">
73
74       This guarantees that the value of "phone" will be digits only
75       when sent to MiniVend. Filters include:
76
77           uc          UPPER CASE 
78           lc          lower case 
79           digits      only digits
80           word        only A-Z a-z _ 0-9
81           urlencode   space becomes %20
82           entities    < becomes &lt;
83           strip       strip leading/trailing whitespace
84           no_white    strip all whitespace
85           gate        set to blank unless scratch variable
86                        with same name is non-blank
87           n           (where n is an integer) length limit
88           remove      delete existing filter (if any)
89
90        Filters can also be created with Filter directive
91        and/or [input-filter op="uc"][/input-filter]
92
93     * Filter directive allows filtering of certain CGI variables
94       for input conditioning; this is not session dependent and
95       automatically operates on any iteration of the variable...
96
97         Filter  phone  digits 10
98
99       That removes all non-digit values from the variable "phone",
100       then limits length to 10. Any session-based filters are applied
101       after this one.
102
103     * [input-filter name=foo] CODE [/input-filter]
104
105       Sets a routine passed to the equivalent of a "[calc]" tag.
106       The value to be filtered is placed in the variable "$mv_filter_value",
107       and the name is set to "$mv_filter_name". It is possible to
108       do something like:
109
110           [input-filter name=country]
111             my $touched = '[tag touch country][/tag]';
112             my $val = $mv_filter_value;
113             my $prospect = &tag_data('country', 'name', $val);
114             return $prospect || $val;
115           [/input-filter]
116
117       That will return the name of a country if it is found as a key
118       in the database (assuming the simple demo country definitions).
119
120     * Small improvements in the parser, notably optimization when
121       positional parameters are used.
122
123     * ECML is supported via the Vend::ECML module. To map the 
124       checkout form values from MiniVend UserDB names, with an [ecml ...]
125       tag:
126
127             [ecml state]
128
129       is equivalent to:
130
131             <INPUT TYPE=text
132                    VALUE="[value state]"
133                    NAME=Ecom_ShipTo_Postal_StateProv
134                    SIZE=2>
135
136     * The [price] tag now supports pricing with attributes (size/color etc.).
137       If you do
138
139             [price code=99-102 size=XL color=RED]
140             [price code=99-102 size=L color=RED]
141             [price code=99-102 size=L color=BLUE]
142
143       in the demo, this will demonstrate it.
144
145     * The idiom:
146         
147          #include directory/*
148
149       now is supported (and used in the demo minivend.cfg file). This
150       includes all files in that directory (but not subdirectories)
151       and allows you to include the whole directory. It should make
152       maintaining multiple servers a bit easier.
153
154     * Items can now be ordered "on-the-fly" in the standard
155       distribution by adding mv_order_fly.
156
157     * Added form-remap based on catalog script-name (too early for
158       other methods). In minivend.cfg:
159
160             FormRemap  /cgi-bin/simple  code mv_order_item
161             FormRemap  /cgi-bin/simple  item mv_order_fly 
162     
163     * Made some minor changes in the demo:
164
165         - updated flypage to show attribute-based price tag
166         - fixed query/check_orders using st=db
167         - removed some syntax errors
168         - added [email to=addr from=addr subject=subj] message [/email]
169           UserTag which is better then the form_mail GlobalSub. It will
170           allow $Tag->email() to be used, among other things.
171         - Static build should work out of the box if you
172           have DBM and define:
173            
174               StaticDBM static
175
176     * Makecat now strips quotes from Apache parameters read from
177       httpd.conf file.
178
179     * Added Tagref.pm module which can document the implementation
180       of even UserTags. Add this to minivend.cfg to print one
181       to a MiniVend page:
182
183         UserTag tag-reference Routine <<EOR
184         sub {
185             require Vend::Tagref;
186             open (TAGREF, ">mv_tagref.pod");
187             my $reference = Vend::Tagref::tag_reference();
188             print TAGREF $reference;
189             close TAGREF;
190             my $out =  `pod2html mv_tagref.pod`;
191             if(! $out) {
192                  $Vend::StatusLine = "Content-Type: text/plain\r\n";
193                 $out = $reference;
194             }
195             return $out;
196         }
197         EOR
198
199     * Removed all dependencies on ProductsFiles containing 
200       'products'.
201
202     * Added Legacy directive to minivend.cfg to support older
203       catalogs that don't define "products" database.
204
205     * Many bug fixes, of course. Notably [and ...] and [or ..]
206       were broken in some cases.
207
208 MiniVend 3.14 is a bug fix release with a couple of new features:
209
210     * You can now specify a database in minivend.cfg. It becomes
211       global and is available in all catalogs. It also remains connected
212       all of the time, so no connection overhead exists. Careful; 
213       it is writable by any catalog unless you use WRITE_CONTROL
214       defined below.
215
216     * Added write control to all databases including SQL. If you wish to
217       control writing of a global database, or to a certain catalog within
218       a series of subcatalogs, or make one read only, you can do so.
219
220       To enable write control:
221
222         Database   products  WRITE_CONTROL  1
223
224       Once that is done, you can make a database read only, which won't
225       allow writing even if [tag flag write]products[/tag] is specified:
226
227         Database   products  READ_ONLY  1
228
229       If you want to have control with [tag flag write]products[/tag]:
230
231         Database   products  WRITE_TAGGED  1
232
233       If you want to limit write to certain catalogs, you can set:
234
235         Database   products  WRITE_CATALOG  simple=0, sample=1
236
237       The "simple" catalog will not be able to write, while "sample"
238       will if [tag flag write]products[/tag] is enabled.
239
240       If you want a database to be always writable without having
241       to specify [tag flag write] ... [/tag], then you can
242       define:
243
244         Database   products  WRITE_ALWAYS  1
245
246       The default behavior of SQL datbases is equivalent to
247       WRITE_ALWAYS, while the default for GDBM_File, DB_File,
248       and Memory databases is equivalent to:
249
250         Database   products  WRITE_CONTROL 1
251         Database   products  WRITE_TAGGED  1
252
253       As a side effect, I also removed the server error if a write
254       fails on a DBM database. It simply doesn't write and logs
255       the problem.
256
257     * Added a DbSearch.pm module which adds a new search type called
258       "db". This searches a SQL database with MiniVend search types,
259       or searches a MiniVend database instead of the ASCII file.
260
261       If it is a SQL table being searched, you can specify a coordinated
262       search and any "==" or "eq" operators will be used to filter the
263       initial search return. Otherwise, all rows of the database are
264       scanned upon each search. This can get slow, so you won't want to
265       do this for large tables.
266
267       The major difference between this and the TextSearch type is that
268       you must set base_directory to the table name/identifier of the
269       default database being searched; it defaults to 'products', which
270       is probably not what you want. This sets the field specifications
271       for the SQL qualification, so you must be careful. You can search
272       multiple tables, which will work well if the column names and orders
273       are the same. It will not work well if they are different, so it will
274       be rare when you want to search multiple tables.
275
276     Bug fixes:
277
278     * Set default for NewReport to "yes", which prevents the occasional
279       problem with returning a bogus error report if mv_order_report is
280       not set.
281     
282     * Fixed some weirdness in parsing certain search parameters, notably
283       mv_sql_query and index search specifications.
284
285     * Changed sort variables to globals so that sorting should be
286       reliable. I hope.
287
288     * Fixed quantity problem for [price code].
289
290     * Made mv_order_subject work for order routing.
291
292     * Order tracking now can be done in order routing.
293
294 MiniVend 3.12 is a major release with multiple new features,
295 particularly in the area of user access control.
296
297 New features: 
298
299     * Major rework of the "simple" demo. (The HTML in that demo
300       was circa 1995 when the first work on MiniVend was done.)
301       Made it into the cookie-cutter style favored today, and
302       combined frames/non-frames demo.
303
304     * Added a new demo, "flycat". Documentation is sparse, will
305       remain sparse, and is totally located in the README.flycat
306       page.
307
308     * Rolled the former demonstration add-on feature UserDB.pm
309       into the main distribution. Added a [userdb ....] tag which
310       performs operations like login, logout, password change, etc.
311
312     * UserDB is now completely documented. It has many new 
313       features.
314
315     * Added four types of access control based on User database
316       login. The preferred method uses a .access_gate file to specify
317       per-page access -- this is demonstrated in the demo with the
318       [page reconfig/reconfig] page and is completely documented.
319       Another simple method allows checking of page names before loading;
320       a db_acl allows checking for read/write permission on a database;
321       and a file_acl allows read/write checking on file names. The two
322       latter ones are only enforced by your own programs; the simple
323       integrated method can be automatic.
324
325     * CookieLogin directive allows you to set a cookie with the
326       username and password of a user for auto-login. 
327
328     * [set-cookie name value expire] and [read-cookie name] tags added.
329
330     * Added a feature I have been thinking about for a long time -- 
331       form-linked page refs. If you want to order an item with configurable
332       size/color by a link, you can now do:
333
334         [page form="
335                 mv_order_item=99-102
336                 mv_order_size=L
337                 mv_order_quantity=1
338                 mv_separate_items=1
339                 mv_todo=refresh"] Order t-shirt in Large size </A>
340
341       It was so simple to add I don't know why I didn't before now.
342
343       You must have TolerateGet set (which is now the default) and
344       all normal MiniVend form caveats apply -- you must have an action,
345       you must supply a page if you don't want to go to the default,
346       etc.
347
348       You can theoretically submit any form with this; it is best
349       if none of the included values have newlines. You can also
350       use it for submitting foreign forms if you like; it will
351       not touch the href if it begins with http:, ftp:, or the
352       like.
353
354       The [area ...] tag works the same way, though the deprecated
355       [pagetarget ....] and [areatarget ...] were left out.
356
357     * Added user-definable fields and command scripts to the command-line
358       makecat procedure.
359
360     * Added rudimentary documentation on building your own catalog
361       template.
362
363     * Added [import table type] tag for importing database
364       records. Supports all types including NOTES, the best mode to
365       use for inline text. Also supports import directly from a file.
366
367     * Glimpse now fully supports coordinated searching, though
368       you must make sure you have at least one regular-expression
369       based match.
370
371     * Added support for file upload/download. A demonstration is
372       included in the simple demo.
373
374     * [sql-param ...] and [item-param ...] now both support named
375       fields.
376
377     * Totally removed support for the old Msql.pm module. If you
378       still use this, use an older version or update to DBI.
379
380     * You can set an UPPERCASE parameter in the Database directive:
381
382         Database   products   UPPERCASE  1
383
384       You want to apply this to SQL only.
385
386       This allows lowercase field references in [item-field column]
387       and [item-data table column] (and sql- and loop- too). This
388       should make it easier to get things working with Oracle
389       and other DBs which won't return a lowercase field name for
390       fetchrow_hashref. Note that this is not used in [item-param
391       field] where you should know what the name is.
392
393     * There is an [if-param name] and [if-sql-param name] tag
394       ala [if-field ...] and [if-data ...].
395
396     * Added a [value-extended ...] tag which allows access to 
397       the array values of a form variable.
398
399     * In my continuing quest to get people to use the UserTag
400       capability, provided a few new ones in the demos -- notably
401       a summary tag that is employed to total shipping weight in
402       the demo, and a [table-font] [/table-font] tag which removes
403       the onerous chore of setting a default font for every table
404       cell.
405
406     * Added multi-field searching for the coordinated search.
407       You may pass a field like ":0..9" and have it search
408       fields 0 through 9 for that search term only.
409
410     * Added [next-anchor], [prev-anchor], and [page-anchor] container
411       tags for complete configurability of [more-list][/more-list] 
412       area. This also closes complaints about no spacing between
413       Previous and first page; prior behavior kept for compatibility.
414
415     * Added a Storable interface selectable at software
416       configuration time. If Storable is installed, and the
417       file _db_storable is present in the MiniVend software root,
418       (or the environment variable MINIVEND_STORABLE_DB is true)
419       then Storable will be used not only for sessions but for
420       all GDBM and DB_File storage. THIS BREAKS EXISTING CATALOGS.
421       If you want to use Storable only for sessions, just set
422       the environment variable $ENV{MINIVEND_STORABLE} to 1 as usual.
423       You can also create a _session_storable file in the MiniVend root.
424
425     * Verified the DBI interface to work with DBD::XBase (subject
426       to the usual limitations like fieldname length), which
427       allows XBASE/DBF files to be used directly. This is probably
428       not useful for anything except an import interface; something
429       like:
430
431         [tag export products_dbf products.asc TAB][/tag]
432
433       This would allow a user to upload a DBF file and
434       then import that into a standard TAB-delimited.
435
436     * Added a perhaps more convenient Locale language facility,
437       which looks like:
438
439         [LC] This is the default text
440                 [de_DE] Text for de_DE locale [/de_DE]
441                 [en_US] Text for en_US locale [/en_US]
442                 [fr_FR] Text for fr_FR locale [/fr_FR]
443         [/LC]
444
445 Bugs fixed:
446
447     * [setlocale] currency and persist parameters were
448       swapped; fixed.
449
450     * Multiple selection checks that contained non-word characters
451       would not be re-selected upon building an item-accessories
452       box. Fixed.
453
454     * Memory databases were getting imported too often, fixed
455       bug in database initalization routines.
456
457     * Fixed ownership problems in the mv_admin catalog; the
458       installation should work flawlessly as root providing parent
459       directories have the proper permission.
460
461     * Due to persistent Perl problems with signal handling, the
462       default demo is now distributed with PIDcheck enabled.
463       New behavior when PIDcheck is in force is to reset the
464       number of active servers based on the presence of PID files,
465       while still rate-limiting to MaxServers iterations between
466       housekeeping checks. The SafeSignals directive is deleted
467       (it will generate a deprecated warning but allow startup
468       to continue).
469
470       This problem would occasionally cause busy servers to
471       "freeze" as they reached and failed to go below the MaxServers 
472       level.
473
474       If the PIDcheck directive is set, the number of servers will
475       be automatically adjusted every HouseKeeping seconds according
476       to the pid files.  The recommended value for PIDcheck is now
477       180-600 seconds; the demos will come set to 300.
478
479     * Fixed "bad search column" error when searching the first
480       column of the products file or key column of a file.
481
482     * Fixed security hole allowing user-specification of absolute
483       search file names.
484
485     * Fixed error with CyberCash number formatting when 
486       using a non-english number format (i.e. spaces and
487       commas in non-english places).
488
489     * mv_sort_field works even without mv_sort_command.
490
491     * Indexing works for Windows.
492
493 MiniVend 3.11 is a major release enhancing many aspects of installation,
494 product pricing, secure authorization, searching, and database updates.
495
496     * New experimental internal HTTP server means very fast
497       request handling direct from the browser, and built-in
498       internal security for admin tasks and protected catalog
499       pages. Will authorize users from the add-in userdb database
500       or any other MiniVend database. Supports crypt, minimal
501       access logging.
502
503       This internal HTTP server is not meant for production use.
504       It may have difficulty with MS Internet Explod^Her.
505
506     * New catalog configuration "wizard" and admin interface
507       built in. The installation should be a one-step
508       operation, completely automatic providing you have
509       the MIME::Base64 and URI::URL modules.
510
511     * New mv_admin catalog implements HTTP-based reconfiguration
512       from a central place. Tags provided for you to gate it
513       for individual users.
514
515     * CPAN module installation improved.
516
517     * The makecat script now can be completely run from the command
518       line, no interactive steps necessary. Values can be partially
519       filled in from the command line and you will be prompted
520       for the rest. A "guess" mode returns a reference as a
521       string guessing certain parameters from the ones you
522       supply. And you can do a --nocopy test run to check the
523       results before you actually copy the files.
524
525       Unfortunately the only documentation is the usage message.
526
527     * Makecat program adds catalogs to a running server.
528     
529     * German error messages added to error locale file (thanks to
530       Karsten Mueller).
531
532     * New CommonAdjust price setting scheme allows chained
533       conditional lookups in pricing, shipping, and taxing. Added
534       mv_price attribute for easy setting of prices in embedded
535       Perl. Added [discount-subtotal] tag which will reliably give
536       an item subtotal with discounts applied. New mv_discount
537       attribute allows individual line item discounts.
538
539     * TemplateDir (both local and global) allows missing
540       pages to "fall back" to other places. This allows
541       a catalog distribution that might only contain one
542       or two pages.
543
544     * Added LocaleDatabase, VariableDatabase, and DbDatabase;
545       these allow setting of the Locale, Variable, and Database
546       directives from a database table. This will allow maintenance
547       improvements (they still only change value on startup or
548       reconfigure.)
549
550       LocaleDatabase is implemented in the demo.
551
552     * Added support for CyberCash 3 (thanks to Gunnar Hellekson),
553       AUTHORIZE.NET, and PAYMENTNOW.COM.
554
555     * New [goto LABEL] and [label LABEL] allow chunks of a 
556       page to be skipped.
557
558     * DB_File databases can be automatically compacted with
559       the expire program; a standalone "compact" script is
560       also provided.
561
562     * Added PIDcheck global directive to allow monitoring of
563       "hung" processes. This should make MiniVend more reliable
564       especially in combination with Glimpse searching.
565
566     * Text search engine now will combine binary searching with
567       database-based searches. New mv_search_map allows reliable
568       coordinated searchspecs even with empty search specifications.
569
570     * Fixed multi-page sorting problems that were in MiniVend
571       since 3.00.
572
573     * Added new WideOpen directive so that catalogs can individually
574       be set to tolerate no IP address qualification. It is named
575       that because that is what you will be; you should not use this
576       if you ever store unencrypted credit cards (or other sensitive
577       info). It is also recommend that you shorten your expire time
578       to a small number of hours, maybe even 1 or 2.
579
580     * Added new FallbackIP directive to allow quasi-cookie capability
581       by IP address and browser id string. Use if you have lots of
582       users who don't take/give cookies. Suggest also that expire
583       times be made short, though two users would have to have the
584       same exact browser string and IP address. It will work with
585       cookies if they have them.
586
587     * Added va=var=value parameter to one-click search so you
588       can set a value with a link.
589
590     * Allow deletes with form database maintenance (mv_data_*).
591       Added mv_data_decode to gate HTML::Entities decoding of data;
592       this will allow easy and reliable display of multi-line fields
593       in a <TEXTAREA>.
594
595     * Added "expireall" script that expires all catalogs
596       in minivend.cfg by calling expire -c <name> [-r].
597
598     * Fixed longstanding "untie attempted" bug.
599
600     * Fixed mv_save_session so it actually will send the
601       user back to their saved session.
602
603 MiniVend 3.10 is a bug-fix release with a few minor updates.
604
605     * New IpQuad global directive allows removal of any IP address
606       qualification from the session name, allowing transferred
607       sessions from server to server. Just set
608       
609         DomainTail No
610         IpHead     Yes
611         IpQuad     0
612
613       in minivend.cfg and transfer of sessions from AOL or WebTV
614       should now be possible. This makes it possible to use different
615       domains for the secure server and the non-secure server, even
616       when the browser will not set cookies outside the current
617       domain.
618
619       IMPORTANT NOTE: Remember that security is compromised
620       greatly by this; it should be used in combination with
621       PGP-encrypted credit card information with CreditCardAuto,
622       or with MiniVend's internal CyberCash routines. YOU SHOULD
623       NEVER STORE ANY UNENCRYPTED CREDIT CARD INFORMATION ANYWHERE
624       WHEN USING THIS WORKAROUND.
625
626     * New URLDECODE tag, specific to the new/HTML tag style, provides
627       unescape and URL translation services for <A HREF...> and
628       <IMG ....> tags. If you use FrontPage or other
629       HTML editors they will translate spaces to %20 within
630       an image SRC or anchor HREF. Now you can do:
631
632         <IMG MV=urldecode SRC="[value%20saved_image]"> 
633
634       Flypages and search lists are done automatically.
635
636     * HTML-style CHECKED and SELECTED now works properly.
637
638     * Fixed EXCEL import mode so it also strips paired double quotes.
639
640     * Lotus NOTES format can now be exported.
641
642     * Now can have separate language and currency locales,
643       using the mv_currency scratch variable just as with mv_locale;
644       and with [setlocale locale=fr_FR currency=en_US].
645
646     * New Global Locale tag gives global default for error
647       messages. Error messages are numbered by module, and can
648       be changed. A default file locale.error will define the
649       usable keys; it is not configured in by default.
650
651     * Error messages are numbered and the current locale can
652       be used to generate many of them. This is not yet complete,
653       but should be much improved. See the locale.error file for
654       a list of keys to define for translation.
655
656     * MiniVend should work with the Storable module version
657       0.6@3 or higher, greatly increasing speed of session
658       storage and recall. To use, install at least that version
659       and set the environment variable MINIVEND_STORABLE to 1.
660
661 MiniVend 3.09 is a release that optimizes speed and adds features
662 that allow operation with some HTML editors.
663
664     * SQL optimizations make dramatic differences in table
665       construction speed. MiniVend now uses internal structures to
666       maintain SQL column headings. This means that if you change
667       your SQL table structure, you must restart Minivend, but you
668       gain quite a bit of speed.
669
670       [if-data]/[item-data], [(if-)?loop-data], and [(if-)?sql-data]
671       tags are optimized across rows in the corresponding iterative
672       list. This means that two selects are done where dozens might
673       have been done before. Speed really increases.
674
675       This optimization works for [if-field]/[item-field] and friends
676       as well if there is only one products table (i.e. you didn't
677       set ProductFiles). If you have more than one, you should use
678       [item-data products ...] instead of [item-field ...] for best
679       speed when appropriate.
680
681     * To improve page response time, you can specify a SEND=1
682       attribute to any new-syntax MiniVend tag -- it sends the
683       output that has accumulated to that point. If you have named
684       your link program to begin with nph- (i.e. nph-simple instead
685       of simple) the program will start sending output immediately.
686       This can greatly improve apparent response time on large search
687       or loop lists.
688
689       The nph-executable can also be optionally used with an
690       alias:
691
692       Catalog simple /catalogs/simple /cgi-bin/simple /cgi-bin/nph-simple
693
694       If you reduce your vlink buffer size to 512 bytes, this will
695       improve likelihood of immediate response at some cost in CPU
696       utilization. (This change requires editing vlink.c and compiling --
697       don't worry about it if you don't know how to do that.)
698
699     * Search cache is *much* improved.  Paging and caching should now
700       be completely reliable. If the user hits reload, it will refresh the
701       page, as Pragma: no-cache is honored. Search paging is cached as well.
702       You can invalidate the cache for the next page only with 
703       [set mv_no_cache]1[/set].
704
705     * You can encase a set of links in:
706
707         [set mv_no_count]1[/set]
708         [page whatever]A page[/page]
709         [page whereever]Also a page[/page]
710         [set mv_no_count]0[/set]
711
712       The link count will be updated but not appended, making links
713       repeatable. This allows the browser to highlight visited links,
714       especially nice for paged searches.
715
716     * The last search can be reproduced with the [data session last_search]
717       via [page href="[data session last_search]"]. This includes
718       links to different pages of a multi-page search return.
719
720     * If you don't have the MD5 module for some reason (get it!)
721       MV does some better cache key generation with checksums,
722       reducing the likelihood of a collision.
723
724     * Fixed spurious "ClearCache" error at startup.
725
726     * MiniVend tags can now be contained within HTML tags, allowing MV
727       to work somewhat with most any HTML editor. The problem before was
728       that tags could not be placed between table rows with certain HTML
729       editors (like FrontPage and Netscape Composer). It is triggered by
730       including MV="tag arg arg.." as the *first* attribute of the HTML tag.
731       (Actually it can be later in the tag if no ] or > characters intervene.)
732       For example:
733
734         <TABLE>
735         <TR MV="loop" MV.search="ml=2000/se=Impressionists/sf=category">
736         <TD> [loop-field title] </TD>
737         <TD> [loop-code] </TD>
738         </TR>
739         </TABLE>
740
741       will display:
742
743         Sunflowers       00-341 
744         The Starry Night 00-342 
745
746       Arguments can be combined with tags if there is whitespace
747       in the first mv="tag arg.." call:
748
749         <TABLE>
750         <TR MV="loop 1 2 3">
751         <TD> [loop-code] </TD>
752         <TD> row </TD>
753         </TR>
754         </TABLE>
755
756       will display:
757
758         1 row
759         2 row
760         3 row
761
762       There are some differences in operations depending on the tag --
763       for instance, <A MV="page somepage" HREF="some_other_page.html">
764       will replace the instance of HREF with its own HREF. This allows
765       hrefs to work both for static HTML and MiniVend pages.
766
767       Also, <TR MV="if value whatever"> will pair with the matching
768       </TR>, but also "look ahead" for an [elsif ...] and [else] in
769       the next table rows (or tag set -- could be <LI MV="if ...">
770       </LI>, etc).
771
772       The <PRE MV="perl"> </PRE> combination will work for
773       cognitively-challenged HTML editors like Netscape Composer -- it
774       will retranslate the entities that it auto-translates. And you can
775       use <PARAM MV="if whatever"> </PARAM> <PARAM MV="else"> </PARAM> --
776       Netscape and Microsoft editors won't auto-delete those when they
777       read the file.  ( I really have learned to hate Netscape Composer
778       during the testing of this -- when loading a page, it deletes many
779       things it doesn't understand, without asking or even *telling* you.
780       Sheesh. Microsoft FrontPage, much to my surprise, is much better --
781       it allows you to add extended attributes keeps them in the tag. There
782       might be hope for it yet. In fact, look for me to add a "MiniVend"
783       menu for the FrontPage editor in the release.)
784
785       A special case comes with <SELECT ...> since the <OPTION> tag doesn't
786       support extended attributes (at least in FrontPage) there is now an
787       attribute MV.OPTION=varname for the loop tag. It has the effect of
788       SELECTED to the <OPTION> which is has the same value as the loop-code.
789       It will work limited circumstances like:
790
791         <SELECT MV=loop MV.ARG="__SHIPMODES__" MV.OPTION="mv_shipmode">
792             <OPTION VALUE="[loop-code]">
793                 [shipping-desc [loop-code]] [shipping [loop-code]
794         </SELECT>
795
796       or
797       
798         <SELECT MV=loop NAME=country
799             MV.SEARCH="se=./ra=yes/fi=country.txt">
800             MV.OPTION="country" >
801                                     <OPTION> [loop-code]
802         </SELECT>
803
804       Bear in mind this is very preliminary editor support, there will
805       be lots of anomalies and deficiencies. More shall be revealed....
806
807     * Now can test for more than one condition via [and ...] and
808       [or ...]. This works like:
809
810         [if value whatever]
811         [or value whomever]
812         [and value however]
813             Do it. 2 out of 3 is enough.
814         [/if]
815
816       The last condition pertains, and there is no parentheses,
817       so you can't do [if ...][and ....][or ...]. But you could
818       still do:
819
820         [if value whomever]
821         [and value whatever]
822             Do it. 2 out of 3 is enough.
823         [elsif value whomever]
824         [and value however]
825             Do it. 2 out of 3 is enough.
826         [/elsif]
827         [/if]
828
829     * If conditions not containing an operator now have the 
830       comparison optimized away, removing a call to Safe. This
831       means much faster compares for things like [if value whatever]
832       and [if data table::column::row], where there is no equality
833       or regex pattern check.
834
835     * UPS-style lookup now can have up to 27 zones, can handle
836       alphanumeric postal codes (i.e. Canada), can use more than
837       three significant digits, can multiply weights by a factor
838       for pound/kg conversion, and is much better documented.
839
840     * [body ...] tag now accepts additional arguments to modify
841       a preset scheme. [body 1 TEXT=GREEN] will send the preset
842       scheme "1" with an additional parameter. Also can put in
843       an HTML body tag with <BODY MV="body 1 TEXT=GREEN"> to make
844       HTML editor processing easier.
845
846     * SQL search type can now be specified in a profile, a demi-bug
847       fixed.
848
849     * Greatly improved independent field matching that supports
850       the standard Perl operators plus "em" for exact match. Full
851       case sensitivity is included.
852
853     * When doing independent field matching a suitable qualifying
854       search is made when available. This greatly speeds searches
855       that depend on several conditions.
856
857     * [subtotal], [total-cost], [salestax], [shipping], and [price]
858       tags now all have a "noformat" option which just returns a raw
859       number.
860
861     * [price ...] tag fixed to fit documented behavior.
862
863     * Precision error in [salestax] fixed. Salestax and shipping
864       now use Locale->frac_digits places of precision (normally 2). Be
865       careful if you use frac_digits less than 2 -- if you want
866       even-dollar pricing you could instead use price_picture for
867       currency formatting and keep frac_digits at 2.
868
869     * [random], [rotate], [calc] and [currency] tags now auto-interpolate in
870        new mode.
871
872     * UPS-style lookup now can be used in up to 27 originating zones
873       in one catalog, non-numeric lookups are allowed, and lookups can
874       be more than three characters in length.
875
876     * Shipping can now be set to use the PriceDivide setting for
877       currency rate conversion, either global or individual.
878
879     * A new import format, Lotus Notes/structured text, is added.
880       Very useful for editing databases by hand.
881
882     * UseModifier can be set in scratch variables with a simple
883       [set mv_UseModifier]size color[/set], so you can have any number
884       of options for an item without having to set them all.
885
886     * Added order profile checks for "state", "province",
887       "province_or_state", "postcode", "ca_postcode", and "zip". Sorry,
888       only US/Canada supported, but you can add a check yourself
889       in a GlobalSub:
890
891 GlobalSub <<EOF
892 sub set_up_extra_check {
893     BEGIN {
894         package Vend::Order;
895         sub _pt_postcode {
896             # $ref is to Vend::Session->{'values'} hash
897             # $var is the passed name of the variable
898             # $val is current value of checked variable
899             my($ref, $var, $val) = @_;
900             
901             if ($ref->{country} =~ /^(PT|portugal)$/i) {
902                 return $val =~ /^\d\d\d\d$/ ?  1 : 0;
903             }
904             else {
905                 return 1;
906             }
907         }
908     }
909 }
910 EOF
911
912       Now you can specify in an order profile:
913
914           postcode=pt_postcode
915       
916       There must be an underscore preceding the routine name in this
917       case. Very elaborate checks are possible, of course. If some user
918       takes on the polyglot it would be appreciated if they contribute
919       the routines.
920
921       To you MiniVend hackers out there, this is a general technicque you can
922       use to override MV subroutines. For the most part, I try to keep the
923       same call interface, and this should make updates *much* easier.
924
925     * You can set a form variable value with the new "set" attribute
926       for the [value ...] and [default ...] tags. 
927          
928       Set the variable name to "Mike Heins" and do not return a value:
929
930          [value name=name set="Mike Heins"]
931
932       Set the country to "US", but only if not already defined, and return
933       the value:
934
935          [default name=country default=US set=1]
936       
937       New syntax only, for safety reasons.
938
939     * Added a -r option to the "expire" script. When using GDBM
940       sessions (and only GDBM) this will recover disk space and
941       shrink a large session file.
942
943
944 MiniVend 3.08 is a maintenance release, but as usual adds a few
945 features:
946
947     * Syntax of [search] tag much improved. Added auto
948       search for loop tag, allowing specification with
949       [loop search="se=searchstring/sf=searchfield"].
950       Use of search profiles is improved.
951
952     * Microsoft did not fix Excel in Office '97 as earlier
953       reported -- its TAB-delimited exports still surround
954       any field containing a comma with quotes. A new import
955       parameter has been added to deal with this.
956
957     * ProductFiles added to the list of directives updated
958       with a locale change.
959
960     * "display" option added to [item-accessories ...] tag,
961       to display only the *label* for the selected option.
962
963     * Radio and check box options added to [item-accessories ...]
964       tag. These display checkbox or radio groups for options. Can
965       also group boxes in tables, including columns if passed a
966       numerical parameter.
967
968     * Can now select options based on database field keyed
969       on something besides item code.
970
971     Fixes for:
972
973     * MiniVend used MakeMaker to install some distributed copies
974       of non-core Perl modules (and a modified Carp.pm). If you
975       installed with the parameter UNINST=1 then it would remove
976       the module.  That is bad news, and it is fixed. The module
977       Carp.pm was removed from the distribution, and other modules
978       are installed only by copying if appropriate versions are
979       not available, and are only installed in a private library
980       directory.
981
982     * Continuing "tar" problems with makecat. The system tar
983       program is now used for UNIX machines.
984
985     * Bad domain passing in a cookie. This should remove the
986       last problems with proxy servers losing sessions, providing
987       the secure server and regular HTTP server are in the same
988       domain for cookie purposes.
989
990     * Update of shopping cart caused loss of session only when
991       in master item/sub-item mode. Fixed.
992
993 MiniVend 3.07 is a major release adding complete POSIX-style
994 I18N features and many other tag language enhancements.
995
996     * Complete multiple currency sets based on locale. Uses
997       standard POSIX definitions.
998
999     * POSIX gettext/LC_MESSAGES style message display
1000       for multiple language capabilities. A script called
1001       localize is included which helps build Locale definitions.
1002
1003     * Price number display greatly enhanced.
1004
1005     * Sort lists now can specify a beginning entry
1006       and a length, allowing pageable browse lists. Previous
1007       versions needed to be done entirely in Perl. Demo
1008       includes example.
1009
1010     * Simple demo now uses NewTags by default. Several
1011       deficiencies cleaned up.  Locale example (French front
1012       page and currency) example given. Several additional
1013       examples given. Examples using deprecated features
1014       changed to use current features.
1015
1016     * Added simple user login facility as an add-on module.
1017       documented in UserDB.pm and shown in the demo. This is
1018       also a useful example of how you can add your own extensions
1019       to MiniVend.
1020
1021     * All iterative lists now have an [item-next] and [item-last]
1022       (or [loop-next] and [loop-last]) capability for exiting and
1023       skipping entries in loops.
1024
1025     * PriceAdjustment now handles embedded MiniVend
1026       tags, allowing completely flexible product pricing.
1027
1028     * OrderProfile and SearchProfile now can be specified
1029       in the page.
1030
1031     * Cookies now set for every path and domain in Mall
1032       mode.
1033
1034     It also fixes some bugs/deficiencies:
1035
1036     * Static builds handle #name anchors when you use
1037       [pagetarget page#name].
1038
1039     * Fixed simple demo so scratch directory 'tmp' gets
1040       created on new install.
1041
1042     * Documentation corrections.
1043
1044     * Search [more-list] did not work under Windows -- fixed.
1045
1046 MiniVend 3.06 fixes some bugs with 3.05 and adds some features.
1047
1048     * Catalog permissions configuration for multi-user,
1049       multi-catalog servers greatly improved.
1050
1051     * Added [if ordered ...] back in, inadvertantly deleted
1052       in 3.05.
1053
1054     * Added ! comparisons for [if ....][/if], [if-data ...],
1055       [if-field ...] and the like.
1056
1057     * Made UserTag available globally in minivend.cfg.
1058
1059     * Only call CPAN if it was previously used by somebody.
1060
1061     * PriceAdjustment can now be absolute, where an 
1062       adjustment value of =10.99 will set the price
1063       directly to 10.99. Previously the adjustment was
1064       only relative to the single price for the item.
1065
1066     * Added new CONTINUE modifier to allow more flexible
1067       specification of long database fields during ASCII
1068       import. DITTO format allows you to add additional text
1069       on the next line, while UNIX accepts \ as a line
1070       continuation. This allows you to maintain very
1071       large description fields while still remaining within
1072       the 255 character limit of many databases and
1073       spreadsheets.
1074
1075     * Added passed default to [default variable]
1076       tag, now can be [default variable passed-default].
1077
1078     * We can't always use POSIX::strftime anymore because of
1079       bad RedHat 5.0 Perl release. 8-( A substitute routine is
1080       provided and should be selected if POSIX::strftime doesn't
1081       work. Instructions provided for making a good Perl, should
1082       build OK.
1083
1084     * Added grouped items with mv_order_group. Using this,
1085       Sub-items can be tied to a master item placed on a
1086       form-based order.  The first mv_order_item defined
1087       becomes the master, additional are sub-items. All
1088       sub-items are deleted when a master item is deleted
1089       from the cart.
1090
1091     * Fixed path problems with database/search path
1092       resolution.
1093
1094     * Fixed VendURL mangling when going to a SecureURL
1095       with a different SCRIPT_NAME.
1096
1097     * [compat] [/compat] tag pairs are stripped from [old]
1098       pages.
1099
1100     * Static pages were shown to all browsers -- now only
1101       shown to those which have given us back our cookie.
1102
1103     * [loop ...] lists are now reliably nested with 
1104       [loop with="-a" arg="A B C"] or [loop-a 1 2 3].
1105
1106     * Tag end parsing fixed for [loop ...] and others that
1107       auto-interpolate.
1108
1109     * Finally added a real debug facility, with multi-level
1110       control and in-page display. Messages are still crude,
1111       though, and user input is encouraged.
1112
1113     * Errors during catalog configuration are now
1114       displayed to the console on startup.
1115
1116     * Slightly refined [more-list] to accept a different
1117       border for selected and non-selected pages when using
1118       images.
1119
1120     * Added error message in Windows install to prevent the
1121       large number of questions from users who try to install
1122       MiniVend without Perl 5.004 on the machine.
1123
1124     * CYGWIN.DLL now installed in SYSTEMROOT/system, not just
1125       C:/windows/system.
1126
1127     * Tested on Windows NT 4.0 x386.
1128
1129 MiniVend 3.05 is a major update that adds the following:
1130
1131     * Windows95/NT and UNIX versions unified, many changes
1132       to handle line-ending differences
1133
1134     * SendMailProgram and EncryptProgram now accept 'none'
1135       as parameters, avoid the need for external programs.
1136
1137     * Removed all autoloading options
1138
1139     * Added rotate "floor"
1140
1141     * Makecat program just a bit smarter about some things
1142
1143     * No UNIX command dependencies
1144
1145     * Removed sample demo from distribution, too outdated
1146
1147     * Catalogs can be added online
1148
1149     * Mode indicator file mode.{inet,unix} in MVROOT/etc
1150
1151     * Removed final vestiges of DES encryption
1152
1153     * Workaround for DBI <= 0.90 AutoCommit problem
1154
1155     * Went to multi-README files
1156
1157     Bug fixes include:
1158
1159     * Numerous fixes to sql_search (mv_searchtype=sql)
1160
1161     * Fixed tag_sort bug for multiple sorting of search lists
1162
1163     * Fixed [tag sql] query [/tag] to match docs
1164
1165     * Fixed missing Global variables
1166
1167     * Fixed close_database, no more SQL disconnect warnings
1168
1169     * Fixed bug in Windows file-based sessions
1170
1171 MiniVend 3.04 is a minor release to fix bugs in 3.03:
1172
1173     * If file test was failing on a Safe trap. Fixed.
1174
1175     * PIPE databases did not work in 3.03 (only) -- they now
1176       work well even for searching.
1177
1178     * Major bug in new parser fixed, now virtually every
1179       tag should be parsed by MiniVend in 'NewTags Yes'
1180       mode.  Switching to the new parser is recommended,
1181       as new features will not be added to the old parser.
1182
1183     * New [elsif ...] addition to [if ...] was not
1184       documented or announced.
1185
1186     * Perl 5.003 should run MiniVend without changes.
1187
1188     * Escape mechanism for values works properly.
1189
1190     * [include file] tag added.
1191
1192     * UserTag now accepts Interpolate option.
1193
1194     * Other minor bug fixes.
1195
1196 MiniVend 3.03 has many bug fixes and feature set improvements.
1197
1198 There is one incompatible change:
1199
1200     * If you are using Static builds, you must now define
1201       'Static Yes' in the catalog.cfg file to get static
1202       pages to build or run.  This was done to provide a
1203       single "on/off" switch for static builds.
1204
1205 As well as adding the following features/fixes:
1206
1207     * The new tag syntax is more reliable and trouble-free, 
1208       and a UserTag directive allows user-defined tags. For example,
1209       you can do:
1210
1211         UserTag  caps  Routine  sub { return "\U@_" }
1212         UserTag  caps  HasEndTag
1213
1214       and have "[caps]uppercase[/caps]" become "UPPERCASE".
1215
1216       In addition, almost all old-style tags will be parsed
1217       properly by the new tag parser.
1218
1219     * Sorting has been improved and regularized. All iterative
1220       lists may be sorted with the same syntax, and all may be sorted
1221       on any database field entry.
1222
1223         [search-list]
1224         [sort products:category products:name:f]
1225         ...
1226         [/search-list]
1227
1228       The above will sort a search return on two fields in
1229       the database -- and will work the same for shopping carts,
1230       loop lists, and [tag each products].
1231  
1232       There are unlimited levels of sort, and all sorts may individually
1233       have options for numeric, case-insensitive, and reverse. See the
1234       section SORTING in minivend.html.
1235
1236     * Added [on-change name] tag to allow conditional nested search
1237       display.
1238
1239     * Salestax bug fixed, 'default' now works.
1240
1241     * AllowGlobal lets certain "trusted" catalogs define global
1242       subroutines. AdminSub restricts certain subroutine names.
1243
1244     * ImageAlias does the same thing for MiniVend images that
1245       Apache/NCSA does with Alias.
1246
1247     * A robot defense now allows you to limit the number of line
1248       items in the shopping cart or cut off access to a host that
1249       accesses a certain number of pages without at least one 30 
1250       second pause. Implemented with OrderLineLimit and RobotLimit
1251       directives on a per-catalog basis, and the LockoutCommand
1252       directive as a global parameter.
1253
1254     * SQL numerical types are now handled properly if you set the
1255       NUMERIC option in catalog.cfg, i.e.:
1256         
1257         Database  products  NUMERIC price
1258         Database  inventory NUMERIC on_hand
1259
1260     * The server will now fall back to UNIX mode only if the
1261       TcpPort (7786 by default) is occupied and it cannot bind().
1262       This does not apply if MiniVend was started in INET mode only,
1263       but there will now be a better log message indicating the
1264       server is stopped.
1265
1266     * Started allowing a lower case POST method -- many browsers
1267       seem to violate the HTTP spec in that regard. This mitigates
1268       the common "interaction error" problem.
1269
1270     * Fixed bug in CyberCash processing that allowed only the
1271       'mauthcapture' mode.
1272
1273     * Deleted SearchOverMsg directive -- you must now set 
1274       mv_search_over_msg directly if you want to use it.
1275
1276 MiniVend 3.02 adds full SQL support. In addition, several minor
1277 demo flaws have been polished, and some bugs in the new geographic
1278 shipping changes have been fixed.
1279
1280 Changes include:
1281
1282     * Full SQL support, including for ODBC, using the powerful
1283       DBI/DBD interface. It should operate on all DBI-compliant drivers -- it
1284       has been tested with MySQL, mSQL, Solid, ODBC, and PostgreSQL.
1285
1286     * All database documentation greatly improved.
1287
1288     * Geographic qualification for shipping works.
1289
1290     * mv_credit_card_valid now returned as blank false value
1291       instead of 0 false value.
1292
1293     * =true added to order profile checks, will pass on Yes|True|1
1294       and fail on anything else.
1295
1296 MiniVend 3.00 is greatly changed from MiniVend 2.03, though catalogs
1297 should be almost completely compatible. The exceptions are one or two
1298 pricing and shipping database changes.  In both cases, there is available
1299 backward compatibility. 
1300
1301 Changes include:
1302
1303     * Installation has been changed to fit the Perl model
1304       of 'perl Makefile.PL; make; make test; make install'.
1305       You can also just type './configure' to perform this
1306       in one step.
1307
1308       Perl 5.004 allows retrieval and installation of MiniVend
1309       with 'perl -MCPAN -e 'install Vend::Cart' at the 
1310       command line.
1311
1312     * Catalog builder program improved to read Apache/NCSA-style
1313       configuration files and supply some intelligent defaults.
1314       Command-line editing and history are supported when teh
1315       Term::Readline package is available.
1316
1317     * Optional modules automatically fetched with CPAN module
1318       if available.
1319
1320     * A powerful static page building capability is in place.
1321       This allows completely automated generation of static HTML
1322       pages based on MiniVend databases.  Use it to build static
1323       category lists and product pages that will load quickly without
1324       the necessity of MiniVend parsing them.
1325
1326     * Dynamic page parsing speed is increased by about 30% when
1327       using the standard syntax.
1328
1329     * Multiple product databases allow the breakout of product lines,
1330       new-used product separation, multi-vendor order routing, and
1331       more.  The database an item is ordered from is kept with the
1332       item in the shopping cart, so items ordered with the same part
1333       number from different databases will not overwrite each other.
1334
1335     * Database tables are now writeable.  Atomic incrementation is
1336       supported, which means that reliable inventory counts can be
1337       kept.  Form-based database updates are expanded to encompass
1338       all databases, not just mSQL.
1339
1340     * Transactions can be logged to an arbitrary file in an arbitrary
1341       format with [tag log file]data[/tag].
1342
1343     * Databases can be exported to an ASCII file with the [tag export ...]
1344       [/tag] construct.
1345
1346     * Shipping is much improved, with built-in subroutine calls, 
1347       error messages for out of bounds condtions, drop-in UPS zone
1348       files, configurable handling charges, UPS cost rounding, geographic
1349       qualification, and more regular syntax.
1350
1351     * Item attribute selection greatly improved, with automated building
1352       of the item attribute selection.  Item attributes can easily be 
1353       specified at the time of order.
1354
1355     * Item attributes can cause price adjustments on either an
1356       item basis or attribute basis.
1357
1358     * Uses Data::Dumper's C-based uneval code when available,
1359       improving session storage speed.
1360
1361     * Database tables are only actually opened when referenced,
1362       improving speed greatly on systems that have a large number
1363       of tables in the database.
1364
1365     * Experimental DBI/DBD example interface provided, which
1366       will allow attachment of supported SQL databases like Solid,
1367       Oracle, or Sybase. THIS IS EARLY ALPHA SOFTWARE. Use only on
1368       an experimental basis, never with live data.
1369
1370     * Search engine has improved coordinated matching, with full
1371       field-independent case-sensitivity, substring matching, and
1372       negation.
1373
1374     * Search speed greatly improved when doing complex
1375       field-coordinated searches.
1376
1377     * The FullUrl directive allows different virtual hosts to have
1378       link programs with the same name, i.e. all named /cgi-bin/shop.
1379
1380     * A new (and still experimental) page syntax allows more regular
1381       parsing of tags, removing some of the interpolation-order anomalies
1382       inherent in the old-style tags. It can be invoked on individual
1383       pages with the [new] tag.
1384
1385     * Search cacheing is much improved, and searches can be pre-built
1386       when using the static page build capability.
1387
1388     * Pages can be cached, which especially improves performance of
1389       large parsed pages. Static build is preferred to cache, but
1390       with large databases it is not practical to build every item
1391       in advance.
1392
1393     * Supports Perl 5.004 transparently, making runtime changes to
1394       affected modules.
1395
1396     * Better security with the NoAbsolute, AdminPage, .access, and
1397       AdminDatabase tags.
1398
1399     * Improved handling of cookies, with savable sessions and dynamic
1400       expire times.
1401
1402     * Mailed orders may have MIME attachements. Though the author
1403       loathes routinely-used MIME, it has value as a way to attach
1404       an encrypted credit card number for easy processing by an
1405       order entry workstation.
1406
1407     * Search sorting bugs fixed.
1408
1409     * New $Safe{'cgi'}->{form_value} access in embedded Perl allows
1410       complex conditional search or order routines to be more
1411       intelligent with regard to user input.
1412
1413     * New FormIgnore directive allows certain variables to be
1414       expunged from the user session.
1415
1416     * Discounted prices can be displayed directly
1417       with [discount-price].
1418
1419     * Cookies can be configured for expiration times and multiple
1420       servers in a domain.
1421
1422     * Runs with taint checking enabled, even when using
1423       most embedded Perl code.
1424
1425     * Many other minor bug fixes, improvements, and changes.
1426
1427 -------------------------------------------------------------
1428
1429