pageflow 0.4.0 → 0.5.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 (145) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/images/pageflow/audio_loop_pictogram.png +0 -0
  3. data/app/assets/images/pageflow/audio_loop_pictogram_small.png +0 -0
  4. data/app/assets/images/pageflow/ov-internal_links.png +0 -0
  5. data/app/assets/images/pageflow/placeholder_link_thumbnail.jpg +0 -0
  6. data/app/assets/images/pageflow/placeholder_link_thumbnail_large.jpg +0 -0
  7. data/app/assets/images/pageflow/placeholder_thumbnail.jpg +0 -0
  8. data/app/assets/javascripts/pageflow/audio_player.js +5 -0
  9. data/app/assets/javascripts/pageflow/editor/api.js +4 -0
  10. data/app/assets/javascripts/pageflow/editor/api/file_type.js +32 -0
  11. data/app/assets/javascripts/pageflow/editor/api/file_types.js +73 -0
  12. data/app/assets/javascripts/pageflow/editor/base.js +5 -0
  13. data/app/assets/javascripts/pageflow/editor/collections/file_usages_collection.js +13 -1
  14. data/app/assets/javascripts/pageflow/editor/collections/files_collection.js +54 -0
  15. data/app/assets/javascripts/pageflow/editor/controllers/sidebar_controller.js +2 -14
  16. data/app/assets/javascripts/pageflow/editor/initializers/error_listener.js +8 -0
  17. data/app/assets/javascripts/pageflow/editor/initializers/setup_collections.js +5 -3
  18. data/app/assets/javascripts/pageflow/editor/initializers/setup_file_types.js +21 -0
  19. data/app/assets/javascripts/pageflow/editor/models/audio_file.js +1 -15
  20. data/app/assets/javascripts/pageflow/editor/models/encoded_file.js +32 -0
  21. data/app/assets/javascripts/pageflow/editor/models/entry.js +29 -63
  22. data/app/assets/javascripts/pageflow/editor/models/file_stage.js +7 -6
  23. data/app/assets/javascripts/pageflow/editor/models/hosted_file.js +20 -0
  24. data/app/assets/javascripts/pageflow/editor/models/image_file.js +8 -31
  25. data/app/assets/javascripts/pageflow/editor/models/mixins/file_with_type.js +3 -0
  26. data/app/assets/javascripts/pageflow/editor/models/mixins/stage_provider.js +11 -5
  27. data/app/assets/javascripts/pageflow/editor/models/mixins/transient_references.js +5 -0
  28. data/app/assets/javascripts/pageflow/editor/models/other_entry.js +9 -3
  29. data/app/assets/javascripts/pageflow/editor/models/page.js +9 -11
  30. data/app/assets/javascripts/pageflow/editor/models/uploaded_file.js +65 -0
  31. data/app/assets/javascripts/pageflow/editor/models/video_file.js +1 -14
  32. data/app/assets/javascripts/pageflow/editor/routers/sidebar_router.js +2 -9
  33. data/app/assets/javascripts/pageflow/editor/templates/file_item.jst.ejs +1 -1
  34. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio.js +4 -0
  35. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio_loop.js +23 -0
  36. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_image.js +4 -0
  37. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_video.js +4 -0
  38. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/internal_links.js +4 -0
  39. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/video.js +4 -0
  40. data/app/assets/javascripts/pageflow/editor/views/embedded/page_link_embedded_view.js +1 -1
  41. data/app/assets/javascripts/pageflow/editor/views/explorer_file_item_view.js +2 -0
  42. data/app/assets/javascripts/pageflow/editor/views/file_item_view.js +8 -1
  43. data/app/assets/javascripts/pageflow/editor/views/file_stage_item_view.js +8 -1
  44. data/app/assets/javascripts/pageflow/editor/views/files_explorer_view.js +11 -43
  45. data/app/assets/javascripts/pageflow/editor/views/files_view.js +11 -21
  46. data/app/assets/javascripts/pageflow/editor/views/input_view.js +1 -1
  47. data/app/assets/javascripts/pageflow/editor/views/inputs/file_input_view.js +6 -0
  48. data/app/assets/javascripts/pageflow/editor/views/inputs/select_input_view.js +5 -0
  49. data/app/assets/javascripts/pageflow/editor/views/mixins/selectable_view.js +7 -5
  50. data/app/assets/javascripts/pageflow/editor/views/uploader_view.js +15 -5
  51. data/app/assets/javascripts/pageflow/page_types/audio.js +1 -1
  52. data/app/assets/javascripts/pageflow/page_types/audio_loop.js +90 -0
  53. data/app/assets/javascripts/pageflow/page_types/video.js +1 -1
  54. data/app/assets/javascripts/pageflow/ready.js +17 -2
  55. data/app/assets/javascripts/pageflow/video_player/player_buffered_patch.js +13 -2
  56. data/app/assets/stylesheets/pageflow/mixins/pageflow.css.scss +9 -0
  57. data/app/assets/stylesheets/pageflow/mixins/shadow.css.scss +12 -1
  58. data/app/assets/stylesheets/pageflow/overview.css.scss +3 -3
  59. data/app/assets/stylesheets/pageflow/page_types.css.scss +2 -0
  60. data/app/assets/stylesheets/pageflow/page_types/audio.css.scss +2 -13
  61. data/app/assets/stylesheets/pageflow/page_types/audio_loop.css.scss +0 -0
  62. data/app/assets/stylesheets/pageflow/page_types/video.css.scss +4 -0
  63. data/app/assets/stylesheets/pageflow/player_controls.css.scss +72 -6
  64. data/app/assets/stylesheets/pageflow/themes/default/navigation.css.scss +3 -0
  65. data/app/assets/stylesheets/pageflow/themes/default/overview.css.scss +3 -0
  66. data/app/controllers/pageflow/editor/files_controller.rb +11 -24
  67. data/app/controllers/pageflow/{video_files_controller.rb → files_controller.rb} +6 -2
  68. data/app/helpers/pageflow/audio_files_helper.rb +40 -0
  69. data/app/helpers/pageflow/file_thumbnails_helper.rb +18 -0
  70. data/app/helpers/pageflow/pages_helper.rb +3 -24
  71. data/app/jobs/pageflow/upload_file_to_s3_job.rb +2 -2
  72. data/app/models/concerns/pageflow/hosted_file.rb +93 -0
  73. data/app/models/pageflow/audio_file.rb +1 -12
  74. data/app/models/pageflow/draft_entry.rb +2 -11
  75. data/app/models/pageflow/image_file.rb +14 -14
  76. data/app/models/pageflow/page.rb +7 -24
  77. data/app/models/pageflow/published_entry.rb +3 -2
  78. data/app/models/pageflow/revision.rb +7 -0
  79. data/app/models/pageflow/thumbnail_file_resolver.rb +33 -0
  80. data/app/models/pageflow/video_file.rb +10 -34
  81. data/app/models/pageflow/zencoder_attachment.rb +2 -2
  82. data/app/state_machines/pageflow/encoded_file_state_machine.rb +8 -20
  83. data/app/state_machines/pageflow/image_file_state_machine.rb +4 -0
  84. data/app/views/pageflow/audio_files/_audio_file.html.erb +1 -0
  85. data/app/views/pageflow/audio_files/_script_tag.html.erb +3 -0
  86. data/app/views/pageflow/config/_editor_seeds.json.jbuilder +1 -0
  87. data/app/views/pageflow/editor/audio_files/_audio_file.json.jbuilder +0 -6
  88. data/app/views/pageflow/editor/files/_file.json.jbuilder +16 -0
  89. data/app/views/pageflow/editor/files/create.json.jbuilder +1 -1
  90. data/app/views/pageflow/editor/files/index.json.jbuilder +4 -1
  91. data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +1 -8
  92. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +0 -8
  93. data/app/views/pageflow/entries/_entry.html.erb +2 -2
  94. data/app/views/pageflow/entries/_multimedia_alert.html.erb +14 -7
  95. data/app/views/pageflow/entries/_social_meta_tags.html.erb +1 -1
  96. data/app/views/pageflow/entries/edit.html.erb +6 -4
  97. data/app/views/pageflow/entries/navigation/_bar_top.html.erb +1 -1
  98. data/app/views/pageflow/entries/navigation/_page.html.erb +2 -2
  99. data/app/views/pageflow/entries/overview/_chapter.html.erb +3 -1
  100. data/app/views/pageflow/entries/overview/_entry.html.erb +2 -1
  101. data/app/views/pageflow/entries/overview/_page.html.erb +1 -1
  102. data/app/views/pageflow/entries/show.css.erb +1 -21
  103. data/app/views/pageflow/entries/show.json.jbuilder +8 -3
  104. data/app/views/pageflow/file_types/_thumbnails.css.erb +7 -0
  105. data/app/views/pageflow/files/show.html.erb +1 -0
  106. data/app/views/pageflow/page_types/_page_type.json.jbuilder +4 -0
  107. data/app/views/pageflow/pages/templates/_audio.html.erb +6 -5
  108. data/app/views/pageflow/pages/templates/_audio_loop.html.erb +34 -0
  109. data/app/views/pageflow/video_files/_video_file.html.erb +1 -0
  110. data/config/initializers/page_type_helpers.rb +2 -2
  111. data/config/initializers/paperclip.rb +32 -0
  112. data/config/initializers/zencoder.rb +3 -3
  113. data/config/locales/activerecord.de.yml +3 -2
  114. data/config/locales/pageflow/audio.de.yml +4 -0
  115. data/config/locales/pageflow/editor/errors.de.yml +6 -0
  116. data/config/routes.rb +4 -10
  117. data/lib/generators/pageflow/initializer/templates/pageflow.rb +2 -1
  118. data/lib/pageflow.rb +5 -3
  119. data/lib/pageflow/ability_mixin.rb +2 -2
  120. data/lib/pageflow/built_in_page_type.rb +40 -7
  121. data/lib/pageflow/configuration.rb +17 -0
  122. data/lib/pageflow/file_type.rb +60 -0
  123. data/lib/pageflow/file_types.rb +25 -0
  124. data/lib/pageflow/page_type.rb +31 -0
  125. data/lib/pageflow/version.rb +1 -1
  126. data/lib/pageflow/zencoder_video_output_definition.rb +3 -3
  127. data/spec/factories/audio_files.rb +2 -2
  128. data/spec/factories/hosted_files.rb +35 -0
  129. data/spec/factories/video_files.rb +2 -2
  130. metadata +37 -18
  131. data/app/assets/images/pageflow/themes/default/logo_navi.png +0 -0
  132. data/app/assets/images/pageflow/themes/default/logo_navi_invert.png +0 -0
  133. data/app/assets/javascripts/pageflow/editor/collections/audio_files_collection.js +0 -7
  134. data/app/assets/javascripts/pageflow/editor/collections/image_files_collection.js +0 -8
  135. data/app/assets/javascripts/pageflow/editor/collections/mixins/files_collection.js +0 -42
  136. data/app/assets/javascripts/pageflow/editor/collections/video_files_collection.js +0 -8
  137. data/app/assets/javascripts/pageflow/editor/models/mixins/encoded_file.js +0 -51
  138. data/app/assets/javascripts/pageflow/editor/models/mixins/file.js +0 -31
  139. data/app/assets/javascripts/pageflow/editor/views/audio_file_item_view.js +0 -14
  140. data/app/assets/javascripts/pageflow/editor/views/image_file_item_view.js +0 -10
  141. data/app/assets/javascripts/pageflow/editor/views/video_file_item_view.js +0 -18
  142. data/app/controllers/pageflow/editor/audio_files_controller.rb +0 -11
  143. data/app/controllers/pageflow/editor/image_files_controller.rb +0 -11
  144. data/app/controllers/pageflow/editor/video_files_controller.rb +0 -11
  145. data/app/views/pageflow/video_files/show.html.erb +0 -1
@@ -37,47 +37,31 @@ pageflow.FilesExplorerView = Backbone.Marionette.ItemView.extend({
37
37
  selection: this.selection
38
38
  }));
39
39
 
40
-
41
40
  this.tabsView = new pageflow.TabsView({
42
41
  model: this.model,
43
42
  i18n: 'editor.files.tabs',
44
43
  defaultTab: this.options.tabName
45
44
  });
46
45
 
47
- this.tab('image_files', {
48
- collectionName: 'imageFiles',
49
- itemView: pageflow.ExplorerFileItemView
50
- });
51
-
52
- this.tab('video_files', {
53
- collectionName: 'videoFiles',
54
- itemView: pageflow.ExplorerFileItemView
55
- });
56
-
57
- this.tab('audio_files', {
58
- collectionName: 'audioFiles',
59
- itemView: pageflow.ExplorerFileItemView
60
- });
46
+ pageflow.editor.fileTypes.each(function(fileType) {
47
+ this.tab(fileType);
48
+ }, this);
61
49
 
62
50
  this.ui.filesPanel.append(this.subview(this.tabsView).el);
63
51
 
64
52
  this.ui.okButton.prop('disabled', true);
65
53
  },
66
54
 
67
- tab: function(name, options) {
68
- this.tabsView.tab(name, _.bind(function() {
69
- var collection = this._collection(options.collectionName),
70
- disabledIds = [];
71
-
72
- if (collection.name) { // collection.name indicates *FilesCollection
73
- disabledIds = pageflow.entry.getFileCollection(collection.fileType()).pluck('id');
74
- }
55
+ tab: function(fileType) {
56
+ this.tabsView.tab(fileType.collectionName, _.bind(function() {
57
+ var collection = this._collection(fileType);
58
+ var disabledIds = pageflow.entry.getFileCollection(fileType).pluck('id');
75
59
 
76
60
  return new pageflow.CollectionView({
77
61
  tagName: 'ul',
78
62
  className: 'files_gallery',
79
63
  collection: collection,
80
- itemViewConstructor: options.itemView,
64
+ itemViewConstructor: pageflow.ExplorerFileItemView,
81
65
  itemViewOptions: {
82
66
  selection: this.selection,
83
67
  disabledIds: disabledIds
@@ -87,12 +71,12 @@ pageflow.FilesExplorerView = Backbone.Marionette.ItemView.extend({
87
71
  }, this));
88
72
  },
89
73
 
90
- _collection: function(collectionName) {
74
+ _collection: function(fileType) {
91
75
  var collection,
92
76
  entry = this.selection.get('entry');
93
77
 
94
78
  if (entry) {
95
- collection = entry[collectionName];
79
+ collection = entry.getFileCollection(fileType);
96
80
  collection.fetch();
97
81
  } else {
98
82
  collection = new Backbone.Collection();
@@ -107,23 +91,7 @@ pageflow.FilesExplorerView = Backbone.Marionette.ItemView.extend({
107
91
  },
108
92
 
109
93
  _selectedFile: function() {
110
- var sel = this.selection,
111
- file;
112
-
113
- if ((file = sel.get('image_file'))) {
114
- file.set('typeName', 'Pageflow::ImageFile');
115
- return file;
116
- }
117
-
118
- if ((file = sel.get('audio_file'))) {
119
- file.set('typeName', 'Pageflow::AudioFile');
120
- return file;
121
- }
122
-
123
- if ((file = sel.get('video_file'))) {
124
- file.set('typeName', 'Pageflow::VideoFile');
125
- return file;
126
- }
94
+ return this.selection.get('file');
127
95
  }
128
96
  });
129
97
 
@@ -35,33 +35,23 @@ pageflow.FilesView = Backbone.Marionette.ItemView.extend({
35
35
  defaultTab: this.options.tabName
36
36
  });
37
37
 
38
- this.tab('image_files', {
39
- collection: this.model.imageFiles,
40
- itemView: pageflow.ImageFileItemView
41
- });
42
-
43
- this.tab('video_files', {
44
- collection: this.model.videoFiles,
45
- itemView: pageflow.VideoFileItemView
46
- });
47
-
48
- this.tab('audio_files', {
49
- collection: this.model.audioFiles,
50
- itemView: pageflow.AudioFileItemView
51
- });
38
+ pageflow.editor.fileTypes.each(function(fileType) {
39
+ this.tab(fileType);
40
+ }, this);
52
41
 
53
42
  this.$el.append(this.subview(this.tabsView).el);
54
43
  },
55
44
 
56
- tab: function(name, options) {
57
- this.tabsView.tab(name, _.bind(function() {
45
+ tab: function(fileType) {
46
+ this.tabsView.tab(fileType.collectionName, _.bind(function() {
58
47
  return this.subview(new pageflow.CollectionView({
59
48
  tagName: 'ul',
60
49
  className: 'files expandable',
61
- collection: options.collection,
62
- itemViewConstructor: options.itemView,
50
+ collection: pageflow.entry.getFileCollection(fileType),
51
+ itemViewConstructor: pageflow.FileItemView,
63
52
  itemViewOptions: {
64
- selectionHandler: this.options.tabName === name && this.options.selectionHandler
53
+ metaDataAttributes: fileType.metaDataAttributes,
54
+ selectionHandler: this.options.tabName === fileType.collectionName && this.options.selectionHandler
65
55
  },
66
56
  blankSlateViewConstructor: Backbone.Marionette.ItemView.extend({
67
57
  template: 'templates/files_blank_slate'
@@ -69,8 +59,8 @@ pageflow.FilesView = Backbone.Marionette.ItemView.extend({
69
59
  }));
70
60
  }, this));
71
61
 
72
- this.listenTo(this.model, 'change:uploading_' + name +'_count', function(model, value) {
73
- this.tabsView.toggleSpinnerOnTab(name, value > 0);
62
+ this.listenTo(this.model, 'change:uploading_' + fileType.collectionName +'_count', function(model, value) {
63
+ this.tabsView.toggleSpinnerOnTab(fileType.collectionName, value > 0);
74
64
  });
75
65
  },
76
66
 
@@ -57,7 +57,7 @@ pageflow.inputView = {
57
57
  }
58
58
 
59
59
  function updateVisible(model, value) {
60
- view.$el.toggle(!!value);
60
+ view.$el.toggle(view.options.visibleBindingValue ? value === view.options.visibleBindingValue : !!value);
61
61
  }
62
62
  }
63
63
  };
@@ -45,6 +45,12 @@ pageflow.FileInputView = Backbone.Marionette.ItemView.extend({
45
45
  this.options = _.extend({
46
46
  imagePositioning: true
47
47
  }, this.options);
48
+
49
+ if (typeof this.options.collection === 'string') {
50
+ this.options.collection = pageflow.entry.getFileCollection(
51
+ pageflow.editor.fileTypes.findByCollectionName(this.options.collection)
52
+ );
53
+ }
48
54
  },
49
55
 
50
56
  onRender: function() {
@@ -47,6 +47,11 @@ pageflow.SelectInputView = Backbone.Marionette.ItemView.extend({
47
47
  }, this);
48
48
 
49
49
  this.load();
50
+
51
+ if (this.options.ensureValueDefined && !this.ui.select.val()) {
52
+ this.ui.select.val(this.options.values[0]);
53
+ this.save();
54
+ }
50
55
  },
51
56
 
52
57
  save: function() {
@@ -1,19 +1,21 @@
1
1
  pageflow.selectableView = {
2
2
  initialize: function() {
3
- this.listenTo(this.options.selection, 'change:' + this.model.modelName, function(selection, selectedModel) {
3
+ this.selectionAttribute = this.selectionAttribute || this.model.modelName;
4
+
5
+ this.listenTo(this.options.selection, 'change:' + this.selectionAttribute, function(selection, selectedModel) {
4
6
  this.$el.toggleClass('active', selectedModel === this.model);
5
7
  });
6
8
 
7
- this.$el.toggleClass('active', this.options.selection.get(this.model.modelName) === this.model);
9
+ this.$el.toggleClass('active', this.options.selection.get(this.selectionAttribute) === this.model);
8
10
  },
9
11
 
10
12
  select: function() {
11
- this.options.selection.set(this.model.modelName, this.model);
13
+ this.options.selection.set(this.selectionAttribute, this.model);
12
14
  },
13
15
 
14
16
  onClose: function() {
15
- if (this.options.selection.get(this.model.modelName) === this.model) {
16
- this.options.selection.set(this.model.modelName, null);
17
+ if (this.options.selection.get(this.selectionAttribute) === this.model) {
18
+ this.options.selection.set(this.selectionAttribute, null);
17
19
  }
18
20
  }
19
21
  };
@@ -20,12 +20,22 @@ pageflow.UploaderView = Backbone.Marionette.View.extend({
20
20
  dataType: 'json',
21
21
 
22
22
  add: function(event, data) {
23
- data.record = pageflow.entry.addFile(data.files[0]);
24
- var xhr = data.submit();
23
+ try {
24
+ data.record = pageflow.entry.addFileUpload(data.files[0]);
25
+ var xhr = data.submit();
25
26
 
26
- that.listenTo(data.record, 'uploadCancelled', function() {
27
- xhr.abort();
28
- });
27
+ that.listenTo(data.record, 'uploadCancelled', function() {
28
+ xhr.abort();
29
+ });
30
+ }
31
+ catch(e) {
32
+ if (e instanceof pageflow.FileTypes.UnmatchedUploadError) {
33
+ pageflow.app.trigger('error', e);
34
+ }
35
+ else {
36
+ throw(e);
37
+ }
38
+ }
29
39
  },
30
40
 
31
41
  progress: function(event, data) {
@@ -99,7 +99,7 @@ pageflow.pageType.register('audio', _.extend({
99
99
  },
100
100
 
101
101
  _ensureAudioPlayer: function(pageElement) {
102
- this.audioPlayer = this.audioPlayer || pageflow.AudioPlayer.fromAudioTag(pageElement.find('audio'));
102
+ this.audioPlayer = this.audioPlayer || pageflow.AudioPlayer.fromScriptTag(pageElement.find('script[data-audio]'));
103
103
 
104
104
  pageElement.find('.vjs-controls').playerControls({
105
105
  player: this.audioPlayer
@@ -0,0 +1,90 @@
1
+ pageflow.pageType.register('audio_loop', _.extend({
2
+ enhance: function(pageElement, configuration) {
3
+ pageElement.find('.contentText').before(pageElement.find('.page_header'));
4
+ pageElement.find('audio').hide();
5
+ },
6
+
7
+ prepare: function(pageElement, configuration) {
8
+ },
9
+
10
+ preload: function(pageElement, configuration) {
11
+ return pageflow.preload.backgroundImage(pageElement.find('.background_image'));
12
+ },
13
+
14
+ activating: function(pageElement, configuration) {
15
+ // for SkipLinks
16
+ $('#firstContent').attr("id","");
17
+ var firstContentElement = pageElement.find('*[tabindex], a');
18
+
19
+ $(firstContentElement[0]).attr('id','firstContent');
20
+ //
21
+
22
+ this._ensureAudioPlayer(pageElement);
23
+
24
+ var that = this;
25
+
26
+ this.audioPlayer.readyPromise.then(function() {
27
+ that.audioPlayer.volume(pageflow.settings.get('volume'));
28
+ that.listenTo(pageflow.settings, "change:volume", function(model, value) {
29
+ that.fadeSound(that.audioPlayer, value, 40);
30
+ });
31
+ });
32
+ },
33
+
34
+ activated: function(pageElement, configuration) {
35
+ var that = this;
36
+ this.fadeInTimeout = setTimeout(function() {
37
+ that.audioPlayer.readyPromise.then(function() {
38
+ that.audioPlayer.volume(0);
39
+ that.audioPlayer.play();
40
+ that.fadeSound(that.audioPlayer, pageflow.settings.get('volume'), 1000);
41
+ });
42
+ }, 1000);
43
+ },
44
+
45
+ deactivating: function(pageElement, configuration) {
46
+ clearTimeout(this.fadeInTimeout);
47
+ this.fadeSound(this.audioPlayer, 0, 400);
48
+ this.stopListening();
49
+ $('body').off('keyup');
50
+ },
51
+
52
+ deactivated: function(pageElement, configuration) {
53
+ this.audioPlayer.pause();
54
+ },
55
+
56
+ update: function(pageElement, configuration) {
57
+ pageElement.find('h2 .tagline').text(configuration.get('tagline') || '');
58
+ pageElement.find('h2 .title').text(configuration.get('title') || '');
59
+ pageElement.find('h2 .subtitle').text(configuration.get('subtitle') || '');
60
+ pageElement.find('p').html(configuration.get('text') || '');
61
+
62
+ this.updateInfoBox(pageElement, configuration);
63
+ this.updateCommonPageCssClasses(pageElement, configuration);
64
+
65
+ pageElement.find('.shadow').css({
66
+ opacity: configuration.get('gradient_opacity') / 100
67
+ });
68
+
69
+ this._ensureAudioPlayer(pageElement);
70
+ this.audioPlayer.src(configuration.getAudioFileSources('audio_file_id'));
71
+ },
72
+
73
+
74
+ embeddedEditorViews: function() {
75
+ return {
76
+ '.background_image': {
77
+ view: pageflow.BackgroundImageEmbeddedView,
78
+ options: {propertyName: 'background_image_id'}
79
+ }
80
+ };
81
+ },
82
+
83
+ _ensureAudioPlayer: function(pageElement) {
84
+ this.audioPlayer = this.audioPlayer || pageflow.AudioPlayer.fromScriptTag(pageElement.find('script[data-audio]'));
85
+
86
+ pageElement.find('.vjs-controls').playerControls({
87
+ player: this.audioPlayer
88
+ });
89
+ }
90
+ }, pageflow.volumeFade, pageflow.infoBox, pageflow.commonPageCssClasses));
@@ -163,7 +163,7 @@ pageflow.pageType.register('video', _.extend({
163
163
  // alternate poster image handling
164
164
  $("<div class='vjs-poster-mobile' style='" +
165
165
  poster.attr('style') +
166
- "display:block; background-size: coverr;'></div>").appendTo(pageElement.find(".videoWrapper"));
166
+ "display:block; background-size: cover;'></div>").appendTo(pageElement.find(".videoWrapper"));
167
167
  poster.removeClass('vjs-poster').addClass('vjs-poster-mobile');
168
168
 
169
169
  // listening for exit fullscreen to force pausing
@@ -1,5 +1,5 @@
1
1
  pageflow.ready = new $.Deferred(function(readyDeferred) {
2
- window.onload = function() {
2
+ onLoadWithTimeout(function() {
3
3
  pageflow.features.detect().then(function() {
4
4
  $('body').one('pagepreloaded', function() {
5
5
  readyDeferred.resolve();
@@ -44,5 +44,20 @@ pageflow.ready = new $.Deferred(function(readyDeferred) {
44
44
  return false; }
45
45
  );
46
46
  });
47
- };
47
+ });
48
+
49
+ function onLoadWithTimeout(callback) {
50
+ var invoked = false;
51
+ var invokeOnce = function() {
52
+ clearTimeout(timeout);
53
+
54
+ if (!invoked) {
55
+ callback();
56
+ invoked = true;
57
+ }
58
+ };
59
+
60
+ var timeout = setTimeout(invokeOnce, 10000);
61
+ window.onload = invokeOnce;
62
+ }
48
63
  }).promise();
@@ -8,8 +8,8 @@ vjs.Player.prototype.buffered = function(){
8
8
 
9
9
  if (buffered && buffered.length > 0) {
10
10
  for (var i = 0; i < buffered.length; i++) {
11
- if (buffered.end(i) > max) {
12
- max = buffered.end(i);
11
+ if (getEnd(buffered, i) > max) {
12
+ max = getEnd(buffered, i);
13
13
  }
14
14
  }
15
15
 
@@ -21,6 +21,17 @@ vjs.Player.prototype.buffered = function(){
21
21
  }
22
22
 
23
23
  return vjs.createTimeRange(start, end);
24
+
25
+ function getEnd(buffered, i) {
26
+ // Firefox 32 sometimes reports negative values as start and
27
+ // end. If both are negative, treat difference as end time stamp.
28
+ if (buffered.start(i) < 0 && buffered.end(i) < 0) {
29
+ return buffered.end(i) - buffered.start(i);
30
+ }
31
+ else {
32
+ return buffered.end(i);
33
+ }
34
+ }
24
35
  };
25
36
 
26
37
  // If end is after duration return buffered percent 0
@@ -2,4 +2,13 @@
2
2
  .#{$name} .type_pictogram {
3
3
  background-image: image-url("pageflow/#{$name}_pictogram_small.png");
4
4
  }
5
+ }
6
+
7
+ @mixin pageflow-hosted-file-stage($stage-name) {
8
+ .editor {
9
+ .file_thumbnail .pictogram.#{$stage-name},
10
+ .file_stage_item.#{$stage-name} {
11
+ @content;
12
+ }
13
+ }
5
14
  }
@@ -31,7 +31,7 @@
31
31
  background: linear-gradient(to right, rgba($color,0) 0%,rgba($color,1) 100%); /* W3C */
32
32
  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#{ie_hex_str(rgba($color, 0))}', endColorstr='#{ie_hex_str(rgba($color, 1))}',GradientType=1 ); /* IE6-9 */
33
33
 
34
- @include mobile {
34
+ @include pad_portrait {
35
35
  /* IE9 SVG, needs conditional override of 'filter' to 'none' */
36
36
  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjgiLz4KICAgIDxzdG9wIG9mZnNldD0iNjYlIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuNCIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZ3JhZC11Y2dnLWdlbmVyYXRlZCkiIC8+Cjwvc3ZnPg==);
37
37
  background: -moz-linear-gradient(left, rgba($color,0) 0%, rgba($color,0.4) 33%, rgba($color,0.8) 100%); /* FF3.6+ */
@@ -42,4 +42,15 @@
42
42
  background: linear-gradient(to right, rgba($color,0) 0%,rgba($color,0.4) 33%,rgba($color,0.8) 100%); /* W3C */
43
43
  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#{ie_hex_str(rgba($color, 0))}', endColorstr='#{ie_hex_str(rgba($color, 1))}',GradientType=1 ); /* IE6-8 */
44
44
  }
45
+ @include phone {
46
+ /* IE9 SVG, needs conditional override of 'filter' to 'none' */
47
+ background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjgiLz4KICAgIDxzdG9wIG9mZnNldD0iNjYlIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuNCIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZ3JhZC11Y2dnLWdlbmVyYXRlZCkiIC8+Cjwvc3ZnPg==);
48
+ background: -moz-linear-gradient(left, rgba($color,0.8) 0%, rgba($color,0.4) 66%, rgba($color,0) 100%); /* FF3.6+ */
49
+ background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba($color,0.8)), color-stop(66%,rgba($color,0.4)), color-stop(100%,rgba($color,0))); /* Chrome,Safari4+ */
50
+ background: -webkit-linear-gradient(left, rgba($color,0.8) 0%,rgba($color,0.4) 66%,rgba($color,0) 100%); /* Chrome10+,Safari5.1+ */
51
+ background: -o-linear-gradient(left, rgba($color,0.8) 0%,rgba($color,0.4) 66%,rgba($color,0) 100%); /* Opera 11.10+ */
52
+ background: -ms-linear-gradient(left, rgba($color,0.8) 0%,rgba($color,0.4) 66%,rgba($color,0) 100%); /* IE10+ */
53
+ background: linear-gradient(to right, rgba($color,0.8) 0%,rgba($color,0.4) 66%,rgba($color,0) 100%); /* W3C */
54
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#{ie_hex_str(rgba($color, 1))}', endColorstr='#{ie_hex_str(rgba($color, 0))}',GradientType=1 ); /* IE6-8 */
55
+ }
45
56
  }