Dom Release Notes

** Known Issues **
* margin/padding/borders on HTML element cause getXY to misreport
* margin/borders on BODY element may cause getXY to misreport
* Fixed postioning causes getXY to misreport in some cases

----------------------------
*** version 2.6.0 ***
- now rounding getXY return for clientRect branch
- now trimming className arg in getElementsByClassName
- class attribute now removed if empty after removeClass
- normalized isAncestor (needle === haystack no longer returns true in some browsers) 

*** version 2.5.2 ***
* no change

*** version 2.5.1 ***
* getStyle fix for getting computedStyle across documents

*** version 2.5.0 ***
* get() now correctly handles textNodes

*** version 2.4.0 ***
* no longer accounting for safari body margin when offsetParent == body
* isAncestor and inDocument no longer use batch
* added getClientRegion()

*** version 2.3.1 ***
* allow batch() to work on array-like object
* return null from Dom.get(undefined)

*** version 2.3.0 ***
* added getAncestorBy methods
* added getChildren methods
* added getSibling methods
* trimming added for class mgmt methods
* fixed getXY inside table for Opera 

*** version 2.3.0 ***
* added getAncestorBy methods
* added getChildren methods
* added getSibling methods
* trimming added for class mgmt methods
* fixed getXY inside table for Opera 

*** version 2.2.2 ***

* fixed getXY scroll regression

*** version 2.2.1 ***
* fixed toCamel propertyCache used by set/getStyle
* added set/getStyle support for float property
* optimized get() for common use case
* fixed getXY for safari when el has absolute ancestors
* using className property instead of string literal for class mgmt methods
* added getXY/getRegion support for body element

*** version 2.2.0 ***
* no change


*** version 0.12.2 ***
* no change

*** version 0.12.1 ***

* getElementsByClassName no longer reverts to document when "root" not found
* setXY no longer makes a second call to getXY unless noRetry is false
* minified version no longer strips line breaks

*** version 0.12.0 ***

* fixed getXY for IE null parent
* branching set/getStyle at load time instead of run time 

*** version 0.11.3 ***

* fixed getX and getY returning incorrect values for collections 
* fixed getXY incorrectly calculated for Opera inline elements
* fixed isAncestor failure in safari when 2nd arg is document.documentElement
* fixed infinite loop in replaceClass when oldClassName == newClassName 
* getDocumentWidth no longer includes scrollbars 


*** version 0.11.2 ***
* limit depth of parent.document crawl to 1 for getXY
* test offsetParent instead of parentNode for getXY
* return null if no el fo r get
* just addClass if no class to replace for replaceClass


*** version 0.11.1 ***

* return null if el is null for get()
* test offsetParent rather than parentNode for getXY()
* limit depth of parent.document crawl for IE getXY() to 1
* if no oldClassName to replace, just addClass for replaceClass()


*** version 0.11.0 ***
* Work around Opera 9 broken currentStyle
* Removed timeout wrapper from setXY retry
* Tagname tests now case-insensitive
* Internal "this" references changed to allow for method shorthand
* get/setStyle now accept both camel and hyphen case
* Gecko reverted to crawling offsets for getXY
 

*** version 0.10.0 ***

* Safari now fails gracefully when querying computedStyle of an unavailable element 

* Class management functions added (hasClass, addClass, removeClass, replaceClass, getElementsByClassName) 

* All methods that accept HTMLElements or IDs now also accept arrays of HTMLElements and/or IDs

* GenerateId method added

* isAncestor method added

* inDocument method added

* getElementsBy method added

* batch method added

* getClientHeight/Width deprecated in favor of getViewportHeight/Width

* getDocumentHeight/Width methods added 

*** version 0.9.0 ***

* Initial release

