MiniVend 3.12 minivend-3.12
Mike Heins [Tue, 30 Mar 1999 05:00:00 +0000 (00:00 -0500)]
259 files changed:
INSTALL
MANIFEST
Makefile.PL
README
README-win.txt
README.OS
UPGRADE
WHATSNEW [deleted file]
configure.bat
dist/README
dist/README-win.txt
dist/README.OS
dist/WHATSNEW
dist/admin/mv_admin.cfg
dist/admin/pages/include/summary
dist/admin/pages/menu.html
dist/admin/subs.cfg
dist/bin/check
dist/bin/dump
dist/bin/expire
dist/bin/expireall
dist/bin/makecat
dist/bin/minivend
dist/bin/offline
dist/bin/reconfig
dist/configure.pl
dist/etc/non_root_files [new file with mode: 0644]
dist/flycat.cfg [new file with mode: 0644]
dist/flycat/README.flycat [new file with mode: 0644]
dist/flycat/catalog.cfg [new file with mode: 0644]
dist/flycat/config/additional_fields [new file with mode: 0644]
dist/flycat/etc/order.number [new file with mode: 0644]
dist/flycat/etc/receipt.html [new file with mode: 0644]
dist/flycat/etc/report [new file with mode: 0644]
dist/flycat/etc/session.lock [new file with mode: 0644]
dist/flycat/etc/vendor.number [new file with mode: 0644]
dist/flycat/html/index.html [new file with mode: 0644]
dist/flycat/images/00-0011.jpg [new file with mode: 0644]
dist/flycat/images/artsmall.gif [new file with mode: 0644]
dist/flycat/images/artstore.gif [new file with mode: 0644]
dist/flycat/images/bg.gif [new file with mode: 0644]
dist/flycat/images/ordernow.gif [moved from dist/simple/images/ordernow.gif with 100% similarity]
dist/flycat/images/redball.gif [new file with mode: 0644]
dist/flycat/images/smallamex.gif [new file with mode: 0644]
dist/flycat/images/smalldisc.gif [new file with mode: 0644]
dist/flycat/images/smallmc.gif [new file with mode: 0644]
dist/flycat/images/smallvisa.gif [new file with mode: 0644]
dist/flycat/images/tshirt.jpg [new file with mode: 0644]
dist/flycat/orders/test/order.number [new file with mode: 0644]
dist/flycat/pages/canceled.html [new file with mode: 0644]
dist/flycat/pages/cartcfg/.access [new file with mode: 0644]
dist/flycat/pages/cartcfg/buttonbar [new file with mode: 0644]
dist/flycat/pages/cartcfg/editcart.html [new file with mode: 0644]
dist/flycat/pages/cartcfg/enable_edit.html [new file with mode: 0644]
dist/flycat/pages/cartcfg/export_userdb.html [new file with mode: 0644]
dist/flycat/pages/cartcfg/export_vendor.html [new file with mode: 0644]
dist/flycat/pages/cartcfg/master_edit.form [new file with mode: 0644]
dist/flycat/pages/cartcfg/master_edit.html [new file with mode: 0644]
dist/flycat/pages/cartcfg/newcart.html [new file with mode: 0644]
dist/flycat/pages/export.html [new file with mode: 0644]
dist/flycat/pages/help.html [new file with mode: 0644]
dist/flycat/pages/new_account.html [new file with mode: 0644]
dist/flycat/pages/oops.html [new file with mode: 0644]
dist/flycat/pages/ord/basket.html [new file with mode: 0644]
dist/flycat/pages/ord/checkout.html [new file with mode: 0644]
dist/flycat/pages/query/check_orders.html [new file with mode: 0644]
dist/flycat/pages/redirect.html [new file with mode: 0644]
dist/flycat/pages/special/badsearch.html [new file with mode: 0644]
dist/flycat/pages/special/canceled.html [new file with mode: 0644]
dist/flycat/pages/special/enroll_failed.html [new file with mode: 0644]
dist/flycat/pages/special/enroll_thankyou.html [new file with mode: 0644]
dist/flycat/pages/special/failed.html [new file with mode: 0644]
dist/flycat/pages/special/interact.html [new file with mode: 0644]
dist/flycat/pages/special/missing.html [new file with mode: 0644]
dist/flycat/pages/special/needfield.html [new file with mode: 0644]
dist/flycat/pages/special/nomatch.html [new file with mode: 0644]
dist/flycat/pages/special/noproduct.html [new file with mode: 0644]
dist/flycat/pages/special/notfound.html [new file with mode: 0644]
dist/flycat/pages/special/reconfig.html [new file with mode: 0644]
dist/flycat/pages/special/sec_faq.html [new file with mode: 0644]
dist/flycat/pages/special/security.html [new file with mode: 0644]
dist/flycat/pages/special/violation.html [new file with mode: 0644]
dist/flycat/products/country.asc [new file with mode: 0644]
dist/flycat/products/locale.asc [new file with mode: 0644]
dist/flycat/products/products.txt [new file with mode: 0644]
dist/flycat/products/salestax.asc [new file with mode: 0644]
dist/flycat/products/shipping.asc [new file with mode: 0644]
dist/flycat/products/transactions.raw [new file with mode: 0644]
dist/flycat/products/transactions.txt [new file with mode: 0644]
dist/flycat/products/userdb.asc [new file with mode: 0644]
dist/flycat/products/vendor.txt [new file with mode: 0644]
dist/flycat/session/.empty [new file with mode: 0644]
dist/flycat/tmp/.empty [new file with mode: 0644]
dist/form_mail.cfg [new file with mode: 0644]
dist/manifest
dist/minivend.cfg.dist
dist/simple/catalog.cfg
dist/simple/config/additional_fields [new file with mode: 0644]
dist/simple/config/additional_help [new file with mode: 0644]
dist/simple/etc/receipt.html [new file with mode: 0644]
dist/simple/etc/report
dist/simple/html/index.html
dist/simple/images/00-0011a.gif [new file with mode: 0644]
dist/simple/images/19-203.jpg [new file with mode: 0644]
dist/simple/images/19-204.jpg [new file with mode: 0644]
dist/simple/images/34-101.gif
dist/simple/images/art.gif [deleted file]
dist/simple/images/browse.gif [deleted file]
dist/simple/images/browse_up.gif [deleted file]
dist/simple/images/button_y.gif [deleted file]
dist/simple/images/checkout.gif [deleted file]
dist/simple/images/checkout_up.gif [deleted file]
dist/simple/images/contents.gif [deleted file]
dist/simple/images/contents_up.gif [deleted file]
dist/simple/images/coolad1.gif [new file with mode: 0644]
dist/simple/images/coolbits.gif [new file with mode: 0644]
dist/simple/images/details.gif [deleted file]
dist/simple/images/details_up.gif [deleted file]
dist/simple/images/home.gif [deleted file]
dist/simple/images/home_up.gif [deleted file]
dist/simple/images/mini.gif [new file with mode: 0644]
dist/simple/images/mvlogo.gif [new file with mode: 0644]
dist/simple/images/mvlogo_dark.gif [new file with mode: 0644]
dist/simple/images/ordernow_up.gif [deleted file]
dist/simple/images/perl_id_313c.gif [new file with mode: 0644]
dist/simple/images/search.gif [deleted file]
dist/simple/images/search_up.gif [deleted file]
dist/simple/images/smallamex.gif [new file with mode: 0644]
dist/simple/images/smalldisc.gif [new file with mode: 0644]
dist/simple/images/smallmc.gif [new file with mode: 0644]
dist/simple/images/smallvisa.gif [new file with mode: 0644]
dist/simple/images/tshirt.gif [deleted file]
dist/simple/images/tshirt.jpg [new file with mode: 0644]
dist/simple/images/undercon.gif [deleted file]
dist/simple/pages/about.html [new file with mode: 0644]
dist/simple/pages/browse.html
dist/simple/pages/browse1.html
dist/simple/pages/buttonbar.html [deleted file]
dist/simple/pages/canceled.html
dist/simple/pages/catalog.html [deleted file]
dist/simple/pages/copyright [new file with mode: 0644]
dist/simple/pages/feedback.html [new file with mode: 0644]
dist/simple/pages/flypage.html
dist/simple/pages/frames.html [new file with mode: 0644]
dist/simple/pages/frames/bottom.html [new file with mode: 0644]
dist/simple/pages/frames/left.html [new file with mode: 0644]
dist/simple/pages/frames/top.html [new file with mode: 0644]
dist/simple/pages/help/sec_faq.html
dist/simple/pages/help/security.html
dist/simple/pages/hintfile.html [deleted file]
dist/simple/pages/index.html [new file with mode: 0644]
dist/simple/pages/last_search.html [new file with mode: 0644]
dist/simple/pages/leftside [new file with mode: 0644]
dist/simple/pages/logobar [new file with mode: 0644]
dist/simple/pages/menubar [new file with mode: 0644]
dist/simple/pages/menubottom [new file with mode: 0644]
dist/simple/pages/new_account.html
dist/simple/pages/news.html [new file with mode: 0644]
dist/simple/pages/no_right [new file with mode: 0644]
dist/simple/pages/noframes.html [new file with mode: 0644]
dist/simple/pages/ord/basket.html
dist/simple/pages/ord/checkout.html
dist/simple/pages/ord/receipt.html [deleted file]
dist/simple/pages/ord/report.html [deleted file]
dist/simple/pages/privacy.html [new file with mode: 0644]
dist/simple/pages/quantity.html
dist/simple/pages/query/.access [new file with mode: 0644]
dist/simple/pages/query/check_orders.html [new file with mode: 0644]
dist/simple/pages/rand1.html
dist/simple/pages/rand2.html
dist/simple/pages/rand3.html
dist/simple/pages/rand4.html
dist/simple/pages/rand5.html
dist/simple/pages/reconfig/.access [new file with mode: 0644]
dist/simple/pages/reconfig/.access_gate [new file with mode: 0644]
dist/simple/pages/reconfig/do_download.html [new file with mode: 0644]
dist/simple/pages/reconfig/do_upload.html [new file with mode: 0644]
dist/simple/pages/reconfig/reconfig.html [new file with mode: 0644]
dist/simple/pages/reconfig/upload.html [new file with mode: 0644]
dist/simple/pages/results.html
dist/simple/pages/rightside [new file with mode: 0644]
dist/simple/pages/rotate1.html [new file with mode: 0644]
dist/simple/pages/rotate2.html [new file with mode: 0644]
dist/simple/pages/rotate3.html [new file with mode: 0644]
dist/simple/pages/rotate4.html [new file with mode: 0644]
dist/simple/pages/special/badsearch.html
dist/simple/pages/special/canceled.html
dist/simple/pages/special/cc_not_valid.html
dist/simple/pages/special/confirmation.html
dist/simple/pages/special/control.html [deleted file]
dist/simple/pages/special/failed.html
dist/simple/pages/special/feedback.html [new file with mode: 0644]
dist/simple/pages/special/interact.html
dist/simple/pages/special/missing.html
dist/simple/pages/special/needfield.html
dist/simple/pages/special/nomatch.html
dist/simple/pages/special/noproduct.html
dist/simple/pages/special/notfound.html
dist/simple/pages/special/order_security.html
dist/simple/pages/special/reconfig.html
dist/simple/pages/special/sec_faq.html
dist/simple/pages/special/security.html
dist/simple/pages/special/tech1.html [deleted file]
dist/simple/pages/special/tech2.html [deleted file]
dist/simple/pages/special/tech3.html [deleted file]
dist/simple/pages/special/tech4.html [deleted file]
dist/simple/pages/special/tech5.html [deleted file]
dist/simple/pages/special/violation.html
dist/simple/pages/srchform.html
dist/simple/products/2ndDayAir.csv
dist/simple/products/2ndDayAirAM.csv
dist/simple/products/Ground.csv
dist/simple/products/GroundComm.csv
dist/simple/products/GroundRes.csv
dist/simple/products/NextDayAir.csv
dist/simple/products/NextDayAirSaver.csv
dist/simple/products/pricing.asc
dist/simple/products/products.asc
dist/simple/products/salestax.asc
dist/simple/products/shipping.asc
dist/simple/products/transactions.raw [new file with mode: 0644]
dist/simple/products/transactions.txt [new file with mode: 0644]
dist/simple/products/userdb.asc
dist/simple/reconfig
dist/src/compile.pl [new file with mode: 0644]
doc/intro.html
doc/maxivend.html [deleted file]
doc/minivend.html
doc/nav.html
doc/toc.html
extra/Business/UPS.pm [new file with mode: 0644]
lib/Vend/Cart.pm
lib/Vend/Config.pm
lib/Vend/Data.pm
lib/Vend/FlyCat.pm [new file with mode: 0644]
lib/Vend/Glimpse.pm
lib/Vend/Imagemap.pm
lib/Vend/Interpolate.pm
lib/Vend/MakeCat.pm
lib/Vend/Order.pm
lib/Vend/PageBuild.pm
lib/Vend/Parse.pm
lib/Vend/Parser.pm
lib/Vend/Scan.pm
lib/Vend/Search.pm
lib/Vend/Server.pm
lib/Vend/Session.pm
lib/Vend/Table/DBI.pm
lib/Vend/Table/DB_File.pm
lib/Vend/Table/DummyDB.pm
lib/Vend/Table/GDBM.pm
lib/Vend/Table/Import.pm
lib/Vend/Table/InMemory.pm
lib/Vend/Table/Msql.pm [deleted file]
lib/Vend/TextSearch.pm
lib/Vend/UserDB.pm
lib/Vend/Util.pm
lib/Vend/ValidCC.pm
mvlogo.gif [new file with mode: 0644]

diff --git a/INSTALL b/INSTALL
index a335a4e..842bccb 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -22,7 +22,7 @@ IMPORTANT NOTE: The installation procedure has changed, we hope for the
 WINDOWS INSTALLATION
 --------------------
 
-    Obtain the self-extracting executable minivend-3.11.exe
+    Obtain the self-extracting executable minivend-3.12.exe
     and double-click on it.
 
     IMPORTANT NOTE: If you get the message "Bad command or file name"
@@ -33,7 +33,7 @@ WINDOWS INSTALLATION
     appears to work well with the ActiveState 5.005 "Merge" port.
     
     If you already have the CYGWIN.DLL executable or plan on using the
-    Perl link CGI, you can download the file minivend-3.11-nodll.exe
+    Perl link CGI, you can download the file minivend-3.12-nodll.exe
     and do the same.
 
     The defaults are set for Microsoft Personal Web Server on Win95 --
@@ -60,19 +60,19 @@ UNIX INSTALLATION
 ------------------
 Here is the short version:
 
-    gzip -dc minivend-3.11.tar.gz | tar xvf -
-    cd minivend-3.11
+    gzip -dc minivend-3.12.tar.gz | tar xvf -
+    cd minivend-3.12
     ./configure
 
 Long version with comments:
 
     # Unzip and untar the file -- if you have GNU tar, you can substitute
-    # 'tar xzf minivend-3.11.tar.gz'
-    gzip -dc minivend-3.11.tar.gz | tar xvf -
+    # 'tar xzf minivend-3.12.tar.gz'
+    gzip -dc minivend-3.12.tar.gz | tar xvf -
 
     # Change directory to the one that was created 
     #
-    cd minivend-3.11
+    cd minivend-3.12
 
     # If you have trouble with picking up the wrong Perl version,
     # try  '/dir/where/perl/is/perl Makefile.PL
index 1f9a976..ff9c6f9 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -66,75 +66,168 @@ dist/configure
 dist/configure.pl
 dist/error.log
 dist/etc/mvconf.cmt
+dist/etc/non_root_files
+dist/flycat.cfg
+dist/flycat/README.flycat
+dist/flycat/catalog.cfg
+dist/flycat/config/additional_fields
+dist/flycat/etc/order.number
+dist/flycat/etc/receipt.html
+dist/flycat/etc/report
+dist/flycat/etc/report.html
+dist/flycat/etc/session.lock
+dist/flycat/etc/vendor.number
+dist/flycat/html/index.html
+dist/flycat/images/00-0011.jpg
+dist/flycat/images/artsmall.gif
+dist/flycat/images/artstore.gif
+dist/flycat/images/bg.gif
+dist/flycat/images/ordernow.gif
+dist/flycat/images/redball.gif
+dist/flycat/images/smallamex.gif
+dist/flycat/images/smalldisc.gif
+dist/flycat/images/smallmc.gif
+dist/flycat/images/smallvisa.gif
+dist/flycat/images/tshirt.jpg
+dist/flycat/orders/test/order.number
+dist/flycat/pages/canceled.html
+dist/flycat/pages/cartcfg/.access
+dist/flycat/pages/cartcfg/buttonbar
+dist/flycat/pages/cartcfg/editcart.html
+dist/flycat/pages/cartcfg/enable_edit.html
+dist/flycat/pages/cartcfg/export_userdb.html
+dist/flycat/pages/cartcfg/export_vendor.html
+dist/flycat/pages/cartcfg/master_edit.form
+dist/flycat/pages/cartcfg/master_edit.html
+dist/flycat/pages/cartcfg/newcart.html
+dist/flycat/pages/export.html
+dist/flycat/pages/help.html
+dist/flycat/pages/new_account.html
+dist/flycat/pages/oops.html
+dist/flycat/pages/ord/basket.html
+dist/flycat/pages/ord/checkout.html
+dist/flycat/pages/query/check_orders.html
+dist/flycat/pages/redirect.html
+dist/flycat/pages/special/badsearch.html
+dist/flycat/pages/special/canceled.html
+dist/flycat/pages/special/enroll_failed.html
+dist/flycat/pages/special/enroll_thankyou.html
+dist/flycat/pages/special/failed.html
+dist/flycat/pages/special/interact.html
+dist/flycat/pages/special/missing.html
+dist/flycat/pages/special/needfield.html
+dist/flycat/pages/special/nomatch.html
+dist/flycat/pages/special/noproduct.html
+dist/flycat/pages/special/notfound.html
+dist/flycat/pages/special/reconfig.html
+dist/flycat/pages/special/sec_faq.html
+dist/flycat/pages/special/security.html
+dist/flycat/pages/special/violation.html
+dist/flycat/products/country.asc
+dist/flycat/products/locale.asc
+dist/flycat/products/products.txt
+dist/flycat/products/salestax.asc
+dist/flycat/products/shipping.asc
+dist/flycat/products/transactions.raw
+dist/flycat/products/transactions.txt
+dist/flycat/products/userdb.asc
+dist/flycat/products/vendor.txt
+dist/flycat/session/.empty
+dist/flycat/tmp/.empty
+dist/form_mail.cfg
 dist/locale.error
 dist/manifest
 dist/minivend.cfg.dist
 dist/simple/catalog.cfg
 dist/simple/config/.empty
+dist/simple/config/additional_fields
+dist/simple/config/additional_help
 dist/simple/etc/order.profiles
+dist/simple/etc/receipt.html
 dist/simple/etc/report
 dist/simple/etc/search.profiles
 dist/simple/html/index.html
 dist/simple/images/00-0011.jpg
+dist/simple/images/00-0011a.gif
 dist/simple/images/00-341.jpg
 dist/simple/images/00-342.jpg
 dist/simple/images/00-343.jpg
+dist/simple/images/19-203.jpg
+dist/simple/images/19-204.jpg
 dist/simple/images/21-221.jpg
 dist/simple/images/34-101.gif
-dist/simple/images/art.gif
 dist/simple/images/artsmall.gif
 dist/simple/images/artstore.gif
 dist/simple/images/bg.gif
 dist/simple/images/blue_pap.gif
-dist/simple/images/browse.gif
-dist/simple/images/browse_up.gif
-dist/simple/images/button_y.gif
-dist/simple/images/checkout.gif
-dist/simple/images/checkout_up.gif
-dist/simple/images/contents.gif
-dist/simple/images/contents_up.gif
-dist/simple/images/details.gif
-dist/simple/images/details_up.gif
-dist/simple/images/home.gif
-dist/simple/images/home_up.gif
+dist/simple/images/coolad1.gif
+dist/simple/images/coolbits.gif
+dist/simple/images/mini.gif
+dist/simple/images/mvlogo.gif
+dist/simple/images/mvlogo_dark.gif
 dist/simple/images/new.gif
-dist/simple/images/ordernow.gif
-dist/simple/images/ordernow_up.gif
+dist/simple/images/perl_id_313c.gif
 dist/simple/images/staircase.jpg
 dist/simple/images/redball.gif
-dist/simple/images/search.gif
-dist/simple/images/search_up.gif
-dist/simple/images/tshirt.gif
-dist/simple/images/undercon.gif
+dist/simple/images/smallamex.gif
+dist/simple/images/smalldisc.gif
+dist/simple/images/smallmc.gif
+dist/simple/images/smallvisa.gif
+dist/simple/images/tshirt.jpg
 dist/simple/images/web_srch.gif
+dist/simple/pages/about.html
 dist/simple/pages/browse.html
 dist/simple/pages/browse1.html
-dist/simple/pages/buttonbar.html
 dist/simple/pages/canceled.html
-dist/simple/pages/catalog.html
+dist/simple/pages/copyright
+dist/simple/pages/feedback.html
 dist/simple/pages/flypage.html
+dist/simple/pages/frames.html
+dist/simple/pages/frames/bottom.html
+dist/simple/pages/frames/left.html
+dist/simple/pages/frames/top.html
 dist/simple/pages/help/sec_faq.html
 dist/simple/pages/help/security.html
-dist/simple/pages/hintfile.html
+dist/simple/pages/index.html
+dist/simple/pages/last_search.html
+dist/simple/pages/leftside
+dist/simple/pages/logobar
+dist/simple/pages/menubar
+dist/simple/pages/menubottom
 dist/simple/pages/new_account.html
+dist/simple/pages/news.html
+dist/simple/pages/no_right
+dist/simple/pages/noframes.html
 dist/simple/pages/ord/basket.html
 dist/simple/pages/ord/checkout.html
 dist/simple/pages/ord/nobasket.html
-dist/simple/pages/ord/receipt.html
-dist/simple/pages/ord/report.html
+dist/simple/pages/privacy.html
 dist/simple/pages/quantity.html
+dist/simple/pages/query/.access
+dist/simple/pages/query/check_orders.html
 dist/simple/pages/rand1.html
 dist/simple/pages/rand2.html
 dist/simple/pages/rand3.html
 dist/simple/pages/rand4.html
 dist/simple/pages/rand5.html
+dist/simple/pages/reconfig/.access
+dist/simple/pages/reconfig/.access_gate
+dist/simple/pages/reconfig/do_download.html
+dist/simple/pages/reconfig/do_upload.html
+dist/simple/pages/reconfig/reconfig.html
+dist/simple/pages/reconfig/upload.html
 dist/simple/pages/results.html
+dist/simple/pages/rightside
+dist/simple/pages/rotate1.html
+dist/simple/pages/rotate2.html
+dist/simple/pages/rotate3.html
+dist/simple/pages/rotate4.html
 dist/simple/pages/special/badsearch.html
 dist/simple/pages/special/canceled.html
 dist/simple/pages/special/cc_not_valid.html
 dist/simple/pages/special/confirmation.html
-dist/simple/pages/special/control.html
 dist/simple/pages/special/failed.html
+dist/simple/pages/special/feedback.html
 dist/simple/pages/special/interact.html
 dist/simple/pages/special/missing.html
 dist/simple/pages/special/needfield.html
@@ -145,11 +238,6 @@ dist/simple/pages/special/order_security.html
 dist/simple/pages/special/reconfig.html
 dist/simple/pages/special/sec_faq.html
 dist/simple/pages/special/security.html
-dist/simple/pages/special/tech1.html
-dist/simple/pages/special/tech2.html
-dist/simple/pages/special/tech3.html
-dist/simple/pages/special/tech4.html
-dist/simple/pages/special/tech5.html
 dist/simple/pages/special/violation.html
 dist/simple/pages/srchform.html
 dist/simple/products/2ndDayAir.csv
@@ -169,6 +257,8 @@ dist/simple/products/pricing.asc
 dist/simple/products/products.asc
 dist/simple/products/salestax.asc
 dist/simple/products/shipping.asc
+dist/simple/products/transactions.raw
+dist/simple/products/transactions.txt
 dist/simple/products/ups_zone.asc
 dist/simple/products/userdb.asc
 dist/simple/reconfig
@@ -176,6 +266,7 @@ dist/simple/report_problem
 dist/simple/session/.empty
 dist/simple/tmp/PageCache/.empty
 dist/simple/tmp/SearchCache/.empty
+dist/src/compile.pl
 dist/src/config.h.in
 dist/src/configure
 dist/src/configure.in
@@ -190,10 +281,10 @@ dist/userdb.cfg
 doc/bullet.gif
 doc/frtoc.html
 doc/intro.html
-doc/maxivend.html
 doc/minivend.html
 doc/nav.html
 doc/toc.html
+extra/Business/UPS.pm
 extra/File/CounterFile.pm
 extra/File/Spec.pm
 extra/File/Spec/OS2.pm
@@ -206,6 +297,7 @@ extra/URI/URL.pm
 lib/Vend/Cart.pm
 lib/Vend/Config.pm
 lib/Vend/Data.pm
+lib/Vend/FlyCat.pm
 lib/Vend/Glimpse.pm
 lib/Vend/Http.pm
 lib/Vend/Imagemap.pm
@@ -227,13 +319,13 @@ lib/Vend/Table/DummyDB.pm
 lib/Vend/Table/GDBM.pm
 lib/Vend/Table/Import.pm
 lib/Vend/Table/InMemory.pm
-lib/Vend/Table/Msql.pm
 lib/Vend/Table/Quoted.pm
 lib/Vend/Table/Update.pm
 lib/Vend/TextSearch.pm
 lib/Vend/UserDB.pm
 lib/Vend/Util.pm
 lib/Vend/ValidCC.pm
+mvlogo.gif
 test.pl
 win/POSIX.pm
 win/minivend.pif
index 61b7511..e4867a9 100644 (file)
@@ -26,7 +26,7 @@ my @mods_to_get;
 my $Lock_troubles;
 my $Windows;
 
-$VERSION = '3.11';
+$VERSION = '3.12';
 
 # See if we have the CPAN module
 my $Cpan = 0;
@@ -235,7 +235,7 @@ sub copyright_prompt {
 
  MiniVend V$VERSION
  
- Copyright 1996-1998 by Michael J. Heins <mikeh\@minivend.com>
+ Copyright 1996-1999 by Michael J. Heins <mikeh\@minivend.com>
 
  MiniVend is free under the terms of the GNU General Public License.
 
@@ -446,6 +446,64 @@ EOF
        }
 
 
+       eval {
+               require Business::UPS;
+       };
+       if ($@) {
+               push @extra_lib_dirs, 'Business';
+               push @extra_lib_files, 'Business/UPS.pm';
+       }
+
+       eval {
+               require Storable;
+       };
+       unless ($@) {
+                               my $def = 'n';
+                       print <<EOF;
+
+You appear to have Raphael Manfredi's Storable module installed.
+
+This module will significantly improve your DBM storage and
+fetch times.
+
+You can reply one of:
+
+               n -- Don't use Storable
+               s -- Use for sessions only, won't break existing databases
+               y -- Use for both sessions and databases
+
+It is recommended that new installations reply YES, and that
+existing installations reply S unless there is a need for
+improved performance. Replying S will mean you have to delete all
+of your session files.
+
+If you reply YES and you use any GDBM or DB_File databases
+they will NEED TO BE REMADE for ALL CATALOGS using this
+MiniVend server instance.
+EOF
+
+               if($ENV{MINIVEND_STORABLE_DB} || -f "$realdir/_db_storable") {
+                       $def = 'y';
+               }
+               elsif($ENV{MINIVEND_STORABLE} || -f "$realdir/_session_storable") {
+                       $def = 's';
+               }
+               my $ask = my_prompt("Use Storable module? (y/n/s) ", $def);
+               if ($ask =~ /^\s*(y|d)/i) {
+                       open(TSTORABLE, ">$realdir/_db_storable")
+                               or die "creat $realdir/_db_storable: $!\n";
+                       print TSTORABLE "REMOVE THIS FILE TO STOP USING Storable\n";
+                       close TSTORABLE;
+               }
+               if ($ask =~ /^\s*(y|s)/i) {
+                       open(TSTORABLE, ">$realdir/_session_storable")
+                               or die "creat $realdir/_session_storable: $!\n";
+                       print TSTORABLE "REMOVE THIS FILE TO STOP USING Storable\n";
+                       close TSTORABLE;
+               }
+       }
+
+
 MODCHECK: {
 
        last MODCHECK unless $Cpan;
@@ -518,9 +576,11 @@ EOF
 
                print <<EOF;
 
-You may wish to inspect minivend.cfg.dist for new values.
+You may wish to inspect minivend.cfg.dist for new values; in
+particular if you want to use the newer demo you might need some
+UserTag entries defined there.
 
-Check the README file for changes you might have to make if
+Check the UPGRADE file for changes you might have to make if
 updating from an earlier version of MiniVend.
 EOF
 
diff --git a/README b/README
index 816ce8c..0d342ce 100644 (file)
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
-# MiniVend V3.11
+# MiniVend V3.12
 # 
-# Copyright 1996-1998 by Michael J. Heins <mikeh@minivend.com>
+# Copyright 1996-1999 by Michael J. Heins <mikeh@minivend.com>
 #
 # Based on Vend 0.2
 # Copyright 1995 by Andrew M. Wilcox
@@ -30,10 +30,8 @@ interested in problems, suggestions, or comments, but does not have time
 to offer free individual support in most cases. See the MiniVend website at
 http://www.minivend.com/minivend/ for more information.
 
-   IMPORTANT NOTE:  MiniVend 3.11 requires Perl 5.004 or higher.
-   (It will probably work with 5.003 on some UNIX systems and *may*
-   work with Perl 5.002 -- IF you comment out any lines which 
-   contain "use locale;". Neither are supported.)
+   IMPORTANT NOTE:  MiniVend 3.12 requires Perl 5.004 or higher. It will
+                    run on no earlier version, period. 5.005 is recommended.
 
 The information you need is in the following files:
 
@@ -44,6 +42,8 @@ The information you need is in the following files:
 
     INSTALL    Installation instructions
 
+    UPGRADE    What to watch out for if updating from an earlier version
+
     README.OS  OS-specific information, if any
 
     doc/       The MiniVend documentation.
@@ -64,6 +64,7 @@ Major files/directories in the distribution:
                 modules. Includes:
 
                 minivend.cfg.dist   Distribution minivend.cfg
+                flycat/             The flycat demo application.
                 simple/             The simple demo application.
                 bin/                Executables including scripts
                 src/                C and Perl code for CGI links
@@ -178,24 +179,17 @@ should be able to access the demo catalogs.
 MiniVend has been well-tested on Solaris 2, SunOS, Linux, HP-UX,
 BSDI, FreeBSD, and OSF/Alpha. It also reportedly runs on SCO,
 AIX, and other Unix ports.  It should work on any UNIX or Win32
-OS with Perl 5.004 or higher. It may run with Perl 5.003 or
-Perl 5.002, but the author disavows all responsibility for
-the results.
-
-IMPORTANT NOTE FOR WINDOWS: MiniVend will NOT run with the
-ActiveState port, otherwise known as 5.003 build 1XX. It
-REQUIRES, repeat REQUIRES, the standard version Perl 5.004. See
-http://www.perl.com/ for information on how to obtain it.
+OS with Perl 5.004 or higher.
 
-Windows does not support fork(), so the server runs in the
-foreground. You need the DB_File module for best results,
-and that is not included in the standard distribution. You can
-get it at http://www.perl.com/CPAN-local (or any CPAN archive)
-in the ports/win32/Standard/x86/ directory.
+IMPORTANT NOTE FOR WINDOWS: MiniVend will NOT run with the early
+ActiveState ports, otherwise known as 5.003 build 1XX. It REQUIRES, repeat
+REQUIRES, the standard version Perl 5.004 or 5.005 ActiveState "merge"
+ports. See http://www.perl.com/ for information on how to obtain it.
 
-BSDI and FreeBSD are known to have problems with Perl socket
-code, which MiniVend relies heavily upon. You will probably
-need to run in INET/TLINK mode instead of UNIX/VLINK mode.
+Windows does not support fork(), so the server runs in the foreground. You
+need the DB_File module for best results, and that is not included in the
+standard distribution. You can get it at http://www.perl.com/CPAN-local
+(or any CPAN archive) in the ports/win32/Standard/x86/ directory.
 
 -------------------------------------------------------------
 
@@ -204,7 +198,7 @@ need to run in INET/TLINK mode instead of UNIX/VLINK mode.
 WINDOWS INSTALLATION
 --------------------
 
-    Obtain the self-extracting executable minivend-3.11.exe
+    Obtain the self-extracting executable minivend-3.12.exe
     and double-click on it. You MUST already have Perl 5.004
     INSTALLED and in your PATH.
 
@@ -215,8 +209,8 @@ UNIX INSTALLATION
 ------------------
 Here is the short version:
 
-    gzip -dc minivend-3.11.tar.gz | tar xvf -
-    cd minivend-3.11
+    gzip -dc minivend-3.12.tar.gz | tar xvf -
+    cd minivend-3.12
     ./configure
 
 More information is in the file INSTALL.
@@ -230,10 +224,11 @@ More information is in the file INSTALL.
 
                      D O C U M E N T A T I O N
 
-The documentation is in 2 files in the doc/ subdirectory of
+The documentation is in 3 files in the doc/ subdirectory of
 the main MiniVend directory:
 
        toc.html       Table of contents
+       frtoc.html     Frames table of contents
        minivend.html  Main documentation file
 
 These files will be copied to the same HTML directory as
@@ -242,6 +237,9 @@ be referenced as:
 
            http:/www.yourserver.com/simple/toc.html
 
+There is an extended documentation package available
+at www.minivend.com.
+
 -------------------------------------------------------------
 
                     K N O W N   P R O B L E M S
@@ -317,8 +315,8 @@ Solaris:
        when running on Solaris.
 
 Windows:
-       This is a new port, and just a few things don't work the
-       same as UNIX. See the README-win.txt file for more information.
+       Just a few things don't work the same as UNIX. See the
+       README-win.txt file for more information.
 
 ---------------------------------------------------------------------
 
index a9dc5a0..eb8136b 100644 (file)
@@ -1,4 +1,4 @@
-# MiniVend V3.11
+# MiniVend V3.12
 # 
 # Copyright 1996-1998 by Michael J. Heins <mikeh@iac.net>
 #
@@ -27,8 +27,7 @@
 
     System Requirements:
 
-        * Windows 95, 98 or Windows NT. Tested on Windows 95 OSR2
-          and NT 4.0 workstation.
+        * Windows 95, 98 or Windows NT. Tested on Windows 95 OSR2.
 
         * Perl 5.004 for Win32 or higher -- accept no substitutes. THIS
           PROGRAM WILL RUN ON NO EARLIER VERSION OF PERL. PERIOD.  It
   
     Installation:
 
-    1. Download the minivend-3.11.exe distribution file
+    1. Download the minivend-3.12.exe distribution file
     and run it in the normal Windows fashion.
     
     ( If you don't want to execute the self-extracting ZIP file,
-      then you can obtain the standard minivend-3.11.tar.gz file and
+      then you can obtain the standard minivend-3.12.tar.gz file and
       install that instead. )
       
       You will have to obtain the CYGWIN.DLL file if you want to
       use TLINK.EXE as your link CGI. The standard distribution .EXE
-      file has it included -- the minivend-3.11-nodll.exe file
+      file has it included -- the minivend-3.12-nodll.exe file
       eliminates it.
 
     2. Select a directory to install MiniVend in -- it defaults
         can run at a time. This means multiple requests
         will be queued. In any case, lack of file locking
         would mean big problems for multiple servers. Perl's
-               threading is too experimental to do the work required
-               to make MV thread-safe.
+        threading is too experimental to do the work required
+        to make MV thread-safe.
+
+      * Since the server runs in the foreground, if you change
+        global variables in your embedded Perl you must be careful
+        to reset them. In particular, the FRAMES version of the 
+        3.12 demo will not work correctly.
 
       * Some of the support scripts will not work, and some
         might not behave as in the documentation. In particular,
index 3598279..d8d41d0 100644 (file)
--- a/README.OS
+++ b/README.OS
@@ -1,88 +1,86 @@
-# MiniVend V3.11
+# MiniVend V3.12
 # 
-# Copyright 1996-1998 by Michael J. Heins <mikeh@minivend.com>
+# Copyright 1996-1999 by Michael J. Heins <mikeh@minivend.com>
 #
 
                    M I S C E L L A N E O U S
                          O S   N O T E S
 
-OS          Recommended DBM    Tested on     Notes
---------   -----------------  ------------  -----------------------
-Linux         GDBM             2.0.x & up    This is what MiniVend is
-                                             developed on -- all features
-                                             should work normally.
+
+Operating   Recommended
+System          DBM      Tested on     Notes
+--------   -------------------------  -----------------------
+Linux         GDBM       2.0.x & up    This is what MiniVend is
+                                       developed on -- all features
+                                       should work normally.
 
     IMPORTANT NOTE FOR REDHAT 5.0:
     If MiniVend fails "make test" this usually means that the POSIX
-    library is broken on the distributed Perl. You can update
-    Perl or define the environment variable MINIVEND_BADPOSIX to 1.
-    See the README file under "K N O W N   P R O B L E M S"
-
-
-Windows 95    DB_File          ?????         MiniVend may not stand up
-                                             well for high-use
-                                             catalogs. Server will not stop
-                                             from the keyboard, you must close
-                                             the DOS window to stop (unless
-                                             you get the GNU toolset or
-                                             use the ActiveState "Merge").
-
-
-Windows NT    DB_File          ?????         Some features of MiniVend
-                                             will not work, mostly in
-                                             support scripts. MiniVend
-                                             will run as a service.
+    library is broken on the distributed Perl. You should update
+    Perl.
 
+Windows 95    DB_File    ?????         MiniVend may not stand up
+                                       well for high-use
+                                       catalogs. Some features
+                                       cannot be used because
+                                       of foreground operation;
+                                       for instance modifying
+                                       $Safe{config}.
 
-FreeBSD       DB_File          2.1.0, 2.1.5  Many users run MiniVend on
-                                             this OS. You need Perl 5.004,
-                                             not the broken developement
-                                             version that comes with many
-                                             distributions.
 
+Windows NT    DB_File    ?????         Some features of MiniVend
+                                       will not work, mostly in
+                                       support scripts. MiniVend
+                                       will run as a service.
+                                       Some features cannot be
+                                       used because of foreground
+                                       operation; for instance
+                                       modifying $Safe{config}.
 
-BSDI          DB_File          2.1, 3.0      Many users run MiniVend on
-                                             this OS. The vlink UNIX mode
-                                             will not work with V3.x but
-                                             tlink/INET works fine. You
-                                             need Perl 5.004 -- the
-                                             5.003_02 that comes with 3.x
-                                             probably will not work. 
 
+FreeBSD       DB_File    2.x, 3.0.x    Many users run MiniVend on
+                                       this OS. You need Perl 5.004,
+                                       which not all BSD distributions
+                                       provide (some have Perl 4 as
+                                       the default Perl!).
 
-Solaris 2     GDBM             2.4,2.5       Many users run MiniVend on
-                                             this OS, no known problems
-                                             once you get it going.
-                                             Problems with installation
-                                             are usually due to poor or
-                                             missing development tools.
+BSDI          DB_File    2.1, 3.0      Many users run MiniVend on
+                                       this OS. You need Perl 5.004,
+                                       which not all BSD distributions
+                                       provide (some have Perl 4 as
+                                       the default Perl!).
 
-SunOS 4.1.x   DB_File          4.1.x         Some users run MiniVend on
-                                             this OS, no known problems.
 
+Solaris 2     GDBM       2.4,2.5       Many users run MiniVend on
+                                       this OS, no known problems.
+                                       Problems with installation
+                                       are usually due to poor or
+                                       missing development tools.
 
-DEC/OSF, aka  GDBM             3.0           Some users run MiniVend on
-Digital UNIX                                 this OS, no known problems.
-                                             
+SunOS 4.1.x   DB_File    4.1.x         Some users run MiniVend on
+                                       this OS, no known problems.
 
-IRIX          GDBM             5.3,6.2       Server may be difficult to
-                                             stop for re-configuration,
-                                             setting HouseKeeping value to
-                                             10 or less is recommended. No
-                                             other known problems provided
-                                             you have good development
-                                             tools.
 
+DEC/OSF, aka  GDBM       3.0           Some users run MiniVend on
+Digital UNIX                           this OS, no known problems.
+                                       
 
-HP/UX          -               10.1          A few users, may be some
-                                             trouble with vlink/tlink
-                                             compilation.
+IRIX          GDBM       5.3,6.2       Server may be difficult to
+                                       stop for re-configuration,
+                                       setting HouseKeeping value to
+                                       10 or less is recommended. 
+                                       Some reports of "zombie"
+                                       processes probably due to
+                                       signal handler problems.
 
+HP/UX          -         10.1          A few users, may be some
+                                       trouble with vlink/tlink
+                                       compilation.
 
-SCO            -               3.2           Should work fine as of 3.05
+SCO            -         3.2           Should work fine as of 3.05
 
-AIX            -               4.1           Reported to work with little
-                                             difficulty
+AIX            -         4.1           Reported to work with little
+                                       difficulty
 
-UNIXware       -               2.1           Should work fine as of 3.05
+UNIXware       -         2.1           Should work fine as of 3.05
 
diff --git a/UPGRADE b/UPGRADE
index 5f9f73f..a70f0c5 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -1,26 +1,48 @@
           U P G R A D I N G   F R O M  3 . 0 x
 
-You should normally be able to simply install over the
-current software and then restart the server.  The only 
-incompatible changes are bug fixes (which may fool any
-workarounds you have made).
-
-The "simple" demo runs mostly unchanged from MiniVend 3.01 to
-3.09. The usual source of any upgrade problems is illegal
-syntax in tags, which might work on earlier versions but
-is rejected in later, stricter versions. Especially check
-nested [if ...] tags -- some problems can be solved by
-putting a [then] [/then] around the true-executed condition.
-
-One gotcha has to do with the [page scan/se=whatever] tag
-in NewTags mode. If you have a URL like this you will need
-to surround it with a [compat] [/compat] pair, or better 
-yet remove the first slash and make it [page scan se=whatever].
-
-IMPORTANT NOTE:  It is highly recommended that you copy the
-current software to a backup directory or an archive in case
-there is a problem and you wish to return to the earlier
-version.
+You should normally be able to simply install over the current software and
+then restart the server.  The only incompatible changes are bug fixes (which
+may fool any workarounds you have made), and these:
+
+    * The TcpHost directive was accidentally disabled at Version
+      3.08 and has been reenabled. If you use tlink, you may find
+      that MiniVend won't accept a connection from a machine besides
+      "localhost". The global error.log file should give you the 
+      information you need to set TcpHost to a value that will
+      allow connections.
+
+    * The UserDB add-on is now a full feature and is integrated into
+      MiniVend. While older calls with mv_subroutine will
+      still work if you keep your userdb.cfg file intact, you
+      are STRONGLY ENCOURAGED to use the new implementation. It
+      is much better anyway.
+
+    * A [loop search=...] now always returns a newline
+      as the last character. This may cause a problem with
+      some of the old demo checkout pages in the shipping
+      area. The solution is to set "lr=yes" in the
+      search specification.
+
+    * One gotcha has to do with the [page scan/se=whatever] tag
+      in NewTags mode. You should change it to the proper
+         [page scan se=whatever].
+
+    * DescriptionTrim is gone -- no biggie. 8-) If you did by
+      some very strange chance use this, you will have to set a
+      separate short description field.
+
+The "simple" demo runs mostly unchanged from MiniVend 3.01 to 3.12. The usual
+source of any upgrade problems is illegal syntax in tags, which might work on
+earlier versions but is rejected in later, stricter versions. Especially check
+nested [if ...] tags -- some problems can be solved by putting a [then] [/then]
+around the true-executed condition.
+
+IMPORTANT NOTE:  It is highly recommended that you copy the current software to
+a backup directory or an archive in case there is a problem and you wish to
+return to the earlier version.
+
+IMPORTANT NOTE:  If you haven't changed over from [old] to NewTags, you
+should do so now or make this the last version of MiniVend you ever use. 8-)
 
 See the file WHATSNEW for more information.
 
diff --git a/WHATSNEW b/WHATSNEW
deleted file mode 100644 (file)
index 3bff4f5..0000000
--- a/WHATSNEW
+++ /dev/null
@@ -1,940 +0,0 @@
-
-                  W H A T ' S   N E W 
-
-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.
-
--------------------------------------------------------------
-
-
index fe46c76..1f1d094 100644 (file)
@@ -8,5 +8,5 @@ echo ------------------------------------------------------------
 echo IF YOU DO HAVE PERL 5.004 installed,
 echo unzip the file to a directory and try:
 echo ------------------------------------------------------------
-echo    cd minivend-3.11
+echo    cd minivend-3.12
 echo    c:\perl\bin\perl Makefile.PL
index 816ce8c..b3987f8 100644 (file)
@@ -1,4 +1,4 @@
-# MiniVend V3.11
+# MiniVend V3.12
 # 
 # Copyright 1996-1998 by Michael J. Heins <mikeh@minivend.com>
 #
@@ -30,7 +30,7 @@ interested in problems, suggestions, or comments, but does not have time
 to offer free individual support in most cases. See the MiniVend website at
 http://www.minivend.com/minivend/ for more information.
 
-   IMPORTANT NOTE:  MiniVend 3.11 requires Perl 5.004 or higher.
+   IMPORTANT NOTE:  MiniVend 3.12 requires Perl 5.004 or higher.
    (It will probably work with 5.003 on some UNIX systems and *may*
    work with Perl 5.002 -- IF you comment out any lines which 
    contain "use locale;". Neither are supported.)
@@ -204,7 +204,7 @@ need to run in INET/TLINK mode instead of UNIX/VLINK mode.
 WINDOWS INSTALLATION
 --------------------
 
-    Obtain the self-extracting executable minivend-3.11.exe
+    Obtain the self-extracting executable minivend-3.12.exe
     and double-click on it. You MUST already have Perl 5.004
     INSTALLED and in your PATH.
 
@@ -215,8 +215,8 @@ UNIX INSTALLATION
 ------------------
 Here is the short version:
 
-    gzip -dc minivend-3.11.tar.gz | tar xvf -
-    cd minivend-3.11
+    gzip -dc minivend-3.12.tar.gz | tar xvf -
+    cd minivend-3.12
     ./configure
 
 More information is in the file INSTALL.
index 8103460..eabf052 100644 (file)
@@ -1,4 +1,4 @@
-# MiniVend V3.11
+# MiniVend V3.12
 # 
 # Copyright 1996-1998 by Michael J. Heins <mikeh@iac.net>
 #
   
     Installation:
 
-    1. Download the minivend-3.11.exe distribution file
+    1. Download the minivend-3.12.exe distribution file
     and run it in the normal Windows fashion.
     
     ( If you don't want to execute the self-extracting ZIP file,
-      then you can obtain the standard minivend-3.11.tar.gz file and
+      then you can obtain the standard minivend-3.12.tar.gz file and
       install that instead. )
       
       You will have to obtain the CYGWIN.DLL file if you want to
       use TLINK.EXE as your link CGI. The standard distribution .EXE
-      file has it included -- the minivend-3.11-nodll.exe file
+      file has it included -- the minivend-3.12-nodll.exe file
       eliminates it.
 
     2. Select a directory to install MiniVend in -- it defaults
index 3598279..3d69b29 100644 (file)
@@ -1,6 +1,6 @@
-# MiniVend V3.11
+# MiniVend V3.12
 # 
-# Copyright 1996-1998 by Michael J. Heins <mikeh@minivend.com>
+# Copyright 1996-1999 by Michael J. Heins <mikeh@minivend.com>
 #
 
                    M I S C E L L A N E O U S
index 2bbf86f..d6f1399 100644 (file)
 
                   W H A T ' S   N E W 
 
-MiniVend 3.11 is a major release enhancing many aspects of
-product pricing, secure authorization, and database updates.
+MiniVend 3.12 is a major release with multiple new features,
+particularly in the area of user access control.
 
-       * 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.
+New features: 
 
-       * Experimental catalog configuration "wizard" and admin
-         interface built in.
+    * 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
@@ -20,40 +246,53 @@ product pricing, secure authorization, and database updates.
       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.)
 
-       * New [goto LABEL] and [label LABEL] allow chunks of a 
-         page to be skipped.
+      LocaleDatabase is implemented in the demo.
 
-    * Makecat program adds catalogs to a running server.
-    
-       * German error messages added to error locale file (thanks to
-         Karsten Mueller).
+    * 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 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 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.
@@ -63,8 +302,13 @@ product pricing, secure authorization, and database updates.
       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].
+    * 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.
 
index 9acc7bb..b203425 100644 (file)
@@ -11,11 +11,6 @@ sub {
 
        my $myname = $Vend::Cfg->{CatalogName};
 #::logGlobal("Trying to reconfig $name");
-       if (! Vend::Util::check_security('', 1)) {
-               $::Values{mv_error_tag_restart} = "Not authorized.";
-               return undef;
-       }
-#::logGlobal("Passed security check on reconfig $name");
 
        if($myname ne '_mv_admin' and $myname ne $name) {
                        $::Values{mv_error_tag_restart} =
@@ -204,16 +199,26 @@ sub {
        my $template_begin = <<EOT;
 <SCRIPT LANGUAGE="javascript">
 <!-- hide
+       mvABok = (
+                       (
+                               (navigator.appName == "Netscape") && 
+                               (parseInt(navigator.appVersion) >= 3 )
+                       ) || 
+                       (
+                         (navigator.appName == "Microsoft Internet Explorer") && 
+                               (parseInt(navigator.appVersion) >= 4 )
+                       )
+               ); 
 
    function ${scr}img_up (imgName) {
-     if (document.images) {
+     if (mvABok && document.images) {
         imgUp = eval(imgName + "up.src");
         document [imgName].src = imgUp;
      }
    }
 
    function ${scr}img_dn (imgName) {
-     if (document.images) {
+     if (mvABok && document.images) {
         imgDn = eval(imgName + "dn.src");
         document [imgName].src = imgDn;
      }
@@ -229,12 +234,12 @@ EOT
 
        my $all_up = <<EOT;
 function all_up   () {
- if (document.images) {
+ if (mvABok && document.images) {
 EOT
 
        my $all_dn = <<EOT;
 function all_dn  () {
- if (document.images) {
+ if (mvABok && document.images) {
 EOT
 
 
@@ -254,10 +259,12 @@ EOT
                else {
                        $name = $scr . $i++;
                        $middle .= <<EOM;
-${name}up = new Image();
-${name}dn = new Image();
-${name}up.src = "$imgdir${base}_up.$ext";
-${name}dn.src = "$imgdir${base}.$ext";
+if(mvABok) {
+       ${name}up = new Image();
+       ${name}dn = new Image();
+       ${name}up.src = "$imgdir${base}_up.$ext";
+       ${name}dn.src = "$imgdir${base}.$ext";
+}
 EOM
                        $all_up .= "\t${scr}img_up('$name')\n";
                        $all_dn .= "\t${scr}img_dn('$name')\n";
index 2007d52..fb99d86 100644 (file)
@@ -92,4 +92,31 @@ Add to:</TD>
 <TD COLSPAN=3>
 When you click <B>Next</B>, the catalog will be made. Go <B>Back</B> if you
 need to change anything.</TD>
-</TR></TABLE>
+</TR>
+[set name=addl interpolate=1][additional template="[value TEMPLATE]"][/set]
+[if scratch addl]
+<TR>
+<TD COLSPAN=3>
+There are additional things to ask or verify. They should have defaults
+if you want to leave them alone.
+</TD>
+[loop arg="[scratch addl]"]
+[if !value [loop-code]]
+       <tr>
+               <td width="75" VALIGN=CENTER>
+                       <font size="-1"><B>[additional name="[loop-code]" prompt=1]:</B></font><BR>
+               </td>
+               <TD WIDTH=15>&nbsp;&nbsp;</TD>
+               <td>[additional name="[loop-code]" help=1]
+                       <input name="[loop-code]" type="TEXT" size="38"
+                               value="[default
+                                                       name='[loop-code]'
+                                                       default='[additional name="[loop-code]" default=1]'
+                                                       ]">
+               </td>
+       </tr>
+[/if]
+[/loop]
+</table>
+</TR>
+</TABLE>
index f9d2557..e148cbe 100644 (file)
@@ -87,7 +87,7 @@
 
 </TABLE>
 </FORM>
-
 [/fly-list]
+      VER: [embed] $::VERSION [/embed] - Number of momentary servers: [global-value Vend::Server::Num_servers]
 </BODY>
 </HTML>
index 39669ed..829132f 100644 (file)
@@ -59,6 +59,70 @@ sub {
 }
 EOR
 
+UserTag additional AddAttr
+UserTag additional Order template
+UserTag additional PosNumber 1
+UserTag additional Routine <<EOR
+sub {
+       my ($dir, $opt) = @_;
+       $opt = {} if ! $opt;
+       ADDITIONAL: {
+               last ADDITIONAL if $opt->{'name'} and
+                       defined $::Scratch->{MVC_HELP};
+               unless ($dir =~ m{(?:[A-Z]:)?[/\\]} ) {
+                       $dir = "$Global::VendRoot/$dir";
+               }
+               return '' unless -f "$dir/config/additional_fields";
+               open(ADDL, "$dir/config/additional_fields")
+                       or return '';
+               my @var;
+               my %help;
+               my %prompt;
+               my %default;
+               local ($/) = "";
+               if(open(ADDLHELP, "$dir/config/additional_help") ) {
+                       while(<ADDLHELP>) {
+                               my($parm,$help) = split /\n/, $_, 2;
+                               $help =~ s/\s*$/\n\n/;
+                               $help{uc $parm} = $help;
+                       }
+                       close ADDLHELP;
+               }
+               while(<ADDL>) {
+                       s/\s+$//;
+                       s/__MVC_([A-Z0-9]+)__/$::Values->{$1}/eg;
+                       my ($var, $prompt, $default) = split /\n/, $_, 3;
+                       $var =~ s/\s+//g;
+                       $var = uc $var;
+                       push @var, $var;
+                       $prompt{$var} = $prompt;
+                       $default{$var} = $default;
+                       if (defined $help{$var}) {
+                               $help{$var} =~ s/__MVC_([A-Z0-9]+)__/$::Values->{$1}/eg;
+                       }
+               }
+               close ADDL;
+               $::Scratch->{MVC_HELP}    = \%help;
+               $::Scratch->{MVC_VAR}     = \@var;
+               $::Scratch->{MVC_PROMPT}  = \%prompt;
+               $::Scratch->{MVC_DEFAULT} = \%default;
+       }
+       if($opt->{'name'}) {
+               my $name = uc $opt->{'name'};
+               return $::Scratch->{MVC_HELP}{$name}
+                       if $opt->{'help'};
+               return $::Scratch->{MVC_PROMPT}{$name}
+                       if $opt->{'prompt'};
+               return $::Scratch->{MVC_DEFAULT}{$name} || ' '
+                       if $opt->{'default'};
+       }
+       else {
+               return "" if ! $::Scratch->{MVC_VAR};
+               return join " ", @{$::Scratch->{MVC_VAR}};
+       }
+}
+EOR
+
 UserTag makecat Order seed
 UserTag makecat Routine <<EOR
 sub {
@@ -135,6 +199,12 @@ sub {
 
        /);
 
+       if(defined $::Scratch->{MVC_VAR}) {
+               push @session, map { lc $_ } @{$::Scratch->{MVC_VAR}};
+       }
+
+       my %seen;
+       @session = grep ! $seen{$_}++, @session;
        my %implicit = qw/nocfg 1 norunning 1/;
 
        my @parms;
index b784e47..4cabe34 100644 (file)
@@ -2,9 +2,9 @@
 #
 # check - MiniVend support program
 #
-# $Id: check,v 1.6 1998/03/21 12:15:48 mike Exp $
+# $Id: check,v 1.7 1999/01/23 19:52:25 mike Exp $
 #
-# Copyright 1996-1998 by Michael J. Heins <mikeh@iac.net>
+# Copyright 1996-1999 by Michael J. Heins <mikeh@iac.net>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
index 531a25e..61678ca 100644 (file)
@@ -2,7 +2,7 @@
 #
 # MiniVend session dumper
 #
-# $Id: dump,v 1.10 1998/08/11 18:16:32 mike Exp $
+# $Id: dump,v 1.11 1999/01/23 19:52:33 mike Exp $
 #
 # This program is largely based on Vend 0.2
 # Copyright 1995 by Andrew M. Wilcox <awilcox@world.std.com>
@@ -11,7 +11,7 @@
 # Copyright 1995 by Andrew M. Wilcox <awilcox@world.std.com>
 #
 # Enhancements made by and
-# Copyright 1996-1998 by Michael J. Heins <mikeh@minivend.com>
+# Copyright 1996-1999 by Michael J. Heins <mikeh@minivend.com>
 #
 # See the file 'Changes' for information.
 #
@@ -43,6 +43,10 @@ BEGIN {
 
        $Global::VendRoot = $Global::VendRoot || '/home/minivend';
        $Global::ErrorFile = "$Global::VendRoot/error.log";
+       $ENV{MINIVEND_STORABLE} = 1
+               if -f "$Global::VendRoot/_session_storable";
+       $ENV{MINIVEND_STORABLE_DB} = 1
+               if -f "$Global::VendRoot/_db_storable";
 }
 
 ### END CONFIGURABLE VARIABLES
@@ -71,7 +75,7 @@ use Fcntl;
 my $Extension;
 
 BEGIN {
-       $Global::GDBM = $Global::DB_File = $Global::NDBM = $Global::Msql = 0;
+       $Global::GDBM = $Global::DB_File = $Global::NDBM = 0;
        $Extension = '';
     AUTO: {
         last AUTO if
index 0dedea7..9a4e776 100644 (file)
@@ -2,7 +2,7 @@
 #
 # MiniVend session expiration
 #
-# $Id: expire,v 1.11 1998/07/18 11:45:02 mike Exp $
+# $Id: expire,v 1.13 1999/01/23 19:52:35 mike Exp $
 #
 # This program is largely based on Vend 0.2
 # Copyright 1995 by Andrew M. Wilcox <awilcox@world.std.com>
@@ -11,7 +11,7 @@
 # Copyright 1995 by Andrew M. Wilcox <awilcox@world.std.com>
 #
 # Enhancements made by and
-# Copyright 1996-1998 by Michael J. Heins <mikeh@minivend.com>
+# Copyright 1996-1999 by Michael J. Heins <mikeh@minivend.com>
 #
 # See the file 'Changes' for information.
 #
@@ -40,6 +40,10 @@ BEGIN {
        ($Global::VendRoot = $ENV{MINIVEND_ROOT})
                if defined $ENV{MINIVEND_ROOT};
 $Global::VendRoot = $Global::VendRoot || '/home/minivend';
+       $ENV{MINIVEND_STORABLE} = 1
+               if -f "$Global::VendRoot/_session_storable";
+       $ENV{MINIVEND_STORABLE_DB} = 1
+               if -f "$Global::VendRoot/_db_storable";
        
 }
 ### END CONFIGURABLE VARIABLES
@@ -62,7 +66,7 @@ $Vend::SessionName = 'utility';
 #select a DBM
 
 BEGIN {
-       $Global::GDBM = $Global::DB_File = $Global::Msql = 0;
+       $Global::GDBM = $Global::DB_File = 0;
     AUTO: {
         last AUTO if
             (defined $ENV{MINIVEND_DBFILE} and $Global::DB_File = 1);
@@ -108,7 +112,7 @@ my $catalog;
 my $expiretime;
 my $reorg;
 
-$Vend::Cfg = {};
+$Vend::Cfg = { FileCreationMask => 0600 };
 
 use Getopt::Std;
 
index 0088f45..f417b1c 100644 (file)
@@ -47,19 +47,19 @@ PARSECFG: {
 
        $file = "$VendRoot/minivend.cfg";
        open(MVCFG, $file) or die "Couldn't read $file: $!\n";
-       while(<MVCFG>) { push(@cfglines, $_) if /^\s*(sub)?catalog\s+/i }
+       while(<MVCFG>) { push(@cfglines, $_) if /^\s*catalog\s+/i }
        close MVCFG;
 
        eval {
                $file = "$VendRoot/catalogs.list";
                open(MVCFG, $file) or die "Couldn't read $file: $!\n";
-               while(<MVCFG>) { push(@cfglines, $_) if /^\s*(sub)?catalog\s+/i }
+               while(<MVCFG>) { push(@cfglines, $_) if /^\s*catalog\s+/i }
                close MVCFG;
        };
        eval {
                $file = "$VendRoot/active.catalogs";
                open(MVCFG, $file) or die "Couldn't read $file: $!\n";
-               while(<MVCFG>) { push(@cfglines, $_) if /^\s*(sub)?catalog\s+/i }
+               while(<MVCFG>) { push(@cfglines, $_) if /^\s*catalog\s+/i }
                close MVCFG;
                rename $file, "$file.bak";
        };
@@ -67,8 +67,8 @@ PARSECFG: {
        @cfglines = grep !$seen{$_}++, @cfglines;
 
        for(@cfglines) {
-               next unless /^\s*(sub)?catalog\s+([-\w_]+)/i;
-               push @cats, $2;
+               next unless /^\s*catalog\s+([-\w_]+)/i;
+               push @cats, $1;
        }
 
 }
index 510ddc1..61830ad 100644 (file)
@@ -2,7 +2,7 @@
 #
 # makecat = MiniVend catalog configurator
 #
-# Copyright 1996-1998 by Michael J. Heins <mikeh@minivend.com>
+# Copyright 1996-1999 by Michael J. Heins <mikeh@minivend.com>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -54,7 +54,6 @@ my $Removeconfig;
 my $Reconfigure = 0;
 my $Configfile;
 my $Cfg;
-my $Interactive;
 my $Logfile = 'makecat.log';
 my $catalog_name;
 my %Conf;
@@ -72,7 +71,6 @@ options:
     -F    Force make of catalog with defaults
     -f    Configuration file (default is $0.cfg)
     -l    File to log to (default makecat.log)
-    -i    Interactive edit of configuration
     -r    Reconfigure defaults
 
     Defaults:
@@ -83,7 +81,7 @@ options:
     --minivenduser=username  The user ID which runs MiniVend
     --serverconf=filename    Location of httpd.conf
     --vendroot=filename      Location of MiniVend software
-       --homedir=directory      Use instead of $HOME to set defaults
+       --homedir=directory      Use instead of \$HOME to set defaults
 
     Required:
     --catroot=directory      Directory where MiniVend catalog files go
@@ -129,7 +127,6 @@ my %optctl = (
     'demotype'          => \$Conf{demotype},
     'documentroot'      => \$Conf{documentroot},
     'f'                 => \$Configfile,
-    'i'                 => \$Interactive,
     'homedir'           => \$Conf{homedir},
     'imagedir'          => \$Conf{imagedir},
     'imageurl'          => \$Conf{imageurl},
@@ -216,13 +213,16 @@ EOF
 
 unless($catalog_name) {
        die "$USAGE\n" if $Vend::MakeCat::Force;
-       $Interactive = 1;
        print <<EOF;
 
 Select a short, mnemonic name for the catalog. This will be
 used to set the defaults for naming the catalog, executable,
 and directory, so you will have to type in this name frequently.
 
+NOTE: This will be the name of 'vlink' or 'tlink', the link CGI
+program. Depending on your CGI setup, it may also have the 
+extension .cgi added.
+
 If you are doing the demo for the first time, you might use "simple".
 
 EOF
@@ -481,6 +481,10 @@ sub prefix {
 }
 
 my %History = (
+    demotype =>  sub {
+                                               return('simple', 'flycat');
+                                       },
+
     documentroot =>  sub {
                                                if(defined $Servers->{$Servername}) {
                                                        return $Servers->{$Servername}->{documentroot}
@@ -929,136 +933,6 @@ EOF
 #############
 
        my $serv = prefix('servername') || 'www.yourdomain'; 
-       my $demo_template = <<"EndOfTemplate";
-# The server name, something like: www.company.com
-#                                  www.company.com:8000
-#                                  www.company.com/~yourname
-#
-SERVERNAME     $serv
-
-EndOfTemplate
-
-       $demo_template .= <<'EndOfTemplate';
-# The ID for this store, which you just put in as the catalog name.
-# Might be used as the basis for a or a lot of different things. We
-# will use it to set:
-#
-#   -- the default name of the CGI link program (vlink or tlink)
-#   -- the ID of the catalog
-#   -- the directory name
-#
-# and some other things.
-#
-STOREID        __STOREID__
-
-# The base template. You only should change this if you have made your
-# own template or downloaded one (like "sample" from ftp.minivend.com/pub).
-#
-DEMOTYPE        simple
-
-# A path to the store logo image, regular and small. Just the image, should
-# be something like:
-#
-LOGO            artstore.gif
-SMLOGO          artsmall.gif
-
-# The shipping modes to select -- these are defined in shipping.asc
-#
-SHIPMODES       upsg upsb upsr
-
-# What your beginning order number should be. MUST CONTAIN ONLY LETTERS
-# AND NUMBERS --- NO DASHES OR UNDERSCORES.
-#
-ORDPREFIX       __STOREID__00000
-
-# Company/division name, address, contact info
-COMPANY         The Art Store
-ADDRESS         123 Any St.
-CITY            Yourtown, USA 00000
-PHONE           (513) 555-5555
-TOLLFREE        (888) 555-5555
-FAX             (513) 555-5556
-
-# Your email address for information inquiries here. You will be asked
-# separately for and address where orders will be sent.
-EMAILINFO      __STOREID__
-
-# Encryption program for encrypting credit card numbers.
-ENCRYPTOR       none
-
-# The rest are the entries that are done normally by the catalog configuation
-# script. You can set defaults by uncommenting and editing them, or
-# use the normal defaults by not editing them.
-
-EndOfTemplate
-
-DEMOSETUP: {
-
-       my %extra;
-       for ( qw/
-                               ADDRESS CITY COMPANY DEMOTYPE EMAILINFO ENCRYPTOR
-                               FAX LOGO ORDPREFIX PHONE SERVERNAME SHIPMODES
-                               SMLOGO STOREID TOLLFREE
-                       /
-               )
-       {
-               #next if defined $ENV{"MVC_$_"};
-               next if prefix($_);
-               $demo_template =~ /^$_\s+(.*)/m;
-               $ENV{"MVC_$_"} = $1;
-       }
-
-}
-
-if($Interactive) {
-
-       my $key; 
-       my (@keys) = $Cfg->val('global', 'askconfig');
-       foreach $key (@keys) {
-               $demo_template .= Vend::MakeCat::description($key);
-               $demo_template .= sprintf "%-15s %s\n\n", uc $key, prefix(lc $key);
-       }
-
-       my $cfgfile = "$catalog_name.cfg";
-       
-       my $end = $Windows ? "\r\n" : "\n";
-       unless (-f $cfgfile) {
-                       open WRITE, ">$cfgfile" or die "create $cfgfile: $!\n";
-                       my @lines;
-                       @lines = split /\n/, $demo_template;
-                       for(@lines) {
-                                       s/__STOREID__/$catalog_name/g;
-                                       print WRITE "$_\n";
-                       }
-                       close WRITE;
-       }
-
-       print <<EOF;
-
-You are in interactive mode.
-
-You can now edit the store configuration. When you save the file,
-you will get a chance to abort the catalog make.
-
-EOF
-
-       $ans = prompt("Press ENTER to edit...");
-
-       $editor = $ENV{VISUAL} || $ENV{EDITOR} || ($Windows ? 'notepad' : 'vi');
-
-       system "$editor $cfgfile";
-
-       $ans = prompt("Continue and make the catalog? ", 'y');
-
-       chomp $ans;
-       $ans = 'y' unless $ans;
-
-       exit unless $ans =~ /^\s*y/i;
-
-       undef $Interactive;
-       goto READCONFIG;
-
-}
 
 # Set server
 
@@ -1194,9 +1068,10 @@ unless (defined $mvuid) {
        die "$Conf{minivenduser} is not a valid user name on this machine.\n";
 }
 
+# Fix supplied by Paul V. Shevtsov
 if($isroot) {
-       chown ($mvuid, $mvgid, $configfile)
-               or warn "\nCouldn't set ownership of $configfile: $!\n";
+       chown ($mvuid, $mvgid, $Configfile)
+               or warn "\nCouldn't set ownership of $Configfile: $!\n";
 }
 
 if ($Conf{minivendgroup}) {
@@ -1237,6 +1112,7 @@ for ( $Conf{catroot}, $Conf{documentroot}, $Conf{basedir},
 die "\n" if $warn;
 
 my $prog;
+use vars qw/$CGIwrap/;
 
 SETLINKMODE: {
        if($prog = prefix('linkprogram')) {
@@ -1278,6 +1154,10 @@ EOF
        elsif($ask =~ /^\s*n/i) {
                $prog = "NONE";
        }
+       else {
+               $ask = prompt("Do you use CGIWRAP? ", 'n');
+               $CGIwrap = $ask =~ /^\s*y/i;
+       }
 
 }
 
@@ -1392,6 +1272,68 @@ else {
        $dir = $Conf{'demotype'};
 }
 
+# Do some additional configuration if the additional_fields
+# file is found
+
+ADDITIONAL: {
+       last ADDITIONAL unless -f "$dir/config/additional_fields";
+       open(ADDL, "$dir/config/additional_fields") 
+               or last ADDITIONAL;
+       my %help;
+       local ($/) = "";
+       if(open(ADDLHELP, "$dir/config/additional_help") ) {
+               while(<ADDLHELP>) {
+                       my($parm,$help) = split /\n/, $_, 2;
+                       $help =~ s/\s*$/\n\n/;
+                       $help{uc $parm} = $help;
+               }
+               close ADDLHELP;
+       }
+       print "found more to ask.\n\n";
+       while(<ADDL>) {
+               s/\s+$//;
+               s/__MVC_([A-Z0-9]+)(__)?/substitute($1,$2)/eg;
+               my ($var, $prompt, $default) = split /\n/, $_, 3;
+               $var =~ s/\s+//g;
+               $var = lc $var;
+               my $ucvar = uc $var;
+               if (defined $help{$ucvar}) {
+                       $help{$ucvar} =~ s/__MVC_([A-Z0-9]+)(__)?/substitute($1,$2)/eg;
+                       print $help{$ucvar};
+               }
+               $Conf{$var} = prompt( do_msg("$prompt: ", 40),
+                                                        (delete $ENV{"MVC_$ucvar"} || $Conf{$var} || $default) ) ;
+       }
+       close ADDL;
+}
+
+PRECMD: {
+       last PRECMD unless -f "$dir/config/precopy_commands";
+       open(ADDL, "$dir/config/precopy_commands") 
+               or last PRECMD;
+       print "\nFound system commands to run.\n\n";
+       local ($/) = "";
+       while(<ADDL>) {
+               s/\s+$//;
+               s/__MVC_([A-Z0-9]+)(__)?/substitute($1,$2)/eg;
+               my ($command, $prompt) = split /\n/, $_, 2;
+               $command =~ s/^\s+//;
+               $command =~ s/\s+$//;
+               print $prompt;
+               my $ans = prompt( do_msg(qq{run "$command"? }, 40), 'y' );
+               if($ans =~ /^\s*y/i) {
+                       system $command;
+                       if($?) {
+                               print "\nCommand returned error code " . ($? >> 8) . ": $!\n";
+                       }
+               }
+               else {
+                       print "\nskipping '$command'\n";
+               }
+       }
+       close ADDL;
+}
+
 # Here we actually do the file copy unless --nocopy is set
 DOCOPY: {
 
@@ -1539,19 +1481,27 @@ sub wanted {
        umask(022) unless $Conf{noumask};
 
        unless ($prog eq 'NONE') {
-
+               my $ask_cgi = 'y';
                print do_msg("Moving link program to $cginame");
+               if(-f $cginame) {
+                       $ask_cgi = prompt ("$cginame exists, overwrite? ", 'n');
+               }
 
-               File::Copy::copy("$Conf{catroot}/executable", $cginame)
-                       or die "\nCouldn't copy link executable from $prog to $cginame: $!\n";
-               unlink "$Conf{catroot}/executable";
+               if(is_yes($ask_cgi)) {
+                       File::Copy::copy("$Conf{catroot}/executable", $cginame)
+                               or die
+                               "\nCouldn't copy link executable from $prog to $cginame: $!\n";
+                       chmod 0755, $cginame   
+                                       or die "\nCouldn't make $cginame executable: $!\n";
+                       unlink "$Conf{catroot}/executable";
+               }
 
                if($isroot) {
                        chown ($mvuid, $mvgid, $cginame)
                                or die "\nCouldn't set ownership of $cginame: $!\n";
                }
 
-               unless ($Windows or $Inetmode) {
+               unless ($Windows or $Inetmode or $CGIwrap) {
                        unless ($isroot or can_do_suid()) {
                                print <<EOF;
 
@@ -1657,6 +1607,33 @@ EOF
        }
 
 }
+
+POSTCMD: {
+       last POSTCMD unless -f "$dir/config/postcopy_commands";
+       open(ADDL, "$dir/config/postcopy_commands") 
+               or last POSTCMD;
+       print "\nFound additional system commands to run.\n\n";
+       local ($/) = "";
+       while(<ADDL>) {
+               s/\s+$//;
+               s/__MVC_([A-Z0-9]+)(__)?/substitute($1,$2)/eg;
+               my ($command, $prompt) = split /\n/, $_, 2;
+               $command =~ s/^\s+//;
+               $command =~ s/\s+$//;
+               print $prompt;
+               my $ans = prompt( do_msg(qq{run "$command"? }, 40), 'y' );
+               if($ans =~ /^\s*y/i) {
+                       system $command;
+                       if($?) {
+                               print "\nCommand returned error code " . ($? >> 8) . ": $!\n";
+                       }
+               }
+               else {
+                       print "\nskipping '$command'\n";
+               }
+       }
+       close ADDL;
+}
        my $add;
 
        umask(07) unless $Conf{noumask};
@@ -1705,8 +1682,8 @@ EOF
                open(NEWCFG, ">minivend.cfg")
                        or die "\nCouldn't write minivend.cfg: $!\n";
 
-               $newcfgline = sprintf "%-13s %s %s %s\n", 'Catalog',
-                               $catalog_name, $Conf{catroot}, $full . $Conf{cgiurl};
+               $newcfgline = sprintf "%-13s %s %s %s %s\n", 'Catalog',
+                               $catalog_name, $Conf{catroot}, $full . $Conf{cgiurl}, $Conf{aliases};
                if (defined $mark) {
                        print NEWCFG @out[0..$mark-1];
                        print NEWCFG $newcfgline;
@@ -1735,8 +1712,8 @@ $newcfgline
 EOF
        }
 
-       $newcfgline = sprintf "%-13s %s %s %s\n", 'Catalog',
-                               $catalog_name, $Conf{catroot}, $full . $Conf{cgiurl};
+       $newcfgline = sprintf "%-13s %s %s %s %s\n", 'Catalog',
+                               $catalog_name, $Conf{catroot}, $full . $Conf{cgiurl}, $Conf{aliases};
 
        if($add_to_running) {
                my $fn = 'etc/restart';
@@ -1746,6 +1723,10 @@ EOF
                printf RESTART $newcfgline;
                Vend::Util::unlockfile(\*RESTART)               or die "unlock $fn: $!\n";
                close RESTART;
+               if($isroot) {
+                       chown ($mvuid, $mvgid, $fn)
+                               or warn "\nCouldn't set ownership of $fn: $!\n";
+               }
                unless ($Windows) {
                        kill 'HUP', $pid;
                        sleep 1;
index 895ebe7..e848741 100644 (file)
@@ -1,8 +1,8 @@
-#!/usr/bin/perl -w
+#!/usr/bin/perl
 #
-# MiniVend version 3.11
+# MiniVend version 3.12
 #
-# $Id: minivend,v 1.34 1998/09/01 13:15:22 mike Exp mike $
+# $Id: minivend,v 1.38 1999/02/12 12:24:23 mike Exp $
 #
 # This program is largely based on Vend 0.2
 # Copyright 1995 by Andrew M. Wilcox <awilcox@world.std.com>
@@ -56,13 +56,31 @@ $Global::SendMailLocation = '/usr/lib/sendmail';
 if($Config{osname} =~ /win32/i) {
        $Global::Windows = 1;
 }
+
 # Uncomment next line if you want to guarantee use of DB_File
 #$ENV{MINIVEND_DBFILE} = 1;
 
+# Uncomment next line if you want to guarantee use of GDBM and not DB_File
+#$ENV{MINIVEND_GDBM} = 1;
+
 # Uncomment next line if you want to use no DBM, sessions
-# stored in files and databases in memory (or mSQL)
+# stored in files and databases in memory (or SQL)
 #$ENV{MINIVEND_NODBM} = 1;
 
+# Uncomment next line if you DON'T want to use DBI, can
+# save a bit on code size
+#$ENV{MINIVEND_NO_DBI} = 1;
+
+# Uncomment next line if you want to use the Storable
+# module for storing session data. It improves session performance
+# to a good degree. We will also do a bit of auto-detect below.
+#$ENV{MINIVEND_STORABLE} = 1;
+
+# Uncomment next line if you want to use the Storable
+# module for storing database data. It improves GBDM/DB_File performance
+# to a good degree. We will also do a bit of auto-detect below.
+#$ENV{MINIVEND_STORABLE_DB} = 1;
+
 # Uncomment AND SET next line to set PGP path to somewhere besides
 # the MiniVend user path
 #$ENV{PGPPATH} = '/usr/local/pgp';
@@ -73,6 +91,15 @@ if(-f "$Global::VendRoot/linux.badposix") {
        $ENV{MINIVEND_BADPOSIX} = 1;
 }
 
+# Use the Storable module for storing data in DBM files.
+if (-f "$Global::VendRoot/_session_storable") {
+       $ENV{MINIVEND_STORABLE} = 1;
+}
+
+if (-f "$Global::VendRoot/_db_storable") {
+       $ENV{MINIVEND_STORABLE_DB} = 1;
+}
+
 # If you set this to true, you can create an alias that doesn't begin
 # with a / and do a direct database query with vlink. For example:
 #
@@ -88,16 +115,6 @@ if(-f "$Global::VendRoot/linux.badposix") {
 #  
 $Global::AllowQuery = 1;
 
-# The following will stay until this is fixed in RedHat Linux.
-# Set the above to 0 if your version won't dump core on strftime.
-if(    $Config{osname} eq 'linux'                      and 
-       ! $Config{d_gnulibc} eq 'define'        and
-       ! defined $ENV{MINIVEND_BADPOSIX} )
-{
-       $ENV{MINIVEND_BADPOSIX} = 1;
-}
-
-
 $Global::ErrorFile = 'error.log';
 }
 
@@ -133,7 +150,9 @@ sub debug {
        return ($_[0] || 0) & $Global::DEBUG;
 }
 
-$VERSION = '3.11';
+BEGIN {
+       $VERSION = '3.12';
+}
 use strict;
 use Fcntl;
 
@@ -151,21 +170,30 @@ $Global::SendMailLocation = ($Global::Windows and $Global::SendMailLocation) ||
 BEGIN {
        chdir $Global::VendRoot
                or die "Couldn't change directory to $Global::VendRoot: $!\n";
-       $Global::GDBM = $Global::DB_File = $Global::Msql = $Global::DBI = 0;
-       eval {require Msql and $Global::Msql = 1};
+       $Global::GDBM = $Global::DB_File = $Global::DBI = 0;
+       
        # This is for standard DBI
-       eval {require DBI and $Global::DBI = 1};
+       eval {
+                       die if $ENV{MINIVEND_NODBI};
+                       require DBI and $Global::DBI = 1
+       };
 
        # This is for experimenting with Win32::ODBC
        #use DBI::W32ODBC;
        #$Global::DBI = 1;
 
+       # Clean HTML if module there
+       eval {require HTML::Clean; };
+
+       # Now can use any type of database
        AUTO: {
                last AUTO if 
                        (defined $ENV{MINIVEND_DBFILE} and $Global::DB_File = 1);
                last AUTO if 
                        (defined $ENV{MINIVEND_NODBM});
-               eval {require GDBM_File and $Global::GDBM = 1} ||
+               eval {require GDBM_File and $Global::GDBM = 1};
+               last AUTO if 
+                       (defined $ENV{MINIVEND_GDBM} and $Global::GDBM = 1);
                eval {require DB_File and $Global::DB_File = 1};
        }
 
@@ -173,15 +201,19 @@ BEGIN {
                require Vend::Table::GDBM;
                import GDBM_File;
                $Global::GDBM = 1;
+               $Global::Default_database = 'GDBM'
+                       unless defined $Global::Default_database;
        }
-       elsif($Global::DB_File) {
+       if($Global::DB_File) {
                require Vend::Table::DB_File;
                import DB_File;
                $Global::DB_File = 1;
+               $Global::Default_database = 'DB_FILE'
+                       unless defined $Global::Default_database;
        }
-       else {
-               require Vend::Table::InMemory;
-       }
+       $Global::Default_database = 'MEMORY'
+                       unless defined $Global::Default_database;
+       require Vend::Table::InMemory;
 }
 
 
@@ -200,6 +232,7 @@ use Vend::TextSearch;
 use Vend::Order;
 use Vend::Data;
 use Vend::Util;
+use Vend::UserDB;
 use Vend::Interpolate;
 use Vend::ValidCC;
 use Vend::Cart;
@@ -251,6 +284,12 @@ sub response {
        return 1 if $Vend::BuildingPages;
        my $out = ref $output ? $output : \$output;
        check_html($out) if defined $Vend::CheckHTML;
+       if(defined $Vend::CleanHTML) {
+               my $html = new HTML::Clean($out);
+               $html->compat();
+               $html->strip();
+               $out = $html->data();
+       }
        if (defined $Vend::DebugHTML) {
                $$out .= "\n<!-- DEBUG\n" .
                                        $Vend::DebugHTML .
@@ -447,7 +486,7 @@ sub do_page {
                if defined $Vend::Cfg->{CollectData}->{page};
 
        if($Vend::Cfg->{PageCache}      and
-               $CGI::cookie                    and
+               $Vend::Cookie                   and
                ! defined $Vend::Cfg->{NoCache}->{$name})
        {
                cache_page($name, $arg || undef) and $Vend::Session->{'page'} = $name;
@@ -578,7 +617,7 @@ sub do_search {
                create_last_search($c);
        }
 
-       if($Vend::Cfg->{SearchCache} and $CGI::cookie) {
+       if($Vend::Cfg->{SearchCache} and $Vend::Cookie) {
                my($key,$page) = check_search_cache($Vend::Session->{last_search});
                if (defined $page and $CGI::pragma !~ /no-cache/i) {
                        put_session if $Vend::Session->{scratch}->{mv_put_session};
@@ -614,7 +653,7 @@ sub do_scan {
                $c->{mv_cache_key} = $key;
        }
 
-       if($Vend::Cfg->{SearchCache} and $CGI::cookie) {
+       if($Vend::Cfg->{SearchCache} and $Vend::Cookie) {
                ($key,$page) = check_search_cache($Vend::Session->{last_search},$key);
                if (defined $page and $CGI::pragma !~ /no-cache/i) {
                        put_session if $Vend::Session->{scratch}->{mv_put_session};
@@ -719,16 +758,18 @@ sub add_items {
                @bases = split /\0/, $bases, $1;
        }
 
-       foreach $attr (@{$Vend::Cfg->{UseModifier}}) {
-               $attr{$attr} = [];
-               next unless defined $CGI::values{"mv_order_$attr"};
-               @{$attr{$attr}} = split /\0/, $CGI::values{"mv_order_$attr"}, -1;
+       if ($Vend::Cfg->{UseModifier}) {
+               foreach $attr (@{$Vend::Cfg->{UseModifier} || []}) {
+                       $attr{$attr} = [];
+                       next unless defined $CGI::values{"mv_order_$attr"};
+                       @{$attr{$attr}} = split /\0/, $CGI::values{"mv_order_$attr"}, -1;
+               }
        }
 
-      my ($group, $found_master, $mv_mi, $mv_si, @group);
+    my ($group, $found_master, $mv_mi, $mv_si, @group);
 
-      @group = split /\0/, (delete $CGI::values{mv_order_group} || ''), -1;
-      for( $i = 0; $i < @group; $i++ ) {
+    @group = split /\0/, (delete $CGI::values{mv_order_group} || ''), -1;
+    for( $i = 0; $i < @group; $i++ ) {
        $attr{mv_mi}->[$i] = $group[$i] ? ++$Vend::Session->{pageCount} : 0;
        }
 
@@ -831,9 +872,9 @@ sub update_data {
                                         "Table: '%s'\n" .
                                         "Fields:'%s'\n" .
                                         "Key:   '%s'\n",
-                                        $CGI::values{'mv_data_table'},
-                                        $CGI::values{'mv_data_fields'},
-                                        $CGI::values{'mv_data_key'}
+                                        $CGI::values{mv_data_table},
+                                        $CGI::values{mv_data_fields},
+                                        $CGI::values{mv_data_key}
                                         )
                                 );
                
@@ -848,7 +889,7 @@ sub update_data {
        my $table               = $CGI::values{'mv_data_table'};
        my $prikey              = $CGI::values{'mv_data_key'};
        my $decode              = is_yes($CGI::values{'mv_data_decode'});
-       my ($ref, $type, $db, $msql, $database);
+       my ($ref, $type, $db, $database);
 
        $ref = $Vend::Cfg->{Database}->{$table} || '';
 
@@ -858,28 +899,17 @@ sub update_data {
        }
        $Vend::WriteDatabase{$table} = 1;
 
-       if( $ref->{'type'} eq '7') {
-               $type = 'sql';
-               $msql = 'm';
-               $database = $Vend::Cfg->{MsqlDB};
-       }
-       elsif($ref->{'type'} eq '8') {
-               $type = 'sql';
-               $database = $table;
-       }
-       elsif ($function =~ /(m)?sql/i) {
-               $type = 'sql';
-               $msql = $1 || '';
-               $database = $Vend::Cfg->{MsqlDB} if $msql;
-       }
-       elsif ($db = database_exists_ref($table)) {
-               $type = 'dbm';
-               $db = $db->ref();
-       }
-       else {
-               interaction_error("Non-existent database table '$table'");
-               return undef;
-       }
+    if($ref->{'type'} eq '8') {
+        $type = 'sql';
+        $database = $table;
+    }
+    else {
+        $type = 'dbm';
+    }
+
+    $db = database_exists_ref($table)
+        or die "Not a defined database '$table': $!\n";
+    $db = $db->ref();
 
        my @fields              = grep $_, split /[\s\0,]+/, $CGI::values{'mv_data_fields'};
 
@@ -921,28 +951,6 @@ sub update_data {
                if($function eq 'delete') {
                        $db->delete_record($select_key);
                }
-               elsif($type eq 'sql' and $function eq 'insert') {
-                       sql_query('set', "", "delete from $table where code = '$select_key'",
-                                               $msql || undef, $database);
-                       $query = "insert into $table (";
-                       $query .= join ",", @k;
-                       $query .= ") VALUES ('";
-                       $query .= join "','", @v;
-                       $query .= "')";
-               }
-               elsif ($type eq 'sql' and $function eq 'update') {
-                       $query = "UPDATE $table SET ";
-                       my $what;
-                       @c = ();
-                       while (@k) {
-                               ( ($key = shift @k), ($value = shift @v), next )
-                                       if $k[0] eq $prikey;
-                               $what = (shift @k) . "='" . (shift @v) . "'";
-                               push @c, $what;
-                       }
-                       $query .= join ", ", @c;
-                       $query .= " WHERE $key = '$value'";
-               }
                else {
                        my $field;
                        $key = $data{$prikey}->[$i];
@@ -952,9 +960,6 @@ sub update_data {
                                Vend::Data::set_field($db, $key, $field, $value);
                        }
                }
-                               
-               sql_query('set', "", $query, $msql || undef, $database)
-                       if $type eq 'sql';
        }
 
 }
@@ -1114,7 +1119,7 @@ sub update_user {
 
        if(defined $CGI::values{'mv_check'}) {
                delete $Vend::Session->{'values'}->{mv_nextpage};
-               my(@checks) = split /\s*[,\0]+\s*/, $CGI::values{'mv_check'};
+               my(@checks) = split /\s*[,\0]+\s*/, delete $CGI::values{'mv_check'};
                my($check);
                foreach $check (@checks) {
                                parse_click $Vend::Session->{'values'}, $check, \%CGI::values;  
@@ -1148,6 +1153,7 @@ sub do_sub {
        }
 
        return do_page($path) if defined $path;
+       return $Vend::Session->{return_value};
 }
 
 ## DO PROCESS
@@ -1262,7 +1268,7 @@ sub do_process {
                        display_page($next) unless $final;
                }
                else {
-                       $next = $::Values{mv_failpage} || find_special_page('needfield');
+                       $next = $::Values->{mv_failpage} || find_special_page('needfield');
                        display_special_page($next, $missing);
                        last CHECK_ORDER;
                }
@@ -1293,6 +1299,7 @@ sub do_process {
                                        find_special_page('failed'),
                                        $Vend::Session->{cybercash_error}
                                );
+                               put_session();
                                return;
                        }
                }
@@ -1378,9 +1385,6 @@ sub do_process {
                return;
        }
        elsif ($todo eq 'cancel') {
-               $Vend::Session->{'values'}->{'credit_card_no'} = 'xxxxxxxxxxxxxxxxxxxxxx';
-               $Vend::Session->{'values'}->{'credit_card_exp'} = 'xxxxxxxx';
-               $Vend::Session->{'login'} = '';
                my $frames = $Vend::Session->{'frames'};
                put_session();
                get_session();
@@ -1586,39 +1590,38 @@ EOF
                read_accessories();
                read_salestax();
                read_shipping();
-               open_database();
+               open_database(1);
                my $db;
                DREAD: {
-                       if($db = $Vend::Cfg->{DbDatabase}) {
-                               $db = database_exists_ref($db)
-                                       or last DREAD;
-                               $db = $db->ref();
-                               my ($k, @f);    # key and fields
-                               my @l;                  # refs to locale repository
-                               my @n;                  # names of locales
-
-                               @n = $db->columns();
-                               my $name;
-                               foreach $name (@n) {
-                                       my $file = $db->field('_file', $name);
-                                       my $type = $db->field('_type', $name);
-                                       next unless $file and $type;
-                                       Vend::Config::parse_database('', "$name $file $type");
-                               }
-                               my $i;
-                               while( ($k , @f ) = $db->each_record) {
-                                       next if $k =~ /^_/;
-                                       for ($i = 0; $i < @f; $i++) {
-                                               next unless length $f[$i];
-                                               Vend::Config::parse_database('', "$n[$i] $k $f[$i]");
-                                       }
+                       last DREAD unless $db = $Vend::Cfg->{DbDatabase};
+                       $db = database_exists_ref($db)
+                               or last DREAD;
+                       $db = $db->ref();
+                       my ($k, @f);    # key and fields
+                       my @l;                  # refs to locale repository
+                       my @n;                  # names of locales
+
+                       @n = $db->columns();
+                       my $name;
+                       foreach $name (@n) {
+                               my $file = $db->field('_file', $name);
+                               my $type = $db->field('_type', $name);
+                               next unless $file and $type;
+                               Vend::Config::parse_database('', "$name $file $type");
+                       }
+                       my $i;
+                       while( ($k , @f ) = $db->each_record) {
+                               next if $k =~ /^_/;
+                               for ($i = 0; $i < @f; $i++) {
+                                       next unless length $f[$i];
+                                       Vend::Config::parse_database('', "$n[$i] $k $f[$i]");
                                }
                        }
                        my $save = $^W;
                        $^W = 0;
                        close_database();
                        $^W = $save;
-                       open_database();
+                       open_database(1);
                }
                (
                        $Vend::Cfg->{ItemPriceRoutine},
@@ -1626,66 +1629,63 @@ EOF
                )       = read_pricing();
 
                LREAD: {
-                       if($db = $Vend::Cfg->{LocaleDatabase}) {
-                               $db = database_exists_ref($db)
-                                       or last LREAD;
-                               $db = $db->ref();
-                               my ($k, @f);    # key and fields
-                               my @l;                  # refs to locale repository
-                               my @n;                  # names of locales
-
-                               @n = $db->columns();
-                               my $extra;
-                               for(@n) {
-                                       $Vend::Cfg->{Locale_repository}{$_} = {}
-                                               unless $Vend::Cfg->{Locale_repository}{$_};
-                                       push @l, $Vend::Cfg->{Locale_repository}{$_};
-                               }
-                               my $i;
-                               while( ($k , @f ) = $db->each_record) {
-                                       for ($i = 0; $i < @f; $i++) {
-                                               next unless length($f[$i]);
-                                               $l[$i]->{$k} = $f[$i];
-                                       }
+                       last LREAD unless $db = $Vend::Cfg->{LocaleDatabase};
+                       $db = database_exists_ref($db)
+                               or last LREAD;
+                       $db = $db->ref();
+                       my ($k, @f);    # key and fields
+                       my @l;                  # refs to locale repository
+                       my @n;                  # names of locales
+
+                       @n = $db->columns();
+                       my $extra;
+                       for(@n) {
+                               $Vend::Cfg->{Locale_repository}{$_} = {}
+                                       unless $Vend::Cfg->{Locale_repository}{$_};
+                               push @l, $Vend::Cfg->{Locale_repository}{$_};
+                       }
+                       my $i;
+                       while( ($k , @f ) = $db->each_record) {
+                               for ($i = 0; $i < @f; $i++) {
+                                       next unless length($f[$i]);
+                                       $l[$i]->{$k} = $f[$i];
                                }
-                               unless ($Vend::Cfg->{Locale}) {
-                                       for(@n) {
-                                               next unless $Vend::Cfg->{Locale_repository}{$_}{'default'};
-                                               $Vend::Cfg->{Locale} = $Vend::Cfg->{Locale_repository}{$_};
-                                               last;
-                                       }
-                                       $Vend::Cfg->{Locale} = $Vend::Cfg->{Locale_repository}{$n[0]}
-                                               unless $Vend::Cfg->{Locale};
+                       }
+                       unless ($Vend::Cfg->{Locale}) {
+                               for(@n) {
+                                       next unless $Vend::Cfg->{Locale_repository}{$_}{'default'};
+                                       $Vend::Cfg->{Locale} = $Vend::Cfg->{Locale_repository}{$_};
+                                       last;
                                }
+                               $Vend::Cfg->{Locale} = $Vend::Cfg->{Locale_repository}{$n[0]}
+                                       unless $Vend::Cfg->{Locale};
                        }
                }
 
                SREAD: {
-                       if($db = $Vend::Cfg->{DirectiveDatabase}
-                                       || $Vend::Cfg->{VariableDatabase}) {
-                               $db = database_exists_ref($db)
-                                       or last SREAD;
-                               $db = $db->ref();
-                               my ($k, @f);    # key and fields
-                               my @l;                  # refs to locale repository
-                               my @n;                  # names of locales
-
-                               @n = $db->columns();
-                               my $extra;
-                               for(@n) {
-                                       if (! ref $Vend::Cfg->{$_} or $Vend::Cfg->{$_} !~ /HASH/) {
-                                               # ignore non-existent directive
-                                               push @l, {};
-                                               next;
-                                       }
-                                       push @l, $Vend::Cfg->{$_};
+                       last SREAD unless $db = ($Vend::Cfg->{DirectiveDatabase} || $Vend::Cfg->{VariableDatabase});
+                       $db = database_exists_ref($db)
+                               or last SREAD;
+                       $db = $db->ref();
+                       my ($k, @f);    # key and fields
+                       my @l;                  # refs to locale repository
+                       my @n;                  # names of locales
+
+                       @n = $db->columns();
+                       my $extra;
+                       for(@n) {
+                               if (! ref $Vend::Cfg->{$_} or $Vend::Cfg->{$_} !~ /HASH/) {
+                                       # ignore non-existent directive
+                                       push @l, {};
+                                       next;
                                }
-                               my $i;
-                               while( ($k , @f ) = $db->each_record) {
-                                       for ($i = 0; $i < @f; $i++) {
-                                               next unless length($f[$i]);
-                                               $l[$i]->{$k} = $f[$i];
-                                       }
+                               push @l, $Vend::Cfg->{$_};
+                       }
+                       my $i;
+                       while( ($k , @f ) = $db->each_record) {
+                               for ($i = 0; $i < @f; $i++) {
+                                       next unless length($f[$i]);
+                                       $l[$i]->{$k} = $f[$i];
                                }
                        }
                }
@@ -1724,6 +1724,9 @@ sub build_page {
     my($base,$page);
        my $status = 1;
 
+       Vend::Interpolate::reset_calc();
+
+  eval {
        unless($scan) {
                $page = readin($name);
                # Try for on-the-fly if not there
@@ -1825,7 +1828,9 @@ sub build_page {
                print "\cH" x 20 . "skipping, page not found.\n";
                $status = 0;
        }
-       $status;
+  };
+       $status = 0 if $@;
+       return $status;
 
 }
 
@@ -1947,11 +1952,11 @@ sub build_all {
                print "done.\n"
        }
 
-       open_database();
+       open_database(1);
        $Vend::SessionID = '';
        $Vend::SessionName = '';
        init_session();
-       $CGI::cookie = "MV_SESSION_ID=building:local.host";
+    $CGI::cookie = $Vend::Cookie = "MV_SESSION_ID=building:local.host";
        $Vend::Session->{'frames'} = $Vend::Cfg->{FramesDefault};
        require File::Find or die "No standard Perl library File::Find!\n";
        $sub = sub {
@@ -2157,7 +2162,7 @@ sub map_cgi {
 
     $CGI::user = http()->Authenticated_User || '';
     $CGI::useragent = http()->User_Agent;
-    $CGI::cookie = http()->Cookie;
+    $CGI::cookie = $Vend::Cookie = http()->Cookie;
        $CGI::authorization = http()->{Authorization}
                if defined $Vend::InternalHTTP and ! $CGI::user;
 
@@ -2265,11 +2270,13 @@ sub dispatch {
                                $Vend::Save->{VendURL}   = $Vend::Cfg->{VendURL};
                                $Vend::Save->{SecureURL} = $Vend::Cfg->{SecureURL};
                        }
-                       $Vend::Cfg->{VendURL} =~ s!$real!$CGI::script_name!
-                               unless $CGI::secure
-                                       and $Vend::Cfg->{SecureURL} =~ m!$CGI::script_name$!
-                                       and $Vend::Cfg->{VendURL}   !~ m!$CGI::script_name$!;
-                       $Vend::Cfg->{SecureURL} =~ s!$real!$CGI::script_name!;
+            unless (   $CGI::secure                                        and
+                       $Vend::Cfg->{SecureURL} =~ m!$CGI::script_name$!    and
+                       $Vend::Cfg->{VendURL}   !~ m!$CGI::script_name$!                )
+            {
+                               $Vend::Cfg->{VendURL}   =~ s!$real!$CGI::script_name!;
+                               $Vend::Cfg->{SecureURL} =~ s!$real!$CGI::script_name!;
+                       }
                }
                elsif ($Vend::InternalHTTP) {
                        $Vend::Cfg->{VendURL} = "http://" .
@@ -2283,6 +2290,12 @@ sub dispatch {
                $Vend::Cfg = $Global::Standalone;
        }
 
+    if($Global::HitCount) {
+               my $ctr = new File::CounterFile
+                                       "$Global::ConfDir/hits.$Vend::Cfg->{CatalogName}";
+        $ctr->inc();
+       }
+
        if ($Vend::Cfg->{DebugMode}) {
                $Global::DEBUG &= 0xF800;
                $Global::DEBUG |= $Vend::Cfg->{DebugMode};
@@ -2440,18 +2453,49 @@ EOF
 # DEBUG
 #Vend::Util::logDebug("session name='$Vend::SessionName'\n");
 # END DEBUG
+
+       if($Vend::Cfg->{CookieLogin}) {
+               COOKIELOGIN: {
+                       last COOKIELOGIN if $Vend::Session->{logged_in};
+                       last COOKIELOGIN if defined $CGI::values{mv_username};
+                       last COOKIELOGIN unless
+                               $CGI::values{mv_username} = Vend::Util::read_cookie('MV_USERNAME');
+                       my $password;
+                       last COOKIELOGIN unless
+                               $password = Vend::Util::read_cookie('MV_PASSWORD');
+                       $CGI::values{mv_password} = $password;
+                       Vend::UserDB::userdb('login');
+               }
+       }
+
        $Vend::Session->{'id'} = $Vend::SessionID;
        $Vend::Session->{'arg'} = $Vend::Argument;
        $Vend::Session->{'source'} = $rest
                if ! $Vend::Session->{source} &&
                         $rest && $rest =~ /[A-Za-z]/;
        $Vend::Session->{'user'} = $CGI::user;
+       undef $Vend::Cookie if 
+               $Vend::Session->{logged_in} && ! $Vend::Cfg->{StaticLogged};
        $CGI::pragma = 'no-cache'
                if delete $Vend::Session->{scratch}{mv_no_cache};
 
     $Vend::Session->{prev_url} = $Vend::Session->{last_url}
                if defined $Vend::Session->{last_url};
-    $path = $Vend::Session->{last_url} = $CGI::path_info;
+
+       $path = $Vend::Session->{last_url} = $CGI::path_info;
+
+       if(     defined $Vend::Session->{one_time_path_alias} )
+       {
+               $path = $Vend::Session->{one_time_path_alias}{$path}
+                       if defined $Vend::Session->{one_time_path_alias}{$path};
+               delete $Vend::Session->{one_time_path_alias};
+       }
+
+       if( defined $Vend::Session->{path_alias}       and
+               defined $Vend::Session->{path_alias}{$path}             )
+       {
+               $path = $Vend::Session->{path_alias}{$path};
+       }
 
        ROUTINES: {
                last ROUTINES unless index($path, '/process/') == 0;
@@ -2478,10 +2522,40 @@ EOF
                                                                ($Vend::Session->{scratch}{mv_currency} || undef)
                                                        );
        }
-       
-       if($Vend::Cfg->{Autoload}) {
-               do_sub($Vend::Cfg->{Autoload});
-               $path = $Vend::Session->{return_value} if $Vend::Session->{return_value};
+
+       my $macro;
+       if (
+               defined $Vend::Cfg->{Autoload} and
+               $macro = $Vend::Cfg->{Autoload}
+               )
+       {
+               if($macro =~ /\[\w+/) {
+                       interpolate_html($macro);
+               }
+               else {
+                       my (@subs) = grep /\S/, split /\s+/, $macro;
+                       for(@subs) {
+                               do_sub($_) or last;
+                               $path = $Vend::Session->{return_value} if $Vend::Session->{return_value};
+                       }
+               }
+       }
+
+       if (
+               defined $Vend::Session->{Autoload} and
+               $macro = $Vend::Session->{Autoload}
+               )
+       {
+               if($macro =~ /\[\w+/) {
+                       interpolate_html($macro);
+               }
+               else {
+                       my (@subs) = grep /\S/, split /\s+/, $macro;
+                       for(@subs) {
+                               do_sub($_) or last;
+                               $path = $Vend::Session->{return_value} if $Vend::Session->{return_value};
+                       }
+               }
        }
 
     # If the cgi-bin program was invoked with no extra path info,
@@ -2554,6 +2628,7 @@ sub dontwarn {
        $Global::AdminSub +
        $Global::DomainTail +
        $Global::FullUrl +
+    $Global::HitCount +
        $Global::IpHead +
        $Vend::CheckHTML +
        $Vend::ContentType +
@@ -2585,10 +2660,70 @@ sub unhexify {
     $s;
 }
 
+sub parse_multipart {
+       my ($boundary) = $CGI::content_type =~ /boundary=\"?([^\";]+)\"?/;
+#::logGlobal("got to multipart");
+       # Stolen from CGI.pm, thanks Lincoln
+       $boundary = "--$boundary"
+               unless $Vend::Session->{browser} =~ /MSIE 3\.0[12];  Mac/i;
+       unless ($CGI::post_input =~ s/^\s*$boundary\s+//) {
+               return interaction_error("multipart/form-data sent incorrectly");
+       }
+
+       my @parts;
+       @parts = split /\r?\n$boundary/, $CGI::post_input;
+       
+#::logGlobal("multipart: " . scalar @parts . " parts");
+
+       DOMULTI: {
+               for (@parts) {  
+                       last if ! $_ || $_ eq '--';
+                       s/^\s+//;
+                       my($header, $data) = split /\r?\n\r?\n/, $_, 2;
+                       my $token = '[-\w!\#$%&\'*+.^_\`|{}~]';
+                       my %header;
+                       $header =~ s/\r?\n\s+/ /og;           # merge continuation lines
+                       while ($header=~/($token+):\s+([^\r\n]*)/mgox) {
+                               my ($field_name,$field_value) = ($1,$2); # avoid taintedness
+                               $field_name =~ s/\b(\w)/uc($1)/eg; #canonicalize
+                               $header{$field_name} = $field_value;
+                       }
+
+#::logGlobal("Content-Disposition: " .  $header{'Content-Disposition'});
+                       my($param)= $header{'Content-Disposition'}=~/ name="?([^\";]*)"?/;
+
+                       # Bug:  Netscape doesn't escape quotation marks in file names!!!
+                       my($filename) = $header{'Content-Disposition'}=~/ filename="?([^\";]*)"?/;
+#::logGlobal("param='$param' filename='$filename'" );
+                       if(! $param) {
+                               logGlobal("unsupported multipart header: \n$header\n");
+                               next;
+                       }
+
+                       if($filename) {
+                               $CGI::file{$param} = $data;
+                               $data = $filename;
+                       }
+                       else {
+                               $data =~ s/\r?\n$//;
+                       }
+                       unless (defined $CGI::values{$param}) {
+                               $CGI::values{$param} = $data;
+                       }
+                       else {
+                               $CGI::values{$param} .= "\0" . $data;
+                       }
+               }
+       }
+       return 1;
+}
+
 sub parse_post {
        my(@pairs, $pair, $key, $value);
        undef %CGI::values;
        return unless defined $CGI::post_input;
+       return parse_multipart() if $CGI::content_type =~ /^multipart/i;
+#::logError("no multipart, content-type = '$CGI::content_type'");
        @pairs = split(/&/, $CGI::post_input);
        foreach $pair (@pairs) {
                ($key, $value) = ($pair =~ m/([^=]+)=(.*)/)
@@ -2619,7 +2754,7 @@ sub parse_options {
                if (m/^-c(onfig)?$/i) {
                        $Global::ConfigFile = shift @ARGV;
                        die "Missing file argument for -config option\n"
-                               if blank($Global::ConfigFile);
+                               if $Global::ConfigFile;
                } elsif (m/^-D(EBUG)?([\dxa-fA-F]*)$/i) {
                        $Global::DEBUG = $2 || (4096 | 1 );
                } elsif (m/^-s(erve)?$/i) {
@@ -2634,11 +2769,11 @@ sub parse_options {
                } elsif (m/^-f(iles)?$/i) {
                        $Vend::BuildSpec = shift @ARGV;
                        die "Missing file spec for -files option\n"
-                               if blank($Vend::BuildSpec);
+                               if ! $Vend::BuildSpec;
                } elsif (m/^-o(utdir)?$/i) {
                        $Vend::OutputDirectory = shift @ARGV;
                        die "Missing file argument for -outdir option\n"
-                               if blank($Vend::OutputDirectory);
+                               if ! $Vend::OutputDirectory;
                } elsif (m/^-e(xclude)?$/i) {
                        die "-e(xclude) requires argument\n" unless @ARGV;
                        $Vend::CatalogToSkip{shift @ARGV} = 1;
index b470b70..2a3e727 100644 (file)
@@ -60,29 +60,36 @@ use Fcntl;
 
 BEGIN {
 
-       $Global::GDBM = $Global::DB_File = $Global::DBI = $Global::Msql = 0;
-    AUTO: {
-               # This is for standard DBI
-               eval {require DBI and $Global::DBI = 1};
-        last AUTO if
-            (defined $ENV{MINIVEND_DBFILE} and $Global::DB_File = 1);
-        last AUTO if
+       $Global::GDBM = $Global::DB_File = $Global::DBI = 0;
+    # Now can use any type of database
+       AUTO: {
+               last AUTO if 
+                       (defined $ENV{MINIVEND_DBFILE} and $Global::DB_File = 1);
+               last AUTO if 
                        (defined $ENV{MINIVEND_NODBM});
-        eval {require GDBM_File and $Global::GDBM = 1} ||
-        eval {require DB_File and $Global::DB_File = 1};
-    }
+               eval {require GDBM_File and $Global::GDBM = 1};
+               last AUTO if 
+                       (defined $ENV{MINIVEND_GDBM} and $Global::GDBM = 1);
+               eval {require DB_File and $Global::DB_File = 1};
+       }
+
        if($Global::GDBM) {
                require Vend::Table::GDBM;
                import GDBM_File;
                $Global::GDBM = 1;
+               $Global::Default_database = 'GDBM'
+                       unless defined $Global::Default_database;
        }
-       elsif($Global::DB_File) {
+       if($Global::DB_File) {
                require Vend::Table::DB_File;
                import DB_File;
                $Global::DB_File = 1;
+               $Global::Default_database = 'DB_FILE'
+                       unless defined $Global::Default_database;
        }
-       elsif(! $Global::DBI) {
-               die "No DBM defined! Offline import not necessary.\n";
+       
+       unless($Global::GDBM || $Global::DB_File || $Global::DBI) {
+               die "No DBM or DBI defined! Offline import not necessary.\n";
        }
 }
 
index 91254ef..a948c3e 100644 (file)
@@ -274,7 +274,7 @@ sub uri_escape
         # Because we can't compile regex we fake it with a cached sub
         $subst{$patn} =
           eval "sub {\$_[0] =~ s/([$patn])/\$escapes{\$1}/g; }";
-        Carp::croak("uri_escape: $@") if $@;
+        die("uri_escape: $@") if $@;
     }
     &{$subst{$patn}}($text);
     } else {
index 9697bef..a37e999 100644 (file)
@@ -354,13 +354,14 @@ else {
        die "Ooops! No helpfile. Can't continue.\n";
 }
 
-require 5.002 || die <<EOF;
+require 5.004 || die <<EOF;
 
-Sorry, MiniVend requires at least Perl 5.002 to be assured of running
+Sorry, MiniVend requires at least Perl 5.004 to be assured of running
 properly. (If you know enough about UNIX and Perl to defeat this check,
-then you might know enough to get it running with 5.002).
+then you might know enough to get it running with 5.003. But personally
+I wouldn't try.)
 
-Please upgrade your Perl before installing MiniVend 2.0.
+Please upgrade your Perl before installing MiniVend 3.12.
 
 EOF
 
@@ -415,6 +416,16 @@ $Upgrade = -f 'minivend.cfg' ? 1 : 0;
                                        "$Initial{VendRoot}/error.log",
                                        "$Initial{VendRoot}/etc",
                                );
+       KEYF: {
+               last KEYF unless -f 'etc/non_root_files';
+               my @key;
+               open(KEYF, 'etc/non_root_files') 
+                       or warn("can't open non_root_files"), next KEYF;
+               @key = <KEYF>;
+               chomp @key;
+               push @Keyfiles, grep /\S/, @key;
+               close KEYF;
+       }
        # Change ownership of key files if we are root.
 if(! $Windows and $< == 0) {
        print <<EOF;
@@ -689,6 +700,7 @@ else {
 }
 my $host = $extrahost || $Config{'myhost'};
 
+my $Made_cat;
 $Runcommand =~ s/\r?\n.*//s;
 
 MAKECAT: {
@@ -706,7 +718,7 @@ makecat program at:
                http://$host:7786/mv_admin
 
 EOF
-       $ans = prompt "Make the simple demo now? ", ($have_www_stuff ? 'no' : 'yes');
+       $ans = prompt "Make the simple demo now? ", 'yes';
        last MAKECAT unless $ans =~ /^\s*y/i;
        system $Makecat;
        if($?) {
@@ -724,6 +736,7 @@ EOF
                $ans = prompt "Re-try making catalog? ",  ($have_www_stuff ? 'no' : 'yes');
                redo MAKECAT if $ans =~ /^\s*y/i;
        }
+       else { $Made_cat = 1 }
 }
 
 RUNSERVER: {
@@ -793,6 +806,7 @@ EOF
        $ans = prompt("Start the MiniVend server? ", "yes");
        last RUNSERVER unless $ans =~ /^\s*y/i;
        system $Runcommand;
+       last RUNSERVER if $Made_cat;
        my $h = "http://$host:7786/mv_admin";
        $ans = prompt("Start Netscape with $h? ", "yes");
        last RUNSERVER unless $ans =~ /^\s*y/i;
diff --git a/dist/etc/non_root_files b/dist/etc/non_root_files
new file mode 100644 (file)
index 0000000..2269a52
--- /dev/null
@@ -0,0 +1,8 @@
+admin
+admin/products
+admin/session
+admin/products/database.asc
+admin/products/directive.asc
+admin/products/locale.asc
+admin/products/products.asc
+admin/products/wizard.asc
diff --git a/dist/flycat.cfg b/dist/flycat.cfg
new file mode 100644 (file)
index 0000000..44596c8
--- /dev/null
@@ -0,0 +1,182 @@
+GlobalSub <<EOF
+sub flycat {
+       use Vend::FlyCat;
+       return undef if $Vend::InternalHTTP;
+       $Vend::Session->{return_value} = Vend::FlyCat::check_items(@_) || undef;
+}
+EOF
+
+
+UserTag  dv  Order field
+UserTag  dv  PosNumber 1
+UserTag  dv  Routine <<EOR
+sub {
+       my $field = shift;
+       if($field =~ /^\s*[\[_]/) {
+               $field = Vend::Interpolate::interpolate_html($field);
+       }
+       $field =~ s/\s+//g;
+       return Vend::Data::database_field(
+               'vendor',
+               $Vend::Cfg->{Variable}{STORE_ID},
+               $field,
+               );
+}
+EOR
+
+UserTag  if-dv  Order field
+UserTag  if-dv  PosNumber 1
+UserTag  if-dv  HasEndTag 1
+UserTag  if-dv  Routine <<EOR
+sub {
+       my ($field, $stuff) = @_;
+       my $reverse = 0;
+       $field =~ s/^\s*!\s*// and $reverse = 1;
+       if($field =~ /^\s*[[_]/) {
+               $field = Vend::Interpolate::interpolate_html($field);
+       }
+       $field =~ s/\s+//g;
+       Vend::Data::database_field(
+               'vendor',
+               $Vend::Cfg->{Variable}{STORE_ID},
+               $field,
+               )
+       and
+       return Vend::Interpolate::pull_if($stuff, $reverse);
+       return Vend::Interpolate::pull_else($stuff, $reverse);
+}
+EOR
+
+UserTag  ups-query  Order  mode origin zip weight country
+UserTag  ups-query  Routine <<EOR
+sub {
+       my( $mode, $origin, $zip, $weight, $country) = @_;
+       BEGIN {
+               eval {
+                       require Business::UPS;
+                       import Business::UPS;
+               };
+       };
+       $country = uc $country;
+       $country = undef if $country eq 'US';
+#::logGlobal("calling with: " . join("|", $mode, $origin, $zip, $weight, $country));
+       my ($shipping, $zone, $error) =
+               getUPS( $mode, $origin, $zip, $weight, $country);
+#::logGlobal("received back: " . join("|", $shipping, $zone, $error));
+       if($error) {
+               $Vend::Session->{ship_message} .= " $mode: $error";
+               return 0;
+       }
+       return $shipping;
+}
+EOR
+
+UserTag raw_subtotal Order noformat
+UserTag raw_subtotal Routine <<EOF
+sub {
+       my $noformat = shift;
+       my $save_entire = delete $Vend::Session->{discount}{ENTIRE_ORDER};
+       my $save_all    = delete $Vend::Session->{discount}{ALL_ITEMS};
+       my $sub = Vend::Interpolate::subtotal();
+       $Vend::Session->{discount}{ENTIRE_ORDER} = $save_entire
+               if $save_entire;
+       $Vend::Session->{discount}{ALL_ITEMS} = $save_all
+               if $save_all;
+       return $noformat ? $sub : Vend::Util::currency($sub);
+}
+EOF
+
+UserTag fcounter Order file
+UserTag fcounter Routine <<EOF
+sub {
+    my $file = shift || 'etc/counter';
+    $file = $Vend::Cfg->{VendRoot} . "/$file"
+        unless index($file, '/') == 0;
+    my $ctr = new File::CounterFile $file;
+    return $ctr->inc();
+}
+EOF
+
+UserTag mkdir Order dir
+UserTag mkdir Routine <<EOR
+sub {
+       my $dir = shift;
+       
+    my $mask  = $Vend::Cfg->{FileCreationMask};
+    my $xmask = $mask >> 2;
+    $xmask &= 0111;
+    $mask = $mask | $xmask;
+
+    if (mkdir $dir, $mask) {
+               return "$dir created.";
+       }
+       else {
+               return "$dir creation failed: $!";
+       }
+}
+EOR
+
+UserTag tabbed Interpolate 1
+UserTag tabbed HasEndTag   1
+UserTag tabbed Order fields
+UserTag tabbed Routine <<EOR
+sub {
+       my ($fields, $text) = @_;
+       $text =~ s/^\s+//;
+       $text =~ s/\s+$//;
+       my @fields;
+       @fields = split /\r?\n/, $text;
+       if($fields) {
+               while (scalar @fields < $fields) {
+                       push @fields, '';
+               }
+       }
+       return join "\t", @fields;
+}
+EOR
+
+UserTag fly-tax PosNumber 1
+UserTag fly-tax Order area
+UserTag fly-tax AttrAlias area state
+UserTag fly-tax Routine <<EOR
+sub {
+       my ($area) = @_;
+       if(! $area) {
+               my $zone = $Vend::Cfg->{SalesTax};
+               while($zone =~ m/(\w+)/g) {
+                       last if $area = $::Values->{$zone};
+               }
+       }
+       return 0 unless $area;
+       my $rates = $Vend::Cfg->{Variable}{TAXRATE} || 
+                               Vend::Data::database_field(
+                                       'vendor',
+                                       $Vend::Cfg->{Variable}{STORE_ID},
+                                       'tax_rates',
+                                       );
+       my $taxable = $Vend::Cfg->{Variable}{TAXSHIPPING} || 
+                                       Vend::Data::database_field(
+                                       'vendor',
+                                       $Vend::Cfg->{Variable}{STORE_ID},
+                                       'tax_shipping',
+                                       );
+       $rates =~ s/^\s+//;
+       $rates =~ s/\s+$//;
+       $area =~ s/^\s+//;
+       $area =~ s/\s+$//;
+       my (@rates) = split /\s*,\s*/, $rates;
+       my $rate;
+       for(@rates) {
+               my ($k,$v) = split /\s*=\s*/, $_, 2;
+               next unless "\U$k" eq "\U$area";
+               $rate = $v;
+               $rate = $rate / 100 if $rate > 1;
+               last;
+       }
+       return 0 unless $rate;
+       my $amount = Vend::Interpolate::taxable_amount();
+       $amount   += Vend::Interpolate::shipping()
+               if $taxable =~ m{(^|[\s,])$area([\s,]|$)}i;
+       return $amount * $rate;
+}
+EOR
diff --git a/dist/flycat/README.flycat b/dist/flycat/README.flycat
new file mode 100644 (file)
index 0000000..e92216a
--- /dev/null
@@ -0,0 +1,117 @@
+# MiniVend V3.12
+# 
+# Copyright 1996-1998 by Michael J. Heins <mikeh@minivend.com>
+#
+# This program is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later
+# version. 
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
+# USA.
+
+                        F L Y C A T   D E M O
+                                       
+   The flycat demo is designed as a ready-to-run non-database based
+   shopping cart. See the file flycat/html/index.html for examples
+   of how you can create item order buttons.
+
+    Flycat Features
+
+        * Up to thousands of individual vendors
+        * Items are created "on the fly" -- no pre-existing product
+          database is used.
+        * SSL support means secure and practical credit card ordering
+        * PGP support for secure off-site mailing of orders
+        * Vendors can be added by HTML form
+
+    Flexible Ordering Process
+
+        * Shipping calculation, mixed modes, with UPS table lookup
+        * Sales tax calculation only for certain states
+        * PGP encryption of credit card information or
+          the entire emailed order
+        * Fully-configurable item options and price adjustments
+        * Sophisticated back end order entry capability including CyberCash(R)
+        * Customers can create an account with address books and order tracking
+        * Automated UPS lookup (with Perl LWP library installed)
+        * Per-item shipping cost supported
+        * Per-item handling cost supported
+
+    Easy Administration
+
+        * Vendors can edit their own configuration
+        * Individual order databases and order tracking by vendor
+
+
+-------------------------------------------------------------------
+
+                      I N S T A L L A T I O N
+
+PRELIMINARY
+------------
+
+1.  Install MiniVend and a catalog based on "flycat" using the
+    normal installation procedure.
+
+2.  Run the sample order page and log on as user "flycat"
+    with password "pass".
+
+3.  Change your password! This is the master user who can
+    create new vendors.
+
+ADDING A VENDOR
+---------------
+
+1.  In your browser, log out as user "flycat" and create
+    a new account in the shopping cart. Remember the vendor
+    ID you made, and the user ID and password you select;
+    for our examples they will be:
+
+        User ID:   V1001
+        Password:  passme
+
+2.  Add the entry using your browser and the URL:
+
+            http://__MVC_SERVERNAME____MVC_CGIURL__/cartcfg/newcart
+
+    You might use the user id (V1001 in our example) for the vendor
+    code, or a mnemonic name if you wish. Just make sure it has
+    nothing except letters and numbers in it.
+
+    There is online help for the individual fields to enter.
+
+3.  If the automated directory make fails due to lack of permission,
+    you must create an order directory *which the minivend daemon must
+       have write permission on*. Using telnet or whatever means you
+       wish, create the order directory for the user. This directory
+       will contain copies of all orders, their transaction database,
+       and their order number counter.
+
+4.  Once steps 2 and 3 are done the store is ready to run.
+
+
+ENABLING AN EXISTING VENDOR TO EDIT THEIR OWN CONFIGURATION:
+
+1.  Still in your browser, log out as user "flycat" and create
+    a new account in the shopping cart. Remember the vendor
+    ID you made, and the user ID and password you select;
+    for our examples they will be:
+
+        Vendor ID: V1001
+        User ID:   V1001
+        Password:  passme
+
+2.  Access the URL:
+
+        http://__MVC_SERVERNAME____MVC_CGIURL__/cartcfg/enable_edit
+
+    Enter V1001 in both fields and click the submit button.
diff --git a/dist/flycat/catalog.cfg b/dist/flycat/catalog.cfg
new file mode 100644 (file)
index 0000000..526db45
--- /dev/null
@@ -0,0 +1,103 @@
+# Define the site-specific information
+#
+
+Variable    SERVER_NAME   __MVC_SERVERNAME__
+Variable    SECURE_SERVER http://__MVC_SERVERNAME__
+Variable    CGI_URL       __MVC_CGIURL__
+Variable    ORDERS_TO     __MVC_MAILORDERTO__
+Variable    IMAGE_DIR     __MVC_IMAGEURL__
+Variable    ENCRYPTOR     __MVC_ENCRYPTOR__
+
+## END SITE CONFIGURATION
+
+Variable   MV_USERDB_ACL_TABLE  userdb
+Variable   MV_USERDB_ACL_COLUMN acl
+
+ParseVariables      Yes
+MailOrderTo         __ORDERS_TO__
+VendURL             http://__SERVER_NAME____CGI_URL__
+SecureURL           __SECURE_SERVER____CGI_URL__
+AutoLoad             flycat
+Database             products     products.txt     TAB
+Database             products     MEMORY           1
+Database             vendor       vendor.txt       TAB
+Database             transactions transactions.txt TAB
+Database             userdb       userdb.asc       TAB
+Database             country      country.asc      TAB
+Database             locale       locale.asc       TAB
+AlwaysSecure         ord/checkout
+AsciiTrack           etc/tracking.asc
+BackendOrder name,company,address,city,state,zip,country,account,mv_shipmode
+ButtonBars           buttonbar
+CheckoutPage         ord/basket
+ClearCache  Yes
+CreditCardAuto       No
+CustomShipping       Yes
+DefaultShipping      GNDCOM
+EncryptProgram        __ENCRYPTOR__
+Help                 hintfile
+ImageDir             __IMAGE_DIR__/
+ImageDirInternal     http://__SERVER_NAME____IMAGE_DIR__/
+LocaleDatabase       locale
+Mv_BgColor           BEGIN #FFFFFF
+Mv_LinkColor         BEGIN none
+Mv_TextColor         BEGIN none
+Mv_VlinkColor        BEGIN none
+Mv_AlinkColor        BEGIN none
+NewEscape            Yes
+NewTags              Yes
+OrderCounter         etc/order.number
+OrderReport          etc/report
+Password             bAWoVkuzphOX.
+ReadPermission       group
+ReceiptPage          ../etc/receipt
+RequiredFields       name
+RobotLimit           50
+OrderLineLimit       20
+SalesTax             state
+ScratchDir           tmp
+SpecialPage          badsearch      special/badsearch
+SpecialPage          canceled       special/canceled
+SpecialPage          catalog        ord/basket
+SpecialPage          checkout       ord/checkout
+SpecialPage          confirmation   special/confirmation
+SpecialPage          failed         special/failed
+SpecialPage          interact       special/interact
+SpecialPage          missing        special/missing
+SpecialPage          needfield      special/needfield
+SpecialPage          nomatch        special/nomatch
+SpecialPage          noproduct      special/noproduct
+SpecialPage          notfound       special/notfound
+SpecialPage          order          ord/basket
+SpecialPage          search         results
+SpecialPage          order_security special/order_security
+SpecialPage          violation      special/violation
+TaxShipping          UT,NV
+UseModifier          size color option
+WideOpen             Yes
+WritePermission      group
+
+UserTag quick_table HasEndTag
+UserTag quick_table Interpolate
+UserTag quick_table Order   border
+UserTag quick_table Routine <<EOR
+sub {
+       my ($border,$input) = @_;
+       $border = " BORDER=$border" if $border;
+       my $out = "<TABLE ALIGN=LEFT$border>";
+       my @rows = split /\n+/, $input;
+       my ($left, $right);
+       for(@rows) {
+               $out .= '<TR><TD ALIGN=RIGHT VALIGN=TOP>';
+               ($left, $right) = split /\s*:\s+/, $_, 2;
+               $out .= '<B>' unless $left =~ /</;
+               $out .= $left;
+               $out .= '</B>' unless $left =~ /</;
+               $out .= '</TD><TD VALIGN=TOP>';
+               $out .= $right;
+               $out .= '</TD></TR>';
+               $out .= "\n";
+       }
+       $out .= '</TABLE>';
+}
+EOR
diff --git a/dist/flycat/config/additional_fields b/dist/flycat/config/additional_fields
new file mode 100644 (file)
index 0000000..a0c1ad2
--- /dev/null
@@ -0,0 +1,51 @@
+COMPANY
+Your company name
+The Art Store
+
+ADDRESS
+Your company address
+123 Any St.
+
+CITY
+Your company city/state/zip
+Anytown, USA 00000
+
+PHONE
+Your company phone
+(555) 555-5555
+
+FAX
+Your company fax number
+(555) 555-5556
+
+TOLLFREE
+Your company tollfree number (if any)
+(888) 555-5555
+
+LOGO
+URL to your large logo image
+artstore.gif
+
+SMLOGO
+URL to your small logo image
+artsmall.gif
+
+TAXAREA
+Area(s) to tax in
+OH IL
+
+TAXRATE
+Percentage rate(s) for tax in different areas
+OH=6, IL=7.25
+
+TAXSHIPPING
+Areas(s) that tax shipping
+OH
+
+ORIGINZIP
+Origin zip code for auto UPS lookup
+45056
+
+UPSADDER
+Amount to add on to standard UPS costs
+3.00
diff --git a/dist/flycat/etc/order.number b/dist/flycat/etc/order.number
new file mode 100644 (file)
index 0000000..8375cce
--- /dev/null
@@ -0,0 +1,2 @@
+#COUNTER-1.0
+000000000
diff --git a/dist/flycat/etc/receipt.html b/dist/flycat/etc/receipt.html
new file mode 100644 (file)
index 0000000..f18a50d
--- /dev/null
@@ -0,0 +1,210 @@
+<HTML><HEAD><TITLE>[dv company] -- Receipt</TITLE>
+</HEAD>
+<BODY [dv body]>
+[if-dv smlogo]
+<A HREF="[dv url]"><IMG SRC="[dv smlogo]" ALT="[dv company] Logo" BORDER=0></A>
+[/if-dv]
+<FONT SIZE="-1">
+<IMG VSPACE=5 HSPACE=50 SRC="bg.gif"><B>[dv company]</B><BR>
+<IMG VSPACE=5 HSPACE=50 SRC="bg.gif">[dv address]<BR>
+<IMG VSPACE=5 HSPACE=50 SRC="bg.gif">[dv city]
+<P><B>
+[if-dv tollfree]
+<IMG VSPACE=5 HSPACE=50 SRC="bg.gif">Toll Free [dv tollfree]<BR>[/if-dv]
+<IMG VSPACE=5 HSPACE=50 SRC="bg.gif">Phone [dv phone]</B><BR>
+[if-dv fax]
+<IMG VSPACE=5 HSPACE=50 SRC="bg.gif">FAX [dv fax][/if-dv]
+</FONT>
+
+<CENTER><H2>Receipt</H2>
+<P>
+<H2>SOLD TO:</H2>
+</CENTER>
+
+<PRE>
+    ORDER NUMBER: [scratch mv_order_number]
+            Name: [value name]
+[if value company]         Company: [value company][/if]
+   Email address: [value email]
+
+         Address: [value address]
+City, State, Zip: [value city], [value state]  [value zip]
+         Country: [value country]
+
+  Payment Method: [value mv_payment]
+ Shipping Method: [shipping_desc]
+
+   Daytime Phone: [value phone_day]
+   Evening Phone: [value phone_night]
+
+[if value s_address]
+   Shipping Name: [value s_name]
+Shipping Address: [value s_address]
+City, State, Zip: [value s_city][if value s_state], [value s_state]  [value s_zip][/if]
+[if value s_country]Shipping Country: [value s_country][/if]
+[/if]
+
+Quan  Item No.    Description                             Price        Extension
+---- ----------- -------------------------------- -------------- ---------------- 
+[item-list][row 82]
+[column width=5             gutter=1 align=right]  [item-quantity] [/column]
+[column width=12            gutter=1]  [item-code] [/column]
+[column width=32 align=left gutter=1 wrap=1]
+[item-description]
+[if-modifier size]SIZE-->[item-modifier size][/if-modifier][if-modifier color] COLOR-->[item-modifier color][/if-modifier]
+[/column]
+[column width=15 align=right gutter=1][item-price][/column]
+[column width=16 align=right gutter=0][item-subtotal][/column]
+[/row]
+
+[/item-list]
+[row 82]
+[column width=5  align=right][/column]
+[column width=12             gutter=1][/column]
+[column width=32 align=right gutter=1 wrap=1][/column]
+[column width=15             gutter=1]SUBTOTAL[/column]
+[column width=16 align=right gutter=0][subtotal][/column]
+[/row]
+[row 82]
+[column width=5      align=right][/column]
+[column width=12                 gutter=1][/column]
+[column width=32     align=right gutter=1 wrap=1][/column]
+[column width=15                 gutter=1]SALES TAX[/column]
+[column width=16     align=right gutter=0][salestax][/column]
+[/row]
+[row 82]
+       [column width=5  align=right][/column]
+       [column width=12             gutter=1][/column]
+       [column width=32 align=right gutter=1 wrap=1][/column]
+       [column width=15             gutter=1]SHIPPING[/column]
+       [column width=16 align=right gutter=0][shipping][/column]
+[/row]
+
+[row 82]
+[column width=5  align=right][/column]
+[column width=12             gutter=1][/column]
+[column width=32 align=right gutter=1 wrap=1][/column]
+[column width=15             gutter=1]ORDER TOTAL[/column]
+[column width=16 align=right gutter=0][total-cost][/column]
+[/row]
+
+</PRE>
+
+[if value gift_note]
+<B>Note for Gift:</B><BR>
+<PRE>
+[value gift_note]
+</PRE>
+[/if]
+<P>
+
+<CENTER>
+<I>(Please print this receipt for your records. Thank you for your order!)</I>
+<P>
+<A HREF="[dv url]">Return to [dv site_name]</A>
+</CENTER>
+</body> </html>
+[if value email_copy]
+[set name=email_copy_sent interpolate=1][perl arg=sub interpolate=1]
+       form_mail(
+            q{[value email]},
+            q{Thank you for your order [scratch mv_order_number]!},
+            q{[dv site_name] Customer Service <[dv email_info]>},
+            <<'EndOfMail')
+
+Dear [dv site_name] customer,
+
+Thank you for your order #[scratch mv_order_number], it is being electronically
+processed.
+
+            Name: [value name]
+[if value company]         Company: [value company][/if]
+   Email address: [value email]
+
+         Address: [value address]
+City, State, Zip: [value city], [value state]  [value zip]
+         Country: [value country]
+
+  Payment Method: [value mv_payment]
+ Shipping Method: [shipping_desc]
+
+   Daytime Phone: [value phone_day]
+   Evening Phone: [value phone_night]
+
+[if value s_address]
+   Shipping Name: [value s_name]
+Shipping Address: [value s_address]
+City, State, Zip: [value s_city][if value s_state], [value s_state]  [value s_zip][/if]
+[if value s_country]Shipping Country: [value s_country][/if]
+[/if]
+
+Quan  Item No.    Description                            Price       Extension
+---- ----------- ------------------------------- -------------- ---------------- 
+[item-list][row 82]
+[column width=5 gutter=1 align=right]  [item-quantity] [/column]
+[column width=12 gutter=1]  [item-code] [/column]
+[column width=32 gutter=1 align=left wrap=1]
+[item-description]
+[if-modifier size]SIZE-->[item-modifier size][/if-modifier][if-modifier color] COLOR-->[item-modifier color][/if-modifier]
+[/column]
+[column width=15 gutter=1 align=r]  [item-price] [/column]
+[column width=16 gutter=0 align=r] [item-subtotal] [/column]
+[/row]
+
+[/item-list]
+[row 82]
+[column width=5 align=right][/column]
+[column width=12 gutter=1][/column]
+[column width=32 align=R wrap=1][/column]
+[column width=15 gutter=1]SUBTOTAL[/column]
+[column width=16 gutter=0 align=r][subtotal][/column]
+[/row]
+[row 82]
+[column width=5 align=right][/column]
+[column width=12 gutter=1][/column]
+[column width=32 align=R wrap=1][/column]
+[column width=15 gutter=1]SALES TAX[/column]
+[column width=16 align=right gutter=0][salestax][/column]
+[/row]
+[row 82]
+       [column width=5 align=right][/column]
+       [column width=12 gutter=1][/column]
+       [column width=32 align=R wrap=1][/column]
+       [column width=15 gutter=1]SHIPPING[/column]
+       [column width=16 align=right gutter=0][shipping][/column]
+[/row]
+
+[row 82]
+[column width=5 align=right][/column]
+[column width=12 gutter=1][/column]
+[column width=32 align=R wrap=1][/column]
+[column width=15 gutter=1]ORDER TOTAL[/column]
+[column width=16 align = right gutter=0][total-cost][/column]
+[/row]
+
+[if value gift_note]
+Note for Gift
+--------------
+[value gift_note]
+[/if]
+  
+Should you have a question about your order, or about other [dv company]
+products, please reply to this message and let us help.
+
+Always reference your Order Number when calling for a status.
+
+Remember, you can always visit our site at:
+
+       [dv url]
+
+Regards and thanks for your business!
+
+[dv company]
+[dv address]
+[dv city]
+[dv phone]
+[dv tollfree]
+[if-dv fax]FAX: [dv fax][/if-dv]
+
+EndOfMail
+[/perl][/set][/if]
diff --git a/dist/flycat/etc/report b/dist/flycat/etc/report
new file mode 100644 (file)
index 0000000..4937f10
--- /dev/null
@@ -0,0 +1,147 @@
+[set name=mv_order_number interpolate=1][fcounter file="[dv order_dir]/order.number"][/set][tag flag write]transactions userdb[/tag][set name=import_results interpolate=1]
+[if session logged_in]
+[data
+       table=userdb
+       column=acl
+       key="[data session username]"
+       value="query/check_orders"
+       ]
+[data
+       table=userdb
+       column=order_numbers
+       key="[data session username]"
+       value=" [value mv_order_number]"
+       append=1]
+[/if]
+[set name=order_log interpolate=1][tabbed]
+[value mv_order_number]
+__STORE_ID__
+[scratch mv_order_number]
+[data session id]
+[data session username]
+[shipping-desc] - [shipping]
+[nitems]
+[subtotal noformat=1]
+[value mv_payment] Tax: [salestax]
+[value city]
+[value state]
+[value zip]
+[value name=order_date set="[tag time]%d-%b-%Y[/tag]"]
+pending
+__PARENT__[/tabbed]
+[item-list][tabbed]
+[value mv_order_number]-[item-increment]
+__STORE_ID__
+[scratch mv_order_number]
+[data session id]
+[data session username]
+[item-code]
+[item-quantity]
+[item-price noformat]
+[item-description]
+[item-modifier size]
+[item-modifier color]
+[item-modifier options]
+[value order_date]
+__PARENT__[/tabbed]
+[/item-list][/set]
+[tag op=import base="transactions"][scratch order_log][/tag]
+[tag op=log    file="products/transactions.raw"][scratch order_log][/tag]
+[tag op=log    file="[dv order_dir]/transactions.txt"][scratch order_log][/tag]
+
+[/set][set name=order_text interpolate=1]
+-     ORDER DATE: [calc]localtime[/calc]
+    ORDER NUMBER: [scratch mv_order_number]
+     LEAD SOURCE: [data session source]
+   REFERRING URL: [data session referer]
+
+            Name: [value name]
+[if value company]         Company: [value company][/if]
+   Email address: [value email]
+
+         Address: [value address]
+City, State, Zip: [value city], [value state]  [value zip]
+         Country: [value country]
+[if value mv_credit_card_info]         
+Credit Card Info:
+[value mv_credit_card_info]
+[else]
+  Payment Method: [value mv_payment]
+[/else][/if]
+ Shipping Method: [shipping_desc]
+
+   Daytime Phone: [value phone_day]
+   Evening Phone: [value phone_night]
+
+[if value s_address]
+   Shipping Name: [value s_name]
+Shipping Address: [value s_address]
+City, State, Zip: [value s_city][/if][if value s_state], [value s_state]  [value s_zip][/if]
+[if value s_country]Shipping Country: [value s_country][/if]
+
+
+Quan  Item No.    Description                            Price       Extension
+---- ----------- -------------------------------- ------------- --------------- 
+[item-list][row 82]
+[column width=5             gutter=1 align=right]  [item-quantity] [/column]
+[column width=12            gutter=1]  [item-code] [/column]
+[column width=32 align=left gutter=1 wrap=1]
+[item-description]
+[if-modifier size]SIZE-->[item-modifier size][/if-modifier][if-modifier color] COLOR-->[item-modifier color][/if-modifier]
+[/column]
+[column width=14 align=right gutter=1][item-price][/column]
+[column width=15 align=right gutter=0][item-subtotal][/column]
+[/row]
+
+[/item-list]
+[row 82]
+[column width=5  align=right][/column]
+[column width=12             gutter=1][/column]
+[column width=32 align=right gutter=1 wrap=1][/column]
+[column width=14             gutter=1]SUBTOTAL[/column]
+[column width=15 align=right gutter=0][subtotal][/column]
+[/row]
+[row 82]
+[column width=5      align=right][/column]
+[column width=12                 gutter=1][/column]
+[column width=32     align=right gutter=1 wrap=1][/column]
+[column width=14                 gutter=1]SALES TAX[/column]
+[column width=15     align=right gutter=0][salestax][/column]
+[/row]
+[row 82]
+       [column width=5  align=right][/column]
+       [column width=12             gutter=1][/column]
+       [column width=32 align=right gutter=1 wrap=1][/column]
+       [column width=14             gutter=1]SHIPPING[/column]
+       [column width=15 align=right gutter=0][shipping][/column]
+[/row]
+
+[row 82]
+[column width=5  align=right][/column]
+[column width=12             gutter=1][/column]
+[column width=32 align=right gutter=1 wrap=1][/column]
+[column width=14             gutter=1]ORDER TOTAL[/column]
+[column width=15 align=right gutter=0][total-cost][/column]
+[/row]
+
+[if value gift_note]
+Gift Note or Special Instructions:
+---------------------------------------------------
+[value gift_note]
+[/if]
+[/set]
+[tag mime type TEXT/PLAIN; CHARSET=US-ASCII][/tag]
+[tag op=mime type="Order Text" interpolate=1]
+[scratch order_text]
+[/tag]
+
+[tag op=log file="[dv order_dir]/[scratch mv_order_number]" interpolate=1]
+[scratch order_text]
+[/tag]
+
+[if value mv_credit_card_info]
+[tag mime type application/pgp-encrypted][/tag]
+[tag op=mime type="CreditCard_[scratch mv_order_number]"]
+[value mv_credit_card_info]
+[/tag]
+[/if]
diff --git a/dist/flycat/etc/session.lock b/dist/flycat/etc/session.lock
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/dist/flycat/etc/vendor.number b/dist/flycat/etc/vendor.number
new file mode 100644 (file)
index 0000000..5136a17
--- /dev/null
@@ -0,0 +1,2 @@
+#COUNTER-1.0
+V1000
diff --git a/dist/flycat/html/index.html b/dist/flycat/html/index.html
new file mode 100644 (file)
index 0000000..354d144
--- /dev/null
@@ -0,0 +1,139 @@
+<html>
+
+<head>
+<title>MiniVend FlyCart Demo</title>
+</head>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
+       
+<P ALIGN=CENTER><IMG SRC="__MVC_IMAGEURL__/__MVC_LOGO__" ALT="__MVC_COMPANY__">
+
+<HR NOSHADE>
+<!--begin example-->
+<FORM ACTION="__MVC_CGIURL__/process" METHOD="POST">
+<B><IMG SRC="__MVC_IMAGEURL__/00-0011.jpg">
+       <INPUT TYPE=hidden NAME=sku VALUE="test">
+       <INPUT TYPE=hidden NAME=sku VALUE="00-0011">
+       <INPUT TYPE=hidden NAME=sku VALUE="The Mona Lisa">
+       <INPUT TYPE=hidden NAME=sku VALUE="mod1">
+       <INPUT TYPE=hidden NAME=sku VALUE="1">
+       <INPUT TYPE=hidden NAME=sku VALUE="2.00">
+       <INPUT TYPE=hidden NAME=sku VALUE=".35">
+       <INPUT TYPE=hidden NAME=sku VALUE="ea.">
+       <INPUT TYPE=hidden NAME=sku VALUE="12">
+       <INPUT TYPE=hidden NAME=sku VALUE="__MVC_IMAGEURL__/00-0011.jpg">
+
+<!--
+       When you change the "sku" variable, be sure to keep the field order: 
+
+               1 - Vendor ID, always the same
+               2 - Item sku/Part Number
+               3 - Description
+               4 - Price (may be mod1-16 for option pricing)
+               5 - Quantity
+               6 - Per item shipping (if any)
+               7 - Handling fee (if any)
+               8 - Unit of measure (if any)
+               9 - Shipping weight (if any)
+               10- URL to see product details (if any)
+
+       If you leave a field blank, don't remove it, set it to blank. Otherwise
+       we can't tell the order of the fields.
+
+       Tip: The ^ character is an alternate field separator.
+       This would be the same as above:
+
+       VALUE="test^99-102^The Mona Lisa^mod1^1^2.00^.35^ea. ^1.2^__MVC_IMAGEURL__/staircase.jpg"
+
+-->
+       <DIV ALIGN=CENTER><CENTER><TABLE BORDER=1>
+        <TR>
+            <TD><B>00-0011</B></TD>
+            <TD><B>Mona Lisa</B></TD>
+            <TD><B><SELECT NAME=mod1 SIZE=1>
+                <OPTION VALUE="=error= You must select a reproduction type for this painting.">Select Quality
+                <OPTION VALUE="original - $50000000.00">Original - $50,000,000.00
+                <OPTION VALUE="litho - $1000.00">Lithograph - $1,000.00
+                <OPTION VALUE="poster - $10.00">Poster - $10.00
+                       </SELECT>
+                       </B>
+                       </TD>
+            <TD><B><INPUT TYPE=image NAME=add SRC="__MVC_IMAGEURL__/ordernow.gif" ALIGN=center BORDER="0"> </b></td>
+        </TR>
+    </TABLE></CENTER></DIV>
+</FORM>
+<P ALIGN="center"><FONT SIZE="2"><B>
+
+Item with a variable price option. The hidden variable "sku" contains the
+keyword "mod1" instead of a price. This tells the cart to parse the selection
+named "mod1" to obtain the item price. Notice that the select box has a quality
+and price separated by a space dash space. You must use this format to insure
+correct parsing. Up to 16 options mod1 - mod16 can be used to price an item.
+
+       </B></FONT><B><BR>
+    <BR CLEAR=ALL>
+    </B></P>
+    <HR>
+    <B></B>
+       <P>
+    <DIV ALIGN=CENTER><CENTER><TABLE BORDER=1>
+        <TR>
+            <TD><B>99-102</B></TD>
+            <TD><B>The Art Store T-Shirt</B></TD>
+            <TD><FORM ACTION="__MVC_CGIURL__/process" METHOD=POST>
+                <INPUT TYPE=HIDDEN NAME=sku VALUE="test^99-102^The Art Store T-Shirt^mod1mod2mod3^1^2.00^.35^ea.^1^__MVC_IMAGEURL__/tshirt.gif"><P><B>
+                               <SELECT NAME=mod1 SIZE=1>
+                    <OPTION VALUE="=error= You must select a size for the shirt.">Select Size</option>
+                    <OPTION VALUE="LG - $10.00">Large - $10.00</option>
+                    <OPTION VALUE="MD - $10.00">Medium - $10.00</option>
+                    <OPTION VALUE="SM - $9.00">Small - $9.00</option>
+                    <OPTION VALUE="XL - $11.00">Extra Large - $11.00</option>
+                </SELECT>
+                               <SELECT NAME=mod2>
+                    <OPTION VALUE="=error= You must select a color for the shirt.">Select Color</option>
+                    <OPTION VALUE="white - 0.00">White</option>
+                    <OPTION VALUE="black - 0.00">Black</option>
+                    <OPTION VALUE="red - $0.50">Red - $0.50 extra</option>
+                    <OPTION VALUE="blue - $1.00">Blue - $1.00 extra</option>
+                </SELECT>
+                               </B>
+            </TD>
+            <TD><B>
+            <B><INPUT TYPE=checkbox NAME=mod3 VALUE="PREWASH - $2.00"></B><FONT SIZE=2><b>Pre-washed<br>
+            (add $2.00)</B></FONT></TD>
+            <TD><B><INPUT TYPE=IMAGE NAME=add src="__MVC_IMAGEURL__/ordernow.gif" ALIGN=CENTER border="0"> </B></TD>
+            </FORM>
+        </TR>
+    </TABLE>
+<P>
+Item with a multiple price options. The first one sets the base price, and
+additional options add to the price.
+
+    </center></div><BR CLEAR=left>
+    <HR>
+
+Build your own item:<BR>
+<FORM ACTION="__MVC_CGIURL__/process" METHOD="POST">
+       <!-- Vendor --> <INPUT TYPE=hidden NAME=sku VALUE="test"><BR>
+<TABLE>
+       <TR> <TD> Part number</TD><TD><INPUT NAME=sku VALUE=""></TD></TR>
+       <TR> <TD> Description</TD><TD><INPUT NAME=sku VALUE=""></TD></TR>
+       <TR> <TD> Price</TD><TD><INPUT NAME=sku VALUE=""></TD></TR>
+       <TR> <TD> Quantity</TD><TD><INPUT NAME=sku VALUE=""></TD></TR>
+       <TR> <TD> Per item ship</TD><TD><INPUT NAME=sku VALUE=""></TD></TR>
+       <TR> <TD> Handling</TD><TD><INPUT NAME=sku VALUE=""></TD></TR>
+       <TR> <TD> Unit of Measure</TD><TD><INPUT NAME=sku VALUE=""></TD></TR>
+       <TR> <TD> Shipping Weight</TD><TD><INPUT NAME=sku VALUE=""></TD></TR>
+       <TR> <TD> URL to page</TD><TD><INPUT NAME=sku VALUE=""></TD></TR>
+       <TR> <TD> Option1</TD><TD><INPUT NAME=mod1  VALUE=""></TD></TR>
+       <TR> <TD> Option2</TD><TD><INPUT NAME=mod2  VALUE=""></TD></TR>
+       <TR> <TD> Option3</TD><TD><INPUT NAME=mod3  VALUE=""></TD></TR>
+       <TR><TD COLSPAN=2><INPUT TYPE=submit VALUE=Add></TR></TR>
+</TABLE>
+</FORM>
+
+
+<hr size="3" noshade>
+
+</body>
+</html>
diff --git a/dist/flycat/images/00-0011.jpg b/dist/flycat/images/00-0011.jpg
new file mode 100644 (file)
index 0000000..aec5ecb
Binary files /dev/null and b/dist/flycat/images/00-0011.jpg differ
diff --git a/dist/flycat/images/artsmall.gif b/dist/flycat/images/artsmall.gif
new file mode 100644 (file)
index 0000000..004f19d
Binary files /dev/null and b/dist/flycat/images/artsmall.gif differ
diff --git a/dist/flycat/images/artstore.gif b/dist/flycat/images/artstore.gif
new file mode 100644 (file)
index 0000000..f0fa2db
Binary files /dev/null and b/dist/flycat/images/artstore.gif differ
diff --git a/dist/flycat/images/bg.gif b/dist/flycat/images/bg.gif
new file mode 100644 (file)
index 0000000..c29c7be
Binary files /dev/null and b/dist/flycat/images/bg.gif differ
diff --git a/dist/flycat/images/redball.gif b/dist/flycat/images/redball.gif
new file mode 100644 (file)
index 0000000..510fbc8
Binary files /dev/null and b/dist/flycat/images/redball.gif differ
diff --git a/dist/flycat/images/smallamex.gif b/dist/flycat/images/smallamex.gif
new file mode 100644 (file)
index 0000000..e671231
Binary files /dev/null and b/dist/flycat/images/smallamex.gif differ
diff --git a/dist/flycat/images/smalldisc.gif b/dist/flycat/images/smalldisc.gif
new file mode 100644 (file)
index 0000000..8b6bd4c
Binary files /dev/null and b/dist/flycat/images/smalldisc.gif differ
diff --git a/dist/flycat/images/smallmc.gif b/dist/flycat/images/smallmc.gif
new file mode 100644 (file)
index 0000000..f04d4fd
Binary files /dev/null and b/dist/flycat/images/smallmc.gif differ
diff --git a/dist/flycat/images/smallvisa.gif b/dist/flycat/images/smallvisa.gif
new file mode 100644 (file)
index 0000000..d840ba3
Binary files /dev/null and b/dist/flycat/images/smallvisa.gif differ
diff --git a/dist/flycat/images/tshirt.jpg b/dist/flycat/images/tshirt.jpg
new file mode 100644 (file)
index 0000000..a1a13cc
Binary files /dev/null and b/dist/flycat/images/tshirt.jpg differ
diff --git a/dist/flycat/orders/test/order.number b/dist/flycat/orders/test/order.number
new file mode 100644 (file)
index 0000000..37ad54e
--- /dev/null
@@ -0,0 +1,2 @@
+#COUNTER-1.0
+F000000
diff --git a/dist/flycat/pages/canceled.html b/dist/flycat/pages/canceled.html
new file mode 100644 (file)
index 0000000..a595d53
--- /dev/null
@@ -0,0 +1,39 @@
+<HTML>
+<HEAD>
+<TITLE>Stop shopping</TITLE>
+</HEAD>
+
+<BODY [dv body]>
+<CENTER>
+<H1>Stop Shopping</H1>
+<FORM ACTION="[process-target]" METHOD="POST">
+<input type="hidden" name="mv_doit" value="refresh">
+<input type="hidden" name="mv_orderpage" value="catalog">
+<input type="hidden" name="mv_nextpage" value="catalog">
+
+If you click <STRONG>Remove Contents</STRONG>, only the items
+you have placed in your basket will be removed.
+
+<P>
+If you click <STRONG>Erase All Information</STRONG>, your
+name, address, and credit card information will be removed
+from our system. You will have to enter it again to buy anything.
+
+<P>
+If you wish to do neither, just use the buttonbar or your browser's
+<STRONG>Back</STRONG> function to return to shopping.
+
+[item-list]
+<input type=hidden name="[quantity-name]" value=0>
+[/item-list]
+
+<CENTER>
+<input type="submit" name="mv_submit" value="Remove Contents Only">
+<input type="submit" name="mv_todo" value="Erase All Information">
+</CENTER>
+</form>
+
+<P ALIGN=CENTER>
+
+[buttonbar 0]
+</body> </html>
diff --git a/dist/flycat/pages/cartcfg/.access b/dist/flycat/pages/cartcfg/.access
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/dist/flycat/pages/cartcfg/buttonbar b/dist/flycat/pages/cartcfg/buttonbar
new file mode 100644 (file)
index 0000000..aa091b2
--- /dev/null
@@ -0,0 +1,33 @@
+[set Log out]
+mv_todo=return
+mv_nextpage=ord/basket
+[userdb logout]
+[/set]
+[if session username eq 'flycat']
+<P>
+    <FORM ACTION="[process-target]" METHOD=POST>
+    Hello, master! You are logged in as user <B>[value mv_username]</B>.
+       <BR>
+       <TABLE><TR><TD><INPUT TYPE=submit NAME="mv_click" VALUE="Log out"></TD>
+               <TD>
+               <A HREF="[area cartcfg/newcart]">Add vendor</A><BR>
+               <A HREF="[area cartcfg/enable_edit]">Enable user edit</A><BR>
+               <A HREF="[area cartcfg/master_edit]">Edit vendor</A><BR>
+               <A HREF="[area cartcfg/export_userdb]">Export user database</A><BR>
+               <A HREF="[area cartcfg/export_vendor]">Export vendor/transactions</A><BR>
+               <A HREF="[area new_account]">Change your password</A><BR>
+               </TD></TR></TABLE>
+       </FORM>
+[elsif session logged_in]
+<P>
+    <FORM ACTION="[process-target]" METHOD=POST>
+    Hi [value name]! You are logged in as user <B>[value mv_username]</B>.
+       <BR>
+       <TABLE><TR><TD><INPUT TYPE=submit NAME="mv_click" VALUE="Log out"></TD>
+               <TD><A HREF="[area new_account]">Change your password</A><BR>
+               [if type=data term="userdb::db_acl::[data session username]"]
+               <A HREF="[area cartcfg/editcart]">Edit your vendor account</A><BR>[/if]
+               </TD></TR></TABLE>
+       </FORM>
+[/elsif]
+[/if]
diff --git a/dist/flycat/pages/cartcfg/editcart.html b/dist/flycat/pages/cartcfg/editcart.html
new file mode 100644 (file)
index 0000000..a567c26
--- /dev/null
@@ -0,0 +1,88 @@
+[tag flag write][vendor][/tag]
+<!-- vendor exported=[if value vendor_written][tag export vendor][/tag][/if] -->
+[value name=vendor_written set=""]
+[if type=data
+       term="vendor::email_order::[data 
+                                                                       table=userdb
+                                                                       field=db_acl
+                                                                       key='[data session username]']"]
+[set name=vendor_id interpolate=1][data table=userdb column=db_acl key='[data session username]'][/set]
+[else]
+[tag op=header int]
+Status: 302 Moved
+Location: [area special/violation]
+[/tag]
+[/else]
+[/if]
+<HTML>
+<HEAD>
+       <TITLE>
+       Edit Vendor: [scratch vendor_id]
+       </TITLE>
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+       <CENTER><H1>
+       Edit Vendor: [scratch vendor_id]
+       </H1></CENTER>
+[set cart_fields]company
+site_name
+email_order
+email_info
+address
+city
+country
+phone
+fax
+tollfree
+url
+logo
+smlogo
+body
+error_body
+header_textcolor
+header_bgcolor
+tax_based_on
+tax_area
+tax_rates
+tax_shipping
+us_shipmodes
+intl_shipmodes
+only_shipmodes
+order_dir
+origin_zip
+ups_adder
+pgp_key
+pgp_program
+encrypt_program
+cybercash
+cyber_mode
+cyber_host
+cyber_port
+cyber_secret
+cyber_version
+cyber_currency
+cyber_configfile
+[/set]
+
+[value name=mv_data_table set="vendor" hide=1]
+
+<FORM ACTION="[process-target]" METHOD=POST>
+<INPUT TYPE=hidden NAME=vendor_written      VALUE=1>
+<INPUT TYPE=hidden NAME=mv_data_table    VALUE=vendor>
+<INPUT TYPE=hidden NAME=mv_data_key      VALUE=code>
+<INPUT TYPE=hidden NAME=mv_data_function VALUE=update>
+<INPUT TYPE=hidden NAME=mv_todo          VALUE=set>
+<INPUT TYPE=hidden NAME=mv_nextpage      VALUE="cartcfg/editcart">
+<INPUT TYPE=hidden NAME=mv_data_fields   VALUE="[scratch newcart_fields]">
+<INPUT NAME=code VALUE="[scratch vendor_id]" TYPE=hidden>
+<TABLE BORDER=1>
+[quick-table]
+[loop arg="[scratch newcart_fields]"]<BR><B>[data vendor [loop-code] _label]</B><TD><A HREF="[area help [loop-code]]" onClick="window.open('','popup','height=300,width=400,scrollbars=yes')" TARGET=popup>?</A></TD>: <INPUT NAME="[loop-code]" SIZE=60 VALUE="[data table=vendor field='[loop-code]' key='[scratch vendor_id]'] ">
+[/loop][/quick-table]
+</TABLE>
+<BR CLEAR=LEFT>
+<CENTER><INPUT TYPE=submit VALUE="Make changes"></CENTER>
+</FORM>
+<P>
+[include pages/cartcfg/buttonbar]
+</BODY></HTML>
diff --git a/dist/flycat/pages/cartcfg/enable_edit.html b/dist/flycat/pages/cartcfg/enable_edit.html
new file mode 100644 (file)
index 0000000..12f5fce
--- /dev/null
@@ -0,0 +1,68 @@
+<HTML>
+<HEAD>
+[tag flag write]userdb[/tag]
+[if value userdb_written]
+<!-- vendordb exported=[tag export userdb][/tag] -->
+[value name=userdb_written set=""][/if]
+[if value vendor_written]
+[set name=made_directory interpolate=1]
+[mkdir dir="[data table=vendor field=order_dir key='[value code]']"]
+[/set]
+<!-- userdb exported=[tag export vendor][/tag] -->
+[value name=vendor_written set=""][/if]
+       <TITLE>New FlyCat Vendor</TITLE>
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<CENTER>
+       <H1>Enable Vendor for user edit</H1>
+       <H3>[scratch made_directory]</H3>[set made_directory][/set]
+</CENTER>
+[set enable_fields]db_acl acl[/set]
+
+[value name=mv_data_table set="userdb" hide=1]
+<FORM ACTION="[process-target]" METHOD=POST>
+<INPUT TYPE=hidden NAME=userdb_written   VALUE=1>
+<INPUT TYPE=hidden NAME=mv_data_table    VALUE=userdb>
+<INPUT TYPE=hidden NAME=mv_data_key      VALUE=code>
+<INPUT TYPE=hidden NAME=mv_data_function VALUE=update>
+<INPUT TYPE=hidden NAME=mv_todo          VALUE=set>
+<INPUT TYPE=hidden NAME=mv_nextpage      VALUE="cartcfg/newcart">
+<INPUT TYPE=hidden NAME=mv_data_fields   VALUE="[scratch enable_fields]">
+<INPUT TYPE=hidden NAME=acl              VALUE="cartcfg/editcart query/check_orders">
+<TABLE BORDER=1>
+<TR>
+       <TD ALIGN=RIGHT>
+               <B>Vendor ID</B>
+       </TD>
+       <TD>
+               <INPUT NAME=db_acl VALUE="[value code]" SIZE=8>
+       </TD>
+</TR>
+<TR>
+       <TD ALIGN=RIGHT>
+               <B>User name</B>
+       </TD>
+       <TD>
+               <INPUT NAME=code VALUE="[value code]" SIZE=8>
+       </TD>
+</TR>
+
+<TR>
+       <TD ALIGN=RIGHT>
+               <B>Create order directory</B>
+       </TD>
+       <TD>
+               <INPUT NAME=mv_click VALUE="mkdir" TYPE=checkbox>
+                       Make directory [data table=vendor field=order_dir key="[value code]"]
+       </TD>
+</TR>
+
+</TABLE>
+<BR CLEAR=LEFT>
+<CENTER><INPUT TYPE=submit VALUE="Enable user edit"></CENTER>
+<P>
+<A HREF="[area cartcfg/newcart]">New cart page, don't enable</A>
+</FORM>
+<P>
+[include pages/cartcfg/buttonbar]
+</BODY></HTML>
diff --git a/dist/flycat/pages/cartcfg/export_userdb.html b/dist/flycat/pages/cartcfg/export_userdb.html
new file mode 100644 (file)
index 0000000..0ce7032
--- /dev/null
@@ -0,0 +1,18 @@
+<HTML>
+<HEAD><TITLE>Export User Database</HEAD></TITLE>
+</HEAD>
+<BODY>
+
+       [set name=export_results int][tag export userdb][/tag][/set]
+
+<H1>Export User Database</H1>
+
+[if scratch export_results]
+Success.
+[else]
+EXPORT FAILED.
+[/else][/if]
+<P>
+[include pages/cartcfg/buttonbar]
+</BODY></HTML>
+       
diff --git a/dist/flycat/pages/cartcfg/export_vendor.html b/dist/flycat/pages/cartcfg/export_vendor.html
new file mode 100644 (file)
index 0000000..d6bd1a7
--- /dev/null
@@ -0,0 +1,29 @@
+<HTML>
+<HEAD><TITLE>Export Vendor and Transactions Database</HEAD></TITLE>
+</HEAD>
+<BODY>
+
+       [set name=export_results int][tag export vendor][/tag][/set]
+
+<H1>Export Vendor Database</H1>
+
+[if scratch export_results]
+Success.
+[else]
+EXPORT FAILED.
+[/else][/if]
+<P>
+
+       [set name=export_results int][tag export transactions][/tag][/set]
+
+<H1>Export Transaction Database</H1>
+
+[if scratch export_results]
+Success.
+[else]
+EXPORT FAILED.
+[/else][/if]
+<P>
+[include pages/cartcfg/buttonbar]
+</BODY></HTML>
+       
diff --git a/dist/flycat/pages/cartcfg/master_edit.form b/dist/flycat/pages/cartcfg/master_edit.form
new file mode 100644 (file)
index 0000000..14e0f61
--- /dev/null
@@ -0,0 +1,73 @@
+[tag flag write][vendor][/tag]
+<HTML>
+<HEAD>
+       <TITLE>
+       Edit Vendor: [value vendor_id] -- [data table=vendor column=company key="[value vendor_id]"]
+       </TITLE>
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+       <CENTER><H1>
+       Edit Vendor: [value vendor_id] -- [data table=vendor column=company key="[value vendor_id]"]
+       </H1></CENTER>
+[set cart_fields]company
+site_name
+email_order
+email_info
+address
+city
+country
+phone
+fax
+tollfree
+url
+logo
+smlogo
+body
+error_body
+header_textcolor
+header_bgcolor
+tax_based_on
+tax_area
+tax_rates
+tax_shipping
+us_shipmodes
+intl_shipmodes
+only_shipmodes
+order_dir
+origin_zip
+ups_adder
+pgp_key
+pgp_program
+encrypt_program
+cybercash
+cyber_mode
+cyber_host
+cyber_port
+cyber_secret
+cyber_version
+cyber_currency
+cyber_configfile
+[/set]
+
+[value name=mv_data_table set="vendor" hide=1]
+
+<FORM ACTION="[process-target]" METHOD=POST>
+<INPUT TYPE=hidden NAME=vendor_written      VALUE=1>
+<INPUT TYPE=hidden NAME=mv_data_table    VALUE=vendor>
+<INPUT TYPE=hidden NAME=mv_data_key      VALUE=code>
+<INPUT TYPE=hidden NAME=mv_data_function VALUE=update>
+<INPUT TYPE=hidden NAME=mv_todo          VALUE=set>
+<INPUT TYPE=hidden NAME=mv_nextpage      VALUE="cartcfg/master_edit">
+<INPUT TYPE=hidden NAME=mv_data_fields   VALUE="[scratch newcart_fields]">
+<INPUT NAME=code VALUE="[value vendor_id]" TYPE=hidden>
+<TABLE BORDER=1>
+[quick-table]
+[loop arg="[scratch newcart_fields]"]<BR><B>[data vendor [loop-code] _label]</B><TD><A HREF="[area help [loop-code]]" onClick="window.open('','popup','height=300,width=400,scrollbars=yes')" TARGET=popup>?</A></TD>: <INPUT NAME="[loop-code]" SIZE=60 VALUE="[data table=vendor field='[loop-code]' key='[value vendor_id]']">
+[/loop][/quick-table]
+</TABLE>
+<BR CLEAR=LEFT>
+<CENTER><INPUT TYPE=submit VALUE="Make changes"></CENTER>
+</FORM>
+<P>
+[include pages/cartcfg/buttonbar]
+</BODY></HTML>
diff --git a/dist/flycat/pages/cartcfg/master_edit.html b/dist/flycat/pages/cartcfg/master_edit.html
new file mode 100644 (file)
index 0000000..2b2d49c
--- /dev/null
@@ -0,0 +1,48 @@
+[if value vendor_id]
+[include pages/cartcfg/master_edit.form]
+[value name=vendor_id set=""]
+[else]
+<HTML>
+<!-- vendor table export: [tag export vendor][/tag] -->
+<HEAD>
+       <TITLE>
+       Edit Vendor
+       </TITLE>
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+       <CENTER><H1>
+       Edit Vendor
+       </H1></CENTER>
+
+<FORM ACTION="[process-target]" METHOD=POST>
+<INPUT TYPE=hidden NAME=mv_todo          VALUE=return>
+<INPUT TYPE=hidden NAME=mv_nextpage      VALUE="@@MV_PAGE@@">
+<TABLE BORDER=1>
+<TR>
+       <TD ALIGN=RIGHT>
+               <B>Vendor ID</B>
+       </TD>
+       <TD>
+        <SELECT MV="loop"
+            MV.PREPEND="[sort vendor:company]"
+            MV.SEARCH="
+                                       sf=0
+                                       se=_
+                                       op=!~
+                                       co=yes
+                                       fi=vendor.txt
+                                       ml=5000"
+            NAME="vendor_id">
+            <OPTION VALUE="[loop-code]"> [loop-code]
+               </SELECT>
+               <INPUT TYPE=submit VALUE="Go">
+       </TD>
+</TR>
+</TABLE>
+<BR CLEAR=LEFT>
+</FORM>
+<P>
+[include pages/cartcfg/buttonbar]
+</BODY></HTML>
+[/else]
+[/if]
diff --git a/dist/flycat/pages/cartcfg/newcart.html b/dist/flycat/pages/cartcfg/newcart.html
new file mode 100644 (file)
index 0000000..8b56a46
--- /dev/null
@@ -0,0 +1,79 @@
+[tag flag write][vendor][/tag]
+<HTML>
+<HEAD>
+[if value userdb_written]
+<!-- userdb db exported=[tag export userdb][/tag] -->
+[value name=userdb_written set=""][/if]
+[if value vendor_written]
+<!-- vendor db wexported=[tag export vendor][/tag] -->
+[value name=vendor_written set=""][/if]
+       <TITLE>New FlyCat Vendor</TITLE>
+<HTML>
+<HEAD>
+       <TITLE>New FlyCat Vendor</TITLE>
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+       <CENTER><H1>New FlyCat Vendor</H1></CENTER>
+[set newcart_fields]company
+site_name
+email_order
+email_info
+address
+city
+country
+phone
+fax
+tollfree
+url
+logo
+smlogo
+body
+error_body
+header_textcolor
+header_bgcolor
+tax_based_on
+tax_area
+tax_rates
+tax_shipping
+us_shipmodes
+intl_shipmodes
+only_shipmodes
+order_dir
+origin_zip
+ups_adder
+pgp_key
+pgp_program
+encrypt_program
+cybercash
+cyber_mode
+cyber_host
+cyber_port
+cyber_secret
+cyber_version
+cyber_currency
+cyber_configfile
+[/set]
+
+
+[value name=mv_data_table set="vendor" hide=1]
+
+<FORM ACTION="[process-target]" METHOD=POST>
+<INPUT TYPE=hidden NAME=vendor_written      VALUE=1>
+<INPUT TYPE=hidden NAME=mv_data_table    VALUE=vendor>
+<INPUT TYPE=hidden NAME=mv_data_key      VALUE=code>
+<INPUT TYPE=hidden NAME=mv_data_function VALUE=insert>
+<INPUT TYPE=hidden NAME=mv_todo          VALUE=set>
+<INPUT TYPE=hidden NAME=mv_nextpage      VALUE="cartcfg/enable_edit">
+<INPUT TYPE=hidden NAME=mv_data_fields   VALUE="[scratch newcart_fields]">
+<TABLE BORDER=1>
+[quick-table]
+<TR><TD ALIGN=RIGHT><B>Store ID</B></TD><TD>&nbsp</TD><TD><INPUT NAME=code VALUE="" SIZE=8></TD></TR>
+[loop arg="[scratch newcart_fields]"]<BR><B>[data vendor [loop-code] _label]</B><TD><A HREF="[area help [loop-code]]" onClick="window.open('','popup','height=300,width=400,scrollbars=yes')" TARGET=popup>?</A></TD>: <INPUT NAME="[loop-code]" SIZE=60 VALUE="[value [loop-code]]">
+[/loop][/quick-table]
+</TABLE>
+<BR CLEAR=LEFT>
+<CENTER><INPUT TYPE=submit VALUE="Add vendor"></CENTER>
+</FORM>
+<P>
+[include pages/cartcfg/buttonbar]
+</BODY></HTML>
diff --git a/dist/flycat/pages/export.html b/dist/flycat/pages/export.html
new file mode 100644 (file)
index 0000000..b753646
--- /dev/null
@@ -0,0 +1 @@
+[tag export application][/tag]
diff --git a/dist/flycat/pages/help.html b/dist/flycat/pages/help.html
new file mode 100644 (file)
index 0000000..71f297f
--- /dev/null
@@ -0,0 +1,21 @@
+<HTML>
+[set name=loop_field interpolate=1][calc]
+       my $arg = q{[data session arg]};
+       $arg =~ s/\s+$//;
+       ($field, $table) = split /:+/, $arg, 2;
+       return $field;
+[/calc][/set]
+[loop arg="[scratch loop_field]"]
+<HEAD><TITLE>[data vendor [loop-code] _label]</TITLE></HEAD>
+<BODY BGCOLOR=WHITE>
+<H1>[data vendor [loop-code] _label]</H1>
+<P>
+example: <B>[data vendor [loop-code] _example]</B>
+<P>
+field: <I>[loop-code]</I>
+<P>
+<U>Description</U>:<BR>
+[data vendor [loop-code] _help]</B>
+[/loop]
+</BODY>
+</HTML>
diff --git a/dist/flycat/pages/new_account.html b/dist/flycat/pages/new_account.html
new file mode 100644 (file)
index 0000000..f0457d4
--- /dev/null
@@ -0,0 +1,97 @@
+<HTML>
+<HEAD>
+<TITLE>[dv site_name] -- New Account</TITLE>
+</HEAD>
+<BODY [dv body]>
+
+<H1>Create an account at [dv site_name]</H1>
+<P>
+
+<P>
+
+[if session logged_in]
+[then]
+[tag flag write]userdb[/tag]
+[tag touch userdb][/tag]
+[set Change]
+[userdb change_pass]
+[/set]
+
+       Change your password:
+<FORM ACTION="[process-target]" METHOD=POST>
+       <INPUT TYPE=hidden NAME=mv_click  VALUE=Change>
+       <INPUT TYPE=hidden NAME=mv_doit  VALUE=return>
+       <INPUT TYPE=hidden NAME=mv_nextpage VALUE=ord/basket>
+       <INPUT TYPE=hidden NAME=mv_username VALUE="[value mv_username]">
+
+       <TABLE>
+       <TR><TD ALIGN=RIGHT>Old password</TD>
+               <TD><INPUT TYPE=password NAME=mv_password_old VALUE="" SIZE=10>
+               </TD></TR>
+
+       <TR><TD ALIGN=RIGHT>New password</TD>
+               <TD><INPUT TYPE=password NAME=mv_password VALUE="" SIZE=10>
+               </TD></TR>
+
+       <TR><TD ALIGN=RIGHT>Verify</TD>
+               <TD><INPUT TYPE=password
+                       onChange="this.form.submit()"
+                       NAME=mv_verify VALUE="" SIZE=10>
+               </TD></TR>
+
+       <TR><TD></TD>
+               <TD><INPUT TYPE=submit VALUE="Change" SIZE=10>
+               </TD></TR>
+       </TABLE>
+</FORM>
+[/then]
+[else]
+
+[set Login]
+[userdb function=new_account username="[cgi mv_username]"]
+[/set]
+
+<P>
+[if session failure]
+[data session failure]
+[/if]
+<P>
+       <FORM ACTION="[process-target]" METHOD=POST>
+       <INPUT TYPE=hidden NAME=mv_click VALUE=Login>
+       <INPUT TYPE=hidden NAME=mv_doit  VALUE=return>
+       <INPUT TYPE=hidden NAME=function  VALUE=new_account>
+       <INPUT TYPE=hidden NAME=mv_nextpage VALUE=ord/basket>
+
+       <TABLE>
+       <TR><TD ALIGN=RIGHT>Username</TD>
+               <TD><INPUT NAME=mv_username VALUE="[value mv_username]" SIZE=10>
+               </TD></TR>
+
+       <TR><TD ALIGN=RIGHT>Password</TD>
+               <TD><INPUT TYPE=password NAME=mv_password VALUE="" SIZE=10>
+               </TD></TR>
+
+       <TR><TD ALIGN=RIGHT>Verify</TD>
+               <TD><INPUT TYPE=password
+                       onChange="this.form.submit()"
+                       NAME=mv_verify VALUE="" SIZE=10>
+               </TD></TR>
+
+       <TR><TD></TD>
+               <TD><INPUT TYPE=submit NAME=mv_Junk VALUE="Log in" SIZE=10>
+               </TD></TR>
+       </TABLE>
+
+       </FORM>
+
+       <TR><TD></TD>
+               <TD><INPUT TYPE=submit NAME=mv_Junk VALUE="Log in" SIZE=10>
+               </TD></TR>
+       </TABLE>
+
+       </FORM>
+[/else][/if]
+<P>
+</BODY>
+</HTML>
diff --git a/dist/flycat/pages/oops.html b/dist/flycat/pages/oops.html
new file mode 100644 (file)
index 0000000..9542510
--- /dev/null
@@ -0,0 +1,10 @@
+<HEAD><TITLE>Oops!</TITLE></HEAD>
+<BODY [dv body]>
+       <BLOCKQUOTE>
+               <BLOCKQUOTE>
+                       Error(s) were encountered in your shopping cart submission:<BLOCKQUOTE><B>[data session fc_error]</B>
+                       <BR>
+               </BLOCKQUOTE>
+       Please go BACK and make necessary corrections.
+</BODY>
+</HTML>
diff --git a/dist/flycat/pages/ord/basket.html b/dist/flycat/pages/ord/basket.html
new file mode 100644 (file)
index 0000000..e054608
--- /dev/null
@@ -0,0 +1,175 @@
+<HTML>
+<HEAD>
+<TITLE>[dv site_name] -- [L]Shopping Cart Contents[/L]</TITLE>
+</HEAD>
+<BODY [dv body]>
+<CENTER>
+<FORM ACTION="[process-target secure=1]" METHOD=POST>
+<INPUT TYPE=hidden NAME=mv_session_id VALUE="[data session id]">
+<input type="hidden" name="mv_doit" value="refresh">
+<input type="hidden" name="mv_orderpage" value="ord/basket">
+<input type="hidden" name="mv_checkout" value="ord/checkout">
+<input type="hidden" name="mv_nextpage" value="redirect">
+[if-dv smlogo]
+<A HREF="[dv url]">
+<IMG BORDER=0 SRC="[dv smlogo]" ALT="[dv site_name] Logo" ALIGN="CENTER">
+</A>[/if-dv]
+<TABLE BORDER=0>
+<CAPTION><FONT SIZE=7>[L]Shopping Cart Contents[/L]</FONT><BR></CAPTION>
+<TR>
+       <TH BGCOLOR="[dv header_bgcolor]" WIDTH=70 VALIGN=BOTTOM><FONT COLOR="[dv header_textcolor]">
+       [L]SKU[/L]
+       </TH>
+       <TH BGCOLOR="[dv header_bgcolor]" VALIGN=BOTTOM ALIGN=LEFT><FONT COLOR="[dv header_textcolor]">
+       [L]Description[/L]
+       </TH>
+       <TH BGCOLOR="[dv header_bgcolor]" WIDTH=70 VALIGN=BOTTOM ALIGN=center><FONT COLOR="[dv header_textcolor]">
+       [L]Quantity[/L]
+       </TH>
+       <TH BGCOLOR="[dv header_bgcolor]" WIDTH=90 VALIGN=BOTTOM ALIGN=center><FONT COLOR="[dv header_textcolor]">
+       [L]Price[/L]
+       </TH>
+       <TH BGCOLOR="[dv header_bgcolor]" WIDTH=90 VALIGN=BOTTOM ALIGN=center><FONT COLOR="[dv header_textcolor]">
+       [L]Extension[/L]
+       </TH>
+</TR>
+[if items]
+[then]
+[item-list]
+<TR>
+<P>
+       <TD BGCOLOR="#FFFFFF" VALIGN=TOP align=center>
+       [item-code]<FONT COLOR="#000000" SIZE="-2"><BR><INPUT TYPE=checkbox NAME="[quantity-name]"
+                          onClick="this.form.action='[process-target]',
+                                               this.form.submit()"
+                          VALUE=0> </FONT><FONT SIZE="-1">[L]remove[/L]</FONT></TD>
+       <TD BGCOLOR="#FFFFFF" VALIGN=TOP MARGINWIDTH=12 MARGINHEIGHT=12>
+       <FONT COLOR="#000000">
+       [if-field url]
+               <A HREF="[item-field url]">[item-description]</A>
+       [else]
+               [item-description]
+       [/else]
+       [/if-field]
+       <BR><FONT SIZE="-1">
+       [item-accessories size][item-accessories color]</FONT>  
+       </TD>
+       <TD BGCOLOR="#FFFFFF" VALIGN=TOP ALIGN=CENTER><FONT COLOR="#000000">
+       <INPUT TYPE="text"
+               NAME="[quantity-name]" VALUE="[item-quantity]" size=3>
+
+       </TD>
+       <TD BGCOLOR="#FFFFFF" VALIGN=TOP ALIGN=RIGHT><FONT COLOR="#000000">
+               [discount-price]
+       </TD>
+       <TD BGCOLOR="#FFFFFF" VALIGN=TOP ALIGN=RIGHT><FONT COLOR="#000000">
+               [item-subtotal]
+       </TD>
+</TR>
+[/item-list]
+[/then]
+[else]
+       <TR><TD ALIGN=CENTER COLSPAN=5 BGCOLOR="#FFFFFF"><FONT COLOR="#000000">
+               <H3>[L]No items at the moment.[/L]</H3>
+       </TD></TR>
+[/else]
+[/if]
+<TR>
+<TD BGCOLOR="[dv header_bgcolor]" COLSPAN=4 ALIGN=RIGHT VALIGN=CENTER>
+<FONT COLOR="[dv header_textcolor]">
+<input type="submit"
+       onClick="this.form.action='[process-target]'"
+       name="mv_submit" value="[L]Recalculate[/L]">
+<IMG BORDER=0 WIDTH=50 HEIGHT=2 SRC="bg.gif" ALT=" . . ">
+<IMG BORDER=0 WIDTH=50 HEIGHT=2 SRC="bg.gif" ALT=" . . ">
+       <B>[L]Subtotal[/L]</B></TD>
+<TD BGCOLOR="[dv header_bgcolor]" ALIGN=RIGHT VALIGN=CENTER><FONT COLOR="[dv header_textcolor]">[subtotal]</TD>
+</TR>
+<TR>
+<TD BGCOLOR="[dv header_bgcolor]" COLSPAN=5 ALIGN=CENTER>
+<FONT COLOR="[dv header_textcolor]">
+<input type="submit" name="mv_click" value="[L]Check out[/L]">
+<input type="submit"
+       onClick="this.form.action='[process-target]'"
+       name="mv_click" value="[L]Continue Shopping[/L]">
+</TD>
+</TR>
+</TABLE>
+</FORM>
+
+
+<P>
+
+[if session logged_in]
+[then]
+<P>
+    <FORM ACTION="[process-target]" METHOD=POST>
+    [L]Hi[/L] [value name]! [L]You are logged in as user[/L] <B>[value mv_username]</B>.
+       <BR>
+       <TABLE><TR><TD><INPUT TYPE=submit NAME="mv_click" VALUE="Log out"></TD>
+               <TD><A HREF="[area new_account]">Change your password</A><BR>
+               [if type=data term="userdb::acl::[data session username]"]
+               <A HREF="[area query/check_orders]">Check order status</A><BR>
+               [/if]
+               [if session username eq 'flycat']
+               <A HREF="[area cartcfg/master_edit]">Edit vendor configurations</A>
+               [elsif type=data
+                       term="userdb::acl::[data session username]"
+                       op="=~"
+                       compare="/cartcfg/"]
+               <A HREF="[area cartcfg/editcart]">Edit your vendor configuration</A>
+               [/elsif]
+               [/if]</TD></TR></TABLE>
+       </FORM>
+[set Log out]
+mv_todo=return
+mv_nextpage=ord/basket
+[userdb logout]
+[/set]
+[/then]
+[else]
+[set Login]
+[userdb login]
+[/set]
+<P>
+[if session failure]
+[data session failure]
+[/if]
+<P>
+[L]If you have an account with us, please enter your user name and password[/L]. (test/test for testing)
+<P>
+    <FORM ACTION="[process-target]" METHOD=POST>
+    <INPUT TYPE=hidden NAME=mv_click VALUE=Login>
+    <INPUT TYPE=hidden NAME=mv_doit  VALUE=return>
+    <INPUT TYPE=hidden NAME=mv_nextpage VALUE="ord/basket">
+
+    <TABLE CELLSPACING=0 CELLPADDING=0>
+    <TR><TD ALIGN=RIGHT>[L]Username[/L]</TD>
+        <TD><INPUT NAME=mv_username VALUE="[value mv_username]" SIZE=10>
+               [page new_account][L]Create a new account[/L][/page]
+        </TD></TR>
+
+    <TR><TD ALIGN=RIGHT>[L]Password[/L]</TD>
+        <TD><INPUT
+                               onChange="this.form.submit()"
+                         TYPE=password NAME=mv_password VALUE="" SIZE=10>
+        <INPUT TYPE=submit VALUE="[L]Log in[/L]"> &nbsp;&nbsp;
+        </TD></TR>
+    </TABLE>
+
+    </FORM>
+[/else][/if]
+
+[set [L]Continue Shopping[/L]]
+mv_todo=return
+mv_nextpage=redirect
+[/set]
+
+[set [L]Check out[/L]]
+mv_todo=return
+mv_nextpage=ord/checkout
+[/set]
+
+<BR>
+
+</body> </html>
diff --git a/dist/flycat/pages/ord/checkout.html b/dist/flycat/pages/ord/checkout.html
new file mode 100644 (file)
index 0000000..b3ef87f
--- /dev/null
@@ -0,0 +1,673 @@
+<HTML>
+<HEAD>
+<TITLE>Check Out: [dv site_name]</TITLE>
+</HEAD>
+<BODY [dv body]>
+
+[perl arg=config interpolate=1]
+       $Safe{config}{TaxShipping} = '[dv tax_shipping]';
+       $Safe{config}{SalesTax}    = '[dv tax_based_on]';
+       return '';
+[/perl]
+
+<TABLE WIDTH=600>
+<TR><TD WIDTH=20% VALIGN=BOTTOM>
+[if-dv smlogo]
+<CENTER>
+<A HREF="[dv url]"><IMG SRC="[dv smlogo]" ALT="[dv company] Logo" BORDER=0></A>
+</CENTER>
+[/if-dv]
+       </TD>
+       <TD VALIGN=BOTTOM><FONT SIZE="-2" FACE="arial, helvetica">
+       [dv company]<BR>
+       [dv address]<BR>
+       [dv city]<BR>
+       <BR>
+       Phone: [dv phone] [dv tollfree]<BR>
+       FAX: [dv fax]
+       </FONT></TD>
+</TR>
+</TABLE>
+[if session logged_in]
+[then]
+
+[set [L]Log out[/L]]
+mv_todo=return
+mv_nextpage=ord/checkout
+[userdb function=logout options="clear=yes"]
+[/set]
+
+    <TABLE CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
+    <TR><TD ALIGN=CENTER>
+    <FORM ACTION="[process-target]" METHOD=POST>
+    [L]Hi[/L] [value name]! [L]You are logged in as user[/L] <B>[value mv_username]</B>.<BR>
+       <TABLE><TR><TD><INPUT TYPE=submit NAME="mv_click" VALUE="Log out"></TD>
+               <TD><A HREF="[area new_account]">Change your password</A><BR>
+               [if type=data term="userdb::acl::[data session username]"]
+               <A HREF="[area query/check_orders]">Check order status</A>
+               [/if]</TD></TR></TABLE>
+       </FORM>
+       </TD></TR></TABLE>
+
+    <TABLE CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
+    <TR><TD ALIGN=CENTER>
+    <FORM ACTION="[process-target]" METHOD=POST>
+       </FORM>
+       </TD></TR></TABLE>
+
+
+[/then]
+[else]
+
+[set Login]
+mv_todo=return
+mv_nextpage=ord/checkout
+[userdb login]
+[/set]
+<P>
+[if session failure]
+[data session failure]
+[/if]
+<P>
+[L]If you have an account with us, please enter your user name and password[/L]. (test/test for testing)
+<P>
+    <FORM ACTION="[process-target]" METHOD=POST>
+    <INPUT TYPE=hidden NAME=mv_click VALUE=Login>
+    <INPUT TYPE=hidden NAME=mv_doit  VALUE=return>
+    <INPUT TYPE=hidden NAME=mv_nextpage VALUE="ord/checkout">
+
+    <TABLE CELLSPACING=0 CELLPADDING=0>
+       <TR><TD ALIGN=RIGHT>[L]Username[/L]</TD>
+        <TD><INPUT NAME=mv_username VALUE="[value mv_username]" SIZE=10>
+               [page new_account][L]Create a new account[/L][/page]
+        </TD></TR>
+
+    <TR><TD ALIGN=RIGHT>[L]Password[/L]</TD>
+        <TD><INPUT
+                               onChange="this.form.submit()"
+                         TYPE=password NAME=mv_password VALUE="" SIZE=10>
+        <INPUT TYPE=submit VALUE="Log in"> &nbsp;&nbsp;
+        </TD></TR>
+    </TABLE>
+
+    </FORM>
+
+[/else][/if]   
+<SCRIPT>    // JavaScript Form Validation Demo    // by Paul Colton
+    function check_tax(form) {
+        // Make sure the email field is not blank
+        var foundState = false;
+        var ch = form.state.value;
+        ch = ch.toUpperCase();
+               [loop arg="[dv tax_area]"]
+        if(ch == "[loop-code]") {
+            alert("You will be charged [currency][fly-tax [loop-code]][/currency] sales tax\nsince you are shipping to [loop-code]. Click UPDATE to see the amount in your total.");
+            foundState = true;
+        }
+               [/loop]
+        return foundState;
+    }
+</SCRIPT>
+
+<FORM ACTION="[process-target secure=1]" METHOD="POST">
+<INPUT TYPE=hidden NAME=mv_session_id VALUE="[data session id]">
+[if items]
+[then]
+<TABLE WIDTH=600>
+<TR><TD COLSPAN=4 BGCOLOR="[dv header_bgcolor]">
+       <FONT SIZE="+2" COLOR="[dv header_textcolor]">[L]Order details[/L]</FONT>
+       </TD>
+</TR>
+[item-list]
+<TR>
+       <TD VALIGN=TOP MARGINWIDTH=12 MARGINHEIGHT=12>
+       <FONT SIZE="-2"><INPUT TYPE=checkbox NAME="[quantity-name]"
+                        VALUE=0 onClick="document.forms[0].submit()"> remove</FONT>
+       <INPUT TYPE="hidden" NAME="[quantity-name]" value="[item-quantity]">
+       </TD>
+       <TD VALIGN=TOP MARGINWIDTH=12 MARGINHEIGHT=12>
+       [item-description]</A>
+       </TD>
+       <TD VALIGN=TOP>[item-quantity] @ [item-price]</TD>
+       <TD VALIGN=TOP ALIGN=RIGHT>[item-subtotal]</TD>
+</TR>
+[/item-list]
+<TR>
+       <TD COLSPAN=2><A HREF="[area ord/basket]">Back to cart</A><BR></TD>
+       <TD>[L]Subtotal[/L]</TD>
+       <TD ALIGN=RIGHT>[subtotal]</TD>
+</TR>
+<TR>
+       <TD COLSPAN=2></TD>
+       <TD>[L]Sales Tax[/L]</TD>
+       <TD ALIGN=RIGHT>[salestax]</TD>
+</TR>
+<TR>
+       <TD COLSPAN=2></TD>
+       <TD>[L]Shipping[/L]</TD>
+       <TD ALIGN=RIGHT>[shipping]</TD>
+</TR>
+<TR>
+       <TD COLSPAN=2></TD>
+       <TD>[L]TOTAL[/L]</TD>
+       <TD ALIGN=RIGHT>[total-cost]</TD>
+</TR>
+</TABLE>
+<P>
+[/then]
+[else]
+
+<H2>[L]No items in your basket.[/L]</H2>
+<P>
+<I>[L]You can enter information, and it will be saved, but no checkout will happen until you order something![/L]</I>
+
+[/else]
+[/if]
+
+<INPUT TYPE="hidden" NAME="mv_doit" VALUE="refresh">
+<INPUT TYPE="hidden" NAME="mv_orderpage" VALUE="ord/checkout">
+<INPUT TYPE="hidden" NAME="mv_order_report" VALUE="../etc/report">
+<INPUT TYPE="hidden" NAME="mv_failpage" VALUE="special/needfield">
+<INPUT TYPE="hidden" NAME="mv_order_profile" VALUE="checkout_profile">
+
+<TABLE WIDTH=600><TR><TD BGCOLOR="[dv header_bgcolor]">
+<FONT SIZE="+2" COLOR="[dv header_textcolor]">[L]Shipping Address[/L]</FONT>
+</TD></TR></TABLE>
+
+<TABLE WIDTH=90%>
+
+<TR>
+       <TD ALIGN=RIGHT>
+               <IMG WIDTH=12 HEIGHT=12 SRC="redball.gif">
+       </TD>
+       <TD ALIGN=RIGHT><B>[L]Name[/L]</B></TD>
+       <TD>
+       <INPUT TYPE="text" NAME="name" VALUE="[value name]" size=40>
+       </TD>
+</TR>
+
+<TR>
+       <TD ALIGN=RIGHT>
+               <IMG WIDTH=12 HEIGHT=12 SRC="redball.gif">
+       </TD>
+       <TD ALIGN=RIGHT><B>[L]Address[/L]</B></TD>
+       <TD ALIGN=LEFT>
+               <INPUT TYPE="text" NAME="address" VALUE="[value address]" size=40>
+       </TD>
+</TR>
+
+<TR>
+       <TD ALIGN=RIGHT>
+               <BR>
+       <IMG WIDTH=12 HEIGHT=12 SRC="redball.gif">
+       </TD>
+       <TD ALIGN=RIGHT><BR><B>[L]City[/L]</B></TD>
+       <TD VALIGN=BOTTOM>
+       <TABLE CELLPADDING=0 MARGINWIDTH=0>
+       <TR>
+               <TD VALIGN=BOTTOM>
+               <INPUT TYPE="text" NAME="city" VALUE="[value city]" size=20>
+               </TD>
+               <TD ALIGN=RIGHT>
+               <BR>
+               <IMG WIDTH=12 HEIGHT=12 SRC="redball.gif">
+               </TD>
+               <TD ALIGN=CENTER VALIGN=BOTTOM>
+               [L]State/Province[/L]<BR>
+               <INPUT onChange="check_tax(this.form)"
+                       TYPE="text" NAME="state" VALUE="[value state]" size=8>
+               </TD>
+               <TD ALIGN=RIGHT>
+               <BR>
+               <IMG WIDTH=12 HEIGHT=12 SRC="redball.gif">
+               </TD>
+               <TD ALIGN=CENTER VALIGN=BOTTOM>
+               [L]Zip/Postal Code[/L]<BR>
+               <INPUT TYPE="text" NAME="zip" VALUE="[value zip]" size=10>
+
+               </TD> 
+       </TR>
+       </TABLE>
+       </TD>
+</TR>
+
+<TR>
+       <TD ALIGN=RIGHT>
+       <IMG WIDTH=12 HEIGHT=12 SRC="redball.gif">
+       </TD>
+       <TD ALIGN=RIGHT><B>[L]Email Address[/L]</B></TD>
+       <TD>
+       <TABLE>
+       <TR>
+               <TD>
+               <INPUT TYPE="text" NAME="email" VALUE="[value email]" size=16>
+               </TD>
+               <TD ALIGN=RIGHT>
+               <IMG WIDTH=12 HEIGHT=12 SRC="bg.gif">
+               </TD>
+               <TD ALIGN=RIGHT>
+               <B>[L]Country[/L]</B>
+               </TD>
+               <TD ALIGN=RIGHT>
+               [if value country =~ /(^$|US|CA)/]
+               <SELECT NAME=country onChange="this.form.submit()">
+                       <OPTION VALUE="US"> United States
+                       <OPTION VALUE="CA"> Canada
+                       <OPTION VALUE="JP"> Other (select to change)
+               </SELECT>
+               [else]
+               <SELECT MV="loop"
+                       MV.PREPEND="[sort country:name]"
+                       MV.SEARCH="ra=yes/fi=country.asc/ml=1000"
+                       onChange="this.form.submit()"
+                       MV.OPTION="country"
+                       NAME="country">
+                       <OPTION VALUE="[loop-code]"> [loop-data country name] 
+               </SELECT>
+               [/else]
+               [/if]<BR>
+               </TD>
+       </TR>
+       </TABLE>
+       </TD>
+</TR>
+
+<TR>   
+       <TD ALIGN=RIGHT>
+       <IMG WIDTH=12 HEIGHT=12 SRC="redball.gif">
+       </TD>
+       <TD ALIGN=RIGHT><B>[L]Daytime Phone[/L]</B></TD>
+       <TD>
+       <TABLE>
+       <TR>
+               <TD>
+               <INPUT TYPE="text" NAME="phone_day" VALUE="[value phone_day]" size=16>
+               </TD>
+               <TD ALIGN=RIGHT>
+               <IMG WIDTH=12 HEIGHT=12 SRC="bg.gif">
+               </TD>
+               <TD ALIGN=RIGHT>
+               <B>[L]Evening[/L]</B>
+               </TD>
+               <TD>
+               <INPUT TYPE="text" NAME="phone_night" VALUE="[value phone_night]" size=16>
+               </TD>
+       </TR>
+       </TABLE>
+</TR>
+
+<TR>
+       <TD ALIGN=RIGHT>
+       <IMG WIDTH="12" HEIGHT="12" SRC="redball.gif">
+       </TD>
+       <TD COLSPAN=2>
+               <I>[L]We need these fields to process your order[/L]</I>
+       </TD>
+</TR>
+</TABLE>
+
+[if session logged_in]
+               [userdb function=get_shipping_names]
+
+[set [L]Save shipping[/L]]
+mv_todo=return
+mv_nextpage=ord/checkout
+[userdb function=set_shipping]
+[/set]
+
+[set [L]Recall shipping[/L]]
+mv_todo=return
+mv_nextpage=ord/checkout
+[userdb function=get_shipping]
+[/set]
+
+[set [L]DELETE shipping[/L]]
+mv_todo=return
+mv_nextpage=ord/checkout
+[userdb function=delete_shipping]
+[/set]
+<TABLE CELLPADDING=0 CELLSPACING=0 BORDER=1 WIDTH=600>
+       <TR>
+       <TD VALIGN=TOP>
+       <FONT SIZE="-1">
+       You can create a new entry for the shipping address in your address book.<BR>Nickname:
+       <INPUT TYPE=text   NAME="s_nickname" SIZE=10>
+       <INPUT TYPE=submit NAME="mv_check" VALUE="[L]Save shipping[/L]"><BR>
+       </FONT>
+       </TD>
+       [if value address_book]
+       <TD>
+       <FONT SIZE="-1">
+       You can save the shipping address to an entry in your address book.<BR>
+               [loop arg="[value address_book]" ]
+               <INPUT TYPE=checkbox NAME="s_nickname" VALUE="[loop-code]"> [loop-code]
+               [/loop]
+       <INPUT TYPE=submit NAME="mv_check" VALUE="[L]Save shipping[/L]">
+       </FONT>
+       </TD></TR><TR>
+       <TD>
+       <FONT SIZE="-1">
+       You can recall a shipping address from your address book.<BR>
+               [loop arg="[value address_book]" ]
+               <INPUT TYPE=checkbox NAME="s_nickname" VALUE="[loop-code]"> [loop-code]
+               [/loop]
+       <INPUT TYPE=submit NAME="mv_check" VALUE="[L]Recall shipping[/L]">
+       </FONT>
+       </TD>
+       <TD>
+       <FONT SIZE="-1">
+       You can DELETE a shipping address from your address book.<BR>
+               [loop arg="[value address_book]" ]
+               <INPUT TYPE=checkbox NAME="s_nickname" VALUE="[loop-code]"> [loop-code]
+               [/loop]
+       <INPUT TYPE=submit NAME="mv_check" VALUE="[L]DELETE shipping[/L]">
+       </FONT>
+       </TD>
+       [/if]
+       </TR>
+</TABLE>
+[/if]
+
+<P>
+<TABLE WIDTH=600><TR><TD BGCOLOR="[dv header_bgcolor]">
+<FONT SIZE="+2" COLOR="[dv header_textcolor]">[L]Choose your shipping method[/L]</FONT>
+</TD></TR></TABLE>
+
+<P>
+<TABLE WIDTH=600>
+<TR><TD>
+       [if data vendor::only_shipmodes::__STORE_ID]
+       <SELECT MV=loop
+               MV.ARG="[dv only_shipmodes]"
+               MV.OPTION="mv_shipmode"
+               NAME="mv_shipmode">
+    <OPTION VALUE="[loop-code]"> [shipping-desc [loop-code]] [shipping [loop-code]]
+       </SELECT>
+       [elsif value country =~ /(^$|US)/]
+       <SELECT MV=loop
+               MV.ARG="[dv us_shipmodes]"
+               MV.OPTION="mv_shipmode"
+               NAME="mv_shipmode">
+    <OPTION VALUE="[loop-code]"> [shipping-desc [loop-code]] [shipping [loop-code]]
+       </SELECT>
+       [/elsif]
+       [elsif data vendor::intl_shipmodes::__STORE_ID__]
+       <SELECT MV=loop
+               MV.ARG="[dv intl_shipmodes]"
+               MV.OPTION="mv_shipmode"
+               NAME="mv_shipmode">
+    <OPTION VALUE="[loop-code]"> [shipping-desc [loop-code]] [shipping [loop-code]]
+       </SELECT>
+       [/elsif]
+       [else]
+         <B>Shipping not supported to your country.</B>
+               <A HREF="mailto:[dv email_info]">Contact us for more information</A>.
+       [/else]
+       [/if]
+</TD>
+<TD ALIGN=RIGHT><INPUT TYPE=submit VALUE="[L]Update[/L]"></TD>
+</TR>
+
+<TR>
+<TD COLSPAN=2 ALIGN=CENTER>
+[if session ship_message]
+<BR><B>[L]Note[/L]:</B> [data session ship_message]<BR>
+[/if]
+</TD>
+</TR></TABLE>
+
+<TABLE WIDTH=600><TR><TD BGCOLOR="[dv header_bgcolor]">
+<FONT SIZE="+2" COLOR="[dv header_textcolor]">[L]Credit Card Information[/L]</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG SRC="smallvisa.gif">&nbsp;&nbsp;<IMG SRC="smallmc.gif">
+</TD></TR></TABLE>
+
+<P>  
+<TABLE><TR><TD VALIGN=TOP>
+[L]Card Number[/L] <FONT SIZE=1>(test number 4111 1111 1111 1111)</FONT><BR>
+<input type="text" name="mv_credit_card_number"
+               value="" size=19>
+</TD>
+<TD VALIGN=TOP>
+ [L]Expires[/L] 
+<BR>
+       <SELECT name="mv_credit_card_exp_month">
+               <OPTION VALUE=1 [selected mv_credit_card_exp_month 1]> 01 - [L]January[/L]
+               <OPTION VALUE=2 [selected mv_credit_card_exp_month 2]> 02 - [L]February[/L]
+               <OPTION VALUE=3 [selected mv_credit_card_exp_month 3]> 03 - [L]March[/L]
+               <OPTION VALUE=4 [selected mv_credit_card_exp_month 4]> 04 - [L]April[/L]
+               <OPTION VALUE=5 [selected mv_credit_card_exp_month 5]> 05 - [L]May[/L]
+               <OPTION VALUE=6 [selected mv_credit_card_exp_month 6]> 06 - [L]June[/L]
+               <OPTION VALUE=7 [selected mv_credit_card_exp_month 7]> 07 - [L]July[/L]
+               <OPTION VALUE=8 [selected mv_credit_card_exp_month 8]> 08 - [L]August[/L]
+               <OPTION VALUE=9 [selected mv_credit_card_exp_month 9]> 09 - [L]September[/L]
+               <OPTION VALUE=10 [selected mv_credit_card_exp_month 10]> 10 - [L]October[/L]
+               <OPTION VALUE=11 [selected mv_credit_card_exp_month 11]> 11 - [L]November[/L]
+               <OPTION VALUE=12 [selected mv_credit_card_exp_month 12]> 12 - [L]December[/L]
+       </SELECT>
+       <SELECT name="mv_credit_card_exp_year">
+               <OPTION VALUE=98 [selected mv_credit_card_exp_year 98]> 1998
+               <OPTION VALUE=99 [selected mv_credit_card_exp_year 99]> 1999
+               <OPTION VALUE=00 [selected mv_credit_card_exp_year 00]> 2000
+               <OPTION VALUE=01 [selected mv_credit_card_exp_year 01]> 2001
+               <OPTION VALUE=02 [selected mv_credit_card_exp_year 02]> 2002
+               <OPTION VALUE=03 [selected mv_credit_card_exp_year 03]> 2003
+               <OPTION VALUE=04 [selected mv_credit_card_exp_year 04]> 2004
+               <OPTION VALUE=05 [selected mv_credit_card_exp_year 05]> 2005
+               <OPTION VALUE=06 [selected mv_credit_card_exp_year 06]> 2006
+               <OPTION VALUE=07 [selected mv_credit_card_exp_year 07]> 2007
+               <OPTION VALUE=08 [selected mv_credit_card_exp_year 08]> 2008
+               <OPTION VALUE=09 [selected mv_credit_card_exp_year 09]> 2009
+               <OPTION VALUE=10 [selected mv_credit_card_exp_year 10]> 2010
+       </SELECT>
+</TD></TR></TABLE>
+<INPUT TYPE=radio NAME="fax_order" VALUE=0
+       [if !value fax_order]CHECKED[/if]>
+<I>[L]Pay by credit card[/L]</I><BR>
+<INPUT TYPE=radio NAME="fax_order" VALUE=1 [checked fax_order 1]>
+<I>[L]I will call with payment information[/L]</I><BR>
+[if value tried_credit_card]
+<INPUT TYPE=checkbox NAME="mv_credit_card_force" VALUE=1>
+<I>[L]Force this card number to be taken[/L]</I><BR>
+[/if]
+
+<TABLE WIDTH=600><TR><TD BGCOLOR="[dv header_bgcolor]">
+<FONT SIZE="+2" COLOR="[dv header_textcolor]">[L]Billing Address (if different)[/L]</FONT>
+</TD></TR></TABLE>
+
+<TABLE>
+<TR>
+       <TD ALIGN=RIGHT><B>[L]Name[/L]</B></TD>
+       <TD>
+       <INPUT TYPE="text" NAME="b_name" VALUE="[value b_name]" size=60>
+       </TD>
+</TR>
+
+<TR>
+       <TD ALIGN=RIGHT><B>[L]Address[/L]</B></TD>
+       <TD ALIGN=LEFT>
+               <INPUT TYPE="text" NAME="b_address" VALUE="[value b_address]" size=60>
+       </TD>
+</TR>
+<TR>
+       <TD ALIGN=RIGHT><B>[L]City[/L], [L]State[/L], [L]Postal Code[/L]</B></TD>
+       <TD>
+       <INPUT TYPE="text" NAME="b_city" VALUE="[value b_city]" size=60>
+       </TD>
+</TR>
+</TABLE>
+
+[if session logged_in]
+               [userdb function=get_billing_names]
+[set [L]Save billing[/L]]
+mv_todo=return
+mv_nextpage=ord/checkout
+[userdb function=set_billing]
+[/set]
+
+[set [L]Recall billing[/L]]
+mv_todo=return
+mv_nextpage=ord/checkout
+[userdb function=get_billing]
+[/set]
+
+[set [L]DELETE billing[/L]]
+mv_todo=return
+mv_nextpage=ord/checkout
+[userdb function=delete_billing]
+[/set]
+<TABLE CELLPADDING=0 CELLSPACING=0 BORDER=1 WIDTH=600>
+       <TR>
+       <TD VALIGN=TOP>
+       <FONT SIZE="-1">
+       You can create a new entry for the billing address in your account book.<BR>Nickname:
+       <INPUT TYPE=text   NAME="b_nickname" SIZE=10>
+       <INPUT TYPE=submit NAME="mv_check" VALUE="[L]Save billing[/L]"><BR>
+       </FONT>
+       </TD>
+       [if value accounts]
+       <TD>
+       <FONT SIZE="-1">
+       You can save the billing address to an entry in your account book.<BR>
+               [loop arg="[value accounts]" ]
+               <INPUT TYPE=checkbox NAME="b_nickname" VALUE="[loop-code]"> [loop-code]
+               [/loop]
+       <INPUT TYPE=submit NAME="mv_check" VALUE="[L]Save billing[/L]">
+       </FONT>
+       </TD></TR><TR>
+       <TD>
+       <FONT SIZE="-1">
+       You can recall a billing address from your account book.<BR>
+               [loop arg="[value accounts]" ]
+               <INPUT TYPE=checkbox NAME="b_nickname" VALUE="[loop-code]"> [loop-code]
+               [/loop]
+       <INPUT TYPE=submit NAME="mv_check" VALUE="[L]Recall billing[/L]">
+       </FONT>
+       </TD>
+       <TD>
+       <FONT SIZE="-1">
+       You can DELETE a billing address from your account book.<BR>
+               [loop arg="[value accounts]" ]
+               <INPUT TYPE=checkbox NAME="b_nickname" VALUE="[loop-code]"> [loop-code]
+               [/loop]
+       <INPUT TYPE=submit NAME="mv_check" VALUE="[L]DELETE billing[/L]">
+       </FONT>
+       </TD>
+       [/if]
+       </TR>
+</TABLE>
+[/if]
+
+[set [L]Place Order![/L]]
+mv_todo=submit
+[if-dv cybercash]mv_cyber_mode=[dv cyber_mode]
+[set CreditCardAuto][/set]
+[else][perl arg="config" interpolate=1]
+       $Safe{config}{CreditCardAuto} = 1;
+       my $tmp;
+       $tmp = q{[dv encrypt_program]};
+       $Safe{config}{EncryptProgram} = $tmp       if $tmp;
+       $tmp = q{[dv pgp_program]};
+       $Safe{config}{PGP}            = $tmp       if $tmp;
+       $tmp = q{[dv pgp_key]};
+       $Safe{config}{EncryptProgram} =~ s/%r/"$tmp"/       if $tmp;
+       return '';
+[/perl][/else][/if-dv]
+[/set]
+
+<TABLE><TR><TD>
+<INPUT TYPE=radio NAME=email_copy [checked email_copy 1] VALUE="1">Yes
+<INPUT TYPE=radio NAME=email_copy [checked name=email_copy value=0 default=1] VALUE="0">No
+</TD><TD>
+<I>Send an email copy of my receipt</I>
+</TD></TR>
+[if session logged_in]
+<TR><TD ALIGN=RIGHT>
+<INPUT TYPE=checkbox NAME=mv_click CHECKED VALUE="Save_database">
+</TD><TD>
+<I> Save my information in the database</I>
+[set Save_database]
+[userdb save]
+[/set]
+[/if]
+</TD></TR></TABLE>
+
+<CENTER>
+<B><INPUT TYPE=submit NAME=mv_click VALUE="[L]Place Order![/L]"></B><BR>
+<FONT SIZE="-1"><INPUT TYPE=submit VALUE="[L]Update info, don't place order[/L]"></FONT>
+</CENTER>
+<P>
+<B>Gift note or Special Instructions<BR>
+<TEXTAREA NAME=gift_note ROWS=5 COLS=72>[value gift_note]</TEXTAREA>
+</FORM>
+<P>
+<CENTER><A HREF="[dv url]">Return to [dv company] home page</A> (make sure you save first!)</CENTER>
+</body> </html>
+
+[set checkout_profile]
+[set name=config_results int]
+[perl arg=config interpolate=1]
+       my $ref = $Safe{config};
+       $ref->{MailOrderTo}    = q{[dv email_order]} || $ref->{MailOrderTo};
+       #[if-dv encrypt_program]
+               $ref->{EncryptProgram} = q{[dv encrypt_program]};
+       #[/if-dv]
+       #[if-dv pgp_program]
+               $ref->{PGP} = q{[dv pgp_program]};
+       #[/if-dv]
+       #[if-dv pgp_key]
+               $ref->{EncryptProgram} =~ s/%r/"[dv pgp_key]"/;
+       #[/if-dv]
+
+       $cyber = (q{[dv cybercash]} =~ /^\s*[y1]/i);
+       $ref->{CyberCash}      = $cyber;
+       $ref->{CreditCardAuto} = ! $cyber;
+       return <<EOF;
+CyberCash======> $ref->{CyberCash}
+CreditCardAuto=> $ref->{CreditCardAuto}
+EncryptProgram=> $ref->{EncryptProgram}
+EOF
+[/perl]
+[/set]
+name=required
+address=required
+city=required
+country=required
+[calc]
+       my $country = q{[cgi country]};
+       $country =~ s/\W+//g;
+       return 'phone_day=phone' unless $country =~ /^(US|CA|USA|UnitedStates|Canada)$/i;
+       return "state=state_province\nzip=zip\nphone_day=phone_us";
+[/calc]
+email=required
+email=email
+&fatal = yes
+
+[if value fax_order]
+&set = mv_payment Call Us
+[elsif config CyberCash]
+       [perl arg=config interpolate=1]
+               my $ref = $Safe{config}{Variable};
+               $ref->{CYBER_MODE}           = q{[dv cyber_mode]};
+               $ref->{CYBER_HOST}           = q{[dv cyber_host]};
+               $ref->{CYBER_PORT}           = q{[dv cyber_port]};
+               $ref->{CYBER_VERSION}        = q{[dv cyber_version]};
+               $ref->{CYBER_CURRENCY}       = q{[dv cyber_currency]};
+               $ref->{CYBER_SERVER_VERSION} = q{[dv cyber_version]};
+               $ref->{CYBER_CONFIGFILE}     = q{[dv cyber_configfile]};
+               $ref->{CYBER_SECRET}         = q{[dv cyber_secret]};
+               return '';
+       [/perl]
+&set=mv_payment CyberCash Credit Card
+[/elsif]
+[elsif config CreditCardAuto]
+&set=mv_payment Credit Card ([default mv_credit_card_type unknown])
+mv_credit_card_info=required
+[/elsif]
+[else]
+&set=mv_payment Will Call
+[/else]
+[/if]
+
+&final = yes
+&set=mv_email [value email]
+
+[/set]
diff --git a/dist/flycat/pages/query/check_orders.html b/dist/flycat/pages/query/check_orders.html
new file mode 100644 (file)
index 0000000..5fdffcc
--- /dev/null
@@ -0,0 +1,73 @@
+<HTML>
+<HEAD>
+<TITLE> [dv site_name] -- Order Status </TITLE>
+</HEAD>
+<BODY [dv body]>
+<CENTER>
+<H1>Order Status</H1>
+<TABLE BORDER=3><TR><TD>
+<TABLE>
+[loop search="
+               fi=transactions.raw
+               sf=username
+               se=[data session username]
+               ml=1000
+               "]
+[calc]
+               $out = <<'EOF';
+</TD><TD ALIGN=RIGHT>
+[loop-data transactions nitems]&nbsp;
+</TD><TD ALIGN=RIGHT>
+[loop-data transactions subtotal]&nbsp;
+</TD><TD>
+[loop-data transactions payment_tax]&nbsp;
+</TD><TD>
+[loop-data transactions shipping]&nbsp;
+</TD><TD>
+EOF
+       $out .= "$status &nbsp;</TD></TR>";
+       $tmp = q![loop-data transactions order_number]!;
+               if(! $testit{$tmp}++) {
+                       $status = q{[loop-data transactions status]};
+                       $previous_summary = $summary;
+                       $summary = <<EOF;
+<TR>
+       <TH>&nbsp;</TH>
+       <TH ALIGN=RIGHT><HR></TH>
+       <TH ALIGN=RIGHT><HR></TH>
+       <TH ALIGN=LEFT><FONT SIZE="-1">Payment/Tax</TH>
+       <TH ALIGN=LEFT><FONT SIZE="-1">Shipping</TH>
+       <TH>&nbsp;</TH>
+       </TR><TD><FONT SIZE="-1">Summary
+$out
+EOF
+                       return '';
+               }
+               if ($testit{$tmp} == 2) {
+                       $status = '';
+                       my $return = $previous_summary || '';
+                       $return .= '<TR><TD COLSPAN=7><HR></TD></TR>'
+                               if $previous_summary;
+                       $return .= <<EOF;
+<TR>
+       <TH><FONT SIZE="-1">Order number</TH>
+       <TH ALIGN=RIGHT><FONT SIZE="-1">Quantity</TH>
+       <TH ALIGN=RIGHT><FONT SIZE="-1">Price</TH>
+       <TH ALIGN=LEFT><FONT SIZE="-1">Item Description</TH>
+       <TH ALIGN=LEFT><FONT SIZE="-1">Item Code</TH>
+       <TH><FONT SIZE="-1">Order Status</TH>
+       <TH>&nbsp;</TH>
+       </TR><TD>$tmp
+$out
+EOF
+                       return $return;
+               }
+               return "<TR><TD>&nbsp;$out";
+[/calc]
+[/loop]
+[calc]$summary[/calc]
+</TABLE>
+</CENTER>
+</TD></TR></TABLE>
+</BODY>
+
diff --git a/dist/flycat/pages/redirect.html b/dist/flycat/pages/redirect.html
new file mode 100644 (file)
index 0000000..5ea59cf
--- /dev/null
@@ -0,0 +1,5 @@
+[set name=fc_redirect interpolate=1][if value fc_redirect][value fc_redirect][else][dv url][/else][/if][/set][tag op=header int]Status: 302 Moved
+Location: [scratch fc_redirect]
+[/tag]
+
+<A HREF="[scratch fc_redirect]" ALT="Return to [dv site_name]">Return to [dv site_name]</A>
diff --git a/dist/flycat/pages/special/badsearch.html b/dist/flycat/pages/special/badsearch.html
new file mode 100644 (file)
index 0000000..64b0e87
--- /dev/null
@@ -0,0 +1,14 @@
+<html><head>
+<title>Bad Search Specification</title>
+</head>
+<BODY [dv error_body]>
+
+<h1>Bad Search Specification</h1>
+
+The search could not be done. The problem was:
+<P>
+[subject]
+
+<P>
+<A HREF="[dv url]">Home</A>
+</body></html>
diff --git a/dist/flycat/pages/special/canceled.html b/dist/flycat/pages/special/canceled.html
new file mode 100644 (file)
index 0000000..2c60f5a
--- /dev/null
@@ -0,0 +1,21 @@
+<html> <head>
+<title>Account Information Erased</title>
+</head>
+
+<BODY [dv error_body]>
+
+<h1>Order Information Canceled</h1>
+
+Your account information has been canceled, and all
+information wiped from the disk.
+<P>
+If you wish to order another item, we would like you to do so, but
+unfortunately you will have to re-enter any account information.
+<P>
+<STRONG>We hope you will ordering from us in the future.</STRONG>
+<P>
+<I>(Please use the button bar below to return to the catalog,
+to our search functions, or to the control menu.)</I>
+<P>
+<A HREF="[dv url]">Home</A>
+</body></html>
diff --git a/dist/flycat/pages/special/enroll_failed.html b/dist/flycat/pages/special/enroll_failed.html
new file mode 100644 (file)
index 0000000..8c0f7a5
--- /dev/null
@@ -0,0 +1,23 @@
+<CENTER>
+<h1>Enrollment failed.</h1>
+</CENTER>
+<BODY [dv error_body]>
+<H3>We have your information as:</H3>
+
+[quick-table interpolate=1]
+Site Name: [value sitename]
+Catalog code: to be assigned
+Orders sent to: [value mail_to]
+Return URL: [value siteurl]
+Backround image: [value bgimg]
+Backround color: [value bgcolor]
+Text color: [value text]
+Theme: [data table=theme col=name key="[value theme]"]
+Logo URL: [value logo]
+[/quick-table]
+<P>
+
+<P>
+Please email this page to
+       <A HREF="@@MALL_EMAIL@@">@@MALL_EMAIL@@</A>
+and we will take care of it. Thanks.
diff --git a/dist/flycat/pages/special/enroll_thankyou.html b/dist/flycat/pages/special/enroll_thankyou.html
new file mode 100644 (file)
index 0000000..058f109
--- /dev/null
@@ -0,0 +1,83 @@
+[new]
+<CENTER>
+<h1>Thanks for enrolling!</h1>
+</CENTER>
+
+<H3>We have your basic information as:</H3>
+
+[quick-table interpolate=1]
+Site Name: [value sitename]
+Catalog code: to be assigned
+Orders sent to: [value mail_to]
+Admin Contact: [value admin_contact]
+Return URL: [value siteurl]
+Backround image: [value bgimg]
+Backround color: [value bgcolor]
+Text color: [value text]
+Theme: [data table=theme col=name key="[value theme]"]
+Logo URL: [value logo]
+[/quick-table]
+
+We will be contacting [value admin_contact] with any questions
+about the remaining information. Thank you!
+
+[tag op=import base=applications interpolate=1][loop arg="code
+siteurl
+sitename
+nodom
+tax_state
+tax_rate
+mail_to
+admin_contact
+ccmail
+email_conf
+ssl
+refnumber
+striplast
+domains
+flat_sh
+shflag
+sh_percent_cost
+sh_each_unit
+sh_perpound
+sc_typ
+shipmeth
+shipurl
+sh_country
+forordinfo
+est_ship
+form
+nsi
+faxnumber
+merch_address
+logo
+theme
+cs_sub
+cs_subw
+cs_subh
+cn_sub
+cn_subh
+cn_subw
+killcartpic
+bgcolor
+mfontacc
+dark
+info1
+info1force
+merch_mess
+minimumorder
+minimumordermessage
+noconfirm
+useback
+currency
+uw
+faxsavkey
+faxsavfrom
+faxsavto
+use_pn
+use_view
+use_thumb
+thnimg
+storename
+password"][value [loop-code]]  [/loop]
+[/tag]
diff --git a/dist/flycat/pages/special/failed.html b/dist/flycat/pages/special/failed.html
new file mode 100644 (file)
index 0000000..92810b2
--- /dev/null
@@ -0,0 +1,20 @@
+<html><head>
+<title>Order Failed</title>
+</head>
+
+<BODY [dv error_body]>
+<h1>Order Failed</h1>
+
+[if explicit q{[subject]}]
+<PRE>
+[subject]
+</PRE>
+[else]
+We're sorry, but your order could not be processed at this time due to
+technical problems.  Please print the order page and give us a call.
+We will follow up as soon as possible.
+[/else]
+[/if]
+<P>
+<A HREF="[dv url]">Home</A>
+</body></html>
diff --git a/dist/flycat/pages/special/interact.html b/dist/flycat/pages/special/interact.html
new file mode 100644 (file)
index 0000000..51f9b6c
--- /dev/null
@@ -0,0 +1,17 @@
+<html> <head>
+<title>Error</title>
+</head>
+
+<BODY [dv error_body]>
+<h1>Error</h1>
+
+Something has gone wrong, and I did not receive the response I
+expected from your browser.  There was the following problem:<p>
+
+[message]<p>
+
+If you wish, you can return to the <A HREF="[dv url]">catalog</A>.
+
+<P>
+<A HREF="[dv url]">Home</A>
+</body></html>
diff --git a/dist/flycat/pages/special/missing.html b/dist/flycat/pages/special/missing.html
new file mode 100644 (file)
index 0000000..160b062
--- /dev/null
@@ -0,0 +1,16 @@
+<html><head>
+<title>No Page - Under Construction</title>
+</head>
+
+<BODY [dv error_body]>
+
+<IMG WIDTH=144 HEIGHT=50 SRC="undercon.gif" ALT="UNDER CONSTRUCTION">
+<h2>Sorry, we are still under construction!</h2>
+
+This item doesn't have a catalog page yet, but you can bet it will soon!
+You can <A HREF="[dv url]">return to browsing our
+catalog</A>, if you wish.
+
+<P>
+<A HREF="[dv url]">Home</A>
+</body></html>
diff --git a/dist/flycat/pages/special/needfield.html b/dist/flycat/pages/special/needfield.html
new file mode 100644 (file)
index 0000000..b86104e
--- /dev/null
@@ -0,0 +1,46 @@
+<html> <head>
+<title>Required field(s) Missing</title>
+</head>
+
+<BODY [dv error_body]>
+<h1>We need some more information!</h1>
+
+We need to have some fields entered to be able
+to process your order.  Please go back and fill out 
+the information.
+<P>
+Problem: 
+<P>
+[perl]
+       my $msg = q{[subject]};
+       sub redo_message {
+               my($param,$word) = @_;
+               if($param =~ /mv_credit/) {
+                       "<LI>You need to validate your credit card information.\n";
+               }
+               elsif ($word =~ /not_a_state/i) {
+                       return "<LI>We need a valid two-letter state code like CA.\n";
+               }
+               elsif ($word =~ /phone_day=/i) {
+                       return "<LI>Is that really a phone number?\n";
+               }
+               elsif ($word =~ /not_a_zip_code/i) {
+                       return "<LI>We need a zip code for UPS lookup.\n";
+               }
+               elsif ($word =~ /mv_contingent/) {
+                       return "<LI>You need to select your method of payment.\n";
+               }
+               else { return "<LI>$param: $word\n" }
+       }
+       @msg = split /\n/, $msg;
+       $msg = '<UL>';
+       for(@msg) {
+               ($var, $val) = split /:\s*/, $_;
+               $msg .= redo_message($var, $val);
+       }
+       $msg .= '</UL>';
+       $msg;
+[/perl]
+<P>
+<A HREF="[dv url]">Home</A>
+</body></html>
diff --git a/dist/flycat/pages/special/nomatch.html b/dist/flycat/pages/special/nomatch.html
new file mode 100644 (file)
index 0000000..682fc67
--- /dev/null
@@ -0,0 +1,11 @@
+<html><head>
+<title>No Match for [subject]</title>
+</head>
+
+<BODY [dv error_body]>
+<h1>No Match for [subject]</h1>
+
+There were no matches found.
+<P>
+<A HREF="[dv url]">Home</A>
+</body></html>
diff --git a/dist/flycat/pages/special/noproduct.html b/dist/flycat/pages/special/noproduct.html
new file mode 100644 (file)
index 0000000..430d8b5
--- /dev/null
@@ -0,0 +1,14 @@
+<html><head>
+<title>Requested Product Unavailable</title>
+</head>
+
+<BODY [dv error_body]>
+<h1>Requested Product Unavailable</h1>
+
+We are sorry, but the product ([subject]) that you requested is
+not now available.  You can still <A HREF="[dv url]">browse our
+catalog</A>, if you wish.
+
+<P>
+<A HREF="[dv url]">Home</A>
+</body></html>
diff --git a/dist/flycat/pages/special/notfound.html b/dist/flycat/pages/special/notfound.html
new file mode 100644 (file)
index 0000000..b61881f
--- /dev/null
@@ -0,0 +1,13 @@
+<html><head>
+<title>Not Found</title>
+</head>
+
+<BODY [dv error_body]>
+<h1>Not Found</h1>
+
+No items with '[subject]' were found.  You can <A HREF="[dv url]">return to
+browsing our catalog</A>, if you wish.
+
+<P>
+<A HREF="[dv url]">Home</A>
+</body></html>
diff --git a/dist/flycat/pages/special/reconfig.html b/dist/flycat/pages/special/reconfig.html
new file mode 100644 (file)
index 0000000..0281243
--- /dev/null
@@ -0,0 +1,11 @@
+<html> <head>
+<title>Catalog Reconfigured</title>
+</head>
+<BODY [dv error_body]>
+<IMG WIDTH=69 HEIGHT=45 SRC="button_y.gif" ALT="Check Mark" ALIGN=CENTER>
+<h1>Catalog Reconfigured!</h1>
+
+The catalog was successfully reconfigured.
+<P>
+<A HREF="[dv url]">Home</A>
+</body></html>
diff --git a/dist/flycat/pages/special/sec_faq.html b/dist/flycat/pages/special/sec_faq.html
new file mode 100644 (file)
index 0000000..095fd28
--- /dev/null
@@ -0,0 +1,136 @@
+<HTML>
+<HEAD>
+       <TITLE>
+               MiniVend Security FAQ
+       </TITLE>
+</HEAD>
+<BODY>
+<H2>MiniVend Security FAQ</H2>
+
+<STRONG>
+(with thanks to Lincoln Stein, and the WWW Security FAQ)
+</STRONG>
+<P ALIGN=CENTER>
+<I>Press BACK to return to the form</I>
+<P>
+
+<B>Q:</B> <I>My Netscape browser is displaying a form for ordering merchandise
+from a department store that I trust. The little key at the lower
+left-hand corner of the Netscape window is solid and
+has two teeth. This means I can safely submit my
+credit card number, right?</I>
+<P>
+Not quite. A solid key with two teeth appears indicates that SSL is
+being used with a 128-bit secret key and that the remote host owns a
+valid server certificate that was certified by some authority that
+Netscape recognizes. At this point, however, you don't know who that
+certificate belongs to. It's possible that someone has bought or stolen
+a server certificate and then diverted network traffic destined for the
+department store by subverting a router somewhere between you and the
+store. The only way to make sure that you're talking to the company you
+think you're talking to is to open up the "Document Information" window
+(from the File menu) and examine the server certificate. If the host and
+organization names that appear there match the company you expect, then
+you're probably safe to submit the form. If something unexpected appears
+there (like "Embezzlers R Us") you might want to call the department
+store's 800 number.
+<HR>
+
+<B>Q:</B> <I>How secure is the encryption used by SSL?</I>
+
+<P>
+
+SSL uses public-key encryption to exchange a session key between the
+client and server; this session key is used to encrypt the http
+transaction (both request and response). Each transaction uses a
+different session key so that if someone manages to decrypt a
+transaction, that does not mean that they've found the server's secret
+key; if they want to decrypt another transaction, they'll need to spend
+as much time and effort on the second transaction as they did on the
+first.
+<P>
+Netscape servers and browsers do encryption using either a 40-bit secret
+key or a 128-bit secret key. Many people feel that using a 40-bit key is
+insecure because it's vulnerable to a "brute force" attack (trying each
+of the 2^40 possible keys until you find the one that decrypts the
+message). Using a 128-bit key eleiminates this problem because there are
+2^128 instead of 2^40 possible keys. Unfortunately, most Netscape users
+have browsers that support only 40-bit secret keys. This is because of
+legal restrictions on the encryption software that can be exported from
+the United States (The Federal Government has recently modified this
+policy on following the well-publicized cracking of a Netscape message
+encrypted using a 40-bit key.  Expect this situation to change). <P>
+In Netscape you can tell what kind of encryption is in use for a particular
+document by looking at the "document" information" screen accessible
+from the file menu. The little key in the lower left-hand corner of the
+Netscape window also indicates this information. A solid key with two
+teeth means 128-bit encryption, a solid key with one tooth means 40-bit
+encryption, and a broken key means no encryption. Even if your browser
+supports 128-bit encryption, it mayse use 40-bit encryption when talking
+to older Netscape servers or Netscape servers outside the U.S. and
+Canada.
+<P>
+<HR>
+<B>Q:</B> <I>My friend says that none of this stuff is safe. What
+should I believe?</I>
+<P>
+When credit cards first came out in the late 1960s, the cardholder was 
+liable for <B>all</B> losses occurring as a result of a stolen card. The
+credit card companies soon discovered that fear of large losses prevented
+people from using or keeping the cards. For a long time now, you have
+been liable (in most states) for at most $50 of loss as a result of
+credit card fraud.
+<P>
+Using your credit card on the Internet is no different than giving it to
+a restaurant. The presence of a warning-free SSL security system
+ensures that the company you are dealing with has passed background
+checks -- just like the presence of a Verifone credit-card checking device
+gives a good indication that the restaurant can actually accept credit
+cards. Look for a server certified by Verisign, Thawte, or another
+well-known certifying agency.  If a server's SSL certificate is so signed,
+you have done your job to verify authenticity.
+<P>
+We don't recommend that you send your credit card number un-encrypted
+over the Internet. Just like you know not to give your card number to
+anyone who calls you -- you make sure you know who you are talking to
+first -- you shouldn't send your card number over the Internet until
+you are certain that the company you are dealing with has made the effort
+to ensure security. Presence of a warning-free SSL security system
+indicates that rather considerable effort has been made. Look for the
+lock, key, or blue line, and you should be safe.
+<HR>
+<B>Q:</B> <I>Yes, all that is fine, but what about your software? Won't
+the number stick around on the disk forever?</I>
+<P>
+The SSL encryption will take care of network transmission. But we
+don't want to make it easy for just anybody, even those with access
+to our system, to view your number. When MiniVend is properly set
+up, the number is encrypted with PGP encryption before ever being
+written to a file.
+<P>
+First of all, after you enter your number, it is kept in memory only until
+until it is encrypted. At that time, it is scrubbed from the program's
+memory. The now-encrypted card number (with the password only known
+to our order entry personnel) is then written to a file with
+permissions set so only the program can get at it.
+<P>
+This behavior will be followed by the MiniVend program as long as
+the number is placed in a field named <B>mv_credit_card_number</B>
+-- you can view the source of the order form to ensure that.
+<P>
+If you have entered your credit card number and decide <I>not</I> to
+submit your order, the <I>encrypted</I> number will remain on disk for
+no more than one day. At that time, the sessions on the system that are
+older than one day will be expired, after any encrypted
+<B>credit_card_no</B> fields are overwritten with meaningless data, and
+removed from the session database.
+<P>
+If you wish, you can press the button on the order form which is labeled