publify_core 9.0.0.pre1

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 (372) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +35 -0
  5. data/app/assets/fonts/open-sans-bold.woff +0 -0
  6. data/app/assets/fonts/open-sans.woff +0 -0
  7. data/app/assets/images/admin/loading.gif +0 -0
  8. data/app/assets/images/admin/typologo.gif +0 -0
  9. data/app/assets/images/calendar_date_select/calendar.gif +0 -0
  10. data/app/assets/images/close.gif +0 -0
  11. data/app/assets/images/closelabel.gif +0 -0
  12. data/app/assets/images/go.png +0 -0
  13. data/app/assets/images/loading.gif +0 -0
  14. data/app/assets/images/nextlabel.gif +0 -0
  15. data/app/assets/images/overlay.png +0 -0
  16. data/app/assets/images/powered.gif +0 -0
  17. data/app/assets/images/prevlabel.gif +0 -0
  18. data/app/assets/images/spinner-blue.gif +0 -0
  19. data/app/assets/images/spinner.gif +0 -0
  20. data/app/assets/images/thumb_blank.jpg +0 -0
  21. data/app/assets/javascripts/application.js +2 -0
  22. data/app/assets/javascripts/cookies.js +60 -0
  23. data/app/assets/javascripts/datetimepicker.js +1470 -0
  24. data/app/assets/javascripts/lang/da_DK.js +17 -0
  25. data/app/assets/javascripts/lang/default.js +21 -0
  26. data/app/assets/javascripts/lang/en_US.js +21 -0
  27. data/app/assets/javascripts/lang/fr_FR.js +21 -0
  28. data/app/assets/javascripts/lang/nl_NL.js +21 -0
  29. data/app/assets/javascripts/lang/zh_TW.js +17 -0
  30. data/app/assets/javascripts/lightbox.js +350 -0
  31. data/app/assets/javascripts/observe.js +28 -0
  32. data/app/assets/javascripts/publify.js +11 -0
  33. data/app/assets/javascripts/publify_admin.js +138 -0
  34. data/app/assets/javascripts/quicktags.js +440 -0
  35. data/app/assets/javascripts/set-timeago-lang.js +3 -0
  36. data/app/assets/javascripts/sidebar.js +28 -0
  37. data/app/assets/javascripts/spinnable.js +5 -0
  38. data/app/assets/javascripts/tagmanager.js +481 -0
  39. data/app/assets/javascripts/typeahead.js +1139 -0
  40. data/app/assets/javascripts/widearea.js +486 -0
  41. data/app/assets/stylesheets/accounts.css.scss +7 -0
  42. data/app/assets/stylesheets/administration_structure.css.scss +239 -0
  43. data/app/assets/stylesheets/coderay.css +135 -0
  44. data/app/assets/stylesheets/datetimepicker.css +306 -0
  45. data/app/assets/stylesheets/lightbox.css +63 -0
  46. data/app/assets/stylesheets/publify.css.scss +9 -0
  47. data/app/assets/stylesheets/publify_admin.css.scss +11 -0
  48. data/app/assets/stylesheets/rss.css +53 -0
  49. data/app/assets/stylesheets/sidebar_admin.css.scss +36 -0
  50. data/app/assets/stylesheets/tagmanager.css +102 -0
  51. data/app/assets/stylesheets/user-styles.css +29 -0
  52. data/app/assets/stylesheets/widearea.css +133 -0
  53. data/app/controllers/accounts_controller.rb +2 -0
  54. data/app/controllers/admin/base_controller.rb +41 -0
  55. data/app/controllers/admin/cache_controller.rb +33 -0
  56. data/app/controllers/admin/content_controller.rb +174 -0
  57. data/app/controllers/admin/dashboard_controller.rb +87 -0
  58. data/app/controllers/admin/feedback_controller.rb +159 -0
  59. data/app/controllers/admin/migrations_controller.rb +20 -0
  60. data/app/controllers/admin/notes_controller.rb +69 -0
  61. data/app/controllers/admin/pages_controller.rb +88 -0
  62. data/app/controllers/admin/post_types_controller.rb +56 -0
  63. data/app/controllers/admin/profiles_controller.rb +48 -0
  64. data/app/controllers/admin/redirects_controller.rb +47 -0
  65. data/app/controllers/admin/resources_controller.rb +30 -0
  66. data/app/controllers/admin/seo_controller.rb +45 -0
  67. data/app/controllers/admin/settings_controller.rb +53 -0
  68. data/app/controllers/admin/sidebar_controller.rb +66 -0
  69. data/app/controllers/admin/tags_controller.rb +53 -0
  70. data/app/controllers/admin/textfilters_controller.rb +6 -0
  71. data/app/controllers/admin/themes_controller.rb +37 -0
  72. data/app/controllers/admin/users_controller.rb +65 -0
  73. data/app/controllers/articles_controller.rb +205 -0
  74. data/app/controllers/authors_controller.rb +27 -0
  75. data/app/controllers/base_controller.rb +45 -0
  76. data/app/controllers/comments_controller.rb +69 -0
  77. data/app/controllers/content_controller.rb +31 -0
  78. data/app/controllers/feedback_controller.rb +47 -0
  79. data/app/controllers/notes_controller.rb +37 -0
  80. data/app/controllers/setup_controller.rb +62 -0
  81. data/app/controllers/tags_controller.rb +55 -0
  82. data/app/controllers/text_controller.rb +9 -0
  83. data/app/controllers/textfilter_controller.rb +3 -0
  84. data/app/controllers/theme_controller.rb +59 -0
  85. data/app/controllers/trackbacks_controller.rb +36 -0
  86. data/app/controllers/xml_controller.rb +70 -0
  87. data/app/helpers/admin/base_helper.rb +87 -0
  88. data/app/helpers/admin/feedback_helper.rb +42 -0
  89. data/app/helpers/articles_helper.rb +8 -0
  90. data/app/helpers/authors_helper.rb +39 -0
  91. data/app/helpers/base_helper.rb +246 -0
  92. data/app/helpers/blog_helper.rb +12 -0
  93. data/app/helpers/xml_helper.rb +16 -0
  94. data/app/mailers/notification_mailer.rb +38 -0
  95. data/app/models/ability.rb +52 -0
  96. data/app/models/archives_sidebar.rb +45 -0
  97. data/app/models/article/factory.rb +56 -0
  98. data/app/models/article/states.rb +178 -0
  99. data/app/models/article.rb +321 -0
  100. data/app/models/blog.rb +290 -0
  101. data/app/models/blog_sweeper.rb +86 -0
  102. data/app/models/comment.rb +53 -0
  103. data/app/models/config_manager.rb +81 -0
  104. data/app/models/content.rb +138 -0
  105. data/app/models/content_base.rb +95 -0
  106. data/app/models/feedback/states.rb +256 -0
  107. data/app/models/feedback.rb +225 -0
  108. data/app/models/meta_sidebar.rb +8 -0
  109. data/app/models/note.rb +144 -0
  110. data/app/models/page.rb +36 -0
  111. data/app/models/page_cache.rb +33 -0
  112. data/app/models/page_sidebar.rb +12 -0
  113. data/app/models/ping.rb +116 -0
  114. data/app/models/post_type.rb +15 -0
  115. data/app/models/redirect.rb +45 -0
  116. data/app/models/redirection.rb +4 -0
  117. data/app/models/resource.rb +28 -0
  118. data/app/models/search_sidebar.rb +7 -0
  119. data/app/models/sidebar.rb +138 -0
  120. data/app/models/static_sidebar.rb +20 -0
  121. data/app/models/tag.rb +63 -0
  122. data/app/models/tag_sidebar.rb +27 -0
  123. data/app/models/text_filter.rb +61 -0
  124. data/app/models/trackback.rb +58 -0
  125. data/app/models/trigger.rb +45 -0
  126. data/app/models/user.rb +148 -0
  127. data/app/services/migrator.rb +25 -0
  128. data/app/services/title_builder.rb +80 -0
  129. data/app/uploaders/resource_uploader.rb +30 -0
  130. data/app/views/accounts/confirm.html.erb +8 -0
  131. data/app/views/admin/cache/show.html.erb +18 -0
  132. data/app/views/admin/content/_article_list.html.erb +26 -0
  133. data/app/views/admin/content/_form.html.erb +165 -0
  134. data/app/views/admin/content/autosave.js.erb +5 -0
  135. data/app/views/admin/content/edit.html.erb +3 -0
  136. data/app/views/admin/content/index.html.erb +48 -0
  137. data/app/views/admin/content/index.js.erb +1 -0
  138. data/app/views/admin/content/new.html.erb +3 -0
  139. data/app/views/admin/dashboard/_comment.html.erb +18 -0
  140. data/app/views/admin/dashboard/_comments.html.erb +10 -0
  141. data/app/views/admin/dashboard/_drafts.html.erb +25 -0
  142. data/app/views/admin/dashboard/_inbound.html.erb +31 -0
  143. data/app/views/admin/dashboard/_overview.html.erb +23 -0
  144. data/app/views/admin/dashboard/_welcome.html.erb +28 -0
  145. data/app/views/admin/dashboard/index.html.erb +17 -0
  146. data/app/views/admin/feedback/_button.html.erb +19 -0
  147. data/app/views/admin/feedback/_feedback.html.erb +7 -0
  148. data/app/views/admin/feedback/_ham.html.erb +17 -0
  149. data/app/views/admin/feedback/_spam.html.erb +23 -0
  150. data/app/views/admin/feedback/article.html.erb +69 -0
  151. data/app/views/admin/feedback/edit.html.erb +48 -0
  152. data/app/views/admin/feedback/ham.js +1 -0
  153. data/app/views/admin/feedback/index.html.erb +53 -0
  154. data/app/views/admin/feedback/spam.js +1 -0
  155. data/app/views/admin/migrations/show.html.erb +39 -0
  156. data/app/views/admin/notes/_form.html.erb +37 -0
  157. data/app/views/admin/notes/_header.html.erb +6 -0
  158. data/app/views/admin/notes/_list.html.erb +13 -0
  159. data/app/views/admin/notes/_note.html.erb +14 -0
  160. data/app/views/admin/notes/edit.html.erb +11 -0
  161. data/app/views/admin/notes/index.html.erb +11 -0
  162. data/app/views/admin/notes/show.html.erb +14 -0
  163. data/app/views/admin/pages/_form.html.erb +101 -0
  164. data/app/views/admin/pages/_pages.html.erb +21 -0
  165. data/app/views/admin/pages/edit.html.erb +1 -0
  166. data/app/views/admin/pages/index.html.erb +17 -0
  167. data/app/views/admin/pages/new.html.erb +1 -0
  168. data/app/views/admin/post_types/_index_and_form.html.erb +65 -0
  169. data/app/views/admin/post_types/edit.html.erb +1 -0
  170. data/app/views/admin/post_types/index.html.erb +1 -0
  171. data/app/views/admin/profiles/index.html.erb +10 -0
  172. data/app/views/admin/redirects/_index_and_form.html.erb +68 -0
  173. data/app/views/admin/redirects/edit.html.erb +1 -0
  174. data/app/views/admin/redirects/index.html.erb +1 -0
  175. data/app/views/admin/resources/index.html.erb +68 -0
  176. data/app/views/admin/seo/_general.html.erb +123 -0
  177. data/app/views/admin/seo/_permalinks.html.erb +53 -0
  178. data/app/views/admin/seo/_titles.html.erb +210 -0
  179. data/app/views/admin/seo/show.html.erb +32 -0
  180. data/app/views/admin/settings/display.html.erb +110 -0
  181. data/app/views/admin/settings/feedback.html.erb +125 -0
  182. data/app/views/admin/settings/index.html.erb +73 -0
  183. data/app/views/admin/settings/write.html.erb +87 -0
  184. data/app/views/admin/shared/_edit.html.erb +4 -0
  185. data/app/views/admin/shared/_menu.html.erb +122 -0
  186. data/app/views/admin/shared/_twitter_alert.html.erb +3 -0
  187. data/app/views/admin/sidebar/_available.html.erb +6 -0
  188. data/app/views/admin/sidebar/_available.json.erb +6 -0
  189. data/app/views/admin/sidebar/_config.html.erb +27 -0
  190. data/app/views/admin/sidebar/_target.html.erb +9 -0
  191. data/app/views/admin/sidebar/_target_sidebar.html.erb +20 -0
  192. data/app/views/admin/sidebar/destroy.js.erb +1 -0
  193. data/app/views/admin/sidebar/index.html.erb +31 -0
  194. data/app/views/admin/sidebar/sortable.js.erb +3 -0
  195. data/app/views/admin/sidebar/update.js.erb +2 -0
  196. data/app/views/admin/tags/_index_and_form.html.erb +59 -0
  197. data/app/views/admin/tags/edit.html.erb +1 -0
  198. data/app/views/admin/tags/index.html.erb +1 -0
  199. data/app/views/admin/themes/index.html.erb +27 -0
  200. data/app/views/admin/users/_form.html.erb +215 -0
  201. data/app/views/admin/users/edit.html.erb +8 -0
  202. data/app/views/admin/users/index.html.erb +39 -0
  203. data/app/views/admin/users/new.html.erb +8 -0
  204. data/app/views/archives_sidebar/_content.html.erb +13 -0
  205. data/app/views/articles/_article.html.erb +9 -0
  206. data/app/views/articles/_article_collection.html.erb +8 -0
  207. data/app/views/articles/_article_content.html.erb +5 -0
  208. data/app/views/articles/_article_excerpt.html.erb +13 -0
  209. data/app/views/articles/_article_links.html.erb +10 -0
  210. data/app/views/articles/_comment.html.erb +1 -0
  211. data/app/views/articles/_comment_errors.html.erb +2 -0
  212. data/app/views/articles/_comment_form.html.erb +48 -0
  213. data/app/views/articles/_comment_list.html.erb +5 -0
  214. data/app/views/articles/_comment_preview.html.erb +4 -0
  215. data/app/views/articles/_full_article_content.html.erb +2 -0
  216. data/app/views/articles/_password_form.html.erb +10 -0
  217. data/app/views/articles/_protected_article_content.html.erb +6 -0
  218. data/app/views/articles/_trackback.html.erb +6 -0
  219. data/app/views/articles/archives.html.erb +25 -0
  220. data/app/views/articles/comment.js.erb +5 -0
  221. data/app/views/articles/comment_failed.js.erb +3 -0
  222. data/app/views/articles/error.html.erb +3 -0
  223. data/app/views/articles/feedback_atom_feed.atom.builder +8 -0
  224. data/app/views/articles/feedback_rss_feed.rss.builder +21 -0
  225. data/app/views/articles/index.html.erb +1 -0
  226. data/app/views/articles/index_atom_feed.atom.builder +8 -0
  227. data/app/views/articles/index_rss_feed.rss.builder +20 -0
  228. data/app/views/articles/live_search.html.erb +10 -0
  229. data/app/views/articles/read.html.erb +61 -0
  230. data/app/views/articles/search.html.erb +8 -0
  231. data/app/views/articles/trackback.xml.builder +5 -0
  232. data/app/views/articles/view_page.html.erb +3 -0
  233. data/app/views/authors/show.html.erb +40 -0
  234. data/app/views/authors/show_atom_feed.atom.builder +8 -0
  235. data/app/views/authors/show_rss_feed.rss.builder +20 -0
  236. data/app/views/comments/_comment.html.erb +16 -0
  237. data/app/views/comments/index.html.erb +1 -0
  238. data/app/views/comments/index_atom_feed.atom.builder +8 -0
  239. data/app/views/comments/index_rss_feed.rss.builder +20 -0
  240. data/app/views/comments/preview.html.erb +1 -0
  241. data/app/views/comments/preview.js.erb +3 -0
  242. data/app/views/devise/mailer/reset_password_instructions.html.erb +13 -0
  243. data/app/views/devise/passwords/edit.html.erb +28 -0
  244. data/app/views/devise/passwords/new.html.erb +20 -0
  245. data/app/views/devise/registrations/new.html.erb +36 -0
  246. data/app/views/devise/sessions/new.html.erb +32 -0
  247. data/app/views/devise/shared/_links.html.erb +15 -0
  248. data/app/views/errors/404.html.erb +2 -0
  249. data/app/views/layouts/accounts.html.erb +33 -0
  250. data/app/views/layouts/administration.html.erb +37 -0
  251. data/app/views/layouts/default.html.erb +32 -0
  252. data/app/views/layouts/editor.html.erb +31 -0
  253. data/app/views/meta_sidebar/_content.html.erb +8 -0
  254. data/app/views/notes/_note.html.erb +15 -0
  255. data/app/views/notes/error.html.erb +3 -0
  256. data/app/views/notes/index.html.erb +15 -0
  257. data/app/views/notes/show.html.erb +5 -0
  258. data/app/views/notes/show_in_reply.html.erb +16 -0
  259. data/app/views/notification_mailer/_mail_footer.html.erb +7 -0
  260. data/app/views/notification_mailer/_mail_header.html.erb +1 -0
  261. data/app/views/notification_mailer/article.html.erb +6 -0
  262. data/app/views/notification_mailer/comment.html.erb +11 -0
  263. data/app/views/notification_mailer/notif_user.html.erb +14 -0
  264. data/app/views/page_sidebar/_content.html.erb +12 -0
  265. data/app/views/search_sidebar/_content.html.erb +10 -0
  266. data/app/views/settings/done.html.erb +2 -0
  267. data/app/views/settings/install.html.erb +12 -0
  268. data/app/views/setup/index.html.erb +13 -0
  269. data/app/views/shared/_atom_header.atom.builder +6 -0
  270. data/app/views/shared/_atom_item_article.atom.builder +39 -0
  271. data/app/views/shared/_atom_item_comment.atom.builder +10 -0
  272. data/app/views/shared/_atom_item_trackback.atom.builder +9 -0
  273. data/app/views/shared/_flash.erb +10 -0
  274. data/app/views/shared/_page_header.html.erb +26 -0
  275. data/app/views/shared/_rss_item_article.rss.builder +35 -0
  276. data/app/views/shared/_rss_item_comment.rss.builder +8 -0
  277. data/app/views/shared/_rss_item_trackback.rss.builder +7 -0
  278. data/app/views/sidebar/_row.html.erb +1 -0
  279. data/app/views/sidebar/_sidebar.html.erb +5 -0
  280. data/app/views/sidebar/display_plugins.html.erb +5 -0
  281. data/app/views/sidebar/show.html.erb +1 -0
  282. data/app/views/static_sidebar/_content.html.erb +2 -0
  283. data/app/views/tag_sidebar/_content.html.erb +10 -0
  284. data/app/views/tags/index.html.erb +15 -0
  285. data/app/views/tags/show.html.erb +1 -0
  286. data/app/views/theme/static_view_test.html.erb +1 -0
  287. data/app/views/trackbacks/index_atom_feed.atom.builder +7 -0
  288. data/app/views/trackbacks/index_rss_feed.rss.builder +20 -0
  289. data/app/views/trackbacks/trackback.xml.builder +4 -0
  290. data/app/views/xml/_googlesitemap_item_article.googlesitemap.builder +5 -0
  291. data/app/views/xml/_googlesitemap_item_category.googlesitemap.builder +4 -0
  292. data/app/views/xml/_googlesitemap_item_page.googlesitemap.builder +4 -0
  293. data/app/views/xml/_googlesitemap_item_tag.googlesitemap.builder +4 -0
  294. data/app/views/xml/feed.googlesitemap.builder +7 -0
  295. data/app/views/xml/rsd.rsd.builder +8 -0
  296. data/config/i18n-tasks.yml +49 -0
  297. data/config/initializers/devise.rb +265 -0
  298. data/config/initializers/mime_types.rb +6 -0
  299. data/config/locales/da.yml +827 -0
  300. data/config/locales/de.yml +827 -0
  301. data/config/locales/en.yml +827 -0
  302. data/config/locales/es-MX.yml +827 -0
  303. data/config/locales/fr.yml +827 -0
  304. data/config/locales/he.yml +827 -0
  305. data/config/locales/it.yml +827 -0
  306. data/config/locales/ja.yml +827 -0
  307. data/config/locales/lt.yml +827 -0
  308. data/config/locales/nb-NO.yml +827 -0
  309. data/config/locales/nl.yml +827 -0
  310. data/config/locales/pl.yml +827 -0
  311. data/config/locales/pt-BR.yml +827 -0
  312. data/config/locales/ro.yml +827 -0
  313. data/config/locales/ru.yml +827 -0
  314. data/config/locales/sidebars.da.yml +20 -0
  315. data/config/locales/sidebars.de.yml +20 -0
  316. data/config/locales/sidebars.en.yml +20 -0
  317. data/config/locales/sidebars.es-MX.yml +20 -0
  318. data/config/locales/sidebars.fr.yml +20 -0
  319. data/config/locales/sidebars.he.yml +20 -0
  320. data/config/locales/sidebars.it.yml +20 -0
  321. data/config/locales/sidebars.ja.yml +20 -0
  322. data/config/locales/sidebars.lt.yml +20 -0
  323. data/config/locales/sidebars.nb-NO.yml +20 -0
  324. data/config/locales/sidebars.nl.yml +20 -0
  325. data/config/locales/sidebars.pl.yml +20 -0
  326. data/config/locales/sidebars.pt-BR.yml +20 -0
  327. data/config/locales/sidebars.ro.yml +20 -0
  328. data/config/locales/sidebars.ru.yml +20 -0
  329. data/config/locales/sidebars.zh-CN.yml +20 -0
  330. data/config/locales/sidebars.zh-TW.yml +20 -0
  331. data/config/locales/zh-CN.yml +827 -0
  332. data/config/locales/zh-TW.yml +827 -0
  333. data/config/routes.rb +177 -0
  334. data/db/migrate/113_initial_schema.rb +205 -0
  335. data/db/migrate/114_fixes_buggy_articles_and_notes.rb +52 -0
  336. data/db/migrate/115_drops_categories_for_tags.rb +34 -0
  337. data/db/migrate/20150207131657_add_missing_indexes.rb +19 -0
  338. data/db/migrate/20150807134129_simplify_redirect_relations.rb +38 -0
  339. data/db/migrate/20150808052637_add_blog_ids.rb +33 -0
  340. data/db/migrate/20150808191127_add_blog_id_to_redirects.rb +15 -0
  341. data/db/migrate/20150810094754_add_blog_id_to_tags.rb +15 -0
  342. data/db/migrate/20160108111120_add_devise_to_users.rb +53 -0
  343. data/db/migrate/20160108184201_move_last_connection_to_last_sign_in_at.rb +16 -0
  344. data/db/migrate/20160110094906_remove_profiles_rights.rb +14 -0
  345. data/db/migrate/20160605103918_replace_profile_id_with_string.rb +30 -0
  346. data/db/migrate/20160605154632_remove_profiles.rb +24 -0
  347. data/db/migrate/20160701061851_demand_blog_id_on_contents.rb +9 -0
  348. data/db/migrate/20160701062604_add_blog_id_to_resources.rb +28 -0
  349. data/db/seeds.rb +37 -0
  350. data/lib/email_notify.rb +26 -0
  351. data/lib/format.rb +17 -0
  352. data/lib/publify_core/engine.rb +23 -0
  353. data/lib/publify_core/lang.rb +5 -0
  354. data/lib/publify_core/version.rb +3 -0
  355. data/lib/publify_core.rb +56 -0
  356. data/lib/publify_guid.rb +9 -0
  357. data/lib/publify_plugins.rb +72 -0
  358. data/lib/publify_textfilter_markdown.rb +44 -0
  359. data/lib/publify_textfilter_none.rb +14 -0
  360. data/lib/publify_textfilter_smartypants.rb +14 -0
  361. data/lib/publify_textfilter_textile.rb +21 -0
  362. data/lib/publify_textfilter_twitterfilter.rb +33 -0
  363. data/lib/publify_time.rb +30 -0
  364. data/lib/sidebar_field.rb +115 -0
  365. data/lib/sidebar_registry.rb +33 -0
  366. data/lib/spam_protection.rb +101 -0
  367. data/lib/stateful.rb +106 -0
  368. data/lib/tasks/publify_core_tasks.rake +4 -0
  369. data/lib/text_filter_plugin.rb +182 -0
  370. data/lib/theme.rb +72 -0
  371. data/lib/transforms.rb +45 -0
  372. metadata +865 -0
@@ -0,0 +1,486 @@
1
+ /**
2
+ * WideArea v0.3.0
3
+ * https://github.com/usablica/widearea
4
+ * MIT licensed
5
+ *
6
+ * Copyright (C) 2013 usabli.ca - By Afshin Mehrabani (@afshinmeh)
7
+ */
8
+
9
+ (function (root, factory) {
10
+ if (typeof exports === 'object') {
11
+ // CommonJS
12
+ factory(exports);
13
+ } else if (typeof define === 'function' && define.amd) {
14
+ // AMD. Register as an anonymous module.
15
+ define(['exports'], factory);
16
+ } else {
17
+ // Browser globals
18
+ factory(root);
19
+ }
20
+ } (this, function (exports) {
21
+ //Default config/variables
22
+ var VERSION = '0.3.0';
23
+
24
+ /**
25
+ * WideArea main class
26
+ *
27
+ * @class WideArea
28
+ */
29
+ function WideArea(obj) {
30
+ this._targetElement = obj;
31
+
32
+ //starts with 1
33
+ this._wideAreaId = 1;
34
+
35
+ this._options = {
36
+ wideAreaAttr: 'data-widearea',
37
+ exitOnEsc: true,
38
+ defaultColorScheme: 'light',
39
+ closeIconLabel: 'Close WideArea',
40
+ changeThemeIconLabel: 'Toggle Color Scheme',
41
+ fullScreenIconLabel: 'WideArea Mode',
42
+ autoSaveKeyPrefix: 'WDATA-'
43
+ };
44
+
45
+ _enable.call(this);
46
+ }
47
+
48
+ /**
49
+ * Save textarea data to storage
50
+ *
51
+ * @api private
52
+ * @method _saveToStorage
53
+ */
54
+ function _saveToStorage(id, value) {
55
+ //save textarea data in localStorage
56
+ //localStorage.setItem(this._options.autoSaveKeyPrefix + id, value);
57
+ }
58
+
59
+ /**
60
+ * Get data from storage
61
+ *
62
+ * @api private
63
+ * @method _getFromStorage
64
+ */
65
+ function _getFromStorage(id) {
66
+ // return localStorage.getItem(this._options.autoSaveKeyPrefix + id);
67
+ }
68
+
69
+ /**
70
+ * Clear specific textarea data from storage
71
+ *
72
+ * @api private
73
+ * @method _clearStorage
74
+ */
75
+ function _clearStorage(value) {
76
+
77
+ var currentElement, id;
78
+ if (typeof(value) == "string") {
79
+ //with css selector
80
+ currentElement = this._targetElement.querySelector(value);
81
+ if (currentElement) {
82
+ id = parseInt(currentElement.getAttribute("data-widearea-id"));
83
+ }
84
+ } else if (typeof(value) == "number") {
85
+ //first, clear it from storage
86
+ currentElement = this._targetElement.querySelector('textarea[data-widearea-id="' + value + '"]');
87
+ id = value;
88
+ } else if (typeof(value) == "object") {
89
+ //with DOM
90
+ currentElement = value;
91
+
92
+ if (currentElement) {
93
+ id = parseInt(currentElement.attr("data-widearea-id"));
94
+ }
95
+ }
96
+
97
+ //and then, clear the textarea
98
+ if (currentElement && id) {
99
+ currentElement.val('');
100
+ localStorage.removeItem(this._options.autoSaveKeyPrefix + id);
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Enable the WideArea
106
+ *
107
+ * @api private
108
+ * @method _enable
109
+ */
110
+ function _enable() {
111
+ var self = this,
112
+ //select all textareas in the target element
113
+ textAreaList = this._targetElement.querySelectorAll('textarea[' + this._options.wideAreaAttr + '=\'enable\']'),
114
+
115
+ // don't make functions within a loop.
116
+ fullscreenIconClickHandler = function() {
117
+ _enableFullScreen.call(self, this);
118
+ };
119
+
120
+ //to hold all textareas in the page
121
+ this._textareas = [];
122
+
123
+ //then, change all textareas to widearea
124
+ for (var i = textAreaList.length - 1; i >= 0; i--) {
125
+ var currentTextArea = textAreaList[i];
126
+ //create widearea wrapper element
127
+ var wideAreaWrapper = document.createElement('div'),
128
+ wideAreaIcons = document.createElement('div'),
129
+ fullscreenIcon = document.createElement('a');
130
+
131
+ wideAreaWrapper.className = 'widearea-wrapper';
132
+ wideAreaIcons.className = 'widearea-icons';
133
+ fullscreenIcon.className = 'widearea-icon fullscreen';
134
+ fullscreenIcon.title = this._options.fullScreenIconLabel;
135
+
136
+ //hack!
137
+ fullscreenIcon.href = 'javascript:void(0);';
138
+ fullscreenIcon.draggable = false;
139
+
140
+ //bind to click event
141
+ fullscreenIcon.onclick = fullscreenIconClickHandler;
142
+
143
+ //add widearea class to textarea
144
+ currentTextArea.className += (currentTextArea.className + " widearea").replace(/^\s+|\s+$/g, "");
145
+
146
+ //set wideArea id and increase the stepper
147
+ currentTextArea.setAttribute("data-widearea-id", this._wideAreaId);
148
+ wideAreaIcons.setAttribute("id", "widearea-" + this._wideAreaId);
149
+
150
+ //Autosaving
151
+ if (_getFromStorage.call(this, this._wideAreaId)) {
152
+ currentTextArea.value = _getFromStorage.call(this, this._wideAreaId);
153
+ }
154
+
155
+ var onTextChanged = function () {
156
+ _saveToStorage.call(self, this.getAttribute('data-widearea-id'), this.value);
157
+ };
158
+ //add textchange listener
159
+ if (currentTextArea.addEventListener) {
160
+ currentTextArea.addEventListener('input', onTextChanged, false);
161
+ } else if (currentTextArea.attachEvent) { //IE hack
162
+ currentTextArea.attachEvent('onpropertychange', onTextChanged);
163
+ }
164
+
165
+ //go to next wideArea
166
+ ++this._wideAreaId;
167
+
168
+ //set icons panel position
169
+ _renewIconsPosition(currentTextArea, wideAreaIcons);
170
+
171
+ //append all prepared div(s)
172
+ wideAreaIcons.appendChild(fullscreenIcon);
173
+ wideAreaWrapper.appendChild(wideAreaIcons);
174
+
175
+ //and append it to the page
176
+ document.body.appendChild(wideAreaWrapper);
177
+
178
+ //add the textarea to internal variable
179
+ this._textareas.push(currentTextArea);
180
+ }
181
+
182
+ //set a timer to re-calculate the position of textareas, I don't know whether this is a good approach or not
183
+ this._timer = setInterval(function() {
184
+ for (var i = self._textareas.length - 1; i >= 0; i--) {
185
+ var currentTextArea = self._textareas[i];
186
+ //get the related icon panel. Using `getElementById` for better performance
187
+ var wideAreaIcons = document.getElementById("widearea-" + currentTextArea.getAttribute("data-widearea-id"));
188
+
189
+ //get old position
190
+ var oldPosition = _getOffset(wideAreaIcons);
191
+
192
+ //get the new element's position
193
+ var currentTextareaPosition = _getOffset(currentTextArea);
194
+
195
+ //only set the new position of old positions changed
196
+ if((oldPosition.left - currentTextareaPosition.width + 21) != currentTextareaPosition.left || oldPosition.top != currentTextareaPosition.top) {
197
+ //set icons panel position
198
+ _renewIconsPosition(currentTextArea, wideAreaIcons, currentTextareaPosition);
199
+ }
200
+ };
201
+ }, 200);
202
+ }
203
+
204
+ /**
205
+ * Set new position to icons panel
206
+ *
207
+ * @api private
208
+ * @method _renewIconsPosition
209
+ * @param {Object} textarea
210
+ * @param {Object} iconPanel
211
+ */
212
+ function _renewIconsPosition(textarea, iconPanel, textAreaPosition) {
213
+ var currentTextareaPosition = textAreaPosition || _getOffset(textarea);
214
+ //set icon panel position
215
+ iconPanel.style.left = currentTextareaPosition.left + currentTextareaPosition.width - 21 + "px";
216
+ iconPanel.style.top = currentTextareaPosition.top + "px";
217
+ }
218
+
219
+ /**
220
+ * Get an element position on the page
221
+ * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966
222
+ *
223
+ * @api private
224
+ * @method _getOffset
225
+ * @param {Object} element
226
+ * @returns Element's position info
227
+ */
228
+ function _getOffset(element) {
229
+ var elementPosition = {};
230
+
231
+ //set width
232
+ elementPosition.width = element.offsetWidth;
233
+
234
+ //set height
235
+ elementPosition.height = element.offsetHeight;
236
+
237
+ //calculate element top and left
238
+ var _x = 0;
239
+ var _y = 0;
240
+ while(element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) {
241
+ _x += element.offsetLeft;
242
+ _y += element.offsetTop;
243
+ element = element.offsetParent;
244
+ }
245
+ //set top
246
+ elementPosition.top = _y;
247
+ //set left
248
+ elementPosition.left = _x;
249
+
250
+ return elementPosition;
251
+ }
252
+
253
+ /**
254
+ * Get an element CSS property on the page
255
+ * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml
256
+ *
257
+ * @api private
258
+ * @method _getPropValue
259
+ * @param {Object} element
260
+ * @param {String} propName
261
+ * @returns Element's property value
262
+ */
263
+ function _getPropValue (element, propName) {
264
+ var propValue = '';
265
+ if (element.currentStyle) { //IE
266
+ propValue = element.currentStyle[propName];
267
+ } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others
268
+ propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);
269
+ }
270
+
271
+ //Prevent exception in IE
272
+ if(propValue.toLowerCase) {
273
+ return propValue.toLowerCase();
274
+ } else {
275
+ return propValue;
276
+ }
277
+ }
278
+
279
+ /**
280
+ * FullScreen the textarea
281
+ *
282
+ * @api private
283
+ * @method _enableFullScreen
284
+ * @param {Object} link
285
+ */
286
+ function _enableFullScreen(link) {
287
+ var self = this;
288
+
289
+ //first of all, get the textarea id
290
+ var wideAreaId = parseInt(link.parentNode.id.replace(/widearea\-/, ""));
291
+
292
+ //I don't know whether is this correct or not, but I think it's not a bad way
293
+ var targetTextarea = document.querySelector("textarea[data-widearea-id='" + wideAreaId + "']");
294
+
295
+ //clone current textarea
296
+ var currentTextArea = targetTextarea.cloneNode();
297
+
298
+ //add proper css class names
299
+ currentTextArea.className = ('widearea-fullscreen ' + targetTextarea.className).replace(/^\s+|\s+$/g, "");
300
+ targetTextarea.className = ('widearea-fullscreened ' + targetTextarea.className).replace(/^\s+|\s+$/g, "");
301
+
302
+ var controlPanel = document.createElement('div');
303
+ controlPanel.className = 'widearea-controlPanel';
304
+
305
+ //create close icon
306
+ var closeIcon = document.createElement('a');
307
+ closeIcon.href = 'javascript:void(0);';
308
+ closeIcon.className = 'widearea-icon close';
309
+ closeIcon.title = this._options.closeIconLabel;
310
+ closeIcon.onclick = function(){
311
+ _disableFullScreen.call(self);
312
+ };
313
+
314
+ //disable dragging
315
+ closeIcon.draggable = false;
316
+
317
+ //create close icon
318
+ var changeThemeIcon = document.createElement('a');
319
+ changeThemeIcon.href = 'javascript:void(0);';
320
+ changeThemeIcon.className = 'widearea-icon changeTheme';
321
+ changeThemeIcon.title = this._options.changeThemeIconLabel;
322
+ changeThemeIcon.onclick = function() {
323
+ _toggleColorScheme.call(self);
324
+ };
325
+
326
+ //disable dragging
327
+ changeThemeIcon.draggable = false;
328
+
329
+ controlPanel.appendChild(closeIcon);
330
+ controlPanel.appendChild(changeThemeIcon);
331
+
332
+ //create overlay layer
333
+ var overlayLayer = document.createElement('div');
334
+ overlayLayer.className = 'widearea-overlayLayer ' + this._options.defaultColorScheme;
335
+
336
+ //add controls to overlay layer
337
+ overlayLayer.appendChild(currentTextArea);
338
+ overlayLayer.appendChild(controlPanel);
339
+
340
+ //finally add it to the body
341
+ document.body.appendChild(overlayLayer);
342
+
343
+ //set the focus to textarea
344
+ currentTextArea.focus();
345
+
346
+ //set the value of small textarea to fullscreen one
347
+ currentTextArea.value = targetTextarea.value;
348
+
349
+ var onTextChanged = function () {
350
+ _saveToStorage.call(self, this.getAttribute('data-widearea-id'), this.value);
351
+ };
352
+ //add textchange listener
353
+ if (currentTextArea.addEventListener) {
354
+ currentTextArea.addEventListener('input', onTextChanged, false);
355
+ } else if (currentTextArea.attachEvent) { //IE hack
356
+ currentTextArea.attachEvent('onpropertychange', onTextChanged);
357
+ }
358
+
359
+ //bind to keydown event
360
+ this._onKeyDown = function(e) {
361
+ if (e.keyCode === 27 && self._options.exitOnEsc) {
362
+ //escape key pressed
363
+ _disableFullScreen.call(self);
364
+ }
365
+ if (e.keyCode == 9) {
366
+ // tab key pressed
367
+ e.preventDefault();
368
+ var selectionStart = currentTextArea.selectionStart;
369
+ currentTextArea.value = currentTextArea.value.substring(0, selectionStart) + "\t" + currentTextArea.value.substring(currentTextArea.selectionEnd);
370
+ currentTextArea.selectionEnd = selectionStart + 1;
371
+ }
372
+ };
373
+ if (window.addEventListener) {
374
+ window.addEventListener('keydown', self._onKeyDown, true);
375
+ } else if (document.attachEvent) { //IE
376
+ document.attachEvent('onkeydown', self._onKeyDown);
377
+ }
378
+ }
379
+
380
+ /**
381
+ * Change/Toggle color scheme of WideArea
382
+ *
383
+ * @api private
384
+ * @method _toggleColorScheme
385
+ */
386
+ function _toggleColorScheme() {
387
+ var overlayLayer = document.querySelector(".widearea-overlayLayer");
388
+ if(/dark/gi.test(overlayLayer.className)) {
389
+ overlayLayer.className = overlayLayer.className.replace('dark', 'light');
390
+ } else {
391
+ overlayLayer.className = overlayLayer.className.replace('light', 'dark');
392
+ }
393
+ }
394
+
395
+ /**
396
+ * Close FullScreen
397
+ *
398
+ * @api private
399
+ * @method _disableFullScreen
400
+ */
401
+ function _disableFullScreen() {
402
+ var smallTextArea = document.querySelector("textarea.widearea-fullscreened");
403
+ var overlayLayer = document.querySelector(".widearea-overlayLayer");
404
+ var fullscreenTextArea = overlayLayer.querySelector("textarea");
405
+
406
+ //change the focus
407
+ smallTextArea.focus();
408
+
409
+ //set fullscreen textarea to small one
410
+ smallTextArea.value = fullscreenTextArea.value;
411
+
412
+ //reset class for targeted text
413
+ smallTextArea.className = smallTextArea.className.replace(/widearea-fullscreened/gi, "").replace(/^\s+|\s+$/g, "");
414
+
415
+ //and then remove the overlay layer
416
+ overlayLayer.parentNode.removeChild(overlayLayer);
417
+
418
+ //clean listeners
419
+ if (window.removeEventListener) {
420
+ window.removeEventListener('keydown', this._onKeyDown, true);
421
+ } else if (document.detachEvent) { //IE
422
+ document.detachEvent('onkeydown', this._onKeyDown);
423
+ }
424
+
425
+ adaptiveheight(smallTextArea);
426
+ }
427
+
428
+ /**
429
+ * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1
430
+ *
431
+ * @param obj1
432
+ * @param obj2
433
+ * @returns obj3 a new object based on obj1 and obj2
434
+ */
435
+ function _mergeOptions(obj1, obj2) {
436
+ var obj3 = {}, attrname;
437
+ for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }
438
+ for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }
439
+ return obj3;
440
+ }
441
+
442
+ var wideArea = function (selector) {
443
+ if (typeof (selector) === 'string') {
444
+ //select the target element with query selector
445
+ var targetElement = document.querySelector(selector);
446
+
447
+ if (targetElement) {
448
+ return new WideArea(targetElement);
449
+ } else {
450
+ throw new Error('There is no element with given selector.');
451
+ }
452
+ } else {
453
+ return new WideArea(document.body);
454
+ }
455
+ };
456
+
457
+ /**
458
+ * Current WideArea version
459
+ *
460
+ * @property version
461
+ * @type String
462
+ */
463
+ wideArea.version = VERSION;
464
+
465
+ //Prototype
466
+ wideArea.fn = WideArea.prototype = {
467
+ clone: function () {
468
+ return new WideArea(this);
469
+ },
470
+ setOption: function(option, value) {
471
+ this._options[option] = value;
472
+ return this;
473
+ },
474
+ setOptions: function(options) {
475
+ this._options = _mergeOptions(this._options, options);
476
+ return this;
477
+ },
478
+ clearData: function(value) {
479
+ _clearStorage.call(this, value);
480
+ return this;
481
+ }
482
+ };
483
+
484
+ exports.wideArea = wideArea;
485
+ return wideArea;
486
+ }));
@@ -0,0 +1,7 @@
1
+ // "bootstrap-sprockets" must be imported before "bootstrap" and "bootstrap/variables"
2
+ @import "bootstrap-sprockets";
3
+ @import "bootstrap";
4
+
5
+ body {
6
+ padding-top: 160px;
7
+ }