yui-rails-asset 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. data/LICENSE +21 -0
  2. data/README +17 -0
  3. data/lib/yui/rails.rb +29 -0
  4. data/lib/yui/rails/engine.rb +10 -0
  5. data/lib/yui/rails/version.rb +6 -0
  6. data/vendor/assets/javascripts/yui-2.8.1/build/animation/animation-debug.js +1396 -0
  7. data/vendor/assets/javascripts/yui-2.8.1/build/animation/animation-min.js +23 -0
  8. data/vendor/assets/javascripts/yui-2.8.1/build/animation/animation.js +1392 -0
  9. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/ajax-loader.gif +0 -0
  10. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/asc.gif +0 -0
  11. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/autocomplete.css +7 -0
  12. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/back-h.png +0 -0
  13. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/back-v.png +0 -0
  14. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/bar-h.png +0 -0
  15. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/bar-v.png +0 -0
  16. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/bg-h.gif +0 -0
  17. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/bg-v.gif +0 -0
  18. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/blankimage.png +0 -0
  19. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/button.css +7 -0
  20. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/calendar.css +8 -0
  21. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/carousel.css +7 -0
  22. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/check0.gif +0 -0
  23. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/check1.gif +0 -0
  24. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/check2.gif +0 -0
  25. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/colorpicker.css +7 -0
  26. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/container.css +7 -0
  27. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/datatable.css +8 -0
  28. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/desc.gif +0 -0
  29. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/dt-arrow-dn.png +0 -0
  30. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/dt-arrow-up.png +0 -0
  31. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/editor-knob.gif +0 -0
  32. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/editor-sprite-active.gif +0 -0
  33. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/editor-sprite.gif +0 -0
  34. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/editor.css +10 -0
  35. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/header_background.png +0 -0
  36. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/hue_bg.png +0 -0
  37. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/imagecropper.css +7 -0
  38. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/layout.css +7 -0
  39. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/layout_sprite.png +0 -0
  40. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/loading.gif +0 -0
  41. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/logger.css +7 -0
  42. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/menu-button-arrow-disabled.png +0 -0
  43. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/menu-button-arrow.png +0 -0
  44. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/menu.css +7 -0
  45. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/menubaritem_submenuindicator.png +0 -0
  46. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/menubaritem_submenuindicator_disabled.png +0 -0
  47. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/menuitem_checkbox.png +0 -0
  48. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/menuitem_checkbox_disabled.png +0 -0
  49. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/menuitem_submenuindicator.png +0 -0
  50. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/menuitem_submenuindicator_disabled.png +0 -0
  51. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/paginator.css +7 -0
  52. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/picker_mask.png +0 -0
  53. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/profilerviewer.css +7 -0
  54. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/progressbar.css +7 -0
  55. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/resize.css +7 -0
  56. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/simpleeditor.css +10 -0
  57. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/skin.css +36 -0
  58. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/slider.css +7 -0
  59. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/split-button-arrow-active.png +0 -0
  60. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/split-button-arrow-disabled.png +0 -0
  61. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/split-button-arrow-focus.png +0 -0
  62. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/split-button-arrow-hover.png +0 -0
  63. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/split-button-arrow.png +0 -0
  64. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/sprite.png +0 -0
  65. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/sprite.psd +0 -0
  66. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/tabview.css +8 -0
  67. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/treeview-loading.gif +0 -0
  68. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/treeview-sprite.gif +0 -0
  69. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/treeview.css +7 -0
  70. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/wait.gif +0 -0
  71. data/vendor/assets/javascripts/yui-2.8.1/build/assets/skins/sam/yuitest.css +7 -0
  72. data/vendor/assets/javascripts/yui-2.8.1/build/autocomplete/assets/autocomplete-core.css +7 -0
  73. data/vendor/assets/javascripts/yui-2.8.1/build/autocomplete/assets/skins/sam/autocomplete-skin.css +57 -0
  74. data/vendor/assets/javascripts/yui-2.8.1/build/autocomplete/assets/skins/sam/autocomplete.css +7 -0
  75. data/vendor/assets/javascripts/yui-2.8.1/build/autocomplete/autocomplete-debug.js +3009 -0
  76. data/vendor/assets/javascripts/yui-2.8.1/build/autocomplete/autocomplete-min.js +12 -0
  77. data/vendor/assets/javascripts/yui-2.8.1/build/autocomplete/autocomplete.js +2966 -0
  78. data/vendor/assets/javascripts/yui-2.8.1/build/base/base-min.css +7 -0
  79. data/vendor/assets/javascripts/yui-2.8.1/build/base/base.css +131 -0
  80. data/vendor/assets/javascripts/yui-2.8.1/build/button/assets/button-core.css +44 -0
  81. data/vendor/assets/javascripts/yui-2.8.1/build/button/assets/skins/sam/button-skin.css +219 -0
  82. data/vendor/assets/javascripts/yui-2.8.1/build/button/assets/skins/sam/button.css +7 -0
  83. data/vendor/assets/javascripts/yui-2.8.1/build/button/assets/skins/sam/menu-button-arrow-disabled.png +0 -0
  84. data/vendor/assets/javascripts/yui-2.8.1/build/button/assets/skins/sam/menu-button-arrow.png +0 -0
  85. data/vendor/assets/javascripts/yui-2.8.1/build/button/assets/skins/sam/split-button-arrow-active.png +0 -0
  86. data/vendor/assets/javascripts/yui-2.8.1/build/button/assets/skins/sam/split-button-arrow-disabled.png +0 -0
  87. data/vendor/assets/javascripts/yui-2.8.1/build/button/assets/skins/sam/split-button-arrow-focus.png +0 -0
  88. data/vendor/assets/javascripts/yui-2.8.1/build/button/assets/skins/sam/split-button-arrow-hover.png +0 -0
  89. data/vendor/assets/javascripts/yui-2.8.1/build/button/assets/skins/sam/split-button-arrow.png +0 -0
  90. data/vendor/assets/javascripts/yui-2.8.1/build/button/button-debug.js +4694 -0
  91. data/vendor/assets/javascripts/yui-2.8.1/build/button/button-min.js +11 -0
  92. data/vendor/assets/javascripts/yui-2.8.1/build/button/button.js +4633 -0
  93. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/assets/calendar-core.css +132 -0
  94. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/assets/calendar.css +320 -0
  95. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/assets/calgrad.png +0 -0
  96. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/assets/callt.gif +0 -0
  97. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/assets/calrt.gif +0 -0
  98. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/assets/calx.gif +0 -0
  99. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/assets/skins/sam/calendar-skin.css +361 -0
  100. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/assets/skins/sam/calendar.css +8 -0
  101. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/calendar-debug.js +7324 -0
  102. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/calendar-min.js +18 -0
  103. data/vendor/assets/javascripts/yui-2.8.1/build/calendar/calendar.js +7294 -0
  104. data/vendor/assets/javascripts/yui-2.8.1/build/carousel/assets/ajax-loader.gif +0 -0
  105. data/vendor/assets/javascripts/yui-2.8.1/build/carousel/assets/carousel-core.css +88 -0
  106. data/vendor/assets/javascripts/yui-2.8.1/build/carousel/assets/skins/sam/ajax-loader.gif +0 -0
  107. data/vendor/assets/javascripts/yui-2.8.1/build/carousel/assets/skins/sam/carousel-skin.css +142 -0
  108. data/vendor/assets/javascripts/yui-2.8.1/build/carousel/assets/skins/sam/carousel.css +7 -0
  109. data/vendor/assets/javascripts/yui-2.8.1/build/carousel/carousel-debug.js +4390 -0
  110. data/vendor/assets/javascripts/yui-2.8.1/build/carousel/carousel-min.js +12 -0
  111. data/vendor/assets/javascripts/yui-2.8.1/build/carousel/carousel.js +4349 -0
  112. data/vendor/assets/javascripts/yui-2.8.1/build/charts/assets/charts.swf +0 -0
  113. data/vendor/assets/javascripts/yui-2.8.1/build/charts/charts-debug.js +2061 -0
  114. data/vendor/assets/javascripts/yui-2.8.1/build/charts/charts-min.js +9 -0
  115. data/vendor/assets/javascripts/yui-2.8.1/build/charts/charts.js +2060 -0
  116. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/assets/colorpicker-core.css +6 -0
  117. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/assets/hue_thumb.png +0 -0
  118. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/assets/picker_mask.png +0 -0
  119. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/assets/picker_thumb.png +0 -0
  120. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/assets/skins/sam/colorpicker-skin.css +105 -0
  121. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/assets/skins/sam/colorpicker.css +7 -0
  122. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/assets/skins/sam/hue_bg.png +0 -0
  123. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/assets/skins/sam/picker_mask.png +0 -0
  124. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/colorpicker-debug.js +1783 -0
  125. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/colorpicker-min.js +9 -0
  126. data/vendor/assets/javascripts/yui-2.8.1/build/colorpicker/colorpicker.js +1763 -0
  127. data/vendor/assets/javascripts/yui-2.8.1/build/connection/connection-debug.js +1576 -0
  128. data/vendor/assets/javascripts/yui-2.8.1/build/connection/connection-min.js +9 -0
  129. data/vendor/assets/javascripts/yui-2.8.1/build/connection/connection.js +1546 -0
  130. data/vendor/assets/javascripts/yui-2.8.1/build/connection/connection.swf +0 -0
  131. data/vendor/assets/javascripts/yui-2.8.1/build/connection/connection_core-debug.js +980 -0
  132. data/vendor/assets/javascripts/yui-2.8.1/build/connection/connection_core-min.js +8 -0
  133. data/vendor/assets/javascripts/yui-2.8.1/build/connection/connection_core.js +957 -0
  134. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/alrt16_1.gif +0 -0
  135. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/blck16_1.gif +0 -0
  136. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/close12_1.gif +0 -0
  137. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/container-core.css +176 -0
  138. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/container.css +324 -0
  139. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/hlp16_1.gif +0 -0
  140. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/info16_1.gif +0 -0
  141. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/skins/sam/container-skin.css +242 -0
  142. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/skins/sam/container.css +7 -0
  143. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/tip16_1.gif +0 -0
  144. data/vendor/assets/javascripts/yui-2.8.1/build/container/assets/warn16_1.gif +0 -0
  145. data/vendor/assets/javascripts/yui-2.8.1/build/container/container-debug.js +9076 -0
  146. data/vendor/assets/javascripts/yui-2.8.1/build/container/container-min.js +19 -0
  147. data/vendor/assets/javascripts/yui-2.8.1/build/container/container.js +9052 -0
  148. data/vendor/assets/javascripts/yui-2.8.1/build/container/container_core-debug.js +5136 -0
  149. data/vendor/assets/javascripts/yui-2.8.1/build/container/container_core-min.js +14 -0
  150. data/vendor/assets/javascripts/yui-2.8.1/build/container/container_core.js +5126 -0
  151. data/vendor/assets/javascripts/yui-2.8.1/build/cookie/cookie-debug.js +482 -0
  152. data/vendor/assets/javascripts/yui-2.8.1/build/cookie/cookie-min.js +7 -0
  153. data/vendor/assets/javascripts/yui-2.8.1/build/cookie/cookie.js +482 -0
  154. data/vendor/assets/javascripts/yui-2.8.1/build/datasource/datasource-debug.js +3067 -0
  155. data/vendor/assets/javascripts/yui-2.8.1/build/datasource/datasource-min.js +12 -0
  156. data/vendor/assets/javascripts/yui-2.8.1/build/datasource/datasource.js +2996 -0
  157. data/vendor/assets/javascripts/yui-2.8.1/build/datatable/assets/datatable-core.css +93 -0
  158. data/vendor/assets/javascripts/yui-2.8.1/build/datatable/assets/datatable.css +49 -0
  159. data/vendor/assets/javascripts/yui-2.8.1/build/datatable/assets/skins/sam/datatable-skin.css +240 -0
  160. data/vendor/assets/javascripts/yui-2.8.1/build/datatable/assets/skins/sam/datatable.css +8 -0
  161. data/vendor/assets/javascripts/yui-2.8.1/build/datatable/assets/skins/sam/dt-arrow-dn.png +0 -0
  162. data/vendor/assets/javascripts/yui-2.8.1/build/datatable/assets/skins/sam/dt-arrow-up.png +0 -0
  163. data/vendor/assets/javascripts/yui-2.8.1/build/datatable/datatable-debug.js +17360 -0
  164. data/vendor/assets/javascripts/yui-2.8.1/build/datatable/datatable-min.js +29 -0
  165. data/vendor/assets/javascripts/yui-2.8.1/build/datatable/datatable.js +17122 -0
  166. data/vendor/assets/javascripts/yui-2.8.1/build/datemath/datemath-debug.js +408 -0
  167. data/vendor/assets/javascripts/yui-2.8.1/build/datemath/datemath-min.js +7 -0
  168. data/vendor/assets/javascripts/yui-2.8.1/build/datemath/datemath.js +408 -0
  169. data/vendor/assets/javascripts/yui-2.8.1/build/dom/dom-debug.js +1872 -0
  170. data/vendor/assets/javascripts/yui-2.8.1/build/dom/dom-min.js +9 -0
  171. data/vendor/assets/javascripts/yui-2.8.1/build/dom/dom.js +1832 -0
  172. data/vendor/assets/javascripts/yui-2.8.1/build/dragdrop/dragdrop-debug.js +3710 -0
  173. data/vendor/assets/javascripts/yui-2.8.1/build/dragdrop/dragdrop-min.js +10 -0
  174. data/vendor/assets/javascripts/yui-2.8.1/build/dragdrop/dragdrop.js +3601 -0
  175. data/vendor/assets/javascripts/yui-2.8.1/build/editor/assets/editor-core.css +602 -0
  176. data/vendor/assets/javascripts/yui-2.8.1/build/editor/assets/simpleeditor-core.css +602 -0
  177. data/vendor/assets/javascripts/yui-2.8.1/build/editor/assets/skins/sam/blankimage.png +0 -0
  178. data/vendor/assets/javascripts/yui-2.8.1/build/editor/assets/skins/sam/editor-knob.gif +0 -0
  179. data/vendor/assets/javascripts/yui-2.8.1/build/editor/assets/skins/sam/editor-skin.css +711 -0
  180. data/vendor/assets/javascripts/yui-2.8.1/build/editor/assets/skins/sam/editor-sprite-active.gif +0 -0
  181. data/vendor/assets/javascripts/yui-2.8.1/build/editor/assets/skins/sam/editor-sprite.gif +0 -0
  182. data/vendor/assets/javascripts/yui-2.8.1/build/editor/assets/skins/sam/editor.css +10 -0
  183. data/vendor/assets/javascripts/yui-2.8.1/build/editor/assets/skins/sam/simpleeditor-skin.css +711 -0
  184. data/vendor/assets/javascripts/yui-2.8.1/build/editor/assets/skins/sam/simpleeditor.css +10 -0
  185. data/vendor/assets/javascripts/yui-2.8.1/build/editor/editor-debug.js +9557 -0
  186. data/vendor/assets/javascripts/yui-2.8.1/build/editor/editor-min.js +30 -0
  187. data/vendor/assets/javascripts/yui-2.8.1/build/editor/editor.js +9447 -0
  188. data/vendor/assets/javascripts/yui-2.8.1/build/editor/simpleeditor-debug.js +7493 -0
  189. data/vendor/assets/javascripts/yui-2.8.1/build/editor/simpleeditor-min.js +24 -0
  190. data/vendor/assets/javascripts/yui-2.8.1/build/editor/simpleeditor.js +7406 -0
  191. data/vendor/assets/javascripts/yui-2.8.1/build/element-delegate/element-delegate-debug.js +141 -0
  192. data/vendor/assets/javascripts/yui-2.8.1/build/element-delegate/element-delegate-min.js +7 -0
  193. data/vendor/assets/javascripts/yui-2.8.1/build/element-delegate/element-delegate.js +138 -0
  194. data/vendor/assets/javascripts/yui-2.8.1/build/element/element-debug.js +1106 -0
  195. data/vendor/assets/javascripts/yui-2.8.1/build/element/element-min.js +8 -0
  196. data/vendor/assets/javascripts/yui-2.8.1/build/element/element.js +1090 -0
  197. data/vendor/assets/javascripts/yui-2.8.1/build/event-delegate/event-delegate-debug.js +283 -0
  198. data/vendor/assets/javascripts/yui-2.8.1/build/event-delegate/event-delegate-min.js +7 -0
  199. data/vendor/assets/javascripts/yui-2.8.1/build/event-delegate/event-delegate.js +281 -0
  200. data/vendor/assets/javascripts/yui-2.8.1/build/event-mouseenter/event-mouseenter-debug.js +219 -0
  201. data/vendor/assets/javascripts/yui-2.8.1/build/event-mouseenter/event-mouseenter-min.js +7 -0
  202. data/vendor/assets/javascripts/yui-2.8.1/build/event-mouseenter/event-mouseenter.js +219 -0
  203. data/vendor/assets/javascripts/yui-2.8.1/build/event-simulate/event-simulate-debug.js +622 -0
  204. data/vendor/assets/javascripts/yui-2.8.1/build/event-simulate/event-simulate-min.js +7 -0
  205. data/vendor/assets/javascripts/yui-2.8.1/build/event-simulate/event-simulate.js +622 -0
  206. data/vendor/assets/javascripts/yui-2.8.1/build/event/event-debug.js +2524 -0
  207. data/vendor/assets/javascripts/yui-2.8.1/build/event/event-min.js +11 -0
  208. data/vendor/assets/javascripts/yui-2.8.1/build/event/event.js +2500 -0
  209. data/vendor/assets/javascripts/yui-2.8.1/build/fonts/fonts-min.css +7 -0
  210. data/vendor/assets/javascripts/yui-2.8.1/build/fonts/fonts.css +56 -0
  211. data/vendor/assets/javascripts/yui-2.8.1/build/get/get-debug.js +773 -0
  212. data/vendor/assets/javascripts/yui-2.8.1/build/get/get-min.js +7 -0
  213. data/vendor/assets/javascripts/yui-2.8.1/build/get/get.js +755 -0
  214. data/vendor/assets/javascripts/yui-2.8.1/build/grids/grids-min.css +7 -0
  215. data/vendor/assets/javascripts/yui-2.8.1/build/grids/grids.css +467 -0
  216. data/vendor/assets/javascripts/yui-2.8.1/build/history/assets/blank.html +1 -0
  217. data/vendor/assets/javascripts/yui-2.8.1/build/history/history-debug.js +808 -0
  218. data/vendor/assets/javascripts/yui-2.8.1/build/history/history-min.js +7 -0
  219. data/vendor/assets/javascripts/yui-2.8.1/build/history/history.js +808 -0
  220. data/vendor/assets/javascripts/yui-2.8.1/build/imagecropper/assets/imagecropper-core.css +33 -0
  221. data/vendor/assets/javascripts/yui-2.8.1/build/imagecropper/assets/skins/sam/imagecropper-skin.css +16 -0
  222. data/vendor/assets/javascripts/yui-2.8.1/build/imagecropper/assets/skins/sam/imagecropper.css +7 -0
  223. data/vendor/assets/javascripts/yui-2.8.1/build/imagecropper/imagecropper-debug.js +907 -0
  224. data/vendor/assets/javascripts/yui-2.8.1/build/imagecropper/imagecropper-min.js +8 -0
  225. data/vendor/assets/javascripts/yui-2.8.1/build/imagecropper/imagecropper.js +889 -0
  226. data/vendor/assets/javascripts/yui-2.8.1/build/imageloader/imageloader-debug.js +487 -0
  227. data/vendor/assets/javascripts/yui-2.8.1/build/imageloader/imageloader-min.js +7 -0
  228. data/vendor/assets/javascripts/yui-2.8.1/build/imageloader/imageloader.js +481 -0
  229. data/vendor/assets/javascripts/yui-2.8.1/build/json/json-debug.js +538 -0
  230. data/vendor/assets/javascripts/yui-2.8.1/build/json/json-min.js +7 -0
  231. data/vendor/assets/javascripts/yui-2.8.1/build/json/json.js +538 -0
  232. data/vendor/assets/javascripts/yui-2.8.1/build/layout/assets/layout-core.css +158 -0
  233. data/vendor/assets/javascripts/yui-2.8.1/build/layout/assets/skins/sam/layout-skin.css +207 -0
  234. data/vendor/assets/javascripts/yui-2.8.1/build/layout/assets/skins/sam/layout.css +7 -0
  235. data/vendor/assets/javascripts/yui-2.8.1/build/layout/assets/skins/sam/layout_sprite.png +0 -0
  236. data/vendor/assets/javascripts/yui-2.8.1/build/layout/layout-debug.js +2305 -0
  237. data/vendor/assets/javascripts/yui-2.8.1/build/layout/layout-min.js +11 -0
  238. data/vendor/assets/javascripts/yui-2.8.1/build/layout/layout.js +2290 -0
  239. data/vendor/assets/javascripts/yui-2.8.1/build/logger/assets/logger-core.css +7 -0
  240. data/vendor/assets/javascripts/yui-2.8.1/build/logger/assets/logger.css +57 -0
  241. data/vendor/assets/javascripts/yui-2.8.1/build/logger/assets/skins/sam/logger-skin.css +55 -0
  242. data/vendor/assets/javascripts/yui-2.8.1/build/logger/assets/skins/sam/logger.css +7 -0
  243. data/vendor/assets/javascripts/yui-2.8.1/build/logger/logger-debug.js +2104 -0
  244. data/vendor/assets/javascripts/yui-2.8.1/build/logger/logger-min.js +9 -0
  245. data/vendor/assets/javascripts/yui-2.8.1/build/logger/logger.js +2104 -0
  246. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menu-core.css +242 -0
  247. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menu.css +503 -0
  248. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menu_down_arrow.png +0 -0
  249. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menu_down_arrow_disabled.png +0 -0
  250. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menu_up_arrow.png +0 -0
  251. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menu_up_arrow_disabled.png +0 -0
  252. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menubaritem_submenuindicator.png +0 -0
  253. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menubaritem_submenuindicator_disabled.png +0 -0
  254. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menubaritem_submenuindicator_selected.png +0 -0
  255. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menuitem_checkbox.png +0 -0
  256. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menuitem_checkbox_disabled.png +0 -0
  257. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menuitem_checkbox_selected.png +0 -0
  258. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menuitem_submenuindicator.png +0 -0
  259. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menuitem_submenuindicator_disabled.png +0 -0
  260. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/menuitem_submenuindicator_selected.png +0 -0
  261. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/skins/sam/menu-skin.css +339 -0
  262. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/skins/sam/menu.css +7 -0
  263. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/skins/sam/menubaritem_submenuindicator.png +0 -0
  264. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/skins/sam/menubaritem_submenuindicator_disabled.png +0 -0
  265. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/skins/sam/menuitem_checkbox.png +0 -0
  266. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/skins/sam/menuitem_checkbox_disabled.png +0 -0
  267. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/skins/sam/menuitem_submenuindicator.png +0 -0
  268. data/vendor/assets/javascripts/yui-2.8.1/build/menu/assets/skins/sam/menuitem_submenuindicator_disabled.png +0 -0
  269. data/vendor/assets/javascripts/yui-2.8.1/build/menu/menu-debug.js +9870 -0
  270. data/vendor/assets/javascripts/yui-2.8.1/build/menu/menu-min.js +16 -0
  271. data/vendor/assets/javascripts/yui-2.8.1/build/menu/menu.js +9823 -0
  272. data/vendor/assets/javascripts/yui-2.8.1/build/paginator/assets/paginator-core.css +6 -0
  273. data/vendor/assets/javascripts/yui-2.8.1/build/paginator/assets/skins/sam/paginator-skin.css +78 -0
  274. data/vendor/assets/javascripts/yui-2.8.1/build/paginator/assets/skins/sam/paginator.css +7 -0
  275. data/vendor/assets/javascripts/yui-2.8.1/build/paginator/paginator-debug.js +2393 -0
  276. data/vendor/assets/javascripts/yui-2.8.1/build/paginator/paginator-min.js +10 -0
  277. data/vendor/assets/javascripts/yui-2.8.1/build/paginator/paginator.js +2393 -0
  278. data/vendor/assets/javascripts/yui-2.8.1/build/profiler/profiler-debug.js +557 -0
  279. data/vendor/assets/javascripts/yui-2.8.1/build/profiler/profiler-min.js +7 -0
  280. data/vendor/assets/javascripts/yui-2.8.1/build/profiler/profiler.js +557 -0
  281. data/vendor/assets/javascripts/yui-2.8.1/build/profilerviewer/assets/profilerviewer-core.css +6 -0
  282. data/vendor/assets/javascripts/yui-2.8.1/build/profilerviewer/assets/skins/sam/asc.gif +0 -0
  283. data/vendor/assets/javascripts/yui-2.8.1/build/profilerviewer/assets/skins/sam/desc.gif +0 -0
  284. data/vendor/assets/javascripts/yui-2.8.1/build/profilerviewer/assets/skins/sam/header_background.png +0 -0
  285. data/vendor/assets/javascripts/yui-2.8.1/build/profilerviewer/assets/skins/sam/profilerviewer-skin.css +167 -0
  286. data/vendor/assets/javascripts/yui-2.8.1/build/profilerviewer/assets/skins/sam/profilerviewer.css +7 -0
  287. data/vendor/assets/javascripts/yui-2.8.1/build/profilerviewer/assets/skins/sam/wait.gif +0 -0
  288. data/vendor/assets/javascripts/yui-2.8.1/build/profilerviewer/profilerviewer-debug.js +1229 -0
  289. data/vendor/assets/javascripts/yui-2.8.1/build/profilerviewer/profilerviewer-min.js +9 -0
  290. data/vendor/assets/javascripts/yui-2.8.1/build/profilerviewer/profilerviewer.js +1192 -0
  291. data/vendor/assets/javascripts/yui-2.8.1/build/progressbar/assets/progressbar-core.css +85 -0
  292. data/vendor/assets/javascripts/yui-2.8.1/build/progressbar/assets/skins/sam/back-h.png +0 -0
  293. data/vendor/assets/javascripts/yui-2.8.1/build/progressbar/assets/skins/sam/back-v.png +0 -0
  294. data/vendor/assets/javascripts/yui-2.8.1/build/progressbar/assets/skins/sam/bar-h.png +0 -0
  295. data/vendor/assets/javascripts/yui-2.8.1/build/progressbar/assets/skins/sam/bar-v.png +0 -0
  296. data/vendor/assets/javascripts/yui-2.8.1/build/progressbar/assets/skins/sam/progressbar-skin.css +56 -0
  297. data/vendor/assets/javascripts/yui-2.8.1/build/progressbar/assets/skins/sam/progressbar.css +7 -0
  298. data/vendor/assets/javascripts/yui-2.8.1/build/progressbar/progressbar-debug.js +691 -0
  299. data/vendor/assets/javascripts/yui-2.8.1/build/progressbar/progressbar-min.js +8 -0
  300. data/vendor/assets/javascripts/yui-2.8.1/build/progressbar/progressbar.js +677 -0
  301. data/vendor/assets/javascripts/yui-2.8.1/build/reset-fonts-grids/reset-fonts-grids.css +7 -0
  302. data/vendor/assets/javascripts/yui-2.8.1/build/reset-fonts/reset-fonts.css +7 -0
  303. data/vendor/assets/javascripts/yui-2.8.1/build/reset/reset-min.css +7 -0
  304. data/vendor/assets/javascripts/yui-2.8.1/build/reset/reset.css +142 -0
  305. data/vendor/assets/javascripts/yui-2.8.1/build/resize/assets/resize-core.css +173 -0
  306. data/vendor/assets/javascripts/yui-2.8.1/build/resize/assets/skins/sam/layout_sprite.png +0 -0
  307. data/vendor/assets/javascripts/yui-2.8.1/build/resize/assets/skins/sam/resize-skin.css +142 -0
  308. data/vendor/assets/javascripts/yui-2.8.1/build/resize/assets/skins/sam/resize.css +7 -0
  309. data/vendor/assets/javascripts/yui-2.8.1/build/resize/resize-debug.js +1749 -0
  310. data/vendor/assets/javascripts/yui-2.8.1/build/resize/resize-min.js +10 -0
  311. data/vendor/assets/javascripts/yui-2.8.1/build/resize/resize.js +1689 -0
  312. data/vendor/assets/javascripts/yui-2.8.1/build/selector/selector-debug.js +651 -0
  313. data/vendor/assets/javascripts/yui-2.8.1/build/selector/selector-min.js +8 -0
  314. data/vendor/assets/javascripts/yui-2.8.1/build/selector/selector.js +644 -0
  315. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/bg-fader.gif +0 -0
  316. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/bg-h.gif +0 -0
  317. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/bg-v-e.gif +0 -0
  318. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/bg-v.gif +0 -0
  319. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/left-thumb.png +0 -0
  320. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/right-thumb.png +0 -0
  321. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/skins/sam/bg-h.gif +0 -0
  322. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/skins/sam/bg-v.gif +0 -0
  323. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/skins/sam/slider-skin.css +24 -0
  324. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/skins/sam/slider.css +7 -0
  325. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/slider-core.css +17 -0
  326. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/slider-skin.css +20 -0
  327. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/thumb-bar.gif +0 -0
  328. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/thumb-e.gif +0 -0
  329. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/thumb-fader.gif +0 -0
  330. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/thumb-n.gif +0 -0
  331. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/thumb-s.gif +0 -0
  332. data/vendor/assets/javascripts/yui-2.8.1/build/slider/assets/thumb-w.gif +0 -0
  333. data/vendor/assets/javascripts/yui-2.8.1/build/slider/slider-debug.js +2114 -0
  334. data/vendor/assets/javascripts/yui-2.8.1/build/slider/slider-min.js +9 -0
  335. data/vendor/assets/javascripts/yui-2.8.1/build/slider/slider.js +2068 -0
  336. data/vendor/assets/javascripts/yui-2.8.1/build/storage/storage-debug.js +1185 -0
  337. data/vendor/assets/javascripts/yui-2.8.1/build/storage/storage-min.js +8 -0
  338. data/vendor/assets/javascripts/yui-2.8.1/build/storage/storage.js +1183 -0
  339. data/vendor/assets/javascripts/yui-2.8.1/build/stylesheet/stylesheet-debug.js +648 -0
  340. data/vendor/assets/javascripts/yui-2.8.1/build/stylesheet/stylesheet-min.js +7 -0
  341. data/vendor/assets/javascripts/yui-2.8.1/build/stylesheet/stylesheet.js +645 -0
  342. data/vendor/assets/javascripts/yui-2.8.1/build/swf/swf-debug.js +269 -0
  343. data/vendor/assets/javascripts/yui-2.8.1/build/swf/swf-min.js +7 -0
  344. data/vendor/assets/javascripts/yui-2.8.1/build/swf/swf.js +268 -0
  345. data/vendor/assets/javascripts/yui-2.8.1/build/swfdetect/swfdetect-debug.js +93 -0
  346. data/vendor/assets/javascripts/yui-2.8.1/build/swfdetect/swfdetect-min.js +7 -0
  347. data/vendor/assets/javascripts/yui-2.8.1/build/swfdetect/swfdetect.js +93 -0
  348. data/vendor/assets/javascripts/yui-2.8.1/build/swfstore/swf.js +238 -0
  349. data/vendor/assets/javascripts/yui-2.8.1/build/swfstore/swfstore-debug.js +470 -0
  350. data/vendor/assets/javascripts/yui-2.8.1/build/swfstore/swfstore-min.js +7 -0
  351. data/vendor/assets/javascripts/yui-2.8.1/build/swfstore/swfstore.js +453 -0
  352. data/vendor/assets/javascripts/yui-2.8.1/build/swfstore/swfstore.swf +0 -0
  353. data/vendor/assets/javascripts/yui-2.8.1/build/tabview/assets/border_tabs.css +54 -0
  354. data/vendor/assets/javascripts/yui-2.8.1/build/tabview/assets/loading.gif +0 -0
  355. data/vendor/assets/javascripts/yui-2.8.1/build/tabview/assets/skin-sam.css +77 -0
  356. data/vendor/assets/javascripts/yui-2.8.1/build/tabview/assets/skins/sam/tabview-skin.css +186 -0
  357. data/vendor/assets/javascripts/yui-2.8.1/build/tabview/assets/skins/sam/tabview.css +8 -0
  358. data/vendor/assets/javascripts/yui-2.8.1/build/tabview/assets/tabview-core.css +133 -0
  359. data/vendor/assets/javascripts/yui-2.8.1/build/tabview/assets/tabview.css +77 -0
  360. data/vendor/assets/javascripts/yui-2.8.1/build/tabview/tabview-debug.js +995 -0
  361. data/vendor/assets/javascripts/yui-2.8.1/build/tabview/tabview-min.js +8 -0
  362. data/vendor/assets/javascripts/yui-2.8.1/build/tabview/tabview.js +987 -0
  363. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/assets/skins/sam/check0.gif +0 -0
  364. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/assets/skins/sam/check1.gif +0 -0
  365. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/assets/skins/sam/check2.gif +0 -0
  366. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/assets/skins/sam/loading.gif +0 -0
  367. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/assets/skins/sam/treeview-loading.gif +0 -0
  368. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/assets/skins/sam/treeview-skin.css +249 -0
  369. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/assets/skins/sam/treeview-sprite.gif +0 -0
  370. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/assets/skins/sam/treeview.css +7 -0
  371. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/assets/treeview-core.css +6 -0
  372. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/treeview-debug.js +4058 -0
  373. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/treeview-min.js +12 -0
  374. data/vendor/assets/javascripts/yui-2.8.1/build/treeview/treeview.js +3989 -0
  375. data/vendor/assets/javascripts/yui-2.8.1/build/uploader/assets/uploader.swf +0 -0
  376. data/vendor/assets/javascripts/yui-2.8.1/build/uploader/uploader-debug.js +1072 -0
  377. data/vendor/assets/javascripts/yui-2.8.1/build/uploader/uploader-min.js +15 -0
  378. data/vendor/assets/javascripts/yui-2.8.1/build/uploader/uploader.js +1069 -0
  379. data/vendor/assets/javascripts/yui-2.8.1/build/utilities/utilities.js +39 -0
  380. data/vendor/assets/javascripts/yui-2.8.1/build/yahoo-dom-event/yahoo-dom-event.js +14 -0
  381. data/vendor/assets/javascripts/yui-2.8.1/build/yahoo/yahoo-debug.js +1075 -0
  382. data/vendor/assets/javascripts/yui-2.8.1/build/yahoo/yahoo-min.js +7 -0
  383. data/vendor/assets/javascripts/yui-2.8.1/build/yahoo/yahoo.js +1075 -0
  384. data/vendor/assets/javascripts/yui-2.8.1/build/yuiloader-dom-event/yuiloader-dom-event.js +17 -0
  385. data/vendor/assets/javascripts/yui-2.8.1/build/yuiloader/yuiloader-debug.js +3879 -0
  386. data/vendor/assets/javascripts/yui-2.8.1/build/yuiloader/yuiloader-min.js +10 -0
  387. data/vendor/assets/javascripts/yui-2.8.1/build/yuiloader/yuiloader.js +3879 -0
  388. data/vendor/assets/javascripts/yui-2.8.1/build/yuitest/assets/skins/sam/yuitest-skin.css +7 -0
  389. data/vendor/assets/javascripts/yui-2.8.1/build/yuitest/assets/skins/sam/yuitest.css +7 -0
  390. data/vendor/assets/javascripts/yui-2.8.1/build/yuitest/assets/testlogger.css +7 -0
  391. data/vendor/assets/javascripts/yui-2.8.1/build/yuitest/assets/yuitest-core.css +7 -0
  392. data/vendor/assets/javascripts/yui-2.8.1/build/yuitest/yuitest-debug.js +2741 -0
  393. data/vendor/assets/javascripts/yui-2.8.1/build/yuitest/yuitest-min.js +10 -0
  394. data/vendor/assets/javascripts/yui-2.8.1/build/yuitest/yuitest.js +2741 -0
  395. data/vendor/assets/javascripts/yui-2.8.1/build/yuitest/yuitest_core-debug.js +1976 -0
  396. data/vendor/assets/javascripts/yui-2.8.1/build/yuitest/yuitest_core-min.js +9 -0
  397. data/vendor/assets/javascripts/yui-2.8.1/build/yuitest/yuitest_core.js +1976 -0
  398. metadata +470 -0
@@ -0,0 +1,1872 @@
1
+ /*
2
+ Copyright (c) 2010, Yahoo! Inc. All rights reserved.
3
+ Code licensed under the BSD License:
4
+ http://developer.yahoo.com/yui/license.html
5
+ version: 2.8.1
6
+ */
7
+ /**
8
+ * The dom module provides helper methods for manipulating Dom elements.
9
+ * @module dom
10
+ *
11
+ */
12
+
13
+ (function() {
14
+ // for use with generateId (global to save state if Dom is overwritten)
15
+ YAHOO.env._id_counter = YAHOO.env._id_counter || 0;
16
+
17
+ // internal shorthand
18
+ var Y = YAHOO.util,
19
+ lang = YAHOO.lang,
20
+ UA = YAHOO.env.ua,
21
+ trim = YAHOO.lang.trim,
22
+ propertyCache = {}, // for faster hyphen converts
23
+ reCache = {}, // cache className regexes
24
+ RE_TABLE = /^t(?:able|d|h)$/i, // for _calcBorders
25
+ RE_COLOR = /color$/i,
26
+
27
+ // DOM aliases
28
+ document = window.document,
29
+ documentElement = document.documentElement,
30
+
31
+ // string constants
32
+ OWNER_DOCUMENT = 'ownerDocument',
33
+ DEFAULT_VIEW = 'defaultView',
34
+ DOCUMENT_ELEMENT = 'documentElement',
35
+ COMPAT_MODE = 'compatMode',
36
+ OFFSET_LEFT = 'offsetLeft',
37
+ OFFSET_TOP = 'offsetTop',
38
+ OFFSET_PARENT = 'offsetParent',
39
+ PARENT_NODE = 'parentNode',
40
+ NODE_TYPE = 'nodeType',
41
+ TAG_NAME = 'tagName',
42
+ SCROLL_LEFT = 'scrollLeft',
43
+ SCROLL_TOP = 'scrollTop',
44
+ GET_BOUNDING_CLIENT_RECT = 'getBoundingClientRect',
45
+ GET_COMPUTED_STYLE = 'getComputedStyle',
46
+ CURRENT_STYLE = 'currentStyle',
47
+ CSS1_COMPAT = 'CSS1Compat',
48
+ _BACK_COMPAT = 'BackCompat',
49
+ _CLASS = 'class', // underscore due to reserved word
50
+ CLASS_NAME = 'className',
51
+ EMPTY = '',
52
+ SPACE = ' ',
53
+ C_START = '(?:^|\\s)',
54
+ C_END = '(?= |$)',
55
+ G = 'g',
56
+ POSITION = 'position',
57
+ FIXED = 'fixed',
58
+ RELATIVE = 'relative',
59
+ LEFT = 'left',
60
+ TOP = 'top',
61
+ MEDIUM = 'medium',
62
+ BORDER_LEFT_WIDTH = 'borderLeftWidth',
63
+ BORDER_TOP_WIDTH = 'borderTopWidth',
64
+
65
+ // brower detection
66
+ isOpera = UA.opera,
67
+ isSafari = UA.webkit,
68
+ isGecko = UA.gecko,
69
+ isIE = UA.ie;
70
+
71
+ /**
72
+ * Provides helper methods for DOM elements.
73
+ * @namespace YAHOO.util
74
+ * @class Dom
75
+ * @requires yahoo, event
76
+ */
77
+ Y.Dom = {
78
+ CUSTOM_ATTRIBUTES: (!documentElement.hasAttribute) ? { // IE < 8
79
+ 'for': 'htmlFor',
80
+ 'class': CLASS_NAME
81
+ } : { // w3c
82
+ 'htmlFor': 'for',
83
+ 'className': _CLASS
84
+ },
85
+
86
+ DOT_ATTRIBUTES: {},
87
+
88
+ /**
89
+ * Returns an HTMLElement reference.
90
+ * @method get
91
+ * @param {String | HTMLElement |Array} el Accepts a string to use as an ID for getting a DOM reference, an actual DOM reference, or an Array of IDs and/or HTMLElements.
92
+ * @return {HTMLElement | Array} A DOM reference to an HTML element or an array of HTMLElements.
93
+ */
94
+ get: function(el) {
95
+ var id, nodes, c, i, len, attr;
96
+
97
+ if (el) {
98
+ if (el[NODE_TYPE] || el.item) { // Node, or NodeList
99
+ return el;
100
+ }
101
+
102
+ if (typeof el === 'string') { // id
103
+ id = el;
104
+ el = document.getElementById(el);
105
+ attr = (el) ? el.attributes : null;
106
+ if (el && attr && attr.id && attr.id.value === id) { // IE: avoid false match on "name" attribute
107
+ return el;
108
+ } else if (el && document.all) { // filter by name
109
+ el = null;
110
+ nodes = document.all[id];
111
+ for (i = 0, len = nodes.length; i < len; ++i) {
112
+ if (nodes[i].id === id) {
113
+ return nodes[i];
114
+ }
115
+ }
116
+ }
117
+ return el;
118
+ }
119
+
120
+ if (YAHOO.util.Element && el instanceof YAHOO.util.Element) {
121
+ el = el.get('element');
122
+ }
123
+
124
+ if ('length' in el) { // array-like
125
+ c = [];
126
+ for (i = 0, len = el.length; i < len; ++i) {
127
+ c[c.length] = Y.Dom.get(el[i]);
128
+ }
129
+
130
+ return c;
131
+ }
132
+
133
+ return el; // some other object, just pass it back
134
+ }
135
+
136
+ return null;
137
+ },
138
+
139
+ getComputedStyle: function(el, property) {
140
+ if (window[GET_COMPUTED_STYLE]) {
141
+ return el[OWNER_DOCUMENT][DEFAULT_VIEW][GET_COMPUTED_STYLE](el, null)[property];
142
+ } else if (el[CURRENT_STYLE]) {
143
+ return Y.Dom.IE_ComputedStyle.get(el, property);
144
+ }
145
+ },
146
+
147
+ /**
148
+ * Normalizes currentStyle and ComputedStyle.
149
+ * @method getStyle
150
+ * @param {String | HTMLElement |Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
151
+ * @param {String} property The style property whose value is returned.
152
+ * @return {String | Array} The current value of the style property for the element(s).
153
+ */
154
+ getStyle: function(el, property) {
155
+ return Y.Dom.batch(el, Y.Dom._getStyle, property);
156
+ },
157
+
158
+ // branching at load instead of runtime
159
+ _getStyle: function() {
160
+ if (window[GET_COMPUTED_STYLE]) { // W3C DOM method
161
+ return function(el, property) {
162
+ property = (property === 'float') ? property = 'cssFloat' :
163
+ Y.Dom._toCamel(property);
164
+
165
+ var value = el.style[property],
166
+ computed;
167
+
168
+ if (!value) {
169
+ computed = el[OWNER_DOCUMENT][DEFAULT_VIEW][GET_COMPUTED_STYLE](el, null);
170
+ if (computed) { // test computed before touching for safari
171
+ value = computed[property];
172
+ }
173
+ }
174
+
175
+ return value;
176
+ };
177
+ } else if (documentElement[CURRENT_STYLE]) {
178
+ return function(el, property) {
179
+ var value;
180
+
181
+ switch(property) {
182
+ case 'opacity' :// IE opacity uses filter
183
+ value = 100;
184
+ try { // will error if no DXImageTransform
185
+ value = el.filters['DXImageTransform.Microsoft.Alpha'].opacity;
186
+
187
+ } catch(e) {
188
+ try { // make sure its in the document
189
+ value = el.filters('alpha').opacity;
190
+ } catch(err) {
191
+ YAHOO.log('getStyle: IE filter failed',
192
+ 'error', 'Dom');
193
+ }
194
+ }
195
+ return value / 100;
196
+ case 'float': // fix reserved word
197
+ property = 'styleFloat'; // fall through
198
+ default:
199
+ property = Y.Dom._toCamel(property);
200
+ value = el[CURRENT_STYLE] ? el[CURRENT_STYLE][property] : null;
201
+ return ( el.style[property] || value );
202
+ }
203
+ };
204
+ }
205
+ }(),
206
+
207
+ /**
208
+ * Wrapper for setting style properties of HTMLElements. Normalizes "opacity" across modern browsers.
209
+ * @method setStyle
210
+ * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
211
+ * @param {String} property The style property to be set.
212
+ * @param {String} val The value to apply to the given property.
213
+ */
214
+ setStyle: function(el, property, val) {
215
+ Y.Dom.batch(el, Y.Dom._setStyle, { prop: property, val: val });
216
+ },
217
+
218
+ _setStyle: function() {
219
+ if (isIE) {
220
+ return function(el, args) {
221
+ var property = Y.Dom._toCamel(args.prop),
222
+ val = args.val;
223
+
224
+ if (el) {
225
+ switch (property) {
226
+ case 'opacity':
227
+ if ( lang.isString(el.style.filter) ) { // in case not appended
228
+ el.style.filter = 'alpha(opacity=' + val * 100 + ')';
229
+
230
+ if (!el[CURRENT_STYLE] || !el[CURRENT_STYLE].hasLayout) {
231
+ el.style.zoom = 1; // when no layout or cant tell
232
+ }
233
+ }
234
+ break;
235
+ case 'float':
236
+ property = 'styleFloat';
237
+ default:
238
+ el.style[property] = val;
239
+ }
240
+ } else {
241
+ YAHOO.log('element ' + el + ' is undefined', 'error', 'Dom');
242
+ }
243
+ };
244
+ } else {
245
+ return function(el, args) {
246
+ var property = Y.Dom._toCamel(args.prop),
247
+ val = args.val;
248
+ if (el) {
249
+ if (property == 'float') {
250
+ property = 'cssFloat';
251
+ }
252
+ el.style[property] = val;
253
+ } else {
254
+ YAHOO.log('element ' + el + ' is undefined', 'error', 'Dom');
255
+ }
256
+ };
257
+ }
258
+
259
+ }(),
260
+
261
+ /**
262
+ * Gets the current position of an element based on page coordinates.
263
+ * Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
264
+ * @method getXY
265
+ * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM
266
+ * reference, or an Array of IDs and/or HTMLElements
267
+ * @return {Array} The XY position of the element(s)
268
+ */
269
+ getXY: function(el) {
270
+ return Y.Dom.batch(el, Y.Dom._getXY);
271
+ },
272
+
273
+ _canPosition: function(el) {
274
+ return ( Y.Dom._getStyle(el, 'display') !== 'none' && Y.Dom._inDoc(el) );
275
+ },
276
+
277
+ _getXY: function() {
278
+ if (document[DOCUMENT_ELEMENT][GET_BOUNDING_CLIENT_RECT]) {
279
+ return function(node) {
280
+ var scrollLeft, scrollTop, box, doc,
281
+ off1, off2, mode, bLeft, bTop,
282
+ floor = Math.floor, // TODO: round?
283
+ xy = false;
284
+
285
+ if (Y.Dom._canPosition(node)) {
286
+ box = node[GET_BOUNDING_CLIENT_RECT]();
287
+ doc = node[OWNER_DOCUMENT];
288
+ scrollLeft = Y.Dom.getDocumentScrollLeft(doc);
289
+ scrollTop = Y.Dom.getDocumentScrollTop(doc);
290
+ xy = [floor(box[LEFT]), floor(box[TOP])];
291
+
292
+ if (isIE && UA.ie < 8) { // IE < 8: viewport off by 2
293
+ off1 = 2;
294
+ off2 = 2;
295
+ mode = doc[COMPAT_MODE];
296
+
297
+ if (UA.ie === 6) {
298
+ if (mode !== _BACK_COMPAT) {
299
+ off1 = 0;
300
+ off2 = 0;
301
+ }
302
+ }
303
+
304
+ if ((mode === _BACK_COMPAT)) {
305
+ bLeft = _getComputedStyle(doc[DOCUMENT_ELEMENT], BORDER_LEFT_WIDTH);
306
+ bTop = _getComputedStyle(doc[DOCUMENT_ELEMENT], BORDER_TOP_WIDTH);
307
+ if (bLeft !== MEDIUM) {
308
+ off1 = parseInt(bLeft, 10);
309
+ }
310
+ if (bTop !== MEDIUM) {
311
+ off2 = parseInt(bTop, 10);
312
+ }
313
+ }
314
+
315
+ xy[0] -= off1;
316
+ xy[1] -= off2;
317
+
318
+ }
319
+
320
+ if ((scrollTop || scrollLeft)) {
321
+ xy[0] += scrollLeft;
322
+ xy[1] += scrollTop;
323
+ }
324
+
325
+ // gecko may return sub-pixel (non-int) values
326
+ xy[0] = floor(xy[0]);
327
+ xy[1] = floor(xy[1]);
328
+ } else {
329
+ YAHOO.log('getXY failed: element not positionable (either not in a document or not displayed)', 'error', 'Dom');
330
+ }
331
+
332
+ return xy;
333
+ };
334
+ } else {
335
+ return function(node) { // ff2, safari: manually calculate by crawling up offsetParents
336
+ var docScrollLeft, docScrollTop,
337
+ scrollTop, scrollLeft,
338
+ bCheck,
339
+ xy = false,
340
+ parentNode = node;
341
+
342
+ if (Y.Dom._canPosition(node) ) {
343
+ xy = [node[OFFSET_LEFT], node[OFFSET_TOP]];
344
+ docScrollLeft = Y.Dom.getDocumentScrollLeft(node[OWNER_DOCUMENT]);
345
+ docScrollTop = Y.Dom.getDocumentScrollTop(node[OWNER_DOCUMENT]);
346
+
347
+ // TODO: refactor with !! or just falsey
348
+ bCheck = ((isGecko || UA.webkit > 519) ? true : false);
349
+
350
+ // TODO: worth refactoring for TOP/LEFT only?
351
+ while ((parentNode = parentNode[OFFSET_PARENT])) {
352
+ xy[0] += parentNode[OFFSET_LEFT];
353
+ xy[1] += parentNode[OFFSET_TOP];
354
+ if (bCheck) {
355
+ xy = Y.Dom._calcBorders(parentNode, xy);
356
+ }
357
+ }
358
+
359
+ // account for any scrolled ancestors
360
+ if (Y.Dom._getStyle(node, POSITION) !== FIXED) {
361
+ parentNode = node;
362
+
363
+ while ((parentNode = parentNode[PARENT_NODE]) && parentNode[TAG_NAME]) {
364
+ scrollTop = parentNode[SCROLL_TOP];
365
+ scrollLeft = parentNode[SCROLL_LEFT];
366
+
367
+ //Firefox does something funky with borders when overflow is not visible.
368
+ if (isGecko && (Y.Dom._getStyle(parentNode, 'overflow') !== 'visible')) {
369
+ xy = Y.Dom._calcBorders(parentNode, xy);
370
+ }
371
+
372
+ if (scrollTop || scrollLeft) {
373
+ xy[0] -= scrollLeft;
374
+ xy[1] -= scrollTop;
375
+ }
376
+ }
377
+ xy[0] += docScrollLeft;
378
+ xy[1] += docScrollTop;
379
+
380
+ } else {
381
+ //Fix FIXED position -- add scrollbars
382
+ if (isOpera) {
383
+ xy[0] -= docScrollLeft;
384
+ xy[1] -= docScrollTop;
385
+ } else if (isSafari || isGecko) {
386
+ xy[0] += docScrollLeft;
387
+ xy[1] += docScrollTop;
388
+ }
389
+ }
390
+ //Round the numbers so we get sane data back
391
+ xy[0] = Math.floor(xy[0]);
392
+ xy[1] = Math.floor(xy[1]);
393
+ } else {
394
+ YAHOO.log('getXY failed: element not positionable (either not in a document or not displayed)', 'error', 'Dom');
395
+ }
396
+ return xy;
397
+ };
398
+ }
399
+ }(), // NOTE: Executing for loadtime branching
400
+
401
+ /**
402
+ * Gets the current X position of an element based on page coordinates. The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
403
+ * @method getX
404
+ * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
405
+ * @return {Number | Array} The X position of the element(s)
406
+ */
407
+ getX: function(el) {
408
+ var f = function(el) {
409
+ return Y.Dom.getXY(el)[0];
410
+ };
411
+
412
+ return Y.Dom.batch(el, f, Y.Dom, true);
413
+ },
414
+
415
+ /**
416
+ * Gets the current Y position of an element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
417
+ * @method getY
418
+ * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
419
+ * @return {Number | Array} The Y position of the element(s)
420
+ */
421
+ getY: function(el) {
422
+ var f = function(el) {
423
+ return Y.Dom.getXY(el)[1];
424
+ };
425
+
426
+ return Y.Dom.batch(el, f, Y.Dom, true);
427
+ },
428
+
429
+ /**
430
+ * Set the position of an html element in page coordinates, regardless of how the element is positioned.
431
+ * The element(s) must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
432
+ * @method setXY
433
+ * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
434
+ * @param {Array} pos Contains X & Y values for new position (coordinates are page-based)
435
+ * @param {Boolean} noRetry By default we try and set the position a second time if the first fails
436
+ */
437
+ setXY: function(el, pos, noRetry) {
438
+ Y.Dom.batch(el, Y.Dom._setXY, { pos: pos, noRetry: noRetry });
439
+ },
440
+
441
+ _setXY: function(node, args) {
442
+ var pos = Y.Dom._getStyle(node, POSITION),
443
+ setStyle = Y.Dom.setStyle,
444
+ xy = args.pos,
445
+ noRetry = args.noRetry,
446
+
447
+ delta = [ // assuming pixels; if not we will have to retry
448
+ parseInt( Y.Dom.getComputedStyle(node, LEFT), 10 ),
449
+ parseInt( Y.Dom.getComputedStyle(node, TOP), 10 )
450
+ ],
451
+
452
+ currentXY,
453
+ newXY;
454
+
455
+ if (pos == 'static') { // default to relative
456
+ pos = RELATIVE;
457
+ setStyle(node, POSITION, pos);
458
+ }
459
+
460
+ currentXY = Y.Dom._getXY(node);
461
+
462
+ if (!xy || currentXY === false) { // has to be part of doc to have xy
463
+ YAHOO.log('xy failed: node not available', 'error', 'Node');
464
+ return false;
465
+ }
466
+
467
+ if ( isNaN(delta[0]) ) {// in case of 'auto'
468
+ delta[0] = (pos == RELATIVE) ? 0 : node[OFFSET_LEFT];
469
+ }
470
+ if ( isNaN(delta[1]) ) { // in case of 'auto'
471
+ delta[1] = (pos == RELATIVE) ? 0 : node[OFFSET_TOP];
472
+ }
473
+
474
+ if (xy[0] !== null) { // from setX
475
+ setStyle(node, LEFT, xy[0] - currentXY[0] + delta[0] + 'px');
476
+ }
477
+
478
+ if (xy[1] !== null) { // from setY
479
+ setStyle(node, TOP, xy[1] - currentXY[1] + delta[1] + 'px');
480
+ }
481
+
482
+ if (!noRetry) {
483
+ newXY = Y.Dom._getXY(node);
484
+
485
+ // if retry is true, try one more time if we miss
486
+ if ( (xy[0] !== null && newXY[0] != xy[0]) ||
487
+ (xy[1] !== null && newXY[1] != xy[1]) ) {
488
+ Y.Dom._setXY(node, { pos: xy, noRetry: true });
489
+ }
490
+ }
491
+
492
+ YAHOO.log('setXY setting position to ' + xy, 'info', 'Node');
493
+ },
494
+
495
+ /**
496
+ * Set the X position of an html element in page coordinates, regardless of how the element is positioned.
497
+ * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
498
+ * @method setX
499
+ * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
500
+ * @param {Int} x The value to use as the X coordinate for the element(s).
501
+ */
502
+ setX: function(el, x) {
503
+ Y.Dom.setXY(el, [x, null]);
504
+ },
505
+
506
+ /**
507
+ * Set the Y position of an html element in page coordinates, regardless of how the element is positioned.
508
+ * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
509
+ * @method setY
510
+ * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
511
+ * @param {Int} x To use as the Y coordinate for the element(s).
512
+ */
513
+ setY: function(el, y) {
514
+ Y.Dom.setXY(el, [null, y]);
515
+ },
516
+
517
+ /**
518
+ * Returns the region position of the given element.
519
+ * The element must be part of the DOM tree to have a region (display:none or elements not appended return false).
520
+ * @method getRegion
521
+ * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
522
+ * @return {Region | Array} A Region or array of Region instances containing "top, left, bottom, right" member data.
523
+ */
524
+ getRegion: function(el) {
525
+ var f = function(el) {
526
+ var region = false;
527
+ if ( Y.Dom._canPosition(el) ) {
528
+ region = Y.Region.getRegion(el);
529
+ YAHOO.log('getRegion returning ' + region, 'info', 'Dom');
530
+ } else {
531
+ YAHOO.log('getRegion failed: element not positionable (either not in a document or not displayed)', 'error', 'Dom');
532
+ }
533
+
534
+ return region;
535
+ };
536
+
537
+ return Y.Dom.batch(el, f, Y.Dom, true);
538
+ },
539
+
540
+ /**
541
+ * Returns the width of the client (viewport).
542
+ * @method getClientWidth
543
+ * @deprecated Now using getViewportWidth. This interface left intact for back compat.
544
+ * @return {Int} The width of the viewable area of the page.
545
+ */
546
+ getClientWidth: function() {
547
+ return Y.Dom.getViewportWidth();
548
+ },
549
+
550
+ /**
551
+ * Returns the height of the client (viewport).
552
+ * @method getClientHeight
553
+ * @deprecated Now using getViewportHeight. This interface left intact for back compat.
554
+ * @return {Int} The height of the viewable area of the page.
555
+ */
556
+ getClientHeight: function() {
557
+ return Y.Dom.getViewportHeight();
558
+ },
559
+
560
+ /**
561
+ * Returns an array of HTMLElements with the given class.
562
+ * For optimized performance, include a tag and/or root node when possible.
563
+ * Note: This method operates against a live collection, so modifying the
564
+ * collection in the callback (removing/appending nodes, etc.) will have
565
+ * side effects. Instead you should iterate the returned nodes array,
566
+ * as you would with the native "getElementsByTagName" method.
567
+ * @method getElementsByClassName
568
+ * @param {String} className The class name to match against
569
+ * @param {String} tag (optional) The tag name of the elements being collected
570
+ * @param {String | HTMLElement} root (optional) The HTMLElement or an ID to use as the starting point.
571
+ * This element is not included in the className scan.
572
+ * @param {Function} apply (optional) A function to apply to each element when found
573
+ * @param {Any} o (optional) An optional arg that is passed to the supplied method
574
+ * @param {Boolean} overrides (optional) Whether or not to override the scope of "method" with "o"
575
+ * @return {Array} An array of elements that have the given class name
576
+ */
577
+ getElementsByClassName: function(className, tag, root, apply, o, overrides) {
578
+ tag = tag || '*';
579
+ root = (root) ? Y.Dom.get(root) : null || document;
580
+ if (!root) {
581
+ return [];
582
+ }
583
+
584
+ var nodes = [],
585
+ elements = root.getElementsByTagName(tag),
586
+ hasClass = Y.Dom.hasClass;
587
+
588
+ for (var i = 0, len = elements.length; i < len; ++i) {
589
+ if ( hasClass(elements[i], className) ) {
590
+ nodes[nodes.length] = elements[i];
591
+ }
592
+ }
593
+
594
+ if (apply) {
595
+ Y.Dom.batch(nodes, apply, o, overrides);
596
+ }
597
+
598
+ return nodes;
599
+ },
600
+
601
+ /**
602
+ * Determines whether an HTMLElement has the given className.
603
+ * @method hasClass
604
+ * @param {String | HTMLElement | Array} el The element or collection to test
605
+ * @param {String} className the class name to search for
606
+ * @return {Boolean | Array} A boolean value or array of boolean values
607
+ */
608
+ hasClass: function(el, className) {
609
+ return Y.Dom.batch(el, Y.Dom._hasClass, className);
610
+ },
611
+
612
+ _hasClass: function(el, className) {
613
+ var ret = false,
614
+ current;
615
+
616
+ if (el && className) {
617
+ current = Y.Dom._getAttribute(el, CLASS_NAME) || EMPTY;
618
+ if (className.exec) {
619
+ ret = className.test(current);
620
+ } else {
621
+ ret = className && (SPACE + current + SPACE).
622
+ indexOf(SPACE + className + SPACE) > -1;
623
+ }
624
+ } else {
625
+ YAHOO.log('hasClass called with invalid arguments', 'warn', 'Dom');
626
+ }
627
+
628
+ return ret;
629
+ },
630
+
631
+ /**
632
+ * Adds a class name to a given element or collection of elements.
633
+ * @method addClass
634
+ * @param {String | HTMLElement | Array} el The element or collection to add the class to
635
+ * @param {String} className the class name to add to the class attribute
636
+ * @return {Boolean | Array} A pass/fail boolean or array of booleans
637
+ */
638
+ addClass: function(el, className) {
639
+ return Y.Dom.batch(el, Y.Dom._addClass, className);
640
+ },
641
+
642
+ _addClass: function(el, className) {
643
+ var ret = false,
644
+ current;
645
+
646
+ if (el && className) {
647
+ current = Y.Dom._getAttribute(el, CLASS_NAME) || EMPTY;
648
+ if ( !Y.Dom._hasClass(el, className) ) {
649
+ Y.Dom.setAttribute(el, CLASS_NAME, trim(current + SPACE + className));
650
+ ret = true;
651
+ }
652
+ } else {
653
+ YAHOO.log('addClass called with invalid arguments', 'warn', 'Dom');
654
+ }
655
+
656
+ return ret;
657
+ },
658
+
659
+ /**
660
+ * Removes a class name from a given element or collection of elements.
661
+ * @method removeClass
662
+ * @param {String | HTMLElement | Array} el The element or collection to remove the class from
663
+ * @param {String} className the class name to remove from the class attribute
664
+ * @return {Boolean | Array} A pass/fail boolean or array of booleans
665
+ */
666
+ removeClass: function(el, className) {
667
+ return Y.Dom.batch(el, Y.Dom._removeClass, className);
668
+ },
669
+
670
+ _removeClass: function(el, className) {
671
+ var ret = false,
672
+ current,
673
+ newClass,
674
+ attr;
675
+
676
+ if (el && className) {
677
+ current = Y.Dom._getAttribute(el, CLASS_NAME) || EMPTY;
678
+ Y.Dom.setAttribute(el, CLASS_NAME, current.replace(Y.Dom._getClassRegex(className), EMPTY));
679
+
680
+ newClass = Y.Dom._getAttribute(el, CLASS_NAME);
681
+ if (current !== newClass) { // else nothing changed
682
+ Y.Dom.setAttribute(el, CLASS_NAME, trim(newClass)); // trim after comparing to current class
683
+ ret = true;
684
+
685
+ if (Y.Dom._getAttribute(el, CLASS_NAME) === '') { // remove class attribute if empty
686
+ attr = (el.hasAttribute && el.hasAttribute(_CLASS)) ? _CLASS : CLASS_NAME;
687
+ YAHOO.log('removeClass removing empty class attribute', 'info', 'Dom');
688
+ el.removeAttribute(attr);
689
+ }
690
+ }
691
+
692
+ } else {
693
+ YAHOO.log('removeClass called with invalid arguments', 'warn', 'Dom');
694
+ }
695
+
696
+ return ret;
697
+ },
698
+
699
+ /**
700
+ * Replace a class with another class for a given element or collection of elements.
701
+ * If no oldClassName is present, the newClassName is simply added.
702
+ * @method replaceClass
703
+ * @param {String | HTMLElement | Array} el The element or collection to remove the class from
704
+ * @param {String} oldClassName the class name to be replaced
705
+ * @param {String} newClassName the class name that will be replacing the old class name
706
+ * @return {Boolean | Array} A pass/fail boolean or array of booleans
707
+ */
708
+ replaceClass: function(el, oldClassName, newClassName) {
709
+ return Y.Dom.batch(el, Y.Dom._replaceClass, { from: oldClassName, to: newClassName });
710
+ },
711
+
712
+ _replaceClass: function(el, classObj) {
713
+ var className,
714
+ from,
715
+ to,
716
+ ret = false,
717
+ current;
718
+
719
+ if (el && classObj) {
720
+ from = classObj.from;
721
+ to = classObj.to;
722
+
723
+ if (!to) {
724
+ ret = false;
725
+ } else if (!from) { // just add if no "from"
726
+ ret = Y.Dom._addClass(el, classObj.to);
727
+ } else if (from !== to) { // else nothing to replace
728
+ // May need to lead with DBLSPACE?
729
+ current = Y.Dom._getAttribute(el, CLASS_NAME) || EMPTY;
730
+ className = (SPACE + current.replace(Y.Dom._getClassRegex(from), SPACE + to)).
731
+ split(Y.Dom._getClassRegex(to));
732
+
733
+ // insert to into what would have been the first occurrence slot
734
+ className.splice(1, 0, SPACE + to);
735
+ Y.Dom.setAttribute(el, CLASS_NAME, trim(className.join(EMPTY)));
736
+ ret = true;
737
+ }
738
+ } else {
739
+ YAHOO.log('replaceClass called with invalid arguments', 'warn', 'Dom');
740
+ }
741
+
742
+ return ret;
743
+ },
744
+
745
+ /**
746
+ * Returns an ID and applies it to the element "el", if provided.
747
+ * @method generateId
748
+ * @param {String | HTMLElement | Array} el (optional) An optional element array of elements to add an ID to (no ID is added if one is already present).
749
+ * @param {String} prefix (optional) an optional prefix to use (defaults to "yui-gen").
750
+ * @return {String | Array} The generated ID, or array of generated IDs (or original ID if already present on an element)
751
+ */
752
+ generateId: function(el, prefix) {
753
+ prefix = prefix || 'yui-gen';
754
+
755
+ var f = function(el) {
756
+ if (el && el.id) { // do not override existing ID
757
+ YAHOO.log('generateId returning existing id ' + el.id, 'info', 'Dom');
758
+ return el.id;
759
+ }
760
+
761
+ var id = prefix + YAHOO.env._id_counter++;
762
+ YAHOO.log('generateId generating ' + id, 'info', 'Dom');
763
+
764
+ if (el) {
765
+ if (el[OWNER_DOCUMENT] && el[OWNER_DOCUMENT].getElementById(id)) { // in case one already exists
766
+ // use failed id plus prefix to help ensure uniqueness
767
+ return Y.Dom.generateId(el, id + prefix);
768
+ }
769
+ el.id = id;
770
+ }
771
+
772
+ return id;
773
+ };
774
+
775
+ // batch fails when no element, so just generate and return single ID
776
+ return Y.Dom.batch(el, f, Y.Dom, true) || f.apply(Y.Dom, arguments);
777
+ },
778
+
779
+ /**
780
+ * Determines whether an HTMLElement is an ancestor of another HTML element in the DOM hierarchy.
781
+ * @method isAncestor
782
+ * @param {String | HTMLElement} haystack The possible ancestor
783
+ * @param {String | HTMLElement} needle The possible descendent
784
+ * @return {Boolean} Whether or not the haystack is an ancestor of needle
785
+ */
786
+ isAncestor: function(haystack, needle) {
787
+ haystack = Y.Dom.get(haystack);
788
+ needle = Y.Dom.get(needle);
789
+
790
+ var ret = false;
791
+
792
+ if ( (haystack && needle) && (haystack[NODE_TYPE] && needle[NODE_TYPE]) ) {
793
+ if (haystack.contains && haystack !== needle) { // contains returns true when equal
794
+ ret = haystack.contains(needle);
795
+ }
796
+ else if (haystack.compareDocumentPosition) { // gecko
797
+ ret = !!(haystack.compareDocumentPosition(needle) & 16);
798
+ }
799
+ } else {
800
+ YAHOO.log('isAncestor failed; invalid input: ' + haystack + ',' + needle, 'error', 'Dom');
801
+ }
802
+ YAHOO.log('isAncestor(' + haystack + ',' + needle + ' returning ' + ret, 'info', 'Dom');
803
+ return ret;
804
+ },
805
+
806
+ /**
807
+ * Determines whether an HTMLElement is present in the current document.
808
+ * @method inDocument
809
+ * @param {String | HTMLElement} el The element to search for
810
+ * @param {Object} doc An optional document to search, defaults to element's owner document
811
+ * @return {Boolean} Whether or not the element is present in the current document
812
+ */
813
+ inDocument: function(el, doc) {
814
+ return Y.Dom._inDoc(Y.Dom.get(el), doc);
815
+ },
816
+
817
+ _inDoc: function(el, doc) {
818
+ var ret = false;
819
+ if (el && el[TAG_NAME]) {
820
+ doc = doc || el[OWNER_DOCUMENT];
821
+ ret = Y.Dom.isAncestor(doc[DOCUMENT_ELEMENT], el);
822
+ } else {
823
+ YAHOO.log('inDocument failed: invalid input', 'error', 'Dom');
824
+ }
825
+ return ret;
826
+ },
827
+
828
+ /**
829
+ * Returns an array of HTMLElements that pass the test applied by supplied boolean method.
830
+ * For optimized performance, include a tag and/or root node when possible.
831
+ * Note: This method operates against a live collection, so modifying the
832
+ * collection in the callback (removing/appending nodes, etc.) will have
833
+ * side effects. Instead you should iterate the returned nodes array,
834
+ * as you would with the native "getElementsByTagName" method.
835
+ * @method getElementsBy
836
+ * @param {Function} method - A boolean method for testing elements which receives the element as its only argument.
837
+ * @param {String} tag (optional) The tag name of the elements being collected
838
+ * @param {String | HTMLElement} root (optional) The HTMLElement or an ID to use as the starting point
839
+ * @param {Function} apply (optional) A function to apply to each element when found
840
+ * @param {Any} o (optional) An optional arg that is passed to the supplied method
841
+ * @param {Boolean} overrides (optional) Whether or not to override the scope of "method" with "o"
842
+ * @return {Array} Array of HTMLElements
843
+ */
844
+ getElementsBy: function(method, tag, root, apply, o, overrides, firstOnly) {
845
+ tag = tag || '*';
846
+ root = (root) ? Y.Dom.get(root) : null || document;
847
+
848
+ if (!root) {
849
+ return [];
850
+ }
851
+
852
+ var nodes = [],
853
+ elements = root.getElementsByTagName(tag);
854
+
855
+ for (var i = 0, len = elements.length; i < len; ++i) {
856
+ if ( method(elements[i]) ) {
857
+ if (firstOnly) {
858
+ nodes = elements[i];
859
+ break;
860
+ } else {
861
+ nodes[nodes.length] = elements[i];
862
+ }
863
+ }
864
+ }
865
+
866
+ if (apply) {
867
+ Y.Dom.batch(nodes, apply, o, overrides);
868
+ }
869
+
870
+ YAHOO.log('getElementsBy returning ' + nodes, 'info', 'Dom');
871
+
872
+ return nodes;
873
+ },
874
+
875
+ /**
876
+ * Returns the first HTMLElement that passes the test applied by the supplied boolean method.
877
+ * @method getElementBy
878
+ * @param {Function} method - A boolean method for testing elements which receives the element as its only argument.
879
+ * @param {String} tag (optional) The tag name of the elements being collected
880
+ * @param {String | HTMLElement} root (optional) The HTMLElement or an ID to use as the starting point
881
+ * @return {HTMLElement}
882
+ */
883
+ getElementBy: function(method, tag, root) {
884
+ return Y.Dom.getElementsBy(method, tag, root, null, null, null, true);
885
+ },
886
+
887
+ /**
888
+ * Runs the supplied method against each item in the Collection/Array.
889
+ * The method is called with the element(s) as the first arg, and the optional param as the second ( method(el, o) ).
890
+ * @method batch
891
+ * @param {String | HTMLElement | Array} el (optional) An element or array of elements to apply the method to
892
+ * @param {Function} method The method to apply to the element(s)
893
+ * @param {Any} o (optional) An optional arg that is passed to the supplied method
894
+ * @param {Boolean} overrides (optional) Whether or not to override the scope of "method" with "o"
895
+ * @return {Any | Array} The return value(s) from the supplied method
896
+ */
897
+ batch: function(el, method, o, overrides) {
898
+ var collection = [],
899
+ scope = (overrides) ? o : window;
900
+
901
+ el = (el && (el[TAG_NAME] || el.item)) ? el : Y.Dom.get(el); // skip get() when possible
902
+ if (el && method) {
903
+ if (el[TAG_NAME] || el.length === undefined) { // element or not array-like
904
+ return method.call(scope, el, o);
905
+ }
906
+
907
+ for (var i = 0; i < el.length; ++i) {
908
+ collection[collection.length] = method.call(scope, el[i], o);
909
+ }
910
+ } else {
911
+ YAHOO.log('batch called with invalid arguments', 'warn', 'Dom');
912
+ return false;
913
+ }
914
+ return collection;
915
+ },
916
+
917
+ /**
918
+ * Returns the height of the document.
919
+ * @method getDocumentHeight
920
+ * @return {Int} The height of the actual document (which includes the body and its margin).
921
+ */
922
+ getDocumentHeight: function() {
923
+ var scrollHeight = (document[COMPAT_MODE] != CSS1_COMPAT || isSafari) ? document.body.scrollHeight : documentElement.scrollHeight,
924
+ h = Math.max(scrollHeight, Y.Dom.getViewportHeight());
925
+
926
+ YAHOO.log('getDocumentHeight returning ' + h, 'info', 'Dom');
927
+ return h;
928
+ },
929
+
930
+ /**
931
+ * Returns the width of the document.
932
+ * @method getDocumentWidth
933
+ * @return {Int} The width of the actual document (which includes the body and its margin).
934
+ */
935
+ getDocumentWidth: function() {
936
+ var scrollWidth = (document[COMPAT_MODE] != CSS1_COMPAT || isSafari) ? document.body.scrollWidth : documentElement.scrollWidth,
937
+ w = Math.max(scrollWidth, Y.Dom.getViewportWidth());
938
+ YAHOO.log('getDocumentWidth returning ' + w, 'info', 'Dom');
939
+ return w;
940
+ },
941
+
942
+ /**
943
+ * Returns the current height of the viewport.
944
+ * @method getViewportHeight
945
+ * @return {Int} The height of the viewable area of the page (excludes scrollbars).
946
+ */
947
+ getViewportHeight: function() {
948
+ var height = self.innerHeight, // Safari, Opera
949
+ mode = document[COMPAT_MODE];
950
+
951
+ if ( (mode || isIE) && !isOpera ) { // IE, Gecko
952
+ height = (mode == CSS1_COMPAT) ?
953
+ documentElement.clientHeight : // Standards
954
+ document.body.clientHeight; // Quirks
955
+ }
956
+
957
+ YAHOO.log('getViewportHeight returning ' + height, 'info', 'Dom');
958
+ return height;
959
+ },
960
+
961
+ /**
962
+ * Returns the current width of the viewport.
963
+ * @method getViewportWidth
964
+ * @return {Int} The width of the viewable area of the page (excludes scrollbars).
965
+ */
966
+
967
+ getViewportWidth: function() {
968
+ var width = self.innerWidth, // Safari
969
+ mode = document[COMPAT_MODE];
970
+
971
+ if (mode || isIE) { // IE, Gecko, Opera
972
+ width = (mode == CSS1_COMPAT) ?
973
+ documentElement.clientWidth : // Standards
974
+ document.body.clientWidth; // Quirks
975
+ }
976
+ YAHOO.log('getViewportWidth returning ' + width, 'info', 'Dom');
977
+ return width;
978
+ },
979
+
980
+ /**
981
+ * Returns the nearest ancestor that passes the test applied by supplied boolean method.
982
+ * For performance reasons, IDs are not accepted and argument validation omitted.
983
+ * @method getAncestorBy
984
+ * @param {HTMLElement} node The HTMLElement to use as the starting point
985
+ * @param {Function} method - A boolean method for testing elements which receives the element as its only argument.
986
+ * @return {Object} HTMLElement or null if not found
987
+ */
988
+ getAncestorBy: function(node, method) {
989
+ while ( (node = node[PARENT_NODE]) ) { // NOTE: assignment
990
+ if ( Y.Dom._testElement(node, method) ) {
991
+ YAHOO.log('getAncestorBy returning ' + node, 'info', 'Dom');
992
+ return node;
993
+ }
994
+ }
995
+
996
+ YAHOO.log('getAncestorBy returning null (no ancestor passed test)', 'error', 'Dom');
997
+ return null;
998
+ },
999
+
1000
+ /**
1001
+ * Returns the nearest ancestor with the given className.
1002
+ * @method getAncestorByClassName
1003
+ * @param {String | HTMLElement} node The HTMLElement or an ID to use as the starting point
1004
+ * @param {String} className
1005
+ * @return {Object} HTMLElement
1006
+ */
1007
+ getAncestorByClassName: function(node, className) {
1008
+ node = Y.Dom.get(node);
1009
+ if (!node) {
1010
+ YAHOO.log('getAncestorByClassName failed: invalid node argument', 'error', 'Dom');
1011
+ return null;
1012
+ }
1013
+ var method = function(el) { return Y.Dom.hasClass(el, className); };
1014
+ return Y.Dom.getAncestorBy(node, method);
1015
+ },
1016
+
1017
+ /**
1018
+ * Returns the nearest ancestor with the given tagName.
1019
+ * @method getAncestorByTagName
1020
+ * @param {String | HTMLElement} node The HTMLElement or an ID to use as the starting point
1021
+ * @param {String} tagName
1022
+ * @return {Object} HTMLElement
1023
+ */
1024
+ getAncestorByTagName: function(node, tagName) {
1025
+ node = Y.Dom.get(node);
1026
+ if (!node) {
1027
+ YAHOO.log('getAncestorByTagName failed: invalid node argument', 'error', 'Dom');
1028
+ return null;
1029
+ }
1030
+ var method = function(el) {
1031
+ return el[TAG_NAME] && el[TAG_NAME].toUpperCase() == tagName.toUpperCase();
1032
+ };
1033
+
1034
+ return Y.Dom.getAncestorBy(node, method);
1035
+ },
1036
+
1037
+ /**
1038
+ * Returns the previous sibling that is an HTMLElement.
1039
+ * For performance reasons, IDs are not accepted and argument validation omitted.
1040
+ * Returns the nearest HTMLElement sibling if no method provided.
1041
+ * @method getPreviousSiblingBy
1042
+ * @param {HTMLElement} node The HTMLElement to use as the starting point
1043
+ * @param {Function} method A boolean function used to test siblings
1044
+ * that receives the sibling node being tested as its only argument
1045
+ * @return {Object} HTMLElement or null if not found
1046
+ */
1047
+ getPreviousSiblingBy: function(node, method) {
1048
+ while (node) {
1049
+ node = node.previousSibling;
1050
+ if ( Y.Dom._testElement(node, method) ) {
1051
+ return node;
1052
+ }
1053
+ }
1054
+ return null;
1055
+ },
1056
+
1057
+ /**
1058
+ * Returns the previous sibling that is an HTMLElement
1059
+ * @method getPreviousSibling
1060
+ * @param {String | HTMLElement} node The HTMLElement or an ID to use as the starting point
1061
+ * @return {Object} HTMLElement or null if not found
1062
+ */
1063
+ getPreviousSibling: function(node) {
1064
+ node = Y.Dom.get(node);
1065
+ if (!node) {
1066
+ YAHOO.log('getPreviousSibling failed: invalid node argument', 'error', 'Dom');
1067
+ return null;
1068
+ }
1069
+
1070
+ return Y.Dom.getPreviousSiblingBy(node);
1071
+ },
1072
+
1073
+ /**
1074
+ * Returns the next HTMLElement sibling that passes the boolean method.
1075
+ * For performance reasons, IDs are not accepted and argument validation omitted.
1076
+ * Returns the nearest HTMLElement sibling if no method provided.
1077
+ * @method getNextSiblingBy
1078
+ * @param {HTMLElement} node The HTMLElement to use as the starting point
1079
+ * @param {Function} method A boolean function used to test siblings
1080
+ * that receives the sibling node being tested as its only argument
1081
+ * @return {Object} HTMLElement or null if not found
1082
+ */
1083
+ getNextSiblingBy: function(node, method) {
1084
+ while (node) {
1085
+ node = node.nextSibling;
1086
+ if ( Y.Dom._testElement(node, method) ) {
1087
+ return node;
1088
+ }
1089
+ }
1090
+ return null;
1091
+ },
1092
+
1093
+ /**
1094
+ * Returns the next sibling that is an HTMLElement
1095
+ * @method getNextSibling
1096
+ * @param {String | HTMLElement} node The HTMLElement or an ID to use as the starting point
1097
+ * @return {Object} HTMLElement or null if not found
1098
+ */
1099
+ getNextSibling: function(node) {
1100
+ node = Y.Dom.get(node);
1101
+ if (!node) {
1102
+ YAHOO.log('getNextSibling failed: invalid node argument', 'error', 'Dom');
1103
+ return null;
1104
+ }
1105
+
1106
+ return Y.Dom.getNextSiblingBy(node);
1107
+ },
1108
+
1109
+ /**
1110
+ * Returns the first HTMLElement child that passes the test method.
1111
+ * @method getFirstChildBy
1112
+ * @param {HTMLElement} node The HTMLElement to use as the starting point
1113
+ * @param {Function} method A boolean function used to test children
1114
+ * that receives the node being tested as its only argument
1115
+ * @return {Object} HTMLElement or null if not found
1116
+ */
1117
+ getFirstChildBy: function(node, method) {
1118
+ var child = ( Y.Dom._testElement(node.firstChild, method) ) ? node.firstChild : null;
1119
+ return child || Y.Dom.getNextSiblingBy(node.firstChild, method);
1120
+ },
1121
+
1122
+ /**
1123
+ * Returns the first HTMLElement child.
1124
+ * @method getFirstChild
1125
+ * @param {String | HTMLElement} node The HTMLElement or an ID to use as the starting point
1126
+ * @return {Object} HTMLElement or null if not found
1127
+ */
1128
+ getFirstChild: function(node, method) {
1129
+ node = Y.Dom.get(node);
1130
+ if (!node) {
1131
+ YAHOO.log('getFirstChild failed: invalid node argument', 'error', 'Dom');
1132
+ return null;
1133
+ }
1134
+ return Y.Dom.getFirstChildBy(node);
1135
+ },
1136
+
1137
+ /**
1138
+ * Returns the last HTMLElement child that passes the test method.
1139
+ * @method getLastChildBy
1140
+ * @param {HTMLElement} node The HTMLElement to use as the starting point
1141
+ * @param {Function} method A boolean function used to test children
1142
+ * that receives the node being tested as its only argument
1143
+ * @return {Object} HTMLElement or null if not found
1144
+ */
1145
+ getLastChildBy: function(node, method) {
1146
+ if (!node) {
1147
+ YAHOO.log('getLastChild failed: invalid node argument', 'error', 'Dom');
1148
+ return null;
1149
+ }
1150
+ var child = ( Y.Dom._testElement(node.lastChild, method) ) ? node.lastChild : null;
1151
+ return child || Y.Dom.getPreviousSiblingBy(node.lastChild, method);
1152
+ },
1153
+
1154
+ /**
1155
+ * Returns the last HTMLElement child.
1156
+ * @method getLastChild
1157
+ * @param {String | HTMLElement} node The HTMLElement or an ID to use as the starting point
1158
+ * @return {Object} HTMLElement or null if not found
1159
+ */
1160
+ getLastChild: function(node) {
1161
+ node = Y.Dom.get(node);
1162
+ return Y.Dom.getLastChildBy(node);
1163
+ },
1164
+
1165
+ /**
1166
+ * Returns an array of HTMLElement childNodes that pass the test method.
1167
+ * @method getChildrenBy
1168
+ * @param {HTMLElement} node The HTMLElement to start from
1169
+ * @param {Function} method A boolean function used to test children
1170
+ * that receives the node being tested as its only argument
1171
+ * @return {Array} A static array of HTMLElements
1172
+ */
1173
+ getChildrenBy: function(node, method) {
1174
+ var child = Y.Dom.getFirstChildBy(node, method),
1175
+ children = child ? [child] : [];
1176
+
1177
+ Y.Dom.getNextSiblingBy(child, function(node) {
1178
+ if ( !method || method(node) ) {
1179
+ children[children.length] = node;
1180
+ }
1181
+ return false; // fail test to collect all children
1182
+ });
1183
+
1184
+ return children;
1185
+ },
1186
+
1187
+ /**
1188
+ * Returns an array of HTMLElement childNodes.
1189
+ * @method getChildren
1190
+ * @param {String | HTMLElement} node The HTMLElement or an ID to use as the starting point
1191
+ * @return {Array} A static array of HTMLElements
1192
+ */
1193
+ getChildren: function(node) {
1194
+ node = Y.Dom.get(node);
1195
+ if (!node) {
1196
+ YAHOO.log('getChildren failed: invalid node argument', 'error', 'Dom');
1197
+ }
1198
+
1199
+ return Y.Dom.getChildrenBy(node);
1200
+ },
1201
+
1202
+ /**
1203
+ * Returns the left scroll value of the document
1204
+ * @method getDocumentScrollLeft
1205
+ * @param {HTMLDocument} document (optional) The document to get the scroll value of
1206
+ * @return {Int} The amount that the document is scrolled to the left
1207
+ */
1208
+ getDocumentScrollLeft: function(doc) {
1209
+ doc = doc || document;
1210
+ return Math.max(doc[DOCUMENT_ELEMENT].scrollLeft, doc.body.scrollLeft);
1211
+ },
1212
+
1213
+ /**
1214
+ * Returns the top scroll value of the document
1215
+ * @method getDocumentScrollTop
1216
+ * @param {HTMLDocument} document (optional) The document to get the scroll value of
1217
+ * @return {Int} The amount that the document is scrolled to the top
1218
+ */
1219
+ getDocumentScrollTop: function(doc) {
1220
+ doc = doc || document;
1221
+ return Math.max(doc[DOCUMENT_ELEMENT].scrollTop, doc.body.scrollTop);
1222
+ },
1223
+
1224
+ /**
1225
+ * Inserts the new node as the previous sibling of the reference node
1226
+ * @method insertBefore
1227
+ * @param {String | HTMLElement} newNode The node to be inserted
1228
+ * @param {String | HTMLElement} referenceNode The node to insert the new node before
1229
+ * @return {HTMLElement} The node that was inserted (or null if insert fails)
1230
+ */
1231
+ insertBefore: function(newNode, referenceNode) {
1232
+ newNode = Y.Dom.get(newNode);
1233
+ referenceNode = Y.Dom.get(referenceNode);
1234
+
1235
+ if (!newNode || !referenceNode || !referenceNode[PARENT_NODE]) {
1236
+ YAHOO.log('insertAfter failed: missing or invalid arg(s)', 'error', 'Dom');
1237
+ return null;
1238
+ }
1239
+
1240
+ return referenceNode[PARENT_NODE].insertBefore(newNode, referenceNode);
1241
+ },
1242
+
1243
+ /**
1244
+ * Inserts the new node as the next sibling of the reference node
1245
+ * @method insertAfter
1246
+ * @param {String | HTMLElement} newNode The node to be inserted
1247
+ * @param {String | HTMLElement} referenceNode The node to insert the new node after
1248
+ * @return {HTMLElement} The node that was inserted (or null if insert fails)
1249
+ */
1250
+ insertAfter: function(newNode, referenceNode) {
1251
+ newNode = Y.Dom.get(newNode);
1252
+ referenceNode = Y.Dom.get(referenceNode);
1253
+
1254
+ if (!newNode || !referenceNode || !referenceNode[PARENT_NODE]) {
1255
+ YAHOO.log('insertAfter failed: missing or invalid arg(s)', 'error', 'Dom');
1256
+ return null;
1257
+ }
1258
+
1259
+ if (referenceNode.nextSibling) {
1260
+ return referenceNode[PARENT_NODE].insertBefore(newNode, referenceNode.nextSibling);
1261
+ } else {
1262
+ return referenceNode[PARENT_NODE].appendChild(newNode);
1263
+ }
1264
+ },
1265
+
1266
+ /**
1267
+ * Creates a Region based on the viewport relative to the document.
1268
+ * @method getClientRegion
1269
+ * @return {Region} A Region object representing the viewport which accounts for document scroll
1270
+ */
1271
+ getClientRegion: function() {
1272
+ var t = Y.Dom.getDocumentScrollTop(),
1273
+ l = Y.Dom.getDocumentScrollLeft(),
1274
+ r = Y.Dom.getViewportWidth() + l,
1275
+ b = Y.Dom.getViewportHeight() + t;
1276
+
1277
+ return new Y.Region(t, r, b, l);
1278
+ },
1279
+
1280
+ /**
1281
+ * Provides a normalized attribute interface.
1282
+ * @method setAttribute
1283
+ * @param {String | HTMLElement} el The target element for the attribute.
1284
+ * @param {String} attr The attribute to set.
1285
+ * @param {String} val The value of the attribute.
1286
+ */
1287
+ setAttribute: function(el, attr, val) {
1288
+ Y.Dom.batch(el, Y.Dom._setAttribute, { attr: attr, val: val });
1289
+ },
1290
+
1291
+ _setAttribute: function(el, args) {
1292
+ var attr = Y.Dom._toCamel(args.attr),
1293
+ val = args.val;
1294
+
1295
+ if (el && el.setAttribute) {
1296
+ if (Y.Dom.DOT_ATTRIBUTES[attr]) {
1297
+ el[attr] = val;
1298
+ } else {
1299
+ attr = Y.Dom.CUSTOM_ATTRIBUTES[attr] || attr;
1300
+ el.setAttribute(attr, val);
1301
+ }
1302
+ } else {
1303
+ YAHOO.log('setAttribute method not available for ' + el, 'error', 'Dom');
1304
+ }
1305
+ },
1306
+
1307
+ /**
1308
+ * Provides a normalized attribute interface.
1309
+ * @method getAttribute
1310
+ * @param {String | HTMLElement} el The target element for the attribute.
1311
+ * @param {String} attr The attribute to get.
1312
+ * @return {String} The current value of the attribute.
1313
+ */
1314
+ getAttribute: function(el, attr) {
1315
+ return Y.Dom.batch(el, Y.Dom._getAttribute, attr);
1316
+ },
1317
+
1318
+
1319
+ _getAttribute: function(el, attr) {
1320
+ var val;
1321
+ attr = Y.Dom.CUSTOM_ATTRIBUTES[attr] || attr;
1322
+
1323
+ if (el && el.getAttribute) {
1324
+ val = el.getAttribute(attr, 2);
1325
+ } else {
1326
+ YAHOO.log('getAttribute method not available for ' + el, 'error', 'Dom');
1327
+ }
1328
+
1329
+ return val;
1330
+ },
1331
+
1332
+ _toCamel: function(property) {
1333
+ var c = propertyCache;
1334
+
1335
+ function tU(x,l) {
1336
+ return l.toUpperCase();
1337
+ }
1338
+
1339
+ return c[property] || (c[property] = property.indexOf('-') === -1 ?
1340
+ property :
1341
+ property.replace( /-([a-z])/gi, tU ));
1342
+ },
1343
+
1344
+ _getClassRegex: function(className) {
1345
+ var re;
1346
+ if (className !== undefined) { // allow empty string to pass
1347
+ if (className.exec) { // already a RegExp
1348
+ re = className;
1349
+ } else {
1350
+ re = reCache[className];
1351
+ if (!re) {
1352
+ // escape special chars (".", "[", etc.)
1353
+ className = className.replace(Y.Dom._patterns.CLASS_RE_TOKENS, '\\$1');
1354
+ re = reCache[className] = new RegExp(C_START + className + C_END, G);
1355
+ }
1356
+ }
1357
+ }
1358
+ return re;
1359
+ },
1360
+
1361
+ _patterns: {
1362
+ ROOT_TAG: /^body|html$/i, // body for quirks mode, html for standards,
1363
+ CLASS_RE_TOKENS: /([\.\(\)\^\$\*\+\?\|\[\]\{\}\\])/g
1364
+ },
1365
+
1366
+
1367
+ _testElement: function(node, method) {
1368
+ return node && node[NODE_TYPE] == 1 && ( !method || method(node) );
1369
+ },
1370
+
1371
+ _calcBorders: function(node, xy2) {
1372
+ var t = parseInt(Y.Dom[GET_COMPUTED_STYLE](node, BORDER_TOP_WIDTH), 10) || 0,
1373
+ l = parseInt(Y.Dom[GET_COMPUTED_STYLE](node, BORDER_LEFT_WIDTH), 10) || 0;
1374
+ if (isGecko) {
1375
+ if (RE_TABLE.test(node[TAG_NAME])) {
1376
+ t = 0;
1377
+ l = 0;
1378
+ }
1379
+ }
1380
+ xy2[0] += l;
1381
+ xy2[1] += t;
1382
+ return xy2;
1383
+ }
1384
+ };
1385
+
1386
+ var _getComputedStyle = Y.Dom[GET_COMPUTED_STYLE];
1387
+ // fix opera computedStyle default color unit (convert to rgb)
1388
+ if (UA.opera) {
1389
+ Y.Dom[GET_COMPUTED_STYLE] = function(node, att) {
1390
+ var val = _getComputedStyle(node, att);
1391
+ if (RE_COLOR.test(att)) {
1392
+ val = Y.Dom.Color.toRGB(val);
1393
+ }
1394
+
1395
+ return val;
1396
+ };
1397
+
1398
+ }
1399
+
1400
+ // safari converts transparent to rgba(), others use "transparent"
1401
+ if (UA.webkit) {
1402
+ Y.Dom[GET_COMPUTED_STYLE] = function(node, att) {
1403
+ var val = _getComputedStyle(node, att);
1404
+
1405
+ if (val === 'rgba(0, 0, 0, 0)') {
1406
+ val = 'transparent';
1407
+ }
1408
+
1409
+ return val;
1410
+ };
1411
+
1412
+ }
1413
+
1414
+ if (UA.ie && UA.ie >= 8 && document.documentElement.hasAttribute) { // IE 8 standards
1415
+ Y.Dom.DOT_ATTRIBUTES.type = true; // IE 8 errors on input.setAttribute('type')
1416
+ }
1417
+ })();
1418
+ /**
1419
+ * A region is a representation of an object on a grid. It is defined
1420
+ * by the top, right, bottom, left extents, so is rectangular by default. If
1421
+ * other shapes are required, this class could be extended to support it.
1422
+ * @namespace YAHOO.util
1423
+ * @class Region
1424
+ * @param {Int} t the top extent
1425
+ * @param {Int} r the right extent
1426
+ * @param {Int} b the bottom extent
1427
+ * @param {Int} l the left extent
1428
+ * @constructor
1429
+ */
1430
+ YAHOO.util.Region = function(t, r, b, l) {
1431
+
1432
+ /**
1433
+ * The region's top extent
1434
+ * @property top
1435
+ * @type Int
1436
+ */
1437
+ this.top = t;
1438
+
1439
+ /**
1440
+ * The region's top extent
1441
+ * @property y
1442
+ * @type Int
1443
+ */
1444
+ this.y = t;
1445
+
1446
+ /**
1447
+ * The region's top extent as index, for symmetry with set/getXY
1448
+ * @property 1
1449
+ * @type Int
1450
+ */
1451
+ this[1] = t;
1452
+
1453
+ /**
1454
+ * The region's right extent
1455
+ * @property right
1456
+ * @type int
1457
+ */
1458
+ this.right = r;
1459
+
1460
+ /**
1461
+ * The region's bottom extent
1462
+ * @property bottom
1463
+ * @type Int
1464
+ */
1465
+ this.bottom = b;
1466
+
1467
+ /**
1468
+ * The region's left extent
1469
+ * @property left
1470
+ * @type Int
1471
+ */
1472
+ this.left = l;
1473
+
1474
+ /**
1475
+ * The region's left extent
1476
+ * @property x
1477
+ * @type Int
1478
+ */
1479
+ this.x = l;
1480
+
1481
+ /**
1482
+ * The region's left extent as index, for symmetry with set/getXY
1483
+ * @property 0
1484
+ * @type Int
1485
+ */
1486
+ this[0] = l;
1487
+
1488
+ /**
1489
+ * The region's total width
1490
+ * @property width
1491
+ * @type Int
1492
+ */
1493
+ this.width = this.right - this.left;
1494
+
1495
+ /**
1496
+ * The region's total height
1497
+ * @property height
1498
+ * @type Int
1499
+ */
1500
+ this.height = this.bottom - this.top;
1501
+ };
1502
+
1503
+ /**
1504
+ * Returns true if this region contains the region passed in
1505
+ * @method contains
1506
+ * @param {Region} region The region to evaluate
1507
+ * @return {Boolean} True if the region is contained with this region,
1508
+ * else false
1509
+ */
1510
+ YAHOO.util.Region.prototype.contains = function(region) {
1511
+ return ( region.left >= this.left &&
1512
+ region.right <= this.right &&
1513
+ region.top >= this.top &&
1514
+ region.bottom <= this.bottom );
1515
+
1516
+ // this.logger.debug("does " + this + " contain " + region + " ... " + ret);
1517
+ };
1518
+
1519
+ /**
1520
+ * Returns the area of the region
1521
+ * @method getArea
1522
+ * @return {Int} the region's area
1523
+ */
1524
+ YAHOO.util.Region.prototype.getArea = function() {
1525
+ return ( (this.bottom - this.top) * (this.right - this.left) );
1526
+ };
1527
+
1528
+ /**
1529
+ * Returns the region where the passed in region overlaps with this one
1530
+ * @method intersect
1531
+ * @param {Region} region The region that intersects
1532
+ * @return {Region} The overlap region, or null if there is no overlap
1533
+ */
1534
+ YAHOO.util.Region.prototype.intersect = function(region) {
1535
+ var t = Math.max( this.top, region.top ),
1536
+ r = Math.min( this.right, region.right ),
1537
+ b = Math.min( this.bottom, region.bottom ),
1538
+ l = Math.max( this.left, region.left );
1539
+
1540
+ if (b >= t && r >= l) {
1541
+ return new YAHOO.util.Region(t, r, b, l);
1542
+ } else {
1543
+ return null;
1544
+ }
1545
+ };
1546
+
1547
+ /**
1548
+ * Returns the region representing the smallest region that can contain both
1549
+ * the passed in region and this region.
1550
+ * @method union
1551
+ * @param {Region} region The region that to create the union with
1552
+ * @return {Region} The union region
1553
+ */
1554
+ YAHOO.util.Region.prototype.union = function(region) {
1555
+ var t = Math.min( this.top, region.top ),
1556
+ r = Math.max( this.right, region.right ),
1557
+ b = Math.max( this.bottom, region.bottom ),
1558
+ l = Math.min( this.left, region.left );
1559
+
1560
+ return new YAHOO.util.Region(t, r, b, l);
1561
+ };
1562
+
1563
+ /**
1564
+ * toString
1565
+ * @method toString
1566
+ * @return string the region properties
1567
+ */
1568
+ YAHOO.util.Region.prototype.toString = function() {
1569
+ return ( "Region {" +
1570
+ "top: " + this.top +
1571
+ ", right: " + this.right +
1572
+ ", bottom: " + this.bottom +
1573
+ ", left: " + this.left +
1574
+ ", height: " + this.height +
1575
+ ", width: " + this.width +
1576
+ "}" );
1577
+ };
1578
+
1579
+ /**
1580
+ * Returns a region that is occupied by the DOM element
1581
+ * @method getRegion
1582
+ * @param {HTMLElement} el The element
1583
+ * @return {Region} The region that the element occupies
1584
+ * @static
1585
+ */
1586
+ YAHOO.util.Region.getRegion = function(el) {
1587
+ var p = YAHOO.util.Dom.getXY(el),
1588
+ t = p[1],
1589
+ r = p[0] + el.offsetWidth,
1590
+ b = p[1] + el.offsetHeight,
1591
+ l = p[0];
1592
+
1593
+ return new YAHOO.util.Region(t, r, b, l);
1594
+ };
1595
+
1596
+ /////////////////////////////////////////////////////////////////////////////
1597
+
1598
+
1599
+ /**
1600
+ * A point is a region that is special in that it represents a single point on
1601
+ * the grid.
1602
+ * @namespace YAHOO.util
1603
+ * @class Point
1604
+ * @param {Int} x The X position of the point
1605
+ * @param {Int} y The Y position of the point
1606
+ * @constructor
1607
+ * @extends YAHOO.util.Region
1608
+ */
1609
+ YAHOO.util.Point = function(x, y) {
1610
+ if (YAHOO.lang.isArray(x)) { // accept input from Dom.getXY, Event.getXY, etc.
1611
+ y = x[1]; // dont blow away x yet
1612
+ x = x[0];
1613
+ }
1614
+
1615
+ YAHOO.util.Point.superclass.constructor.call(this, y, x, y, x);
1616
+ };
1617
+
1618
+ YAHOO.extend(YAHOO.util.Point, YAHOO.util.Region);
1619
+
1620
+ (function() {
1621
+ /**
1622
+ * Add style management functionality to DOM.
1623
+ * @module dom
1624
+ * @for Dom
1625
+ */
1626
+
1627
+ var Y = YAHOO.util,
1628
+ CLIENT_TOP = 'clientTop',
1629
+ CLIENT_LEFT = 'clientLeft',
1630
+ PARENT_NODE = 'parentNode',
1631
+ RIGHT = 'right',
1632
+ HAS_LAYOUT = 'hasLayout',
1633
+ PX = 'px',
1634
+ OPACITY = 'opacity',
1635
+ AUTO = 'auto',
1636
+ BORDER_LEFT_WIDTH = 'borderLeftWidth',
1637
+ BORDER_TOP_WIDTH = 'borderTopWidth',
1638
+ BORDER_RIGHT_WIDTH = 'borderRightWidth',
1639
+ BORDER_BOTTOM_WIDTH = 'borderBottomWidth',
1640
+ VISIBLE = 'visible',
1641
+ TRANSPARENT = 'transparent',
1642
+ HEIGHT = 'height',
1643
+ WIDTH = 'width',
1644
+ STYLE = 'style',
1645
+ CURRENT_STYLE = 'currentStyle',
1646
+
1647
+ // IE getComputedStyle
1648
+ // TODO: unit-less lineHeight (e.g. 1.22)
1649
+ re_size = /^width|height$/,
1650
+ re_unit = /^(\d[.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz|%){1}?/i,
1651
+
1652
+ ComputedStyle = {
1653
+ get: function(el, property) {
1654
+ var value = '',
1655
+ current = el[CURRENT_STYLE][property];
1656
+
1657
+ if (property === OPACITY) {
1658
+ value = Y.Dom.getStyle(el, OPACITY);
1659
+ } else if (!current || (current.indexOf && current.indexOf(PX) > -1)) { // no need to convert
1660
+ value = current;
1661
+ } else if (Y.Dom.IE_COMPUTED[property]) { // use compute function
1662
+ value = Y.Dom.IE_COMPUTED[property](el, property);
1663
+ } else if (re_unit.test(current)) { // convert to pixel
1664
+ value = Y.Dom.IE.ComputedStyle.getPixel(el, property);
1665
+ } else {
1666
+ value = current;
1667
+ }
1668
+
1669
+ return value;
1670
+ },
1671
+
1672
+ getOffset: function(el, prop) {
1673
+ var current = el[CURRENT_STYLE][prop], // value of "width", "top", etc.
1674
+ capped = prop.charAt(0).toUpperCase() + prop.substr(1), // "Width", "Top", etc.
1675
+ offset = 'offset' + capped, // "offsetWidth", "offsetTop", etc.
1676
+ pixel = 'pixel' + capped, // "pixelWidth", "pixelTop", etc.
1677
+ value = '',
1678
+ actual;
1679
+
1680
+ if (current == AUTO) {
1681
+ actual = el[offset]; // offsetHeight/Top etc.
1682
+ if (actual === undefined) { // likely "right" or "bottom"
1683
+ value = 0;
1684
+ }
1685
+
1686
+ value = actual;
1687
+ if (re_size.test(prop)) { // account for box model diff
1688
+ el[STYLE][prop] = actual;
1689
+ if (el[offset] > actual) {
1690
+ // the difference is padding + border (works in Standards & Quirks modes)
1691
+ value = actual - (el[offset] - actual);
1692
+ }
1693
+ el[STYLE][prop] = AUTO; // revert to auto
1694
+ }
1695
+ } else { // convert units to px
1696
+ if (!el[STYLE][pixel] && !el[STYLE][prop]) { // need to map style.width to currentStyle (no currentStyle.pixelWidth)
1697
+ el[STYLE][prop] = current; // no style.pixelWidth if no style.width
1698
+ }
1699
+ value = el[STYLE][pixel];
1700
+ }
1701
+ return value + PX;
1702
+ },
1703
+
1704
+ getBorderWidth: function(el, property) {
1705
+ // clientHeight/Width = paddingBox (e.g. offsetWidth - borderWidth)
1706
+ // clientTop/Left = borderWidth
1707
+ var value = null;
1708
+ if (!el[CURRENT_STYLE][HAS_LAYOUT]) { // TODO: unset layout?
1709
+ el[STYLE].zoom = 1; // need layout to measure client
1710
+ }
1711
+
1712
+ switch(property) {
1713
+ case BORDER_TOP_WIDTH:
1714
+ value = el[CLIENT_TOP];
1715
+ break;
1716
+ case BORDER_BOTTOM_WIDTH:
1717
+ value = el.offsetHeight - el.clientHeight - el[CLIENT_TOP];
1718
+ break;
1719
+ case BORDER_LEFT_WIDTH:
1720
+ value = el[CLIENT_LEFT];
1721
+ break;
1722
+ case BORDER_RIGHT_WIDTH:
1723
+ value = el.offsetWidth - el.clientWidth - el[CLIENT_LEFT];
1724
+ break;
1725
+ }
1726
+ return value + PX;
1727
+ },
1728
+
1729
+ getPixel: function(node, att) {
1730
+ // use pixelRight to convert to px
1731
+ var val = null,
1732
+ styleRight = node[CURRENT_STYLE][RIGHT],
1733
+ current = node[CURRENT_STYLE][att];
1734
+
1735
+ node[STYLE][RIGHT] = current;
1736
+ val = node[STYLE].pixelRight;
1737
+ node[STYLE][RIGHT] = styleRight; // revert
1738
+
1739
+ return val + PX;
1740
+ },
1741
+
1742
+ getMargin: function(node, att) {
1743
+ var val;
1744
+ if (node[CURRENT_STYLE][att] == AUTO) {
1745
+ val = 0 + PX;
1746
+ } else {
1747
+ val = Y.Dom.IE.ComputedStyle.getPixel(node, att);
1748
+ }
1749
+ return val;
1750
+ },
1751
+
1752
+ getVisibility: function(node, att) {
1753
+ var current;
1754
+ while ( (current = node[CURRENT_STYLE]) && current[att] == 'inherit') { // NOTE: assignment in test
1755
+ node = node[PARENT_NODE];
1756
+ }
1757
+ return (current) ? current[att] : VISIBLE;
1758
+ },
1759
+
1760
+ getColor: function(node, att) {
1761
+ return Y.Dom.Color.toRGB(node[CURRENT_STYLE][att]) || TRANSPARENT;
1762
+ },
1763
+
1764
+ getBorderColor: function(node, att) {
1765
+ var current = node[CURRENT_STYLE],
1766
+ val = current[att] || current.color;
1767
+ return Y.Dom.Color.toRGB(Y.Dom.Color.toHex(val));
1768
+ }
1769
+
1770
+ },
1771
+
1772
+ //fontSize: getPixelFont,
1773
+ IEComputed = {};
1774
+
1775
+ IEComputed.top = IEComputed.right = IEComputed.bottom = IEComputed.left =
1776
+ IEComputed[WIDTH] = IEComputed[HEIGHT] = ComputedStyle.getOffset;
1777
+
1778
+ IEComputed.color = ComputedStyle.getColor;
1779
+
1780
+ IEComputed[BORDER_TOP_WIDTH] = IEComputed[BORDER_RIGHT_WIDTH] =
1781
+ IEComputed[BORDER_BOTTOM_WIDTH] = IEComputed[BORDER_LEFT_WIDTH] =
1782
+ ComputedStyle.getBorderWidth;
1783
+
1784
+ IEComputed.marginTop = IEComputed.marginRight = IEComputed.marginBottom =
1785
+ IEComputed.marginLeft = ComputedStyle.getMargin;
1786
+
1787
+ IEComputed.visibility = ComputedStyle.getVisibility;
1788
+ IEComputed.borderColor = IEComputed.borderTopColor =
1789
+ IEComputed.borderRightColor = IEComputed.borderBottomColor =
1790
+ IEComputed.borderLeftColor = ComputedStyle.getBorderColor;
1791
+
1792
+ Y.Dom.IE_COMPUTED = IEComputed;
1793
+ Y.Dom.IE_ComputedStyle = ComputedStyle;
1794
+ })();
1795
+ (function() {
1796
+ /**
1797
+ * Add style management functionality to DOM.
1798
+ * @module dom
1799
+ * @for Dom
1800
+ */
1801
+
1802
+ var TO_STRING = 'toString',
1803
+ PARSE_INT = parseInt,
1804
+ RE = RegExp,
1805
+ Y = YAHOO.util;
1806
+
1807
+ Y.Dom.Color = {
1808
+ KEYWORDS: {
1809
+ black: '000',
1810
+ silver: 'c0c0c0',
1811
+ gray: '808080',
1812
+ white: 'fff',
1813
+ maroon: '800000',
1814
+ red: 'f00',
1815
+ purple: '800080',
1816
+ fuchsia: 'f0f',
1817
+ green: '008000',
1818
+ lime: '0f0',
1819
+ olive: '808000',
1820
+ yellow: 'ff0',
1821
+ navy: '000080',
1822
+ blue: '00f',
1823
+ teal: '008080',
1824
+ aqua: '0ff'
1825
+ },
1826
+
1827
+ re_RGB: /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,
1828
+ re_hex: /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,
1829
+ re_hex3: /([0-9A-F])/gi,
1830
+
1831
+ toRGB: function(val) {
1832
+ if (!Y.Dom.Color.re_RGB.test(val)) {
1833
+ val = Y.Dom.Color.toHex(val);
1834
+ }
1835
+
1836
+ if(Y.Dom.Color.re_hex.exec(val)) {
1837
+ val = 'rgb(' + [
1838
+ PARSE_INT(RE.$1, 16),
1839
+ PARSE_INT(RE.$2, 16),
1840
+ PARSE_INT(RE.$3, 16)
1841
+ ].join(', ') + ')';
1842
+ }
1843
+ return val;
1844
+ },
1845
+
1846
+ toHex: function(val) {
1847
+ val = Y.Dom.Color.KEYWORDS[val] || val;
1848
+ if (Y.Dom.Color.re_RGB.exec(val)) {
1849
+ var r = (RE.$1.length === 1) ? '0' + RE.$1 : Number(RE.$1),
1850
+ g = (RE.$2.length === 1) ? '0' + RE.$2 : Number(RE.$2),
1851
+ b = (RE.$3.length === 1) ? '0' + RE.$3 : Number(RE.$3);
1852
+
1853
+ val = [
1854
+ r[TO_STRING](16),
1855
+ g[TO_STRING](16),
1856
+ b[TO_STRING](16)
1857
+ ].join('');
1858
+ }
1859
+
1860
+ if (val.length < 6) {
1861
+ val = val.replace(Y.Dom.Color.re_hex3, '$1$1');
1862
+ }
1863
+
1864
+ if (val !== 'transparent' && val.indexOf('#') < 0) {
1865
+ val = '#' + val;
1866
+ }
1867
+
1868
+ return val.toLowerCase();
1869
+ }
1870
+ };
1871
+ }());
1872
+ YAHOO.register("dom", YAHOO.util.Dom, {version: "2.8.1", build: "19"});