roda-component 0.0.10 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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));