tb_core 0.9.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
+ })();