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.
- checksums.yaml +8 -8
- data/CHANGELOG.md +810 -0
- data/README.md +179 -0
- data/admins/pageflow/accounts.rb +46 -3
- data/admins/pageflow/entry.rb +35 -7
- data/app/assets/javascripts/pageflow/audio.js +62 -0
- data/app/assets/javascripts/pageflow/audio/multi_player.js +127 -0
- data/app/assets/javascripts/pageflow/audio/player_pool.js +15 -0
- data/app/assets/javascripts/pageflow/audio_player.js +23 -1
- data/app/assets/javascripts/pageflow/audio_player/null.js +37 -0
- data/app/assets/javascripts/pageflow/audio_player/pause_in_background.js +34 -0
- data/app/assets/javascripts/pageflow/audio_player/rewind_method.js +17 -0
- data/app/assets/javascripts/pageflow/audio_player/seek_with_invalid_state_handling.js +41 -0
- data/app/assets/javascripts/pageflow/base.js +10 -0
- data/app/assets/javascripts/pageflow/browser.js +123 -0
- data/app/assets/javascripts/pageflow/{features → browser}/hashchange_support.js +1 -1
- data/app/assets/javascripts/pageflow/{features → browser}/high_bandwidth.js +1 -1
- data/app/assets/javascripts/pageflow/{features → browser}/ie_platform.js +1 -1
- data/app/assets/javascripts/pageflow/browser/ios_platform.js +6 -0
- data/app/assets/javascripts/pageflow/{features → browser}/mobile_platform.js +1 -1
- data/app/assets/javascripts/pageflow/{features → browser}/phone_platform.js +1 -1
- data/app/assets/javascripts/pageflow/browser/pushstate_support.js +3 -0
- data/app/assets/javascripts/pageflow/{features → browser}/touch_support.js +1 -1
- data/app/assets/javascripts/pageflow/browser/video.js +16 -0
- data/app/assets/javascripts/pageflow/browser/volume_control_support.js +3 -0
- data/app/assets/javascripts/pageflow/chapter_filter.js +56 -0
- data/app/assets/javascripts/pageflow/editor/api.js +29 -0
- data/app/assets/javascripts/pageflow/editor/api/page_type.js +42 -0
- data/app/assets/javascripts/pageflow/editor/api/page_types.js +47 -0
- data/app/assets/javascripts/pageflow/editor/base.js +7 -1
- data/app/assets/javascripts/pageflow/editor/collections/subset_collection.js +5 -1
- data/app/assets/javascripts/pageflow/editor/initializers/boot.js +10 -2
- data/app/assets/javascripts/pageflow/editor/initializers/setup_audio.js +8 -0
- data/app/assets/javascripts/pageflow/editor/initializers/setup_collections.js +7 -0
- data/app/assets/javascripts/pageflow/editor/initializers/setup_features.js +3 -0
- data/app/assets/javascripts/pageflow/editor/initializers/setup_hotkeys.js +20 -0
- data/app/assets/javascripts/pageflow/editor/initializers/setup_page_types.js +1 -6
- data/app/assets/javascripts/pageflow/editor/models/audio_file.js +8 -0
- data/app/assets/javascripts/pageflow/editor/models/chapter.js +23 -4
- data/app/assets/javascripts/pageflow/editor/models/chapter_configuration.js +7 -0
- data/app/assets/javascripts/pageflow/editor/models/configuration.js +5 -3
- data/app/assets/javascripts/pageflow/editor/models/entry.js +6 -4
- data/app/assets/javascripts/pageflow/editor/models/mixins/delayed_destroying.js +1 -1
- data/app/assets/javascripts/pageflow/editor/models/mixins/stage_provider.js +3 -2
- data/app/assets/javascripts/pageflow/editor/models/page.js +11 -4
- data/app/assets/javascripts/pageflow/editor/models/preview_entry_data.js +31 -0
- data/app/assets/javascripts/pageflow/editor/models/theming.js +8 -0
- data/app/assets/javascripts/pageflow/editor/models/uploaded_file.js +8 -0
- data/app/assets/javascripts/pageflow/editor/templates/drop_down_button.jst.ejs +6 -0
- data/app/assets/javascripts/pageflow/editor/templates/drop_down_button_item.jst.ejs +1 -0
- data/app/assets/javascripts/pageflow/editor/templates/files_explorer.jst.ejs +2 -2
- data/app/assets/javascripts/pageflow/editor/templates/inputs/reference.jst.ejs +7 -0
- data/app/assets/javascripts/pageflow/editor/templates/list.jst.ejs +5 -0
- data/app/assets/javascripts/pageflow/editor/templates/list_blank_slate.jst.ejs +1 -0
- data/app/assets/javascripts/pageflow/editor/templates/list_item.jst.ejs +11 -0
- data/app/assets/javascripts/pageflow/editor/templates/loading.jst.ejs +7 -1
- data/app/assets/javascripts/pageflow/editor/templates/other_entries_blank_slate.jst.ejs +1 -1
- data/app/assets/javascripts/pageflow/editor/templates/page_link_item.jst.ejs +7 -0
- data/app/assets/javascripts/pageflow/editor/templates/page_links.jst.ejs +6 -0
- data/app/assets/javascripts/pageflow/editor/templates/page_selection.jst.ejs +12 -0
- data/app/assets/javascripts/pageflow/editor/templates/publish_entry.jst.ejs +44 -8
- data/app/assets/javascripts/pageflow/editor/views/chapter_item_view.js +3 -1
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio.js +1 -1
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/options.js +34 -2
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/page_transitions.js +6 -0
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/video.js +6 -1
- data/app/assets/javascripts/pageflow/editor/views/disabled_atmo_indicator_view.js +27 -0
- data/app/assets/javascripts/pageflow/editor/views/drop_down_button_item_view.js +33 -0
- data/app/assets/javascripts/pageflow/editor/views/drop_down_button_view.js +80 -0
- data/app/assets/javascripts/pageflow/editor/views/edit_chapter_view.js +25 -5
- data/app/assets/javascripts/pageflow/editor/views/edit_entry_view.js +9 -1
- data/app/assets/javascripts/pageflow/editor/views/edit_page_view.js +7 -5
- data/app/assets/javascripts/pageflow/editor/views/edit_widget_view.js +1 -1
- data/app/assets/javascripts/pageflow/editor/views/embedded/background_image_embedded_view.js +4 -1
- data/app/assets/javascripts/pageflow/editor/views/embedded/lazy_video_embedded_view.js +41 -0
- data/app/assets/javascripts/pageflow/editor/views/entry_preview_view.js +6 -6
- data/app/assets/javascripts/pageflow/editor/views/inputs/page_link_input_view.js +9 -0
- data/app/assets/javascripts/pageflow/editor/views/inputs/reference_input_view.js +66 -0
- data/app/assets/javascripts/pageflow/editor/views/list_item_view.js +95 -0
- data/app/assets/javascripts/pageflow/editor/views/list_view.js +59 -0
- data/app/assets/javascripts/pageflow/editor/views/loading_view.js +5 -0
- data/app/assets/javascripts/pageflow/editor/views/model_thumbnail_view.js +37 -0
- data/app/assets/javascripts/pageflow/editor/views/navigatable_page_item_view.js +1 -0
- data/app/assets/javascripts/pageflow/editor/views/other_entries_collection_view.js +4 -4
- data/app/assets/javascripts/pageflow/editor/views/other_entry_item_view.js +2 -1
- data/app/assets/javascripts/pageflow/editor/views/page_item_view.js +2 -2
- data/app/assets/javascripts/pageflow/editor/views/page_link_item_view.js +51 -0
- data/app/assets/javascripts/pageflow/editor/views/page_links_view.js +45 -0
- data/app/assets/javascripts/pageflow/editor/views/page_preview_view.js +24 -16
- data/app/assets/javascripts/pageflow/editor/views/page_selection_view.js +46 -0
- data/app/assets/javascripts/pageflow/editor/views/page_thumbnail_view.js +2 -29
- data/app/assets/javascripts/pageflow/editor/views/publish_entry_view.js +95 -10
- data/app/assets/javascripts/pageflow/editor/views/scrolling_view.js +24 -0
- data/app/assets/javascripts/pageflow/entry_data.js +35 -0
- data/app/assets/javascripts/pageflow/features.js +68 -98
- data/app/assets/javascripts/pageflow/fullscreen.js +24 -0
- data/app/assets/javascripts/pageflow/highlighted_page.js +48 -0
- data/app/assets/javascripts/pageflow/history.js +50 -18
- data/app/assets/javascripts/pageflow/history/hash_adapter.js +36 -0
- data/app/assets/javascripts/pageflow/history/push_state_adapter.js +37 -0
- data/app/assets/javascripts/pageflow/history/simulated_adapter.js +44 -0
- data/app/assets/javascripts/pageflow/media_player.js +25 -0
- data/app/assets/javascripts/pageflow/media_player/async_play.js +54 -0
- data/app/assets/javascripts/pageflow/media_player/hooks.js +24 -0
- data/app/assets/javascripts/pageflow/media_player/load_waiting.js +11 -0
- data/app/assets/javascripts/pageflow/media_player/volume_binding.js +72 -0
- data/app/assets/javascripts/pageflow/media_player/volume_fading.js +62 -0
- data/app/assets/javascripts/pageflow/multimedia_alert.js +13 -0
- data/app/assets/javascripts/pageflow/object.js +14 -0
- data/app/assets/javascripts/pageflow/page_transitions.js +27 -0
- data/app/assets/javascripts/pageflow/page_type.js +6 -0
- data/app/assets/javascripts/pageflow/page_types/audio.js +17 -21
- data/app/assets/javascripts/pageflow/page_types/background_video.js +18 -17
- data/app/assets/javascripts/pageflow/page_types/mixins/common_page_css_classes.js +29 -4
- data/app/assets/javascripts/pageflow/page_types/video.js +73 -36
- data/app/assets/javascripts/pageflow/preload.js +9 -6
- data/app/assets/javascripts/pageflow/ready.js +18 -14
- data/app/assets/javascripts/pageflow/seed_entry_data.js +43 -0
- data/app/assets/javascripts/pageflow/settings.js +17 -4
- data/app/assets/javascripts/pageflow/slideshow.js +103 -23
- data/app/assets/javascripts/pageflow/slideshow/adjacent_pages.js +26 -0
- data/app/assets/javascripts/pageflow/slideshow/adjacent_preparer.js +44 -0
- data/app/assets/javascripts/pageflow/slideshow/atmo.js +105 -0
- data/app/assets/javascripts/pageflow/slideshow/dom_order_scroll_navigator.js +29 -0
- data/app/assets/javascripts/pageflow/slideshow/lazy_page_widget.js +49 -0
- data/app/assets/javascripts/pageflow/slideshow/page_widget.js +60 -26
- data/app/assets/javascripts/pageflow/slideshow/progressive_preload.js +16 -7
- data/app/assets/javascripts/pageflow/slideshow/scroll_indicator_widget.js +45 -7
- data/app/assets/javascripts/pageflow/slideshow/scroller_widget.js +42 -5
- data/app/assets/javascripts/pageflow/ui.js +1 -0
- data/app/assets/javascripts/pageflow/ui/object.js +4 -13
- data/app/assets/javascripts/pageflow/ui/utils/i18n_utils.js +23 -0
- data/app/assets/javascripts/pageflow/ui/views/collection_view.js +8 -4
- data/app/assets/javascripts/pageflow/ui/views/configuration_editor_tab_view.js +6 -5
- data/app/assets/javascripts/pageflow/ui/views/configuration_editor_view.js +2 -11
- data/app/assets/javascripts/pageflow/ui/views/inputs/select_input_view.js +6 -1
- data/app/assets/javascripts/pageflow/ui/views/inputs/text_input_view.js +4 -0
- data/app/assets/javascripts/pageflow/ui/views/mixins/input_view.js +149 -6
- data/app/assets/javascripts/pageflow/ui/views/mixins/subview_container.js +4 -0
- data/app/assets/javascripts/pageflow/video_player.js +5 -0
- data/app/assets/javascripts/pageflow/video_player/buffer_underrun_waiting.js +1 -1
- data/app/assets/javascripts/pageflow/video_player/lazy.js +8 -4
- data/app/assets/javascripts/pageflow/video_player/media_events.js +1 -1
- data/app/assets/javascripts/pageflow/video_player/play_button_patch.js +1 -1
- data/app/assets/javascripts/pageflow/video_player/prebuffering.js +1 -1
- data/app/assets/javascripts/pageflow/widgets/fullscreen_button.js +26 -0
- data/app/assets/javascripts/pageflow/widgets/multimedia_alert.js +21 -5
- data/app/assets/javascripts/pageflow/widgets/mute_button.js +42 -0
- data/app/assets/javascripts/pageflow/widgets/navigation.js +5 -78
- data/app/assets/javascripts/pageflow/widgets/navigation_mobile.js +4 -0
- data/app/assets/javascripts/pageflow/widgets/page_navigation_list.js +28 -34
- data/app/assets/javascripts/pageflow/widgets/parent_page_button.js +27 -0
- data/app/assets/javascripts/pageflow/widgets/skip_page_button.js +22 -0
- data/app/assets/javascripts/pageflow/widgets/top_button.js +6 -7
- data/app/assets/javascripts/pageflow/widgets/volume_slider.js +62 -0
- data/app/assets/stylesheets/pageflow/admin/entries.css.scss +10 -0
- data/app/assets/stylesheets/pageflow/animations.css.scss +1 -0
- data/app/assets/stylesheets/pageflow/animations/loading.css.scss +8 -0
- data/app/assets/stylesheets/pageflow/animations/scroll.css.scss +18 -0
- data/app/assets/stylesheets/pageflow/base.css.scss +3 -1
- data/app/assets/stylesheets/pageflow/delayed_text_fade_in.css.scss +49 -0
- data/app/assets/stylesheets/pageflow/editor/base.css.scss +15 -2
- data/app/assets/stylesheets/pageflow/editor/disabled_atmo_indicator.css.scss +13 -0
- data/app/assets/stylesheets/pageflow/editor/drop_down_button.css.scss +54 -0
- data/app/assets/stylesheets/pageflow/editor/files_explorer.css.scss +6 -0
- data/app/assets/stylesheets/pageflow/editor/indicators.css.scss +5 -0
- data/app/assets/stylesheets/pageflow/editor/inputs.css.scss +1 -0
- data/app/assets/stylesheets/pageflow/editor/inputs/reference.css.scss +51 -0
- data/app/assets/stylesheets/pageflow/editor/list.css.scss +108 -0
- data/app/assets/stylesheets/pageflow/editor/loading.css.scss +31 -0
- data/app/assets/stylesheets/pageflow/editor/outline.css.scss +7 -5
- data/app/assets/stylesheets/pageflow/editor/page_links.css.scss +58 -0
- data/app/assets/stylesheets/pageflow/editor/page_selection.css.scss +39 -0
- data/app/assets/stylesheets/pageflow/editor/publish_entry.css.scss +38 -1
- data/app/assets/stylesheets/pageflow/entries.css.scss +17 -9
- data/app/assets/stylesheets/pageflow/navigation_bar.css.scss +4 -0
- data/app/assets/stylesheets/pageflow/page_transitions.css.scss +10 -0
- data/app/assets/stylesheets/pageflow/page_transitions/crossfade.css.scss +29 -0
- data/app/assets/stylesheets/pageflow/page_transitions/cut.css.scss +23 -0
- data/app/assets/stylesheets/pageflow/page_transitions/fade.css.scss +78 -0
- data/app/assets/stylesheets/pageflow/page_transitions/fade_to_black.css.scss +107 -0
- data/app/assets/stylesheets/pageflow/page_transitions/scroll.css.scss +20 -0
- data/app/assets/stylesheets/pageflow/page_transitions/scroll_in.css.scss +66 -0
- data/app/assets/stylesheets/pageflow/page_transitions/scroll_in_right.css.scss +68 -0
- data/app/assets/stylesheets/pageflow/page_transitions/scroll_left.css.scss +20 -0
- data/app/assets/stylesheets/pageflow/page_transitions/scroll_right.css.scss +20 -0
- data/app/assets/stylesheets/pageflow/page_types.css.scss +1 -3
- data/app/assets/stylesheets/pageflow/page_types/video.css.scss +0 -4
- data/app/assets/stylesheets/pageflow/slideshow.css.scss +0 -145
- data/app/assets/stylesheets/pageflow/text_variants.css.scss +0 -4
- data/app/assets/stylesheets/pageflow/themes/default/navigation.css.scss +0 -3
- data/app/controllers/concerns/pageflow/public_https_mode.rb +13 -0
- data/app/controllers/pageflow/application_controller.rb +0 -6
- data/app/controllers/pageflow/chapters_controller.rb +2 -1
- data/app/controllers/pageflow/editor/entries_controller.rb +2 -0
- data/app/controllers/pageflow/editor/entry_publications_controller.rb +3 -1
- data/app/controllers/pageflow/entries_controller.rb +16 -3
- data/app/controllers/pageflow/files_controller.rb +3 -1
- data/app/helpers/pageflow/admin/features_helper.rb +25 -0
- data/app/helpers/pageflow/background_image_helper.rb +40 -9
- data/app/helpers/pageflow/entries_helper.rb +10 -11
- data/app/helpers/pageflow/entry_json_seed_helper.rb +44 -0
- data/app/helpers/pageflow/help_entries_helper.rb +4 -4
- data/app/helpers/pageflow/page_types_helper.rb +4 -2
- data/app/helpers/pageflow/pages_helper.rb +20 -27
- data/app/helpers/pageflow/widgets_helper.rb +4 -4
- data/app/models/concerns/pageflow/feature_target.rb +37 -0
- data/app/models/pageflow/account.rb +2 -0
- data/app/models/pageflow/chapter.rb +6 -0
- data/app/models/pageflow/draft_entry.rb +2 -0
- data/app/models/pageflow/entry.rb +47 -9
- data/app/models/pageflow/entry_duplicate.rb +51 -0
- data/app/models/pageflow/image_file.rb +33 -13
- data/app/models/pageflow/page.rb +2 -2
- data/app/models/pageflow/published_entry.rb +7 -1
- data/app/views/admin/accounts/_form.html.erb +11 -1
- data/app/views/admin/features/_form.html.erb +16 -0
- data/app/views/components/pageflow/admin/features_tab.rb +10 -0
- data/app/views/components/pageflow/admin/revisions_tab.rb +4 -0
- data/app/views/layouts/pageflow/_meta_tags.html.erb +1 -1
- data/app/views/layouts/pageflow/application.html.erb +2 -2
- data/app/views/pageflow/editor/accounts/_account.json.jbuilder +1 -0
- data/app/views/pageflow/editor/entries/_entry.json.jbuilder +2 -1
- data/app/views/pageflow/editor/entries/_help_entries_seed.html.erb +2 -2
- data/app/views/pageflow/editor/entries/_indicators_seed.html.erb +3 -0
- data/app/views/pageflow/editor/entries/seed.json.erb +3 -2
- data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +1 -0
- data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +1 -1
- data/app/views/pageflow/editor/themings/_theming.json.jbuilder +4 -0
- data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +1 -0
- data/app/views/pageflow/entries/_entry.html.erb +4 -3
- data/app/views/pageflow/entries/_indicators.html.erb +13 -0
- data/app/views/pageflow/entries/_mobile_navigation.html.erb +3 -15
- data/app/views/pageflow/entries/edit.html.erb +9 -1
- data/app/views/pageflow/entries/navigation/_bar_top.html.erb +3 -15
- data/app/views/pageflow/entries/share_menu/_facebook_link.html.erb +12 -0
- data/app/views/pageflow/entries/share_menu/_google_link.html.erb +12 -0
- data/app/views/pageflow/entries/share_menu/_twitter_link.html.erb +12 -0
- data/app/views/pageflow/entries/show.css.erb +12 -2
- data/app/views/pageflow/entries/show.html.erb +5 -1
- data/app/views/pageflow/page_types/_page_type.json.jbuilder +7 -1
- data/app/views/pageflow/pages/_page.html.erb +2 -2
- data/app/views/pageflow/pages/templates/_audio.html.erb +10 -0
- data/config/initializers/admin_resource_tabs.rb +1 -0
- data/config/initializers/features.rb +9 -0
- data/config/initializers/page_type_helpers.rb +1 -1
- data/config/initializers/paperclip.rb +1 -1
- data/config/initializers/zencoder.rb +1 -1
- data/config/locales/de.yml +132 -71
- data/config/locales/en.yml +118 -191
- data/db/migrate/20141211110226_add_configuration_to_chapters.rb +5 -0
- data/db/migrate/20150115175116_add_features_configuration_to_accounts.rb +5 -0
- data/db/migrate/20150115175207_add_features_configuration_to_entries.rb +5 -0
- data/db/migrate/20150603091823_add_password_attributes_to_revisions.rb +6 -0
- data/db/migrate/20151022080518_add_first_published_at_to_entries.rb +14 -0
- data/lib/generators/pageflow/initializer/templates/pageflow.rb +26 -17
- data/lib/generators/pageflow/theme/theme_generator.rb +2 -1
- data/lib/pageflow.rb +2 -46
- data/lib/pageflow/admin/form_input.rb +18 -0
- data/lib/pageflow/admin/form_inputs.rb +41 -0
- data/lib/pageflow/built_in_page_type.rb +0 -4
- data/lib/pageflow/configuration.rb +74 -18
- data/lib/pageflow/feature.rb +33 -0
- data/lib/pageflow/features.rb +68 -0
- data/lib/pageflow/global_config_api.rb +118 -0
- data/lib/pageflow/page_type_feature.rb +21 -0
- data/lib/pageflow/page_types.rb +29 -0
- data/lib/pageflow/theme.rb +20 -0
- data/lib/pageflow/themes.rb +26 -0
- data/lib/pageflow/version.rb +1 -1
- data/spec/factories/entries.rb +6 -0
- data/spec/factories/feature_targets.rb +4 -0
- data/spec/fixtures/image.gif +0 -0
- data/spec/fixtures/video.mp4 +0 -0
- data/vendor/assets/javascripts/audio5.min.js +12 -8
- data/vendor/assets/javascripts/iscroll.js +1 -1
- metadata +144 -24
- data/app/assets/images/pageflow/internal_links_pictogram.png +0 -0
- data/app/assets/images/pageflow/internal_links_pictogram_small.png +0 -0
- data/app/assets/images/pageflow/internal_links_sprite.png +0 -0
- data/app/assets/images/pageflow/ov-internal_links.png +0 -0
- data/app/assets/images/pageflow/themes/default/internal_links_sprite.png +0 -0
- data/app/assets/javascripts/pageflow/editor/templates/embedded/page_link.jst.ejs +0 -3
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/internal_links.js +0 -24
- data/app/assets/javascripts/pageflow/editor/views/draggable_page_item_view.js +0 -31
- data/app/assets/javascripts/pageflow/editor/views/embedded/page_link_embedded_view.js +0 -176
- data/app/assets/javascripts/pageflow/features/video.js +0 -16
- data/app/assets/javascripts/pageflow/page_types/internal_links.js +0 -55
- data/app/assets/javascripts/pageflow/ui/templates/inputs/page_reference.jst.ejs +0 -6
- data/app/assets/javascripts/pageflow/ui/views/inputs/page_reference_input_view.js +0 -44
- data/app/assets/stylesheets/pageflow/editor/embedded.css.scss +0 -104
- data/app/assets/stylesheets/pageflow/page_types/internal_links.css.scss +0 -222
- 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.
|
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.
|
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);
|
@@ -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,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
|
+
};
|