home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 035 / murexx.zip / MAXUSER.DOC < prev   
Text File  |  1994-11-05  |  27KB  |  763 lines

  1.  
  2.                           MaxUserREXX Version 1.0
  3.  
  4.             Maximus v2.xx USER.BBS Manipulator DLL for OS/2 REXX
  5.            Copyright 1994, by Craig Morrison, All Rights Reserved.
  6.  
  7.  
  8.  What is it?
  9.  -----------
  10.  
  11.   MaxUserREXX is a REXX callable dynamic link library for OS/2's REXX
  12.  Procedures Language/2. With MaxUserREXX and REXX you can write REXX command
  13.  scripts that will allow you to manipulate your Maximus v2.xx USER.BBS and
  14.  LASTUSER.BBS files.
  15.  
  16.  
  17.  How Much is it?
  18.  ---------------
  19.  
  20.   For non-commercial/private use, MaxUserREXX is _absolutely_ free.
  21.  
  22.   For commercial use of MaxUserREXX the pricing schedule is as follows:
  23.  
  24.                      ┌────────────────────────┐
  25.                      │ Copies          Cost   │
  26.                      ├───────────┬────────────┤
  27.                      │ 1-5       │     $10.00 │
  28.                      │ 6-10      │     $ 8.00 │
  29.                      │ 11-20     │     $ 7.00 │
  30.                      │ 21-40     │     $ 6.00 │
  31.                      │ 41+       │     $ 4.00 │
  32.                      └───────────┴────────────┘
  33.  
  34.   For developers wishing to distribute MaxUserREXX with their applications
  35.  there is a one-time license fee of $48.00. Further royalties are not required,
  36.  unless the product for distribution is of a developer's kit in nature.
  37.  
  38.   For commercial volume purchases of 6 or more copies or for developers
  39.  purchasing a distribution license the Borland C source code to MaxUserREXX is
  40.  provided.
  41.  
  42.   For the author's contact information and purchase form please see the end of
  43.  this document.
  44.  
  45.  
  46.  Installing MaxUserREXX
  47.  ----------------------
  48.  
  49.   Simply copy the file MAXUSER.DLL to a directory on your LIBPATH, or into the
  50.  directory you will be running your REXX command scripts from.
  51.  
  52.   THAT'S IT!
  53.  
  54.  
  55.  Using MaxUserREXX
  56.  -----------------
  57.  
  58.   It would be to your benefit to use a BACKUP copy of your USER.BBS while you
  59.  are getting comfortable with MaxUserREXX. MaxUserREXX will NOT do anything you
  60.  don't tell it to do. As long as you don't call CommitUser() your USER.BBS is
  61.  safe.
  62.  
  63.   First you need to know how to write a REXX script. Writing a REXX script is
  64.  well beyond the scope of this document, please refer to the OS/2 REXX
  65.  Procedures Language/2 Online Reference provided with OS/2 for more
  66.  information.
  67.  
  68.   It would also be to your benefit to have the record layout for the
  69.  USER.BBS file handy. While MaxUserREXX makes it so that you don't need
  70.  to know the exact layout of the file, the user structure definition
  71.  does contain some useful information that deals with the real purpose
  72.  of each field.
  73.  
  74.   MaxUserREXX provides 60+ functions that allow you to manipulate every aspect
  75.  of a user record in either a USER.BBS or LASTUSER.BBS file. You will need to
  76.  be familiar with the REXX functions RXFUNCADD and RXFUNCDROP to load and drop
  77.  functions. However, two of the functions provided by MaxUserREXX allow you to
  78.  easily load and drop all the functions available.
  79.  
  80.   The functions are basically divided into two groups, QueryUser... and
  81.  SetUser..., the QueryUser functions return information about a particular
  82.  record and the SetUser functions modify the user information of a record.
  83.  
  84.   Let's get on with the functions.. A complete list follows with the function
  85.  being listed first then an explanation of what it does and what arguments are
  86.  needed. All the functions will return ERROR if something goes wrong, except
  87.  where specified.
  88.  
  89.   All index numbers into the user files are _ZERO_ (0) _NOT_ one (1) based.
  90.  
  91.   You can only have ONE user file open at a time per REXX script.
  92.  
  93.     UserLoadFuncs()
  94.  
  95.         Loads all the MaxUserREXX functions in one fell swoop. Sample
  96.         usage:
  97.  
  98.             Call RxFuncAdd 'UserLoadFuncs', 'MaxUser', 'UserLoadFuncs'
  99.             Call UserLoadFuncs
  100.  
  101.         If you are going to be using only a small portion of the
  102.         functions available, you may wish to just load those functions
  103.         using RxFuncAdd.
  104.  
  105.     UserDropFuncs()
  106.  
  107.         Drops all loaded functions. MAKE SURE IF YOU HAVE CALLED
  108.         OpenUserFile() THAT YOU CALL CloseUserFile() BEFORE CALLING THIS
  109.         FUNCTION.
  110.  
  111.     OpenUserFile(UserFileName)
  112.  
  113.         Allocates in memory structures needed to manipulate
  114.         UserFileName. UserFileName can be either a USER.BBS or
  115.         LASTUSER.BBS file. Returns the number of users in the file on
  116.         success.
  117.  
  118.     CommitUser(UserIndex)
  119.  
  120.         Commits all modifications made to the user record at UserIndex
  121.         by writing the changes to disk.
  122.  
  123.     CloseUserFile()
  124.  
  125.         Closes out and releases all in-memory structures for the last
  126.         Open'ed user file. MAKE SURE YOU CALL THIS FUNCTION _BEFORE_
  127.         CALLING UserDropFuncs()!
  128.  
  129.     CopyUserToFile(UserIndex, TargetFile)
  130.  
  131.         Appends the user record at UserIndex to TargetFile, creating
  132.         TargetFile if necessary.
  133.  
  134.         This function can be used to perform a `pack' of the main user
  135.         file by looping through the user records, calling
  136.         QueryUserFlags() for each record. If the DEL flag is not set
  137.         then call this function to write the record to a new user file.
  138.  
  139.         Something similar to:
  140.  
  141.             usercount = OpenUserFile('USER.BBS')
  142.             do userindex = 0  to usercount-1
  143.                 if Pos('DEL', QueryUserFlags(userindex))=0 then
  144.                     call CopyUserToFile userindex, 'NEWUSER.BBS'
  145.                 else
  146.                     Say 'User 'QueryUserName(userindex)' purged..'
  147.             end
  148.             Call CloseUserFile
  149.  
  150.         You can also add a user to the user file with this function.
  151.         EXERCISE CAUTION WHEN ADDING A USER WITH THIS FUNCTION! What
  152.         you will need to do is something like:
  153.  
  154.             usercount = OpenUserFile('TEMPLATE.BBS')
  155.             if usercount<>'ERROR' then do
  156.                 call CopyUserToFile '0', 'USER.BBS'
  157.                 call CloseUserFile
  158.             end
  159.  
  160.         TEMPLATE.BBS would be a file that could hold one or more user
  161.         templates. Make sure to test for the presence of ACTIVExx.BBS
  162.         files, so you don't stomp on Maximus' efforts to work with the
  163.         user file.
  164.  
  165.     SwapUsers(UserIndex1, UserIndex2)
  166.  
  167.         Swaps the user records at UserIndex1 and UserIndex2. Make sure
  168.         you CommitUser() BOTH records after calling this function.
  169.  
  170.     FindUser(StartIndex, UserName)
  171.  
  172.         Returns the zero based index of UserName starting from
  173.         StartIndex. Returns StartIndex if UserName is not found. Both
  174.         the Name and Alias fields of the user records are compared to
  175.         UserName to find a match. NOTE: This is a brute force search.
  176.  
  177.     QueryUserName(UserIndex)
  178.  
  179.         Returns the Name of the user at UserIndex or an empty string if
  180.         UserIndex is out of range.
  181.  
  182.     QueryUserAlias(UserIndex)
  183.  
  184.         Returns the Alias of the user at UserIndex or an empty string if
  185.         UserIndex is out of range.
  186.  
  187.     QueryUserLocation(UserIndex)
  188.  
  189.         Returns the City/St/Province of the user at UserIndex or an
  190.         empty string if UserIndex is out of range.
  191.  
  192.     QueryUserPhone(UserIndex)
  193.  
  194.         Returns the Phone Number of the user at UserIndex or an empty
  195.         string if UserIndex is out of range.
  196.  
  197.     QueryUserLastReadOffset(UserIndex)
  198.  
  199.         Returns the Last Read Offset of the user at UserIndex or an empty
  200.         string if UserIndex is out of range. NOTE: This is an offset
  201.         into the LASTREAD.BBS files for *.MSG areas or the offset into
  202.         the *.SQL files for Squish areas. If you don't understand this
  203.         part of the user record it is best for you to leave it alone.
  204.  
  205.     QueryUserTimeRemaining(UserIndex)
  206.  
  207.         Returns the time remaining for the current call. This is useless
  208.         unless you are working with a LASTUSER.BBS file.
  209.  
  210.     QueryUserPassword(UserIndex)
  211.  
  212.         Returns the Password of the user at UserIndex or an empty string
  213.         if UserIndex is out of range.
  214.  
  215.     QueryUserSystemCalls(UserIndex)
  216.  
  217.         Returns the number of System calls of the user at UserIndex or
  218.         an empty string if UserIndex is out of range.
  219.  
  220.     QueryUserHelpLevel(UserIndex)
  221.  
  222.         Returns one of the four Help Levels; NOVICE, REGULAR, EXPERT or
  223.         HOTFLASH or an empty string if UserIndex is out of range.
  224.  
  225.     QueryUserVideoMode(UserIndex)
  226.  
  227.         Returns one of the three Video Modes; TTY, ANSI or AVATAR or an
  228.         empty string if the UserIndex is out of range.
  229.  
  230.     QueryUserNulls(UserIndex)
  231.  
  232.         Returns the number of Nulls to be transmitted for this user or
  233.         an empty string if UserIndex is out of range.
  234.  
  235.     QueryUserBits(UserIndex)
  236.  
  237.         Returns a string containing the Bits Flag settings or an empty
  238.         string if UserIndex is out of range. The returned string may
  239.         contain one or more of the following separated by commas:
  240.  
  241.             HOTKEYS     If present the user wants to use hotkeys.
  242.  
  243.             NOCHAT      If present the user is NOT available for chat.
  244.  
  245.             FSR         If present the Full Screen Reader will be used
  246.                         when the user is browsing messages.
  247.  
  248.             NERD        If present the sysop bell will not ring when a
  249.                         the user yells.
  250.  
  251.             NOULIST     If present the user will NOT appear in the
  252.                         userlist displayed by Maximus.
  253.  
  254.             TABS        If present Maximus will send tabs rather than
  255.                         expand tabs into spaces before transmission.
  256.  
  257.     QueryUserBits2(UserIndex)
  258.  
  259.         Returns a string containing the Bits2 Flag settings or an empty
  260.         string if UserIndex is out of range. The returned string may
  261.         contain one or more of the following separated by commas:
  262.  
  263.             HACKED      If present the user's last logon attempt was
  264.                         bad.
  265.  
  266.             IBMCHARS    If present the user wants IBM Characters.
  267.  
  268.             BOREDUSER   If present the user gets to edit messages with
  269.                         the BorED line editor.
  270.  
  271.             MORE        If present the user wants the "More?" prompt.
  272.  
  273.             USEDMAX     If present it means that the user account has
  274.                         been configured.
  275.  
  276.             CLS         If present, the appropriate screen clearing code
  277.                         will be sent when Maximus needs to clear the
  278.                         screen.
  279.  
  280.     QueryUserPriviledge(UserIndex)
  281.  
  282.         Returns a string containing the name of the priviledge level of
  283.         the user at UserIndex or an empty string if UserIndex is out of
  284.         range.
  285.  
  286.     QueryUserTimeToday(UserIndex)
  287.  
  288.         Returns the total amount of time the user at UserIndex has been
  289.         online for the day or an empty string if UserIndex is out of
  290.         range.
  291.  
  292.     QueryUserFlags(UserIndex)
  293.  
  294.         Returns the status of the two User Flags for the user at
  295.         UserIndex; DEL or PERM or an empty string if UserIndex is out of
  296.         range.
  297.  
  298.     QueryUserScreen(UserIndex)
  299.  
  300.         Returns the Width and Length of the user at UserIndex or an
  301.         empty string if UserIndex is out of range. The string returned
  302.         will be the Width followed by the length, separated by a comma:
  303.  
  304.         E.G:    80,25
  305.  
  306.     QueryUserCredit(UserIndex)
  307.  
  308.         Returns the Netmail Credits of the user at UserIndex or an
  309.         empty string if UserIndex is out of range.
  310.  
  311.     QueryUserDebit(UserIndex)
  312.  
  313.         Returns the Netmail Debits of the user at UserIndex or an empty
  314.         string if UserIndex is out of range.
  315.  
  316.     QueryUserExpiryInfo(UserIndex)
  317.  
  318.         Returns a string containing the Expiry Information for the user
  319.         at UserIndex or an empty string if UserIndex is out of range.
  320.         The string returned will vary depending the Expiry options set
  321.         for the user. Examples of the most common returns are:
  322.  
  323.             DAYS,<days_left_to_expiry>,NONE
  324.             DAYS,<days_left_to_expiry>,AXE
  325.             DAYS,<days_left_to_expiry>,DEMOTE,<priv_level>
  326.             MINUTES,<mins_left_to_expiry>,NONE
  327.             MINUTES,<mins_left_to_expiry>,AXE
  328.             MINUTES,<mins_left_to_expiry>,DEMOTE,<priv_level>
  329.             NONE,NONE
  330.  
  331.         This string should ALWAYS be parsed from left to right.
  332.  
  333.     QueryUserLastCallDate(UserIndex)
  334.  
  335.         Returns the Last Call Date and Time for the user at UserIndex or
  336.         an empty string if UserIndex is out of range. The string will be
  337.         formatted as "MM-DD-YYYY HH:MM:SS".
  338.  
  339.         E.G:    10-25-1994 12:13:30
  340.  
  341.     QueryUserKeys(UserIndex)
  342.  
  343.         Returns a string containing the keys of the user at UserIndex or
  344.         an empty string if UserIndex is out of range. If the user were
  345.         to have all keys set, the following string would be returned:
  346.  
  347.             12345678ABCDEFGHIJKLMNOPQRSTUVWX
  348.  
  349.     QueryUserLanguage(UserIndex)
  350.  
  351.         Returns the _index_ of the Language for the user at UserIndex or
  352.         an empty string if UserIndex is out of range.
  353.  
  354.     QueryUserProtocol(UserIndex)
  355.  
  356.         Returns the _index_ of the Default Protocol for the user at
  357.         UserIndex or an empty string if UserIndex is out of range.
  358.  
  359.     QueryUserUploads(UserIndex)
  360.  
  361.         Returns the number of k-bytes Uploaded by the user at UserIndex
  362.         or an empty string if UserIndex is out of range.
  363.  
  364.     QueryUserDownloads(UserIndex)
  365.  
  366.         Returns the number of k-bytes Downloaded by the user at
  367.         UserIndex or an empty string if UserIndex is out of range.
  368.  
  369.     QueryUserDownloadsToday(UserIndex)
  370.  
  371.         Returns the number of k-bytes Downloaded on the current day by
  372.         the user at UserIndex or an empty string if UserIndex is out of
  373.         range.
  374.  
  375.     QueryUserLastMessageArea(UserIndex)
  376.  
  377.         Returns the name of the Last Message area for the user at
  378.         UserIndex or an empty string if the UserIndex is out of range.
  379.  
  380.     QueryUserLastFileArea(UserIndex)
  381.  
  382.         Returns the name of the Last File area for the user at
  383.         UserIndex or an empty string if the UserIndex is out of range.
  384.  
  385.     QueryUserCompressor(UserIndex)
  386.  
  387.         Returns the _index_ of the Compressor for the user at UserIndex
  388.         or an empty string if UserIndex is out of range.
  389.  
  390.  
  391.     SetUserName(UserIndex, Name)
  392.  
  393.         Sets the name field of the user record at UserIndex to Name.
  394.  
  395.     SetUserAlias(UserIndex, Alias)
  396.  
  397.         Sets the alias field of the user record at UserIndex to Alias.
  398.  
  399.     SetUserLocation(UserIndex, Location)
  400.  
  401.         Sets the city field of the user record at UserIndex to Location.
  402.  
  403.     SetUserPhone(UserIndex, PhoneNumber)
  404.  
  405.         Sets the phone field of the user record at UserIndex to
  406.         PhoneNumber.
  407.  
  408.     SetUserLastReadOffset(UserIndex, Offset)
  409.  
  410.         Sets the last read offset for the user record at UserIndex to
  411.         Offset. As mentioned earlier, if you don't know what this field
  412.         is used for leave it alone or you will trash the last read
  413.         pointers for the user.
  414.  
  415.     SetUserTimeRemaining(UserIndex, TimeLeft)
  416.  
  417.         Sets the time remaining field for the user at UserIndex to
  418.         TimeLeft. This field is only useful when changing time
  419.         allotments for a LASTUSER.BBS file.
  420.  
  421.         A possible use for modifying this field would be for a time bank
  422.         or other similar application for a user who is online.
  423.  
  424.     SetUserPassword(UserIndex, Password)
  425.  
  426.         Sets the password field for the user at UserIndex to Password.
  427.  
  428.     SetUserSystemCalls(UserIndex, NumberOfCalls)
  429.  
  430.         Sets the system calls field of the user at UserIndex to
  431.         NumberOfCalls.
  432.  
  433.     SetUserHelpLevel(UserIndex, HelpLevel)
  434.  
  435.         Sets the help level field of the user at UserIndex to HelpLevel.
  436.         HelpLevel should contain _one_ of the following strings in all
  437.         uppercase letters:
  438.  
  439.             NOVICE
  440.             REGULAR
  441.             EXPERT
  442.             HOTFLASH
  443.  
  444.     SetUserVideoMode(UserIndex, VMode)
  445.  
  446.         Sets the video mode field for the user at UserIndex to VMode.
  447.         VMode should contain one of the following strings in all
  448.         uppercase letters:
  449.  
  450.             TTY
  451.             ANSI
  452.             AVATAR
  453.  
  454.     SetUserNulls(UserIndex, NumberOfNulls)
  455.  
  456.         Sets the nulls field of the user at UserIndex to NumberOfNulls.
  457.  
  458.     SetUserBits(UserIndex, BitsFlags)
  459.  
  460.         Sets the bits field of the user at UserIndex to BitsFlags.
  461.         BitsFlags is a string containing one or more of the following
  462.         strings in all uppercase letters separated by commas:
  463.  
  464.             HOTKEYS
  465.             NOCHAT
  466.             FSR
  467.             NERD
  468.             NOULIST
  469.             TABS
  470.  
  471.         You must specify ALL the flags you want set for the user, if a
  472.         flag is not present in the string it is NOT set.
  473.  
  474.     SetUserBits2(UserIndex, Bits2Flags)
  475.  
  476.         Sets the bits2 field of the user at UserIndex to BitsFlags.
  477.         BitsFlags is a string containing one or more of the following
  478.         strings in all uppercase letters separated by commas:
  479.  
  480.             HACKED
  481.             IBMCHARS
  482.             BORED
  483.             MORE
  484.             USEDMAX
  485.             CLS
  486.  
  487.         You must specify ALL the flags you want set for the user, if a
  488.         flag is not present in the string it is NOT set.
  489.  
  490.     SetUserPriviledge(UserIndex, PrivLevel)
  491.  
  492.         Sets the priviledge level field of the user at UserIndex to
  493.         PrivLevel. The priviledege level should be ONE of the following
  494.         strings:
  495.  
  496.             TWIT
  497.             DISGRACE
  498.             LIMITED
  499.             NORMAL
  500.             WORTHY
  501.             PRIVIL
  502.             FAVORED
  503.             EXTRA
  504.             CLERK
  505.             ASSTSYSOP
  506.             SYSOP
  507.             HIDDEN
  508.  
  509.     SetUserTimeToday(UserIndex, Minutes)
  510.  
  511.         Sets the time online today field of the user at UserIndex to
  512.         Minutes.
  513.  
  514.     SetUserFlags(UserIndex, Flags)
  515.  
  516.         Sets the user flags field of the user at UserIndex to Flags.
  517.         Flags should be a string containing one or more of the following
  518.         strings separated by commas:
  519.  
  520.             DEL
  521.             PERM
  522.  
  523.         You must specify ALL the flags you want set for the user, if a
  524.         flag is not present in the string it is NOT set.
  525.  
  526.     SetUserScreen(UserIndex, Width, Length)
  527.  
  528.         Sets the screen width and length fields of the user at UserIndex
  529.         to Width and Length.
  530.  
  531.     SetUserCredit(UserIndex, Credits)
  532.  
  533.         Sets the netmail credits of the user at UserIndex to Credits.
  534.  
  535.     SetUserDebit(UserIndex, Debits)
  536.  
  537.         Sets the netmail debits of the user at UserIndex to Debits.
  538.  
  539.     SetUserExpiryInfo(UserIndex, XType, DaysMins, XAction, XPriv)
  540.  
  541.         Sets the expiry information fields of the user at UserIndex
  542.         based on XType, DaysMins, XAction and XPriv. All arguments must
  543.         be present even if they are not needed for the type of expiry
  544.         you want to set with this function.
  545.  
  546.         XType can be ONE of the following:
  547.  
  548.             DAYS
  549.             MINUTES
  550.             NONE
  551.  
  552.         DaysMins depends on XType. See the table below:
  553.  
  554.             XType               DaysMins Setting
  555.             ------------------  ------------------------------
  556.             DAYS                Days to expiry.
  557.             MINUTES             Minutes to expiry.
  558.             NONE                Ignored but MUST be present.
  559.  
  560.         XAction can be ONE of the following:
  561.  
  562.             AXE
  563.             DEMOTE
  564.             NONE
  565.  
  566.         XPriv should be set to a valid priviledge level if XAction is
  567.         set to DEMOTE, for AXE and NONE it doesn't have to contain
  568.         anything useful but it must STILL be present. See:
  569.         SetUserPriviledge() for the valid priviledge level names.
  570.  
  571.     SetUserLastCallDate(UserIndex, Month, Day, Year, Hours, Minutes,
  572.                         Seconds)
  573.  
  574.         Sets the last call date field of the user at UserIndex based on
  575.         the Month, Day, Year, Hours, Minutes and Seconds specified. All
  576.         arguments MUST be present. Year should be a four digit year.
  577.         Hours should be specified in 24 hour format.
  578.  
  579.         NOTE: It is your responsibility to do the range checking on the
  580.         arguments passed to this function. MaxUserREXX does NOT check
  581.         the arguments for valid dates or times.
  582.  
  583.     SetUserKeys(UserIndex, Keys)
  584.  
  585.         Sets the keys field of the user at UserIndex to Keys. Keys
  586.         should be a string containing the letter(s) of the key(s) you
  587.         want set for the user. Each key you want set in the user record
  588.         must be present in the string.
  589.  
  590.     SetUserLanguage(UserIndex, LanguageIndex)
  591.  
  592.         Sets the language index field of the user at UserIndex to
  593.         LanguageIndex.
  594.  
  595.     SetUserProtocol(UserIndex, ProtocolIndex)
  596.  
  597.         Sets the protocol index field of the user at UserIndex to
  598.         ProtocolIndex.
  599.  
  600.     SetUserUploads(UserIndex, UploadKBytes)
  601.  
  602.         Sets the uploaded k-bytes field of the user at UserIndex to
  603.         UploadKBytes.
  604.  
  605.     SetUserDownloads(UserIndex, DownloadKBytes)
  606.  
  607.         Sets the downloaded k-bytes field of the user at UserIndex to
  608.         DownloadKBytes.
  609.  
  610.     SetUserDownloadsToday(UserIndex, DownloadKBytes)
  611.  
  612.         Sets the downloaded today k-bytes field of the user at UserIndex
  613.         to DownloadKBytes.
  614.  
  615.     SetUserLastMessageArea(UserIndex, MessageArea)
  616.  
  617.         Sets the last message area field of the user at UserIndex to
  618.         MessageArea.
  619.  
  620.     SetUserLastFileArea(UserIndex, FileArea)
  621.  
  622.         Sets the last file area field of the user at UserIndex to
  623.         FileArea.
  624.  
  625.     SetUserCompressor(UserIndex, CompressorIndex)
  626.  
  627.         Sets the compressor index field of the user at UserIndex to
  628.         CompressorIndex.
  629.  
  630.    ------------------------------------------------------------------
  631.  
  632.                                ORDER FORM
  633.                             MaxUserREXX v1.0
  634.                             ----------------
  635.  
  636.                        CASH, CHECK or MONEY ORDER
  637.                        --------------------------
  638.  
  639.     Please complete the following information and return this form with
  640.     your check or money order (I will take no responsibility for cash
  641.     sent through the mail) to the address below.  Please make all checks
  642.     and money orders for U.S. funds payable to Craig Morrison.
  643.  
  644.    ------------------------------------------------------------------
  645.  
  646.                           CREDIT CARD ORDERING
  647.                           --------------------
  648.  
  649.     To order using VISA, Mastercard or American Express, fill out this
  650.     form and mail it to the address below. You may also either netmail
  651.     this form to the Fidonet address listed below, or call the BBS
  652.     number listed below and upload the form.
  653.  
  654.     Credit card purchases will be turned around in 24-48 hours.
  655.  
  656.    ------------------------------------------------------------------
  657.  
  658.     <Please Type or Print Clearly>
  659.  
  660.             Name: __________________________________________________
  661.  
  662.          Company: __________________________________________________
  663.  
  664.          Address: __________________________________________________
  665.  
  666.                   __________________________________________________
  667.  
  668.             City: _____________________  St or Prov: _______________
  669.  
  670.      Postal Code: ________________  Country: _______________________
  671.  
  672.     Phone Number: __________________________________________________
  673.  
  674.  Fidonet Address: __________________________________________________
  675.  
  676. Internet Address: __________________________________________________
  677.  
  678.             Date: ___-___-______
  679.  
  680.  
  681.     I would like to purchase:
  682.                                                                Totals
  683.  
  684. ____ MaxUserREXX Developer's License @ 48.00:               $___________
  685.      (Source code included)
  686.  
  687. ____ Copy(s) of MaxUserREXX @ 10.00 per copy:               $___________
  688.      (1-5 copies)
  689.  
  690. ____ Copy(s) of MaxUserREXX @  8.00 per copy:               $___________
  691.      (6-10 copies and source code)
  692.  
  693. ____ Copy(s) of MaxUserREXX @  7.00 per copy:               $___________
  694.      (11-20 copies and source code)
  695.  
  696. ____ Copy(s) of MaxUserREXX @  6.00 per copy:               $___________
  697.      (21-40 copies and source code)
  698.  
  699. ____ Copy(s) of MaxUserREXX @  4.00 per copy:               $___________
  700.      (41+ copies and source code)
  701.  
  702.  
  703. ____ I am including a check or money order for:              ___________
  704.  
  705. ____ Please charge this purchase to my:
  706.  
  707.         [ ] VISA
  708.         [ ] Mastercard
  709.         [ ] American Express
  710.  
  711.      In the amount of:                                       ___________
  712.  
  713.      Card Number:             _______________________________
  714.  
  715.      Card Expiration Date:    ____/____
  716.  
  717.      Signature (required):    _______________________________
  718.      (Or name as it appears on card for mail orders.)
  719.  
  720.     ------------------------------------------------------------------
  721.  
  722.     <Optional information>
  723.  
  724.     Kind of Work You Do:
  725.             < > Programming      < > CAD/CAM         < > Engineering
  726.             < > Accounting       < > Word Processing
  727.             < > Other (Please Specify) _____________________________
  728.  
  729.  
  730.     Where did you first hear about MaxUserREXX? ____________________
  731.  
  732.     ________________________________________________________________
  733.  
  734.     Where did you find this product: _______________________________
  735.  
  736.     Comments/Suggestions about this product:
  737.  
  738.     _________________________________________________________________
  739.  
  740.     _________________________________________________________________
  741.  
  742.     _________________________________________________________________
  743.  
  744.     _________________________________________________________________
  745.  
  746.     _________________________________________________________________
  747.  
  748.  
  749.  
  750.    ------------------------------------------------------------------
  751.  
  752.     Please remit to:
  753.  
  754.     Fidonet:   Craig Morrison, 1:201/60@fidonet.org
  755.     Internet:  Craig Morrison, cam@wpc.cioe.com
  756.     BBS:       Workplace Connection, (317) 742-2680
  757.     SnailMail: Craig Morrison
  758.                1316 Ferry St.
  759.                Lafayette, IN 47901-1533
  760.                USA
  761.  
  762.  
  763.