2.2.0 Final Changes (release xx/xx/01)
-----------------------------------
- UPDATE: misc documentation updates
- NEW: added support function SM_dbErrorCheck() for checking the result handle of a PEAR query. it
       will check for a database error and issue an SM_fatalErrorPage, with debug information, when
       appropriate
- UPDATE: small fixes in baseDbEdit.mod and mySQLdbGUI.mod in modules/ 
- UPDATE: SM_smartForm::loadForm() now returns an array of fields loaded from the XML form
- UPDATE: allow multiple sfInputEntity and sfFilter directories

2.2.0rc3 Changes (release 9/10/01)
-----------------------------------
- NEW: add wrapper function SM_module::hLink which wraps $this->sessionH->hLink. these calls may now be made by using
       $this->hLink() instead of $this->sessionH->hLink() in a module
- NEW: add directive 'tableAlignment' to SM_module class for setting alignment of module output in module table
- SMOBJECT XML files now create arrays for VAR variables that have the same key
- NEW: SM_object::addDirective() now can take a third boolean parameter. when set to false and the key specified is 
       already a directive, it will make an array instead of overwriting the directive. this parameter defaults
       to true (overwrite) to assume the old behaviour by default
- NEW: add optionCount() to selectEntity for determining number of added options
- NEW: add Debug Survey to Debug section of testSite/
- NEW: add SM_module::write() and SM_module::writeln(), which are wrapper functions for say() and saybr()
- BUGFIX: in testSite/ update SM_debug correctly in Debug Test section so message relects current value
- UPDATE: cleanup some PHP Notices generated by the library
- UPDATE: documentation updates
- NEW: add SM_layoutTemplate::getAreaAttributes($areaName) for returning all attributes specified in the SM AREA tag,
       which are parsed into a hash where key=attribute name, val=attribute value
- NEW: add SM_layoutTemplate::getAreaList() for returning a list of areaNames in a template (or codePlate)
- NEW: add SM_layoutTemplate::areaExists($areaName) for determining if an areaName exists in a template (or codePlate)
- NEW: add SM_siteManagerRoot::includeCodePlate() for including but not instantiating a codePlate, for extension and use.
- BUGFIX: in testMemeber.mod (testSite/), recheck for login before issuing "not logged in" message (thanks Doug)
- BUGFIX: addslashes() to persistent variable database storage
- BUGFIX: generate unique id's for modules in templates. fixes problem with the same module being used multiple times
          with an SM TYPE="module" tag in the same template. thanks to Francis Grignon.
- NEW: add example/base module memberEdit.mod, to be used both for adding and editing members in the member system
- UPDATE: update member system to include a function for flushing and reloading member info


2.2.0rc2 Changes (release 8/03/01)
-----------------------------------
- DOCS: PDF/PS doc updates: table of contents work now
- BUGFIX: areas in templates with no modules get cleared out of final output again
- BUGFIX: fix preg_replace dollar sign backreference bug, by using str_replace instead, in smartforms template replacement.
- UPDATE: patch from Tamas, don't show password values in text input entity on resubmit, so as not to show them in html source
- UPDATE: new regexp in emailFilter, other updates
- BUGFIX: other misc XML smartform load fixes
- BUGFIX: XML loaded smartform: filter messages work again
- BUGFIX: stateList input entity fixes
- NEW: added filter dbUnique, for making sure input coming in from a smartform isn't already listed in a database table
       for example, it allows the form to fail if someone enters a username already in use when signing up for membership
- BUGFIX: patch submitted by Tams Brtfai, fixing multiple replacement variables in one SECTION in an SMCONFIG
          XML file
- NEW: also part of the patch by Tams is the ability to reference a variable from another section, using the
       dot operator. for example, to reference variable from your "dirs" SECTION (inside of another section):
       <VAR name="{$dirs.newVariable}" value = "varVal" />
       in other words, the format is {$<sectionName>.<variableName}          
- DOCS: documentation updates from harribo on sourceforge
- BUGFIX: fix XML loaded SmartForm to handle entities with optionList's again
- BUGFIX: in various places, use identical operator when checking for blank string ('') so PHP doesn't
          return true if the value was actually (int) 0

2.2.0rc1 Changes (release 7/23/01)
-----------------------------------
- updates to default .htaccess file in skeletonSite/ (thanks to Stephane)
- change skeletonSite/ locanConfig.xsm to use $adminDir that was defined in common.inc. This saves you
  from having to specify the admin directory in two places.
- added some sample windows type paths in various places

2.1.14 Changes (release 7/12/01)
-----------------------------------
- documentation updates
- NEW: addText() method for templates. replace an area directly with a block of text
- BUGFIX: allow multiple lines of text in SMLANGUAGE files (fixes #440546 by Francis Grignon (grignonf))
- BUGFIX: fix in template code for multiple SM tags on one line
- NEW: add directive 'entityClassTag' to SM_smartForm and entities. This affects entities that have text, such as checkbox
  and radio buttons. Setting the directive (either on a formwide basis or directly on an entity) will wrap the text shown 
  by an entity in a SPAN with a CLASS set to the value of the directive.
- BUGFIX: fix colorList input entity to use addOption
- BUGFIX: fix comboBox input entity, now works correctly when text is blank but select is selected
- BUGFIX: sub @@sessionVars@@ in template just before output (after all modules have been run) so it has the correct
  sessionVars
- NEW: add flag 'strictInVar' which will only seed inVars that came from the same module (has same module prefix). usually
  you want to keep this off, so it's false by default.
- UPDATE/BUGFIX: switch to str_replace (from preg_replace) in layoutTemplates. this fixes a bug where prices weren't being
  substituted correctly into a template. also potential speed improvements.
- UPDATE: SM_fromMysqlDate will rip a date from a DATETIME field
- BUGFIX: compatibility fix to siteManager perl helper script, fixes copying of skeleton directory on some machines
- NEW: add entity submitEntity. you can now have multiple submit buttons in your form, with different name/values.
  add like a regular entity (with $myForm->add()), "title" can be blank. use a smartform template to layout several
  submit buttons next to each other, each with different values (ie, Add Edit Delete)
- NOTE, the default behavior for SM_smartForm::output() has changed! the first parameter to specify the VALUE of the
  default submit button is still optional, but now if you leave it off, you won't get a default submit button at all
  (it used to add one with a value of SUBMIT)
- BUGFIX: loop counter fix in switchBoxEntity.inc (fixes #438191 by Red)
- NEW: ability to add free text before and/or after an input entity in a smart form. 
  Use: add or wrap text around the entity with $myForm->setEntityTextWrap("entityName","prefix text","postfix text")
  use for adding things such as a % after a text input box meant to take a percentage

2.1.13 Changes (release 7/2/01)
-----------------------------------
- NEW: add directive "sendNoCacheHeaders". when set to true, a header will be sent with each page to prevent client browsers
  from caching the contents of the page. this is off by default, and can be turned on either sitewide in localConfig.xsm or
  on per-page basis by calling $SM_siteManager->siteConfig->setVar('flags','sendNoCacheHeaders',true) in the directive
  script for that page. thanks to Kaspar Long for help with this.
- BUGFIX: patch to support.inc by Nico Galoppo fixed call to SM_getScriptVars
- NEW: add support for setting simple directives for modules inside a template in a SM TYPE="module" tag. format is
  with DIRECTIVES attribute: DIRECTIVES="key1=val1,key2=val2"
- NEW: added postConfigList array to SM_module, similiar to postThinkList, for running a method automatically after
  moduleConfig is called.
- UPDATE: modifications to SM_config to allow it to be used without loading a GLOBAL config file first
- NEW: add global function SM_getVar() which will retrieve the value of a variable from SiteManager, either
  from GET or POST, prefixed or non-prefixed. can be used from directive scripts and codePlates to determine current
  value of propagated inVars, for example (since neither of those two have access to inVars otherwise)
- NEW: break mySQLdbGUI into a base class and extended class so that other classes can 
  extend the base class to create forms that will add, edit, or delete from a smartform based
  on a database
- BUGFIX: fixed a problem where multiple calls to loadSite() would clear the siteConfig
- MISC: no longer *require* a SITEID in SMCONFIG files. will use current SM_siteID if not there.
- SmartForms: fix data/title problem on addOption() entites again
- SmartForms: only check filters if input is required OR data isn't blank. this way non-required fields with filters on 
  them won't fail the form if data wasn't entered for that field
- SmartForms: lots of misc cleanups and changes. needs thorough bugtesting... 
- MISC: code cleanups

2.1.12 Changes (release 6/12/01)
-----------------------------------
- add directive 'outputInSpan' to SM_module. Defaults to true (old behaviour). Normally all modules are wrapped in a SPAN
  tag, with an ID of the module prefix. Set this directive to false in your moduleConfig() to have it NOT output a SPAN
  tag.
- add directive 'badFormMessage' to SM_smartForm. It will display the value of this directive as a header at the top
  of the form if any of the filters fail.
- added hook for running a custom function when member information is looked up from a database. adding a vaiable
  'memberLoadFunction' to the 'sessions' SECTION of the GCS will cause the member system to run a function of the
  name specified. it will take a single parameter, which is the $memberData of the current loaded member. it is only
  run if the user is a valid, logged in member. the function can load information from a database, or do whatever else
  you'd like. if it takes the $memberData variable by reference, changes made to it will be seen by other modules.
  see testSite/common.inc for an example.
- switch internal storage of data/key pairs for input entities that have lists: select, checkbox, radio, and descendents. 
  this is to allow multiple options with different titles but same value. this should only affect people who have used 
  the setList() method of these entities - it is now stored title as the key, data as the value. since this should be 
  a small number of people, most won't notice this change.
- manual documentation updates
- code documentation updates
- siteManager perl script updates

2.1.11 Changes (release 5/24/01)
-----------------------------------
- NEW: error_reporting(E_ALL) is now in effect. warnings and errors won't show up, however, unless you're viewing the
  debug output through a javascript debug window, debugOnVar, fatalErrorPage or fatalDebugPage. also, added variable
  'showNotices' to 'debug' section of GCS, which allows you to toggle display of PHP NOTICE level messages.
- DOCS: lots of updates to the manual
- BACKWARD INCOMPAT. CHANGE: change attribute "NAME" of the SITE tag in an SMCONFIG file to "SITEID", and bumped version
  number of SMCONFIG files to 1.2. Having to set your siteID in SITE NAME was confusing, as there is also a (different)
  siteName variable. While the "name" attribute will still work, you should change both version number and NAME to SITEID
  the new SITE tag looks like this:
  <SITE SITEID="testSite"> instead of <SITE NAME="testSite">
- OPTIMIZATION: add 'usePersistentMembers' to 'members' SECTION of GCS. when true, it will cache member information as
  a persistent variable to avoid a seperate database query. this is off by default, but we recommend turning it
  on if you use the member system and a database for sessions
- OPTIMIZATION: when using a database to store persistents, only write out session variables that have changed from
  when they were loaded at script load time
- NEW: added caching support for SMOBJECT, SMLANGUAGE, SMARTFORM. also added master switch 'useCache' in new 'cache'
  SECTION of globalConfig.xsm
- UPDATE: moved saveSerial() and loadSerial() methods to SM_object so all descendents can cache arbitrary data
- BACKWARD INCOMPAT. CHANGE: directive 'cacheGCS' has been changed to 'cacheSMconfig' for consistency, and moved to 
  new 'cache' SECTION. change this in your globalConfig.xsm if you had cacheing turned on. see new globalConfig.xsm
  Also, you'll have to delete the contents of your cache/ directory and let it recache, as the file name format has
  changed
- NEW: add localization functionality. new XML resource SMLANGUAGE, where you can define multiple blocks
  of text in different languages, then load them from any SM_object descedent and use the output in your
  scripts, based on locale. You'll use ID's to access which text you want, instead of hard coding the actual text. 
  This way you can easily add translations later. see testSite.lang.xsm file in /language directory of the testSite, and
  look at smObject.mod in the testSite/admin/modules directory for an example of usage. thanks to Steen for
  helping develop this.
- NEW: related to above, there is a new "localization" SECTION in the GCS, where one can default a default locale
  You can also set directive 'defaultLocale' in your modules to set default on a per module basis
- NEW: IF YOU USE CODEPLATES, READ: major changes to the way codePlate's should be designed and programmed: 
  1) there are now two methods in a codePlate: codePlateConfig() and codePlateThink(). use them in the same way
     you do when designing a module. codePlateConfig should contain only configuration code, the meat should be in
     codePlateThink()
  2) use the setMyTemplate('template.tpt') method instead of setting $this->htmlTemplate and calling
     $this->parseTemplate(). You should do this in codePlateConfig()
  3) instead of declaring $SM_siteManager global (in codePlateThink) and then loading modules and templates into
     your codePlate with $SM_siteManager, use the new $this->loadModule() and $this->loadTemplate methods.
     With them you can specify the area you want them loaded into, so you don't have to $this->addModule() or
     $this->addTemplate() later.
  Note: even with all these changes, your old codePlates should still work fine, but please convert them to the new
  system. Thanks goes to Fabrice Papazian for ideas on this change.

2.1.10 Changes (release 5/17/01)
-----------------------------------
- more documentation updates
- BUGFIX: several misc bugfixes
- NEW: completely new testSite. cleaner interface to testing functionality
- BACKWARD INCOMPATIBLE CHANGE: modules are now NOT centered in their table by default. to turn this back on, you will
  specifically have to add $this->addDirective('centerInTable',true); to your moduleConfig(). This will have no effect
  if $this->addDirective('outputInTable',false) is set
- NEW: new menu module in modules/ directory for adding collapsable, heirarchical menus. docs to follow.
- NEW: add smartform directive 'enctype' to set the encode type for a form.  value is set to enctype
- NEW: add support for running module methods automatically either before or after moduleThink(). this is useful only 
  for designing modules that are to be base classes for other modules. See the testSite/ for example.
- NEW: add caching support for SMCONFIG .xsm files (ie, localConfig.xsm). To use this, you must setup the 'cache'
  variable in the 'dirs' section of globalConfig.xsm, and set 'cacheGCS' to 'true' in the flags section. AND you must
  make sure your webserver has permission to write to the cache directory! Limits include: you can't cache globalConfig.xsm.
  You can cache multiple site configs (loaded with SM_siteManager->loadSite()) for the same SITEID, but they must have
  different filenames. ALSO, if change your .xsm file, you must erase the appopriate cache file from the cache directory,
  else sitemanager won't see the changes! NOTE caching is OFF by default
- BUGFIX: SM_config::getVar() has to use isset() instead of empty() because empty() will be true if the value is false,
  which is incorrect for this method. (thanks Steen)
- BUGFIX: fix assignment of database and session handlers by reference in some objects
- DEPRECATED: 'sessionDbName' and 'memberDbName' fields in 'sessions' and 'members' SECTIONs of the GCS. it will use
  the database specified for the database connection id's it's told to use in the 'dataBaseID' variable. if you want it
  to use a different database than the default, create a new database section (and id).
- NEW: add support for using postgreSQL for sessions and members systems. dbType should be 'pgsql'
- NEW: add postgreSQL table scripts to tables/ section
- BUGFIX: session code, don't whine about database connection id's if they're not using a database
- UPDATE: modules exist in their own SPAN with ID set to their module prefix
- DEPRECATED: remove loadBlankAreaAsModule GCS 'flag' variable. use SM MODULE tag instead.
- OPTIMIZATION: big speed up in template parsing
- NEW: add directive 'cleanHiddens' to smartform. when true, it will not prefix hiddens with the module prefix.

2.1.9 Changes (release 5/09/01)
-----------------------------------
NOTE this version contains significant changes to some internal workings of SiteManager,
please report all bugs and comments to siteManager@roadsend.com or the mailing list!

- lots of documentation improvements
- ton of bugfixes related to inVar propagation and sessions.
* added multiple database connection support. You can setup an arbitrary number of database connections (possibly to
  databases of different types or on different servers) and use these connections throughout the SiteManager system.
  do so by adding multiple 'db' sections with different 'id' tags. see the documentation for more information.
- use PHP output bufferring routines to buffer all output so it doesn't affect SiteManager output routines
- rewrite portions of smConfig.inc. allow multiple SECTIONs with same NAME, different ID's. bump version number
  of SMCONFIG files to 1.1
- new SmartForm directive 'showRequiredHelp'. defaults to true, when false it will not show requiredStar or requiredTag
- merge scripts in bin/ directory to a more intellegent siteManager PERL helper script. you can use this for creating
  skeleton sites, modules and pages. configures itself and remembers your sites later for easy use.
- set some more reasonable defaults in globalConfig.xsm
- updates and bugfixes to various parts of the inVar / persistent variable system
- allow serialization of peristent session variables. this means you can keep arrays, objects and any other PHP
  datatype persistent. in addition, you can specify the type you are expecting it to be with the addInVar function,
  increasing security. *NOTE* if you have been using sessions before 2.1.9 and want to start using serialized 
  persistents, you'll have to erase the current data in your sessios table since it's not serialized already!
  the flag to turn serialization on is 'serialize' in the 'sessions' SECTION of the GCS. it defaults to true
  on new installations.
  *NOTE* to create objects as persistent session variables, the class must be defined BEFORE the call to
  $SM_siteManager->startSessions() (usually in common.inc)
- sessions TABLE CHANGE: the sessions table field 'dataVal' is now a TEXT field, to allow for storage of serialized 
  objects. you can make this change in mySQL by running the following query:
  "ALTER TABLE sessions CHANGE dataVal dataVal TEXT"
- add 'propagateInVarDefault' variable to 'flags' section of the GCS. *default is false* this flag decides for your site
  whether module inVars will propagate automatically or not. set this to true for all inVars in your site to propagate
  by default (or false to not). you can still decide on either per module or per inVar basis whether inVars should 
  propagate. *NOTE* this is different from the default behavior in previous releases
- change format and the way module prefixs are generated. *big* speed improvement.
- fixed bug in SmartForms regarding HIDDEN variables (thanks Steen)
- remove emailFilter.js, was broken
- add method includeModule() to SM_siteManager. use this for module that extend other modules, to
  be sure they are included before extending them.


2.1.8 Changes (release 5/01/01)
-----------------------------------
- tested with php 4.0.5
- documentation updates
- added 'maintainTables' config variable to the 'members' SECTION of the GCS. if this is true, it will remove 
  member login sessions past their TTL (loginTTL value). defaults to false, since there's a performance hit. this
  functionality should really be done by an external script, but is added here for convenience.
- sessionID is now passed in links and forms even if cookie and database is in use. this solves the problem of
  someone having cookies turned off and creating a new session for each page view
- added important functionality to session code. all declared module inVars that have a value are included in the
  session link when using hLink, puLink, or a SmartForm. this lets module who don't know about other modules variables
  keep the page intact when they reload.
  
  we call these "propagated inVars". you can decided per module whether you'd like to include ANY inVars to be 
  propogated (by setting the bool module directive 'propagateInVars') or on a per inVar basis, by setting the
  fourth pararmeter to the SM_method::addInVar() method

- slightly change versioning scheme. 2.1.x is the devel series. 2.2.x will be production. this release is 2.1.8
- SmartForm code cleanups
- added debugLog() method to SM_object for class level debug logging. used by dumpInfo.
- modules are now wrapped in SPAN instead of DIV
- add new directive to SmartForm: 'submitImage'. when set, it will use the passed image as the submit button,
  rather than a regular TYPE='SUBMIT' input tag
- member sessions login timeouts is complete. set loginTTL in 'members' section  of GCS to specify how many seconds
  a member session is valid for. after their session expires, they will have to login to reset it.
  note the actual memberSessions entry isn't removed when their session has expired, it just ignores it.
- add SM_session::setPersistent() method. it lets you set the value of a persistent variable. once set, it will
  use this value in hLink, puLink calls as well as in SmartForms and database session writes. you still need to use
  addPersistent or have this variable in the pVars section in your localConfig.xsm file before using setPersistent
  to set it's value

2.17 Changes (release 4/23/01)
-----------------------------------
- documentation updates
- NEW: add member login support. new library smMembers, and module SM_userLogin. you can now have users login 
  to your SiteManager sites with a username and password. all modules will know if the current sessions is a 
  GUEST or MEMBER session, and have access to the members information from the database. see the docs and testSite for
  details.
  
- add second parameter to SM_module::say() function that allows you to specify which style the text should be shown in.
  the specified style must have been added with addStyle() function in moduleConfig. it uses the SPAN tag to wrap the
  text in.
  
- added SM_module::saybr() function. exact same as regular say() function, but tacks on a <BR> to the 
  end of your output
  
- SESSION UPDATES:
  - 'persistenceType' config variable in SMCONFIG was removed. it was replaced with 'useDatabase' as a bool value.
    this way it will use your database settings from the 'db' section, rather than declaring which database type
    you're using in two places.
  - other bug fixes   
 
- NEW FEATURE: you can now do some simple variable replacement in the SMCONFIG files. once you define a VAR/VALUE pair,
  you may substitute the value in at a later time, by accessing much the same way you do as PHP variables. this is the
  way the globalConfig.xsm and localConfig.xsm files are now done in the "dirs" section:
  
        <SECTION name="dirs">
            <VAR name="smRoot"      value = "/usr/local/lib/php/siteManager/" />
            <VAR name="base"        value = "{$smRoot}"/>            
            <VAR name="config"      value = "{$base}config/"/>
            <VAR name="libs"        value = "{$base}lib/"/>
            <VAR name="modules"     value = "{$base}modules/"/>            
            <VAR name="templates"   value = "{$base}templates/"/>            
            <VAR name="smartForms"  value = "{$base}smartForms/"/>
            <VAR name="sfEntities"  value = "{$base}lib/sfInputEntities/"/>
            <VAR name="sfFilters"   value = "{$base}lib/sfFilters/"/>
        </SECTION>

  NOTE: SiteManager now uses the standard that all directories should end with a slash

  You could use this feature in the following way:
  
    <VAR name="mySiteName" value="Bob's Site" />
    <VAR name="errorHeader" value="{$mySiteName}: There was an error" />
    
  In addition, if you try to use a variable that wasn't defined beforehand in this file, it will automatically
  attempt to substitute the current global PHP value of that variable. that means you can substitute in any PHP
  or server environment variable. you can also use an associative array (hash) in this context. for example:
  
        <SECTION name="dirs">
            <VAR name="base"        value = "{$HTTP_SERVER_VARS['DOCUMENT_ROOT']}/siteManager/"/>            
            <VAR name="config"      value = "{$DOCUMENT_ROOT}config/"/>
            <VAR name="libs"        value = "{$base}lib/"/>
            
            ... etc

  Thanks goes to Steen Rabl for the basic idea.

- BUGFIX: SM tags in layout templates weren't recognizing attributes in single quotes, only double. now 
  recognizes both.
- lots of other small misc bugfixes and updates  


2.16 Changes (release 4/16/01)
-----------------------------------
- moved documentation to seperate package (see http://www.roadsend.com/siteManager)
- new SM tag types for layout templates:

    HTMLTITLE
    
        use this to be able to set the title of the HTML page on the fly in the directive script,
        by setting a directive on the template. put this tag in the <TITLE></TITLE> section of your
        template:
        
        <TITLE><SM TYPE="HTMLTITLE NAME="Default Title Here"></TITLE>
        
        Then, in your directive script, use:
        
        $layout->addDirective('htmlTitle','This is the real title of the page');
        
        If you don't add the directive, it will use the default title instead
        
    HTMLBODY
    
        use this tag to generate a <BODY> tag in HTML. lets you add directives to the template to define
        the content of the body tag. can also be used to automatically get a javascript debug window onload
        
        <SM TYPE="BODY">
        
        $layout->addDirective('bodyBGCOLOR','#FFFFFF');
        $layout->addDirective('bodyALINK','#FFFFCC');
        $layout->addDirective('bodyOther','OTHERATTRIBUTE="test"').;
        
        new variable in globalConfig.xsm 'debug' SECTION: jsDebugOnLoad
        when set to true, if you have a BODY tag, it will automatically popup a debug window for you when
        you reload a page

- fix the use of empty() and isset() in certain libraries, to allow potentially valid values of 0 through
- added basic type checking of inVars. this is a great security measure, used mainly when you need to make
  sure your inVar is an integer (for example, an index into a database). you can now declare an inVar like:
  $this->addInVar('dbID','','int');
  meaning you want an inVar called 'dbID', default is blank, but it should be an integer
  now if dbID is passed to the script but wasn't a number (ie, someone typeed in a string in the URL to try to screw with
  the script) it will generate an error (if dieOnBadInVarType module directive is true) or a warning.
  the only other valid check type currently is 'array', which will make sure an inVar is an array
  if a defaultValue is specified, it will try to use it's variable type for the type it's expecting (ie, if you
  use a default value of 0, it will expect that inVar to be a number)
- SM_fatalErrorPage() now takes an object as a second parameter (ala SM_debugLog), 
  which is the caller object. useful for locating where the message came from
- add new optional method canModuleLoad() to SM_module. if a module defines this method, is will be run before
  moduleThink, but after moduleConfig and before any output is buffered to the module. It should return
  true or false: if false is returned, moduleThink is never run and the output of the module remains blank.
  this is useful when you want to have the module decide if it should display itself, potentially
  dependant on the value of inVars or the like.
- SM_module::getVar() can now take a default variable as a second paramter, which will get returned if
  the variable requested wasn't set. saves a few lines of code of checking to see if anything was returned.
- assign values by reference for all 'new' library calls (for object creation)
- change '= &' to '=&' when assigning values by reference (PHP accepts both, it's clearer this way)
- better database error message handling (in library)
- bugfix in skeletonSite/config/localConfig.xsm that was stopping database connections from working (dbDSN should be DSN)
- add 'remove' functionality to DB GUI. you can now remove (as well as edit and add) rows to the table.
- override PHP's default error handler to our own custom routine, to integrate error reporting into the debug log
  and window
- add javascript debug output window. you can now include a popup window during development to watch the 
  debug output while you see the final output of your page. all messages that are written to the debug log
  through SM_debugLog will show up in the debug window. see the configuration settings in the "debug" section
  of globalConfig.xsm, and see the DEBUG section in the docs.
- add "debug" section to config files. moved some settings from "flags" section.
  the following fields have been moved from "flags" section to "debug" section (make these changes in your
  globalConfig.xsm or localConfig.xsm files if you're upgrading): develState, sfDebug, sfErrorOnly
- fix smObject loading of directives from XSM file (works again)
- all XSM files (SMOBJECT, SMCONFIG, SMRESOURCE, SMARTFORM) are now wrapped in the SM_XML root tag
- lots of updates/bugfixes to mySQLDbGUI and recordSelector module
- updated INSTALL docs, much clearer for different installation scenarios
- move documentation to SGML DocBook format. we can now export HTML, PDF and PostScript version of the docs
- update documentation content
- testSite updates


2.15 Changes (release 3/27/01)
-----------------------------------
- added new input entity colorList
- restructuring of the XML smartform loader
- testSite updates
- MOX file definition in place
- misc bugfixes
- documentation updates


2.14 Changes (release 3/19/01)
-----------------------------------
- remove requirement of altering the main php.inc file to include the SiteManager directory
  in the include path. You can now set $SM_rootDir inside of siteManager.inc to point to
  the main SiteManager root directory. This was requested where a user does not have root
  access change the main php file.
- change some XML data formats around. better object orientedness. this applies to smartform and
  directive (object) XSM files, but not SMCONFIG files.
  SMSMARTFORM_VERSION is at 2
  SMOBJECT_VERSION is at 2
  SMCONFIG_VERSION is at 1
- misc updates related to loading smartforms
- updates for more compatibility with older versions of PHP
- documentation updates
- misc bug fixes

2.13 Changes (release 3/12/01)
-----------------------------------
- add template within template functionality. You can now add a template to another template's area's, 
  the same way as you add modules to an area (except with addTemplate() instead of addModule()). This works
  recursivly, ie, there is no (theoretical) limit to the depth of templates within templates.
  see testSite/home/subTemplates.php for an example
- added new class SM_codePLate. introduced concept of codePlate - it's basically an extension of a template,
  but it has modules associated with it. This way, you can create a "codePlate" that uses a particular template
  and always has certain modules associated with certain areas. See the documentation and testSite for 
  more info.
- rewrite of sessions code. persistents are now handled elegantly, and database and cookie support is in.
  you still use addPersistent (or put them in your local config), but the variables will automatically
  be saved to a database, and a cookie set on the users system. now, no more passing of all the variables around
  in the links (although this option is still available). you can also store the persitents in the database,
  but pass the sessionID through the links without using cookies at all.
  next release will include user login sessions (logging in with username and password)
- misc bug fixes

2.12 Changes (release 3/5/01)
-----------------------------------
- when doing a loadModule, automatically check for SM_ prefix when module wasn't loaded without it
- new debug page: SM_siteManager->fatalDebugPage will dump all known information about config, modules, etc
  call it instead of ->completeDisplay to view debug information about that directive script, instead of
  showing the output
- read in persistants from local site config
- new config flag: loadBlankAreaAsModule (global and site). when set to true, if the template engine encounters
  an area that has had no modules added to it, it will try to loadModule() the areaname, and if successful will
  replace that area with the output from that module. it's a way to stick a module in a template without
  having to add it to the directive script. keep it false unless you use it.
- you can call addFilter and setFilterArgs directly from the input entity returned on add() in a smartForm
- BACKWARD INCOMPATIBLE CHANGE: area tags are now done through the <SM> tag in layout templates. the format is:
  <SM TYPE="type" ... >
  
  this is more scalable. currently, there are three types, "area", "module", and javascript:
  instead of the old %%areaOne%% it becomes <SM TYPE="area" NAME="areaOne">
  
  you can use the "module" type to insert a module directly into a template:
  <SM TYPE="module" NAME="copyRight">
  (see testSite for this example)
  
  javascript is used instead of the old @@javaScript@@, to tell the template engine where to place
  the final javascript output:
  <SM TYPE="javascript">
  
  @@sessionVars@@ is still in effect though, as a direct way to insert the current session variables
  into the template.
  
  limits for this currently include:
  1) you can have multiple <SM> tags on one line, but each tag must not be broken up over multiple lines
  2) you can not have duplicate area names
  3) you can not use multiple SM TYPE="module" tags, with the same module (this will change)
  4) you can not have an area name the same as a SM module name
  5) all tags can be upper or lowercase, but not mixed (ie, type "MODULE" or "module", but not "mOdUlE") 
- change conf/ dir to config/
- add loadConfig() method to SM_objects. this allows any object that extends SM_object (modules, smartforms,
  etc) to load their directives from an XML config file
- added "smartForms" and "config" to "dirs" section in config files
- move local sites localConfig.xsm to admin/config directory
- add global variable: SM_debugOutput (array) used by SM_debugLog function, for logging warnings and other non-fatal
  debug information. gets displayed by SM_fatalErrorPage
- remove optionList class variable from various inputEntities, to make way for XML smartform definitions  
- lots of testSite/ updates
- convert remaining tabs to spaces to in lib files
* allow modules to include, use and output other modules  
     $testModule = $SM_siteManager->loadModule("testModule");
     $tOutput = $testModule->run();
     $this->say($tOutput);
     $this->sayJS($testModule->getJS());
* (pym) XML loading of smartforms. you can now load a smartform from an XML config file, rather than
        defining it in a module.
* (pym) XML loading of directives at SM_object level. you can now load directives from an external file
        at runtime, rather than in the module or directive script
- "(pointer)" should be changed to "(reference)" in javadocs
- session javascript popup to be collected in javaScript section output of templates
- filter and entities - consistancy changes, add filterConfig, entityConfig to mock moduleConfig,
  don't override constructors anymore.  also change apply() and output() to filterThink() and entityThink()
  to mock moduleThink()
  
2.11 Changes (release 2/27/01)
---------------------------------
- new naming scheme: all global variables, classes, functions, etc should begin with SM_
- XML used for configuration and documentation of modules and libraries
- SM_debugLog() function used for debugging output (lib/errors.inc)
- $SM_module->newSmartForm() now returns reference to new smart form, instead of taking a variable.
* license on top of all files
- file name consistancy: .inc for libs, .tpt for templates, .mod for modules, .spt (smartform templates) (configurable?)
* move to <?php ?>
- move to .php files
* global module load function in modules.inc, so you dont have to know the path and the module system
  knows which modules are loaded (SM_loadModile -> modules.inc)  
* load function for templates (loadTemplate)  
* move to PEAR database abstraction
- added SM_object class which all SM_ objects derive from. adds directive[] support
- finalize directory layout
- function naming consistancy (SM_)
- SM_siteManagerRoot class
- SM_config class
- ton of other stuff
- general documentation
- javadoc all classes and functions
- remove virtual host requirements, if any
- create examples and walkthroughs
- website
  
2.0 (unreleased)
---------------------------------
- stable, in use on mindedge.com et all

