diff --git a/docs/README-SmartyValidate b/docs/README-SmartyValidate deleted file mode 100755 index e75656e..0000000 --- a/docs/README-SmartyValidate +++ /dev/null @@ -1,1089 +0,0 @@ -NAME: - - SmartyValidate: a class/plugin for validating form variables - within the Smarty template environment. - -AUTHOR: - Monte Ohrt (monte [AT] ohrt [DOT] com) - -VERSION: - 2.6 - -DATE: - February 7th, 2005 - -WEBSITE: - http://www.phpinsider.com/php/code/SmartyValidate/ - -DOWNLOAD: - http://www.phpinsider.com/php/code/SmartyValidate/SmartyValidate-current.tar.gz - -ANONYMOUS CVS: (leave password empty) - cvs -d :pserver:anonymous@cvs.phpinsider.com:/export/CVS login - cvs -d :pserver:anonymous@cvs.phpinsider.com:/export/CVS checkout SmartyValidate - -SYNOPSIS: - - index.php - --------- - - session_start(); - require('Smarty.class.php'); - require('SmartyValidate.class.php'); - - $smarty =& new Smarty; - - - if(empty($_POST)) { - SmartyValidate::connect($smarty, true); - SmartyValidate::register_validator('fname','FullName','notEmpty'); - SmartyValidate::register_validator('fdate','Date','isDate'); - $smarty->display('form.tpl'); - } else { - SmartyValidate::connect($smarty); - // validate after a POST - if(SmartyValidate::is_valid($_POST)) { - // no errors, done with SmartyValidate - SmartyValidate::disconnect(); - $smarty->display('success.tpl'); - } else { - // error, redraw the form - $smarty->assign($_POST); - $smarty->display('form.tpl'); - } - } - - form.tpl - -------- - -
- -DESCRIPTION: - - What is SmartyValidate? - - SmartyValidate is a form validation class. Its design goals are to - leverage the Smarty templating environment and make form validation - as easy and flexible as possible. - -BACKGROUND: - - Form validation is one of the most frequently performed tasks when - it comes to web application programming. Developing form validation - can be a tedious and time consuming task. SmartyValidate simplifies - this effort by abstracting the validation process. You basically - provide the validation criteria and error messages, SmartyValidate - does the rest! - - On the application side, you call SmartyValidate::connect($smarty) first, - passing your smarty object as the parameter. Then you register your - validators with the SmartyValidate::register_validator() function, once for - each validation criteria on the form. Once the form is posted, you call - SmartyValidate::is_valid($_POST) and depending on the outcome, you either - continue with a valid form or begin a form redraw cycle until all the - validation criteria is met. This keeps the form validation process to a bare - minimum on the application side. - - In the form template, you put {validate ...} tags which handle error - messages that get displayed upon a validation error. - - -FEATURES: - - Supplied validation criteria includes empty, integer, float, price, - email syntax, credit card checksums, credit card exp dates, valid - date syntax, equality between fields, ranges, lengths, regular expression - matching and custom function calls. Create your own through Smarty plugins, - PHP functions or class methods. - - Transform functions can be applied to form values prior to validation, - such as trimming, upper-casing, etc. Create your own through Smarty Plugins, - PHP functions or class methods. - - {validate ...} tags can be located anywhere in your template, regardless of - where the corresponding fields are located. - - Multiple validators may be used for one field. Once one validator fails, - the remaining validators for that field are ignored. A "halt" parameter can - also stop validation on remaining fields. - - -CAVEATS: - - Smarty supports validation on single-level array values such as foo[] and - foo[bar], but does not (currently) support nested array validation such as - foo[bar][blah]. So you can do this: - - {validate field="foo[bar]" criteria="notEmpty" ...} - - - But not this: - - {validate field="foo[bar][blah]" criteria="notEmpty" ...} - - - -REQUIREMENTS: - - You must enable session management prior to using SmartyValidate. Do this - by calling session_start() at the top of your PHP application. - SmartyValidate also requires the Smarty template environment. - -INSTALLATION: - - It is assumed that you are familiar with the Smarty templating - installation and setup, so I will not explain Smarty template - directories and such. Please refer to the Smarty documentation for - that information. - - To install SmartyValidate: - - * Copy the 'SmartyValidate.class.php' file to a place within your - php_include path (or use absolute pathnames when including.) - * Copy all of the plugins to your Smarty plugin directory. (located - in the plugins/ directory of the distribution.) - -EXAMPLE: - - Here is a full working example of how to use SmartyValidate. Put the - form.tpl and success.tpl files in your Smarty template directory. - - - index.php - --------- - - display('form.tpl'); - } else { - // validate after a POST - SmartyValidate::connect($smarty); - if(SmartyValidate::is_valid($_POST)) { - // no errors, done with SmartyValidate - SmartyValidate::disconnect(); - $smarty->display('success.tpl'); - } else { - // error, redraw the form - $smarty->assign($_POST); - $smarty->display('form.tpl'); - } - } - - ?> - - form.tpl - -------- - - - - success.tpl - ----------- - - Your form submission succeeded. - - -PUBLIC METHODS: - - function connect(&$smarty, $reset = false) - ------------------------------------------ - - examples: - SmartyValidate::connect($smarty); - SmartyValidate::connect($smarty, true); - - connect() is required on every invocation of SmartyValidate. Pass your - $smarty object as the parameter. This sets up SmartyValidate with $smarty - and auto-registers the default form. Passing the optional second param as - true, the default form registration will get reset. - - function disconnect() - --------------------- - - examples: - SmartyValidate::disconnect(); - - This clears the SmartyValidate session data. Call this after you are - completely finished with SmartyValidate (eg. do NOT call between form - submissions.) - - - function register_object($obj_name,&$object) - -------------------------------------------- - - examples: - SmartyValidate::register_object('myobj',$myobj); - - Register an object with SmartyValidate for use with transform and criteria - functions. Typically do this right after issuing connect(). See the - register_criteria() method for more details. - - - function is_registered_object($obj_name) - ---------------------------------------- - - examples: - if(!SmartyValidate::is_registered_object('myobj')) { ... do something ... } - - Test if an object has been registered. - - - function register_form($form, $reset = false) - --------------------------------------------- - - examples: - SmartyValidate::register_form('myform'); - SmartyValidate::register_form('myform', true); - - Register a form to be validated. Each form must be registered before it can - be validated. You do not have to register the 'default' form, that is done - automatically by SmartyValidate. If you register a form that is already - registered, nothing will happen (returns false). If you have the optional - reset parameter set to true, the form will get reset (essentially - unregistering and reregistering the form.) - - - function is_registered_form($form) - ---------------------------------- - - examples: - if(!SmartyValidate::is_registered_form('myform')) { ... do something ... } - - Test if a form has been registered for validation. - - - function is_valid(&$formvars, $form = 'default') - ------------------------------------------------ - - examples: - SmartyValidate::is_valid($_POST); - SmartyValidate::is_valid($_POST, 'myform'); - - Tests if the current form is valid. You MUST supply the form variable array - to this function, typically $_POST. You can optionally pass a form name as - the second parameter, otherwise the 'default' form is used. Call this after - the form is submitted. - - - function register_criteria($name, $func_name, $form = 'default') - ---------------------------------------------------------------- - - examples: - SmartyValidate::register_criteria('isPass', 'test_password'); - SmartyValidate::register_criteria('isPass', 'test_password','myform'); - SmartyValidate::register_criteria('isPass', 'myobj::test_password'); - SmartyValidate::register_criteria('isPass', 'myobj->test_password'); - - Registers a new criteria function. All functions must be registered before - they can be used (or exist as a plugin.) You can optionally pass a form - name in the case you are not using the 'default' form. Static method calls - are also supported such as foo::bar. You can also register a method of an - object instance such as foo->bar, but you must first register the object - with SmartyValidate. See the register_object() method. Then use your new - criteria within the template: - - {validate field="Password" criteria="isPass" ... } - - Note: the "isCustom" criteria type is no longer supported (or necessary.) - See the "BUILDING YOUR OWN" section. - - function is_registered_criteria($func_name, $form = 'default') - -------------------------------------------------------------- - - examples: - if(SmartyValidate::is_registered_criteria('isPass')) { ... } - - Tests to see if a criteria function has been registered. - - - function register_transform($name, $func_name, $form = 'default') - ----------------------------------------------------------------- - - examples: - SmartyValidate::register_transform('upper','strtoupper'); - SmartyValidate::register_transform('upper','strtoupper','myform'); - - Registers a function to use with "transform" parameter. All functions must - be registered before they can be used (or exist as a plugin.) You can - optinally pass a form name in the case you are not using the 'default' - form. 'trim' is already registered by default. - - - function is_registered_transform($func_name, $form = 'default') - --------------------------------------------------------------- - - examples: - if(SmartyValidate::is_registered_transform('upper')) { ... } - - Tests to see if a transform function has been registered. - - - function register_validator($id, $field, $criteria, $empty = false, $halt = - false, $transform = null, $form = 'default') - --------------------------------------------------------------------------- - - examples: - - SmartyValidate::register_validator('fullname', 'FullName', 'notEmpty'); - SmartyValidate::register_validator('fullname', 'FullName', 'notEmpty', true); - SmartyValidate::register_validator('fullname', 'FullName', 'notEmpty', true, - false, 'trim', 'myform'); - - Register a validator with the form. You must register at least one - validator. If you specify multiple fields, separate them with a colon and - they will be passed into the validator as params field2, field3, etc. - - Example: - - SmartyValidate::register_validator('passcheck', 'pass1:pass2', 'isEqual'); - - {validator id="passcheck" message="your passwords must match"} - - - function set_page($page, $form = 'default') - --------------------------------------------------------------- - - examples: - SmartyValidate::set_page('1')); - - When doing multi-page forms, this value must be set proir to drawing each - page. Each validator must have a page="1" attribute for the given page. - - -SMARTYVALIDATE TEMPLATE VARS: - - For each form, the variable {$validate.formname.is_error} is a boolean set - to true or false indicating whether the form had any failed validators from - the last is_valid() call. is_error is initialized to "false". The default - form is denoted as {$validate.default.is_error}. - - -SMARTYVALIDATE FUNCTION SYNTAX: - - The basic syntax of the {validate ...} function is as follows: - - {validate field="foo" criteria="isNumber" message="foo must be a number"} - - Those are the three required attributes to a {validate ...} - function call. "field" is the form field the validation will - validate, "criteria" is the validation criteria, and "message" is - the message that will be displayed when an error occurs. - - -OPTIONAL FUNCTION ATTRIBUTES: - - FORM - ---- - - {validate form="foo" ...} - - If you are using a registered form other than the "default" form, - you must supply the form name with each corresponding validate tag. - - - TRANSFORM - --------- - - Note: This attribute has been deprecated, please set your transform functions with - the register_validator() function. - - {validate field="foo" ... transform="trim"} - {validate field="foo" ... transform="trim,upper"} - - "transform" is used to apply a transformation to a form value prior to - validation. For instance, you may want to trim off extra whitespace from - the form value before validating. - - You can apply multiple transform functions to a single form value by - separating them with commas. You must register all transformation functions - with the register_transform() method. By default, 'trim' is registered. - - Transformations will apply to every value of an array. If you want the - transformation applied to the array itself, you must specify with an "@" - symbol in front of each transform function: - - {validate field="foo" ... transform="@notEmpty"} - - If you want only a particular array element transformed, you must specify: - - {validate field="foo[4]" ... transform="notEmpty"} - {validate field="foo[bar]" ... transform="notEmpty"} - - - TRIM - ---- - - Note: the "trim" attribute has been deprecated, set your "trim" behavior - with a transform parameter of 'trim' in the register_validator() function. - Trim will trim whitespace from the form value before being validated, and - before the "empty" or "default" parameters are tested. - - - EMPTY - ----- - - Note: This attribute has been deprecated, please set your "empty" behavior with - the register_validator() function. - - {validate id="foo" ... empty="yes"} - - "empty" determines if the field is allowed to be empty or not. If - allowed, the validation will be skipped when the field is empty. - Note this is ignored with the "notEmpty" criteria. - - - HALT - ---- - - Note: This attribute has been deprecated, please set your "halt" behavior with - the register_validator() function. - - {validate id="foo" ... halt="yes"} - If the validator fails, "halt" determines if any remaining validators for - this form will be processed. If "halt" is yes, validation will stop at this - point. - - - ASSIGN - ------ - - {validate id="foo" ... assign="error"} - - "assign" is used to assign the error message to a template variable - instead of displaying the value. Use this when you don't want the - error message displayed right where the {validate ...} function is - called. - - - APPEND - ------ - - {validate id="foo" ... append="error"} - - "append" is used to append the error message to a template variable as an - array. This is an alternate to "assign". Use this when you want to loop over - multiple validation error messages and display them in one place. Example: - - {foreach from=$error key="key" item="val"} - field: {$key} error: {$val} - {/foreach} - - - PAGE - ---- - - {validate id="foo" page="1" ... message="fooError"} - - When doing multi-page forms, each validator must have a page attribute to - identify the page that it belongs to. The SmartyValidator::set_page('1') - function must be called prior to displaying the given page. - - - -TRANSFORM FUNCTIONS BUNDLED WITH SMARTYVALIDATE: - - - trim - ---- - - example: - - SmartyValidate::register_validator('fullname','FullName','notEmpty',false,false,'trim'); - - "trim": this trims whitespace from the beginning and end of the field. This - is useful to avoid confusing errors just because extra space was typed into - a field. - - default - ------- - - example: - - - SmartyValidate::register_validator('value','Value','isInt',false,false,'default:0'); - - {validate id="value" message="..."} - - "default": This sets the form value to the given default value in the case - it is empty. You can pass the default value as a parameter in the - register_validator() function (see above), or in the template as default="0". - - - makeDate - -------- - - example: - - SmartyValidate::register_validator('start','StartDate','isDate',false,false,'makeDate'); - SmartyValidate::register_validator('start','StartDate:year:month:day','isDate',false,false,'makeDate'); - - {validate id="start" message="..."} - - "makeDate": this creates a date from three other form fields constructed by - using the "field" parameter as the prefix, such as StartDateYear, - StartDateMonth, StartDateDay in the first example. This is the common format - used with date fields generated by {html_select_date}. You can supply three - specific form fields separated by colons as in the second example above. - - Here is a full example of how you might use "makeDate" transform function - and "isDateOnOrAfter" criteria function to compare two dates: - - // in PHP script, setup validators - SmartyValidate::register_validator('setdate', 'EndDate', 'dummyValid', false, false, 'makeDate'); - SmartyValidate::register_validator('compdate', 'StartDate:EndDate', 'isDateOnOrBefore'); - - - // template - {* generate the EndDate value from EndDateYear, EndDateMonth, EndDateDay *} - {validate id="setdate"} - {* generate StartDate, then compare to EndDate *} - {validate is="compdate" message="start date must be on or after end date"} - {html_select_date prefix="StartDate"} - {html_select_date prefix="EndDate"} - {* we need these two hidden form fields to hold the values generated by makeDate *} - - - - -CRITERIA BUNDLED WITH SMARTYVALIDATE: - - This is a list of the possible criteria you can use with - SmartyValidate. Some of them require their own special attributes. - - Note: setting criteria in the template is deprecated, use the - register_validator() function instead. - - notEmpty - -------- - - Tests if a field is empty (zero length). NOTE: using the "empty" flag with - this validator has no effect, it is ignored. - - example: - - PHP: - SmartyValidate::register_validator('v_fullname','FullName','notEmpty'); - - TEMPLATE: - {validate id="v_fullname" message="..."} - - - - isInt - ----- - - Tests if a field is an integer value. - - example: - - PHP: - SmartyValidate::register_validator('v_age','age','isInt'); - - TEMPLATE: - {validate id="v_age" message="..."} - - - - isFloat - ------- - - Tests if a field is a float value. - - example: - - PHP: - SmartyValidate::register_validator('v_fraction','fraction','isFloat'); - - TEMPLATE: - {validate id="v_fraction" message="..."} - - - - isNumber - -------- - - Tests if a field is either an int or float value. - - example: - - PHP: - SmartyValidate::register_validator('v_total','total','isNumber'); - - TEMPLATE: - {validate id="v_total" message="..."} - - - - isPrice - ------- - - Tests if a field has number with two decimal places. - - example: - - PHP: - SmartyValidate::register_validator('v_price','price','isPrice'); - - TEMPLATE: - {validate id="v_price" message="..."} - - - - - isEmail - ------- - - Tests if field is valid Email address syntax. - - example: - - PHP: - SmartyValidate::register_validator('v_email','email','isEmail'); - - TEMPLATE: - {validate id="v_email" message="..."} - - - - - isCCNum - ------- - - Tests if field is a checksummed credit card number. - - example: - - PHP: - SmartyValidate::register_validator('v_ccnum','ccnum','isCCNum'); - - TEMPLATE: - {validate id="v_ccnum" message="..."} - - - - isCCExpDate - ----------- - - Tests if field is valid credit card expiration date. - - example: - - PHP: - SmartyValidate::register_validator('v_ccexp','ccexp','isCCExpDate'); - - TEMPLATE: - - {validate id="v_ccexp" message="..."} - - - isDate - ------ - - Tests if field is valid Date (parsible by strtotime()). - - example: - - PHP: - SmartyValidate::register_validator('v_startDate','startDate','isDate'); - - TEMPLATE: - {validate id="v_startDate" message="..."} - - - - - isURL - ------ - - Tests if field is valid URL (http://www.foo.com/) - - - example: - - PHP: - SmartyValidate::register_validator('v_URL','URL','isURL'); - - TEMPLATE: - {validate id="v_URL" message="..."} - - - - - isEqual - ------- - - Tests if two fields are equal in value. - - - example: - - PHP: - SmartyValidate::register_validator('v_pass','pass:pass2','isEqual'); - - TEMPLATE: - {validate id="v_pass" message="..."} - - - - - - isRange - ------- - - Tests if field is within a given range. Must give low and high params. - - - example: - - PHP: - SmartyValidate::register_validator('v_mynum','num:1:5','isRange'); - - TEMPLATE: - {validate id="v_mynum" message="..."} - - - - isLength - -------- - - Tests if field is a given length. parameters 1 and 2 are min and max. use - -1 for no min or no max. - - example: - - PHP: - SmartyValidate::register_validator('v_username','username:3:10','isLength'); - - TEMPLATE: - {validate id="isLength" message="..."} - - - - isRegExp - -------- - - Tests a field against a regular expression. Expression must be fully - qualified preg_* expression. Note: it is recommended to use a custom plugin - instead of this validator, otherwise syntax limits may be a problem. - - - example: - - PHP: - SmartyValidate::register_validator('v_username','username:!^\w+$!','isLength'); - - TEMPLATE: - {validate id="v_username" message="..."} - - - - - isFileType - ---------- - - Tests if an uploaded file is a given type (just checks the extention - name.) Note: This function is not backward compatible prior to version 2.4. - - example: - - PHP: - SmartyValidate::register_validator('v_myfile','myfile:jpg,gif,png','isFileType'); - - TEMPLATE: - {validate id="v_myfile" message="..."} - - - - isFileSize - ---------- - - Tests if an uploaded file is under a given size. Size param can be suffixed - with "b" for bytes (default), "k" for kilobytes, "m" for megabytes and "g" - for gigabytes (kb, mb, and gb also work.) Note: This function is not - backward compatible prior to version 2.4. - - example: - - PHP: - SmartyValidate::register_validator('v_myimage','myimage:50k','isFileSize'); - - {validate id="v_myimage" message="..."} - - - - dummyValid - ---------- - - This is a dummy criteria that always validates to true. This is useful to - apply a transformation to a field without actually applying a validation. - NOTE: Using the "empty" flag with this validator is ignored, dummyValid - always validates true anyways. - - - example: - - PHP: - - SmartyValidate::register_validator('v_initdate','StartDate','dummyValid',false,false,'makeDate'); - - TEMPLATE: - {validate id="v_initdate"} - - - - isDateEqual - ----------- - - Tests if a date is equal to another. The dates must be parsible by strtotime(). - - - example: - - PHP: - SmartyValidate::register_validator('date_equal', 'StartDate:EndDate', 'isDateEqual'); - - TEMPLATE: - {validate id="date_equal" message="..."} - - - - - isDateBefore - ------------ - isDateAfter - ----------- - isDateOnOrBefore - ---------------- - isDateOnOrAfter - --------------- - - These all work similar to "isDateEqual" example above, but testing the dates - according to their respective function. - - - isCustom - -------- - - "isCustom" HAS BEEN REMOVED. Please see BUILDING YOUR OWN directly below. - -VALIDATE INIT -------------- - - Note: validate_init is deprecated now that we have register_validator(), - it shouldn't be necessary any more with no criteria in the templates. - - example: - {validate_init form="foobar" halt="yes" assign="error_msg"} - {validate field="name" criteria="notEmpty" message="name cannot be empty"} - {validate field="pass" criteria="notEmpty" message="pass cannot be empty"} - - {validate_init ... } sets parameter values that are implicitly passed to - each {validate ... } tag thereafter. This keeps the repeated verbosity of - {validate ... } tags to a minimum. Any initialized parameter can be - overridden in each {validate ... } tag. You can re-initialize the - parameters by calling {validate_init ... } again. - - -BUILDING YOUR OWN CRITERIA/TRANSFORM FUNCTIONS: - - Building your own custom functions has never been easier. First, we'll make - up a couple of new functions in the template. We'll make one criteria - function and one transform function. - - "isValidPassword" and "upper" are names we are using in the validator - registration reference your new custom functions. These are not necessarily - real PHP function names, it just the names used by the validator. - - You can do one of two things: make Smarty plugins so the new functions are - automatically found and used, or write PHP functions and register them - directly. - - SMARTY_PLUGIN METHOD: - - In your Smarty plugin directory, create a new file named - validate_TYPE.NAME.php where TYPE is either 'criteria' or 'transform', and - NAME is the name of the new function. The corresponding function names in - the plugin files must follow the convention smarty_validate_TYPE_NAME() - where TYPE and NAME are the same TYPE and NAME from the filename. The NAME - is the criteria/transform name that will be used in the template. In our - example, the filenames will be validate_criteria.isValidPassword.php, and - validate_transform.upper.php. (The template will be calling - criteria="isValidPassword" and transform="upper") - - - validate_criteria_isValidPassword.php - ------------------------------------- - - - - validate_transform_upper.php - ---------------------------- - - - - Your criteria functions must contain the four parameters given in the - example above. The first parameter is the form field value being validated. - The second is the boolean "empty" value given as a parameter to the - validator (or false if none was given). $params contains all the parameters - passed to the validator, and $formavars contains all the form information. - The last two are passed by reference so you can edit the original values if - need be. - - All custom criteria should return a boolean "true" or "false" value to - indicate to SmartyValidate that the validation passed or failed. You do NOT - print error messages inside the function, except for errors dealing with a - misconfiguration of the validator such as a missing parameter. If the - validator fails, the error message for the person filling out the form - should already be set in the template {validator ... message="error!"} - - Transform functions have three parameters, the first being the field value - being transformed, and the second is all the parameters passed to the - validator, and the third is the form variables. The last two are passed by - reference so you can edit the original values if need be. The transform - function should return the transformed value of $value. - - If the file names and function names follow the above convention, no - registration of the functions are necessary, SmartyValidate will locate and - use the plugins. All of the functions that ship with SmartyValidate are plugins. - - -MANUAL REGISTER METHOD: - - You can manually register your functions instead of using plugins. This is - useful if you have a function specific to one application and a Smarty - plugin may not be the most practical place for it. You can also register - class methods this way. - - First example will be a straight forward PHP function: - - function check_pass($value, $empty, &$params, &$formvars) { - // do your logic here, check password, return true or false - } - - After your function exists, you can register it with SmartyValidate: - - SmartyValidate::register_criteria('isValidPassword','check_pass'); - - Transformation functions are done the same way: - - SmartyValidate::register_transform('upper','my_upper_func'); - - You can also register class methods. First, you must register the object - with SmartyValidate, then register the method(s): - - SmartyValidate::register_object('my_obj', $my_obj); - SmartyValidate::register_criteria('isValidPassword','myobj->check_pass'); - SmartyValidate::register_transform('upper','myobj->my_upper_method'); - - Calling PHP functions or class methods look exactly the same, you just use - the registered name(s) like so: - - SmartyValidate::register_validator('v_foo','foo','isValidPassword',false,false,'upper'); - - Just like functions that come with SmartyValidator, all functions are - applied to every element of an array coming from the form. If you want your - function to act on the array itself, you must specify that in the - registration: - - SmartyValidate::register_validator('v_foo','foo','@isValidPassword',false,false,'@upper'); - - If you want a specific array element validated, you must specify: - - SmartyValidate::register_validator('v_foo','foo[4]','isValidPassword',false,false,'upper'); - SmartyValidate::register_validator('v_foo','foo[bar]','isValidPassword',false,false,'upper'); - - - -CREDITS: - - Thanks to the many people who have submitted bug reports, suggestions, etc. - - Edwin Protomo - John Blyberg - Alexey Kuimov - boots (from forums) - xces (from forums) - electr0n (from forums) - Justin (from forums) - hristov (form forums) - - Anyone I missed, let me know! - - -COPYRIGHT: - Copyright(c) 2004-2005 New Digital Group, Inc. All rights reserved. - - This library is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or (at - your option) any later version. - - This library is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - License for more details.