RELEASE HISTORY

1.2.8
*	Bug fix: code profiler's DB.cache element not indexed properly
*	Bug fix: Empty tags are not XHTML-valid

1.2.7
*	CAPTCHA and error handling code refactored
*	Minor performance tweaks in template engine
*	Bug fix: Apache-specific function in bootstrap code
*	Bug fix: spam detection for private IPs

1.2.6
*	F3::repeat template directive now has a new HTML/XML attribute: "key".
	Whereas the "index" attribute returns the value of the current element
	in the iteration, "key" returns the array key of the element. This
	eliminates the need to use {array_search(@index,@group)} just to get
	the key; This also solves issues related to the use of array_search
	function on arrays with duplicate values - see updated online
	documentation and sample applications in the downloads section of the
	SourceForge project site
*	Code refactoring: reverted to direct use of class properties in private
	stash method due to severe degradation in PHP performance when passing
	properties by reference (experienced only when using large templates:
	10,000+ HTML elements)

1.2.5
*	More informative error messages when index or group attributes in
	F3::repeat template directive cannot be resolved
*	Spammer detection engine now generates HTTP 404 message by default
*	Bug fix: F3::include directive

1.2.4
*	F3db sync method now uses DB as default database ID
*	AUTOLOAD now allows class hierarchies to reside in similarly named
	subfolders; so if you want to autoload a PHP 5.3 namespaced class
	that's invoked this way:-
		$obj=new gadgets\ipad; // or gadgets\ipad::start();
	you should create a folder hierarchy that follows the same structure:
		autoload/gadgets/ipad.php
*	PDO extensions now checked if loaded prior to use
*	DNSBL engine now sniffs real IP address if user is behind a proxy
*	Corrections in the cheat sheet

1.2.3
*	NEW: SPAM global variable; Reroutes spammers to the specified URL
	automatically
*	NEW: DNSBL variable; Blacklist(s) used by the spammer-blocking engine;
	Default value is dnsbl.sorbs.net
*	NEW: AUTOLOAD variable; Points to path where framework autoloads
	undefined classes (default value is /classes); If class contains a
	start() method, it is automatically used as a bootstrap
*	Expansion Pack's identicon method now allows template expression as
	argument
*	Bug fix: copyFrom method doesn't set Axon status to hydrated

1.2.2
*	NEW: Multiple databases (see online documentation for details); As a
	consequence, Axon constructor and sql method syntax have been modified
	a bit (may break your existing code if you specified cache timeouts; it's
	just the order of the arguments that changed - so this should be easy to
	fix)
*	NEW: Bandwidth throttling for high-traffic Web sites and protection
	against DOS attacks; THROTTLE global variable allows you to specify the
	minimum run-time duration of your application (in milliseconds)
*	Expansion Pack's http method now accepts an optional 4th argument;
	if TRUE (default) follows redirection (HTTP Location header) to any
	page
*	Bug fix: XML encoding

1.2.1
*	NEW: transpose method rotates a two-dimensional framework array
	variable, i.e. rows become columns, and vice versa
*	Change in behavior: TEST global variable array restructured to match
	SQL query presentation; rows match each invocation of the expect method,
	each row having a "result" and "text" column; To emulate previous
	framework behavior just add an F3::transpose('TEST') before using the
	variable
*	expect method now returns text result of assertion, i.e. the "pass" or
	"fail" message
*	Unit testing tools mock and expect methods now part of Expansion Pack
	to reduce overhead on production systems
*	Change in behavior: profile method now returns cached and executed SQL
	commands instead of simply counting queries; fonts loaded and
	corresponding file sizes also added
*	Cache TTL of Axon sync now set to a default of 60 seconds
*	Lots of F3db code optimization
*	PNG images generated by Expansion Pack methods are now compressed
*	CAPTCHA and router code refactored
*	Framework exception handler now uses debug_backtrace as fallback if
	exception's getTrace is empty
*	Contents of PHP's $_GLOBALS variable now suppressed from stack trace
	for added security - appears only as array(GLOBALS)
*	RESTful interface map method now accepts objects and PHP class names as
	an argument
*	Template engine does not display *Error* anymore when illegal functions
	are used; it just appears as plain text for easier debugging
*	Bug fix: Template rendering of empty F3::repeat blocks
*	Bug fix: SQL rollback
*	Bug fix: Aspect ratio of thumbnails
*	Bug fix: exists method not working properly with multi-dimensional arrays
*	Bug fix: URL caching
*	Bug fix: recursive display of GLOBALS in the stack trace when error is
	triggered by an application exhausts PHP memory
*	Bug fix: mock method doesn't set REQUEST framework variable when passing
	simulated GET/POST key-value pairs

1.2.0
*	NEW: Database Pack now combines Fat-Free's SQL handler and Axon ORM in
	a single package; Core and Expansion Packs are thinner due to this
	reorganization - combined package still weighs in at 78KB!
*	NEW: Variable variables
*	NEW: F3::send method for handling file download requests
*	NEW: Axon def, undef and isdef methods for virtual fields (see updated
	Axon ORM section of online documentation)
*	Change in behavior: Axon found method now returns number of rows that
	match specified (instead of a boolean value)
*	Axon load method now accepts sort sequence as second argument to help in
	SQL navigation
*	Axon find and lookup methods now allow query caching
*	ob_gzhandler now disabled if Apache mod_deflate is active
*	Double-quotes in strings now handled safely; converted automatically to
	XML entity &#34; to help protect against SQL injection
*	Framework now triggers an error if run on <5.3 PHP version
*	Bug fix: Decoding of HTML entities in F3::check tags during template
	rendering
*	Bug fix: Error and exception handling in bootstrap code
*	Fixed inaccuracies and conflicting statements in online documentation

1.1.3
*	NEW: skip method for Axon pagination; useful for retrieving the N-th
	record relative to current following the same criteria used to hydrate
	the Axon (see updated Axon ORM section of the online documentation)
*	NEW: Limits on number of records retrieved by Axon lookup and find
	methods added to argument lists
*	Forms handler, Axon ORM and SQL handler now provide better support for
	UTF-8: tested against data from http://www.columbia.edu/kermit/utf8.html
*	More performance tweaks: HTML/XML templates rendered faster
*	Framework now supports non-Apache servers
*	Closures provide no value to stack traces; filtered out
*	Lots of code refactoring

1.1.2
*	TEST variable now has two indices: TEST.result returns an array of
	boolean values, TEST.text returns an array of string values; Elements
	of both arrays correspond with the results of every F3::expect in
	your code (see the updated Unit Testing section of the online
	documentation)
*	Template tokens in F3::expect pass/fail messages now allowed
*	F3::resolve code optimization; template rendering speed improved
*	Bug fix: resurgent error in Javascript/CSS fragments
*	Bug fix: Axon error messages

1.1.1
*	Quick bug fix in bootsrap code

1.1.0
*	NEW: Code profiler! Use the new F3::profile method to get detailed
	runtime information about your application (see online documentation
	for more details)
*	Change in behavior - automatic sanitation of PHP globals, i.e. removal
	of ALL HTML/PHP tags, has now been deprecated to accommodate Javascript
	textarea editors like TinyMCE, CKEditor, etc. so these scripts can pass
	data containing HTML tags; Workarounds: Use F3::scrub to clean variables
	programmatically (before using PHP globals like $_REQUEST, $_SESSION,
	etc.) or specify the HTML tags allowed in specific input fields;
	Details in the online documentation (Forms Handler section)
*	F3ex is now a totally-separate class but still dependent on the F3 class
*	Performance improvement in large HTML templates
*	Due to the number of significant features introduced, we decided to skip
	the release of version 1.0.1 release (mostly bug fixes mentioned here)
	and head straight for 1.1.0!
*	Bug fix: Dynamic sitemap character set encoding
*	Bug fix: Non-quoted keys and array dot notation work fine but quoted
	elements inside user-defined framework array variables are not handled
	properly

1.0.0
*	NEW: Axon auto-mapping ORM (see online documentation for more details)
*	Refactoring of bootstrap code and expansion pack loader
*	Improved CAPTCHA randomizer
*	Code optimization: 8-12% performance gain in template rendering
*	Minify code adjusted to accommodate IE's weird behavior when certain
	whitespaces are removed from CSS

0.9.5
*	F3::resolve code refactoring
*	Several minor bug fixes

0.9.4
*	Bug fix: F3:repeat and F3:check broken in parent HTML tags without
	attributes
*	Bug fix: Template directive inside Javascript fragment triggers an error

0.9.3
*	NEW: F3::identicon generates visual respresentations of MD5 hash values
	(or any hex-string) - you don't need Gravatar anymore!
*	NEW: F3::fakeimage method for generating image placeholders in your
	Web pages
*	Some refactoring in template engine and CAPTCHA code
*	Bug fix: Javascript and unbraced F3:repeat index tokens are not
	rendered properly by template engine

0.9.2
*	NEW: F3::map method conveniently maps RESTful routes to a PHP class;
	see example in the documentation
*	Bug fix: SQL transactions do not rollback properly
*	Bug fix: F3::set method fails when attempting to assign an array value
	to either REQUEST or SESSION global variables (a very unusual case)
*	Bug fix: F3::serve and F3::resolve render XML entities incorrectly

0.9.1
*	NEW: F3::http method for communicating with other servers via HTTP/S;
	F3::http sends a request to another host, respects HTTP 30x redirects,
	forwards headers received and returns content
*	NEW: F3::uriQuery method for converting an array of key-value pairs to
	a URI query string that can be used in HTTP requests to another server
*	F3::encoding method deprecated; Use new global variable ENCODING to set
	character set used for document encoding: default value is still UTF-8

0.9.0
*	NEW: F3::sitemap method for generating dynamic sitemaps!
*	NEW global variables:
	-	QUIET for toggling display of program output, RESPONSE still
		contains actual output - useful for unit testing;
	-	TIME returns time the application started
	-	TTL returns current page's cache timer (in seconds)
*	Provision for additional dynamically-loaded expansion packs
*	PHP extensions take precedence over user-defined classes in F3::allow
	method
*	Bug fix: session variables containing arrays not cleared properly

0.8.8
*	Fat-Free methods and templates now allow array dot-notation; for
	example - instead of @ERROR[code] and @my[multi][dimensional][array]
	(which are prone to unbalanced brackets), you can use @ERROR.code and
	@my.multi.dimensional.array, respectively
*	Added PHP's isset() and empty() language constructs to functions
	permitted in templates
*	Framework now sends different HTTP status codes for page redirects;
	HTTP 303 if form is being submitted, HTTP 301 (permanent) if none
*	F3::sql syntax simplified
*	Bug fix: Apache crashing intermittently when unknown F3 method is called
*	Bug fix: Removed code fragment related to output suppression after error
	has occurred due to side effects in unit testing

0.8.7
*	Framework now dsiables cache and prohibits further output once error
	page is displayed
*	Code optimization in SQL handler
*	Bug fix: Erratic behavior when sending HTTP header expiration date to
	browser

0.8.6
*	Fat-Free now has tools for unit testing!
*	NEW: F3::http404 method
*	Bug fix: Expansion pack methods with return values now handled properly

0.8.5
*	NEW: F3::validurl method returns TRUE if string argument is a valid URL
*	Error message when attempting to connect to a non-existent database is
	now more informative

0.8.4
*	Accompanying blog demo now includes an RSS feed/template
*	Bug fix: import files, unlike static methods and instantiated objects,
	are not called properly

0.8.3
*	Static methods and methods of instantiated objects can now be used as
	arguments to F3::route, F3::call, and F3::input

0.8.2
*	Speed improvements in the template engine
*	Better support for hosts that have zlib.output_compression turned on by
	default and browsers that don't accept GZip-encoded data
*	GZip output compresion level adjusted to reduce load on shared hosts
*	Some code optimization and additional controls in arguments passed to
	class methods

0.8.1
*	Fat-Free is now distributed in separate but tightly-linked modules: the
	Core Pack, which provides the base framework functionality, and the
	optional Expansion Pack, which works seamlessly with the Core and
	includes the CAPTCHA image generator, Javascript/CSS compressor, and
	thumbnail image creator; Nothing has changed in terms of framework usage
	and syntax - if you don't need the functions in the Expansion Pack, just
	delete the F3ex.php file
*	Stack trace behavior now consistent among different OS

0.8.0
*	NEW: database query caching; F3::sql method now provides a cache timeout
	as a function argument - similar to the F3::route method; speed gains
	can be significant specially in complex queries involving SQL look-up
	tables that contain static data
*	Dropped the generic BASE global variable to allow some flexibility in
	organizing directory structures and provide additional security
*	Improved the documentation on the use of IMPORTS, CACHE, GUI, and FONTS
	global variables; applications using previous versions of the framework
	could break with this re-definition of Fat-Free globals; it should be
	easy to restructure though, if all global definitions are in the main
	controller and master template
*	Cache engine now locks files before saving to prevent corrupted data
	from being retrieved by HTTP clients during high-traffic
*	Bug fix: F3::reroute fails when an application sends additional output
	after HTTP headers

0.7.5
*	Additional instructions in the documentation on the proper use of the
	cache
*	Fixed HTTP headers to support IE6 browsers
*	Some code optimization

0.7.4
*	Improved error/exception stack traces
*	Use of F3::minify method restricted to .js and .css files
*	Aside from PHP's $_SERVER and $_REQUEST variables, $_GET is now also
	auto-populated with values received in command line mode
*	Blog demo updated to use new Fat-Free mods
*	Bug fix: Session variables not saved when F3::reroute is followed by
	additional data sent to browser

0.7.3
*	More speed improvements: F3::cache now looks at If-Modified-Since HTTP
	request header and sends 304 Not Modified response instead of full
	HTML content
*	F3::minify method now gives better compression levels and supports JS
	conditional comments
*	Fat-Free scripts can be run from the command line; Example:-
		php index.php "/about"
	This will run index.php at the current directory and pass the /about URL
	to the framework. Routes are limited to HTTP GET. (POST doesn't make
	sense when used as an HTTP method on the command line). You can pass GET
	variables though:-
		php index.php "/min?base=gui/js&files=lib-core.js,lib-more.js"
*	Bug fix: setting BASE outside of Web root now works properly

0.7.2
*	Improved caching; files are now gzipped to save on disk space
*	More server- and browser-side performance tweaks
*	F3::minify method now uses a more conservative and safer compression
	algorithm
*	Cached documents now delivered properly with correct MIME content type

0.7.1
*	NEW: F3::minify method for combining/compressing Javascript/CSS files
*	$_SERVER['REQUEST_URI'] now automatically converted to human-readable
	string for easier routing/control declaration
*	Bug fix: URLs containing GET variables
*	Some code optimization

0.7.0
*	Changed license to GPLv3.0

0.6.5
*	NEW: F3::route method now allows you to specify a cache timeout; a
	previously-rendered Web page will be retrieved from cache if the timer
	has not expired; otherwise, the framework calls the route handler(s) to
	refresh the cached page
*	F3::serve doesn't render strings anymore; Use F3::resolve instead

0.6.4
*	Bug fix: stack trace levels are not sequential

0.6.3
*	TRACE global variable dropped in favor of boolean RELEASE variable;
	when set to TRUE eliminates stack trace from HTTP error page, but still
	appears completely in Web server's error log; set to FALSE to indicate
	the application is still in development (stack trace will appear in
	HTML output)

0.6.2
*	HTML output now automatically gzip-compressed if browser supports it
*	Default error page converted to XHTML 1.0 Strict
*	Passing 'user' as an argument to the F3::allow method now gives
	template designers access to user-defined functions in PHP scripts
*	F3::reroute method now allows use of template tokens

0.6.1
*	Bug fix: F3::serve causes break/continue error

0.6.0
*	Updated inline documentation
*	NEW: FILES global variable
*	NEW: MAXSIZE global variable representing maximum file upload size in
	bytes; use in the following manner:-
		<input type="hidden" name="MAX_FILE_SIZE" value="{@MAXSIZE}"/>
	Of course you still need to set enctype="multipart/form-data" in your
	HTML <form/> tag
*	Quick Reference Card updated to reflect the new F3::resolve method
*	Bug fix: character set encoding interferes with file upload behavior

0.5.1
*	Private method evaluate() renamed to F3::resolve and made public;
	Template expressions can now be embedded in string literals, so you can
	do this:-
		$x=F3::resolve('{@a}bcd{@e}');
	instead of:-
		$x=F3::get('a').'bcd'.F3::get('e'};.
*	Bug fix: <F3:check> directive behavior

0.5.0
*	Dropped the name F3::PHP to avoid being associated with another
	framework; It's now called "PHP Fat-Free Framework", or simply Fat-Free
*	Fixed inconsistencies in <?php ?> tags in the demo
*	F3::set and F3::qq methods now allow the use of template tokens inside
	string literals
*	Minor corrections in the quick reference card

0.4.7
*	ZIP archive now contains a quick reference card
*	Better error/exception handling

0.4.6
*	Documentation updated
*	Framework now emits *Error* in template expressions with syntax errors

0.4.5
*	XML tree traversal now uses post-order sequence to correct some bugs in
	processing of nested <F3:check> directives and improve performance

0.4.4
*	Bug fix: evaluation of complex expressions

0.4.3
*	NEW: F3::qq method encloses string(s) in double-quotes and prepends
	backslashes to characters that need to be quoted in database queries;
	Also adds commas if multiple arguments are present
*	Data retrieved from SQL database now automatically stripped of slashes
*	Added protection for processing of NULL SQL statement
*	Added PHP's date/time and PCRE extensions to default allowed template
	functions
*	Bug fix: erratic behavior in <F3:check> directive

0.4.2
*	Framework now automatically starts session when invoked
*	F3::set and F3::clear methods now synchronizes PHP's $_REQUEST and
	$_SESSION variables with Fat-Free's REQUEST[] and SESSION[] globals
*	Multiple TrueType fonts for CAPTCHA images now possible
*	PHP $_SESSION exempted from scrubbing to allow saving of non-scalar
	values in session variables
*	F3::call now allows function and include file chaining
*	F3::context method access changed to public
*	FORM[] global variable deprecated

0.4.1
*	NEW: CAPTCHA image generation via F3::captcha method

0.3.10
*	Better SQL error reporting
*	Additional check for empty <F3:true> or <F3:false> directives
*	Global variable DB['result'] now returns NULL when either an SQL error
	occurs or an empty SQL set is returned
*	Bug fix: file upload scrubbing

0.3.9
*	Code optimized
*	Bug fix: incorrect route handling of closures
*	Bug fix: <F3:repeat> groups contained inside <F3:check> directives
	that evaluate to false result in HTML fragment errors
*	Bug fix: Successive <F3:check> directives handled incorrectly
*	Bug fix: <F3:true> and <F3:false> tags incorrectly added to HTML
	templates

0.3.8
*	Bug fix: route handling of trailing parts of URI variable
*	Bug fix: 404 error handling

0.3.7
*	<F3:check> template directive can now handle TRUE/FALSE (if/else-like
	construct)
*	Relational operators && and || now allowed in Fat-Free expressions
*	Removed automatic session_start() from code; Should now be initiated
	manually by user
*	Bug fix: cache ignored when value changes
*	Lots of code optimizations

0.3.6
*	Added private method F3::scrub to automatically clean form fields and
	protect against code injection attacks
*	Removed global variable CHARSET; Added the F3::encoding command, which
	is a more convenient way of changing the default character set
*	Changed F3::error argument sequence so they mimic PHP's Exception()
*	Import files used as form field handlers now prohibited, due to their
	inability to pass/receive the values for use in validation, etc.
*	Changed the asterisk (*) to indicate an import file in URI route and
	form field handler chains to colon (:). This should make its usage
	distinct from the asterisk (*) in URI route patterns.
*	Corrections in the documentation
*	More code optimizations

0.3.5
*	Added F3::input convenience method for form field processing/validation
*	Added F3::exists method for determining if a Fat-Free variable has been
	created/assigned a value
*	Added F3::httpStatus for sending HTTP/1.1 status response headers
*	Bug fix: <F3:check> directive
*	Error and exception handlers optimized

0.3.4
*	Simplified Fat-Free expression syntax pattern
*	Bug fix: program not routing properly after calling multiple functions/
	import files
*	More code optimizations

0.3.3
*	Integrated cache and symbol table for faster template rendering
*	Optimized code involved in parsing <web:repeat> directives
*	Removed code segment that performs recursive evaluation of variables
	containing Fat-Free template tokens due to possible cyclic redundancies
*	Bug fix: error/exception handling

0.3.2
*	Added CHARSET to Fat-Free global variables; set to UTF-8 by default
*	Renamed private method Runtime::external to Runtime::call
*	Fixed brackets mangled by PHP
*	Optimized code involved in evaluation of F3 expressions
*	Message *Error* now displayed when illegal function is used in template

0.3.1
*	Minor changes in documentation

0.3.0
*	Released as open-source project
