0.90a
o   Bug fixes
    * adduser option in channel popup menu is fixed
    * fixed server window creation error if user moved pirch to a new dir and
      used old ini's that directed pirch to load aliases from a non-existant directory
    * fixed an 'invalid image size' message when toggling between icons on the
      tool bar and text only
    * fixed a problem with the events ini not flushing and windows failing to write to it
      during fast event modification saves
    * Fixed a minor problem with idents in address masks

o   Added video server to the Tools menu

o   Allowing radiobuttons/checkboxes in pil to have background colors now

o   Nickname fillin now complete type partial nickname (even first letter & press
    tab to fill in the nick)

o   Fixed a weird error on NT4 that showed empty network list & access violation

o   Fixed the Add server function from the /links window for the new network/server list

o   Added a number of things to the help files including video help and color help.



0.90
o   Reorganized this file so newest version changes are on top

o   DDE API
    This is just a brief description, for more complete documentation see the help file.
    PIRCH implements a DDE (Dynamic Data Exchange) server which can be used to
    execute commands and share information between some DDE Client application
    and an instance of PIRCH. Because PIRCH allows multiple connections it is
    useful to be able to distinguish between multiple connections and to this end
    every PIRCH server window is defined by a DDETag. The DDETag is automatically
    generated by PIRCH and starts with one (1) and increments for wach successive
    server window created. You can set specific DDETags for a server window with
    /SET DDETAG <tag>


    DDE Server Topics

	Topic: IRC_COMMAND
	Transaction Type: XTYP_POKE
	Item (Arguments): ddetag,windowname
	Data: /COMMAND [parameter..[parameter..]]
        Description: Excutes a PIRCH command (or alias) just as if you had typed it from the command
        line of the specified window. DDETAG is the connection identifier, or may be "active"
        (without the quote marks) to indicate the currently active window.

	Topic: IRC_CHANNELS
	Transaction Type: XTYP_REQUEST
	Item (Arguments): ddetag
        Description: Returns a list of channels, each channel seperated by a single space.
        DDETAG is the connection identifier, or may be "active" (without the quote marks) to indicate
        the currently active window.

	Topic: IRC_CONNECTED
	Transaction Type: XTYP_REQUEST
	Item (Arguments): ddetag
        Description: Returns current connection status. DDETAG is the connection identifier, or may
        be "active" (without the quote marks) to indicate the currently active window.

	Topic: IRC_EXENAME
	Transaction Type: XTYP_REQUEST
	Item (Arguments): none
	Description: Returns this instance of PIRCH's exe name

	Topic: IRC_LISTTAGS
	Transaction Type: XTYP_REQUEST
	Item (Arguments): none
        Description: Returns a list of of server window DDE tags which are currently active.
        This function is typically used by a DDE client application the desires to be multi-connection
        aware and wants the list of available ddetags.

	Topic: IRC_MEMBERS
	Transaction Type: XTYP_REQUEST
	Item (Arguments): ddetag,#channel
        Description: Returns list of channel members for the connection and channel name. DDETAG
        is the connection identifier, or may be "active" (without the quote marks) to indicate the
        currently active window. Channel is the channel name for which the member list is requested.
        PIRCH must be joined into the otherwise the return string will be empty.

	Topic: IRC_NICKNAME
	Transaction Type: XTYP_REQUEST
	Item (Arguments): ddetag
        Description: Returns your nickname for the IRC connection. DDETAG is the connection identifier,
        or may be "active" (without the quote marks) to indicate the currently active window.

	Topic: IRC_PROFILE
	Transaction Type: XTYP_REQUEST
	Item (Arguments): ddetag
        Description: Returns the name of the currently active profile (primary ini file). DDETAG is the
        connection identifier, or may be "active" (without the quote marks) to indicate the currently
        active window.

	Topic: IRC_TAGINFO
	Transaction Type: XTYP_REQUEST
	Item (Arguments): ddetag
        Description: Returns information about WindowID. DDETAG is the connection
        identifier, or may be "active" (without the quote marks) to indicate the currently active window.
        The return data is in the format of  "servername,nickname,usermode,networkid"

DDE Server Topics

       /DDEPOKE <service> <topic> <item> [data]
       Performs a DDE transaction of XTYP_POKE to the topic and service

DDE Variables
       $dde <service> <topic> <item> [data]
       Performs a DDE transaction of XTYP_Request


    See the help file under the DDE topic for more detailed information

o   Implemented more effcient memory storage for aliases and events when running multiple
    connections using identical profiles

o   Rewrote the /SET command processing. Improved speed.

o   Alias and Event Management rewrites
    Much of the internal management mechanisms for alias and events have been designed.
    While for the most part the alias & event editors are visually and functionally
    the same as 0.85, these changes where required. The changes will primarily affect
    advanced users running multiple connections or PIRCH bots.

    * Rewrote a section of the internal alias manager to handle larger alias stores
      using much less memory when multiple connections are active. PIRCH now maintains
      an 'alias pool' so that an instance of an alias file is only loaded once regardless
      of how many connections use that alias file. You can still run multiple connections
      with different profiles that use different alias files as well.

    * Rewrote most of the internal event editing system. Memory and resource usage reduced.
      You can now 'cancel' changes made to events, including level addition/deletions.
      Events window now also has 'save', 'save as', 'load' buttons.
      Each server connection profile may now have its own set of events.
      PIRCH also maintains an 'events pool' so that an instance of an events file is only
      loaded once regardless of how many connections use that events file.
      Event files are now backed up automatically with the extension .bak

    Keep in mind when multiple connections use the same primary profile (ini file) and
    you load a new alias/events file or do a 'save as', then all connections that use that
    profile will also recognize the change and use the same alias/event file.


o   Rewrote most of the popmenu editing system. Can now load popup.irc files
    on an individual bases per menu. Memory and resource usage also reduced.

o   Save command in connect dialog will now copy all profile options from the
    original profile to the target profile rather than only the primary settings
    when you supply a different filename.

o   Seperate Popup menu section added for private message windows/dcc windows

o   Added support for multiple sound directories. PIRCH will now search any
    subdirectories below the PIRCH sound path you enter in the options | prefs | media
    field.

o   Destination parameter ( # ) is now available for CTCP's.

o   Quite a few interface changes.

    o Graphical icons on the toolbar.

    o Toolbar may be set to display either text only, icons only or icons & text
      (This option is set via the Options | Desktop options menu selection)

    o Added an activity animation to the upper right corner of the toolbar
      (Note to beta testers - animation itself doesnt do much but planned functionality
       is planned for it to retrieve various types of information via /fetch such as
       server list updates, lists of live scheduled chat events, program updates etc
       Sort of like /fetching in #pirch but being in the channel will not be required
       comments? suggestions? snide remarks?)

o   Added DCC Chat button to the main Toolbar

o   Ban modes using the ident field will now wildcard an unidented user id (replaces
    the ~ character) or prefixes an idented userid with the * wildcard.

o   Channel list display is disabled on startup (this a planned option)

o   All new Favorites window with folder groups for various channel types. This also
    eliminated a bug in the channel folder.

o   All new server list window. List divided by network making organizing your
    server list easier.

o   Server windows now contain drop downs for network and server. Server drop down will
    show only servers for the selected network making finding a desired server
    accross networks easier.

o   Server entries may now contain a series of port numbers, each seperated by a comma.
    On a failed connect to a given port, PIRCH will try alternate port numbers
    in sequential order until there are no more alternate ports remaining at which
    point it will stop the connection attempt to the particular server.

o   Fixed the toolbar button text display when button color is set to black.
    (Text was also black making text invisible)

o   DCC logs now saved as nick.dcc

o   PIL Fixes

    * Fixed problem with radiobuttons & checkboxes for retrieving checked/selected value
      Usage
            checked := GetWindowAttr(ControlId,8)


    * DestroyWindow() now works properly freeing used resources

    * Now allow click events for Panels

    * Binary compiled PIL script images are now decached if you delete the script
      source code from the alias window

o   Fixed PIL bug where sometimes the command line parameters would get lost
    Workaround for 0.85... seems the problem had to do with the actual number
    of parameters passed to the script on the first run... if successive calls to the
    compiled script contain more parameters than the first one... then the extras
    would be blank. To avoid this... pass dummy parameters as place holders in the
    first call. ***NOTE*** This is a work around for 0.85 only... the problem does
    NOT exist in 0.90.

o   /SET additions

        /SET CLIPTEXT <data>
        Places the text (data) on the system clipboard. See also $cliptext

    *   /SET IDENTD ON|OFF [USERID] [-Q]
        Enables or disables PIRCH's identd server ON or OFF are required parameters.
        If USERID is provided it will be the new ident that the server provides to
        querying clients. -Q may be used to suppress PIRCH's standard state reporting.
        See also $identd

        /SET EDITOR <drive:\path\editor.exe>
        Set the default editor program used for displaying log files and the text documents
        in the help menu. See also $editor

        /SET GETPATH <drive:\path>
        Sets the DCC Download directory. See also $getpath

        /SET SENDPATH <drive:\path>
        Sets the DCC Upload Directory. See also $sendpath

        /SET DCCEOLM <eolm codes>
        Sets the DCC EOLM (End Of Line Marker) characters used in DCC CHATs
        Default EOLM is set to ascii characters 13 10
        This command can only be called from an alias such as /set DCCEOLM \-13 \-10
        Valid EOLMs can only contain the ascii characters 10 and 13, must be of a length >0
        and <= 2.

        /SET DDETAG <tag>
        Set the DDE connection identifier for a server window

        /SET PROTECT <on|off>
        Enables/disables the protect list

        PIRCHs default EOLM as far as I am aware works properly with all dcc chat capable clients
        and bot systems but on IRCII the extraneous ascii 13 appears as a box. Changing the EOLM
        may render your client incapable of DCC chatting certain systems properly.

        /SET TITLE <title text>
        Adds the title text to the caption to PIRCH's main window. See also $title

        /DCC VIDEO <nickname>
        This command only works if you have PIRCHVDO video server. Use it to allow someone else to view
        your video stream. PIRCHVDO only supports single streams right now. Will have the multi-cast
        enabled in the next version.

o   New commands
        /COMPILE <scriptname>
             This command forces a compile of the script. The script is then stored in the
             script cache.

        /DDEPOKE <service> <topic> <item> [data]
             Performs a DDE transaction of XTYP_POKE to the topic and service

        /EXECUTE [-eop] <path | drive:\path\filename.ext>
             /EXECUTE is similar to the /run command in that it can be used to run
             an executable file, however can also be to launch document files according to
             association rules setup within the shell. You can also pass a path to this command
             to open an explorer window.

                Optional parameters
                   P : print mode - the document instead of opening it
                   E : Explorer mode - only when you use a path
                   O : Open mode - (open the file) This is the default mode

             (if you have installed MS Internet explorer and url have been registered with the
              system you can /execute http://www.someaddress/ to have the url loaded. Not sure if
              this works with all browsers, if not you can still use the /loadurl command }


        /CLEARCACHE [scriptname]
             This command clears the script cache. If the optional scriptname parameter is
             supplied only the specified script is decached, otherwise the entire cache is
             cleared.

        /SAVE
             Saves the profile options (basically all options in the Options | prefs Dialog)
             Many of these items can be change with / commands so can be useful to have these
             options saved with /save in scripts.

        /TRIGGER <[ON] event> <channel> <nickname> <address> <extravariables> <message>
             Undocumented at present time

        /LOADURL <url>
             Loads the url specified in your web browser. If your web browser is not currently
             running it will be loaded.

        /QUOTE <command> [[:]<parameters>]
             Same as /verbose   (internal alias for the sake of standards)
             See RFC 1459 for verbose server commands

        /WHEREIS [> windowname] [-FQS] [(drive:\path\)filemask]
             This command searches a directory for a file or filemask including any subdirectories
             below the path specified.

             Example :   /whereis -F c:\pirchutl.ini
                         (Searches entire drive C for pirchutl.ini and reports the location of it
                          and stops searching as soon as a match is found)

             Optional parameters
                      F : Stop search after first found match
                      Q : Quiet mode, only reports found files
                      S : Do not search subdirectories

        /DESCRIBE <nick|channel> <message>
             Used to send a ctcp action to a specified window.


o   New Alias/PIL Variables

        Name                   Description
        $activeurl             URL address of the page currently displayed in your web browser
        $activeurltitle        Page title of active page currently displayed in your web browser
        $activeurlpage         Combination of the above in the format $activeurl - $activeurltitle
        $audience              Returns the audience for window, same as # (new for aliases, existed in PIL)
        $cliptext              Text on the clipboard  (safety limit of 512 chars)  (can be set with /set cliptext)
        $dccgetpath            Default dcc download directory (new for aliases, existed in PIL)
        $dccsendpath           Default dcc upload directory (new for aliases, existed in PIL)
        $dde                   DDE PsuedoVariable which preforms a DEE transaction of XTY_REQUEST
        $identd                Ident daemon userid for yourself
        $logpath               Default log directory (new for aliases, existed in PIL)
        $soundpath             Default sound directory name  (new for aliases, existed in PIL)
        $usermode              Returns a string containing personal mode flags for Invisible, Wallops, Server messages


        *** the $activeurlxxx variables are dde activation variables that comminicate with your web browser
            If the browser is not currently loaded when the variables are used, they will open it


o   PIL Additions

    Added the following classes to the gui PIL window classes
          Ordinal       Description
          14            Image class - capable of loading, displaying & saving bitmaps (.bmp),
                                      metafiles (.wmf) and icons (.ico)

    function AddressMask(Address : string; MaskMode : value) : string;
         Converts an Address to a address mask according to the maskmode as
         follows:
                 0 = User                 nick!ident@port.server
                 1 = IdentPortServer      *!ident@port.server
                 2 = IdentServer          *!ident@*.server
                 3 = PortServer           *!*@port.server
                 4 = NickOnly             nick!*@*
                 5 = serverOnly           *!*@*.server

    procedure DDEPoke(service,topic,item,Data : string);
         Performs a DDE transaction of XTYP_POKE to the topic and service

    function DDERequest(service,topic,item : string) : string;
         Performs a DDE transaction of XTYP_REQUEST to the topic and service

    function IpToLongIp(IpAddress : string) : string;
         Converts a dotted decimal IP (internet protocol) address to
         double word form in network byte order. ie 206.9.80.39 to 3456716839.
         Return value is in string form

    function LongIpToIp(LongIp : string) : string;
         Converts a long IP double word form address to a dotted decimal IP
         (internet protocol) address  ie  3456716839 to 206.9.80.39

    function UserLevel(Userid : string; Channel : string) : string;
         Finds the events user level of a user for a channel
         UserId should be in the form of nickname!ident@host

    function UnixTimeToStr(Format: string; UnixTime: Value): string;
         UnixTimeToStr formats the date and time value given by UnixTime
         using the format given by Format. Format specifiers are case insensitive.
         If the string given by the Format parameter is empty, the date and time
         value is formatted as if a 'c' format specifier had been given.
         The following formatting specifiers are supported:

         Specifier   Displays
         c	     Displays the date using the format given by the ShortDateFormat global variable, followed by the time using the format given by the LongTimeFormat global variable. The time is not displayed if the fractional part of the DateTime value is zero.
         d	     Displays the day as a number without a leading zero (1-31).
         dd	     Displays the day as a number with a leading zero (01-31).
         ddd	     Displays the day as an abbreviation (Sun-Sat)
         dddd	     Displays the day as a full name (Sunday-Saturday)
         ddddd	     Displays the date using standard Short Date Format
         dddddd	     Displays the date using standard Long Date Format
         m	     Displays the month as a number without a leading zero (1-12). If the m specifier immediately follows an h or hh specifier, the minute rather than the month is displayed.
         mm	     Displays the month as a number with a leading zero (01-12). If the mm specifier immediately follows an h or hh specifier, the minute rather than the month is displayed.
         mmm	     Displays the month as an abbreviation (Jan-Dec)
         mmmm	     Displays the month as a full name (January-December)
         yy	     Displays the year as a two-digit number (00-99).
         yyyy	     Displays the year as a four-digit number (0000-9999).
         h	     Displays the hour without a leading zero (0-23).
         hh	     Displays the hour with a leading zero (00-23).
         n	     Displays the minute without a leading zero (0-59).
         nn	     Displays the minute with a leading zero (00-59).
         s	     Displays the second without a leading zero (0-59).
         ss	     Displays the second with a leading zero (00-59).
         t	     Displays the time using standard Short Time Format
         tt	     Displays the time using standard Long Time Format
         am/pm	     Uses the 12-hour clock for the preceding h or hh specifier, and displays 'am' for any hour before noon, and 'pm' for any hour after noon. The am/pm specifier can use lower, upper, or mixed case, and the result is displayed accordingly.
         a/p	     Uses the 12-hour clock for the preceding h or hh specifier, and displays 'a' for any hour before noon, and 'p' for any hour after noon. The a/p specifier can use lower, upper, or mixed case, and the result is displayed accordingly.
         ampm	     Uses the 12-hour clock for the preceding h or hh specifier, and displays the contents of the TimeAMString global variable for any hour before noon, and the contents of the TimePMString global variable for any hour after noon.
         /	     Displays the date separator character given by the DateSeparator global variable.
         :	     Displays the time separator character given by the TimeSeparator global variable.
         'xx'/"xx"   Characters enclosed in single or double quotes are displayed as-is, and do not affect formatting.

    function StrToUnixTime(Format: string; UnixTime: Value): value;
         StrToUnixTime converts a string in the format of MM/DD/YY HH:MM:SS to a UnixTime value.
         Specifying AM or PM as part of the time is optional, as are the seconds. You should use 24-hour
         time (7:45 PM is entered as 19:45, for example) if you don't specify AM or PM.

    function Whereis(filename,RootPath : string) : string;
         Whereis searches rootpath and any subdirectories below rootpath for a specified file
         and returns the first matching file it finds. If no matching file is found then
         the return string will be empty.

    function LoadFromFile(Gadgetid : value; filename : string) : value;
         Loadfromfile loads a disk file into memory for the particular gadget type.
         This function is only applicable to the following pil gui gadget types:
              Memos     (type  3)  Loads a text file into an editable memo gadget
              Listboxes (type  7)  Loads a text file, each line becomes an item in the list
              Image     (type 14)  Loads a image file which may be one of the following types
                                         bitmaps      .bmp files
                                         icons        .ico files
                                         metafiles    .wmf files

    function SaveToFile(Gadgetid : value; filename : string) : value;
         Saves a disk file for the particular gadget's contents.
         This function is only applicable to the following pil gui gadget types:
              Memos     (type  3)  Saves a text file of a memo gadget's contents
              Listboxes (type  7)  Saves a text file, each line of the list gadget becomes a new line in the text file
              Image     (type 14)  Saves a image file which may be one of the following types
                                         bitmaps      .bmp files
                                         icons        .ico files
                                         metafiles    .wmf files

    {                 --------- PIL GRAPHIC PRIMATIVES -----------                     }
     All the procedure below are classified as graphics primatives and as such only apply
     to image objects. You must first create a gadget of type 14 (PIL_IMAGE) and use the
     result as the image parameter to all of these functions.


    procedure SetPen(image : value; style, color, mode : value);
         Sets the currently active pen attributes for an image object. Image is created with
         creategadget() using 14 as the class type.

         Style may be one of the following
              0 Solid
              1 Dash
              2 Dot
              3 DashDot,
              4 DashDotDot
              5 Clear
              6 InsideFrame

           Mode may be one of the following - consult the Microsoft Windows Programmers Reference
                                              for meaning of raster mode
              0 Blackness
              1 Whiteness
              2 Nop
              3 Not
              4 Copy
              5 NotCopy
              6 MergePenNot
              7 MaskPenNot
              8 MergeNotPen
              9 MaskNotPen
             10 Merge
             11 NotMerge
             12 Mask
             13 NotMask
             14 Xor
             15 NotXor

    procedure SetBrush(image : value; style, color : value);
         Sets the currently active brush attributes for an image object. Image is created with
         creategadget() using 14 as the class type.

         Style may be one of the following values
             0 Solid
             1 Clear
             2 Horizontal
             3 Vertical
             4 FDiagonal
             5 BDiagonal
             6 Cross
             7 DiagCross

    procedure MoveTo(image : value; X,Y : value);
         Sets the logical pen position for the image (place where drawing starts)

    procedure LineTo(image : value; X,Y : value);
         Draws a line from the logical pen position [set by moveto()] using the current
         pen color, style & mode.

    procedure Rectangle(image : value; X1,Y1,X2,Y2 : value);
         Draws a rectangle using the coordinates provided by X1..Y2 using the current
         pen color, style & mode, and filling fith the current brush color & style.

    procedure TextOut(image : value; X, Y, Alignment : value; Text : string);
         Draws text to an image object using coordinates X & Y.

         Alignment specifies the text alignment by using a mask of the values in the
         following list. Only one flag can be chosen from those that affect horizontal and
         vertical alignment. In addition, only one of the two flags that alter the
         current position can be chosen.

           0 NOUPDATECP
           1 UPDATECP
           0 LEFT
           2 RIGHT
           6 CENTER
           0 TOP
           8 BOTTOM
          24 BASELINE
         256 RTLREADING
         MASK (TA_BASELINE+TA_CENTER+TA_UPDATECP+TA_RTLREADING);

o   New Events

    ON DNS:/alias [:+ | :-]
           Triggered when a DNS lookup initiated with /dns is complete
           Variables: $ipname     - name form of ip
                      $ipaddress  - dotted decimal form of ip

           This event supports default system handling suppression by using :-
           The default is continue system level processing and display the DNS
           information

           example: ON DNS:/display Found results: $ipname ( $ipaddress )

    ON INPUT:key:#channel:/alias [:+ | :-]
           This is really not an IRC event. Rather its a system level event.
           It is triggered when you press the enter key to issue a command
           or send text and the keymask matches your input text and the #channel
           parameter matches the window.
                Channel mask may be
                      #            : any channel windows
                      ?            : any private msg window
                      #channelname : any specific channel
                      *            : any window

           This event supports default system handling suppression by using :-
           By default pirch will process the text/command normally.

           example: ON INPUT:!*:/runscript [bothandler] *1

           Behaviour notes: Pasting multiple lines into the edit box or using Ctrl-Enter to
                            force line seperation then each line will be processed for ON INPUT
                            seperately. The default for this event is to continue normal
                            PIRCH processing after the event has returned, using :- at the end
                            will suppress PIRCH from handling the input.


    ON CHATOPEN:/alias
           This event occurs when a DCC CHAT connection is actually established with another
           user.
           Variables: $nick        Nickname of person you are chatting
                      $address     ident@host of the user
                      $ip          actual IP address that you are connected to


    ON CHATCLOSE:/alias
           This event occurs when a DCC CHAT connection is closed by either party.
           Variables: $nick        Nickname of person you were chatting
                      $address     ident@host of the user
                      $ip          actual IP address that you were connected to

    ON DCCSENT:filemask:/alias
           This event occurs when a DCC File send is completed successfully.
           Variable:  $nick
                      $address
                      $filename
                      $-filename
                      $filesize
                      $rate

    ON DCCSENDFAIL:filemask:/alias
           This event occurs when a DCC send fails
           Variables: $nick
                      $address
                      $filename
                      $-filename
                      $filesize
                      $rate
                      $sent
                      $ack
                      $percent

    NOTE: All DCC file events (ON DCCDONE, ON DCCFAIL, ON DCCSENT, ON DCCSENDFAIL) now
          have the $-filename variable which is identical to $filename except that it
          does NOT contain the file path

    ON JOINED
           This event occurs when you join a channel
           Variable   $nick       your nickname
                      $address    your address
                      #           the channel you joined


o   Event Modifiactions

o   Added support for /PART messages for Dalnet class IRCD's

o   Added adjustable slide control for tweeking the width of channel names list.

o   Added color code support

o   Added PIL Syntax Check command to the Alias window right click popup menu
    This command will attempt to compile a PIL script and report syntax errors in
    a pane below the editor

o   Added Run PIL script command to the Alias window right click popup menu
    This command will first display a dialog box allowing you to input any
    parameters you may want for the script. This command replaces/creates an instance
    of the script within PIRCH's script cache. (Basically the same as a /runscript)

o   Added user defineable font to the alias window (right click the main pane)

o   Changed mask modes that use idents to trim the tilde (~) and prefix a wildcard

o   Added WHEREIS command to the file server.

o   Hard Color support - (for the sake of compatibility the following convention is used) (*** sigh ***)

    Ascii char (0x03) followed by a number ranging from 0-15. You can also change the
    background color by appending a comma followed by another number to indicate the background

    The following table lists the supported colors

     0   White
     1   Black
     2   Navy
     3   Green
     4   Red
     5   Maroon  (dark red)
     6   Purple
     7   Olive   (dark yellow)
     8   Yellow
     9   Lime    (light green)
    10   Teal    (blue green)
    11   Aqua    (light blue green)
    12   Blue
    13   Fuchsia (bright purple)
    14   Gray    (dark gray)
    15   Silver  (light gray)

o   Can now force a fixed font (courier) with Ctrl-F (great for ascii art) (\-17 in aliases)
o   Can now do symbol font with Ctrl-S. (\-18 in aliases)
o   Special attribute no longer supported. Replaced with color code

o   Fixed /filemove that sometimes wasn't deleting the orifinal file

o   Added execute options to the DCC File sender right click popup. Makes it easy to
    run/open files by system association

0.85

o   Enabled SOCKS proxy support for connections to IRC servers via lans
    This has only been tested with WINGATE to date and seems to be functional.
    You CAN NOT DCC via SOCKS. HTTP proxy for /fetch will be enabled soon

o   /WHO now shows channel person is on

o   Enabled server logging

o   Enabled long filename usage for all logs

o   DCC Chats are now loged to nickname.dcc to prevent conflict with long
    filenames of private messages from the same person

o   Added unlimited timer iterations for /timer by setting the iteration count to
    -1. Timers created with this method need to be destroyed with /timer <timername> die
    as it will not expire of its own accord.

o   Numerous enhancements to PIL.
    PIL compile speeds have been optimized and are now approximately 6000% faster.
    Avg script compile ratio is now approximately 1700 lines per second

    Compiled PIL scripts are now cached. This means that once a PIL script is
    compiled in a session, PIRCH will retain the script's binary image in memory
    eliminating the necessity of recompiling it during each execution it unless the script is
    changed, avoiding the overhead of compilation each time a script is executed.

o   Fixed /savebuffer bug when a filename was supplied

o   Optimized saving & loading of Aliases

o   New PIL functions
    Sorry for the poor documentation here... will try to get the help file with
    some decent descriptions in place soon

o   New list based procedures/functions

    function createwindow(windowname:string; left,top,width,height:value) : value;
        Creates a new window, caption is set to windowname

    creategadget(parentwindow,controltype,left,top,width,height:value) : value;
        Creates a control in a parent window;

        Control type may be one of the following values
          Label        =  1;
          Edit         =  2;
          Memo         =  3;
          Button       =  4;
          ChkBox       =  5;
          Radio        =  6;
          ListBox      =  7;
          Combo        =  8;
          Group        =  9;
          Panel        = 10;
          Card         = 11;
          Grid         = 12;
          TextScroller = 13;

    procedure SetEvent(windowid : value; eventid : value; command : string);
        Installs a script or alias based event handler for controls.
        Currently only two primary events are handled, button clicks and
        parent window closing. Both of these events have an event id of 1.

        Applies to: Parent Windows and buttons


    procedure SetWindowAttr(controlid,attribute,attrvalue : value);
    function GetWindowAttr(controlid,attribute : value) : value;
        Applies to: All to varying degrees

        Attribute may be one of the following index values
             Color      =  1;
             TextColor  =  2;
             Align      =  3;
             Alignment  =  4;
             Border     =  5;
             Enabled    =  6;
             Visible    =  7;

             Card       = 20;  { card control specific }
             CardState  = 21;  {   "               "   }

    procedure setwindowtext(controlid : integer; text : string);
    function  getwindowtext(controlid) : string;
        Applies to: All except listbox, textscroller

             Sets/retrieves the caption text for a control or window


o New list based procedures/functions

    function ListAppend(controlid : value; item : string) : value;
        adds a string to the end of the list and returns its position
        Applies to: combobox, listbox, memo, textscroller

    function ListInsert(controlid,index : value; item : string) : value;
        inserts a string into the list at position index.
        Applies to: combobox, listbox, memo

    procedure ListClear(controlid : value);
        clears all items from a list
        Applies to: combobox, listbox, memo, textscroller

    procedure ListDelete(controlid,index : value);
        deletes item at position index from a list
        Applies to: combobox, listbox, memo

    function ListGet(controlid,index : value) : string;
        returns the string at position index in the list
        Applies to: combobox, listbox, memo

    function ListSelection(controlid:value) : value;
        returns the index which is currently highlighted
        Applies to: combobox, listbox

    function ListSearch(controlid : value; searchstr : string) : value;
        searches for searchstr in the list and retiurns the index the
        item is found at. If searchstr is not found, it returns 0
        Applies to: combobox, listbox

o   /DCC SEND with no parameters now will display the dcc send window

o   You may now have an alias called ESC to represent the ESC key
    Examples:    ESC:/min     (to minimize active window on esc keypress)
                 ESC:/close   (to close active window on esc keypress)

o   Started adding hypertext support to the channel/message text scroller
    Currently supports http:// url format for for world wide web links
    Links have thier own color attribute which may be set in Options | Colors.
    As you move the mouse of a URL sent to as channel or in a message window you
    will see the mouse cursor change to a pointing finger. You can simply click
    on urls to have your web browser load the desired URL

o   Alias editing window may now be kept open and yo may switch in & out of alias
    and chat windows as desired.

o   Fixed bug that did not allow helper apps to properly load after a DCC download.
    (actually the code was never enabled... ooops)

o   DCC Resume option will now be availale even if auto accept is enabled.
    Also fixed a file rename problem in the dcc accept window.

o   DCC confirmation dialog now displays information (path/name size & date)
    about the existing file if a like named file sent to you exists on your system.

o   Added TDCC protocol. TDCC is a faster DCC file transfer protocol. Not compatable
    with standard DCC sending so reciever must also use PIRCH or other TDCC capable
    clients if there are any.

o   Again removed more debug code and reduced resource & memory usage to some degree.
    This process will continue

o   Added TGET command to File server to allow TDCC protocol to be used to retrieve an offered
    file. The client conntecting to your file server must of course of TDCC capability
    to make use of the command, or they will have to use the regular GET command.

o   Added /DCCMSG command. Allows you to send a text line to a user via a previously established
    DCC CHAT connect (useful for events).

    Example: ON CHAT:*ping*:/dccmsg $nick pong!

o   Fixed the problem with Default Max Gets Setting in fileserver not being saved properly

o   Added sending of a idle timeout warning mesage to the user approx 30 seconds before
    an idle disconnect connect will occur.

o   Removed the extra line after WALLOPS and SERVER NOTICES displayed in the server window.

o   Added Timestamping options. Options | prefs | misc | timestamping to have it enabled by default
    for all windows. Use /set timestamping ON | OFF to enable/disable timestamping for individual windows.

o   Added $activewin variable to represent the currently active window.

o   Rewrote the /ban command. Nickname no longer need be present in the channel to get banned,
    however should be online so that PIRCH can get proper address mask for the ban.

o   Added /unban command
    Usage: /unban #channel nickname maskmode

o   Added ON ANY event. Trigger on any irc event or CTCP... useful as a dummy event in doodoo lists

o   Including a copy of PILGAMES.DLL which will support a number of PIL game controls but
    the documentation is not done for this version... please do not ask how to use the
    game controls yet.


0.82

o   Fixed /define evaluation order in the multi-phase parser

o   Fixed /filedel and implemented a -q option to prevent display of the
    confirmation dialog box.

o   Added automated CTCP flood control. Option is in the Options | prefs |
    flood group

o   Fixed popup menu in notify when on multiple networks...
    Whois request went to the 'active' net, not necessarily the correct net

o   Found and fixed a potential memory leak

o   PIL - PIRCH INTERPRETED LANGUAGE
    PIRCH now includes an integrated scripting language which allows
    a number of new capababilities, including the use of if/then/else,
    while/do, for/to/do statements, full mathematical expressions using
    quantitive operators (+,-,*,/,mod,^), logical operations
    (and, not, or, xor), bitwise operators (bitand, bitor, bitnor,
    bitxor, shl, shr). The PIL procedure/function libray includes common
    routines for string manipulation, type conversion, input/output, and
    and a variety of other data oriented procedure/functions.

    PIL is documented in PIL.DOC (Miscrosoft Word 6.0 format document-can be
    read by Wordpad included with Windows 95 & Windows NT).

    Two new commands have been added to support PIL.

    /RUNSCRIPT <scriptname> <parameters>

    /CALLBACK <server reply code> <script name>

    Both of these commands are documented in help and the PIL reference

       ************** IMPORTANT NOTE ABOUT PIL SUPPORT *****************

    The #pirch channel on the Undernet (this is the primary support channel)
    will NOT answer questions regarding PIL. PIL is an advanced feature
    and as such obviously isn't intended for everyone. Support for PIL can
    be obtained through Northwest Computer Services via email for registered
    users only.

o   Added /ADDPIL <scriptname> to add a script to the alias window form a
    disk file making sharing/installing of PIL scripts easier. The
    same functionality can also be achieved by right clicking over the
    alias list in the alias window and selecting Install PIL script from the
    popup menu.

    Possible useful event: ON DCCDONE:*.pil:/addpil $filename

    Will automatically install a PIL script when dcc'd to you

o   Added ON CTCPREPLY event
    ON CTCPREPLY
    Format:	[=]ON CTCPREPLY:<text>:<alias>[:+]
    Example:	ON CTCPREPLY:*:#: /display > -CTCPs- \-1 *1

    Available info:	$nick - nickname of the user that caused the event
          		$address - nickname of the user that caused the event
	          	*1 - contains the full ctcp reply sent

    This event is triggered when a reply to a CTCP command like /ping is received.

o   Added ON OPNOTICE event
    ON OPNOTICE
    Format:	[@][=]ON OPNOTICE:<text>:<alias>[:+]

    Available info:	$nick - nickname of the user that caused the event
          		$address - nickname of the user that caused the event
	          	*1 - the message

    This event is triggered when a PIRCH opnotice is received and works exactly
    like ON TEXT/ON NOTICE. This will not work with other client style opnotices,
    because other clients simply send them as private notices to each operator,
    with no special tagging (these will trigger an ON NOTICE event.


o   Fixed /filecopy and /filemove




VERSION 0.80A
o   Fixed /ban problem

o   Fixed positioning/sizing of some additional windows

o   Fixed the 'Bubble' text color attribute conflict with the hilite attribute

o   Fixed problem with Long File Name variables in aliases that would append an
    underscore character tro the end of a filename if the LFN and Fill Spaces
    options were enabled in the DCC section

o   Added some advanced channel filtering options.

o   Fixed problem with default download directory and extension mapping

o   Fixed a word wrap but that could cause problems if the window width was too
    small to fit a single character causing a infinite loop

o   Added file server feature.
    The file server window can be opened via the tools menu. Only one file
    server windows can be created, hoever the server supports multiple
    connections and is arranged so that you can easily see who is connectioned
    and what activity is occuring.

    The file server only allows a particular to connect one time, this is
    validated via the user's IP address.

    The /FACCESS command
    /FACCESS <nickname> [homedir] [maxgets]

    This command is used to grant users access to the file server.
    At a minimum you must supply the <nick> parameter. The homedir
    is the name of the root directory the particular user may access.
    If the Homedir param is omitted the user will be granted acess to the default
    Homedir set up in the File Server Options.

o   Added adanced filtering option to allow filtering of keywords which
    you do not want displayed. Channels containing these keywords on the topic
    or in the channel name are discarded.

o   New Commands/variable functions
    /WRITEINI <filename> <section> <key> <value>
    $READINI <filename> <section> <key> <default>     (for use in aliases & events)

    The structure of an ini file is broken down into sections as diplayed below
          [section]
          key=value

    Each inifile may have multiple sections and under each section multiple
    key=value statements

    NOTE: All parameters are required and the function will fail if any are missing.
    The $readini inline function currently must be the last part of an alias or event
    handler statement since the last parameter <default> may contain multiple words.
    The structure of inline functions (ie $read, $readini) will probably change in
    the near future to allow greater flexibility in parameters and a more consistent
    structuring of alias/event code.

    ON JOIN:#:/writeini c:\pirch32\tracking.ini # $nick $nick last joined # on $day $date at $time (CST)
    ON TEXT:!seen*:#:/msg # $readini c:\pirch32\tracking.ini # $2 $2 has not been seen on #

o   Fixed some problems with 2 phase alias parsing

o   Added print capability for channels/msg windows/dcc chats
    To print only a selected oportion of text, click & drag to highlight the text
    and hold the CTRL key down simutaneously... release the mouse button while
    the ctrl key is still down and the text will remain highlighted... not
    select IRC | Print and the 'selected only' option will be enabled in the print window.

o   Added ability to print BIO's

o   Fixed problem with /list if no list was returned an RPL_LISTSTART server reply is
    sent to the client.

o   Added $mode to ON MODE

o   Stopped system from coming to the top when another application is active and
    a new msg window is opened up.

o   Added timeouts to dcc sends for unconnected transactions.


PIRCH 0.80 (Initial Release)



