PageSourceSearch

https://hypedem-radio.com/wp-content/plugins/sonaar-music-pro/public/js/sonaarPlayer.js?ver=5.13.1

js hypedem-radio.com collected 2026-10-02 00:20:38 UTC 58,602 bytes, 1,280 lines download raw bytes

1$ = jQuery;
2  IRON.data = {
3  
4  list: {
5    playlist_name: false,
6    tracks: false,
7    type: false,
8    random_order: "",
9  },
10  currentTrack: 0,
11  continuous: false, //if the player has been loaded from cookies.
12  favoriteTackList: false,
13  playlistID: "",
14  showList: false,
15  isPlaying: false,
16  audioplayerPlaying: null, //Which Audioplayer instance is playing.
17  loading: 0,
18  minimize: true,
19  extendedPlayerOpened: false,
20  extendedPlayerOverlayOpened: false,
21  audioCtx: false,
22  audioElement: false,
23  audioSrc: false,
24  analyser: false,
25  frequencyData: false,
26  userPref: {
27    pause: false,
28    minimize: false,
29    autoplay: true,
30  },
31  storeButtonCount: 0,
32  unlock: false,
33  playerStatus: "",
34  currentTime: "",
35  totalTime: "",
36  shuffle: false,
37  repeatButton: (sonaar_music.option.sticky_show_repeat_bt == 'true') ? true : false,
38  repeatStatus: IRON.repeatStatus,
39  mute: false,
40  volume: null,
41  elWidgetId: false, //Only has value when the playlist is built with the elementor widget
42  postId: false, //Used by the continous player when the playlist is generated by a elementor widget
43  isSmallDevice:( $('body').width() > 768 )? false: true,
44  classes: {
45    enable: false,
46    waveEnable: false,
47    continuousPlayer: Boolean(sonaar_music.option.enable_continuous_player === "true"),
48    show_nextprevious_bt: (sonaar_music.option.sticky_show_nextprevious_bt != "false") ? true : false,
49    show_album_title: (sonaar_music.option.sticky_show_album_title != "false") ? true : false,
50    show_speed_bt: Boolean(sonaar_music.option.sticky_show_speed_bt === "true"),
51    show_skip_bt: Boolean(sonaar_music.option.sticky_show_skip_bt === "true"),
52    show_tracklist_bt: (sonaar_music.option.sticky_show_tracklist_bt != "false") ? true : false,
53    show_shuffle_bt: (sonaar_music.option.sticky_show_shuffle_bt != "false") ? true : false,
54    show_mobile_next_bt: Boolean(sonaar_music.option.sticky_mobile_show_next === "true"),
55    show_mobile_previous_bt: Boolean(sonaar_music.option.sticky_mobile_show_previous === "true"),
56    show_mobile_tracklist_bt: Boolean(sonaar_music.option.sticky_mobile_show_tracklist === "true"),
57    display_description: (sonaar_music.option.sticky_show_description != "false") ? true : false,
58    template: sonaar_music.option.sticky_preset,
59    floatpos: sonaar_music.option.float_pos,
60    show_controls_hover: sonaar_music.option.show_controls_hover,
61    isPlaying: false,
62    author: srp_vars.sonaar_music.continuous_artist_name,
63    feedUrl: false,
64    noLoopTracklist: (srp_vars.sonaar_music.no_loop_tracklist == 'on') ? 'on' : false,
65    notrackskip: (srp_vars.sonaar_music.no_track_skip == 'on') ? 'on' : false,
66    continued: false, //Player settings come from the cookie (continuous player)
67    dontCountContinuous: false, //For statistic. Dont count stats from the continuous player
68    emptyPlayer: true,
69    skipForward: 30,
70    skipBackward: 15,
71    speedRate: 1,
72    wc_ajax_add_to_cart: (sonaar_music.option.wc_enable_ajax_addtocart == 'true') ? true : false,
73    wc_variation_lb: (sonaar_music.option.wc_variation_lb != 'false') ? true : false,
74  },
75  selectedPlayer: null,
76  waitingAudio: true, // Prevent storing an incorrect time before the MP3 audio is fully loaded.
77  cookieSetting: {
78    mute: false,
79    volume: 1,
80    isPlaying: false,
81    currentTime: 0,
82    json: false, //Required for the continuous player with Post Related or "audio_meta_field" shorcode attribute as source
83  },
84};
85
86var srp_seekTime = false;
87
88
89Vue.component('control', {
90  props: ["player"],
91  template: `
92  <div class="control" 
93     :style="(player.isSmallDevice && (player.classes.show_mobile_previous_bt || player.classes.show_mobile_next_bt || player.classes.show_mobile_tracklist_bt)) 
94     ? { 'margin-right': '10px !important', 'column-gap': '15px' } 
95     : {}">
96    <div role="button" tabindex="0" aria-label="View Tracklist" 
97     :title="sonaar_music.option.tooltip_tracklist_btn" 
98     class="list control--item sricon-list" 
99     @click="player.setshowList" 
100     v-if="player.list.tracks.length > 1 && (!player.isSmallDevice && player.classes.show_tracklist_bt || (player.isSmallDevice && player.classes.show_mobile_tracklist_bt))">
101    </div>
102    <div role="button" tabindex="0" aria-label="Rewind 15 seconds" :title="sonaar_music.option.tooltip_rwd_btn" class="sr_skipBackward sricon-15s" @click="sr_audioSkipTo(-1 * player.classes.skipBackward)" v-if="player.classes.show_skip_bt && !player.isSmallDevice"></div>
103    <div role="button" tabindex="0" aria-label="Previous Track" :title="sonaar_music.option.tooltip_prev_btn" class="previous control--item sricon-back" @click="player.previous" v-if="player.list.tracks.length > 1 && (!player.isSmallDevice && player.classes.show_nextprevious_bt || (player.isSmallDevice && player.classes.show_mobile_previous_bt))"></div>
104    <div role="button" tabindex="0" aria-label="Play / Pause" :title="sonaar_music.option.tooltip_play_btn" class="play control--item sricon-play" @click="player.play" :class="{'audio-playing': player.isPlaying }"></div>
105    <div role="button" tabindex="0" aria-label="Next Track" :title="sonaar_music.option.tooltip_next_btn" class="next control--item sricon-forward" @click="player.next" v-if="player.list.tracks.length > 1 && (!player.isSmallDevice && player.classes.show_nextprevious_bt || (player.isSmallDevice && player.classes.show_mobile_next_bt))"></div>
106    <div role="button" tabindex="0" aria-label="Forward 30 seconds" :title="sonaar_music.option.tooltip_fwrd_btn" class="sr_skipForward control--item sricon-30s" @click="sr_audioSkipTo(player.classes.skipForward)" v-if="player.classes.show_skip_bt && !player.isSmallDevice"></div>
107    <div role="button" tabindex="0" aria-label="Speed Rates" :title="sonaar_music.option.tooltip_speed_btn"class="sr_speedRate  control--item " :class="player.classes.speedRate != 1 ? 'active' : '' " @click="sr_setSpeedRate" v-if="player.classes.show_speed_bt && !player.isSmallDevice"><div>{{player.classes.speedRate}}X</div></div>
108    <div role="button" tabindex="0" aria-label="Shuffle Track" :title="sonaar_music.option.tooltip_shuffle_btn"class="shuffle control--item sricon-shuffle" :class="player.shuffle ? 'active' : '' " @click="sr_shuffleToggle" v-if="player.list.tracks.length > 1 && player.classes.show_shuffle_bt && !player.isSmallDevice"></div>
109    <div role="button" tabindex="0" aria-label="Repeat" :title="IRON.repeatToolTipLabel()" class="srp_repeat sricon-repeat control--item" @click="IRON.repeatButtonToggle" :data-repeat-status="player.repeatStatus" v-if="player.repeatButton && !player.isSmallDevice && !player.classes.notrackskip"></div>
110    </div>`
111})
112
113Vue.component('waveform', {
114  props: ["player"],
115  template: `
116  <div class="sr_progressbar_sticky">
117    <div class="timing">
118        <div class="time timing_currentTime">{{ player.currentTime }}</div>
119        <div class="time timing_totalTime">{{ player.totalTime }}</div>
120    </div>
121    <div id="sPlayer" class="wave sonaar_fake_wave" :class="{reveal: player.classes.waveEnable, sr_hide: !player.classes.waveEnable}">
122      <div class="sonaar_wave_base"><svg></svg>
123        <canvas id="splayer-wave-container" :height="player.setWaveHeight" width="2540"></canvas>
124      </div>
125      <div class="sonaar_wave_cut"><svg></svg>
126      <canvas id="splayer-wave-progress" :height="player.setWaveHeight" width="2540"></canvas>
127      </div>
128    </div>
129    </div>`,
130  mounted () {
131    IRON.audioPlayer.fakeWaveClick('sticky');
132  }
133})
134
135Vue.component('sonaar-extend-button', {
136  props: ["player"],
137  template: `
138    <div role="button" tabindex="0" aria-label="Show Call-to-action buttons" class="sonaar-extend-button" @click="player.showCTA" v-if="player.list.tracks.length >= 1 && player.albumStoreList.length >= 1">
139      <i class="fas fa-ellipsis-v"></i>
140    </div>
141  `
142});
143Vue.component('store', {
144  props: ["player"],
145  template: `
146      <transition name="sonaar-player-storefade">
147      <div class="store" v-if="player.list.tracks.length >= 1 && player.albumStoreList.length >= 1">
148      
149          <ul class="track-store" v-if="player.albumStoreList.length >= 1">
150            <li v-for="(store, storeIndex) in player.albumStoreList">
151            <cta :player=player :storeid=storeIndex label=true></cta>
152            </li>
153          </ul>
154      </div>
155    </transition>
156  `
157});
158Vue.component('cta', {
159  props: ["player","storeid","label"],
160  computed: {
161      store () {
162        var index;
163        if( typeof this.storeid == 'number'){
164          index=  this.storeid;
165        }else{
166          var storeId = this.storeid;
167          index = IRON.sonaar.player.albumStoreList.findIndex(function(element) {
168            var storeIdKey = (typeof element['cta-class'] !== "undefined" && element['cta-class'] !== '')?'cta-class':'store-icon'; //Some CTA can be identify by using the "cta-class" key and other "store-icon"
169            return typeof element[storeIdKey] === "string" && element[storeIdKey].includes(storeId);
170          });
171        }
172        return IRON.sonaar.player.albumStoreList[index];
173      },
174  },
175  template: `
176      <span v-if="(typeof store !== 'undefined')">
177        <a
178            :href="store['link-option'] == 'popup' || (store['has-variation'] == true && player.classes.wc_variation_lb) ? '#!': store['store-link']"
179          :target="store['store-target'] || store['link-option'] === 'popup' ? '_self' : '_blank'"
180          v-bind:class="[
181            {
182              'sr_store_round_bt': store['store-type'] === 'wc',
183              'srp-make-offer-bt': store['make-offer-bt'],
184              'sr_store_ask_email': store['store-link'] === '#srp_ask_email',
185              'add_to_cart_button ajax_add_to_cart': !store['make-offer-bt'] && player.classes.wc_ajax_add_to_cart && !store['has-variation'] && store['store-link'] !== '#srp_ask_email', // Prevent add_to_cart_button if store-link is #srp_ask_email
186              'sr_store_force_share_bt--sticky': store['cta-class'] === 'sr_store_force_share_bt'
187            },
188            store['cta-class'] // Bind the store['cta-class'] directly to the class attribute
189          ]"
190          :download="player.ifDownloadAttribute(store)"
191          :data-product_id="store['product-id'] !== undefined ? store['product-id'] : false"
192          :data-barba-prevent="['sr_store_force_share_bt', 'srp-fav-bt'].includes(store['cta-class']) ? 'all' : null"
193          @click="player.ctaClick(store, $(event.target))"
194        >
195          <i :class="store['store-icon']"></i>
196          <span>{{ store['store-link'] === '#srp_ask_email' ? sonaar_music.option.download_settings_afe_button_label : (label ? store['store-name'] : '') }}</span>
197        </a>
198      </span>
199    `
200});
201
202IRON.sonaar = {
203  player: new Vue({
204    el: "#sonaar-player",
205    data: IRON.data,
206    methods: {
207      play: function () {
208        this.userPref.autoplay = true;
209        if (this.isPlaying) {
210          document.getElementById("sonaar-audio").pause(); // -- Audio MediaElement
211        } else {
212          this.playAudio();
213        }
214      },
215      playAudio: function () {
216        var promise = document.getElementById("sonaar-audio").play();
217        if (promise !== undefined) {
218          promise
219            .then((_) => {
220              //console.log('play started! yeah');
221              // Autoplay started!
222            })
223            .catch((error) => {
224              console.log("Warning = " + error);
225              // Autoplay was prevented.
226              // Show a "Play" button so that user can start playback.
227            });
228        }
229        if(typeof sonaar_music.option.sticky_spectro_style !== "undefined" && sonaar_music.option.sticky_spectro_style != "none"){
230          startAudioSpectrum( '#sonaar-player' )
231        }
232      },
233      previous: function () {
234        if( document.getElementById('sonaar-audio').currentTime > IRON.previousTrackThreshold ){ //Resets the track to the beginning Or go to the previous track.
235          document.getElementById('sonaar-audio').currentTime = 0;
236          return;
237        }
238        if (this.shuffle) {
239          var i;
240          for (i = 0; i < this.list.random_order.length; i++) {
241            if (this.list.random_order[i] == this.currentTrack) {
242              if (i == 0) {
243                this.currentTrack = this.list.random_order[this.list.random_order.length - 1];
244              } else {
245                this.currentTrack = this.list.random_order[i - 1];
246              }
247              break;
248            }
249          }
250        } else {
251          if (this.currentTrack - 1 < 0) return (this.currentTrack = this.list.tracks.length - 1);
252
253          this.currentTrack--;
254        }
255      },
256      next: function () {
257        if (this.playerStatus == "next") return;
258
259        if (this.shuffle) {
260          var i;
261          for (i = 0; i < this.list.random_order.length; i++) {
262            if (this.list.random_order[i] == this.currentTrack) {
263              if (i == this.list.random_order.length - 1) {
264                if (this.classes.noLoopTracklist == "on"){
265                  return;
266                }
267                this.currentTrack = this.list.random_order[0];
268              } else {
269                this.currentTrack = this.list.random_order[i + 1];
270              }
271              break;
272            }
273          }
274        } else {
275          if (this.list.tracks.length == 1) { //handleTrackChange() run automaticly when the currentTrack value change. When the playlist has only one track, the currenttrack value never change so we have to trig it here.
276            if (this.classes.noLoopTracklist == "on") return; //Do nothing if the "No loop tracklist" is enable"
277            this.handleTrackChange();
278            return;
279          }
280          if (this.currentTrack + 1 >= this.list.tracks.length) { //At the end of the playlist
281            if (this.classes.noLoopTracklist == "on") return; //Do nothing if the "No loop tracklist" is enable"
282            return (this.currentTrack = 0);
283          }
284
285          this.currentTrack++;
286        }
287      },
288      skipBackward: function () {
289        sr_audioSkipTo(-1 * this.classes.skipBackward);
290      },
291      skipForward: function () {
292        sr_audioSkipTo(this.classes.skipForward);
293      },
294      start: function () { //Created for custom JS | not used by the plugin code
295        document.getElementById("sonaar-audio").play();
296      },
297      pause: function () { //Created for custom JS | not used by the plugin code
298        document.getElementById("sonaar-audio").pause();
299      },
300      toggleStartPause: function () { //Created for custom JS | not used by the plugin code
301        IRON.sonaar.player.play();
302      },
303 
304
305      setPlaylist: function (audioPlayer, eq, time = 0) {
306        if ($(audioPlayer).attr("trackselected") == eq || ($(audioPlayer).attr("trackselected") == null && eq == 0)) {
307          $(audioPlayer).attr("duplicating_wave", true);
308        }
309        $(audioPlayer).attr("trackselected", eq);
310        var params = audioPlayer.data("url-playlist").slice(audioPlayer.data("url-playlist").indexOf("title")).split("&");
311        let newParams = [];
312        params.forEach(function (el) {
313          let paramName;
314          let paramValue;
315          [paramName, paramValue] = el.split('=')
316          newParams[paramName] = paramValue;
317        });
318        if (newParams.feed.length || newParams.audio_meta_field.length) {
319          var id = $(audioPlayer).attr("id"); //Use the elementor widget ID as the player ID. This param is only available the FEED option.
320        } else {
321          var id = newParams.albums;
322        }
323        this.setPlayer({
324          id: id,
325          category: newParams.category || '',
326          title: newParams.title,
327          trackid: eq,
328          shuffle: audioPlayer.data("shuffle"),
329          audioPlayer: audioPlayer,
330          time: time
331        });
332      },
333
334      preventContinuousUrl: function () {
335        var preventURL = false;
336        if (typeof sonaar_music.option.sr_prevent_continuous_url !== "undefined") {
337          if (sonaar_music.option.sr_prevent_continuous_url.includes(sonaar_music.postID)) {
338            preventURL = true;
339          }
340        }
341        return preventURL;
342      },
343
344      setPlayerAndPlay: function (args) {
345        if (IRON.sonaar.player.playlistID != args.id || this.currentTrack != args.trackid) {
346          IRON.audioPlayer.stickyEnable = true;
347          this.setPlayer(args);
348          this.playAudio();
349        } else {
350          if (!this.isPlaying) {
351            this.playAudio();
352          }
353          if (args.time) {
354            this.seekTime(convertTime(args.time))
355          }
356          if (args.trackid && this.currentTrack != args.trackid) {
357            this.currentTrack = args.trackid;
358          }
359        }
360       
361        if(args.nolooptracklist == "on"){
362          IRON.sonaar.player.classes.noLoopTracklist = "on";
363        }
364        if(args.notrackskip == "on"){
365          IRON.sonaar.player.classes.notrackskip = "on";
366        }
367      },
368
369      getPlaylistbyID: function (id, category, title, elwidget, jsonFromCookie = false) {
370        var playlistID = id || false;
371        var title = title || "";
372        var elwidget = elwidget ? elwidget + "&feed=1" : null;
373          if (this.selectedPlayer === null && playlistID) {
374            if (jsonFromCookie) {
375              return jsonFromCookie;
376            } else {
377              return srp_vars.site_url + "?load=playlist.json&title=" + title + "&albums=" + playlistID + "&category=" + category + "&el_widget_id=" + elwidget + "&posts_per_pages=-1";
378            }
379          } else {
380            json_url = this.selectedPlayer.attr("data-url-playlist");
381            return json_url;
382          }
383      },
384
385      seekTime: function (time) {
386        if (time) {
387          if (document.getElementById("sonaar-audio").duration !== Infinity) {
388            document.getElementById("sonaar-audio").currentTime = convertTime(time);
389          }
390          srp_seekTime = false;
391        }
392      },
393
394      setPlayer: function (args) {
395        var newTracklistIsFavoriteList = (typeof args.audioPlayer != 'undefined' && args.audioPlayer.hasClass('srp_player_is_favorite'))? true : false;
396        IRON.audioPlayer.stickyEnable = true;
397
398        sanitized_id = args.id
399        sanitized_id = sanitized_id.toString();
400        sanitized_id = sanitized_id.split(" ").join(""); // prevent blank space
401        args.id = sanitized_id.replace(/latest/i, srp_vars.sonaar_music.mostRecentId); // if latest string is used, replace it by the most recent id
402
403        if(typeof sonaar_music.option.sticky_spectro_style !== "undefined" && sonaar_music.option.sticky_spectro_style != "none"  && $('#sonaar-audio').length){ // if sticky spectro is enabled
404          document.getElementById("sonaar-audio").crossOrigin = "anonymous";
405        }
406
407        this.classes.emptyPlayer = false;
408        var args = args || {};
409        var params = {
410          id: args.id,
411          category: args.category || '',
412          title: args.title || null,
413          trackid: args.trackid || 0,
414          autoplay: typeof args.autoplay == "boolean" ? args.autoplay : true,
415          el_widget_id: args.elwidgetid || false,
416          jsonFromCookie: args.json || false // Used to conserved postrelated playlist from single post
417        };
418        params.id = (params.id == '' && params.category != '') ? srp_vars.sonaar_music.currentPostId : params.id; 
419        srp_seekTime = args.time || false;
420        this.waitingAudio = true; 
421        this.selectedPlayer = args.audioPlayer || null;
422
423        if( this.continuous ){
424          this.playlistID = false;
425        }
426        if(typeof  args.continuous != 'undefined' &&  args.continuous){
427          this.continuous = true;
428        }else{
429          this.continuous = false;
430        }
431
432        this.elWidgetId = params.el_widget_id;
433        this.shuffle = args.shuffle == true || args.shuffle == "true" || args.shuffle == "1" || (this.selectedPlayer && this.selectedPlayer.attr('data-shuffle') == 'true') ? true : false;
434        var samePlaylist = false;
435        if(this.selectedPlayer && this.selectedPlayer.hasClass('sr_selectedPlayer')){ //If the player is already selected
436           samePlaylist = true;
437        }else{
438          $(".sr_selectedPlayer").removeClass("sr_selectedPlayer");
439          $(this.selectedPlayer).addClass("sr_selectedPlayer");
440        }
441
442        if (!this.classes.wavesurferEnable) {
443          IRON.audioPlayer.fakeWaveClick("sticky");
444        }
445        this.userPref.autoplay = params.autoplay;
446
447        //const samePlaylist = (params.id && params.id === this.playlistID && this.favoriteTackList == newTracklistIsFavoriteList)? true : false;
448        
449        if (samePlaylist && params.trackid == this.currentTrack) { //If the track is already the current track.
450          this.seekTime(srp_seekTime);
451          return this.play();
452        }
453        if ( samePlaylist && params.trackid !== this.currentTrack ) {
454          this.currentTrack = params.trackid;
455        }
456
457        //Load tracklist from th Json file only if the playlist ID has changed or if the playlist is a favorite playlist.
458        if (
459            !samePlaylist || 
460            newTracklistIsFavoriteList !== this.favoriteTackList || 
461            params.category !== this.categoryID
462          ) {
463          const endingTrack = this.currentTrack;
464          $.when($.getJSON(this.getPlaylistbyID(params.id, params.category, params.title, params.el_widget_id, params.jsonFromCookie))).done(
465            function (data) {
466              if(data.length == 0){ return; } //If the playlist is empty
467              if (!$("body").hasClass("artistPlayer-enable")) {
468                this.classes.enable = true;
469                if (!IRON.sonaar.player.classes.continued) {
470                  this.minimize = false;
471                }
472                this.animatePlayer();
473                $("body").addClass("continuousPlayer-enable");
474              }
475              this.list = data;
476              if (IRON.players.length && this.selectedPlayer && this.selectedPlayer.hasClass('srp_reordered')) {
477                for (var playerIndex = 0; playerIndex < IRON.players.length && IRON.players[playerIndex].audioPlayer.attr('id') != $(this.selectedPlayer).attr('id'); playerIndex++) { }; //Set playerIndex
478                this.reOrderTacklist(playerIndex)
479              }
480
481              if (this.shuffle) {
482                this.setRandomList();
483                if (typeof args.trackid == "undefined") {
484                  params.trackid = Math.floor(Math.random() * this.list.tracks.length);
485                }
486              }
487
488              this.playlistID = params.id;
489              this.categoryID = params.category;
490
491              if(typeof sonaar_music.option.general_volume != 'undefined' && this.volume == null){
492                sr_setVolume(sonaar_music.option.general_volume/100);
493              }        
494
495              if (this.list.type == "podcast") {
496                for (var i = 0; i < this.list.tracks.length; i++) {
497                  var element = this.list.tracks[i];
498
499                  if (element.id == params.id) {
500                    this.currentTrack = i;
501                  }
502                }
503              } else {
504                this.currentTrack = params.trackid;
505              }
506
507              if (this.currentTrack == 0 || //If the currentTrack still has the default value, execute handleTrackChange. 
508                endingTrack == this.currentTrack //HandletrackChange function is automatically triggered when the currentTrack value is changed. Here we execute it if the currentTrack value is the same but the playlist ID has been changed.
509              ) {
510                this.handleTrackChange();
511              }
512
513              if(typeof IRON.sonaar.player.list.tracks === 'object' && typeof IRON.localStorageTrackMemory === 'object'){ //Verify if the track has been completed
514                IRON.sonaar.player.list.tracks.forEach((track, index) => {
515                    const trackMemoryKey = IRON.getTrackMemoryKeyFormat(track.mp3);
516                    if (trackMemoryKey && IRON.localStorageTrackMemory.hasOwnProperty(trackMemoryKey)) {
517                        const trackMemoryData = IRON.localStorageTrackMemory[trackMemoryKey];
518                        if (Array.isArray(trackMemoryData) && trackMemoryData.length >= 3) {
519                           track.hasCompleted = trackMemoryData[2];
520                        }
521                    }
522                });
523              }
524
525            }.bind(this)
526          );
527          this.favoriteTackList = newTracklistIsFavoriteList;
528        }
529
530        if (this.selectedPlayer != null) {
531          this.classes.feedUrl = this.selectedPlayer.data("feedurl");
532          this.classes.noLoopTracklist = this.selectedPlayer.data("no-loop-tracklist");
533          this.classes.notrackskip = this.selectedPlayer.data("notrackskip");
534          this.cookieSetting.json = this.selectedPlayer.attr('data-url-playlist');
535        }
536        this.postId = srp_vars.sonaar_music.currentPostId;
537
538        IRON.sonaar.player.selectedTimeStamp = null;
539        if (typeof args.ts_id != 'undefined') { //set selected time stamp shortcode
540          IRON.sonaar.player.selectedTimeStamp = $('#sonaar_ts-' + args.ts_id);
541        } else {
542          let selector = '.srmp3_sonaar_ts_shortcode';
543          if (this.selectedPlayer != null && typeof this.selectedPlayer.data('ts-sync') != 'undefined') {
544            IRON.sonaar.player.selectedTimeStamp = $('#sonaar_ts-' + this.selectedPlayer.data('ts-sync'));
545            selector += ':not(#sonaar_ts-' + this.selectedPlayer.data('ts-sync') + ')';
546          }
547          $(selector).removeClass('sr_selected audio-playing');
548        }
549
550        if($('#srmp3_settings_shortcodebuilder').length && $('#adminmenuback').length){ //If we are in the shortcode builder, resize the player to fit the screen
551          $('#sonaar-player').css('width', 'calc(100% - ' + $('#adminmenuback').width() + 'px)');
552          $('#sonaar-player').css('right', 0);
553        }
554      },
555
556      setAudio: function () {
557        //Set to "audioplayerPlaying" which audioplayer is playing. ( 0 for the first audioplayer)
558        var audioplayerPlayingID = null;
559        $.each(IRON.players, function (index) {
560          if ($(IRON.players[index].audioPlayer).hasClass("sr_selectedPlayer")) {
561            audioplayerPlayingID = index;
562          }
563        });
564        this.audioplayerPlaying = audioplayerPlayingID;
565        this.setPlayerType();
566        //----------------------------------------------------------------------
567        
568        if (this.list.tracks[this.currentTrack].mp3 === null || this.list.tracks[this.currentTrack].mp3 === "") {
569          // feed url is used in the shortcode instead of post id
570          this.list.tracks[this.currentTrack].mp3 = $(".iron-audioplayer.sr_selectedPlayer .sr-playlist-item").attr("data-audiopath");
571          this.list.tracks[this.currentTrack].track_title = $(".iron-audioplayer.sr_selectedPlayer .sr-playlist-item").attr("data-tracktitle");
572          this.list.tracks[this.currentTrack].album_title = $(".iron-audioplayer.sr_selectedPlayer .sr-playlist-item").attr("data-albumtitle");
573          this.list.tracks[this.currentTrack].track_artist = $(".iron-audioplayer.sr_selectedPlayer .sr-playlist-item").attr("data-trackartist");
574        }
575        if(IRON.sonaar.player.hasPlayed == false){ // Register the audio object a first time for iOS to continue to next track on lock mode.
576          elementAudio.src = this.list.tracks[this.currentTrack].mp3;
577        }
578        $("#sonaar-player").attr("data-tracktitle", this.list.tracks[this.currentTrack].track_title);
579        $("#sonaar-player").attr("data-albumtitle", this.list.tracks[this.currentTrack].album_title);
580        $("#sonaar-player").attr("data-trackartist", this.list.tracks[this.currentTrack].track_artist);
581        $("#sonaar-player").attr("data-audiopath", this.list.tracks[this.currentTrack].mp3);
582        if (this.list.tracks[this.currentTrack].id != null) {
583          $("#sonaar-player").attr("data-trackid", this.list.tracks[this.currentTrack].id);
584        }
585        currentTrackTitle = this.list.tracks[this.currentTrack].track_title;
586        currentAlbumTitle = this.list.tracks[this.currentTrack].album_title;
587        currentArtistName = this.list.tracks[this.currentTrack].track_artist;
588        currentAlbumArt = this.list.tracks[this.currentTrack].poster;
589
590        IRON.audioPlayer.currentTrackData = {
591          trackTitle: currentTrackTitle,
592          albumTitle: currentAlbumTitle,
593          artistName: currentArtistName,
594          albumArt: currentAlbumArt
595        }
596        IRON.audioPlayer.setMediaSessionAPI(currentTrackTitle, currentAlbumTitle, currentArtistName, currentAlbumArt);     
597        
598        sr_addTrackToPlaylist(this.list.tracks[this.currentTrack]);
599      
600        if (!IRON.sonaar.player.selectedPlayer || !IRON.sonaar.player.selectedPlayer.trackMemory) { //if player is not sync 
600with a widget player set with the track memory
601          $("#sonaar-player .sonaar_wave_cut, .sr_selectedPlayer .album-player .sonaar_wave_cut, .sr_selectedPlayer .current .sonaar_wave_cut, #sonaar-player .mobileProgressing").width(0);
602        }
603        var trackHasEnded = document.getElementById("sonaar-audio").ended;
604        var isPlaying = !document.getElementById("sonaar-audio").paused;
605        $("#sonaar-audio").attr("src", this.list.tracks[this.currentTrack].mp3); //Load Audio MediaElement to the Sticky player
606        $("#sonaar-audio").attr("title", currentTrackTitle); //set title for analytics reports (eg: matomo)
607        //document.getElementById("sonaar-audio").crossOrigin = "anonymous";
608        document.getElementById("sonaar-audio").load();
609        if ($(".sr_selectedPlayer").length || isPlaying || trackHasEnded) {
610          // if the sticky player is sync with a widget player OR is already playing
611          this.playAudio();
612          $("#sonaar-player .play").addClass("audio-playing");
613        }
614        this.classes.waveEnable = true;
615        IRON.audioPlayer.checkArtWorkFullBg(this.selectedPlayer, false);
616        
617
618        if (IRON.players.length != 0 && this.selectedPlayer != null) { //If Widget Player is selected
619          IRON.createFakeWave(this.selectedPlayer);
620        }
621        IRON.createFakeWave(false, true);
622        
623        $(document).trigger("sonaarStats", $("#sonaar-player"));
624        if (IRON.players.length != 0 && this.classes.feedUrl && !this.elWidgetId && this.audioplayerPlaying != null) {
625          //Set "elWidgetId" only when the playlist is built with the elementor widget
626          this.elWidgetId = $(IRON.players[this.audioplayerPlaying].audioPlayer).parents(".elementor-widget-music-player").attr("data-id");
627        }
628        
629
630
631        if (this.classes.continuousPlayer) {
632          sr_setCookieSettings();
633        }
634 
635        
636        function ifHaveStoreContent() { //Check if the current player has store-content in the store list
637          let value = false;
638          $.each(IRON.sonaar.player.list.tracks, function () {
639            if (typeof (this.song_store_list) != 'undefined') {
640              $.each(this.song_store_list, function () {
641                if (typeof (this['store-content']) != 'undefined') {
642                  value = true;
643                }
644              });
645            };
646          });
647          return value;
648        }
649        if (ifHaveStoreContent()) { //Load Modal reurired for store content popup
650          sr_setPopUp();
651        }
652        
653        this.seekTime(srp_seekTime);
654        
655        IRON.audioPlayer.sr_loadLyricsAjax(this.list.tracks[this.currentTrack].sourcePostID, this.list.tracks[this.currentTrack].track_pos);
656        document.getElementById("sonaar-audio").playbackRate = IRON.sonaar.player.classes.speedRate;//set SpeedRate
657
658        //set time from memory
659        if(typeof IRON.sonaar.player.selectedPlayer?.find('.sr-playlist-item').eq(this.currentTrack).data('current-time') != 'undefined'){
660          sr_setTrackCurrentTime(IRON.sonaar.player.selectedPlayer.find('.sr-playlist-item').eq(this.currentTrack).data('current-time'));
661        }
662        this.waitingAudio = false;
663      },
664      clickPlayer: function () {
665        if (!$('.control:hover').length) {
666          this.openMobileControl();
667        }
668      },
669      extendedScrolldown: function () {
670        const extendedPlayer = document.querySelector(".srp_extendedPlayer_scrolling_box")
671        if(extendedPlayer.scrollTop === 0){
672          extendedPlayer.scrollTo({
673            top: extendedPlayer.scrollTop + 200,
674            behavior: "smooth"
675          });
676        }  
677      },
678      clickTrackList: function (index) {
679        if(this.currentTrack == index){
680          this.play();
681        }else{
682          this.currentTrack = index; 
683          this.playAudio();
684        }
685      },
686      /*Close and Open the sticky mobile control Panel*/
687      /* the "cmd" parameter can be use if we only want to "open" or "close" the panel. By default it is toggling between each state.*/
688      openMobileControl: function (cmd = false) {
689        if ( this.isSmallDevice ) {
690          this.extendedPlayerOpened = true;
691          $('body').addClass('srp_sticky_ext_opened');
692        }
693      },
694      setshowList: function () {
695        if (this.showList == false) {
696          $("#pusher-wrap").addClass("sonaar-list-active");
697          return (this.showList = true);
698        }
699        $("#pusher-wrap").removeClass("sonaar-list-active");
700        return (this.showList = false);
701      },
702      setPlayerType: function () {
703        this.list.type = sonaar_music.option.player_type; //from plugin settings
704        if (this.audioplayerPlaying != null) {
705          this.list.type = IRON.players[this.audioplayerPlaying].audioPlayer.playerType; //from widget
706        }
707        if (srp_vars.sonaar_music.post_player_type != '' && srp_vars.sonaar_music.post_player_type != 'default') {
708          this.list.type = srp_vars.sonaar_music.post_player_type //from playlist post settings selected in the page settings
709        }
710      },
711      closePlayer: function () {
712        if (this.showList) {
713          $("#pusher-wrap").removeClass("sonaar-list-active");
714          this.showList = false;
715        }
716        this.minimize = !this.minimize;
717        this.classes.enable = !this.classes.enable;
718        this.animatePlayer();
719      },
720      extendedPlayerClickOutside: function () {
721        if($('.srp_extendedPlayer > *:hover').length == 0){
722          this.closeExtendedPlayer()
723        }
724      },
725      closeExtendedPlayer: function () {
726        this.extendedPlayerOpened = false;
727        $('body').removeClass('srp_sticky_ext_opened');
728      },
729      openExtendedPlayerOverlay: function () {
730        this.extendedPlayerOverlayOpened = true;
731      },
732      closeExtendedPlayerOverlay: function () {    
733        this.extendedPlayerOverlayOpened = false;
734      },
735      getIndexFromStoreList: function (store, inputName, storeList) {
736        const valueToSearch = store[inputName];
737        var index = -1; //Default
738        for (var i = 0; i < storeList.length; i++) {
739          if (storeList[i][inputName] === valueToSearch) {
740            index = i;
741            return index;
742          }
743        }
744        return index;
745      },
746      
747
748      playlistAfterEnter: function () {
749        var ps = new PerfectScrollbar("#sonaar-player .playlist .scroll", {
750          wheelSpeed: 0.7,
751          swipeEasing: true,
752          wheelPropagation: false,
753          minScrollbarLength: 20,
754          suppressScrollX: true,
755        });
756        /*$('#sonaar-player .playlist .scroll').perfectScrollbar({
757          'suppressScrollX': true
758        })*/
759      },
760      scroll: function (event) {
761        var el = event.target;
762        var parent = el.offsetParent;
763
764        if (el.offsetWidth > parent.offsetWidth && !el.classList.contains("scrolling")) {
765          el.classList.add("scrolling");
766          var transformWidth = el.offsetWidth + 10;
767          el.insertAdjacentHTML("beforeend", '<span class="duplicate">' + el.innerText + "</span>");
768          el.style.transform = "translate( -" + transformWidth + "px )";
769          setTimeout(function () {
770            el.classList.remove("scrolling");
771            el.style.transform = "";
772            el.removeChild(el.firstElementChild);
773          }, 6000);
774        }
775      },
776      updatePlayers: function () {
777        $(".iron-audioplayer").removeClass("audio-playing");
778        
779        if (IRON.players.length != 0 && this.selectedPlayer != null) { //If Widget Player is selected
780
781          this.selectedPlayer.find("li.current").removeClass("current");
782
783          if (this.isPlaying) {
784            var currentTrackPlaying = this.currentTrack;
785            //var currentTrackTitle;
786            this.selectedPlayer.addClass("audio-playing");
787            this.selectedPlayer.find('.currentTime, .totalTime').show();
788            this.selectedPlayer.find(".sr-playlist-item").eq(currentTrackPlaying).addClass("current");
789
790            if (this.selectedPlayer.data('hide-artwork') != '1' && this.selectedPlayer.data('hide-artwork') != 'true' && typeof this.selectedPlayer.data('albumart') == 'undefined') {
791              if (this.list.tracks[this.currentTrack].poster == '') {
792                this.selectedPlayer.addClass('sonaar-no-artwork');
793              } else {
794                  this.selectedPlayer.removeClass('sonaar-no-artwork');
795                  this.selectedPlayer.find('.album-art img').attr("src", this.selectedPlayer.find(".sr-playlist-item").eq(currentTrackPlaying).data('albumart') );
796              }
797              srp_getColorsFromImage(this.selectedPlayer, this.selectedPlayer.find(".sr-playlist-item").eq(currentTrackPlaying).data('albumart'))
798            }
799            //currentTrackTitle = this.selectedPlayer.find(".sr-playlist-item").eq(this.currentTrack).attr("data-tracktitle");
800            IRON.audioPlayer.updateMiniPlayer(this.selectedPlayer, this.selectedPlayer.find(".sr-playlist-item").eq(this.currentTrack));
801           /* if (this.audioplayerPlaying != null) {
802              $(IRON.players[this.audioplayerPlaying].audioPlayer).find(".track-title").html(currentTrackTitle);
803            }*/
804          }
805        }
806        if (this.selectedTimeStamp != null) { //If Time Stamp shortcode is selected
807          $('.srmp3_sonaar_ts_shortcode').removeClass('audio-playing');
808          if (this.isPlaying) {
809            this.selectedTimeStamp.addClass('audio-playing');
810          }
811        }
812
813        startAudioSpectrum(this.selectedPlayer);
814        IRON.setExtendedPlayerHeightVar();
815      },
816
817      scrollingProgressBar: function (event) {
818        var progressedAudio = event.target.clientWidth / event.touches[0].clientX;
819        document.getElementById("sonaar-audio").currentTime = document.getElementById("sonaar-audio").duration / progressedAudio;
820      },
821
822      setSlideVolume: function () {
823        sr_initSlider($(this.$el).find(".volume .slide"));
824      },
825
826      showCTA: function () {
827        if ($("#sonaar-player.enable .store").hasClass("opened")) {
828          $("#sonaar-player.enable .store").removeClass("opened");
829        } else {
830          $("#sonaar-player.enable .store").addClass("opened");
831        }
832      },
833
834      setRandomList: function () {
835        //If the player is selected set the currentTrack to the first track of the random list set firstTrackIndex to the currentTrack value. Otherwise set firstTrackIndex to 
835null.
836        firstTrackIndex = (typeof IRON.sonaar.player.selectedPlayer != 'undefined' && IRON.sonaar.player.selectedPlayer != null)? IRON.sonaar.player.selectedPlayer.data('currentTrack') : null;
837        this.list.random_order = IRON.audioPlayer.setRandomList(this.list.tracks, firstTrackIndex);
838      },
839
840      setIsPlaying: function (value) {
841        this.isPlaying = value;
842        if (this.classes.continuousPlayer) {
843          sr_setCookieSettings();
844        }
845      },
846
847      handleTrackChange: function () { //This function is automatically triggered when the currentTrack value is changed.
848        //console.log('handleTrackChange', this.selectedPlayer.currentTrack, this.currentTrack);
849
850        IRON.favorites.setStickyFavButtons();
851        IRON.swiper.update(IRON.sonaar.player.selectedPlayer, IRON.sonaar.player.currentTrack);
852        IRON.getIceCastInfo(IRON.sonaar.player.selectedPlayer);
853        this.isPlaying = false;
854        this.classes.waveEnable = false;
855
856
857        
858       
859        if (this.selectedPlayer) {
860          this.selectedPlayer.currentTrack = this.currentTrack;
861        }
862
863        /*Convert html entities to string. Eg: &#39; to '  */
864        if(typeof this.currentTrack != 'undefined' && typeof this.list.tracks[this.currentTrack].track_title != 'undefined'){
865          const txt = document.createElement('textarea');
866          txt.innerHTML = this.list.tracks[this.currentTrack].track_title;
867          this.list.tracks[this.currentTrack].track_title = txt.value;
868        }
869
870        this.setAudio();
871
872
873
874        IRON.init_generatePeaks();
875
876        this.updatePlayers();
877      },
878
879      animatePlayer: function () {
880        //animation when we click on the close button or when the player is loaded
881        if (this.classes.continued) {
882          if (this.minimize) {
883            $("#sonaar-player").css("bottom", '-' + ($('#sonaar-player').height() + 6) + 'px');
884          }else{
885            $("#sonaar-player").css("bottom", "0");
886          }
887          this.classes.continued = false;
888        } else {
889          if (this.minimize) {
890            bottomPosition = '-' + ($('#sonaar-player').height() + 6) + 'px';
891          } else {
892            bottomPosition = "0";
893          }
894          // replace #sonaar-player sricon-down-arrow by sricon-up-arrow
895      
896          $("#sonaar-player").animate({
897            bottom: bottomPosition,
898          });
899        }
900      },
901
902      ctaClick: function (store, el) {
903        var storeIndex;
904        if (store['link-option'] == 'popup') { // Open Popup
905          storeIndex = this.getIndexFromStoreList(store, 'store-content', this.list.tracks[this.currentTrack].song_store_list );
906          this.storePopUp(this.currentTrack, storeIndex, el)
907        } else if (store['has-variation'] == true && this.classes.wc_variation_lb) { // Open variation Lighbox
908          srp_variation_button(el, store['product-id']);
909        } else if (this.classes.wc_ajax_add_to_cart && store['has-variation'] == false) { // Ajax add to cart
910          srp_add_to_cart_loadspinner(el);
911        }
912        if(store['cta-class'] == 'srp-fav-bt'){
913          storeIndex = this.getIndexFromStoreList(store, 'cta-class', this.list.tracks[this.currentTrack].optional_storelist_cta );
914          IRON.favorites.clickStickyFavButton( storeIndex );
915        }
916        if(store['make-offer-bt']){
917          el = $(el).closest('a');
918          srp_variation_button(el);
919        }
920        if(store['store-link']=='#srp_ask_email'){
921          handleAskEmailClick($(el));
922        }
923      },
924
925      ifDownloadAttribute: function (store) {
926        if( 
927          store['store-icon'] === 'fas fa-download' && store['link-option'] !== 'popup' && (typeof store['store-link'] != 'undefined' && !store['store-link']?.startsWith('#') || typeof store['store-link'] == 'undefined' ) &&
928          (typeof store['download-attr'] == 'undefined' || typeof store['download-attr'] != 'undefined' && store['download-attr']) //dont set the download attribute if "condition NOT met" and force download CTA redirection is enabled 
929        ){
930          return '';
931        }else{
932          return false;
933        } 
934      },
935
936      storePopUp: function (trackNumber, storeNumber, el) {
937        const playlistPostId = this.list.tracks[trackNumber].sourcePostID;
938        let postTrackIndex = 0;
939        let postTrackCount = 0;
940        $.each(this.list.tracks, function (index) {
941          if (this.sourcePostID == playlistPostId) {
942            if (index == trackNumber) {
943              postTrackIndex = postTrackCount;
944            }
945            postTrackCount++
946          }
947        });
948        const storeId = postTrackIndex + '-' + storeNumber;
949        sr_popUp(playlistPostId, storeId, null, null, el)
950      },
951
952      /* Re Order the tracklist when the sticky player plays a re-organized(filter/order) playlist by list.js */
953      reOrderTacklist: function (playerIndex) {
954        if (!IRON.sonaar.player.list.tracks)
955          return;
956
957        let newTrackOrder = [];
958        $(IRON.players[playerIndex].audioPlayer.find('.sr-playlist-item')).each(function () {
959          mp3ToSeek = $(this).data('audiopath');
960          titleToSeek = $(this).data('tracktitle');
961          postIdToSeek = $(this).data('post-id');
962          let trackFound = '';
963          IRON.sonaar.player.list.tracks.forEach(function (e, i) {
964
965            e.mp3 = (typeof e.mp3 == 'string') ? e.mp3.replace(/&amp;/g, '&') : e.mp3;
966            if (decodeURIComponent(e.mp3) == decodeURIComponent(mp3ToSeek) && srp_decodeHTMLEntities(titleToSeek).includes(srp_decodeHTMLEntities(e.track_title)) && postIdToSeek == e.sourcePostID ) {
967              trackFound = IRON.sonaar.player.list.tracks[i];
968              trackFound['track_index'] = i; //useful for the continuous player.
969              newTrackOrder.push(trackFound);
970            }
971          })
972        })
973        
974        if( newTrackOrder.length ){
975         IRON.sonaar.player.list.tracks = newTrackOrder
976        }
977      },
978      unsyncWidgetPlayers: function () {
979        IRON.sonaar.player.selectedPlayer = null;
980        $('.sr_selectedPlayer').removeClass('sr_selectedPlayer audio-playing');
981        IRON.sonaar.player.playlistID = null;
982      },
983    },
984
985    computed: {
986      templateType: function () {
987        return "sr-" + this.classes.template;
988      },
989      setWaveHeight: function () {
990        if (this.classes.template == 'mini_fullwidth') {
991          return '27';
992        } else {
993          return '40';
994        }
995      },
996      floatPos: function () {
997        return "sr-pos--" + this.classes.floatpos;
998      },
999      showControlsHover: function () {
1000        if (this.classes.show_controls_hover === "true") {
1001          return "sr-show_controls_hover";
1002        }
1003      },
1004      isDraggable: function () {
1005        if (sonaar_music.option.make_draggable === "true") {
1006          return "sr-draggable";
1007        }
1008      },
1009      stickyProgressBar: function () {
1010        if (sonaar_music.option.sticky_hide_progress_bar === "true") {
1011          return false;
1012        } else {
1013          return true;
1014        }
1015      },
1016      classType: function () {
1017        return "list-type-" + this.list.type;
1018      },
1019      playerCallToAction: function () {
1020        if (this.list.type == "podcast") {
1021          return this.list.tracks[this.currentTrack].podcast_calltoaction;
1022        } else {
1023          return this.list.tracks[this.currentTrack].song_store_list;
1024        }
1025      },
1026      albumStoreList: function () {
1027        var song_store = this.list.tracks[this.currentTrack].song_store_list;
1028        var album_store = this.list.tracks[this.currentTrack].album_store_list;
1029        var optional_cta = this.list.tracks[this.currentTrack].optional_storelist_cta;
1030
1031        if (this.selectedPlayer) {
1032          // For dynamic visiblity buttons. Check if optional CTA is available in the current track. If not, remove it from the array, otherwise change the href to reflect the current track button href.
1033          var $currentTrackfromWidget = this.selectedPlayer.find(".sr-playlist-item").eq(this.currentTrack);
1034          //check if $currentTrackfromWidget exists
1035          if ($currentTrackfromWidget.length > 0) {
1036          
1037            var storeElements = $currentTrackfromWidget[0].querySelectorAll('.song-store-list-container .song-store');
1038            var domDataArray = [];
1039            storeElements.forEach(function(storeElement) {
1040              // if class is includes srp-fav-bt or sr_store_force_share_bt or sr_store_force_dl_bt or sr_store_force_pl_bt and is not part of optional_cta, maybe its set by the shortcode
1041              var classAttribute = storeElement.getAttribute('class');
1042              // Check if class includes any of the specified strings
1043              var shouldInclude = ['srp-fav-bt', 'sr_store_force_share_bt', 'sr_store_force_dl_bt', 'sr_store_force_pl_bt'].some(str => classAttribute.includes(str));
1044              // Breakdown classAttribute into individual classes
1045              var classList = classAttribute.split(' ');
1046              // Check if any class from classList is part of optional_cta
1047              var isInOptionalCta = (optional_cta) ? classList.some(cls => optional_cta.some(item => item['cta-class'] === cls)) : '';
1048
1049              // Only proceed if the class is one of the desired ones and not in optional_cta
1050              if (shouldInclude && !isInOptionalCta) {
1051                    // Extract data for each store
1052                    var storeData = {
1053                        "store-icon": storeElement.querySelector('i').className,
1054                        "store-link": storeElement.getAttribute('href'),
1055                        "store-name": storeElement.getAttribute('title'),
1056                        "store-target": storeElement.getAttribute('target'),
1057                        "cta-class": storeElement.getAttribute('class')
1058                        .replace('song-store', '')  // Remove 'song-store'
1059                        .replace('sr_store_wc_round_bt', '')  // Remove 'sr_store_wc_round_bt'
1060                        .replace('srp_hidden', '')  // Remove 'srp_hidden' if it exists
1061                        .trim(),  // Trim any extra spaces
1062                        "show-label": storeElement.querySelector('.srp_cta_label') !== null,
1063                        "download-attr": (storeElement.getAttribute('download') === null)? false : true,
1064                    };
1065
1066                    domDataArray.push(storeData);
1067              };
1068            });
1069        
1070            if (Array.isArray(optional_cta)) {
1071              optional_cta.forEach(function (ctaItem) {
1072                $trackButton = $currentTrackfromWidget.find('.' + ctaItem['cta-class']);            
1073                if( $trackButton.length === 0 ){
1074                  //remove this item from this array
1075                  optional_cta.splice(optional_cta.indexOf(ctaItem), 1);
1076                }
1077                if( $trackButton.length === 1 ){  
1078                  // modify the store-link
1079                  ctaItem['store-link'] = $trackButton.attr('href');  
1080                }
1081              });
1082            }
1083        }
1084      };
1085        var storesObjects = [];
1086        if (song_store.length < 1 || song_store.length === false) {
1087          storesObjects = album_store !== undefined ? album_store : [];
1088        } else {
1089          storesObjects = album_store === false ? song_store : song_store.concat(album_store);
1090        } 
1091              
1092        if (!Array.isArray(storesObjects)) {
1093          storesObjects = [];
1094        }
1095      
1096        if (Array.isArray(domDataArray)) { // Only concat if domDataArray is an array
1097          storesObjects = storesObjects.concat(domDataArray);
1098        }
1099        if(typeof optional_cta != 'undefined' && optional_cta !== false){
1100          if( storesObjects !== false ){
1101            storesObjects = storesObjects.concat(optional_cta);
1102          }else{
1103            storesObjects = optional_cta;
1104          }
1105        }
1106        storeButtonCount = storesObjects.length;
1107
1108        return storesObjects;
1109      },
1110      hasArtwork: function () {
1111        var strURL = (typeof this.list.tracks[this.currentTrack] != 'undefined')? this.list.tracks[this.currentTrack].poster : false;
1112        if (strURL != null && strURL != false) {
1113          return !strURL.endsWith("default.png");
1114        }else{
1115          return false;
1116        }
1117      },
1118
1119      playLabelButton: function () {
1120        return this.isPlaying ? srp_vars.sonaar_music.play_button_label.pause : srp_vars.sonaar_music.play_button_label.play;
1121      },
1122      playListTitle: function () {
1123        if (this.selectedPlayer && this.selectedPlayer.attr("data-playlist_title").length) {
1124          this.list.playlist_name = this.selectedPlayer.attr("data-playlist_title");
1125        }
1126        if (this.list.playlist_name == "") {
1127          return this.list.tracks[this.currentTrack].album_title;
1128        } else {
1129          return this.list.playlist_name;
1130        }
1131      },
1132      outputTrackDescription: function () {
1133          if(this.classes.display_description){
1134            return this.list.tracks[this.currentTrack].description;
1135          }else{
1136            return false;
1137          }    
1138      },
1139      sr_countUIitems: function () {
1140        let countItem = 1;
1141        if (this.list.tracks.length > 1 && this.classes.show_nextprevious_bt) {
1142          countItem++;
1143        }
1144        if (this.list.tracks.length > 1 && this.classes.show_tracklist_bt) {
1145          countItem++;
1146        }
1147        if (this.list.tracks.length >= 1 && this.albumStoreList.length >= 1) {
1148          countItem++;
1149        }
1150        return (countItem);
1151      },
1152    },
1153    mounted: function () {
1154      this.$nextTick(function () {
1155        IRON.sonaar.player.hasPlayed = false;
1156        $("#sonaar-audio").on("ended", function () {
1157          if(IRON.sonaar.player.selectedPlayer){
1158            IRON.setTracksTimeMemories(IRON.sonaar.player.selectedPlayer, 0, true); //Reset the track time memory when the track is ended
1159            IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].hasCompleted = true
1160            IRON.sonaar.player.selectedPlayer.list.tracks[IRON.sonaar.player.currentTrack].hasCompleted = true;
1161          }
1162          if(IRON.repeatStatus !== false){
1163            if( IRON.sonaar.player.repeatStatus === 'track' && IRON.sonaar.player.classes.notrackskip !== "on"){
1164              IRON.sonaar.player.currentTime = 0;
1165              IRON.sonaar.player.playAudio();
1166              return;
1167            }
1168
1169            if(IRON.sonaar.player.currentTrack + 1 >= IRON.sonaar.player.list.tracks.length && IRON.sonaar.player.repeatStatus !== 'playlist'){
1170              return;
1171            }
1172          }
1173
1174          if (IRON.sonaar.player.classes.notrackskip !== "on") {
1175            IRON.sonaar.player.hasPlayed = true;
1176            IRON.sonaar.player.next();
1177          }
1178          
1179        });
1180
1181        $("#sonaar-audio").on("timeupdate", function () {
1182          const duration = (this.duration == 'Infinity')? this.buffered.end(this.buffered.length-1) : this.duration;
1183          $("#sonaar-player .sonaar_wave_cut, .sr_selectedPlayer .album-player .sonaar_wave_cut, .sr_selectedPlayer .current .sonaar_wave_cut, #sonaar-player .mobileProgressing").width(((this.currentTime + 0.35) / duration) * 100 + "%");
1184          $("#sonaar-player .progressDot").css("left", (this.currentTime / duration) * 100 + "%");
1185          var sonaarAudio = document.getElementById("sonaar-audio");
1186          var currentTime = sonaarAudio.currentTime;
1187          var time = moment.duration(currentTime, "seconds");
1188          // Update the Sticky player currentTime
1189          if (time.hours() >= 12 || time.hours() <= 0) {
1190            IRON.sonaar.player.currentTime = moment(time.minutes() + ":" + time.seconds(), "m:s").format("mm:ss");
1191          } else {
1192            IRON.sonaar.player.currentTime = moment(time.hours() + ":" + time.minutes() + ":" + time.seconds(), "h:m:s").format("h:mm:ss");
1193          }
1194
1195          if (sonaarAudio.duration !== Infinity) {
1196            var timeLeft = moment.duration(sonaarAudio.duration - sonaarAudio.currentTime, "seconds");
1197            // Update the Sticky player timeLeft
1198            if(timeLeft.milliseconds() > 0){
1199              if (  timeLeft.hours() >= 12 || timeLeft.hours() <= 0 ) {
1200                IRON.sonaar.player.totalTime = "-" + moment(timeLeft.minutes() + ":" + timeLeft.seconds(), "m:s").format("mm:ss");
1201              } else {
1202                IRON.sonaar.player.totalTime = "-" + moment(timeLeft.hours() + ":" + timeLeft.minutes() + ":" + timeLeft.seconds(), "h:m:s").format("h:mm:ss");
1203              }
1204            }else{
1205              IRON.sonaar.player.totalTime = ""
1206            }
1207          } else {
1208            IRON.sonaar.player.totalTime = "";
1209          }
1210        
1211          IRON.audioPlayer.karaokeMode($(".sr_selectedPlayer"), this.currentTime);
1212          $(".sr_selectedPlayer .currentTime").html(IRON.sonaar.player.currentTime); // Update the widget player currentTime
1213          $(".sr_selectedPlayer .totalTime").html(IRON.sonaar.player.totalTime); // Update the widget player timeLeft
1214          sr_setCookieTime();
1215          if(IRON.sonaar.player.selectedPlayer){
1216            IRON.setTracksTimeMemories(IRON.sonaar.player.selectedPlayer);
1217          }
1218        });
1219
1220        $("#sonaar-audio").on(
1221          "play",
1222          function () {
1223            this.playerStatus = "play";
1224            this.setIsPlaying(true);
1225          }.bind(this)
1226        );
1227
1228        $("#sonaar-audio").on(
1229          "pause",
1230          function () {
1231            this.setIsPlaying(false);
1232            this.userPref.pause = true;
1233          }.bind(this)
1234        );
1235        
1236
1237        this.frequencyData = new Uint8Array(170);
1238        this.setSlideVolume();
1239      });
1240    },
1241    watch: {
1242      currentTrack: function () {
1243        if( typeof this.classes.preventHandleTrackChange != 'undefined' && this.classes.preventHandleTrackChange == true ){
1244          this.classes.preventHandleTrackChange = false; //set preventHandleTrackChange to true if we dont wanna trigger the handleTrackChange function: used for Favorite feature
1245          return;
1246        }
1247
1248        this.handleTrackChange();
1249      },
1250      isPlaying: function () {
1251        this.updatePlayers();
1252      },
1253      minimize: function () {
1254        if (this.classes.continuousPlayer) {
1255          sr_setCookieSettings();
1256        }
1257        this.userPref.minimize = this.minimize;
1258        if (this.minimize) {
1259          $("body").removeClass("continuousPlayer-enable");
1260        } else {
1261          $("body").addClass("continuousPlayer-enable");
1262        }
1263      },
1264    },
1265  }),
1266};
1267if (window.matchMedia('(min-width: 861px)').matches) {
1268  $('#sonaar-player.sr-float .player.sr-draggable').draggable();
1269  $('#sonaar-player.sr-float .player.sr-draggable').css('cursor', 'grab');
1270}
1271
1272/*FLOAT template, extra JQuery*/
1273$('#sonaar-player.sr-float .player.sr-show_controls_hover').hover(function () {
1274  let playerWidth = $(this).outerWidth() + $(this).find('.player-row .control').outerWidth() + $(this).find('.volume').outerWidth();
1275  playerWidth = ($(this).find('.sonaar-extend-button').length) ? playerWidth + $(this).find('.sonaar-extend-button').outerWidth() : playerWidth;
1276  $(this).width(playerWidth);
1277
1278}, function () {
1279  $(this).width(342)
1280});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.