tb_core 0.9.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (341) hide show
  1. checksums.yaml +15 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.markdown +60 -0
  4. data/Rakefile +28 -0
  5. data/app/assets/images/back_disabled.jpg +0 -0
  6. data/app/assets/images/back_enabled.jpg +0 -0
  7. data/app/assets/images/favicon.ico +0 -0
  8. data/app/assets/images/forward_disabled.jpg +0 -0
  9. data/app/assets/images/forward_enabled.jpg +0 -0
  10. data/app/assets/images/sort_asc.png +0 -0
  11. data/app/assets/images/sort_asc_disabled.png +0 -0
  12. data/app/assets/images/sort_both.png +0 -0
  13. data/app/assets/images/sort_desc.png +0 -0
  14. data/app/assets/images/sort_desc_disabled.png +0 -0
  15. data/app/assets/images/spud/admin/down_arrow.gif +0 -0
  16. data/app/assets/images/spud/admin/flick/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  17. data/app/assets/images/spud/admin/flick/ui-bg_flat_0_eeeeee_40x100.png +0 -0
  18. data/app/assets/images/spud/admin/flick/ui-bg_flat_55_ffffff_40x100.png +0 -0
  19. data/app/assets/images/spud/admin/flick/ui-bg_flat_75_ffffff_40x100.png +0 -0
  20. data/app/assets/images/spud/admin/flick/ui-bg_glass_65_ffffff_1x400.png +0 -0
  21. data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
  22. data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
  23. data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
  24. data/app/assets/images/spud/admin/flick/ui-icons_0073ea_256x240.png +0 -0
  25. data/app/assets/images/spud/admin/flick/ui-icons_454545_256x240.png +0 -0
  26. data/app/assets/images/spud/admin/flick/ui-icons_666666_256x240.png +0 -0
  27. data/app/assets/images/spud/admin/flick/ui-icons_ff0084_256x240.png +0 -0
  28. data/app/assets/images/spud/admin/flick/ui-icons_ffffff_256x240.png +0 -0
  29. data/app/assets/images/spud/admin/spud_logo.png +0 -0
  30. data/app/assets/images/spud/admin/spud_logo@2x.png +0 -0
  31. data/app/assets/images/spud/admin/up_arrow.gif +0 -0
  32. data/app/assets/images/spud/admin/users_thumb.png +0 -0
  33. data/app/assets/javascripts/spud/admin/application.js +133 -0
  34. data/app/assets/javascripts/spud/admin/dashboard.js +80 -0
  35. data/app/assets/javascripts/spud/admin/date_picker.js +56 -0
  36. data/app/assets/javascripts/spud/admin/editor.js +167 -0
  37. data/app/assets/javascripts/spud/admin/jquery.dataTables.min.js +151 -0
  38. data/app/assets/javascripts/spud/admin/preinit.js +1 -0
  39. data/app/assets/javascripts/spud/password_resets.js +2 -0
  40. data/app/assets/libs/bootstrap/css/bootstrap-responsive.css +1088 -0
  41. data/app/assets/libs/bootstrap/css/bootstrap.css +5893 -0
  42. data/app/assets/libs/bootstrap/img/glyphicons-halflings-white.png +0 -0
  43. data/app/assets/libs/bootstrap/img/glyphicons-halflings.png +0 -0
  44. data/app/assets/libs/bootstrap/js/bootstrap.js +2025 -0
  45. data/app/assets/libs/datepicker/css/datepicker.css +223 -0
  46. data/app/assets/libs/datepicker/js/bootstrap-datepicker.js +779 -0
  47. data/app/assets/libs/datepicker/less/datepicker.less +122 -0
  48. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  49. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_0_eeeeee_40x100.png +0 -0
  50. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_55_ffffff_40x100.png +0 -0
  51. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  52. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  53. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
  54. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
  55. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
  56. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_0073ea_256x240.png +0 -0
  57. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_454545_256x240.png +0 -0
  58. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_666666_256x240.png +0 -0
  59. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_ff0084_256x240.png +0 -0
  60. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_ffffff_256x240.png +0 -0
  61. data/app/assets/libs/jquery-ui/css/flick/jquery-ui-1.9.1.custom.css +297 -0
  62. data/app/assets/libs/jquery-ui/css/flick/jquery-ui-1.9.1.custom.min.css +5 -0
  63. data/app/assets/libs/jquery-ui/js/jquery-ui-1.9.1.custom.js +4870 -0
  64. data/app/assets/libs/jquery-ui/js/jquery-ui-1.9.1.custom.min.js +6 -0
  65. data/app/assets/libs/tiny_mce/jquery.tinymce.js +1 -0
  66. data/app/assets/libs/tiny_mce/langs/en.js +1 -0
  67. data/app/assets/libs/tiny_mce/license.txt +504 -0
  68. data/app/assets/libs/tiny_mce/plugins/advhr/css/advhr.css +5 -0
  69. data/app/assets/libs/tiny_mce/plugins/advhr/editor_plugin.js +1 -0
  70. data/app/assets/libs/tiny_mce/plugins/advhr/editor_plugin_src.js +57 -0
  71. data/app/assets/libs/tiny_mce/plugins/advhr/js/rule.js +43 -0
  72. data/app/assets/libs/tiny_mce/plugins/advhr/langs/en_dlg.js +1 -0
  73. data/app/assets/libs/tiny_mce/plugins/advhr/rule.htm +58 -0
  74. data/app/assets/libs/tiny_mce/plugins/advimage/css/advimage.css +13 -0
  75. data/app/assets/libs/tiny_mce/plugins/advimage/editor_plugin.js +1 -0
  76. data/app/assets/libs/tiny_mce/plugins/advimage/editor_plugin_src.js +50 -0
  77. data/app/assets/libs/tiny_mce/plugins/advimage/image.htm +235 -0
  78. data/app/assets/libs/tiny_mce/plugins/advimage/img/sample.gif +0 -0
  79. data/app/assets/libs/tiny_mce/plugins/advimage/js/image.js +462 -0
  80. data/app/assets/libs/tiny_mce/plugins/advimage/langs/en_dlg.js +1 -0
  81. data/app/assets/libs/tiny_mce/plugins/advlink/css/advlink.css +8 -0
  82. data/app/assets/libs/tiny_mce/plugins/advlink/editor_plugin.js +1 -0
  83. data/app/assets/libs/tiny_mce/plugins/advlink/editor_plugin_src.js +61 -0
  84. data/app/assets/libs/tiny_mce/plugins/advlink/js/advlink.js +539 -0
  85. data/app/assets/libs/tiny_mce/plugins/advlink/langs/en_dlg.js +1 -0
  86. data/app/assets/libs/tiny_mce/plugins/advlink/link.htm +338 -0
  87. data/app/assets/libs/tiny_mce/plugins/advlist/editor_plugin.js +1 -0
  88. data/app/assets/libs/tiny_mce/plugins/advlist/editor_plugin_src.js +176 -0
  89. data/app/assets/libs/tiny_mce/plugins/autolink/editor_plugin.js +1 -0
  90. data/app/assets/libs/tiny_mce/plugins/autolink/editor_plugin_src.js +174 -0
  91. data/app/assets/libs/tiny_mce/plugins/autoresize/editor_plugin.js +1 -0
  92. data/app/assets/libs/tiny_mce/plugins/autoresize/editor_plugin_src.js +119 -0
  93. data/app/assets/libs/tiny_mce/plugins/contextmenu/editor_plugin.js +1 -0
  94. data/app/assets/libs/tiny_mce/plugins/contextmenu/editor_plugin_src.js +161 -0
  95. data/app/assets/libs/tiny_mce/plugins/directionality/editor_plugin.js +1 -0
  96. data/app/assets/libs/tiny_mce/plugins/directionality/editor_plugin_src.js +82 -0
  97. data/app/assets/libs/tiny_mce/plugins/example/dialog.htm +22 -0
  98. data/app/assets/libs/tiny_mce/plugins/example/editor_plugin.js +1 -0
  99. data/app/assets/libs/tiny_mce/plugins/example/editor_plugin_src.js +84 -0
  100. data/app/assets/libs/tiny_mce/plugins/example/img/example.gif +0 -0
  101. data/app/assets/libs/tiny_mce/plugins/example/js/dialog.js +19 -0
  102. data/app/assets/libs/tiny_mce/plugins/example/langs/en.js +3 -0
  103. data/app/assets/libs/tiny_mce/plugins/example/langs/en_dlg.js +3 -0
  104. data/app/assets/libs/tiny_mce/plugins/example_dependency/editor_plugin.js +1 -0
  105. data/app/assets/libs/tiny_mce/plugins/example_dependency/editor_plugin_src.js +50 -0
  106. data/app/assets/libs/tiny_mce/plugins/iespell/editor_plugin.js +1 -0
  107. data/app/assets/libs/tiny_mce/plugins/iespell/editor_plugin_src.js +54 -0
  108. data/app/assets/libs/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
  109. data/app/assets/libs/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +699 -0
  110. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  111. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  112. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  113. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  114. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  115. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  116. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  117. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
  118. data/app/assets/libs/tiny_mce/plugins/inlinepopups/template.htm +387 -0
  119. data/app/assets/libs/tiny_mce/plugins/layer/editor_plugin.js +1 -0
  120. data/app/assets/libs/tiny_mce/plugins/layer/editor_plugin_src.js +262 -0
  121. data/app/assets/libs/tiny_mce/plugins/lists/editor_plugin.js +1 -0
  122. data/app/assets/libs/tiny_mce/plugins/lists/editor_plugin_src.js +951 -0
  123. data/app/assets/libs/tiny_mce/plugins/media/css/media.css +17 -0
  124. data/app/assets/libs/tiny_mce/plugins/media/editor_plugin.js +1 -0
  125. data/app/assets/libs/tiny_mce/plugins/media/editor_plugin_src.js +890 -0
  126. data/app/assets/libs/tiny_mce/plugins/media/js/embed.js +73 -0
  127. data/app/assets/libs/tiny_mce/plugins/media/js/media.js +470 -0
  128. data/app/assets/libs/tiny_mce/plugins/media/langs/en_dlg.js +1 -0
  129. data/app/assets/libs/tiny_mce/plugins/media/media.htm +922 -0
  130. data/app/assets/libs/tiny_mce/plugins/media/moxieplayer.swf +0 -0
  131. data/app/assets/libs/tiny_mce/plugins/paste/editor_plugin.js +1 -0
  132. data/app/assets/libs/tiny_mce/plugins/paste/editor_plugin_src.js +871 -0
  133. data/app/assets/libs/tiny_mce/plugins/paste/js/pastetext.js +36 -0
  134. data/app/assets/libs/tiny_mce/plugins/paste/js/pasteword.js +51 -0
  135. data/app/assets/libs/tiny_mce/plugins/paste/langs/en_dlg.js +1 -0
  136. data/app/assets/libs/tiny_mce/plugins/paste/pastetext.htm +27 -0
  137. data/app/assets/libs/tiny_mce/plugins/paste/pasteword.htm +21 -0
  138. data/app/assets/libs/tiny_mce/plugins/spellchecker/css/content.css +1 -0
  139. data/app/assets/libs/tiny_mce/plugins/spellchecker/editor_plugin.js +1 -0
  140. data/app/assets/libs/tiny_mce/plugins/spellchecker/editor_plugin_src.js +436 -0
  141. data/app/assets/libs/tiny_mce/plugins/spellchecker/img/wline.gif +0 -0
  142. data/app/assets/libs/tiny_mce/plugins/style/css/props.css +14 -0
  143. data/app/assets/libs/tiny_mce/plugins/style/editor_plugin.js +1 -0
  144. data/app/assets/libs/tiny_mce/plugins/style/editor_plugin_src.js +71 -0
  145. data/app/assets/libs/tiny_mce/plugins/style/js/props.js +709 -0
  146. data/app/assets/libs/tiny_mce/plugins/style/langs/en_dlg.js +1 -0
  147. data/app/assets/libs/tiny_mce/plugins/style/props.htm +845 -0
  148. data/app/assets/libs/tiny_mce/plugins/style/readme.txt +19 -0
  149. data/app/assets/libs/tiny_mce/plugins/table/cell.htm +180 -0
  150. data/app/assets/libs/tiny_mce/plugins/table/css/cell.css +17 -0
  151. data/app/assets/libs/tiny_mce/plugins/table/css/row.css +25 -0
  152. data/app/assets/libs/tiny_mce/plugins/table/css/table.css +13 -0
  153. data/app/assets/libs/tiny_mce/plugins/table/editor_plugin.js +1 -0
  154. data/app/assets/libs/tiny_mce/plugins/table/editor_plugin_src.js +1428 -0
  155. data/app/assets/libs/tiny_mce/plugins/table/js/cell.js +319 -0
  156. data/app/assets/libs/tiny_mce/plugins/table/js/merge_cells.js +27 -0
  157. data/app/assets/libs/tiny_mce/plugins/table/js/row.js +237 -0
  158. data/app/assets/libs/tiny_mce/plugins/table/js/table.js +489 -0
  159. data/app/assets/libs/tiny_mce/plugins/table/langs/en_dlg.js +1 -0
  160. data/app/assets/libs/tiny_mce/plugins/table/merge_cells.htm +32 -0
  161. data/app/assets/libs/tiny_mce/plugins/table/row.htm +158 -0
  162. data/app/assets/libs/tiny_mce/plugins/table/table.htm +188 -0
  163. data/app/assets/libs/tiny_mce/plugins/tableDropdown/editor_plugin.js +140 -0
  164. data/app/assets/libs/tiny_mce/themes/advanced/about.htm +52 -0
  165. data/app/assets/libs/tiny_mce/themes/advanced/anchor.htm +26 -0
  166. data/app/assets/libs/tiny_mce/themes/advanced/charmap.htm +55 -0
  167. data/app/assets/libs/tiny_mce/themes/advanced/color_picker.htm +70 -0
  168. data/app/assets/libs/tiny_mce/themes/advanced/editor_template.js +1 -0
  169. data/app/assets/libs/tiny_mce/themes/advanced/editor_template_src.js +1467 -0
  170. data/app/assets/libs/tiny_mce/themes/advanced/image.htm +80 -0
  171. data/app/assets/libs/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  172. data/app/assets/libs/tiny_mce/themes/advanced/img/flash.gif +0 -0
  173. data/app/assets/libs/tiny_mce/themes/advanced/img/icons.gif +0 -0
  174. data/app/assets/libs/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  175. data/app/assets/libs/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  176. data/app/assets/libs/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  177. data/app/assets/libs/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  178. data/app/assets/libs/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  179. data/app/assets/libs/tiny_mce/themes/advanced/img/trans.gif +0 -0
  180. data/app/assets/libs/tiny_mce/themes/advanced/img/video.gif +0 -0
  181. data/app/assets/libs/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  182. data/app/assets/libs/tiny_mce/themes/advanced/js/about.js +73 -0
  183. data/app/assets/libs/tiny_mce/themes/advanced/js/anchor.js +44 -0
  184. data/app/assets/libs/tiny_mce/themes/advanced/js/charmap.js +363 -0
  185. data/app/assets/libs/tiny_mce/themes/advanced/js/color_picker.js +345 -0
  186. data/app/assets/libs/tiny_mce/themes/advanced/js/image.js +251 -0
  187. data/app/assets/libs/tiny_mce/themes/advanced/js/link.js +153 -0
  188. data/app/assets/libs/tiny_mce/themes/advanced/js/source_editor.js +78 -0
  189. data/app/assets/libs/tiny_mce/themes/advanced/langs/en.js +1 -0
  190. data/app/assets/libs/tiny_mce/themes/advanced/langs/en_dlg.js +1 -0
  191. data/app/assets/libs/tiny_mce/themes/advanced/link.htm +57 -0
  192. data/app/assets/libs/tiny_mce/themes/advanced/shortcuts.htm +47 -0
  193. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/content.css +51 -0
  194. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/dialog.css +118 -0
  195. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  196. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  197. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  198. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  199. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  200. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  201. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/ui.css +215 -0
  202. data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/content.css +25 -0
  203. data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +106 -0
  204. data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
  205. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/content.css +49 -0
  206. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/dialog.css +118 -0
  207. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  208. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  209. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  210. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui.css +218 -0
  211. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  212. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  213. data/app/assets/libs/tiny_mce/themes/advanced/source_editor.htm +25 -0
  214. data/app/assets/libs/tiny_mce/themes/simple/editor_template.js +1 -0
  215. data/app/assets/libs/tiny_mce/themes/simple/editor_template_src.js +84 -0
  216. data/app/assets/libs/tiny_mce/themes/simple/img/icons.gif +0 -0
  217. data/app/assets/libs/tiny_mce/themes/simple/langs/en.js +1 -0
  218. data/app/assets/libs/tiny_mce/themes/simple/skins/default/content.css +25 -0
  219. data/app/assets/libs/tiny_mce/themes/simple/skins/default/ui.css +32 -0
  220. data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/content.css +17 -0
  221. data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
  222. data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/ui.css +35 -0
  223. data/app/assets/libs/tiny_mce/tiny_mce.js +1 -0
  224. data/app/assets/libs/tiny_mce/tiny_mce_popup.js +5 -0
  225. data/app/assets/libs/tiny_mce/tiny_mce_src.js +16753 -0
  226. data/app/assets/libs/tiny_mce/utils/editable_selects.js +70 -0
  227. data/app/assets/libs/tiny_mce/utils/form_utils.js +210 -0
  228. data/app/assets/libs/tiny_mce/utils/mctabs.js +162 -0
  229. data/app/assets/libs/tiny_mce/utils/validate.js +252 -0
  230. data/app/assets/stylesheets/spud/admin/application.css +480 -0
  231. data/app/assets/stylesheets/spud/admin/jquery-ui.css +568 -0
  232. data/app/assets/stylesheets/spud/admin/settings.css +4 -0
  233. data/app/assets/stylesheets/spud/admin/users.css +4 -0
  234. data/app/assets/stylesheets/spud/forms.css +108 -0
  235. data/app/assets/stylesheets/spud/login/application.css +302 -0
  236. data/app/assets/stylesheets/spud/login.css +58 -0
  237. data/app/assets/stylesheets/spud/password_resets.css +4 -0
  238. data/app/assets/stylesheets/spud/setup.css +4 -0
  239. data/app/assets/stylesheets/spud/sitemaps.css +4 -0
  240. data/app/assets/stylesheets/spud/user_sessions.css +4 -0
  241. data/app/assets/stylesheets/spud/users.css +4 -0
  242. data/app/controllers/spud/admin/application_controller.rb +61 -0
  243. data/app/controllers/spud/admin/dashboard_controller.rb +34 -0
  244. data/app/controllers/spud/admin/users_controller.rb +109 -0
  245. data/app/controllers/spud/application_controller.rb +89 -0
  246. data/app/controllers/spud/password_resets_controller.rb +50 -0
  247. data/app/controllers/spud/setup_controller.rb +21 -0
  248. data/app/controllers/spud/sitemaps_controller.rb +8 -0
  249. data/app/controllers/spud/user_sessions_controller.rb +33 -0
  250. data/app/controllers/spud/users_controller.rb +45 -0
  251. data/app/helpers/spud/admin/application_helper.rb +54 -0
  252. data/app/helpers/spud/application_helper.rb +22 -0
  253. data/app/helpers/spud/password_resets_helper.rb +2 -0
  254. data/app/mailers/spud/core_mailer.rb +12 -0
  255. data/app/models/concerns/spud_authentication.rb +10 -0
  256. data/app/models/spud_admin_permission.rb +5 -0
  257. data/app/models/spud_user.rb +26 -0
  258. data/app/models/spud_user_session.rb +3 -0
  259. data/app/models/spud_user_setting.rb +6 -0
  260. data/app/views/layouts/spud/admin/application.html.erb +72 -0
  261. data/app/views/layouts/spud/admin/detail.html.erb +31 -0
  262. data/app/views/layouts/spud/login/application.html.erb +17 -0
  263. data/app/views/layouts/spud/setup.html.erb +47 -0
  264. data/app/views/spud/admin/dashboard/index.html.erb +18 -0
  265. data/app/views/spud/admin/users/_edit.html.erb +14 -0
  266. data/app/views/spud/admin/users/_form.html.erb +90 -0
  267. data/app/views/spud/admin/users/_new.html.erb +15 -0
  268. data/app/views/spud/admin/users/edit.html.erb +3 -0
  269. data/app/views/spud/admin/users/index.html.erb +42 -0
  270. data/app/views/spud/admin/users/new.html.erb +3 -0
  271. data/app/views/spud/admin/users/show.html.erb +12 -0
  272. data/app/views/spud/core_mailer/forgot_password_notification.html.erb +14 -0
  273. data/app/views/spud/core_mailer/forgot_password_notification.text.erb +10 -0
  274. data/app/views/spud/password_resets/edit.html.erb +25 -0
  275. data/app/views/spud/password_resets/new.html.erb +14 -0
  276. data/app/views/spud/setup/index.html.erb +43 -0
  277. data/app/views/spud/sitemaps/show.xml.builder +12 -0
  278. data/app/views/spud/user_sessions/new.html.erb +27 -0
  279. data/app/views/spud/users/_form.html.erb +60 -0
  280. data/app/views/spud/users/settings.html.erb +12 -0
  281. data/config/routes.rb +18 -0
  282. data/db/migrate/20111214161011_create_spud_admin_permissions.rb +11 -0
  283. data/db/migrate/20111214161146_create_spud_users.rb +29 -0
  284. data/db/migrate/20120327124229_add_time_zone_to_spud_user.rb +6 -0
  285. data/db/migrate/20120328235431_add_scope_to_spud_admin_permissions.rb +6 -0
  286. data/db/migrate/20120329174000_create_spud_user_settings.rb +11 -0
  287. data/lib/spud_core/belongs_to_app.rb +59 -0
  288. data/lib/spud_core/configuration.rb +58 -0
  289. data/lib/spud_core/engine.rb +55 -0
  290. data/lib/spud_core/searchable.rb +11 -0
  291. data/lib/spud_core/test_files.rb +25 -0
  292. data/lib/spud_core/version.rb +5 -0
  293. data/lib/tasks/spud_core_tasks.rake +4 -0
  294. data/lib/tb_core.rb +6 -0
  295. data/spec/controllers/spud/admin/application_controller_spec.rb +49 -0
  296. data/spec/controllers/spud/admin/dashboard_controller_spec.rb +129 -0
  297. data/spec/controllers/spud/admin/users_controller_spec.rb +194 -0
  298. data/spec/controllers/spud/application_controller_spec.rb +6 -0
  299. data/spec/controllers/spud/password_reset_controller_spec.rb +93 -0
  300. data/spec/controllers/spud/setup_controller_spec.rb +56 -0
  301. data/spec/controllers/spud/sitemap_controllers_spec.rb +20 -0
  302. data/spec/controllers/spud/user_sessions_controller_spec.rb +51 -0
  303. data/spec/controllers/spud/users_controller_spec.rb +69 -0
  304. data/spec/dummy/README.rdoc +261 -0
  305. data/spec/dummy/Rakefile +7 -0
  306. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  307. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  308. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  309. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  310. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  311. data/spec/dummy/config/application.rb +58 -0
  312. data/spec/dummy/config/boot.rb +10 -0
  313. data/spec/dummy/config/database.yml +15 -0
  314. data/spec/dummy/config/environment.rb +5 -0
  315. data/spec/dummy/config/environments/development.rb +37 -0
  316. data/spec/dummy/config/environments/production.rb +67 -0
  317. data/spec/dummy/config/environments/test.rb +37 -0
  318. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  319. data/spec/dummy/config/initializers/inflections.rb +15 -0
  320. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  321. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  322. data/spec/dummy/config/initializers/session_store.rb +8 -0
  323. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  324. data/spec/dummy/config/locales/en.yml +5 -0
  325. data/spec/dummy/config/routes.rb +5 -0
  326. data/spec/dummy/config.ru +4 -0
  327. data/spec/dummy/db/schema.rb +59 -0
  328. data/spec/dummy/log/development.log +39 -0
  329. data/spec/dummy/log/test.log +37811 -0
  330. data/spec/dummy/public/404.html +26 -0
  331. data/spec/dummy/public/422.html +26 -0
  332. data/spec/dummy/public/500.html +25 -0
  333. data/spec/dummy/public/favicon.ico +0 -0
  334. data/spec/dummy/script/rails +6 -0
  335. data/spec/helpers/spud/admin/application_helper_spec.rb +150 -0
  336. data/spec/helpers/spud/application_helper_spec.rb +66 -0
  337. data/spec/lib/spud_core/configuration_spec.rb +34 -0
  338. data/spec/models/spud_user_spec.rb +27 -0
  339. data/spec/spec_helper.rb +40 -0
  340. data/spec/support/authlogic_helper.rb +2 -0
  341. metadata +652 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZDk5YWI4NGEwYjAzMTgwZTAzNzExYjIwZTVlNDdlNmQ0NGU4NTNiZA==
5
+ data.tar.gz: !binary |-
6
+ MmIyMTZmZGMxMDY3N2JmMjUxYmUyOTFmZDJlNDE1YWViNTVjZGFiYQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZThjOGNmYzdiOTBiNWM3OWY4MTJiNzgzY2Y1Y2U1NzRjNjZkMzQyYmRmYzZk
10
+ MGJjYzM3NWRmZDg2Yzg1NDQyZTgwNGM5MDVhZjQyZGE0ZDA1OGVkODQ0YzQz
11
+ YjgwN2YwZDUzOWMyNTUzMmYwODE3OTlkZTEwNjMxMjcyNzQ5N2Q=
12
+ data.tar.gz: !binary |-
13
+ YWYzMTQzZDZiZTY4NzY0OGQzYjAwZGM2YTJkYmEyNzY1ZmJiODg4NjVjZDg4
14
+ NjU0MTIyMTczOTIyYzY5ZGMyMjhlZDU1MjZhY2QyZWE4MzBkYWM0NGJhYzQ3
15
+ ZWNkMDQyNjg0OTRjNzU0NTQ0MTgwZTE4YTA0N2Q1MjZjZTgwYzU=
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2012 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,60 @@
1
+ Spud Core Admin
2
+ ===============
3
+
4
+ Spud Admin is a dependency package that adds a nice looking administrative panel to any project you add it to with built in authlogic authentication ready to go out of the box. It supports easy engine integration and there are several planned future engines that we plan on designing for the spud suite. The first of which is Spud CMS which can be found at http://github.com/davydotcom/spud_cms
5
+
6
+ Installation/Usage
7
+ ------------------
8
+
9
+ 1. In your Gemfile add the following
10
+
11
+ gem 'tb_core'
12
+
13
+ 2. Run bundle install
14
+ 3. Copy in database migrations to your new rails project
15
+
16
+ bundle exec rake tb_core:install:migrations
17
+ rake db:migrate
18
+
19
+ 4. run a rails server instance and point your browser to /spud/admin
20
+
21
+
22
+ Adding Your Own Engines
23
+ -----------------------
24
+
25
+ Creating a rails engine that ties into spud admin is fairly straight forward
26
+ In your new engine add spud_admin as a dependency and create an initializer inside your engine class as such:
27
+
28
+ initializer :admin do
29
+ Spud::Core.configure do |config|
30
+ config.admin_applications += [{:name => "Pages",:thumbnail => "spud/admin/pages_thumb.png",:url => "/spud/admin/pages",:order => 0}]
31
+
32
+ end
33
+ end
34
+
35
+ You can use the layouts provided with spud admin by using 'spud/admin/application' or 'spud/admin/detail' layouts
36
+
37
+ When creating controllers for the admin panel create them in the Spud::Admin Namespace and have them extend Spud::Admin::ApplicationController for automatic user authentication restrictions.
38
+
39
+ Testing
40
+ -----------------
41
+
42
+ Spud uses RSpec for testing. Get the tests running with a few short commands:
43
+
44
+ 1. Create and migrate the databases:
45
+
46
+ rake db:create
47
+ rake db:migrate
48
+
49
+ 2. Load the schema in to the test database:
50
+
51
+ rake app:db:test:prepare
52
+
53
+ 3. Run the tests with RSpec
54
+
55
+ rspec spec
56
+
57
+ After the tests have completed the current code coverage stats is available by opening ```/coverage/index.html``` in a browser.
58
+
59
+
60
+ NOTE: Spud Core is Retina Resolution Compatible Now
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'TbCore'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
28
+ require 'rake'
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,133 @@
1
+ //= require jquery
2
+ //= require jquery_ujs
3
+ //= require spud/admin/preinit
4
+ //= require tiny_mce/jquery.tinymce.js
5
+ //= require tiny_mce/tiny_mce_src.js
6
+ //= require spud/admin/jquery.dataTables.min
7
+ //= require bootstrap/js/bootstrap
8
+ //= require datepicker/js/bootstrap-datepicker
9
+ //= require jquery-ui/js/jquery-ui-1.9.1.custom
10
+ //= require_self
11
+ //= require_tree .
12
+ //= require retina_tag
13
+
14
+ spud = {admin:{}};
15
+
16
+ $(document).ready(function() {
17
+
18
+ if(typeof(window.console) == 'undefined'){
19
+ window.console = {
20
+ log:function(){},
21
+ warn:function(){},
22
+ error:function(){}
23
+ };
24
+ }
25
+
26
+ spud.admin.editor.init();
27
+
28
+ // $('#user_table').dataTable({
29
+ // "bJQueryUI": true,
30
+ // "sPaginationType": "full_numbers"
31
+ // });
32
+
33
+ $("#modal_window .modal-footer .form-submit").bind('click', function() {
34
+ $("#modal_window .modal-body form").submit();
35
+ });
36
+
37
+ $("#modal_window ").on('hidden', function(){
38
+ $(this).find('.modal-footer-additional').remove();
39
+ $(this).find('.modal-footer-default').show();
40
+ $(this).removeData('modal');
41
+ });
42
+
43
+ $('body').on('click', 'a.ajax', function() {
44
+ var url = this.href;
45
+ var title = this.title;
46
+ var dialog = $("#modal_window");
47
+
48
+ $("#modal_window .modal-title").text(title);
49
+ dialog.modal({
50
+ remote: url +".js",
51
+ show:true
52
+ });
53
+
54
+ // dialog.load(url + ".js",
55
+ // function(responseText, textStatus, XMLHttpRequest) {
56
+ // dialog.dialog({width:500,modal:true,height:500,title:title});
57
+ // });
58
+ return false;
59
+ });
60
+
61
+
62
+ $('body').on('ajax:success', 'a[data-method="delete"]',
63
+ function(data, textStatus, jqXHR){
64
+ $(this).closest('tr').fadeOut();
65
+ });
66
+
67
+
68
+ $('a.button').button();
69
+
70
+
71
+ $('input[type=submit].btn').click(function() {$(this).button('loading');});
72
+
73
+ $('#multisite_switcher select').change(function() {
74
+ $(this).parent().submit();
75
+ });
76
+
77
+ } );
78
+
79
+
80
+ function remove_fields(link) {
81
+ $(link).prev("input[type=hidden]").val("1");
82
+ $(link).closest(".fields").hide();
83
+ }
84
+
85
+ function add_fields(link, association, content) {
86
+ var new_id = new Date().getTime();
87
+ var regexp = new RegExp("new_" + association, "g")
88
+ $(link).parent().before(content.replace(regexp, new_id));
89
+ }
90
+
91
+
92
+
93
+
94
+ function initTinyMCE(selector) {
95
+ console.warn('Deprecation Notice: `initTinyMCE()` is deprecated, please use `spud.admin.editor.init()` instead.');
96
+ spud.admin.editor.init();
97
+ }
98
+
99
+ function initDatePicker(selector){
100
+ console.warn('Deprecation Notice: `initDatePicker()` is deprecated, please use `spud.admin.date_picker.init()` instead.');
101
+ spud.admin.date_picker.init();
102
+
103
+ }
104
+
105
+ function displayModalDialogWithOptions(options){
106
+ var modal = $('#modal_window');
107
+ if(options.title){
108
+ modal.find('.modal-title').text(options.title);
109
+ }
110
+ if(options.html){
111
+ modal.find('.modal-body').html(options.html);
112
+ }
113
+ var defaultFooter = modal.find('.modal-footer-default');
114
+ if(options.buttons){
115
+ var newFooter = defaultFooter.clone();
116
+ newFooter.addClass('modal-footer-additional');
117
+ newFooter.find('.form-submit').remove();
118
+ for(var key in options.buttons){
119
+ newFooter.append('<button class="btn '+key+'">'+options.buttons[key]+'</button>');
120
+ }
121
+ defaultFooter.hide();
122
+ modal.append(newFooter);
123
+ }
124
+ else{
125
+ defaultFooter.show();
126
+ }
127
+ modal.modal('show');
128
+ }
129
+
130
+ function hideModalDialog(){
131
+ var modal = $('#modal_window');
132
+ modal.modal('hide');
133
+ }
@@ -0,0 +1,80 @@
1
+ Spud = (typeof(Spud) == 'undefined') ? {} : Spud;
2
+ Spud.Admin = (typeof(Spud.Admin) == 'undefined') ? {} : Spud.Admin;
3
+
4
+ Spud.Admin.Dashboard = new function() {
5
+ var self=this;
6
+
7
+ self.editMode = false;
8
+ self.mouseIsDown = false;
9
+ self.init = function() {
10
+ // $('.admin_application').effect('shake',{},100,self.shakeLoop)
11
+ $('.admin_application').bind('mousedown',self.mouseDown);
12
+ $('.admin_application').bind('mouseup',self.mouseUp);
13
+
14
+ $('.admin_application').bind('click',self.mouseClick);
15
+ $('#dashboard-editsave').click(self.saveDashboard);
16
+ $('#dashboard-editcancel').click(self.cancelDashboard);
17
+ $('.sortable').sortable({disabled:true});
18
+ // $('.admin_application').addClass('jiggly')
19
+ // $('.admin_application').draggable();
20
+ }
21
+ self.mouseDown = function() {
22
+ self.mouseIsDown = true;
23
+ if(self.editMode == false)
24
+ {
25
+ setTimeout(function() {
26
+ if(self.mouseIsDown)
27
+ {
28
+ self.enableEditMode();
29
+ }
30
+ },1000);
31
+ }
32
+ }
33
+
34
+ self.mouseClick = function(evt) {
35
+ if(self.editMode)
36
+ {
37
+ evt.stopPropagation();
38
+ return false;
39
+ }
40
+ }
41
+ self.mouseUp = function() {
42
+ self.mouseIsDown = false;
43
+ }
44
+ self.enableEditMode = function() {
45
+ self.editMode = true;
46
+ $('.admin_application').addClass('jiggly');
47
+
48
+ $('.sortable').sortable("enable");
49
+ $('#dashboard-editmode').show();
50
+ }
51
+ self.saveDashboard = function() {
52
+ self.saveOrder();
53
+ self.disableEditMode();
54
+ }
55
+ self.cancelDashboard = function() {
56
+ $('.sortable').sortable("cancel");
57
+ self.disableEditMode();
58
+ }
59
+ self.disableEditMode = function() {
60
+ self.editMode = false;
61
+ $('#dashboard-editmode').hide();
62
+ $('.admin_application').removeClass('jiggly');
63
+ $('.sortable').sortable("disable");
64
+ }
65
+
66
+
67
+ self.saveOrder = function() {
68
+ var appOrder = $('.sortable').sortable("toArray");
69
+ for(var appCounter=0;appCounter < appOrder.length;appCounter++)
70
+ {
71
+ appOrder[appCounter] = appOrder[appCounter].replace('application_name_',"");
72
+
73
+ }
74
+ var keyvalue = appOrder.join(",")
75
+ console.log(keyvalue);
76
+ jQuery.ajax('/spud/save_key?key=app_order&value=' + keyvalue);
77
+ }
78
+
79
+
80
+ }
@@ -0,0 +1,56 @@
1
+ spud.admin.date_picker = {};
2
+
3
+ (function() {
4
+ var picker = spud.admin.date_picker;
5
+
6
+ parsePickerDate = function(value) {
7
+ var date = new Date();
8
+
9
+ var currentDateTimeComponents = value.split(" ");
10
+ var dateComponents = currentDateTimeComponents[0].split("-");
11
+ if(dateComponents.length >= 3) {
12
+ date = new Date(parseInt(dateComponents[0],10),parseInt(dateComponents[1],10) - 1,parseInt(dateComponents[2],10));
13
+ }
14
+ return date;
15
+ }
16
+
17
+ picker.init = function(selector) {
18
+ selector = (typeof(selector) == 'undefined') ? '.spud_form_date_picker' : selector;
19
+ $(selector).each(function() {
20
+ var $this = $(this);
21
+ var baseName = $this.attr('name');
22
+ $this.attr('name',baseName.replace("[","_").replace("]",""));
23
+ $this.datepicker({
24
+ 'format': 'yyyy-mm-dd',
25
+ 'autoclose': true
26
+ });
27
+ $this.val($this.val().split(" ")[0]);
28
+ var date = parsePickerDate($this.val());
29
+
30
+ var yearField = $("<input type='hidden'/>");
31
+ yearField.attr('name',baseName.replace(']',"(1i)]"));
32
+ yearField.val(date.getFullYear());
33
+ var monthField = $("<input type='hidden'/>");
34
+ monthField.attr('name',baseName.replace(']',"(2i)]"));
35
+ monthField.val(date.getMonth() + 1);
36
+ var dayField = $("<input type='hidden'/>");
37
+ dayField.attr('name',baseName.replace(']',"(3i)]"));
38
+ dayField.val(date.getUTCDate());
39
+ yearField.insertAfter($this);
40
+ monthField.insertAfter($this);
41
+ dayField.insertAfter($this);
42
+
43
+
44
+ $this.bind('change', function(evt) {
45
+ var date = parsePickerDate($(this).val());
46
+ yearField.val(date.getFullYear());
47
+ monthField.val(date.getMonth() + 1);
48
+ dayField.val(date.getUTCDate());
49
+
50
+ });
51
+
52
+
53
+ });
54
+
55
+ };
56
+ })();
@@ -0,0 +1,167 @@
1
+ //= require codemirror
2
+ //= require codemirror/modes/markdown
3
+
4
+ spud.admin.editor = {};
5
+
6
+ (function(){
7
+
8
+ var editor = spud.admin.editor;
9
+
10
+ var registeredPlugins = [
11
+ 'autolink','lists','layer','table','tableDropdown','advhr','advimage','advlink','iespell','inlinepopups','media','paste'
12
+ ];
13
+
14
+ var registeredButtons = [
15
+ ['bold','italic','underline','strikethrough','|','justifyleft','justifycenter','justifyright','justifyfull','|','formatselect','cut','copy','paste','pastetext','|','bullist','numlist','outdent','indent','|','tableDropdown','|','link','unlink','anchor','image','code'],
16
+ [],
17
+ [],
18
+ []
19
+ ];
20
+
21
+ var validElements = "@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|" +
22
+ "onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|" +
23
+ "onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|" +
24
+ "name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u," +
25
+ "#p,-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|" +
26
+ "src|border|alt=|title|hspace|vspace|width|height|align|hidpi_src],-sub,-sup," +
27
+ "-blockquote,-table[border=0|cellspacing|cellpadding|width|frame|rules|" +
28
+ "height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|" +
29
+ "height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot," +
30
+ "#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor" +
31
+ "|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div," +
32
+ "-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face" +
33
+ "|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite]," +
34
+ "object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width" +
35
+ "|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo," +
36
+ "button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|" +
37
+ "valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method]," +
38
+ "input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value]," +
39
+ "kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value]," +
40
+ "q[cite],samp,select[disabled|multiple|name|size],small," +
41
+ "textarea[cols|rows|disabled|name|readonly],tt,var,big";
42
+
43
+ var extendedValidElements = [];
44
+
45
+ var validFormats = "p,h1,h2,h3,h4,h5,h6";
46
+
47
+
48
+ editor.init = function(options) {
49
+ editor.monitorFormatters();
50
+ options = options || {};
51
+ var selector = options.selector || 'textarea.tinymce';
52
+ $(selector).each(function() {
53
+ var $this = $(this);
54
+ var dataFormat = $this.attr('data-format');
55
+ switch(dataFormat) {
56
+ case 'Markdown':
57
+ editor.initCodeMirrorWithOptions(this,'markdown', options || {});
58
+ break;
59
+ case 'HTML':
60
+ default:
61
+ editor.initMCEWithOptions(this, options || {});
62
+ };
63
+
64
+
65
+ });
66
+
67
+ };
68
+
69
+ editor.monitorFormatters = function() {
70
+ $('select[data-formatter]').off('onchange');
71
+ $('select[data-formatter]').change(editor.formatterChanged);
72
+ };
73
+
74
+ editor.formatterChanged = function() {
75
+ var formatId = $(this).attr('data-formatter');
76
+ editor.unload('#' + formatId);
77
+ $('#' + formatId).attr('data-format',$(this).val());
78
+ editor.init({selector: '#' + formatId});
79
+ };
80
+
81
+ editor.initMCEWithOptions = function(element, options){
82
+
83
+ var theme = options.theme || 'advanced';
84
+ var height = options.height || 400;
85
+
86
+ $(element).tinymce({
87
+ theme: theme,
88
+ plugins: registeredPlugins.join(','),
89
+ theme_advanced_toolbar_location: "top",
90
+ theme_advanced_buttons1: registeredButtons[0].join(','),
91
+ theme_advanced_buttons2: registeredButtons[1].join(','),
92
+ theme_advanced_buttons3: registeredButtons[2].join(','),
93
+ theme_advanced_buttons4: registeredButtons[3].join(','),
94
+ theme_advanced_toolbar_align: 'left',
95
+ theme_advanced_blockformats: validFormats,
96
+ convert_urls: false,
97
+ valid_elements: validElements,
98
+ media_strict: false,
99
+ extended_valid_elements: extendedValidElements.join(","),
100
+ width: $(element).width(),
101
+ height: height
102
+ });
103
+
104
+
105
+ };
106
+
107
+ var codeMirrors = [];
108
+ editor.initCodeMirrorWithOptions = function(element, format, options) {
109
+ var editor = CodeMirror.fromTextArea(element, {
110
+ mode: 'markdown',
111
+ lineNumbers: true,
112
+ lineWrapping: true,
113
+ theme: "default",
114
+ extraKeys: {"Enter": "newlineAndIndentContinueMarkdownList"}
115
+ });
116
+ codeMirrors.push(editor);
117
+
118
+ $(element).attr('code-mirror-id',codeMirrors.length-1);
119
+ };
120
+
121
+ editor.unload = function(selectorOptional) {
122
+ var selector = selectorOptional || 'textarea.tinymce';
123
+ $(selector).each(function() {
124
+ var $this = $(this);
125
+ if($this.attr('code-mirror-id')) {
126
+ codeMirrors[parseInt($this.attr('code-mirror-id'),10)].toTextArea();
127
+ codeMirrors[parseInt($this.attr('code-mirror-id'),10)] = null;
128
+ $this.removeAttr('code-mirror-id');
129
+ }
130
+ tinyMCE.execCommand('mceRemoveControl',false,this.id);
131
+ });
132
+
133
+ };
134
+
135
+
136
+
137
+ editor.registerPlugin = function(pluginName){
138
+ if($.inArray(registeredPlugins, pluginName) < 0){
139
+ registeredPlugins.push(pluginName);
140
+ }
141
+ };
142
+
143
+ editor.deregisterPlugin = function(pluginName){
144
+ var i=0;
145
+ while(i < registeredPlugins.length){
146
+ if(registeredPlugins[i] == pluginName){
147
+ registeredPlugins.splice(1, i);
148
+ break;
149
+ }
150
+ i++;
151
+ }
152
+ };
153
+
154
+ editor.appendValidElement = function(element) {
155
+ extendedValidElements.push(element);
156
+ };
157
+
158
+ editor.registerButton = function(buttonNameOrArray, rowNum){
159
+ rowNum = rowNum || 0;
160
+ if(typeof(buttonNameOrArray) == 'object'){
161
+ registeredButtons[rowNum].concat(buttonNameOrArray);
162
+ }
163
+ else{
164
+ registeredButtons[rowNum].push(buttonNameOrArray);
165
+ }
166
+ };
167
+ })();