'}"> '}"> ################################################################### # Message Board Version 1.0 # # Developed by Michael Sussna # # Created 12/11/97 Last Modified 10/22/98 # # Based on WWWBoard # # Copyright 1996 Matt Wright mattw@worldwidemart.com # # Scripts Archive at: http://www.worldwidemart.com/scripts/ # ############################################################################## # WWWBoard COPYRIGHT NOTICE # # Copyright 1996 Matthew M. Wright All Rights Reserved. # # # # WWWBoard may be used and modified free of charge by anyone so long as # # this copyright notice and the comments above remain intact. By using this # # code you agree to indemnify Matthew M. Wright from any liability that # # might arise from it's use. # # # # Selling the code for this program without prior written consent is # # expressly forbidden. In other words, please ask first before you try and # # make money off of my program. # # # # Obtain permission before redistributing this software over the Internet or # # in any other medium. In all cases copyright and header must remain intact.# ################################################################## Define Variables This is a special self number in the database: Increment for creating self and parent numbers: ########################################################### ########################################################### MAIN PROCESSING END OF MAIN PROCESSING Done til input errors fixed 1st time in No title yet, but don't care. If we just came from ShowProvideIdentity The name of the msgboard is what immediately precedes ".mv" in the document URL, but parsing depends on whether the URL is an NSAPI or CGI URL. The user must give each message board Miva doc a unique name, e.g. msgboard1.mv, msgboard2.mv, etc. Each message board will have a separate subdirectory under mivadata. The subdirectory will be named with the unique message board name, e.g. msgboard1. The path to the database files, etc. will be based on the message board name, e.g. mivadata/msgboard1/msgboard.dbf. If CGI, URL looks like either .../cgi-bin/miva?xxx.mv+ or .../cgi-bin/miva?zzz/xxx.mv+ where zzz is the path within the Documents directory (so could have >1 slash). If NSAPI, URL looks like either ...xxx.mv? or ...zzz/xxx.mv? where zzz is the path within the Documents directory (so could have >1 slash). path name path name path name path name short name &[title]; ]'}"> Message Board ]'}"> Post Message ]'}"> Search ]'}"> FAQ ]'}"> Importing a single big field and parsing it into data fields takes one second. Importing the fields individually takes several seconds. Figure out the date and time of the entry, accounting for the different time zones. The "time_zone" field is set in admin. If daylight savings add one hour Get rid of any newlines This subroutine should be physically before any calls to it. That's because of the following scenario. Yumlaut, which is ascii 255, means end of file to Miva. If it is encountered at any point by a Miva script, the script terminates immediately, whether that is the desired action or not. Suppose there *is* a yumlaut in an input field. Suppose also that we think we're prepared for this and we call this Remove function before we try to use the field for anything. If the code for the function is physically after the call and the usage of the input field, the function is not found and the script crashes. Because the function is not found, the yumlaut in the input field is not removed. The usage of the field thus still has the yumlaut. This causes immediate termination of the script at that point. This in turn causes the code following that point to not be seen, including this Remove function. Thus the function is not found. The script crashes because it has a function that doesn't have a . This is due to the false end of file, which causes the function within which the input field is used to end right away, before any more code is seen, including its . Doesn't include post form 1st record, super-root not visible yet. Find main posting to start page with. First time in, no direction specified. First time in, start at top of database, else at current pagetop. Find record number of root that will start page. Determine which scrolling options make sense, if any. Starting value of roots_displayed_count > 0 since displaying partial page. Almost empty database Find record number of root that will start page, whether 1st search or search for next match. For 1st search, starting_root s/b zero. Get root count from super_root's parent field. First go forward to find starting point. Start backward from there and look for match. Back up 1 from curr rec so don't match on it again. If we're at beginning of index, i.e. recno 1, stop. &[ON];&[header];

&[title];

&[crlf];&[OFF]; &[ON];
Match not found.

&[crlf];&[OFF]; &[ON];
Match found:

&[crlf];&[OFF];
Each posting which is not a followup is the root of a tree of postings. To tie all of these roots together, we use an artificial posting called the super-root. It forms the root of a tree or hierarchy. Its children are the original roots. Their children, if any, are their followups. To display the overall hierarchy of postings in most-recent-first sequence, we traverse the overall tree recursively. To do so, we start at the super-root and print its "followups" (postings which are *not* followups). While processing a posting, we print *its* followups, etc., recursively traversing the hierarchy of postings and followups in most-recent-first sequence. Additionally, we don't just print the whole database. We only print a limited number of postings at a time. Other postings can be viewed by "scrolling" forward or backward in time. A practical way to limit the amount of material to display at a time is to pick a fixed number of roots to display postings for. This prevents us from cutting off a set of related postings under one root. Rather, we finish the set of postings related to a root. So, the exact number of postings per page will fluctuate, though the number of *roots* is fixed. The scrolling amount can be set in the administration function of the message board. The amount is called "roots_to_view". &[ON]
&[OFF] Start recursion The following example should help one visualize this processing. Suppose the messsage board has 10 postings so far, numbered 1 to 10, the oldest being 1. There would 11 records in the database, the eleventh being the super-root. Suppose the posting structure should print out like this: 4 10 5 8 9 6 7 3 1 2 The records are in exactly this hierarchical and most-recent-first sequence within the database because the index used here is decreasing sequence number. Sequence number for a posting is midway between the preceding and following postings' sequence numbers. This speeds up displaying the list as it looks above. Start at beginning of database, or at starting point if scrolling, according to index 1 (sequence number). 1st record, super-root not visible yet. &[ON]&[indent_string];
  • &[OFF] &[ON];&[OFF]; &[ON];&[OFF]; &[ON];&[dbsubject]; - &[dbname1];  &[crlf];&[OFF]; &[ON];&[print_date]; (&[dbnumdesc];)&[crlf];&[OFF]; &[ON]&[unindent_string];
  • &[OFF]
    If first page, no previous button. If last page, no next button. Except when we're first coming in to message board, and it's page 1, starting root in url reflects page we're coming *from*, not page we're on. &[ON];
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    &[OFF]; &[ON];&[banner_ad];&[footer];&[crlf];&[OFF];
    &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[general_data_area];&[crlf];&[OFF]; &[title2]; ]'}"> Followups ] ' $ '[ Post Followup ] '}"> Omit faq link if not to be shown If visitor's IP in unwelcome list, go no further. Use &[REMOTE_ADDR];. Import unwelcome list file, check for match. Remove any anchors from subject, since it goes in an anchor on main page. Copy part of subject following last anchor, if any. Replace subject with anchor-free version. The following will change as we ascend to super_root. Find parent quickly via selfnum index. Visit the posting immediately after the new posting, and set up the new posting's sequence number. Then visit each posting from the new posting's parent back up to the root which is the ancestor of the new posting. Increment each *ancestor*'s number of descendents, including the root's. Then travel *forward* from the root to the parent again, incrementing each posting's sequence number except for the root's. We have to do the sequence number incrementing in the forward direction to avoid generating temporarily duplicate sequence numbers, which would throw off the index. Read record after insert point. Set up sequence number for new posting. Update root. We're at root. If adding a root, assign new root's sequence number, and update super root's root count and sequence number. Create database record for the new posting. Create a file for the message text Get hidden field data from database. &[ON];&[header];

    &[subject];

    &[crlf];&[OFF];
    &[ON];
    Posted by&[crlf];&[OFF]; &[ON];&[name]; on &[longdate]; from &[ipaddr];:

    &[crlf];&[OFF]; &[ON];&[name]; on &[longdate]; from &[ipaddr];:

    &[crlf];&[OFF]; &[ON];In Reply to: &[origsubject]; posted by&[crlf];&[OFF]; &[ON];&[origname]; on &[origdate];:

    &[crlf];&[OFF]; &[ON];&[origname]; on &[origdate];:

    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];&[body];&[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF];
    &[ON];

    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON]
    &[OFF] &[ON];

    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    Name:
    E-Mail:
    Subject:&[crlf];&[OFF]; &[ON];
    Subject:&[crlf];&[OFF]; &[ON];
    Subject:&[subject];
    Subject:Re: &[subject];
    Subject:
    Subject:
    Subject:
    Comments:&[crlf];&[OFF]; If requested, add lines of the message to the reply comment area, preceded by colons. Produce one line until a
    , newline, or

    tag is seen. If it's a

    , also produce a blank line. Before processing body text to be quoted, convert any longforms of characters (i.e. < for <, > for >, and " for ") to shortform, then reconvert when ready to display. Too big to fit with : Too big to fit with : Too big to fit with : Too big to fit with : Too big to fit with : Too big to fit with : &[ON];

    Optional Link URL:
    Link Title:
    Optional Image URL:
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];

    &[banner_ad];&[footer];&[crlf];&[OFF]; &[ON];&[header];&[crlf];&[OFF]; &[ON];

    Message Verify: &[subject];

    &[crlf];&[OFF]; &[ON];
      Please verify this posting content before it is posted.

      &[crlf];&[OFF]; &[ON];Name: &[name];
      &[crlf];&[OFF]; &[ON];E-Mail: &[email];
      &[crlf];&[OFF]; &[ON];Subject: &[subject];
      &[crlf];&[OFF]; &[ON];Body of Message:

      &[crlf];&[OFF]; &[ON];&[body];

    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];

    Use Your Browser's [Back]; Button To Make Changes
    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];&[banner_ad];&[footer];&[crlf];&[OFF]; &[ON];&[header];&[crlf];&[OFF]; &[ON];

    Message Verify: &[subject];

    &[crlf];&[OFF]; &[ON];
      Please verify this followup content before it is posted.

      &[crlf];&[OFF]; &[ON];Name: &[name];
      &[crlf];&[OFF]; &[ON];E-Mail: &[email];
      &[crlf];&[OFF]; &[ON];Subject: &[subject];
      &[crlf];&[OFF]; &[ON];Body of Message:

      &[crlf];&[OFF]; &[ON];&[body];

    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];


    &[crlf];&[OFF]; &[ON];

    Use Your Browser's [Back]; Button To Make Changes
    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];&[banner_ad];&[footer];&[crlf];&[OFF];
    bread crumb...macros choke on tags in their data, thus convert and reconvert without macroing the raw data. &[ON];
    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; Allow URL's to be up to db field size, tho input box only looks 60 wide. &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    Name:
    E-Mail:
    Subject:
    Message:
    Optional Link URL:
    Link Title:
    Optional Image URL:
    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON]; &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[banner_ad];&[footer];&[crlf];&[OFF];
    &[ON];&[header];

    Post A Message!

    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[title]; Search&[crlf];&[OFF]; &[ON];&[header];&[crlf];&[OFF]; &[ON];

    &[title]; Search

    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];Choose the type(s) of information to search by. One or more may be selected.

    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    Search subject?
    Use start date?
    Use end date?
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    Find subject containing:&[crlf];&[OFF]; &[ON];
    Start date:&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    End date:&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];
    No search criteria were specified.
    &[crlf];&[OFF]; &[ON];
    Invalid search criteria were specified.
    &[crlf];&[OFF];
    &[ON];&[crlf];&[OFF]; &[ON];&[banner_ad];&[footer];&[crlf];&[OFF];
    &[ON];&[banner_ad];&[footer];&[crlf];&[OFF]; &[ON];&[header];&[crlf];&[OFF]; &[ON];

    Frequently Asked Questions

    &[crlf];&[OFF]; &[ON];
      Here is a brief explanation of some of the questions you may&[crlf];&[OFF]; &[ON];have about the &[title];.
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];
    Can I use html tags anywhere in my posts?
    &[crlf];&[OFF]; &[ON];
    No. You can not use HTML tags in any field except the subject or body of&[crlf];&[OFF]; &[ON];the message. The maintainer of the script has the option of&[crlf];&[OFF]; &[ON];allowing or disallowing any HTML in these two parts of your&[crlf];&[OFF]; &[ON];posting. If they disallow it, the script will just display the tags but&[crlf];&[OFF]; &[ON];not "execute" them. If they allow it, your html markup will&[crlf];&[OFF]; &[ON];appear in the posting and actually be used.
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF];
    &[ON];
    Why are there colons in the message when I&[crlf];&[OFF]; &[ON];try to post a followup?
    &[crlf];&[OFF]; &[ON];
    Colons appear in the message dialog box when you try to&[crlf];&[OFF]; &[ON];followup up on a message to indicate that those lines are quoting&[crlf];&[OFF]; &[ON];the previous document. The owner of the &[title]; can decide&[crlf];&[OFF]; &[ON];whether they wish to enable or disable the quoting of previous&[crlf];&[OFF]; &[ON];messages.
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF];
    &[ON];
    Why didn't my post show up?
    &[crlf];&[OFF]; &[ON];
    Your post most likely did not show up because your browser&[crlf];&[OFF]; &[ON];did not reload the page, it simply pulled it out of cache. Please&[crlf];&[OFF]; &[ON];reload your browser and it should then appear.
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF];
    &[ON];
    Where can I get the script for this program?
    &[crlf];&[OFF]; &[ON];
    The script is written in Miva and was created by Simple|Net.&[crlf];&[OFF]; &[ON];Enjoy!
    &[crlf];&[OFF];
    &[ON];&[header];&[crlf];&[OFF]; &[ON];

    Message Added: &[subject];

    &[crlf];&[OFF]; &[ON];
      The following information was added to the &[title];:

    &[crlf];&[OFF]; &[ON];

      Name: &[name];
      &[crlf];&[OFF]; &[ON]; E-Mail: &[email];
      &[crlf];&[OFF]; &[ON]; Subject: &[subject];
      &[crlf];&[OFF]; &[ON]; Body of Message:

      &[crlf];&[OFF]; &[ON];&[body];

      &[crlf];&[OFF]; &[ON];Link: &[message_url_title];
      &[crlf];&[OFF];
      &[ON];Image:
      &[crlf];&[OFF];
      &[ON];Added on Date: &[print_date];

    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];[ &[crlf];&[OFF]; &[ON];[ &[crlf];&[OFF]; &[ON];Go to Your Message ]
    &[crlf];&[OFF]; &[ON];&[banner_ad];&[footer];&[crlf];&[OFF];
    &[ON];&[header];&[crlf];&[OFF]; &[ON];

    ERROR: No Name

    &[crlf];&[OFF]; &[ON];

    You forgot to fill in the 'Name' field in your posting.&[crlf];&[OFF]; &[ON];Correct it below and re-submit. The necessary fields are: Name, Subject, and Message.&[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];&[header];&[crlf];&[OFF]; &[ON];

    ERROR: Illegal Character in Name

    &[crlf];&[OFF]; &[ON];

    You have used a character that is not allowed in the 'Name' field.&[crlf];&[OFF]; &[ON];Only letters, numbers, blanks, and underscores are allowed.&[crlf];&[OFF]; &[ON];Correct it below and re-submit.&[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];&[header];&[crlf];&[OFF]; &[ON];

    ERROR: No Subject

    &[crlf];&[OFF]; &[ON];

    You forgot to fill in the 'Subject' field in your posting.&[crlf];&[OFF]; &[ON];Correct it below and re-submit. The necessary fields are: Name, Subject, and Message.&[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];&[header];&[crlf];&[OFF]; &[ON];

    ERROR: Subject Links Ignored

    &[crlf];&[OFF]; &[ON];

    Links are ignored in the 'Subject' field.&[crlf];&[OFF]; &[ON];Your posting contains nothing but a link.&[crlf];&[OFF]; &[ON];Correct it below and re-submit.&[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];&[header];&[crlf];&[OFF]; &[ON];

    ERROR: No Message

    &[crlf];&[OFF]; &[ON];

    You forgot to fill in the 'Message' field in your posting.&[crlf];&[OFF]; &[ON];Correct it below and re-submit. The necessary fields are: Name, Subject, and Message.&[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];&[header];&[crlf];&[OFF]; &[ON];

    ERROR: Not Accepting Postings

    &[crlf];&[OFF]; &[ON];

    Sorry, we are currently&[crlf];&[OFF]; &[ON]; not accepting postings from IP address &[REMOTE_ADDR];.
    &[crlf];&[OFF]; &[ON];If you feel that this is in error, please&[crlf];&[OFF]; &[ON]; contact the board administrator.&[crlf];&[OFF]; &[ON];

    &[crlf];&[OFF]; &[ON];ERROR! Undefined.&[crlf];&[OFF];
    ###################################################################### # Convert tags to long form. E.g. becomes <xxx> # # # # This is necessary because Internet Explorer won't display textareas with # # their HTML intact, but rather "executes" it as HTML. So we have to convert # # HTML to harmless display form for display, and then back to active form # # when receiving the textarea as submitted in a form for storage and actual use.# # # ##################################################################### ###################################################################### # Convert tags to short form. E.g. <xxx> becomes # # # # This is necessary because Internet Explorer won't display textareas with # # their HTML intact, but rather "executes" it as HTML. So we have to convert # # HTML to harmless display form for display, and then back to active form # # when receiving the textarea as submitted in a form for storage and actual use.# # # ##################################################################### &[ON];
    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON];&[crlf];&[OFF]; &[ON]; &[ON];&[crlf];&[OFF]; &[ON];
    Name:
    E-Mail:
    Subject:&[form_subject];&[crlf];&[OFF]; &[ON];
    Subject:
    Message:&[crlf];&[OFF]; &[ON];
    Optional Link URL:
    Link Title:
    Optional Image URL:
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];
    &[crlf];&[OFF]; &[ON];&[banner_ad];&[footer];&[crlf];&[OFF];