pageflow-linkmap-page 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.jshintignore +1 -0
  4. data/.jshintrc +23 -0
  5. data/CHANGELOG.md +8 -0
  6. data/Gemfile +18 -0
  7. data/README.md +62 -0
  8. data/Rakefile +11 -0
  9. data/app/assets/images/pageflow/linkmap_page/text_only_area_type_pictogram.png +0 -0
  10. data/app/assets/images/pageflow/linkmap_page/themes/default/pictograms/sprite.png +0 -0
  11. data/app/assets/images/pageflow/linkmap_page/themes/default/pictograms/wide.png +0 -0
  12. data/app/assets/images/pageflow/linkmap_page_pictogram.png +0 -0
  13. data/app/assets/images/pageflow/linkmap_page_pictogram_small.png +0 -0
  14. data/app/assets/javascript/pageflow/linkmap_page.js +9 -0
  15. data/app/assets/javascript/pageflow/linkmap_page/editor.js +25 -0
  16. data/app/assets/javascript/pageflow/linkmap_page/editor/collections/areas_collection.js +57 -0
  17. data/app/assets/javascript/pageflow/linkmap_page/editor/collections/page_links_collection.js +29 -0
  18. data/app/assets/javascript/pageflow/linkmap_page/editor/config.js +51 -0
  19. data/app/assets/javascript/pageflow/linkmap_page/editor/controllers/side_bar_controller.js +15 -0
  20. data/app/assets/javascript/pageflow/linkmap_page/editor/models/area.js +79 -0
  21. data/app/assets/javascript/pageflow/linkmap_page/editor/models/area_file_selection_handler.js +12 -0
  22. data/app/assets/javascript/pageflow/linkmap_page/editor/models/audio_file_area_type.js +17 -0
  23. data/app/assets/javascript/pageflow/linkmap_page/editor/models/external_link_area_type.js +19 -0
  24. data/app/assets/javascript/pageflow/linkmap_page/editor/models/new_area_file_selection_handler.js +11 -0
  25. data/app/assets/javascript/pageflow/linkmap_page/editor/models/page_configuration_mixin.js +33 -0
  26. data/app/assets/javascript/pageflow/linkmap_page/editor/models/page_link_area_type.js +29 -0
  27. data/app/assets/javascript/pageflow/linkmap_page/editor/models/text_only_area_type.js +15 -0
  28. data/app/assets/javascript/pageflow/linkmap_page/editor/routers/side_bar_router.js +5 -0
  29. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/edit_area.jst.ejs +3 -0
  30. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_item.jst.ejs +11 -0
  31. data/app/assets/javascript/pageflow/linkmap_page/editor/views/areas_list_view.js +44 -0
  32. data/app/assets/javascript/pageflow/linkmap_page/editor/views/configuration_editor_view.js +90 -0
  33. data/app/assets/javascript/pageflow/linkmap_page/editor/views/edit_area_view.js +103 -0
  34. data/app/assets/javascript/pageflow/linkmap_page/editor/views/editable_areas_mode_view.js +10 -0
  35. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_item_embedded_view.js +190 -0
  36. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/areas_embedded_view.js +26 -0
  37. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/panorama_embedded_view.js +14 -0
  38. data/app/assets/javascript/pageflow/linkmap_page/features.js +9 -0
  39. data/app/assets/javascript/pageflow/linkmap_page/page_type.js +302 -0
  40. data/app/assets/javascript/pageflow/linkmap_page/vendor/gyro.js +3 -0
  41. data/app/assets/javascript/pageflow/linkmap_page/widgets/hover_video.js +77 -0
  42. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap.js +112 -0
  43. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_audio_player_controls.js +132 -0
  44. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_audio_players_controller.js +48 -0
  45. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_lookaround.js +154 -0
  46. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_lookaround_strategies/target_speed.js +99 -0
  47. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_panorama.js +421 -0
  48. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_scroll_indicators.js +17 -0
  49. data/app/assets/stylesheets/pageflow/linkmap_page.css.scss +266 -0
  50. data/app/assets/stylesheets/pageflow/linkmap_page/animations/rotate.css.scss +8 -0
  51. data/app/assets/stylesheets/pageflow/linkmap_page/audio_player_controls.scss +134 -0
  52. data/app/assets/stylesheets/pageflow/linkmap_page/editor.css.scss +122 -0
  53. data/app/assets/stylesheets/pageflow/linkmap_page/editor/areas_list.scss +15 -0
  54. data/app/assets/stylesheets/pageflow/linkmap_page/editor/file_areas.css.scss +70 -0
  55. data/app/assets/stylesheets/pageflow/linkmap_page/editor/resizable.css.scss +80 -0
  56. data/app/assets/stylesheets/pageflow/linkmap_page/themes/default.css.scss +341 -0
  57. data/app/assets/stylesheets/pageflow/linkmap_page/themes/default/scroll_indicators.scss +82 -0
  58. data/app/controllers/pageflow/external_links/sites_controller.rb +40 -0
  59. data/app/helpers/pageflow/linkmap_page/areas_helper.rb +93 -0
  60. data/app/models/pageflow/linkmap_page/site.rb +11 -0
  61. data/app/views/pageflow/linkmap_page/areas/_div.html.erb +33 -0
  62. data/app/views/pageflow/linkmap_page/page.html +51 -0
  63. data/config/locales/de.yml +119 -0
  64. data/config/locales/en.yml +119 -0
  65. data/config/locales/new/inverted.de.yml +10 -0
  66. data/config/locales/new/inverted.en.yml +10 -0
  67. data/config/locales/new/text_only_area_type.de.yml +11 -0
  68. data/config/locales/new/text_only_area_type.en.yml +11 -0
  69. data/config/routes.rb +5 -0
  70. data/config/spring.rb +1 -0
  71. data/exec/rspec +15 -0
  72. data/exec/spring +18 -0
  73. data/lib/pageflow-linkmap-page.rb +13 -0
  74. data/lib/pageflow/linkmap_page/engine.rb +17 -0
  75. data/lib/pageflow/linkmap_page/page_type.rb +19 -0
  76. data/lib/pageflow/linkmap_page/plugin.rb +9 -0
  77. data/lib/pageflow/linkmap_page/version.rb +5 -0
  78. data/pageflow-linkmap-page.gemspec +37 -0
  79. data/spec/helpers/pageflow/linkmap_page/areas_helper_spec.rb +68 -0
  80. data/spec/spec_helper.rb +15 -0
  81. metadata +265 -0
@@ -0,0 +1,26 @@
1
+ pageflow.linkmapPage.AreasEmbeddedView = Backbone.Marionette.View.extend({
2
+ render: function() {
3
+ this.subview(new pageflow.CollectionView({
4
+ el: this.$el,
5
+ collection: this.model.linkmapAreas(this.options.propertyName),
6
+ itemViewConstructor: pageflow.linkmapPage.AreaItemEmbeddedView,
7
+ itemViewOptions: {
8
+ pageConfiguration: this.model,
9
+ page: this.model.page,
10
+ container: this.options.container
11
+ }
12
+ }));
13
+
14
+ this.listenTo(this.model.page, 'change:areas_editable', function() {
15
+ this.updateClassName();
16
+ });
17
+
18
+ return this;
19
+ },
20
+
21
+ updateClassName: function() {
22
+ var editable = this.model.page.get('areas_editable');
23
+
24
+ this.$el.toggleClass('editable', !!editable);
25
+ }
26
+ });
@@ -0,0 +1,14 @@
1
+ pageflow.linkmapPage.PanoramaEmbeddedView = Backbone.Marionette.View.extend({
2
+ render: function() {
3
+ this.listenTo(this.model.page, 'change:' + this.options.disableMarginScrollingPropertyName, function(model, disabled) {
4
+ if (disabled) {
5
+ this.$el.linkmapLookaround('disable');
6
+ }
7
+ else {
8
+ this.$el.linkmapLookaround('enable');
9
+ }
10
+ });
11
+
12
+ return this;
13
+ }
14
+ });
@@ -0,0 +1,9 @@
1
+ pageflow.features.register('slideshow', 'page_type.linkmap_page', function() {
2
+ pageflow.linkmapPage.visitedPages = [];
3
+
4
+ pageflow.events.on('page:change', function(page) {
5
+ if (pageflow.linkmapPage.visitedPages.indexOf(page.getPermaId()) < 0) {
6
+ pageflow.linkmapPage.visitedPages.push(page.getPermaId());
7
+ }
8
+ });
9
+ });
@@ -0,0 +1,302 @@
1
+ pageflow.pageType.register('linkmap_page', _.extend({
2
+ scrollerOptions: {
3
+ freeScroll: true,
4
+ scrollX: true,
5
+ noMouseWheelScrollX: true
6
+ },
7
+
8
+ noHideTextOnSwipe: true,
9
+
10
+ enhance: function(pageElement, configuration) {
11
+ this.setupPanoramaBackground(pageElement, configuration);
12
+ this.setupHoverImages(pageElement, configuration);
13
+ this.setupVideoPlayer(pageElement);
14
+
15
+ this.content = pageElement.find('.scroller');
16
+ this.panorama = pageElement.find('.panorama');
17
+
18
+ this.content.linkmapPanorama({
19
+ page: pageElement,
20
+ panorama: function() {
21
+ return pageElement.find('.panorama.active');
22
+ },
23
+ scroller: this.scroller,
24
+ activeAreasSelector: '.linkmap_areas > *',
25
+ limitScrolling: configuration.limit_scrolling,
26
+ addEnvironment: configuration.add_environment,
27
+ marginScrollingDisabled: configuration.margin_scrolling_disabled,
28
+ startScrollPosition: this.getPanoramaStartScrollPosition(configuration)
29
+ });
30
+
31
+ this.content.linkmapLookaround({
32
+ scroller: this.scroller,
33
+ marginScrollingDisabled: configuration.margin_scrolling_disabled
34
+ });
35
+
36
+ pageElement.find('.linkmap_page').linkmapScrollIndicators({
37
+ scroller: this.scroller
38
+ });
39
+
40
+ pageElement.find('.hover_video').linkmapHoverVideo({
41
+ video: pageElement.find('.panorama_video')
42
+ });
43
+
44
+ this.linkmapAreas = pageElement.find('.linkmap_areas');
45
+ this.linkmapAreas.linkmap({
46
+ baseImage: function() {
47
+ return pageElement.find('.panorama.active');
48
+ },
49
+
50
+ hoverVideo: pageElement.find('.hover_video').linkmapHoverVideo('instance'),
51
+ hoverVideoEnabled: configuration.background_type === 'hover_video'
52
+ });
53
+
54
+ this.setupPageLinkAreas(pageElement);
55
+ this.setupAudioFileAreas(pageElement, configuration);
56
+ this.setupTextOnlyAreas(pageElement);
57
+ },
58
+
59
+ getPanoramaStartScrollPosition: function(configuration) {
60
+ function getRatio(attributeName) {
61
+ if (attributeName in configuration) {
62
+ return configuration[attributeName] / 100;
63
+ }
64
+ else {
65
+ return 0.5;
66
+ }
67
+ }
68
+
69
+ if (configuration.background_type === 'video') {
70
+ return {
71
+ x: getRatio('panorama_video_x'),
72
+ y: getRatio('panorama_video_y')
73
+ };
74
+ }
75
+ else {
76
+ return {
77
+ x: getRatio('panorama_image_x'),
78
+ y: getRatio('panorama_image_y')
79
+ };
80
+ }
81
+ },
82
+
83
+ setupPanoramaBackground: function(pageElement, configuration) {
84
+ pageElement.find('.panorama_image')
85
+ .toggleClass('active', !this.isBackgroundVideoEnabled(configuration));
86
+
87
+ pageElement.find('.panorama_video')
88
+ .toggleClass('active', this.isBackgroundVideoEnabled(configuration));
89
+ },
90
+
91
+ setupHoverImages: function(pageElement, configuration) {
92
+ pageElement.find('.hover_image')
93
+ .toggle(!this.isHoverVideoEnabled(configuration));
94
+ },
95
+
96
+ setupVideoPlayer: function(pageElement) {
97
+ var wrapper = pageElement.find('.panorama_video');
98
+ var template = wrapper.find('[data-template=video]');
99
+
100
+ wrapper
101
+ .attr('data-width', template.data('videoWidth'))
102
+ .attr('data-height', template.data('videoHeight'));
103
+
104
+ this.videoPlayer = new pageflow.VideoPlayer.Lazy(template, {
105
+ volumeFading: true,
106
+
107
+ width: '100%',
108
+ height: '100%'
109
+ });
110
+
111
+ wrapper.data('videoPlayer', this.videoPlayer);
112
+ },
113
+
114
+ setupPageLinkAreas: function(pageElement) {
115
+ pageElement.on('click', '[data-target-type="page"]', function(e) {
116
+ var area = $(this);
117
+
118
+ pageflow.slides.goToByPermaId(area.data('targetId'), {
119
+ transition: area.data('pageTransition')
120
+ });
121
+ return false;
122
+ });
123
+ },
124
+
125
+ setupAudioFileAreas: function(pageElement, configuration) {
126
+ this.multiPlayer = pageflow.audio.createMultiPlayer({
127
+ playFromBeginning: true,
128
+ fadeDuration: 1000,
129
+ hooks: pageflow.atmo.createMediaPlayerHooks(configuration)
130
+ });
131
+
132
+ pageElement.linkmapAudioPlayersController({
133
+ player: this.multiPlayer
134
+ });
135
+
136
+ pageElement.find('[data-target-type="audio_file"]').linkmapAudioPlayerControls();
137
+ },
138
+
139
+ setupTextOnlyAreas: function(pageElement) {
140
+ pageElement.on('click', '[data-target-type="text_only"]', function(e) {
141
+ return false;
142
+ });
143
+ },
144
+
145
+ resize: function(pageElement, configuration) {
146
+ this.content.linkmapPanorama('refresh');
147
+ this.linkmapAreas.linkmap('refresh');
148
+ },
149
+
150
+ prepare: function(pageElement, configuration) {
151
+ if (this.isVideoEnabled(configuration)) {
152
+ return this.videoPlayer.ensureCreated();
153
+ }
154
+ },
155
+
156
+ unprepare: function(pageElement, configuration) {
157
+ if (this.isVideoEnabled(configuration)) {
158
+ return this.videoPlayer.scheduleDispose();
159
+ }
160
+ },
161
+
162
+ linkedPages: function(pageElement, configuration) {
163
+ return _(configuration.linkmap_areas)
164
+ .select(function(area) {
165
+ return area.target_type === 'page';
166
+ })
167
+ .map(function(area) {
168
+ return area.target_id;
169
+ });
170
+ },
171
+
172
+ preload: function(pageElement, configuration) {
173
+ return pageflow.preload.backgroundImage(pageElement.find('.background_image'));
174
+ },
175
+
176
+ activating: function(pageElement, configuration) {
177
+ if (this.isVideoEnabled(configuration)) {
178
+ this.playVideo(configuration);
179
+ }
180
+
181
+ this.content.linkmapPanorama('refresh');
182
+ this.linkmapAreas.linkmap('refresh');
183
+
184
+ this.content.linkmapLookaround('activate');
185
+ this.content.linkmapPanorama('resetScrollPosition');
186
+
187
+ this.content.linkmapPanorama('resetAreaHighlighting');
188
+ },
189
+
190
+ activated: function(pageElement, configuration) {
191
+ this.content.linkmapPanorama('highlightAreas');
192
+ },
193
+
194
+ deactivating: function(pageElement, configuration) {
195
+ this.multiPlayer.pause();
196
+
197
+ this.content.linkmapLookaround('deactivate');
198
+ },
199
+
200
+ deactivated: function(pageElement, configuration) {
201
+ if (this.isVideoEnabled(configuration)) {
202
+ this.pauseVideo(configuration);
203
+ }
204
+ },
205
+
206
+ update: function(pageElement, configuration) {
207
+ this.setupDefaultAreaPositions(configuration);
208
+ this.setupPanoramaBackground(pageElement, configuration.attributes);
209
+ this.updateCommonPageCssClasses(pageElement, configuration);
210
+
211
+ this.linkmapAreas.linkmap('updateHoverVideoEnabled', configuration.get('background_type') === 'hover_video');
212
+
213
+ this.afterEmbeddedViewsUpdate(function() {
214
+ var minScaling = false;
215
+
216
+ this.content.linkmapPanorama('update',
217
+ configuration.get('add_environment'),
218
+ configuration.get('limit_scrolling'),
219
+ this.getPanoramaStartScrollPosition(configuration.attributes),
220
+ minScaling);
221
+
222
+ this.content.linkmapLookaround('update',
223
+ configuration.get('margin_scrolling_disabled'));
224
+ this.setupHoverImages(pageElement, configuration.attributes);
225
+ this.updateVideoPlayState(configuration);
226
+
227
+ this.linkmapAreas.linkmap('refresh');
228
+ this.scroller.refresh();
229
+ });
230
+ },
231
+
232
+ updateVideoPlayState: function(configuration) {
233
+ if (configuration.hasChanged('background_type')) {
234
+ if (this.isVideoEnabled(configuration.attributes)) {
235
+ this.playVideo(configuration.attributes);
236
+ }
237
+ else {
238
+ this.pauseVideo(configuration.attributes);
239
+ }
240
+ }
241
+ },
242
+
243
+ setupDefaultAreaPositions: function(configuration) {
244
+ if (!this.defaultPositionDefined) {
245
+ var scroller = this.scroller;
246
+
247
+ _.each(['linkmap_page_link_areas', 'linkmap_audio_file_areas'], function(propertyName) {
248
+ configuration.linkmapAreas(propertyName).setDefaultPosition(function() {
249
+ return {
250
+ left: getPercent(scroller.positionX(), scroller.maxX()),
251
+ top: getPercent(scroller.positionY(), scroller.maxY())
252
+ };
253
+ });
254
+ });
255
+ this.defaultPositionDefined = true;
256
+ }
257
+
258
+ function getPercent(value, max) {
259
+ if (max === 0) {
260
+ return 20;
261
+ }
262
+
263
+ return Math.max(3, Math.min(90, value / max * 100));
264
+ }
265
+ },
266
+
267
+ afterEmbeddedViewsUpdate: function(fn) {
268
+ setTimeout(_.bind(fn, this), 10);
269
+ },
270
+
271
+ isVideoEnabled: function(configuration) {
272
+ return !pageflow.browser.has('mobile platform') &&
273
+ (configuration.background_type === 'video' || configuration.background_type === 'hover_video');
274
+ },
275
+
276
+ isBackgroundVideoEnabled: function(configuration) {
277
+ return !pageflow.browser.has('mobile platform') &&
278
+ configuration.background_type === 'video';
279
+ },
280
+
281
+ isHoverVideoEnabled: function(configuration) {
282
+ return !pageflow.browser.has('mobile platform') &&
283
+ configuration.background_type === 'hover_video';
284
+ },
285
+
286
+ playVideo: function(configuration) {
287
+ var that = this;
288
+
289
+ this.videoPlayer.ensureCreated();
290
+
291
+ this.prebufferingPromise = this.videoPlayer.prebuffer().then(function() {
292
+ if (configuration.background_type === 'video') {
293
+ that.videoPlayer.playAndFadeIn(1000);
294
+ }
295
+ });
296
+ },
297
+
298
+ pauseVideo: function(configuration) {
299
+ this.videoPlayer.fadeOutAndPause(1000);
300
+ this.videoPlayer.scheduleDispose();
301
+ }
302
+ }, pageflow.commonPageCssClasses));
@@ -0,0 +1,3 @@
1
+ (function(a,b){"function"===typeof define&&define.amd?define(b):"object"===typeof exports?module.exports=b():a.gyro=b()})(this,function(){var a={x:null,y:null,z:null,alpha:null,beta:null,gamma:null},b={x:0,y:0,z:0,alpha:0,beta:0,gamma:0},g=null,e=[],h={frequency:500,calibrate:function(){for(var f in a)b[f]="number"===typeof a[f]?a[f]:0},getOrientation:function(){return a},startTracking:function(b){g=setInterval(function(){b(a)},h.frequency)},stopTracking:function(){clearInterval(g)},hasFeature:function(a){for(var b in e)if(a==
2
+ e[b])return!0;return!1},getFeatures:function(){return e}};window&&window.addEventListener&&function(){function f(d){e.push("MozOrientation");d.target.removeEventListener("MozOrientation",f,!0);d.target.addEventListener("MozOrientation",function(c){a.x=c.x-b.x;a.y=c.y-b.y;a.z=c.z-b.z},!0)}function g(d){e.push("devicemotion");d.target.removeEventListener("devicemotion",g,!0);d.target.addEventListener("devicemotion",function(c){a.x=c.accelerationIncludingGravity.x-b.x;a.y=c.accelerationIncludingGravity.y-
3
+ b.y;a.z=c.accelerationIncludingGravity.z-b.z},!0)}function h(d){e.push("deviceorientation");d.target.removeEventListener("deviceorientation",h,!0);d.target.addEventListener("deviceorientation",function(c){a.alpha=c.alpha-b.alpha;a.beta=c.beta-b.beta;a.gamma=c.gamma-b.gamma},!0)}window.addEventListener("MozOrientation",f,!0);window.addEventListener("devicemotion",g,!0);window.addEventListener("deviceorientation",h,!0)}();return h});
@@ -0,0 +1,77 @@
1
+ (function($) {
2
+ $.widget('pageflow.linkmapHoverVideo', {
3
+ activate: function() {
4
+ var video = this.options.video;
5
+
6
+ if (!this.hoverVideoParent) {
7
+ this.hoverVideoParent = video.parent();
8
+ video.appendTo(this.element);
9
+ }
10
+ },
11
+
12
+ deactivate: function() {
13
+ var video = this.options.video;
14
+
15
+ if (this.hoverVideoParent) {
16
+ video.prependTo(this.hoverVideoParent);
17
+ this.hoverVideoParent = null;
18
+
19
+ video.css({
20
+ left: 'auto',
21
+ top: 'auto',
22
+ width: 'auto',
23
+ height: 'auto'
24
+ });
25
+ }
26
+ },
27
+
28
+ schedulePlay: function(options) {
29
+ if (this.currentArea !== options.area) {
30
+ clearTimeout(this.playTimeout);
31
+
32
+ this.currentArea = options.area;
33
+ this.playTimeout = setTimeout(_.bind(function() {
34
+ this.play(options);
35
+ }, this), 500);
36
+ }
37
+ },
38
+
39
+ play: function(options) {
40
+ var video = this.options.video;
41
+ var position = options.area.position();
42
+
43
+ video
44
+ .width(options.baseImage.width())
45
+ .height(options.baseImage.height());
46
+
47
+ this.element
48
+ .css({
49
+ left: position.left + 'px',
50
+ top: position.top + 'px'
51
+ })
52
+ .width(options.area.width())
53
+ .height(options.area.height());
54
+
55
+ this.element.linkmapAreaClip(position);
56
+
57
+ var videoPlayer = video.data('videoPlayer');
58
+ videoPlayer.play();
59
+
60
+ this.element.addClass('playing');
61
+ },
62
+
63
+ pause: function() {
64
+ clearTimeout(this.playTimeout);
65
+ this.currentArea = null;
66
+
67
+ var videoPlayer = this.options.video.data('videoPlayer');
68
+
69
+ setTimeout(function() {
70
+ videoPlayer.currentTime(0);
71
+ videoPlayer.pause();
72
+ }, 300);
73
+
74
+ this.element.removeClass('playing');
75
+ }
76
+ });
77
+ }(jQuery));
@@ -0,0 +1,112 @@
1
+ (function($) {
2
+ var markerMargin = 32;
3
+ var smallSizeBreakpoint = 190;
4
+
5
+ $.widget('pageflow.linkmap', {
6
+ _create: function() {
7
+ var widget = this;
8
+
9
+ this.refresh();
10
+
11
+ if (widget.options.hoverVideoEnabled) {
12
+ widget.options.hoverVideo.activate();
13
+ }
14
+
15
+ this.element.on('mousemove', '.hover_area', function() {
16
+ var hoverArea = $(this);
17
+
18
+ if (widget.options.hoverVideoEnabled) {
19
+ widget.options.hoverVideo.schedulePlay({
20
+ area: hoverArea,
21
+ baseImage: widget.options.baseImage()
22
+ });
23
+ }
24
+ });
25
+
26
+ this.element.on('mouseleave', '.hover_area', function() {
27
+ if (widget.options.hoverVideoEnabled) {
28
+ widget.options.hoverVideo.pause();
29
+ }
30
+ });
31
+ },
32
+
33
+ updateHoverVideoEnabled: function(value) {
34
+ if (value) {
35
+ this.options.hoverVideo.activate();
36
+ }
37
+ else {
38
+ this.options.hoverVideo.deactivate();
39
+ }
40
+
41
+ this.options.hoverVideoEnabled = value;
42
+ },
43
+
44
+ refresh: function() {
45
+ var hoverAreas = this.element.find('.hover_area'),
46
+ hoverImages = this.element.find('.background_image');
47
+
48
+ this._resizeToBaseImage(hoverImages);
49
+
50
+ hoverAreas.linkmapAreaClip();
51
+ hoverAreas.linkmapAreaFormat();
52
+ hoverAreas.linkmapAreaVisited();
53
+ },
54
+
55
+ _resizeToBaseImage: function(target) {
56
+ var baseImage = this.options.baseImage();
57
+
58
+ target
59
+ .width(baseImage.width())
60
+ .height(baseImage.height());
61
+ }
62
+ });
63
+
64
+ $.fn.linkmapAreaClip = function(optionalPosition) {
65
+ this.each(function() {
66
+ var hoverArea = $(this);
67
+ var clippedElement = hoverArea.find('.panorama_video, .background_image');
68
+ var position = optionalPosition || hoverArea.position();
69
+
70
+ clippedElement.css({
71
+ left: -position.left + 'px',
72
+ top: -position.top + 'px'
73
+ });
74
+ });
75
+ };
76
+
77
+ $.fn.linkmapAreaFormat = function() {
78
+ this.each(function() {
79
+ var hoverArea = $(this);
80
+ var linkmapMarker = hoverArea.find('.linkmap_marker');
81
+
82
+ hoverArea.toggleClass('portrait', hoverArea.width() <= hoverArea.height());
83
+ hoverArea.toggleClass('landscape', hoverArea.width() > hoverArea.height());
84
+ hoverArea.toggleClass('small', hoverArea.width() <= smallSizeBreakpoint ||
85
+ hoverArea.height() <= smallSizeBreakpoint);
86
+
87
+ if (hoverArea.width() <= hoverArea.height()) {
88
+ linkmapMarker.css({
89
+ 'width': hoverArea.width() - markerMargin,
90
+ 'height': hoverArea.width() - markerMargin,
91
+ });
92
+ }
93
+ else {
94
+ linkmapMarker.css({
95
+ 'width': hoverArea.height() - markerMargin,
96
+ 'height': hoverArea.height() - markerMargin,
97
+ });
98
+ }
99
+ });
100
+ };
101
+
102
+ $.fn.linkmapAreaVisited = function() {
103
+ this.each(function() {
104
+ var hoverArea = $(this);
105
+ var visited =
106
+ hoverArea.data('targetType') === 'page' &&
107
+ pageflow.linkmapPage.visitedPages.indexOf(hoverArea.data('targetId')) >= 0;
108
+
109
+ hoverArea.toggleClass('visited', visited);
110
+ });
111
+ };
112
+ }(jQuery));