Slider - Release Notes

2.6.0
    * Vertical DualSlider correctly calculates minRange
    * Correct handling of backgroundEnabled and lock()ing
    * Added basic skin and image assets
    * verifyOffset correction for background element moving in response to change event handler
    * Target x,y rounded in response to FF (at least) producing subpixel coords
    * _slideEnd now cleans state before firing slideEnd event

2.5.2
    * No change

2.5.1
    * No change

2.5.0
    * Slider onDrag now calls fireEvents, so bg mousedown, drag, mouseup fires change events
    * Slider uses new dragOnly=true property added in dragdrop
    * Introduced DualSlider

2.4.0
    * No change

2.3.1

   * getValue will return the last value or 0 rather than NaN if the control 
     is display:none.

   * The slider will not fire slideStart/change/slideEnd events during its
     initial setup unless setValue was called prior to initialization.

   * slideStart/slideEnd now fire consistently among the various methods of
     changing the slider value (setValue, bg click, thumb drag).  A bg click
     and drag continuation will result in two start/end events.

   * Added a silent flag to setValue and setRegionValue to silence all of the
     events during that operation.

2.3.0
   * Added valueChangeSource, which specifies whether the last value change
     was the result of user interaction with the control, or a result of a
     programmatic update (setValue)

2.2.2
   * No change

2.2.1
   * No change

2.2.0
   * Added the missing "force" parameter to the signature for setRegionValue
   * Deprecated the moveComplete flag

0.12.2
   * No change

0.12.1

   * Removed unnecessary getXY calls that were contributing to slower performance
     in FireFox when the slider was deeply nested in the DOM.

0.12.0

   * Added "slideStart", "slideEnd", and "change" custom events.  The abstract
     methods these will eventually replace still work.

   * The default animation duration is 0.2 seconds (reduced from 0.4 seconds),
     and is configurable via the animationDuration property.

   * Keyboard navigation is now built in.  The background needs a tabindex for
     keyboard nav to work.  Keyboard nav can be disabled by setting enableKeys
     to false.  The number of pixels the slider moves when the arrow keys
     are pressed is controlled by keyIncrement, and defaults to 20.  Note, 
     Safari support limited to background element types that support focus
     in that browser. http://bugs.webkit.org/show_bug.cgi?id=7138

   * Fixed broken doctype in examples/index.html

   * Catching an unhandled script exception in FF that could occur when
     attempting to focus the slider background while a text field without
     autocomplete="false" has focus

0.11.3

   * No change

0.11.0

   * When the thumb is clicked and dragged, the click position delta is properly
     applied.

   * The slider background can be disabled by setting backgroundEnabled to false.

   * Added SliderThumb->clearTicks

   * Incorporated updated drag and drop performance improvements

0.10.0

   * Drag and drop's autoscroll feature is now turned off by default
     in the slider.

   * The slider no longer sets its initial value upon initialization

   * RGB slider example fixed for IE7.

   * Updated to work with the onAvailable feature in Drag and Drop.

   * Updated the basic slider example page to make the control more
     accessible to non-FF1.5 browsers.

   * Split the examples into separate pages

