roda-component 0.0.10 → 0.1.0

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 (692) hide show
  1. checksums.yaml +4 -4
  2. data/.gems +3 -0
  3. data/.gitignore +2 -1
  4. data/.ruby-version +1 -1
  5. data/Gemfile +13 -0
  6. data/Makefile +18 -23
  7. data/Rakefile +0 -1
  8. data/lib/roda/component.rb +98 -44
  9. data/lib/roda/component/dom.rb +27 -17
  10. data/lib/roda/component/events.rb +58 -19
  11. data/lib/roda/component/faye.rb +131 -34
  12. data/lib/roda/component/form.rb +64 -0
  13. data/lib/roda/component/form/validations.rb +204 -0
  14. data/lib/roda/component/version.rb +1 -1
  15. data/lib/roda/plugins/component.rb +54 -24
  16. data/roda-component.gemspec +17 -7
  17. data/test/component_test.rb +20 -5
  18. data/test/dummy/.bowerrc +3 -0
  19. data/test/dummy/.sass-cache/00f9c07200bf85fc7effbdcbe3ee44551cdb2ce5/login.scssc +0 -0
  20. data/test/dummy/app.rb +99 -9
  21. data/test/dummy/bower.json +21 -0
  22. data/test/dummy/components/chat.rb +50 -0
  23. data/test/dummy/components/forms/login.rb +20 -0
  24. data/test/dummy/components/layout.rb +22 -2
  25. data/test/dummy/components/login.rb +123 -0
  26. data/test/dummy/components/theme.rb +89 -0
  27. data/test/dummy/config.ru +18 -0
  28. data/test/dummy/constants.rb +3 -0
  29. data/test/dummy/dummy.db +0 -0
  30. data/test/dummy/models/user.rb +20 -0
  31. data/test/dummy/public/AdminLTE-master/.gitignore +2 -0
  32. data/test/dummy/public/AdminLTE-master/LICENSE +20 -0
  33. data/test/dummy/public/AdminLTE-master/README.md +104 -0
  34. data/test/dummy/public/AdminLTE-master/ajax/dashboard-boxrefresh-demo.php +64 -0
  35. data/test/dummy/public/AdminLTE-master/composer.json +24 -0
  36. data/test/dummy/public/AdminLTE-master/css/AdminLTE.css +3539 -0
  37. data/test/dummy/public/AdminLTE-master/css/bootstrap-slider/slider.css +169 -0
  38. data/test/dummy/public/AdminLTE-master/css/bootstrap-wysihtml5/bootstrap3-wysihtml5.css +102 -0
  39. data/test/dummy/public/AdminLTE-master/css/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css +3 -0
  40. data/test/dummy/public/AdminLTE-master/css/colorpicker/bootstrap-colorpicker.css +214 -0
  41. data/test/dummy/public/AdminLTE-master/css/colorpicker/bootstrap-colorpicker.min.css +9 -0
  42. data/test/dummy/public/AdminLTE-master/css/datatables/dataTables.bootstrap.css +223 -0
  43. data/test/dummy/public/AdminLTE-master/css/datatables/images/sort_asc.png +0 -0
  44. data/test/dummy/public/AdminLTE-master/css/datatables/images/sort_asc_disabled.png +0 -0
  45. data/test/dummy/public/AdminLTE-master/css/datatables/images/sort_both.png +0 -0
  46. data/test/dummy/public/AdminLTE-master/css/datatables/images/sort_desc.png +0 -0
  47. data/test/dummy/public/AdminLTE-master/css/datatables/images/sort_desc_disabled.png +0 -0
  48. data/test/dummy/public/AdminLTE-master/css/datepicker/datepicker3.css +790 -0
  49. data/test/dummy/public/AdminLTE-master/css/daterangepicker/daterangepicker-bs3.css +245 -0
  50. data/test/dummy/public/AdminLTE-master/css/iCheck/all.css +61 -0
  51. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/_all.css +560 -0
  52. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/aero.css +56 -0
  53. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/aero.png +0 -0
  54. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/aero@2x.png +0 -0
  55. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/blue.css +56 -0
  56. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/blue.png +0 -0
  57. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/blue@2x.png +0 -0
  58. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/flat.css +56 -0
  59. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/flat.png +0 -0
  60. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/flat@2x.png +0 -0
  61. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/green.css +56 -0
  62. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/green.png +0 -0
  63. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/green@2x.png +0 -0
  64. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/grey.css +56 -0
  65. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/grey.png +0 -0
  66. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/grey@2x.png +0 -0
  67. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/orange.css +56 -0
  68. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/orange.png +0 -0
  69. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/orange@2x.png +0 -0
  70. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/pink.css +56 -0
  71. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/pink.png +0 -0
  72. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/pink@2x.png +0 -0
  73. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/purple.css +56 -0
  74. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/purple.png +0 -0
  75. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/purple@2x.png +0 -0
  76. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/red.css +56 -0
  77. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/red.png +0 -0
  78. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/red@2x.png +0 -0
  79. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/yellow.css +56 -0
  80. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/yellow.png +0 -0
  81. data/test/dummy/public/AdminLTE-master/css/iCheck/flat/yellow@2x.png +0 -0
  82. data/test/dummy/public/AdminLTE-master/css/iCheck/futurico/futurico.css +56 -0
  83. data/test/dummy/public/AdminLTE-master/css/iCheck/futurico/futurico.png +0 -0
  84. data/test/dummy/public/AdminLTE-master/css/iCheck/futurico/futurico@2x.png +0 -0
  85. data/test/dummy/public/AdminLTE-master/css/iCheck/line/_all.css +740 -0
  86. data/test/dummy/public/AdminLTE-master/css/iCheck/line/aero.css +74 -0
  87. data/test/dummy/public/AdminLTE-master/css/iCheck/line/blue.css +74 -0
  88. data/test/dummy/public/AdminLTE-master/css/iCheck/line/green.css +74 -0
  89. data/test/dummy/public/AdminLTE-master/css/iCheck/line/grey.css +74 -0
  90. data/test/dummy/public/AdminLTE-master/css/iCheck/line/line.css +74 -0
  91. data/test/dummy/public/AdminLTE-master/css/iCheck/line/line.png +0 -0
  92. data/test/dummy/public/AdminLTE-master/css/iCheck/line/line@2x.png +0 -0
  93. data/test/dummy/public/AdminLTE-master/css/iCheck/line/orange.css +74 -0
  94. data/test/dummy/public/AdminLTE-master/css/iCheck/line/pink.css +74 -0
  95. data/test/dummy/public/AdminLTE-master/css/iCheck/line/purple.css +74 -0
  96. data/test/dummy/public/AdminLTE-master/css/iCheck/line/red.css +74 -0
  97. data/test/dummy/public/AdminLTE-master/css/iCheck/line/yellow.css +74 -0
  98. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/_all.css +557 -0
  99. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/aero.css +62 -0
  100. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/aero.png +0 -0
  101. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/aero@2x.png +0 -0
  102. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/blue.css +62 -0
  103. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/blue.png +0 -0
  104. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/blue@2x.png +0 -0
  105. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/green.css +62 -0
  106. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/green.png +0 -0
  107. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/green@2x.png +0 -0
  108. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/grey.css +62 -0
  109. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/grey.png +0 -0
  110. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/grey@2x.png +0 -0
  111. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/minimal.css +62 -0
  112. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/minimal.png +0 -0
  113. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/minimal@2x.png +0 -0
  114. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/orange.css +62 -0
  115. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/orange.png +0 -0
  116. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/orange@2x.png +0 -0
  117. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/pink.css +62 -0
  118. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/pink.png +0 -0
  119. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/pink@2x.png +0 -0
  120. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/purple.css +62 -0
  121. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/purple.png +0 -0
  122. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/purple@2x.png +0 -0
  123. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/red.css +62 -0
  124. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/red.png +0 -0
  125. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/red@2x.png +0 -0
  126. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/yellow.css +62 -0
  127. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/yellow.png +0 -0
  128. data/test/dummy/public/AdminLTE-master/css/iCheck/minimal/yellow@2x.png +0 -0
  129. data/test/dummy/public/AdminLTE-master/css/iCheck/polaris/polaris.css +62 -0
  130. data/test/dummy/public/AdminLTE-master/css/iCheck/polaris/polaris.png +0 -0
  131. data/test/dummy/public/AdminLTE-master/css/iCheck/polaris/polaris@2x.png +0 -0
  132. data/test/dummy/public/AdminLTE-master/css/iCheck/square/_all.css +620 -0
  133. data/test/dummy/public/AdminLTE-master/css/iCheck/square/aero.css +62 -0
  134. data/test/dummy/public/AdminLTE-master/css/iCheck/square/aero.png +0 -0
  135. data/test/dummy/public/AdminLTE-master/css/iCheck/square/aero@2x.png +0 -0
  136. data/test/dummy/public/AdminLTE-master/css/iCheck/square/blue.css +62 -0
  137. data/test/dummy/public/AdminLTE-master/css/iCheck/square/blue.png +0 -0
  138. data/test/dummy/public/AdminLTE-master/css/iCheck/square/blue@2x.png +0 -0
  139. data/test/dummy/public/AdminLTE-master/css/iCheck/square/green.css +62 -0
  140. data/test/dummy/public/AdminLTE-master/css/iCheck/square/green.png +0 -0
  141. data/test/dummy/public/AdminLTE-master/css/iCheck/square/green@2x.png +0 -0
  142. data/test/dummy/public/AdminLTE-master/css/iCheck/square/grey.css +62 -0
  143. data/test/dummy/public/AdminLTE-master/css/iCheck/square/grey.png +0 -0
  144. data/test/dummy/public/AdminLTE-master/css/iCheck/square/grey@2x.png +0 -0
  145. data/test/dummy/public/AdminLTE-master/css/iCheck/square/orange.css +62 -0
  146. data/test/dummy/public/AdminLTE-master/css/iCheck/square/orange.png +0 -0
  147. data/test/dummy/public/AdminLTE-master/css/iCheck/square/orange@2x.png +0 -0
  148. data/test/dummy/public/AdminLTE-master/css/iCheck/square/pink.css +62 -0
  149. data/test/dummy/public/AdminLTE-master/css/iCheck/square/pink.png +0 -0
  150. data/test/dummy/public/AdminLTE-master/css/iCheck/square/pink@2x.png +0 -0
  151. data/test/dummy/public/AdminLTE-master/css/iCheck/square/purple.css +62 -0
  152. data/test/dummy/public/AdminLTE-master/css/iCheck/square/purple.png +0 -0
  153. data/test/dummy/public/AdminLTE-master/css/iCheck/square/purple@2x.png +0 -0
  154. data/test/dummy/public/AdminLTE-master/css/iCheck/square/red.css +62 -0
  155. data/test/dummy/public/AdminLTE-master/css/iCheck/square/red.png +0 -0
  156. data/test/dummy/public/AdminLTE-master/css/iCheck/square/red@2x.png +0 -0
  157. data/test/dummy/public/AdminLTE-master/css/iCheck/square/square.css +62 -0
  158. data/test/dummy/public/AdminLTE-master/css/iCheck/square/square.png +0 -0
  159. data/test/dummy/public/AdminLTE-master/css/iCheck/square/square@2x.png +0 -0
  160. data/test/dummy/public/AdminLTE-master/css/iCheck/square/yellow.css +62 -0
  161. data/test/dummy/public/AdminLTE-master/css/iCheck/square/yellow.png +0 -0
  162. data/test/dummy/public/AdminLTE-master/css/iCheck/square/yellow@2x.png +0 -0
  163. data/test/dummy/public/AdminLTE-master/css/images/animated-overlay.gif +0 -0
  164. data/test/dummy/public/AdminLTE-master/css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  165. data/test/dummy/public/AdminLTE-master/css/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
  166. data/test/dummy/public/AdminLTE-master/css/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
  167. data/test/dummy/public/AdminLTE-master/css/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
  168. data/test/dummy/public/AdminLTE-master/css/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  169. data/test/dummy/public/AdminLTE-master/css/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  170. data/test/dummy/public/AdminLTE-master/css/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
  171. data/test/dummy/public/AdminLTE-master/css/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  172. data/test/dummy/public/AdminLTE-master/css/images/ui-icons_217bc0_256x240.png +0 -0
  173. data/test/dummy/public/AdminLTE-master/css/images/ui-icons_2e83ff_256x240.png +0 -0
  174. data/test/dummy/public/AdminLTE-master/css/images/ui-icons_469bdd_256x240.png +0 -0
  175. data/test/dummy/public/AdminLTE-master/css/images/ui-icons_6da8d5_256x240.png +0 -0
  176. data/test/dummy/public/AdminLTE-master/css/images/ui-icons_cd0a0a_256x240.png +0 -0
  177. data/test/dummy/public/AdminLTE-master/css/images/ui-icons_d8e7f3_256x240.png +0 -0
  178. data/test/dummy/public/AdminLTE-master/css/images/ui-icons_f9bd01_256x240.png +0 -0
  179. data/test/dummy/public/AdminLTE-master/css/ionslider/ion.rangeSlider.css +126 -0
  180. data/test/dummy/public/AdminLTE-master/css/ionslider/ion.rangeSlider.skinFlat.css +89 -0
  181. data/test/dummy/public/AdminLTE-master/css/ionslider/ion.rangeSlider.skinNice.css +85 -0
  182. data/test/dummy/public/AdminLTE-master/css/jvectormap/jquery-jvectormap-1.2.2.css +36 -0
  183. data/test/dummy/public/AdminLTE-master/css/morris/morris.css +2 -0
  184. data/test/dummy/public/AdminLTE-master/css/timepicker/bootstrap-timepicker.css +121 -0
  185. data/test/dummy/public/AdminLTE-master/css/timepicker/bootstrap-timepicker.min.css +10 -0
  186. data/test/dummy/public/AdminLTE-master/empty.html +417 -0
  187. data/test/dummy/public/AdminLTE-master/fonts/glyphicons-halflings-regular.eot +0 -0
  188. data/test/dummy/public/AdminLTE-master/fonts/glyphicons-halflings-regular.svg +229 -0
  189. data/test/dummy/public/AdminLTE-master/fonts/glyphicons-halflings-regular.ttf +0 -0
  190. data/test/dummy/public/AdminLTE-master/fonts/glyphicons-halflings-regular.woff +0 -0
  191. data/test/dummy/public/AdminLTE-master/img/ajax-loader.gif +0 -0
  192. data/test/dummy/public/AdminLTE-master/img/ajax-loader1.gif +0 -0
  193. data/test/dummy/public/AdminLTE-master/img/avatar.png +0 -0
  194. data/test/dummy/public/AdminLTE-master/img/avatar04.png +0 -0
  195. data/test/dummy/public/AdminLTE-master/img/avatar2.png +0 -0
  196. data/test/dummy/public/AdminLTE-master/img/avatar3.png +0 -0
  197. data/test/dummy/public/AdminLTE-master/img/avatar5.png +0 -0
  198. data/test/dummy/public/AdminLTE-master/img/blur-background04.jpg +0 -0
  199. data/test/dummy/public/AdminLTE-master/img/blur-background08.jpg +0 -0
  200. data/test/dummy/public/AdminLTE-master/img/blur-background09.jpg +0 -0
  201. data/test/dummy/public/AdminLTE-master/img/bootstrap-colorpicker/alpha-horizontal.png +0 -0
  202. data/test/dummy/public/AdminLTE-master/img/bootstrap-colorpicker/alpha.png +0 -0
  203. data/test/dummy/public/AdminLTE-master/img/bootstrap-colorpicker/hue-horizontal.png +0 -0
  204. data/test/dummy/public/AdminLTE-master/img/bootstrap-colorpicker/hue.png +0 -0
  205. data/test/dummy/public/AdminLTE-master/img/bootstrap-colorpicker/saturation.png +0 -0
  206. data/test/dummy/public/AdminLTE-master/img/credit/american-express.png +0 -0
  207. data/test/dummy/public/AdminLTE-master/img/credit/cirrus.png +0 -0
  208. data/test/dummy/public/AdminLTE-master/img/credit/mastercard.png +0 -0
  209. data/test/dummy/public/AdminLTE-master/img/credit/mestro.png +0 -0
  210. data/test/dummy/public/AdminLTE-master/img/credit/paypal.png +0 -0
  211. data/test/dummy/public/AdminLTE-master/img/credit/paypal2.png +0 -0
  212. data/test/dummy/public/AdminLTE-master/img/credit/visa.png +0 -0
  213. data/test/dummy/public/AdminLTE-master/img/icons.png +0 -0
  214. data/test/dummy/public/AdminLTE-master/img/sprite-skin-flat.png +0 -0
  215. data/test/dummy/public/AdminLTE-master/img/sprite-skin-nice.png +0 -0
  216. data/test/dummy/public/AdminLTE-master/img/user-bg.png +0 -0
  217. data/test/dummy/public/AdminLTE-master/img/user.jpg +0 -0
  218. data/test/dummy/public/AdminLTE-master/img/user2.jpg +0 -0
  219. data/test/dummy/public/AdminLTE-master/index.html +900 -0
  220. data/test/dummy/public/AdminLTE-master/js/AdminLTE/app.js +1054 -0
  221. data/test/dummy/public/AdminLTE-master/js/AdminLTE/dashboard.js +252 -0
  222. data/test/dummy/public/AdminLTE-master/js/AdminLTE/demo.js +81 -0
  223. data/test/dummy/public/AdminLTE-master/js/plugins/bootstrap-slider/bootstrap-slider.js +1167 -0
  224. data/test/dummy/public/AdminLTE-master/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js +6 -0
  225. data/test/dummy/public/AdminLTE-master/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.js +350 -0
  226. data/test/dummy/public/AdminLTE-master/js/plugins/colorpicker/bootstrap-colorpicker.js +949 -0
  227. data/test/dummy/public/AdminLTE-master/js/plugins/colorpicker/bootstrap-colorpicker.min.js +1 -0
  228. data/test/dummy/public/AdminLTE-master/js/plugins/datatables/dataTables.bootstrap.js +250 -0
  229. data/test/dummy/public/AdminLTE-master/js/plugins/datatables/jquery.dataTables.js +12099 -0
  230. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/bootstrap-datepicker.js +1671 -0
  231. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.ar.js +15 -0
  232. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.az.js +12 -0
  233. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.bg.js +14 -0
  234. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.ca.js +14 -0
  235. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.cs.js +15 -0
  236. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.cy.js +14 -0
  237. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.da.js +15 -0
  238. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.de.js +17 -0
  239. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.el.js +13 -0
  240. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.es.js +14 -0
  241. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.et.js +18 -0
  242. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.fa.js +17 -0
  243. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.fi.js +16 -0
  244. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.fr.js +17 -0
  245. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.gl.js +11 -0
  246. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.he.js +15 -0
  247. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.hr.js +13 -0
  248. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.hu.js +16 -0
  249. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.id.js +15 -0
  250. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.is.js +14 -0
  251. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.it.js +17 -0
  252. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.ja.js +15 -0
  253. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.ka.js +17 -0
  254. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.kk.js +15 -0
  255. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.kr.js +13 -0
  256. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.lt.js +16 -0
  257. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.lv.js +16 -0
  258. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.mk.js +15 -0
  259. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.ms.js +14 -0
  260. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.nb.js +14 -0
  261. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js +17 -0
  262. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.nl.js +14 -0
  263. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.no.js +16 -0
  264. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.pl.js +15 -0
  265. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.pt-BR.js +15 -0
  266. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.pt.js +16 -0
  267. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.ro.js +16 -0
  268. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.rs-latin.js +14 -0
  269. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.rs.js +14 -0
  270. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.ru.js +15 -0
  271. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.sk.js +15 -0
  272. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.sl.js +14 -0
  273. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.sq.js +15 -0
  274. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.sv.js +16 -0
  275. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.sw.js +15 -0
  276. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.th.js +14 -0
  277. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.tr.js +16 -0
  278. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.ua.js +15 -0
  279. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.vi.js +16 -0
  280. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js +16 -0
  281. data/test/dummy/public/AdminLTE-master/js/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js +17 -0
  282. data/test/dummy/public/AdminLTE-master/js/plugins/daterangepicker/daterangepicker.js +883 -0
  283. data/test/dummy/public/AdminLTE-master/js/plugins/flot/excanvas.js +1428 -0
  284. data/test/dummy/public/AdminLTE-master/js/plugins/flot/excanvas.min.js +1 -0
  285. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.colorhelpers.js +180 -0
  286. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.colorhelpers.min.js +1 -0
  287. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.canvas.js +345 -0
  288. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.canvas.min.js +1 -0
  289. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.categories.js +190 -0
  290. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.categories.min.js +1 -0
  291. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.crosshair.js +176 -0
  292. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.crosshair.min.js +1 -0
  293. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.errorbars.js +353 -0
  294. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.errorbars.min.js +1 -0
  295. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.fillbetween.js +226 -0
  296. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.fillbetween.min.js +1 -0
  297. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.image.js +241 -0
  298. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.image.min.js +1 -0
  299. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.js +3137 -0
  300. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.min.js +2 -0
  301. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.navigate.js +346 -0
  302. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.navigate.min.js +1 -0
  303. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.pie.js +817 -0
  304. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.pie.min.js +1 -0
  305. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.resize.js +60 -0
  306. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.resize.min.js +1 -0
  307. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.selection.js +360 -0
  308. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.selection.min.js +1 -0
  309. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.stack.js +188 -0
  310. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.stack.min.js +1 -0
  311. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.symbol.js +71 -0
  312. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.symbol.min.js +1 -0
  313. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.threshold.js +142 -0
  314. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.threshold.min.js +1 -0
  315. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.time.js +431 -0
  316. data/test/dummy/public/AdminLTE-master/js/plugins/flot/jquery.flot.time.min.js +1 -0
  317. data/test/dummy/public/AdminLTE-master/js/plugins/iCheck/icheck.js +506 -0
  318. data/test/dummy/public/AdminLTE-master/js/plugins/iCheck/icheck.min.js +10 -0
  319. data/test/dummy/public/AdminLTE-master/js/plugins/input-mask/jquery.inputmask.date.extensions.js +488 -0
  320. data/test/dummy/public/AdminLTE-master/js/plugins/input-mask/jquery.inputmask.extensions.js +122 -0
  321. data/test/dummy/public/AdminLTE-master/js/plugins/input-mask/jquery.inputmask.js +1632 -0
  322. data/test/dummy/public/AdminLTE-master/js/plugins/input-mask/jquery.inputmask.numeric.extensions.js +177 -0
  323. data/test/dummy/public/AdminLTE-master/js/plugins/input-mask/jquery.inputmask.phone.extensions.js +50 -0
  324. data/test/dummy/public/AdminLTE-master/js/plugins/input-mask/jquery.inputmask.regex.extensions.js +170 -0
  325. data/test/dummy/public/AdminLTE-master/js/plugins/input-mask/phone-codes/phone-be.json +45 -0
  326. data/test/dummy/public/AdminLTE-master/js/plugins/input-mask/phone-codes/phone-codes.json +294 -0
  327. data/test/dummy/public/AdminLTE-master/js/plugins/input-mask/phone-codes/readme.txt +1 -0
  328. data/test/dummy/public/AdminLTE-master/js/plugins/ionslider/ion.rangeSlider.min.js +22 -0
  329. data/test/dummy/public/AdminLTE-master/js/plugins/jqueryKnob/jquery.knob.js +764 -0
  330. data/test/dummy/public/AdminLTE-master/js/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js +8 -0
  331. data/test/dummy/public/AdminLTE-master/js/plugins/jvectormap/jquery-jvectormap-world-mill-en.js +1 -0
  332. data/test/dummy/public/AdminLTE-master/js/plugins/misc/html5shiv.js +8 -0
  333. data/test/dummy/public/AdminLTE-master/js/plugins/misc/jquery.ba-resize.min.js +9 -0
  334. data/test/dummy/public/AdminLTE-master/js/plugins/misc/jquery.placeholder.js +187 -0
  335. data/test/dummy/public/AdminLTE-master/js/plugins/misc/modernizr.min.js +4 -0
  336. data/test/dummy/public/AdminLTE-master/js/plugins/misc/respond.min.js +1 -0
  337. data/test/dummy/public/AdminLTE-master/js/plugins/morris/morris.js +1888 -0
  338. data/test/dummy/public/AdminLTE-master/js/plugins/morris/morris.min.js +2 -0
  339. data/test/dummy/public/AdminLTE-master/js/plugins/slimScroll/jquery.slimscroll.js +464 -0
  340. data/test/dummy/public/AdminLTE-master/js/plugins/slimScroll/jquery.slimscroll.min.js +16 -0
  341. data/test/dummy/public/AdminLTE-master/js/plugins/slimScroll/slimScroll.jquery.json +30 -0
  342. data/test/dummy/public/AdminLTE-master/js/plugins/sparkline/jquery.sparkline.js +3054 -0
  343. data/test/dummy/public/AdminLTE-master/js/plugins/sparkline/jquery.sparkline.min.js +5 -0
  344. data/test/dummy/public/AdminLTE-master/js/plugins/timepicker/bootstrap-timepicker.js +903 -0
  345. data/test/dummy/public/AdminLTE-master/js/plugins/timepicker/bootstrap-timepicker.min.js +5 -0
  346. data/test/dummy/public/AdminLTE-master/less/404_500_errors.less +38 -0
  347. data/test/dummy/public/AdminLTE-master/less/AdminLTE.less +49 -0
  348. data/test/dummy/public/AdminLTE-master/less/alerts.less +25 -0
  349. data/test/dummy/public/AdminLTE-master/less/bootstrap-social.less +167 -0
  350. data/test/dummy/public/AdminLTE-master/less/boxes.less +396 -0
  351. data/test/dummy/public/AdminLTE-master/less/buttons.less +179 -0
  352. data/test/dummy/public/AdminLTE-master/less/callout.less +49 -0
  353. data/test/dummy/public/AdminLTE-master/less/core.less +422 -0
  354. data/test/dummy/public/AdminLTE-master/less/dropdown.less +392 -0
  355. data/test/dummy/public/AdminLTE-master/less/forms.less +73 -0
  356. data/test/dummy/public/AdminLTE-master/less/header.less +191 -0
  357. data/test/dummy/public/AdminLTE-master/less/iCheck.less +70 -0
  358. data/test/dummy/public/AdminLTE-master/less/invoice.less +38 -0
  359. data/test/dummy/public/AdminLTE-master/less/lockscreen.less +86 -0
  360. data/test/dummy/public/AdminLTE-master/less/login_and_register.less +42 -0
  361. data/test/dummy/public/AdminLTE-master/less/mailbox.less +64 -0
  362. data/test/dummy/public/AdminLTE-master/less/mixins.less +166 -0
  363. data/test/dummy/public/AdminLTE-master/less/navs.less +161 -0
  364. data/test/dummy/public/AdminLTE-master/less/pace.less +17 -0
  365. data/test/dummy/public/AdminLTE-master/less/progress-bars.less +62 -0
  366. data/test/dummy/public/AdminLTE-master/less/sidebar.less +135 -0
  367. data/test/dummy/public/AdminLTE-master/less/skins.less +232 -0
  368. data/test/dummy/public/AdminLTE-master/less/small-box.less +122 -0
  369. data/test/dummy/public/AdminLTE-master/less/timeline.less +101 -0
  370. data/test/dummy/public/AdminLTE-master/less/vars.less +64 -0
  371. data/test/dummy/public/AdminLTE-master/pages/UI/buttons.html +1270 -0
  372. data/test/dummy/public/AdminLTE-master/pages/UI/empty.html +415 -0
  373. data/test/dummy/public/AdminLTE-master/pages/UI/general.html +985 -0
  374. data/test/dummy/public/AdminLTE-master/pages/UI/icons.html +2176 -0
  375. data/test/dummy/public/AdminLTE-master/pages/UI/jquery-ui.html +539 -0
  376. data/test/dummy/public/AdminLTE-master/pages/UI/sliders.html +562 -0
  377. data/test/dummy/public/AdminLTE-master/pages/UI/timeline.html +564 -0
  378. data/test/dummy/public/AdminLTE-master/pages/calendar.html +643 -0
  379. data/test/dummy/public/AdminLTE-master/pages/charts/empty.html +415 -0
  380. data/test/dummy/public/AdminLTE-master/pages/charts/flot.html +763 -0
  381. data/test/dummy/public/AdminLTE-master/pages/charts/inline.html +888 -0
  382. data/test/dummy/public/AdminLTE-master/pages/charts/morris.html +554 -0
  383. data/test/dummy/public/AdminLTE-master/pages/empty.html +445 -0
  384. data/test/dummy/public/AdminLTE-master/pages/examples/404.html +433 -0
  385. data/test/dummy/public/AdminLTE-master/pages/examples/500.html +433 -0
  386. data/test/dummy/public/AdminLTE-master/pages/examples/blank.html +416 -0
  387. data/test/dummy/public/AdminLTE-master/pages/examples/invoice.html +553 -0
  388. data/test/dummy/public/AdminLTE-master/pages/examples/lockscreen.html +114 -0
  389. data/test/dummy/public/AdminLTE-master/pages/examples/login.html +58 -0
  390. data/test/dummy/public/AdminLTE-master/pages/examples/register.html +60 -0
  391. data/test/dummy/public/AdminLTE-master/pages/forms/advanced.html +742 -0
  392. data/test/dummy/public/AdminLTE-master/pages/forms/editors.html +472 -0
  393. data/test/dummy/public/AdminLTE-master/pages/forms/empty.html +415 -0
  394. data/test/dummy/public/AdminLTE-master/pages/forms/general.html +714 -0
  395. data/test/dummy/public/AdminLTE-master/pages/mailbox.html +671 -0
  396. data/test/dummy/public/AdminLTE-master/pages/tables/data.html +1304 -0
  397. data/test/dummy/public/AdminLTE-master/pages/tables/empty.html +414 -0
  398. data/test/dummy/public/AdminLTE-master/pages/tables/simple.html +716 -0
  399. data/test/dummy/public/AdminLTE-master/pages/widgets.html +1028 -0
  400. data/test/dummy/public/chat/bower/font-awesome/.bower.json +37 -0
  401. data/test/dummy/public/chat/bower/font-awesome/.gitignore +32 -0
  402. data/test/dummy/public/chat/bower/font-awesome/.npmignore +42 -0
  403. data/test/dummy/public/chat/bower/font-awesome/bower.json +23 -0
  404. data/test/dummy/public/chat/bower/font-awesome/css/font-awesome.css +1672 -0
  405. data/test/dummy/public/chat/bower/font-awesome/css/font-awesome.min.css +4 -0
  406. data/test/dummy/public/chat/bower/font-awesome/fonts/FontAwesome.otf +0 -0
  407. data/test/dummy/public/chat/bower/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  408. data/test/dummy/public/chat/bower/font-awesome/fonts/fontawesome-webfont.svg +520 -0
  409. data/test/dummy/public/chat/bower/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  410. data/test/dummy/public/chat/bower/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  411. data/test/dummy/public/chat/bower/font-awesome/less/bordered-pulled.less +16 -0
  412. data/test/dummy/public/chat/bower/font-awesome/less/core.less +11 -0
  413. data/test/dummy/public/chat/bower/font-awesome/less/extras.less +2 -0
  414. data/test/dummy/public/chat/bower/font-awesome/less/fixed-width.less +6 -0
  415. data/test/dummy/public/chat/bower/font-awesome/less/font-awesome.less +17 -0
  416. data/test/dummy/public/chat/bower/font-awesome/less/icons.less +552 -0
  417. data/test/dummy/public/chat/bower/font-awesome/less/larger.less +13 -0
  418. data/test/dummy/public/chat/bower/font-awesome/less/list.less +19 -0
  419. data/test/dummy/public/chat/bower/font-awesome/less/mixins.less +25 -0
  420. data/test/dummy/public/chat/bower/font-awesome/less/path.less +14 -0
  421. data/test/dummy/public/chat/bower/font-awesome/less/rotated-flipped.less +20 -0
  422. data/test/dummy/public/chat/bower/font-awesome/less/spinning.less +29 -0
  423. data/test/dummy/public/chat/bower/font-awesome/less/stacked.less +20 -0
  424. data/test/dummy/public/chat/bower/font-awesome/less/variables.less +561 -0
  425. data/test/dummy/public/chat/bower/font-awesome/scss/_bordered-pulled.scss +16 -0
  426. data/test/dummy/public/chat/bower/font-awesome/scss/_core.scss +11 -0
  427. data/test/dummy/public/chat/bower/font-awesome/scss/_extras.scss +44 -0
  428. data/test/dummy/public/chat/bower/font-awesome/scss/_fixed-width.scss +6 -0
  429. data/test/dummy/public/chat/bower/font-awesome/scss/_icons.scss +552 -0
  430. data/test/dummy/public/chat/bower/font-awesome/scss/_larger.scss +13 -0
  431. data/test/dummy/public/chat/bower/font-awesome/scss/_list.scss +19 -0
  432. data/test/dummy/public/chat/bower/font-awesome/scss/_mixins.scss +25 -0
  433. data/test/dummy/public/chat/bower/font-awesome/scss/_path.scss +14 -0
  434. data/test/dummy/public/chat/bower/font-awesome/scss/_rotated-flipped.scss +20 -0
  435. data/test/dummy/public/chat/bower/font-awesome/scss/_spinning.scss +29 -0
  436. data/test/dummy/public/chat/bower/font-awesome/scss/_stacked.scss +20 -0
  437. data/test/dummy/public/chat/bower/font-awesome/scss/_variables.scss +561 -0
  438. data/test/dummy/public/chat/bower/font-awesome/scss/font-awesome.scss +17 -0
  439. data/test/dummy/public/chat/bower/jScrollPane/.bower.json +33 -0
  440. data/test/dummy/public/chat/bower/jScrollPane/.gitignore +2 -0
  441. data/test/dummy/public/chat/bower/jScrollPane/.gitmodules +3 -0
  442. data/test/dummy/public/chat/bower/jScrollPane/GPL-LICENSE.txt +278 -0
  443. data/test/dummy/public/chat/bower/jScrollPane/MIT-LICENSE.txt +19 -0
  444. data/test/dummy/public/chat/bower/jScrollPane/README.md +23 -0
  445. data/test/dummy/public/chat/bower/jScrollPane/ajax.html +151 -0
  446. data/test/dummy/public/chat/bower/jScrollPane/ajax_content.html +73 -0
  447. data/test/dummy/public/chat/bower/jScrollPane/anchors.html +140 -0
  448. data/test/dummy/public/chat/bower/jScrollPane/api.html +190 -0
  449. data/test/dummy/public/chat/bower/jScrollPane/arrow_hover.html +208 -0
  450. data/test/dummy/public/chat/bower/jScrollPane/arrow_positions.html +634 -0
  451. data/test/dummy/public/chat/bower/jScrollPane/arrows.html +203 -0
  452. data/test/dummy/public/chat/bower/jScrollPane/auto_reinitialise.html +98 -0
  453. data/test/dummy/public/chat/bower/jScrollPane/basic.html +204 -0
  454. data/test/dummy/public/chat/bower/jScrollPane/bower.json +22 -0
  455. data/test/dummy/public/chat/bower/jScrollPane/build/.gitignore +1 -0
  456. data/test/dummy/public/chat/bower/jScrollPane/build/Gruntfile.js +49 -0
  457. data/test/dummy/public/chat/bower/jScrollPane/build/package.json +30 -0
  458. data/test/dummy/public/chat/bower/jScrollPane/caps.html +236 -0
  459. data/test/dummy/public/chat/bower/jScrollPane/changelog.html +66 -0
  460. data/test/dummy/public/chat/bower/jScrollPane/destroy.html +237 -0
  461. data/test/dummy/public/chat/bower/jScrollPane/drag_size.html +206 -0
  462. data/test/dummy/public/chat/bower/jScrollPane/dynamic_content.html +95 -0
  463. data/test/dummy/public/chat/bower/jScrollPane/dynamic_height.html +207 -0
  464. data/test/dummy/public/chat/bower/jScrollPane/dynamic_width.html +368 -0
  465. data/test/dummy/public/chat/bower/jScrollPane/events.html +264 -0
  466. data/test/dummy/public/chat/bower/jScrollPane/faqs.html +52 -0
  467. data/test/dummy/public/chat/bower/jScrollPane/fixed_width.html +230 -0
  468. data/test/dummy/public/chat/bower/jScrollPane/focus.html +207 -0
  469. data/test/dummy/public/chat/bower/jScrollPane/fullpage_scroll.html +259 -0
  470. data/test/dummy/public/chat/bower/jScrollPane/iframe.html +79 -0
  471. data/test/dummy/public/chat/bower/jScrollPane/iframe2.html +121 -0
  472. data/test/dummy/public/chat/bower/jScrollPane/iframe_content1.html +143 -0
  473. data/test/dummy/public/chat/bower/jScrollPane/iframe_content2.html +143 -0
  474. data/test/dummy/public/chat/bower/jScrollPane/iframe_content3.html +76 -0
  475. data/test/dummy/public/chat/bower/jScrollPane/iframe_content4.html +76 -0
  476. data/test/dummy/public/chat/bower/jScrollPane/image.html +96 -0
  477. data/test/dummy/public/chat/bower/jScrollPane/image/logo.png +0 -0
  478. data/test/dummy/public/chat/bower/jScrollPane/image2.html +98 -0
  479. data/test/dummy/public/chat/bower/jScrollPane/index.html +319 -0
  480. data/test/dummy/public/chat/bower/jScrollPane/invisibles.html +523 -0
  481. data/test/dummy/public/chat/bower/jScrollPane/issues/11/after.html +45 -0
  482. data/test/dummy/public/chat/bower/jScrollPane/issues/11/before.html +45 -0
  483. data/test/dummy/public/chat/bower/jScrollPane/issues/11/brs_main.css +301 -0
  484. data/test/dummy/public/chat/bower/jScrollPane/issues/11/index.html +53 -0
  485. data/test/dummy/public/chat/bower/jScrollPane/issues/11/jquery.mousewheel.js +79 -0
  486. data/test/dummy/public/chat/bower/jScrollPane/issues/11/jscrollpane-2b3.css +143 -0
  487. data/test/dummy/public/chat/bower/jScrollPane/issues/11/jscrollpane-2b3.js +1063 -0
  488. data/test/dummy/public/chat/bower/jScrollPane/issues/11/native.html +42 -0
  489. data/test/dummy/public/chat/bower/jScrollPane/issues/12/after.html +80 -0
  490. data/test/dummy/public/chat/bower/jScrollPane/issues/12/after_reinit.html +73 -0
  491. data/test/dummy/public/chat/bower/jScrollPane/issues/12/before.html +72 -0
  492. data/test/dummy/public/chat/bower/jScrollPane/issues/12/before_reinit.html +73 -0
  493. data/test/dummy/public/chat/bower/jScrollPane/issues/12/brs_main.css +301 -0
  494. data/test/dummy/public/chat/bower/jScrollPane/issues/12/index.html +53 -0
  495. data/test/dummy/public/chat/bower/jScrollPane/issues/12/jquery.mousewheel.js +79 -0
  496. data/test/dummy/public/chat/bower/jScrollPane/issues/12/jscrollpane-2b3.css +143 -0
  497. data/test/dummy/public/chat/bower/jScrollPane/issues/12/jscrollpane-2b3.js +1063 -0
  498. data/test/dummy/public/chat/bower/jScrollPane/issues/12/native.html +69 -0
  499. data/test/dummy/public/chat/bower/jScrollPane/issues/12/wrapped.html +87 -0
  500. data/test/dummy/public/chat/bower/jScrollPane/issues/7/after.html +190 -0
  501. data/test/dummy/public/chat/bower/jScrollPane/issues/7/before.html +190 -0
  502. data/test/dummy/public/chat/bower/jScrollPane/issues/7/index.html +53 -0
  503. data/test/dummy/public/chat/bower/jScrollPane/issues/7/jscrollpane-2b1.css +120 -0
  504. data/test/dummy/public/chat/bower/jScrollPane/issues/7/jscrollpane-2b2.js +947 -0
  505. data/test/dummy/public/chat/bower/jScrollPane/issues/7/native.html +171 -0
  506. data/test/dummy/public/chat/bower/jScrollPane/known_issues.html +62 -0
  507. data/test/dummy/public/chat/bower/jScrollPane/less_basic.html +164 -0
  508. data/test/dummy/public/chat/bower/jScrollPane/mwheel_intent.html +209 -0
  509. data/test/dummy/public/chat/bower/jScrollPane/override_animate.html +215 -0
  510. data/test/dummy/public/chat/bower/jScrollPane/runeimp.html +314 -0
  511. data/test/dummy/public/chat/bower/jScrollPane/runeimp2.html +320 -0
  512. data/test/dummy/public/chat/bower/jScrollPane/script/demo.js +49 -0
  513. data/test/dummy/public/chat/bower/jScrollPane/script/jquery.jscrollpane.js +1467 -0
  514. data/test/dummy/public/chat/bower/jScrollPane/script/jquery.jscrollpane.min.js +11 -0
  515. data/test/dummy/public/chat/bower/jScrollPane/script/jquery.mousewheel.js +202 -0
  516. data/test/dummy/public/chat/bower/jScrollPane/script/mwheelIntent.js +76 -0
  517. data/test/dummy/public/chat/bower/jScrollPane/scroll_on_left.html +132 -0
  518. data/test/dummy/public/chat/bower/jScrollPane/scroll_to.html +188 -0
  519. data/test/dummy/public/chat/bower/jScrollPane/scroll_to_animate.html +197 -0
  520. data/test/dummy/public/chat/bower/jScrollPane/settings.html +202 -0
  521. data/test/dummy/public/chat/bower/jScrollPane/short.html +82 -0
  522. data/test/dummy/public/chat/bower/jScrollPane/style/demo.css +227 -0
  523. data/test/dummy/public/chat/bower/jScrollPane/style/jquery.jscrollpane.css +115 -0
  524. data/test/dummy/public/chat/bower/jScrollPane/themes/lozenge/image/ui-icons_222222_256x240.png +0 -0
  525. data/test/dummy/public/chat/bower/jScrollPane/themes/lozenge/image/ui-icons_888888_256x240.png +0 -0
  526. data/test/dummy/public/chat/bower/jScrollPane/themes/lozenge/image/ui-icons_cd0a0a_256x240.png +0 -0
  527. data/test/dummy/public/chat/bower/jScrollPane/themes/lozenge/index.html +337 -0
  528. data/test/dummy/public/chat/bower/jScrollPane/themes/lozenge/style/jquery.jscrollpane.lozenge.css +78 -0
  529. data/test/dummy/public/chat/bower/jScrollPane/v1.html +49 -0
  530. data/test/dummy/public/chat/bower/jquery/.bower.json +37 -0
  531. data/test/dummy/public/chat/bower/jquery/MIT-LICENSE.txt +21 -0
  532. data/test/dummy/public/chat/bower/jquery/bower.json +27 -0
  533. data/test/dummy/public/chat/bower/jquery/dist/jquery.js +9205 -0
  534. data/test/dummy/public/chat/bower/jquery/dist/jquery.min.js +5 -0
  535. data/test/dummy/public/chat/bower/jquery/dist/jquery.min.map +1 -0
  536. data/test/dummy/public/chat/bower/jquery/src/ajax.js +786 -0
  537. data/test/dummy/public/chat/bower/jquery/src/ajax/jsonp.js +89 -0
  538. data/test/dummy/public/chat/bower/jquery/src/ajax/load.js +75 -0
  539. data/test/dummy/public/chat/bower/jquery/src/ajax/parseJSON.js +13 -0
  540. data/test/dummy/public/chat/bower/jquery/src/ajax/parseXML.js +28 -0
  541. data/test/dummy/public/chat/bower/jquery/src/ajax/script.js +64 -0
  542. data/test/dummy/public/chat/bower/jquery/src/ajax/var/nonce.js +5 -0
  543. data/test/dummy/public/chat/bower/jquery/src/ajax/var/rquery.js +3 -0
  544. data/test/dummy/public/chat/bower/jquery/src/ajax/xhr.js +136 -0
  545. data/test/dummy/public/chat/bower/jquery/src/attributes.js +11 -0
  546. data/test/dummy/public/chat/bower/jquery/src/attributes/attr.js +141 -0
  547. data/test/dummy/public/chat/bower/jquery/src/attributes/classes.js +158 -0
  548. data/test/dummy/public/chat/bower/jquery/src/attributes/prop.js +94 -0
  549. data/test/dummy/public/chat/bower/jquery/src/attributes/support.js +35 -0
  550. data/test/dummy/public/chat/bower/jquery/src/attributes/val.js +161 -0
  551. data/test/dummy/public/chat/bower/jquery/src/callbacks.js +205 -0
  552. data/test/dummy/public/chat/bower/jquery/src/core.js +497 -0
  553. data/test/dummy/public/chat/bower/jquery/src/core/access.js +60 -0
  554. data/test/dummy/public/chat/bower/jquery/src/core/init.js +123 -0
  555. data/test/dummy/public/chat/bower/jquery/src/core/parseHTML.js +39 -0
  556. data/test/dummy/public/chat/bower/jquery/src/core/ready.js +97 -0
  557. data/test/dummy/public/chat/bower/jquery/src/core/var/rsingleTag.js +4 -0
  558. data/test/dummy/public/chat/bower/jquery/src/css.js +450 -0
  559. data/test/dummy/public/chat/bower/jquery/src/css/addGetHookIf.js +22 -0
  560. data/test/dummy/public/chat/bower/jquery/src/css/curCSS.js +57 -0
  561. data/test/dummy/public/chat/bower/jquery/src/css/defaultDisplay.js +70 -0
  562. data/test/dummy/public/chat/bower/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  563. data/test/dummy/public/chat/bower/jquery/src/css/support.js +96 -0
  564. data/test/dummy/public/chat/bower/jquery/src/css/swap.js +28 -0
  565. data/test/dummy/public/chat/bower/jquery/src/css/var/cssExpand.js +3 -0
  566. data/test/dummy/public/chat/bower/jquery/src/css/var/getStyles.js +12 -0
  567. data/test/dummy/public/chat/bower/jquery/src/css/var/isHidden.js +13 -0
  568. data/test/dummy/public/chat/bower/jquery/src/css/var/rmargin.js +3 -0
  569. data/test/dummy/public/chat/bower/jquery/src/css/var/rnumnonpx.js +5 -0
  570. data/test/dummy/public/chat/bower/jquery/src/data.js +178 -0
  571. data/test/dummy/public/chat/bower/jquery/src/data/Data.js +181 -0
  572. data/test/dummy/public/chat/bower/jquery/src/data/accepts.js +20 -0
  573. data/test/dummy/public/chat/bower/jquery/src/data/var/data_priv.js +5 -0
  574. data/test/dummy/public/chat/bower/jquery/src/data/var/data_user.js +5 -0
  575. data/test/dummy/public/chat/bower/jquery/src/deferred.js +149 -0
  576. data/test/dummy/public/chat/bower/jquery/src/deprecated.js +13 -0
  577. data/test/dummy/public/chat/bower/jquery/src/dimensions.js +50 -0
  578. data/test/dummy/public/chat/bower/jquery/src/effects.js +648 -0
  579. data/test/dummy/public/chat/bower/jquery/src/effects/Tween.js +114 -0
  580. data/test/dummy/public/chat/bower/jquery/src/effects/animatedSelector.js +13 -0
  581. data/test/dummy/public/chat/bower/jquery/src/event.js +868 -0
  582. data/test/dummy/public/chat/bower/jquery/src/event/ajax.js +13 -0
  583. data/test/dummy/public/chat/bower/jquery/src/event/alias.js +39 -0
  584. data/test/dummy/public/chat/bower/jquery/src/event/support.js +9 -0
  585. data/test/dummy/public/chat/bower/jquery/src/exports/amd.js +24 -0
  586. data/test/dummy/public/chat/bower/jquery/src/exports/global.js +32 -0
  587. data/test/dummy/public/chat/bower/jquery/src/intro.js +44 -0
  588. data/test/dummy/public/chat/bower/jquery/src/jquery.js +37 -0
  589. data/test/dummy/public/chat/bower/jquery/src/manipulation.js +580 -0
  590. data/test/dummy/public/chat/bower/jquery/src/manipulation/_evalUrl.js +18 -0
  591. data/test/dummy/public/chat/bower/jquery/src/manipulation/support.js +32 -0
  592. data/test/dummy/public/chat/bower/jquery/src/manipulation/var/rcheckableType.js +3 -0
  593. data/test/dummy/public/chat/bower/jquery/src/offset.js +207 -0
  594. data/test/dummy/public/chat/bower/jquery/src/outro.js +1 -0
  595. data/test/dummy/public/chat/bower/jquery/src/queue.js +142 -0
  596. data/test/dummy/public/chat/bower/jquery/src/queue/delay.js +22 -0
  597. data/test/dummy/public/chat/bower/jquery/src/selector-native.js +172 -0
  598. data/test/dummy/public/chat/bower/jquery/src/selector-sizzle.js +14 -0
  599. data/test/dummy/public/chat/bower/jquery/src/selector.js +1 -0
  600. data/test/dummy/public/chat/bower/jquery/src/serialize.js +111 -0
  601. data/test/dummy/public/chat/bower/jquery/src/sizzle/dist/sizzle.js +2067 -0
  602. data/test/dummy/public/chat/bower/jquery/src/sizzle/dist/sizzle.min.js +3 -0
  603. data/test/dummy/public/chat/bower/jquery/src/sizzle/dist/sizzle.min.map +1 -0
  604. data/test/dummy/public/chat/bower/jquery/src/traversing.js +199 -0
  605. data/test/dummy/public/chat/bower/jquery/src/traversing/findFilter.js +100 -0
  606. data/test/dummy/public/chat/bower/jquery/src/traversing/var/rneedsContext.js +6 -0
  607. data/test/dummy/public/chat/bower/jquery/src/var/arr.js +3 -0
  608. data/test/dummy/public/chat/bower/jquery/src/var/class2type.js +4 -0
  609. data/test/dummy/public/chat/bower/jquery/src/var/concat.js +5 -0
  610. data/test/dummy/public/chat/bower/jquery/src/var/hasOwn.js +5 -0
  611. data/test/dummy/public/chat/bower/jquery/src/var/indexOf.js +5 -0
  612. data/test/dummy/public/chat/bower/jquery/src/var/pnum.js +3 -0
  613. data/test/dummy/public/chat/bower/jquery/src/var/push.js +5 -0
  614. data/test/dummy/public/chat/bower/jquery/src/var/rnotwhite.js +3 -0
  615. data/test/dummy/public/chat/bower/jquery/src/var/slice.js +5 -0
  616. data/test/dummy/public/chat/bower/jquery/src/var/strundefined.js +3 -0
  617. data/test/dummy/public/chat/bower/jquery/src/var/support.js +4 -0
  618. data/test/dummy/public/chat/bower/jquery/src/var/toString.js +5 -0
  619. data/test/dummy/public/chat/bower/jquery/src/wrap.js +79 -0
  620. data/test/dummy/public/chat/bower/open-sans-fontface/.bower.json +32 -0
  621. data/test/dummy/public/chat/bower/open-sans-fontface/README.md +17 -0
  622. data/test/dummy/public/chat/bower/open-sans-fontface/bower.json +22 -0
  623. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Bold/OpenSans-Bold.eot +0 -0
  624. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Bold/OpenSans-Bold.svg +958 -0
  625. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Bold/OpenSans-Bold.ttf +0 -0
  626. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Bold/OpenSans-Bold.woff +0 -0
  627. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/BoldItalic/OpenSans-BoldItalic.eot +0 -0
  628. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/BoldItalic/OpenSans-BoldItalic.svg +958 -0
  629. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/BoldItalic/OpenSans-BoldItalic.ttf +0 -0
  630. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/BoldItalic/OpenSans-BoldItalic.woff +0 -0
  631. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/ExtraBold/OpenSans-ExtraBold.eot +0 -0
  632. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/ExtraBold/OpenSans-ExtraBold.svg +958 -0
  633. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/ExtraBold/OpenSans-ExtraBold.ttf +0 -0
  634. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/ExtraBold/OpenSans-ExtraBold.woff +0 -0
  635. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.eot +0 -0
  636. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.svg +958 -0
  637. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.ttf +0 -0
  638. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.woff +0 -0
  639. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Italic/OpenSans-Italic.eot +0 -0
  640. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Italic/OpenSans-Italic.svg +958 -0
  641. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Italic/OpenSans-Italic.ttf +0 -0
  642. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Italic/OpenSans-Italic.woff +0 -0
  643. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Light/OpenSans-Light.eot +0 -0
  644. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Light/OpenSans-Light.svg +958 -0
  645. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Light/OpenSans-Light.ttf +0 -0
  646. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Light/OpenSans-Light.woff +0 -0
  647. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/LightItalic/OpenSans-LightItalic.eot +0 -0
  648. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/LightItalic/OpenSans-LightItalic.svg +958 -0
  649. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/LightItalic/OpenSans-LightItalic.ttf +0 -0
  650. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/LightItalic/OpenSans-LightItalic.woff +0 -0
  651. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Regular/OpenSans-Regular.eot +0 -0
  652. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Regular/OpenSans-Regular.svg +958 -0
  653. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Regular/OpenSans-Regular.ttf +0 -0
  654. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Regular/OpenSans-Regular.woff +0 -0
  655. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Semibold/OpenSans-Semibold.eot +0 -0
  656. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Semibold/OpenSans-Semibold.svg +958 -0
  657. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Semibold/OpenSans-Semibold.ttf +0 -0
  658. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/Semibold/OpenSans-Semibold.woff +0 -0
  659. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/SemiboldItalic/OpenSans-SemiboldItalic.eot +0 -0
  660. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/SemiboldItalic/OpenSans-SemiboldItalic.svg +958 -0
  661. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/SemiboldItalic/OpenSans-SemiboldItalic.ttf +0 -0
  662. data/test/dummy/public/chat/bower/open-sans-fontface/fonts/SemiboldItalic/OpenSans-SemiboldItalic.woff +0 -0
  663. data/test/dummy/public/chat/bower/open-sans-fontface/index.html +85 -0
  664. data/test/dummy/public/chat/bower/open-sans-fontface/open-sans.css +90 -0
  665. data/test/dummy/public/chat/bower/open-sans-fontface/open-sans.less +133 -0
  666. data/test/dummy/public/chat/bower/open-sans-fontface/open-sans.scss +12 -0
  667. data/test/dummy/public/chat/bower/open-sans-fontface/package.json +22 -0
  668. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_Bold.scss +8 -0
  669. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_BoldItalic.scss +8 -0
  670. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_ExtraBold.scss +8 -0
  671. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_ExtraBoldItalic.scss +8 -0
  672. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_Italic.scss +8 -0
  673. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_Light.scss +8 -0
  674. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_LightItalic.scss +8 -0
  675. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_Regular.scss +8 -0
  676. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_Semibold.scss +8 -0
  677. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_SemiboldItalic.scss +8 -0
  678. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_mixins.scss +7 -0
  679. data/test/dummy/public/chat/bower/open-sans-fontface/sass/_variables.scss +2 -0
  680. data/test/dummy/public/chat/bower/open-sans-fontface/sass/open-sans.scss +12 -0
  681. data/test/dummy/public/chat/css/login.css +140 -0
  682. data/test/dummy/public/chat/css/login.scss +147 -0
  683. data/test/dummy/public/chat/css/style.css +397 -0
  684. data/test/dummy/public/chat/index.html +211 -0
  685. data/test/dummy/public/chat/js/index.js +6 -0
  686. data/test/dummy/public/chat/login.html +36 -0
  687. data/test/helper.rb +11 -53
  688. metadata +1501 -31
  689. data/lib/roda/component/models/channel.rb +0 -11
  690. data/lib/roda/component/models/user.rb +0 -12
  691. data/lib/roda/component/ohm.rb +0 -8
  692. data/test/dummy/public/index.html +0 -8
@@ -0,0 +1,320 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+ "http://www.w3.org/TR/html4/loose.dtd">
3
+ <html>
4
+ <head>
5
+
6
+ <title>jScrollPane - RuneImp demo 2</title>
7
+
8
+ <!-- styles specific to demo site -->
9
+ <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
10
+ <!-- styles needed by jScrollPane - include in your own sites -->
11
+ <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
12
+
13
+ <style type="text/css" id="page-css">
14
+ /* Styles specific to this particular page */
15
+ .section
16
+ {
17
+ width: 180px;
18
+ margin: 0 13px 1em 0;
19
+ height: 300px;
20
+ float: left;
21
+ }
22
+ .last
23
+ {
24
+ margin-right: 0;
25
+ }
26
+ .scroll-pane
27
+ {
28
+ background: #fff;
29
+ padding: 0 0 0 10px;
30
+ width: 170px;
31
+ height: 100%;
32
+ overflow: auto;
33
+ }
34
+ </style>
35
+
36
+ <!-- latest jQuery direct from google's CDN -->
37
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
38
+ <!-- the mousewheel plugin -->
39
+ <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
40
+ <!-- the jScrollPane script -->
41
+ <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
42
+ <!-- scripts specific to this demo site -->
43
+ <script type="text/javascript" src="script/demo.js"></script>
44
+
45
+ <script type="text/javascript" id="sourcecode">
46
+ $(function()
47
+ {
48
+ $('.scroll-pane').jScrollPane();
49
+ });
50
+ </script>
51
+ </head>
52
+ <body>
53
+ <div id="top-nav">
54
+ <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
55
+ <ul>
56
+ <li><a href="index.html">Home</a></li>
57
+ <li><a href="index.html#examples">Examples</a></li>
58
+ <li><a href="index.html#themes">Themes</a></li>
59
+ <li><a href="index.html#usage">How to use</a></li>
60
+ <li><a href="faqs.html">FAQs</a></li>
61
+ <li><a href="known_issues.html">Known issues</a></li>
62
+ <li><a href="index.html#support">Support</a></li>
63
+ <li><a href="index.html#download">Download</a></li>
64
+ </ul>
65
+ </div>
66
+ <div id="container">
67
+ <h1>jScrollPane - RuneImp demo 2 page</h1>
68
+ <p>
69
+ This demonstration is an extension of the <a href="runeimp.html">RuneImp demo</a> to verify that
70
+ jScrollPane works correctly when the gap between the sections is specified as margin on the container
71
+ (rather than padding on the element). As you can see, I still using padding on the left hand side of
72
+ the scrolling element to bring the text in from the edge but I also use margins to make the space on
73
+ the right hand side of the scrollbars.
74
+ </p>
75
+ <p>
76
+ Note that I've made the background of .scroll-pane white in this example to demonstrate that the gap
77
+ is margin rather than padding. You can also change the margin rules on .section and .last to padding and
78
+ the layout will continue to work as expected.
79
+ </p>
80
+
81
+ <h2>Panes</h2>
82
+ <div class="section">
83
+ <div class="scroll-pane">
84
+ <p>
85
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
86
+ eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
87
+ mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
88
+ consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
89
+ bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
90
+ semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
91
+ mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
92
+ quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
93
+ eu lacus semper viverra.
94
+ </p>
95
+ <p>
96
+ Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
97
+ lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
98
+ faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
99
+ Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
100
+ tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
101
+ Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
102
+ est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
103
+ volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
104
+ libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
105
+ sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
106
+ pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
107
+ habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
108
+ </p>
109
+ <p>
110
+ Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
111
+ eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
112
+ dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
113
+ amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
114
+ est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
115
+ dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
116
+ varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
117
+ feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
118
+ congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
119
+ id mollis nisi. Donec fermentum vehicula porta.
120
+ </p>
121
+ <p>
122
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
123
+ Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
124
+ sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
125
+ Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
126
+ commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
127
+ ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
128
+ Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
129
+ eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
130
+ luctus, metus
131
+ </p>
132
+ <p>
133
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
134
+ Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
135
+ amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
136
+ </p>
137
+ </div>
138
+ </div>
139
+ <div class="section">
140
+ <div class="scroll-pane">
141
+ <p>
142
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
143
+ eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
144
+ mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
145
+ consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
146
+ bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
147
+ semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
148
+ mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
149
+ quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
150
+ eu lacus semper viverra.
151
+ </p>
152
+ <p>
153
+ Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
154
+ lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
155
+ faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
156
+ Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
157
+ tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
158
+ Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
159
+ est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
160
+ volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
161
+ libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
162
+ sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
163
+ pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
164
+ habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
165
+ </p>
166
+ <p>
167
+ Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
168
+ eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
169
+ dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
170
+ amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
171
+ est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
172
+ dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
173
+ varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
174
+ feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
175
+ congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
176
+ id mollis nisi. Donec fermentum vehicula porta.
177
+ </p>
178
+ <p>
179
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
180
+ Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
181
+ sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
182
+ Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
183
+ commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
184
+ ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
185
+ Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
186
+ eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
187
+ luctus, metus
188
+ </p>
189
+ <p>
190
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
191
+ Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
192
+ amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
193
+ </p>
194
+ </div>
195
+ </div>
196
+ <div class="section">
197
+ <div class="scroll-pane">
198
+ <p>
199
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
200
+ eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
201
+ mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
202
+ consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
203
+ bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
204
+ semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
205
+ mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
206
+ quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
207
+ eu lacus semper viverra.
208
+ </p>
209
+ <p>
210
+ Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
211
+ lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
212
+ faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
213
+ Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
214
+ tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
215
+ Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
216
+ est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
217
+ volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
218
+ libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
219
+ sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
220
+ pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
221
+ habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
222
+ </p>
223
+ <p>
224
+ Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
225
+ eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
226
+ dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
227
+ amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
228
+ est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
229
+ dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
230
+ varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
231
+ feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
232
+ congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
233
+ id mollis nisi. Donec fermentum vehicula porta.
234
+ </p>
235
+ <p>
236
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
237
+ Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
238
+ sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
239
+ Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
240
+ commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
241
+ ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
242
+ Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
243
+ eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
244
+ luctus, metus
245
+ </p>
246
+ <p>
247
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
248
+ Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
249
+ amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
250
+ </p>
251
+ </div>
252
+ </div>
253
+ <div class="section last">
254
+ <div class="scroll-pane">
255
+ <p>
256
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
257
+ eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
258
+ mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
259
+ consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
260
+ bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
261
+ semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
262
+ mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
263
+ quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
264
+ eu lacus semper viverra.
265
+ </p>
266
+ <p>
267
+ Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
268
+ lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
269
+ faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
270
+ Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
271
+ tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
272
+ Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
273
+ est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
274
+ volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
275
+ libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
276
+ sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
277
+ pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
278
+ habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
279
+ </p>
280
+ <p>
281
+ Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
282
+ eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
283
+ dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
284
+ amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
285
+ est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
286
+ dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
287
+ varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
288
+ feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
289
+ congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
290
+ id mollis nisi. Donec fermentum vehicula porta.
291
+ </p>
292
+ <p>
293
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
294
+ Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
295
+ sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
296
+ Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
297
+ commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
298
+ ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
299
+ Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
300
+ eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
301
+ luctus, metus
302
+ </p>
303
+ <p>
304
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
305
+ Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
306
+ amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
307
+ </p>
308
+ </div>
309
+ </div>
310
+ <h2>Page javascript</h2>
311
+ <div id="sourcecode-display">
312
+ <p>The contents of this div will be replaced by the javascript added to this page</p>
313
+ </div>
314
+ <h2>Page CSS</h2>
315
+ <div id="css-display">
316
+ <p>The contents of this div will be replaced by the CSS added to this page</p>
317
+ </div>
318
+ </div>
319
+ </body>
320
+ </html>
@@ -0,0 +1,49 @@
1
+ /*!
2
+ * Scripts for the demo pages on the jScrollPane website.
3
+ *
4
+ * You do not need to include this script or use it on your site.
5
+ *
6
+ * Copyright (c) 2010 Kelvin Luck
7
+ * Dual licensed under the MIT or GPL licenses.
8
+ */
9
+
10
+ $(function()
11
+ {
12
+ // Copy the pages javascript sourcecode to the display block on the page for easy viewing...
13
+ var sourcecodeDisplay = $('#sourcecode-display');
14
+ if (sourcecodeDisplay.length) {
15
+ sourcecodeDisplay.empty().append(
16
+ $('<code />').append(
17
+ $('<pre />').html(
18
+ $('#sourcecode').html().replace(/\n\t\t\t/gm, '\n').replace('>', '&gt;').replace('<', '&lt;')
19
+ )
20
+ )
21
+ );
22
+ $('#css-display').empty().append(
23
+ $('<code />').append(
24
+ $('<pre />').html(
25
+ $('#page-css').html().replace(/\n\t\t\t/gm, '\n')
26
+ )
27
+ )
28
+ );
29
+ }
30
+ });
31
+
32
+ // It seems some people copy this file and put it on their sites despite the message at the top
33
+ // So let's make sure they don't end up in my stats...
34
+ if (window.location.hostname == 'jscrollpane.kelvinluck.com') {
35
+ // Google analytics tracking code for demo site
36
+ var _gaq = _gaq || [];
37
+ _gaq.push(['_setAccount', 'UA-17828883-1']);
38
+ _gaq.push(['_trackPageview']);
39
+
40
+ (function() {
41
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
42
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
43
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
44
+ })();
45
+ } else if(window.location.protocol == 'file:' || window.location.hostname == 'localhost') {
46
+ // Allow local testing without annoying alerts
47
+ } else {
48
+ alert('Do not include demo.js on your site!');
49
+ }
@@ -0,0 +1,1467 @@
1
+ /*!
2
+ * jScrollPane - v2.0.20 - 2014-10-23
3
+ * http://jscrollpane.kelvinluck.com/
4
+ *
5
+ * Copyright (c) 2014 Kelvin Luck
6
+ * Dual licensed under the MIT or GPL licenses.
7
+ */
8
+
9
+ // Script: jScrollPane - cross browser customisable scrollbars
10
+ //
11
+ // *Version: 2.0.20, Last updated: 2014-10-23*
12
+ //
13
+ // Project Home - http://jscrollpane.kelvinluck.com/
14
+ // GitHub - http://github.com/vitch/jScrollPane
15
+ // Source - http://github.com/vitch/jScrollPane/raw/master/script/jquery.jscrollpane.js
16
+ // (Minified) - http://github.com/vitch/jScrollPane/raw/master/script/jquery.jscrollpane.min.js
17
+ //
18
+ // About: License
19
+ //
20
+ // Copyright (c) 2014 Kelvin Luck
21
+ // Dual licensed under the MIT or GPL Version 2 licenses.
22
+ // http://jscrollpane.kelvinluck.com/MIT-LICENSE.txt
23
+ // http://jscrollpane.kelvinluck.com/GPL-LICENSE.txt
24
+ //
25
+ // About: Examples
26
+ //
27
+ // All examples and demos are available through the jScrollPane example site at:
28
+ // http://jscrollpane.kelvinluck.com/
29
+ //
30
+ // About: Support and Testing
31
+ //
32
+ // This plugin is tested on the browsers below and has been found to work reliably on them. If you run
33
+ // into a problem on one of the supported browsers then please visit the support section on the jScrollPane
34
+ // website (http://jscrollpane.kelvinluck.com/) for more information on getting support. You are also
35
+ // welcome to fork the project on GitHub if you can contribute a fix for a given issue.
36
+ //
37
+ // jQuery Versions - tested in 1.4.2+ - reported to work in 1.3.x
38
+ // Browsers Tested - Firefox 3.6.8, Safari 5, Opera 10.6, Chrome 5.0, IE 6, 7, 8
39
+ //
40
+ // About: Release History
41
+ //
42
+ // 2.0.20 - (2014-10-23) Adds AMD support (thanks @carlosrberto) and support for overflow-x/overflow-y (thanks @darimpulso)
43
+ // 2.0.19 - (2013-11-16) Changes for more reliable scroll amount with latest mousewheel plugin (thanks @brandonaaron)
44
+ // 2.0.18 - (2013-10-23) Fix for issue with gutters and scrollToElement (thanks @Dubiy)
45
+ // 2.0.17 - (2013-08-17) Working correctly when box-sizing is set to border-box (thanks @pieht)
46
+ // 2.0.16 - (2013-07-30) Resetting left position when scroll is removed. Fixes #189
47
+ // 2.0.15 - (2013-07-29) Fixed issue with scrollToElement where the destX and destY are undefined.
48
+ // 2.0.14 - (2013-05-01) Updated to most recent mouse wheel plugin (see #106) and related changes for sensible scroll speed
49
+ // 2.0.13 - (2013-05-01) Switched to semver compatible version name
50
+ // 2.0.0beta12 - (2012-09-27) fix for jQuery 1.8+
51
+ // 2.0.0beta11 - (2012-05-14)
52
+ // 2.0.0beta10 - (2011-04-17) cleaner required size calculation, improved keyboard support, stickToBottom/Left, other small fixes
53
+ // 2.0.0beta9 - (2011-01-31) new API methods, bug fixes and correct keyboard support for FF/OSX
54
+ // 2.0.0beta8 - (2011-01-29) touchscreen support, improved keyboard support
55
+ // 2.0.0beta7 - (2011-01-23) scroll speed consistent (thanks Aivo Paas)
56
+ // 2.0.0beta6 - (2010-12-07) scrollToElement horizontal support
57
+ // 2.0.0beta5 - (2010-10-18) jQuery 1.4.3 support, various bug fixes
58
+ // 2.0.0beta4 - (2010-09-17) clickOnTrack support, bug fixes
59
+ // 2.0.0beta3 - (2010-08-27) Horizontal mousewheel, mwheelIntent, keyboard support, bug fixes
60
+ // 2.0.0beta2 - (2010-08-21) Bug fixes
61
+ // 2.0.0beta1 - (2010-08-17) Rewrite to follow modern best practices and enable horizontal scrolling, initially hidden
62
+ // elements and dynamically sized elements.
63
+ // 1.x - (2006-12-31 - 2010-07-31) Initial version, hosted at googlecode, deprecated
64
+
65
+ (function (plugin, window) {
66
+ var factory = function($){
67
+ return plugin($, window);
68
+ }
69
+ if ( typeof define === 'function' && define.amd ) {
70
+ // AMD. Register as an anonymous module.
71
+ define(['jquery'], factory);
72
+ } else if (typeof exports === 'object') {
73
+ // Node/CommonJS style for Browserify
74
+ module.exports = factory;
75
+ } else {
76
+ // Browser globals
77
+ factory(jQuery);
78
+ }
79
+ }(function($,window,undefined){
80
+
81
+ $.fn.jScrollPane = function(settings)
82
+ {
83
+ // JScrollPane "class" - public methods are available through $('selector').data('jsp')
84
+ function JScrollPane(elem, s)
85
+ {
86
+ var settings, jsp = this, pane, paneWidth, paneHeight, container, contentWidth, contentHeight,
87
+ percentInViewH, percentInViewV, isScrollableV, isScrollableH, verticalDrag, dragMaxY,
88
+ verticalDragPosition, horizontalDrag, dragMaxX, horizontalDragPosition,
89
+ verticalBar, verticalTrack, scrollbarWidth, verticalTrackHeight, verticalDragHeight, arrowUp, arrowDown,
90
+ horizontalBar, horizontalTrack, horizontalTrackWidth, horizontalDragWidth, arrowLeft, arrowRight,
91
+ reinitialiseInterval, originalPadding, originalPaddingTotalWidth, previousContentWidth,
92
+ wasAtTop = true, wasAtLeft = true, wasAtBottom = false, wasAtRight = false,
93
+ originalElement = elem.clone(false, false).empty(),
94
+ mwEvent = $.fn.mwheelIntent ? 'mwheelIntent.jsp' : 'mousewheel.jsp';
95
+
96
+ if (elem.css('box-sizing') === 'border-box') {
97
+ originalPadding = 0;
98
+ originalPaddingTotalWidth = 0;
99
+ } else {
100
+ originalPadding = elem.css('paddingTop') + ' ' +
101
+ elem.css('paddingRight') + ' ' +
102
+ elem.css('paddingBottom') + ' ' +
103
+ elem.css('paddingLeft');
104
+ originalPaddingTotalWidth = (parseInt(elem.css('paddingLeft'), 10) || 0) +
105
+ (parseInt(elem.css('paddingRight'), 10) || 0);
106
+ }
107
+
108
+ function initialise(s)
109
+ {
110
+
111
+ var /*firstChild, lastChild, */isMaintainingPositon, lastContentX, lastContentY,
112
+ hasContainingSpaceChanged, originalScrollTop, originalScrollLeft,
113
+ maintainAtBottom = false, maintainAtRight = false;
114
+
115
+ settings = s;
116
+
117
+ if (pane === undefined) {
118
+ originalScrollTop = elem.scrollTop();
119
+ originalScrollLeft = elem.scrollLeft();
120
+
121
+ elem.css(
122
+ {
123
+ overflow: 'hidden',
124
+ padding: 0
125
+ }
126
+ );
127
+ // TODO: Deal with where width/ height is 0 as it probably means the element is hidden and we should
128
+ // come back to it later and check once it is unhidden...
129
+ paneWidth = elem.innerWidth() + originalPaddingTotalWidth;
130
+ paneHeight = elem.innerHeight();
131
+
132
+ elem.width(paneWidth);
133
+
134
+ pane = $('<div class="jspPane" />').css('padding', originalPadding).append(elem.children());
135
+ container = $('<div class="jspContainer" />')
136
+ .css({
137
+ 'width': paneWidth + 'px',
138
+ 'height': paneHeight + 'px'
139
+ }
140
+ ).append(pane).appendTo(elem);
141
+
142
+ /*
143
+ // Move any margins from the first and last children up to the container so they can still
144
+ // collapse with neighbouring elements as they would before jScrollPane
145
+ firstChild = pane.find(':first-child');
146
+ lastChild = pane.find(':last-child');
147
+ elem.css(
148
+ {
149
+ 'margin-top': firstChild.css('margin-top'),
150
+ 'margin-bottom': lastChild.css('margin-bottom')
151
+ }
152
+ );
153
+ firstChild.css('margin-top', 0);
154
+ lastChild.css('margin-bottom', 0);
155
+ */
156
+ } else {
157
+ elem.css('width', '');
158
+
159
+ maintainAtBottom = settings.stickToBottom && isCloseToBottom();
160
+ maintainAtRight = settings.stickToRight && isCloseToRight();
161
+
162
+ hasContainingSpaceChanged = elem.innerWidth() + originalPaddingTotalWidth != paneWidth || elem.outerHeight() != paneHeight;
163
+
164
+ if (hasContainingSpaceChanged) {
165
+ paneWidth = elem.innerWidth() + originalPaddingTotalWidth;
166
+ paneHeight = elem.innerHeight();
167
+ container.css({
168
+ width: paneWidth + 'px',
169
+ height: paneHeight + 'px'
170
+ });
171
+ }
172
+
173
+ // If nothing changed since last check...
174
+ if (!hasContainingSpaceChanged && previousContentWidth == contentWidth && pane.outerHeight() == contentHeight) {
175
+ elem.width(paneWidth);
176
+ return;
177
+ }
178
+ previousContentWidth = contentWidth;
179
+
180
+ pane.css('width', '');
181
+ elem.width(paneWidth);
182
+
183
+ container.find('>.jspVerticalBar,>.jspHorizontalBar').remove().end();
184
+ }
185
+
186
+ pane.css('overflow', 'auto');
187
+ if (s.contentWidth) {
188
+ contentWidth = s.contentWidth;
189
+ } else {
190
+ contentWidth = pane[0].scrollWidth;
191
+ }
192
+ contentHeight = pane[0].scrollHeight;
193
+ pane.css('overflow', '');
194
+
195
+ percentInViewH = contentWidth / paneWidth;
196
+ percentInViewV = contentHeight / paneHeight;
197
+ isScrollableV = percentInViewV > 1;
198
+
199
+ isScrollableH = percentInViewH > 1;
200
+
201
+ //console.log(paneWidth, paneHeight, contentWidth, contentHeight, percentInViewH, percentInViewV, isScrollableH, isScrollableV);
202
+
203
+ if (!(isScrollableH || isScrollableV)) {
204
+ elem.removeClass('jspScrollable');
205
+ pane.css({
206
+ top: 0,
207
+ left: 0,
208
+ width: container.width() - originalPaddingTotalWidth
209
+ });
210
+ removeMousewheel();
211
+ removeFocusHandler();
212
+ removeKeyboardNav();
213
+ removeClickOnTrack();
214
+ } else {
215
+ elem.addClass('jspScrollable');
216
+
217
+ isMaintainingPositon = settings.maintainPosition && (verticalDragPosition || horizontalDragPosition);
218
+ if (isMaintainingPositon) {
219
+ lastContentX = contentPositionX();
220
+ lastContentY = contentPositionY();
221
+ }
222
+
223
+ initialiseVerticalScroll();
224
+ initialiseHorizontalScroll();
225
+ resizeScrollbars();
226
+
227
+ if (isMaintainingPositon) {
228
+ scrollToX(maintainAtRight ? (contentWidth - paneWidth ) : lastContentX, false);
229
+ scrollToY(maintainAtBottom ? (contentHeight - paneHeight) : lastContentY, false);
230
+ }
231
+
232
+ initFocusHandler();
233
+ initMousewheel();
234
+ initTouch();
235
+
236
+ if (settings.enableKeyboardNavigation) {
237
+ initKeyboardNav();
238
+ }
239
+ if (settings.clickOnTrack) {
240
+ initClickOnTrack();
241
+ }
242
+
243
+ observeHash();
244
+ if (settings.hijackInternalLinks) {
245
+ hijackInternalLinks();
246
+ }
247
+ }
248
+
249
+ if (settings.autoReinitialise && !reinitialiseInterval) {
250
+ reinitialiseInterval = setInterval(
251
+ function()
252
+ {
253
+ initialise(settings);
254
+ },
255
+ settings.autoReinitialiseDelay
256
+ );
257
+ } else if (!settings.autoReinitialise && reinitialiseInterval) {
258
+ clearInterval(reinitialiseInterval);
259
+ }
260
+
261
+ originalScrollTop && elem.scrollTop(0) && scrollToY(originalScrollTop, false);
262
+ originalScrollLeft && elem.scrollLeft(0) && scrollToX(originalScrollLeft, false);
263
+
264
+ elem.trigger('jsp-initialised', [isScrollableH || isScrollableV]);
265
+ }
266
+
267
+ function initialiseVerticalScroll()
268
+ {
269
+ if (isScrollableV) {
270
+
271
+ container.append(
272
+ $('<div class="jspVerticalBar" />').append(
273
+ $('<div class="jspCap jspCapTop" />'),
274
+ $('<div class="jspTrack" />').append(
275
+ $('<div class="jspDrag" />').append(
276
+ $('<div class="jspDragTop" />'),
277
+ $('<div class="jspDragBottom" />')
278
+ )
279
+ ),
280
+ $('<div class="jspCap jspCapBottom" />')
281
+ )
282
+ );
283
+
284
+ verticalBar = container.find('>.jspVerticalBar');
285
+ verticalTrack = verticalBar.find('>.jspTrack');
286
+ verticalDrag = verticalTrack.find('>.jspDrag');
287
+
288
+ if (settings.showArrows) {
289
+ arrowUp = $('<a class="jspArrow jspArrowUp" />').bind(
290
+ 'mousedown.jsp', getArrowScroll(0, -1)
291
+ ).bind('click.jsp', nil);
292
+ arrowDown = $('<a class="jspArrow jspArrowDown" />').bind(
293
+ 'mousedown.jsp', getArrowScroll(0, 1)
294
+ ).bind('click.jsp', nil);
295
+ if (settings.arrowScrollOnHover) {
296
+ arrowUp.bind('mouseover.jsp', getArrowScroll(0, -1, arrowUp));
297
+ arrowDown.bind('mouseover.jsp', getArrowScroll(0, 1, arrowDown));
298
+ }
299
+
300
+ appendArrows(verticalTrack, settings.verticalArrowPositions, arrowUp, arrowDown);
301
+ }
302
+
303
+ verticalTrackHeight = paneHeight;
304
+ container.find('>.jspVerticalBar>.jspCap:visible,>.jspVerticalBar>.jspArrow').each(
305
+ function()
306
+ {
307
+ verticalTrackHeight -= $(this).outerHeight();
308
+ }
309
+ );
310
+
311
+
312
+ verticalDrag.hover(
313
+ function()
314
+ {
315
+ verticalDrag.addClass('jspHover');
316
+ },
317
+ function()
318
+ {
319
+ verticalDrag.removeClass('jspHover');
320
+ }
321
+ ).bind(
322
+ 'mousedown.jsp',
323
+ function(e)
324
+ {
325
+ // Stop IE from allowing text selection
326
+ $('html').bind('dragstart.jsp selectstart.jsp', nil);
327
+
328
+ verticalDrag.addClass('jspActive');
329
+
330
+ var startY = e.pageY - verticalDrag.position().top;
331
+
332
+ $('html').bind(
333
+ 'mousemove.jsp',
334
+ function(e)
335
+ {
336
+ positionDragY(e.pageY - startY, false);
337
+ }
338
+ ).bind('mouseup.jsp mouseleave.jsp', cancelDrag);
339
+ return false;
340
+ }
341
+ );
342
+ sizeVerticalScrollbar();
343
+ }
344
+ }
345
+
346
+ function sizeVerticalScrollbar()
347
+ {
348
+ verticalTrack.height(verticalTrackHeight + 'px');
349
+ verticalDragPosition = 0;
350
+ scrollbarWidth = settings.verticalGutter + verticalTrack.outerWidth();
351
+
352
+ // Make the pane thinner to allow for the vertical scrollbar
353
+ pane.width(paneWidth - scrollbarWidth - originalPaddingTotalWidth);
354
+
355
+ // Add margin to the left of the pane if scrollbars are on that side (to position
356
+ // the scrollbar on the left or right set it's left or right property in CSS)
357
+ try {
358
+ if (verticalBar.position().left === 0) {
359
+ pane.css('margin-left', scrollbarWidth + 'px');
360
+ }
361
+ } catch (err) {
362
+ }
363
+ }
364
+
365
+ function initialiseHorizontalScroll()
366
+ {
367
+ if (isScrollableH) {
368
+
369
+ container.append(
370
+ $('<div class="jspHorizontalBar" />').append(
371
+ $('<div class="jspCap jspCapLeft" />'),
372
+ $('<div class="jspTrack" />').append(
373
+ $('<div class="jspDrag" />').append(
374
+ $('<div class="jspDragLeft" />'),
375
+ $('<div class="jspDragRight" />')
376
+ )
377
+ ),
378
+ $('<div class="jspCap jspCapRight" />')
379
+ )
380
+ );
381
+
382
+ horizontalBar = container.find('>.jspHorizontalBar');
383
+ horizontalTrack = horizontalBar.find('>.jspTrack');
384
+ horizontalDrag = horizontalTrack.find('>.jspDrag');
385
+
386
+ if (settings.showArrows) {
387
+ arrowLeft = $('<a class="jspArrow jspArrowLeft" />').bind(
388
+ 'mousedown.jsp', getArrowScroll(-1, 0)
389
+ ).bind('click.jsp', nil);
390
+ arrowRight = $('<a class="jspArrow jspArrowRight" />').bind(
391
+ 'mousedown.jsp', getArrowScroll(1, 0)
392
+ ).bind('click.jsp', nil);
393
+ if (settings.arrowScrollOnHover) {
394
+ arrowLeft.bind('mouseover.jsp', getArrowScroll(-1, 0, arrowLeft));
395
+ arrowRight.bind('mouseover.jsp', getArrowScroll(1, 0, arrowRight));
396
+ }
397
+ appendArrows(horizontalTrack, settings.horizontalArrowPositions, arrowLeft, arrowRight);
398
+ }
399
+
400
+ horizontalDrag.hover(
401
+ function()
402
+ {
403
+ horizontalDrag.addClass('jspHover');
404
+ },
405
+ function()
406
+ {
407
+ horizontalDrag.removeClass('jspHover');
408
+ }
409
+ ).bind(
410
+ 'mousedown.jsp',
411
+ function(e)
412
+ {
413
+ // Stop IE from allowing text selection
414
+ $('html').bind('dragstart.jsp selectstart.jsp', nil);
415
+
416
+ horizontalDrag.addClass('jspActive');
417
+
418
+ var startX = e.pageX - horizontalDrag.position().left;
419
+
420
+ $('html').bind(
421
+ 'mousemove.jsp',
422
+ function(e)
423
+ {
424
+ positionDragX(e.pageX - startX, false);
425
+ }
426
+ ).bind('mouseup.jsp mouseleave.jsp', cancelDrag);
427
+ return false;
428
+ }
429
+ );
430
+ horizontalTrackWidth = container.innerWidth();
431
+ sizeHorizontalScrollbar();
432
+ }
433
+ }
434
+
435
+ function sizeHorizontalScrollbar()
436
+ {
437
+ container.find('>.jspHorizontalBar>.jspCap:visible,>.jspHorizontalBar>.jspArrow').each(
438
+ function()
439
+ {
440
+ horizontalTrackWidth -= $(this).outerWidth();
441
+ }
442
+ );
443
+
444
+ horizontalTrack.width(horizontalTrackWidth + 'px');
445
+ horizontalDragPosition = 0;
446
+ }
447
+
448
+ function resizeScrollbars()
449
+ {
450
+ if (isScrollableH && isScrollableV) {
451
+ var horizontalTrackHeight = horizontalTrack.outerHeight(),
452
+ verticalTrackWidth = verticalTrack.outerWidth();
453
+ verticalTrackHeight -= horizontalTrackHeight;
454
+ $(horizontalBar).find('>.jspCap:visible,>.jspArrow').each(
455
+ function()
456
+ {
457
+ horizontalTrackWidth += $(this).outerWidth();
458
+ }
459
+ );
460
+ horizontalTrackWidth -= verticalTrackWidth;
461
+ paneHeight -= verticalTrackWidth;
462
+ paneWidth -= horizontalTrackHeight;
463
+ horizontalTrack.parent().append(
464
+ $('<div class="jspCorner" />').css('width', horizontalTrackHeight + 'px')
465
+ );
466
+ sizeVerticalScrollbar();
467
+ sizeHorizontalScrollbar();
468
+ }
469
+ // reflow content
470
+ if (isScrollableH) {
471
+ pane.width((container.outerWidth() - originalPaddingTotalWidth) + 'px');
472
+ }
473
+ contentHeight = pane.outerHeight();
474
+ percentInViewV = contentHeight / paneHeight;
475
+
476
+ if (isScrollableH) {
477
+ horizontalDragWidth = Math.ceil(1 / percentInViewH * horizontalTrackWidth);
478
+ if (horizontalDragWidth > settings.horizontalDragMaxWidth) {
479
+ horizontalDragWidth = settings.horizontalDragMaxWidth;
480
+ } else if (horizontalDragWidth < settings.horizontalDragMinWidth) {
481
+ horizontalDragWidth = settings.horizontalDragMinWidth;
482
+ }
483
+ horizontalDrag.width(horizontalDragWidth + 'px');
484
+ dragMaxX = horizontalTrackWidth - horizontalDragWidth;
485
+ _positionDragX(horizontalDragPosition); // To update the state for the arrow buttons
486
+ }
487
+ if (isScrollableV) {
488
+ verticalDragHeight = Math.ceil(1 / percentInViewV * verticalTrackHeight);
489
+ if (verticalDragHeight > settings.verticalDragMaxHeight) {
490
+ verticalDragHeight = settings.verticalDragMaxHeight;
491
+ } else if (verticalDragHeight < settings.verticalDragMinHeight) {
492
+ verticalDragHeight = settings.verticalDragMinHeight;
493
+ }
494
+ verticalDrag.height(verticalDragHeight + 'px');
495
+ dragMaxY = verticalTrackHeight - verticalDragHeight;
496
+ _positionDragY(verticalDragPosition); // To update the state for the arrow buttons
497
+ }
498
+ }
499
+
500
+ function appendArrows(ele, p, a1, a2)
501
+ {
502
+ var p1 = "before", p2 = "after", aTemp;
503
+
504
+ // Sniff for mac... Is there a better way to determine whether the arrows would naturally appear
505
+ // at the top or the bottom of the bar?
506
+ if (p == "os") {
507
+ p = /Mac/.test(navigator.platform) ? "after" : "split";
508
+ }
509
+ if (p == p1) {
510
+ p2 = p;
511
+ } else if (p == p2) {
512
+ p1 = p;
513
+ aTemp = a1;
514
+ a1 = a2;
515
+ a2 = aTemp;
516
+ }
517
+
518
+ ele[p1](a1)[p2](a2);
519
+ }
520
+
521
+ function getArrowScroll(dirX, dirY, ele)
522
+ {
523
+ return function()
524
+ {
525
+ arrowScroll(dirX, dirY, this, ele);
526
+ this.blur();
527
+ return false;
528
+ };
529
+ }
530
+
531
+ function arrowScroll(dirX, dirY, arrow, ele)
532
+ {
533
+ arrow = $(arrow).addClass('jspActive');
534
+
535
+ var eve,
536
+ scrollTimeout,
537
+ isFirst = true,
538
+ doScroll = function()
539
+ {
540
+ if (dirX !== 0) {
541
+ jsp.scrollByX(dirX * settings.arrowButtonSpeed);
542
+ }
543
+ if (dirY !== 0) {
544
+ jsp.scrollByY(dirY * settings.arrowButtonSpeed);
545
+ }
546
+ scrollTimeout = setTimeout(doScroll, isFirst ? settings.initialDelay : settings.arrowRepeatFreq);
547
+ isFirst = false;
548
+ };
549
+
550
+ doScroll();
551
+
552
+ eve = ele ? 'mouseout.jsp' : 'mouseup.jsp';
553
+ ele = ele || $('html');
554
+ ele.bind(
555
+ eve,
556
+ function()
557
+ {
558
+ arrow.removeClass('jspActive');
559
+ scrollTimeout && clearTimeout(scrollTimeout);
560
+ scrollTimeout = null;
561
+ ele.unbind(eve);
562
+ }
563
+ );
564
+ }
565
+
566
+ function initClickOnTrack()
567
+ {
568
+ removeClickOnTrack();
569
+ if (isScrollableV) {
570
+ verticalTrack.bind(
571
+ 'mousedown.jsp',
572
+ function(e)
573
+ {
574
+ if (e.originalTarget === undefined || e.originalTarget == e.currentTarget) {
575
+ var clickedTrack = $(this),
576
+ offset = clickedTrack.offset(),
577
+ direction = e.pageY - offset.top - verticalDragPosition,
578
+ scrollTimeout,
579
+ isFirst = true,
580
+ doScroll = function()
581
+ {
582
+ var offset = clickedTrack.offset(),
583
+ pos = e.pageY - offset.top - verticalDragHeight / 2,
584
+ contentDragY = paneHeight * settings.scrollPagePercent,
585
+ dragY = dragMaxY * contentDragY / (contentHeight - paneHeight);
586
+ if (direction < 0) {
587
+ if (verticalDragPosition - dragY > pos) {
588
+ jsp.scrollByY(-contentDragY);
589
+ } else {
590
+ positionDragY(pos);
591
+ }
592
+ } else if (direction > 0) {
593
+ if (verticalDragPosition + dragY < pos) {
594
+ jsp.scrollByY(contentDragY);
595
+ } else {
596
+ positionDragY(pos);
597
+ }
598
+ } else {
599
+ cancelClick();
600
+ return;
601
+ }
602
+ scrollTimeout = setTimeout(doScroll, isFirst ? settings.initialDelay : settings.trackClickRepeatFreq);
603
+ isFirst = false;
604
+ },
605
+ cancelClick = function()
606
+ {
607
+ scrollTimeout && clearTimeout(scrollTimeout);
608
+ scrollTimeout = null;
609
+ $(document).unbind('mouseup.jsp', cancelClick);
610
+ };
611
+ doScroll();
612
+ $(document).bind('mouseup.jsp', cancelClick);
613
+ return false;
614
+ }
615
+ }
616
+ );
617
+ }
618
+
619
+ if (isScrollableH) {
620
+ horizontalTrack.bind(
621
+ 'mousedown.jsp',
622
+ function(e)
623
+ {
624
+ if (e.originalTarget === undefined || e.originalTarget == e.currentTarget) {
625
+ var clickedTrack = $(this),
626
+ offset = clickedTrack.offset(),
627
+ direction = e.pageX - offset.left - horizontalDragPosition,
628
+ scrollTimeout,
629
+ isFirst = true,
630
+ doScroll = function()
631
+ {
632
+ var offset = clickedTrack.offset(),
633
+ pos = e.pageX - offset.left - horizontalDragWidth / 2,
634
+ contentDragX = paneWidth * settings.scrollPagePercent,
635
+ dragX = dragMaxX * contentDragX / (contentWidth - paneWidth);
636
+ if (direction < 0) {
637
+ if (horizontalDragPosition - dragX > pos) {
638
+ jsp.scrollByX(-contentDragX);
639
+ } else {
640
+ positionDragX(pos);
641
+ }
642
+ } else if (direction > 0) {
643
+ if (horizontalDragPosition + dragX < pos) {
644
+ jsp.scrollByX(contentDragX);
645
+ } else {
646
+ positionDragX(pos);
647
+ }
648
+ } else {
649
+ cancelClick();
650
+ return;
651
+ }
652
+ scrollTimeout = setTimeout(doScroll, isFirst ? settings.initialDelay : settings.trackClickRepeatFreq);
653
+ isFirst = false;
654
+ },
655
+ cancelClick = function()
656
+ {
657
+ scrollTimeout && clearTimeout(scrollTimeout);
658
+ scrollTimeout = null;
659
+ $(document).unbind('mouseup.jsp', cancelClick);
660
+ };
661
+ doScroll();
662
+ $(document).bind('mouseup.jsp', cancelClick);
663
+ return false;
664
+ }
665
+ }
666
+ );
667
+ }
668
+ }
669
+
670
+ function removeClickOnTrack()
671
+ {
672
+ if (horizontalTrack) {
673
+ horizontalTrack.unbind('mousedown.jsp');
674
+ }
675
+ if (verticalTrack) {
676
+ verticalTrack.unbind('mousedown.jsp');
677
+ }
678
+ }
679
+
680
+ function cancelDrag()
681
+ {
682
+ $('html').unbind('dragstart.jsp selectstart.jsp mousemove.jsp mouseup.jsp mouseleave.jsp');
683
+
684
+ if (verticalDrag) {
685
+ verticalDrag.removeClass('jspActive');
686
+ }
687
+ if (horizontalDrag) {
688
+ horizontalDrag.removeClass('jspActive');
689
+ }
690
+ }
691
+
692
+ function positionDragY(destY, animate)
693
+ {
694
+ if (!isScrollableV) {
695
+ return;
696
+ }
697
+ if (destY < 0) {
698
+ destY = 0;
699
+ } else if (destY > dragMaxY) {
700
+ destY = dragMaxY;
701
+ }
702
+
703
+ // can't just check if(animate) because false is a valid value that could be passed in...
704
+ if (animate === undefined) {
705
+ animate = settings.animateScroll;
706
+ }
707
+ if (animate) {
708
+ jsp.animate(verticalDrag, 'top', destY, _positionDragY);
709
+ } else {
710
+ verticalDrag.css('top', destY);
711
+ _positionDragY(destY);
712
+ }
713
+
714
+ }
715
+
716
+ function _positionDragY(destY)
717
+ {
718
+ if (destY === undefined) {
719
+ destY = verticalDrag.position().top;
720
+ }
721
+
722
+ container.scrollTop(0);
723
+ verticalDragPosition = destY || 0;
724
+
725
+ var isAtTop = verticalDragPosition === 0,
726
+ isAtBottom = verticalDragPosition == dragMaxY,
727
+ percentScrolled = destY/ dragMaxY,
728
+ destTop = -percentScrolled * (contentHeight - paneHeight);
729
+
730
+ if (wasAtTop != isAtTop || wasAtBottom != isAtBottom) {
731
+ wasAtTop = isAtTop;
732
+ wasAtBottom = isAtBottom;
733
+ elem.trigger('jsp-arrow-change', [wasAtTop, wasAtBottom, wasAtLeft, wasAtRight]);
734
+ }
735
+
736
+ updateVerticalArrows(isAtTop, isAtBottom);
737
+ pane.css('top', destTop);
738
+ elem.trigger('jsp-scroll-y', [-destTop, isAtTop, isAtBottom]).trigger('scroll');
739
+ }
740
+
741
+ function positionDragX(destX, animate)
742
+ {
743
+ if (!isScrollableH) {
744
+ return;
745
+ }
746
+ if (destX < 0) {
747
+ destX = 0;
748
+ } else if (destX > dragMaxX) {
749
+ destX = dragMaxX;
750
+ }
751
+
752
+ if (animate === undefined) {
753
+ animate = settings.animateScroll;
754
+ }
755
+ if (animate) {
756
+ jsp.animate(horizontalDrag, 'left', destX, _positionDragX);
757
+ } else {
758
+ horizontalDrag.css('left', destX);
759
+ _positionDragX(destX);
760
+ }
761
+ }
762
+
763
+ function _positionDragX(destX)
764
+ {
765
+ if (destX === undefined) {
766
+ destX = horizontalDrag.position().left;
767
+ }
768
+
769
+ container.scrollTop(0);
770
+ horizontalDragPosition = destX ||0;
771
+
772
+ var isAtLeft = horizontalDragPosition === 0,
773
+ isAtRight = horizontalDragPosition == dragMaxX,
774
+ percentScrolled = destX / dragMaxX,
775
+ destLeft = -percentScrolled * (contentWidth - paneWidth);
776
+
777
+ if (wasAtLeft != isAtLeft || wasAtRight != isAtRight) {
778
+ wasAtLeft = isAtLeft;
779
+ wasAtRight = isAtRight;
780
+ elem.trigger('jsp-arrow-change', [wasAtTop, wasAtBottom, wasAtLeft, wasAtRight]);
781
+ }
782
+
783
+ updateHorizontalArrows(isAtLeft, isAtRight);
784
+ pane.css('left', destLeft);
785
+ elem.trigger('jsp-scroll-x', [-destLeft, isAtLeft, isAtRight]).trigger('scroll');
786
+ }
787
+
788
+ function updateVerticalArrows(isAtTop, isAtBottom)
789
+ {
790
+ if (settings.showArrows) {
791
+ arrowUp[isAtTop ? 'addClass' : 'removeClass']('jspDisabled');
792
+ arrowDown[isAtBottom ? 'addClass' : 'removeClass']('jspDisabled');
793
+ }
794
+ }
795
+
796
+ function updateHorizontalArrows(isAtLeft, isAtRight)
797
+ {
798
+ if (settings.showArrows) {
799
+ arrowLeft[isAtLeft ? 'addClass' : 'removeClass']('jspDisabled');
800
+ arrowRight[isAtRight ? 'addClass' : 'removeClass']('jspDisabled');
801
+ }
802
+ }
803
+
804
+ function scrollToY(destY, animate)
805
+ {
806
+ var percentScrolled = destY / (contentHeight - paneHeight);
807
+ positionDragY(percentScrolled * dragMaxY, animate);
808
+ }
809
+
810
+ function scrollToX(destX, animate)
811
+ {
812
+ var percentScrolled = destX / (contentWidth - paneWidth);
813
+ positionDragX(percentScrolled * dragMaxX, animate);
814
+ }
815
+
816
+ function scrollToElement(ele, stickToTop, animate)
817
+ {
818
+ var e, eleHeight, eleWidth, eleTop = 0, eleLeft = 0, viewportTop, viewportLeft, maxVisibleEleTop, maxVisibleEleLeft, destY, destX;
819
+
820
+ // Legal hash values aren't necessarily legal jQuery selectors so we need to catch any
821
+ // errors from the lookup...
822
+ try {
823
+ e = $(ele);
824
+ } catch (err) {
825
+ return;
826
+ }
827
+ eleHeight = e.outerHeight();
828
+ eleWidth= e.outerWidth();
829
+
830
+ container.scrollTop(0);
831
+ container.scrollLeft(0);
832
+
833
+ // loop through parents adding the offset top of any elements that are relatively positioned between
834
+ // the focused element and the jspPane so we can get the true distance from the top
835
+ // of the focused element to the top of the scrollpane...
836
+ while (!e.is('.jspPane')) {
837
+ eleTop += e.position().top;
838
+ eleLeft += e.position().left;
839
+ e = e.offsetParent();
840
+ if (/^body|html$/i.test(e[0].nodeName)) {
841
+ // we ended up too high in the document structure. Quit!
842
+ return;
843
+ }
844
+ }
845
+
846
+ viewportTop = contentPositionY();
847
+ maxVisibleEleTop = viewportTop + paneHeight;
848
+ if (eleTop < viewportTop || stickToTop) { // element is above viewport
849
+ destY = eleTop - settings.horizontalGutter;
850
+ } else if (eleTop + eleHeight > maxVisibleEleTop) { // element is below viewport
851
+ destY = eleTop - paneHeight + eleHeight + settings.horizontalGutter;
852
+ }
853
+ if (!isNaN(destY)) {
854
+ scrollToY(destY, animate);
855
+ }
856
+
857
+ viewportLeft = contentPositionX();
858
+ maxVisibleEleLeft = viewportLeft + paneWidth;
859
+ if (eleLeft < viewportLeft || stickToTop) { // element is to the left of viewport
860
+ destX = eleLeft - settings.horizontalGutter;
861
+ } else if (eleLeft + eleWidth > maxVisibleEleLeft) { // element is to the right viewport
862
+ destX = eleLeft - paneWidth + eleWidth + settings.horizontalGutter;
863
+ }
864
+ if (!isNaN(destX)) {
865
+ scrollToX(destX, animate);
866
+ }
867
+
868
+ }
869
+
870
+ function contentPositionX()
871
+ {
872
+ return -pane.position().left;
873
+ }
874
+
875
+ function contentPositionY()
876
+ {
877
+ return -pane.position().top;
878
+ }
879
+
880
+ function isCloseToBottom()
881
+ {
882
+ var scrollableHeight = contentHeight - paneHeight;
883
+ return (scrollableHeight > 20) && (scrollableHeight - contentPositionY() < 10);
884
+ }
885
+
886
+ function isCloseToRight()
887
+ {
888
+ var scrollableWidth = contentWidth - paneWidth;
889
+ return (scrollableWidth > 20) && (scrollableWidth - contentPositionX() < 10);
890
+ }
891
+
892
+ function initMousewheel()
893
+ {
894
+ container.unbind(mwEvent).bind(
895
+ mwEvent,
896
+ function (event, delta, deltaX, deltaY) {
897
+
898
+ if (!horizontalDragPosition) horizontalDragPosition = 0;
899
+ if (!verticalDragPosition) verticalDragPosition = 0;
900
+
901
+ var dX = horizontalDragPosition, dY = verticalDragPosition, factor = event.deltaFactor || settings.mouseWheelSpeed;
902
+ jsp.scrollBy(deltaX * factor, -deltaY * factor, false);
903
+ // return true if there was no movement so rest of screen can scroll
904
+ return dX == horizontalDragPosition && dY == verticalDragPosition;
905
+ }
906
+ );
907
+ }
908
+
909
+ function removeMousewheel()
910
+ {
911
+ container.unbind(mwEvent);
912
+ }
913
+
914
+ function nil()
915
+ {
916
+ return false;
917
+ }
918
+
919
+ function initFocusHandler()
920
+ {
921
+ pane.find(':input,a').unbind('focus.jsp').bind(
922
+ 'focus.jsp',
923
+ function(e)
924
+ {
925
+ scrollToElement(e.target, false);
926
+ }
927
+ );
928
+ }
929
+
930
+ function removeFocusHandler()
931
+ {
932
+ pane.find(':input,a').unbind('focus.jsp');
933
+ }
934
+
935
+ function initKeyboardNav()
936
+ {
937
+ var keyDown, elementHasScrolled, validParents = [];
938
+ isScrollableH && validParents.push(horizontalBar[0]);
939
+ isScrollableV && validParents.push(verticalBar[0]);
940
+
941
+ // IE also focuses elements that don't have tabindex set.
942
+ pane.focus(
943
+ function()
944
+ {
945
+ elem.focus();
946
+ }
947
+ );
948
+
949
+ elem.attr('tabindex', 0)
950
+ .unbind('keydown.jsp keypress.jsp')
951
+ .bind(
952
+ 'keydown.jsp',
953
+ function(e)
954
+ {
955
+ if (e.target !== this && !(validParents.length && $(e.target).closest(validParents).length)){
956
+ return;
957
+ }
958
+ var dX = horizontalDragPosition, dY = verticalDragPosition;
959
+ switch(e.keyCode) {
960
+ case 40: // down
961
+ case 38: // up
962
+ case 34: // page down
963
+ case 32: // space
964
+ case 33: // page up
965
+ case 39: // right
966
+ case 37: // left
967
+ keyDown = e.keyCode;
968
+ keyDownHandler();
969
+ break;
970
+ case 35: // end
971
+ scrollToY(contentHeight - paneHeight);
972
+ keyDown = null;
973
+ break;
974
+ case 36: // home
975
+ scrollToY(0);
976
+ keyDown = null;
977
+ break;
978
+ }
979
+
980
+ elementHasScrolled = e.keyCode == keyDown && dX != horizontalDragPosition || dY != verticalDragPosition;
981
+ return !elementHasScrolled;
982
+ }
983
+ ).bind(
984
+ 'keypress.jsp', // For FF/ OSX so that we can cancel the repeat key presses if the JSP scrolls...
985
+ function(e)
986
+ {
987
+ if (e.keyCode == keyDown) {
988
+ keyDownHandler();
989
+ }
990
+ return !elementHasScrolled;
991
+ }
992
+ );
993
+
994
+ if (settings.hideFocus) {
995
+ elem.css('outline', 'none');
996
+ if ('hideFocus' in container[0]){
997
+ elem.attr('hideFocus', true);
998
+ }
999
+ } else {
1000
+ elem.css('outline', '');
1001
+ if ('hideFocus' in container[0]){
1002
+ elem.attr('hideFocus', false);
1003
+ }
1004
+ }
1005
+
1006
+ function keyDownHandler()
1007
+ {
1008
+ var dX = horizontalDragPosition, dY = verticalDragPosition;
1009
+ switch(keyDown) {
1010
+ case 40: // down
1011
+ jsp.scrollByY(settings.keyboardSpeed, false);
1012
+ break;
1013
+ case 38: // up
1014
+ jsp.scrollByY(-settings.keyboardSpeed, false);
1015
+ break;
1016
+ case 34: // page down
1017
+ case 32: // space
1018
+ jsp.scrollByY(paneHeight * settings.scrollPagePercent, false);
1019
+ break;
1020
+ case 33: // page up
1021
+ jsp.scrollByY(-paneHeight * settings.scrollPagePercent, false);
1022
+ break;
1023
+ case 39: // right
1024
+ jsp.scrollByX(settings.keyboardSpeed, false);
1025
+ break;
1026
+ case 37: // left
1027
+ jsp.scrollByX(-settings.keyboardSpeed, false);
1028
+ break;
1029
+ }
1030
+
1031
+ elementHasScrolled = dX != horizontalDragPosition || dY != verticalDragPosition;
1032
+ return elementHasScrolled;
1033
+ }
1034
+ }
1035
+
1036
+ function removeKeyboardNav()
1037
+ {
1038
+ elem.attr('tabindex', '-1')
1039
+ .removeAttr('tabindex')
1040
+ .unbind('keydown.jsp keypress.jsp');
1041
+ }
1042
+
1043
+ function observeHash()
1044
+ {
1045
+ if (location.hash && location.hash.length > 1) {
1046
+ var e,
1047
+ retryInt,
1048
+ hash = escape(location.hash.substr(1)) // hash must be escaped to prevent XSS
1049
+ ;
1050
+ try {
1051
+ e = $('#' + hash + ', a[name="' + hash + '"]');
1052
+ } catch (err) {
1053
+ return;
1054
+ }
1055
+
1056
+ if (e.length && pane.find(hash)) {
1057
+ // nasty workaround but it appears to take a little while before the hash has done its thing
1058
+ // to the rendered page so we just wait until the container's scrollTop has been messed up.
1059
+ if (container.scrollTop() === 0) {
1060
+ retryInt = setInterval(
1061
+ function()
1062
+ {
1063
+ if (container.scrollTop() > 0) {
1064
+ scrollToElement(e, true);
1065
+ $(document).scrollTop(container.position().top);
1066
+ clearInterval(retryInt);
1067
+ }
1068
+ },
1069
+ 50
1070
+ );
1071
+ } else {
1072
+ scrollToElement(e, true);
1073
+ $(document).scrollTop(container.position().top);
1074
+ }
1075
+ }
1076
+ }
1077
+ }
1078
+
1079
+ function hijackInternalLinks()
1080
+ {
1081
+ // only register the link handler once
1082
+ if ($(document.body).data('jspHijack')) {
1083
+ return;
1084
+ }
1085
+
1086
+ // remember that the handler was bound
1087
+ $(document.body).data('jspHijack', true);
1088
+
1089
+ // use live handler to also capture newly created links
1090
+ $(document.body).delegate('a[href*=#]', 'click', function(event) {
1091
+ // does the link point to the same page?
1092
+ // this also takes care of cases with a <base>-Tag or Links not starting with the hash #
1093
+ // e.g. <a href="index.html#test"> when the current url already is index.html
1094
+ var href = this.href.substr(0, this.href.indexOf('#')),
1095
+ locationHref = location.href,
1096
+ hash,
1097
+ element,
1098
+ container,
1099
+ jsp,
1100
+ scrollTop,
1101
+ elementTop;
1102
+ if (location.href.indexOf('#') !== -1) {
1103
+ locationHref = location.href.substr(0, location.href.indexOf('#'));
1104
+ }
1105
+ if (href !== locationHref) {
1106
+ // the link points to another page
1107
+ return;
1108
+ }
1109
+
1110
+ // check if jScrollPane should handle this click event
1111
+ hash = escape(this.href.substr(this.href.indexOf('#') + 1));
1112
+
1113
+ // find the element on the page
1114
+ element;
1115
+ try {
1116
+ element = $('#' + hash + ', a[name="' + hash + '"]');
1117
+ } catch (e) {
1118
+ // hash is not a valid jQuery identifier
1119
+ return;
1120
+ }
1121
+
1122
+ if (!element.length) {
1123
+ // this link does not point to an element on this page
1124
+ return;
1125
+ }
1126
+
1127
+ container = element.closest('.jspScrollable');
1128
+ jsp = container.data('jsp');
1129
+
1130
+ // jsp might be another jsp instance than the one, that bound this event
1131
+ // remember: this event is only bound once for all instances.
1132
+ jsp.scrollToElement(element, true);
1133
+
1134
+ if (container[0].scrollIntoView) {
1135
+ // also scroll to the top of the container (if it is not visible)
1136
+ scrollTop = $(window).scrollTop();
1137
+ elementTop = element.offset().top;
1138
+ if (elementTop < scrollTop || elementTop > scrollTop + $(window).height()) {
1139
+ container[0].scrollIntoView();
1140
+ }
1141
+ }
1142
+
1143
+ // jsp handled this event, prevent the browser default (scrolling :P)
1144
+ event.preventDefault();
1145
+ });
1146
+ }
1147
+
1148
+ // Init touch on iPad, iPhone, iPod, Android
1149
+ function initTouch()
1150
+ {
1151
+ var startX,
1152
+ startY,
1153
+ touchStartX,
1154
+ touchStartY,
1155
+ moved,
1156
+ moving = false;
1157
+
1158
+ container.unbind('touchstart.jsp touchmove.jsp touchend.jsp click.jsp-touchclick').bind(
1159
+ 'touchstart.jsp',
1160
+ function(e)
1161
+ {
1162
+ var touch = e.originalEvent.touches[0];
1163
+ startX = contentPositionX();
1164
+ startY = contentPositionY();
1165
+ touchStartX = touch.pageX;
1166
+ touchStartY = touch.pageY;
1167
+ moved = false;
1168
+ moving = true;
1169
+ }
1170
+ ).bind(
1171
+ 'touchmove.jsp',
1172
+ function(ev)
1173
+ {
1174
+ if(!moving) {
1175
+ return;
1176
+ }
1177
+
1178
+ var touchPos = ev.originalEvent.touches[0],
1179
+ dX = horizontalDragPosition, dY = verticalDragPosition;
1180
+
1181
+ jsp.scrollTo(startX + touchStartX - touchPos.pageX, startY + touchStartY - touchPos.pageY);
1182
+
1183
+ moved = moved || Math.abs(touchStartX - touchPos.pageX) > 5 || Math.abs(touchStartY - touchPos.pageY) > 5;
1184
+
1185
+ // return true if there was no movement so rest of screen can scroll
1186
+ return dX == horizontalDragPosition && dY == verticalDragPosition;
1187
+ }
1188
+ ).bind(
1189
+ 'touchend.jsp',
1190
+ function(e)
1191
+ {
1192
+ moving = false;
1193
+ /*if(moved) {
1194
+ return false;
1195
+ }*/
1196
+ }
1197
+ ).bind(
1198
+ 'click.jsp-touchclick',
1199
+ function(e)
1200
+ {
1201
+ if(moved) {
1202
+ moved = false;
1203
+ return false;
1204
+ }
1205
+ }
1206
+ );
1207
+ }
1208
+
1209
+ function destroy(){
1210
+ var currentY = contentPositionY(),
1211
+ currentX = contentPositionX();
1212
+ elem.removeClass('jspScrollable').unbind('.jsp');
1213
+ elem.replaceWith(originalElement.append(pane.children()));
1214
+ originalElement.scrollTop(currentY);
1215
+ originalElement.scrollLeft(currentX);
1216
+
1217
+ // clear reinitialize timer if active
1218
+ if (reinitialiseInterval) {
1219
+ clearInterval(reinitialiseInterval);
1220
+ }
1221
+ }
1222
+
1223
+ // Public API
1224
+ $.extend(
1225
+ jsp,
1226
+ {
1227
+ // Reinitialises the scroll pane (if it's internal dimensions have changed since the last time it
1228
+ // was initialised). The settings object which is passed in will override any settings from the
1229
+ // previous time it was initialised - if you don't pass any settings then the ones from the previous
1230
+ // initialisation will be used.
1231
+ reinitialise: function(s)
1232
+ {
1233
+ s = $.extend({}, settings, s);
1234
+ initialise(s);
1235
+ },
1236
+ // Scrolls the specified element (a jQuery object, DOM node or jQuery selector string) into view so
1237
+ // that it can be seen within the viewport. If stickToTop is true then the element will appear at
1238
+ // the top of the viewport, if it is false then the viewport will scroll as little as possible to
1239
+ // show the element. You can also specify if you want animation to occur. If you don't provide this
1240
+ // argument then the animateScroll value from the settings object is used instead.
1241
+ scrollToElement: function(ele, stickToTop, animate)
1242
+ {
1243
+ scrollToElement(ele, stickToTop, animate);
1244
+ },
1245
+ // Scrolls the pane so that the specified co-ordinates within the content are at the top left
1246
+ // of the viewport. animate is optional and if not passed then the value of animateScroll from
1247
+ // the settings object this jScrollPane was initialised with is used.
1248
+ scrollTo: function(destX, destY, animate)
1249
+ {
1250
+ scrollToX(destX, animate);
1251
+ scrollToY(destY, animate);
1252
+ },
1253
+ // Scrolls the pane so that the specified co-ordinate within the content is at the left of the
1254
+ // viewport. animate is optional and if not passed then the value of animateScroll from the settings
1255
+ // object this jScrollPane was initialised with is used.
1256
+ scrollToX: function(destX, animate)
1257
+ {
1258
+ scrollToX(destX, animate);
1259
+ },
1260
+ // Scrolls the pane so that the specified co-ordinate within the content is at the top of the
1261
+ // viewport. animate is optional and if not passed then the value of animateScroll from the settings
1262
+ // object this jScrollPane was initialised with is used.
1263
+ scrollToY: function(destY, animate)
1264
+ {
1265
+ scrollToY(destY, animate);
1266
+ },
1267
+ // Scrolls the pane to the specified percentage of its maximum horizontal scroll position. animate
1268
+ // is optional and if not passed then the value of animateScroll from the settings object this
1269
+ // jScrollPane was initialised with is used.
1270
+ scrollToPercentX: function(destPercentX, animate)
1271
+ {
1272
+ scrollToX(destPercentX * (contentWidth - paneWidth), animate);
1273
+ },
1274
+ // Scrolls the pane to the specified percentage of its maximum vertical scroll position. animate
1275
+ // is optional and if not passed then the value of animateScroll from the settings object this
1276
+ // jScrollPane was initialised with is used.
1277
+ scrollToPercentY: function(destPercentY, animate)
1278
+ {
1279
+ scrollToY(destPercentY * (contentHeight - paneHeight), animate);
1280
+ },
1281
+ // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
1282
+ // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
1283
+ scrollBy: function(deltaX, deltaY, animate)
1284
+ {
1285
+ jsp.scrollByX(deltaX, animate);
1286
+ jsp.scrollByY(deltaY, animate);
1287
+ },
1288
+ // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
1289
+ // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
1290
+ scrollByX: function(deltaX, animate)
1291
+ {
1292
+ var destX = contentPositionX() + Math[deltaX<0 ? 'floor' : 'ceil'](deltaX),
1293
+ percentScrolled = destX / (contentWidth - paneWidth);
1294
+ positionDragX(percentScrolled * dragMaxX, animate);
1295
+ },
1296
+ // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
1297
+ // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
1298
+ scrollByY: function(deltaY, animate)
1299
+ {
1300
+ var destY = contentPositionY() + Math[deltaY<0 ? 'floor' : 'ceil'](deltaY),
1301
+ percentScrolled = destY / (contentHeight - paneHeight);
1302
+ positionDragY(percentScrolled * dragMaxY, animate);
1303
+ },
1304
+ // Positions the horizontal drag at the specified x position (and updates the viewport to reflect
1305
+ // this). animate is optional and if not passed then the value of animateScroll from the settings
1306
+ // object this jScrollPane was initialised with is used.
1307
+ positionDragX: function(x, animate)
1308
+ {
1309
+ positionDragX(x, animate);
1310
+ },
1311
+ // Positions the vertical drag at the specified y position (and updates the viewport to reflect
1312
+ // this). animate is optional and if not passed then the value of animateScroll from the settings
1313
+ // object this jScrollPane was initialised with is used.
1314
+ positionDragY: function(y, animate)
1315
+ {
1316
+ positionDragY(y, animate);
1317
+ },
1318
+ // This method is called when jScrollPane is trying to animate to a new position. You can override
1319
+ // it if you want to provide advanced animation functionality. It is passed the following arguments:
1320
+ // * ele - the element whose position is being animated
1321
+ // * prop - the property that is being animated
1322
+ // * value - the value it's being animated to
1323
+ // * stepCallback - a function that you must execute each time you update the value of the property
1324
+ // You can use the default implementation (below) as a starting point for your own implementation.
1325
+ animate: function(ele, prop, value, stepCallback)
1326
+ {
1327
+ var params = {};
1328
+ params[prop] = value;
1329
+ ele.animate(
1330
+ params,
1331
+ {
1332
+ 'duration' : settings.animateDuration,
1333
+ 'easing' : settings.animateEase,
1334
+ 'queue' : false,
1335
+ 'step' : stepCallback
1336
+ }
1337
+ );
1338
+ },
1339
+ // Returns the current x position of the viewport with regards to the content pane.
1340
+ getContentPositionX: function()
1341
+ {
1342
+ return contentPositionX();
1343
+ },
1344
+ // Returns the current y position of the viewport with regards to the content pane.
1345
+ getContentPositionY: function()
1346
+ {
1347
+ return contentPositionY();
1348
+ },
1349
+ // Returns the width of the content within the scroll pane.
1350
+ getContentWidth: function()
1351
+ {
1352
+ return contentWidth;
1353
+ },
1354
+ // Returns the height of the content within the scroll pane.
1355
+ getContentHeight: function()
1356
+ {
1357
+ return contentHeight;
1358
+ },
1359
+ // Returns the horizontal position of the viewport within the pane content.
1360
+ getPercentScrolledX: function()
1361
+ {
1362
+ return contentPositionX() / (contentWidth - paneWidth);
1363
+ },
1364
+ // Returns the vertical position of the viewport within the pane content.
1365
+ getPercentScrolledY: function()
1366
+ {
1367
+ return contentPositionY() / (contentHeight - paneHeight);
1368
+ },
1369
+ // Returns whether or not this scrollpane has a horizontal scrollbar.
1370
+ getIsScrollableH: function()
1371
+ {
1372
+ return isScrollableH;
1373
+ },
1374
+ // Returns whether or not this scrollpane has a vertical scrollbar.
1375
+ getIsScrollableV: function()
1376
+ {
1377
+ return isScrollableV;
1378
+ },
1379
+ // Gets a reference to the content pane. It is important that you use this method if you want to
1380
+ // edit the content of your jScrollPane as if you access the element directly then you may have some
1381
+ // problems (as your original element has had additional elements for the scrollbars etc added into
1382
+ // it).
1383
+ getContentPane: function()
1384
+ {
1385
+ return pane;
1386
+ },
1387
+ // Scrolls this jScrollPane down as far as it can currently scroll. If animate isn't passed then the
1388
+ // animateScroll value from settings is used instead.
1389
+ scrollToBottom: function(animate)
1390
+ {
1391
+ positionDragY(dragMaxY, animate);
1392
+ },
1393
+ // Hijacks the links on the page which link to content inside the scrollpane. If you have changed
1394
+ // the content of your page (e.g. via AJAX) and want to make sure any new anchor links to the
1395
+ // contents of your scroll pane will work then call this function.
1396
+ hijackInternalLinks: $.noop,
1397
+ // Removes the jScrollPane and returns the page to the state it was in before jScrollPane was
1398
+ // initialised.
1399
+ destroy: function()
1400
+ {
1401
+ destroy();
1402
+ }
1403
+ }
1404
+ );
1405
+
1406
+ initialise(s);
1407
+ }
1408
+
1409
+ // Pluginifying code...
1410
+ settings = $.extend({}, $.fn.jScrollPane.defaults, settings);
1411
+
1412
+ // Apply default speed
1413
+ $.each(['arrowButtonSpeed', 'trackClickSpeed', 'keyboardSpeed'], function() {
1414
+ settings[this] = settings[this] || settings.speed;
1415
+ });
1416
+
1417
+ return this.each(
1418
+ function()
1419
+ {
1420
+ var elem = $(this), jspApi = elem.data('jsp');
1421
+ if (jspApi) {
1422
+ jspApi.reinitialise(settings);
1423
+ } else {
1424
+ $("script",elem).filter('[type="text/javascript"],:not([type])').remove();
1425
+ jspApi = new JScrollPane(elem, settings);
1426
+ elem.data('jsp', jspApi);
1427
+ }
1428
+ }
1429
+ );
1430
+ };
1431
+
1432
+ $.fn.jScrollPane.defaults = {
1433
+ showArrows : false,
1434
+ maintainPosition : true,
1435
+ stickToBottom : false,
1436
+ stickToRight : false,
1437
+ clickOnTrack : true,
1438
+ autoReinitialise : false,
1439
+ autoReinitialiseDelay : 500,
1440
+ verticalDragMinHeight : 0,
1441
+ verticalDragMaxHeight : 99999,
1442
+ horizontalDragMinWidth : 0,
1443
+ horizontalDragMaxWidth : 99999,
1444
+ contentWidth : undefined,
1445
+ animateScroll : false,
1446
+ animateDuration : 300,
1447
+ animateEase : 'linear',
1448
+ hijackInternalLinks : false,
1449
+ verticalGutter : 4,
1450
+ horizontalGutter : 4,
1451
+ mouseWheelSpeed : 3,
1452
+ arrowButtonSpeed : 0,
1453
+ arrowRepeatFreq : 50,
1454
+ arrowScrollOnHover : false,
1455
+ trackClickSpeed : 0,
1456
+ trackClickRepeatFreq : 70,
1457
+ verticalArrowPositions : 'split',
1458
+ horizontalArrowPositions : 'split',
1459
+ enableKeyboardNavigation : true,
1460
+ hideFocus : false,
1461
+ keyboardSpeed : 0,
1462
+ initialDelay : 300, // Delay before starting repeating
1463
+ speed : 30, // Default speed when others falsey
1464
+ scrollPagePercent : .8 // Percent of visible area scrolled when pageUp/Down or track area pressed
1465
+ };
1466
+
1467
+ },this));