j1-template 2024.3.16 → 2024.3.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/assets/data/amplitude.html +132 -61
  3. data/assets/data/banner.html +1 -1
  4. data/assets/data/cookieconsent.html +1 -1
  5. data/assets/data/docsearch.html +1 -1
  6. data/assets/data/fab.html +1 -1
  7. data/assets/data/footer.html +1 -1
  8. data/assets/data/galeries.html +1 -1
  9. data/assets/data/gallery_customizer.html +1 -1
  10. data/assets/data/gemini-ui.html +1 -1
  11. data/assets/data/iframes.html +1 -1
  12. data/assets/data/masonry.html +1 -1
  13. data/assets/data/masterslider.html +1 -1
  14. data/assets/data/menu.html +1 -1
  15. data/assets/data/mmenu.html +1 -1
  16. data/assets/data/mmenu_sidebar.html +1 -1
  17. data/assets/data/mmenu_toc.html +1 -1
  18. data/assets/data/panel.html +1 -1
  19. data/assets/data/quicklinks.html +1 -1
  20. data/assets/data/rtext_resizer.html +1 -1
  21. data/assets/data/slick.html +1 -1
  22. data/assets/data/speak2me.html +1 -1
  23. data/assets/data/swiper.html +313 -0
  24. data/assets/theme/j1/adapter/js/amplitude.30.js +1177 -0
  25. data/assets/theme/j1/adapter/js/amplitude.js +152 -121
  26. data/assets/theme/j1/adapter/js/j1.js +3 -3
  27. data/assets/theme/j1/adapter/js/masterslider.js +2 -1
  28. data/assets/theme/j1/adapter/js/swiper.js +231 -0
  29. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.css +13 -3
  30. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.min.css +1 -1
  31. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.css +53 -6
  32. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.min.css +2 -1
  33. data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.15.js +1594 -0
  34. data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.js +1617 -89
  35. data/assets/theme/j1/modules/amplitudejs/js/visualizations/bar.js +1 -1
  36. data/assets/theme/j1/modules/amplitudejs/js/visualizations/circular-equalizer.js +31 -1
  37. data/assets/theme/j1/modules/amplitudejs/js/visualizations/frequency-analyzer.js +1 -1
  38. data/assets/theme/j1/modules/amplitudejs/js/visualizations/michael-bromley.js +1 -1
  39. data/assets/theme/j1/modules/amplitudejs/js/visualizations/template.js +1 -1
  40. data/assets/theme/j1/modules/photoswipe/.version_5.4.4 +6 -0
  41. data/assets/theme/j1/modules/photoswipe/LICENSE +21 -0
  42. data/assets/theme/j1/modules/photoswipe/README.md +32 -0
  43. data/assets/theme/j1/modules/photoswipe/css/org/photoswipe-dynamic-caption-plugin.umd.min.js +5 -0
  44. data/assets/theme/j1/modules/photoswipe/css/org/photoswipe.css +420 -0
  45. data/assets/theme/j1/modules/photoswipe/css/photoswipe-caption-plugin.css +67 -0
  46. data/assets/theme/j1/modules/photoswipe/css/photoswipe-caption-plugin.min.css +16 -0
  47. data/assets/theme/j1/modules/photoswipe/css/photoswipe.css +376 -0
  48. data/assets/theme/j1/modules/photoswipe/css/photoswipe.min.css +17 -0
  49. data/assets/theme/j1/modules/photoswipe/css/scss/photoswipe.scss +427 -0
  50. data/assets/theme/j1/modules/photoswipe/example/photoswipe-caption-plugin.html +237 -0
  51. data/assets/theme/j1/modules/photoswipe/example/test-gallery.html +36 -0
  52. data/assets/theme/j1/modules/photoswipe/js/README.md +43 -0
  53. data/assets/theme/j1/modules/photoswipe/js/photoswipe-caption-plugin.min.js +5 -0
  54. data/assets/theme/j1/modules/photoswipe/js/photoswipe-core.min.js +18 -0
  55. data/assets/theme/j1/modules/photoswipe/js/photoswipe-lightbox.min.js +18 -0
  56. data/assets/theme/j1/modules/swiper/.version_1.2.0 +15 -0
  57. data/assets/theme/j1/modules/swiper/LICENSE +20 -0
  58. data/assets/theme/j1/modules/swiper/README.md +95 -0
  59. data/assets/theme/j1/modules/swiper/css/swiper-bundle.css +740 -0
  60. data/assets/theme/j1/modules/swiper/css/swiper-bundle.min..css +17 -0
  61. data/assets/theme/j1/modules/swiper/css/theme/uno.css +249 -0
  62. data/assets/theme/j1/modules/swiper/css/theme/uno.min.css +154 -0
  63. data/assets/theme/j1/modules/swiper/js/swiper-bundle.js +9785 -0
  64. data/assets/theme/j1/modules/swiper/js/swiper-bundle.min.js +17 -0
  65. data/assets/theme/j1/modules/swiper/swiperjs.com-demos.url +2 -0
  66. data/lib/j1/version.rb +1 -1
  67. data/lib/starter_web/README.md +5 -5
  68. data/lib/starter_web/_config.yml +1 -1
  69. data/lib/starter_web/_data/modules/amplitude.yml +374 -39
  70. data/lib/starter_web/_data/modules/defaults/amplitude.yml +60 -35
  71. data/lib/starter_web/_data/modules/defaults/slick.yml +1 -1
  72. data/lib/starter_web/_data/modules/defaults/swiper.yml +515 -0
  73. data/lib/starter_web/_data/modules/swiper.yml +227 -0
  74. data/lib/starter_web/_data/resources.yml +53 -1
  75. data/lib/starter_web/_data/templates/feed.xml +1 -1
  76. data/lib/starter_web/_plugins/asciidoctor/amplitude-block.rb +1 -0
  77. data/lib/starter_web/_plugins/asciidoctor/videojs-block.rb +0 -4
  78. data/lib/starter_web/_plugins/index/lunr.rb +1 -1
  79. data/lib/starter_web/assets/video/poster/youtube/faelle_des_bnd/der_unverzichtbare_feind.jpg +0 -0
  80. data/lib/starter_web/assets/video/poster/youtube/faelle_des_bnd/ein_diener_vieler_herren.jpg +0 -0
  81. data/lib/starter_web/assets/video/poster/youtube/the_piano/the-piano.jpg +0 -0
  82. data/lib/starter_web/package.json +1 -1
  83. data/lib/starter_web/pages/public/_includes/attributes.asciidoc +45 -0
  84. data/lib/starter_web/pages/public/_includes/documents/photoswipe/200_photoswipe_parameters.asciidoc +510 -0
  85. data/lib/starter_web/pages/public/_includes/documents/photoswipe/210_photoswipe_lightbox_parameters.asciidoc +98 -0
  86. data/lib/starter_web/pages/public/_includes/documents/photoswipe/300_caption_plugin_for_photoSwipe.asciidoc +327 -0
  87. data/lib/starter_web/pages/public/_includes/documents/swiper/100_swiper_features.asciidoc +50 -0
  88. data/lib/starter_web/pages/public/_includes/documents/swiper/100_swiper_html_layout.asciidoc +122 -0
  89. data/lib/starter_web/pages/public/_includes/documents/swiper/100_swiper_initialization.asciidoc +53 -0
  90. data/lib/starter_web/pages/public/_includes/documents/swiper/110_swiper_common_options.asciidoc +43 -0
  91. data/lib/starter_web/pages/public/_includes/documents/swiper/200_swiper_parameters_a_k.asciidoc +994 -0
  92. data/lib/starter_web/pages/public/_includes/documents/swiper/200_swiper_parameters_l_o.asciidoc +473 -0
  93. data/lib/starter_web/pages/public/_includes/documents/swiper/200_swiper_parameters_p_s.asciidoc +700 -0
  94. data/lib/starter_web/pages/public/_includes/documents/swiper/200_swiper_parameters_t_z.asciidoc +413 -0
  95. data/lib/starter_web/pages/public/_includes/documents/swiper/300_swiper_instance_properties.asciidoc +873 -0
  96. data/lib/starter_web/pages/public/_includes/documents/swiper/400_swiper_modules.asciidoc +2514 -0
  97. data/lib/starter_web/pages/public/_includes/documents/swiper/500_swiper_methods.asciidoc +989 -0
  98. data/lib/starter_web/pages/public/_includes/documents/swiper/600_swiper_events.asciidoc +1534 -0
  99. data/lib/starter_web/pages/public/amplitude_yt_tester.adoc +77 -63
  100. data/lib/starter_web/pages/public/photoswipe_api.adoc +150 -0
  101. data/lib/starter_web/pages/public/swiper_api.adoc +128 -0
  102. data/lib/starter_web/pages/public/swiper_tester.adoc +973 -0
  103. data/lib/starter_web/pages/public/tour/modal_extentions.adoc +12 -5
  104. data/lib/starter_web/pages/public/tour/play_audio.adoc +60 -5
  105. data/lib/starter_web/pages/public/tour/play_video.adoc +30 -0
  106. data/lib/starter_web/pages/public/tour/present_images.adoc +5 -5
  107. metadata +56 -3
  108. data/assets/theme/j1/modules/amplitudejs/js/tech/youtube_example.js +0 -211
@@ -0,0 +1,1177 @@
1
+ ---
2
+ regenerate: true
3
+ ---
4
+
5
+ {%- capture cache -%}
6
+
7
+ {% comment %}
8
+ # -----------------------------------------------------------------------------
9
+ # ~/assets/theme/j1/adapter/js/amplitude.js
10
+ # Liquid template to adapt the AmplitudeJS v4 module
11
+ #
12
+ # Product/Info:
13
+ # https://jekyll.one
14
+ # Copyright (C) 2023, 2024 Juergen Adams
15
+ #
16
+ # J1 Template is licensed under the MIT License.
17
+ # For details, see: https://github.com/jekyll-one-org/j1-template/blob/main/LICENSE
18
+ # -----------------------------------------------------------------------------
19
+ # Test data:
20
+ # {{ liquid_var | debug }}
21
+ # amplitude_options: {{ amplitude_options | debug }}
22
+ # -----------------------------------------------------------------------------
23
+ {% endcomment %}
24
+
25
+ {% comment %} Liquid procedures
26
+ -------------------------------------------------------------------------------- {% endcomment %}
27
+
28
+ {% comment %} Set global settings
29
+ -------------------------------------------------------------------------------- {% endcomment %}
30
+ {% assign environment = site.environment %}
31
+ {% assign asset_path = "/assets/theme/j1" %}
32
+
33
+ {% comment %} Process YML config data
34
+ ================================================================================ {% endcomment %}
35
+
36
+ {% comment %} Set config files
37
+ -------------------------------------------------------------------------------- {% endcomment %}
38
+ {% assign template_config = site.data.j1_config %}
39
+ {% assign blocks = site.data.blocks %}
40
+ {% assign modules = site.data.modules %}
41
+
42
+ {% comment %} Set config data (settings only)
43
+ -------------------------------------------------------------------------------- {% endcomment %}
44
+ {% assign amplitude_defaults = modules.defaults.amplitude.defaults %}
45
+ {% assign amplitude_settings = modules.amplitude.settings %}
46
+
47
+ {% comment %} Set config options (settings only)
48
+ -------------------------------------------------------------------------------- {% endcomment %}
49
+ {% assign amplitude_options = amplitude_defaults | merge: amplitude_settings %}
50
+
51
+ {% comment %} Variables
52
+ -------------------------------------------------------------------------------- {% endcomment %}
53
+ {% assign comments = amplitude_options.enabled %}
54
+
55
+ {% comment %} Detect prod mode
56
+ -------------------------------------------------------------------------------- {% endcomment %}
57
+ {% assign production = false %}
58
+ {% if environment == 'prod' or environment == 'production' %}
59
+ {% assign production = true %}
60
+ {% endif %}
61
+
62
+ /*
63
+ # -----------------------------------------------------------------------------
64
+ # ~/assets/theme/j1/adapter/js/amplitude.js
65
+ # J1 Adapter for the amplitude module
66
+ #
67
+ # Product/Info:
68
+ # https://jekyll.one
69
+ #
70
+ # Copyright (C) 2023, 2024 Juergen Adams
71
+ #
72
+ # J1 Template is licensed under the MIT License.
73
+ # For details, see: https://github.com/jekyll-one-org/j1-template/blob/main/LICENSE
74
+ # -----------------------------------------------------------------------------
75
+ # Adapter generated: {{site.time}}
76
+ # -----------------------------------------------------------------------------
77
+ */
78
+
79
+ // -----------------------------------------------------------------------------
80
+ // ESLint shimming
81
+ // -----------------------------------------------------------------------------
82
+ /* eslint indent: "off" */
83
+ // -----------------------------------------------------------------------------
84
+
85
+ "use strict";
86
+ j1.adapter.amplitude = ((j1, window) => {
87
+
88
+ // global settings
89
+ // ---------------------------------------------------------------------------
90
+ var environment = '{{environment}}';
91
+ var cookie_names = j1.getCookieNames();
92
+ var user_state = j1.readCookie(cookie_names.user_state);
93
+ var state = 'not_started';
94
+
95
+ // module settings
96
+ // ---------------------------------------------------------------------------
97
+
98
+ // control|logging
99
+ // ---------------------------------------------------------------------------
100
+ var _this;
101
+ var logger;
102
+ var logText;
103
+ var toJSON;
104
+ var toText;
105
+
106
+ // date|time monitoring
107
+ //----------------------------------------------------------------------------
108
+ var startTime;
109
+ var endTime;
110
+ var startTimeModule;
111
+ var endTimeModule;
112
+ var timeSeconds;
113
+
114
+ // AmplitudeJS API settings
115
+ // ---------------------------------------------------------------------------
116
+ var ytpSongIndex = "0";
117
+ var ytpAutoPlay = false;
118
+ var ytpLoop = true;
119
+ var playLists = {};
120
+ var playersUILoaded = { state: false };
121
+ var apiInitialized = { state: false };
122
+ var playList;
123
+ var playerID;
124
+ var playerType;
125
+ var playListTitle;
126
+ var playListName;
127
+ var amplitudePlayerState;
128
+ var amplitudeDefaults;
129
+ var amplitudeSettings;
130
+ var amplitudeOptions;
131
+ var ytPlayer;
132
+ var ytpPlaybackRate
133
+
134
+ // AmplitudeJS Player DEFAULT settings
135
+ // ---------------------------------------------------------------------------
136
+ var xhrLoadState;
137
+ var dependency;
138
+ var playerCounter = 0;
139
+ var load_dependencies = {};
140
+ var playersProcessed = [];
141
+ var playersHtmlLoaded = false;
142
+ var processingPlayersFinished = false;
143
+
144
+ var playerAudioInfo = ('{{amplitude_defaults.playlist.audio_info}}' === 'true') ? true : false;
145
+ var playerDefaultPluginManager = ('{{amplitude_defaults.player.plugin_manager.enabled}}' === 'true') ? true : false;
146
+ var playerDefaultType = '{{amplitude_defaults.player.type}}';
147
+ var playerVolumeValue = '{{amplitude_defaults.player.volume_slider.preset_value}}';
148
+ var playerVolumeSliderStep = '{{amplitude_defaults.player.volume_slider.slider_step}}';
149
+ var playerRepeat = ('{{amplitude_defaults.player.repeat}}' === 'true') ? true : false;
150
+ var playerShuffle = ('{{amplitude_defaults.player.shuffle}}' === 'true') ? true : false;
151
+ var playerPlayNextTitle = ('{{amplitude_defaults.player.play_next_title}}' === 'true') ? true : false;
152
+ var playerPauseNextTitle = ('{{amplitude_defaults.player.pause_next_title}}' === 'true') ? true : false;
153
+ var playerDelayNextTitle = '{{amplitude_defaults.player.delay_next_title}}';
154
+ var playerForwardBackwardSkipSeconds = '{{amplitude_defaults.player.forward_backward_skip_seconds}}';
155
+
156
+ var pluginManagerEnabled;
157
+ var playerExistsInPage;
158
+
159
+ // YT player settings
160
+ // -----------------------------------------------------------------------------
161
+ // const YT_PLAYER_STATE = {
162
+ // not_started: -1,
163
+ // ended: 0,
164
+ // playing: 1,
165
+ // paused: 2,
166
+ // buffering: 3,
167
+ // video_cued: 5
168
+ // };
169
+
170
+ // AmplitudeJS settings curently NOT used
171
+ // ---------------------------------------------------------------------------
172
+ var playerWaveformsEnabled = '{{amplitude_defaults.player.waveforms.enabled}}';
173
+ var playerWaveformsSampleRate = '{{amplitude_defaults.player.waveforms.sample_rate}}';
174
+ var playerVisualizationEnabled = '{{amplitude_defaults.player.visualization.enabled}}';
175
+ var playerVisualizationName = '{{amplitude_defaults.player.visualization.name}}';
176
+
177
+
178
+ // ---------------------------------------------------------------------------
179
+ // helper functions
180
+ // ---------------------------------------------------------------------------
181
+
182
+ // ---------------------------------------------------------------------------
183
+ // main
184
+ // ---------------------------------------------------------------------------
185
+ return {
186
+
187
+ // -------------------------------------------------------------------------
188
+ // adapter initializer
189
+ // -------------------------------------------------------------------------
190
+ init: (options) => {
191
+
192
+ // -----------------------------------------------------------------------
193
+ // default module settings
194
+ // -----------------------------------------------------------------------
195
+ var settings = $.extend({
196
+ module_name: 'j1.adapter.amplitude',
197
+ generated: '{{site.time}}'
198
+ }, options);
199
+
200
+ // -----------------------------------------------------------------------
201
+ // global variable settings
202
+ // -----------------------------------------------------------------------
203
+ amplitudeDefaults = $.extend({}, {{amplitude_defaults | replace: 'nil', 'null' | replace: '=>', ':' }});
204
+ amplitudeSettings = $.extend({}, {{amplitude_settings | replace: 'nil', 'null' | replace: '=>', ':' }});
205
+ amplitudeOptions = $.extend(true, {}, amplitudeDefaults, amplitudeSettings);
206
+
207
+ // save AJS player setiings for later use (e.g. the AJS plugins)
208
+ // j1.adapter.amplitude['amplitudeDefaults'] = amplitudeDefaults;
209
+ // j1.adapter.amplitude['amplitudeSettings'] = amplitudeSettings;
210
+ // j1.adapter.amplitude['amplitudeOptions'] = amplitudeOptions;
211
+
212
+ // -----------------------------------------------------------------------
213
+ // control|logging settings
214
+ // -----------------------------------------------------------------------
215
+ _this = j1.adapter.amplitude;
216
+ logger = log4javascript.getLogger('j1.adapter.amplitude');
217
+
218
+ // -----------------------------------------------------------------------
219
+ // module initializer
220
+ // -----------------------------------------------------------------------
221
+ var dependencies_met_page_ready = setInterval (() => {
222
+ var pageState = $('#content').css("display");
223
+ var pageVisible = (pageState === 'block') ? true : false;
224
+ var j1CoreFinished = (j1.getState() === 'finished') ? true : false;
225
+
226
+ if (j1CoreFinished && pageVisible) {
227
+ startTimeModule = Date.now();
228
+
229
+ _this.setState('started');
230
+ logger.debug('\n' + 'module state: ' + _this.getState());
231
+ logger.info('\n' + 'module is being initialized');
232
+
233
+ // -------------------------------------------------------------------
234
+ // create global playlist (songs)
235
+ // -------------------------------------------------------------------
236
+ var songs = [];
237
+ _this.songLoader(songs);
238
+
239
+ // -------------------------------------------------------------------
240
+ // load all players (HTML|UI)
241
+ // -------------------------------------------------------------------
242
+ _this.playerHtmlLoader(playersUILoaded);
243
+
244
+ // -------------------------------------------------------------------
245
+ // inititialize amplitude api
246
+ // -------------------------------------------------------------------
247
+ var dependencies_met_players_loaded = setInterval (() => {
248
+ if (playersUILoaded.state) {
249
+ _this.initApi(songs);
250
+ // var playbackRate = ytPlayer.getPlaybackRate();
251
+
252
+ clearInterval(dependencies_met_players_loaded);
253
+ } // END if playersUILoaded
254
+ }, 10); // END dependencies_met_players_loaded
255
+
256
+ // -------------------------------------------------------------------
257
+ // initialize player specific UI events
258
+ // -------------------------------------------------------------------
259
+ var dependencies_met_api_initialized = setInterval (() => {
260
+ if (apiInitialized.state) {
261
+ _this.initPlayerUiEvents();
262
+
263
+ clearInterval(dependencies_met_api_initialized);
264
+ } // END if apiInitialized
265
+ }, 10); // END dependencies_met_api_initialized
266
+
267
+ clearInterval(dependencies_met_page_ready);
268
+ } // END pageVisible
269
+ }, 10); // END dependencies_met_page_ready
270
+
271
+ }, // END init
272
+
273
+ // -------------------------------------------------------------------------
274
+ // Create global playlist|songs (API)
275
+ // -------------------------------------------------------------------------
276
+ songLoader: (songs) => {
277
+
278
+ logger.info('\n' + 'creating global playlist (API): started');
279
+
280
+ // -----------------------------------------------------------------------
281
+ // initialize amplitude songs
282
+ // -----------------------------------------------------------------------
283
+ {% for playlist in amplitude_settings.playlists %} {% if playlist.enabled %}
284
+ var song_items = $.extend({}, {{playlist.items | replace: 'nil', 'null' | replace: '=>', ':' }});
285
+
286
+ for (var i = 0; i < Object.keys(song_items).length; i++) {
287
+ if (song_items[i].enabled) {
288
+ var item = song_items[i];
289
+ var song = {};
290
+
291
+ // map config settings|amplitude song items
292
+ // -----------------------------------------------------------------
293
+ for (const key in item) {
294
+ // skip properties NOT needed for a song
295
+ if (key === 'item' || key === 'audio_base' || key === 'enabled') {
296
+ continue;
297
+ } else if (key === 'audio') {
298
+ song.url = item.audio_base + '/' + item[key];
299
+ continue;
300
+ } else if (key === 'title') {
301
+ song.name = item[key];
302
+ continue;
303
+ } else if (key === 'name') {
304
+ song.album = item[key];
305
+ continue;
306
+ } else if (key === 'cover_image') {
307
+ song.cover_art_url = item[key];
308
+ continue;
309
+ } else if (key === 'audio_info') {
310
+ song.audio_info = item[key];
311
+ continue;
312
+ } else if (key === 'rating') {
313
+ song.rating = item[key];
314
+ continue;
315
+ } else {
316
+ song[key] = item[key];
317
+ } // END if key
318
+ } // END for item
319
+ } // END id enabled
320
+
321
+ songs.push(song);
322
+ } // END for song_items
323
+
324
+ {% endif %} {% endfor %}
325
+
326
+ logger.info('\n' + 'creating global playlist (API): finished');
327
+ }, // END songLoader
328
+
329
+ // -------------------------------------------------------------------------
330
+ // load players HTML portion (UI)
331
+ // -------------------------------------------------------------------------
332
+ playerHtmlLoader: (playersLoaded) => {
333
+ var playerExistsInPage;
334
+
335
+ // -----------------------------------------------------------------------
336
+ // initialize HTML portion (UI) for all players configured|enabled
337
+ // -----------------------------------------------------------------------
338
+ logger.info('\n' + 'loading player HTML components (UI): started');
339
+
340
+ {% for player in amplitude_options.players %} {% if player.enabled %}
341
+ {% assign xhr_data_path = amplitude_options.xhr_data_path %}
342
+ {% capture xhr_container_id %}{{player.id}}_parent{% endcapture %}
343
+
344
+ // load players only that are configured in current page
345
+ //
346
+ playerExistsInPage = ($('#' + '{{xhr_container_id}}')[0] !== undefined) ? true : false;
347
+ if (playerExistsInPage) {
348
+ playerCounter++;
349
+ logger.debug('\n' + 'load player UI on ID #{{player.id}}: started');
350
+
351
+ j1.loadHTML({
352
+ xhr_container_id: '{{xhr_container_id}}',
353
+ xhr_data_path: '{{xhr_data_path}}',
354
+ xhr_data_element: '{{player.id}}'
355
+ },
356
+ 'j1.adapter.amplitude',
357
+ 'data_loaded'
358
+ );
359
+
360
+ // dynamic loader variable to setup the player on ID {{player.id}}
361
+ dependency = 'dependencies_met_html_loaded_{{player.id}}';
362
+ load_dependencies[dependency] = '';
363
+
364
+ // ---------------------------------------------------------------------
365
+ // initialize amplitude instance (when player UI loaded)
366
+ // ---------------------------------------------------------------------
367
+ load_dependencies['dependencies_met_html_loaded_{{player.id}}'] = setInterval (() => {
368
+ // check if HTML portion of the player is loaded successfully
369
+ xhrLoadState = j1.xhrDOMState['#' + '{{xhr_container_id}}'];
370
+
371
+ if (xhrLoadState === 'success') {
372
+ playersProcessed.push('{{xhr_container_id}}');
373
+ logger.debug('\n' + 'load player UI on ID #{{player.id}}: finished');
374
+
375
+ clearInterval(load_dependencies['dependencies_met_html_loaded_{{player.id}}']);
376
+ }
377
+ }, 10); // END dependencies_met_html_loaded
378
+ } // END if playerExistsInPage
379
+
380
+ {% endif %} {% endfor %}
381
+
382
+ load_dependencies['dependencies_met_players_loaded'] = setInterval (() => {
383
+
384
+ if (playersProcessed.length === playerCounter) {
385
+ processingPlayersFinished = true;
386
+ }
387
+
388
+ if (processingPlayersFinished) {
389
+ logger.info('\n' + 'loading player HTML components (UI): finished');
390
+
391
+ clearInterval(load_dependencies['dependencies_met_players_loaded']);
392
+ playersLoaded.state = true;
393
+ }
394
+ }, 10); // END dependencies_met_players_loaded
395
+
396
+ }, // END playerHtmlLoader
397
+
398
+ // -------------------------------------------------------------------------
399
+ // initApi
400
+ // -------------------------------------------------------------------------
401
+ initApi: (songlist) => {
402
+ logger.info('\n' + 'initialze API: started');
403
+
404
+ {% comment %} collect playlists
405
+ -------------------------------------------------------------------------- {% endcomment %}
406
+ {% assign playlists_enabled = 0 %}
407
+ {% for list in amplitude_settings.playlists %} {% if list.enabled %}
408
+ {% assign playlists_enabled = playlists_enabled | plus: 1 %}
409
+ {% endif %} {% endfor %}
410
+
411
+ {% assign playlists_processed = 0 %}
412
+ {% for list in amplitude_settings.playlists %} {% if list.enabled %}
413
+ {% assign playlist_items = list.items %}
414
+ {% assign playlist_name = list.name %}
415
+ {% assign playlist_title = list.title %}
416
+
417
+ {% comment %} collect song items
418
+ ------------------------------------------------------------------------ {% endcomment %}
419
+ {% for item in playlist_items %} {% if item.enabled %}
420
+ {% capture song_item %}
421
+ {
422
+ "name": "{{item.title}}",
423
+ "artist": "{{item.artist}}",
424
+ "album": "{{item.name}}",
425
+ "url": "{{item.audio_base}}/{{item.audio}}",
426
+ "audio_info": "{{item.audio_info}}",
427
+ "rating": "{{item.rating}}",
428
+ "cover_art_url": "{{item.cover_image}}"
429
+ }{% if forloop.last %}{% else %},{% endif %}
430
+ {% endcapture %}
431
+ {% capture song_items %}{{song_items}} {{song_item}}{% endcapture %}
432
+
433
+ {% comment %} create playlist
434
+ ---------------------------------------------------------------------- {% endcomment %}
435
+ {% if forloop.last %}
436
+ {% capture playlist %}
437
+ "{{playlist_name}}": {
438
+ "title": "{{playlist_title}}",
439
+ "songs": [
440
+ {{song_items}}
441
+ ]
442
+ }
443
+ {% endcapture %}
444
+ {% assign playlists_processed = playlists_processed | plus: 1 %}
445
+
446
+ {% comment %} reset song_items
447
+ -------------------------------------------------------------------- {% endcomment %}
448
+ {% capture song_items %}{% endcapture %}
449
+ {% endif %}
450
+ {% endif %} {% endfor %}
451
+
452
+ {% comment %} collect playlists players enabled
453
+ ------------------------------------------------------------------------ {% endcomment %}
454
+ {% capture playlists %}
455
+ {{playlists}} {{playlist}} {% if playlists_processed == playlists_enabled %}{% else %},{% endif %}
456
+ {% endcapture %}
457
+
458
+ {% endif %} {% endfor %}
459
+
460
+ // See: https://521dimensions.com/open-source/amplitudejs/docs
461
+ // NOTE: slider VALUE (volume) is set by DEFAULT settings (player)
462
+ Amplitude.init({
463
+
464
+ bindings: {
465
+ 33: 'play_pause',
466
+ 37: 'prev',
467
+ 39: 'next'
468
+ },
469
+ songs: songlist,
470
+ playlists: {
471
+ {{playlists}}
472
+ },
473
+ callbacks: {
474
+ initialized: function() {
475
+ var amplitudeConfig = Amplitude.getConfig();
476
+ logger.info('\n' + 'initialze API: finished');
477
+ // indicate api successfully initialized
478
+ apiInitialized.state = true;
479
+ },
480
+ onInitError: function() {
481
+ // indicate api failed on initialization
482
+ apiInitialized.state = false;
483
+ console.error('\n' + 'Amplitude API failed on initialization');
484
+ },
485
+ play: function() {
486
+ var songMetaData = Amplitude.getActiveSongMetadata();
487
+ logger.debug('\n' + 'playing title: ' + songMetaData.name);
488
+ document.getElementById('album-art').style.visibility = 'hidden';
489
+ document.getElementById('large-visualization').style.visibility = 'visible';
490
+ },
491
+ pause: function() {
492
+ var songMetaData = Amplitude.getActiveSongMetadata();
493
+ logger.debug('\n' + 'pause title: ' + songMetaData.name);
494
+ document.getElementById('album-art').style.visibility = 'visible';
495
+ document.getElementById('large-visualization').style.visibility = 'hidden';
496
+ },
497
+ song_change: function() {
498
+ var songMetaData = Amplitude.getActiveSongMetadata();
499
+ logger.debug('\n' + 'changed to title: ' + songMetaData.name + ' with titleIndex ' + songMetaData.index);
500
+ },
501
+ next: function() {
502
+ var songMetaData = Amplitude.getActiveSongMetadata();
503
+
504
+ if (playerDelayNextTitle) {
505
+ logger.debug('\n' + 'delay on next title: ' + songMetaData.name + ' with titleIndex ' + songMetaData.index);
506
+ }
507
+
508
+ if (playerPauseNextTitle) {
509
+ amplitudePlayerState = Amplitude.getPlayerState();
510
+ if (amplitudePlayerState === 'playing' || amplitudePlayerState === 'stopped' ) {
511
+ setTimeout(() => {
512
+ // pause playback of next title
513
+ logger.debug('\n' + 'paused on next title: ' + songMetaData.name);
514
+ Amplitude.pause();
515
+ }, 150);
516
+ } // END if playing
517
+ } // END if pause on next title
518
+ },
519
+ prev: function() {
520
+ var songMetaData = Amplitude.getActiveSongMetadata();
521
+
522
+ if (playerDelayNextTitle) {
523
+ logger.debug('\n' + 'delay on previous title: ' + songMetaData.name + ' with titleIndex ' + songMetaData.index);
524
+ }
525
+
526
+ if (playerPauseNextTitle) {
527
+ amplitudePlayerState = Amplitude.getPlayerState();
528
+ if (amplitudePlayerState === 'playing' || amplitudePlayerState === 'stopped' ) {
529
+ setTimeout(() => {
530
+ // pause playback of next title
531
+ logger.debug('\n' + 'paused on next title: ' + songMetaData.name);
532
+ Amplitude.pause();
533
+ }, 150);
534
+ } // END if playing
535
+ } // END if pause on next title
536
+ }
537
+ }, // END callbacks
538
+
539
+ // waveforms: {
540
+ // sample_rate: playerWaveformSampleRate
541
+ // },
542
+
543
+ continue_next: playerPlayNextTitle,
544
+ volume: playerVolumeValue,
545
+ volume_decrement: playerVolumeSliderStep,
546
+ volume_increment: playerVolumeSliderStep
547
+
548
+ }); // END Amplitude init
549
+
550
+ }, // END initApi
551
+
552
+ // -------------------------------------------------------------------------
553
+ // initPlayerUiEvents
554
+ // -------------------------------------------------------------------------
555
+ initPlayerUiEvents: () => {
556
+
557
+ var dependencies_met_player_instances_initialized = setInterval (() => {
558
+ if (apiInitialized.state) {
559
+ var parentContainer = (document.getElementById('{{xhr_container_id}}') !== null) ? true : false;
560
+ var parentContainerExist = ($('#' + '{{xhr_container_id}}')[0] !== undefined) ? true : false;
561
+
562
+ logger.info('\n' + 'initialize player specific UI events: started');
563
+
564
+ {% for player in amplitude_options.players %} {% if player.enabled %}
565
+ {% assign xhr_data_path = amplitude_options.xhr_data_path %}
566
+ {% capture xhr_container_id %}{{player.id}}_parent{% endcapture %}
567
+
568
+ playerID = '{{player.id}}';
569
+ playerType = '{{player.type}}';
570
+ playList = '{{player.playlist}}';
571
+ playListName = '{{player.playlist.name}}'
572
+ playListTitle = '{{player.playlist.title}}';
573
+
574
+ logger.debug('\n' + 'set playlist {{player.playlist}} on id #{{player.id}} with title: ' + playListTitle);
575
+
576
+ // dynamic loader variable to setup the player on ID {{player.id}}
577
+ dependency = 'dependencies_met_player_loaded_{{player.id}}';
578
+ load_dependencies[dependency] = '';
579
+
580
+ // -----------------------------------------------------------------
581
+ // initialize player instance (when player UI is loaded)
582
+ // -----------------------------------------------------------------
583
+ load_dependencies['dependencies_met_player_loaded_{{player.id}}'] = setInterval (() => {
584
+ // check if HTML portion of the player is loaded successfully
585
+ var xhrLoadState = j1.xhrDOMState['#' + '{{xhr_container_id}}'];
586
+ var playerExistsInPage = ($('#' + '{{xhr_container_id}}')[0] !== undefined) ? true : false;
587
+
588
+ if (xhrLoadState === 'success' && playerExistsInPage) {
589
+
590
+ // set song (title) specific audio info links
591
+ // -------------------------------------------------------------
592
+ if (playerAudioInfo) {
593
+ var infoLinks = document.getElementsByClassName('audio-info-link');
594
+ _this.setAudioInfo(infoLinks);
595
+ }
596
+
597
+ // jadams, 2024-10-19: (song) events DISABLED
598
+ // set song (title) specific UI events
599
+ // -------------------------------------------------------------
600
+ // var songElements = document.getElementsByClassName('song');
601
+ // _this.songEvents(songElements);
602
+
603
+ // player specific UI events
604
+ // -------------------------------------------------------------
605
+ logger.debug('\n' + 'setup player specific UI events on ID #{{player.id}}: started');
606
+
607
+ var dependencies_met_api_initialized = setInterval (() => {
608
+ if (apiInitialized.state) {
609
+ amplitudePlayerState = Amplitude.getPlayerState();
610
+
611
+ {% if player.id contains 'mini' %}
612
+ // ---------------------------------------------------------
613
+ // START mini player UI events
614
+ //
615
+ if (document.getElementById('{{player.id}}') !== null) {
616
+
617
+ // add listeners to all progress bars found (mini-player)
618
+ // getElementsByClassName returns an Array-like object
619
+ // -------------------------------------------------------
620
+ var progressBars = document.getElementsByClassName("mini-player-progress");
621
+ for (var i=0; i<progressBars.length; i++) {
622
+ if (progressBars[i].dataset.amplitudeSource === 'youtube') {
623
+ // do nothing
624
+ } else {
625
+ progressBars[i].addEventListener('click', function(event) {
626
+ var offset = this.getBoundingClientRect();
627
+ var xpos = event.pageX - offset.left;
628
+
629
+ Amplitude.setSongPlayedPercentage(
630
+ (parseFloat(xpos)/parseFloat(this.offsetWidth))*100);
631
+ }); // END EventListener 'click'
632
+ }
633
+ } // END for
634
+
635
+ // for (var i=0; i<progressBars.length; i++) {
636
+ // progressBars[i].addEventListener('click', function(event) {
637
+ // var offset = this.getBoundingClientRect();
638
+ // var xpos = event.pageX - offset.left;
639
+
640
+ // Amplitude.setSongPlayedPercentage(
641
+ // (parseFloat(xpos)/parseFloat(this.offsetWidth))*100);
642
+ // });
643
+ // }
644
+
645
+ } // END mini player UI events
646
+ {% endif %}
647
+
648
+ {% if player.id contains 'compact' %}
649
+ // ---------------------------------------------------------
650
+ // START compact player UI events
651
+ //
652
+ if (document.getElementById('{{player.id}}') !== null) {
653
+
654
+ // show|hide scrollbar in playlist (compact player)
655
+ // -------------------------------------------------------
656
+ const songsInPlaylist = Amplitude.getSongsInPlaylist(playListName);
657
+ if (songsInPlaylist.length <= 8) {
658
+ const titleListCompactPlayer = document.getElementById('compact_player_title_list_' + playListName);
659
+ if (titleListCompactPlayer !== null) {
660
+ titleListCompactPlayer.classList.add('hide-scrollbar');
661
+ }
662
+ }
663
+
664
+ // show|hide playlist
665
+ // -------------------------------------------------------
666
+
667
+ // show playlist
668
+ var showPlaylist = document.getElementById("show_playlist_{{player.id}}");
669
+ if (showPlaylist !== null) {
670
+ showPlaylist.addEventListener('click', function(event) {
671
+ var scrollOffset = (window.innerWidth >= 720) ? -130 : -110;
672
+
673
+ // scroll player to top position
674
+ const targetDiv = document.getElementById("show_playlist_{{player.id}}");
675
+ const targetDivPosition = targetDiv.offsetParent.offsetTop;
676
+ window.scrollTo(0, targetDivPosition + scrollOffset);
677
+
678
+ // open playlist
679
+ var playlistScreen = document.getElementById("playlist_screen_{{player.id}}");
680
+
681
+ playlistScreen.classList.remove('slide-out-top');
682
+ playlistScreen.classList.add('slide-in-top');
683
+ playlistScreen.style.display = "block";
684
+ playlistScreen.style.zIndex = "199";
685
+
686
+ // disable scrolling (if window viewport >= BS Medium and above)
687
+ if (window.innerWidth >= 720) {
688
+ if ($('body').hasClass('stop-scrolling')) {
689
+ return false;
690
+ } else {
691
+ $('body').addClass('stop-scrolling');
692
+ }
693
+ }
694
+ }); // END EventListener 'click' (compact player|show playlist)
695
+ } // END if showPlaylist
696
+
697
+ // hide playlist
698
+ var hidePlaylist = document.getElementById("hide_playlist_{{player.id}}");
699
+ if (hidePlaylist !== null) {
700
+ hidePlaylist.addEventListener('click', function(event) {
701
+ var playlistScreen = document.getElementById("playlist_screen_{{player.id}}");
702
+
703
+ playlistScreen.classList.remove('slide-in-top');
704
+ playlistScreen.classList.add('slislide-out-top');
705
+ playlistScreen.style.display = "none";
706
+ playlistScreen.style.zIndex = "1";
707
+
708
+ // enable scrolling
709
+ if ($('body').hasClass('stop-scrolling')) {
710
+ $('body').removeClass('stop-scrolling');
711
+ }
712
+ }); // END EventListener 'click' (compact player|show playlist)
713
+ } // END if hidePlaylist
714
+
715
+ // add listeners to all progress bars found (compact-player)
716
+ // getElementsByClassName returns an Array-like object
717
+ // -------------------------------------------------------
718
+ var progressBars = document.getElementsByClassName("compact-player-progress");
719
+ for (var i=0; i<progressBars.length; i++) {
720
+ if (progressBars[i].dataset.amplitudeSource === 'youtube') {
721
+ // do nothing
722
+ } else {
723
+ progressBars[i].addEventListener('click', function(event) {
724
+ var offset = this.getBoundingClientRect();
725
+ var xpos = event.pageX - offset.left;
726
+
727
+ Amplitude.setSongPlayedPercentage(
728
+ (parseFloat(xpos)/parseFloat(this.offsetWidth))*100);
729
+ }); // END EventListener 'click'
730
+ }
731
+ } // END for
732
+
733
+ // click on skip forward|backward (compact player)
734
+ // See: https://github.com/serversideup/amplitudejs/issues/384
735
+ // -------------------------------------------------------
736
+
737
+ // add listeners to all SkipForwardButtons found
738
+ var compactPlayerSkipForwardButtons = document.getElementsByClassName("compact-player-skip-forward");
739
+ for (var i=0; i<compactPlayerSkipForwardButtons.length; i++) {
740
+ if (compactPlayerSkipForwardButtons[i].id === 'skip-forward_{{player.id}}') {
741
+ compactPlayerSkipForwardButtons[i].addEventListener('click', function(event) {
742
+ const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
743
+ const duration = Amplitude.getSongDuration();
744
+ const currentTime = parseFloat(Amplitude.getSongPlayedSeconds());
745
+ const targetTime = parseFloat(currentTime + skipOffset);
746
+
747
+ if (currentTime > 0) {
748
+ Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
749
+ }
750
+ }); // END EventListener 'click'
751
+ } // END if ID
752
+ } // END for SkipForwardButtons
753
+
754
+ // add listeners to all SkipBackwardButtons found
755
+ var compactPlayerSkipBackwardButtons = document.getElementsByClassName("compact-player-skip-backward");
756
+ for (var i=0; i<compactPlayerSkipBackwardButtons.length; i++) {
757
+ if (compactPlayerSkipBackwardButtons[i].id === 'skip-backward_{{player.id}}') {
758
+ compactPlayerSkipBackwardButtons[i].addEventListener('click', function(event) {
759
+ const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
760
+ const duration = Amplitude.getSongDuration();
761
+ const currentTime = parseFloat(Amplitude.getSongPlayedSeconds());
762
+ const targetTime = parseFloat(currentTime - skipOffset);
763
+
764
+ if (currentTime > 0) {
765
+ Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
766
+ }
767
+ }); // END EventListener 'click'
768
+ } // END if ID
769
+ } // END for SkipBackwardButtons
770
+
771
+ // click on shuffle button
772
+ var compactPlayerShuffleButton = document.getElementById('compact_player_shuffle');
773
+ if (compactPlayerShuffleButton) {
774
+ compactPlayerShuffleButton.addEventListener('click', function(event) {
775
+ var shuffleState = (document.getElementById('compact_player_shuffle').className.includes('amplitude-shuffle-on')) ? true : false;
776
+
777
+ Amplitude.setShuffle(shuffleState)
778
+ }); // END EventListener 'click'
779
+ } // END compactPlayerShuffleButton
780
+
781
+ // click on repeat button
782
+ var compactPlayerRepeatButton = document.getElementById('compact_player_repeat');
783
+ if (compactPlayerRepeatButton) {
784
+ compactPlayerRepeatButton.addEventListener('click', function(event) {
785
+ var repeatState = (document.getElementById('compact_player_repeat').className.includes('amplitude-repeat-on')) ? true : false;
786
+
787
+ Amplitude.setRepeat(repeatState)
788
+ }); // END EventListener 'click'
789
+ } // END compactPlayerRepeatButton
790
+
791
+ } // END compact player UI events
792
+ {% endif %}
793
+
794
+ {% if player.id contains 'large' %}
795
+ // START large player UI events
796
+ //
797
+ if (document.getElementById('{{player.id}}') !== null) {
798
+
799
+ // NOTE: listener overloads for video managed by plugin
800
+ // -------------------------------------------------------
801
+
802
+ // click on prev button
803
+ var largePlayerPreviousButton = document.getElementById('large_player_previous');
804
+ if (largePlayerPreviousButton && largePlayerPreviousButton.getAttribute("data-amplitude-source") === 'youtube') {
805
+ // do nothing (managed by plugin)
806
+ }
807
+
808
+ // click on play_pause button
809
+ var largePlayerPlayButton = document.getElementById('large_player_play_pause');
810
+ // add listeners to all progress bars found (large-player)
811
+ // -------------------------------------------------------
812
+ var progressBars = document.getElementsByClassName("large-player-progress");
813
+ for (var i=0; i<progressBars.length; i++) {
814
+ if (progressBars[i].dataset.amplitudeSource === 'youtube') {
815
+ // do nothing (managed by plugin)
816
+ } else {
817
+ progressBars[i].addEventListener('click', function(event) {
818
+ var offset = this.getBoundingClientRect();
819
+ var xpos = event.pageX - offset.left;
820
+
821
+ Amplitude.setSongPlayedPercentage(
822
+ (parseFloat(xpos)/parseFloat(this.offsetWidth))*100);
823
+ }); // END EventListener 'click'
824
+ }
825
+ } // END for
826
+
827
+ // click on skip forward|backward (large player)
828
+ // See: https://github.com/serversideup/amplitudejs/issues/384
829
+ // -------------------------------------------------------
830
+
831
+ // add listeners to all SkipForwardButtons found
832
+ var largePlayerSkipForwardButtons = document.getElementsByClassName("large-player-skip-forward");
833
+ for (var i=0; i<largePlayerSkipForwardButtons.length; i++) {
834
+ if (largePlayerSkipForwardButtons[i].id === 'skip-forward_{{player.id}}') {
835
+ if (largePlayerSkipForwardButtons[i].dataset.amplitudeSource === 'youtube') {
836
+ // do nothing (managed by plugin)
837
+ } else {
838
+ largePlayerSkipForwardButtons[i].addEventListener('click', function(event) {
839
+ const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
840
+ const duration = Amplitude.getSongDuration();
841
+ const currentTime = parseFloat(Amplitude.getSongPlayedSeconds());
842
+ const targetTime = parseFloat(currentTime + skipOffset);
843
+
844
+ if (currentTime > 0) {
845
+ Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
846
+ }
847
+ }); // END EventListener 'click'
848
+ } // END else
849
+ } // END if ID
850
+ } // END for SkipForwardButtons
851
+
852
+ // add listeners to all SkipBackwardButtons found
853
+ var largePlayerSkipBackwardButtons = document.getElementsByClassName("large-player-skip-backward");
854
+ for (var i=0; i<largePlayerSkipBackwardButtons.length; i++) {
855
+ if (largePlayerSkipBackwardButtons[i].id === 'skip-backward_{{player.id}}') {
856
+ if (largePlayerSkipBackwardButtons[i].dataset.amplitudeSource === 'youtube') {
857
+ // do nothing (managed by plugin)
858
+ } else {
859
+ largePlayerSkipBackwardButtons[i].addEventListener('click', function(event) {
860
+ const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
861
+ const duration = Amplitude.getSongDuration();
862
+ const currentTime = parseFloat(Amplitude.getSongPlayedSeconds());
863
+ const targetTime = parseFloat(currentTime - skipOffset);
864
+
865
+ if (currentTime > 0) {
866
+ Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
867
+ }
868
+ }); // END EventListener 'click'
869
+ } // END else
870
+ } // END if ID
871
+ } // END for SkipBackwardButtons
872
+
873
+ // click on shuffle button
874
+ var largePlayerShuffleButton = document.getElementById('large_player_shuffle');
875
+ if (largePlayerShuffleButton) {
876
+ largePlayerShuffleButton.addEventListener('click', function(event) {
877
+ var shuffleState = (document.getElementById('large_player_shuffle').className.includes('amplitude-shuffle-on')) ? true : false;
878
+ Amplitude.setShuffle(shuffleState)
879
+ }); // END EventListener 'click'
880
+ } // END largePlayerShuffleButton
881
+
882
+ // click on repeat button
883
+ var largePlayerRepeatButton = document.getElementById('large_player_repeat');
884
+ if (largePlayerShuffleButton) {
885
+ largePlayerRepeatButton.addEventListener('click', function(event) {
886
+ var repeatState = (document.getElementById('large_player_repeat').className.includes('amplitude-repeat-on')) ? true : false;
887
+ Amplitude.setRepeat(repeatState)
888
+ }); // END EventListener 'click'
889
+ } // END if largePlayerRepeatButton
890
+
891
+ // enable|disable scrolling on playlist (large player)
892
+ // -------------------------------------------------------
893
+ if (document.getElementById('large_player_right') !== null) {
894
+
895
+ // show|hide scrollbar in playlist
896
+ // -----------------------------------------------------
897
+ const songsInPlaylist = Amplitude.getSongsInPlaylist(playListName);
898
+
899
+ if (songsInPlaylist.length <= 8) {
900
+ const titleListLargePlayer = document.getElementById('large_player_title_list_' + playListName);
901
+ if (titleListLargePlayer !== null) {
902
+ titleListLargePlayer.classList.add('hide-scrollbar');
903
+ }
904
+ }
905
+
906
+ // scroll to player top position (large player)
907
+ //
908
+ // Bootstrap grid breakpoints
909
+ // SN: 576px Mobile
910
+ // MD: 768px Small Desktop|Tablet
911
+ // LG: 992px Default Desktop
912
+ // XL: 1200px Large Desktop
913
+ // XXL: 1400px X Large Desktop
914
+ // -----------------------------------------------------
915
+
916
+ var largePlayerTitleHeader = document.getElementById("large_player_title_header_{{player.id}}");
917
+ largePlayerTitleHeader.addEventListener('click', function(event) {
918
+ var playerRight = document.getElementById("{{player.id}}");
919
+ var playlistHeader = document.getElementById("playlist_header_{{player.id}}");
920
+ var scrollOffset = (window.innerWidth >= 992) ? -130 : -44;
921
+
922
+ // scroll player|playlist to top position (large player)
923
+ //
924
+ const targetDivPlayerRight = playerRight;
925
+ const targetDivPositionPlayerRight = targetDivPlayerRight.offsetTop;
926
+ const targetDivPlaylistHeader = playlistHeader;
927
+ const targetDivPositionplaylistHeader = targetDivPlaylistHeader.offsetTop;
928
+
929
+ // NOTE: depending on WINDOW SIZE the relation changes to TOP POSITION (targetDivPosition)
930
+ //
931
+ if (targetDivPositionPlayerRight > targetDivPositionplaylistHeader) {
932
+ window.scrollTo(0, targetDivPositionPlayerRight + targetDivPlaylistHeader.offsetParent.firstElementChild.clientHeight + scrollOffset);
933
+ } else {
934
+ window.scrollTo(0, targetDivPositionplaylistHeader + scrollOffset);
935
+ }
936
+ }); // END EventListener 'click' largePlayerTitleHeader
937
+
938
+ var largePlayerPlaylistHeader = document.getElementById("playlist_header_{{player.id}}");
939
+ largePlayerPlaylistHeader.addEventListener('click', function(event) {
940
+ var playerRight = document.getElementById("{{player.id}}");
941
+ var playlistHeader = document.getElementById("playlist_header_{{player.id}}");
942
+ var scrollOffset = (window.innerWidth >= 992) ? -130 : -44;
943
+
944
+ // scroll player|playlist to top position (large player)
945
+ //
946
+ const targetDivPlayerRight = playerRight;
947
+ const targetDivPositionPlayerRight = targetDivPlayerRight.offsetTop;
948
+ const targetDivPlaylistHeader = playlistHeader;
949
+ const targetDivPositionplaylistHeader = targetDivPlaylistHeader.offsetTop;
950
+
951
+ // NOTE: depending on WINDOW SIZE the relation changes to TOP POSITION (targetDivPosition)
952
+ //
953
+ if (targetDivPositionPlayerRight > targetDivPositionplaylistHeader) {
954
+ window.scrollTo(0, targetDivPositionPlayerRight + targetDivPlaylistHeader.offsetParent.firstElementChild.clientHeight + scrollOffset);
955
+ } else {
956
+ window.scrollTo(0, targetDivPositionplaylistHeader + scrollOffset);
957
+ }
958
+
959
+ }); // END EventListener 'click' largePlayerPlaylistHeader
960
+
961
+ // disable scrolling (if window viewport >= BS Medium and above)
962
+ document.getElementById('large_player_right').addEventListener('mouseenter', function() {
963
+ if (window.innerWidth >= 720) {
964
+ if ($('body').hasClass('stop-scrolling')) {
965
+ return false;
966
+ } else {
967
+ $('body').addClass('stop-scrolling');
968
+ }
969
+ }
970
+ }); // END EventListener 'mouseenter'
971
+
972
+ // enable scrolling
973
+ document.getElementById('large_player_right').addEventListener('mouseleave', function() {
974
+ if ($('body').hasClass('stop-scrolling')) {
975
+ $('body').removeClass('stop-scrolling');
976
+ }
977
+ }); // END EventListener 'mouseleave'
978
+
979
+ } // END enable|disable scrolling on playlist
980
+
981
+ // set volume slider presets (for the player when exists|enabled)
982
+ //
983
+ var volumeSlider = document.getElementById('volume_slider_{{player.id}}');
984
+ if (volumeSlider !== null) {
985
+ const volumeMin = parseInt('{{player.volume_slider.min_value}}');
986
+ const volumeMax = parseInt('{{player.volume_slider.max_value}}');
987
+ const volumeValue = parseInt('{{player.volume_slider.preset_value}}');
988
+ const volumeStep = parseInt('{{player.volume_slider.slider_step}}');
989
+
990
+ // if player has NO slider presets, use amplitude defaults
991
+ //
992
+ volumeSlider.min = (isNaN(volumeMin)) ? parseInt('{{amplitude_defaults.player.volume_slider.min_value}}') : volumeMin;
993
+ volumeSlider.max = (isNaN(volumeMax)) ? parseInt('{{amplitude_defaults.player.volume_slider.max_value}}') : volumeMax;
994
+ volumeSlider.value = (isNaN(volumeValue)) ? parseInt('{{amplitude_defaults.player.volume_slider.preset_value}}') : volumeValue;
995
+ volumeSlider.step = (isNaN(volumeStep)) ? parseInt('{{amplitude_defaults.player.volume_slider.slider_step}}') : volumeStep;
996
+ } // END volumeSlider exists
997
+
998
+ } // END large player UI events
999
+ {% endif %}
1000
+
1001
+ // ---------------------------------------------------------
1002
+ // START configured player features
1003
+
1004
+ logger.debug('\n' + 'set play next title: ' + playerPlayNextTitle);
1005
+ logger.debug('\n' + 'set delay between titles: ' + playerDelayNextTitle + 'ms');
1006
+ logger.debug('\n' + 'set repeat (album): ' + playerRepeat);
1007
+ logger.debug('\n' + 'set shuffle (album): ' + playerShuffle);
1008
+
1009
+ // set delay between titles (songs)
1010
+ Amplitude.setDelay(playerDelayNextTitle);
1011
+ // set repeat (album)
1012
+ Amplitude.setRepeat(playerRepeat);
1013
+ // set shuffle (album)
1014
+ Amplitude.setShuffle(playerShuffle);
1015
+
1016
+ // ---------------------------------------------------------
1017
+ // END configured player features
1018
+
1019
+ // finished messages
1020
+ // ---------------------------------------------------------
1021
+ logger.debug('\n' + 'current player state: ' + amplitudePlayerState);
1022
+ logger.debug('\n' + 'setup player specific UI events on ID #{{player.id}}: finished');
1023
+
1024
+ clearInterval(dependencies_met_api_initialized);
1025
+ } // END if apiInitialized
1026
+ }, 10); // END dependencies_met_api_initialized
1027
+
1028
+ playerExistsInPage = (document.getElementById(playerID + '_parent') !== null) ? true : false;
1029
+ pluginManagerEnabled = ('{{player.plugin_manager.enabled}}'.length > 0 && '{{player.plugin_manager.enabled}}' === 'true') ? true : playerDefaultPluginManager;
1030
+ if (playerExistsInPage && pluginManagerEnabled) {
1031
+ _this.pluginManager('{{player.plugin_manager.plugins}}');
1032
+ }
1033
+
1034
+ clearInterval(load_dependencies['dependencies_met_player_loaded_{{player.id}}']);
1035
+ } // END if xhrLoadState success
1036
+ }, 10); // END dependencies_met_html_loaded
1037
+
1038
+ {% endif %} {% endfor %}
1039
+
1040
+ logger.info('\n' + 'initialize player specific UI events: finished');
1041
+
1042
+ _this.setState('finished');
1043
+ logger.debug('\n' + 'module state: ' + _this.getState());
1044
+ logger.info('\n' + 'module initialized successfully');
1045
+
1046
+ endTimeModule = Date.now();
1047
+ logger.info('\n' + 'module initializing time: ' + (endTimeModule-startTimeModule) + 'ms');
1048
+
1049
+ clearInterval(dependencies_met_player_instances_initialized);
1050
+ } // END if apiInitialized
1051
+ }, 10); // END initialize player specific UI events
1052
+ }, // END initPlayerUiEvents
1053
+
1054
+ // -------------------------------------------------------------------------
1055
+ // START setAudioInfo
1056
+ setAudioInfo: (audioInfo) => {
1057
+ // jadams: ??? new config setting 'pause_on_audio_info' ???
1058
+ // when the audioInfo link is clicked, stop all propagation so
1059
+ // AmplitudeJS doesn't play the song.
1060
+ for (var i=0; i<audioInfo.length; i++) {
1061
+ audioInfo[i].addEventListener('click', function (event) {
1062
+ event.stopPropagation();
1063
+ });
1064
+ }
1065
+ }, // END setAudioInfo
1066
+
1067
+ // -------------------------------------------------------------------------
1068
+ // songEvents
1069
+ // -------------------------------------------------------------------------
1070
+ songEvents: (songs) => {
1071
+ logger.debug('\n' + 'initializing title events for player on ID ' + '#' + playerID + ': started');
1072
+
1073
+ for (var i = 0; i < songs.length; i++) {
1074
+ // ensure that on mouseover, CSS styles don't get messed up for active songs
1075
+ songs[i].addEventListener('mouseover', function() {
1076
+ // active song indicator (mini play button) in playlist
1077
+ if (!this.classList.contains('amplitude-active-song-container')) {
1078
+ if (this.querySelectorAll('.play-button-container')[0] !== undefined) {
1079
+ this.querySelectorAll('.play-button-container')[0].style.display = 'block';
1080
+ }
1081
+ } // END mini play button in playlist
1082
+ }); // END EventListener 'mouseover' (songlist)
1083
+
1084
+ // ensure that on mouseout, CSS styles don't get messed up for active songs
1085
+ songs[i].addEventListener('mouseout', function() {
1086
+ if (this.querySelectorAll('.play-button-container')[0] !== undefined) {
1087
+ this.querySelectorAll('.play-button-container')[0].style.display = 'none';
1088
+ }
1089
+ }); // END EventListener 'mouseout' (songlist)
1090
+
1091
+ // show|hide the (mini) play button when the song is clicked
1092
+ songs[i].addEventListener('click', function () {
1093
+ if (this.querySelectorAll('.play-button-container')[0] !== undefined) {
1094
+ this.querySelectorAll('.play-button-container')[0].style.display = 'none';
1095
+ }
1096
+ }); // END EventListener 'click' (songlist)
1097
+ }
1098
+
1099
+ logger.debug('\n' + 'initializing title events for player on ID ' + '#' + playerID + ': finished');
1100
+ }, // END songEvents
1101
+
1102
+ // -------------------------------------------------------------------------
1103
+ // pluginManager()
1104
+ //
1105
+ // -------------------------------------------------------------------------
1106
+ pluginManager: (plugin) => {
1107
+ // if (plugin === 'ytp' && j1.adapter.amplitude['ytPlayerReady'] === undefined ) {
1108
+ if (plugin === 'ytp') {
1109
+ var tech;
1110
+ var techScript;
1111
+
1112
+ tech = document.createElement('script');
1113
+ tech.id = 'tech_' + plugin;
1114
+ tech.src = '/assets/theme/j1/modules/amplitudejs/js/tech/' + plugin + '.js';
1115
+ techScript = document.getElementsByTagName('script')[0];
1116
+
1117
+ techScript.parentNode.insertBefore(tech, techScript);
1118
+ }
1119
+ }, // END pluginManager
1120
+
1121
+ // -------------------------------------------------------------------------
1122
+ // messageHandler()
1123
+ // manage messages send from other J1 modules
1124
+ // -------------------------------------------------------------------------
1125
+ messageHandler: (sender, message) => {
1126
+ var json_message = JSON.stringify(message, undefined, 2);
1127
+
1128
+ logText = '\n' + 'received message from ' + sender + ': ' + json_message;
1129
+ logger.debug(logText);
1130
+
1131
+ // -----------------------------------------------------------------------
1132
+ // process commands|actions
1133
+ // -----------------------------------------------------------------------
1134
+ if (message.type === 'command' && message.action === 'module_initialized') {
1135
+
1136
+ //
1137
+ // place handling of command|action here
1138
+ //
1139
+
1140
+ logger.info('\n' + message.text);
1141
+ }
1142
+
1143
+ //
1144
+ // place handling of other command|action here
1145
+ //
1146
+
1147
+ return true;
1148
+ }, // END messageHandler
1149
+
1150
+ // -------------------------------------------------------------------------
1151
+ // setState()
1152
+ // sets the current (processing) state of the module
1153
+ // -------------------------------------------------------------------------
1154
+ setState: (stat) => {
1155
+ _this.state = stat;
1156
+ }, // END setState
1157
+
1158
+ // -------------------------------------------------------------------------
1159
+ // getState()
1160
+ // Returns the current (processing) state of the module
1161
+ // -------------------------------------------------------------------------
1162
+ getState: () => {
1163
+ return _this.state;
1164
+ } // END getState
1165
+
1166
+ }; // END main (return)
1167
+ })(j1, window);
1168
+
1169
+ {%- endcapture -%}
1170
+
1171
+ {%- if production -%}
1172
+ {{ cache|minifyJS }}
1173
+ {%- else -%}
1174
+ {{ cache|strip_empty_lines }}
1175
+ {%- endif -%}
1176
+
1177
+ {%- assign cache = false -%}