bloggit 1.0.3

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 (423) hide show
  1. data/History +4 -0
  2. data/Manifest +422 -0
  3. data/Rakefile +64 -0
  4. data/ReadMe +69 -0
  5. data/Todo +26 -0
  6. data/bin/bloggit +5 -0
  7. data/docs/index.html +57 -0
  8. data/docs/specifications.html +100 -0
  9. data/docs/src/_layout.rhtml +53 -0
  10. data/docs/src/index.markdown +5 -0
  11. data/docs/src/specifications.markdown +48 -0
  12. data/lib/bloggit.rb +28 -0
  13. data/lib/bloggit/boilerplate/Rakefile +2 -0
  14. data/lib/bloggit/boilerplate/pages/about.page +5 -0
  15. data/lib/bloggit/boilerplate/plugins/haloscan/init.rb +5 -0
  16. data/lib/bloggit/boilerplate/settings.yml +28 -0
  17. data/lib/bloggit/boilerplate/themes/default/styles/main.css +145 -0
  18. data/lib/bloggit/boilerplate/themes/default/templates/archive.rhtml +20 -0
  19. data/lib/bloggit/boilerplate/themes/default/templates/home.rhtml +6 -0
  20. data/lib/bloggit/boilerplate/themes/default/templates/layouts/main.rhtml +15 -0
  21. data/lib/bloggit/boilerplate/themes/default/templates/layouts/two-columns.rhtml +21 -0
  22. data/lib/bloggit/boilerplate/themes/default/templates/page.rhtml +8 -0
  23. data/lib/bloggit/boilerplate/themes/default/templates/post.rhtml +3 -0
  24. data/lib/bloggit/boilerplate/themes/default/templates/snippets/blog_entry.rhtml +16 -0
  25. data/lib/bloggit/boilerplate/themes/default/templates/snippets/navigation.rhtml +12 -0
  26. data/lib/bloggit/boilerplate/themes/default/templates/snippets/tag_list.rhtml +9 -0
  27. data/lib/bloggit/boilerplate/themes/default/templates/tag_archive.rhtml +38 -0
  28. data/lib/bloggit/checksum.rb +39 -0
  29. data/lib/bloggit/client/index.html +2 -0
  30. data/lib/bloggit/client/scripts/adapter/jquery/ext-jquery-adapter.js +12 -0
  31. data/lib/bloggit/client/scripts/adapter/jquery/jquery-plugins.js +965 -0
  32. data/lib/bloggit/client/scripts/adapter/jquery/jquery.js +2201 -0
  33. data/lib/bloggit/client/scripts/adapter/prototype/effects.js +1098 -0
  34. data/lib/bloggit/client/scripts/adapter/prototype/ext-prototype-adapter.js +12 -0
  35. data/lib/bloggit/client/scripts/adapter/prototype/prototype.js +2523 -0
  36. data/lib/bloggit/client/scripts/adapter/prototype/scriptaculous.js +59 -0
  37. data/lib/bloggit/client/scripts/adapter/yui/ext-yui-adapter.js +12 -0
  38. data/lib/bloggit/client/scripts/adapter/yui/yui-utilities.js +18 -0
  39. data/lib/bloggit/client/scripts/app.js +121 -0
  40. data/lib/bloggit/client/scripts/ext-all.js +256 -0
  41. data/lib/bloggit/client/scripts/resources/css/README.txt +3 -0
  42. data/lib/bloggit/client/scripts/resources/css/basic-dialog.css +286 -0
  43. data/lib/bloggit/client/scripts/resources/css/box.css +111 -0
  44. data/lib/bloggit/client/scripts/resources/css/button.css +148 -0
  45. data/lib/bloggit/client/scripts/resources/css/combo.css +46 -0
  46. data/lib/bloggit/client/scripts/resources/css/core.css +290 -0
  47. data/lib/bloggit/client/scripts/resources/css/date-picker.css +155 -0
  48. data/lib/bloggit/client/scripts/resources/css/dd.css +61 -0
  49. data/lib/bloggit/client/scripts/resources/css/debug.css +55 -0
  50. data/lib/bloggit/client/scripts/resources/css/ext-all.css +3167 -0
  51. data/lib/bloggit/client/scripts/resources/css/form.css +359 -0
  52. data/lib/bloggit/client/scripts/resources/css/grid.css +295 -0
  53. data/lib/bloggit/client/scripts/resources/css/layout.css +252 -0
  54. data/lib/bloggit/client/scripts/resources/css/menu.css +116 -0
  55. data/lib/bloggit/client/scripts/resources/css/panel.css +258 -0
  56. data/lib/bloggit/client/scripts/resources/css/qtips.css +119 -0
  57. data/lib/bloggit/client/scripts/resources/css/reset-min.css +9 -0
  58. data/lib/bloggit/client/scripts/resources/css/resizable.css +143 -0
  59. data/lib/bloggit/client/scripts/resources/css/tabs.css +134 -0
  60. data/lib/bloggit/client/scripts/resources/css/toolbar.css +160 -0
  61. data/lib/bloggit/client/scripts/resources/css/tree.css +179 -0
  62. data/lib/bloggit/client/scripts/resources/css/window.css +155 -0
  63. data/lib/bloggit/client/scripts/resources/css/ytheme-aero.css +581 -0
  64. data/lib/bloggit/client/scripts/resources/css/ytheme-gray.css +438 -0
  65. data/lib/bloggit/client/scripts/resources/css/ytheme-vista.css +511 -0
  66. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/aero-close-over.gif +0 -0
  67. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/aero-close.gif +0 -0
  68. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/bg-center.gif +0 -0
  69. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/bg-left.gif +0 -0
  70. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/bg-right.gif +0 -0
  71. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/close.gif +0 -0
  72. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/collapse-over.gif +0 -0
  73. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/collapse.gif +0 -0
  74. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/e-handle.gif +0 -0
  75. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/expand-over.gif +0 -0
  76. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/expand.gif +0 -0
  77. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/hd-sprite.gif +0 -0
  78. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/s-handle.gif +0 -0
  79. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/se-handle.gif +0 -0
  80. data/lib/bloggit/client/scripts/resources/images/aero/basic-dialog/w-handle.gif +0 -0
  81. data/lib/bloggit/client/scripts/resources/images/aero/gradient-bg.gif +0 -0
  82. data/lib/bloggit/client/scripts/resources/images/aero/grid/grid-blue-split.gif +0 -0
  83. data/lib/bloggit/client/scripts/resources/images/aero/grid/grid-hrow.gif +0 -0
  84. data/lib/bloggit/client/scripts/resources/images/aero/grid/grid-split.gif +0 -0
  85. data/lib/bloggit/client/scripts/resources/images/aero/grid/grid-vista-hd.gif +0 -0
  86. data/lib/bloggit/client/scripts/resources/images/aero/grid/pspbrwse.jbf +0 -0
  87. data/lib/bloggit/client/scripts/resources/images/aero/grid/sort-col-bg.gif +0 -0
  88. data/lib/bloggit/client/scripts/resources/images/aero/grid/sort_asc.gif +0 -0
  89. data/lib/bloggit/client/scripts/resources/images/aero/grid/sort_desc.gif +0 -0
  90. data/lib/bloggit/client/scripts/resources/images/aero/layout/collapse.gif +0 -0
  91. data/lib/bloggit/client/scripts/resources/images/aero/layout/expand.gif +0 -0
  92. data/lib/bloggit/client/scripts/resources/images/aero/layout/gradient-bg.gif +0 -0
  93. data/lib/bloggit/client/scripts/resources/images/aero/layout/ns-collapse.gif +0 -0
  94. data/lib/bloggit/client/scripts/resources/images/aero/layout/ns-expand.gif +0 -0
  95. data/lib/bloggit/client/scripts/resources/images/aero/layout/panel-close.gif +0 -0
  96. data/lib/bloggit/client/scripts/resources/images/aero/layout/panel-title-bg.gif +0 -0
  97. data/lib/bloggit/client/scripts/resources/images/aero/layout/panel-title-light-bg.gif +0 -0
  98. data/lib/bloggit/client/scripts/resources/images/aero/layout/tab-close-on.gif +0 -0
  99. data/lib/bloggit/client/scripts/resources/images/aero/layout/tab-close.gif +0 -0
  100. data/lib/bloggit/client/scripts/resources/images/aero/qtip/bg.gif +0 -0
  101. data/lib/bloggit/client/scripts/resources/images/aero/s.gif +0 -0
  102. data/lib/bloggit/client/scripts/resources/images/aero/sizer/e-handle-dark.gif +0 -0
  103. data/lib/bloggit/client/scripts/resources/images/aero/sizer/e-handle.gif +0 -0
  104. data/lib/bloggit/client/scripts/resources/images/aero/sizer/ne-handle-dark.gif +0 -0
  105. data/lib/bloggit/client/scripts/resources/images/aero/sizer/ne-handle.gif +0 -0
  106. data/lib/bloggit/client/scripts/resources/images/aero/sizer/nw-handle-dark.gif +0 -0
  107. data/lib/bloggit/client/scripts/resources/images/aero/sizer/nw-handle.gif +0 -0
  108. data/lib/bloggit/client/scripts/resources/images/aero/sizer/s-handle-dark.gif +0 -0
  109. data/lib/bloggit/client/scripts/resources/images/aero/sizer/s-handle.gif +0 -0
  110. data/lib/bloggit/client/scripts/resources/images/aero/sizer/se-handle-dark.gif +0 -0
  111. data/lib/bloggit/client/scripts/resources/images/aero/sizer/se-handle.gif +0 -0
  112. data/lib/bloggit/client/scripts/resources/images/aero/sizer/sw-handle-dark.gif +0 -0
  113. data/lib/bloggit/client/scripts/resources/images/aero/sizer/sw-handle.gif +0 -0
  114. data/lib/bloggit/client/scripts/resources/images/aero/tabs/tab-btm-inactive-left-bg.gif +0 -0
  115. data/lib/bloggit/client/scripts/resources/images/aero/tabs/tab-btm-inactive-right-bg.gif +0 -0
  116. data/lib/bloggit/client/scripts/resources/images/aero/tabs/tab-btm-left-bg.gif +0 -0
  117. data/lib/bloggit/client/scripts/resources/images/aero/tabs/tab-btm-right-bg.gif +0 -0
  118. data/lib/bloggit/client/scripts/resources/images/aero/tabs/tab-sprite.gif +0 -0
  119. data/lib/bloggit/client/scripts/resources/images/aero/tabs/tab-strip-bg.gif +0 -0
  120. data/lib/bloggit/client/scripts/resources/images/aero/tabs/tab-strip-bg.png +0 -0
  121. data/lib/bloggit/client/scripts/resources/images/aero/tabs/tab-strip-btm-bg.gif +0 -0
  122. data/lib/bloggit/client/scripts/resources/images/aero/toolbar/bg.gif +0 -0
  123. data/lib/bloggit/client/scripts/resources/images/aero/toolbar/tb-btn-sprite.gif +0 -0
  124. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/btn-arrow.gif +0 -0
  125. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/btn-sprite.gif +0 -0
  126. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/close.gif +0 -0
  127. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/collapse.gif +0 -0
  128. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/e-handle.gif +0 -0
  129. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/expand.gif +0 -0
  130. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/hd-sprite.gif +0 -0
  131. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/progress.gif +0 -0
  132. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/progress2.gif +0 -0
  133. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/s-handle.gif +0 -0
  134. data/lib/bloggit/client/scripts/resources/images/default/basic-dialog/se-handle.gif +0 -0
  135. data/lib/bloggit/client/scripts/resources/images/default/box/corners-blue.gif +0 -0
  136. data/lib/bloggit/client/scripts/resources/images/default/box/corners.gif +0 -0
  137. data/lib/bloggit/client/scripts/resources/images/default/box/l-blue.gif +0 -0
  138. data/lib/bloggit/client/scripts/resources/images/default/box/l.gif +0 -0
  139. data/lib/bloggit/client/scripts/resources/images/default/box/r-blue.gif +0 -0
  140. data/lib/bloggit/client/scripts/resources/images/default/box/r.gif +0 -0
  141. data/lib/bloggit/client/scripts/resources/images/default/box/tb-blue.gif +0 -0
  142. data/lib/bloggit/client/scripts/resources/images/default/box/tb.gif +0 -0
  143. data/lib/bloggit/client/scripts/resources/images/default/dd/drop-add.gif +0 -0
  144. data/lib/bloggit/client/scripts/resources/images/default/dd/drop-no.gif +0 -0
  145. data/lib/bloggit/client/scripts/resources/images/default/dd/drop-yes.gif +0 -0
  146. data/lib/bloggit/client/scripts/resources/images/default/form/date-trigger.gif +0 -0
  147. data/lib/bloggit/client/scripts/resources/images/default/form/error-tip-corners.gif +0 -0
  148. data/lib/bloggit/client/scripts/resources/images/default/form/exclamation.gif +0 -0
  149. data/lib/bloggit/client/scripts/resources/images/default/form/text-bg.gif +0 -0
  150. data/lib/bloggit/client/scripts/resources/images/default/form/trigger.gif +0 -0
  151. data/lib/bloggit/client/scripts/resources/images/default/gradient-bg.gif +0 -0
  152. data/lib/bloggit/client/scripts/resources/images/default/grid/Thumbs.db +0 -0
  153. data/lib/bloggit/client/scripts/resources/images/default/grid/arrow-left-white.gif +0 -0
  154. data/lib/bloggit/client/scripts/resources/images/default/grid/arrow-right-white.gif +0 -0
  155. data/lib/bloggit/client/scripts/resources/images/default/grid/col-move-bottom.gif +0 -0
  156. data/lib/bloggit/client/scripts/resources/images/default/grid/col-move-top.gif +0 -0
  157. data/lib/bloggit/client/scripts/resources/images/default/grid/dirty.gif +0 -0
  158. data/lib/bloggit/client/scripts/resources/images/default/grid/done.gif +0 -0
  159. data/lib/bloggit/client/scripts/resources/images/default/grid/drop-no.gif +0 -0
  160. data/lib/bloggit/client/scripts/resources/images/default/grid/drop-yes.gif +0 -0
  161. data/lib/bloggit/client/scripts/resources/images/default/grid/footer-bg.gif +0 -0
  162. data/lib/bloggit/client/scripts/resources/images/default/grid/grid-blue-hd.gif +0 -0
  163. data/lib/bloggit/client/scripts/resources/images/default/grid/grid-blue-split.gif +0 -0
  164. data/lib/bloggit/client/scripts/resources/images/default/grid/grid-hrow.gif +0 -0
  165. data/lib/bloggit/client/scripts/resources/images/default/grid/grid-loading.gif +0 -0
  166. data/lib/bloggit/client/scripts/resources/images/default/grid/grid-split.gif +0 -0
  167. data/lib/bloggit/client/scripts/resources/images/default/grid/grid-vista-hd.gif +0 -0
  168. data/lib/bloggit/client/scripts/resources/images/default/grid/hd-pop.gif +0 -0
  169. data/lib/bloggit/client/scripts/resources/images/default/grid/hmenu-asc.gif +0 -0
  170. data/lib/bloggit/client/scripts/resources/images/default/grid/hmenu-desc.gif +0 -0
  171. data/lib/bloggit/client/scripts/resources/images/default/grid/hmenu-lock.gif +0 -0
  172. data/lib/bloggit/client/scripts/resources/images/default/grid/hmenu-lock.png +0 -0
  173. data/lib/bloggit/client/scripts/resources/images/default/grid/hmenu-unlock.gif +0 -0
  174. data/lib/bloggit/client/scripts/resources/images/default/grid/hmenu-unlock.png +0 -0
  175. data/lib/bloggit/client/scripts/resources/images/default/grid/invalid_line.gif +0 -0
  176. data/lib/bloggit/client/scripts/resources/images/default/grid/loading.gif +0 -0
  177. data/lib/bloggit/client/scripts/resources/images/default/grid/mso-hd.gif +0 -0
  178. data/lib/bloggit/client/scripts/resources/images/default/grid/nowait.gif +0 -0
  179. data/lib/bloggit/client/scripts/resources/images/default/grid/page-first-disabled.gif +0 -0
  180. data/lib/bloggit/client/scripts/resources/images/default/grid/page-first.gif +0 -0
  181. data/lib/bloggit/client/scripts/resources/images/default/grid/page-last-disabled.gif +0 -0
  182. data/lib/bloggit/client/scripts/resources/images/default/grid/page-last.gif +0 -0
  183. data/lib/bloggit/client/scripts/resources/images/default/grid/page-next-disabled.gif +0 -0
  184. data/lib/bloggit/client/scripts/resources/images/default/grid/page-next.gif +0 -0
  185. data/lib/bloggit/client/scripts/resources/images/default/grid/page-prev-disabled.gif +0 -0
  186. data/lib/bloggit/client/scripts/resources/images/default/grid/page-prev.gif +0 -0
  187. data/lib/bloggit/client/scripts/resources/images/default/grid/pick-button.gif +0 -0
  188. data/lib/bloggit/client/scripts/resources/images/default/grid/refresh.gif +0 -0
  189. data/lib/bloggit/client/scripts/resources/images/default/grid/sort_asc.gif +0 -0
  190. data/lib/bloggit/client/scripts/resources/images/default/grid/sort_desc.gif +0 -0
  191. data/lib/bloggit/client/scripts/resources/images/default/grid/wait.gif +0 -0
  192. data/lib/bloggit/client/scripts/resources/images/default/layout/collapse.gif +0 -0
  193. data/lib/bloggit/client/scripts/resources/images/default/layout/expand.gif +0 -0
  194. data/lib/bloggit/client/scripts/resources/images/default/layout/gradient-bg.gif +0 -0
  195. data/lib/bloggit/client/scripts/resources/images/default/layout/ns-collapse.gif +0 -0
  196. data/lib/bloggit/client/scripts/resources/images/default/layout/ns-expand.gif +0 -0
  197. data/lib/bloggit/client/scripts/resources/images/default/layout/panel-close.gif +0 -0
  198. data/lib/bloggit/client/scripts/resources/images/default/layout/panel-title-bg.gif +0 -0
  199. data/lib/bloggit/client/scripts/resources/images/default/layout/panel-title-light-bg.gif +0 -0
  200. data/lib/bloggit/client/scripts/resources/images/default/layout/stick.gif +0 -0
  201. data/lib/bloggit/client/scripts/resources/images/default/layout/stuck.gif +0 -0
  202. data/lib/bloggit/client/scripts/resources/images/default/layout/tab-close-on.gif +0 -0
  203. data/lib/bloggit/client/scripts/resources/images/default/layout/tab-close.gif +0 -0
  204. data/lib/bloggit/client/scripts/resources/images/default/menu/checked.gif +0 -0
  205. data/lib/bloggit/client/scripts/resources/images/default/menu/group-checked.gif +0 -0
  206. data/lib/bloggit/client/scripts/resources/images/default/menu/menu-parent.gif +0 -0
  207. data/lib/bloggit/client/scripts/resources/images/default/menu/menu.gif +0 -0
  208. data/lib/bloggit/client/scripts/resources/images/default/menu/unchecked.gif +0 -0
  209. data/lib/bloggit/client/scripts/resources/images/default/qtip/bg.gif +0 -0
  210. data/lib/bloggit/client/scripts/resources/images/default/qtip/close.gif +0 -0
  211. data/lib/bloggit/client/scripts/resources/images/default/qtip/tip-sprite.gif +0 -0
  212. data/lib/bloggit/client/scripts/resources/images/default/s.gif +0 -0
  213. data/lib/bloggit/client/scripts/resources/images/default/shadow-c.png +0 -0
  214. data/lib/bloggit/client/scripts/resources/images/default/shadow-lr.png +0 -0
  215. data/lib/bloggit/client/scripts/resources/images/default/shadow.png +0 -0
  216. data/lib/bloggit/client/scripts/resources/images/default/shared/calendar.gif +0 -0
  217. data/lib/bloggit/client/scripts/resources/images/default/shared/left-btn.gif +0 -0
  218. data/lib/bloggit/client/scripts/resources/images/default/shared/right-btn.gif +0 -0
  219. data/lib/bloggit/client/scripts/resources/images/default/shared/warning.gif +0 -0
  220. data/lib/bloggit/client/scripts/resources/images/default/sizer/e-handle-dark.gif +0 -0
  221. data/lib/bloggit/client/scripts/resources/images/default/sizer/e-handle.gif +0 -0
  222. data/lib/bloggit/client/scripts/resources/images/default/sizer/ne-handle-dark.gif +0 -0
  223. data/lib/bloggit/client/scripts/resources/images/default/sizer/ne-handle.gif +0 -0
  224. data/lib/bloggit/client/scripts/resources/images/default/sizer/nw-handle-dark.gif +0 -0
  225. data/lib/bloggit/client/scripts/resources/images/default/sizer/nw-handle.gif +0 -0
  226. data/lib/bloggit/client/scripts/resources/images/default/sizer/s-handle-dark.gif +0 -0
  227. data/lib/bloggit/client/scripts/resources/images/default/sizer/s-handle.gif +0 -0
  228. data/lib/bloggit/client/scripts/resources/images/default/sizer/se-handle-dark.gif +0 -0
  229. data/lib/bloggit/client/scripts/resources/images/default/sizer/se-handle.gif +0 -0
  230. data/lib/bloggit/client/scripts/resources/images/default/sizer/square.gif +0 -0
  231. data/lib/bloggit/client/scripts/resources/images/default/sizer/sw-handle-dark.gif +0 -0
  232. data/lib/bloggit/client/scripts/resources/images/default/sizer/sw-handle.gif +0 -0
  233. data/lib/bloggit/client/scripts/resources/images/default/tabs/tab-btm-inactive-left-bg.gif +0 -0
  234. data/lib/bloggit/client/scripts/resources/images/default/tabs/tab-btm-inactive-right-bg.gif +0 -0
  235. data/lib/bloggit/client/scripts/resources/images/default/tabs/tab-btm-left-bg.gif +0 -0
  236. data/lib/bloggit/client/scripts/resources/images/default/tabs/tab-btm-right-bg.gif +0 -0
  237. data/lib/bloggit/client/scripts/resources/images/default/tabs/tab-sprite.gif +0 -0
  238. data/lib/bloggit/client/scripts/resources/images/default/toolbar/btn-arrow-light.gif +0 -0
  239. data/lib/bloggit/client/scripts/resources/images/default/toolbar/btn-arrow.gif +0 -0
  240. data/lib/bloggit/client/scripts/resources/images/default/toolbar/btn-over-bg.gif +0 -0
  241. data/lib/bloggit/client/scripts/resources/images/default/toolbar/gray-bg.gif +0 -0
  242. data/lib/bloggit/client/scripts/resources/images/default/toolbar/tb-bg.gif +0 -0
  243. data/lib/bloggit/client/scripts/resources/images/default/toolbar/tb-btn-sprite.gif +0 -0
  244. data/lib/bloggit/client/scripts/resources/images/default/tree/drop-add.gif +0 -0
  245. data/lib/bloggit/client/scripts/resources/images/default/tree/drop-between.gif +0 -0
  246. data/lib/bloggit/client/scripts/resources/images/default/tree/drop-no.gif +0 -0
  247. data/lib/bloggit/client/scripts/resources/images/default/tree/drop-over.gif +0 -0
  248. data/lib/bloggit/client/scripts/resources/images/default/tree/drop-under.gif +0 -0
  249. data/lib/bloggit/client/scripts/resources/images/default/tree/drop-yes.gif +0 -0
  250. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow-end-minus-nl.gif +0 -0
  251. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow-end-minus.gif +0 -0
  252. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow-end-plus-nl.gif +0 -0
  253. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow-end-plus.gif +0 -0
  254. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow-end.gif +0 -0
  255. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow-line.gif +0 -0
  256. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow-minus-nl.gif +0 -0
  257. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow-minus.gif +0 -0
  258. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow-plus-nl.gif +0 -0
  259. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow-plus.gif +0 -0
  260. data/lib/bloggit/client/scripts/resources/images/default/tree/elbow.gif +0 -0
  261. data/lib/bloggit/client/scripts/resources/images/default/tree/folder-open.gif +0 -0
  262. data/lib/bloggit/client/scripts/resources/images/default/tree/folder.gif +0 -0
  263. data/lib/bloggit/client/scripts/resources/images/default/tree/leaf.gif +0 -0
  264. data/lib/bloggit/client/scripts/resources/images/default/tree/loading.gif +0 -0
  265. data/lib/bloggit/client/scripts/resources/images/default/tree/s.gif +0 -0
  266. data/lib/bloggit/client/scripts/resources/images/gray/basic-dialog/close.gif +0 -0
  267. data/lib/bloggit/client/scripts/resources/images/gray/basic-dialog/collapse.gif +0 -0
  268. data/lib/bloggit/client/scripts/resources/images/gray/basic-dialog/dlg-bg.gif +0 -0
  269. data/lib/bloggit/client/scripts/resources/images/gray/basic-dialog/e-handle.gif +0 -0
  270. data/lib/bloggit/client/scripts/resources/images/gray/basic-dialog/expand.gif +0 -0
  271. data/lib/bloggit/client/scripts/resources/images/gray/basic-dialog/hd-sprite.gif +0 -0
  272. data/lib/bloggit/client/scripts/resources/images/gray/basic-dialog/s-handle.gif +0 -0
  273. data/lib/bloggit/client/scripts/resources/images/gray/basic-dialog/se-handle.gif +0 -0
  274. data/lib/bloggit/client/scripts/resources/images/gray/gradient-bg.gif +0 -0
  275. data/lib/bloggit/client/scripts/resources/images/gray/grid/grid-hrow.gif +0 -0
  276. data/lib/bloggit/client/scripts/resources/images/gray/layout/collapse.gif +0 -0
  277. data/lib/bloggit/client/scripts/resources/images/gray/layout/expand.gif +0 -0
  278. data/lib/bloggit/client/scripts/resources/images/gray/layout/gradient-bg.gif +0 -0
  279. data/lib/bloggit/client/scripts/resources/images/gray/layout/ns-collapse.gif +0 -0
  280. data/lib/bloggit/client/scripts/resources/images/gray/layout/ns-expand.gif +0 -0
  281. data/lib/bloggit/client/scripts/resources/images/gray/layout/panel-close.gif +0 -0
  282. data/lib/bloggit/client/scripts/resources/images/gray/layout/panel-title-bg.gif +0 -0
  283. data/lib/bloggit/client/scripts/resources/images/gray/layout/panel-title-light-bg.gif +0 -0
  284. data/lib/bloggit/client/scripts/resources/images/gray/layout/stick.gif +0 -0
  285. data/lib/bloggit/client/scripts/resources/images/gray/layout/tab-close-on.gif +0 -0
  286. data/lib/bloggit/client/scripts/resources/images/gray/layout/tab-close.gif +0 -0
  287. data/lib/bloggit/client/scripts/resources/images/gray/menu/checked.gif +0 -0
  288. data/lib/bloggit/client/scripts/resources/images/gray/menu/group-checked.gif +0 -0
  289. data/lib/bloggit/client/scripts/resources/images/gray/menu/menu-parent.gif +0 -0
  290. data/lib/bloggit/client/scripts/resources/images/gray/menu/menu.gif +0 -0
  291. data/lib/bloggit/client/scripts/resources/images/gray/menu/unchecked.gif +0 -0
  292. data/lib/bloggit/client/scripts/resources/images/gray/qtip/bg.gif +0 -0
  293. data/lib/bloggit/client/scripts/resources/images/gray/qtip/tip-sprite.gif +0 -0
  294. data/lib/bloggit/client/scripts/resources/images/gray/s.gif +0 -0
  295. data/lib/bloggit/client/scripts/resources/images/gray/sizer/e-handle-dark.gif +0 -0
  296. data/lib/bloggit/client/scripts/resources/images/gray/sizer/e-handle.gif +0 -0
  297. data/lib/bloggit/client/scripts/resources/images/gray/sizer/ne-handle-dark.gif +0 -0
  298. data/lib/bloggit/client/scripts/resources/images/gray/sizer/ne-handle.gif +0 -0
  299. data/lib/bloggit/client/scripts/resources/images/gray/sizer/nw-handle-dark.gif +0 -0
  300. data/lib/bloggit/client/scripts/resources/images/gray/sizer/nw-handle.gif +0 -0
  301. data/lib/bloggit/client/scripts/resources/images/gray/sizer/s-handle-dark.gif +0 -0
  302. data/lib/bloggit/client/scripts/resources/images/gray/sizer/s-handle.gif +0 -0
  303. data/lib/bloggit/client/scripts/resources/images/gray/sizer/se-handle-dark.gif +0 -0
  304. data/lib/bloggit/client/scripts/resources/images/gray/sizer/se-handle.gif +0 -0
  305. data/lib/bloggit/client/scripts/resources/images/gray/sizer/sw-handle-dark.gif +0 -0
  306. data/lib/bloggit/client/scripts/resources/images/gray/sizer/sw-handle.gif +0 -0
  307. data/lib/bloggit/client/scripts/resources/images/gray/tabs/tab-btm-inactive-left-bg.gif +0 -0
  308. data/lib/bloggit/client/scripts/resources/images/gray/tabs/tab-btm-inactive-right-bg.gif +0 -0
  309. data/lib/bloggit/client/scripts/resources/images/gray/tabs/tab-btm-left-bg.gif +0 -0
  310. data/lib/bloggit/client/scripts/resources/images/gray/tabs/tab-btm-right-bg.gif +0 -0
  311. data/lib/bloggit/client/scripts/resources/images/gray/tabs/tab-sprite.gif +0 -0
  312. data/lib/bloggit/client/scripts/resources/images/gray/toolbar/gray-bg.gif +0 -0
  313. data/lib/bloggit/client/scripts/resources/images/gray/toolbar/tb-btn-sprite.gif +0 -0
  314. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/bg-center.gif +0 -0
  315. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/bg-left.gif +0 -0
  316. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/bg-right.gif +0 -0
  317. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/close.gif +0 -0
  318. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/collapse.gif +0 -0
  319. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/dlg-bg.gif +0 -0
  320. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/e-handle.gif +0 -0
  321. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/expand.gif +0 -0
  322. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/hd-sprite.gif +0 -0
  323. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/s-handle.gif +0 -0
  324. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/se-handle.gif +0 -0
  325. data/lib/bloggit/client/scripts/resources/images/vista/basic-dialog/w-handle.gif +0 -0
  326. data/lib/bloggit/client/scripts/resources/images/vista/gradient-bg.gif +0 -0
  327. data/lib/bloggit/client/scripts/resources/images/vista/grid/grid-split.gif +0 -0
  328. data/lib/bloggit/client/scripts/resources/images/vista/grid/grid-vista-hd.gif +0 -0
  329. data/lib/bloggit/client/scripts/resources/images/vista/layout/collapse.gif +0 -0
  330. data/lib/bloggit/client/scripts/resources/images/vista/layout/expand.gif +0 -0
  331. data/lib/bloggit/client/scripts/resources/images/vista/layout/gradient-bg.gif +0 -0
  332. data/lib/bloggit/client/scripts/resources/images/vista/layout/ns-collapse.gif +0 -0
  333. data/lib/bloggit/client/scripts/resources/images/vista/layout/ns-expand.gif +0 -0
  334. data/lib/bloggit/client/scripts/resources/images/vista/layout/panel-close.gif +0 -0
  335. data/lib/bloggit/client/scripts/resources/images/vista/layout/panel-title-bg.gif +0 -0
  336. data/lib/bloggit/client/scripts/resources/images/vista/layout/panel-title-light-bg.gif +0 -0
  337. data/lib/bloggit/client/scripts/resources/images/vista/layout/stick.gif +0 -0
  338. data/lib/bloggit/client/scripts/resources/images/vista/layout/tab-close-on.gif +0 -0
  339. data/lib/bloggit/client/scripts/resources/images/vista/layout/tab-close.gif +0 -0
  340. data/lib/bloggit/client/scripts/resources/images/vista/qtip/bg.gif +0 -0
  341. data/lib/bloggit/client/scripts/resources/images/vista/qtip/tip-sprite.gif +0 -0
  342. data/lib/bloggit/client/scripts/resources/images/vista/s.gif +0 -0
  343. data/lib/bloggit/client/scripts/resources/images/vista/sizer/e-handle-dark.gif +0 -0
  344. data/lib/bloggit/client/scripts/resources/images/vista/sizer/e-handle.gif +0 -0
  345. data/lib/bloggit/client/scripts/resources/images/vista/sizer/ne-handle-dark.gif +0 -0
  346. data/lib/bloggit/client/scripts/resources/images/vista/sizer/ne-handle.gif +0 -0
  347. data/lib/bloggit/client/scripts/resources/images/vista/sizer/nw-handle-dark.gif +0 -0
  348. data/lib/bloggit/client/scripts/resources/images/vista/sizer/nw-handle.gif +0 -0
  349. data/lib/bloggit/client/scripts/resources/images/vista/sizer/s-handle-dark.gif +0 -0
  350. data/lib/bloggit/client/scripts/resources/images/vista/sizer/s-handle.gif +0 -0
  351. data/lib/bloggit/client/scripts/resources/images/vista/sizer/se-handle-dark.gif +0 -0
  352. data/lib/bloggit/client/scripts/resources/images/vista/sizer/se-handle.gif +0 -0
  353. data/lib/bloggit/client/scripts/resources/images/vista/sizer/sw-handle-dark.gif +0 -0
  354. data/lib/bloggit/client/scripts/resources/images/vista/sizer/sw-handle.gif +0 -0
  355. data/lib/bloggit/client/scripts/resources/images/vista/tabs/tab-btm-inactive-left-bg.gif +0 -0
  356. data/lib/bloggit/client/scripts/resources/images/vista/tabs/tab-btm-inactive-right-bg.gif +0 -0
  357. data/lib/bloggit/client/scripts/resources/images/vista/tabs/tab-btm-left-bg.gif +0 -0
  358. data/lib/bloggit/client/scripts/resources/images/vista/tabs/tab-btm-right-bg.gif +0 -0
  359. data/lib/bloggit/client/scripts/resources/images/vista/tabs/tab-sprite.gif +0 -0
  360. data/lib/bloggit/client/scripts/resources/images/vista/toolbar/gray-bg.gif +0 -0
  361. data/lib/bloggit/client/scripts/resources/images/vista/toolbar/tb-btn-sprite.gif +0 -0
  362. data/lib/bloggit/client/scripts/resources/license.txt +25 -0
  363. data/lib/bloggit/client/scripts/resources/raw-images/shadow.psd +0 -0
  364. data/lib/bloggit/client/scripts/resources/resources.jsb +522 -0
  365. data/lib/bloggit/client/templates/json.rhtml +5 -0
  366. data/lib/bloggit/client/templates/main.rhtml +109 -0
  367. data/lib/bloggit/commandline.rb +52 -0
  368. data/lib/bloggit/commands/page_cmd.rb +17 -0
  369. data/lib/bloggit/commands/plugin_cmd.rb +89 -0
  370. data/lib/bloggit/commands/post_cmd.rb +17 -0
  371. data/lib/bloggit/commands/site_cmd.rb +82 -0
  372. data/lib/bloggit/commands/theme_cmd.rb +16 -0
  373. data/lib/bloggit/etc/hash.rb +24 -0
  374. data/lib/bloggit/etc/string.rb +5 -0
  375. data/lib/bloggit/generator.rb +331 -0
  376. data/lib/bloggit/hooks.rb +21 -0
  377. data/lib/bloggit/media.rb +40 -0
  378. data/lib/bloggit/page.rb +98 -0
  379. data/lib/bloggit/plugin.rb +52 -0
  380. data/lib/bloggit/post.rb +169 -0
  381. data/lib/bloggit/publisher.rb +115 -0
  382. data/lib/bloggit/server.rb +102 -0
  383. data/lib/bloggit/site.rb +183 -0
  384. data/lib/bloggit/tag.rb +61 -0
  385. data/lib/bloggit/tasks/client.rb +9 -0
  386. data/lib/bloggit/tasks/publishing.rb +36 -0
  387. data/lib/bloggit/tasks/scm.rb +78 -0
  388. data/lib/bloggit/tasks/specs.rb +128 -0
  389. data/lib/bloggit/template.rb +334 -0
  390. data/lib/bloggit/text_formatter.rb +50 -0
  391. data/lib/util/fixed_hoe.rb +553 -0
  392. data/test/fixtures/test.blog/Rakefile +7 -0
  393. data/test/fixtures/test.blog/pages/about.page +7 -0
  394. data/test/fixtures/test.blog/pages/coming-soon.page +3 -0
  395. data/test/fixtures/test.blog/pages/todo.page +23 -0
  396. data/test/fixtures/test.blog/plugins/example/init.rb +69 -0
  397. data/test/fixtures/test.blog/plugins/haloscan/init.rb +25 -0
  398. data/test/fixtures/test.blog/plugins/js_search/init.rb +51 -0
  399. data/test/fixtures/test.blog/plugins/rdoc_formatter/init.rb +14 -0
  400. data/test/fixtures/test.blog/posts/2004.03.07_to-boldly-go.post +11 -0
  401. data/test/fixtures/test.blog/posts/2007.03.25_sure-whatever.post +10 -0
  402. data/test/fixtures/test.blog/posts/2007.03.27_rdoc-anyone.post +13 -0
  403. data/test/fixtures/test.blog/posts/2010.12.07_35-already.post +5 -0
  404. data/test/fixtures/test.blog/settings.yml +34 -0
  405. data/test/fixtures/test.blog/themes/default/styles/main.css +145 -0
  406. data/test/fixtures/test.blog/themes/default/templates/archive.rhtml +22 -0
  407. data/test/fixtures/test.blog/themes/default/templates/home.rhtml +9 -0
  408. data/test/fixtures/test.blog/themes/default/templates/layouts/main.rhtml +17 -0
  409. data/test/fixtures/test.blog/themes/default/templates/layouts/two-columns.rhtml +21 -0
  410. data/test/fixtures/test.blog/themes/default/templates/page.rhtml +8 -0
  411. data/test/fixtures/test.blog/themes/default/templates/post.rhtml +15 -0
  412. data/test/fixtures/test.blog/themes/default/templates/snippets/blog_entry.rhtml +10 -0
  413. data/test/fixtures/test.blog/themes/default/templates/snippets/navigation.rhtml +12 -0
  414. data/test/fixtures/test.blog/themes/default/templates/snippets/tag_list.rhtml +9 -0
  415. data/test/fixtures/test.blog/themes/default/templates/tag_archive.rhtml +41 -0
  416. data/test/helpers.rb +25 -0
  417. data/test/unit/bloggit_test.rb +9 -0
  418. data/test/unit/page_test.rb +28 -0
  419. data/test/unit/post_test.rb +36 -0
  420. data/test/unit/site_test.rb +27 -0
  421. data/test/unit/template_test.rb +21 -0
  422. data/test/unit/text_formatter_test.rb +43 -0
  423. metadata +520 -0
@@ -0,0 +1,1098 @@
1
+ /*
2
+ * Ext JS Library 1.0 Beta 1
3
+ * Copyright(c) 2006-2007, Ext JS, LLC.
4
+ * licensing@extjs.com
5
+ *
6
+ * http://www.extjs.com/license
7
+ */
8
+
9
+ // script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
10
+
11
+ // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
12
+ // Contributors:
13
+ // Justin Palmer (http://encytemedia.com/)
14
+ // Mark Pilgrim (http://diveintomark.org/)
15
+ // Martin Bialasinki
16
+ //
17
+ // script.aculo.us is freely distributable under the terms of an MIT-style license.
18
+ // For details, see the script.aculo.us web site: http://script.aculo.us/
19
+
20
+ // converts rgb() and #xxx to #xxxxxx format,
21
+ // returns self (or first argument) if not convertable
22
+ String.prototype.parseColor = function() {
23
+ var color = '#';
24
+ if(this.slice(0,4) == 'rgb(') {
25
+ var cols = this.slice(4,this.length-1).split(',');
26
+ var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
27
+ } else {
28
+ if(this.slice(0,1) == '#') {
29
+ if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
30
+ if(this.length==7) color = this.toLowerCase();
31
+ }
32
+ }
33
+ return(color.length==7 ? color : (arguments[0] || this));
34
+ }
35
+
36
+ /*--------------------------------------------------------------------------*/
37
+
38
+ Element.collectTextNodes = function(element) {
39
+ return $A($(element).childNodes).collect( function(node) {
40
+ return (node.nodeType==3 ? node.nodeValue :
41
+ (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
42
+ }).flatten().join('');
43
+ }
44
+
45
+ Element.collectTextNodesIgnoreClass = function(element, className) {
46
+ return $A($(element).childNodes).collect( function(node) {
47
+ return (node.nodeType==3 ? node.nodeValue :
48
+ ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
49
+ Element.collectTextNodesIgnoreClass(node, className) : ''));
50
+ }).flatten().join('');
51
+ }
52
+
53
+ Element.setContentZoom = function(element, percent) {
54
+ element = $(element);
55
+ element.setStyle({fontSize: (percent/100) + 'em'});
56
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
57
+ return element;
58
+ }
59
+
60
+ Element.getOpacity = function(element){
61
+ return $(element).getStyle('opacity');
62
+ }
63
+
64
+ Element.setOpacity = function(element, value){
65
+ return $(element).setStyle({opacity:value});
66
+ }
67
+
68
+ Element.getInlineOpacity = function(element){
69
+ return $(element).style.opacity || '';
70
+ }
71
+
72
+ Element.forceRerendering = function(element) {
73
+ try {
74
+ element = $(element);
75
+ var n = document.createTextNode(' ');
76
+ element.appendChild(n);
77
+ element.removeChild(n);
78
+ } catch(e) { }
79
+ };
80
+
81
+ /*--------------------------------------------------------------------------*/
82
+
83
+ Array.prototype.call = function() {
84
+ var args = arguments;
85
+ this.each(function(f){ f.apply(this, args) });
86
+ }
87
+
88
+ /*--------------------------------------------------------------------------*/
89
+
90
+ var Effect = {
91
+ _elementDoesNotExistError: {
92
+ name: 'ElementDoesNotExistError',
93
+ message: 'The specified DOM element does not exist, but is required for this effect to operate'
94
+ },
95
+ tagifyText: function(element) {
96
+ if(typeof Builder == 'undefined')
97
+ throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
98
+
99
+ var tagifyStyle = 'position:relative';
100
+ if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
101
+
102
+ element = $(element);
103
+ $A(element.childNodes).each( function(child) {
104
+ if(child.nodeType==3) {
105
+ child.nodeValue.toArray().each( function(character) {
106
+ element.insertBefore(
107
+ Builder.node('span',{style: tagifyStyle},
108
+ character == ' ' ? String.fromCharCode(160) : character),
109
+ child);
110
+ });
111
+ Element.remove(child);
112
+ }
113
+ });
114
+ },
115
+ multiple: function(element, effect) {
116
+ var elements;
117
+ if(((typeof element == 'object') ||
118
+ (typeof element == 'function')) &&
119
+ (element.length))
120
+ elements = element;
121
+ else
122
+ elements = $(element).childNodes;
123
+
124
+ var options = Object.extend({
125
+ speed: 0.1,
126
+ delay: 0.0
127
+ }, arguments[2] || {});
128
+ var masterDelay = options.delay;
129
+
130
+ $A(elements).each( function(element, index) {
131
+ new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
132
+ });
133
+ },
134
+ PAIRS: {
135
+ 'slide': ['SlideDown','SlideUp'],
136
+ 'blind': ['BlindDown','BlindUp'],
137
+ 'appear': ['Appear','Fade']
138
+ },
139
+ toggle: function(element, effect) {
140
+ element = $(element);
141
+ effect = (effect || 'appear').toLowerCase();
142
+ var options = Object.extend({
143
+ queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
144
+ }, arguments[2] || {});
145
+ Effect[element.visible() ?
146
+ Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
147
+ }
148
+ };
149
+
150
+ var Effect2 = Effect; // deprecated
151
+
152
+ /* ------------- transitions ------------- */
153
+
154
+ Effect.Transitions = {
155
+ linear: Prototype.K,
156
+ sinoidal: function(pos) {
157
+ return (-Math.cos(pos*Math.PI)/2) + 0.5;
158
+ },
159
+ reverse: function(pos) {
160
+ return 1-pos;
161
+ },
162
+ flicker: function(pos) {
163
+ return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
164
+ },
165
+ wobble: function(pos) {
166
+ return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
167
+ },
168
+ pulse: function(pos, pulses) {
169
+ pulses = pulses || 5;
170
+ return (
171
+ Math.round((pos % (1/pulses)) * pulses) == 0 ?
172
+ ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) :
173
+ 1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
174
+ );
175
+ },
176
+ none: function(pos) {
177
+ return 0;
178
+ },
179
+ full: function(pos) {
180
+ return 1;
181
+ }
182
+ };
183
+
184
+ /* ------------- core effects ------------- */
185
+
186
+ Effect.ScopedQueue = Class.create();
187
+ Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
188
+ initialize: function() {
189
+ this.effects = [];
190
+ this.interval = null;
191
+ },
192
+ _each: function(iterator) {
193
+ this.effects._each(iterator);
194
+ },
195
+ add: function(effect) {
196
+ var timestamp = new Date().getTime();
197
+
198
+ var position = (typeof effect.options.queue == 'string') ?
199
+ effect.options.queue : effect.options.queue.position;
200
+
201
+ switch(position) {
202
+ case 'front':
203
+ // move unstarted effects after this effect
204
+ this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
205
+ e.startOn += effect.finishOn;
206
+ e.finishOn += effect.finishOn;
207
+ });
208
+ break;
209
+ case 'with-last':
210
+ timestamp = this.effects.pluck('startOn').max() || timestamp;
211
+ break;
212
+ case 'end':
213
+ // start effect after last queued effect has finished
214
+ timestamp = this.effects.pluck('finishOn').max() || timestamp;
215
+ break;
216
+ }
217
+
218
+ effect.startOn += timestamp;
219
+ effect.finishOn += timestamp;
220
+
221
+ if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
222
+ this.effects.push(effect);
223
+
224
+ if(!this.interval)
225
+ this.interval = setInterval(this.loop.bind(this), 15);
226
+ },
227
+ remove: function(effect) {
228
+ this.effects = this.effects.reject(function(e) { return e==effect });
229
+ if(this.effects.length == 0) {
230
+ clearInterval(this.interval);
231
+ this.interval = null;
232
+ }
233
+ },
234
+ loop: function() {
235
+ var timePos = new Date().getTime();
236
+ for(var i=0, len=this.effects.length;i<len;i++)
237
+ if(this.effects[i]) this.effects[i].loop(timePos);
238
+ }
239
+ });
240
+
241
+ Effect.Queues = {
242
+ instances: $H(),
243
+ get: function(queueName) {
244
+ if(typeof queueName != 'string') return queueName;
245
+
246
+ if(!this.instances[queueName])
247
+ this.instances[queueName] = new Effect.ScopedQueue();
248
+
249
+ return this.instances[queueName];
250
+ }
251
+ }
252
+ Effect.Queue = Effect.Queues.get('global');
253
+
254
+ Effect.DefaultOptions = {
255
+ transition: Effect.Transitions.sinoidal,
256
+ duration: 1.0, // seconds
257
+ fps: 60.0, // max. 60fps due to Effect.Queue implementation
258
+ sync: false, // true for combining
259
+ from: 0.0,
260
+ to: 1.0,
261
+ delay: 0.0,
262
+ queue: 'parallel'
263
+ }
264
+
265
+ Effect.Base = function() {};
266
+ Effect.Base.prototype = {
267
+ position: null,
268
+ start: function(options) {
269
+ this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
270
+ this.currentFrame = 0;
271
+ this.state = 'idle';
272
+ this.startOn = this.options.delay*1000;
273
+ this.finishOn = this.startOn + (this.options.duration*1000);
274
+ this.event('beforeStart');
275
+ if(!this.options.sync)
276
+ Effect.Queues.get(typeof this.options.queue == 'string' ?
277
+ 'global' : this.options.queue.scope).add(this);
278
+ },
279
+ loop: function(timePos) {
280
+ if(timePos >= this.startOn) {
281
+ if(timePos >= this.finishOn) {
282
+ this.render(1.0);
283
+ this.cancel();
284
+ this.event('beforeFinish');
285
+ if(this.finish) this.finish();
286
+ this.event('afterFinish');
287
+ return;
288
+ }
289
+ var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
290
+ var frame = Math.round(pos * this.options.fps * this.options.duration);
291
+ if(frame > this.currentFrame) {
292
+ this.render(pos);
293
+ this.currentFrame = frame;
294
+ }
295
+ }
296
+ },
297
+ render: function(pos) {
298
+ if(this.state == 'idle') {
299
+ this.state = 'running';
300
+ this.event('beforeSetup');
301
+ if(this.setup) this.setup();
302
+ this.event('afterSetup');
303
+ }
304
+ if(this.state == 'running') {
305
+ if(this.options.transition) pos = this.options.transition(pos);
306
+ pos *= (this.options.to-this.options.from);
307
+ pos += this.options.from;
308
+ this.position = pos;
309
+ this.event('beforeUpdate');
310
+ if(this.update) this.update(pos);
311
+ this.event('afterUpdate');
312
+ }
313
+ },
314
+ cancel: function() {
315
+ if(!this.options.sync)
316
+ Effect.Queues.get(typeof this.options.queue == 'string' ?
317
+ 'global' : this.options.queue.scope).remove(this);
318
+ this.state = 'finished';
319
+ },
320
+ event: function(eventName) {
321
+ if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
322
+ if(this.options[eventName]) this.options[eventName](this);
323
+ },
324
+ inspect: function() {
325
+ var data = $H();
326
+ for(property in this)
327
+ if(typeof this[property] != 'function') data[property] = this[property];
328
+ return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
329
+ }
330
+ }
331
+
332
+ Effect.Parallel = Class.create();
333
+ Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
334
+ initialize: function(effects) {
335
+ this.effects = effects || [];
336
+ this.start(arguments[1]);
337
+ },
338
+ update: function(position) {
339
+ this.effects.invoke('render', position);
340
+ },
341
+ finish: function(position) {
342
+ this.effects.each( function(effect) {
343
+ effect.render(1.0);
344
+ effect.cancel();
345
+ effect.event('beforeFinish');
346
+ if(effect.finish) effect.finish(position);
347
+ effect.event('afterFinish');
348
+ });
349
+ }
350
+ });
351
+
352
+ Effect.Event = Class.create();
353
+ Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
354
+ initialize: function() {
355
+ var options = Object.extend({
356
+ duration: 0
357
+ }, arguments[0] || {});
358
+ this.start(options);
359
+ },
360
+ update: Prototype.emptyFunction
361
+ });
362
+
363
+ Effect.Opacity = Class.create();
364
+ Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
365
+ initialize: function(element) {
366
+ this.element = $(element);
367
+ if(!this.element) throw(Effect._elementDoesNotExistError);
368
+ // make this work on IE on elements without 'layout'
369
+ if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
370
+ this.element.setStyle({zoom: 1});
371
+ var options = Object.extend({
372
+ from: this.element.getOpacity() || 0.0,
373
+ to: 1.0
374
+ }, arguments[1] || {});
375
+ this.start(options);
376
+ },
377
+ update: function(position) {
378
+ this.element.setOpacity(position);
379
+ }
380
+ });
381
+
382
+ Effect.Move = Class.create();
383
+ Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
384
+ initialize: function(element) {
385
+ this.element = $(element);
386
+ if(!this.element) throw(Effect._elementDoesNotExistError);
387
+ var options = Object.extend({
388
+ x: 0,
389
+ y: 0,
390
+ mode: 'relative'
391
+ }, arguments[1] || {});
392
+ this.start(options);
393
+ },
394
+ setup: function() {
395
+ // Bug in Opera: Opera returns the "real" position of a static element or
396
+ // relative element that does not have top/left explicitly set.
397
+ // ==> Always set top and left for position relative elements in your stylesheets
398
+ // (to 0 if you do not need them)
399
+ this.element.makePositioned();
400
+ this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
401
+ this.originalTop = parseFloat(this.element.getStyle('top') || '0');
402
+ if(this.options.mode == 'absolute') {
403
+ // absolute movement, so we need to calc deltaX and deltaY
404
+ this.options.x = this.options.x - this.originalLeft;
405
+ this.options.y = this.options.y - this.originalTop;
406
+ }
407
+ },
408
+ update: function(position) {
409
+ this.element.setStyle({
410
+ left: Math.round(this.options.x * position + this.originalLeft) + 'px',
411
+ top: Math.round(this.options.y * position + this.originalTop) + 'px'
412
+ });
413
+ }
414
+ });
415
+
416
+ // for backwards compatibility
417
+ Effect.MoveBy = function(element, toTop, toLeft) {
418
+ return new Effect.Move(element,
419
+ Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
420
+ };
421
+
422
+ Effect.Scale = Class.create();
423
+ Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
424
+ initialize: function(element, percent) {
425
+ this.element = $(element);
426
+ if(!this.element) throw(Effect._elementDoesNotExistError);
427
+ var options = Object.extend({
428
+ scaleX: true,
429
+ scaleY: true,
430
+ scaleContent: true,
431
+ scaleFromCenter: false,
432
+ scaleMode: 'box', // 'box' or 'contents' or {} with provided values
433
+ scaleFrom: 100.0,
434
+ scaleTo: percent
435
+ }, arguments[2] || {});
436
+ this.start(options);
437
+ },
438
+ setup: function() {
439
+ this.restoreAfterFinish = this.options.restoreAfterFinish || false;
440
+ this.elementPositioning = this.element.getStyle('position');
441
+
442
+ this.originalStyle = {};
443
+ ['top','left','width','height','fontSize'].each( function(k) {
444
+ this.originalStyle[k] = this.element.style[k];
445
+ }.bind(this));
446
+
447
+ this.originalTop = this.element.offsetTop;
448
+ this.originalLeft = this.element.offsetLeft;
449
+
450
+ var fontSize = this.element.getStyle('font-size') || '100%';
451
+ ['em','px','%','pt'].each( function(fontSizeType) {
452
+ if(fontSize.indexOf(fontSizeType)>0) {
453
+ this.fontSize = parseFloat(fontSize);
454
+ this.fontSizeType = fontSizeType;
455
+ }
456
+ }.bind(this));
457
+
458
+ this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
459
+
460
+ this.dims = null;
461
+ if(this.options.scaleMode=='box')
462
+ this.dims = [this.element.offsetHeight, this.element.offsetWidth];
463
+ if(/^content/.test(this.options.scaleMode))
464
+ this.dims = [this.element.scrollHeight, this.element.scrollWidth];
465
+ if(!this.dims)
466
+ this.dims = [this.options.scaleMode.originalHeight,
467
+ this.options.scaleMode.originalWidth];
468
+ },
469
+ update: function(position) {
470
+ var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
471
+ if(this.options.scaleContent && this.fontSize)
472
+ this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
473
+ this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
474
+ },
475
+ finish: function(position) {
476
+ if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
477
+ },
478
+ setDimensions: function(height, width) {
479
+ var d = {};
480
+ if(this.options.scaleX) d.width = Math.round(width) + 'px';
481
+ if(this.options.scaleY) d.height = Math.round(height) + 'px';
482
+ if(this.options.scaleFromCenter) {
483
+ var topd = (height - this.dims[0])/2;
484
+ var leftd = (width - this.dims[1])/2;
485
+ if(this.elementPositioning == 'absolute') {
486
+ if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
487
+ if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
488
+ } else {
489
+ if(this.options.scaleY) d.top = -topd + 'px';
490
+ if(this.options.scaleX) d.left = -leftd + 'px';
491
+ }
492
+ }
493
+ this.element.setStyle(d);
494
+ }
495
+ });
496
+
497
+ Effect.Highlight = Class.create();
498
+ Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
499
+ initialize: function(element) {
500
+ this.element = $(element);
501
+ if(!this.element) throw(Effect._elementDoesNotExistError);
502
+ var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
503
+ this.start(options);
504
+ },
505
+ setup: function() {
506
+ // Prevent executing on elements not in the layout flow
507
+ if(this.element.getStyle('display')=='none') { this.cancel(); return; }
508
+ // Disable background image during the effect
509
+ this.oldStyle = {};
510
+ if (!this.options.keepBackgroundImage) {
511
+ this.oldStyle.backgroundImage = this.element.getStyle('background-image');
512
+ this.element.setStyle({backgroundImage: 'none'});
513
+ }
514
+ if(!this.options.endcolor)
515
+ this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
516
+ if(!this.options.restorecolor)
517
+ this.options.restorecolor = this.element.getStyle('background-color');
518
+ // init color calculations
519
+ this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
520
+ this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
521
+ },
522
+ update: function(position) {
523
+ this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
524
+ return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
525
+ },
526
+ finish: function() {
527
+ this.element.setStyle(Object.extend(this.oldStyle, {
528
+ backgroundColor: this.options.restorecolor
529
+ }));
530
+ }
531
+ });
532
+
533
+ Effect.ScrollTo = Class.create();
534
+ Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
535
+ initialize: function(element) {
536
+ this.element = $(element);
537
+ this.start(arguments[1] || {});
538
+ },
539
+ setup: function() {
540
+ Position.prepare();
541
+ var offsets = Position.cumulativeOffset(this.element);
542
+ if(this.options.offset) offsets[1] += this.options.offset;
543
+ var max = window.innerHeight ?
544
+ window.height - window.innerHeight :
545
+ document.body.scrollHeight -
546
+ (document.documentElement.clientHeight ?
547
+ document.documentElement.clientHeight : document.body.clientHeight);
548
+ this.scrollStart = Position.deltaY;
549
+ this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
550
+ },
551
+ update: function(position) {
552
+ Position.prepare();
553
+ window.scrollTo(Position.deltaX,
554
+ this.scrollStart + (position*this.delta));
555
+ }
556
+ });
557
+
558
+ /* ------------- combination effects ------------- */
559
+
560
+ Effect.Fade = function(element) {
561
+ element = $(element);
562
+ var oldOpacity = element.getInlineOpacity();
563
+ var options = Object.extend({
564
+ from: element.getOpacity() || 1.0,
565
+ to: 0.0,
566
+ afterFinishInternal: function(effect) {
567
+ if(effect.options.to!=0) return;
568
+ effect.element.hide().setStyle({opacity: oldOpacity});
569
+ }}, arguments[1] || {});
570
+ return new Effect.Opacity(element,options);
571
+ }
572
+
573
+ Effect.Appear = function(element) {
574
+ element = $(element);
575
+ var options = Object.extend({
576
+ from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
577
+ to: 1.0,
578
+ // force Safari to render floated elements properly
579
+ afterFinishInternal: function(effect) {
580
+ effect.element.forceRerendering();
581
+ },
582
+ beforeSetup: function(effect) {
583
+ effect.element.setOpacity(effect.options.from).show();
584
+ }}, arguments[1] || {});
585
+ return new Effect.Opacity(element,options);
586
+ }
587
+
588
+ Effect.Puff = function(element) {
589
+ element = $(element);
590
+ var oldStyle = {
591
+ opacity: element.getInlineOpacity(),
592
+ position: element.getStyle('position'),
593
+ top: element.style.top,
594
+ left: element.style.left,
595
+ width: element.style.width,
596
+ height: element.style.height
597
+ };
598
+ return new Effect.Parallel(
599
+ [ new Effect.Scale(element, 200,
600
+ { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
601
+ new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
602
+ Object.extend({ duration: 1.0,
603
+ beforeSetupInternal: function(effect) {
604
+ Position.absolutize(effect.effects[0].element)
605
+ },
606
+ afterFinishInternal: function(effect) {
607
+ effect.effects[0].element.hide().setStyle(oldStyle); }
608
+ }, arguments[1] || {})
609
+ );
610
+ }
611
+
612
+ Effect.BlindUp = function(element) {
613
+ element = $(element);
614
+ element.makeClipping();
615
+ return new Effect.Scale(element, 0,
616
+ Object.extend({ scaleContent: false,
617
+ scaleX: false,
618
+ restoreAfterFinish: true,
619
+ afterFinishInternal: function(effect) {
620
+ effect.element.hide().undoClipping();
621
+ }
622
+ }, arguments[1] || {})
623
+ );
624
+ }
625
+
626
+ Effect.BlindDown = function(element) {
627
+ element = $(element);
628
+ var elementDimensions = element.getDimensions();
629
+ return new Effect.Scale(element, 100, Object.extend({
630
+ scaleContent: false,
631
+ scaleX: false,
632
+ scaleFrom: 0,
633
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
634
+ restoreAfterFinish: true,
635
+ afterSetup: function(effect) {
636
+ effect.element.makeClipping().setStyle({height: '0px'}).show();
637
+ },
638
+ afterFinishInternal: function(effect) {
639
+ effect.element.undoClipping();
640
+ }
641
+ }, arguments[1] || {}));
642
+ }
643
+
644
+ Effect.SwitchOff = function(element) {
645
+ element = $(element);
646
+ var oldOpacity = element.getInlineOpacity();
647
+ return new Effect.Appear(element, Object.extend({
648
+ duration: 0.4,
649
+ from: 0,
650
+ transition: Effect.Transitions.flicker,
651
+ afterFinishInternal: function(effect) {
652
+ new Effect.Scale(effect.element, 1, {
653
+ duration: 0.3, scaleFromCenter: true,
654
+ scaleX: false, scaleContent: false, restoreAfterFinish: true,
655
+ beforeSetup: function(effect) {
656
+ effect.element.makePositioned().makeClipping();
657
+ },
658
+ afterFinishInternal: function(effect) {
659
+ effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
660
+ }
661
+ })
662
+ }
663
+ }, arguments[1] || {}));
664
+ }
665
+
666
+ Effect.DropOut = function(element) {
667
+ element = $(element);
668
+ var oldStyle = {
669
+ top: element.getStyle('top'),
670
+ left: element.getStyle('left'),
671
+ opacity: element.getInlineOpacity() };
672
+ return new Effect.Parallel(
673
+ [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
674
+ new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
675
+ Object.extend(
676
+ { duration: 0.5,
677
+ beforeSetup: function(effect) {
678
+ effect.effects[0].element.makePositioned();
679
+ },
680
+ afterFinishInternal: function(effect) {
681
+ effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
682
+ }
683
+ }, arguments[1] || {}));
684
+ }
685
+
686
+ Effect.Shake = function(element) {
687
+ element = $(element);
688
+ var oldStyle = {
689
+ top: element.getStyle('top'),
690
+ left: element.getStyle('left') };
691
+ return new Effect.Move(element,
692
+ { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
693
+ new Effect.Move(effect.element,
694
+ { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
695
+ new Effect.Move(effect.element,
696
+ { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
697
+ new Effect.Move(effect.element,
698
+ { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
699
+ new Effect.Move(effect.element,
700
+ { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
701
+ new Effect.Move(effect.element,
702
+ { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
703
+ effect.element.undoPositioned().setStyle(oldStyle);
704
+ }}) }}) }}) }}) }}) }});
705
+ }
706
+
707
+ Effect.SlideDown = function(element) {
708
+ element = $(element).cleanWhitespace();
709
+ // SlideDown need to have the content of the element wrapped in a container element with fixed height!
710
+ var oldInnerBottom = element.down().getStyle('bottom');
711
+ var elementDimensions = element.getDimensions();
712
+ return new Effect.Scale(element, 100, Object.extend({
713
+ scaleContent: false,
714
+ scaleX: false,
715
+ scaleFrom: window.opera ? 0 : 1,
716
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
717
+ restoreAfterFinish: true,
718
+ afterSetup: function(effect) {
719
+ effect.element.makePositioned();
720
+ effect.element.down().makePositioned();
721
+ if(window.opera) effect.element.setStyle({top: ''});
722
+ effect.element.makeClipping().setStyle({height: '0px'}).show();
723
+ },
724
+ afterUpdateInternal: function(effect) {
725
+ effect.element.down().setStyle({bottom:
726
+ (effect.dims[0] - effect.element.clientHeight) + 'px' });
727
+ },
728
+ afterFinishInternal: function(effect) {
729
+ effect.element.undoClipping().undoPositioned();
730
+ effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
731
+ }, arguments[1] || {})
732
+ );
733
+ }
734
+
735
+ Effect.SlideUp = function(element) {
736
+ element = $(element).cleanWhitespace();
737
+ var oldInnerBottom = element.down().getStyle('bottom');
738
+ return new Effect.Scale(element, window.opera ? 0 : 1,
739
+ Object.extend({ scaleContent: false,
740
+ scaleX: false,
741
+ scaleMode: 'box',
742
+ scaleFrom: 100,
743
+ restoreAfterFinish: true,
744
+ beforeStartInternal: function(effect) {
745
+ effect.element.makePositioned();
746
+ effect.element.down().makePositioned();
747
+ if(window.opera) effect.element.setStyle({top: ''});
748
+ effect.element.makeClipping().show();
749
+ },
750
+ afterUpdateInternal: function(effect) {
751
+ effect.element.down().setStyle({bottom:
752
+ (effect.dims[0] - effect.element.clientHeight) + 'px' });
753
+ },
754
+ afterFinishInternal: function(effect) {
755
+ effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
756
+ effect.element.down().undoPositioned();
757
+ }
758
+ }, arguments[1] || {})
759
+ );
760
+ }
761
+
762
+ // Bug in opera makes the TD containing this element expand for a instance after finish
763
+ Effect.Squish = function(element) {
764
+ return new Effect.Scale(element, window.opera ? 1 : 0, {
765
+ restoreAfterFinish: true,
766
+ beforeSetup: function(effect) {
767
+ effect.element.makeClipping();
768
+ },
769
+ afterFinishInternal: function(effect) {
770
+ effect.element.hide().undoClipping();
771
+ }
772
+ });
773
+ }
774
+
775
+ Effect.Grow = function(element) {
776
+ element = $(element);
777
+ var options = Object.extend({
778
+ direction: 'center',
779
+ moveTransition: Effect.Transitions.sinoidal,
780
+ scaleTransition: Effect.Transitions.sinoidal,
781
+ opacityTransition: Effect.Transitions.full
782
+ }, arguments[1] || {});
783
+ var oldStyle = {
784
+ top: element.style.top,
785
+ left: element.style.left,
786
+ height: element.style.height,
787
+ width: element.style.width,
788
+ opacity: element.getInlineOpacity() };
789
+
790
+ var dims = element.getDimensions();
791
+ var initialMoveX, initialMoveY;
792
+ var moveX, moveY;
793
+
794
+ switch (options.direction) {
795
+ case 'top-left':
796
+ initialMoveX = initialMoveY = moveX = moveY = 0;
797
+ break;
798
+ case 'top-right':
799
+ initialMoveX = dims.width;
800
+ initialMoveY = moveY = 0;
801
+ moveX = -dims.width;
802
+ break;
803
+ case 'bottom-left':
804
+ initialMoveX = moveX = 0;
805
+ initialMoveY = dims.height;
806
+ moveY = -dims.height;
807
+ break;
808
+ case 'bottom-right':
809
+ initialMoveX = dims.width;
810
+ initialMoveY = dims.height;
811
+ moveX = -dims.width;
812
+ moveY = -dims.height;
813
+ break;
814
+ case 'center':
815
+ initialMoveX = dims.width / 2;
816
+ initialMoveY = dims.height / 2;
817
+ moveX = -dims.width / 2;
818
+ moveY = -dims.height / 2;
819
+ break;
820
+ }
821
+
822
+ return new Effect.Move(element, {
823
+ x: initialMoveX,
824
+ y: initialMoveY,
825
+ duration: 0.01,
826
+ beforeSetup: function(effect) {
827
+ effect.element.hide().makeClipping().makePositioned();
828
+ },
829
+ afterFinishInternal: function(effect) {
830
+ new Effect.Parallel(
831
+ [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
832
+ new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
833
+ new Effect.Scale(effect.element, 100, {
834
+ scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
835
+ sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
836
+ ], Object.extend({
837
+ beforeSetup: function(effect) {
838
+ effect.effects[0].element.setStyle({height: '0px'}).show();
839
+ },
840
+ afterFinishInternal: function(effect) {
841
+ effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
842
+ }
843
+ }, options)
844
+ )
845
+ }
846
+ });
847
+ }
848
+
849
+ Effect.Shrink = function(element) {
850
+ element = $(element);
851
+ var options = Object.extend({
852
+ direction: 'center',
853
+ moveTransition: Effect.Transitions.sinoidal,
854
+ scaleTransition: Effect.Transitions.sinoidal,
855
+ opacityTransition: Effect.Transitions.none
856
+ }, arguments[1] || {});
857
+ var oldStyle = {
858
+ top: element.style.top,
859
+ left: element.style.left,
860
+ height: element.style.height,
861
+ width: element.style.width,
862
+ opacity: element.getInlineOpacity() };
863
+
864
+ var dims = element.getDimensions();
865
+ var moveX, moveY;
866
+
867
+ switch (options.direction) {
868
+ case 'top-left':
869
+ moveX = moveY = 0;
870
+ break;
871
+ case 'top-right':
872
+ moveX = dims.width;
873
+ moveY = 0;
874
+ break;
875
+ case 'bottom-left':
876
+ moveX = 0;
877
+ moveY = dims.height;
878
+ break;
879
+ case 'bottom-right':
880
+ moveX = dims.width;
881
+ moveY = dims.height;
882
+ break;
883
+ case 'center':
884
+ moveX = dims.width / 2;
885
+ moveY = dims.height / 2;
886
+ break;
887
+ }
888
+
889
+ return new Effect.Parallel(
890
+ [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
891
+ new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
892
+ new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
893
+ ], Object.extend({
894
+ beforeStartInternal: function(effect) {
895
+ effect.effects[0].element.makePositioned().makeClipping();
896
+ },
897
+ afterFinishInternal: function(effect) {
898
+ effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
899
+ }, options)
900
+ );
901
+ }
902
+
903
+ Effect.Pulsate = function(element) {
904
+ element = $(element);
905
+ var options = arguments[1] || {};
906
+ var oldOpacity = element.getInlineOpacity();
907
+ var transition = options.transition || Effect.Transitions.sinoidal;
908
+ var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
909
+ reverser.bind(transition);
910
+ return new Effect.Opacity(element,
911
+ Object.extend(Object.extend({ duration: 2.0, from: 0,
912
+ afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
913
+ }, options), {transition: reverser}));
914
+ }
915
+
916
+ Effect.Fold = function(element) {
917
+ element = $(element);
918
+ var oldStyle = {
919
+ top: element.style.top,
920
+ left: element.style.left,
921
+ width: element.style.width,
922
+ height: element.style.height };
923
+ element.makeClipping();
924
+ return new Effect.Scale(element, 5, Object.extend({
925
+ scaleContent: false,
926
+ scaleX: false,
927
+ afterFinishInternal: function(effect) {
928
+ new Effect.Scale(element, 1, {
929
+ scaleContent: false,
930
+ scaleY: false,
931
+ afterFinishInternal: function(effect) {
932
+ effect.element.hide().undoClipping().setStyle(oldStyle);
933
+ } });
934
+ }}, arguments[1] || {}));
935
+ };
936
+
937
+ Effect.Morph = Class.create();
938
+ Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
939
+ initialize: function(element) {
940
+ this.element = $(element);
941
+ if(!this.element) throw(Effect._elementDoesNotExistError);
942
+ var options = Object.extend({
943
+ style: {}
944
+ }, arguments[1] || {});
945
+ if (typeof options.style == 'string') {
946
+ if(options.style.indexOf(':') == -1) {
947
+ var cssText = '', selector = '.' + options.style;
948
+ $A(document.styleSheets).reverse().each(function(styleSheet) {
949
+ if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
950
+ else if (styleSheet.rules) cssRules = styleSheet.rules;
951
+ $A(cssRules).reverse().each(function(rule) {
952
+ if (selector == rule.selectorText) {
953
+ cssText = rule.style.cssText;
954
+ throw $break;
955
+ }
956
+ });
957
+ if (cssText) throw $break;
958
+ });
959
+ this.style = cssText.parseStyle();
960
+ options.afterFinishInternal = function(effect){
961
+ effect.element.addClassName(effect.options.style);
962
+ effect.transforms.each(function(transform) {
963
+ if(transform.style != 'opacity')
964
+ effect.element.style[transform.style.camelize()] = '';
965
+ });
966
+ }
967
+ } else this.style = options.style.parseStyle();
968
+ } else this.style = $H(options.style)
969
+ this.start(options);
970
+ },
971
+ setup: function(){
972
+ function parseColor(color){
973
+ if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
974
+ color = color.parseColor();
975
+ return $R(0,2).map(function(i){
976
+ return parseInt( color.slice(i*2+1,i*2+3), 16 )
977
+ });
978
+ }
979
+ this.transforms = this.style.map(function(pair){
980
+ var property = pair[0].underscore().dasherize(), value = pair[1], unit = null;
981
+
982
+ if(value.parseColor('#zzzzzz') != '#zzzzzz') {
983
+ value = value.parseColor();
984
+ unit = 'color';
985
+ } else if(property == 'opacity') {
986
+ value = parseFloat(value);
987
+ if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
988
+ this.element.setStyle({zoom: 1});
989
+ } else if(Element.CSS_LENGTH.test(value))
990
+ var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/),
991
+ value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;
992
+
993
+ var originalValue = this.element.getStyle(property);
994
+ return $H({
995
+ style: property,
996
+ originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
997
+ targetValue: unit=='color' ? parseColor(value) : value,
998
+ unit: unit
999
+ });
1000
+ }.bind(this)).reject(function(transform){
1001
+ return (
1002
+ (transform.originalValue == transform.targetValue) ||
1003
+ (
1004
+ transform.unit != 'color' &&
1005
+ (isNaN(transform.originalValue) || isNaN(transform.targetValue))
1006
+ )
1007
+ )
1008
+ });
1009
+ },
1010
+ update: function(position) {
1011
+ var style = $H(), value = null;
1012
+ this.transforms.each(function(transform){
1013
+ value = transform.unit=='color' ?
1014
+ $R(0,2).inject('#',function(m,v,i){
1015
+ return m+(Math.round(transform.originalValue[i]+
1016
+ (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) :
1017
+ transform.originalValue + Math.round(
1018
+ ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
1019
+ style[transform.style] = value;
1020
+ });
1021
+ this.element.setStyle(style);
1022
+ }
1023
+ });
1024
+
1025
+ Effect.Transform = Class.create();
1026
+ Object.extend(Effect.Transform.prototype, {
1027
+ initialize: function(tracks){
1028
+ this.tracks = [];
1029
+ this.options = arguments[1] || {};
1030
+ this.addTracks(tracks);
1031
+ },
1032
+ addTracks: function(tracks){
1033
+ tracks.each(function(track){
1034
+ var data = $H(track).values().first();
1035
+ this.tracks.push($H({
1036
+ ids: $H(track).keys().first(),
1037
+ effect: Effect.Morph,
1038
+ options: { style: data }
1039
+ }));
1040
+ }.bind(this));
1041
+ return this;
1042
+ },
1043
+ play: function(){
1044
+ return new Effect.Parallel(
1045
+ this.tracks.map(function(track){
1046
+ var elements = [$(track.ids) || $$(track.ids)].flatten();
1047
+ return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
1048
+ }).flatten(),
1049
+ this.options
1050
+ );
1051
+ }
1052
+ });
1053
+
1054
+ Element.CSS_PROPERTIES = $w(
1055
+ 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
1056
+ 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
1057
+ 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
1058
+ 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
1059
+ 'fontSize fontWeight height left letterSpacing lineHeight ' +
1060
+ 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
1061
+ 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
1062
+ 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
1063
+ 'right textIndent top width wordSpacing zIndex');
1064
+
1065
+ Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
1066
+
1067
+ String.prototype.parseStyle = function(){
1068
+ var element = Element.extend(document.createElement('div'));
1069
+ element.innerHTML = '<div style="' + this + '"></div>';
1070
+ var style = element.down().style, styleRules = $H();
1071
+
1072
+ Element.CSS_PROPERTIES.each(function(property){
1073
+ if(style[property]) styleRules[property] = style[property];
1074
+ });
1075
+ if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) {
1076
+ styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
1077
+ }
1078
+ return styleRules;
1079
+ };
1080
+
1081
+ Element.morph = function(element, style) {
1082
+ new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
1083
+ return element;
1084
+ };
1085
+
1086
+ ['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
1087
+ 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each(
1088
+ function(f) { Element.Methods[f] = Element[f]; }
1089
+ );
1090
+
1091
+ Element.Methods.visualEffect = function(element, effect, options) {
1092
+ s = effect.gsub(/_/, '-').camelize();
1093
+ effect_class = s.charAt(0).toUpperCase() + s.substring(1);
1094
+ new Effect[effect_class](element, options);
1095
+ return $(element);
1096
+ };
1097
+
1098
+ Element.addMethods();