j1-template 2024.3.13 → 2024.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_news_panel_posts.html +1 -1
  3. data/_includes/themes/j1/layouts/layout_resource_generator.html +1 -4
  4. data/_includes/themes/j1/procedures/blocks/footer/boxes/social_media_icons.proc +24 -23
  5. data/_includes/themes/j1/procedures/layouts/content_writer.proc +4 -3
  6. data/_includes/themes/j1/procedures/layouts/default_writer.proc +37 -6
  7. data/_includes/themes/j1/procedures/layouts/module_writer.proc +31 -95
  8. data/_includes/themes/j1/procedures/layouts/resource_writer.proc +51 -29
  9. data/assets/data/amplitude.28.html +887 -0
  10. data/assets/data/amplitude.29.html +923 -0
  11. data/assets/data/amplitude.html +311 -46
  12. data/assets/data/banner.html +9 -7
  13. data/assets/data/masterslider.html +128 -7
  14. data/assets/data/panel.html +16 -65
  15. data/assets/theme/j1/adapter/js/amplitude.23.js +1165 -0
  16. data/assets/theme/j1/adapter/js/amplitude.24.js +1164 -0
  17. data/assets/theme/j1/adapter/js/amplitude.25.js +1268 -0
  18. data/assets/theme/j1/adapter/js/amplitude.js +294 -117
  19. data/assets/theme/j1/adapter/js/attic.js +14 -11
  20. data/assets/theme/j1/adapter/js/docsearch.js +2 -2
  21. data/assets/theme/j1/adapter/js/fab.js +2 -2
  22. data/assets/theme/j1/adapter/js/j1.js +8 -8
  23. data/assets/theme/j1/adapter/js/lazyLoader.js +60 -10
  24. data/assets/theme/j1/adapter/js/masonry.js +1 -1
  25. data/assets/theme/j1/adapter/js/masterslider.js +2 -2
  26. data/assets/theme/j1/adapter/js/particles.js +2 -2
  27. data/assets/theme/j1/adapter/js/scroller.js +2 -2
  28. data/assets/theme/j1/adapter/js/slick.js +2 -2
  29. data/assets/theme/j1/adapter/js/themes.js +1 -1
  30. data/assets/theme/j1/adapter/js/translator.js +2 -2
  31. data/assets/theme/j1/adapter/js/waves.js +1 -1
  32. data/assets/theme/j1/core/css/animate.css +1634 -1070
  33. data/assets/theme/j1/core/css/animate.css.map +1 -0
  34. data/assets/theme/j1/core/css/animate.min.css +2 -1
  35. data/assets/theme/j1/core/css/animate.min.css.map +1 -0
  36. data/assets/theme/j1/core/css/icon-fonts/fontawesome.css +3060 -1538
  37. data/assets/theme/j1/core/css/icon-fonts/fontawesome.css.map +1 -0
  38. data/assets/theme/j1/core/css/icon-fonts/fontawesome.min.css +2 -1
  39. data/assets/theme/j1/core/css/icon-fonts/fontawesome.min.css.map +1 -0
  40. data/assets/theme/j1/core/css/icon-fonts/iconify.css +2308 -1153
  41. data/assets/theme/j1/core/css/icon-fonts/iconify.css.map +1 -0
  42. data/assets/theme/j1/core/css/icon-fonts/iconify.min.css +2 -1
  43. data/assets/theme/j1/core/css/icon-fonts/iconify.min.css.map +1 -0
  44. data/assets/theme/j1/core/css/icon-fonts/mdi.css +16716 -8423
  45. data/assets/theme/j1/core/css/icon-fonts/mdi.css.map +1 -0
  46. data/assets/theme/j1/core/css/icon-fonts/mdi.min.css +2 -1
  47. data/assets/theme/j1/core/css/icon-fonts/mdi.min.css.map +1 -0
  48. data/assets/theme/j1/core/css/icon-fonts/mdib.css +5554 -2766
  49. data/assets/theme/j1/core/css/icon-fonts/mdib.css.map +1 -0
  50. data/assets/theme/j1/core/css/icon-fonts/mdib.min.css +2 -1
  51. data/assets/theme/j1/core/css/icon-fonts/mdib.min.css.map +1 -0
  52. data/assets/theme/j1/core/css/icon-fonts/mdil.css +742 -441
  53. data/assets/theme/j1/core/css/icon-fonts/mdil.css.map +1 -0
  54. data/assets/theme/j1/core/css/icon-fonts/mdil.min.css +2 -1
  55. data/assets/theme/j1/core/css/icon-fonts/mdil.min.css.map +1 -0
  56. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.css +6552 -3980
  57. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.css.map +1 -0
  58. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.min.css +2 -5
  59. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.min.css.map +1 -0
  60. data/assets/theme/j1/core/css/themes/unodark/bootstrap.css +6818 -4131
  61. data/assets/theme/j1/core/css/themes/unodark/bootstrap.css.map +1 -0
  62. data/assets/theme/j1/core/css/themes/unodark/bootstrap.min.css +2 -5
  63. data/assets/theme/j1/core/css/themes/unodark/bootstrap.min.css.map +1 -0
  64. data/assets/theme/j1/core/css/themes/unolight/bootstrap.css +18568 -11577
  65. data/assets/theme/j1/core/css/themes/unolight/bootstrap.css.map +1 -0
  66. data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css +2 -35
  67. data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css.map +1 -0
  68. data/assets/theme/j1/core/css/vendor.css +1771 -1043
  69. data/assets/theme/j1/core/css/vendor.css.map +1 -0
  70. data/assets/theme/j1/core/css/vendor.min.css +2 -1
  71. data/assets/theme/j1/core/css/vendor.min.css.map +1 -0
  72. data/assets/theme/j1/core/js/template.js +399 -447
  73. data/assets/theme/j1/core/js/template.min.js +7 -7
  74. data/assets/theme/j1/core/js/template.min.js.map +1 -1
  75. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.css +4 -2
  76. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.css +39 -4
  77. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.min.css +1 -1
  78. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.css +57 -17
  79. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.min.css +1 -1
  80. data/assets/theme/j1/modules/amplitudejs/icons/player/blue/pause.png +0 -0
  81. data/assets/theme/j1/modules/amplitudejs/icons/player/blue/play.png +0 -0
  82. data/assets/theme/j1/modules/amplitudejs/icons/player/blue/play.svg +87 -0
  83. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/skip-backward.svg +60 -0
  84. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/skip-forward.svg +59 -0
  85. data/assets/theme/j1/modules/amplitudejs/js/amplitude.js +65 -21
  86. data/assets/theme/j1/modules/amplitudejs/js/amplitude.min.js +1 -1
  87. data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.js +113 -0
  88. data/assets/theme/j1/modules/iconPicker/js/universal-icon-picker.js +471 -471
  89. data/assets/theme/j1/modules/j1LazyLoader/LICENSE +21 -0
  90. data/assets/theme/j1/modules/j1LazyLoader/js/j1Lazy.js +870 -0
  91. data/assets/theme/j1/modules/js-cookies/js/js.cookie.js +3 -3
  92. data/assets/theme/j1/modules/lazyCssLoader/js/main.0.js +166 -0
  93. data/assets/theme/j1/modules/lazyCssLoader/js/main.1.js +65 -0
  94. data/assets/theme/j1/modules/lazyCssLoader/js/main.js +66 -0
  95. data/assets/theme/j1/modules/lazyCssLoader/js/plugins/examplePlugin.js +13 -0
  96. data/assets/theme/j1/modules/lazyCssLoader/js/plugins/my-plugin.js +25 -0
  97. data/assets/theme/j1/modules/lazyCssLoader/js/plugins/plugin-interface.js +9 -0
  98. data/assets/theme/j1/modules/lazyCssLoader/js/plugins/pluginA.js +46 -0
  99. data/assets/theme/j1/modules/lazyLoader/js/plugins/README.md +324 -0
  100. data/assets/theme/j1/modules/lazyLoader/js/plugins/jquery.lazy.picture.js +188 -0
  101. data/assets/theme/j1/modules/lightGallery/js/lightgallery.js +1 -1
  102. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.0.js +794 -0
  103. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.js +151 -67
  104. data/assets/theme/j1/modules/slimSelect/js/select.js +1 -1
  105. data/assets/theme/j1/modules/slimSelect/js/select.min.js +3 -3
  106. data/assets/theme/j1/modules/themeSwitcher/js/switcher.js +2 -1
  107. data/assets/theme/j1/modules/videojs/js/plugins/players/dm/dailymotion.min.js +1 -1
  108. data/assets/theme/j1/modules/videojs/js/plugins/players/dm/icon/scalable/dailymotion.svg +62 -0
  109. data/assets/theme/j1/modules/videojs/js/plugins/players/yt/v3.0.0/youtube.js +832 -0
  110. data/assets/theme/j1/modules/videojs/js/plugins/players/yt/v3.0.0/youtube.min.js +17 -0
  111. data/assets/theme/j1/modules/videojs/js/plugins/players/yt/youtube.min.js +1 -1
  112. data/assets/theme/j1/modules/videojs/js/video.js +2 -2
  113. data/lib/j1/version.rb +1 -1
  114. data/lib/starter_web/README.md +577 -560
  115. data/lib/starter_web/_config.yml +2 -2
  116. data/lib/starter_web/_data/blocks/footer.yml +10 -5
  117. data/lib/starter_web/_data/blocks/panel.yml +2 -2
  118. data/lib/starter_web/_data/layouts/default.yml +14 -3
  119. data/lib/starter_web/_data/modules/amplitude.yml +145 -0
  120. data/lib/starter_web/_data/modules/defaults/amplitude.yml +29 -7
  121. data/lib/starter_web/_data/modules/defaults/lazyLoader.yml +2 -2
  122. data/lib/starter_web/_data/modules/gallery.yml +136 -0
  123. data/lib/starter_web/_data/modules/lazyLoader.0.yml +118 -0
  124. data/lib/starter_web/_data/modules/lazyLoader.yml +68 -31
  125. data/lib/starter_web/_data/modules/masonry.yml +4 -4
  126. data/lib/starter_web/_data/modules/masterslider.yml +118 -12
  127. data/lib/starter_web/_data/modules/navigator_menu.yml +831 -803
  128. data/lib/starter_web/_data/resources.yml +154 -190
  129. data/lib/starter_web/_data/templates/feed.xml +1 -1
  130. data/lib/starter_web/_includes/attributes.asciidoc +1 -0
  131. data/lib/starter_web/_plugins/asciidoctor/amplitude-block.rb +1 -1
  132. data/lib/starter_web/_plugins/asciidoctor/dailymotion-block.rb +1 -1
  133. data/lib/starter_web/_plugins/asciidoctor/gallery-block.rb +4 -2
  134. data/lib/starter_web/_plugins/asciidoctor/masonry-block.rb +1 -1
  135. data/lib/starter_web/_plugins/asciidoctor/videojs-block.rb +58 -46
  136. data/lib/starter_web/_plugins/asciidoctor/vimeo-block.rb +26 -19
  137. data/lib/starter_web/_plugins/asciidoctor/youtube-block.rb +30 -40
  138. data/lib/starter_web/_plugins/index/lunr.rb +1 -1
  139. data/lib/starter_web/assets/image/icons/lanus/favicon.ico +0 -0
  140. data/lib/starter_web/assets/image/icons/lanus/lanus-512x512.png +0 -0
  141. data/lib/starter_web/assets/image/icons/lanus/lanus.ico +0 -0
  142. data/lib/starter_web/assets/image/icons/lanus/lanus.png +0 -0
  143. data/lib/starter_web/assets/image/icons/lanus/scalable/lanus.svg +76 -0
  144. data/lib/starter_web/assets/image/icons/lanus/scalable/lanus_sw.svg +62 -0
  145. data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x-28 - social.svg +86 -0
  146. data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x-28.svg +64 -0
  147. data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x.svg +1 -0
  148. data/lib/starter_web/assets/image/modules/icons/social/twitter_x.png +0 -0
  149. data/lib/starter_web/package.json +7 -18
  150. data/lib/starter_web/pages/public/amplitude_yt_tester.adoc +218 -0
  151. data/lib/starter_web/pages/public/features/template.adoc +18 -8
  152. data/lib/starter_web/pages/public/features/template.asciidoc +758 -0
  153. data/lib/starter_web/pages/public/lazy_loader_tester.adoc +402 -0
  154. data/lib/starter_web/pages/public/manuals/ytdl/man.adoc +3020 -0
  155. data/lib/starter_web/pages/public/manuals/ytdl/man.md +2378 -0
  156. data/lib/starter_web/pages/public/tools/previewer/_includes/attributes.asciidoc +0 -16
  157. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/amplitudejs.large.css.asciidoc +505 -0
  158. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.hover.html +69 -0
  159. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.nested.html +75 -0
  160. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.textarea.html +57 -0
  161. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/my.content.html +112 -0
  162. data/lib/starter_web/pages/public/tools/previewer/preview_amplitudejs.adoc +172 -0
  163. data/lib/starter_web/pages/public/tour/_includes/attributes.asciidoc +2 -2
  164. data/lib/starter_web/pages/public/tour/_includes/documents/419_advanced_modals_demo.asciidoc +16 -16
  165. data/lib/starter_web/pages/public/tour/asciidoc_extensions.adoc +13 -3
  166. data/lib/starter_web/pages/public/tour/bootstrap_themes.adoc +12 -3
  167. data/lib/starter_web/pages/public/tour/highlghter_rouge.adoc +13 -3
  168. data/lib/starter_web/pages/public/tour/icon_fonts.adoc +12 -3
  169. data/lib/starter_web/pages/public/tour/modal_extentions.adoc +12 -6
  170. data/lib/starter_web/pages/public/tour/{playback_audio.adoc → play_audio.adoc} +207 -188
  171. data/lib/starter_web/pages/public/tour/{playback_video.adoc → play_video.adoc} +49 -51
  172. data/lib/starter_web/pages/public/tour/present_images.adoc +27 -5
  173. data/lib/starter_web/pages/public/tour/quicksearch.adoc +13 -3
  174. data/lib/starter_web/pages/public/tour/responsive_tables.adoc +13 -4
  175. data/lib/starter_web/pages/public/tour/typography.adoc +12 -3
  176. metadata +90 -22
  177. /data/assets/theme/j1/modules/{lazyLoader → j1LazyLoader/js}/plugins/README.md +0 -0
  178. /data/assets/theme/j1/modules/{lazyLoader/plugins/jquery.lazy.picture.js → j1LazyLoader/js/plugins/picture.js} +0 -0
  179. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.ajax.js +0 -0
  180. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.ajax.min.js +0 -0
  181. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.av.js +0 -0
  182. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.av.min.js +0 -0
  183. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.iframe.js +0 -0
  184. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.iframe.min.js +0 -0
  185. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.noop.js +0 -0
  186. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.noop.min.js +0 -0
  187. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.picture.min.js +0 -0
  188. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.script.js +0 -0
  189. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.script.min.js +0 -0
  190. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.vimeo.js +0 -0
  191. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.vimeo.min.js +0 -0
  192. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.youtube.js +0 -0
  193. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.youtube.min.js +0 -0
@@ -0,0 +1,1165 @@
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
+ // göobal 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
+ // amplitude 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
+
133
+ // amplitude player (instance) settings
134
+ // NOTE: slider VALUE is set by Adapter|Amplitude API
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
+ var playerAudioInfo = ('{{amplitude_defaults.playlist.audio_info}}' === 'true') ? true : false;
144
+ var playerDefaultType = '{{amplitude_defaults.player.type}}';
145
+ var playerVolumeValue = '{{amplitude_defaults.player.volume_slider.preset_value}}';
146
+ var playerVolumeSliderStep = '{{amplitude_defaults.player.volume_slider.slider_step}}';
147
+ var playerRepeat = ('{{amplitude_defaults.player.repeat}}' === 'true') ? true : false;
148
+ var playerShuffle = ('{{amplitude_defaults.player.shuffle}}' === 'true') ? true : false;
149
+ var playerPlayNextTitle = ('{{amplitude_defaults.player.play_next_title}}' === 'true') ? true : false;
150
+ var playerPauseNextTitle = ('{{amplitude_defaults.player.pause_next_title}}' === 'true') ? true : false;
151
+ var playerDelayNextTitle = '{{amplitude_defaults.player.delay_next_title}}';
152
+ var playerForwardBackwardSkipSeconds = '{{amplitude_defaults.player.forward_backward_skip_seconds}}';
153
+
154
+ // unused settings
155
+ // ---------------------------------------------------------------------------
156
+ // var playerWaveformSampleRate = '{{amplitude_defaults.player.waveform_sample_rate}}';
157
+
158
+ // ---------------------------------------------------------------------------
159
+ // main
160
+ // ---------------------------------------------------------------------------
161
+ return {
162
+
163
+ // -------------------------------------------------------------------------
164
+ // adapter initializer
165
+ // -------------------------------------------------------------------------
166
+ init: (options) => {
167
+
168
+ // -----------------------------------------------------------------------
169
+ // default module settings
170
+ // -----------------------------------------------------------------------
171
+ var settings = $.extend({
172
+ module_name: 'j1.adapter.amplitude',
173
+ generated: '{{site.time}}'
174
+ }, options);
175
+
176
+ // -----------------------------------------------------------------------
177
+ // global variable settings
178
+ // -----------------------------------------------------------------------
179
+ amplitudeDefaults = $.extend({}, {{amplitude_defaults | replace: 'nil', 'null' | replace: '=>', ':' }});
180
+ amplitudeSettings = $.extend({}, {{amplitude_settings | replace: 'nil', 'null' | replace: '=>', ':' }});
181
+ amplitudeOptions = $.extend(true, {}, amplitudeDefaults, amplitudeSettings);
182
+
183
+ // -----------------------------------------------------------------------
184
+ // control|logging settings
185
+ // -----------------------------------------------------------------------
186
+ _this = j1.adapter.amplitude;
187
+ logger = log4javascript.getLogger('j1.adapter.amplitude');
188
+
189
+
190
+ // -----------------------------------------------------------------------
191
+ // module initializer
192
+ // -----------------------------------------------------------------------
193
+ var dependencies_met_page_ready = setInterval (() => {
194
+ var pageState = $('#content').css("display");
195
+ var pageVisible = (pageState === 'block') ? true : false;
196
+ var j1CoreFinished = (j1.getState() === 'finished') ? true : false;
197
+ // var atticFinished = (j1.adapter.attic.getState() == 'finished') ? true : false;
198
+
199
+ if (j1CoreFinished && pageVisible) {
200
+ startTimeModule = Date.now();
201
+
202
+ _this.setState('started');
203
+ logger.debug('\n' + 'module state: ' + _this.getState());
204
+ logger.info('\n' + 'module is being initialized');
205
+
206
+ // jQuery('.scrollbar-rail').scrollbar();
207
+
208
+ // -------------------------------------------------------------------
209
+ // create global playlist (songs)
210
+ // -------------------------------------------------------------------
211
+ var songs = [];
212
+ _this.songLoader(songs);
213
+
214
+ // -------------------------------------------------------------------
215
+ // load all players (HTML|UI)
216
+ // -------------------------------------------------------------------
217
+ _this.playerHtmlLoader(playersUILoaded);
218
+ // _this.ytpAudioInit("bla");
219
+
220
+ // -------------------------------------------------------------------
221
+ // inititialize amplitude api
222
+ // -------------------------------------------------------------------
223
+ var dependencies_met_players_loaded = setInterval (() => {
224
+ if (playersUILoaded.state) {
225
+ _this.initApi(songs);
226
+ _this.ytpAudioInit({
227
+ ytpVideoID: "qEhzpBJpUq0",
228
+ ytpAutoPlay: ytpAutoPlay,
229
+ ytpLoop: ytpLoop
230
+ });
231
+
232
+ clearInterval(dependencies_met_players_loaded);
233
+ } // END if playersUILoaded
234
+ }, 10); // END dependencies_met_players_loaded
235
+
236
+ // -------------------------------------------------------------------
237
+ // initialize player specific UI events
238
+ // -------------------------------------------------------------------
239
+ var dependencies_met_api_initialized = setInterval (() => {
240
+ if (apiInitialized.state) {
241
+ _this.initPlayerUiEvents();
242
+
243
+ clearInterval(dependencies_met_api_initialized);
244
+ } // END if apiInitialized
245
+ }, 10); // END dependencies_met_api_initialized
246
+
247
+ clearInterval(dependencies_met_page_ready);
248
+ } // END pageVisible
249
+ }, 10); // END dependencies_met_page_ready
250
+ }, // END init
251
+
252
+ // -------------------------------------------------------------------------
253
+ // Create global playlist|songs (API)
254
+ // -------------------------------------------------------------------------
255
+ songLoader: (songs) => {
256
+
257
+ logger.info('\n' + 'creating global playlist (API): started');
258
+
259
+ // -----------------------------------------------------------------------
260
+ // initialize amplitude songs
261
+ // -----------------------------------------------------------------------
262
+ {% for playlist in amplitude_settings.playlists %} {% if playlist.enabled %}
263
+ var song_items = $.extend({}, {{playlist.items | replace: 'nil', 'null' | replace: '=>', ':' }});
264
+
265
+ for (var i = 0; i < Object.keys(song_items).length; i++) {
266
+ if (song_items[i].enabled) {
267
+ var item = song_items[i];
268
+ var song = {};
269
+
270
+ // map config settings|amplitude song items
271
+ // -----------------------------------------------------------------
272
+ for (const key in item) {
273
+ // skip properties NOT needed for a song
274
+ if (key === 'item' || key === 'audio_base' || key === 'enabled') {
275
+ continue;
276
+ } else if (key === 'audio') {
277
+ song.url = item.audio_base + '/' + item[key];
278
+ continue;
279
+ } else if (key === 'title') {
280
+ song.name = item[key];
281
+ continue;
282
+ } else if (key === 'name') {
283
+ song.album = item[key];
284
+ continue;
285
+ } else if (key === 'cover_image') {
286
+ song.cover_art_url = item[key];
287
+ continue;
288
+ } else if (key === 'audio_info') {
289
+ if (playerAudioInfo) {
290
+ song.audio_info = item[key];
291
+ } else {
292
+ song.audio_info = '';
293
+ } // END if playerAudioInfo
294
+ continue;
295
+ } else {
296
+ song[key] = item[key];
297
+ } // END if key
298
+ } // END for item
299
+ } // END id enabled
300
+
301
+ songs.push(song);
302
+ } // END for song_items
303
+
304
+ {% endif %} {% endfor %}
305
+
306
+ logger.info('\n' + 'creating global playlist (API): finished');
307
+ }, // END songLoader
308
+
309
+ // -------------------------------------------------------------------------
310
+ // load players HTML portion (UI)
311
+ // -------------------------------------------------------------------------
312
+ playerHtmlLoader: (playersLoaded) => {
313
+ var playerExistsInPage;
314
+
315
+ // -----------------------------------------------------------------------
316
+ // initialize HTML portion (UI) for all players configured|enabled
317
+ // -----------------------------------------------------------------------
318
+ logger.info('\n' + 'loading player HTML components (UI): started');
319
+
320
+ {% for player in amplitude_options.players %} {% if player.enabled %}
321
+ {% assign xhr_data_path = amplitude_options.xhr_data_path %}
322
+ {% capture xhr_container_id %}{{player.id}}_parent{% endcapture %}
323
+
324
+ // load players only that are configured in current page
325
+ //
326
+ playerExistsInPage = ($('#' + '{{xhr_container_id}}')[0] !== undefined) ? true : false;
327
+ if (playerExistsInPage) {
328
+ playerCounter++;
329
+ logger.debug('\n' + 'load player UI on ID #{{player.id}}: started');
330
+
331
+ j1.loadHTML({
332
+ xhr_container_id: '{{xhr_container_id}}',
333
+ xhr_data_path: '{{xhr_data_path}}',
334
+ xhr_data_element: '{{player.id}}'
335
+ },
336
+ 'j1.adapter.amplitude',
337
+ 'data_loaded'
338
+ );
339
+
340
+ // dynamic loader variable to setup the player on ID {{player.id}}
341
+ dependency = 'dependencies_met_html_loaded_{{player.id}}';
342
+ load_dependencies[dependency] = '';
343
+
344
+ // ---------------------------------------------------------------------
345
+ // initialize amplitude instance (when player UI loaded)
346
+ // ---------------------------------------------------------------------
347
+ load_dependencies['dependencies_met_html_loaded_{{player.id}}'] = setInterval (() => {
348
+ // check if HTML portion of the player is loaded successfully
349
+ xhrLoadState = j1.xhrDOMState['#' + '{{xhr_container_id}}'];
350
+
351
+ if (xhrLoadState === 'success') {
352
+ playersProcessed.push('{{xhr_container_id}}');
353
+ logger.debug('\n' + 'load player UI on ID #{{player.id}}: finished');
354
+
355
+ clearInterval(load_dependencies['dependencies_met_html_loaded_{{player.id}}']);
356
+ }
357
+ }, 10); // END dependencies_met_html_loaded
358
+ } // END if playerExistsInPage
359
+
360
+ {% endif %} {% endfor %}
361
+
362
+ load_dependencies['dependencies_met_players_loaded'] = setInterval (() => {
363
+
364
+ if (playersProcessed.length === playerCounter) {
365
+ processingPlayersFinished = true;
366
+ }
367
+
368
+ if (processingPlayersFinished) {
369
+ logger.info('\n' + 'loading player HTML components (UI): finished');
370
+
371
+ clearInterval(load_dependencies['dependencies_met_players_loaded']);
372
+ playersLoaded.state = true;
373
+ }
374
+ }, 10); // END dependencies_met_players_loaded
375
+
376
+ }, // END playerHtmlLoader
377
+
378
+ // -------------------------------------------------------------------------
379
+ // initApi
380
+ // -------------------------------------------------------------------------
381
+ initApi: (songlist) => {
382
+
383
+ logger.info('\n' + 'initialze API: started');
384
+
385
+ {% comment %} collect playlists
386
+ -------------------------------------------------------------------------- {% endcomment %}
387
+ {% assign playlists_enabled = 0 %}
388
+ {% for list in amplitude_settings.playlists %} {% if list.enabled %}
389
+ {% assign playlists_enabled = playlists_enabled | plus: 1 %}
390
+ {% endif %} {% endfor %}
391
+
392
+ {% assign playlists_processed = 0 %}
393
+ {% for list in amplitude_settings.playlists %} {% if list.enabled %}
394
+ {% assign playlist_items = list.items %}
395
+ {% assign playlist_name = list.name %}
396
+ {% assign playlist_title = list.title %}
397
+
398
+ {% comment %} collect song items
399
+ ------------------------------------------------------------------------ {% endcomment %}
400
+ {% for item in playlist_items %} {% if item.enabled %}
401
+ {% capture song_item %}
402
+ {
403
+ "name": "{{item.title}}",
404
+ "artist": "{{item.artist}}",
405
+ "album": "{{item.name}}",
406
+ "url": "{{item.audio_base}}/{{item.audio}}",
407
+ "cover_art_url": "{{item.cover_image}}"
408
+ }{% if forloop.last %}{% else %},{% endif %}
409
+ {% endcapture %}
410
+ {% capture song_items %}{{song_items}} {{song_item}}{% endcapture %}
411
+
412
+ {% comment %} create playlist
413
+ ---------------------------------------------------------------------- {% endcomment %}
414
+ {% if forloop.last %}
415
+ {% capture playlist %}
416
+ "{{playlist_name}}": {
417
+ "title": "{{playlist_title}}",
418
+ "songs": [
419
+ {{song_items}}
420
+ ]
421
+ }
422
+ {% endcapture %}
423
+ {% assign playlists_processed = playlists_processed | plus: 1 %}
424
+
425
+ {% comment %} reset song_items
426
+ -------------------------------------------------------------------- {% endcomment %}
427
+ {% capture song_items %}{% endcapture %}
428
+ {% endif %}
429
+ {% endif %} {% endfor %}
430
+
431
+ {% comment %} collect playlists players enabled
432
+ ------------------------------------------------------------------------ {% endcomment %}
433
+ {% capture playlists %}
434
+ {{playlists}} {{playlist}} {% if playlists_processed == playlists_enabled %}{% else %},{% endif %}
435
+ {% endcapture %}
436
+
437
+ {% endif %} {% endfor %}
438
+
439
+ // See: https://521dimensions.com/open-source/amplitudejs/docs
440
+ // NOTE: slider VALUE (volume) is set by DEFAULT settings (player)
441
+ Amplitude.init({
442
+ bindings: {
443
+ 33: 'play_pause',
444
+ 37: 'prev',
445
+ 39: 'next'
446
+ },
447
+ songs: songlist,
448
+ playlists: {
449
+ {{playlists}}
450
+ },
451
+ callbacks: {
452
+ initialized: function() {
453
+ var amplitudeConfig = Amplitude.getConfig();
454
+ logger.info('\n' + 'initialze API: finished');
455
+ // indicate api successfully initialized
456
+ apiInitialized.state = true;
457
+ },
458
+ onInitError: function() {
459
+ // indicate api failed on initialization
460
+ apiInitialized.state = false;
461
+ console.error('\n' + 'Amplitude API failed on initialization');
462
+ },
463
+ play: function() {
464
+ var songMetaData = Amplitude.getActiveSongMetadata();
465
+ logger.debug('\n' + 'playing title: ' + songMetaData.name);
466
+ document.getElementById('album-art').style.visibility = 'hidden';
467
+ document.getElementById('large-visualization').style.visibility = 'visible';
468
+ },
469
+ pause: function() {
470
+ var songMetaData = Amplitude.getActiveSongMetadata();
471
+ logger.debug('\n' + 'pause title: ' + songMetaData.name);
472
+ document.getElementById('album-art').style.visibility = 'visible';
473
+ document.getElementById('large-visualization').style.visibility = 'hidden';
474
+ },
475
+ song_change: function() {
476
+ var songMetaData = Amplitude.getActiveSongMetadata();
477
+ logger.debug('\n' + 'changed to title: ' + songMetaData.name + ' with titleIndex ' + songMetaData.index);
478
+ },
479
+ next: function() {
480
+ var songMetaData = Amplitude.getActiveSongMetadata();
481
+
482
+ if (playerDelayNextTitle) {
483
+ logger.debug('\n' + 'delay on next title: ' + songMetaData.name + ' with titleIndex ' + songMetaData.index);
484
+ }
485
+
486
+ if (playerPauseNextTitle) {
487
+ amplitudePlayerState = Amplitude.getPlayerState();
488
+ if (amplitudePlayerState === 'playing' || amplitudePlayerState === 'stopped' ) {
489
+ setTimeout(() => {
490
+ // pause playback of next title
491
+ logger.debug('\n' + 'paused on next title: ' + songMetaData.name);
492
+ Amplitude.pause();
493
+ }, 150);
494
+ } // END if playing
495
+ } // END if pause on next title
496
+ },
497
+ prev: function() {
498
+ var songMetaData = Amplitude.getActiveSongMetadata();
499
+
500
+ if (playerDelayNextTitle) {
501
+ logger.debug('\n' + 'delay on previous title: ' + songMetaData.name + ' with titleIndex ' + songMetaData.index);
502
+ }
503
+
504
+ if (playerPauseNextTitle) {
505
+ amplitudePlayerState = Amplitude.getPlayerState();
506
+ if (amplitudePlayerState === 'playing' || amplitudePlayerState === 'stopped' ) {
507
+ setTimeout(() => {
508
+ // pause playback of next title
509
+ logger.debug('\n' + 'paused on next title: ' + songMetaData.name);
510
+ Amplitude.pause();
511
+ }, 150);
512
+ } // END if playing
513
+ } // END if pause on next title
514
+ }
515
+ }, // END callbacks
516
+ // waveforms: {
517
+ // sample_rate: playerWaveformSampleRate
518
+ // },
519
+ continue_next: playerPlayNextTitle,
520
+ volume: playerVolumeValue,
521
+ volume_decrement: playerVolumeSliderStep,
522
+ volume_increment: playerVolumeSliderStep
523
+ }); // END Amplitude init
524
+
525
+ }, // END initApi
526
+
527
+ // -------------------------------------------------------------------------
528
+ // initPlayerUiEvents
529
+ // -------------------------------------------------------------------------
530
+ initPlayerUiEvents: () => {
531
+
532
+ var dependencies_met_player_instances_initialized = setInterval (() => {
533
+ if (apiInitialized.state) {
534
+ logger.info('\n' + 'initialize player specific UI events: started');
535
+
536
+ {% for player in amplitude_options.players %} {% if player.enabled %}
537
+ {% assign xhr_data_path = amplitude_options.xhr_data_path %}
538
+ {% capture xhr_container_id %}{{player.id}}_parent{% endcapture %}
539
+
540
+ playerID = '{{player.id}}';
541
+ playerType = '{{player.type}}';
542
+ playList = '{{player.playlist}}';
543
+ playListName = '{{player.playlist.name}}'
544
+ playListTitle = '{{player.playlist.title}}';
545
+
546
+ logger.debug('\n' + 'set playlist {{player.playlist}} on id #{{player.id}} with title: ' + playListTitle);
547
+
548
+ // dynamic loader variable to setup the player on ID {{player.id}}
549
+ dependency = 'dependencies_met_player_loaded_{{player.id}}';
550
+ load_dependencies[dependency] = '';
551
+
552
+ // -----------------------------------------------------------------
553
+ // initialize player instance (when player UI is loaded)
554
+ // -----------------------------------------------------------------
555
+ load_dependencies['dependencies_met_player_loaded_{{player.id}}'] = setInterval (() => {
556
+ // check if HTML portion of the player is loaded successfully
557
+ var xhrLoadState = j1.xhrDOMState['#' + '{{xhr_container_id}}'];
558
+
559
+ if (xhrLoadState === 'success') {
560
+
561
+ // set song (title) specific audio info links
562
+ // -------------------------------------------------------------
563
+ if (playerAudioInfo) {
564
+ var infoLinks = document.getElementsByClassName('audio-info-link');
565
+ _this.setAudioInfo(infoLinks);
566
+ }
567
+
568
+ // jadams, 2024-10-19: (song) events DISABLED
569
+ // set song (title) specific UI events
570
+ // -------------------------------------------------------------
571
+ // var songElements = document.getElementsByClassName('song');
572
+ // _this.songEvents(songElements);
573
+
574
+ // player specific UI events
575
+ // -------------------------------------------------------------
576
+ logger.debug('\n' + 'setup player specific UI events on ID #{{player.id}}: started');
577
+
578
+ var dependencies_met_api_initialized = setInterval (() => {
579
+ if (apiInitialized.state) {
580
+ amplitudePlayerState = Amplitude.getPlayerState();
581
+
582
+ {% if player.id contains 'mini' %}
583
+ // ---------------------------------------------------------
584
+ // START mini player UI events
585
+ //
586
+ if (document.getElementById('{{player.id}}') !== null) {
587
+
588
+ // click on progress bar
589
+ // -------------------------------------------------------
590
+
591
+ // getElementsByClassName returns an Array-like object
592
+ var progressBars = document.getElementsByClassName("mini-player-progress");
593
+
594
+ // add listeners to all progress bars found
595
+ for (var i=0; i<progressBars.length; i++) {
596
+ progressBars[i].addEventListener('click', function(event) {
597
+ var offset = this.getBoundingClientRect();
598
+ var xpos = event.pageX - offset.left;
599
+
600
+ Amplitude.setSongPlayedPercentage(
601
+ (parseFloat(xpos)/parseFloat(this.offsetWidth))*100);
602
+ });
603
+ }
604
+
605
+ } // END mini player UI events
606
+ {% endif %}
607
+
608
+ {% if player.id contains 'compact' %}
609
+ // ---------------------------------------------------------
610
+ // START compact player UI events
611
+ //
612
+ if (document.getElementById('{{player.id}}') !== null) {
613
+
614
+ // show|hide scrollbar in playlist
615
+ // -------------------------------------------------------
616
+ const songsInPlaylist = Amplitude.getSongsInPlaylist(playListName);
617
+ if (songsInPlaylist.length <= 8) {
618
+ const titleListCompactPlayer = document.getElementById('compact_player_title_list_' + playListName);
619
+ if (titleListCompactPlayer !== null) {
620
+ titleListCompactPlayer.classList.add('hide-scrollbar');
621
+ }
622
+ }
623
+
624
+ // show|hide playlist
625
+ // -------------------------------------------------------
626
+
627
+ // show playlist
628
+ var showPlaylist = document.getElementById("show_playlist_{{player.id}}");
629
+ if (showPlaylist !== null) {
630
+ showPlaylist.addEventListener('click', function(event) {
631
+ var scrollOffset = (window.innerWidth >= 720) ? -130 : -110;
632
+
633
+ // scroll player to top position
634
+ const targetDiv = document.getElementById("show_playlist_{{player.id}}");
635
+ const targetDivPosition = targetDiv.offsetParent.offsetTop;
636
+ window.scrollTo(0, targetDivPosition + scrollOffset);
637
+
638
+ // open playlist
639
+ var playlistScreen = document.getElementById("playlist_screen_{{player.id}}");
640
+
641
+ playlistScreen.classList.remove('slide-out-top');
642
+ playlistScreen.classList.add('slide-in-top');
643
+ playlistScreen.style.display = "block";
644
+ playlistScreen.style.zIndex = "999";
645
+
646
+ // disable scrolling (if window viewport >= BS Medium and above)
647
+ if (window.innerWidth >= 720) {
648
+ if ($('body').hasClass('stop-scrolling')) {
649
+ return false;
650
+ } else {
651
+ $('body').addClass('stop-scrolling');
652
+ }
653
+ }
654
+ }); // END EventListener 'click' (compact player|show playlist)
655
+ }
656
+
657
+ // hide playlist
658
+ var hidePlaylist = document.getElementById("hide_playlist_{{player.id}}");
659
+ if (hidePlaylist !== null) {
660
+ hidePlaylist.addEventListener('click', function(event) {
661
+ var playlistScreen = document.getElementById("playlist_screen_{{player.id}}");
662
+
663
+ playlistScreen.classList.remove('slide-in-top');
664
+ playlistScreen.classList.add('slislide-out-top');
665
+ playlistScreen.style.display = "none";
666
+ playlistScreen.style.zIndex = "1";
667
+
668
+ // enable scrolling
669
+ if ($('body').hasClass('stop-scrolling')) {
670
+ $('body').removeClass('stop-scrolling');
671
+ }
672
+ }); // END EventListener 'click' (compact player|show playlist)
673
+ }
674
+
675
+ // click on progress bar
676
+ // -------------------------------------------------------
677
+
678
+ // getElementsByClassName returns an Array-like object
679
+ var progressBars = document.getElementsByClassName("compact-player-progress");
680
+
681
+ // add listeners to all progress bars found
682
+ for (var i=0; i<progressBars.length; i++) {
683
+ progressBars[i].addEventListener('click', function(event) {
684
+ var offset = this.getBoundingClientRect();
685
+ var xpos = event.pageX - offset.left;
686
+
687
+ Amplitude.setSongPlayedPercentage(
688
+ (parseFloat(xpos)/parseFloat(this.offsetWidth))*100);
689
+ }); // END EventListener 'click'
690
+ }
691
+
692
+ // click on skip forward|backward (compact player)
693
+ // See: https://github.com/serversideup/amplitudejs/issues/384
694
+ // -------------------------------------------------------
695
+
696
+ // add listeners to all SkipForwardButtons found
697
+ var compactPlayerSkipForwardButtons = document.getElementsByClassName("compact-player-skip-forward");
698
+ for (var i=0; i<compactPlayerSkipForwardButtons.length; i++) {
699
+ if (compactPlayerSkipForwardButtons[i].id === 'skip-forward_{{player.id}}') {
700
+ compactPlayerSkipForwardButtons[i].addEventListener('click', function(event) {
701
+ const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
702
+ const duration = Amplitude.getSongDuration();
703
+ const currentTime = parseFloat(Amplitude.getSongPlayedSeconds());
704
+ const targetTime = parseFloat(currentTime + skipOffset);
705
+
706
+ if (currentTime > 0) {
707
+ Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
708
+ } // END EventListener 'click'
709
+ });
710
+ } // END if ID
711
+ } // END for SkipForwardButtons
712
+
713
+ // add listeners to all SkipBackwardButtons found
714
+ var compactPlayerSkipBackwardButtons = document.getElementsByClassName("compact-player-skip-backward");
715
+ for (var i=0; i<compactPlayerSkipBackwardButtons.length; i++) {
716
+ if (compactPlayerSkipBackwardButtons[i].id === 'skip-backward_{{player.id}}') {
717
+ compactPlayerSkipBackwardButtons[i].addEventListener('click', function(event) {
718
+ const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
719
+ const duration = Amplitude.getSongDuration();
720
+ const currentTime = parseFloat(Amplitude.getSongPlayedSeconds());
721
+ const targetTime = parseFloat(currentTime - skipOffset);
722
+
723
+ if (currentTime > 0) {
724
+ Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
725
+ } // END EventListener 'click'
726
+ });
727
+ } // END if ID
728
+ } // END for SkipBackwardButtons
729
+
730
+ // click on shuffle button
731
+ var compactPlayerShuffleButton = document.getElementById('compact_player_shuffle');
732
+ if (compactPlayerShuffleButton) {
733
+ compactPlayerShuffleButton.addEventListener('click', function(event) {
734
+ var shuffleState = (document.getElementById('compact_player_shuffle').className.includes('amplitude-shuffle-on')) ? true : false;
735
+ Amplitude.setShuffle(shuffleState)
736
+ }); // END EventListener 'click'
737
+ } // END compactPlayerShuffleButton
738
+
739
+ // click on repeat button
740
+ var compactPlayerRepeatButton = document.getElementById('compact_player_repeat');
741
+ if (compactPlayerRepeatButton) {
742
+ compactPlayerRepeatButton.addEventListener('click', function(event) {
743
+ var repeatState = (document.getElementById('compact_player_repeat').className.includes('amplitude-repeat-on')) ? true : false;
744
+ Amplitude.setRepeat(repeatState)
745
+ }); // END EventListener 'click'
746
+ } // END compactPlayerRepeatButton
747
+
748
+ } // END compact player UI events
749
+ {% endif %}
750
+
751
+ {% if player.id contains 'large' %}
752
+ // START large player UI events
753
+ //
754
+ if (document.getElementById('{{player.id}}') !== null) {
755
+
756
+ // listener overloads for Youtube video (large player)
757
+ // -------------------------------------------------------
758
+
759
+ // click on prev button
760
+ var largePlayerPreviousButton = document.getElementById('large_player_previous');
761
+ if (largePlayerPreviousButton && largePlayerPreviousButton.getAttribute("data-amplitude-source") === 'youtube') {
762
+ largePlayerPreviousButton.addEventListener('click', function(event) {
763
+ var playlist = this.getAttribute("data-amplitude-playlist");
764
+ var songIndex = ytpSongIndex; // Amplitude.getActiveIndex();
765
+
766
+ }); // END EventListener 'click'
767
+ }
768
+
769
+ // click on play_pause button
770
+ var largePlayerPlayButton = document.getElementById('large_player_play_pause');
771
+ if (largePlayerPlayButton && largePlayerPlayButton.getAttribute("data-amplitude-source") === 'youtube') {
772
+ largePlayerPlayButton.addEventListener('click', function(event) {
773
+ var playlist = this.getAttribute("data-amplitude-playlist");
774
+ var songMetaData = Amplitude.getSongAtIndex(ytpSongIndex);
775
+ var songURL = songMetaData.url;
776
+ // Amplitude.getActiveIndex();
777
+ var songIndex = ytpSongIndex;
778
+ }); // END EventListener 'click'
779
+ }
780
+
781
+ // click on next button
782
+ var largePlayerNextButton = document.getElementById('large_player_next');
783
+ if (largePlayerNextButton && largePlayerPlayButton.getAttribute("data-amplitude-source") === 'youtube') {
784
+ largePlayerNextButton.addEventListener('click', function(event) {
785
+ var playlist = this.getAttribute("data-amplitude-playlist");
786
+ var songIndex = ytpSongIndex; // Amplitude.getActiveIndex();
787
+ }); // END EventListener 'click'
788
+ }
789
+
790
+ // click on song container
791
+ var largetPlayerSongContainer = document.getElementsByClassName("song amplitude-song-container");
792
+ for (var i=0; i<largetPlayerSongContainer.length; i++) {
793
+ if (largetPlayerSongContainer[i].dataset.amplitudeSource === 'youtube') {
794
+ largetPlayerSongContainer[i].addEventListener('click', function(event) {
795
+ var playlist = this.getAttribute("data-amplitude-playlist");
796
+ var playlistLength = largetPlayerSongContainer.length;
797
+ ytpSongIndex = this.getAttribute("data-amplitude-song-index");
798
+ });
799
+ } // END if Attribute
800
+ } // END for
801
+
802
+ // add listeners to all progress bars found
803
+ // -------------------------------------------------------
804
+ var progressBars = document.getElementsByClassName("large-player-progress");
805
+ for (var i=0; i<progressBars.length; i++) {
806
+ progressBars[i].addEventListener('click', function(event) {
807
+ var offset = this.getBoundingClientRect();
808
+ var xpos = event.pageX - offset.left;
809
+
810
+ Amplitude.setSongPlayedPercentage(
811
+ (parseFloat(xpos)/parseFloat(this.offsetWidth))*100);
812
+ }); // END EventListener 'click'
813
+ }
814
+
815
+ // click on skip forward|backward (large player)
816
+ // See: https://github.com/serversideup/amplitudejs/issues/384
817
+ // -------------------------------------------------------
818
+
819
+ // add listeners to all SkipForwardButtons found
820
+ var largePlayerSkipForwardButtons = document.getElementsByClassName("large-player-skip-forward");
821
+ for (var i=0; i<largePlayerSkipForwardButtons.length; i++) {
822
+ if (largePlayerSkipForwardButtons[i].id === 'skip-forward_{{player.id}}') {
823
+ if (largePlayerSkipForwardButtons[i].dataset.amplitudeSource === 'youtube') {
824
+ largePlayerSkipForwardButtons[i].addEventListener('click', function(event) {
825
+ const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
826
+ //const duration = Amplitude.getSongDuration();
827
+ //const currentTime = parseFloat(Amplitude.getSongPlayedSeconds());
828
+ //const targetTime = parseFloat(currentTime + skipOffset);
829
+
830
+ // if (currentTime > 0) {
831
+ // Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
832
+ // }
833
+ }); // END EventListener 'click
834
+ } else {
835
+ largePlayerSkipForwardButtons[i].addEventListener('click', function(event) {
836
+ const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
837
+ const duration = Amplitude.getSongDuration();
838
+ const currentTime = parseFloat(Amplitude.getSongPlayedSeconds());
839
+ const targetTime = parseFloat(currentTime + skipOffset);
840
+
841
+ if (currentTime > 0) {
842
+ Amplitude.setSongPlayedPercentage((targetTime / duration) * 100);
843
+ }
844
+ }); // END EventListener 'click
845
+ }
846
+
847
+ } // END if ID
848
+ } // END for SkipForwardButtons
849
+
850
+ // add listeners to all SkipBackwardButtons found
851
+ var largePlayerSkipBackwardButtons = document.getElementsByClassName("large-player-skip-backward");
852
+ for (var i=0; i<largePlayerSkipBackwardButtons.length; i++) {
853
+ if (largePlayerSkipBackwardButtons[i].id === 'skip-backward_{{player.id}}') {
854
+ if (largePlayerSkipBackwardButtons[i].dataset.amplitudeSource === 'youtube') {
855
+ largePlayerSkipBackwardButtons[i].addEventListener('click', function(event) {
856
+ const skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
857
+ }); // END EventListener 'click'
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
+ }
870
+
871
+ } // END if ID
872
+ } // END for SkipBackwardButtons
873
+
874
+ // click on shuffle button
875
+ var largePlayerShuffleButton = document.getElementById('large_player_shuffle');
876
+ if (largePlayerShuffleButton) {
877
+ largePlayerShuffleButton.addEventListener('click', function(event) {
878
+ var shuffleState = (document.getElementById('large_player_shuffle').className.includes('amplitude-shuffle-on')) ? true : false;
879
+ Amplitude.setShuffle(shuffleState)
880
+ }); // END EventListener 'click'
881
+ } // END largePlayerShuffleButton
882
+
883
+ // click on repeat button
884
+ var largePlayerRepeatButton = document.getElementById('large_player_repeat');
885
+ if (largePlayerShuffleButton) {
886
+ largePlayerRepeatButton.addEventListener('click', function(event) {
887
+ var repeatState = (document.getElementById('large_player_repeat').className.includes('amplitude-repeat-on')) ? true : false;
888
+ Amplitude.setRepeat(repeatState)
889
+ }); // END EventListener 'click'
890
+ } // END largePlayerRepeatButton
891
+
892
+ // enable|disable scrolling on playlist
893
+ // -------------------------------------------------------
894
+ if (document.getElementById('large_player_right') !== null) {
895
+
896
+ // show|hide scrollbar in playlist
897
+ // -------------------------------------------------------
898
+ const songsInPlaylist = Amplitude.getSongsInPlaylist(playListName);
899
+
900
+ if (songsInPlaylist.length <= 8) {
901
+ const titleListLargePlayer = document.getElementById('large_player_title_list_' + playListName);
902
+ if (titleListLargePlayer !== null) {
903
+ titleListLargePlayer.classList.add('hide-scrollbar');
904
+ }
905
+ }
906
+
907
+ // scroll to player top position
908
+ // -------------------------------------------------------
909
+ var playlistHeader = document.getElementById("playlist_header_{{player.id}}");
910
+
911
+ playlistHeader.addEventListener('click', function(event) {
912
+ var scrollOffset = (window.innerWidth >= 720) ? -130 : -110;
913
+
914
+ // scroll player to top position
915
+ const targetDiv = document.getElementById("playlist_header_{{player.id}}");
916
+ const targetDivPosition = targetDiv.offsetTop;
917
+ window.scrollTo(0, targetDivPosition + scrollOffset);
918
+ }); // END EventListener 'click'
919
+
920
+ // disable scrolling (if window viewport >= BS Medium and above)
921
+ document.getElementById('large_player_right').addEventListener('mouseenter', function() {
922
+ if (window.innerWidth >= 720) {
923
+ if ($('body').hasClass('stop-scrolling')) {
924
+ return false;
925
+ } else {
926
+ $('body').addClass('stop-scrolling');
927
+ }
928
+ }
929
+ }); // END EventListener 'mouseenter'
930
+
931
+ // enable scrolling
932
+ document.getElementById('large_player_right').addEventListener('mouseleave', function() {
933
+ if ($('body').hasClass('stop-scrolling')) {
934
+ $('body').removeClass('stop-scrolling');
935
+ }
936
+ }); // END EventListener 'mouseleave'
937
+
938
+ } // END enable|disable scrolling on playlist
939
+
940
+ } // END large player UI events
941
+ {% endif %}
942
+
943
+ // ---------------------------------------------------------
944
+ // START configured player features
945
+
946
+ logger.debug('\n' + 'set play next title: ' + playerPlayNextTitle);
947
+ logger.debug('\n' + 'set delay between titles: ' + playerDelayNextTitle + 'ms');
948
+ logger.debug('\n' + 'set repeat (album): ' + playerRepeat);
949
+ logger.debug('\n' + 'set shuffle (album): ' + playerShuffle);
950
+
951
+ // set delay between titles (songs)
952
+ Amplitude.setDelay(playerDelayNextTitle);
953
+ // set repeat (album)
954
+ Amplitude.setRepeat(playerRepeat);
955
+ // set shuffle (album)
956
+ Amplitude.setShuffle(playerShuffle);
957
+
958
+ // ---------------------------------------------------------
959
+ // END configured player features
960
+
961
+ // finished messages
962
+ // ---------------------------------------------------------
963
+ logger.debug('\n' + 'current player state: ' + amplitudePlayerState);
964
+ logger.debug('\n' + 'setup player specific UI events on ID #{{player.id}}: finished');
965
+
966
+ clearInterval(dependencies_met_api_initialized);
967
+ } // END if apiInitialized
968
+ }, 10); // END dependencies_met_api_initialized
969
+
970
+ clearInterval(load_dependencies['dependencies_met_player_loaded_{{player.id}}']);
971
+ } // END if xhrLoadState success
972
+ }, 10); // END dependencies_met_html_loaded
973
+
974
+ {% endif %} {% endfor %}
975
+
976
+ logger.info('\n' + 'initialize player specific UI events: finished');
977
+
978
+ _this.setState('finished');
979
+ logger.debug('\n' + 'module state: ' + _this.getState());
980
+ logger.info('\n' + 'module initialized successfully');
981
+
982
+ endTimeModule = Date.now();
983
+ logger.info('\n' + 'module initializing time: ' + (endTimeModule-startTimeModule) + 'ms');
984
+
985
+ clearInterval(dependencies_met_player_instances_initialized);
986
+ } // END if apiInitialized
987
+ }, 10); // END initialize player specific UI events
988
+ }, // END initPlayerUiEvents
989
+
990
+ // -------------------------------------------------------------------------
991
+ // START setAudioInfo
992
+ setAudioInfo: (audioInfo) => {
993
+ // jadams: ??? new config setting 'pause_on_audio_info' ???
994
+ // when the audioInfo link is clicked, stop all propagation so
995
+ // AmplitudeJS doesn't play the song.
996
+ for (var i=0; i<audioInfo.length; i++) {
997
+ audioInfo[i].addEventListener('click', function (event) {
998
+ event.stopPropagation();
999
+ });
1000
+ }
1001
+ }, // END setAudioInfo
1002
+
1003
+ // -------------------------------------------------------------------------
1004
+ // songEvents
1005
+ // -------------------------------------------------------------------------
1006
+ songEvents: (songs) => {
1007
+ logger.debug('\n' + 'initializing title events for player on ID ' + '#' + playerID + ': started');
1008
+
1009
+ for (var i = 0; i < songs.length; i++) {
1010
+ // ensure that on mouseover, CSS styles don't get messed up for active songs
1011
+ songs[i].addEventListener('mouseover', function() {
1012
+ // active song indicator (mini play button) in playlist
1013
+ if (!this.classList.contains('amplitude-active-song-container')) {
1014
+ if (this.querySelectorAll('.play-button-container')[0] !== undefined) {
1015
+ this.querySelectorAll('.play-button-container')[0].style.display = 'block';
1016
+ }
1017
+ } // END mini play button in playlist
1018
+ }); // END EventListener 'mouseover' (songlist)
1019
+
1020
+ // ensure that on mouseout, CSS styles don't get messed up for active songs
1021
+ songs[i].addEventListener('mouseout', function() {
1022
+ if (this.querySelectorAll('.play-button-container')[0] !== undefined) {
1023
+ this.querySelectorAll('.play-button-container')[0].style.display = 'none';
1024
+ }
1025
+ }); // END EventListener 'mouseout' (songlist)
1026
+
1027
+ // show|hide the (mini) play button when the song is clicked
1028
+ songs[i].addEventListener('click', function () {
1029
+ if (this.querySelectorAll('.play-button-container')[0] !== undefined) {
1030
+ this.querySelectorAll('.play-button-container')[0].style.display = 'none';
1031
+ }
1032
+ }); // END EventListener 'click' (songlist)
1033
+ }
1034
+
1035
+ logger.debug('\n' + 'initializing title events for player on ID ' + '#' + playerID + ': finished');
1036
+ }, // END songEvents
1037
+
1038
+ // -------------------------------------------------------------------------
1039
+ // Init YT Player
1040
+ // -------------------------------------------------------------------------
1041
+ ytpAudioInit: (options) => {
1042
+ var ytpSettings = options;
1043
+ var firstScriptTag;
1044
+
1045
+ // load the IFrame Player API code asynchronously
1046
+ //
1047
+ var tag = document.createElement('script');
1048
+ tag.id = 'iframe_api';
1049
+ tag.src = '//youtube.com/iframe_api';
1050
+ firstScriptTag = document.getElementsByTagName('script')[0];
1051
+
1052
+ firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
1053
+
1054
+ // Create an <iframe> (and the YouTube player) after the YT API code
1055
+ // has been downloaded
1056
+ function onYouTubeIframeAPIReady() {
1057
+
1058
+ logger.debug('\n' + 'YouTube IframeAPI: ready');
1059
+
1060
+ var ytCtrl = document.getElementById("youtube_player_container");
1061
+ ytCtrl.innerHTML = '<img id="youtube-icon1 src=""/> <div id="ytPlayer"></div>';
1062
+ ytCtrl.style.cssText = 'width:150px;margin:2em auto;cursor:pointer;cursor:hand;display:none';
1063
+ // ytCtrl.onclick = toggleAudio1;
1064
+
1065
+ ytPlayer = new YT.Player('ytPlayer', {
1066
+ height: 0,
1067
+ width: 0,
1068
+ videoId: ytpSettings.ytpVideoID,
1069
+ playerVars: {
1070
+ autoplay: ytpSettings.ytpAutoPlay,
1071
+ loop: ytpSettings.ytpLoop
1072
+ },
1073
+ events: {
1074
+ onReady: onPlayerReady,
1075
+ onStateChange: onPlayerStateChange
1076
+ }
1077
+ });
1078
+ } // END onYouTubeIframeAPIReady
1079
+
1080
+ function onPlayerReady(event) {
1081
+ ytPlayer.setPlaybackQuality("small");
1082
+ // document.getElementById("youtube-audio").style.display = "block";
1083
+ // togglePlayButton1(ytPlayer.getPlayerState() !== 5);
1084
+ } // END event onPlayerReady
1085
+
1086
+ function onPlayerStateChange(event) {
1087
+ if (event.data === 0) {
1088
+ var bla = 'blupp'
1089
+ // togglePlayButton1(false);
1090
+ }
1091
+ } // END event onPlayerStateChange
1092
+
1093
+ // Create a new div element
1094
+ const ytpContainer = document.createElement('div');
1095
+
1096
+ // Set attributes for the div container
1097
+ ytpContainer.id = 'youtube_player_container';
1098
+ // ytpContainer.className = 'container';
1099
+ // ytpContainer.setAttribute("data-video", "WxcWO9O4DSM");
1100
+ // ytpContainer.setAttribute("data-autoplay", "0");
1101
+ // ytpContainer.setAttribute("data-loop", "1");
1102
+ // ytpContainer.innerHTML = 'data-video="WxcWO9O4DSM" data-autoplay="0" data-loop="1"';
1103
+
1104
+ // Append the div container to the end of the body
1105
+ document.body.appendChild(ytpContainer);
1106
+
1107
+ }, // END ytpAudioInit
1108
+
1109
+ // -------------------------------------------------------------------------
1110
+ // messageHandler()
1111
+ // manage messages send from other J1 modules
1112
+ // -------------------------------------------------------------------------
1113
+ messageHandler: (sender, message) => {
1114
+ var json_message = JSON.stringify(message, undefined, 2);
1115
+
1116
+ logText = '\n' + 'received message from ' + sender + ': ' + json_message;
1117
+ logger.debug(logText);
1118
+
1119
+ // -----------------------------------------------------------------------
1120
+ // process commands|actions
1121
+ // -----------------------------------------------------------------------
1122
+ if (message.type === 'command' && message.action === 'module_initialized') {
1123
+
1124
+ //
1125
+ // place handling of command|action here
1126
+ //
1127
+
1128
+ logger.info('\n' + message.text);
1129
+ }
1130
+
1131
+ //
1132
+ // place handling of other command|action here
1133
+ //
1134
+
1135
+ return true;
1136
+ }, // END messageHandler
1137
+
1138
+ // -------------------------------------------------------------------------
1139
+ // setState()
1140
+ // sets the current (processing) state of the module
1141
+ // -------------------------------------------------------------------------
1142
+ setState: (stat) => {
1143
+ _this.state = stat;
1144
+ }, // END setState
1145
+
1146
+ // -------------------------------------------------------------------------
1147
+ // getState()
1148
+ // Returns the current (processing) state of the module
1149
+ // -------------------------------------------------------------------------
1150
+ getState: () => {
1151
+ return _this.state;
1152
+ } // END getState
1153
+
1154
+ }; // END main (return)
1155
+ })(j1, window);
1156
+
1157
+ {%- endcapture -%}
1158
+
1159
+ {%- if production -%}
1160
+ {{ cache|minifyJS }}
1161
+ {%- else -%}
1162
+ {{ cache|strip_empty_lines }}
1163
+ {%- endif -%}
1164
+
1165
+ {%- assign cache = false -%}