# Spry framework for Ajax Change Log

This document contains information regarding changes that have been made to the Spry framework from one release to another. See the Spry Readme for general information regarding this technology.

### Changes for Spry 1.6 - 2007/10/01

- Data
  - By default, the XMLDataSet now entity encodes #text and #cdata strings before storing them in a data set column. This has a significant impact if you are embedding HTML fragments within CDATA, in your XML files, to inject content into a spry:region or spry:detailregion. A backwards compatibility mode is provided. See the XML Data Set String Handling and HTML Frags in XML samples.
  - The following Spry.Utils functions have been moved under the Spry.Data.XMLDataSet namespace:
    - Spry.Utils.nodeContainsElementNode
    - Spry.Utils.getNodeText
    - Spry.Utils.CreateObjectForNode
    - Spry.Utils.getRecordSetFromXMLDoc
  - Detection of MSXML is now limitied to versions 6.0 and 3.0, based on recommendations from the MS IE and XML teams. More info can be found here and here.
  - Upgraded Google AJAXSLT XPath support from version 0.4 to 0.7 to pick up bug fixes and stay current.
    - Upgrade fixes infinite loop bug with xpaths like: //folder/ancestor::folder, which was reported on the forum.
  - JSONDataSet
    - Fixed a bug in the pathIsObjectOfArrays code path that was assigning the same ds_RowID to every row that was flattened.
  - NestedJSONDataSet
    - Fixed loadData() so that it calls loadData() on the parent data set when necessary. This fixes the case where a nested data set is bound to a region but the parend data set isn't.
  - NestedXMLDataSet
    - Fixed loadData() so that it calls loadData() on the parent data set when necessary. This fixes the case where a nested data set is bound to a region but the parend data set isn't.
  - Added support for "and" and "or" multi-filter modes.
  - Added Spry.Data.initRegionsOnLoad flag. If set to true (the default value), regions are processed automatically when the onload event is fired. If false, developers must manually call Spry.Data.initRegions() manually to trigger processing.
  - Modified Spry.Data.initRegions() so that it only triggers updates for regions it processed. This allows us to call initRegions() multiple times for dynamically added regions without affecting existing regions.
  - Modified Spry.Data.DataSet.prototype.loadData(), Spry.Data.HTTPSourceDataSet.prototype.setDataFromDoc(), and Spry.Data.HTMLDataSet.prototype.loadData() so that they disable notifications before calling filterAndSortData(). This prevents an extra onDataChanged notfication from being fired off in the case where the data set must apply an existing filterDataFunc, filterFunc, sortOnLoad, or distinctOnLoad behavior.
- Effects
  - Removed the unused class Spry.Effect.Utils.PositionedRectangle.
  - Toggle doesn't work correctly with the Do* wrappers when the first argument is an id.
  - DropOut
    - Added dropIn option to change the droping direction to top of the page.
  - Size
    - Fixed an error message for IE when the useCSSbox was enabled and the element was initially invisible.
- Widgets
  - Accordion
    - Changed "returnResult" references to "returnValue". Events should now properly prevent default actions in IE.
  - Autosuggest
    - The list of suggestions will appear now on top of select/flash movies on IE (IE bug).
  - CollapsiblePanel
    - Fixed attachBehaviors so that it adds the openClass name to the collapsible panel if the panel is open by default.
    - Changed "returnResult" references to "returnValue". Events should now properly prevent default actions in IE.
  - HTMLPanel
    - A widget that allows you to load HTML fragments into an element.
    - This widget supports observers, and alternate markup for loading and error states.
    - Samples:
      - HTMLPanel Sample
      - HIJAX Sample that uses an HTMLPanel.
  - Menu Bar
    - IE IFrame hack is now used for IE6 browsers only. The CSS for the IFrame was also modified to render with an opacity of .1 to minimize interference with menus that have an opacity less than 1.
  - Sliding Panels
    - Changed "returnResult" references to "returnValue". Events should now properly prevent default actions in IE.
  - TabbedPanels
    - Changed "returnResult" references to "returnValue". Events should now properly prevent default actions in IE.
  - Tooltip
    - Introducing the Tooltip widget.
  - Password Validation
    - Introducing the Password Validation widget.
  - Confirm Validation
    - Introducing the Confirm Validation widget.
  - Added Validation TextArea Reference file.
  - Added Validation Textfield Reference file.
  - Added Validation Checkbox Reference file.
  - Added Validation Select Reference file.
  - Added Validation Radio Button Reference file.
- Docs
  - Fixed incorrect variable name in one of the code samples used in effects_migration.htm.
  - Added the Tooltip widget overview.
  - Fixed a couple of code sample typos for getMappedState() and getState() in the Region API doc.
  - Added a Spry Primer.
  - Adding API docs for:
    - Accordion
    - Collapsible Panel
    - Tabbed Panel
    - Autosuggest
    - Sliding Panels
    - Radio Validation
    - Checkbox Validation
    - Textarea Validation
    - Textfield Validation
    - Nested XML Data Set
    - Nested JSON Data Set
    - Menu Bar
    - Element Selector, in the Data Utils section.
  - Added Confirm Validation Overview
  - Added Password Validation Overview
  - Added HTML Panel widget Overview
  - Added Element Selector Overview and Selector Examples
  - Added Periodic Table case study.
  - Added articles/best practices folder to contain the articles.
  - Added index page for best practices.
  - Added Web Standards doc.
  - Moved Validating Spry Pages to 'best_practices folder.
  - Added Spry Site Map.
  - Added Widgets Landing Page.
  - Added Progressive Enhancement Article
  - Added Separating Behavior from Structure Article
- Demos
  - Products Demo
    - Converted all CDATA blocks into normal text.
    - Added a call to set the column types to "html".
  - Added Periodic Table as a demo.
  - Added new versions of the Products and Gallery demos that demonstrate progressive enhancement and unobtrusive JavaScript.
    - Products Demo (Static Content + HTMLDataSet)
      - Demonstrates how to transform static content into a new format by using the HTMLDataSet and Spry Regions.
    - Gallery Demo (Static Content)
      - Demonstrates how to attach widget behaviors to static content.
    - Gallery Demo (Static Content + HTMLDataSet)
      - Demonstrates how to transform static gallery content into a new format by using the HTMLDataSet and Spry Regions.
    - Gallery Demo (Original Version)
      - The original demo modified to work with the widget behaviors used by the 2 demos listed above. The older gallery demo from previous releases can be found here.
  - Added a separate page for the best practices demos.
- Samples
  - Added Menu Bar styling samples.
    - Auto Width Horizontal Menu Bar
    - Auto Width Vertical Menu Bar
    - Centering a Horizontal Menu Bar
  - Fixed missing # in CSS rule used in SlidingPanelsSample2.html. This was resulting in a giant black border in certain cases when folks tried to use the CSS in IE6.
  - Progressive Enhanced Version of the Products Demo
    - Modified the products.xml file to use entity encoded HTML fragments instead of HTML fragments embedded in CDATA.
    - Added a call to setColumnType() in all related HTML sample files to set the columns for the data set to "html" so the fragments appear properly.
  - HTML Frags In XML Sample
    - Updated content to take into account the fact that the XMLDataSet now entity encodes all #text/#cdata strings it extracts from XML.
  - Added XML Data Set String Handling Sample.
  - Added sample for Tooltip and Tooltip from Spry Data.
  - Added a sample for Validation Select with Data.
  - Added a sample of Menu Bar from Spry Data.
  - Added a Built In Data Reference sample.
  - Added Unobtrusive Collapsible Panel sample.
  - Added Unobtrusive Accordion sample.
  - Added HTML Region sample.
  - Added Confirm Validation sample.
  - Added Password Validation sample.
  - Added Tabbed Panels with updateContent sample.
  - Updated AutoSuggest with JSON data set sample.
  - Added unobtrusive samples for Sliding Panels and Tabbed Panels.
  - Added basic unobtrusive sample for Spry Data.
  - Added add/removeEventHandler sample.
  - Added Alt Row Samples for Element Selector. Sample 1 | Sample 2.
  - Added advanced HTML Panel sample.
  - Added advanced Element Selector with Spry Data sample.
  - Added sample for single error message on submit - validation widgets - sample
  - Added a Multiple Filters Mode Sample.
  - Added table manipulation Element Selector sample.
  - Added unobtrusive Menu Bar sample.
  - Added styling autosuggest sample
- Compressed files
  - Introduced a set of compressed and minimized javascript files for all our data, widget and effects. Used the Packer method for compression. These substantially reduce the file size of the assets.
- Dreamweaver CS3 Updater
  - Added an extension that updates the existing features in Dreamweaver CS3 to use the latest Spry files. The overview document is here.

### Changes for Spry PreRelease 1.5 - 2007/5/17

- Data
  - Renamed $() to Spry.$() to avoid problems when integrating other toolkits that define their own $() functions. Folks who wish to keep using $() can simply add "var $ = Spry.$;" at the bottom of SpryData.js to restore functionality.
  - Fixed a bug where findRowsWithColumnValues() was returning an empty array instead of null when no matching row was found and firstMatchOnly was specified.
  - Added Session Expired hook for data loading to allow developers to catch session expired server messages and handle the response appropriately.
  - Added SpryUtils.js file that contains Spry.Utils.submitForm function to allow developers to send form data via the XMLHTTPRequest object.
  - Added for DataSet.distinct() a list of fields. The Data set constructor has a new parameter distinctFieldsOnLoad.
  - Added HTMLDataSet support. Implementation uses a separate file SpryHTMLDataSet.js, but SpryData.js is still required.
  - Added SpryPagedView class to make paging of data easier.
  - Added Spry.Data.DataSet.prototype.setDataFromArray() to make it easier for folks to initialize a base data set from an Array.
  - Added missing onPostLoad notification to Spry.Data.DataSet.prototype.loadData().
  - Modified createXMLHttpRequest() so that it tries to use the ActiveX version of the XMLHttpRequest object first, so that developers can still load file:// urls when running IE7 in the local zone.
  - Modified processTokens() and processTokenChildren() so that they always use an output array to collect the generated strings. This boosts the performance of the transformation process 35% on IE 6.
  - Column Types:
    - Added Spry.Data.DataSet.prototype.applyColumnTypes() which gets invoked after the data in a data set is loaded. It runs through all rows of the data set and converts its values to match the column types.
    - Added an "html" column type which results in the automatic entity decoding of values stored in a column of that type.
    - setColumnType() now takes a column name string *or* an array of column name strings as its first argument.
  - Added SpryDataExtensions.js which contains advanced features that *some* developers may want to take advantage of.
    - Added support for multiple non-destructive filters for a data set.
  - Modified sort functions to account for possible undefined values. This allows us to handle XML formats where certain child tags are optional.
  - XMLDataSet
    - Modified the XMLDataSet so that it manually parses the XML string it receives from the server when an XML Dom is not auto-created by the browser. This will allow us to load XML that is returned by the server with a Content-Type that is not 'text/xml' or 'application/xml'.
    - Added support for controlling the flattening process via the "subPaths" constructor option.
    - Added support for Spry.Data.NestedXMLDataSet .
    - Removed optimization that was preventing rows from being created for nodes selected by an XPath that had no value and no attributes.
  - Added Spry.Data.JSONDataSet and Spry.Data.NestedJSONDataSet.
    - Includes the JSON parser reference implementation from json.org.
  - Added utility functions for extracting values embedded within the URL search and hash components.
  - Modified setURL() so that when the URL matches the current URL, it takes into account the method and any postData before bailing early.
  - Fixed Spry.Utils.loadURL() so that it calls the request's errorCallback() if it exists and an exception was thrown. This allows us to notify observers during sync loads.
  - Modified Spry.Utils.updateContent() so that it makes an asynchronous "GET" request by default. Developers can switch to "POST" or synchronous requests by specifying method:"POST" and/or async:false options in the call to updateContent().
- Effects
  - Fixed a Cluster chaining bug that caused every effect in the chain, that was before the current one executing, to fire their animation() method for every animation step of the current effect.
  - Rename of AppearFade effect to Fade and GrowShrink effect to Grow.
  - The Fade, Grow, Slide, Shake, Squish, Highligh, Blind effects were transformed from simple functions in classes. This will not allow you to call the effects without the 'new' keyword.
  - The new created classes are extending the Cluster class. This means they are able to be clustered them self after. They can be also started, canceled, stoped.
  - The effects are no longer auto-starting on instantiation. After the desired effect is instantiated you should call the start() method for the effect to run.
  - The Effect.direction is default false for the Cluster effects (in the past was Spry.forward)
  - The start() is automatically run in reverse in case the toggle option is enabled.
  - The effects registered to a Cluster are runned in the reversed order. If you have a Move() than a Size() in toggle the Size() run first.
  - For compatibility reasons with previous versions of Spry we added a number of Do* wrappers (DoBlind, DoFade, DoSquish ...). They are designed to preserve the old functionalities with a minimal effort in migration. However future releases may drop these functions.
  - All the effects (Animators and Clusters) are supporting notifications. You can now register an Observer either as a function or as an Object and it will be automatically be called onPreEffect, onStep, onPostEffect, onCancel
  - MoveSlide Animator dropped. It was transformed into a Cluster and moved inside the Slide Cluster.
  - Size Animator has a new flag useCSSBox accepting boolean values (default false). When resizing an element this will also resize the margin, padding and the border of the element with the same proportion it use for width and height. All our Cluster Effects have this setting too (Squish, Slide, Blind, Grow ...)
  - The Registry class changed the API and functionality. It was kept for compatibility reasons with the Do* wrappers but is possible to disappear in future.
  - The initial offset and box dimentions where incorrectly computed when they where set in <style> or external CSS for FF, Opera and Safari browsers.
  - The Puff, Pulsate, DropOut and Fold are now accepting most of the common Spry Effects options like duration, from, to, toggle.
  - The duration for the Shake can be specified.
  - Highlight is no longer requiring a from: option to work on Firefox.
  - Highlight is supporting the values for from: and to: in short CSS version format like #CCC and in the rgb format. Eg: rgb(208, 205, 125)
  - Spry.Effect.getColor() renamed to Spry.Effect.getBgColor()
  - Added 6 new transitions algorithms for smoother effects
  - FPS (Frames per second) is a new option for all effects
  - Changed the default transitions for each effect for better smoothness
  - Default FPS increased to ~60FPS
- Widgets
  - Accordion
    - Fixed a bug where the useFixedHeightPanels and fixedPanelHeight were ignored on page load. This caused the default panel to be incorrectly sized in some situations.
    - Updated animator code to smooth out animation and add support for transition functions.
    - Added support for closing all panels in variable panel heights mode.
    - Modified all event handlers to return false and preventDefault when necessary. This opens the doors for using links as a means of keyboard navigation between panels.
  - CollapsiblePanel
    - Modified the default CollapsiblePanel CSS so that the .CollapsiblePanel rule draws both the top and bottom borders around the widget to avoid the IE "Bleeding Background and Borders Bug" which appears when the panel is closed.
    - Updated animator code to smooth out animation and add support for transition functions.
  - TabbedPanels
    - Modified the default TabbedPanels CSS so that the .TabbedPanels rule floats the widget container left to make sure that any floating or clearing done with any of its child elements are contained completely within the TabbedPanels container. This minimizes any impact or undesireable interaction with other floated elements on the page that may be used for layout.
  - Textarea Validation Widget
    - Fixed a conflict with prototype.js
  - Textfield Validation Widget
    - Added support for IDN (International Domain Names) for URL validation
    - The URI validation is compliant with RFC 3986
    - The focus was incorrectly passed to the <form> element sometime when leaving an Textfield Validation using the Tab key
  - New Widgets:
    - Auto Suggest Widget
    - Collapsible Panel Group Widget
    - Radio Validation Widget
    - Sliding Panels Widget
- Docs
  - Added HTML data set overview.
  - Added JSON primer.
  - Added JSON Data Set overview.
  - Added XML primer.
  - Added Menu Bar overview.
  - Added Spry API.
  - Added the Effects Migration doc.
  - Added the Validation doc.
  - Added the Sliding Panel overview.
  - Added the Spry Pager overview.
  - Moved Effects API to the Spry API.
  - Merged the Effects Overview into the Effects Coding doc and updated to new effects method.
  - Changed TabbedPanel to TabbedPanels references that were confusing folks and were just plain wrong.
  - Added a docs.html page that links to all the articles.
- Demos
  - Effects
    - The JS code moved outside of the HTML file.
    - The Fade&Blind and Fade&Slide transformed into real Cluster classes as proof of concept how you may reuse the existing effects and create your own
    - Added observers. onPreEffect will cancel the other effects running, onCancel the elements are restored to their normal state, onPostEffect the element will run a second time toggled to prepare the elements for a new effect demo.
    - Included the Puff, DropOut, Pulsate and Fold effects
  - Gallery
    - Modified SetMainImage() to remove any opacity related style properties on the image after the animations complete. This is a workaround that forces IE to re-render the image to get rid of the white dots/holes it creates in the image when animating opacity.
  - Products
    - Switched the dsProductFeatures data set to being a NestedXMLDataSet instead of relying on a templated XPath.
- Samples
  - Added CustomColumnsSample.html.
  - Added HTMLFragsInXMLSample.html.
  - Added SpryPagedViewSample.html.
  - Added XMLDocToObject.html.
  - Added HTMLDataSet samples.
  - Added a horizontal slider sample.
  - Added Session Handling samples.
  - Added Form Submission samples for Coldfusion, PHP and ASP.
  - Added JSON Data Set Sample.
  - Added JSON Parser Sample.
  - Added Nested XML Data Sample.
  - Added Collapsible Panel Group Sample.
  - Added URL Utilities Sample.
  - Added URL with Data Sample.
  - Fixed some samples to solve W3C validation issues.
  - Updated Effects samples rewritten to new method.
  - Added spry:sort to Sort sample.
  - Added sample for XPath filtering with URL Params.
  - Added Sharing Data Between Data Sets Sample.
  - Added Multiple Filters Sample.
  - Modified the Detail Region Effects Sample so that it has smooth transitions even when the user is rapidly clicking items.
  - Modified the Data Set Sample to use setDataFromArray().
  - Added a loadURL() Sample.
  - Added Sliding Panels, Sliding Panels 2 Pane Layout, and Sliding Panels from Data Samples.

### Changes for Spry PreRelease 1.4 - 2006/12/14

- Data
  - Added function Spry.Utils.serializeObject() for serializing a JS Object into JSON format.
  - Added Spry.XML.nodeToObject() and Spry.XML.documentToObject() utility methods which allow developers to access XML data as JS properties on an object in a manner which is similar to E4X.
  - Added Spry.Utils.updateContent() for dynamically loading an HTML fragment into an element.
  - Added Spry.Utils.setInnerHTML() for setting the innerHTML of an element and executing any scripts within the content string. This method is now used by Spry regions when regenerating their content.
  - Added support for mapping a region state name to another state name. This can be useful for overriding the built-in states, like "ready", "loading", and "error", so that they use markup from a custom state when they fire.
  - Added support for more attributes:
    - spry:even - Conditionally adds the user specified CSS class name to an element based on the current row number used at the time that element was re-generated.
    - spry:odd - Conditionally adds the user specified CSS class name to an element based on the current row number used at the time that element was re-generated.
    - spry:setrow - Attaches a non-destructive onclick handler that sets the current row by row ID.
    - spry:setrownumber - Attaches a non-destructive onclick handler that sets the current row by row number.
    - spry:sort - Attaches a non-destructive onclick handler that sorts a specific data set based on columns specified by the user.
    - spry:readystate - Maps the "ready" state name to the name specified in its value.
    - spry:errorstate - Maps the "error" state name to the name specified in its value.
    - spry:loadingstate - Maps the "loading" state name to the name specified in its value.
  - Added code to report and error when nested regions and detail regions are detected.
  - Added new methods to the DataSet API:
    - getRowCount()
    - getRowByID()
    - getRowByRowNumber()
    - findRowsWithColumnValues()
- Effects
  - Minor updates of documentation (effects_api and effects_coding, especially of the allowed elements to which the effects can be applied to).
  - Fixed bugs:
    - GrowShrink effect: if border is set, width&height style doesn't get reset to the original value after you toggled the target element
    - GrowShrink effect: text size inside the target element is alternated after the effect has been finished
    - Slide and Blind effect: Scrollbar disappears if overflow:scroll is set and you toggle the element
    - GrowShrink effect: nested image elements doesn't grow if you grow the target element
    - Slide effect: Text inside sliding element doesn't appear once you toggle the effect (IE 7 only)
    - Shake effect: doesn't work perperly in Opera 9.0
    - AppearFade effect: not working for content of a <div> inside a <td> (IE only)
  - new feature:
    - GrowShrink effect: added options 'referHeight' and 'growCenter'
  - IE 7 related fixes also take effect on Windows Vista (not only on XP)
  - new feature:
    - Slide effect: added option 'horizontal' to allow horizontal sliding
  - Slightly updated documentation to reflect new slide option
  - Simplified cluster construction: cluster now is an effect, too, which accepts setup and finish callbacks as option arguments of its constructor
  - Base effects (like Move, Size, etc.) can be called without from argument. Instead of passing element, fromPos, toPos, options as arguments, the effects can be called with element, toPos, options. The fromPos is calculated on the fly based on the current position.
  - AppearFade, Blind, GrowShrink, Slide and Squish effects now can be triggered for initially invisible elements ('display:none' or 'visibility:hidden')
- Widgets
  - Added Menu Bar widget
  - Added Tabbed Panels widget
  - Added Collapsible Panel widget
  - Added Form Validation Widgets
    - Check Box
    - Text Area
    - Text Field
    - Select
  - Accordion:
    - Added support for variable height panels.
    - Added some new constructor options:
      - useFixedHeightPanels - This value is true by default. If false allows for variable height panels.
      - fixedPanelHeight - Number of pixels to use as the height of each panel when animating. By default this is the same as the first open panel.
      - duration - Number of milliseconds it takes to open/close a panel. Default is 500 msecs.
    - Fixed bug that prevented panels from animating properly when the accordion started out with a display:none style.
    - Removed addNewPanel(), getNewPanelSnippet(), getNewAccordionSnippet(), and getNewAccordionConstructorSnippet() methods. They don't work cross-browser, and should've never seen the light of day.
- Docs
  - Added overview for Tabbed Panels widget.
  - Added overview for Collapsible Panel widget.
  - Added overview docs for each Form widget.
- Demos
  - Gallery
    - Switch from using an interval timer to manually firing off the slide show timer after each image loads. This will allow images loading over slow connections to completely load.
  - Products
    - index.html to use spry:sort and spry:setrow.
    - Use a spry:choose attribute to show/preserve the currently selected product on initial load and after a sort.
  - RSS Reader
    - Modified index.{html,cfm,php} to use spry:setrow.
  - Added Form Validation demo.
- Samples
  - Added sample for Tabbed Panels widget.
  - Added sample for Collapsible Panel widget.
  - Added samples for 4 Form widgets.
  - Moved data set and region examples to the samples/data_region folder.
  - Changed Effects sample files to use standard samples.css file.
  - Added a samples/utils folder with samples of Spry utility functions.
  - Released a query-to-XML sample page that shows how to convert dynamic data into XML.
  - Added to EvenOddRowSample.html to include spry:even and spry:odd.
  - Added SprySetRowSample.html.
  - Modified the AccordionSample:
    - Added sample for changing the duration of animations.
    - Modified variable height accordion sample to use animation.
    - Added a style for spans used as content panels so that they animate properly.
  - Added SetCurrentRowByValueSample.html to show how to select a row based on some column values.
  - Added StateMappingSample.html to show how to map the built-in region states to your own custom states.

### Changes for Spry PreRelease 1.3.1 - 2006/08/11

- Fixed Accordion openNextPanel() and openPrevPanel() so that they work cross-browser.
- Added samples/effects/menu_sample.html.
- Removed:
  - demos/products/index_test.html
  - samples/data

### Changes for Spry PreRelease 1.3 - 2006/08/10

- Introduced Spry Effects, the 3rd portion of the Spry Framework.
  - Provided SpryEffects.js in the includes folder.
  - Provided Effects sample files in Effect folder.
  - Effects Overview doc posted online. (Removed in Spry 1.5. Combined into Effects Coding doc)
  - Effects Coding doc posted online.
  - Effects API
- Removed documentation from the zip. All docs will be available online on Labs site as HTML and PDF.
- Changes to SpryData.js:
  - Fix the loop in Spry.Utils.createXMLHttpRequest() so that it doesn't skip the next progID in the array after removing a non-existent one.
  - Make sure all initialization of the Spry.Utils.loadURL.Request headers property uses an object so that it works properly when used with Prototype 1.5 rc0.
  - Fix Spry.Utils.Notifier.prototype.notifyObservers() so that it uses a normal for loop instead of a "for in" loop.
  - Added support for {ds_UnfilteredRowCount}.
- Updates to SpryAccordion.js
  - Added panel opening function: openNextPanel(), openPreviousPanel(), openFirstPanel, and openLastPanel()
  - Added current panel accessor: getCurrentPanel() - return the panel, getCurrentPanelIndex() - returns the index of the current panel in the getPanels() array.
  - Added addNewPanel(tab, content) function to dynamically add new panels in Javascript. Panels get added after the current panel.
- Gallery Demo updated to use new SpryEffects.js.

### Changes for Spry PreRelease 1.2 - 2006/07/10

- Spry is now compatible with frameworks based on Prototype 1.5 rc0 or later.
  - Switched all hash tables (associative arrays) to use Object instead of Array.
  - Removed all Spry.Utils.propertyIsEnumerable() calls from all for/in loops.
  - Small fix to xpath.js to switch a loop from for/in to a normal for loop.
- Spry:content can now be used inside a spry:region or spry:detailregion, as well as on the region element itself.
- Auto stripping of the SpryHiddenRegion class name from region containers on load to aid in the hiding of data references.
- Added support for the spry:state attribute which can be used by a designer tell Spry what markup to use when the region is in its "loading", "error" or "ready" state. Spry will automatically swap in the correct markup as the region's state changes.
- Added ordered processing of spry: attributes to allow combined use to reduce the need for using wrapper nodes to add logic. You can see an example within /samples/AttributeComboSample.html.
- Added Spry.Data.Region.debug variable. When set to true, it allows developers to see what the final template for the region looks like, as well as the markup that is being generated for each region. You can see an example /samples/AttributeComboSample.html.
- Accordion Widget
  - Moved SpryAccordion.js into widgets/accordion directory, along with a reference HTML sample and CSS file.
  - Added support for keyboard navigation.
  - Re-wrote parts of the PanelAnimator to allow for rapid switching between panels via keyboard navigation.
- Integrated patches from the community:
  - Added keepSorted constructor option to the Data Set to allow the sort order to be preserved between loads.
  - Added new built-in data references:
    - {ds_EvenOddRow} - Writes out "even" or "odd" based on the row index of the current row being processed.
    - {ds_RowNumberPlus1} - Writes out the current row index plus one.
- Misc Bug Fixes:
  - Spry.Utils.createXMLHttpRequest creates more than one request for a single call on IE 6.
  - Auto setup of Master/Detail between data sets fails if only POST data contains data refs.
  - Sorting should sort all data, not just the result of a non-destructive filter.
  - Spry.Data.DataSet.prototype.filterData bugs:
    - "unfiltredData" typo causes data loss.
    - filterFunc overridden instead of filterDataFunc.
    - null arg removes data filter but doesn't re-apply an existing view filter.
  - IE removes quotes around attribute values that contain a single data reference.
- Gallery Demo
  - Cleaned up Spry code used by the select form element.
  - Modified gallery.js to use the region observer callback to set the main image and select the first thumbnail instead of using timers.
  - Added CSS workaround for IE "doubled margin" bug.
- RSS Reader Demo
  - Added error and loading feedback with region region states.

### Changes for Spry Prerelease 1.1

- Switched to using namespaced attributes. Attributes are now of the form spry:*. The Spry namespace is defined by adding the the following attribute to the HTML tag of the document: xmlns:spry="http://ns.adobe.com/spry".
- Added support for the new spry:content attribute, which allows the replacement of static content with dynamic content when JavaScript is enabled. This allows pages to work in a non scripting environment.
- Added region state notification mechanism.
- Added Prototype's $() convenience function.
- Added support for descending and toggle sort.
- Added support for non-destructive filtering.
- Added data set load interval.
- Added built-in references:
  - {ds_CurrentRowNumber}
  - {ds_CurrentRowID}
  - {ds_SortOrder}
  - {ds_SortColumn}
- Filter callback functions now have the following args passed to them: function myFilterFunc(dataset, rowObj, rowNumber). Filter callback functions must now return the rowObj passed in, a new rowObj, or null.
- Added data set support for retrieving XML data via the POST method and specifying HTTP headers.
- Added a samples directory to the framework ZIP file. It's pretty bare right now, but over time will contain examples of things asked most frequently in the forums. One of the more useful samples is the Data Set Explorer page.
- Misc bug fixes:
  - Text data not stored entity encoded.
  - Data reference values need to be escaped in JS expressions.
  - RegExp object forces Spry.Data.Region.processDataRefString() to bail early in IE.
  - Spry attributes still exist in generated region output.
  - Data set column (node text value) missing when node has an attribute.