comfypress 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (289) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +22 -0
  4. data/Gemfile +22 -0
  5. data/Gemfile.lock +175 -0
  6. data/LICENSE +20 -0
  7. data/README.md +79 -0
  8. data/Rakefile +5 -0
  9. data/app/assets/images/comfypress/arrow_bottom.gif +0 -0
  10. data/app/assets/images/comfypress/arrow_right.gif +0 -0
  11. data/app/assets/images/comfypress/bootstrap/glyphicons-halflings-white.png +0 -0
  12. data/app/assets/images/comfypress/bootstrap/glyphicons-halflings.png +0 -0
  13. data/app/assets/images/comfypress/checkerboard.gif +0 -0
  14. data/app/assets/images/comfypress/icon_draft.gif +0 -0
  15. data/app/assets/images/comfypress/icon_file.gif +0 -0
  16. data/app/assets/images/comfypress/icon_layout.gif +0 -0
  17. data/app/assets/images/comfypress/icon_move.gif +0 -0
  18. data/app/assets/images/comfypress/icon_page.gif +0 -0
  19. data/app/assets/images/comfypress/icon_site.gif +0 -0
  20. data/app/assets/images/comfypress/icon_snippet.gif +0 -0
  21. data/app/assets/images/comfypress/nav_arrow.png +0 -0
  22. data/app/assets/javascripts/comfypress/admin/application.js +1 -0
  23. data/app/assets/javascripts/comfypress/application.js.coffee +175 -0
  24. data/app/assets/javascripts/comfypress/lib/bootstrap-datetimepicker.js +21 -0
  25. data/app/assets/javascripts/comfypress/lib/bootstrap-wysihtml5.js +492 -0
  26. data/app/assets/javascripts/comfypress/lib/bootstrap.js +6 -0
  27. data/app/assets/javascripts/comfypress/lib/codemirror.js +10 -0
  28. data/app/assets/javascripts/comfypress/lib/wysihtml5.js +261 -0
  29. data/app/assets/stylesheets/comfypress/admin/application.css +1 -0
  30. data/app/assets/stylesheets/comfypress/application.css.sass +8 -0
  31. data/app/assets/stylesheets/comfypress/base.css.sass +333 -0
  32. data/app/assets/stylesheets/comfypress/bootstrap_overrides.css.sass +45 -0
  33. data/app/assets/stylesheets/comfypress/codemirror_overrides.css.sass +27 -0
  34. data/app/assets/stylesheets/comfypress/lib/bootstrap-datetimepicker.css +9 -0
  35. data/app/assets/stylesheets/comfypress/lib/bootstrap-wysihtml5.css +102 -0
  36. data/app/assets/stylesheets/comfypress/lib/bootstrap.css +9 -0
  37. data/app/assets/stylesheets/comfypress/lib/codemirror.css +240 -0
  38. data/app/assets/stylesheets/comfypress/wysihtml5_overrides.css.sass +5 -0
  39. data/app/controllers/application_controller.rb +5 -0
  40. data/app/controllers/cms_admin/base_controller.rb +51 -0
  41. data/app/controllers/cms_admin/categories_controller.rb +35 -0
  42. data/app/controllers/cms_admin/files_controller.rb +108 -0
  43. data/app/controllers/cms_admin/layouts_controller.rb +67 -0
  44. data/app/controllers/cms_admin/menu_items_controller.rb +65 -0
  45. data/app/controllers/cms_admin/menus_controller.rb +60 -0
  46. data/app/controllers/cms_admin/pages_controller.rb +112 -0
  47. data/app/controllers/cms_admin/revisions_controller.rb +57 -0
  48. data/app/controllers/cms_admin/sites_controller.rb +64 -0
  49. data/app/controllers/cms_admin/snippets_controller.rb +64 -0
  50. data/app/controllers/cms_content_controller.rb +79 -0
  51. data/app/helpers/application_helper.rb +16 -0
  52. data/app/models/cms/block.rb +48 -0
  53. data/app/models/cms/categorization.rb +21 -0
  54. data/app/models/cms/category.rb +30 -0
  55. data/app/models/cms/file.rb +75 -0
  56. data/app/models/cms/layout.rb +99 -0
  57. data/app/models/cms/menu.rb +26 -0
  58. data/app/models/cms/menu_item.rb +14 -0
  59. data/app/models/cms/page.rb +202 -0
  60. data/app/models/cms/revision.rb +17 -0
  61. data/app/models/cms/site.rb +113 -0
  62. data/app/models/cms/snippet.rb +58 -0
  63. data/app/models/cms.rb +5 -0
  64. data/app/views/cms_admin/categories/_categories.html.haml +3 -0
  65. data/app/views/cms_admin/categories/_edit.html.haml +6 -0
  66. data/app/views/cms_admin/categories/_form.html.haml +8 -0
  67. data/app/views/cms_admin/categories/_index.html.haml +24 -0
  68. data/app/views/cms_admin/categories/_show.html.haml +13 -0
  69. data/app/views/cms_admin/categories/create.js.erb +7 -0
  70. data/app/views/cms_admin/categories/destroy.js.erb +3 -0
  71. data/app/views/cms_admin/categories/edit.js.erb +3 -0
  72. data/app/views/cms_admin/categories/update.js.erb +6 -0
  73. data/app/views/cms_admin/files/_file.html.haml +13 -0
  74. data/app/views/cms_admin/files/_form.html.haml +14 -0
  75. data/app/views/cms_admin/files/_index.html.haml +14 -0
  76. data/app/views/cms_admin/files/_page_form.html.haml +9 -0
  77. data/app/views/cms_admin/files/destroy.js.coffee +2 -0
  78. data/app/views/cms_admin/files/edit.html.haml +5 -0
  79. data/app/views/cms_admin/files/index.html.haml +28 -0
  80. data/app/views/cms_admin/files/new.html.haml +5 -0
  81. data/app/views/cms_admin/layouts/_form.html.haml +17 -0
  82. data/app/views/cms_admin/layouts/_index_branch.html.haml +23 -0
  83. data/app/views/cms_admin/layouts/edit.html.haml +9 -0
  84. data/app/views/cms_admin/layouts/index.html.haml +9 -0
  85. data/app/views/cms_admin/layouts/new.html.haml +5 -0
  86. data/app/views/cms_admin/menu_items/_form.html.haml +22 -0
  87. data/app/views/cms_admin/menu_items/edit.html.haml +8 -0
  88. data/app/views/cms_admin/menu_items/index.html.haml +24 -0
  89. data/app/views/cms_admin/menu_items/new.html.haml +5 -0
  90. data/app/views/cms_admin/menus/_form.html.haml +8 -0
  91. data/app/views/cms_admin/menus/edit.html.haml +8 -0
  92. data/app/views/cms_admin/menus/index.html.haml +24 -0
  93. data/app/views/cms_admin/menus/new.html.haml +5 -0
  94. data/app/views/cms_admin/pages/_form.html.haml +38 -0
  95. data/app/views/cms_admin/pages/_form_blocks.html.haml +28 -0
  96. data/app/views/cms_admin/pages/_index_branch.html.haml +35 -0
  97. data/app/views/cms_admin/pages/edit.html.haml +9 -0
  98. data/app/views/cms_admin/pages/form_blocks.js.erb +2 -0
  99. data/app/views/cms_admin/pages/index.html.haml +11 -0
  100. data/app/views/cms_admin/pages/new.html.haml +5 -0
  101. data/app/views/cms_admin/pages/toggle_branch.js.erb +11 -0
  102. data/app/views/cms_admin/revisions/show.html.haml +28 -0
  103. data/app/views/cms_admin/sites/_form.html.haml +14 -0
  104. data/app/views/cms_admin/sites/_mirrors.html.haml +17 -0
  105. data/app/views/cms_admin/sites/edit.html.haml +5 -0
  106. data/app/views/cms_admin/sites/index.html.haml +24 -0
  107. data/app/views/cms_admin/sites/new.html.haml +5 -0
  108. data/app/views/cms_admin/snippets/_form.html.haml +11 -0
  109. data/app/views/cms_admin/snippets/edit.html.haml +9 -0
  110. data/app/views/cms_admin/snippets/index.html.haml +28 -0
  111. data/app/views/cms_admin/snippets/new.html.haml +5 -0
  112. data/app/views/cms_content/_menu.html.haml +5 -0
  113. data/app/views/cms_content/render_sitemap.xml.builder +15 -0
  114. data/app/views/layouts/cms_admin/_body.html.haml +16 -0
  115. data/app/views/layouts/cms_admin/_center.html.haml +7 -0
  116. data/app/views/layouts/cms_admin/_footer.html.haml +3 -0
  117. data/app/views/layouts/cms_admin/_footer_js.html.haml +7 -0
  118. data/app/views/layouts/cms_admin/_head.html.haml +12 -0
  119. data/app/views/layouts/cms_admin/_left.html.haml +11 -0
  120. data/app/views/layouts/cms_admin/_right.html.haml +1 -0
  121. data/app/views/layouts/cms_admin.html.haml +4 -0
  122. data/comfypress.gemspec +28 -0
  123. data/config/application.rb +69 -0
  124. data/config/boot.rb +6 -0
  125. data/config/database.sqlite.yml +47 -0
  126. data/config/database.yml +47 -0
  127. data/config/environment.rb +5 -0
  128. data/config/environments/development.rb +39 -0
  129. data/config/environments/production.rb +67 -0
  130. data/config/environments/test.rb +39 -0
  131. data/config/initializers/comfypress.rb +100 -0
  132. data/config/initializers/paperclip.rb +3 -0
  133. data/config/locales/de.yml +236 -0
  134. data/config/locales/en.yml +285 -0
  135. data/config/locales/es.yml +236 -0
  136. data/config/locales/fr.yml +236 -0
  137. data/config/locales/ja.yml +237 -0
  138. data/config/locales/pl.yml +236 -0
  139. data/config/locales/pt-BR.yml +236 -0
  140. data/config/locales/ru.yml +236 -0
  141. data/config/locales/sv.yml +236 -0
  142. data/config/locales/zh-CN.yml +236 -0
  143. data/config/routes.rb +10 -0
  144. data/config.ru +4 -0
  145. data/db/cms_fixtures/sample-site/layouts/default/_default.yml +1 -0
  146. data/db/cms_fixtures/sample-site/layouts/default/content.html +5 -0
  147. data/db/cms_fixtures/sample-site/layouts/default/css.css +1 -0
  148. data/db/cms_fixtures/sample-site/layouts/default/js.js +1 -0
  149. data/db/cms_fixtures/sample-site/layouts/default/nested/_nested.yml +2 -0
  150. data/db/cms_fixtures/sample-site/layouts/default/nested/content.html +2 -0
  151. data/db/cms_fixtures/sample-site/layouts/default/nested/css.css +1 -0
  152. data/db/cms_fixtures/sample-site/layouts/default/nested/js.js +1 -0
  153. data/db/cms_fixtures/sample-site/pages/index/_index.yml +2 -0
  154. data/db/cms_fixtures/sample-site/pages/index/child/_child.yml +3 -0
  155. data/db/cms_fixtures/sample-site/pages/index/child/left.html +1 -0
  156. data/db/cms_fixtures/sample-site/pages/index/child/right.html +1 -0
  157. data/db/cms_fixtures/sample-site/pages/index/content.html +2 -0
  158. data/db/cms_fixtures/sample-site/snippets/default/_default.yml +1 -0
  159. data/db/cms_fixtures/sample-site/snippets/default/content.html +1 -0
  160. data/db/migrate/01_create_cms.rb +163 -0
  161. data/db/seeds.rb +9 -0
  162. data/db/upgrade_migrations/02_upgrade_to_1_1_0.rb +19 -0
  163. data/db/upgrade_migrations/03_upgrade_to_1_2_0.rb +15 -0
  164. data/db/upgrade_migrations/04_upgrade_to_1_3_0.rb +23 -0
  165. data/db/upgrade_migrations/05_upgrade_to_1_4_0.rb +33 -0
  166. data/db/upgrade_migrations/06_upgrade_to_1_5_0.rb +21 -0
  167. data/db/upgrade_migrations/07_upgrade_to_1_6_0.rb +25 -0
  168. data/doc/preview.png +0 -0
  169. data/doc/sofa.png +0 -0
  170. data/lib/comfypress/authentication/dummy_auth.rb +8 -0
  171. data/lib/comfypress/authentication/http_auth.rb +18 -0
  172. data/lib/comfypress/configuration.rb +99 -0
  173. data/lib/comfypress/engine.rb +18 -0
  174. data/lib/comfypress/error.rb +24 -0
  175. data/lib/comfypress/extensions/acts_as_tree.rb +102 -0
  176. data/lib/comfypress/extensions/has_revisions.rb +64 -0
  177. data/lib/comfypress/extensions/is_categorized.rb +49 -0
  178. data/lib/comfypress/extensions/is_mirrored.rb +85 -0
  179. data/lib/comfypress/extensions/rails.rb +24 -0
  180. data/lib/comfypress/fixtures.rb +289 -0
  181. data/lib/comfypress/form_builder.rb +97 -0
  182. data/lib/comfypress/render_methods.rb +85 -0
  183. data/lib/comfypress/routing.rb +62 -0
  184. data/lib/comfypress/sitemap.rb +27 -0
  185. data/lib/comfypress/tag.rb +154 -0
  186. data/lib/comfypress/tags/asset.rb +25 -0
  187. data/lib/comfypress/tags/collection.rb +64 -0
  188. data/lib/comfypress/tags/field_datetime.rb +17 -0
  189. data/lib/comfypress/tags/field_integer.rb +17 -0
  190. data/lib/comfypress/tags/field_rich_text.rb +17 -0
  191. data/lib/comfypress/tags/field_string.rb +17 -0
  192. data/lib/comfypress/tags/field_text.rb +17 -0
  193. data/lib/comfypress/tags/file.rb +29 -0
  194. data/lib/comfypress/tags/helper.rb +24 -0
  195. data/lib/comfypress/tags/menu.rb +27 -0
  196. data/lib/comfypress/tags/page_datetime.rb +13 -0
  197. data/lib/comfypress/tags/page_file.rb +51 -0
  198. data/lib/comfypress/tags/page_files.rb +52 -0
  199. data/lib/comfypress/tags/page_integer.rb +13 -0
  200. data/lib/comfypress/tags/page_markdown.rb +22 -0
  201. data/lib/comfypress/tags/page_rich_text.rb +13 -0
  202. data/lib/comfypress/tags/page_string.rb +13 -0
  203. data/lib/comfypress/tags/page_text.rb +13 -0
  204. data/lib/comfypress/tags/partial.rb +23 -0
  205. data/lib/comfypress/tags/snippet.rb +19 -0
  206. data/lib/comfypress/version.rb +3 -0
  207. data/lib/comfypress/view_hooks.rb +32 -0
  208. data/lib/comfypress/view_methods.rb +52 -0
  209. data/lib/comfypress.rb +66 -0
  210. data/lib/generators/comfy/cms/README +10 -0
  211. data/lib/generators/comfy/cms/cms_generator.rb +57 -0
  212. data/lib/tasks/comfypress.rake +45 -0
  213. data/script/rails +6 -0
  214. data/test/fixtures/cms/blocks.yml +12 -0
  215. data/test/fixtures/cms/categories.yml +4 -0
  216. data/test/fixtures/cms/categorizations.yml +3 -0
  217. data/test/fixtures/cms/files.yml +9 -0
  218. data/test/fixtures/cms/layouts.yml +40 -0
  219. data/test/fixtures/cms/menu_items.yml +15 -0
  220. data/test/fixtures/cms/menus.yml +9 -0
  221. data/test/fixtures/cms/pages.yml +39 -0
  222. data/test/fixtures/cms/revisions.yml +21 -0
  223. data/test/fixtures/cms/sites.yml +6 -0
  224. data/test/fixtures/cms/snippets.yml +6 -0
  225. data/test/fixtures/files/data.zip +0 -0
  226. data/test/fixtures/files/document.pdf +0 -0
  227. data/test/fixtures/files/image.gif +0 -0
  228. data/test/fixtures/files/image.jpg +0 -0
  229. data/test/fixtures/views/_nav_hook.html.erb +1 -0
  230. data/test/fixtures/views/_nav_hook_2.html.erb +1 -0
  231. data/test/fixtures/views/render_test/_test.html.erb +1 -0
  232. data/test/fixtures/views/render_test/new.html.erb +1 -0
  233. data/test/fixtures/views/render_test/render_layout.html.erb +1 -0
  234. data/test/functional/cms_admin/base_controller_test.rb +18 -0
  235. data/test/functional/cms_admin/categories_controller_test.rb +70 -0
  236. data/test/functional/cms_admin/files_controller_test.rb +216 -0
  237. data/test/functional/cms_admin/layouts_controller_test.rb +123 -0
  238. data/test/functional/cms_admin/pages_controller_test.rb +450 -0
  239. data/test/functional/cms_admin/revisions_controller_test.rb +138 -0
  240. data/test/functional/cms_admin/sites_controller_test.rb +105 -0
  241. data/test/functional/cms_admin/snippets_controller_test.rb +140 -0
  242. data/test/functional/cms_content_controller_test.rb +205 -0
  243. data/test/gemfiles/Gemfile.rails.3.1 +16 -0
  244. data/test/gemfiles/Gemfile.rails.3.2 +16 -0
  245. data/test/gemfiles/Gemfile.rails.4.0 +16 -0
  246. data/test/integration/authentication_test.rb +48 -0
  247. data/test/integration/fixtures_test.rb +61 -0
  248. data/test/integration/mirrors_test.rb +72 -0
  249. data/test/integration/render_cms_test.rb +233 -0
  250. data/test/integration/sites_test.rb +120 -0
  251. data/test/integration/view_hooks_test.rb +43 -0
  252. data/test/test_helper.rb +124 -0
  253. data/test/unit/cms/menu_item_test.rb +7 -0
  254. data/test/unit/cms/menu_test.rb +7 -0
  255. data/test/unit/configuration_test.rb +42 -0
  256. data/test/unit/fixtures_test.rb +357 -0
  257. data/test/unit/mirrors_test.rb +242 -0
  258. data/test/unit/models/block_test.rb +199 -0
  259. data/test/unit/models/categorization_test.rb +76 -0
  260. data/test/unit/models/category_test.rb +39 -0
  261. data/test/unit/models/file_test.rb +89 -0
  262. data/test/unit/models/layout_test.rb +125 -0
  263. data/test/unit/models/page_test.rb +255 -0
  264. data/test/unit/models/site_test.rb +152 -0
  265. data/test/unit/models/snippet_test.rb +49 -0
  266. data/test/unit/revisions_test.rb +185 -0
  267. data/test/unit/sitemap_test.rb +20 -0
  268. data/test/unit/tag_test.rb +308 -0
  269. data/test/unit/tags/asset_test.rb +56 -0
  270. data/test/unit/tags/collection_test.rb +116 -0
  271. data/test/unit/tags/field_datetime_test.rb +50 -0
  272. data/test/unit/tags/field_integer_test.rb +49 -0
  273. data/test/unit/tags/field_rich_text_test.rb +49 -0
  274. data/test/unit/tags/field_string_test.rb +52 -0
  275. data/test/unit/tags/field_text_test.rb +48 -0
  276. data/test/unit/tags/file_test.rb +67 -0
  277. data/test/unit/tags/helper_test.rb +86 -0
  278. data/test/unit/tags/page_datetime_test.rb +50 -0
  279. data/test/unit/tags/page_file_test.rb +119 -0
  280. data/test/unit/tags/page_files_test.rb +113 -0
  281. data/test/unit/tags/page_integer_test.rb +49 -0
  282. data/test/unit/tags/page_markdown_test.rb +48 -0
  283. data/test/unit/tags/page_rich_text_test.rb +49 -0
  284. data/test/unit/tags/page_string_test.rb +49 -0
  285. data/test/unit/tags/page_text_test.rb +52 -0
  286. data/test/unit/tags/partial_test.rb +76 -0
  287. data/test/unit/tags/snippet_test.rb +45 -0
  288. data/test/unit/view_methods_test.rb +80 -0
  289. metadata +457 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 69ad5a5d91f31b1a71d2b1cc412c0969b9f3da2f
4
+ data.tar.gz: 845d547a1946f53e1af47031ed5ca47257188464
5
+ SHA512:
6
+ metadata.gz: d24420a70efb6ae4afdcf042d509a709e79cb70432eaaa361d0ebced8eb5e36bdb96be8b4358482d2ecd2788408bcaef79e8350fc003725423092cd48a4c7e9d
7
+ data.tar.gz: 2f40cc4f8ad8cdc0297e106d4ba1ec979034217e10cebf11272fb4249515f0bc600981055b93865a206f72fd4a212efc73e616ded3e65c7b2f418a133c893309
data/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ .bundle
2
+ db/*.sqlite3
3
+ log/*.log
4
+ tmp/**/*
5
+ .DS_Store
6
+ db/schema.rb
7
+ db/development_structure.sql
8
+ pkg
9
+ rdoc
10
+ /tmp
11
+ public/*
12
+ .rvmrc
13
+ .ruby-version
14
+ /.sass-cache
15
+ /coverage
data/.travis.yml ADDED
@@ -0,0 +1,22 @@
1
+ language: ruby
2
+ before_install:
3
+ - gem update --system
4
+ - gem --version
5
+ - gem install bundler
6
+ rvm:
7
+ - 1.9.2
8
+ - 1.9.3
9
+ - 2.0.0
10
+ gemfile:
11
+ - test/gemfiles/Gemfile.rails.3.1
12
+ - test/gemfiles/Gemfile.rails.3.2
13
+ - test/gemfiles/Gemfile.rails.4.0
14
+ notifications:
15
+ recipients:
16
+ - oleg@khabarov.ca
17
+ branches:
18
+ only:
19
+ - master
20
+ matrix:
21
+ allow_failures:
22
+ - gemfile: test/gemfiles/Gemfile.rails.4.0
data/Gemfile ADDED
@@ -0,0 +1,22 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
4
+
5
+
6
+ gem "mysql2", "~> 0.3.11"
7
+
8
+ gem 'therubyracer', '~> 0.11.4'
9
+ gem 'libv8'
10
+
11
+ gem 'seedbank'
12
+
13
+ gem "mysql"
14
+
15
+ group :test do
16
+ gem 'sqlite3'
17
+ gem 'coveralls', :require => false
18
+ end
19
+
20
+ group :development do
21
+ gem 'pry'
22
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,175 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ comfypress (0.1.2)
5
+ active_link_to (>= 1.0.0)
6
+ coffee-rails (>= 3.1.0)
7
+ formatted_form (>= 2.1.0)
8
+ haml-rails (>= 0.3.0)
9
+ jquery-rails (>= 2.1.4)
10
+ paperclip (>= 3.4.0)
11
+ rails (>= 3.1.0)
12
+ redcarpet (>= 2.2.0)
13
+ sass-rails (>= 3.1.0)
14
+
15
+ GEM
16
+ remote: http://rubygems.org/
17
+ specs:
18
+ actionmailer (3.2.13)
19
+ actionpack (= 3.2.13)
20
+ mail (~> 2.5.3)
21
+ actionpack (3.2.13)
22
+ activemodel (= 3.2.13)
23
+ activesupport (= 3.2.13)
24
+ builder (~> 3.0.0)
25
+ erubis (~> 2.7.0)
26
+ journey (~> 1.0.4)
27
+ rack (~> 1.4.5)
28
+ rack-cache (~> 1.2)
29
+ rack-test (~> 0.6.1)
30
+ sprockets (~> 2.2.1)
31
+ active_link_to (1.0.1)
32
+ actionpack
33
+ activemodel (3.2.13)
34
+ activesupport (= 3.2.13)
35
+ builder (~> 3.0.0)
36
+ activerecord (3.2.13)
37
+ activemodel (= 3.2.13)
38
+ activesupport (= 3.2.13)
39
+ arel (~> 3.0.2)
40
+ tzinfo (~> 0.3.29)
41
+ activeresource (3.2.13)
42
+ activemodel (= 3.2.13)
43
+ activesupport (= 3.2.13)
44
+ activesupport (3.2.13)
45
+ i18n (= 0.6.1)
46
+ multi_json (~> 1.0)
47
+ arel (3.0.2)
48
+ builder (3.0.4)
49
+ climate_control (0.0.3)
50
+ activesupport (>= 3.0)
51
+ cocaine (0.5.1)
52
+ climate_control (>= 0.0.3, < 1.0)
53
+ coderay (1.0.9)
54
+ coffee-rails (3.2.2)
55
+ coffee-script (>= 2.2.0)
56
+ railties (~> 3.2.0)
57
+ coffee-script (2.2.0)
58
+ coffee-script-source
59
+ execjs
60
+ coffee-script-source (1.6.2)
61
+ colorize (0.5.8)
62
+ coveralls (0.6.7)
63
+ colorize
64
+ multi_json (~> 1.3)
65
+ rest-client
66
+ simplecov (>= 0.7)
67
+ thor
68
+ erubis (2.7.0)
69
+ execjs (1.4.0)
70
+ multi_json (~> 1.0)
71
+ formatted_form (2.1.1)
72
+ rails (>= 3.1.0)
73
+ haml (4.0.3)
74
+ tilt
75
+ haml-rails (0.4)
76
+ actionpack (>= 3.1, < 4.1)
77
+ activesupport (>= 3.1, < 4.1)
78
+ haml (>= 3.1, < 4.1)
79
+ railties (>= 3.1, < 4.1)
80
+ hike (1.2.2)
81
+ i18n (0.6.1)
82
+ journey (1.0.4)
83
+ jquery-rails (2.2.1)
84
+ railties (>= 3.0, < 5.0)
85
+ thor (>= 0.14, < 2.0)
86
+ json (1.8.0)
87
+ libv8 (3.11.8.17)
88
+ mail (2.5.4)
89
+ mime-types (~> 1.16)
90
+ treetop (~> 1.4.8)
91
+ method_source (0.8.1)
92
+ mime-types (1.23)
93
+ multi_json (1.7.4)
94
+ mysql (2.9.1)
95
+ mysql2 (0.3.11)
96
+ paperclip (3.4.2)
97
+ activemodel (>= 3.0.0)
98
+ activerecord (>= 3.0.0)
99
+ activesupport (>= 3.0.0)
100
+ cocaine (~> 0.5.0)
101
+ mime-types
102
+ polyglot (0.3.3)
103
+ pry (0.9.12.2)
104
+ coderay (~> 1.0.5)
105
+ method_source (~> 0.8)
106
+ slop (~> 3.4)
107
+ rack (1.4.5)
108
+ rack-cache (1.2)
109
+ rack (>= 0.4)
110
+ rack-ssl (1.3.3)
111
+ rack
112
+ rack-test (0.6.2)
113
+ rack (>= 1.0)
114
+ rails (3.2.13)
115
+ actionmailer (= 3.2.13)
116
+ actionpack (= 3.2.13)
117
+ activerecord (= 3.2.13)
118
+ activeresource (= 3.2.13)
119
+ activesupport (= 3.2.13)
120
+ bundler (~> 1.0)
121
+ railties (= 3.2.13)
122
+ railties (3.2.13)
123
+ actionpack (= 3.2.13)
124
+ activesupport (= 3.2.13)
125
+ rack-ssl (~> 1.3.2)
126
+ rake (>= 0.8.7)
127
+ rdoc (~> 3.4)
128
+ thor (>= 0.14.6, < 2.0)
129
+ rake (10.0.4)
130
+ rdoc (3.12.2)
131
+ json (~> 1.4)
132
+ redcarpet (2.3.0)
133
+ ref (1.0.4)
134
+ rest-client (1.6.7)
135
+ mime-types (>= 1.16)
136
+ sass (3.2.9)
137
+ sass-rails (3.2.6)
138
+ railties (~> 3.2.0)
139
+ sass (>= 3.1.10)
140
+ tilt (~> 1.3)
141
+ seedbank (0.2.1)
142
+ simplecov (0.7.1)
143
+ multi_json (~> 1.0)
144
+ simplecov-html (~> 0.7.1)
145
+ simplecov-html (0.7.1)
146
+ slop (3.4.5)
147
+ sprockets (2.2.2)
148
+ hike (~> 1.2)
149
+ multi_json (~> 1.0)
150
+ rack (~> 1.0)
151
+ tilt (~> 1.1, != 1.3.0)
152
+ sqlite3 (1.3.7)
153
+ therubyracer (0.11.4)
154
+ libv8 (~> 3.11.8.12)
155
+ ref
156
+ thor (0.18.1)
157
+ tilt (1.4.1)
158
+ treetop (1.4.12)
159
+ polyglot
160
+ polyglot (>= 0.3.1)
161
+ tzinfo (0.3.37)
162
+
163
+ PLATFORMS
164
+ ruby
165
+
166
+ DEPENDENCIES
167
+ comfypress!
168
+ coveralls
169
+ libv8
170
+ mysql
171
+ mysql2 (~> 0.3.11)
172
+ pry
173
+ seedbank
174
+ sqlite3
175
+ therubyracer (~> 0.11.4)
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Nayeem Syed, Omega Interactive Ltd
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.md ADDED
@@ -0,0 +1,79 @@
1
+ # ComfyPress (Rails 3 CMS Engine)
2
+ [![Gem Version](https://badge.fury.io/rb/comfypress.png)](http://rubygems.org/gems/comfypress) [![Build Status](https://travis-ci.org/omegainteractive/comfypress.png?branch=master)](https://travis-ci.org/omegainteractive/comfypress) [![Dependency Status](https://gemnasium.com/omegainteractive/comfypress.png)](https://gemnasium.com/omegainteractive/comfypress) [![Code Climate](https://codeclimate.com/github/omegainteractive/comfypress.png)](https://codeclimate.com/github/omegainteractive/comfypress) [![Coverage Status](https://coveralls.io/repos/omegainteractive/comfypress/badge.png?branch=master)](https://coveralls.io/r/omegainteractive/comfypress)
3
+
4
+ ComfyPress is a powerful CMS Engine for your Rails 3 applications.
5
+
6
+ Features
7
+ --------
8
+ * Simple integration with Rails 3 apps. Supports Rails 3.1, 3.2 running Ruby 1.9.2, 1.9.3 or 2.0.0
9
+ * Build your application in Rails, not in CMS
10
+ * Powerful page templating capability using [Tags](https://github.com/omegainteractive/comfypress/wiki/Tags)
11
+ * [Multiple Sites](https://github.com/omegainteractive/comfypress/wiki/Sites) from a single installation
12
+ * Multilingual
13
+ * [Fixtures](https://github.com/omegainteractive/comfypress/wiki/Working-with-CMS-fixtures) for initial content population
14
+ * [Revision History](https://github.com/omegainteractive/comfypress/wiki/Revisions)
15
+ * [Great extendable admin interface](https://github.com/omegainteractive/comfypress/wiki/Reusing-sofa%27s-admin-area) built with [Bootstrap](http://twitter.github.com/bootstrap/), [CodeMirror](http://codemirror.net/) and [WYSIHTML5](http://xing.github.com/wysihtml5/)
16
+
17
+ Installation for Rails 4
18
+ ------------------------
19
+ For Rails 4 apps feel free to use [2.0.0.beta1](https://github.com/omegainteractive/comfypress/tree/2.0) release.
20
+
21
+ gem 'comfypress', '~2.0.0.beta1'
22
+
23
+ Installation
24
+ ------------
25
+ Add gem definition to your Gemfile:
26
+
27
+ gem 'comfypress'
28
+
29
+ Then from the Rails project's root run:
30
+
31
+ bundle install
32
+ rails generate comfy:cms
33
+ rake db:migrate
34
+
35
+ Now take a look inside your `config/routes.rb` file. You'll see where routes attach for the admin area and content serving. Make sure that content serving route appears as a very last item.
36
+
37
+ ```ruby
38
+ ComfyPress::Routing.admin :path => '/cms-admin'
39
+ ComfyPress::Routing.content :path => '/', :sitemap => false
40
+ ```
41
+
42
+ When upgrading from the older version please take a look at [Upgrading ComfyPress](https://github.com/omegainteractive/comfypress/wiki/Upgrading-ComfyPress)
43
+
44
+ Quick Start Guide
45
+ -----------------
46
+ After finishing installation you should be able to navigate to http://yoursite/cms-admin
47
+
48
+ Default username and password is 'username' and 'password'. You probably want to change it right away. Admin credentials (among other things) can be found and changed in the cms initializer: [/config/initializers/comfypress.rb](https://github.com/omegainteractive/comfypress/blob/master/config/initializers/comfypress.rb)
49
+
50
+ Before creating pages and populating them with content we need to create a Site. Site defines a hostname, content path and it's language.
51
+
52
+ After creating a Site, you need to make a Layout. Layout is the template of your pages; it defines some reusable content (like header and footer, for example) and places where the content goes. A very simple layout can look like this:
53
+
54
+ ```html
55
+ <html>
56
+ <body>
57
+ <h1>{{ cms:page:header:string }}</h1>
58
+ {{ cms:page:content:text }}
59
+ </body>
60
+ </html>
61
+ ```
62
+
63
+ Once you have a layout, you may start creating pages and populating content. It's that easy.
64
+
65
+ For more information please [see Wiki pages](https://github.com/omegainteractive/comfypress/wiki).
66
+
67
+ ![Sofa's Page Edit View](https://github.com/omegainteractive/comfypress/raw/master/doc/preview.png)
68
+
69
+ Help and Contact
70
+ ----------------
71
+
72
+ GoogleGroups: http://groups.google.com/group/comfypress
73
+ Twitter: [@nayeems](http://twitter.com/#!/nayeems)
74
+
75
+ ---
76
+
77
+ ComfyPress is released under the [MIT license](https://github.com/omegainteractive/comfypress/raw/master/LICENSE)
78
+
79
+ Copyright 2013 Nayeem Syed, [Omega Interactive Ltd](http://www.omegainteractive.co.uk)
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require File.expand_path('../config/application', __FILE__)
2
+ require 'rubygems'
3
+ require 'rake'
4
+
5
+ ComfyPress::Application.load_tasks
@@ -0,0 +1 @@
1
+ // Overwrite this file in your application /app/assets/javascripts/comfypress/admin/application.js
@@ -0,0 +1,175 @@
1
+ #= require jquery
2
+ #= require jquery_ujs
3
+ #= require jquery-ui
4
+ #= require comfypress/lib/bootstrap
5
+ #= require comfypress/lib/codemirror
6
+ #= require comfypress/lib/wysihtml5
7
+ #= require comfypress/lib/bootstrap-wysihtml5
8
+ #= require comfypress/lib/bootstrap-datetimepicker
9
+
10
+ $ ->
11
+ CMS.init()
12
+
13
+ window.CMS =
14
+ current_path: window.location.pathname
15
+ code_mirror_instances: []
16
+
17
+ init: ->
18
+ CMS.slugify()
19
+ CMS.wysiwyg()
20
+ CMS.codemirror()
21
+ CMS.sortable_list()
22
+ CMS.timepicker()
23
+ CMS.page_blocks()
24
+ CMS.mirrors()
25
+ CMS.page_update_preview()
26
+ CMS.page_update_publish()
27
+ CMS.categories()
28
+ CMS.uploader()
29
+ CMS.showable_radio_buttons()
30
+ CMS.hideable_radio_buttons()
31
+ CMS.init_showable_hideable_dependencies()
32
+
33
+ window.CMS.slugify = ->
34
+ slugify = (str) ->
35
+ str = str.replace(/^\s+|\s+$/g, '')
36
+ from = "ÀÁÄÂÃÈÉËÊÌÍÏÎÒÓÖÔÕÙÚÜÛàáäâãèéëêìíïîòóöôõùúüûÑñÇç"
37
+ to = "aaaaaeeeeiiiiooooouuuuaaaaaeeeeiiiiooooouuuunncc"
38
+ for i in [0..from.length - 1]
39
+ str = str.replace(new RegExp(from[i], "g"), to[i])
40
+ chars_to_replace_with_delimiter = new RegExp('[·/,:;_]', 'g')
41
+ str = str.replace(chars_to_replace_with_delimiter, '-')
42
+ chars_to_remove = new RegExp('[^a-zA-Z0-9 -]', 'g')
43
+ str = str.replace(chars_to_remove, '').replace(/\s+/g, '-').toLowerCase()
44
+
45
+ $('input[data-slugify=true]').bind 'keyup.cms', ->
46
+ $('input[data-slug=true]').val(slugify($(this).val()))
47
+
48
+
49
+ window.CMS.wysiwyg = ->
50
+ $('textarea[data-rich-text]').each (i, element) ->
51
+ $(element).wysihtml5
52
+ html: true
53
+ color: false
54
+ stylesheets: []
55
+
56
+
57
+ window.CMS.codemirror = ->
58
+ $('textarea[data-cm-mode]').each (i, element) ->
59
+ cm = CodeMirror.fromTextArea element,
60
+ mode: $(element).data('cm-mode')
61
+ lineWrapping: true
62
+ autoCloseTags: true
63
+ lineNumbers: true
64
+ CMS.code_mirror_instances.push(cm)
65
+
66
+ $('a[data-toggle="tab"]').on 'shown', ->
67
+ for cm in CMS.code_mirror_instances
68
+ cm.refresh()
69
+
70
+ window.CMS.sortable_list = ->
71
+ $('.sortable').sortable
72
+ handle: 'div.dragger'
73
+ axis: 'y'
74
+ update: ->
75
+ $.post("#{CMS.current_path}/reorder", "_method=put&#{$(this).sortable('serialize')}")
76
+
77
+
78
+ window.CMS.timepicker = ->
79
+ $('input[type=text][data-datetime]').datetimepicker
80
+ format: 'yyyy-mm-dd hh:ii'
81
+ minView: 'day'
82
+ autoclose: true
83
+ $('input[type=text][data-date]').datetimepicker
84
+ format: 'yyyy-mm-dd'
85
+ minView: 'minute'
86
+ autoclose: true
87
+
88
+
89
+ window.CMS.page_blocks = ->
90
+ $('select#page_layout_id').bind 'change.cms', ->
91
+ $.ajax
92
+ url: $(this).data('url'),
93
+ data:
94
+ layout_id: $(this).val()
95
+ complete: ->
96
+ CMS.wysiwyg()
97
+ CMS.timepicker()
98
+
99
+
100
+ window.CMS.mirrors = ->
101
+ $('#mirrors select').change ->
102
+ window.location = $(this).val()
103
+
104
+
105
+ window.CMS.page_update_preview = ->
106
+ $('input[name=commit]').click ->
107
+ $(this).parents('form').attr('target', '')
108
+ $('input[name=preview]').click ->
109
+ $(this).parents('form').attr('target', '_blank')
110
+
111
+
112
+ window.CMS.page_update_publish = ->
113
+ widget = $('#form-save')
114
+ $('input', widget).prop('checked', $('input#page_is_published').is(':checked'))
115
+ $('button', widget).html($('input[name=commit]').val())
116
+
117
+ $('input', widget).click ->
118
+ $('input#page_is_published').prop('checked', $(this).is(':checked'))
119
+ $('input#page_is_published').click ->
120
+ $('input', widget).prop('checked', $(this).is(':checked'))
121
+ $('button', widget).click ->
122
+ $('input[name=commit]').click()
123
+
124
+
125
+ window.CMS.categories = ->
126
+ $('a', '.categories-widget .action-links').click (event) ->
127
+ event.preventDefault()
128
+ $('.categories.read', '.categories-widget').toggle()
129
+ $('.categories.editable', '.categories-widget').toggle()
130
+ $('.edit', '.categories-widget').toggle()
131
+ $('.done', '.categories-widget').toggle()
132
+
133
+
134
+ window.CMS.uploader = ->
135
+ form = $('.file-uploader form')
136
+ iframe = $('iframe#file-upload-frame')
137
+
138
+ $('input[type=file]', form).change -> form.submit()
139
+
140
+ iframe.load -> upload_loaded()
141
+
142
+ upload_loaded = ->
143
+ i = iframe[0]
144
+ d = if i.contentDocument
145
+ i.contentDocument
146
+ else if i.contentWindow
147
+ i.contentWindow.document
148
+ else
149
+ i.document
150
+
151
+ if d.body.innerHTML
152
+ raw_string = d.body.innerHTML
153
+ json_string = raw_string.match(/\{(.|\n)*\}/)[0]
154
+ json = $.parseJSON(json_string)
155
+ files = $($('<div/>').html(json.view).text()).hide()
156
+ $('.uploaded-files').prepend(files)
157
+ files.map ->
158
+ $(this).fadeIn()
159
+
160
+ window.CMS.showable_radio_buttons = ->
161
+ $('[data-show]').on 'click change', ->
162
+ $active_field = $(@)
163
+ if $active_field.is(':checked')
164
+ $show = $ $active_field.data('show')
165
+ $show.removeClass 'hidden'
166
+
167
+ window.CMS.hideable_radio_buttons = ->
168
+ $('[data-hide]').on 'click change', ->
169
+ $active_field = $(@)
170
+ if $active_field.is(':checked')
171
+ $hide = $ $active_field.data('hide')
172
+ $hide.addClass 'hidden'
173
+
174
+ CMS.init_showable_hideable_dependencies = ->
175
+ $('[data-show], [data-hide]').trigger('change')
@@ -0,0 +1,21 @@
1
+ /* =========================================================
2
+ * bootstrap-datetimepicker.js
3
+ * =========================================================
4
+ * Copyright 2012 Stefan Petre
5
+ * Improvements by Andrew Rowls
6
+ * Improvements by Sébastien Malot
7
+ * Project URL : http://www.malot.fr/bootstrap-datetimepicker
8
+ *
9
+ * Licensed under the Apache License, Version 2.0 (the "License");
10
+ * you may not use this file except in compliance with the License.
11
+ * You may obtain a copy of the License at
12
+ *
13
+ * http://www.apache.org/licenses/LICENSE-2.0
14
+ *
15
+ * Unless required by applicable law or agreed to in writing, software
16
+ * distributed under the License is distributed on an "AS IS" BASIS,
17
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ * See the License for the specific language governing permissions and
19
+ * limitations under the License.
20
+ * ========================================================= */
21
+ !function(e){function t(){return new Date(Date.UTC.apply(Date,arguments))}function n(){var e=new Date;return t(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds())}var r=function(t,n){var r=this;this.element=e(t);this.language=n.language||this.element.data("date-language")||"en";this.language=this.language in i?this.language:"en";this.isRTL=i[this.language].rtl||false;this.formatType=n.formatType||this.element.data("format-type")||"standard";this.format=s.parseFormat(n.format||this.element.data("date-format")||s.getDefaultFormat(this.formatType,"input"),this.formatType);this.isInline=false;this.isInput=this.element.is("input");this.component=this.element.is(".date")?this.element.find(".add-on .icon-th, .add-on .icon-time, .add-on .icon-calendar").parent():false;this.componentReset=this.element.is(".date")?this.element.find(".add-on .icon-remove").parent():false;this.hasInput=this.component&&this.element.find("input").length;if(this.component&&this.component.length===0){this.component=false}this.linkField=n.linkField||this.element.data("link-field")||false;this.linkFormat=s.parseFormat(n.linkFormat||this.element.data("link-format")||s.getDefaultFormat(this.formatType,"link"),this.formatType);this.minuteStep=n.minuteStep||this.element.data("minute-step")||5;this.pickerPosition=n.pickerPosition||this.element.data("picker-position")||"bottom-right";this._attachEvents();this.minView=0;if("minView"in n){this.minView=n.minView}else if("minView"in this.element.data()){this.minView=this.element.data("min-view")}this.minView=s.convertViewMode(this.minView);this.maxView=s.modes.length-1;if("maxView"in n){this.maxView=n.maxView}else if("maxView"in this.element.data()){this.maxView=this.element.data("max-view")}this.maxView=s.convertViewMode(this.maxView);this.startViewMode=2;if("startView"in n){this.startViewMode=n.startView}else if("startView"in this.element.data()){this.startViewMode=this.element.data("start-view")}this.startViewMode=s.convertViewMode(this.startViewMode);this.viewMode=this.startViewMode;this.forceParse=true;if("forceParse"in n){this.forceParse=n.forceParse}else if("dateForceParse"in this.element.data()){this.forceParse=this.element.data("date-force-parse")}this.picker=e(s.template).appendTo(this.isInline?this.element:"body").on({click:e.proxy(this.click,this),mousedown:e.proxy(this.mousedown,this)});if(this.isInline){this.picker.addClass("datetimepicker-inline")}else{if(this.component&&this.pickerPosition=="bottom-left"){this.picker.addClass("datetimepicker-dropdown-left dropdown-menu")}else{this.picker.addClass("datetimepicker-dropdown dropdown-menu")}}if(this.isRTL){this.picker.addClass("datetimepicker-rtl");this.picker.find(".prev i, .next i").toggleClass("icon-arrow-left icon-arrow-right")}e(document).on("mousedown",function(t){if(e(t.target).closest(".datetimepicker").length===0){r.hide()}});this.autoclose=false;if("autoclose"in n){this.autoclose=n.autoclose}else if("dateAutoclose"in this.element.data()){this.autoclose=this.element.data("date-autoclose")}this.keyboardNavigation=true;if("keyboardNavigation"in n){this.keyboardNavigation=n.keyboardNavigation}else if("dateKeyboardNavigation"in this.element.data()){this.keyboardNavigation=this.element.data("date-keyboard-navigation")}this.todayBtn=n.todayBtn||this.element.data("date-today-btn")||false;this.todayHighlight=n.todayHighlight||this.element.data("date-today-highlight")||false;this.weekStart=(n.weekStart||this.element.data("date-weekstart")||i[this.language].weekStart||0)%7;this.weekEnd=(this.weekStart+6)%7;this.startDate=-Infinity;this.endDate=Infinity;this.daysOfWeekDisabled=[];this.setStartDate(n.startDate||this.element.data("date-startdate"));this.setEndDate(n.endDate||this.element.data("date-enddate"));this.setDaysOfWeekDisabled(n.daysOfWeekDisabled||this.element.data("date-days-of-week-disabled"));this.fillDow();this.fillMonths();this.update();this.showMode();if(this.isInline){this.show()}};r.prototype={constructor:r,_events:[],_attachEvents:function(){this._detachEvents();if(this.isInput){this._events=[[this.element,{focus:e.proxy(this.show,this),keyup:e.proxy(this.update,this),keydown:e.proxy(this.keydown,this)}]]}else if(this.component&&this.hasInput){this._events=[[this.element.find("input"),{focus:e.proxy(this.show,this),keyup:e.proxy(this.update,this),keydown:e.proxy(this.keydown,this)}],[this.component,{click:e.proxy(this.show,this)}]];if(this.componentReset){this._events.push([this.componentReset,{click:e.proxy(this.reset,this)}])}}else if(this.element.is("div")){this.isInline=true}else{this._events=[[this.element,{click:e.proxy(this.show,this)}]]}for(var t=0,n,r;t<this._events.length;t++){n=this._events[t][0];r=this._events[t][1];n.on(r)}},_detachEvents:function(){for(var e=0,t,n;e<this._events.length;e++){t=this._events[e][0];n=this._events[e][1];t.off(n)}this._events=[]},show:function(t){this.picker.show();this.height=this.component?this.component.outerHeight():this.element.outerHeight();if(this.forceParse){this.update()}this.place();e(window).on("resize",e.proxy(this.place,this));if(t){t.stopPropagation();t.preventDefault()}this.element.trigger({type:"show",date:this.date})},hide:function(t){if(this.isInline)return;this.picker.hide();e(window).off("resize",this.place);this.viewMode=this.startViewMode;this.showMode();if(!this.isInput){e(document).off("mousedown",this.hide)}if(this.forceParse&&(this.isInput&&this.element.val()||this.hasInput&&this.element.find("input").val()))this.setValue();this.element.trigger({type:"hide",date:this.date})},remove:function(){this._detachEvents();this.picker.remove();delete this.element.data().datetimepicker},getDate:function(){var e=this.getUTCDate();return new Date(e.getTime()+e.getTimezoneOffset()*6e4)},getUTCDate:function(){return this.date},setDate:function(e){this.setUTCDate(new Date(e.getTime()-e.getTimezoneOffset()*6e4))},setUTCDate:function(e){if(e>=this.startDate&&e<=this.endDate){this.date=e;this.setValue();this.viewDate=this.date;this.fill()}else{this.element.trigger({type:"outOfRange",date:e,startDate:this.startDate,endDate:this.endDate})}},setValue:function(){var t=this.getFormattedDate();if(!this.isInput){if(this.component){this.element.find("input").prop("value",t)}this.element.data("date",t)}else{this.element.prop("value",t)}if(this.linkField){e("#"+this.linkField).val(this.getFormattedDate(this.linkFormat))}},getFormattedDate:function(e){if(e==undefined)e=this.format;return s.formatDate(this.date,e,this.language,this.formatType)},setStartDate:function(e){this.startDate=e||-Infinity;if(this.startDate!==-Infinity){this.startDate=s.parseDate(this.startDate,this.format,this.language,this.formatType)}this.update();this.updateNavArrows()},setEndDate:function(e){this.endDate=e||Infinity;if(this.endDate!==Infinity){this.endDate=s.parseDate(this.endDate,this.format,this.language,this.formatType)}this.update();this.updateNavArrows()},setDaysOfWeekDisabled:function(t){this.daysOfWeekDisabled=t||[];if(!e.isArray(this.daysOfWeekDisabled)){this.daysOfWeekDisabled=this.daysOfWeekDisabled.split(/,\s*/)}this.daysOfWeekDisabled=e.map(this.daysOfWeekDisabled,function(e){return parseInt(e,10)});this.update();this.updateNavArrows()},place:function(){if(this.isInline)return;var t=parseInt(this.element.parents().filter(function(){return e(this).css("z-index")!="auto"}).first().css("z-index"))+10;var n,r;if(this.component){n=this.component.offset();r=n.left;if(this.pickerPosition=="bottom-left"){r+=this.component.outerWidth()-this.picker.outerWidth()}}else{n=this.element.offset();r=n.left}this.picker.css({top:n.top+this.height,left:r,zIndex:t})},update:function(){var e,t=false;if(arguments&&arguments.length&&(typeof arguments[0]==="string"||arguments[0]instanceof Date)){e=arguments[0];t=true}else{e=this.isInput?this.element.prop("value"):this.element.data("date")||this.element.find("input").prop("value")||new Date}if(!e){e=new Date;t=false}this.date=s.parseDate(e,this.format,this.language,this.formatType);if(t)this.setValue();if(this.date<this.startDate){this.viewDate=new Date(this.startDate)}else if(this.date>this.endDate){this.viewDate=new Date(this.endDate)}else{this.viewDate=new Date(this.date)}this.fill()},fillDow:function(){var e=this.weekStart,t="<tr>";while(e<this.weekStart+7){t+='<th class="dow">'+i[this.language].daysMin[e++%7]+"</th>"}t+="</tr>";this.picker.find(".datetimepicker-days thead").append(t)},fillMonths:function(){var e="",t=0;while(t<12){e+='<span class="month">'+i[this.language].monthsShort[t++]+"</span>"}this.picker.find(".datetimepicker-months td").html(e)},fill:function(){if(this.date==null||this.viewDate==null){return}var n=new Date(this.viewDate),r=n.getUTCFullYear(),o=n.getUTCMonth(),u=n.getUTCDate(),a=n.getUTCHours(),f=n.getUTCMinutes(),l=this.startDate!==-Infinity?this.startDate.getUTCFullYear():-Infinity,c=this.startDate!==-Infinity?this.startDate.getUTCMonth():-Infinity,h=this.endDate!==Infinity?this.endDate.getUTCFullYear():Infinity,p=this.endDate!==Infinity?this.endDate.getUTCMonth():Infinity,d=(new t(this.date.getUTCFullYear(),this.date.getUTCMonth(),this.date.getUTCDate())).valueOf(),v=new Date;this.picker.find(".datetimepicker-days thead th:eq(1)").text(i[this.language].months[o]+" "+r);this.picker.find(".datetimepicker-hours thead th:eq(1)").text(u+" "+i[this.language].months[o]+" "+r);this.picker.find(".datetimepicker-minutes thead th:eq(1)").text(u+" "+i[this.language].months[o]+" "+r);this.picker.find("tfoot th.today").text(i[this.language].today).toggle(this.todayBtn!==false);this.updateNavArrows();this.fillMonths();var m=t(r,o-1,28,0,0,0,0),g=s.getDaysInMonth(m.getUTCFullYear(),m.getUTCMonth());m.setUTCDate(g);m.setUTCDate(g-(m.getUTCDay()-this.weekStart+7)%7);var y=new Date(m);y.setUTCDate(y.getUTCDate()+42);y=y.valueOf();var b=[];var w;while(m.valueOf()<y){if(m.getUTCDay()==this.weekStart){b.push("<tr>")}w="";if(m.getUTCFullYear()<r||m.getUTCFullYear()==r&&m.getUTCMonth()<o){w+=" old"}else if(m.getUTCFullYear()>r||m.getUTCFullYear()==r&&m.getUTCMonth()>o){w+=" new"}if(this.todayHighlight&&m.getUTCFullYear()==v.getFullYear()&&m.getUTCMonth()==v.getMonth()&&m.getUTCDate()==v.getDate()){w+=" today"}if(m.valueOf()==d){w+=" active"}if(m.valueOf()+864e5<this.startDate||m.valueOf()>this.endDate||e.inArray(m.getUTCDay(),this.daysOfWeekDisabled)!==-1){w+=" disabled"}b.push('<td class="day'+w+'">'+m.getUTCDate()+"</td>");if(m.getUTCDay()==this.weekEnd){b.push("</tr>")}m.setUTCDate(m.getUTCDate()+1)}this.picker.find(".datetimepicker-days tbody").empty().append(b.join(""));b=[];for(var E=0;E<24;E++){var S=t(r,o,u,E);w="";if(S.valueOf()+36e5<this.startDate||S.valueOf()>this.endDate){w+=" disabled"}else if(a==E){w+=" active"}b.push('<span class="hour'+w+'">'+E+":00</span>")}this.picker.find(".datetimepicker-hours td").html(b.join(""));b=[];for(var E=0;E<60;E+=this.minuteStep){var S=t(r,o,u,a,E);w="";if(S.valueOf()<this.startDate||S.valueOf()>this.endDate){w+=" disabled"}else if(Math.floor(f/this.minuteStep)==Math.floor(E/this.minuteStep)){w+=" active"}b.push('<span class="minute'+w+'">'+a+":"+(E<10?"0"+E:E)+"</span>")}this.picker.find(".datetimepicker-minutes td").html(b.join(""));var x=this.date.getUTCFullYear();var T=this.picker.find(".datetimepicker-months").find("th:eq(1)").text(r).end().find("span").removeClass("active");if(x==r){T.eq(this.date.getUTCMonth()).addClass("active")}if(r<l||r>h){T.addClass("disabled")}if(r==l){T.slice(0,c).addClass("disabled")}if(r==h){T.slice(p+1).addClass("disabled")}b="";r=parseInt(r/10,10)*10;var N=this.picker.find(".datetimepicker-years").find("th:eq(1)").text(r+"-"+(r+9)).end().find("td");r-=1;for(var E=-1;E<11;E++){b+='<span class="year'+(E==-1||E==10?" old":"")+(x==r?" active":"")+(r<l||r>h?" disabled":"")+'">'+r+"</span>";r+=1}N.html(b)},updateNavArrows:function(){var e=new Date(this.viewDate),t=e.getUTCFullYear(),n=e.getUTCMonth(),r=e.getUTCDate(),i=e.getUTCHours();switch(this.viewMode){case 0:if(this.startDate!==-Infinity&&t<=this.startDate.getUTCFullYear()&&n<=this.startDate.getUTCMonth()&&r<=this.startDate.getUTCDate()&&i<=this.startDate.getUTCHours()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(this.endDate!==Infinity&&t>=this.endDate.getUTCFullYear()&&n>=this.endDate.getUTCMonth()&&r>=this.endDate.getUTCDate()&&i>=this.endDate.getUTCHours()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 1:if(this.startDate!==-Infinity&&t<=this.startDate.getUTCFullYear()&&n<=this.startDate.getUTCMonth()&&r<=this.startDate.getUTCDate()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(this.endDate!==Infinity&&t>=this.endDate.getUTCFullYear()&&n>=this.endDate.getUTCMonth()&&r>=this.endDate.getUTCDate()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 2:if(this.startDate!==-Infinity&&t<=this.startDate.getUTCFullYear()&&n<=this.startDate.getUTCMonth()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(this.endDate!==Infinity&&t>=this.endDate.getUTCFullYear()&&n>=this.endDate.getUTCMonth()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 3:case 4:if(this.startDate!==-Infinity&&t<=this.startDate.getUTCFullYear()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(this.endDate!==Infinity&&t>=this.endDate.getUTCFullYear()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break}},click:function(n){n.stopPropagation();n.preventDefault();var r=e(n.target).closest("span, td, th");if(r.length==1){if(r.is(".disabled")){this.element.trigger({type:"outOfRange",date:this.viewDate,startDate:this.startDate,endDate:this.endDate});return}switch(r[0].nodeName.toLowerCase()){case"th":switch(r[0].className){case"switch":this.showMode(1);break;case"prev":case"next":var i=s.modes[this.viewMode].navStep*(r[0].className=="prev"?-1:1);switch(this.viewMode){case 0:this.viewDate=this.moveHour(this.viewDate,i);break;case 1:this.viewDate=this.moveDate(this.viewDate,i);break;case 2:this.viewDate=this.moveMonth(this.viewDate,i);break;case 3:case 4:this.viewDate=this.moveYear(this.viewDate,i);break}this.fill();break;case"today":var o=new Date;o=t(o.getFullYear(),o.getMonth(),o.getDate(),o.getHours(),o.getMinutes(),o.getSeconds());this.viewMode=this.startViewMode;this.showMode(0);this._setDate(o);break}break;case"span":if(!r.is(".disabled")){if(r.is(".month")){this.viewDate.setUTCDate(1);var u=r.parent().find("span").index(r);this.viewDate.setUTCMonth(u);this.element.trigger({type:"changeMonth",date:this.viewDate})}else if(r.is(".year")){this.viewDate.setUTCDate(1);var a=parseInt(r.text(),10)||0;this.viewDate.setUTCFullYear(a);this.element.trigger({type:"changeYear",date:this.viewDate})}else if(r.is(".hour")){var f=parseInt(r.text(),10)||0;var a=this.viewDate.getUTCFullYear(),u=this.viewDate.getUTCMonth(),l=this.viewDate.getUTCDate(),c=this.viewDate.getUTCMinutes(),h=this.viewDate.getUTCSeconds();this._setDate(t(a,u,l,f,c,h,0))}else if(r.is(".minute")){var c=parseInt(r.text().substr(r.text().indexOf(":")+1),10)||0;var a=this.viewDate.getUTCFullYear(),u=this.viewDate.getUTCMonth(),l=this.viewDate.getUTCDate(),f=this.viewDate.getUTCHours(),h=this.viewDate.getUTCSeconds();this._setDate(t(a,u,l,f,c,h,0))}if(this.viewMode!=0){var p=this.viewMode;this.showMode(-1);this.fill();if(p==this.viewMode&&this.autoclose){this.hide()}}else{this.fill();if(this.autoclose){this.hide()}}}break;case"td":if(r.is(".day")&&!r.is(".disabled")){var l=parseInt(r.text(),10)||1;var a=this.viewDate.getUTCFullYear(),u=this.viewDate.getUTCMonth(),f=this.viewDate.getUTCHours(),c=this.viewDate.getUTCMinutes(),h=this.viewDate.getUTCSeconds();if(r.is(".old")){if(u===0){u=11;a-=1}else{u-=1}}else if(r.is(".new")){if(u==11){u=0;a+=1}else{u+=1}}this._setDate(t(a,u,l,f,c,h,0))}var p=this.viewMode;this.showMode(-1);this.fill();if(p==this.viewMode&&this.autoclose){this.hide()}break}}},_setDate:function(e,t){if(!t||t=="date")this.date=e;if(!t||t=="view")this.viewDate=e;this.fill();this.element.trigger({type:"changeDate",date:this.date});this.setValue();var n;if(this.isInput){n=this.element}else if(this.component){n=this.element.find("input")}if(n){n.change();if(this.autoclose&&(!t||t=="date")){}}},moveHour:function(e,t){if(!t)return e;var n=new Date(e.valueOf());t=t>0?1:-1;n.setUTCHours(n.getUTCHours()+t);return n},moveDate:function(e,t){if(!t)return e;var n=new Date(e.valueOf());t=t>0?1:-1;n.setUTCDate(n.getUTCDate()+t);return n},moveMonth:function(e,t){if(!t)return e;var n=new Date(e.valueOf()),r=n.getUTCDate(),i=n.getUTCMonth(),s=Math.abs(t),o,u;t=t>0?1:-1;if(s==1){u=t==-1?function(){return n.getUTCMonth()==i}:function(){return n.getUTCMonth()!=o};o=i+t;n.setUTCMonth(o);if(o<0||o>11)o=(o+12)%12}else{for(var a=0;a<s;a++)n=this.moveMonth(n,t);o=n.getUTCMonth();n.setUTCDate(r);u=function(){return o!=n.getUTCMonth()}}while(u()){n.setUTCDate(--r);n.setUTCMonth(o)}return n},moveYear:function(e,t){return this.moveMonth(e,t*12)},dateWithinRange:function(e){return e>=this.startDate&&e<=this.endDate},keydown:function(e){if(this.picker.is(":not(:visible)")){if(e.keyCode==27)this.show();return}var t=false,n,r,i,s,o;switch(e.keyCode){case 27:this.hide();e.preventDefault();break;case 37:case 39:if(!this.keyboardNavigation)break;n=e.keyCode==37?-1:1;if(e.ctrlKey){s=this.moveYear(this.date,n);o=this.moveYear(this.viewDate,n)}else if(e.shiftKey){s=this.moveMonth(this.date,n);o=this.moveMonth(this.viewDate,n)}else{s=new Date(this.date);s.setUTCDate(this.date.getUTCDate()+n);o=new Date(this.viewDate);o.setUTCDate(this.viewDate.getUTCDate()+n)}if(this.dateWithinRange(s)){this.date=s;this.viewDate=o;this.setValue();this.update();e.preventDefault();t=true}break;case 38:case 40:if(!this.keyboardNavigation)break;n=e.keyCode==38?-1:1;if(e.ctrlKey){s=this.moveYear(this.date,n);o=this.moveYear(this.viewDate,n)}else if(e.shiftKey){s=this.moveMonth(this.date,n);o=this.moveMonth(this.viewDate,n)}else{s=new Date(this.date);s.setUTCDate(this.date.getUTCDate()+n*7);o=new Date(this.viewDate);o.setUTCDate(this.viewDate.getUTCDate()+n*7)}if(this.dateWithinRange(s)){this.date=s;this.viewDate=o;this.setValue();this.update();e.preventDefault();t=true}break;case 13:this.hide();e.preventDefault();break;case 9:this.hide();break}if(t){this.element.trigger({type:"changeDate",date:this.date});var u;if(this.isInput){u=this.element}else if(this.component){u=this.element.find("input")}if(u){u.change()}}},showMode:function(e){if(e){var t=Math.max(0,Math.min(s.modes.length-1,this.viewMode+e));if(t>=this.minView&&t<=this.maxView){this.viewMode=t}}this.picker.find(">div").hide().filter(".datetimepicker-"+s.modes[this.viewMode].clsName).css("display","block");this.updateNavArrows()},reset:function(e){this._setDate(null,"date")}};e.fn.datetimepicker=function(t){var n=Array.apply(null,arguments);n.shift();return this.each(function(){var i=e(this),s=i.data("datetimepicker"),o=typeof t=="object"&&t;if(!s){i.data("datetimepicker",s=new r(this,e.extend({},e.fn.datetimepicker.defaults,o)))}if(typeof t=="string"&&typeof s[t]=="function"){s[t].apply(s,n)}})};e.fn.datetimepicker.defaults={};e.fn.datetimepicker.Constructor=r;var i=e.fn.datetimepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],meridiem:["am","pm"],suffix:["st","nd","rd","th"],today:"Today"}};var s={modes:[{clsName:"minutes",navFnc:"Hours",navStep:1},{clsName:"hours",navFnc:"Date",navStep:1},{clsName:"days",navFnc:"Month",navStep:1},{clsName:"months",navFnc:"FullYear",navStep:1},{clsName:"years",navFnc:"FullYear",navStep:10}],isLeapYear:function(e){return e%4===0&&e%100!==0||e%400===0},getDaysInMonth:function(e,t){return[31,s.isLeapYear(e)?29:28,31,30,31,30,31,31,30,31,30,31][t]},getDefaultFormat:function(e,t){if(e=="standard"){if(t=="input")return"yyyy-mm-dd hh:ii";else return"yyyy-mm-dd hh:ii:ss"}else if(e=="php"){if(t=="input")return"Y-m-d H:i";else return"Y-m-d H:i:s"}else{throw new Error("Invalid format type.")}},validParts:function(e){if(e=="standard"){return/hh?|ii?|ss?|dd?|mm?|MM?|yy(?:yy)?/g}else if(e=="php"){return/[dDjlNwzFmMnStyYaABgGhHis]/g}else{throw new Error("Invalid format type.")}},nonpunctuation:/[^ -\/:-@\[-`{-~\t\n\rTZ]+/g,parseFormat:function(e,t){var n=e.replace(this.validParts(t),"\0").split("\0"),r=e.match(this.validParts(t));if(!n||!n.length||!r||r.length==0){throw new Error("Invalid date format.")}return{separators:n,parts:r}},parseDate:function(n,s,o,u){if(n instanceof Date){var a=new Date(n.valueOf()-n.getTimezoneOffset()*6e4);return a}if(/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(n)){s=this.parseFormat("yyyy-mm-dd",u)}if(/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(n)){s=this.parseFormat("yyyy-mm-dd hh:ii",u)}if(/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(n)){s=this.parseFormat("yyyy-mm-dd hh:ii:ss",u)}if(/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(n)){var f=/([-+]\d+)([dmwy])/,l=n.match(/([-+]\d+)([dmwy])/g),c,h;n=new Date;for(var p=0;p<l.length;p++){c=f.exec(l[p]);h=parseInt(c[1]);switch(c[2]){case"d":n.setUTCDate(n.getUTCDate()+h);break;case"m":n=r.prototype.moveMonth.call(r.prototype,n,h);break;case"w":n.setUTCDate(n.getUTCDate()+h*7);break;case"y":n=r.prototype.moveYear.call(r.prototype,n,h);break}}return t(n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate(),n.getUTCHours(),n.getUTCMinutes(),n.getUTCSeconds())}var l=n&&n.match(this.nonpunctuation)||[],n=new Date(0,0,0,0,0,0),d={},v=["hh","h","ii","i","ss","s","yyyy","yy","M","MM","m","mm","d","dd"],m={hh:function(e,t){return e.setUTCHours(t)},h:function(e,t){return e.setUTCHours(t)},ii:function(e,t){return e.setUTCMinutes(t)},i:function(e,t){return e.setUTCMinutes(t)},ss:function(e,t){return e.setUTCSeconds(t)},s:function(e,t){return e.setUTCSeconds(t)},yyyy:function(e,t){return e.setUTCFullYear(t)},yy:function(e,t){return e.setUTCFullYear(2e3+t)},m:function(e,t){t-=1;while(t<0)t+=12;t%=12;e.setUTCMonth(t);while(e.getUTCMonth()!=t)e.setUTCDate(e.getUTCDate()-1);return e},d:function(e,t){return e.setUTCDate(t)}},g,y,c;m["M"]=m["MM"]=m["mm"]=m["m"];m["dd"]=m["d"];n=t(n.getFullYear(),n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds());if(l.length==s.parts.length){for(var p=0,b=s.parts.length;p<b;p++){g=parseInt(l[p],10);c=s.parts[p];if(isNaN(g)){switch(c){case"MM":y=e(i[o].months).filter(function(){var e=this.slice(0,l[p].length),t=l[p].slice(0,e.length);return e==t});g=e.inArray(y[0],i[o].months)+1;break;case"M":y=e(i[o].monthsShort).filter(function(){var e=this.slice(0,l[p].length),t=l[p].slice(0,e.length);return e==t});g=e.inArray(y[0],i[o].monthsShort)+1;break}}d[c]=g}for(var p=0,w;p<v.length;p++){w=v[p];if(w in d&&!isNaN(d[w]))m[w](n,d[w])}}return n},formatDate:function(t,n,r,o){if(t==null){return""}var u;if(o=="standard"){u={yy:t.getUTCFullYear().toString().substring(2),yyyy:t.getUTCFullYear(),m:t.getUTCMonth()+1,M:i[r].monthsShort[t.getUTCMonth()],MM:i[r].months[t.getUTCMonth()],d:t.getUTCDate(),h:t.getUTCHours(),i:t.getUTCMinutes(),s:t.getUTCSeconds()};u.hh=(u.h<10?"0":"")+u.h;u.ii=(u.i<10?"0":"")+u.i;u.ss=(u.s<10?"0":"")+u.s;u.dd=(u.d<10?"0":"")+u.d;u.mm=(u.m<10?"0":"")+u.m}else if(o=="php"){u={y:t.getUTCFullYear().toString().substring(2),Y:t.getUTCFullYear(),F:i[r].months[t.getUTCMonth()],M:i[r].monthsShort[t.getUTCMonth()],n:t.getUTCMonth()+1,t:s.getDaysInMonth(t.getUTCFullYear(),t.getUTCMonth()),j:t.getUTCDate(),l:i[r].days[t.getUTCDay()],D:i[r].daysShort[t.getUTCDay()],w:t.getUTCDay(),N:t.getUTCDay()==0?7:t.getUTCDay(),S:t.getUTCDate()%10<=i[r].suffix.length?i[r].suffix[t.getUTCDate()%10-1]:"",a:i[r].meridiem.length==2?i[r].meridiem[t.getUTCHours()<12?0:1]:"",g:t.getUTCHours()%12==0?12:t.getUTCHours()%12,G:t.getUTCHours(),i:t.getUTCMinutes(),s:t.getUTCSeconds()};u.m=(u.n<10?"0":"")+u.n;u.d=(u.j<10?"0":"")+u.j;u.A=u.a.toString().toUpperCase();u.h=(u.g<10?"0":"")+u.g;u.H=(u.G<10?"0":"")+u.G;u.i=(u.i<10?"0":"")+u.i;u.s=(u.s<10?"0":"")+u.s}else{throw new Error("Invalid format type.")}var t=[],a=e.extend([],n.separators);for(var f=0,l=n.parts.length;f<l;f++){if(a.length)t.push(a.shift());t.push(u[n.parts[f]])}return t.join("")},convertViewMode:function(e){switch(e){case 4:case"decade":e=4;break;case 3:case"year":e=3;break;case 2:case"month":e=2;break;case 1:case"day":e=1;break;case 0:case"hour":e=0;break}return e},headTemplate:"<thead>"+"<tr>"+'<th class="prev"><i class="icon-arrow-left"/></th>'+'<th colspan="5" class="switch"></th>'+'<th class="next"><i class="icon-arrow-right"/></th>'+"</tr>"+"</thead>",contTemplate:'<tbody><tr><td colspan="7"></td></tr></tbody>',footTemplate:'<tfoot><tr><th colspan="7" class="today"></th></tr></tfoot>'};s.template='<div class="datetimepicker">'+'<div class="datetimepicker-minutes">'+'<table class=" table-condensed">'+s.headTemplate+s.contTemplate+s.footTemplate+"</table>"+"</div>"+'<div class="datetimepicker-hours">'+'<table class=" table-condensed">'+s.headTemplate+s.contTemplate+s.footTemplate+"</table>"+"</div>"+'<div class="datetimepicker-days">'+'<table class=" table-condensed">'+s.headTemplate+"<tbody></tbody>"+s.footTemplate+"</table>"+"</div>"+'<div class="datetimepicker-months">'+'<table class="table-condensed">'+s.headTemplate+s.contTemplate+s.footTemplate+"</table>"+"</div>"+'<div class="datetimepicker-years">'+'<table class="table-condensed">'+s.headTemplate+s.contTemplate+s.footTemplate+"</table>"+"</div>"+"</div>";e.fn.datetimepicker.DPGlobal=s}(window.jQuery)