pageflow 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pageflow might be problematic. Click here for more details.

Files changed (293) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG.md +810 -0
  3. data/README.md +179 -0
  4. data/admins/pageflow/accounts.rb +46 -3
  5. data/admins/pageflow/entry.rb +35 -7
  6. data/app/assets/javascripts/pageflow/audio.js +62 -0
  7. data/app/assets/javascripts/pageflow/audio/multi_player.js +127 -0
  8. data/app/assets/javascripts/pageflow/audio/player_pool.js +15 -0
  9. data/app/assets/javascripts/pageflow/audio_player.js +23 -1
  10. data/app/assets/javascripts/pageflow/audio_player/null.js +37 -0
  11. data/app/assets/javascripts/pageflow/audio_player/pause_in_background.js +34 -0
  12. data/app/assets/javascripts/pageflow/audio_player/rewind_method.js +17 -0
  13. data/app/assets/javascripts/pageflow/audio_player/seek_with_invalid_state_handling.js +41 -0
  14. data/app/assets/javascripts/pageflow/base.js +10 -0
  15. data/app/assets/javascripts/pageflow/browser.js +123 -0
  16. data/app/assets/javascripts/pageflow/{features → browser}/hashchange_support.js +1 -1
  17. data/app/assets/javascripts/pageflow/{features → browser}/high_bandwidth.js +1 -1
  18. data/app/assets/javascripts/pageflow/{features → browser}/ie_platform.js +1 -1
  19. data/app/assets/javascripts/pageflow/browser/ios_platform.js +6 -0
  20. data/app/assets/javascripts/pageflow/{features → browser}/mobile_platform.js +1 -1
  21. data/app/assets/javascripts/pageflow/{features → browser}/phone_platform.js +1 -1
  22. data/app/assets/javascripts/pageflow/browser/pushstate_support.js +3 -0
  23. data/app/assets/javascripts/pageflow/{features → browser}/touch_support.js +1 -1
  24. data/app/assets/javascripts/pageflow/browser/video.js +16 -0
  25. data/app/assets/javascripts/pageflow/browser/volume_control_support.js +3 -0
  26. data/app/assets/javascripts/pageflow/chapter_filter.js +56 -0
  27. data/app/assets/javascripts/pageflow/editor/api.js +29 -0
  28. data/app/assets/javascripts/pageflow/editor/api/page_type.js +42 -0
  29. data/app/assets/javascripts/pageflow/editor/api/page_types.js +47 -0
  30. data/app/assets/javascripts/pageflow/editor/base.js +7 -1
  31. data/app/assets/javascripts/pageflow/editor/collections/subset_collection.js +5 -1
  32. data/app/assets/javascripts/pageflow/editor/initializers/boot.js +10 -2
  33. data/app/assets/javascripts/pageflow/editor/initializers/setup_audio.js +8 -0
  34. data/app/assets/javascripts/pageflow/editor/initializers/setup_collections.js +7 -0
  35. data/app/assets/javascripts/pageflow/editor/initializers/setup_features.js +3 -0
  36. data/app/assets/javascripts/pageflow/editor/initializers/setup_hotkeys.js +20 -0
  37. data/app/assets/javascripts/pageflow/editor/initializers/setup_page_types.js +1 -6
  38. data/app/assets/javascripts/pageflow/editor/models/audio_file.js +8 -0
  39. data/app/assets/javascripts/pageflow/editor/models/chapter.js +23 -4
  40. data/app/assets/javascripts/pageflow/editor/models/chapter_configuration.js +7 -0
  41. data/app/assets/javascripts/pageflow/editor/models/configuration.js +5 -3
  42. data/app/assets/javascripts/pageflow/editor/models/entry.js +6 -4
  43. data/app/assets/javascripts/pageflow/editor/models/mixins/delayed_destroying.js +1 -1
  44. data/app/assets/javascripts/pageflow/editor/models/mixins/stage_provider.js +3 -2
  45. data/app/assets/javascripts/pageflow/editor/models/page.js +11 -4
  46. data/app/assets/javascripts/pageflow/editor/models/preview_entry_data.js +31 -0
  47. data/app/assets/javascripts/pageflow/editor/models/theming.js +8 -0
  48. data/app/assets/javascripts/pageflow/editor/models/uploaded_file.js +8 -0
  49. data/app/assets/javascripts/pageflow/editor/templates/drop_down_button.jst.ejs +6 -0
  50. data/app/assets/javascripts/pageflow/editor/templates/drop_down_button_item.jst.ejs +1 -0
  51. data/app/assets/javascripts/pageflow/editor/templates/files_explorer.jst.ejs +2 -2
  52. data/app/assets/javascripts/pageflow/editor/templates/inputs/reference.jst.ejs +7 -0
  53. data/app/assets/javascripts/pageflow/editor/templates/list.jst.ejs +5 -0
  54. data/app/assets/javascripts/pageflow/editor/templates/list_blank_slate.jst.ejs +1 -0
  55. data/app/assets/javascripts/pageflow/editor/templates/list_item.jst.ejs +11 -0
  56. data/app/assets/javascripts/pageflow/editor/templates/loading.jst.ejs +7 -1
  57. data/app/assets/javascripts/pageflow/editor/templates/other_entries_blank_slate.jst.ejs +1 -1
  58. data/app/assets/javascripts/pageflow/editor/templates/page_link_item.jst.ejs +7 -0
  59. data/app/assets/javascripts/pageflow/editor/templates/page_links.jst.ejs +6 -0
  60. data/app/assets/javascripts/pageflow/editor/templates/page_selection.jst.ejs +12 -0
  61. data/app/assets/javascripts/pageflow/editor/templates/publish_entry.jst.ejs +44 -8
  62. data/app/assets/javascripts/pageflow/editor/views/chapter_item_view.js +3 -1
  63. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio.js +1 -1
  64. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/options.js +34 -2
  65. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/page_transitions.js +6 -0
  66. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/video.js +6 -1
  67. data/app/assets/javascripts/pageflow/editor/views/disabled_atmo_indicator_view.js +27 -0
  68. data/app/assets/javascripts/pageflow/editor/views/drop_down_button_item_view.js +33 -0
  69. data/app/assets/javascripts/pageflow/editor/views/drop_down_button_view.js +80 -0
  70. data/app/assets/javascripts/pageflow/editor/views/edit_chapter_view.js +25 -5
  71. data/app/assets/javascripts/pageflow/editor/views/edit_entry_view.js +9 -1
  72. data/app/assets/javascripts/pageflow/editor/views/edit_page_view.js +7 -5
  73. data/app/assets/javascripts/pageflow/editor/views/edit_widget_view.js +1 -1
  74. data/app/assets/javascripts/pageflow/editor/views/embedded/background_image_embedded_view.js +4 -1
  75. data/app/assets/javascripts/pageflow/editor/views/embedded/lazy_video_embedded_view.js +41 -0
  76. data/app/assets/javascripts/pageflow/editor/views/entry_preview_view.js +6 -6
  77. data/app/assets/javascripts/pageflow/editor/views/inputs/page_link_input_view.js +9 -0
  78. data/app/assets/javascripts/pageflow/editor/views/inputs/reference_input_view.js +66 -0
  79. data/app/assets/javascripts/pageflow/editor/views/list_item_view.js +95 -0
  80. data/app/assets/javascripts/pageflow/editor/views/list_view.js +59 -0
  81. data/app/assets/javascripts/pageflow/editor/views/loading_view.js +5 -0
  82. data/app/assets/javascripts/pageflow/editor/views/model_thumbnail_view.js +37 -0
  83. data/app/assets/javascripts/pageflow/editor/views/navigatable_page_item_view.js +1 -0
  84. data/app/assets/javascripts/pageflow/editor/views/other_entries_collection_view.js +4 -4
  85. data/app/assets/javascripts/pageflow/editor/views/other_entry_item_view.js +2 -1
  86. data/app/assets/javascripts/pageflow/editor/views/page_item_view.js +2 -2
  87. data/app/assets/javascripts/pageflow/editor/views/page_link_item_view.js +51 -0
  88. data/app/assets/javascripts/pageflow/editor/views/page_links_view.js +45 -0
  89. data/app/assets/javascripts/pageflow/editor/views/page_preview_view.js +24 -16
  90. data/app/assets/javascripts/pageflow/editor/views/page_selection_view.js +46 -0
  91. data/app/assets/javascripts/pageflow/editor/views/page_thumbnail_view.js +2 -29
  92. data/app/assets/javascripts/pageflow/editor/views/publish_entry_view.js +95 -10
  93. data/app/assets/javascripts/pageflow/editor/views/scrolling_view.js +24 -0
  94. data/app/assets/javascripts/pageflow/entry_data.js +35 -0
  95. data/app/assets/javascripts/pageflow/features.js +68 -98
  96. data/app/assets/javascripts/pageflow/fullscreen.js +24 -0
  97. data/app/assets/javascripts/pageflow/highlighted_page.js +48 -0
  98. data/app/assets/javascripts/pageflow/history.js +50 -18
  99. data/app/assets/javascripts/pageflow/history/hash_adapter.js +36 -0
  100. data/app/assets/javascripts/pageflow/history/push_state_adapter.js +37 -0
  101. data/app/assets/javascripts/pageflow/history/simulated_adapter.js +44 -0
  102. data/app/assets/javascripts/pageflow/media_player.js +25 -0
  103. data/app/assets/javascripts/pageflow/media_player/async_play.js +54 -0
  104. data/app/assets/javascripts/pageflow/media_player/hooks.js +24 -0
  105. data/app/assets/javascripts/pageflow/media_player/load_waiting.js +11 -0
  106. data/app/assets/javascripts/pageflow/media_player/volume_binding.js +72 -0
  107. data/app/assets/javascripts/pageflow/media_player/volume_fading.js +62 -0
  108. data/app/assets/javascripts/pageflow/multimedia_alert.js +13 -0
  109. data/app/assets/javascripts/pageflow/object.js +14 -0
  110. data/app/assets/javascripts/pageflow/page_transitions.js +27 -0
  111. data/app/assets/javascripts/pageflow/page_type.js +6 -0
  112. data/app/assets/javascripts/pageflow/page_types/audio.js +17 -21
  113. data/app/assets/javascripts/pageflow/page_types/background_video.js +18 -17
  114. data/app/assets/javascripts/pageflow/page_types/mixins/common_page_css_classes.js +29 -4
  115. data/app/assets/javascripts/pageflow/page_types/video.js +73 -36
  116. data/app/assets/javascripts/pageflow/preload.js +9 -6
  117. data/app/assets/javascripts/pageflow/ready.js +18 -14
  118. data/app/assets/javascripts/pageflow/seed_entry_data.js +43 -0
  119. data/app/assets/javascripts/pageflow/settings.js +17 -4
  120. data/app/assets/javascripts/pageflow/slideshow.js +103 -23
  121. data/app/assets/javascripts/pageflow/slideshow/adjacent_pages.js +26 -0
  122. data/app/assets/javascripts/pageflow/slideshow/adjacent_preparer.js +44 -0
  123. data/app/assets/javascripts/pageflow/slideshow/atmo.js +105 -0
  124. data/app/assets/javascripts/pageflow/slideshow/dom_order_scroll_navigator.js +29 -0
  125. data/app/assets/javascripts/pageflow/slideshow/lazy_page_widget.js +49 -0
  126. data/app/assets/javascripts/pageflow/slideshow/page_widget.js +60 -26
  127. data/app/assets/javascripts/pageflow/slideshow/progressive_preload.js +16 -7
  128. data/app/assets/javascripts/pageflow/slideshow/scroll_indicator_widget.js +45 -7
  129. data/app/assets/javascripts/pageflow/slideshow/scroller_widget.js +42 -5
  130. data/app/assets/javascripts/pageflow/ui.js +1 -0
  131. data/app/assets/javascripts/pageflow/ui/object.js +4 -13
  132. data/app/assets/javascripts/pageflow/ui/utils/i18n_utils.js +23 -0
  133. data/app/assets/javascripts/pageflow/ui/views/collection_view.js +8 -4
  134. data/app/assets/javascripts/pageflow/ui/views/configuration_editor_tab_view.js +6 -5
  135. data/app/assets/javascripts/pageflow/ui/views/configuration_editor_view.js +2 -11
  136. data/app/assets/javascripts/pageflow/ui/views/inputs/select_input_view.js +6 -1
  137. data/app/assets/javascripts/pageflow/ui/views/inputs/text_input_view.js +4 -0
  138. data/app/assets/javascripts/pageflow/ui/views/mixins/input_view.js +149 -6
  139. data/app/assets/javascripts/pageflow/ui/views/mixins/subview_container.js +4 -0
  140. data/app/assets/javascripts/pageflow/video_player.js +5 -0
  141. data/app/assets/javascripts/pageflow/video_player/buffer_underrun_waiting.js +1 -1
  142. data/app/assets/javascripts/pageflow/video_player/lazy.js +8 -4
  143. data/app/assets/javascripts/pageflow/video_player/media_events.js +1 -1
  144. data/app/assets/javascripts/pageflow/video_player/play_button_patch.js +1 -1
  145. data/app/assets/javascripts/pageflow/video_player/prebuffering.js +1 -1
  146. data/app/assets/javascripts/pageflow/widgets/fullscreen_button.js +26 -0
  147. data/app/assets/javascripts/pageflow/widgets/multimedia_alert.js +21 -5
  148. data/app/assets/javascripts/pageflow/widgets/mute_button.js +42 -0
  149. data/app/assets/javascripts/pageflow/widgets/navigation.js +5 -78
  150. data/app/assets/javascripts/pageflow/widgets/navigation_mobile.js +4 -0
  151. data/app/assets/javascripts/pageflow/widgets/page_navigation_list.js +28 -34
  152. data/app/assets/javascripts/pageflow/widgets/parent_page_button.js +27 -0
  153. data/app/assets/javascripts/pageflow/widgets/skip_page_button.js +22 -0
  154. data/app/assets/javascripts/pageflow/widgets/top_button.js +6 -7
  155. data/app/assets/javascripts/pageflow/widgets/volume_slider.js +62 -0
  156. data/app/assets/stylesheets/pageflow/admin/entries.css.scss +10 -0
  157. data/app/assets/stylesheets/pageflow/animations.css.scss +1 -0
  158. data/app/assets/stylesheets/pageflow/animations/loading.css.scss +8 -0
  159. data/app/assets/stylesheets/pageflow/animations/scroll.css.scss +18 -0
  160. data/app/assets/stylesheets/pageflow/base.css.scss +3 -1
  161. data/app/assets/stylesheets/pageflow/delayed_text_fade_in.css.scss +49 -0
  162. data/app/assets/stylesheets/pageflow/editor/base.css.scss +15 -2
  163. data/app/assets/stylesheets/pageflow/editor/disabled_atmo_indicator.css.scss +13 -0
  164. data/app/assets/stylesheets/pageflow/editor/drop_down_button.css.scss +54 -0
  165. data/app/assets/stylesheets/pageflow/editor/files_explorer.css.scss +6 -0
  166. data/app/assets/stylesheets/pageflow/editor/indicators.css.scss +5 -0
  167. data/app/assets/stylesheets/pageflow/editor/inputs.css.scss +1 -0
  168. data/app/assets/stylesheets/pageflow/editor/inputs/reference.css.scss +51 -0
  169. data/app/assets/stylesheets/pageflow/editor/list.css.scss +108 -0
  170. data/app/assets/stylesheets/pageflow/editor/loading.css.scss +31 -0
  171. data/app/assets/stylesheets/pageflow/editor/outline.css.scss +7 -5
  172. data/app/assets/stylesheets/pageflow/editor/page_links.css.scss +58 -0
  173. data/app/assets/stylesheets/pageflow/editor/page_selection.css.scss +39 -0
  174. data/app/assets/stylesheets/pageflow/editor/publish_entry.css.scss +38 -1
  175. data/app/assets/stylesheets/pageflow/entries.css.scss +17 -9
  176. data/app/assets/stylesheets/pageflow/navigation_bar.css.scss +4 -0
  177. data/app/assets/stylesheets/pageflow/page_transitions.css.scss +10 -0
  178. data/app/assets/stylesheets/pageflow/page_transitions/crossfade.css.scss +29 -0
  179. data/app/assets/stylesheets/pageflow/page_transitions/cut.css.scss +23 -0
  180. data/app/assets/stylesheets/pageflow/page_transitions/fade.css.scss +78 -0
  181. data/app/assets/stylesheets/pageflow/page_transitions/fade_to_black.css.scss +107 -0
  182. data/app/assets/stylesheets/pageflow/page_transitions/scroll.css.scss +20 -0
  183. data/app/assets/stylesheets/pageflow/page_transitions/scroll_in.css.scss +66 -0
  184. data/app/assets/stylesheets/pageflow/page_transitions/scroll_in_right.css.scss +68 -0
  185. data/app/assets/stylesheets/pageflow/page_transitions/scroll_left.css.scss +20 -0
  186. data/app/assets/stylesheets/pageflow/page_transitions/scroll_right.css.scss +20 -0
  187. data/app/assets/stylesheets/pageflow/page_types.css.scss +1 -3
  188. data/app/assets/stylesheets/pageflow/page_types/video.css.scss +0 -4
  189. data/app/assets/stylesheets/pageflow/slideshow.css.scss +0 -145
  190. data/app/assets/stylesheets/pageflow/text_variants.css.scss +0 -4
  191. data/app/assets/stylesheets/pageflow/themes/default/navigation.css.scss +0 -3
  192. data/app/controllers/concerns/pageflow/public_https_mode.rb +13 -0
  193. data/app/controllers/pageflow/application_controller.rb +0 -6
  194. data/app/controllers/pageflow/chapters_controller.rb +2 -1
  195. data/app/controllers/pageflow/editor/entries_controller.rb +2 -0
  196. data/app/controllers/pageflow/editor/entry_publications_controller.rb +3 -1
  197. data/app/controllers/pageflow/entries_controller.rb +16 -3
  198. data/app/controllers/pageflow/files_controller.rb +3 -1
  199. data/app/helpers/pageflow/admin/features_helper.rb +25 -0
  200. data/app/helpers/pageflow/background_image_helper.rb +40 -9
  201. data/app/helpers/pageflow/entries_helper.rb +10 -11
  202. data/app/helpers/pageflow/entry_json_seed_helper.rb +44 -0
  203. data/app/helpers/pageflow/help_entries_helper.rb +4 -4
  204. data/app/helpers/pageflow/page_types_helper.rb +4 -2
  205. data/app/helpers/pageflow/pages_helper.rb +20 -27
  206. data/app/helpers/pageflow/widgets_helper.rb +4 -4
  207. data/app/models/concerns/pageflow/feature_target.rb +37 -0
  208. data/app/models/pageflow/account.rb +2 -0
  209. data/app/models/pageflow/chapter.rb +6 -0
  210. data/app/models/pageflow/draft_entry.rb +2 -0
  211. data/app/models/pageflow/entry.rb +47 -9
  212. data/app/models/pageflow/entry_duplicate.rb +51 -0
  213. data/app/models/pageflow/image_file.rb +33 -13
  214. data/app/models/pageflow/page.rb +2 -2
  215. data/app/models/pageflow/published_entry.rb +7 -1
  216. data/app/views/admin/accounts/_form.html.erb +11 -1
  217. data/app/views/admin/features/_form.html.erb +16 -0
  218. data/app/views/components/pageflow/admin/features_tab.rb +10 -0
  219. data/app/views/components/pageflow/admin/revisions_tab.rb +4 -0
  220. data/app/views/layouts/pageflow/_meta_tags.html.erb +1 -1
  221. data/app/views/layouts/pageflow/application.html.erb +2 -2
  222. data/app/views/pageflow/editor/accounts/_account.json.jbuilder +1 -0
  223. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +2 -1
  224. data/app/views/pageflow/editor/entries/_help_entries_seed.html.erb +2 -2
  225. data/app/views/pageflow/editor/entries/_indicators_seed.html.erb +3 -0
  226. data/app/views/pageflow/editor/entries/seed.json.erb +3 -2
  227. data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +1 -0
  228. data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +1 -1
  229. data/app/views/pageflow/editor/themings/_theming.json.jbuilder +4 -0
  230. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +1 -0
  231. data/app/views/pageflow/entries/_entry.html.erb +4 -3
  232. data/app/views/pageflow/entries/_indicators.html.erb +13 -0
  233. data/app/views/pageflow/entries/_mobile_navigation.html.erb +3 -15
  234. data/app/views/pageflow/entries/edit.html.erb +9 -1
  235. data/app/views/pageflow/entries/navigation/_bar_top.html.erb +3 -15
  236. data/app/views/pageflow/entries/share_menu/_facebook_link.html.erb +12 -0
  237. data/app/views/pageflow/entries/share_menu/_google_link.html.erb +12 -0
  238. data/app/views/pageflow/entries/share_menu/_twitter_link.html.erb +12 -0
  239. data/app/views/pageflow/entries/show.css.erb +12 -2
  240. data/app/views/pageflow/entries/show.html.erb +5 -1
  241. data/app/views/pageflow/page_types/_page_type.json.jbuilder +7 -1
  242. data/app/views/pageflow/pages/_page.html.erb +2 -2
  243. data/app/views/pageflow/pages/templates/_audio.html.erb +10 -0
  244. data/config/initializers/admin_resource_tabs.rb +1 -0
  245. data/config/initializers/features.rb +9 -0
  246. data/config/initializers/page_type_helpers.rb +1 -1
  247. data/config/initializers/paperclip.rb +1 -1
  248. data/config/initializers/zencoder.rb +1 -1
  249. data/config/locales/de.yml +132 -71
  250. data/config/locales/en.yml +118 -191
  251. data/db/migrate/20141211110226_add_configuration_to_chapters.rb +5 -0
  252. data/db/migrate/20150115175116_add_features_configuration_to_accounts.rb +5 -0
  253. data/db/migrate/20150115175207_add_features_configuration_to_entries.rb +5 -0
  254. data/db/migrate/20150603091823_add_password_attributes_to_revisions.rb +6 -0
  255. data/db/migrate/20151022080518_add_first_published_at_to_entries.rb +14 -0
  256. data/lib/generators/pageflow/initializer/templates/pageflow.rb +26 -17
  257. data/lib/generators/pageflow/theme/theme_generator.rb +2 -1
  258. data/lib/pageflow.rb +2 -46
  259. data/lib/pageflow/admin/form_input.rb +18 -0
  260. data/lib/pageflow/admin/form_inputs.rb +41 -0
  261. data/lib/pageflow/built_in_page_type.rb +0 -4
  262. data/lib/pageflow/configuration.rb +74 -18
  263. data/lib/pageflow/feature.rb +33 -0
  264. data/lib/pageflow/features.rb +68 -0
  265. data/lib/pageflow/global_config_api.rb +118 -0
  266. data/lib/pageflow/page_type_feature.rb +21 -0
  267. data/lib/pageflow/page_types.rb +29 -0
  268. data/lib/pageflow/theme.rb +20 -0
  269. data/lib/pageflow/themes.rb +26 -0
  270. data/lib/pageflow/version.rb +1 -1
  271. data/spec/factories/entries.rb +6 -0
  272. data/spec/factories/feature_targets.rb +4 -0
  273. data/spec/fixtures/image.gif +0 -0
  274. data/spec/fixtures/video.mp4 +0 -0
  275. data/vendor/assets/javascripts/audio5.min.js +12 -8
  276. data/vendor/assets/javascripts/iscroll.js +1 -1
  277. metadata +144 -24
  278. data/app/assets/images/pageflow/internal_links_pictogram.png +0 -0
  279. data/app/assets/images/pageflow/internal_links_pictogram_small.png +0 -0
  280. data/app/assets/images/pageflow/internal_links_sprite.png +0 -0
  281. data/app/assets/images/pageflow/ov-internal_links.png +0 -0
  282. data/app/assets/images/pageflow/themes/default/internal_links_sprite.png +0 -0
  283. data/app/assets/javascripts/pageflow/editor/templates/embedded/page_link.jst.ejs +0 -3
  284. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/internal_links.js +0 -24
  285. data/app/assets/javascripts/pageflow/editor/views/draggable_page_item_view.js +0 -31
  286. data/app/assets/javascripts/pageflow/editor/views/embedded/page_link_embedded_view.js +0 -176
  287. data/app/assets/javascripts/pageflow/features/video.js +0 -16
  288. data/app/assets/javascripts/pageflow/page_types/internal_links.js +0 -55
  289. data/app/assets/javascripts/pageflow/ui/templates/inputs/page_reference.jst.ejs +0 -6
  290. data/app/assets/javascripts/pageflow/ui/views/inputs/page_reference_input_view.js +0 -44
  291. data/app/assets/stylesheets/pageflow/editor/embedded.css.scss +0 -104
  292. data/app/assets/stylesheets/pageflow/page_types/internal_links.css.scss +0 -222
  293. data/app/views/pageflow/pages/templates/_internal_links.html.erb +0 -31
@@ -0,0 +1,15 @@
1
+ pageflow.Audio.PlayerPool = function(audio, options) {
2
+ this.players = {};
3
+
4
+ this.get = function(audioFileId) {
5
+ this.players[audioFileId] =
6
+ this.players[audioFileId] ||
7
+ audio.createPlayer(audioFileId, options);
8
+
9
+ return this.players[audioFileId];
10
+ };
11
+
12
+ this.dispose = function() {
13
+ this.players = {};
14
+ };
15
+ };
@@ -1,5 +1,12 @@
1
+ //= require ./media_player
2
+
1
3
  //= require_self
4
+
2
5
  //= require ./audio_player/media_events
6
+ //= require ./audio_player/null
7
+ //= require ./audio_player/seek_with_invalid_state_handling
8
+ //= require ./audio_player/rewind_method
9
+ //= require ./audio_player/pause_in_background
3
10
 
4
11
  pageflow.AudioPlayer = function(sources, options) {
5
12
  options = options || {};
@@ -32,6 +39,17 @@ pageflow.AudioPlayer = function(sources, options) {
32
39
  pageflow.AudioPlayer.mediaEvents(audio, options.context);
33
40
  }
34
41
 
42
+ if (options.pauseInBackground && pageflow.browser.has('mobile platform')) {
43
+ pageflow.AudioPlayer.pauseInBackground(audio);
44
+ }
45
+
46
+ pageflow.mediaPlayer.enhance(audio, _.extend({
47
+ loadWaiting: true
48
+ }, options || {}));
49
+
50
+ pageflow.AudioPlayer.seekWithInvalidStateHandling(audio);
51
+ pageflow.AudioPlayer.rewindMethod(audio);
52
+
35
53
  audio.src = function(sources) {
36
54
  ready.then(function() {
37
55
  var source = _.detect(sources || [], function(source) {
@@ -60,7 +78,7 @@ pageflow.AudioPlayer = function(sources, options) {
60
78
  var originalSeek = audio.seek;
61
79
  audio.seek = function() {
62
80
  if (this.currentSrc) {
63
- originalSeek.apply(this, arguments);
81
+ return originalSeek.apply(this, arguments);
64
82
  }
65
83
  };
66
84
 
@@ -71,6 +89,10 @@ pageflow.AudioPlayer = function(sources, options) {
71
89
  }
72
90
  };
73
91
 
92
+ audio.paused = function() {
93
+ return !audio.playing;
94
+ };
95
+
74
96
  audio.src(sources);
75
97
  return audio;
76
98
  };
@@ -0,0 +1,37 @@
1
+ pageflow.AudioPlayer.Null = function() {
2
+ this.playAndFadeIn = function() {
3
+ return new $.Deferred().resolve().promise();
4
+ };
5
+
6
+ this.fadeOutAndPause = function() {
7
+ return new $.Deferred().resolve().promise();
8
+ };
9
+
10
+ this.changeVolumeFactor = function() {
11
+ return new $.Deferred().resolve().promise();
12
+ };
13
+
14
+ this.play = function() {};
15
+
16
+ this.pause = function() {};
17
+
18
+ this.paused = function() {
19
+ return true;
20
+ };
21
+
22
+ this.seek = function() {
23
+ return new $.Deferred().resolve().promise();
24
+ };
25
+
26
+ this.rewind = function() {
27
+ return new $.Deferred().resolve().promise();
28
+ };
29
+
30
+ this.formatTime = function() {};
31
+
32
+ this.one = function(event, handler) {
33
+ handler();
34
+ };
35
+ };
36
+
37
+ _.extend(pageflow.AudioPlayer.Null.prototype, Backbone.Events);
@@ -0,0 +1,34 @@
1
+ // Prevent audio play back when browser enters background on mobile
2
+ // device. Use the face that timeupdate events continue to fire while
3
+ // intervals no longer executed when the browser is in the background.
4
+ pageflow.AudioPlayer.pauseInBackground = function(player) {
5
+ var interval;
6
+ var lastInterval;
7
+ var resolution = 100;
8
+
9
+ function startProbeInterval() {
10
+ interval = setInterval(function() {
11
+ lastInterval = new Date().getTime();
12
+ }, resolution);
13
+ }
14
+
15
+ function stopProbeInterval() {
16
+ clearInterval(interval);
17
+ interval = null;
18
+ }
19
+
20
+ function pauseIfProbeIntervalHalted() {
21
+ if (intervalHalted()) {
22
+ player.pause();
23
+ }
24
+ }
25
+
26
+ function intervalHalted() {
27
+ return interval && lastInterval < new Date().getTime() - resolution * 5;
28
+ }
29
+
30
+ player.on('play', startProbeInterval);
31
+ player.on('pause', stopProbeInterval);
32
+ player.on('ended', stopProbeInterval);
33
+ player.on('timeupdate', pauseIfProbeIntervalHalted);
34
+ };
@@ -0,0 +1,17 @@
1
+ pageflow.AudioPlayer.rewindMethod = function(player) {
2
+ /**
3
+ * Seek to beginning of file. If already at the beginning do
4
+ * nothing.
5
+ */
6
+ player.rewind = function() {
7
+ if (player.position > 0) {
8
+ var result = player.seek(0);
9
+
10
+ player.trigger('timeupdate', player.position, player.duration);
11
+ return result;
12
+ }
13
+ else {
14
+ return new $.Deferred().resolve().promise();
15
+ }
16
+ };
17
+ };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Calling seek before the media tag is ready causes InvalidState
3
+ * exeption. If this happens, we wait for the next progress event and
4
+ * retry. We resolve a promise once seeking succeeded.
5
+ *
6
+ * @api private
7
+ */
8
+ pageflow.AudioPlayer.seekWithInvalidStateHandling = function(player) {
9
+ var originalSeek = player.seek;
10
+
11
+ player.seek = function(time) {
12
+ return retryOnProgress(function() {
13
+ originalSeek.call(player, time);
14
+ });
15
+ };
16
+
17
+ function retryOnProgress(fn) {
18
+ var tries = 0;
19
+
20
+ return new $.Deferred(function(deferred) {
21
+ function tryOrWaitForProgress() {
22
+ tries += 1;
23
+
24
+ if (tries >= 50) {
25
+ deferred.reject();
26
+ return;
27
+ }
28
+
29
+ try {
30
+ fn();
31
+ deferred.resolve();
32
+ }
33
+ catch(e) {
34
+ player.one('progress', tryOrWaitForProgress);
35
+ }
36
+ }
37
+
38
+ tryOrWaitForProgress();
39
+ }).promise();
40
+ }
41
+ };
@@ -26,13 +26,19 @@
26
26
  //= require backbone-rails
27
27
  //= require_self
28
28
 
29
+ //= require ./object
30
+ //= require ./entry_data
31
+ //= require ./seed_entry_data
29
32
  //= require ./cookies
30
33
  //= require ./events
31
34
  //= require ./page_type
35
+ //= require ./page_transitions
32
36
  //= require ./asset_urls
33
37
  //= require ./preload
34
38
  //= require ./bandwidth
39
+ //= require ./browser
35
40
  //= require ./features
41
+ //= require ./audio
36
42
  //= require ./audio_player
37
43
  //= require ./video_player
38
44
  //= require ./visited
@@ -42,6 +48,10 @@
42
48
  //= require ./widget_types
43
49
  //= require ./built_in_widget_types
44
50
  //= require ./links
51
+ //= require ./highlighted_page
52
+ //= require ./chapter_filter
53
+ //= require ./fullscreen
54
+ //= require ./multimedia_alert
45
55
 
46
56
  //= require ./settings
47
57
 
@@ -0,0 +1,123 @@
1
+ //= require_self
2
+ //= require_tree ./browser
3
+
4
+ /**
5
+ * Browser feature detection.
6
+ *
7
+ * @since 0.9
8
+ */
9
+ pageflow.browser = (function(){
10
+ var tests = {},
11
+ results = {},
12
+ ready = new $.Deferred();
13
+
14
+ return {
15
+ off: {},
16
+ on: {},
17
+ unset: {},
18
+
19
+ /**
20
+ * Add a feature test.
21
+ *
22
+ * @param name [String] Name of the feature. Can contain whitespace.
23
+ * @param test [Function] A function that either returns `true` or
24
+ * `false` or a promise that resolves to `true` or `false`.
25
+ */
26
+ feature: function(name, test) {
27
+ var s = name.replace(/ /g, '_');
28
+
29
+ this.off[s] = function() {
30
+ window.localStorage['override ' + name] = 'off';
31
+ pageflow.log('Feature off: ' + name, {force: true});
32
+ };
33
+
34
+ this.on[s] = function() {
35
+ window.localStorage['override ' + name] = 'on';
36
+ pageflow.log('Feature on: ' + name, {force: true});
37
+ };
38
+
39
+ this.unset[s] = function() {
40
+ window.localStorage.removeItem('override ' + name);
41
+ pageflow.log('Feature unset: ' + name, {force: true});
42
+ };
43
+
44
+ tests[name] = test;
45
+ },
46
+
47
+ /**
48
+ * Check whether the browser has a specific feature. This method
49
+ * may only be called after the `#ready` promise is resolved.
50
+ *
51
+ * @param name [String] Name of the feature.
52
+ * @return [Boolean]
53
+ */
54
+ has: function(name) {
55
+ if (this.ready().state() != 'resolved') {
56
+ throw 'Feature detection has not finished yet.';
57
+ }
58
+
59
+ if (!results.hasOwnProperty(name)) {
60
+ throw 'Unknown feature "' + name +'".';
61
+ }
62
+
63
+ return results[name];
64
+ },
65
+
66
+ /**
67
+ * A promise that is resolved once feature detection has finished.
68
+ *
69
+ * @return [Promise]
70
+ */
71
+ ready: function() {
72
+ return ready.promise();
73
+ },
74
+
75
+ /** @api private */
76
+ detectFeatures: function() {
77
+ var promises = {};
78
+
79
+ var asyncHas = function(name) {
80
+ var runTest = function() {
81
+ if ((pageflow.debugMode() || pageflow.ALLOW_FEATURE_OVERRIDES) &&
82
+ window.localStorage &&
83
+ typeof window.localStorage['override ' + name] !== 'undefined') {
84
+ var value = (window.localStorage['override ' + name] === 'on');
85
+ pageflow.log('FEATURE OVERRIDDEN ' + name + ': ' + value, {force: true});
86
+ return value;
87
+ }
88
+ else {
89
+ return tests[name](asyncHas);
90
+ }
91
+ };
92
+
93
+ promises[name] = promises[name] || $.when(runTest(name));
94
+ return promises[name];
95
+ };
96
+
97
+ asyncHas.not = function(name) {
98
+ return asyncHas(name).pipe(function(result) {
99
+ return !result;
100
+ });
101
+ };
102
+
103
+ asyncHas.all = function(/* arguments */) {
104
+ return $.when.apply(null, arguments).pipe(function(/* arguments */) {
105
+ return _.all(arguments);
106
+ });
107
+ };
108
+
109
+ $.when.apply(null, _.map(_.keys(tests), function(name) {
110
+ return asyncHas(name).then(function(result) {
111
+ var cssClassName = name.replace(/ /g, '_');
112
+
113
+ $('body').toggleClass('has_' + cssClassName, !!result);
114
+ $('body').toggleClass('has_no_' + cssClassName, !result);
115
+
116
+ results[name] = !!result;
117
+ });
118
+ })).then(ready.resolve);
119
+
120
+ return this.ready();
121
+ }
122
+ };
123
+ }());
@@ -1,4 +1,4 @@
1
- pageflow.features.add('hashchange support', function() {
1
+ pageflow.browser.feature('hashchange support', function() {
2
2
  var iOS = parseFloat(
3
3
  ('' + (/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0,''])[1])
4
4
  .replace('undefined', '3_2').replace('_', '.').replace('_', '')
@@ -1,4 +1,4 @@
1
- pageflow.features.add('high bandwidth', function() {
1
+ pageflow.browser.feature('high bandwidth', function() {
2
2
  return pageflow.bandwidth().pipe(function(result) {
3
3
  var isHigh = result.speedInBps > 8000 * 1024;
4
4
 
@@ -1,4 +1,4 @@
1
- pageflow.features.add('ie', function() {
1
+ pageflow.browser.feature('ie', function() {
2
2
  if (navigator.appName == 'Microsoft Internet Explorer')
3
3
  {
4
4
  return true;
@@ -0,0 +1,6 @@
1
+ pageflow.browser.feature('ios platform', function() {
2
+ var matchers = [/iPod/i, /iPad/i, /iPhone/i];
3
+ return _.any(matchers, function(matcher) {
4
+ return navigator.userAgent.match(matcher);
5
+ });
6
+ });
@@ -1,4 +1,4 @@
1
- pageflow.features.add('mobile platform', function() {
1
+ pageflow.browser.feature('mobile platform', function() {
2
2
  var matchers = [/iPod/i, /iPad/i, /iPhone/i, /Android/i, /Silk/i, /IEMobile/i];
3
3
  return _.any(matchers, function(matcher) {
4
4
  return navigator.userAgent.match(matcher);
@@ -1,4 +1,4 @@
1
- pageflow.features.add('phone platform', function() {
1
+ pageflow.browser.feature('phone platform', function() {
2
2
  var matchers = [/iPod/i, /iPad/i, /iPhone/i, /Android/i, /IEMobile/i];
3
3
 
4
4
  return _.any(matchers, function(matcher) {
@@ -0,0 +1,3 @@
1
+ pageflow.browser.feature('pushstate support', function() {
2
+ return (window.history && 'pushState' in window.history);
3
+ });
@@ -1,4 +1,4 @@
1
- pageflow.features.add('touch support', function() {
1
+ pageflow.browser.feature('touch support', function() {
2
2
  return ('ontouchstart' in window) ||
3
3
  /* Firefox on android */
4
4
  window.DocumentTouch && document instanceof window.DocumentTouch ||
@@ -0,0 +1,16 @@
1
+ pageflow.browser.feature('rewrite video sources support', function() {
2
+ // set from conditionally included script file
3
+ return !pageflow.ie9;
4
+ });
5
+
6
+ pageflow.browser.feature('stop buffering support', function(has) {
7
+ return has.not('mobile platform');
8
+ });
9
+
10
+ pageflow.browser.feature('buffer underrun waiting support', function(has) {
11
+ return has.not('mobile platform');
12
+ });
13
+
14
+ pageflow.browser.feature('prebuffering support', function(has) {
15
+ return has.not('mobile platform');
16
+ });
@@ -0,0 +1,3 @@
1
+ pageflow.browser.feature('volume control support', function(has) {
2
+ return has.not('ios platform');
3
+ });
@@ -0,0 +1,56 @@
1
+ pageflow.ChapterFilter = pageflow.Object.extend({
2
+ initialize: function(entryData) {
3
+ this.entry = entryData;
4
+ },
5
+
6
+ strategies: {
7
+ all: function() {
8
+ return true;
9
+ },
10
+
11
+ non: function() {
12
+ return false;
13
+ },
14
+
15
+ current_chapter: function(currentChapterId, otherChapterId) {
16
+ return otherChapterId === currentChapterId;
17
+ },
18
+
19
+ inherit_from_parent: function(currentChapterId, otherChapterId) {
20
+ return this.chapterVisibleFromChapter(this.entry.getParentChapterId(currentChapterId), otherChapterId);
21
+ },
22
+
23
+ same_parent_page: function(currentChapterId, otherChapterId) {
24
+ return this.entry.getParentPagePermaId(currentChapterId) === this.entry.getParentPagePermaId(otherChapterId);
25
+ },
26
+
27
+ same_parent_chapter: function(currentChapterId, otherChapterId) {
28
+ return this.entry.getParentChapterId(currentChapterId) === this.entry.getParentChapterId(otherChapterId);
29
+ }
30
+ },
31
+
32
+ chapterVisibleFromPage: function(currentPagePermaId, chapterId) {
33
+ var currentChapterId = this.entry.getChapterIdByPagePermaId(currentPagePermaId);
34
+ return this.chapterVisibleFromChapter(currentChapterId, chapterId);
35
+ },
36
+
37
+ chapterVisibleFromChapter: function(currentChapterId, otherChapterId) {
38
+ return this.getStrategy(currentChapterId)
39
+ .call(this, currentChapterId, otherChapterId);
40
+ },
41
+
42
+ getStrategy: function(chapterId) {
43
+ return this.strategies[this.getNavigationBarMode(chapterId)] ||
44
+ this.strategies.all;
45
+ },
46
+
47
+ getNavigationBarMode: function(chapterId) {
48
+ return this.entry.getChapterConfiguration(chapterId).navigation_bar_mode;
49
+ }
50
+ });
51
+
52
+ pageflow.ChapterFilter.strategies = _(pageflow.ChapterFilter.prototype.strategies).keys();
53
+
54
+ pageflow.ChapterFilter.create = function() {
55
+ return new pageflow.ChapterFilter(pageflow.entryData);
56
+ };