j1-template 2024.3.18 → 2024.3.20

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 (1198) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/_includes/themes/j1/modules/searcher/procedures/topsearch.proc +1 -1
  4. data/assets/data/{amplitude.html → amplitude_app.html} +176 -152
  5. data/assets/data/masonry.html +1 -1
  6. data/assets/data/swiper_app.2.html +757 -0
  7. data/assets/data/swiper_app.4.html +769 -0
  8. data/assets/data/swiper_app.html +901 -0
  9. data/assets/data/{swiper.json → swiper_app.json} +10 -7
  10. data/assets/theme/j1/adapter/js/amplitude.js +821 -169
  11. data/assets/theme/j1/adapter/js/carousel.js +1 -1
  12. data/assets/theme/j1/adapter/js/swiper.js +92 -43
  13. data/assets/theme/j1/core/css/animate.css +2 -4
  14. data/assets/theme/j1/core/css/animate.min.css +1 -2
  15. data/assets/theme/j1/core/css/icon-fonts/fontawesome.css +2 -4
  16. data/assets/theme/j1/core/css/icon-fonts/fontawesome.min.css +1 -2
  17. data/assets/theme/j1/core/css/icon-fonts/iconify.css +5 -7
  18. data/assets/theme/j1/core/css/icon-fonts/iconify.min.css +1 -2
  19. data/assets/theme/j1/core/css/icon-fonts/mdi.css +9 -11
  20. data/assets/theme/j1/core/css/icon-fonts/mdi.min.css +1 -2
  21. data/assets/theme/j1/core/css/icon-fonts/mdib.css +7 -9
  22. data/assets/theme/j1/core/css/icon-fonts/mdib.min.css +1 -2
  23. data/assets/theme/j1/core/css/icon-fonts/mdil.css +10 -10
  24. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.css +112 -104
  25. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.min.css +1 -2
  26. data/assets/theme/j1/core/css/themes/unodark/bootstrap.css +150 -142
  27. data/assets/theme/j1/core/css/themes/unodark/bootstrap.min.css +1 -2
  28. data/assets/theme/j1/core/css/themes/unolight/bootstrap.css +210 -202
  29. data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css +1 -2
  30. data/assets/theme/j1/core/css/vendor.css +10 -12
  31. data/assets/theme/j1/core/css/vendor.min.css +1 -2
  32. data/assets/theme/j1/core/js/template.js +10669 -10669
  33. data/assets/theme/j1/core/js/template.min.js +25 -25
  34. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.css +141 -212
  35. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.min.css +1 -1
  36. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.css +117 -23
  37. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.min.css +1 -1
  38. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.css +323 -493
  39. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.min.css +1 -2
  40. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/mini.css +20 -73
  41. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/mini.min.css +1 -1
  42. data/assets/theme/j1/modules/amplitudejs/js/amplitude.js +1 -2
  43. data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.js +2063 -844
  44. data/assets/theme/j1/modules/amplitudejs/scss/theme/uno/dark/player/large.scss +439 -264
  45. data/assets/theme/j1/modules/bootstrap/js/bootstrap.js +0 -1
  46. data/assets/theme/j1/modules/bootstrap/js/bootstrap.min.js +0 -1
  47. data/assets/theme/j1/modules/gemini/js/gemini.js +1 -1
  48. data/assets/theme/j1/modules/gemini/js/geo/geocoder.js +1975 -0
  49. data/assets/theme/j1/modules/gemini/js/geo/geocoder.min.js +15 -1975
  50. data/assets/theme/j1/modules/gemini/js/geo/leaflet.min.js +4 -3
  51. data/assets/theme/j1/modules/swiperjs/css/modules/layoutBase.css +16 -0
  52. data/assets/theme/j1/modules/swiperjs/css/modules/layoutBase.min.css +16 -0
  53. data/assets/theme/j1/modules/swiperjs/css/modules/layoutExpanding.css +252 -0
  54. data/assets/theme/j1/modules/swiperjs/css/modules/layoutExpanding.min.css +17 -0
  55. data/assets/theme/j1/modules/{swiper/css/modules/effectNeighbor.css → swiperjs/css/modules/layoutNeighbor.css} +12 -11
  56. data/assets/theme/j1/modules/{swiper/css/modules/effectNeighbor.min.css → swiperjs/css/modules/layoutNeighbor.min.css} +3 -3
  57. data/assets/theme/j1/modules/{swiper/css/modules/effectPanorama.css → swiperjs/css/modules/layoutPanorama.css} +2 -2
  58. data/assets/theme/j1/modules/{swiper/css/modules/effectPanorama.min.css → swiperjs/css/modules/layoutPanorama.min.css} +2 -2
  59. data/assets/theme/j1/modules/swiperjs/css/modules/layoutParallax.css +16 -0
  60. data/assets/theme/j1/modules/swiperjs/css/modules/layoutParallax.min.css +16 -0
  61. data/assets/theme/j1/modules/swiperjs/css/modules/layoutStacked.css +97 -0
  62. data/assets/theme/j1/modules/swiperjs/css/modules/layoutStacked.min.css +17 -0
  63. data/assets/theme/j1/modules/{swiper/css/modules/effectThumbs.min.css → swiperjs/css/modules/layoutThumbs.css} +2 -2
  64. data/assets/theme/j1/modules/swiperjs/css/modules/layoutThumbs.min.css +17 -0
  65. data/assets/theme/j1/modules/{swiper → swiperjs}/css/swiper-bundle.css +1 -0
  66. data/assets/theme/j1/modules/{swiper → swiperjs}/css/theme/uno.css +97 -37
  67. data/assets/theme/j1/modules/swiperjs/css/theme/uno.min.css +17 -0
  68. data/assets/theme/j1/modules/swiperjs/js/modules/layoutBase.js +25 -0
  69. data/assets/theme/j1/modules/{swiper/js/modules/effectThumbs.min.js → swiperjs/js/modules/layoutBase.min.js} +10 -18
  70. data/assets/theme/j1/modules/swiperjs/js/modules/layoutExpanding.js +25 -0
  71. data/assets/theme/j1/modules/swiperjs/js/modules/layoutExpanding.min.js +25 -0
  72. data/assets/theme/j1/modules/swiperjs/js/modules/layoutNeighbor.js +107 -0
  73. data/assets/theme/j1/modules/swiperjs/js/modules/layoutNeighbor.min.js +17 -0
  74. data/assets/theme/j1/modules/{swiper/js/modules/effectPanorama.js → swiperjs/js/modules/layoutPanorama.js} +4 -5
  75. data/assets/theme/j1/modules/{swiper/js/modules/effectPanorama.min.js → swiperjs/js/modules/layoutPanorama.min.js} +2 -2
  76. data/assets/theme/j1/modules/{swiper/js/modules/effectNeighbor.js → swiperjs/js/modules/layoutParallax.js} +10 -18
  77. data/assets/theme/j1/modules/{swiper/js/modules/effectNeighbor.min.js → swiperjs/js/modules/layoutParallax.min.js} +10 -18
  78. data/assets/theme/j1/modules/swiperjs/js/modules/layoutStacked.0.js +114 -0
  79. data/assets/theme/j1/modules/swiperjs/js/modules/layoutStacked.1.js +93 -0
  80. data/assets/theme/j1/modules/swiperjs/js/modules/layoutStacked.js +104 -0
  81. data/assets/theme/j1/modules/swiperjs/js/modules/layoutStacked.min.js +17 -0
  82. data/assets/theme/j1/modules/{swiper/js/modules/effectThumbs.js → swiperjs/js/modules/layoutThumbs.js} +79 -28
  83. data/assets/theme/j1/modules/swiperjs/js/modules/layoutThumbs.min.js +17 -0
  84. data/assets/theme/j1/modules/swiperjs/js/swiper-bundle.js +9812 -0
  85. data/assets/theme/j1/modules/swiperjs/js/swiper-bundle.min.js +23 -0
  86. data/assets/theme/j1/modules/videojs/css/plugins/controls/zoom.css +1 -1
  87. data/assets/theme/j1/modules/videojs/css/plugins/controls/zoom.min.css +1 -1
  88. data/assets/theme/j1/modules/videojs/js/plugins/controls/zoom/zoom.js +1 -1
  89. data/assets/theme/j1/modules/videojs/js/plugins/controls/zoom/zoom.min.js +1 -1
  90. data/lib/j1/version.rb +1 -1
  91. data/lib/j1_app/j1_auth_manager/auth_manager.rb +2 -2
  92. data/lib/j1_app/j1_auth_manager/error_pages.rb +1 -1
  93. data/lib/j1_app/j1_auth_manager/helpers_disqus.rb +1 -1
  94. data/lib/j1_app/j1_auth_manager/helpers_facebook.rb +1 -1
  95. data/lib/j1_app/j1_auth_manager/helpers_github.rb +1 -1
  96. data/lib/j1_app/j1_auth_manager/helpers_patreon.rb +1 -1
  97. data/lib/j1_app/j1_auth_manager/helpers_twitter.rb +1 -1
  98. data/lib/j1_app/j1_auth_manager/warden_omniauth.rb +1 -1
  99. data/lib/j1_app/omniauth/strategies/disqus.rb +1 -1
  100. data/lib/j1_app/omniauth/strategies/facebook.rb +1 -1
  101. data/lib/j1_app/omniauth/strategies/github.rb +1 -1
  102. data/lib/j1_app/omniauth/strategies/patreon.rb +1 -1
  103. data/lib/j1_app/omniauth/strategies/twitter.rb +1 -1
  104. data/lib/starter_web/README.md +5 -5
  105. data/lib/starter_web/_config.yml +8 -8
  106. data/lib/starter_web/_data/_defaults/categories.yml +1 -1
  107. data/lib/starter_web/_data/_defaults/colors.yml +1 -1
  108. data/lib/starter_web/_data/_defaults/font_sizes.yml +1 -1
  109. data/lib/starter_web/_data/_defaults/j1_config.yml +2 -2
  110. data/lib/starter_web/_data/_defaults/resources.yml +1 -1
  111. data/lib/starter_web/_data/apps/defaults/justifiedGalleryCustomizer.yml +1 -1
  112. data/lib/starter_web/_data/apps/justifiedGalleryCustomizer.yml +1 -1
  113. data/lib/starter_web/_data/asciidoc2pdf/themes/j1-theme.yml +1 -1
  114. data/lib/starter_web/_data/blocks/banner.yml +3 -3
  115. data/lib/starter_web/_data/blocks/defaults/banner.yml +4 -4
  116. data/lib/starter_web/_data/blocks/defaults/footer.yml +1 -1
  117. data/lib/starter_web/_data/blocks/defaults/panel.yml +1 -1
  118. data/lib/starter_web/_data/blocks/footer.yml +1 -1
  119. data/lib/starter_web/_data/categories.yml +1 -1
  120. data/lib/starter_web/_data/colors.yml +1 -1
  121. data/lib/starter_web/_data/font_sizes.yml +1 -1
  122. data/lib/starter_web/_data/j1_config.yml +1 -1
  123. data/lib/starter_web/_data/layouts/collection.yml +1 -1
  124. data/lib/starter_web/_data/layouts/default.yml +1 -1
  125. data/lib/starter_web/_data/layouts/home.yml +1 -1
  126. data/lib/starter_web/_data/layouts/news_panel_posts.yml +1 -1
  127. data/lib/starter_web/_data/layouts/page.yml +1 -1
  128. data/lib/starter_web/_data/layouts/post.yml +1 -1
  129. data/lib/starter_web/_data/layouts/raw.yml +1 -1
  130. data/lib/starter_web/_data/modules/advertising.yml +7 -2
  131. data/lib/starter_web/_data/modules/{amplitude_players.yml → amplitude_app.yml} +207 -24
  132. data/lib/starter_web/_data/modules/amplitude_playlists.yml +1140 -37
  133. data/lib/starter_web/_data/modules/analytics.yml +7 -2
  134. data/lib/starter_web/_data/modules/attics.yml +8 -2
  135. data/lib/starter_web/_data/modules/blog_navigator.yml +8 -2
  136. data/lib/starter_web/_data/modules/carousel.yml +12 -8
  137. data/lib/starter_web/_data/modules/chatbots.yml +7 -2
  138. data/lib/starter_web/_data/modules/comments.yml +9 -7
  139. data/lib/starter_web/_data/modules/cookieconsent.yml +6 -5
  140. data/lib/starter_web/_data/modules/cookies.yml +7 -2
  141. data/lib/starter_web/_data/modules/defaults/advertising.yml +7 -3
  142. data/lib/starter_web/_data/modules/defaults/amplitude.yml +77 -31
  143. data/lib/starter_web/_data/modules/defaults/analytics.yml +6 -3
  144. data/lib/starter_web/_data/modules/defaults/attics.yml +7 -6
  145. data/lib/starter_web/_data/modules/defaults/authentication.yml +8 -3
  146. data/lib/starter_web/_data/modules/defaults/blog_navigator.yml +9 -3
  147. data/lib/starter_web/_data/modules/defaults/carousel.yml +7 -3
  148. data/lib/starter_web/_data/modules/defaults/chatbots.yml +7 -2
  149. data/lib/starter_web/_data/modules/defaults/comments.yml +6 -2
  150. data/lib/starter_web/_data/modules/defaults/cookieconsent.de.yml +7 -2
  151. data/lib/starter_web/_data/modules/defaults/cookieconsent.en.yml +7 -2
  152. data/lib/starter_web/_data/modules/defaults/cookieconsent.yml +7 -2
  153. data/lib/starter_web/_data/modules/defaults/cookies.yml +7 -3
  154. data/lib/starter_web/_data/modules/defaults/docsearch.yml +7 -2
  155. data/lib/starter_web/_data/modules/defaults/dropdowns.yml +7 -2
  156. data/lib/starter_web/_data/modules/defaults/fab.yml +7 -5
  157. data/lib/starter_web/_data/modules/defaults/gallery.yml +2 -2
  158. data/lib/starter_web/_data/modules/defaults/gemini.yml +3 -3
  159. data/lib/starter_web/_data/modules/defaults/icon_picker.yml +7 -2
  160. data/lib/starter_web/_data/modules/defaults/iframer.yml +7 -3
  161. data/lib/starter_web/_data/modules/defaults/lazyLoader.yml +7 -2
  162. data/lib/starter_web/_data/modules/defaults/lightbox.yml +8 -23
  163. data/lib/starter_web/_data/modules/defaults/log4javascript.yml +8 -3
  164. data/lib/starter_web/_data/modules/defaults/log4r.yml +2 -2
  165. data/lib/starter_web/_data/modules/defaults/lunr.yml +3 -3
  166. data/lib/starter_web/_data/modules/defaults/masonry.yml +7 -3
  167. data/lib/starter_web/_data/modules/defaults/masterslider.yml +7 -2
  168. data/lib/starter_web/_data/modules/defaults/navigator.yml +9 -4
  169. data/lib/starter_web/_data/modules/defaults/particles.yml +5 -4
  170. data/lib/starter_web/_data/modules/defaults/rangeSlider.yml +8 -3
  171. data/lib/starter_web/_data/modules/defaults/rtable.yml +7 -2
  172. data/lib/starter_web/_data/modules/defaults/scroller.yml +7 -2
  173. data/lib/starter_web/_data/modules/defaults/slick.yml +8 -5
  174. data/lib/starter_web/_data/modules/defaults/slim_select.yml +7 -2
  175. data/lib/starter_web/_data/modules/defaults/speak2me.yml +7 -4
  176. data/lib/starter_web/_data/modules/defaults/swiper_app.yml +153 -0
  177. data/lib/starter_web/_data/modules/defaults/theme_toggler.yml +7 -2
  178. data/lib/starter_web/_data/modules/defaults/themes.yml +7 -2
  179. data/lib/starter_web/_data/modules/defaults/toccer.yml +8 -5
  180. data/lib/starter_web/_data/modules/defaults/translator.en.yml +7 -2
  181. data/lib/starter_web/_data/modules/defaults/translator.yml +7 -2
  182. data/lib/starter_web/_data/modules/defaults/videojs.yml +8 -2
  183. data/lib/starter_web/_data/modules/defaults/waves.yml +5 -4
  184. data/lib/starter_web/_data/modules/docsearch.yml +7 -2
  185. data/lib/starter_web/_data/modules/dropdowns.yml +7 -2
  186. data/lib/starter_web/_data/modules/fab.yml +7 -2
  187. data/lib/starter_web/_data/modules/gallery.yml +14 -8
  188. data/lib/starter_web/_data/modules/gallery_app.yml +1002 -0
  189. data/lib/starter_web/_data/modules/gallery_playlists.yml +534 -0
  190. data/lib/starter_web/_data/modules/gemini.yml +4 -5
  191. data/lib/starter_web/_data/modules/icon_picker.yml +7 -2
  192. data/lib/starter_web/_data/modules/iframer.yml +8 -3
  193. data/lib/starter_web/_data/modules/lazyLoader.yml +7 -2
  194. data/lib/starter_web/_data/modules/lightbox.yml +8 -3
  195. data/lib/starter_web/_data/modules/log4r.yml +2 -2
  196. data/lib/starter_web/_data/modules/lunr.yml +4 -5
  197. data/lib/starter_web/_data/modules/masonry.yml +45 -23
  198. data/lib/starter_web/_data/modules/masterslider.yml +65 -59
  199. data/lib/starter_web/_data/modules/particles.yml +7 -2
  200. data/lib/starter_web/_data/modules/rangeSlider.yml +8 -3
  201. data/lib/starter_web/_data/modules/rtable.yml +7 -2
  202. data/lib/starter_web/_data/modules/scroller.yml +8 -3
  203. data/lib/starter_web/_data/modules/slick.yml +33 -16
  204. data/lib/starter_web/_data/modules/slim_select.yml +13 -10
  205. data/lib/starter_web/_data/modules/speak2me.yml +7 -2
  206. data/lib/starter_web/_data/modules/swiper_app.yml +1047 -0
  207. data/lib/starter_web/_data/modules/swiper_playlists.yml +278 -203
  208. data/lib/starter_web/_data/modules/theme_toggler.yml +7 -2
  209. data/lib/starter_web/_data/modules/themes.yml +7 -2
  210. data/lib/starter_web/_data/modules/toccer.yml +7 -2
  211. data/lib/starter_web/_data/modules/translator.yml +7 -2
  212. data/lib/starter_web/_data/modules/videojs.yml +7 -1
  213. data/lib/starter_web/_data/modules/waves.yml +8 -3
  214. data/lib/starter_web/_data/plugins/defaults/feed.yml +1 -1
  215. data/lib/starter_web/_data/plugins/defaults/paginator.yml +1 -1
  216. data/lib/starter_web/_data/plugins/defaults/seo-tags.yml +1 -1
  217. data/lib/starter_web/_data/plugins/defaults/sitemap.yml +1 -1
  218. data/lib/starter_web/_data/plugins/feed.yml +1 -1
  219. data/lib/starter_web/_data/plugins/paginator.yml +1 -1
  220. data/lib/starter_web/_data/plugins/seo-tags.yml +1 -1
  221. data/lib/starter_web/_data/plugins/sitemap.yml +1 -1
  222. data/lib/starter_web/_data/resources.yml +50 -42
  223. data/lib/starter_web/_data/templates/feed.xml +2 -2
  224. data/lib/starter_web/_data/templates/robots.txt +1 -1
  225. data/lib/starter_web/_data/templates/seo-tags.html +1 -1
  226. data/lib/starter_web/_data/templates/sitemap.xml +1 -1
  227. data/lib/starter_web/_data/utilities/defaults/util_srv.yml +1 -1
  228. data/lib/starter_web/_data/utilities/util_srv.yml +1 -1
  229. data/lib/starter_web/_includes/attributes.asciidoc +44 -44
  230. data/lib/starter_web/_includes/custom/templates/collection_panel.html +1 -1
  231. data/lib/starter_web/_includes/tables/jekyll_variables.asciidoc +1 -1
  232. data/lib/starter_web/_plugins/asciidoctor/amplitude-block.rb +2 -2
  233. data/lib/starter_web/_plugins/asciidoctor/lightbox-block.rb +1 -1
  234. data/lib/starter_web/_plugins/asciidoctor/swiper-block.rb +2 -3
  235. data/lib/starter_web/_plugins/asciidoctor/wistia-block.rb +1 -1
  236. data/lib/starter_web/_plugins/asciidoctor/youtube-block.rb +2 -2
  237. data/lib/starter_web/_plugins/filter/filters.rb +1 -11
  238. data/lib/starter_web/_plugins/index/lunr.rb +1 -1
  239. data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/anthem.jpg +0 -0
  240. data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/from-dusk-to-dawn.jpg +0 -0
  241. data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/safe-in-the-steep-cliffs.jpg +0 -0
  242. data/lib/starter_web/assets/audio/cover/emancipator/from-dusk-to-dawn/soon-it-will-be-cold-enough.jpg +0 -0
  243. data/lib/starter_web/assets/image/block/image/!readme +0 -0
  244. data/lib/starter_web/assets/image/custom/!info/!readme +0 -0
  245. data/lib/starter_web/assets/image/module/attic/!info/!readme +0 -0
  246. data/lib/starter_web/assets/image/module/attic/1920x1280/alexey-ruban.jpg +0 -0
  247. data/lib/starter_web/assets/image/module/attic/1920x1280/markus-spiske.jpg +0 -0
  248. data/lib/starter_web/assets/image/module/attic/1920x1280/tiny_desk.jpg +0 -0
  249. data/lib/starter_web/assets/image/module/attic/alice-donovan-rouse-2.jpg +0 -0
  250. data/lib/starter_web/assets/image/module/carousel/!info/!readme +0 -0
  251. data/lib/starter_web/assets/image/module/gallery/free_animal/!info/!readme +0 -0
  252. data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-1.jpg +0 -0
  253. data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-2.jpg +0 -0
  254. data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-3.jpg +0 -0
  255. data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-4.jpg +0 -0
  256. data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-5.jpg +0 -0
  257. data/lib/starter_web/assets/image/module/gallery/free_animal/image/free-animal-6.jpg +0 -0
  258. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/295683517.jpg +0 -0
  259. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/andreas-brucker_b.jpg +0 -0
  260. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/banter-snaps_b.jpg +0 -0
  261. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/chicago-us.jpg +0 -0
  262. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/denys-nevozhai-1_b.jpg +0 -0
  263. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/denys-nevozhai-1_c.jpg +0 -0
  264. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/denys-nevozhai-2-bw.jpg +0 -0
  265. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/denys-nevozhai-2_b.jpg +0 -0
  266. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/denys-nevozhai-3_b.jpg +0 -0
  267. data/lib/starter_web/assets/image/{modules/gallery/mega_cities → module/gallery/mega_citiy/image}/emmad-mazhari_b.jpg +0 -0
  268. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/emmad-mazhari_c.jpg +0 -0
  269. data/lib/starter_web/assets/image/{modules/gallery/mega_cities → module/gallery/mega_citiy/image}/ethan-brooke_b.jpg +0 -0
  270. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/federico-rizzarelli_b.jpg +0 -0
  271. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/federico-rizzarelli_c.jpg +0 -0
  272. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/gints-gailis_b.jpg +0 -0
  273. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/jakarta_indonesia.jpg +0 -0
  274. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/jakarta_indonesia_2.jpg +0 -0
  275. data/lib/starter_web/assets/image/{modules/gallery/mega_cities → module/gallery/mega_citiy/image}/johan-mouchet_b.jpg +0 -0
  276. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/luca-bravo_b.jpg +0 -0
  277. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/melbourne_australia.jpg +0 -0
  278. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/queen_bees_at_eureka_tower.jpg +0 -0
  279. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/shanghai_china.jpg +0 -0
  280. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/steven-diaz_b.jpg +0 -0
  281. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/thomas-tucker_b.jpg +0 -0
  282. data/lib/starter_web/assets/image/module/gallery/mega_citiy/image/tokyo_japan.jpg +0 -0
  283. data/lib/starter_web/assets/image/module/gallery/old_time/image/!info/!readme +0 -0
  284. data/lib/starter_web/assets/image/module/lightbox/!info/!readme +0 -0
  285. data/lib/starter_web/assets/image/module/swiper/audio/!info/!readme +0 -0
  286. data/lib/starter_web/assets/image/module/swiper/audio/!readme +0 -0
  287. data/lib/starter_web/assets/image/module/swiper/avatar/avatar-1.png +0 -0
  288. data/lib/starter_web/assets/image/module/swiper/avatar/avatar-2.png +0 -0
  289. data/lib/starter_web/assets/image/module/swiper/avatar/avatar-3.png +0 -0
  290. data/lib/starter_web/assets/image/module/swiper/avatar/avatar-4.png +0 -0
  291. data/lib/starter_web/assets/image/module/swiper/avatar/avatar-5.png +0 -0
  292. data/lib/starter_web/assets/image/module/swiper/extended/expanding/!info/!readme +0 -0
  293. data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/avatar/avatar-1.jpg +0 -0
  294. data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/avatar/avatar-2.jpg +0 -0
  295. data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/avatar/avatar-3.jpg +0 -0
  296. data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/avatar/avatar-4.jpg +0 -0
  297. data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/london.jpg +0 -0
  298. data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/moscow.jpg +0 -0
  299. data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/san-francisco.jpg +0 -0
  300. data/lib/starter_web/assets/image/module/swiper/extended/expanding/image/tokyo.jpg +0 -0
  301. data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/1-star.svg +88 -0
  302. data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/2-star.svg +88 -0
  303. data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/3-star.svg +88 -0
  304. data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/4-star.svg +88 -0
  305. data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/5-star.svg +88 -0
  306. data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/elements/star-gray.svg +55 -0
  307. data/lib/starter_web/assets/image/module/swiper/extended/expanding/scalable/elements/star-orange.svg +55 -0
  308. data/lib/starter_web/assets/image/module/swiper/extended/neighbor/!info/!readme +0 -0
  309. data/lib/starter_web/assets/image/module/swiper/extended/neighbor/!readme +0 -0
  310. data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-1.jpg +0 -0
  311. data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-2.jpg +0 -0
  312. data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-3.jpg +0 -0
  313. data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-4.jpg +0 -0
  314. data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-5.jpg +0 -0
  315. data/lib/starter_web/assets/image/module/swiper/extended/neighbor/image/free-animal-6.jpg +0 -0
  316. data/lib/starter_web/assets/image/module/swiper/extended/panorama/!info/!readme +0 -0
  317. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/1.jpg +0 -0
  318. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/10.jpg +0 -0
  319. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/11.jpg +0 -0
  320. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/12.jpg +0 -0
  321. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/2.jpg +0 -0
  322. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/3.jpg +0 -0
  323. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/4.jpg +0 -0
  324. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/5.jpg +0 -0
  325. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/6.jpg +0 -0
  326. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/7.jpg +0 -0
  327. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/8.jpg +0 -0
  328. data/lib/starter_web/assets/image/module/swiper/extended/panorama/image/9.jpg +0 -0
  329. data/lib/starter_web/assets/image/module/swiper/extended/stacked/!info/!readme +0 -0
  330. data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/!readme +0 -0
  331. data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/1.jpg +0 -0
  332. data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/2.jpg +0 -0
  333. data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/3.jpg +0 -0
  334. data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/4.jpg +0 -0
  335. data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/5.jpg +0 -0
  336. data/lib/starter_web/assets/image/module/swiper/extended/stacked/image/6.jpg +0 -0
  337. data/lib/starter_web/assets/image/module/swiper/simple/free_animal/!info/!readme +0 -0
  338. data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-1.jpg +0 -0
  339. data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-2.jpg +0 -0
  340. data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-3.jpg +0 -0
  341. data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-4.jpg +0 -0
  342. data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-5.jpg +0 -0
  343. data/lib/starter_web/assets/image/module/swiper/simple/free_animal/image/free-animal-6.jpg +0 -0
  344. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/295683517.jpg +0 -0
  345. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/andreas-brucker_b.jpg +0 -0
  346. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/banter-snaps_b.jpg +0 -0
  347. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/chicago-us.jpg +0 -0
  348. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/denys-nevozhai-1_b.jpg +0 -0
  349. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/denys-nevozhai-1_c.jpg +0 -0
  350. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/denys-nevozhai-2-bw.jpg +0 -0
  351. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/denys-nevozhai-2_b.jpg +0 -0
  352. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/denys-nevozhai-3_b.jpg +0 -0
  353. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/emmad-mazhari_b.jpg +0 -0
  354. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/emmad-mazhari_c.jpg +0 -0
  355. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/ethan-brooke_b.jpg +0 -0
  356. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/federico-rizzarelli_b.jpg +0 -0
  357. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/federico-rizzarelli_c.jpg +0 -0
  358. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/gints-gailis_b.jpg +0 -0
  359. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/jakarta_indonesia.jpg +0 -0
  360. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/jakarta_indonesia_2.jpg +0 -0
  361. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/johan-mouchet_b.jpg +0 -0
  362. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/luca-bravo_b.jpg +0 -0
  363. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/melbourne_australia.jpg +0 -0
  364. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/queen_bees_at_eureka_tower.jpg +0 -0
  365. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/shanghai_china.jpg +0 -0
  366. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/steven-diaz_b.jpg +0 -0
  367. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/thomas-tucker_b.jpg +0 -0
  368. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/image/tokyo_japan.jpg +0 -0
  369. data/lib/starter_web/assets/image/module/swiper/simple/mega_city/info/authors.txt +78 -0
  370. data/lib/starter_web/assets/image/module/swiper/video/!info/!readme +0 -0
  371. data/lib/starter_web/assets/image/module/swiper/video/!readme +0 -0
  372. data/lib/starter_web/assets/image/pattern/rating/scalable/1-star.svg +88 -0
  373. data/lib/starter_web/assets/image/pattern/rating/scalable/2-star.svg +88 -0
  374. data/lib/starter_web/assets/image/pattern/rating/scalable/3-star.svg +88 -0
  375. data/lib/starter_web/assets/image/pattern/rating/scalable/4-star.svg +88 -0
  376. data/lib/starter_web/assets/image/pattern/rating/scalable/5-star.svg +88 -0
  377. data/lib/starter_web/assets/image/pattern/rating/scalable/elements/star-gray.svg +55 -0
  378. data/lib/starter_web/assets/image/pattern/rating/scalable/elements/star-orange.svg +55 -0
  379. data/lib/starter_web/assets/video/poster/dailymotion/meditation.jpg +0 -0
  380. data/lib/starter_web/assets/video/poster/dailymotion/pilates.jpg +0 -0
  381. data/lib/starter_web/assets/video/poster/html5/peck_pocketed.jpg +0 -0
  382. data/lib/starter_web/assets/video/poster/html5/rolling_wild.jpg +0 -0
  383. data/lib/starter_web/assets/video/poster/tiktoc/einhorn.jpg +0 -0
  384. data/lib/starter_web/assets/video/poster/tiktoc/gianna_1.jpg +0 -0
  385. data/lib/starter_web/assets/video/poster/tiktoc/gianna_2.jpg +0 -0
  386. data/lib/starter_web/assets/video/poster/tiktoc/gianna_3.jpg +0 -0
  387. data/lib/starter_web/assets/video/poster/tiktoc/waluschka.jpg +0 -0
  388. data/lib/starter_web/assets/video/poster/vimeo/amazing_nature.jpg +0 -0
  389. data/lib/starter_web/assets/video/poster/vimeo/kick_it_old_school.jpg +0 -0
  390. data/lib/starter_web/assets/video/poster/vimeo/stay_colorful.jpg +0 -0
  391. data/lib/starter_web/assets/video/poster/wistia/thank_you.jpg +0 -0
  392. data/lib/starter_web/assets/video/poster/wistia/wistia_black.jpg +0 -0
  393. data/lib/starter_web/assets/video/poster/wistia/wistia_blue.jpg +0 -0
  394. data/lib/starter_web/assets/video/poster/wistia/wistia_intro.jpg +0 -0
  395. data/lib/starter_web/assets/video/poster/youtube/faelle_des_bnd/der_unverzichtbare_feind.jpg +0 -0
  396. data/lib/starter_web/assets/video/poster/youtube/faelle_des_bnd/ein_diener_vieler_herren.jpg +0 -0
  397. data/lib/starter_web/assets/video/poster/youtube/taylor_swift/cover-1.jpg +0 -0
  398. data/lib/starter_web/assets/video/poster/youtube/taylor_swift/cover-2.jpg +0 -0
  399. data/lib/starter_web/assets/video/poster/youtube/the_piano/the-piano.jpg +0 -0
  400. data/lib/starter_web/assets/video/poster/youtube/voice_kids/banner/best_of.jpg +0 -0
  401. data/lib/starter_web/assets/video/poster/youtube/voice_kids/banner/generic.jpg +0 -0
  402. data/lib/starter_web/collections/_biography/a-life-in-questions.adoc +3 -3
  403. data/lib/starter_web/collections/_biography/becoming.adoc +3 -3
  404. data/lib/starter_web/collections/_biography/born-to-run.adoc +3 -3
  405. data/lib/starter_web/collections/_biography/forty-autumns.adoc +3 -3
  406. data/lib/starter_web/collections/_biography/not-dead-yet.adoc +3 -3
  407. data/lib/starter_web/collections/_biography/princess-diarist-the.adoc +3 -3
  408. data/lib/starter_web/collections/_biography/when-breath-becomes-air.adoc +3 -3
  409. data/lib/starter_web/collections/_fantasy/harry-potter-deathly-hallows.adoc +3 -3
  410. data/lib/starter_web/collections/_fantasy/harry-potter-philosophers-stone.adoc +3 -3
  411. data/lib/starter_web/collections/_fantasy/mistborn-trilogy.adoc +3 -3
  412. data/lib/starter_web/collections/_fantasy/ready-player-one.adoc +3 -3
  413. data/lib/starter_web/collections/_fantasy/sword-of-destiny.adoc +3 -3
  414. data/lib/starter_web/collections/_fantasy/terry-pratchet-diary.adoc +3 -3
  415. data/lib/starter_web/collections/_portfolio/branding.adoc +2 -2
  416. data/lib/starter_web/collections/_portfolio/graphic_design.adoc +2 -2
  417. data/lib/starter_web/collections/_portfolio/identity.adoc +2 -2
  418. data/lib/starter_web/collections/_portfolio/illustration.adoc +2 -2
  419. data/lib/starter_web/collections/_portfolio/photography.adoc +2 -2
  420. data/lib/starter_web/collections/_portfolio/web_design.adoc +2 -2
  421. data/lib/starter_web/collections/_romance/breath-of-snow-and-ashes.adoc +3 -3
  422. data/lib/starter_web/collections/_romance/it-ends-with-us.adoc +3 -3
  423. data/lib/starter_web/collections/_romance/outlander-novel.adoc +3 -3
  424. data/lib/starter_web/collections/_romance/outlander-virgins-short-story.adoc +3 -3
  425. data/lib/starter_web/collections/_romance/the-dressmaker.adoc +3 -3
  426. data/lib/starter_web/collections/_romance/the-fiery-cross.adoc +3 -3
  427. data/lib/starter_web/collections/asciidoc_skeletons/simple-post/_posts/yyyy-mm-dd-your-post-name.asciidoc +3 -3
  428. data/lib/starter_web/collections/posts/public/featured/_posts/0000-00-00-welcome-to-j1.adoc.erb +2 -2
  429. data/lib/starter_web/collections/posts/public/featured/_posts/2021-01-01-about-cookies.adoc +2 -2
  430. data/lib/starter_web/collections/posts/public/featured/_posts/2021-02-01-static-site-generators.adoc +3 -3
  431. data/lib/starter_web/collections/posts/public/featured/_posts/2022-02-01-about-j1.adoc +2 -2
  432. data/lib/starter_web/collections/posts/public/featured/_posts/2023-10-18-url-types.adoc +2 -2
  433. data/lib/starter_web/collections/posts/public/featured/_posts/_includes/attributes.asciidoc +2 -2
  434. data/lib/starter_web/index.html +2 -2
  435. data/lib/starter_web/package.json +1 -1
  436. data/lib/starter_web/pages/public/about/features.adoc +2 -2
  437. data/lib/starter_web/pages/public/about/reporting_issues.adoc +2 -2
  438. data/lib/starter_web/pages/public/about/site.adoc +2 -2
  439. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/000_intro.adoc +2 -2
  440. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/100_converter.adoc +2 -2
  441. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/200_themes.adoc +2 -2
  442. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/attributes.asciidoc +1 -1
  443. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/100_converter/112_getting_started.asciidoc +1 -1
  444. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/a2p.bat +1 -1
  445. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/a2p.sh +1 -1
  446. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.a2p +1 -1
  447. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.adoc +2 -2
  448. data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/multi.adoc +2 -2
  449. data/lib/starter_web/pages/public/asciidoc_skeletons/simple-document/simple.adoc +2 -2
  450. data/lib/starter_web/pages/public/blog/navigator/archive/allview.html +2 -2
  451. data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +2 -2
  452. data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +2 -2
  453. data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +2 -2
  454. data/lib/starter_web/pages/public/blog/navigator/index.html +2 -2
  455. data/lib/starter_web/pages/public/features/general.adoc +3 -3
  456. data/lib/starter_web/pages/public/features/template.adoc +15 -15
  457. data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_biography.adoc +2 -2
  458. data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_fantasy.adoc +2 -2
  459. data/lib/starter_web/pages/public/learn/bookshelf/article_previewer/viewer_romance.adoc +2 -2
  460. data/lib/starter_web/pages/public/learn/bookshelf/jekyll_collections.adoc +2 -2
  461. data/lib/starter_web/pages/public/learn/bookshelf/viewer_all_books.adoc +2 -2
  462. data/lib/starter_web/pages/public/learn/where_to_go.adoc +2 -2
  463. data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +2 -2
  464. data/lib/starter_web/pages/public/legal/en/200_impress.adoc +2 -2
  465. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +2 -2
  466. data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +2 -2
  467. data/lib/starter_web/pages/public/panels/intro_panel/_includes/attributes.asciidoc +6 -6
  468. data/lib/starter_web/pages/public/panels/intro_panel/panel.adoc +6 -6
  469. data/lib/starter_web/pages/public/plans/plans.adoc +2 -2
  470. data/lib/starter_web/pages/public/tools/previewer/_includes/attributes.asciidoc +5 -5
  471. data/lib/starter_web/pages/public/tools/previewer/preview_amplitudejs.adoc +84 -36
  472. data/lib/starter_web/pages/public/tools/previewer/preview_bootstrap_theme.adoc +5 -5
  473. data/lib/starter_web/pages/public/tools/previewer/preview_videojs.adoc +2 -2
  474. data/lib/starter_web/pages/public/tools/tester/{amplitude_yt_tester.adoc → app_tester_amplitudejs_yt.adoc} +75 -27
  475. data/lib/starter_web/pages/public/tools/tester/app_tester_swiperjs.adoc +1215 -0
  476. data/lib/starter_web/pages/public/tour/_includes/attributes.asciidoc +5 -8
  477. data/lib/starter_web/pages/public/tour/_includes/documents/419_advanced_modals_demo.asciidoc +2 -2
  478. data/lib/starter_web/pages/public/tour/asciidoc_extensions.adoc +4 -4
  479. data/lib/starter_web/pages/public/tour/bootstrap_themes.adoc +4 -4
  480. data/lib/starter_web/pages/public/tour/highlghter_rouge.adoc +2 -2
  481. data/lib/starter_web/pages/public/tour/icon_fonts.adoc +2 -2
  482. data/lib/starter_web/pages/public/tour/modal_extentions.adoc +2 -2
  483. data/lib/starter_web/pages/public/tour/play_audio.adoc +62 -72
  484. data/lib/starter_web/pages/public/tour/play_video.adoc +2 -2
  485. data/lib/starter_web/pages/public/tour/present_images.adoc +48 -62
  486. data/lib/starter_web/pages/public/tour/quicksearch.adoc +2 -2
  487. data/lib/starter_web/pages/public/tour/responsive_tables.adoc +2 -2
  488. data/lib/starter_web/pages/public/tour/typography.adoc +2 -2
  489. metadata +713 -731
  490. data/apps/private/README.txt +0 -1
  491. data/apps/protected/README.txt +0 -1
  492. data/apps/public/README.txt +0 -1
  493. data/apps/public/cc/cc.yml +0 -1649
  494. data/apps/public/cc/index.adoc +0 -111
  495. data/assets/data/swiper.html +0 -244
  496. data/assets/theme/j1/adapter/js/amplitude.30.js +0 -1177
  497. data/assets/theme/j1/core/css/animate.css.map +0 -1
  498. data/assets/theme/j1/core/css/animate.min.css.map +0 -1
  499. data/assets/theme/j1/core/css/icon-fonts/fontawesome.css.map +0 -1
  500. data/assets/theme/j1/core/css/icon-fonts/fontawesome.min.css.map +0 -1
  501. data/assets/theme/j1/core/css/icon-fonts/iconify.css.map +0 -1
  502. data/assets/theme/j1/core/css/icon-fonts/iconify.min.css.map +0 -1
  503. data/assets/theme/j1/core/css/icon-fonts/mdi.css.map +0 -1
  504. data/assets/theme/j1/core/css/icon-fonts/mdi.min.css.map +0 -1
  505. data/assets/theme/j1/core/css/icon-fonts/mdib.css.map +0 -1
  506. data/assets/theme/j1/core/css/icon-fonts/mdib.min.css.map +0 -1
  507. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.css.map +0 -1
  508. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.min.css.map +0 -1
  509. data/assets/theme/j1/core/css/themes/unodark/bootstrap.css.map +0 -1
  510. data/assets/theme/j1/core/css/themes/unodark/bootstrap.min.css.map +0 -1
  511. data/assets/theme/j1/core/css/themes/unolight/bootstrap.css.map +0 -1
  512. data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css.map +0 -1
  513. data/assets/theme/j1/core/css/vendor.css.map +0 -1
  514. data/assets/theme/j1/core/css/vendor.min.css.map +0 -1
  515. data/assets/theme/j1/core/js/template.min.js.map +0 -1
  516. data/assets/theme/j1/modules/amplitudejs/js/amplitude.map +0 -20
  517. data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.min.js +0 -14
  518. data/assets/theme/j1/modules/bootstrap/js/bootstrap.js.map +0 -1
  519. data/assets/theme/j1/modules/bootstrap/js/bootstrap.min.js.map +0 -1
  520. data/assets/theme/j1/modules/gemini/js/gemini.js.map +0 -1
  521. data/assets/theme/j1/modules/photoswipe/_info/.version_5.4.4 +0 -6
  522. data/assets/theme/j1/modules/photoswipe/_info/example/photoswipe-caption-plugin.html +0 -237
  523. data/assets/theme/j1/modules/photoswipe/_info/example/test-gallery.html +0 -36
  524. data/assets/theme/j1/modules/photoswipe/js/_info/README.md +0 -43
  525. data/assets/theme/j1/modules/photoswipe/js/photoswipe-lightbox.1.js +0 -1990
  526. data/assets/theme/j1/modules/swiper/_info/.version_1.2.0 +0 -15
  527. data/assets/theme/j1/modules/swiper/_info/swiperjs.com-demos.url +0 -2
  528. data/assets/theme/j1/modules/swiper/css/modules/effectThumbs.css +0 -44
  529. data/assets/theme/j1/modules/swiper/css/theme/uno.min.css +0 -144
  530. data/assets/theme/j1/modules/swiper/js/modules/!readme +0 -3
  531. data/assets/theme/j1/modules/swiper/js/swiper-bundle.js +0 -9791
  532. data/assets/theme/j1/modules/swiper/js/swiper-bundle.min.js +0 -23
  533. data/lib/starter_web/_data/modules/defaults/swiper.yml +0 -175
  534. data/lib/starter_web/_data/modules/swiper.yml +0 -655
  535. data/lib/starter_web/assets/image/custom/header/family.svg +0 -2209
  536. data/lib/starter_web/assets/image/icons/bokeh/bokeh-32x32.ico +0 -0
  537. data/lib/starter_web/assets/image/icons/bokeh/bokeh.ico +0 -0
  538. data/lib/starter_web/assets/image/icons/bokeh/logo-160x160.png +0 -0
  539. data/lib/starter_web/assets/image/icons/jupyter/jupyter-32x32.ico +0 -0
  540. data/lib/starter_web/assets/image/icons/jupyter/jupyter.ico +0 -0
  541. data/lib/starter_web/assets/image/icons/jupyter/logo.png +0 -0
  542. data/lib/starter_web/assets/image/modules/attics/1920x1280/alexey-ruban.jpg +0 -0
  543. data/lib/starter_web/assets/image/modules/attics/1920x1280/kristopher-roller.webp +0 -0
  544. data/lib/starter_web/assets/image/modules/attics/1920x1280/markus-spiske.jpg +0 -0
  545. data/lib/starter_web/assets/image/modules/attics/1920x1280/tiny_desk.jpg +0 -0
  546. data/lib/starter_web/assets/image/modules/attics/alice-donovan-rouse-2.jpg +0 -0
  547. data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-1.jpg +0 -0
  548. data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-2.jpg +0 -0
  549. data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-3.jpg +0 -0
  550. data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-4.jpg +0 -0
  551. data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-5.jpg +0 -0
  552. data/lib/starter_web/assets/image/modules/gallery/free_animals/free-animals-6.jpg +0 -0
  553. data/lib/starter_web/assets/image/modules/gallery/mega_cities/295683517.jpg +0 -0
  554. data/lib/starter_web/assets/image/modules/gallery/mega_cities/andreas-brucker_b.jpg +0 -0
  555. data/lib/starter_web/assets/image/modules/gallery/mega_cities/banter-snaps_b.jpg +0 -0
  556. data/lib/starter_web/assets/image/modules/gallery/mega_cities/chicago-us.jpg +0 -0
  557. data/lib/starter_web/assets/image/modules/gallery/mega_cities/denys-nevozhai-1_b.jpg +0 -0
  558. data/lib/starter_web/assets/image/modules/gallery/mega_cities/denys-nevozhai-1_c.jpg +0 -0
  559. data/lib/starter_web/assets/image/modules/gallery/mega_cities/denys-nevozhai-2-bw.jpg +0 -0
  560. data/lib/starter_web/assets/image/modules/gallery/mega_cities/denys-nevozhai-2_b.jpg +0 -0
  561. data/lib/starter_web/assets/image/modules/gallery/mega_cities/denys-nevozhai-3_b.jpg +0 -0
  562. data/lib/starter_web/assets/image/modules/gallery/mega_cities/emmad-mazhari_c.jpg +0 -0
  563. data/lib/starter_web/assets/image/modules/gallery/mega_cities/federico-rizzarelli_b.jpg +0 -0
  564. data/lib/starter_web/assets/image/modules/gallery/mega_cities/federico-rizzarelli_c.jpg +0 -0
  565. data/lib/starter_web/assets/image/modules/gallery/mega_cities/gints-gailis_b.jpg +0 -0
  566. data/lib/starter_web/assets/image/modules/gallery/mega_cities/jakarta_indonesia.jpg +0 -0
  567. data/lib/starter_web/assets/image/modules/gallery/mega_cities/jakarta_indonesia_2.jpg +0 -0
  568. data/lib/starter_web/assets/image/modules/gallery/mega_cities/luca-bravo_b.jpg +0 -0
  569. data/lib/starter_web/assets/image/modules/gallery/mega_cities/melbourne_australia.jpg +0 -0
  570. data/lib/starter_web/assets/image/modules/gallery/mega_cities/melbourne_australia.webp +0 -0
  571. data/lib/starter_web/assets/image/modules/gallery/mega_cities/queen_bees_at_eureka_tower.jpg +0 -0
  572. data/lib/starter_web/assets/image/modules/gallery/mega_cities/shanghai_china.jpg +0 -0
  573. data/lib/starter_web/assets/image/modules/gallery/mega_cities/steven-diaz_b.jpg +0 -0
  574. data/lib/starter_web/assets/image/modules/gallery/mega_cities/thomas-tucker_b.jpg +0 -0
  575. data/lib/starter_web/assets/image/modules/gallery/mega_cities/tokyo_japan.jpg +0 -0
  576. data/lib/starter_web/assets/image/modules/gallery/neighbor_slider/guardians-of-the-galaxy.jpg +0 -0
  577. data/lib/starter_web/assets/image/modules/gallery/neighbor_slider/justice-league.jpg +0 -0
  578. data/lib/starter_web/assets/image/modules/gallery/neighbor_slider/spider-man.jpg +0 -0
  579. data/lib/starter_web/assets/image/modules/gallery/neighbor_slider/suicide-squad.jpg +0 -0
  580. data/lib/starter_web/assets/image/modules/gallery/neighbor_slider/thor-ragnarok.jpg +0 -0
  581. data/lib/starter_web/assets/image/modules/gallery/panorama/1.jpg +0 -0
  582. data/lib/starter_web/assets/image/modules/gallery/panorama/10.jpg +0 -0
  583. data/lib/starter_web/assets/image/modules/gallery/panorama/11.jpg +0 -0
  584. data/lib/starter_web/assets/image/modules/gallery/panorama/12.jpg +0 -0
  585. data/lib/starter_web/assets/image/modules/gallery/panorama/2.jpg +0 -0
  586. data/lib/starter_web/assets/image/modules/gallery/panorama/3.jpg +0 -0
  587. data/lib/starter_web/assets/image/modules/gallery/panorama/4.jpg +0 -0
  588. data/lib/starter_web/assets/image/modules/gallery/panorama/5.jpg +0 -0
  589. data/lib/starter_web/assets/image/modules/gallery/panorama/6.jpg +0 -0
  590. data/lib/starter_web/assets/image/modules/gallery/panorama/7.jpg +0 -0
  591. data/lib/starter_web/assets/image/modules/gallery/panorama/8.jpg +0 -0
  592. data/lib/starter_web/assets/image/modules/gallery/panorama/9.jpg +0 -0
  593. data/lib/starter_web/assets/image/modules/icons/algolia/search-by-algolia.png +0 -0
  594. data/lib/starter_web/assets/image/modules/icons/asciidoc/logo-512x512.png +0 -0
  595. data/lib/starter_web/assets/image/modules/icons/bootstrap/bootstrap-solid-32x32.png +0 -0
  596. data/lib/starter_web/assets/image/modules/icons/bootstrap/bs-docs-masthead-pattern.png +0 -0
  597. data/lib/starter_web/assets/image/modules/icons/bootstrap/scalable/bootstrap-outline.svg +0 -20
  598. data/lib/starter_web/assets/image/modules/icons/bootstrap/scalable/bootstrap-punchout.svg +0 -18
  599. data/lib/starter_web/assets/image/modules/icons/bootstrap/scalable/bootstrap-solid.svg +0 -17
  600. data/lib/starter_web/assets/image/modules/icons/components/angular.ui.png +0 -0
  601. data/lib/starter_web/assets/image/modules/icons/components/angularjs.png +0 -0
  602. data/lib/starter_web/assets/image/modules/icons/components/aws.png +0 -0
  603. data/lib/starter_web/assets/image/modules/icons/components/bootstrap.png +0 -0
  604. data/lib/starter_web/assets/image/modules/icons/components/c9.png +0 -0
  605. data/lib/starter_web/assets/image/modules/icons/components/chai.png +0 -0
  606. data/lib/starter_web/assets/image/modules/icons/components/emmet.png +0 -0
  607. data/lib/starter_web/assets/image/modules/icons/components/express.png +0 -0
  608. data/lib/starter_web/assets/image/modules/icons/components/git.png +0 -0
  609. data/lib/starter_web/assets/image/modules/icons/components/github.png +0 -0
  610. data/lib/starter_web/assets/image/modules/icons/components/gulp.png +0 -0
  611. data/lib/starter_web/assets/image/modules/icons/components/heroku.png +0 -0
  612. data/lib/starter_web/assets/image/modules/icons/components/htmlcss-1.png +0 -0
  613. data/lib/starter_web/assets/image/modules/icons/components/htmlcss-2.png +0 -0
  614. data/lib/starter_web/assets/image/modules/icons/components/jasmine.png +0 -0
  615. data/lib/starter_web/assets/image/modules/icons/components/javascript.png +0 -0
  616. data/lib/starter_web/assets/image/modules/icons/components/jquery.png +0 -0
  617. data/lib/starter_web/assets/image/modules/icons/components/kanban.png +0 -0
  618. data/lib/starter_web/assets/image/modules/icons/components/leanux.png +0 -0
  619. data/lib/starter_web/assets/image/modules/icons/components/linkedin.png +0 -0
  620. data/lib/starter_web/assets/image/modules/icons/components/mean.png +0 -0
  621. data/lib/starter_web/assets/image/modules/icons/components/mongodb.png +0 -0
  622. data/lib/starter_web/assets/image/modules/icons/components/node.png +0 -0
  623. data/lib/starter_web/assets/image/modules/icons/components/postgresql.png +0 -0
  624. data/lib/starter_web/assets/image/modules/icons/components/protractor.png +0 -0
  625. data/lib/starter_web/assets/image/modules/icons/components/rails.png +0 -0
  626. data/lib/starter_web/assets/image/modules/icons/components/ruby.png +0 -0
  627. data/lib/starter_web/assets/image/modules/icons/components/sass.png +0 -0
  628. data/lib/starter_web/assets/image/modules/icons/components/scrum.png +0 -0
  629. data/lib/starter_web/assets/image/modules/icons/components/twitter.png +0 -0
  630. data/lib/starter_web/assets/image/modules/icons/j1/favicon.ico +0 -0
  631. data/lib/starter_web/assets/image/modules/icons/j1/j1-256x256.png +0 -0
  632. data/lib/starter_web/assets/image/modules/icons/j1/j1-32x32.ico +0 -0
  633. data/lib/starter_web/assets/image/modules/icons/j1/j1-512x512.png +0 -0
  634. data/lib/starter_web/assets/image/modules/icons/j1/j1-64x64.png +0 -0
  635. data/lib/starter_web/assets/image/modules/icons/j1/j1.ico +0 -0
  636. data/lib/starter_web/assets/image/modules/icons/j1/scalable/j1.svg +0 -2023
  637. data/lib/starter_web/assets/image/modules/icons/netlify/nf-logo.png +0 -0
  638. data/lib/starter_web/assets/image/modules/icons/social/amazon.png +0 -0
  639. data/lib/starter_web/assets/image/modules/icons/social/behance.png +0 -0
  640. data/lib/starter_web/assets/image/modules/icons/social/blogger.png +0 -0
  641. data/lib/starter_web/assets/image/modules/icons/social/dribbble.png +0 -0
  642. data/lib/starter_web/assets/image/modules/icons/social/dropbox.png +0 -0
  643. data/lib/starter_web/assets/image/modules/icons/social/facebook.png +0 -0
  644. data/lib/starter_web/assets/image/modules/icons/social/forrst.png +0 -0
  645. data/lib/starter_web/assets/image/modules/icons/social/github.png +0 -0
  646. data/lib/starter_web/assets/image/modules/icons/social/googleplus.png +0 -0
  647. data/lib/starter_web/assets/image/modules/icons/social/instagram.png +0 -0
  648. data/lib/starter_web/assets/image/modules/icons/social/linkedin.png +0 -0
  649. data/lib/starter_web/assets/image/modules/icons/social/pintrest.png +0 -0
  650. data/lib/starter_web/assets/image/modules/icons/social/rss.png +0 -0
  651. data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x-28 - social.svg +0 -86
  652. data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x-28.svg +0 -64
  653. data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x.svg +0 -1
  654. data/lib/starter_web/assets/image/modules/icons/social/skype.png +0 -0
  655. data/lib/starter_web/assets/image/modules/icons/social/spotify.png +0 -0
  656. data/lib/starter_web/assets/image/modules/icons/social/twitter.png +0 -0
  657. data/lib/starter_web/assets/image/modules/icons/social/twitter_x.png +0 -0
  658. data/lib/starter_web/assets/image/modules/icons/social/vimeo.png +0 -0
  659. data/lib/starter_web/assets/image/modules/icons/social/vk.png +0 -0
  660. data/lib/starter_web/assets/image/modules/icons/social/wordpress.png +0 -0
  661. data/lib/starter_web/assets/image/modules/icons/social/xing.png +0 -0
  662. data/lib/starter_web/assets/image/modules/icons/social/yahoo.png +0 -0
  663. data/lib/starter_web/assets/image/modules/icons/social/youtube.png +0 -0
  664. data/lib/starter_web/assets/video/poster/wistia/sources/banner.psd +0 -0
  665. data/lib/starter_web/assets/video/poster/wistia/sources/logo-text.png +0 -0
  666. data/lib/starter_web/assets/video/poster/wistia/sources/wistia-black.psd +0 -0
  667. data/lib/starter_web/assets/video/poster/wistia/sources/wistia_text_logo_black.jpg +0 -0
  668. data/lib/starter_web/assets/video/poster/youtube/taylor_swift/28-07-_2024_22-21-00.jpg +0 -0
  669. data/lib/starter_web/pages/public/features/template.asciidoc +0 -758
  670. data/lib/starter_web/pages/public/tools/tester/swiper_tester.adoc +0 -796
  671. /data/assets/{error_pages → page}/HTTP204.html +0 -0
  672. /data/assets/{error_pages → page}/HTTP400.html +0 -0
  673. /data/assets/{error_pages → page}/HTTP401.html +0 -0
  674. /data/assets/{error_pages → page}/HTTP403.html +0 -0
  675. /data/assets/{error_pages → page}/HTTP404.html +0 -0
  676. /data/assets/{error_pages → page}/HTTP444.html +0 -0
  677. /data/assets/{error_pages → page}/HTTP445.html +0 -0
  678. /data/assets/{error_pages → page}/HTTP446.html +0 -0
  679. /data/assets/{error_pages → page}/HTTP447.html +0 -0
  680. /data/assets/{error_pages → page}/HTTP448.html +0 -0
  681. /data/assets/{error_pages → page}/HTTP500.html +0 -0
  682. /data/assets/{error_pages → page}/HTTP501.html +0 -0
  683. /data/assets/{error_pages → page}/HTTP502.html +0 -0
  684. /data/assets/{error_pages → page}/HTTP503.html +0 -0
  685. /data/assets/theme/j1/modules/{js-cookies/js/js.cookie.js → cookiejs/js/.cookiejs.js} +0 -0
  686. /data/assets/theme/j1/modules/{js-cookies/js/js.cookie.min.js → cookiejs/js/jcookiejs.min.js} +0 -0
  687. /data/assets/theme/j1/modules/{swiper → swiperjs}/LICENSE +0 -0
  688. /data/assets/theme/j1/modules/{swiper → swiperjs}/README.md +0 -0
  689. /data/assets/theme/j1/modules/{swiper → swiperjs}/css/swiper-bundle.min..css +0 -0
  690. /data/lib/starter_web/assets/audio/album/royalty_free/{disco → !info/disco}/!sound.links.txt +0 -0
  691. /data/lib/starter_web/assets/audio/album/royalty_free/{pop → !info/pop}/!sound.links.txt +0 -0
  692. /data/lib/starter_web/assets/image/{backgrounds → background}/triangles-bg.png +0 -0
  693. /data/lib/starter_web/assets/image/{badges → badge}/configBinder.jpg +0 -0
  694. /data/lib/starter_web/assets/image/{badges → badge}/docsBinder.jpg +0 -0
  695. /data/lib/starter_web/assets/image/{badges → badge}/notebookBinder.jpg +0 -0
  696. /data/lib/starter_web/assets/image/{badges → badge}/png/configBinder.png +0 -0
  697. /data/lib/starter_web/assets/image/{badges → badge}/png/docsBinder.png +0 -0
  698. /data/lib/starter_web/assets/image/{badges → badge}/png/notebookBinder.png +0 -0
  699. /data/lib/starter_web/assets/image/{badges → badge}/scaleable/binder.svg +0 -0
  700. /data/lib/starter_web/assets/image/{badges → badge}/scaleable/configBinder.svg +0 -0
  701. /data/lib/starter_web/assets/image/{badges → badge}/scaleable/docsBinder.svg +0 -0
  702. /data/lib/starter_web/assets/image/{badges → badge}/scaleable/myBinder.svg +0 -0
  703. /data/lib/starter_web/assets/image/{badges → badge}/scaleable/notebookBinder.svg +0 -0
  704. /data/lib/starter_web/assets/image/{blocks → block}/waves/scalable/1920x100/wave-1.svg +0 -0
  705. /data/lib/starter_web/assets/image/{blocks → block}/waves/scalable/1920x100/wave-2.svg +0 -0
  706. /data/lib/starter_web/assets/image/{blocks → block}/waves/scalable/1920x100/wave-3.svg +0 -0
  707. /data/lib/starter_web/assets/image/{blocks → block}/waves/scalable/1920x100/wave-4.svg +0 -0
  708. /data/lib/starter_web/assets/image/{blocks → block}/waves/scalable/1920x100/wave-5.svg +0 -0
  709. /data/lib/starter_web/assets/image/{collections → collection}/books/biography/a_life_in_questions.jpg +0 -0
  710. /data/lib/starter_web/assets/image/{collections → collection}/books/biography/becoming.jpg +0 -0
  711. /data/lib/starter_web/assets/image/{collections → collection}/books/biography/born_to_run.jpg +0 -0
  712. /data/lib/starter_web/assets/image/{collections → collection}/books/biography/forty_autumns.jpg +0 -0
  713. /data/lib/starter_web/assets/image/{collections → collection}/books/biography/not_dead_yet.jpg +0 -0
  714. /data/lib/starter_web/assets/image/{collections → collection}/books/biography/the_princess_diarist.jpg +0 -0
  715. /data/lib/starter_web/assets/image/{collections → collection}/books/biography/when_breath_becomes_air.jpg +0 -0
  716. /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/harry-potter-deathly-hallows.jpg +0 -0
  717. /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/harry-potter-philosophers-stone.jpg +0 -0
  718. /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/mistborn-trilogy.jpg +0 -0
  719. /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/ready-player-one.jpg +0 -0
  720. /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/sword-of-destiny.jpg +0 -0
  721. /data/lib/starter_web/assets/image/{collections → collection}/books/fantasy/terry-pratchet-diary.jpg +0 -0
  722. /data/lib/starter_web/assets/image/{collections → collection}/books/romance/breath-of-snow-and-ashes.jpg +0 -0
  723. /data/lib/starter_web/assets/image/{collections → collection}/books/romance/it-ends-with-us.jpg +0 -0
  724. /data/lib/starter_web/assets/image/{collections → collection}/books/romance/outlander-novel.jpg +0 -0
  725. /data/lib/starter_web/assets/image/{collections → collection}/books/romance/outlander-short-story.jpg +0 -0
  726. /data/lib/starter_web/assets/image/{collections → collection}/books/romance/the-fiery-cross.jpg +0 -0
  727. /data/lib/starter_web/assets/image/{collections → collection}/books/romance/the_dressmaker.jpg +0 -0
  728. /data/lib/starter_web/assets/image/{collections → collection}/people/diana-petersen.jpg +0 -0
  729. /data/lib/starter_web/assets/image/{collections → collection}/people/larry-parker.jpg +0 -0
  730. /data/lib/starter_web/assets/image/{collections → collection}/people/parveen-anand.jpg +0 -0
  731. /data/lib/starter_web/assets/image/{collections → collection}/portfolio/1.jpg +0 -0
  732. /data/lib/starter_web/assets/image/{collections → collection}/portfolio/2.jpg +0 -0
  733. /data/lib/starter_web/assets/image/{collections → collection}/portfolio/3.jpg +0 -0
  734. /data/lib/starter_web/assets/image/{collections → collection}/portfolio/4.jpg +0 -0
  735. /data/lib/starter_web/assets/image/{collections → collection}/portfolio/5.jpg +0 -0
  736. /data/lib/starter_web/assets/image/{collections → collection}/portfolio/6.jpg +0 -0
  737. /data/lib/starter_web/assets/image/custom/header/{avatar.svg → scalable/avatar.svg} +0 -0
  738. /data/lib/starter_web/assets/image/{icons → icon}/asciidoc/logo-512x512.png +0 -0
  739. /data/lib/starter_web/assets/image/{icons → icon}/bootstrap/bootstrap-solid-32x32.png +0 -0
  740. /data/lib/starter_web/assets/image/{icons → icon}/bootstrap/bs-docs-masthead-pattern.png +0 -0
  741. /data/lib/starter_web/assets/image/{icons → icon}/bootstrap/scalable/bootstrap-outline.svg +0 -0
  742. /data/lib/starter_web/assets/image/{icons → icon}/bootstrap/scalable/bootstrap-punchout.svg +0 -0
  743. /data/lib/starter_web/assets/image/{icons → icon}/bootstrap/scalable/bootstrap-solid.svg +0 -0
  744. /data/lib/starter_web/assets/image/{icons → icon}/components/angular.ui.png +0 -0
  745. /data/lib/starter_web/assets/image/{icons → icon}/components/angularjs.png +0 -0
  746. /data/lib/starter_web/assets/image/{icons → icon}/components/aws.png +0 -0
  747. /data/lib/starter_web/assets/image/{icons → icon}/components/bootstrap.png +0 -0
  748. /data/lib/starter_web/assets/image/{icons → icon}/components/c9.png +0 -0
  749. /data/lib/starter_web/assets/image/{icons → icon}/components/chai.png +0 -0
  750. /data/lib/starter_web/assets/image/{icons → icon}/components/emmet.png +0 -0
  751. /data/lib/starter_web/assets/image/{icons → icon}/components/express.png +0 -0
  752. /data/lib/starter_web/assets/image/{icons → icon}/components/git.png +0 -0
  753. /data/lib/starter_web/assets/image/{icons → icon}/components/github.png +0 -0
  754. /data/lib/starter_web/assets/image/{icons → icon}/components/gulp.png +0 -0
  755. /data/lib/starter_web/assets/image/{icons → icon}/components/heroku.png +0 -0
  756. /data/lib/starter_web/assets/image/{icons → icon}/components/htmlcss-1.png +0 -0
  757. /data/lib/starter_web/assets/image/{icons → icon}/components/htmlcss-2.png +0 -0
  758. /data/lib/starter_web/assets/image/{icons → icon}/components/jasmine.png +0 -0
  759. /data/lib/starter_web/assets/image/{icons → icon}/components/javascript.png +0 -0
  760. /data/lib/starter_web/assets/image/{icons → icon}/components/jquery.png +0 -0
  761. /data/lib/starter_web/assets/image/{icons → icon}/components/kanban.png +0 -0
  762. /data/lib/starter_web/assets/image/{icons → icon}/components/leanux.png +0 -0
  763. /data/lib/starter_web/assets/image/{icons → icon}/components/linkedin.png +0 -0
  764. /data/lib/starter_web/assets/image/{icons → icon}/components/mean.png +0 -0
  765. /data/lib/starter_web/assets/image/{icons → icon}/components/mongodb.png +0 -0
  766. /data/lib/starter_web/assets/image/{icons → icon}/components/node.png +0 -0
  767. /data/lib/starter_web/assets/image/{icons → icon}/components/postgresql.png +0 -0
  768. /data/lib/starter_web/assets/image/{icons → icon}/components/protractor.png +0 -0
  769. /data/lib/starter_web/assets/image/{icons → icon}/components/rails.png +0 -0
  770. /data/lib/starter_web/assets/image/{icons → icon}/components/ruby.png +0 -0
  771. /data/lib/starter_web/assets/image/{icons → icon}/components/sass.png +0 -0
  772. /data/lib/starter_web/assets/image/{icons → icon}/components/scrum.png +0 -0
  773. /data/lib/starter_web/assets/image/{icons → icon}/components/twitter.png +0 -0
  774. /data/lib/starter_web/assets/image/{icons → icon}/controls/close-icon.svg +0 -0
  775. /data/lib/starter_web/assets/image/{icons → icon}/controls/up.svg +0 -0
  776. /data/lib/starter_web/assets/image/{icons → icon}/github/avatar-icon.png +0 -0
  777. /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/hyvore-talk.ico +0 -0
  778. /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/jpg/hyvor-logo.512x512.jpg +0 -0
  779. /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/png/hyvor-logo.24x24.jpg +0 -0
  780. /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/png/hyvor-logo.24x24.png +0 -0
  781. /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/png/hyvor-logo.512x512.png +0 -0
  782. /data/lib/starter_web/assets/image/{icons/hyvor-talk → icon/hyvor}/scalable/hyvor-logo.svg +0 -0
  783. /data/lib/starter_web/assets/image/{icons → icon}/j1/favicon.ico +0 -0
  784. /data/lib/starter_web/assets/image/{icons → icon}/j1/j1-256x256.png +0 -0
  785. /data/lib/starter_web/assets/image/{icons → icon}/j1/j1-32x32.ico +0 -0
  786. /data/lib/starter_web/assets/image/{icons → icon}/j1/j1-512x512.png +0 -0
  787. /data/lib/starter_web/assets/image/{icons → icon}/j1/j1-64x64.png +0 -0
  788. /data/lib/starter_web/assets/image/{icons → icon}/j1/j1.ico +0 -0
  789. /data/lib/starter_web/assets/image/{icons → icon}/j1/jpg/j1-256x256.jpg +0 -0
  790. /data/lib/starter_web/assets/image/{icons → icon}/j1/jpg/j1-512x512.jpg +0 -0
  791. /data/lib/starter_web/assets/image/{icons → icon}/j1/jpg/j1-64x64.jpg +0 -0
  792. /data/lib/starter_web/assets/image/{icons → icon}/j1/png/j1-256x256.png +0 -0
  793. /data/lib/starter_web/assets/image/{icons → icon}/j1/png/j1-512x512.jpg +0 -0
  794. /data/lib/starter_web/assets/image/{icons → icon}/j1/png/j1-512x512.jpg.png +0 -0
  795. /data/lib/starter_web/assets/image/{icons → icon}/j1/png/j1-512x512.png +0 -0
  796. /data/lib/starter_web/assets/image/{icons → icon}/j1/png/j1-64x64.png +0 -0
  797. /data/lib/starter_web/assets/image/{icons → icon}/j1/scalable/j1.svg +0 -0
  798. /data/lib/starter_web/assets/image/{icons → icon}/jekyll/logo-2x.png +0 -0
  799. /data/lib/starter_web/assets/image/{icons → icon}/jekyll/octojekyll.png +0 -0
  800. /data/lib/starter_web/assets/image/{icons → icon}/lanus/favicon.ico +0 -0
  801. /data/lib/starter_web/assets/image/{icons → icon}/lanus/lanus-512x512.png +0 -0
  802. /data/lib/starter_web/assets/image/{icons → icon}/lanus/lanus.ico +0 -0
  803. /data/lib/starter_web/assets/image/{icons → icon}/lanus/lanus.png +0 -0
  804. /data/lib/starter_web/assets/image/{icons → icon}/lanus/scalable/lanus.svg +0 -0
  805. /data/lib/starter_web/assets/image/{icons → icon}/lanus/scalable/lanus_sw.svg +0 -0
  806. /data/lib/starter_web/assets/image/{icons/mdi → icon/mdi/scalable}/mdi.svg +0 -0
  807. /data/lib/starter_web/assets/image/{icons/mdi → icon/mdi/scalable}/mdil.svg +0 -0
  808. /data/lib/starter_web/assets/image/{icons → icon}/os/centos/centos-icon.png +0 -0
  809. /data/lib/starter_web/assets/image/{icons → icon}/os/centos/centos.ico +0 -0
  810. /data/lib/starter_web/assets/image/{icons → icon}/os/suse/suse.gif +0 -0
  811. /data/lib/starter_web/assets/image/{icons → icon}/os/suse/suse.ico +0 -0
  812. /data/lib/starter_web/assets/image/{icons → icon}/os/suse/suse.png +0 -0
  813. /data/lib/starter_web/assets/image/{icons → icon}/os/ubuntu/cof_black_hex.png +0 -0
  814. /data/lib/starter_web/assets/image/{icons → icon}/os/ubuntu/cof_orange_hex.png +0 -0
  815. /data/lib/starter_web/assets/image/{icons → icon}/os/ubuntu/cof_white-black_hex.png +0 -0
  816. /data/lib/starter_web/assets/image/{icons → icon}/os/ubuntu/cof_white-orange_hex.png +0 -0
  817. /data/lib/starter_web/assets/image/{icons → icon}/os/ubuntu/ubuntu.ico +0 -0
  818. /data/lib/starter_web/assets/image/{icons → icon}/os/windows/windows.png +0 -0
  819. /data/lib/starter_web/assets/image/{icons → icon}/os/windows/windows_flags_color.ico +0 -0
  820. /data/lib/starter_web/assets/image/{icons → icon}/os/windows/windows_hdd.ico +0 -0
  821. /data/lib/starter_web/assets/image/{icons → icon}/os/windows/windows_store.ico +0 -0
  822. /data/lib/starter_web/assets/image/{icons → icon}/social/amazon.png +0 -0
  823. /data/lib/starter_web/assets/image/{icons → icon}/social/behance.png +0 -0
  824. /data/lib/starter_web/assets/image/{icons → icon}/social/blogger.png +0 -0
  825. /data/lib/starter_web/assets/image/{icons → icon}/social/deviantart.png +0 -0
  826. /data/lib/starter_web/assets/image/{icons → icon}/social/dribbble.png +0 -0
  827. /data/lib/starter_web/assets/image/{icons → icon}/social/dropbox.png +0 -0
  828. /data/lib/starter_web/assets/image/{icons → icon}/social/evernote.png +0 -0
  829. /data/lib/starter_web/assets/image/{icons → icon}/social/facebook.png +0 -0
  830. /data/lib/starter_web/assets/image/{icons → icon}/social/forrst.png +0 -0
  831. /data/lib/starter_web/assets/image/{icons → icon}/social/github.png +0 -0
  832. /data/lib/starter_web/assets/image/{icons → icon}/social/googleplus.png +0 -0
  833. /data/lib/starter_web/assets/image/{icons → icon}/social/instagram.png +0 -0
  834. /data/lib/starter_web/assets/image/{icons → icon}/social/jolicloud.png +0 -0
  835. /data/lib/starter_web/assets/image/{icons → icon}/social/last-fm.png +0 -0
  836. /data/lib/starter_web/assets/image/{icons → icon}/social/linkedin.png +0 -0
  837. /data/lib/starter_web/assets/image/{icons → icon}/social/picasa.png +0 -0
  838. /data/lib/starter_web/assets/image/{icons → icon}/social/pintrest.png +0 -0
  839. /data/lib/starter_web/assets/image/{icons → icon}/social/rss.png +0 -0
  840. /data/lib/starter_web/assets/image/{icons → icon/social}/scalable/facebook.svg +0 -0
  841. /data/lib/starter_web/assets/image/{icons → icon/social}/scalable/google.svg +0 -0
  842. /data/lib/starter_web/assets/image/{icons → icon/social}/scalable/ibm.svg +0 -0
  843. /data/lib/starter_web/assets/image/{icons → icon/social}/scalable/microsoft.svg +0 -0
  844. /data/lib/starter_web/assets/image/{icons → icon}/social/skype.png +0 -0
  845. /data/lib/starter_web/assets/image/{icons → icon}/social/spotify.png +0 -0
  846. /data/lib/starter_web/assets/image/{icons → icon}/social/stumbleupon.png +0 -0
  847. /data/lib/starter_web/assets/image/{icons → icon}/social/tumblr.png +0 -0
  848. /data/lib/starter_web/assets/image/{icons → icon}/social/twitter.png +0 -0
  849. /data/lib/starter_web/assets/image/{icons → icon}/social/vimeo.png +0 -0
  850. /data/lib/starter_web/assets/image/{icons → icon}/social/vk.png +0 -0
  851. /data/lib/starter_web/assets/image/{icons → icon}/social/wordpress.png +0 -0
  852. /data/lib/starter_web/assets/image/{icons → icon}/social/xing.png +0 -0
  853. /data/lib/starter_web/assets/image/{icons → icon}/social/yahoo.png +0 -0
  854. /data/lib/starter_web/assets/image/{icons → icon}/social/youtube.png +0 -0
  855. /data/lib/starter_web/assets/image/{icons → icon}/tv/Index of -tv-logos-.url +0 -0
  856. /data/lib/starter_web/assets/image/{icons → icon}/tv/TV from Germany - LyngSat Logo.url +0 -0
  857. /data/lib/starter_web/assets/image/{icons → icon}/tv/Zeichnung.svg +0 -0
  858. /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon-16x16.ico +0 -0
  859. /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon-24x24.png +0 -0
  860. /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon-512x512.png +0 -0
  861. /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon.jpg +0 -0
  862. /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon.jpg (353/303/227353).url" +0 -0
  863. /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-icon.png +0 -0
  864. /data/lib/starter_web/assets/image/{icons → icon}/tv/ard-logo-png_seeklogo-428343.png +0 -0
  865. /data/lib/starter_web/assets/image/{icons → icon}/tv/cytec-tvlogos- collection of mostly german tv channel logos.url +0 -0
  866. /data/lib/starter_web/assets/image/{icons → icon}/tv/output_image.jpg +0 -0
  867. /data/lib/starter_web/assets/image/{icons → icon}/tv/pang.ping +0 -0
  868. /data/lib/starter_web/assets/image/{icons → icon}/tv/tv-logos-countries-germany-0_all_logos_mosaic.md at main /302/267 tv-logo-tv-logos.url" +0 -0
  869. /data/lib/starter_web/assets/image/{icons → icon}/videojs/videojs-logo.png +0 -0
  870. /data/lib/starter_web/assets/image/{icons → icon}/videojs/videojs-poster.png +0 -0
  871. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/alexander-redl.jpg +0 -0
  872. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/alina-grubnyak.jpg +0 -0
  873. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/andrea-badino.jpg +0 -0
  874. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/brad-neathery.jpg +0 -0
  875. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/brigitta-schneiter.jpg +0 -0
  876. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/bruno-figueiredo.jpg +0 -0
  877. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/build-with-gemini.jpg +0 -0
  878. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/clem-onojeghuo.jpg +0 -0
  879. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/crawford-jolly.jpg +0 -0
  880. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/eleni-afiontzi.jpg +0 -0
  881. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/fly-d.jpg +0 -0
  882. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/guillaume-bolduc.jpg +0 -0
  883. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/harpal-singh.jpg +0 -0
  884. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/hayden-mills-2.jpg +0 -0
  885. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/isaac-davis.jpg +0 -0
  886. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/j1-content-mockup-1.jpg +0 -0
  887. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/j1-content-mockup-2.jpg +0 -0
  888. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/j1-content-mockup-3.jpg +0 -0
  889. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/j1-starter-mockup-1.jpg +0 -0
  890. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/john-schnobrich-2.jpg +0 -0
  891. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/josep-martins.jpg +0 -0
  892. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/josh-liu.jpg +0 -0
  893. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/kelly-sikkemal.jpg +0 -0
  894. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/kira-auf-der-heide.jpg +0 -0
  895. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/kristopher-roller.jpg +0 -0
  896. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/matthaeus.jpg +0 -0
  897. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/melanie-deziel.jpg +0 -0
  898. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/milad-fakurian.jpg +0 -0
  899. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/mohammad-rahmani.jpg +0 -0
  900. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/nasa.jpg +0 -0
  901. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/quino-al-2.jpg +0 -0
  902. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/1920x1280/recha-oktaviani.jpg +0 -0
  903. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/admin-dashboard-bootstrap-1280x600.jpg +0 -0
  904. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/building-blocks-1920x1280.jpg +0 -0
  905. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/christina-1920x1280.jpg +0 -0
  906. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/cookies-1920x1200.jpg +0 -0
  907. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/franck-1920x1280.jpg +0 -0
  908. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/giammarco-boscaro-1920x1280.jpg +0 -0
  909. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/ideas-start-here-1920x1280-bw.jpg +0 -0
  910. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/ideas-start-here-1920x1280.jpg +0 -0
  911. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/jessica-ruscello-1920x1280.jpg +0 -0
  912. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/joanna-kosinska-1920x1280.jpg +0 -0
  913. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/katie-moum-1920x1280.jpg +0 -0
  914. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/leon-1920x1280.jpg +0 -0
  915. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/lianhao-1920x1280.jpg +0 -0
  916. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/library-1920x1280.jpg +0 -0
  917. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/lunr-1280x800.jpg +0 -0
  918. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/machine-generator-1920x1280.jpg +0 -0
  919. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/markus-krisetya-1920x1280.jpg +0 -0
  920. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/markus-spiske-1920x1280.jpg +0 -0
  921. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/markus-spiske4-1920x1280.jpg +0 -0
  922. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/matthaeus-1920x1280.jpg +0 -0
  923. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/matthew-dockery-1920x1280.jpg +0 -0
  924. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/no-time-1920x1280.jpg +0 -0
  925. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/placeholder/1x1.png +0 -0
  926. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/placeholder/transparent-1920x1280.png +0 -0
  927. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/rirri-1920x1280.jpg +0 -0
  928. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/shubham-dhage-1920x1280.jpg +0 -0
  929. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/shutterstock_sponsor-1920x1280.jpg +0 -0
  930. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/sigmund-1920x1280.jpg +0 -0
  931. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/szabo-viktor-1920x1280.jpg +0 -0
  932. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/themes-1920x1280-bw.jpg +0 -0
  933. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/tldr-1920x800.jpg +0 -0
  934. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/vladislav-klapin-1920x1280.jpg +0 -0
  935. /data/lib/starter_web/assets/image/{modules/attics → module/attic}/yellow-cactus-1920x1280.jpg +0 -0
  936. /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-1.jpg +0 -0
  937. /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-2.jpg +0 -0
  938. /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-3.jpg +0 -0
  939. /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-4.jpg +0 -0
  940. /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-5.jpg +0 -0
  941. /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-6.jpg +0 -0
  942. /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-7.jpg +0 -0
  943. /data/lib/starter_web/assets/image/{modules → module}/carousel/cats/cat-8.jpg +0 -0
  944. /data/lib/starter_web/assets/image/{modules → module}/carousel/mega_cities/andreas-brucker_b.jpg +0 -0
  945. /data/lib/starter_web/assets/image/{modules → module}/carousel/mega_cities/denys-nevozhai-1_b.jpg +0 -0
  946. /data/lib/starter_web/assets/image/{modules → module}/carousel/mega_cities/denys-nevozhai-2_b.jpg +0 -0
  947. /data/lib/starter_web/assets/image/{modules → module}/carousel/mega_cities/luca-bravo_b.jpg +0 -0
  948. /data/lib/starter_web/assets/image/{modules → module}/carousel/mega_cities/thomas-tucker_b.jpg +0 -0
  949. /data/lib/starter_web/assets/image/{modules/gallery/mega_cities/info/authors.txt → module/gallery/mega_citiy/!info/author.txt} +0 -0
  950. /data/lib/starter_web/assets/image/{modules/gallery/old_times/image_01.jpg → module/gallery/old_time/image/grand_pa/image-1.jpg} +0 -0
  951. /data/lib/starter_web/assets/image/{modules/gallery/old_times/image_02.jpg → module/gallery/old_time/image/grand_pa/image-2.jpg} +0 -0
  952. /data/lib/starter_web/assets/image/{modules/gallery/old_times/image_03.jpg → module/gallery/old_time/image/grand_pa/image-3.jpg} +0 -0
  953. /data/lib/starter_web/assets/image/{modules/gallery/old_times/image_04.jpg → module/gallery/old_time/image/grand_pa/image-4.jpg} +0 -0
  954. /data/lib/starter_web/assets/image/{modules/lightbox → module/lightbox/image}/close.png +0 -0
  955. /data/lib/starter_web/assets/image/{modules/lightbox → module/lightbox/image}/loading.gif +0 -0
  956. /data/lib/starter_web/assets/image/{modules/lightbox → module/lightbox/image}/next.png +0 -0
  957. /data/lib/starter_web/assets/image/{modules/lightbox → module/lightbox/image}/prev.png +0 -0
  958. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-1.jpg +0 -0
  959. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-2.jpg +0 -0
  960. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-3.jpg +0 -0
  961. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-4.jpg +0 -0
  962. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-5.jpg +0 -0
  963. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-6.jpg +0 -0
  964. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-7.jpg +0 -0
  965. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_1/cat-8.jpg +0 -0
  966. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_10/panorama-bg-slide1.jpg +0 -0
  967. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_10/panorama-bg-slide2.jpg +0 -0
  968. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_2/andreas-brucker.jpg +0 -0
  969. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_2/denys-nevozhai-1.jpg +0 -0
  970. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_2/denys-nevozhai-2.jpg +0 -0
  971. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_2/luca-bravo.jpg +0 -0
  972. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_2/thomas-tucker.jpg +0 -0
  973. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_3/ms-free-food-family-2.jpg +0 -0
  974. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_3/ms-free-food-hamburger.jpg +0 -0
  975. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_3/ms-free-food-restaurant.jpg +0 -0
  976. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-1-100x80.jpg +0 -0
  977. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-1.jpg +0 -0
  978. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-2-100x80.jpg +0 -0
  979. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-2.jpg +0 -0
  980. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-3-100x80.jpg +0 -0
  981. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-3.jpg +0 -0
  982. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-4-100x80.jpg +0 -0
  983. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-4.jpg +0 -0
  984. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-5-100x80.jpg +0 -0
  985. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-5.jpg +0 -0
  986. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-6-100x80.jpg +0 -0
  987. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-6.jpg +0 -0
  988. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-7-100x80.jpg +0 -0
  989. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_4/ms-free-animals-7.jpg +0 -0
  990. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family-140x80.jpg +0 -0
  991. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family-2-140x80.jpg +0 -0
  992. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family-2.jpg +0 -0
  993. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family-3-140x80.jpg +0 -0
  994. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family-3.jpg +0 -0
  995. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-family.jpg +0 -0
  996. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-hamburger-140x80.jpg +0 -0
  997. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-hamburger.jpg +0 -0
  998. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-pizza-140x80.jpg +0 -0
  999. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-pizza.jpg +0 -0
  1000. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-table-140x80.jpg +0 -0
  1001. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-table.jpg +0 -0
  1002. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-woman-hand-140x80.jpg +0 -0
  1003. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_5/ms-free-food-woman-hand.jpg +0 -0
  1004. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_6_7/6876385555_74a0d7d7ee_b.jpg +0 -0
  1005. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_6_7/6876387431_d86867a3d9_b.jpg +0 -0
  1006. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_6_7/6876388511_d618d53455_b.jpg +0 -0
  1007. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_6_7/6876389463_db27a377e1_b.jpg +0 -0
  1008. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_6_7/6876390339_2e4dd9dbbb_b.jpg +0 -0
  1009. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_8/postslider-5-img-1.jpg +0 -0
  1010. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_8/postslider-5-img-2.jpg +0 -0
  1011. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_8/postslider-5-img-3.jpg +0 -0
  1012. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_8/postslider6-bg-slide2-1024x622.jpg +0 -0
  1013. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/1-2.jpg +0 -0
  1014. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/5-2.jpg +0 -0
  1015. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/6-2.jpg +0 -0
  1016. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/6-3.jpg +0 -0
  1017. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/8-1.jpg +0 -0
  1018. /data/lib/starter_web/assets/image/{modules → module}/masterslider/slider_9/8.jpg +0 -0
  1019. /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/charity-white-tile-bg.png +0 -0
  1020. /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/fashion2-controller-arrow-next.png +0 -0
  1021. /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/fashion2-controller-arrow-prv.png +0 -0
  1022. /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/fashion2-img-slide1.jpg +0 -0
  1023. /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/fashion2-img-slide2.jpg +0 -0
  1024. /data/lib/starter_web/assets/image/{modules → module}/masterslider/unify-examples/fashion2-img-slide3.jpg +0 -0
  1025. /data/lib/starter_web/assets/image/{modules → module}/masterslider/wp-examples/ms-free-business-1.jpg +0 -0
  1026. /data/lib/starter_web/assets/image/{modules → module}/masterslider/wp-examples/ms-free-business-2.jpg +0 -0
  1027. /data/lib/starter_web/assets/image/{modules → module}/masterslider/wp-examples/ms-free-business-3.jpg +0 -0
  1028. /data/lib/starter_web/assets/image/{pages → page}/asciidoc_skeletons/example-pdf-screenshot.jpg +0 -0
  1029. /data/lib/starter_web/assets/image/{pages → page}/core_web_vitals/200-create-a-link-1.jpg +0 -0
  1030. /data/lib/starter_web/assets/image/{pages → page}/core_web_vitals/core_web_vitals_best.jpg +0 -0
  1031. /data/lib/starter_web/assets/image/{pages → page}/core_web_vitals/core_web_vitals_best_full.jpg +0 -0
  1032. /data/lib/starter_web/assets/image/{pages → page}/egrid/bg.png +0 -0
  1033. /data/lib/starter_web/assets/image/{pages → page}/egrid/black_denim.png +0 -0
  1034. /data/lib/starter_web/assets/image/{pages → page}/egrid/explanation.png +0 -0
  1035. /data/lib/starter_web/assets/image/{pages → page}/egrid/html_markup.png +0 -0
  1036. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/1.jpg +0 -0
  1037. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/10.jpg +0 -0
  1038. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/11.jpg +0 -0
  1039. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/12.jpg +0 -0
  1040. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/13.jpg +0 -0
  1041. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/14.jpg +0 -0
  1042. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/15.jpg +0 -0
  1043. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/16.jpg +0 -0
  1044. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/17.jpg +0 -0
  1045. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/18.jpg +0 -0
  1046. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/19.jpg +0 -0
  1047. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/2.jpg +0 -0
  1048. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/20.jpg +0 -0
  1049. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/3.jpg +0 -0
  1050. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/4.jpg +0 -0
  1051. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/5.jpg +0 -0
  1052. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/6.jpg +0 -0
  1053. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/7.jpg +0 -0
  1054. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/8.jpg +0 -0
  1055. /data/lib/starter_web/assets/image/{pages → page}/egrid/large/9.jpg +0 -0
  1056. /data/lib/starter_web/assets/image/{pages → page}/egrid/loading.gif +0 -0
  1057. /data/lib/starter_web/assets/image/{pages → page}/egrid/loading_dark.gif +0 -0
  1058. /data/lib/starter_web/assets/image/{pages → page}/egrid/nav-icon.png +0 -0
  1059. /data/lib/starter_web/assets/image/{pages → page}/egrid/nav.png +0 -0
  1060. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/1.jpg +0 -0
  1061. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/10.jpg +0 -0
  1062. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/11.jpg +0 -0
  1063. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/12.jpg +0 -0
  1064. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/13.jpg +0 -0
  1065. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/14.jpg +0 -0
  1066. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/15.jpg +0 -0
  1067. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/16.jpg +0 -0
  1068. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/17.jpg +0 -0
  1069. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/18.jpg +0 -0
  1070. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/19.jpg +0 -0
  1071. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/1a.jpg +0 -0
  1072. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/2.jpg +0 -0
  1073. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/20.jpg +0 -0
  1074. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/3.jpg +0 -0
  1075. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/4.jpg +0 -0
  1076. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/5.jpg +0 -0
  1077. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/6.jpg +0 -0
  1078. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/7.jpg +0 -0
  1079. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/8.jpg +0 -0
  1080. /data/lib/starter_web/assets/image/{pages → page}/egrid/small/9.jpg +0 -0
  1081. /data/lib/starter_web/assets/image/{pages → page}/features/blog-post-navigator-1280x1000.jpg +0 -0
  1082. /data/lib/starter_web/assets/image/{pages → page}/features/bootswatch-themes-1280x800.jpg +0 -0
  1083. /data/lib/starter_web/assets/image/{pages → page}/features/clipboard-1280x600.jpg +0 -0
  1084. /data/lib/starter_web/assets/image/{pages → page}/features/comments-1280x600.jpg +0 -0
  1085. /data/lib/starter_web/assets/image/{pages → page}/features/cookie-consent-1280x800.jpg +0 -0
  1086. /data/lib/starter_web/assets/image/{pages → page}/features/desktop-web-navigation-1280x1000.jpg +0 -0
  1087. /data/lib/starter_web/assets/image/{pages → page}/features/example-content-1280x800.jpg +0 -0
  1088. /data/lib/starter_web/assets/image/{pages → page}/features/example-content-present-videos-1280x800.jpg +0 -0
  1089. /data/lib/starter_web/assets/image/{pages → page}/features/fab-1280x500.jpg +0 -0
  1090. /data/lib/starter_web/assets/image/{pages → page}/features/full-text-search-1280x800.jpg +0 -0
  1091. /data/lib/starter_web/assets/image/{pages → page}/features/global-mobile-traffic-1920x1080.jpg +0 -0
  1092. /data/lib/starter_web/assets/image/{pages → page}/features/google-lighthouse-1080x300.jpg +0 -0
  1093. /data/lib/starter_web/assets/image/{pages → page}/features/intro-panel-1280x800.jpg +0 -0
  1094. /data/lib/starter_web/assets/image/{pages → page}/features/master-header-1280x600.jpg +0 -0
  1095. /data/lib/starter_web/assets/image/{pages → page}/features/mobile-navigation-600x800.jpg +0 -0
  1096. /data/lib/starter_web/assets/image/{pages → page}/features/native-speakers-by-language.jpg +0 -0
  1097. /data/lib/starter_web/assets/image/{pages → page}/features/nav-module-1280x300.jpg +0 -0
  1098. /data/lib/starter_web/assets/image/{pages → page}/features/nbi-barchart-1280x800.jpg +0 -0
  1099. /data/lib/starter_web/assets/image/{pages → page}/features/teaser-banner-1280x600.jpg +0 -0
  1100. /data/lib/starter_web/assets/image/{pages → page}/features/translator-1280x800.jpg +0 -0
  1101. /data/lib/starter_web/assets/image/{pages → page}/html_validator/appdevtools-html-validator.jpg +0 -0
  1102. /data/lib/starter_web/assets/image/{pages → page}/html_validator/freeformatter-html-validator.jpg +0 -0
  1103. /data/lib/starter_web/assets/image/{pages → page}/html_validator/w3c-nu-checker.jpg +0 -0
  1104. /data/lib/starter_web/assets/image/{pages → page}/html_validator/w3c-validator.jpg +0 -0
  1105. /data/lib/starter_web/assets/image/{pages → page}/modals/01_frame_modal.jpg +0 -0
  1106. /data/lib/starter_web/assets/image/{pages → page}/modals/02_site_modal.jpg +0 -0
  1107. /data/lib/starter_web/assets/image/{pages → page}/modals/03_central_modal.jpg +0 -0
  1108. /data/lib/starter_web/assets/image/{pages → page}/modals/04_fluid_modal.jpg +0 -0
  1109. /data/lib/starter_web/assets/image/{pages → page}/panels/florian-olivo-1920x800.jpg +0 -0
  1110. /data/lib/starter_web/assets/image/{pages → page}/panels/modules-apps-1920x800.jpg +0 -0
  1111. /data/lib/starter_web/assets/image/{pages → page}/panels/no-time-1920x800.jpg +0 -0
  1112. /data/lib/starter_web/assets/image/{pages → page}/panels/responsive-text-1920x800.jpg +0 -0
  1113. /data/lib/starter_web/assets/image/{pages → page}/panels/the-place-1920x800.jpg +0 -0
  1114. /data/lib/starter_web/assets/image/{pages → page}/posts/adrien-olichon-1920x1280.jpg +0 -0
  1115. /data/lib/starter_web/assets/image/{pages → page}/posts/alejandro-barba-1920x1280.jpg +0 -0
  1116. /data/lib/starter_web/assets/image/{pages → page}/posts/andre-francois-mckenzie-1920x1280.jpg +0 -0
  1117. /data/lib/starter_web/assets/image/{pages → page}/posts/andreas-steger-1920x1280.jpg +0 -0
  1118. /data/lib/starter_web/assets/image/{pages → page}/posts/ansgar-scheffold-1920x1280.jpg +0 -0
  1119. /data/lib/starter_web/assets/image/{pages → page}/posts/ben-white-1920x1280.jpg +0 -0
  1120. /data/lib/starter_web/assets/image/{pages → page}/posts/craig-sybert-1920x1280.jpg +0 -0
  1121. /data/lib/starter_web/assets/image/{pages → page}/posts/danielle-cerullo-1920x1280.jpg +0 -0
  1122. /data/lib/starter_web/assets/image/{pages → page}/posts/deb-dowd-1920x1280.jpg +0 -0
  1123. /data/lib/starter_web/assets/image/{pages → page}/posts/halgatewood-1920x1280.jpg +0 -0
  1124. /data/lib/starter_web/assets/image/{pages → page}/posts/hans-eiskonen-1920x1280.jpg +0 -0
  1125. /data/lib/starter_web/assets/image/{pages → page}/posts/ian-barsby-1920x1280.jpg +0 -0
  1126. /data/lib/starter_web/assets/image/{pages → page}/posts/ivan-aleksic-1920x1280.jpg +0 -0
  1127. /data/lib/starter_web/assets/image/{pages → page}/posts/markus-krisetya-1920x1280.jpg +0 -0
  1128. /data/lib/starter_web/assets/image/{pages → page}/posts/markus-spiske-6-1920x1280.jpg +0 -0
  1129. /data/lib/starter_web/assets/image/{pages → page}/posts/markus-winkler-1920x1280.jpg +0 -0
  1130. /data/lib/starter_web/assets/image/{pages → page}/posts/markus-winkler-2-1920x1280.jpg +0 -0
  1131. /data/lib/starter_web/assets/image/{pages → page}/posts/michelle-cassar-1920x1280.jpg +0 -0
  1132. /data/lib/starter_web/assets/image/{pages → page}/posts/mika-baumeister-1920x1280.jpg +0 -0
  1133. /data/lib/starter_web/assets/image/{pages → page}/posts/science-in-hd-1920x1280.jpg +0 -0
  1134. /data/lib/starter_web/assets/image/{pages → page}/previewer/bs-color-palette.png +0 -0
  1135. /data/lib/starter_web/assets/image/{pages → page}/previewer/material-design-color-palette.jpg +0 -0
  1136. /data/lib/starter_web/assets/image/{pages → page}/previewer/material-design-color-palette.png +0 -0
  1137. /data/lib/starter_web/assets/image/{pages → page}/previewer/tunnel_bear_set_gatewy.jpg +0 -0
  1138. /data/lib/starter_web/assets/image/{pages → page}/previewer/tunnel_bear_subscribe.jpg +0 -0
  1139. /data/lib/starter_web/assets/image/{pages → page}/previewer/tunnel_bear_verify_email_address.jpg +0 -0
  1140. /data/lib/starter_web/assets/image/{pages → page}/skeleton/annie-spratt-1920x1280.jpg +0 -0
  1141. /data/lib/starter_web/assets/image/{pages → page}/skeleton/antonino-visalli-1920x1280.jpg +0 -0
  1142. /data/lib/starter_web/assets/image/{pages → page}/skeleton/humble-lamb-1920x1280.jpg +0 -0
  1143. /data/lib/starter_web/assets/image/{pages → page}/skeleton/library-1920x1280.jpg +0 -0
  1144. /data/lib/starter_web/assets/image/{pages → page}/skeleton/romain-vignes-1920x1280.jpg +0 -0
  1145. /data/lib/starter_web/assets/image/{pages → page}/skeleton/sigmund-1920x1280.jpg +0 -0
  1146. /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-image-1.jpg +0 -0
  1147. /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-image-2.jpg +0 -0
  1148. /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-image-3.jpg +0 -0
  1149. /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-thumb-1.jpg +0 -0
  1150. /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-thumb-2.jpg +0 -0
  1151. /data/lib/starter_web/assets/image/{pages → page}/tour/100_present_images/lightbox-thumb-3.jpg +0 -0
  1152. /data/lib/starter_web/assets/image/{pages → page}/tour/410_bs_modals_extentions/avatar.jpg +0 -0
  1153. /data/lib/starter_web/assets/image/{pages → page}/tour/410_bs_modals_extentions/marc.jpg +0 -0
  1154. /data/lib/starter_web/assets/image/{pages → page}/tour/600_quicksearch/quicksearch_icon.jpg +0 -0
  1155. /data/lib/starter_web/assets/image/{pages → page}/tour/600_quicksearch/quicksearch_input.jpg +0 -0
  1156. /data/lib/starter_web/assets/image/{pages → page}/tour/600_quicksearch/quicksearch_results.jpg +0 -0
  1157. /data/lib/starter_web/assets/image/{pages → page}/tour/bootstrap-1920x1000-bw.jpg +0 -0
  1158. /data/lib/starter_web/assets/image/{pages → page}/tour/cards-1920x1280-bw.jpg +0 -0
  1159. /data/lib/starter_web/assets/image/{pages → page}/tour/emojies-1920x1280-bw.jpg +0 -0
  1160. /data/lib/starter_web/assets/image/{pages → page}/tour/icon-fonts-1920x1280-bw.jpg +0 -0
  1161. /data/lib/starter_web/assets/image/{pages → page}/tour/images-1920x1280-bw.jpg +0 -0
  1162. /data/lib/starter_web/assets/image/{pages → page}/tour/puzzle-1920x1280-bw.jpg +0 -0
  1163. /data/lib/starter_web/assets/image/{pages → page}/tour/tables-1920x1280-bw.jpg +0 -0
  1164. /data/lib/starter_web/assets/image/{pages → page}/tour/themes-1920x1280.jpg +0 -0
  1165. /data/lib/starter_web/assets/image/{pages → page}/tour/typography-1920x1280-bw.jpg +0 -0
  1166. /data/lib/starter_web/assets/image/{modules/patterns → pattern/image}/1x1.png +0 -0
  1167. /data/lib/starter_web/assets/image/{modules/patterns → pattern/image}/gridtile.png +0 -0
  1168. /data/lib/starter_web/assets/image/{posts → post}/featured/dynamic-web-access.jpg +0 -0
  1169. /data/lib/starter_web/assets/image/{posts → post}/featured/jamstack-generators.jpg +0 -0
  1170. /data/lib/starter_web/assets/image/{posts → post}/featured/jekyll.1200x400.jpg +0 -0
  1171. /data/lib/starter_web/assets/image/{posts → post}/featured/jekyll.jpg +0 -0
  1172. /data/lib/starter_web/assets/image/{posts → post}/featured/static-web-access.jpg +0 -0
  1173. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-1.jpg +0 -0
  1174. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-10.jpg +0 -0
  1175. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-11.jpg +0 -0
  1176. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-12.jpg +0 -0
  1177. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-13.jpg +0 -0
  1178. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-2.jpg +0 -0
  1179. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-3.jpg +0 -0
  1180. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-4.jpg +0 -0
  1181. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-5.jpg +0 -0
  1182. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-6.jpg +0 -0
  1183. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-7.jpg +0 -0
  1184. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-8.jpg +0 -0
  1185. /data/lib/starter_web/assets/image/{posts → post}/natural_food/post-9.jpg +0 -0
  1186. /data/lib/starter_web/assets/image/{posts → post}/post-img.jpg +0 -0
  1187. /data/lib/starter_web/assets/image/{posts → post}/post-single.jpg +0 -0
  1188. /data/lib/starter_web/assets/image/{quotes → quote}/colored-1.jpg +0 -0
  1189. /data/lib/starter_web/assets/image/{quotes → quote}/colored-2.jpg +0 -0
  1190. /data/lib/starter_web/assets/image/{quotes → quote}/default.jpg +0 -0
  1191. /data/lib/starter_web/assets/image/{quotes → quote}/light-blue.jpg +0 -0
  1192. /data/lib/starter_web/assets/image/{quotes → quote}/people.jpg +0 -0
  1193. /data/lib/starter_web/assets/image/{quotes → quote}/promo/home/screenshot.jpg +0 -0
  1194. /data/lib/starter_web/assets/image/{quotes → quote}/promo/jekyll/jekyll-faq.jpg +0 -0
  1195. /data/lib/starter_web/assets/image/{quotes → quote}/promo/jekyll/jekyll-generator.jpg +0 -0
  1196. /data/lib/starter_web/assets/image/{quotes → quote}/promo/jekyll/jekyll-generator.png +0 -0
  1197. /data/lib/starter_web/assets/image/{quotes → quote}/promo/jekyll/jekyll-og.png +0 -0
  1198. /data/lib/starter_web/assets/image/{quotes → quote}/promo/jekyll/scalable/jekyll-faq.psd +0 -0
@@ -6,8 +6,8 @@ regenerate: true
6
6
 
7
7
  {% comment %}
8
8
  # -----------------------------------------------------------------------------
9
- # ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.js
10
- # AmplitudeJS V5 Plugin|Tech for J1 Template
9
+ # ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.31.js
10
+ # AmplitudeJS V5 Tech for J1 Template
11
11
  #
12
12
  # Product/Info:
13
13
  # https://jekyll.one
@@ -43,7 +43,7 @@ regenerate: true
43
43
  {% comment %} Set config data (settings only)
44
44
  -------------------------------------------------------------------------------- {% endcomment %}
45
45
  {% assign amplitude_defaults = modules.defaults.amplitude.defaults %}
46
- {% assign amplitude_players = modules.amplitude_players.settings %}
46
+ {% assign amplitude_players = modules.amplitude_app.settings %}
47
47
  {% assign amplitude_playlists = modules.amplitude_playlists.settings %}
48
48
 
49
49
  {% comment %} Set config options (settings only)
@@ -60,7 +60,7 @@ regenerate: true
60
60
 
61
61
  /*
62
62
  # -----------------------------------------------------------------------------
63
- # ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.js
63
+ # ~/assets/theme/j1/modules/amplitudejs/js/plugins/tech/ytp.31.js
64
64
  # AmplitudeJS V5 Plugin|Tech for J1 Template
65
65
  #
66
66
  # Product/Info:
@@ -74,95 +74,394 @@ regenerate: true
74
74
  */
75
75
  "use strict";
76
76
 
77
- // date|time monitoring
78
- //------------------------------------------------------------------------------
79
- var startTime;
80
- var endTime;
81
- var startTimeModule;
82
- var endTimeModule;
83
- var timeSeconds;
84
-
85
- // YT API settings
86
- // -----------------------------------------------------------------------------
87
- var YT_PLAYER_STATE = {
88
- UNSTARTED: -1,
89
- ENDED: 0,
90
- PLAYING: 1,
91
- PAUSED: 2,
92
- BUFFERING: 3,
93
- CUED: 5
94
- };
95
-
96
- var firstScriptTag;
97
- var ytPlayer;
98
- var ytPlayerReady = false;
99
- var ytApiReady = false;
100
- var logger = log4javascript.getLogger('j1.adapter.amplitude.tech');
101
-
102
- // YT Player settings data (created dynamically)
103
- // -----------------------------------------------------------------------------
104
- // var ytPlayers = {};
105
- // var ytPlayersMap = new Map();
106
-
107
- // AmplitudeJS API settings
108
- // -----------------------------------------------------------------------------
109
-
110
- var dependency;
111
- var playerCounter = 0;
112
- var load_dependencies = {};
113
-
114
- // set default song index to FIRST item
115
- var songIndex = 0;
116
- var ytpSongIndex = 0;
117
-
118
- var ytpAutoPlay = false;
119
- var ytpLoop = true;
120
- var playLists = {};
121
- var playersUILoaded = { state: false };
122
- var apiInitialized = { state: false };
123
-
124
- var amplitudeDefaults = $.extend({}, {{amplitude_defaults | replace: 'nil', 'null' | replace: '=>', ':' }});
125
- var amplitudePlayers = $.extend({}, {{amplitude_players | replace: 'nil', 'null' | replace: '=>', ':' }});
126
- var amplitudePlaylists = $.extend({}, {{amplitude_playlists | replace: 'nil', 'null' | replace: '=>', ':' }});
127
- var amplitudeOptions = $.extend(true, {}, amplitudeDefaults, amplitudePlayers, amplitudePlaylists);
128
-
129
- var playerExistsInPage = false;
130
- var ytpContainer = null;
131
- var playerProperties = {};
132
- var playList;
133
- var playerProperties;
134
- var playerID;
135
- var playerType;
136
- var playListTitle;
137
- var playListName;
138
- var amplitudePlayerState;
139
- var ytPlayer;
140
- var ytpPlaybackRate
141
-
142
- var songs;
143
- var songMetaData;
144
- var songURL;
145
-
146
- var progress;
147
-
148
- // ---------------------------------------------------------------------------
149
- // Base YT functions and events
150
- // ---------------------------------------------------------------------------
151
-
152
- // Recursive function to MERGE objects
153
- var mergeObject = function() {
154
- mergeObject = Object.assign || function mergeObject(t) {
155
- for (var s, i=1, n=arguments.length; i<n; i++) {
156
- s = arguments[i];
157
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
158
- }
159
- return t;
160
- };
161
- return mergeObject.apply(this, arguments);
77
+ // date|time monitoring
78
+ //----------------------------------------------------------------------------
79
+ var startTime;
80
+ var endTime;
81
+ var startTimeModule;
82
+ var endTimeModule;
83
+ var timeSeconds;
84
+
85
+ // YT API settings
86
+ // ---------------------------------------------------------------------------
87
+ var YT_PLAYER_STATE = {
88
+ UNSTARTED: -1,
89
+ ENDED: 0,
90
+ PLAYING: 1,
91
+ PAUSED: 2,
92
+ BUFFERING: 3,
93
+ CUED: 5
94
+ };
95
+
96
+ var YT_PLAYER_STATE_NAMES = {
97
+ 0: "ended",
98
+ 1: "playing",
99
+ 2: "paused",
100
+ 3: "buffering",
101
+ 4: "not_used",
102
+ 5: "cued",
103
+ 6: "unstarted",
162
104
  };
163
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 firstScriptTag;
117
+ var ytPlayer;
118
+ var ytPlayerReady = false;
119
+ var ytApiReady = false;
120
+ var logger = log4javascript.getLogger('j1.adapter.amplitude.tech');
121
+
122
+ var dependency;
123
+ var playerCounter = 0;
124
+ var load_dependencies = {};
125
+
126
+ // set default song index to FIRST track (video) in playlist
127
+ var songIndex = 0;
128
+ var ytpSongIndex = 0;
129
+
130
+ var ytpAutoPlay = false;
131
+ var ytpLoop = true;
132
+ var playLists = {};
133
+ var playersUILoaded = { state: false };
134
+ var apiInitialized = { state: false };
135
+
136
+ var amplitudeDefaults = $.extend({}, {{amplitude_defaults | replace: 'nil', 'null' | replace: '=>', ':' }});
137
+ var amplitudePlayers = $.extend({}, {{amplitude_players | replace: 'nil', 'null' | replace: '=>', ':' }});
138
+ var amplitudePlaylists = $.extend({}, {{amplitude_playlists | replace: 'nil', 'null' | replace: '=>', ':' }});
139
+ var amplitudeOptions = $.extend(true, {}, amplitudeDefaults, amplitudePlayers, amplitudePlaylists);
140
+
141
+ var playerExistsInPage = false;
142
+ var ytpContainer = null;
143
+ var ytpBufferQuote = 0;
144
+ var playerProperties = {};
145
+ var activeVideoElement = {};
146
+ var ytPlayerCurrentTime = 0;
147
+ var singleAudio = false;
148
+
149
+ var playerScrollerSongElementMin = {{amplitude_defaults.player.player_scroller_song_element_min}};
150
+ var playerScrollControl = {{amplitude_defaults.player.player_scroll_control}};
151
+ var playerAutoScrollSongElement = {{amplitude_defaults.player.player_auto_scroll_song_element}};
152
+ var playerFadeAudio = {{amplitude_defaults.player.player_fade_audio}};
153
+ var playerPlaybackRate = '{{amplitude_defaults.player.player_playback_rate}}';
154
+
155
+ var muteAfterVideoSwitchInterval = {{amplitude_defaults.player.mute_after_video_switch_interval}};
156
+ var checkActiveVideoInterval = {{amplitude_defaults.player.check_active_video_interval}};
157
+
158
+ var playList;
159
+ var playerProperties;
160
+ var playerID;
161
+ var playerType;
162
+ var playListTitle;
163
+ var playListName;
164
+ var amplitudePlayerState;
165
+
166
+ var ytPlayer;
167
+
168
+
169
+ var songs;
170
+ var songMetaData;
171
+ var songURL;
172
+
173
+ var progress;
174
+
175
+ // ---------------------------------------------------------------------------
176
+ // Base YT functions
177
+ // ===========================================================================
178
+
179
+ // ---------------------------------------------------------------------------
180
+ // mergeObject
181
+ // ---------------------------------------------------------------------------
182
+ // function mergeObject() {
183
+ // mergeObject = Object.assign || function mergeObject(t) {
184
+ // for (var s, i=1, n=arguments.length; i<n; i++) {
185
+ // s = arguments[i];
186
+ // for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
187
+ // }
188
+ // return t;
189
+ // };
190
+
191
+ // return mergeObject.apply(this, arguments);
192
+ // } // END mergeObject
193
+
194
+ // ---------------------------------------------------------------------------
195
+ // processOnVideoStart(trackID, player, startSec)
196
+ //
197
+ // ---------------------------------------------------------------------------
198
+ function processOnVideoStart(player, startSec) {
199
+ var currentVolume, playlist, playerID,
200
+ videoID, songIndex, trackID;
201
+
202
+ playlist = activeVideoElement.playlist;
203
+ playerID = playlist + '_large';
204
+ videoID = player.options.videoId;
205
+ songIndex = activeVideoElement.index;
206
+ trackID = songIndex + 1;
207
+
208
+ // seek video to START position
209
+ ytpSeekTo(player, startSec, true);
210
+
211
+ // fade-in audio (if enabled)
212
+ if (playerFadeAudio) {
213
+ currentVolume = player.getVolume();
214
+ logger.debug('\n' + `FADE-IN audio on StateChange at trackID|VideoID: ${trackID}|${videoID}`);
215
+ ytpFadeInAudio({
216
+ playerID: playerID,
217
+ targetVolume: currentVolume,
218
+ speed: 'default'
219
+ });
220
+ } // END if playerFadeAudio
221
+
222
+ } // END processOnVideoStart
223
+
224
+ // ---------------------------------------------------------------------------
225
+ // processOnVideoEnd(player)
226
+ //
227
+ // TODO:
228
+ // ---------------------------------------------------------------------------
229
+ function processOnVideoEnd(player) {
230
+ var currentVideoTime,
231
+ playlist, playerID, songIndex, songs,
232
+ trackID, activeVideoID, previousVideoID, isVideoChanged;
233
+
234
+ playlist = activeVideoElement.playlist;
235
+ playerID = playlist + '_large';
236
+ currentVideoTime = player.getCurrentTime();
237
+ previousVideoID = player.options.videoId;
238
+ activeVideoID = activeVideoElement.videoID;
239
+ songIndex = activeVideoElement.index;
240
+ trackID = songIndex + 1;
241
+ songs = activeVideoElement.songs;
242
+
243
+ // check if video is changed (to detect multiple videoIDs in playlist)
244
+ if (songIndex > 0) {
245
+ isVideoChanged = (previousVideoID !== activeVideoID) ? true : false;
246
+ } else {
247
+ isVideoChanged = true;
248
+ }
249
+
250
+ // fade-out audio (if enabled)
251
+ if (isVideoChanged && playerFadeAudio) {
252
+ logger.debug('\n' + `FADE-OUT audio on processOnVideoEnd at trackID|VideoID: ${trackID}|${activeVideoID}`);
253
+ ytpFadeOutAudio({
254
+ playerID: playerID,
255
+ speed: 'default'
256
+ });
257
+ } // END if playerFadeAudio
258
+
259
+ // if (!activeVideoElement.audio_single) {
260
+ if (isVideoChanged) {
261
+ // load next video
262
+ logger.debug('\n' + `LOAD next VIDEO on processOnVideoEnd at trackID|playlist: ${trackID}|${playlist}`);
263
+ loadNextVideo(playlist, songIndex);
264
+ } else {
265
+ // skip loading next video if a single video is used for playlist
266
+ logger.debug('\n' + `LOAD next TRACK in video on processOnVideoEnd at trackID|playlist: ${trackID}|${playlist}`);
267
+ }
268
+
269
+ } // END processOnVideoEnd
270
+
271
+ // ---------------------------------------------------------------------------
272
+ // doNothingOnStateChange(state)
273
+ //
274
+ // ---------------------------------------------------------------------------
275
+ function doNothingOnStateChange(state) {
276
+ if (state > 0) {
277
+ logger.warn('\n' + `DO NOTHING on StateChange for state: ${YT_PLAYER_STATE_NAMES[state]}`);
278
+ } else {
279
+ logger.warn('\n' + `DO NOTHING on StateChange for state: ${YT_PLAYER_STATE_NAMES[6]}`);
280
+ }
281
+ } // ENS doNothingOnStateChange
282
+
283
+ // ---------------------------------------------------------------------------
284
+ // processOnStateChangePlaying()
285
+ //
286
+ // ---------------------------------------------------------------------------
287
+ function processOnStateChangePlaying(event, playlist, songIndex) {
288
+ var activeSong, playlist, playerID, videoID,
289
+ ytPlayer, songs, songIndex,
290
+ currentPlayer, previousPlayer, trackID;
291
+
292
+ ytPlayer = event.target;
293
+
294
+ // update active song settings (manually)
295
+ checkActiveVideoElementYTP();
296
+
297
+ // get active song settings (manually)
298
+ activeSong = getActiveSong();
299
+
300
+ playlist = activeSong.playlist;
301
+ playerID = activeSong.playerID;
302
+ videoID = activeSong.videoID;
303
+ songs = activeSong.songs;
304
+ songIndex = activeSong.index;
305
+ currentPlayer = activeSong.player;
306
+ previousPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player
307
+
308
+ // save YT player GLOBAL data for later use (e.g. events)
309
+ j1.adapter.amplitude.data.activePlayer = 'ytp';
310
+ j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
311
+ j1.adapter.amplitude.data.ytpGlobals['videoID'] = videoID;
312
+
313
+ // save YT player data for later use (e.g. events)
314
+ j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
315
+
316
+ // update time container for the ACTIVE video
317
+ // -----------------------------------------------------------------
318
+ setInterval(function() {
319
+ updateCurrentTimeContainerYTP(ytPlayer, playlist);
320
+ }, 500);
321
+
322
+ // update time progressbar for the ACTIVE video
323
+ // -----------------------------------------------------------------
324
+ setInterval(function() {
325
+ updateProgressBarsYTP();
326
+ }, 500);
327
+
328
+ trackID = songIndex + 1;
329
+ logger.debug('\n' + `PLAY video on StateChange at trackID|VideoID: ${trackID}|${videoID}`);
330
+
331
+ // check|process video for configured START position (if set)
332
+ // -------------------------------------------------------------------------
333
+ var songStartSec = activeSong.startSec;
334
+ if (songStartSec) {
335
+ var tsStartSec = seconds2timestamp(songStartSec);
336
+ var songCurrentTime = ytPlayer.getCurrentTime();
337
+
338
+ if (songCurrentTime < songStartSec) {
339
+ logger.debug('\n' + `START video on StateChange at trackID|timestamp: ${trackID}|${tsStartSec}`);
340
+ processOnVideoStart(ytPlayer, songStartSec);
341
+ }
342
+ } // END if songStartEnabled
343
+
344
+ // check|process video for configured END position (if set)
345
+ // -------------------------------------------------------------------------
346
+ var songEndSec = activeSong.endSec;
347
+ if (songEndSec) {
348
+ var tsEndSec = seconds2timestamp(songEndSec);
349
+
350
+ var checkOnVideoEnd = setInterval(function() {
351
+ var songCurrentTime = ytPlayer.getCurrentTime();
352
+
353
+ if (songCurrentTime >= songEndSec) {
354
+ logger.debug('\n' + `STOP video on StateChange at trackID|timestamp: ${trackID}|${tsEndSec}`);
355
+ processOnVideoEnd(ytPlayer);
356
+
357
+ clearInterval(checkOnVideoEnd);
358
+ } // END if currentVideoTime
359
+ }, 500); // END checkOnVideoEnd
360
+ } // END if songEndEnabled
361
+
362
+ // stop active AT players running in parallel
363
+ // -------------------------------------------------------------------------
364
+ var atpPlayerState = Amplitude.getPlayerState();
365
+ if (atpPlayerState === 'playing') {
366
+ Amplitude.stop();
367
+
368
+ // clear button MINI PlayerPlayPause (AT player)
369
+ var buttonPlayerPlayPause = document.getElementsByClassName("mini-player-play-pause");
370
+ for (var i=0; i<buttonPlayerPlayPause.length; i++) {
371
+ var htmlElement = buttonPlayerPlayPause[i];
372
+
373
+ if (htmlElement.dataset.amplitudeSource === 'audio') {
374
+ htmlElement.classList.remove('amplitude-playing');
375
+ htmlElement.classList.add('amplitude-paused');
376
+ }
377
+
378
+ } // END for MINI buttonPlayerPlayPause
379
+
380
+ // clear button COMPACT PlayerPlayPause (AT player)
381
+ var buttonPlayerPlayPause = document.getElementsByClassName("compact-player-play-pause");
382
+ for (var i=0; i<buttonPlayerPlayPause.length; i++) {
383
+ var htmlElement = buttonPlayerPlayPause[i];
384
+
385
+ if (htmlElement.dataset.amplitudeSource === 'audio') {
386
+ htmlElement.classList.remove('amplitude-playing');
387
+ htmlElement.classList.add('amplitude-paused');
388
+ }
389
+
390
+ } // END for COMACT buttonPlayerPlayPause
391
+
392
+ // clear button LARGE PlayerPlayPause (AT player)
393
+ var buttonPlayerPlayPause = document.getElementsByClassName("large-player-play-pause");
394
+ for (var i=0; i<buttonPlayerPlayPause.length; i++) {
395
+ var htmlElement = buttonPlayerPlayPause[i];
396
+
397
+ if (htmlElement.dataset.amplitudeSource === 'audio') {
398
+ htmlElement.classList.remove('amplitude-playing');
399
+ htmlElement.classList.add('amplitude-paused');
400
+ }
401
+
402
+ } // END for LARGE buttonPlayerPlayPause
403
+
404
+ } // END if atpPlayerState 'playing'
405
+
406
+ // TODO: check if YT player stop is needed
407
+ // stop active YT players running in parallel except the current
408
+ // if (previousPlayer.options.videoId !== videoID) {
409
+ // logger.debug('\n' + `STOP all video on StateChange running in parallel at trackID|playerID: ${trackID}|${playerID}`);
410
+ // var playerState = (previousPlayer.getPlayerState() > 0) ? previousPlayer.getPlayerState() : 6;
411
+ // var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
412
+
413
+ // if (ytPlayerState === 'playing' || ytPlayerState === 'paused') {
414
+ // previousPlayer.stopVideo();
415
+ // }
416
+ // }
417
+
418
+ // stopAllActivePlayers(playerID);
419
+
420
+ } // END processOnStateChangePlaying
421
+
422
+
423
+ // ---------------------------------------------------------------------------
424
+ // processOnStateChangeEnded()
425
+ //
426
+ // ---------------------------------------------------------------------------
427
+ function processOnStateChangeEnded(event, playlist, songIndex) {
428
+ var videoID = event.target.options.videoId;
429
+ var trackID = songIndex + 1;
430
+
431
+ // save player current time data for later use
432
+ ytPlayerCurrentTime = ytPlayer.getCurrentTime();
433
+
434
+ logger.debug('\n' + `NEXT video on StateChange at trackID|VideoID: ${trackID}|${videoID}`);
435
+
436
+ // load NEXT song (video) in playlist
437
+ loadNextVideo(playlist, songIndex);
438
+
439
+ } // END processOnStateChangeEnded
440
+
441
+ // ---------------------------------------------------------------------------
442
+ // getSongIndex(songArray, videoID)
443
+ //
444
+ // TODO: Extend getSongIndex() for singleAudio
445
+ // ---------------------------------------------------------------------------
446
+ function getSongIndex(songArray, videoID) {
447
+ var index;
448
+
449
+ for (var i=0; i<songArray.length; i++) {
450
+ if (songArray[i].url.includes(videoID)) {
451
+ index = songArray[i].index;
452
+ break;
453
+ }
454
+ }
455
+
456
+ return index;
457
+ }
458
+
459
+ // ---------------------------------------------------------------------------
460
+ // addNestedProperty
461
+ //
164
462
  // Add property path dynamically to an existing object
165
463
  // Example: addNestedProperty(j1.adapter.amplitude.data, 'playlist.profile.name', 'Max Mustermann')
464
+ // ---------------------------------------------------------------------------
166
465
  function addNestedProperty(obj, path, value) {
167
466
  let current = obj;
168
467
  const properties = path.split('.');
@@ -179,6 +478,9 @@ var progress;
179
478
  });
180
479
  }
181
480
 
481
+ // ---------------------------------------------------------------------------
482
+ // setNestedProperty
483
+ // ---------------------------------------------------------------------------
182
484
  function setNestedProperty(obj, path, value) {
183
485
  const keys = path.split('.');
184
486
 
@@ -198,8 +500,12 @@ var progress;
198
500
  setNestedProperty(current, keys.slice(1).join('.'), value);
199
501
  }
200
502
 
503
+ // ---------------------------------------------------------------------------
504
+ // addNestedObject
505
+ //
201
506
  // Add (nested) object dynamically to an existing object
202
- // Example: createNestedObject(myObject, ['level1', 'arrayProperty', 0], 'element1');
507
+ // Example: createNestedObject(myObject, ['level1', 'arrayProperty', 0], 'element1');
508
+ // ---------------------------------------------------------------------------
203
509
  function addNestedObject(obj, path, value) {
204
510
  const lastKey = path[path.length - 1];
205
511
  let current = obj;
@@ -212,7 +518,157 @@ var progress;
212
518
  current[lastKey] = value;
213
519
  }
214
520
 
521
+ // ---------------------------------------------------------------------------
522
+ // timestamp2seconds
523
+ // ---------------------------------------------------------------------------
524
+ function timestamp2seconds(timestamp) {
525
+ // split timestamp
526
+ const parts = timestamp.split(':');
527
+
528
+ // check timestamp format
529
+ if (parts.length !== 3) {
530
+ // return "invalid timestamp";
531
+ return false;
532
+ }
533
+
534
+ // convert parts to integers
535
+ const hours = parseInt(parts[0], 10);
536
+ const minutes = parseInt(parts[1], 10);
537
+ const seconds = parseInt(parts[2], 10);
538
+
539
+ // check valid timestamp values
540
+ if (isNaN(hours) || isNaN(minutes) || isNaN(seconds) ||
541
+ hours < 0 || hours > 23 ||
542
+ minutes < 0 || minutes > 59 ||
543
+ seconds < 0 || seconds > 59) {
544
+ return "invalid timestamp";
545
+ }
546
+
547
+ const totalSeconds = (hours * 3600) + (minutes * 60) + seconds;
548
+ return totalSeconds;
549
+ } // END timestamp2seconds
550
+
551
+ // ---------------------------------------------------------------------------
552
+ // seconds2timestamp
553
+ // ---------------------------------------------------------------------------
554
+ function seconds2timestamp(seconds) {
555
+ const hours = Math.floor(seconds / 3600);
556
+ const minutes = Math.floor((seconds % 3600) / 60);
557
+ const remainSeconds = seconds % 60;
558
+ const tsHours = hours.toString().padStart(2, '0');
559
+ const tsMinutes = minutes.toString().padStart(2, '0');
560
+ const tsSeconds = remainSeconds.toString().padStart(2, '0');
561
+
562
+ return `${tsHours}:${tsMinutes}:${tsSeconds}`;
563
+ } // END seconds2timestamp
564
+
565
+ // ---------------------------------------------------------------------------
566
+ // ytpFadeInAudio
567
+ // ---------------------------------------------------------------------------
568
+ function ytpFadeInAudio(params) {
569
+ const cycle = 1;
570
+ var settings, currentStep, steps, sliderID, volumeSlider;
571
+
572
+ // current fade-in settings using DEFAULTS (if available)
573
+ settings = {
574
+ playerID: params.playerID,
575
+ targetVolume: params.targetVolume = 50,
576
+ speed: params.speed = 'default'
577
+ };
578
+
579
+ // number of iteration steps to INCREASE the players volume on fade-in
580
+ // NOTE: number of steps controls how long and smooth the fade-in
581
+ // transition will be
582
+ const iterationSteps = {
583
+ 'default': 150,
584
+ 'slow': 250,
585
+ 'slower': 350,
586
+ 'slowest': 500
587
+ };
588
+
589
+ sliderID = 'volume_slider_' + settings.playerID;
590
+ volumeSlider = document.getElementById(sliderID);
591
+ steps = iterationSteps[settings.speed];
592
+ currentStep = 1;
593
+
594
+ if (volumeSlider === undefined || volumeSlider === null) {
595
+ logger.warn('\n' + 'no volume slider found at playerID: ' + settings.playerID);
596
+ return;
597
+ }
598
+
599
+ // (ytPlayer.isMuted()) && ytPlayer.unMute();
600
+
601
+ // skip fade-in when volume is already at target value
602
+ // if (ytPlayer.getVolume() >= targetVolume) {
603
+ // logger.warn('\n' + 'skipped fade-in for current video on volume: ', targetVolume);
604
+ // return;
605
+ // }
606
+
607
+ // Start the players volume muted
608
+ ytPlayer.setVolume(0);
609
+
610
+ const fadeInInterval = setInterval(() => {
611
+ const newVolume = settings.targetVolume * (currentStep / steps);
612
+
613
+ ytPlayer.setVolume(newVolume);
614
+ volumeSlider.value = newVolume;
615
+ currentStep++;
616
+
617
+ (currentStep > steps) && clearInterval(fadeInInterval);
618
+ }, cycle);
619
+
620
+ } // END ytpFadeInAudio
621
+
622
+ // ---------------------------------------------------------------------------
623
+ // ytpFadeOutAudio
624
+ // ---------------------------------------------------------------------------
625
+ function ytpFadeOutAudio(params) {
626
+ const cycle = 1;
627
+ var settings, currentStep, steps, newVolume, startVolume,
628
+ playerID, sliderID, volumeSlider;
629
+
630
+ // current fade-in settings using DEFAULTS (if available)
631
+ settings = {
632
+ playerID: params.playerID,
633
+ speed: params.speed = 'default'
634
+ };
635
+
636
+ // number of iteration steps to DECREASE the volume
637
+ const iterationSteps = {
638
+ 'default': 150,
639
+ 'slow': 250,
640
+ 'slower': 350,
641
+ 'slowest': 500
642
+ };
643
+
644
+ sliderID = 'volume_slider_' + settings.playerID;
645
+ volumeSlider = document.getElementById(sliderID);
646
+ startVolume = ytPlayer.getVolume();
647
+ steps = iterationSteps[settings.speed];
648
+ currentStep = 0;
649
+
650
+ if (volumeSlider === undefined || volumeSlider === null) {
651
+ logger.warn('\n' + 'no volume slider found at playerID: ' + settings.playerID);
652
+ return;
653
+ }
654
+
655
+ const fadeOutInterval = setInterval(() => {
656
+ newVolume = startVolume * (1 - currentStep / steps);
657
+
658
+ ytPlayer.setVolume(newVolume);
659
+ volumeSlider.value = newVolume;
660
+ currentStep++;
661
+
662
+ (currentStep > steps) && clearInterval(fadeOutInterval);
663
+ }, cycle);
664
+
665
+ } // END ytpFadeOutAudio
666
+
667
+ // ---------------------------------------------------------------------------
668
+ // initYtAPI
669
+ //
215
670
  // load YT Iframe player API
671
+ // ---------------------------------------------------------------------------
216
672
  function initYtAPI() {
217
673
  startTimeModule = Date.now();
218
674
 
@@ -227,10 +683,139 @@ var progress;
227
683
  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
228
684
  }
229
685
 
230
- // setup YTPlayerUiEvents for AJS players
686
+ // ---------------------------------------------------------------------------
687
+ // loadNextVideo(list, index)
688
+ //
689
+ // load next video in playlist
690
+ // ---------------------------------------------------------------------------
691
+ function loadNextVideo(currentPlaylist, currentIndex) {
692
+ var activeSongSettings, trackID, songName, playlist, playerID, playerIFrame,
693
+ songs, songIndex, songMetaData, songURL, ytpVideoID;
694
+
695
+ // update active song settings (manually)
696
+ checkActiveVideoElementYTP();
697
+
698
+ // get active song settings (manually)
699
+ activeSongSettings = getActiveSong();
700
+
701
+ playlist = currentPlaylist;
702
+ playerID = playlist + '_large';
703
+ songs = activeSongSettings.songs;
704
+ ytPlayer = activeSongSettings.player;
705
+ songIndex = currentIndex;
706
+ trackID = songIndex + 1;
707
+
708
+ songIndex++;
709
+
710
+ ytpSongIndex = songIndex;
711
+
712
+
713
+ // play sonng (video) in playlist
714
+ if (songIndex <= songs.length - 1) {
715
+ songMetaData = songs[songIndex];
716
+ songURL = songMetaData.url;
717
+ ytVideoID = songURL.split('=')[1];
718
+
719
+ // save YT player data for later use (e.g. events)
720
+ j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
721
+ j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytVideoID;
722
+
723
+
724
+ logger.debug('\n' + `SWITCH video on loadNextVideo at trackID|VideoID: ${trackID}|${ytVideoID}`);
725
+ ytPlayer.loadVideoById(ytVideoID);
726
+
727
+ // delay after switch video
728
+ if (muteAfterVideoSwitchInterval) {
729
+ ytPlayer.mute();
730
+ setTimeout(() => {
731
+ ytPlayer.unMute();
732
+ }, muteAfterVideoSwitchInterval);
733
+ }
734
+
735
+ // update global song index
736
+ ytpSongIndex = songIndex;
737
+
738
+ // load the song cover image
739
+ loadCoverImage(songMetaData);
740
+
741
+ // update meta data
742
+ updatMetaContainers(songMetaData);
743
+
744
+ // set song (video) active at index in playlist
745
+ setSongActive(playlist, songIndex);
746
+
747
+ // reset progress bar settings
748
+ resetProgressBarYTP();
749
+
750
+ // scroll song active at index in player
751
+ if (playerAutoScrollSongElement) {
752
+ scrollToActiveElement(playlist);
753
+ }
754
+ } else {
755
+ // continue on FIRST track (video) in playlist
756
+ //
757
+ songIndex = 0;
758
+ var songMetaData = songs[songIndex];
759
+ var songURL = songMetaData.url;
760
+ var ytVideoID = songURL.split('=')[1];
761
+
762
+ // update global song index
763
+ ytpSongIndex = songIndex;
764
+
765
+ // load next video (paused)
766
+ // -----------------------------------------------------------------------
767
+
768
+ // save YT player data for later use (e.g. events)
769
+ j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
770
+ j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
771
+
772
+ logger.debug('\n' + `SWITCH video on loadNextVideo at trackID|VideoID: ${trackID}|${ytVideoID}`);
773
+ ytPlayer.loadVideoById(ytVideoID);
774
+
775
+ // delay after switch video
776
+ if (muteAfterVideoSwitchInterval) {
777
+ ytPlayer.mute();
778
+ setTimeout(() => {
779
+ ytPlayer.unMute();
780
+ }, muteAfterVideoSwitchInterval);
781
+ }
782
+
783
+ // load the song cover image
784
+ loadCoverImage(songMetaData);
785
+
786
+ // update meta data
787
+ updatMetaContainers(songMetaData);
788
+
789
+ // set AJS play_pause button paused
790
+ var playPauseButtonClass = `large-player-play-pause-${playerID}`
791
+ setPlayPauseButtonPaused(playPauseButtonClass);
792
+
793
+ // set song (video) active at index in playlist
794
+ setSongActive(playlist, songIndex);
795
+
796
+ // reset progress bar settings
797
+ resetProgressBarYTP();
798
+
799
+ // scroll song active at index in player
800
+ if (playerAutoScrollSongElement) {
801
+ scrollToActiveElement(playlist);
802
+ }
803
+
804
+ // TODO: check if SHUFFLE is enabled on PLAYLIST (PLAYER ???)
805
+ // set FIRST song (video) paused
806
+ ytPlayer.pauseVideo();
807
+ }
808
+
809
+ } // END loadVideo
810
+
811
+ // ---------------------------------------------------------------------------
812
+ // initUiEventsForAJS
813
+ //
814
+ // setup YTPlayerUiEvents for AJS players
815
+ // ---------------------------------------------------------------------------
231
816
  function initUiEventsForAJS() {
232
817
 
233
- var dependencies_ytp_ready = setInterval (() => {
818
+ var dependencies_ytp_ready = setInterval (() => {
234
819
  var ytApiReady = (j1.adapter.amplitude.data.ytpGlobals['ytApiReady'] !== undefined) ? j1.adapter.amplitude.data.ytpGlobals['ytApiReady'] : false;
235
820
  var ytPlayerReady = (j1.adapter.amplitude.data.ytpGlobals['ytPlayerReady'] !== undefined) ? j1.adapter.amplitude.data.ytpGlobals['ytPlayerReady'] : false;
236
821
 
@@ -245,7 +830,7 @@ var progress;
245
830
  {% endif %}
246
831
 
247
832
  {% if player_source == 'video' %}
248
- var playerID = '{{player.id}}';
833
+ playerID = '{{player.id}}';
249
834
  mimikYTPlayerUiEventsForAJS(playerID);
250
835
  {% endif %}
251
836
 
@@ -256,21 +841,19 @@ var progress;
256
841
  } // END if ready
257
842
 
258
843
  }, 10); // END dependencies_ytp_ready
844
+
259
845
  } // END initUiEventsForAJS()
260
846
 
847
+ // ---------------------------------------------------------------------------
848
+ // onYouTubeIframeAPIReady
849
+ //
261
850
  // Create a player after Iframe player API is ready to use
262
851
  // ---------------------------------------------------------------------------
263
852
  function onYouTubeIframeAPIReady() {
264
- // var currentOptions;
265
- var playerSource;
266
-
267
- ytApiReady = true;
268
- // currentOptions = $.extend({}, {{amplitude_options | replace: 'nil', 'null' | replace: '=>', ':' }});
853
+ ytApiReady = true;
269
854
 
270
- {% for player in amplitude_options.players %}{% if player.enabled %}
271
- {% capture xhr_container_id %}{{player.id}}_parent{% endcapture %}
272
-
273
- playerSource = '{{player.source}}';
855
+ {% for player in amplitude_options.players %}{% if player.enabled and player.source == 'video' %}
856
+ {% capture xhr_container_id %}{{player.id}}_app{% endcapture %}
274
857
 
275
858
  {% if player.source == empty %}
276
859
  {% assign player_source = amplitude_defaults.player.source %}
@@ -282,7 +865,7 @@ var progress;
282
865
  {% continue %}
283
866
  {% else %}
284
867
  // load players of type 'video' configured in current page
285
- //
868
+ // ---------------------------------------------------------------------
286
869
  playerExistsInPage = ($('#' + '{{xhr_container_id}}')[0] !== undefined) ? true : false;
287
870
  if (playerExistsInPage) {
288
871
  var playerSettings = $.extend({}, {{player | replace: 'nil', 'null' | replace: '=>', ':' }});
@@ -319,8 +902,8 @@ var progress;
319
902
  loop: ytpLoop
320
903
  },
321
904
  events: {
322
- 'onReady': {{player.id}}OnPlayerReady,
323
- 'onStateChange': {{player.id}}OnPlayerStateChange
905
+ 'onReady': {{player.id}}OnPlayerReady,
906
+ 'onStateChange': {{player.id}}OnPlayerStateChange
324
907
  }
325
908
  });
326
909
 
@@ -343,42 +926,78 @@ var progress;
343
926
  // store player properties for later use
344
927
  addNestedProperty(j1.adapter.amplitude.data.ytPlayers, '{{player.id}}', playerProperties);
345
928
 
346
- // save YT player data for later use (e.g. events)
347
- // j1.adapter.amplitude.data.ytpGlobals['ytVideoID'] = ytpVideoID;
348
- // j1.adapter.amplitude.data.ytpGlobals['ytPlayerDefaults'] = amplitudeDefaults.player;
349
- // j1.adapter.amplitude.data.ytpGlobals['ytPlayerSettings'] = playerSettings;
350
- j1.adapter.amplitude.data.ytpGlobals['ytApiReady'] = ytApiReady;
929
+ // save YT player GLOBAL data for later use (e.g. events)
930
+ j1.adapter.amplitude.data.ytpGlobals['ytApiReady'] = ytApiReady;
351
931
 
352
-
353
932
  // reset current player
354
933
  playerExistsInPage = false;
355
934
 
356
935
  } // END if playerExistsInPage()
357
936
 
937
+ function checkPlayingStatus(player) {
938
+ if (player.getPlayerState() === YT_PLAYER_STATE.PLAYING) {
939
+ // code run after video is playing
940
+ // console.debug("checkPlayingStatus: AJS YouTube Player state: PLAYING");
941
+ // do nothing
942
+ return;
943
+ } else {
944
+ // re-check player state required
945
+ // console.debug("checkPlayingStatus: AJS YouTube Player state:", player.getPlayerState());
946
+ }
947
+ } // END checkPlayingStatus
948
+
358
949
  // run AJS YouTube Player initialization
359
950
  // ---------------------------------------------------------------------
360
951
  function {{player.id}}OnPlayerReady(event) {
361
- var hours, minutes, seconds;
362
- var ytPlayer = event.target;
363
- var ytPlayerReady = true;
952
+ var hours, minutes, seconds,
953
+ ytPlayer, ytPlayerReady, playerVolumePreset,
954
+ playListName, songsInPlaylist, titleListLargePlayer;
955
+
956
+ ytPlayer = event.target;
957
+ ytPlayerReady = true;
958
+ playerVolumePreset = parseInt({{player.volume_slider.preset_value}});
959
+
960
+ logger.debug('\n' + `FOUND video ready at ID: {{player.id}}`);
961
+
962
+ // set video playback quality to a minimum
963
+ ytPlayer.setPlaybackQuality('small');
964
+
965
+ // set configured player volume preset
966
+ ytPlayer.setVolume(playerVolumePreset);
967
+
968
+ // enable|disable scrolling on playlist
969
+ // -------------------------------------------------------------------
970
+ if (document.getElementById('large_player_right') !== null) {
971
+
972
+ // show|hide scrollbar in playlist
973
+ // -----------------------------------------------------------------
974
+ playListName = j1.adapter.amplitude.data.ytPlayers.{{player.id}}.playerSettings.playlist.name;
975
+ songsInPlaylist = Amplitude.getSongsInPlaylist(playListName);
976
+ titleListLargePlayer = document.getElementById('large_player_title_list_' + playListName);
977
+
978
+ if (songsInPlaylist.length <= playerScrollerSongElementMin) {
979
+ if (titleListLargePlayer !== null) {
980
+ titleListLargePlayer.classList.add('hide-scrollbar');
981
+ }
982
+ }
983
+ }
364
984
 
365
985
  logger.info('\n' + 'AJS YouTube Player on ID {{player.id}}: ready');
366
986
 
367
- // save YT player data for later use (e.g. events)
987
+ // save YT player GLOBAL data for later use (e.g. events)
368
988
  j1.adapter.amplitude.data.ytpGlobals['ytPlayerReady'] = ytPlayerReady;
369
- j1.adapter.amplitude.data.ytPlayers.{{player.id}}.playerReady = ytPlayerReady;
370
989
 
371
- // setInterval(updateCurrentTimeContainerYTP, 1000);
372
- // setInterval(updateProgressBarsYTP, 1000)
990
+ // save YT player data for later use (e.g. events)
991
+ // j1.adapter.amplitude.data.ytPlayers.{{player.id}}.playerReady = ytPlayerReady;
373
992
 
374
993
  // get duration hours (if configured)
375
994
  if ({{player.display_hours}} ) {
376
- hours = ytpGetDurationHours (ytPlayer);
995
+ hours = ytpGetDurationHours(ytPlayer);
377
996
  }
378
997
 
379
998
  // get duration minutes|seconds
380
- minutes = ytpGetDurationMinutes (ytPlayer);
381
- seconds = ytpGetDurationSeconds (ytPlayer);
999
+ minutes = ytpGetDurationMinutes(ytPlayer);
1000
+ seconds = ytpGetDurationSeconds(ytPlayer);
382
1001
 
383
1002
  // set duration time values for current video
384
1003
  // -------------------------------------------------------------------
@@ -409,210 +1028,243 @@ var progress;
409
1028
  logger.warn('\n' + 'Found NO players of type video (YTP) in page');
410
1029
  }
411
1030
 
1031
+ // update activeVideoElement data structure for the ACTIVE video
1032
+ // -------------------------------------------------------------------
1033
+ setInterval(function() {
1034
+ checkActiveVideoElementYTP();
1035
+ }, checkActiveVideoInterval);
1036
+ // END checkActiveVideoElementYTP
1037
+
412
1038
  logger.info('\n' + 'plugin|tech initializing time: ' + (endTimeModule-startTimeModule) + 'ms');
413
1039
 
414
1040
  } // END onPlayerReady()
415
1041
 
416
- // update YT player elements on state change (playing)
1042
+ // ---------------------------------------------------------------------
1043
+ // OnPlayerStateChange
1044
+ //
1045
+ // process Player|Video specific functions on state change
1046
+ // ---------------------------------------------------------------------
1047
+ // NOTE:
1048
+ // The YT API fires a lot of INTERMEDIATE states. MOST of them gets
1049
+ // ignored (do nothing). For state PLAYING, important initial values
1050
+ // are being set; e.g. start|stop positions for a video (when)
1051
+ // configured.
417
1052
  // ---------------------------------------------------------------------
418
1053
  function {{player.id}}OnPlayerStateChange(event) {
419
- var playlist = j1.adapter.amplitude.data.ytPlayers.{{player.id}}.playerSettings.playlist.name;
420
- var playerID = playlist + '_large';
421
- var ytPlayer = j1.adapter.amplitude.data.ytPlayers.{{player.id}}.player;
422
- var songs = j1.adapter.amplitude.data.ytPlayers.{{player.id}}.songs;
423
- // var activeIndex = j1.adapter.amplitude.data.ytPlayers.{{player.id}}.activeIndex;
424
-
425
- // set active ytPlayer
426
- j1.adapter.amplitude.data.ytpGlobals['activePlayer'] = ytPlayer;
1054
+ var currentTime, playlist, ytPlayer, ytVideoID,
1055
+ songs, songIndex, trackID, playerID, songMetaData;
1056
+
1057
+ ytPlayer = event.target;
1058
+ ytVideoID = ytPlayer.options.videoId;
1059
+ playlist = '{{player.id}}'.replace('_large', '');
1060
+ playerID = '{{player.id}}';
1061
+ songs = j1.adapter.amplitude.data.ytPlayers.{{player.id}}.songs;
1062
+ songIndex = ytpSongIndex; // getSongIndex(songs, ytVideoID);
1063
+ trackID = songIndex + 1;
1064
+ // songMetaData = songs[songIndex];
1065
+
1066
+ // save YT player GLOBAL data for later use (e.g. events)
1067
+ j1.adapter.amplitude.data.activePlayer = 'ytp';
1068
+ j1.adapter.amplitude.data.ytpGlobals['activePlayer'] = ytPlayer;
1069
+ j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
1070
+ j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
427
1071
 
428
1072
  // save YT player data for later use (e.g. events)
429
- // j1.adapter.amplitude.data.ytPlayers.{{player.id}}.player = ytPlayer;
1073
+ j1.adapter.amplitude.data.ytPlayers.{{player.id}}.player = ytPlayer;
1074
+ j1.adapter.amplitude.data.ytPlayers.{{player.id}}.activeIndex = songIndex;
1075
+
1076
+ // reset time container|progressbar for the ACTIVE song (video)
1077
+ // -------------------------------------------------------------------
1078
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
1079
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
1080
+ resetProgressBarYTP();
1081
+
1082
+ // process all state changes fired by YT API
1083
+ // -------------------------------------------------------------------
1084
+ switch(event.data) {
1085
+ case YT_PLAYER_STATE.UNSTARTED:
1086
+ doNothingOnStateChange(YT_PLAYER_STATE.UNSTARTED);
1087
+ break;
1088
+ case YT_PLAYER_STATE.CUED:
1089
+ doNothingOnStateChange(YT_PLAYER_STATE.CUED);
1090
+ break;
1091
+ case YT_PLAYER_STATE.BUFFERING:
1092
+ doNothingOnStateChange(YT_PLAYER_STATE.BUFFERING);
1093
+ break;
1094
+ case YT_PLAYER_STATE.PAUSED:
1095
+ doNothingOnStateChange(YT_PLAYER_STATE.PAUSED);
1096
+ break;
1097
+ case YT_PLAYER_STATE.PLAYING:
1098
+ processOnStateChangePlaying(event, playlist, songIndex);
1099
+ break;
1100
+ case YT_PLAYER_STATE.ENDED:
1101
+ processOnStateChangeEnded(event, playlist, songIndex);
1102
+ break;
1103
+ default:
1104
+ logger.error('\n' + `UNKNOWN event on StateChange fired`);
1105
+ } // END case
430
1106
 
431
- resetCurrentTimeContainerYTP();
432
- updateDurationTimeContainerYTP(ytPlayer);
1107
+ } // END {{player.id}}OnPlayerStateChange
433
1108
 
434
- // setInterval(updateCurrentTimeContainerYTP, 1000);
435
- // setInterval(updateProgressBarsYTP('{{player.id}}'), 1000)
1109
+ {% endif %}
1110
+ {% endif %}{% endfor %}
436
1111
 
437
- // Set the index of the active song (index starts by 0)
438
- // ytpSetActiveIndex({{player.id}}, activeIndex);
1112
+ } // END onYouTubeIframeAPIReady
439
1113
 
440
- if (event.data === YT_PLAYER_STATE.PLAYING || event.data === YT_PLAYER_STATE.BUFFERING) {
441
- setInterval(updateCurrentTimeContainerYTP, 1000);
442
- setInterval(updateProgressBarsYTP, 1000);
443
1114
 
444
- // j1.adapter.amplitude.data.ytpGlobals['activePlayer'] = ytPlayer;
445
- }
1115
+ // ---------------------------------------------------------------------------
1116
+ // main
1117
+ // ===========================================================================
446
1118
 
447
- // play next video
448
- if (event.data === YT_PLAYER_STATE.ENDED) {
1119
+ // ---------------------------------------------------------------------------
1120
+ // initYtAPI
1121
+ //
1122
+ // load|initialize YT Iframe player API
1123
+ // ---------------------------------------------------------------------------
1124
+ initYtAPI();
449
1125
 
450
- // var ytPlayer = j1.adapter.amplitude.data.ytpGlobals['ytPlayer'];
451
- // var ytPlayer = j1.adapter.amplitude.data.ytPlayers.{{player.id}}.player;
452
- // var songs = j1.adapter.amplitude.data.ytpGlobals['ytPlayerSongs'];
453
- // var songIndex = parseInt(j1.adapter.amplitude.data.ytpGlobals['ytpSongIndex']) + 1;
1126
+ // ---------------------------------------------------------------------------
1127
+ // initUiEventsForAJS
1128
+ //
1129
+ // setup YTPlayerUiEvents for AJS players
1130
+ // ---------------------------------------------------------------------------
1131
+ initUiEventsForAJS();
454
1132
 
455
- var songIndex;
456
- songIndex = ytpSongIndex;
457
- songIndex++;
458
- ytpSongIndex = songIndex;
459
1133
 
460
- // var songIndex = j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex
461
- // songIndex++
1134
+ // ---------------------------------------------------------------------------
1135
+ // Base AJS Player functions
1136
+ // ===========================================================================
1137
+
1138
+ // ---------------------------------------------------------------------------
1139
+ // updatMetaContainers(metaData)
1140
+ //
1141
+ // update song name in meta-containers
1142
+ // ---------------------------------------------------------------------------
1143
+ function updatMetaContainers(metaData) {
1144
+ var playerID, playlist, songName, artistName, albumName,
1145
+ largePlayerSongAudioRating;
1146
+
1147
+ playlist = metaData.playlist;
1148
+ playerID = playlist + '_large';
1149
+
1150
+ var trackID = metaData.index + 1;
1151
+ logger.debug('\n' + `UPDATE metadata on updatMetaContainers for trackID|playlist at: ${trackID}|${playlist}`);
1152
+
1153
+ // update song name in meta-containers
1154
+ songName = document.getElementsByClassName("song-name");
1155
+ if (songName.length) {
1156
+ for (var i=0; i<songName.length; i++) {
1157
+ var currentPlaylist = songName[i].dataset.amplitudePlaylist;
1158
+ if (currentPlaylist === playlist) {
1159
+ songName[i].innerHTML = metaData.name;
1160
+ }
1161
+ }
1162
+ }
462
1163
 
463
- // update activeIndex
464
- // j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
1164
+ // update artist name in meta-containers
1165
+ artistName = document.getElementsByClassName("artist");
1166
+ if (artistName.length) {
1167
+ for (var i=0; i<artistName.length; i++) {
1168
+ var currentPlaylist = songName[i].dataset.amplitudePlaylist;
1169
+ if (currentPlaylist === playlist) {
1170
+ artistName[i].innerHTML = metaData.artist;
1171
+ }
1172
+ }
1173
+ }
465
1174
 
466
- if (songIndex < songs.length) {
467
- var songMetaData = songs[songIndex];
468
- var songURL = songMetaData.url;
469
- var ytpVideoID = songURL.split('=')[1];
1175
+ // update album name in meta-containers
1176
+ albumName = document.getElementsByClassName("album");
1177
+ if (albumName.length) {
1178
+ for (var i=0; i<albumName.length; i++) {
1179
+ var currentPlaylist = songName[i].dataset.amplitudePlaylist;
1180
+ if (currentPlaylist === playlist) {
1181
+ albumName[i].innerHTML = metaData.album;
1182
+ }
1183
+ }
1184
+ }
470
1185
 
471
- // continue on next video
472
- ytPlayer.loadVideoById(ytpVideoID);
1186
+ // update song rating in screen controls
1187
+ largePlayerSongAudioRating = document.getElementsByClassName("audio-rating-screen-controls");
1188
+ if (largePlayerSongAudioRating.length) {
1189
+ for (var i=0; i<largePlayerSongAudioRating.length; i++) {
1190
+ var currentPlaylist = largePlayerSongAudioRating[i].dataset.amplitudePlaylist;
1191
+ if (currentPlaylist === playlist) {
1192
+ if (metaData.rating) {
1193
+ var trackID = metaData.index + 1;
473
1194
 
474
- // reset|update time settings
475
- resetCurrentTimeContainerYTP();
476
- updateDurationTimeContainerYTP(ytPlayer);
1195
+ // save YT player data for later use (e.g. events)
1196
+ j1.adapter.amplitude.data.ytPlayers[playerID].videoID = metaData.videoID;
477
1197
 
478
- // update global song index for next video
479
- ytpSongIndex = songIndex;
480
- // ytpSetActiveIndex({{player.id}}, songIndex);
1198
+ logger.debug('\n' + `UPDATE song rating on updatMetaContainers for trackID|playlist at: ${trackID}|${playlist} with a value of: ${metaData.rating}`);
1199
+ largePlayerSongAudioRating[i].innerHTML = '<img src="/assets/image/pattern/rating/scalable/' + metaData.rating + '-star.svg"' + 'alt="song rating">';
1200
+ } else {
1201
+ largePlayerSongAudioRating[i].innerHTML = '';
1202
+ }
1203
+ }
1204
+ }
1205
+ } // END if largePlayerSongAudioRating
481
1206
 
482
- // save YT player data for later use (e.g. events)
483
- // j1.adapter.amplitude.data.ytpGlobals['ytpSongIndex'] = ytpSongIndex;
484
-
485
- // load cover image for next video
486
- var coverImage;
487
- var selector = ".cover-image-" + playlist;
488
- coverImage = document.querySelector(selector);
489
- coverImage.src = songMetaData.cover_art_url;
490
-
491
- // replace song name in meta-containers for next video
492
- var songName = document.getElementsByClassName("song-name");
493
- songName[0].innerHTML = songMetaData.name; // player-bottom
494
- songName[1].innerHTML = songMetaData.name; // playlist-screen-controls
495
-
496
- // replace song rating (playlist-screen|meta-container)
497
- var largetPlayerSongAudioRating = document.getElementsByClassName("audio-rating");
498
- if (largetPlayerSongAudioRating.length) {
499
- if (songMetaData.rating) {
500
- largetPlayerSongAudioRating[0].innerHTML = songMetaData.rating + ' <i class="mdib mdib-star md-gray-400 mdib-18px"></i>';
501
- } else {
502
- largetPlayerSongAudioRating[0].innerHTML = '';
503
- }
504
- } // END if largetPlayerSongAudioRating
1207
+ } // END updatMetaContainers
505
1208
 
506
- // replace artist name in meta-containers for next video
507
- var artistName = document.getElementsByClassName("artist");
508
- artistName[0].innerHTML = songMetaData.artist;
509
-
510
- // replace album name in meta-containers for next video
511
- var albumName = document.getElementsByClassName("album");
512
- albumName[0].innerHTML = songMetaData.album;
513
-
514
- // set song active in playlist
515
- // setSongPlayed(songIndex);
516
- setSongPlayed(playerID, songIndex);
517
- } else {
518
- // select FIRST video
519
- songIndex = 0;
520
- var songMetaData = songs[songIndex];
521
- var songURL = songMetaData.url;
522
- var ytpVideoID = songURL.split('=')[1];
523
-
524
- // ytpSetActiveIndex({{player.id}}, songIndex);
525
-
526
- // continue (paused) on FIRST video
527
- ytPlayer.loadVideoById(ytpVideoID);
528
- // wait some time to make sure video is loaded|active
529
- setTimeout(() => {
530
- ytPlayer.pauseVideo();
531
- // reset|update time settings
532
- resetCurrentTimeContainerYTP();
533
- updateDurationTimeContainerYTP(ytPlayer);
534
-
535
- // update AJS play_pause button
536
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
537
- largePlayerPlayPauseButton.classList.remove('amplitude-playing');
538
- largePlayerPlayPauseButton.classList.add('amplitude-paused');
539
- }, 300);
540
-
541
- // update global song index for first video
542
- ytpSongIndex = songIndex;
543
-
544
- // save YT player data for later use (e.g. events)
545
- // j1.adapter.amplitude.data.ytpGlobals['ytpSongIndex'] = ytpSongIndex;
546
-
547
- // load cover image for first video
548
- var coverImage;
549
- var selector = ".cover-image-" + playlist;
550
- coverImage = document.querySelector(selector);
551
- coverImage.src = songMetaData.cover_art_url;
552
-
553
- // replace name in meta-containers for first video
554
- var songName = document.getElementsByClassName("song-name");
555
- songName[0].innerHTML = songMetaData.name; // player-bottom
556
- songName[1].innerHTML = songMetaData.name; // playlist-screen-controls
557
-
558
- // replace song rating (playlist-screen|meta-container)
559
- var largetPlayerSongAudioRating = document.getElementsByClassName("audio-rating");
560
- if (largetPlayerSongAudioRating.length) {
561
- if (songMetaData.rating) {
562
- largetPlayerSongAudioRating[0].innerHTML = songMetaData.rating + ' <i class="mdib mdib-star md-gray-400 mdib-18px"></i>';
563
- } else {
564
- largetPlayerSongAudioRating[0].innerHTML = '';
565
- }
566
- } // END if largetPlayerSongAudioRating
567
-
568
- // replace artist name in meta-containers for next video
569
- var artistName = document.getElementsByClassName("artist");
570
- artistName.innerHTML = songMetaData.artist;
571
-
572
- // replace album name in meta-containers for next video
573
- var albumName = document.getElementsByClassName("album");
574
- albumName.innerHTML = songMetaData.album;
575
-
576
- // update AJS play_pause button
577
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
578
- largePlayerPlayPauseButton.classList.remove('amplitude-playing');
579
- largePlayerPlayPauseButton.classList.add('amplitude-paused');
580
-
581
- // set song (video) active in playlist
582
- // setSongPlayed(songIndex);
583
- setSongPlayed(playerID, songIndex);
584
- }
585
- } // END if YT_PLAYER_STATE.ENDED
586
-
587
- } // END {{player.id}}OnPlayerStateChange
588
-
589
- {% endif %}
590
- {% endif %}{% endfor %}
591
-
592
- } // END onYouTubeIframeAPIReady ()
1209
+ // ---------------------------------------------------------------------------
1210
+ // loadCoverImage(metaData)
1211
+ //
1212
+ // load the configured cover image for a specic song (metaData)
1213
+ // ---------------------------------------------------------------------------
1214
+ function loadCoverImage(metaData) {
1215
+ var selector;
1216
+ var coverImage = {};
593
1217
 
1218
+ selector = ".cover-image-" + metaData.playlist;
1219
+ coverImage = document.querySelector(selector);
1220
+ coverImage.src = metaData.cover_art_url;
1221
+ } // END loadCoverImage
594
1222
 
595
1223
  // ---------------------------------------------------------------------------
596
- // main (plugin)
597
- // ---------------------------------------------------------------------------
598
- // load|initialize YT Iframe player API
1224
+ // stopAllActivePlayers(exceptPlayer)
599
1225
  //
600
- initYtAPI();
1226
+ // if multiple players used on a page, stop ALL active AT|YT players
1227
+ // running in parallel execpet the exceptPlayer
1228
+ // ---------------------------------------------------------------------------
1229
+ function stopAllActivePlayers(exceptPlayer) {
601
1230
 
602
- // setup YTPlayerUiEvents for AJS players
603
- //
604
- initUiEventsForAJS();
1231
+ // stop active AT players
1232
+ // -------------------------------------------------------------------------
1233
+ var atpPlayerState = Amplitude.getPlayerState();
1234
+ if (atpPlayerState === 'playing') {
1235
+ Amplitude.stop();
1236
+ } // END stop active AT players
605
1237
 
1238
+ // stop active YT players
1239
+ // -------------------------------------------------------------------------
1240
+ const ytPlayers = Object.keys(j1.adapter.amplitude.data.ytPlayers);
1241
+ for (let i=0; i<ytPlayers.length; i++) {
1242
+ const ytPlayerID = ytPlayers[i];
1243
+ const playerProperties = j1.adapter.amplitude.data.ytPlayers[ytPlayerID];
1244
+
1245
+ if (ytPlayerID !== exceptPlayer) {
1246
+ var player = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID]['player'];
1247
+ var playerState = (player.getPlayerState() > 0) ? player.getPlayerState() : 6;
1248
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
1249
+
1250
+ // if (ytPlayerState === 'playing' || ytPlayerState === 'paused' || ytPlayerState === 'buffering' || ytPlayerState === 'cued' || ytPlayerState === 'unstarted') {
1251
+ if (ytPlayerState === 'playing' || ytPlayerState === 'paused' || ytPlayerState === 'buffering' || ytPlayerState === 'cued' || ytPlayerState === 'unstarted') {
1252
+ logger.debug('\n' + `STOP player at stopAllActivePlayers for id: ${ytPlayerID}`);
1253
+ // player.mute();
1254
+ player.stopVideo();
1255
+ j1.adapter.amplitude.data.ytpGlobals.activeIndex = 0;
1256
+ }
1257
+ }
1258
+ } // END stop active YT players
1259
+
1260
+ } // END stopAllActivePlayers
606
1261
 
607
1262
  // ---------------------------------------------------------------------------
608
- // Base AJS Player functions
609
- // ---------------------------------------------------------------------------
610
-
611
- // ---------------------------------------------------------------------------
612
- // Returns the index of the current video (song) in the songs array
613
- // that is currently playing (starts by 0)
614
- // ---------------------------------------------------------------------------
1263
+ // getSongPlayed
615
1264
  //
1265
+ // Returns the index of the current video (song) in the songs array
1266
+ // that is currently playing (starts by 0)
1267
+ // ---------------------------------------------------------------------------
616
1268
  function getSongPlayed() {
617
1269
  var index = -1;
618
1270
  var songContainers = document.getElementsByClassName("amplitude-active-song-container");
@@ -630,79 +1282,41 @@ var progress;
630
1282
  } // END getSongPlayed
631
1283
 
632
1284
  // ---------------------------------------------------------------------------
633
- // Add class 'amplitude-active-song-container' to the element containing
634
- // visual information for the active song.
1285
+ // setSongActive(currentPlayList, currentIndex)
635
1286
  //
636
- // NOTE: We then don't care if shuffle is on or not.
1287
+ // set song (video) active at index in playlist
637
1288
  // ---------------------------------------------------------------------------
638
- //
639
- function setSongPlayed(playerID, index) {
640
- var direct;
1289
+ function setSongActive(currentPlayList, currentIndex) {
1290
+ var playlist, songContainers, songIndex;
641
1291
 
642
- // Specify if it was a (direct) click on the song container
643
- direct = true;
1292
+ songIndex = currentIndex;
644
1293
 
645
- // Get all song container elements
646
- var songContainers = document.getElementsByClassName("amplitude-song-container");
647
-
648
- // Clear all active song containrs
649
- for (var i = 0; i < songContainers.length; i++) {
1294
+ // clear ALL active song containers
1295
+ // -------------------------------------------------------------------------
1296
+ songContainers = document.getElementsByClassName("amplitude-song-container");
1297
+ for (var i=0; i<songContainers.length; i++) {
650
1298
  songContainers[i].classList.remove("amplitude-active-song-container");
651
1299
  }
652
1300
 
653
- // Find the active index and add the active song container to the element
654
- // that represents the song at the index.
655
- //
656
- if (Amplitude.getActivePlaylist() == "" || Amplitude.getActivePlaylist() == null) {
657
- var activeIndex = "";
658
-
659
- // If we click directly on the song element, we ignore
660
- // whether it's in shuffle or not.
661
- //
662
- if (direct) {
663
- // activeIndex = Amplitude.getActiveIndex();
664
- activeIndex = index;
665
- } else {
666
- if (Amplitude.getConfig().shuffle_on) {
667
- // activeIndex = Amplitude.getConfig().shuffle_list[Amplitude.getActiveIndex()];
668
- } else {
669
- // activeIndex = Amplitude.getActiveIndex();
670
- activeIndex = index;
671
- }
672
- }
673
-
674
- // activate playlist container
675
- if (document.querySelectorAll('.amplitude-song-container[data-amplitude-song-index="' + activeIndex + '"]')) {
676
- var _songContainers = document.querySelectorAll('.amplitude-song-container[data-amplitude-song-index="' + activeIndex + '"]');
677
- for (var _i = 0; _i < _songContainers.length; _i++) {
678
- if (_songContainers[_i].hasAttribute("data-amplitude-playlist")) {
679
- var _playerID = _songContainers[_i].getAttribute("data-amplitude-playlist") + '_large';
680
- if (_playerID === playerID) {
681
- _songContainers[_i].classList.add("amplitude-active-song-container");
682
- }
683
- }
684
- }
1301
+ // find current song container and activate the element
1302
+ // -------------------------------------------------------------------------
1303
+ songContainers = document.querySelectorAll('.amplitude-song-container[data-amplitude-song-index="' + songIndex + '"]');
1304
+ for (var i=0; i<songContainers.length; i++) {
1305
+ if (songContainers[i].hasAttribute("data-amplitude-playlist")) {
1306
+ playlist = songContainers[i].getAttribute("data-amplitude-playlist");
1307
+ if (playlist === currentPlayList) {
1308
+ songContainers[i].classList.add("amplitude-active-song-container");
685
1309
  }
686
- } else {
687
- // If we have an active playlist or the action took place directly on the
688
- // song element, we ignore the shuffle.
689
- //
690
- if (Amplitude.getActivePlaylist() != null && Amplitude.getActivePlaylist() != "" || direct) {
691
- var activePlaylistIndex = Amplitude.getActiveIndex();
692
- } else {
693
- var activePlaylistIndex = "";
1310
+ }
1311
+ }
694
1312
 
695
- if (Amplitude.getActivePlaylist().shuffle) {
696
- activePlaylistIndex = Amplitude.getActiveIndex();
697
- } else {
698
- activePlaylistIndex = Amplitude.getActiveIndex();
699
- }
700
- } // END if
701
- } // END if
702
1313
  } // END setSongPlayed
703
1314
 
1315
+ // ---------------------------------------------------------------------------
1316
+ // getProgressBarSelectedPositionPercentage
1317
+ //
704
1318
  // Returns the position as a percentage the user clicked in player progressbar
705
- // NOTE: The percentage is out of [0.00 .. 1.00]
1319
+ // NOTE: The percentage is out of [0.00 .. 1.00]
706
1320
  // ---------------------------------------------------------------------------
707
1321
  function getProgressBarSelectedPositionPercentage (event, progessBar) {
708
1322
  var offset = progessBar.getBoundingClientRect();
@@ -710,8 +1324,11 @@ var progress;
710
1324
  var percentage = (parseFloat(xpos) / parseFloat(progessBar.offsetWidth)).toFixed(2);
711
1325
 
712
1326
  return percentage;
713
- }
1327
+ } // END getProgressBarSelectedPositionPercentage
714
1328
 
1329
+ // ---------------------------------------------------------------------------
1330
+ // getTimeFromPercentage
1331
+ //
715
1332
  // Returns the time in seconds calculated from a percentage value
716
1333
  // NOTE: The percentage is out of [0.00 .. 1.00]
717
1334
  // ---------------------------------------------------------------------------
@@ -720,154 +1337,373 @@ var progress;
720
1337
  var time = parseFloat((videoDuration * percentage).toFixed(2));
721
1338
 
722
1339
  return time;
1340
+ } // END getTimeFromPercentage
1341
+
1342
+ // ---------------------------------------------------------------------------
1343
+ // checkActiveVideoElementYTP
1344
+ //
1345
+ //
1346
+ // ---------------------------------------------------------------------------
1347
+ function checkActiveVideoElementYTP() {
1348
+ var activeVideoElements = document.getElementsByClassName("amplitude-active-song-container");
1349
+ if (activeVideoElements.length) {
1350
+ var classArray = [].slice.call(activeVideoElements[0].classList, 0);
1351
+ var classString = classArray.toString();
1352
+
1353
+ // activeVideoElement.html = activeVideoElements[0];
1354
+ activeVideoElement.playlist = activeVideoElements[0].dataset.amplitudePlaylist;
1355
+ activeVideoElement.index = parseInt(activeVideoElements[0].dataset.amplitudeSongIndex);
1356
+ activeVideoElement.playerType = (classString.includes('large') ? 'large' : 'compact');
1357
+ activeVideoElement.playerID = activeVideoElement.playlist + '_' + activeVideoElement.playerType;
1358
+
1359
+ if (j1.adapter.amplitude.data.ytPlayers[activeVideoElement.playerID] !== undefined) {
1360
+ activeVideoElement.player = j1.adapter.amplitude.data.ytPlayers[activeVideoElement.playerID].player;
1361
+ activeVideoElement.songs = j1.adapter.amplitude.data.ytPlayers[activeVideoElement.playerID].songs;
1362
+
1363
+ var activeSong = activeVideoElement.songs[activeVideoElement.index];
1364
+
1365
+ activeVideoElement.album = activeSong.album;
1366
+ activeVideoElement.artist = activeSong.artist;
1367
+ activeVideoElement.audio_info = activeSong.audio_info;
1368
+ activeVideoElement.audio_single = activeSong.audio_single;
1369
+ activeVideoElement.currentTime = parseFloat(activeVideoElement.player.getCurrentTime());
1370
+ activeVideoElement.cover_art_url = activeSong.cover_art_url;
1371
+ activeVideoElement.duration = activeSong.duration;
1372
+ activeVideoElement.endSec = timestamp2seconds(activeSong.end);
1373
+ activeVideoElement.endTS = activeSong.end;
1374
+ activeVideoElement.name = activeSong.name;
1375
+ activeVideoElement.rating = activeSong.album;
1376
+ activeVideoElement.startSec = timestamp2seconds(activeSong.start);
1377
+ activeVideoElement.startTS = activeSong.start;
1378
+ activeVideoElement.url = activeSong.url;
1379
+
1380
+ var videoArray = activeSong.url.split('=');
1381
+
1382
+ activeVideoElement.videoID = videoArray[1];
1383
+
1384
+ }
1385
+ }
723
1386
  }
724
1387
 
1388
+ // ---------------------------------------------------------------------------
1389
+ // isObjectEmpty(obj)
1390
+ //
1391
+ // ---------------------------------------------------------------------------
1392
+ function isObjectEmpty(obj) {
1393
+ for (const prop in obj) {
1394
+ if (Object.hasOwn(obj, prop)) {
1395
+ return false;
1396
+ }
1397
+ }
1398
+
1399
+ return true;
1400
+ } // END isObjectEmpty
1401
+
1402
+ // ---------------------------------------------------------------------------
1403
+ // getActiveSong()
1404
+ //
1405
+ // Returns the time in seconds calculated from a percentage value
1406
+ // NOTE: The percentage is out of [0.00 .. 1.00]
1407
+ // ---------------------------------------------------------------------------
1408
+ function getActiveSong() {
1409
+
1410
+ if(!isObjectEmpty(activeVideoElement)) {
1411
+ return activeVideoElement;
1412
+ }
1413
+
1414
+ return false;
1415
+ } // END getActiveSong
1416
+
1417
+
1418
+ // ---------------------------------------------------------------------------
1419
+ // updateProgressBarsYTP
1420
+ //
725
1421
  // Update YTP specific progress data
726
1422
  // ---------------------------------------------------------------------------
727
1423
  function updateProgressBarsYTP() {
728
- var progress;
729
- var activePlayer = j1.adapter.amplitude.data.ytpGlobals['activePlayer'];
730
- var progressBars = document.getElementsByClassName("large-player-progress");
1424
+ var progress, progressBars, playlist, playerID,
1425
+ classArray, classString, activePlayer, activeClass;
731
1426
 
1427
+ progressBars = document.getElementsByClassName("large-player-progress");
732
1428
  for (var i=0; i<progressBars.length; i++) {
733
- if (activePlayer !== undefined) {
734
- // calc procent value (float, 2 decimals [0.00 .. 1.00])
735
- progress = parseFloat((activePlayer.getCurrentTime() / activePlayer.getDuration()).toFixed(2));
736
-
737
- // set current progess value if valid
738
- if (isFinite(progress)) {
739
- progressBars[i].value = progress;
1429
+ if (progressBars[i].dataset.amplitudeSource === 'audio') {
1430
+ // do nothing (managed by adapter)
1431
+ } else {
1432
+ playlist = progressBars[i].getAttribute("data-amplitude-playlist");
1433
+ playerID = playlist + '_large';
1434
+ classArray = [].slice.call(progressBars[i].classList, 0);
1435
+ classString = classArray.toString();
1436
+ activePlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
1437
+ activeClass = 'large-player-progress-' + playlist;
1438
+
1439
+ if (activePlayer === undefined) {
1440
+ logger.error('\n' + 'YT player not defined');
1441
+ return;
1442
+ }
1443
+
1444
+ if (classString.includes(activeClass)) {
1445
+ // calc procent value (float, 2 decimals [0.00 .. 1.00])
1446
+ progress = parseFloat((activePlayer.getCurrentTime() / activePlayer.getDuration()).toFixed(2));
1447
+
1448
+ // set current progess value if valid
1449
+ if (isFinite(progress)) {
1450
+ progressBars[i].value = progress;
1451
+ }
740
1452
  }
741
1453
  }
742
1454
  } // END for
743
1455
 
744
- // calc procent value (float, 2 decimals [0.00 .. 1.00])
745
- // progress = parseFloat((ytPlayer.getCurrentTime() / ytPlayer.getDuration()).toFixed(2));
746
-
747
- // // jadams, 2024-12-07: added check on finite value
748
- // if (!isFinite(progress)) {
749
- // // TODO: check why progress value may NOT finite
750
- // progressBar.value = 0;
751
- // } else if (progress === 1) {
752
- // // reset progress value for next video
753
- // progressBar.value = 0;
754
- // } else {
755
- // // calculate current progress
756
- // progress = parseFloat((ytPlayer.getCurrentTime() / ytPlayer.getDuration()).toFixed(2));
757
- // progressBar.value = progress;
758
-
759
- // save YT player progress data for later use (e.g. events)
760
- // j1.adapter.amplitude.data.ytpGlobals['ytPlayerProgress'] = progress;
761
- //}
762
- }
1456
+ return;
1457
+ } // END updateProgressBarsYTP
763
1458
 
764
- // Update YTP specific duration time data
765
1459
  // ---------------------------------------------------------------------------
766
- function updateDurationTimeContainerYTP(player) {
1460
+ // updateDurationTimeContainerYTP(player, playlist)
1461
+ //
1462
+ // update time container values for current video
1463
+ // ---------------------------------------------------------------------------
1464
+ function updateDurationTimeContainerYTP(player, playlist) {
767
1465
  var hours, minutes, seconds;
768
1466
  var durationHours, durationMinutes, durationSeconds;
1467
+ var activeSongSettings, ytPlayer, activePlaylist;
769
1468
 
770
- // get current hours|minutes|seconds
771
- hours = ytpGetDurationHours(player);
772
- minutes = ytpGetDurationMinutes(player);
773
- seconds = ytpGetDurationSeconds(player);
1469
+ // update active song settings (manually)
1470
+ checkActiveVideoElementYTP();
1471
+
1472
+ // get active song settings (manually)
1473
+ activeSongSettings = getActiveSong();
1474
+ if (!activeSongSettings) {
1475
+ return false;
1476
+ }
1477
+
1478
+ ytPlayer = activeSongSettings.player;
1479
+ activePlaylist = activeSongSettings.playlist;
774
1480
 
775
- // update time container values for current video
1481
+ // if (activeSongSettings) {
1482
+ // ytPlayer = activeSongSettings.player;
1483
+ // activePlaylist = activeSongSettings.playlist;
1484
+ // } else {
1485
+ // ytPlayer = player;
1486
+ // activePlaylist = playlist;
1487
+ // }
1488
+
1489
+ // get current hours|minutes|seconds
776
1490
  // -------------------------------------------------------------------------
1491
+ hours = ytpGetDurationHours(ytPlayer);
1492
+ minutes = ytpGetDurationMinutes(ytPlayer);
1493
+ seconds = ytpGetDurationSeconds(ytPlayer);
777
1494
 
778
1495
  // update current duration|hours
1496
+ // -------------------------------------------------------------------------
779
1497
  durationHours = document.getElementsByClassName("amplitude-duration-hours");
780
1498
  if (durationHours.length && !isNaN(hours)) {
781
- durationHours[0].innerHTML = hours;
1499
+ for (var i=0; i<durationHours.length; i++) {
1500
+ var currentPlaylist = durationHours[i].dataset.amplitudePlaylist;
1501
+ if (currentPlaylist === activePlaylist) {
1502
+ durationHours[i].innerHTML = hours;
1503
+ }
1504
+ }
782
1505
  }
783
1506
 
784
1507
  // update current duration|minutes
1508
+ // -------------------------------------------------------------------------
785
1509
  durationMinutes = document.getElementsByClassName("amplitude-duration-minutes");
786
1510
  if (durationMinutes.length && !isNaN(minutes)) {
787
- durationMinutes[0].innerHTML = minutes;
1511
+ for (var i=0; i<durationMinutes.length; i++) {
1512
+ var currentPlaylist = durationMinutes[i].dataset.amplitudePlaylist;
1513
+ if (currentPlaylist === activePlaylist) {
1514
+ durationMinutes[i].innerHTML = minutes;
1515
+ }
1516
+ }
788
1517
  }
789
1518
 
790
1519
  // update duration|seconds
1520
+ // -------------------------------------------------------------------------
791
1521
  durationSeconds = document.getElementsByClassName("amplitude-duration-seconds");
792
1522
  if (durationSeconds.length && !isNaN(seconds)) {
793
- durationSeconds[0].innerHTML = seconds;
1523
+ for (var i=0; i<durationSeconds.length; i++) {
1524
+ var currentPlaylist = durationSeconds[i].dataset.amplitudePlaylist;
1525
+ if (currentPlaylist === activePlaylist) {
1526
+ durationSeconds[i].innerHTML = seconds;
1527
+ }
1528
+ }
794
1529
  }
795
- }
796
1530
 
797
- // Update YTP specific CURRENT time data
1531
+ return;
1532
+ } // END updateDurationTimeContainerYTP
1533
+
1534
+ // ---------------------------------------------------------------------------
1535
+ // updateCurrentTimeContainerYTP(player, metaData)
1536
+ //
1537
+ // update time container values for current video
798
1538
  // ---------------------------------------------------------------------------
799
- function updateCurrentTimeContainerYTP() {
1539
+ function updateCurrentTimeContainerYTP(player, playlist) {
800
1540
  var hours, minutes, seconds;
801
1541
  var currentHours, currentMinutes, currentSeconds;
802
1542
 
803
1543
  // get current hours|minutes|seconds
804
- hours = ytpGetCurrentHours(ytPlayer);
805
- minutes = ytpGetCurrentMinutes(ytPlayer);
806
- seconds = ytpGetCurrentSeconds(ytPlayer);
807
-
808
- // update time container values for current video
809
- // -------------------------------------------------------------------------
1544
+ hours = ytpGetCurrentHours(player);
1545
+ minutes = ytpGetCurrentMinutes(player);
1546
+ seconds = ytpGetCurrentSeconds(player);
810
1547
 
811
1548
  // update current duration|hours
1549
+ // -------------------------------------------------------------------------
812
1550
  if (hours !== '00') {
813
1551
  currentHours = document.getElementsByClassName("amplitude-current-hours");
814
- currentHours[0].innerHTML = hours;
1552
+ if (currentHours.length) {
1553
+ for (var i=0; i<currentHours.length; i++) {
1554
+ var currentPlaylist = currentHours[i].dataset.amplitudePlaylist;
1555
+ if (currentPlaylist === playlist) {
1556
+ currentHours[i].innerHTML = hours;
1557
+ }
1558
+ }
1559
+ }
815
1560
  }
816
1561
 
817
1562
  // update current duration|minutes
1563
+ // -------------------------------------------------------------------------
818
1564
  currentMinutes = document.getElementsByClassName("amplitude-current-minutes");
819
- currentMinutes[0].innerHTML = minutes;
820
-
1565
+ if (currentMinutes.length) {
1566
+ for (var i=0; i<currentMinutes.length; i++) {
1567
+ var currentPlaylist = currentMinutes[i].dataset.amplitudePlaylist;
1568
+ if (currentPlaylist === playlist) {
1569
+ currentMinutes[i].innerHTML = minutes;
1570
+ }
1571
+ }
1572
+ }
1573
+
821
1574
  // update duration|seconds
1575
+ // -------------------------------------------------------------------------
822
1576
  currentSeconds = document.getElementsByClassName("amplitude-current-seconds");
823
- currentSeconds[0].innerHTML = seconds;
824
- }
1577
+ if (currentSeconds.length) {
1578
+ for (var i=0; i<currentSeconds.length; i++) {
1579
+ var currentPlaylist = currentSeconds[i].dataset.amplitudePlaylist;
1580
+ if (currentPlaylist === playlist) {
1581
+ currentSeconds[i].innerHTML = seconds;
1582
+ }
1583
+ }
1584
+ }
1585
+
1586
+ return;
1587
+ } // END updateCurrentTimeContainerYTP
825
1588
 
826
- // Reset YTP specific progress data
827
1589
  // ---------------------------------------------------------------------------
828
- function resetProgressBarYTP(playerID) {
829
- if (playerID !== undefined) {
830
- var progressBar = j1.adapter.amplitude.data.ytPlayers[playerID].progressBar;
831
- progressBar.value = 0;
1590
+ // resetProgressBarYTP()
1591
+ //
1592
+ // Reset ALL progress bars
1593
+ // ---------------------------------------------------------------------------
1594
+ function resetProgressBarYTP() {
1595
+ var progressBars = document.getElementsByClassName("large-player-progress");
1596
+ for (var i=0; i<progressBars.length; i++) {
1597
+ progressBars[i].value = 0;
832
1598
  }
833
- }
1599
+ } // END resetProgressBarYTP
834
1600
 
835
- // Reset YTP specific CURRENT time data
836
1601
  // ---------------------------------------------------------------------------
837
- function resetCurrentTimeContainerYTP() {
1602
+ // resetCurrentTimeContainerYTP
1603
+ //
1604
+ // Reset YTP specific CURRENT time data
1605
+ // ---------------------------------------------------------------------------
1606
+ function resetCurrentTimeContainerYTP(player, playlist) {
838
1607
 
839
1608
  // reset duration|hours
840
1609
  var currentHours = document.getElementsByClassName("amplitude-current-hours");
841
1610
  if (currentHours.length) {
842
- currentHours[0].innerHTML = '00';
1611
+ for (var i=0; i<currentHours.length; i++) {
1612
+ var currentPlaylist = currentHours[i].dataset.amplitudePlaylist;
1613
+ if (currentPlaylist === playlist) {
1614
+ currentHours[i].innerHTML = '00';
1615
+ }
1616
+ }
843
1617
  }
844
1618
 
845
1619
  // reset duration|minutes
846
1620
  var currentMinutes = document.getElementsByClassName("amplitude-current-minutes");
847
- currentMinutes[0].innerHTML = '00';
1621
+ if (currentMinutes.length) {
1622
+ for (var i=0; i<currentHours.length; i++) {
1623
+ var currentPlaylist = currentMinutes[i].dataset.amplitudePlaylist;
1624
+ if (currentPlaylist === playlist) {
1625
+ currentMinutes[i].innerHTML = '00';
1626
+ }
1627
+ }
1628
+ }
848
1629
 
849
1630
  // reset duration|seconds
850
1631
  var currentSeconds = document.getElementsByClassName("amplitude-current-seconds");
851
- currentSeconds[0].innerHTML = '00';
852
- }
1632
+ if (currentSeconds.length) {
1633
+ for (var i=0; i<currentSeconds.length; i++) {
1634
+ var currentPlaylist = currentSeconds[i].dataset.amplitudePlaylist;
1635
+ if (currentPlaylist === playlist) {
1636
+ currentSeconds[i].innerHTML = '00';
1637
+ }
1638
+ }
1639
+ }
1640
+
1641
+ return;
1642
+ } // END resetCurrentTimeContainerYTP
853
1643
 
854
1644
 
855
1645
  // ---------------------------------------------------------------------------
856
1646
  // Mimik Base AJS API functions
1647
+ // ===========================================================================
1648
+
857
1649
  // ---------------------------------------------------------------------------
1650
+ // ytpLoadVideById
1651
+ //
1652
+ // ???????
1653
+ // ---------------------------------------------------------------------------
1654
+ function ytpLoadVideoById(player, id, bufferQuote) {
1655
+ const cycle = 250;
1656
+
1657
+ player.loadVideoById(id);
1658
+
1659
+ const videoLoaded = setInterval(() => {
1660
+ bufferQuote = ytpGetBuffered(player);
858
1661
 
859
- // Seek (skip) video to time specified
1662
+ if (bufferQuote >= 3) {
1663
+ return true;
1664
+
1665
+ clearInterval(videoLoaded);
1666
+ } else {
1667
+ return false;
1668
+ }
1669
+ }, cycle);
1670
+
1671
+ } // END ytpLoadVideoById
1672
+
1673
+ // ---------------------------------------------------------------------------
1674
+ // ytpSeekTo
1675
+ //
1676
+ // Seek (skip) video to specified time (position)
860
1677
  // ---------------------------------------------------------------------------
861
- function ytpSeekTo(player, time) {
862
- player.seekTo(time, true);
1678
+ function ytpSeekTo(player, time, seekAhead) {
1679
+ // const allowSeekAhead = true;
1680
+ // var buffered = ytpGetBuffered(player);
1681
+
1682
+ if (player.id !== undefined) {
1683
+ player.seekTo(time, seekAhead);
1684
+ // player.seekTo(time);
1685
+
1686
+ return true;
1687
+ } else {
1688
+ return false;
1689
+ }
1690
+
863
1691
  } // END ytpSeekTo
864
1692
 
865
- // Returns the buffered percentage of the playing video
1693
+
1694
+ // ---------------------------------------------------------------------------
1695
+ // ytpGetBuffered
1696
+ //
1697
+ // Returns the buffered percentage of the video currently playing
866
1698
  // ---------------------------------------------------------------------------
867
1699
  function ytpGetBuffered(player) {
868
- // to be defined
869
- }
870
1700
 
1701
+ return (player.getVideoLoadedFraction() * 100).toFixed(2);
1702
+ } // END ytpGetBuffered
1703
+
1704
+ // ---------------------------------------------------------------------------
1705
+ // ytpGetActiveIndex
1706
+ //
871
1707
  // Returns the active song index (in the songs array, starts by 0)
872
1708
  // ---------------------------------------------------------------------------
873
1709
  function ytpGetActiveIndex(playerID) {
@@ -880,6 +1716,10 @@ var progress;
880
1716
  return activeIndex;
881
1717
  } // END ytpGetActiveIndex
882
1718
 
1719
+
1720
+ // ---------------------------------------------------------------------------
1721
+ // ytpSetActiveIndex
1722
+ //
883
1723
  // Set the index of the active song (index starts by 0)
884
1724
  // ---------------------------------------------------------------------------
885
1725
  function ytpSetActiveIndex(playerID, idx) {
@@ -894,35 +1734,45 @@ var progress;
894
1734
  return success;
895
1735
  } // END ytpSetActiveIndex
896
1736
 
1737
+ // ---------------------------------------------------------------------------
1738
+ // ytpGetPlayedPercentage
1739
+ //
897
1740
  // Returns the percentage of the video played
898
1741
  // ---------------------------------------------------------------------------
899
1742
  function ytpGetPlayedPercentage(player) {
900
- // to be defined
901
- }
1743
+ // tbd
1744
+ } // END ytpGetPlayedPercentage
902
1745
 
1746
+ // ---------------------------------------------------------------------------
1747
+ // ytpGetAudio
1748
+ //
903
1749
  // Returns the actual video element
904
1750
  // ---------------------------------------------------------------------------
905
1751
  function ytpGetAudio(player) {
906
- // to be defined
907
- }
1752
+ // tbd
1753
+ } // END ytpGetAudio
908
1754
 
1755
+ // ---------------------------------------------------------------------------
1756
+ // ytpGetPlaybackSpeeds
1757
+ //
909
1758
  // Returns available playback speeds for the player
910
1759
  // ---------------------------------------------------------------------------
911
1760
  function ytpGetPlaybackSpeeds(player) {
912
- // to be defined
913
- }
1761
+ // tbd
1762
+ } // END ytpGetPlaybackSpeeds
914
1763
 
915
- // Returns the current playback speed for the player
916
1764
  // ---------------------------------------------------------------------------
917
- function ytpGetPlaybackSpeed(player) {
918
- }
919
-
1765
+ // ytpGetPlayerState
1766
+ //
920
1767
  // Returns the current state of the player
921
1768
  // ---------------------------------------------------------------------------
922
1769
  function ytpGetPlayerState(player) {
923
- // to be defined
924
- }
1770
+ // tbd
1771
+ } // END ytpGetPlayerState
925
1772
 
1773
+ // ---------------------------------------------------------------------------
1774
+ // ytpGetDuration
1775
+ //
926
1776
  // Returns the duration of the video
927
1777
  // ---------------------------------------------------------------------------
928
1778
  function ytpGetDuration(player) {
@@ -938,6 +1788,9 @@ var progress;
938
1788
  }
939
1789
  } // END ytpGetDuration
940
1790
 
1791
+ // ---------------------------------------------------------------------------
1792
+ // ytpGetCurrentTime
1793
+ //
941
1794
  // Returns the current time of the video played
942
1795
  // ---------------------------------------------------------------------------
943
1796
  function ytpGetCurrentTime(player) {
@@ -955,6 +1808,9 @@ var progress;
955
1808
  }
956
1809
  } // END ytpGetCurrentTime
957
1810
 
1811
+ // ---------------------------------------------------------------------------
1812
+ // ytpGetDurationHours
1813
+ //
958
1814
  // Returns the duration hours of the video
959
1815
  // ---------------------------------------------------------------------------
960
1816
  function ytpGetDurationHours(player) {
@@ -975,6 +1831,9 @@ var progress;
975
1831
  }
976
1832
  } // END ytpGetDurationHours
977
1833
 
1834
+ // ---------------------------------------------------------------------------
1835
+ // ytpGetDurationMinutes
1836
+ //
978
1837
  // Returns the duration minutes of the video
979
1838
  // ---------------------------------------------------------------------------
980
1839
  function ytpGetDurationMinutes(player) {
@@ -995,6 +1854,10 @@ var progress;
995
1854
  }
996
1855
  } // END ytpGetDurationMinutes
997
1856
 
1857
+
1858
+ // ---------------------------------------------------------------------------
1859
+ // ytpGetDurationSeconds
1860
+ //
998
1861
  // Returns the duration seconds of the video
999
1862
  // ---------------------------------------------------------------------------
1000
1863
  function ytpGetDurationSeconds(player) {
@@ -1015,6 +1878,9 @@ var progress;
1015
1878
  }
1016
1879
  } // END ytpGetDurationSeconds
1017
1880
 
1881
+ // ---------------------------------------------------------------------------
1882
+ // ytpGetCurrentHours
1883
+ //
1018
1884
  // Returns the current hours the user is into the video
1019
1885
  // ---------------------------------------------------------------------------
1020
1886
  function ytpGetCurrentHours(player) {
@@ -1035,6 +1901,9 @@ var progress;
1035
1901
  }
1036
1902
  } // END ytpGetCurrentHours
1037
1903
 
1904
+ // ---------------------------------------------------------------------------
1905
+ // ytpGetCurrentMinutes
1906
+ //
1038
1907
  // Returns the current minutes the user is into the video
1039
1908
  // ---------------------------------------------------------------------------
1040
1909
  function ytpGetCurrentMinutes (player) {
@@ -1055,6 +1924,9 @@ var progress;
1055
1924
  }
1056
1925
  } // END ytpGetCurrentMinutes
1057
1926
 
1927
+ // ---------------------------------------------------------------------------
1928
+ // ytpGetCurrentSeconds
1929
+ //
1058
1930
  // Returns the current seconds the user is into the video
1059
1931
  // ---------------------------------------------------------------------------
1060
1932
  function ytpGetCurrentSeconds(player) {
@@ -1076,10 +1948,81 @@ var progress;
1076
1948
  } // END ytpGetCurrentSeconds
1077
1949
 
1078
1950
  // ---------------------------------------------------------------------------
1079
- // mimikYTPlayerUiEventsForAJS()
1080
- // Mimik AJS button events for YT video
1951
+ // togglePlayPauseButton
1952
+ //
1953
+ // toggle button play|pause
1954
+ // ---------------------------------------------------------------------------
1955
+ function togglePlayPauseButton(elementClass) {
1956
+ var button, htmlElement;
1957
+
1958
+ button = document.getElementsByClassName(elementClass);
1959
+
1960
+ if (button.length) {
1961
+ htmlElement = button[0];
1962
+
1963
+ if (htmlElement.classList.contains('amplitude-paused')) {
1964
+ htmlElement.classList.remove('amplitude-paused');
1965
+ htmlElement.classList.add('amplitude-playing');
1966
+ } else {
1967
+ htmlElement.classList.remove('amplitude-playing');
1968
+ htmlElement.classList.add('amplitude-paused');
1969
+ }
1970
+ } else {
1971
+ return false;
1972
+ }
1973
+
1974
+ } // END togglePlayPauseButton
1975
+
1976
+ // ---------------------------------------------------------------------------
1977
+ // setPlayPauseButtonPaused
1978
+ // ---------------------------------------------------------------------------
1979
+ function setPlayPauseButtonPaused(elementClass) {
1980
+ var button, htmlElement;
1981
+
1982
+ button = document.getElementsByClassName(elementClass);
1983
+ htmlElement = button[0];
1984
+
1985
+ htmlElement.classList.remove('amplitude-playing');
1986
+ htmlElement.classList.add('amplitude-paused');
1987
+
1988
+ } // END setPlayPauseButtonPaused
1989
+
1990
+ // ---------------------------------------------------------------------------
1991
+ // setPlayPauseButtonPlaying
1992
+ // ---------------------------------------------------------------------------
1993
+ function setPlayPauseButtonPlaying(elementClass) {
1994
+ var button, htmlElement;
1995
+
1996
+ button = document.getElementsByClassName(elementClass);
1997
+ htmlElement = button[0];
1998
+
1999
+ htmlElement.classList.remove('amplitude-paused');
2000
+ htmlElement.classList.add('amplitude-playing');
2001
+
2002
+ } // END setPlayPauseButtonPlaying
2003
+
1081
2004
  // ---------------------------------------------------------------------------
2005
+ // scrollToActiveElement(playlist)
2006
+ // ---------------------------------------------------------------------------
2007
+ function scrollToActiveElement(activePlaylist) {
2008
+ const scrollableList = document.getElementById('large_player_title_list_' + activePlaylist);
2009
+ const activeElement = scrollableList.querySelector('.amplitude-active-song-container');
2010
+ var activeElementOffsetTop = activeElement.offsetTop;
2011
+ var songIndex = parseInt(activeElement.getAttribute("data-amplitude-song-index"));
2012
+ var activeElementOffsetTop = songIndex * j1.adapter.amplitude.data.playerSongElementHeigth;
2013
+
2014
+ if (scrollableList && activeElement) {
2015
+ scrollableList.scrollTop = activeElementOffsetTop;
2016
+ }
2017
+ } // END scrollToActiveElement
2018
+
2019
+ // ---------------------------------------------------------------------------
2020
+ // mimikYTPlayerUiEventsForAJS
2021
+ //
2022
+ // Mimik AJS button events for YT video
2023
+ // ---------------------------------------------------------------------------
1082
2024
  function mimikYTPlayerUiEventsForAJS(ytPlayerID) {
2025
+
1083
2026
  if (j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID] !== undefined) {
1084
2027
  var playerDefaults = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].playerDefaults;
1085
2028
  var playerSettings = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].playerSettings;
@@ -1087,59 +2030,198 @@ var progress;
1087
2030
 
1088
2031
  // -----------------------------------------------------------------------
1089
2032
  // Large AJS players
1090
- //
1091
- if (j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].playerSettings.type === 'large') {
2033
+ // -----------------------------------------------------------------------
2034
+ if (j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].playerSettings.type === 'large') {
2035
+ var playlist = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].playerSettings.playlist.name;
2036
+ var playerScrollList = document.getElementById('large_player_title_list_' + playlist);
2037
+
2038
+ if (playerScrollControl) {
2039
+ var listItemHeight = playerSongElementHeigth/2;
2040
+ var itemsPerBlock = 1;
2041
+ var isScrollingResetDelay = 150;
2042
+ var isScrolling = false;
2043
+
2044
+ playerScrollList.addEventListener('scroll', (event) => {
2045
+ // block multiple scroll events (while scrolling)
2046
+ if (isScrolling) {
2047
+ return;
2048
+ }
2049
+ isScrolling = true;
2050
+
2051
+ // calculate number of blocks already scrolled
2052
+ const scrolledBlocks = Math.round(list.scrollTop / (listItemHeight * itemsPerBlock));
2053
+
2054
+ // calculate top position based on number of blocks
2055
+ const targetScrollTop = scrolledBlocks * listItemHeight * itemsPerBlock;
2056
+
2057
+ // smooth scrolling
2058
+ list.scrollTo({
2059
+ top: targetScrollTop,
2060
+ behavior: 'smooth'
2061
+ });
2062
+
2063
+ // reset the scrolling flags
2064
+ setTimeout(() => {
2065
+ isScrolling = false;
2066
+ }, isScrollingResetDelay);
2067
+ });
2068
+ }
1092
2069
 
1093
2070
  // Overload AJS play_pause button for YT
1094
- //
2071
+ // TODO: Fix for multiple players in page
2072
+ // ---------------------------------------------------------------------
1095
2073
  var largePlayerPlayPauseButton = document.getElementsByClassName(playerButton);
1096
- for (var i=0; i<largePlayerPlayPauseButton.length; i++) {
2074
+ for (var i=0; i<largePlayerPlayPauseButton.length; i++) {
1097
2075
  var classArray = [].slice.call(largePlayerPlayPauseButton[i].classList, 0);
1098
2076
  var classString = classArray.toString();
1099
2077
 
1100
2078
  if (classString.includes(ytPlayerID)) {
1101
2079
  largePlayerPlayPauseButton[i].addEventListener('click', function(event) {
1102
- var playlist = this.getAttribute("data-amplitude-playlist");
1103
- var playerID = playlist + '_large';
1104
- var ytPlayer = j1.adapter.amplitude['data']['ytPlayers'][playerID]['player'];
1105
- var songs = j1.adapter.amplitude['data']['ytPlayers'][playerID]['songs'];
1106
- var activeIndex = parseInt(j1.adapter.amplitude['data']['ytPlayers'][playerID]['activeIndex']);
1107
- var songMetaData = songs[songIndex];
1108
- var playPauseButton = `large-player-play-pause-${ytPlayerID}`;
1109
-
1110
- // toggle YT play|pause video
1111
- if (ytPlayer.getPlayerState() === YT_PLAYER_STATE.PLAYING || ytPlayer.getPlayerState() === YT_PLAYER_STATE.BUFFERING) {
1112
- ytPlayer.pauseVideo();
2080
+ var activeSongSettings, songs, songMetaData, ytPlayer,
2081
+ playlist, playerID, songIndex;
2082
+
2083
+ playlist = this.getAttribute("data-amplitude-playlist");
2084
+ playerID = playlist + '_large';
2085
+
2086
+ // update active song settings (manually)
2087
+ checkActiveVideoElementYTP();
2088
+
2089
+ // get active song settings (manually)
2090
+ activeSongSettings = getActiveSong();
2091
+
2092
+ // TODO: Extend getSongIndex() for singleAudio
2093
+ // var songIndex = (singleAudio) ? ytpSongIndex : getSongIndex(songs, ytVideoID);
2094
+ if (!activeSongSettings) {
2095
+ songIndex = 0;
2096
+ ytpSongIndex = 0;
1113
2097
  } else {
1114
- ytPlayer.playVideo();
2098
+
2099
+ // ytPlayerCurrentTime = activeSongSettings.currentTime;
2100
+
2101
+ if (activeSongSettings.playlist !== playlist) {
2102
+ songIndex = 0;
2103
+ ytpSongIndex = 0;
2104
+
2105
+ // reset previous player settings
2106
+ if (activeSongSettings.player !== undefined) {
2107
+ activeSongSettings.player.stopVideo();
2108
+ var playPauseButtonClass = `large-player-play-pause-${activeSongSettings.playerID}`;
2109
+ togglePlayPauseButton(playPauseButtonClass);
2110
+ }
2111
+ } else {
2112
+ songIndex = ytpSongIndex;
2113
+ }
1115
2114
  }
1116
2115
 
1117
- // toggle AJS PlayPauseButton
1118
- var largePlayerPlayPauseButton = document.getElementsByClassName(playPauseButton);
1119
- if (largePlayerPlayPauseButton[0].classList.contains('amplitude-paused')) {
1120
- largePlayerPlayPauseButton[0].classList.remove('amplitude-paused');
1121
- largePlayerPlayPauseButton[0].classList.add('amplitude-playing');
2116
+ // set song (video) active at index in playlist
2117
+ setSongActive(playlist, songIndex);
2118
+
2119
+ // reset progress bar settings
2120
+ resetProgressBarYTP();
2121
+
2122
+ // scroll song active at index in player
2123
+ if (playerAutoScrollSongElement) {
2124
+ scrollToActiveElement(playlist);
2125
+ }
2126
+
2127
+ // update activeAudio data (manually)
2128
+ checkActiveVideoElementYTP();
2129
+
2130
+ // get active song settings (manually)
2131
+ activeSongSettings = getActiveSong();
2132
+
2133
+ songs = activeSongSettings.songs;
2134
+ songMetaData = songs[songIndex];
2135
+ ytPlayer = activeSongSettings.player;
2136
+
2137
+ // update meta data
2138
+ updatMetaContainers(songMetaData);
2139
+
2140
+ // save player GLOBAL data for later use (e.g. events)
2141
+ j1.adapter.amplitude.data.activePlayer = 'ytp';
2142
+ j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
2143
+ j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
2144
+
2145
+ // YT play|pause video
2146
+ // ---------------------------------------------------------------
2147
+ var playerState = ytPlayer.getPlayerState();
2148
+ if (playerState < 0) {
2149
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[6];
1122
2150
  } else {
1123
- largePlayerPlayPauseButton[0].classList.remove('amplitude-playing');
1124
- largePlayerPlayPauseButton[0].classList.add('amplitude-paused');
2151
+ var ytPlayerState = YT_PLAYER_STATE_NAMES[playerState];
2152
+ }
2153
+
2154
+ if (ytPlayerState === 'playing') {
2155
+ ytPlayer.pauseVideo();
2156
+
2157
+ ytPlayerCurrentTime = ytPlayer.getCurrentTime();
2158
+
2159
+ var trackID = songIndex + 1;
2160
+ logger.debug('\n' + `PAUSE video for PlayPauseButton on playlist|trackID: ${playlist}|${trackID} at: ${ytPlayerCurrentTime}`);
2161
+
2162
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2163
+ togglePlayPauseButton(playPauseButtonClass);
2164
+
2165
+ // reset|update time settings
2166
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2167
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2168
+ }
2169
+
2170
+ if (ytPlayerState === 'paused') {
2171
+ ytPlayer.playVideo();
2172
+ ytpSeekTo(ytPlayer, ytPlayerCurrentTime, true);
2173
+
2174
+ var trackID = songIndex + 1;
2175
+ logger.debug('\n' + `PLAY video for PlayPauseButton on playlist|trackID: ${playlist}|${trackID} at: ${ytPlayerCurrentTime}`);
2176
+
2177
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2178
+ togglePlayPauseButton(playPauseButtonClass);
2179
+
2180
+ // reset|update time settings
2181
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2182
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
1125
2183
  }
1126
2184
 
1127
- // don't activate playlist item on FIRST || LAST song
1128
- // if (songIndex !== 0 && songIndex !== songs.length - 1) {
1129
- if (songIndex !== songs.length - 1) {
1130
- // set song active in playlist
1131
- //setSongPlayed(songIndex);
1132
- setSongPlayed(playerID, songIndex);
2185
+ if (ytPlayerState === 'cued') {
2186
+ ytPlayer.playVideo();
2187
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2188
+ togglePlayPauseButton(playPauseButtonClass);
2189
+
2190
+ // set song at songIndex active in playlist
2191
+ setSongActive(playlist, songIndex);
2192
+
2193
+ // scroll song active at index in player
2194
+ if (playerAutoScrollSongElement) {
2195
+ scrollToActiveElement(playlist);
2196
+ }
2197
+
2198
+ // reset|update time settings
2199
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2200
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2201
+ }
2202
+
2203
+ // TODO: unclear why state 'unstarted' is generated
2204
+ // on LAST item
2205
+ // workaround sofar
2206
+ if (ytPlayerState === 'unstarted') {
2207
+ ytPlayer.playVideo();
2208
+ // ytPlayer.mute();
2209
+
2210
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2211
+ togglePlayPauseButton(playPauseButtonClass);
2212
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2213
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
1133
2214
  }
1134
2215
 
1135
- // event.preventDefault();
1136
- event.stopImmediatePropagation(); // deactivate AJS events
2216
+ // deactivate AJS events (if any)
2217
+ event.stopImmediatePropagation();
1137
2218
  }); // END EventListener largePlayerPlayPauseButton 'click'
1138
- } // END if largePlayerPlayPauseButton
2219
+ }
1139
2220
  } // END for largePlayerPlayPauseButton
1140
2221
 
1141
2222
  // Overload AJS largePlayerSkipBackward button for YT
1142
- //
2223
+ // TODO: Fix for multiple players in page
2224
+ // ---------------------------------------------------------------------
1143
2225
  var largePlayerSkipForwardButtons = document.getElementsByClassName("large-player-skip-forward");
1144
2226
  for (var i=0; i<largePlayerSkipForwardButtons.length; i++) {
1145
2227
  var classArray = [].slice.call(largePlayerSkipForwardButtons[i].classList, 0);
@@ -1148,19 +2230,19 @@ var progress;
1148
2230
  // load player settings
1149
2231
  var playerForwardBackwardSkipSeconds = (playerSettings.forward_backward_skip_seconds === undefined) ? playerDefaults.forward_backward_skip_seconds : playerSettings.forward_backward_skip_seconds;
1150
2232
 
1151
- // if (largePlayerSkipForwardButtons[i].id === 'skip-forward_' + ytPlayerID) {
1152
- // if (classString.includes(ytPlayerID)) && largePlayerSkipForwardButtons[i].id === 'skip-forkward_' + ytPlayerID) {
1153
2233
  if (classString.includes(ytPlayerID)) {
1154
2234
  largePlayerSkipForwardButtons[i].addEventListener('click', function(event) {
1155
- var currentTime, playerState, skipOffset, ytPlayer;
2235
+ var currentVideoTime, playerState, skipOffset, ytPlayer;
1156
2236
 
1157
- skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
1158
- ytPlayer = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].player;
1159
- playerState = ytPlayer.getPlayerState();
1160
- currentTime = ytPlayer.getCurrentTime();
2237
+ skipOffset = parseInt(playerForwardBackwardSkipSeconds);
2238
+ ytPlayer = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].player;
2239
+ playerState = ytPlayer.getPlayerState();
2240
+ currentVideoTime = ytPlayer.getCurrentTime();
1161
2241
 
1162
2242
  if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) {
1163
- ytPlayer.seekTo(currentTime + skipOffset, true);
2243
+ logger.debug('\n' + `SKIP forward on Button skipForward for ${skipOffset} seconds`);
2244
+ ytpSeekTo(ytPlayer, currentVideoTime + skipOffset, true);
2245
+
1164
2246
  }
1165
2247
 
1166
2248
  // deactivate AJS events (if any)
@@ -1170,7 +2252,8 @@ var progress;
1170
2252
  } // END for
1171
2253
 
1172
2254
  // Overload AJS largePlayerSkipBackward button for YT
1173
- //
2255
+ // TODO: Fix for multiple players in page
2256
+ // ---------------------------------------------------------------------
1174
2257
  var largePlayerSkipBackwardButtons = document.getElementsByClassName("large-player-skip-backward");
1175
2258
  for (var i=0; i<largePlayerSkipBackwardButtons.length; i++) {
1176
2259
  var classArray = [].slice.call(largePlayerSkipBackwardButtons[i].classList, 0);
@@ -1181,29 +2264,28 @@ var progress;
1181
2264
 
1182
2265
  if (classString.includes(ytPlayerID)) {
1183
2266
  largePlayerSkipBackwardButtons[i].addEventListener('click', function(event) {
1184
- var currentTime, playerState, skipOffset, ytPlayer;
2267
+ var currentVideoTime, playerState, skipOffset, ytPlayer;
1185
2268
 
1186
- skipOffset = parseFloat(playerForwardBackwardSkipSeconds);
1187
- ytPlayer = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].player;
1188
- playerState = ytPlayer.getPlayerState();
1189
- currentTime = ytPlayer.getCurrentTime();
2269
+ skipOffset = parseInt(playerForwardBackwardSkipSeconds);
2270
+ ytPlayer = j1.adapter.amplitude['data']['ytPlayers'][ytPlayerID].player;
2271
+ playerState = ytPlayer.getPlayerState();
2272
+ currentVideoTime = ytPlayer.getCurrentTime();
1190
2273
 
1191
2274
  if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) {
1192
- ytPlayer.seekTo(currentTime - skipOffset, true);
2275
+ logger.debug('\n' + `SKIP backward on Button skipBackward for ${skipOffset} seconds`);
2276
+ ytpSeekTo(ytPlayer, currentVideoTime - skipOffset, true);
1193
2277
  }
1194
2278
 
1195
2279
  // deactivate AJS events (if any)
1196
2280
  event.stopImmediatePropagation();
1197
2281
  }); // END Listener 'click'
1198
2282
  } // END if skip-backward button
1199
- } // END for
2283
+ } // END for
1200
2284
 
2285
+ // Overload AJS largePlayerNext button for YT
1201
2286
  // click on (player) next button
1202
2287
  // TODO: Fix for multiple players in page
1203
- // --------------------------------------------------------------------
1204
-
1205
- // Overload AJS largePlayerNext button for YT
1206
- //
2288
+ // ---------------------------------------------------------------------
1207
2289
  var largePlayerNextButton = document.getElementsByClassName("large-player-next");
1208
2290
  for (var i=0; i<largePlayerNextButton.length; i++) {
1209
2291
  var classArray = [].slice.call(largePlayerNextButton[i].classList, 0);
@@ -1211,426 +2293,563 @@ var progress;
1211
2293
 
1212
2294
  if (classString.includes(ytPlayerID)) {
1213
2295
  largePlayerNextButton[i].addEventListener('click', function(event) {
1214
- var ytpVideoID;
1215
- var playlist = this.getAttribute("data-amplitude-playlist");
1216
- var playerID = playlist + '_large';
1217
- // var songIndex = parseInt(j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex);
1218
- var songIndex = ytpSongIndex;
1219
- var songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
1220
- var ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
1221
-
1222
- // var songs = j1.adapter.amplitude['data']['ytPlayers'][playerID].songs
1223
- // var ytPlayer = j1.adapter.amplitude['data']['ytPlayers'][playerID].player;
1224
-
1225
- // if (songIndex < songs.length) {
1226
- if (songIndex < songs.length-1) {
1227
- // set song on next item
1228
- songIndex++;
1229
- ytpSongIndex = songIndex;
1230
-
1231
- // j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2296
+ var playlist, playerID, songIndex, trackID,
2297
+ songs, songMetaData, songName, songURL,
2298
+ ytPlayer, ytpVideoID;
2299
+
2300
+ songIndex = ytpSongIndex;
2301
+ playlist = this.getAttribute("data-amplitude-playlist");
2302
+ playerID = playlist + '_large';
2303
+ songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
2304
+ ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
2305
+
2306
+ if (ytPlayer === undefined) {
2307
+ logger.error('\n' + 'YT player not defined');
1232
2308
  }
1233
- // else {
1234
- // songIndex--;
1235
- // }
1236
2309
 
1237
- // collect (next) song data
1238
- // if (songIndex < songs.length) {
2310
+ // stop active AT|YT players except the current
2311
+ // stopAllActivePlayers(playerID);
2312
+
2313
+ // select video
1239
2314
  if (songIndex < songs.length-1) {
1240
- songMetaData = songs[songIndex];
1241
- songURL = songMetaData.url;
1242
- ytpVideoID = songURL.split('=')[1];
2315
+ // select NEXT video
2316
+ songIndex++;
2317
+ ytpSongIndex = songIndex;
1243
2318
  } else {
1244
- songIndex = 0;
1245
- // j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
1246
- songMetaData = songs[songIndex];
1247
- songURL = songMetaData.url;
1248
- ytpVideoID = songURL.split('=')[1];
2319
+ // select FIRST video
2320
+ songIndex = 0;
2321
+ ytpSongIndex = songIndex;
1249
2322
  }
1250
2323
 
1251
- // pause song (video) if FIRST item reached
1252
- // TODO: handle on player|shuffle different (do play)
1253
- if (songMetaData.index === 0) {
1254
-
1255
- // continue (paused) on FIRST video
1256
- if (ytPlayer !== undefined) {
1257
- ytPlayer.loadVideoById(ytpVideoID);
1258
-
1259
- // wait some time to make sure video is loaded|active
1260
- setTimeout(() => {
1261
- ytPlayer.pauseVideo();
1262
- // reset|update time settings
1263
- resetCurrentTimeContainerYTP();
1264
- updateDurationTimeContainerYTP(ytPlayer);
1265
- // resetProgressBarYTP(playerID);
1266
-
1267
- // update AJS play_pause button
1268
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
1269
- largePlayerPlayPauseButton.classList.remove('amplitude-playing');
1270
- largePlayerPlayPauseButton.classList.add('amplitude-paused');
1271
- }, 300);
1272
- }
2324
+ // set song (video)^meta data
2325
+ songMetaData = songs[songIndex];
2326
+ songURL = songMetaData.url;
2327
+ ytpVideoID = songURL.split('=')[1];
2328
+
2329
+ // load next video
2330
+ // ---------------------------------------------------------------
2331
+
2332
+ // save YT player GLOBAL data for later use (e.g. events)
2333
+ j1.adapter.amplitude.data.activePlayer = 'ytp';
2334
+ j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
2335
+ j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
2336
+
2337
+ // save YT player data for later use (e.g. events)
2338
+ j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2339
+ j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
2340
+
2341
+ trackID = songIndex + 1;
2342
+ logger.debug('\n' + `SWITCH video for PlayerNextButton at trackID|VideoID: ${trackID}|${ytpVideoID}`);
2343
+ ytPlayer.loadVideoById(ytpVideoID);
2344
+
2345
+ // delay after switch video
2346
+ if (muteAfterVideoSwitchInterval) {
2347
+ ytPlayer.mute();
2348
+ setTimeout(() => {
2349
+ ytPlayer.unMute();
2350
+ }, muteAfterVideoSwitchInterval);
2351
+ }
2352
+
2353
+ if (songIndex === 0) {
2354
+
2355
+ // continue paused on FIRST video
2356
+ // TODO: handle on player|shuffle different (do play)
2357
+ ytPlayer.pauseVideo();
2358
+
2359
+ // reset|update time settings
2360
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2361
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2362
+ resetProgressBarYTP();
2363
+
2364
+ // set AJS play_pause button paused
2365
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2366
+ // setPlayPauseButtonPlaying(playPauseButtonClass);
2367
+ togglePlayPauseButton(playPauseButtonClass);
1273
2368
  } else {
1274
- // load NEXT video if available
1275
- if (ytPlayer !== undefined) {
1276
- ytPlayer.loadVideoById(ytpVideoID);
1277
-
1278
- // update AJS play_pause button (set playing)
1279
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
1280
- largePlayerPlayPauseButton.classList.remove('amplitude-paused');
1281
- largePlayerPlayPauseButton.classList.add('amplitude-playing');
1282
- } else {
1283
- // update AJS play_pause button (set paused)
1284
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
1285
- largePlayerPlayPauseButton.classList.remove('amplitude-playing');
1286
- largePlayerPlayPauseButton.classList.add('amplitude-paused');
1287
- }
2369
+ // toggle AJS play_pause button
2370
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2371
+ togglePlayPauseButton(playPauseButtonClass);
1288
2372
  }
1289
2373
 
1290
2374
  // reset|update current time settings
1291
- resetCurrentTimeContainerYTP();
1292
- updateDurationTimeContainerYTP(ytPlayer);
1293
-
1294
- // load cover image for next video
1295
- var coverImage;
1296
- var selector = ".cover-image-" + playlist;
1297
- coverImage = document.querySelector(selector);
1298
- coverImage.src = songMetaData.cover_art_url;
1299
-
1300
- // replace new song name (meta-container)
1301
- var songName = document.getElementsByClassName("song-name");
1302
- songName[0].innerHTML = songMetaData.name; // player-bottom
1303
- songName[1].innerHTML = songMetaData.name; // playlist-screen
1304
-
1305
- // replace song rating (playlist-screen|meta-container)
1306
- var largetPlayerSongAudioRating = document.getElementsByClassName("audio-rating");
1307
- if (largetPlayerSongAudioRating.length) {
1308
- if (songMetaData.rating) {
1309
- largetPlayerSongAudioRating[0].innerHTML = songMetaData.rating + ' <i class="mdib mdib-star md-gray-400 mdib-18px"></i>';
1310
- } else {
1311
- largetPlayerSongAudioRating[0].innerHTML = '';
1312
- }
1313
- } // END if largetPlayerSongAudioRating
1314
-
1315
- // replace artist name in meta-containers for next video
1316
- var artistName = document.getElementsByClassName("artist");
1317
- artistName[0].innerHTML = songMetaData.artist;
1318
-
1319
- // replace album name in meta-containers for next video
1320
- var albumName = document.getElementsByClassName("album");
1321
- albumName[0].innerHTML = songMetaData.album;
1322
-
1323
- // update AJS play_pause button
1324
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
1325
- largePlayerPlayPauseButton.classList.remove('amplitude-paused');
1326
- largePlayerPlayPauseButton.classList.add('amplitude-playing');
1327
-
1328
- // if (songIndex < songs.length) {
1329
- if (songIndex < songs.length-1) {
1330
- // set song active in playlist
1331
- // setSongPlayed(songIndex);
1332
- setSongPlayed(playerID, songIndex);
1333
- // j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2375
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2376
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2377
+ resetProgressBarYTP();
2378
+
2379
+ // load the song cover image
2380
+ loadCoverImage(songMetaData);
2381
+
2382
+ // update meta data
2383
+ updatMetaContainers(songMetaData);
2384
+
2385
+ // set song at songIndex active in playlist
2386
+ setSongActive(playlist, songIndex);
2387
+
2388
+ // scroll song active at index in player
2389
+ if (playerAutoScrollSongElement) {
2390
+ scrollToActiveElement(playlist);
1334
2391
  }
1335
2392
 
1336
2393
  // deactivate AJS events (if any)
1337
2394
  event.stopImmediatePropagation();
1338
- }); // END EventListener 'click' next button
1339
- } // END if
2395
+
2396
+ }); // END EventListener 'click' next button
2397
+ } // END if
2398
+
1340
2399
  } // END for largePlayerNextButton
1341
2400
 
2401
+ // Overload AJS largePlayerPrevious button for YT
1342
2402
  // click on (player) previous button
1343
2403
  // TODO: Fix for multiple players in page
1344
2404
  // -----------------------------------------------------------------------
1345
-
1346
- // Overload AJS largePlayerPrevious button for YT
1347
- //
1348
2405
  var largePlayePreviousButton = document.getElementsByClassName("large-player-previous");
1349
2406
  for (var i=0; i<largePlayePreviousButton.length; i++) {
1350
- var classArray = [].slice.call(largePlayerNextButton[i].classList, 0);
2407
+ var classArray = [].slice.call(largePlayePreviousButton[i].classList, 0);
1351
2408
  var classString = classArray.toString();
1352
2409
 
1353
2410
  if (classString.includes(ytPlayerID)) {
1354
2411
  largePlayePreviousButton[i].addEventListener('click', function(event) {
1355
- var ytpVideoID;
1356
- var playlist = this.getAttribute("data-amplitude-playlist");
1357
- var playerID = playlist + '_large';
1358
- // var songIndex = parseInt(j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex);
1359
- var songIndex = ytpSongIndex;
1360
- var songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
1361
- var ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
1362
-
1363
- if (songIndex < songs.length-1) {
1364
- // set song on previous item
1365
- songIndex--;
1366
- ytpSongIndex = songIndex;
1367
- // j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2412
+ var playlist, playerID, songIndex, trackID,
2413
+ songs, songMetaData, songName, songURL,
2414
+ ytPlayer, ytpVideoID;
2415
+
2416
+ songIndex = ytpSongIndex;
2417
+ playlist = this.getAttribute("data-amplitude-playlist");
2418
+ playerID = playlist + '_large';
2419
+ songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
2420
+ ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
2421
+
2422
+ if (ytPlayer === undefined) {
2423
+ logger.error('\n' + 'YT player not defined');
1368
2424
  }
1369
2425
 
1370
- // collect (next) song data
1371
- if (songIndex > 0 && songIndex < songs.length) {
1372
- songMetaData = songs[songIndex];
1373
- songIndex = songMetaData.index;
1374
- songURL = songMetaData.url;
1375
- ytpSongIndex = songMetaData.index;
1376
- ytpVideoID = songURL.split('=')[1];
2426
+ // stop active AT|YT players except the current
2427
+ // stopAllActivePlayers(playerID);
2428
+
2429
+ // select video
2430
+ if (songIndex > 0 && songIndex <= songs.length - 1) {
2431
+ // select NEXT video
2432
+ songIndex--;
2433
+ ytpSongIndex = songIndex;
1377
2434
  } else {
1378
- songIndex = 0;
1379
- ytpSongIndex = 0;
1380
- // j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
1381
- songMetaData = songs[songIndex];
1382
- songURL = songMetaData.url;
1383
- ytpSongIndex = songIndex;
1384
- ytpVideoID = songURL.split('=')[1];
2435
+ // select FIRST video
2436
+ songIndex = 0;
2437
+ ytpSongIndex = songIndex;
1385
2438
  }
1386
2439
 
2440
+ // set song (video)^meta data
2441
+ songMetaData = songs[songIndex];
2442
+ songURL = songMetaData.url;
2443
+ ytpVideoID = songURL.split('=')[1];
2444
+
2445
+ // save YT player GLOBAL data for later use (e.g. events)
2446
+ j1.adapter.amplitude.data.activePlayer = 'ytp';
2447
+ j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
2448
+ j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
2449
+
2450
+ // load next video
2451
+ // -----------------------------------------------------------------
2452
+
1387
2453
  // save YT player data for later use (e.g. events)
1388
- // j1.adapter.amplitude.data.ytpGlobals['ytpSongIndex'] = ytpSongIndex;
2454
+ j1.adapter.amplitude.data.activePlayer = 'ytp';
2455
+ j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2456
+ j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
1389
2457
 
1390
- // pause song (video) if FIRST item reached
1391
- // TODO: handle on player|shuffle different (do play)
1392
- if (songMetaData.index === 0) {
1393
- ytpSongIndex = 0;
2458
+ trackID = songIndex + 1;
2459
+ logger.debug('\n' + `SWITCH video for PlayePreviousButton at trackID|VideoID: ${trackID}|${ytpVideoID}`);
2460
+ ytPlayer.loadVideoById(ytpVideoID);
1394
2461
 
1395
- // continue (paused) on FIRST video
1396
- if (ytPlayer !== undefined) {
1397
- ytPlayer.loadVideoById(ytpVideoID);
2462
+ // delay after switch video
2463
+ if (muteAfterVideoSwitchInterval) {
2464
+ ytPlayer.mute();
2465
+ setTimeout(() => {
2466
+ ytPlayer.unMute();
2467
+ }, muteAfterVideoSwitchInterval);
2468
+ }
1398
2469
 
1399
- // wait some time to make sure video is loaded|active
1400
- setTimeout(() => {
1401
- ytPlayer.pauseVideo();
1402
- // reset|update time settings
1403
- resetCurrentTimeContainerYTP();
1404
- updateDurationTimeContainerYTP(ytPlayer);
1405
- resetProgressBarYTP(playerID);
1406
-
1407
- // update AJS play_pause button
1408
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
1409
- largePlayerPlayPauseButton.classList.remove('amplitude-playing');
1410
- largePlayerPlayPauseButton.classList.add('amplitude-paused');
1411
- }, 300);
1412
- }
2470
+ if (songIndex === 0) {
2471
+
2472
+ // continue paused on FIRST video
2473
+ // TODO: handle on player|shuffle different (do play)
2474
+ ytPlayer.pauseVideo();
2475
+
2476
+ // reset|update time settings
2477
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2478
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2479
+ resetProgressBarYTP();
2480
+
2481
+ // set AJS play_pause button paused
2482
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2483
+ // setPlayPauseButtonPlaying(playPauseButtonClass);
2484
+ togglePlayPauseButton(playPauseButtonClass);
1413
2485
  } else {
1414
- // load NEXT video if available
1415
- if (ytPlayer !== undefined) {
1416
- ytPlayer.loadVideoById(ytpVideoID);
1417
-
1418
- // update AJS play_pause button (set playing)
1419
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
1420
- largePlayerPlayPauseButton.classList.remove('amplitude-paused');
1421
- largePlayerPlayPauseButton.classList.add('amplitude-playing');
1422
- } else {
1423
- // update AJS play_pause button (set paused)
1424
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
1425
- largePlayerPlayPauseButton.classList.remove('amplitude-playing');
1426
- largePlayerPlayPauseButton.classList.add('amplitude-paused');
1427
- }
2486
+ // toggle AJS play_pause button
2487
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2488
+ togglePlayPauseButton(playPauseButtonClass);
1428
2489
  }
1429
2490
 
1430
2491
  // reset|update current time settings
1431
- resetCurrentTimeContainerYTP();
1432
- updateDurationTimeContainerYTP(ytPlayer);
1433
-
1434
- // replace new song name (meta-container)
1435
- var songName = document.getElementsByClassName("song-name");
1436
- songName[0].innerHTML = songMetaData.name; // player-bottom
1437
- songName[1].innerHTML = songMetaData.name; // playlist-screen
1438
-
1439
- // load cover image for next video
1440
- var coverImage;
1441
- var selector = ".cover-image-" + playlist;
1442
- coverImage = document.querySelector(selector);
1443
- coverImage.src = songMetaData.cover_art_url;
1444
-
1445
- // replace song rating (playlist-screen|meta-container)
1446
- var largetPlayerSongAudioRating = document.getElementsByClassName("audio-rating");
1447
- if (largetPlayerSongAudioRating.length) {
1448
- if (songMetaData.rating) {
1449
- largetPlayerSongAudioRating[0].innerHTML = songMetaData.rating + ' <i class="mdib mdib-star md-gray-400 mdib-18px"></i>';
1450
- } else {
1451
- largetPlayerSongAudioRating[0].innerHTML = '';
1452
- }
1453
- } // END if largetPlayerSongAudioRating
2492
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2493
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2494
+ resetProgressBarYTP();
1454
2495
 
1455
- // replace artist name in meta-containers for next video
1456
- var artistName = document.getElementsByClassName("artist");
1457
- artistName[0].innerHTML = songMetaData.artist;
1458
-
1459
- // replace album name in meta-containers for next video
1460
- var albumName = document.getElementsByClassName("album");
1461
- albumName[0].innerHTML = songMetaData.album;
1462
-
1463
- // update AJS play_pause button
1464
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
1465
- largePlayerPlayPauseButton.classList.remove('amplitude-paused');
1466
- largePlayerPlayPauseButton.classList.add('amplitude-playing');
1467
-
1468
- // on LAST item, don't activate item in playlist
1469
- if (songIndex !== songs.length - 1) {
1470
- // set song active in playlist
1471
- // setSongPlayed(songIndex);
1472
- setSongPlayed(playerID, songIndex);
1473
- }
2496
+ // load the song cover image
2497
+ loadCoverImage(songMetaData);
2498
+
2499
+ // update meta data
2500
+ updatMetaContainers(songMetaData);
1474
2501
 
1475
- // set song active in playlist
1476
- // setSongPlayed(songIndex);
1477
- // setSongPlayed(playerID, songIndex);
2502
+ // set song at songIndex active in playlist
2503
+ setSongActive(playlist, songIndex);
2504
+
2505
+ // scroll song active at index in player
2506
+ if (playerAutoScrollSongElement) {
2507
+ scrollToActiveElement(playlist);
2508
+ }
1478
2509
 
1479
2510
  // deactivate AJS events (if any)
1480
- event.stopImmediatePropagation();
1481
- }); // END EventListener 'click' previous button
2511
+ event.stopImmediatePropagation();
2512
+
2513
+ }); // END EventListener 'click' next button
1482
2514
  } // END if
1483
- } // END for
1484
2515
 
1485
- // click on song container
1486
- // TODO: Fix for multiple players in page
1487
- // ---------------------------------------------------------------------
1488
- var largetPlayerSongContainer = document.getElementsByClassName("amplitude-song-container");
1489
- for (var i=0; i<largetPlayerSongContainer.length; i++) {
1490
- var classArray = [].slice.call(largetPlayerSongContainer[i].classList, 0);
1491
- var classString = classArray.toString();
1492
-
1493
- if (classString.includes(ytPlayerID)) {
1494
- largetPlayerSongContainer[i].addEventListener('click', function(event) {
1495
- var ytpVideoID;
1496
- var activeSongIndex;
1497
- var success;
2516
+ } // END for largePlayerNextButton
1498
2517
 
1499
- var playlist = this.getAttribute("data-amplitude-playlist");
1500
- var playerID = playlist + '_large';
1501
- // var ytpSongIndex = parseInt(this.getAttribute("data-amplitude-song-index"));
1502
- var songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
2518
+ // click on song container
2519
+ // TODO: Fix for multiple players in page
2520
+ // -------------------------------------------------------------------------
2521
+ var largePlayerSongContainer = document.getElementsByClassName("amplitude-song-container");
2522
+ for (var i=0; i<largePlayerSongContainer.length; i++) {
2523
+ var classArray = [].slice.call(largePlayerSongContainer[i].classList, 0);
2524
+ var classString = classArray.toString();
2525
+
2526
+ if (classString.includes(ytPlayerID)) {
2527
+ largePlayerSongContainer[i].addEventListener('click', function(event) {
2528
+ var activeSongSettings, playlist, playerID, playerState,
2529
+ songs, songIndex, songName, singleAudio, trackID,
2530
+ ytPlayer, ytpVideoID;
2531
+
2532
+ // set (current) playlist|song data
2533
+ playlist = this.getAttribute("data-amplitude-playlist");
2534
+ playerID = playlist + '_large';
2535
+ songIndex = parseInt(this.getAttribute("data-amplitude-song-index"));
2536
+ trackID = songIndex + 1;
2537
+
2538
+ // update active song settings (manually)
2539
+ checkActiveVideoElementYTP();
2540
+
2541
+ // get active song settings (manually)
2542
+ activeSongSettings = getActiveSong();
2543
+
2544
+ if (activeSongSettings) {
2545
+ // ytpCurrentTime = activeSongSettings.currentTime;
2546
+ if (activeSongSettings.playlist !== playlist) {
2547
+ // set current player settings
2548
+ songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
2549
+ ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
2550
+
2551
+ // reset previous player settings
2552
+ if (activeSongSettings.player !== undefined) {
2553
+ activeSongSettings.player.stopVideo();
2554
+ var playPauseButtonClass = `large-player-play-pause-${activeSongSettings.playerID}`;
2555
+ togglePlayPauseButton(playPauseButtonClass);
2556
+ }
2557
+ } else {
2558
+ // set current player settings
2559
+ songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
2560
+ ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
2561
+ }
2562
+ } else {
2563
+ // set current player settings
2564
+ songs = j1.adapter.amplitude.data.ytPlayers[playerID].songs;
2565
+ ytPlayer = j1.adapter.amplitude.data.ytPlayers[playerID].player;
2566
+ }
1503
2567
 
1504
- // update global song index
1505
- ytpSongIndex = parseInt(this.getAttribute("data-amplitude-song-index"));
2568
+ // set (current) song meta data
2569
+ songMetaData = songs[songIndex];
2570
+ songURL = songMetaData.url;
2571
+ ytpVideoID = songURL.split('=')[1];
2572
+ playerState = ytPlayer.getPlayerState();
1506
2573
 
1507
- // get active song index if video (song) is playing
1508
- activeSongIndex = getSongPlayed();
2574
+ // TOGGLE state 'playing'|'paused' if video (audio) NOT changed
2575
+ var isItemChanged = (j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex !== songIndex) ? true : false;
2576
+ if (!isItemChanged && (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED)) {
1509
2577
 
1510
- // if (activeSongIndex >= 0) {
1511
- // success = ytpSetActiveIndex(playerID, activeSongIndex);
1512
- // } else {
1513
- // success = ytpSetActiveIndex(playerID, ytpSongIndex);
1514
- // }
2578
+ if (playerState === YT_PLAYER_STATE.PLAYING) {
2579
+ ytPlayer.pauseVideo();
2580
+ ytPlayerCurrentTime = ytPlayer.getCurrentTime();
1515
2581
 
1516
- // save YT player data for later use (e.g. events)
1517
- // j1.adapter.amplitude.data.ytpGlobals['ytPlayerSongs'] = songs;
1518
- // j1.adapter.amplitude.data.ytpGlobals['ytpSongIndex'] = ytpSongIndex;
2582
+ var trackID = songIndex + 1;
2583
+ logger.debug('\n' + `PAUSE video for PlayerSongContainer on playlist|trackID: ${playlist}|${trackID} at: ${ytPlayerCurrentTime}`);
1519
2584
 
1520
- var playerState = ytPlayer.getPlayerState();
1521
- if (playerState === YT_PLAYER_STATE.PLAYING && ytpSongIndex === activeSongIndex) {
1522
- // do NOT interupt current video (song) is playing
1523
- return;
1524
- } else {
1525
- // set (current) song data
1526
- songMetaData = songs[ytpSongIndex];
1527
- songIndex = songMetaData.index;
1528
- songURL = songMetaData.url;
1529
- ytpSongIndex = songIndex;
1530
- ytpVideoID = songURL.split('=')[1];
1531
- // load new video
1532
- ytPlayer.loadVideoById(ytpVideoID);
2585
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2586
+ togglePlayPauseButton(playPauseButtonClass);
2587
+
2588
+ // reset|update time settings
2589
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2590
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2591
+ return;
1533
2592
  }
1534
2593
 
1535
- // reset|update current time settings
1536
- resetCurrentTimeContainerYTP();
1537
- updateDurationTimeContainerYTP(ytPlayer);
1538
-
1539
- // load cover image for next video
1540
- var coverImage;
1541
- var selector = ".cover-image-" + playlist;
1542
- coverImage = document.querySelector(selector);
1543
- coverImage.src = songMetaData.cover_art_url;
1544
-
1545
- // replace new song name (meta-container)
1546
- var songName = document.getElementsByClassName("song-name");
1547
- songName[0].innerHTML = songMetaData.name; // player-bottom
1548
- songName[1].innerHTML = songMetaData.name; // playlist-screen
1549
-
1550
- // replace song info URL (playlist-screen|meta-container)
1551
- var largetPlayerSongInfoLink = document.getElementsByClassName("audio-info-link");
1552
- if (largetPlayerSongInfoLink.length) {
1553
- if (songMetaData.audio_info) {
1554
- largetPlayerSongInfoLink[0].href = songMetaData.audio_info;
1555
- } else {
1556
- largetPlayerSongInfoLink[0].href = songURL;
2594
+ if (playerState === YT_PLAYER_STATE.PAUSED) {
2595
+ ytPlayer.playVideo();
2596
+ ytpSeekTo(ytPlayer, ytPlayerCurrentTime, true);
2597
+
2598
+ var trackID = songIndex + 1;
2599
+ logger.debug('\n' + `PLAY video for PlayerSongContainer on playlist|trackID: ${playlist}|${trackID} at: ${ytPlayerCurrentTime}`);
2600
+
2601
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2602
+ togglePlayPauseButton(playPauseButtonClass);
2603
+
2604
+ // reset|update time settings
2605
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2606
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2607
+ return;
2608
+ }
2609
+
2610
+ } // END !changedAudio
2611
+
2612
+ // update global song index (start at 0)
2613
+ ytpSongIndex = songIndex;
2614
+
2615
+ // stop active AT|YT players
2616
+ // stopAllActivePlayers(playerID);
2617
+
2618
+ // save YT player GLOBAL data for later use (e.g. events)
2619
+ j1.adapter.amplitude.data.activePlayer = 'ytp';
2620
+ j1.adapter.amplitude.data.ytpGlobals['activeIndex'] = songIndex;
2621
+ j1.adapter.amplitude.data.ytpGlobals['activePlaylist'] = playlist;
2622
+
2623
+ // save YT player data for later use (e.g. events)
2624
+ j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2625
+ j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
2626
+
2627
+ // reset|update current time settings
2628
+ resetCurrentTimeContainerYTP(ytPlayer, playlist);
2629
+ updateDurationTimeContainerYTP(ytPlayer, playlist);
2630
+ resetProgressBarYTP();
2631
+
2632
+ // load the song cover image
2633
+ loadCoverImage(songMetaData);
2634
+
2635
+ // update meta data
2636
+ updatMetaContainers(songMetaData);
2637
+
2638
+ // set AJS play_pause button playing
2639
+ var playPauseButtonClass = `large-player-play-pause-${ytPlayerID}`;
2640
+ setPlayPauseButtonPlaying(playPauseButtonClass)
2641
+
2642
+ // set song at songIndex active in playlist
2643
+ setSongActive(playlist, songIndex);
2644
+
2645
+ // scroll song active at index in player
2646
+ if (playerAutoScrollSongElement) {
2647
+ scrollToActiveElement(playlist);
2648
+ }
2649
+
2650
+ // save YT player data for later use (e.g. events)
2651
+ j1.adapter.amplitude.data.ytPlayers[playerID].activeIndex = songIndex;
2652
+ j1.adapter.amplitude.data.ytPlayers[playerID].videoID = ytpVideoID;
2653
+
2654
+ // load next video
2655
+ // -------------------------------------------------------------------
2656
+ trackID = songIndex + 1;
2657
+ logger.debug('\n' + `SWITCH video for PlayerSongContainer at trackID|VideoID: ${trackID}|${ytpVideoID}`);
2658
+ ytPlayer.loadVideoById(ytpVideoID);
2659
+
2660
+ // mute sound after next video load
2661
+ // -------------------------------------------------------------------
2662
+ if (muteAfterVideoSwitchInterval) {
2663
+ ytPlayer.mute();
2664
+ setTimeout(() => {
2665
+ ytPlayer.unMute();
2666
+ }, muteAfterVideoSwitchInterval);
2667
+ }
2668
+
2669
+ // deactivate AJS events (if any)
2670
+ event.stopImmediatePropagation();
2671
+ }); // END EventListener 'click' SongContainer
2672
+ } // END ifSWITCH video
2673
+ } // END for
2674
+
2675
+ // add listeners to all progress bars found
2676
+ // TODO: Fix for multiple players in page
2677
+ // -------------------------------------------------------------------------
2678
+ var progressBars = document.getElementsByClassName("large-player-progress");
2679
+ if (progressBars.length) {
2680
+ for (var i=0; i<progressBars.length; i++) {
2681
+ var classArray = [].slice.call(progressBars[i].classList, 0);
2682
+ var classString = classArray.toString();
2683
+ var progressId = progressBars[i].id;
2684
+ var playerID = progressId.split('large_player_progress_')[1];
2685
+ var progressClass = ('large-player-progress-' + playerID).replace('_large','');
2686
+
2687
+ if (progressBars[i].dataset.amplitudeSource === 'audio') {
2688
+ // do nothing (managed by adapter)
2689
+ } else {
2690
+ var progressBar = progressBars[i];
2691
+ if (classString.includes(progressClass)) {
2692
+ // save YT player data for later use (e.g. events)
2693
+ j1.adapter.amplitude.data.ytPlayers[playerID].progressBar = progressBar;
2694
+
2695
+ progressBars[i].addEventListener('click', function(event) {
2696
+ var activeSongSettings, playlist, ytPlayer,
2697
+ playerState, progressBar, percentage, time;
2698
+
2699
+ // update active song settings (manually)
2700
+ checkActiveVideoElementYTP();
2701
+
2702
+ // get active song settings (manually)
2703
+ activeSongSettings = getActiveSong();
2704
+
2705
+ if (!activeSongSettings) {
2706
+ // do nothing if current video (audio) item is NOT selected|active
2707
+ return;
1557
2708
  }
1558
- } // END if largetPlayerSongInfoLink
1559
2709
 
1560
- // replace song rating (playlist-screen|meta-container)
1561
- var largetPlayerSongAudioRating = document.getElementsByClassName("audio-rating");
1562
- if (largetPlayerSongAudioRating.length) {
1563
- if (songMetaData.rating) {
1564
- largetPlayerSongAudioRating[0].innerHTML = songMetaData.rating + ' <i class="mdib mdib-star md-gray-400 mdib-18px"></i>';
1565
- } else {
1566
- largetPlayerSongAudioRating[0].innerHTML = '';
2710
+ playlist = this.getAttribute("data-amplitude-playlist");
2711
+ if (activeSongSettings.playlist !== playlist) {
2712
+ // do nothing on PREVIOUS playlist (player)
2713
+ return;
1567
2714
  }
1568
- } // END if largetPlayerSongAudioRating
1569
2715
 
1570
- // update AJS play_pause button
1571
- var largePlayerPlayPauseButton = document.getElementById('large_player_play_pause');
1572
- largePlayerPlayPauseButton.classList.remove('amplitude-paused');
1573
- largePlayerPlayPauseButton.classList.add('amplitude-playing');
2716
+ ytPlayer = activeSongSettings.player;
2717
+ playerState = ytPlayer.getPlayerState();
1574
2718
 
1575
- // set song active in playlist
1576
- // if (event.currentTarget.className.includes(ytPlayerID)) {
1577
- // setSongPlayed(songIndex);
1578
- // }
2719
+ //if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.BUFFERING) {
2720
+ if (playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED || playerState === YT_PLAYER_STATE.BUFFERING) {
2721
+ progressBar = this;
2722
+ percentage = getProgressBarSelectedPositionPercentage(event, progressBar);
2723
+ time = getTimeFromPercentage(ytPlayer, percentage);
1579
2724
 
1580
- // set song active in playlist
1581
- setSongPlayed(ytPlayerID, songIndex);
2725
+ // seek video to current time
2726
+ // var buffered = ytpSeekTo(ytPlayer, time, true);
2727
+ ytpSeekTo(ytPlayer, time, true);
2728
+
2729
+ // set current progess value if valid
2730
+ if (isFinite(percentage)) {
2731
+ progressBar.value = percentage;
2732
+ }
2733
+ } // END if ytPlayer
1582
2734
 
1583
- // do NOT bubble up
1584
- event.stopPropagation();
2735
+ // deactivate AJS events (if any)
2736
+ event.stopImmediatePropagation();
2737
+ }); // END EventListener 'click'
2738
+ } // END if classString includes
2739
+ } // END if amplitudeSource
2740
+ } // END for progressBars
2741
+ } // END if progressBars
2742
+
2743
+ // add listeners to all volume sliders found
2744
+ // TODO: Fix for multiple players in page
2745
+ // -------------------------------------------------------------------------
2746
+ var volumeSliders = document.getElementsByClassName("amplitude-volume-slider");
2747
+ for (var i=0; i<volumeSliders.length; i++) {
2748
+ if (volumeSliders[i].dataset.amplitudeSource === 'audio') {
2749
+ // do nothing (managed by adapter)
2750
+ var bla = 1;
2751
+ } else {
2752
+ if (volumeSliders[i]) {
2753
+ // for (var i=0; i<volumeSliders.length; i++) {
2754
+ var volumeSlider = volumeSliders[i];
2755
+ var sliderID = volumeSliders[i].id;
2756
+ var playerID = sliderID.split('volume_slider_')[1];
1585
2757
 
1586
- // deactivate AJS events (if any)
1587
- event.stopImmediatePropagation();
1588
- }); // END EventListener 'click' SongContainer
1589
- } // END if
1590
- } // END for
2758
+ // save YT player data for later use (e.g. events)
2759
+ // j1.adapter.amplitude.data.ytPlayers[playerID].volumeSlider = volumeSlider;
1591
2760
 
1592
- // add listeners to all progress bars found
1593
- // TODO: Fix for multiple players in page
1594
- // ---------------------------------------------------------------------
1595
- var progressBars = document.getElementsByClassName("large-player-progress");
1596
- if (progressBars.length) {
1597
- for (var i=0; i<progressBars.length; i++) {
1598
- var progressBar = progressBars[i];
1599
- // var id = bar.id.split('large-player-progress_')[0];
1600
- // var progressId = progressBars[i].id.split('large-player-progress_')[0];
1601
- var progressId = progressBars[i].id;
1602
- var playerId = progressId.split('large_player_progress_')[1];
2761
+ volumeSliders[i].addEventListener('click', function(event) {
2762
+
2763
+ // update active song settings (manually)
2764
+ checkActiveVideoElementYTP();
2765
+
2766
+ // get active song settings (manually)
2767
+ var activeSongSettings = getActiveSong();
2768
+
2769
+ if (!activeSongSettings) {
2770
+ // do nothing if current video (audio) item is NOT selected|active
2771
+ return;
2772
+ }
2773
+
2774
+ var ytPlayer = activeSongSettings.player;
2775
+ var playerState = ytPlayer.getPlayerState();
2776
+
2777
+ if ((playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) && ytPlayer !== undefined) {
2778
+ var volumeSlider, volumeValue;
2779
+ var currenVolume = ytPlayer.getVolume();
2780
+
2781
+ volumeSlider = this;
2782
+ volumeValue = 50; // default
2783
+
2784
+ if (volumeSlider !== null) {
2785
+ volumeValue = parseInt(volumeSlider.value);
2786
+ }
2787
+
2788
+ ytPlayer.setVolume(volumeValue);
2789
+ } // END if ytPlayer
2790
+
2791
+ }); // END EventListener 'click'
2792
+ // } // END for
2793
+ } // END if volumeSliders
2794
+ } // END if volumeSliders
2795
+ } // END for volumeSliders
2796
+
2797
+ // add listeners to all mute buttons found
2798
+ // TODO: Fix for multiple buttons in page
2799
+ // -------------------------------------------------------------------------
2800
+ var volumeMutes = document.getElementsByClassName("amplitude-mute");
2801
+ for (var i=0; i<volumeMutes.length; i++) {
2802
+ if (volumeMutes[i].dataset.amplitudeSource === 'audio') {
2803
+ // do nothing (managed by adapter)
2804
+ var bla = 1;
2805
+ } else {
2806
+ if (volumeMutes[i]) {
2807
+ var volumMute = volumeMutes[i];
2808
+ var sliderID = volumeMutes[i].id;
2809
+ var playerID = sliderID.split('amplitude-mute_')[1];
1603
2810
 
1604
2811
  // save YT player data for later use (e.g. events)
1605
- // j1.adapter.amplitude.data.ytpGlobals['ytPlayerProgressBar'] = progressBars[i];
1606
- // j1.adapter.amplitude.data.ytPlayers[playerId].progressBar = progressId;
1607
- j1.adapter.amplitude.data.ytPlayers[playerId].progressBar = progressBar;
1608
-
1609
- progressBars[i].addEventListener('click', function(event) {
1610
- // if (ytPlayer.getPlayerState() === YT_PLAYER_STATE.PLAYING) {
1611
- if (ytPlayer !== undefined) {
1612
- var progressBar, percentage, time;
1613
- progressBar = this;
1614
- percentage = getProgressBarSelectedPositionPercentage(event, progressBar);
1615
- time = getTimeFromPercentage(ytPlayer, percentage);
1616
-
1617
- // seek video to current time
1618
- ytpSeekTo(ytPlayer, time);
1619
-
1620
- // set current progess value if valid
1621
- if (isFinite(percentage)) {
1622
- progressBar.value = percentage;
2812
+ // j1.adapter.amplitude.data.ytPlayers[playerID].volumMute = volumMute;
2813
+
2814
+ volumeMutes[i].addEventListener('click', function(event) {
2815
+
2816
+ // update active song settings (manually)
2817
+ checkActiveVideoElementYTP();
2818
+
2819
+ // get active song settings (manually)
2820
+ var activeSongSettings = getActiveSong();
2821
+
2822
+ if (!activeSongSettings) {
2823
+ // do nothing if current video (audio) item is NOT selected|active
2824
+ return;
2825
+ }
2826
+
2827
+ var ytPlayer = activeSongSettings.player;
2828
+ var playerState = ytPlayer.getPlayerState();
2829
+ var volumeSlider = j1.adapter.amplitude.data.ytPlayers[playerID].volumeSlider;
2830
+ var currenVolume = ytPlayer.getVolume();
2831
+ var playerVolumePreset = parseInt(j1.adapter.amplitude.data.ytPlayers[playerID].playerSettings.volume_slider.preset_value);
2832
+
2833
+ if ((playerState === YT_PLAYER_STATE.PLAYING || playerState === YT_PLAYER_STATE.PAUSED) && ytPlayer !== undefined) {
2834
+ if (currenVolume > 0) {
2835
+ volumeSlider.value = 0;
2836
+ ytPlayer.setVolume(0);
2837
+ } else {
2838
+ volumeSlider.value = playerVolumePreset;
2839
+ ytPlayer.setVolume(playerVolumePreset);
1623
2840
  }
1624
2841
  } // END if ytPlayer
1625
2842
 
1626
- // deactivate AJS events (if any)
1627
- event.stopImmediatePropagation();
1628
2843
  }); // END EventListener 'click'
1629
- } // END for
1630
- } // END if progressBars
1631
2844
 
1632
- } // END if playerType large'
1633
- }
2845
+ } // END if volumeMutes
2846
+ } // END if volumeSliders
2847
+ } // END for volumeSliders
2848
+
2849
+ } // END if playerSettings.type 'large'
2850
+
2851
+ }
2852
+
1634
2853
  } // END mimikYTPlayerUiEventsForAJS
1635
2854
 
1636
2855
  {%- endcapture -%}