PageSourceSearch

https://paydiverse.com/wp-content/plugins/sonaar-music-pro/public/…/iron-audioplayer.js?ver=5.14

js paydiverse.com collected 2026-10-08 06:40:21 UTC 306,000 bytes, 7,365 lines download raw bytes

1$ = jQuery;
2var elementAudio = document.createElement("audio"); // Object for iOS audio
3elementAudio.crossOrigin = "anonymous";
4
5var elementAudioSingle = document.createElement("audio");
6elementAudioSingle.crossOrigin = "anonymous";
7
8var srp_startingTime = 0; // Used by the sonaar_ts (time stamp) shortcode
9var srp_lyricsAreScrolling = false;
10var myVueAr = [];
11var myVueTag = [];
12var myVueRange = [];
13var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
14var webAudioNotSupported;
15
16IRON.canvasAnimation = [];
17IRON.rangeSelector = [];
18IRON.previousTrackThreshold = 2; //The number of seconds a track must play before the "Previous" button resets the track to the beginning.
19
20sonaar_music.option.tooltip_tracklist_btn = (typeof sonaar_music.option.tooltip_tracklist_btn === 'undefined') ? 'View Tracklist' : sonaar_music.option.tooltip_tracklist_btn;
21sonaar_music.option.tooltip_rwd_btn = (typeof sonaar_music.option.tooltip_rwd_btn === 'undefined') ? 'Rewind 15 seconds' : sonaar_music.option.tooltip_rwd_btn;
22sonaar_music.option.tooltip_prev_btn = (typeof sonaar_music.option.tooltip_prev_btn === 'undefined') ? 'Previous' : sonaar_music.option.tooltip_prev_btn;
23sonaar_music.option.tooltip_play_btn = (typeof sonaar_music.option.tooltip_play_btn === 'undefined') ? 'Play/Pause' : sonaar_music.option.tooltip_play_btn;
24sonaar_music.option.tooltip_next_btn = (typeof sonaar_music.option.tooltip_next_btn === 'undefined') ? 'Next' : sonaar_music.option.tooltip_next_btn;
25sonaar_music.option.tooltip_fwrd_btn = (typeof sonaar_music.option.tooltip_fwrd_btn === 'undefined') ? 'Forward 30 seconds' : sonaar_music.option.tooltip_fwrd_btn;
26sonaar_music.option.tooltip_speed_btn = (typeof sonaar_music.option.tooltip_speed_btn === 'undefined') ? 'Speed Rates' : sonaar_music.option.tooltip_speed_btn;
27sonaar_music.option.tooltip_shuffle_btn = (typeof sonaar_music.option.tooltip_shuffle_btn === 'undefined') ? 'Shuffle' : sonaar_music.option.tooltip_shuffle_btn;
28sonaar_music.option.tooltip_repeat_playlist_btn = (typeof sonaar_music.option.tooltip_repeat_playlist_btn === 'undefined') ? 'Enable Repeat' : sonaar_music.option.tooltip_repeat_playlist_btn;
29sonaar_music.option.tooltip_repeat_track_btn = (typeof sonaar_music.option.tooltip_repeat_track_btn === 'undefined') ? 'Enable Repeat Track' : sonaar_music.option.tooltip_repeat_track_btn;
30sonaar_music.option.tooltip_repeat_disable_btn = (typeof sonaar_music.option.tooltip_repeat_disable_btn === 'undefined') ? 'Disable Repeat' : sonaar_music.option.tooltip_repeat_disable_btn;
31sonaar_music.option.tooltip_volume_btn = (typeof sonaar_music.option.tooltip_volume_btn === 'undefined') ? 'Volume' : sonaar_music.option.tooltip_volume_btn;
32
33// iOS 14 and 15 has a bug when using createMediaElementSource.the audio is distorted. Dont use webaudioapi on these versions. Audio Spectrum wont work with iOS 14 and 15.
34if (iOS) {
35  var iOSVersion;
36  var match = navigator.userAgent.match(/OS (\d+)_(\d+)_?(\d+)?/);
37  iOSVersion = [parseInt(match[1], 10), parseInt(match[2], 10), parseInt(match[3] || 0, 10)];
38  if (iOSVersion[0] < 16) {
39      webAudioNotSupported = true;
40    }
41}
42
43// Set a css varaible for the window height as vh units are not usable on mobile browsers
44IRON.setExtendedPlayerHeightVar = function() {
45  if ( document.getElementById('srp-extendedPlayer-height')) {
46    document.getElementById('srp-extendedPlayer-height').remove();
47  }
48  var windowHeight = window.innerHeight;
49  var styleTag = document.createElement('style');
50  styleTag.id = 'srp-extendedPlayer-height';
51  styleTag.innerHTML = ':root { --srp-extendedPlayer-height: ' + (windowHeight - $('.srp_ext_primary').innerHeight() ) + 'px; }';
52  document.body.appendChild(styleTag);
53}
54
55IRON.setLimitedSizeObject = function(obj, key, value, maxSize) { // Set a new key value pair in an object and limit the object size
56  obj[key] = value;
57  const keys = Object.keys(obj);
58  if (keys.length > maxSize) {
59    const oldestKey = keys[0];
60    delete obj[oldestKey];
61  }
62}
63
64IRON.setTracksTimeMemories = function(audioPlayer, newTime = null, completed = false) { 
65  if(audioPlayer.trackMemory){
66    if( IRON.audioPlayer.stickyEnable && IRON.sonaar.player.waitingAudio ){ // Avoid setting the time memory before the MP3 audio is fully loaded when the sticky player is enabled, to prevent storing an incorrect time.
67      return; 
68    }
69    var time = (newTime != null)? newTime : sr_getTrackCurrentTime(audioPlayer);
70    const $currentTrack = audioPlayer.find('.sr-playlist-item').eq(audioPlayer.currentTrack);
71    var trackDuration = sr_setAudioElementInstance(audioPlayer).duration;
72    trackDuration = isNaN(trackDuration) ? 0 : trackDuration;
73    $currentTrack.data('current-time', time);
74    if (IRON.localStorageTrackMemory[$currentTrack.data('track-memory-key')]?.[2] === true) {
75      completed = true;
76    }
77    IRON.setLimitedSizeObject(IRON.localStorageTrackMemory, $currentTrack.data('track-memory-key'), [time, trackDuration, completed], 50);
78    localStorage.setItem('srp_tracks_memories', JSON.stringify(IRON.localStorageTrackMemory) );
79  }
80}
81
82IRON.fetchThumnbnailsFromItunes = {
83		cachedThumbsArray: [],
84		displayThumbnail: function(img, audioPlayer, track, pos){
85      const $audioPlayer = $(audioPlayer);
86      const $track = $(track);
87      const isFirstTrackAndNotPlaying = pos === 0 && !$audioPlayer.hasClass('audio-playing');
88      const isCurrentTrack = $track.hasClass('current');
89      const showArtwork = $audioPlayer.data('hide-artwork') !== '1' && $audioPlayer.data('hide-artwork') !== 'true';
90      const $albumArtImg = $audioPlayer.find('.album-art img');
91
92			if (img) {
93
94        if (IRON.sonaar.player.list.tracks ) {
95          if(IRON.sonaar.player.selectedPlayer == audioPlayer || !audioPlayer) {
96            IRON.sonaar.player.list.tracks[pos].poster = img;
97          }
98        }
99
100        if (!audioPlayer) return;
101
102        if (isFirstTrackAndNotPlaying || isCurrentTrack) {
103            if (showArtwork) {
104                $audioPlayer.removeClass('sonaar-no-artwork');
105                if ($albumArtImg.length) {
106                    $albumArtImg.attr('src', img);
107                } else {
108                    $audioPlayer.find('.album-art').append('<img src="' + img + '">');
109                }
110                srp_getColorsFromImage(audioPlayer, img);
111            }
112        }
113
114        $track.data('albumart', img); // Save the img in the track data for setMediaSessionAPI
115    
116        if ($audioPlayer.hasClass('show-trackartwork')) {
117            const $trackImg = $track.find('img');
118            if (!$trackImg.length) {
119                $track.prepend($('<img>', { src: img, class: 'sr_track_cover' }));
120            } else {
121                $trackImg.attr('src', img);
122            }
123        }
124    
125       
126      } else {
127        // No img set
128
129        if (IRON.sonaar.player.list.tracks && !IRON.sonaar.player.list.tracks[pos].optional_poster ) {
130          IRON.sonaar.player.list.tracks[pos].poster = '';
131        }
132        
133        if (!audioPlayer) return;
134        if($track.data('optional_poster') != true){
135          if ( isFirstTrackAndNotPlaying || isCurrentTrack ) {
136              $audioPlayer.addClass('sonaar-no-artwork');
137              $audioPlayer.find('.album-art img').remove();
138          }
139          $track.data('albumart', '');
140          if ($track.find('.sr_track_cover').length) {
141              $track.find('.sr_track_cover').remove();
142          }
143        }
144        
145      }
146		},
147		init: function(that, termArray, audioPlayer, track, pos){
148			
149      termArray = termArray.split(' - ').join('-').split(' ').join('+');
150      //termArray='NOFX Linoleum';
151			var thumb; // image from itunes
152			var apiUrl = 'https://itunes.apple.com/search?media=music&entity=song&term='+termArray;
153			if(termArray == 'Song title unavailable' || termArray == 'No Titles Available'){
154				// thumb = $.qtmplayerRadioFeedObj.qtFeedData.cover;
155				that.cachedThumbsArray[termArray] = false;
156				that.displayThumbnail(false, audioPlayer, track, pos);
157				return;
158			}
159			if( undefined === that.cachedThumbsArray[termArray] ) {
160        //console.log("Calling iTunes Search API: ", termArray);
161				$.ajax({
162					type: 'GET',
163					cache: true,
164					url: apiUrl,
165					async: true,
166					context: this,
167          jsonp: false,
168					success: function(json) {
169						if('object' !== typeof( json )){
170							json = JSON.parse(json);
171						}
172						if(json.resultCount > 0){
173
174							thumb = json.results[0].artworkUrl100.split('100x100bb.jpg').join('500x500bb.jpg');
175							that.cachedThumbsArray[termArray] = thumb;
176							that.displayThumbnail(thumb, audioPlayer, track, pos);
177							return;
178						}else{
179              that.cachedThumbsArray[termArray] = false;
180            }
181					}
182				});
183			} else {
184				// return cached image
185				that.displayThumbnail( that.cachedThumbsArray[termArray], audioPlayer, track, pos);
186				return;
187			}
188		},
189}
190
191IRON.getIceCastInfo = function(audioPlayer = false) {
192  function fetchIcecastInfo(data, icecast_mount, track, trackDataPos, audioPlayer) {
193    if (audioPlayer){
194      if (track.data('icecast-error') === 1){
195        return;
196      }
197    }
198    return new Promise(function(resolve, reject) {
199      jQuery.ajax({
200        type: 'GET', 
201        url: data,
202        async: true,
203        dataType: 'json',
204        jsonp: false,
205        success: function(json) {
206          var resultArray = [];
207          var title = '';
208          var artist = '';
209          var artwork = '';
210          var server_name = '';
211          if('object' === typeof( json )){
212
213          
214           if (json.hasOwnProperty('id')) {
215              // Handle the specific JSON structure
216              if(json['title']){
217                title = json['title'];
218              }
219              
220              if(json['artist']){
221                artist = json['artist'];
222              }
223
224              if(json['cover']){
225                artwork = json['cover'];
226              }
227              
228            } else if (json.hasOwnProperty('current_track')){
229              // radio.co
230              if(json.current_track.title){
231                title = json.current_track.title;
232              }              
233              if(json.current_track.artist){
234                artist = json.current_track.artist;
235              }
236              if(json.current_track.artwork_url){
237                artwork = json.current_track.artwork_url;
238              }
239              if(json.current_track.artwork_url_large){
240                artwork = json.current_track.artwork_url_large;
241              }
242
243            } else if (icecast_mount !== '') {
244              // based on https://stream.p-node.org/json.xsl
245              var source = json.mounts[icecast_mount];
246              title = source['title'];
247              if(source['artist']){
248                artist = source['artist'];
249              }
250              if(source['server_name']){
251                server_name = source['server_name'];
252              }
253            } else if (json.hasOwnProperty('now_playing')) {
254              // Handle Azuracast radio
255              title = json.now_playing.song.title;
256              artist = json.now_playing.song.artist;
257              artwork = json.now_playing.song.art;
258              server_name = json.station.name;
259            }  else if (json.hasOwnProperty('nowplaying')) {
260              // Handle Citrus Stream
261              title = json.nowplaying;
262              artwork = json.coverart || artwork;
263            } else if (json.hasOwnProperty('icestats')) {
264              var source = json.icestats.source;
265              if('undefined' === typeof(source)){ return; }
266              if(source[0]){
267                title = source[0]['title'];
268                if(source[0]['artist']){
269                  artist = source[0]['artist'];
270                }
271                if(source[0]['server_name']){
272                  server_name = source[0]['server_name'];
273                }
274              } else if( source['title'] ){
275                title = source['title'];
276                if(source['artist']){
277                  artist = source['artist'];
278                }
279                if(source['server_name']){
280                  server_name = source['server_name'];
281                }
282              }
283            } else if (json.hasOwnProperty('data')) {
284              // from https://public.radio.co/api/v2
285              var data = json.data;
286              
287              if('undefined' !== typeof(data.track_title)){ 
288                title = data.track_title;
289              }
290              if('undefined' !== typeof(data.track_artist)){ 
291                artist = data.track_artist;
292              }
293              if('undefined' !== typeof(data.artwork_urls)){ 
294                artwork = data.artwork_urls.large;
295              }
296              if('undefined' !== typeof(data.title)){ 
297                server_name = data.title;
298              }
299            } else if (json.hasOwnProperty('current')) { //airtime.pro
300              var data = json.current;
301              if('undefined' !== typeof(data.name)){ 
302                title = data.name;
303                server_name = data.name;
304              }
305              if('undefined' !== typeof(data.album_artwork_image)){ 
306                artwork = data.album_artwork_image;
307              }
308              if('object' === typeof(data.metadata)){ 
309                if('undefined' !== typeof(data.metadata.track_title)){ 
310                  title = data.metadata.track_title;
311                }
312                if('undefined' !== typeof(data.metadata.artist_name)){ 
313                artist = data.metadata.artist_name;
314                }
315                if('undefined' !== typeof(data.metadata.radio_station_name)){ 
316                  server_name = data.metadata.radio_station_name;
317                }
318              }
319            } 
320          } else if('array' === typeof( json )){
321            if(icecast_mount !== '') {
322              if("undefined" !== typeof( json[icecast_mount]) ){
323                title = json[icecast_mount]['title'];
324              } else if( "undefined" !== typeof( json['source'][icecast_mount] ) ){
325                title = json['source'][icecast_mount]['title'];
326              }
327            } else if(json['icestats']['source']['title']){
328              title = (json['icestats']['source']['title']);
329              if(json['icestats']['source']['artist']){
330                artist = json['icestats']['source']['artist'];
331              }
332              if(json['icestats']['source']['server_name']){
333                server_name = json['icestats']['source']['server_name'];
334              }
335            } else if(json['icestats']['source'][0]['title']){
336              title = (json['icestats']['source'][0]['title']);
337              if(json['icestats']['source']['artist']){
338                artist = json['icestats']['source']['artist'];
339              }
340              if(json['icestats']['source']['server_name']){
341                server_name = json['icestats']['source']['server_name'];
342              }
343            }
344          }
345          //title = "Em & Katie - Date Night Collective"; //test...should display an image from itunes
346          //artwork = '';
347          resultArray['title'] = title;
348          resultArray['artist'] = artist;
349          resultArray['server_name'] = server_name;
350          resultArray['artwork'] = artwork;
351          printResult(resultArray, track, trackDataPos);
352        },
353        error: function(xhr, status, error) {
354
355          if(audioPlayer){
356            audioPlayer.icecastLoaded = true;
357            track.data('icecast-error', 1);
358            $(track).find('.tracklist-item-title').text(track.originalText);
359            
360          }
361          setOriginalTracksonSticky(trackDataPos);
362        }
363      });
364    });
365  }
366  function printResult(result, track, trackDataPos){
367    
368    lookfortitle = result['title'].replace(result['server_name'], '');
369    if(result['artwork'] !== ''){
370      // there is an image set in the JSON so we use it instead of the iTunes API
371      IRON.fetchThumnbnailsFromItunes.displayThumbnail(result['artwork'], audioPlayer, track, trackDataPos);
372    }else{
373      IRON.fetchThumnbnailsFromItunes.init(IRON.fetchThumnbnailsFromItunes, lookfortitle, audioPlayer, track, trackDataPos);
374    }
375    setStickyTracks(result, trackDataPos);
376
377    if(sonaar_music.option.show_artist_name === "on"){
378      artist_string = (result['artist']) ? '<span class="srp_trackartist"> ' + sonaar_music.option.artist_separator + ' ' + result['artist'] + '</span>': '';
379      result['title'] = result['title'] + artist_string;
380    }
381    if(audioPlayer){
382      audioPlayer.icecastLoaded = true;
383      if(trackDataPos == 0 && !$(audioPlayer).find('.playlist li.current').length){
384        $(audioPlayer).find('.sr_it-playlist-title').text(result['server_name']);
385        $(audioPlayer).find('.album-title').text(result['server_name']);
386        $(audioPlayer).find('.track-title').html(result['title']);
387      }
388
389      if ($(audioPlayer).find('.playlist li').length == 1) {
390        $(audioPlayer).find('.album-title').text(result['server_name']);
391        $(audioPlayer).find('.srp_player_boxed .album-title').html(result['title']);  //Yes, we show the track title in the album-title field in this case
392        $(audioPlayer).find('.track-title').html(result['title']);
393      } else {
394        if($(track).hasClass('current')){
395          $(audioPlayer).find('.sr_it-playlist-title').text(result['server_name']);
396          $(audioPlayer).find('.album-title').text(result['server_name']);
397          $(audioPlayer).find('.track-title').html(result['title']);
398        }
399      }
400      $(track).find('.tracklist-item-title').html(result['title']);
401    
402    }
403  }
404  function startICInterval(audioPlayer = false){
405
406    if (this.icecastInterval) {
407      clearInterval(this.icecastInterval);
408      this.icecastInterval = null;
409    }
410
411    //start audioplayer interval to fetch every 15 seconds
412      this.icecastInterval = setInterval(function() {
413      IRON.getIceCastInfo(audioPlayer);
414    }, 15000);
415
416  }
417  function convertTrackURLtoJson(url){
418    let parsedUrl = new URL(url);
419    url = parsedUrl.origin + parsedUrl.pathname.replace(/\/[^/]*$/, "/status-json.xsl");
420    return url;
421  }
422  function setLoadStatus(pos, track = null, audioPlayer){
423      if (IRON.sonaar.player.list.tracks && !IRON.sonaar.player.icecastLoaded) {
424        if(typeof IRON.sonaar.player.list.tracks[pos] !== 'undefined'){
425          IRON.sonaar.player.list.tracks[pos].trackTitleOriginalText =  IRON.sonaar.player.list.tracks[pos].track_title;
426          IRON.sonaar.player.list.tracks[pos].albumTitleOriginalText =  IRON.sonaar.player.list.tracks[pos].album_title;
427          IRON.sonaar.player.list.tracks[pos].track_title = 'Retrieving info...';
428          IRON.sonaar.player.list.tracks[pos].album_title = 'Retrieving info...';
429        }
430      }
431      if(audioPlayer){
432        if(!audioPlayer.icecastLoaded){
433          track.originalText = $(track).find('.tracklist-item-title').text();
434          $(track).find('.tracklist-item-title').text('Retrieving info...');
435        }
436      }
437  }
438  function setStickyTracks(result, pos){
439      if (IRON.sonaar.player.list.tracks && typeof IRON.sonaar.player.list.tracks[pos] !== 'undefined') {
440        if(IRON.sonaar.player.selectedPlayer == audioPlayer || !audioPlayer) { // make sure the sticky is related to the current player widget selected.
441          IRON.sonaar.player.icecastLoaded = true;
442          IRON.sonaar.player.list.tracks[pos].track_title = result['title'];
443          IRON.sonaar.player.list.tracks[pos].album_title = result['server_name'];
444          if(result['artist']){
445            IRON.sonaar.player.list.tracks[pos].track_artist = result['artist'];
446          }
447        }
448      }
449    
450  }
451  function setOriginalTracksonSticky(pos){
452    if (IRON.sonaar.player.list.tracks) {
453      IRON.sonaar.player.icecastLoaded = true;
454      IRON.sonaar.player.list.tracks[pos].track_title = IRON.sonaar.player.list.tracks[pos].trackTitleOriginalText;
455      IRON.sonaar.player.list.tracks[pos].album_title = IRON.sonaar.player.list.tracks[pos].albumTitleOriginalText;
456    }        
457  }
458
459  if(!audioPlayer){
460    IRON.sonaar.player.list.tracks.forEach(function(track) {
461      if (!track.icecast_json) {
462        return;
463      }
464      const icecast_mount = (track.icecast_mount == false) ? '' : track.icecast_mount;
465      const jsonFile = track.icecast_json;
466      if (jsonFile) {
467        const trackDataPos = track.track_pos;
468        setLoadStatus(trackDataPos, track, audioPlayer);
469        fetchIcecastInfo(jsonFile, icecast_mount, track, trackDataPos, audioPlayer);
470      }
471    });
472  }
473
474  if(audioPlayer){
475    const playlistItems = $(audioPlayer).find('.playlist li[data-icecast_json!=""]');
476    playlistItems.each(function() {
477      const jsonFile = $(this).data('icecast_json');
478      if (jsonFile) {
479        const track = $(this);
480        const trackDataPos = $(this).index();
481        const icecast_mount = $(this).data('icecast_mount')
482        setLoadStatus(trackDataPos, track, audioPlayer);
483        fetchIcecastInfo(jsonFile, icecast_mount, track, trackDataPos, audioPlayer);
484      }
485    });
486  }
487  
488  startICInterval(audioPlayer);
489
490}
491function startAudioSpectrum( audioPlayer, location = false, restart = false ){
492
493  if( audioPlayer == null ) return;
494  // Check if is the sticky player spectrum
495  let isStickyPlayer ;
496  if( audioPlayer == '#sonaar-player' ){
497    isStickyPlayer = true;
498    audioPlayer = $('#sonaar-player');
499  }else{
500    isStickyPlayer = false;
501  }
502
503
504  if(! audioPlayer.hasClass('srp_player_spectrum') && !isStickyPlayer){ //Exit if spectrum is not enabled
505    return;
506  }
507
508
509  if(  // Avoid to start the spectrum before user gesture when continuous player is enabled
510    webAudioNotSupported ||  
511    isStickyPlayer && //If the spectrum is from the sticky
512    IRON.audioPlayer.stickyEnable && // If the sticky is enabled
513    document.getElementById("sonaar-audio").paused //if the player is not playing yet  
514    ){
515    return;
516  }
517  var player;
518  // Create spectrum container
519  const container = document.createElement('div');
520  container.className = 'srp_spectrum_container srp_hidden';
521
522  //SET SPECTRUM CANVAS LOCATION
523  const playerNum = srp_convertPlayerIdToPlayerNum(audioPlayer.attr('id'));
524  if(playerNum){
525    audioPlayer = IRON.players[playerNum].audioPlayer; // Get the audio player from the IRON.players array to reach audioPlayer attributes Eq:"adaptiveColors"
526  }
527  audioPlayer.spectrumAnimation = true;
528  IRON.sonaar.spectrumAnimation = true;
529
530  if( 
531    ! IRON.audioPlayer.stickyEnable && isStickyPlayer || // If the sticky is disabled and the spectrum is from the sticky
532    ! isStickyPlayer && playerNum == null //return if the player is not found
533    ){ 
534    return;
535  }
536
537  if(isStickyPlayer){
538    if(sonaar_music.option.sticky_spectro_responsive === 'hide_tablet'){
539      audioPlayer.addClass('srp_hide_spectro_tablet');
540      audioPlayer.addClass('srp_hide_spectro_mobile');
541    }else if(sonaar_music.option.sticky_spectro_responsive === 'hide_mobile'){
542      audioPlayer.addClass('srp_hide_spectro_mobile');
543    }
544  }
545
546  if( 
547    window.matchMedia("(max-width: 768px)").matches && audioPlayer.hasClass('srp_hide_spectro_tablet') || //Disable on tablet enabled
548    window.matchMedia("(max-width: 480px)").matches && audioPlayer.hasClass('srp_hide_spectro_mobile') //Disable on Mobile enabled
549  ){
550    if(isStickyPlayer){
551      IRON.sonaar.spectrumAnimation = false;
552    }
553
554    audioPlayer.spectrumAnimation = false;
555
556    return;
557  }
558
559  // spectro ="color1:#FF0064|color2:#0073FF|shadow:|barCount:500|barWidth:10|barGap:1|canvasHeight:100|halign:center|valign:bottom|spectroStyle:bars|sharpFx:|reflectFx:|gradientDirection:vertical|enableOnTracklist:|bounceClass:.control, .menu-item-1273, .elementor-element-377841ec|bounceVibrance:58|bounceBlur:true"
560  const spectro = (IRON.sonaar.player.selectedPlayer != null)? IRON.sonaar.player.selectedPlayer.data("spectro"): audioPlayer.data("spectro");
561  const spectroValues = ( typeof spectro === 'string') ?  spectro.split('|').reduce((obj, item) => {
562    const parts = item.split(':');
563    obj[parts[0]] = !isNaN(parts[1]) && parts[1] !== "" ? parseInt(parts[1]) : parts[1];
564    return obj;
565  }, {}) : false;
566  if(spectroValues['color1'] == '' && spectroValues['color2'] != ''){
567    spectroValues['color1'] = spectroValues['color2'];
568    spectroValues['color2'] = '';
569  }
570
571  if (isStickyPlayer){
572    if(IRON.sonaar.player.selectedPlayer != null && IRON.sonaar.player.selectedPlayer.adaptiveColors){
573      var color1 = (spectroValues['color1'] == '')? 'rgba(0,0,0,0)' : spectroValues['color1'];// Set transparent color as default color if adaptive colors is enabled so the spectrum will be transparent until adaptive colors is applied
574    }else{
575      var color1 = sonaar_music.option.sticky_spectro_color1 || false;
576    }
577    var color2 = (IRON.sonaar.player.selectedPlayer != null && IRON.sonaar.player.selectedPlayer.adaptiveColors)? spectroValues['color2'] : sonaar_music.option.sticky_spectro_color2 || false; // Set transparent color as default color if adaptive colors is enabled so the spectrum will be transparent until adaptive colors is applied
578    var barCount = parseInt(sonaar_music.option.sticky_spectro_barcount) || 60;
579    var barWidth = parseInt(sonaar_music.option.sticky_spectro_barwidth) || 4;
580    var barGap = sonaar_music.option.sticky_spectro_bargap !== undefined && sonaar_music.option.sticky_spectro_bargap !== null ? parseInt(sonaar_music.option.sticky_spectro_bargap) : 2;
581    var canvasHeight = sonaar_music.option.sticky_spectro_canvasheight || 70;
582    var barsAlignment = sonaar_music.option.sticky_spectro_halign || 'left';
583    var barsVerticalAlignment = sonaar_music.option.sticky_spectro_valign || 'bottom';
584    var spectroStyle = sonaar_music.option.sticky_spectro_style || 'bars';
585    var blockPointu = (sonaar_music.option.sticky_spectro_sharpends === "true") ? true : false;
586    var shockWaveVibrance = parseInt(sonaar_music.option.sticky_spectro_vibrance) || 40;
587    var blockHeight = parseInt(sonaar_music.option.sticky_spectro_blocheight) || 2;
588    var blockGap = parseInt(sonaar_music.option.sticky_spectro_blockgap) || 2;
589    var spectroReflect = (sonaar_music.option.sticky_spectro_reflect === "true") ? true : false;
590    var spectroShadow = (sonaar_music.option.sticky_spectro_shadow === "true") ? true : false;
591    var spectroGradientDir = sonaar_music.option.sticky_spectro_gradientdir || 'vertical';
592    var stickyContainer = sonaar_music.option.sticky_spectro_container || 'inside';
593    var stickyPosBottom = sonaar_music.option.sticky_spectro_posbottom || '50';
594    var stickyPosLeft = sonaar_music.option.sticky_spectro_posleft || '0';
595    var mobileStickyPosBottom = sonaar_music.option.mobile_sticky_spectro_posbottom || '10';
596    var mobileStickyPosLeft = sonaar_music.option.mobile_sticky_spectro_posleft || '0';
597    var tracklistSpectrum = false;
598  }else{
599    var color1 = spectroValues['color1'] || false;
600    var color2 = spectroValues['color2'] || false;
601    var spectroShadow = (spectroValues['shadow'] !== "true") ? false : true;
602    var barCount = spectroValues['barCount'] || 60;
603    var barWidth = spectroValues['barWidth'] || 4;
604    var barGap = spectroValues['barGap'] || 2;
605    var canvasHeight = spectroValues['canvasHeight'] || 100;
606    var barsAlignment = spectroValues['halign'] || 'left';
607    var barsVerticalAlignment = spectroValues['valign'] || 'bottom';
608    var spectroStyle = spectroValues['spectroStyle'] || 'bars';
609    var blockPointu = spectroValues['sharpFx'] || false;
610    var shockWaveVibrance = spectroValues['shockwaveVibrance']/100 || 0.4;
611    var blockHeight = spectroValues['blockHeight'] || '2';
612    var blockGap = spectroValues['blockGap'] || '2';
613    var spectroReflect = spectroValues['reflectFx'] || false;
614    var spectroGradientDir = spectroValues['gradientDirection'] || 'vertical';
615    var tracklistSpectrum = spectroValues['enableOnTracklist'] || false;
616    var selectors = spectroValues['bounceClass'] || false;
617    var selectorMaxScale = spectroValues['bounceVibrance'] || 100;
618    var selectorBlur = spectroValues['bounceBlur'] || false;
619  }
620  if (selectors){
621      selectors = selectors.split(',');
622      selectors = selectors.map((val) => val.trim());
623  }
624  spectroReflect = ( spectroReflect == 'false' ||  spectroReflect == '' ) ? false : true;
625  audioPlayer.spectroReflect = spectroReflect;
626  tracklistSpectrum = ( tracklistSpectrum == 'true' ) ? true : false;
627  tracklistSpectrum = ( audioPlayer != '#sonaar-player' )? tracklistSpectrum : false;  
628  if( playerNum != null && !audioPlayer.parents('.playlist_enabled').length && tracklistSpectrum){
629    return;
630  }  
631  const pixelFx = (spectroStyle === 'bricks') ? true : false;
632
633  if( !location && playerNum != null && !tracklistSpectrum || !location && playerNum != null && tracklistSpectrum && $(audioPlayer).filter('.show-playlist').length == 0){
634    location = (audioPlayer.find('.srp_spectrum_box').length)? audioPlayer.find('.srp_spectrum_box') : audioPlayer.find('.player');
635  }else if( !location && playerNum != null && tracklistSpectrum ){
636    location = audioPlayer.find('.sr-playlist-item.current .tracklist-item-title');
637  }else{
638    if(isStickyPlayer){
639      if (stickyContainer === "outside"){
640        location = ( IRON.sonaar.player.isSmallDevice )? audioPlayer.find('.srp_extendedPlayer .sr_progressbar_sticky') : audioPlayer;   
641
642      }else{
643        location =  audioPlayer.find('#sPlayer');   
644      }
645    }else{
646
647    location = audioPlayer;
648    }
649  }
650
651  var totalWidth = (barWidth + barGap) * barCount;
652
653  //CANVAS CREATION
654  let canvas;
655  let idIndex = (playerNum != null)? '-' + playerNum : '';
656  let trackIndex = audioPlayer.find('.sr-playlist-item.current').index();
657  idIndex = ( tracklistSpectrum && audioPlayer.find('.sr-playlist-item.current').length )? idIndex + '-' + trackIndex : idIndex ;
658  idIndex = (isStickyPlayer)? '-sticky' : idIndex ;
659
660  const canvasId = 'srp_spectrum' + idIndex;
661  if( $( '#' + canvasId ).length ){
662    canvas = $('#' + canvasId)[0];
663  }else{
664    canvas = document.createElement('canvas');
665    location.prepend(container);
666
667    canvas.id = canvasId;
668 
669    canvas.classList = 'srp_spectrum';
670    container.appendChild(canvas);
671  } 
672  const ctx = canvas.getContext('2d');
673
674if(isStickyPlayer){
675  if (stickyContainer === "outside"){
676    $('#sonaar-player .srp_spectrum_container').css('bottom', stickyPosBottom + 'px').css('left', stickyPosLeft + 'px');
677    $('#sonaar-player .srp_extendedPlayer .srp_spectrum_container').css('bottom', mobileStickyPosBottom + 'px').css('left', mobileStickyPosLeft + 'px');
678  }else{
679    audioPlayer.find('.mobileProgress').css('display', 'block');
680    audioPlayer.find('wave').css('display', 'none');
681    audioPlayer.find('.sonaar_wave_cut').css('display', 'none');
682    audioPlayer.find('.sonaar_wave_base').css('display', 'none');
683  }
684}
685if(spectroStyle == 'selectors'){
686  audioPlayer.find('.srp_spectrum_container').css('display', 'none');
687}
688
689let maxCanvasWidth = location.width();
690if(
691  tracklistSpectrum && //If tracklist spectrum is enabled
692  $(audioPlayer).hasClass('srp_tracklist_grid') && //If tracklist is grid
693  audioPlayer.find('.srp_spectrum_container').length && window.getComputedStyle( audioPlayer.find('.srp_spectrum_container')[0] ).getPropertyValue("position") == 'absolute' //If spectrum is set to absolute position
694){
695  maxCanvasWidth = 999999;
696}
697
698  totalWidth = totalWidth > maxCanvasWidth ? maxCanvasWidth : totalWidth;
699  if((barWidth + barGap) * barCount > maxCanvasWidth){
700    barsAlignment = 'left';
701  }
702  canvas.width = totalWidth;
703  canvas.height = canvasHeight;
704  container.style.height = canvasHeight + 'px';
705
706  audioPlayer.spectrumColor1 = color1;
707  audioPlayer.spectrumColor2 = color2;
708
709  if(audioPlayer.adaptiveColors && !color2 ){
710    color2 = (color1 === false)? audioPlayer.paletteColorsHex[0]: false;
711    audioPlayer.spectrumColor2 = false;
712  }
713
714  if(audioPlayer.adaptiveColors && !color1){
715    color1 = audioPlayer.paletteColorsHex[1];
716    audioPlayer.spectrumColor1 = false;
717  }
718
719  if (color2) {
720    // make the spectrum gradient colorized!
721    if (spectroGradientDir === 'vertical'){
722      var gradient = ctx.createLinearGradient(0, 0, 0, canvasHeight); // vertical
723    }else{
724      const startPos = barsAlignment === 'left' ? 1 * (barWidth + barGap) : (canvas.width / 2) - ((barCount * (barWidth + barGap)) / 2) + (1 * (barWidth + barGap)) + (barGap/2);
725      var gradient = ctx.createLinearGradient(startPos, 0, totalWidth+startPos, 0); // horizontal
726    }
727    gradient.addColorStop(0.25, color1);
728    gradient.addColorStop(1, color2);
729  }
730  if (color1){
731    spectrumColor = color1;
732  }else{
733    // make a rainbow gradient without any dynamic values
734    var gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
735    var hues = [0, 60, 120, 180, 240, 300, 360];
736    hues.forEach(function(hue, i) {
737        gradient.addColorStop(i/hues.length, 'hsl(' + hue + ', 100%, 50%)');
738    });
739    spectrumColor = gradient;
740
741    //define a default color1 for the spectroReflect below because its not defined yet
742    color1 = '#ffffff';
743  }
744
745  
746 // barsVerticalAlignment = 'middle';
747  if (spectroReflect){
748      barsVerticalAlignment = 'middle';
749      srp_spectroReflect(ctx, canvas, 2.5, color1, color2 );
750      ctx.lineWidth = barWidth;
751  }else{
752    if(color2 || spectroReflect){
753      spectrumColor = gradient;
754    }
755
756    ctx.strokeStyle = spectrumColor;
757    ctx.fillStyle = spectrumColor;
758    ctx.imageSmoothingEnabled = true;
759    ctx.lineWidth = barWidth;
760  }
761
762  if(spectroShadow){
763    ctx.shadowColor = color1;
764    ctx.shadowBlur = 10;
765  }
766  
767  if(restart){
768    initRenderFrame();
769    return;
770  }
771
772  //GET THE MEDIA ELEMENT
773  if(IRON.audioPlayer.stickyEnable){
774    if (typeof myaudioElement !== 'undefined'){
775      initRenderFrame();
776      return;
777    } 
778    myaudioElement = document.getElementById('sonaar-audio')
779  }else{
780    if (typeof IRON.players[playerNum].audioElement !== 'undefined'){
781      IRON.players[playerNum].audioElement = audioPlayer.find('audio')[0];
782      initRenderFrame();
783      return; 
784    }
785    IRON.players[playerNum].audioElement = audioPlayer.find('audio')[0];
786    myaudioElement = IRON.players[playerNum].audioElement;
787  }
788
789  myaudioElement.crossOrigin = 'anonymous'
790
791  //SET THE MEDIA ELEMENT AS THE SOURCE OF THE AUDIO CONTEXT AND CONNECT IT TO THE ANALYSER
792  var sonaarAudioContext = new AudioContext();
793  sonaarAudioContext.onstatechange = function() {
794    if (sonaarAudioContext.state === 'suspended' || sonaarAudioContext.state === 'interrupted') { // Fix iOS Lockscreen issue
795      sonaarAudioContext.resume();
796    }
797  };
798  var analyser;
799
800  player = IRON.audioPlayer.stickyEnable ? IRON.sonaar.player : IRON.players[playerNum];
801  player.sonaarAnalyser = sonaarAudioContext.createAnalyser();
802  analyser = player.sonaarAnalyser;
803  
804  var sonaarTrack = sonaarAudioContext.createMediaElementSource(myaudioElement);  
805  sonaarTrack.connect(analyser)
806  sonaarTrack.connect(sonaarAudioContext.destination)
807
808  function initRenderFrame() {
809    var frameAnimationCount = 0;
810    player = IRON.audioPlayer.stickyEnable ? IRON.sonaar.player : IRON.players[playerNum];
811    setTimeout(function(){
812      $( '#' + canvasId ).parents('.srp_spectrum_container').removeClass('srp_hidden');
813    }, 450);
814    function renderFrame() {
815      const frequencyBinCount = 1024;
816      let data = new Uint8Array(frequencyBinCount);
817      player.sonaarAnalyser.frequencyBinCount = frequencyBinCount;
818
819
820      const canvasAnimation = requestAnimationFrame(renderFrame);
821     
822      if (spectroStyle !== 'string' && spectroStyle !== 'selectors') {
823        player.sonaarAnalyser.getByteFrequencyData(data);
824      } else {
825        player.sonaarAnalyser.getByteTimeDomainData(data);
826      }
827
828      ctx.clearRect(0, 0, canvas.width, canvas.height);
829      ctx.save();
830      ctx.beginPath();
831      ctx.rect(0, 0, canvas.width, canvas.height);
832      ctx.clip();
833     
834    function scaleElements(data){
835      // Function to scale the elements based on the frequency
836
837      if (!selectors) return;
838
839      for ( j = 0; j < selectors.length; j++) {
840        let minOriginalScale;
841        let maxScalePercent = selectorMaxScale; // adjust this value to control the maximum scale amount (10-100)
842        let maxScale = 1 + (maxScalePercent / 100) * 0.2; // Calculate the maximum scale based on the percentage 1.12
843
844        let originalScaleAmount = data[0];
845        
846        if(spectroStyle=='string' || spectroStyle=='selectors'){
847          minOriginalScale = 128; // depending the spectro, they dont output the same frequency range so we need to adjust the minimum scale
848        }else{
849          minOriginalScale = 0;
850        }
851        let maxOriginalScale = 200;
852        let minDesiredScale = 1;
853        let maxDesiredScale = maxScale;
854        let desiredScaleAmount = minDesiredScale + (originalScaleAmount - minOriginalScale) * (maxDesiredScale - minDesiredScale) / (maxOriginalScale - minOriginalScale);
855
856        let newTransform = "scale(" + desiredScaleAmount + ")";
857        document.querySelector(selectors[j]).style.transform = newTransform;
858        
859        if (selectorBlur === 'true'){
860          let maxBlur = 1.1; // adjust this value to control the maximum blur amount
861          let blurAmount = data[0] / 128 * maxBlur;
862          if(data[0] < 129) {
863            document.querySelector(selectors[j]).style.filter = 'blur(0px)';
864          }else{
865          document.querySelector(selectors[j]).style.filter = `blur(${blurAmount}px)`;
866        }
867        }
868      }
869
870    }
871      
872    scaleElements(data)
873
874     if(spectroStyle === 'string'){
875        /* 
876        //
877        // START OF STRINGGG SOUNDWAVE STYLE
878        //
879        */
880        let vibration = 0.06 // adjust this value to control the amount of smoothing
881        let previousX = 0; // keep track of the previous x value
882        let previousY = (data[0] / 128) * canvas.height / 2; // keep track of the previous y value
883        ctx.beginPath();
884        
885        ctx.lineWidth = barWidth;
886
887        for(let i = 0; i < frequencyBinCount; i++) {
888            let x = i / frequencyBinCount * canvas.width;
889            let y = (data[i] / 128) * canvas.height / 2;
890            x = previousX + vibration * (x - previousX); // apply exponential moving average to x
891            y = previousY + vibration * (y - previousY); // apply exponential moving average to y
892            previousX = x;
893            previousY = y;
894
895            if(i === 0) {
896                ctx.moveTo(x, y);
897            } else {
898                ctx.lineTo(x, y);
899            }
900        }
901        ctx.stroke();
902     
903      }
904
905      
906      if (spectroStyle === 'bars' || spectroStyle === 'bricks') {
907        /* 
908        //
909        // START OF BARS/BRICKS SOUNDWAVE STYLE
910        //
911        */
912        for (let i = 0; i < barCount; i++) {  
913          const amplitude = data[i];
914          const percent = (pixelFx && barsVerticalAlignment !== 'middle' ) ? amplitude / 128 : amplitude / 256;
915          const height = canvas.height * percent;
916          if (barsVerticalAlignment === 'bottom') {
917            var offset = (pixelFx) ? canvas.height : canvas.height - height - 1;
918          } else if (barsVerticalAlignment === 'middle') {
919            var offset = (pixelFx) ? canvas.height/2 : (canvas.height - height) / 2;;
920          } else {
921            var offset = 0;
922          }
923
924          if (barsAlignment === 'left') {
925            var barX = i * (barWidth + barGap);
926          } else if (barsAlignment === 'right') {
927            var barX = canvas.width - ((barCount - i) * (barWidth + barGap)) - barWidth;
928          } else {
929            var barX = (canvas.width / 2) - ((barCount * (barWidth + barGap)) / 2) + (i * (barWidth + barGap));
930          }
931          
932          if (pixelFx){
933            blockHeight = blockHeight;
934            for (let j = 0; j < height/2; j += blockHeight+blockGap) {
935              const dotSize = (blockPointu) ? barWidth - (j * (barWidth / (height/2))) : barWidth;
936              if(barsVerticalAlignment === 'bottom'){
937                  
938                      ctx.fillRect(barX + (barWidth / 2) - (dotSize / 2), offset - j - blockHeight - blockGap, dotSize, blockHeight);
939                  
940              }else{
941                
942                      ctx.fillRect(barX + (barWidth / 2) - (dotSize / 2), offset + j, dotSize, blockHeight);
943                      ctx.fillRect(barX + (barWidth / 2) - (dotSize / 2), offset - j - blockHeight - blockGap, dotSize, blockHeight);
944                  
945              }
946
947            }
948
949          }else{
950            ctx.fillRect(barX, offset, barWidth, height);
951          }
952        }
953      } else if (spectroStyle === 'shockwave') {
954          /* 
955          //
956          // START OF Shockwave style
957          //
958          */
959          let maxAmplitude = Math.max(...data);
960          let amplitudeFactor = canvas.height / (2 * maxAmplitude) *10;
961          ctx.beginPath();
962          ctx.moveTo(0, canvas.height/2);
963          for (let i = 0; i < frequencyBinCount; i++) {
964              const amplitude = data[i];
965              const y = canvas.height/2 + (amplitude * amplitudeFactor) * 0.1 * Math.sin(i * shockWaveVibrance );
966              ctx.lineTo(i, y);
967          
968          }
969          ctx.stroke();
970      }
971
972      // Hide and Stop the animation according to the plugin sticky player settings
973      if(isStickyPlayer &&  !IRON.sonaar.spectrumAnimation){
974        audioPlayer.find('.srp_spectrum_container').addClass('srp_hidden');
975        IRON.canvasAnimation = IRON.canvasAnimation.filter(function(el) {
976          return el !== canvas.id;
977        });
978        cancelAnimationFrame(canvasAnimation)
979       }
980
981      if( ! isStickyPlayer && $('.iron-audioplayer').length && (
982          (! audioPlayer.hasClass('sr_selectedPlayer') && IRON.audioPlayer.stickyEnable) ||
983          (! audioPlayer.hasClass('sr_selected') && !IRON.audioPlayer.stickyEnable) ||
984          (tracklistSpectrum && trackIndex >= 0 && audioPlayer.find('.sr-playlist-item.current').index() >= 0 && trackIndex != audioPlayer.find('.sr-playlist-item.current').index()) ||
985          ! audioPlayer.spectrumAnimation ||
986          ! $('#' + audioPlayer.attr('id') ).length // if the player is removed from the DOM
987        )
988      ){
989        if(tracklistSpectrum){
990          audioPlayer.find('.sr-playlist-item').eq(trackIndex).find('.srp_spectrum_container').addClass('srp_hidden')
991        }else{
992          audioPlayer.find('.srp_spectrum_container').addClass('srp_hidden');
993        }
994        
995        IRON.canvasAnimation = IRON.canvasAnimation.filter(function(el) {
996          return el !== canvas.id;
997        });
998        cancelAnimationFrame(canvasAnimation)
999      }
1000  
1001      if ( myaudioElement.paused ) {//if media is paused during the animation during 50 frames, stop the animation
1002        frameAnimationCount++;
1003        if ( frameAnimationCount > 50 ) {
1004          if (myaudioElement.paused) {
1005            IRON.canvasAnimation = IRON.canvasAnimation.filter(function(el) {
1006              return el !== canvas.id;
1007            });
1008            cancelAnimationFrame(canvasAnimation);
1009          }
1010          frameAnimationCount = 0;
1011        }
1012      }
1013    }
1014
1015    if (! IRON.canvasAnimation.includes(canvas.id) ) {
1016      IRON.canvasAnimation.push(canvas.id);
1017      renderFrame();
1018    }
1019    
1020  }
1021
1022  ctx.restore();
1023  initRenderFrame();
1024}
1025
1026function srp_spectroReflect(ctx, canvas, gapDistance, color1, color2 ){
1027
1028  let objectHeight = canvas.height; // height of the object
1029  let colorStop1 = (gapDistance / objectHeight) + 0.5;
1030  var gradient = ctx.createLinearGradient(0, 0, 0, canvas.height); // vertical
1031  gradient.addColorStop(0, color1);
1032  if (color2) {
1033      gradient.addColorStop(0.5, color2);
1034      gradient.addColorStop(0.5, srp_parseColor(color2, 0));
1035      gradient.addColorStop(colorStop1, srp_parseColor(color2, 0));
1036      gradient.addColorStop(colorStop1, srp_parseColor(color2, 0.4));
1037  }else{
1038    gradient.addColorStop(0.5, color1);
1039    gradient.addColorStop(0.5, srp_parseColor(color1, 0));
1040    gradient.addColorStop(colorStop1, srp_parseColor(color1, 0));
1041    gradient.addColorStop(colorStop1, srp_parseColor(color1, 0.4));
1042  }
1043  gradient.addColorStop(1, srp_parseColor(color1, 0));
1044
1045  ctx.strokeStyle = gradient;
1046  ctx.fillStyle = gradient;
1047}
1048function srp_parseColor(color, alpha) {
1049  // Ensure that alpha is a value between 0 and 1
1050  alpha = Math.min(Math.max(alpha, 0), 1);
1051  if (color.startsWith("#")) {
1052    if (color.length === 9) {
1053        // extract the original alpha value
1054        let original_alpha = parseInt(color.slice(-2), 16);
1055        // calculate the new alpha value
1056        alpha = (Math.round(original_alpha * alpha) * 100 / 25500).toFixed(2); 
1057    }
1058  }else if(color.startsWith("rgba(")) {
1059    // RGBA color code
1060    let values = color.slice(5, -1).split(",");
1061    values[3] = (values[3] * alpha).toFixed(2); 
1062    return "rgba(" + values.join(",") + ")";
1063  } else {
1064    throw new Error("Unsupported color format: " + color);
1065  }
1066  result =  "rgba(" + parseInt(color.slice(1, 3), 16) + ", " + parseInt(color.slice(3, 5), 16) + ", " + parseInt(color.slice(5, 7), 16) + ", " + alpha + ")";
1067  return result;
1068}
1069function srp_getColorsFromImage(audioPlayer,artworkUrl) {
1070  var affectSticky = (sonaar_music.option.sticky_player_disable_adaptive_colors === 'true') ? false : true; // Set to true or false based on your requirement
1071
1072
1073  if(!audioPlayer.adaptiveColors){
1074    $('#srp_stickyplayer').remove();
1075
1076    audioPlayer.prevAll('style:not(#srp-widget-player-style)').remove();
1077    return;
1078  } 
1079
1080  if(artworkUrl == null || artworkUrl == ''){
1081    setTimeout(function() {
1082      $(audioPlayer).css("opacity", 1);
1083      return;
1084    }, 1000);
1085  }
1086  
1087  
1088  const colorThief = new ColorThief();
1089  const img = new Image();
1090
1091  img.addEventListener('load', function() {
1092  
1093    paletteColors = colorThief.getPalette(img, 5);
1094    
1095    const rgbToHex = (r, g, b) => '#' + [r, g, b].map(x => {
1096      const hex = x.toString(16)
1097      return hex.length === 1 ? '0' + hex : hex
1098    }).join('')
1099    
1100    //convert all palette colors to hex
1101    audioPlayer.paletteColorsHex = [];
1102    for (var i = 0; i < paletteColors.length; i++) {
1103      var color = rgbToHex(paletteColors[i][0], paletteColors[i][1], paletteColors[i][2]);
1104      audioPlayer.paletteColorsHex.push(color);
1105    }
1106
1107    if(audioPlayer.adaptiveColors == 'random'){
1108    // randomize the paletteColorsHex array
1109      audioPlayer.paletteColorsHex = audioPlayer.paletteColorsHex.sort(function() { return 0.5 - Math.random() });
1110    }else if(audioPlayer.adaptiveColors == '2'){
1111      // reverse the colors
1112      audioPlayer.paletteColorsHex = audioPlayer.paletteColorsHex.reverse();
1113    }else if(audioPlayer.adaptiveColors == '3'){
1114      //move the first color to the last position
1115      audioPlayer.paletteColorsHex.push(audioPlayer.paletteColorsHex.shift());
1116    }else if(audioPlayer.adaptiveColors == '4'){
1117      // move second color to the first position
1118      audioPlayer.paletteColorsHex.unshift(audioPlayer.paletteColorsHex[1]);
1119    }
1120
1121    function getContrastColor(color) {
1122      var luma = (color.charAt(0) === '#')
1123        ? (0.2126 * parseInt(color.slice(1, 3), 16) + 0.7152 * parseInt(color.slice(3, 5), 16) + 0.0722 * parseInt(color.slice(5, 7), 16))
1124        : (0.2126 * parseInt(color.slice(0, 2), 16) + 0.7152 * parseInt(color.slice(2, 4), 16) + 0.0722 * parseInt(color.slice(4, 6), 16));
1125      return (luma < 130) ? '#fff' : '#000';
1126    }
1127    
1128    var foregroundColor = getContrastColor(audioPlayer.paletteColorsHex[0]);
1129    var paletteColorsHex_1_contrast = getContrastColor(audioPlayer.paletteColorsHex[1]);
1130
1131    //create a darker color function
1132    function darkerColor(color, percent) {
1133      var num = parseInt(color.replace("#",""),16),
1134      amt = Math.round(2.55 * percent),
1135      R = (num >> 16) - amt,
1136      G = (num >> 8 & 0x00FF) - amt,
1137      B = (num & 0x0000FF) - amt;
1138      return "#" + (0x1000000 + (R<255?R<1?0:R:255)*0x10000 + (G<255?G<1?0:G:255)*0x100 + (B<255?B<1?0:B:255)).toString(16).slice(1);
1139    }
1140    //create a lighter color function
1141    function lighterColor(color, percent) {
1142      var num = parseInt(color.replace("#",""),16),
1143      amt = Math.round(2.55 * percent),
1144      R = (num >> 16) + amt,
1145      G = (num >> 8 & 0x00FF) + amt,
1146      B = (num & 0x0000FF) + amt;
1147      return "#" + (0x1000000 + (R<255?R<1?0:R:255)*0x10000 + (G<255?G<1?0:G:255)*0x100 + (B<255?B<1?0:B:255)).toString(16).slice(1);
1148    }
1149
1150    /*
1151    //----------------
1152    // START DEBUG //
1153    //----------------
1154    //delete color-square
1155    audioPlayer.find('.color-square').remove();    
1156    // create small square color from paletteColorsHex and display them relative to the audioplayer
1157    var colorSquare = '';
1158    for (var i = 0; i < audioPlayer.paletteColorsHex.length; i++) {
1159      colorSquare += '<div class="color-square" style="display:inline-block;z-index:1000;width:25px;height:25px;top:-100px;background-color:'+audioPlayer.paletteColorsHex[i]+'"></div>';
1160    }    
1161    // add colorsquare in iron_widget_radio
1162    audioPlayer.prepend(colorSquare);
1163    //----------------
1164    // END DEBUG //
1165    //----------------
1166    */
1167
1168    if (! (audioPlayer.adaptiveColorsFreeze == true && $('#srp_stickyplayer').attr('data-player-source') == audioPlayer.id) ){
1169      $('#srp_stickyplayer').remove();
1170      audioPlayer.prevAll('style').not('#srp-widget-player-style').remove();
1171
1172      //create style in the head
1173      $('head').append('<style id="srp_stickyplayer" data-player-source="' + audioPlayer.id + '"></style>');
1174      audioPlayer.before('<style></style>');
1175    }
1176    
1177    player_uid = '[data-id="' + audioPlayer.data('id') + '"] ';
1178    player_floated = (audioPlayer.data('playertemplate') == 'skin_float_tracklist') ? true : false;
1179
1180    const cssColor = [
1181      {
1182        target: '\
1183        div#sonaar-player .control div,\
1184        div#sonaar-player .playlist,\
1185        div#sonaar-player .playlist .tracklist li.active span,\
1186        div#sonaar-player .playlist .title,\
1187        div#sonaar-player .playlist .tracklist li a,\
1188        div#sonaar-player .sricon-volume,\
1189        div#sonaar-player .player .sr_progressbar_sticky .timing,\
1190        div#sonaar-player .player .store .track-store li a,\
1191        div#sonaar-player .sonaar-extend-button,\
1192        .srmp3_singning p[begin]:not(.srmp3_lyrics_read ~ p),\
1193        .playlist .audio-track .sricon-play,\
1194        .playlist li.current .audio-track,\
1195        .playlist li.current .track-number,\
1196        .playlist li.current .audio-track .srp_trackartist,\
1197        .srp-play-button .sricon-play,\
1198        .sr_progressbar .currentTime,\
1199        .sr_progressbar .totalTime,\
1200        .srp_player_boxed .srp_noteButton,\
1201        .playlist .srp_pagination, .srp_ellipsis,\
1202        .srp_pagination_container .srp_pagination_arrows,\
1203        .album-store,\
1204        .album-player .album-title, .album-player .track-title,\
1205        div#sonaar-player .srp_ext_control,\
1206        div#sonaar-player .srp_ellipsis_btn, div#sonaar-player .srp_collapse_btn,\
1207        .control',
1208        css: 'color',
1209        value: audioPlayer.paletteColorsHex[1]
1210      },
1211      {
1212        target: '\
1213        div#sonaar-player,\
1214        div#sonaar-player .playlist,\
1215        div#sonaar-player .player .sr_progressbar_sticky .volume .slider-container,\
1216        div#sonaar-player.sr-float .playlist,\
1217        div#sonaar-player.sr-float .close.btn-player,\
1218        div#sonaar-player.sr-float .player.sr-show_controls_hover .playerNowPlaying,\
1219        div#sonaar-player .srp_extendedPlayer_container .srp_extendedPlayer,\
1220        div#sonaar-player .srp_extendedPlayer_container .srp_ext_overlay_panel,\
1221        div#sonaar-player .srp_extendedPlayer_container .srp_ext_section,\
1222        .srp_note',
1223        css: 'background-color',
1224        value: audioPlayer.paletteColorsHex[0]
1225      },
1226      {
1227        target: '\
1228        .album-player,\
1229        .srp_track_description,\
1230        .playlist li .audio-track,\
1231        .playlist li .audio-track .srp_trackartist,\
1232        .playlist li .track-number,\
1233        .srp_search_container .fa-search,\
1234        .srp_search_container .srp_search,\
1235        .sr_it-playlist-publish-date,\
1236        .srp_playlist_duration,\
1237        .srp_trackCount,\
1238        .srp_note,\
1239        div#sonaar-player,\
1240        #sonaar-modal div.sr_popup-content,\
1241        div#sonaar-player .playlist .tracklist li span,\
1242        div#sonaar-player .srp_ext_overlay_panel,\
1243        div#sonaar-player .srp_extendedPlayer_container .srp_ext_overlay_panel .srp-fav-bt,\
1244        div#sonaar-player .srp_extendedPlayer_container .srp-fav-bt,\
1245        div#sonaar-player .srp_ext_featured_cta,\
1246        div#sonaar-player .metadata-inner',
1247        css: 'color',
1248        value: foregroundColor
1249      },
1250      {
1251        target: '#sonaar-modal .srp-modal-variation-list .srp-modal-variant-selector',
1252        css: 'background-color',
1253        value: darkerColor(audioPlayer.paletteColorsHex[0],5)
1254      },
1255      {
1256        target: '.srp_player_boxed, .playlist .sr-playlist-item,div#sonaar-player .player, #sonaar-player .mobilePanel, div#sonaar-player .player .player-row:before, div#sonaar-modal div.sr_popup-content',
1257        css: 'background-color',
1258        value: darkerColor(audioPlayer.paletteColorsHex[0],15)
1259      },
1260      {
1261        target: '\
1262        @media only screen and (max-width: 1025px){div#sonaar-player .store}',
1263        css: 'background-color',
1264        value: darkerColor(audioPlayer.paletteColorsHex[0],15)
1265      },
1266      {
1267        target: '.srp_note',
1268        css: 'background-color',
1269        value: darkerColor(audioPlayer.paletteColorsHex[0],18)
1270      },
1271      {
1272        target: '.sr-cf-heading',
1273        css: 'background-color',
1274        value: darkerColor(audioPlayer.paletteColorsHex[0],30)
1275      },
1276      {
1277        target: '.sr-cf-heading',
1278        css: 'border-color',
1279        value: darkerColor(audioPlayer.paletteColorsHex[0],30)
1280      },
1281      {
1282        target: '.sr-playlist-heading-child',
1283        css: 'color',
1284        value: lighterColor(audioPlayer.paletteColorsHex[0],10)
1285      },
1286      {
1287        target: '.playlist .sr-playlist-item:hover, .playlist .sr-playlist-item.current',
1288        css: 'background-color',
1289        value: darkerColor(audioPlayer.paletteColorsHex[0],20)
1290      },
1291      {
1292        target: '.srp_search_container .srp_search',
1293        css: 'background-color',
1294        value: lighterColor(audioPlayer.paletteColorsHex[0],15)
1295      },
1296      {
1297        target: '.sr-playlist-cf-container',
1298        css: 'color',
1299        value: foregroundColor
1300      },
1301      {
1302        target: '.sr-playlist-cf-container',
1303        css: 'opacity',
1304        value: 0.6
1305      },
1306      {
1307        target: 'div.srp-play-circle,.srp_pagination_container .srp_pagination_arrows,.control .sr_speedRate div,div#sonaar-player div.sr_speedRate div,div#sonaar-player .close.btn_playlist:before,div#sonaar-player .close.btn_playlist:after,\
1308        div#sonaar-player .srp_extendedPlayer_container .srp_ext_overlay_panel .close',
1309        css: 'border-color',
1310        value: audioPlayer.paletteColorsHex[1]
1311      },
1312      
1313      {
1314        target: '\
1315        .playlist a.song-store:not(.sr_store_wc_round_bt),\
1316        .srp_noteButton .sricon-info',
1317        css: 'color',
1318        value: audioPlayer.paletteColorsHex[2]
1319      },
1320      {
1321        target: '.srp_track_description',
1322        css: 'opacity',
1323        value: 0.5
1324      },
1325      {
1326        target: '\
1327        .sr_it-playlist-title, div#sonaar-player .playlist button.play, div#sonaar-player .close.btn-player,div#sonaar-player div.sr_speedRate div,.control .sr_speedRate div,.srp_pagination_container .srp_pagination .active span,.srp-play-button-label-container,\
1328        #sonaar-player .srp_extendedPlayer_container .srp_extendedPlayer .srp_ext_featured_cta .srp_ext_cta_addtocart, #sonaar-player .srp_extendedPlayer_container .srp_extendedPlayer .srp_ext_featured_cta .srp_ext_cta_buynow',
1329        css: 'color',
1330        value: audioPlayer.paletteColorsHex[0]
1331      },
1332      {
1333        target: '\
1334        #sonaar-modal .srp_button, #sonaar-modal .srp-modal-variation-list .srp-modal-variant-selector:hover,\
1335        #sonaar-modal .srp-modal-variation-list .srp-modal-variant-selector.srp_selected,\
1336        .srp_pagination_container .srp_pagination .active span,.srp-play-button-label-container,\
1337        div#sonaar-player .playlist button.play,div#sonaar-player .mobileProgressing:after,\
1338        div#sonaar-player .progressDot,div#sonaar-player div.sr_speedRate div,\
1339        .control .sr_speedRate div,\
1340        #sonaar-player .srp_extendedPlayer_container .srp_extendedPlayer .srp_ext_featured_cta .srp_ext_cta_addtocart,\
1341        #sonaar-player .srp_extendedPlayer_container .srp_extendedPlayer .srp_ext_featured_cta .srp_ext_cta_buynow',
1342        css: 'background-color',
1343        value: audioPlayer.paletteColorsHex[1]
1344      },
1345      {
1346        target: '#sonaar-modal .srp_button, #sonaar-modal .srp-modal-variation-list .srp-modal-variant-selector:hover, #sonaar-modal .srp-modal-variation-list .srp-modal-variant-selector.srp_selected',
1347        css: 'color',
1348        value: paletteColorsHex_1_contrast
1349      },
1350      {
1351        target: '.buttons-block .store-list li .button, .song-store.sr_store_wc_round_bt',
1352        css: 'color',
1353        value: paletteColorsHex_1_contrast
1354       
1355      },
1356      {
1357        target: '.buttons-block .store-list li .button,.song-store.sr_store_wc_round_bt',
1358        css: 'background-color',
1359        value: audioPlayer.paletteColorsHex[1]
1360      },
1361      {
1362        target: 'div#sonaar-player .close.btn-player,div#sonaar-player .mobileProgress',
1363        css: 'background-color',
1364        value: audioPlayer.paletteColorsHex[3]
1365      },
1366      {
1367        target: 'div#sonaar-player .player',
1368        css: 'border-color',
1369        value: audioPlayer.paletteColorsHex[3]
1370      },
1371      {
1372        target: 'div#sonaar-player .player div.mobilePanel',
1373        css: 'border-color',
1374        value: darkerColor(audioPlayer.paletteColorsHex[0],15)
1375      },
1376    ];
1377    
1378    if(	Boolean(sonaar_music.option.waveformType === 'simplebar') ){
1379      cssColor.push(
1380        {
1381          target: 'div#sonaar-player .sonaar_fake_wave .sonaar_wave_cut',
1382          css: 'background-color',
1383          value: audioPlayer.paletteColorsHex[3]
1384        },
1385        {
1386          target: 'div#sonaar-player .sonaar_fake_wave .sonaar_wave_base',
1387          css: 'background-color',
1388          value: audioPlayer.paletteColorsHex[1]
1389        },
1390      )
1391    }
1392    
1393    if(player_floated){
1394      cssColor.push(
1395        {
1396          target: '.playlist, .playlist .sr-playlist-item',
1397          css: 'background-color',
1398          value: 'unset',
1399          skin: 'floated'
1400        },
1401        {
1402          target: '.album-player .album-title, .album-player .srp_trackartist, .sr_progressbar .currentTime, .sr_progressbar .totalTime',
1403          css: 'color',
1404          value: audioPlayer.paletteColorsHex[3],
1405          skin: 'floated'
1406        },
1407        {
1408          target: '.album-player .track-title, .control, .control .sricon-play',
1409          css: 'color',
1410          value: lighterColor(audioPlayer.paletteColorsHex[3],25),
1411          skin: 'floated'
1412        },
1413        {
1414          target: '.sr_it-playlist-title, .srp_subtitle, .srp_noteButton .sricon-info, .playlist li .audio-track, .playlist li .audio-track .srp_trackartist, .playlist li .track-number, .srp_track_description',
1415          css: 'color',
1416          value: audioPlayer.paletteColorsHex[1],
1417          skin: 'floated'
1418        },
1419        {
1420          target: '.playlist .audio-track .sricon-play',
1421          css: 'color',
1422          value: lighterColor(audioPlayer.paletteColorsHex[1],20),
1423          skin: 'floated'
1424        },
1425        {
1426          target: '',
1427          css: 'background-color',
1428          value: 'unset',
1429          skin: 'floated'
1430        },
1431      );
1432    }
1433
1434    for (let i = 0; i < cssColor.length; i++) {
1435      var skin_prefix = '';
1436      if(cssColor[i]['skin'] === 'floated'){
1437        skin_prefix = '[data-playertemplate="skin_float_tracklist"]';
1438      }
1439      //Check if cssColor[i] contains value with , if yes, split it and add it to the array
1440      if(cssColor[i]['target'].indexOf(',') != -1){
1441        var cssColorValue = cssColor[i]['target'].split(',');
1442        for (let j = 0; j < cssColorValue.length; j++) {
1443          if(affectSticky && cssColorValue[j].indexOf('#sonaar-') != -1 ){
1444            $('#srp_stickyplayer').append(cssColorValue[j] + '{' + cssColor[i]['css'] + ':' + cssColor[i]['value'] + ';transition: all 600ms;}');
1445          }else{
1446            audioPlayer.prev('style').append(skin_prefix + player_uid + cssColorValue[j] + '{' + cssColor[i]['css'] + ':' + cssColor[i]['value'] + ';transition:' + cssColor[i]['css'] + ' 600ms;}');
1447          }
1448        }
1449      }else{
1450        if(affectSticky && cssColor[i]['target'].indexOf('#sonaar-') != -1){
1451          $('#srp_stickyplayer').append(cssColor[i]['target'] + '{' + cssColor[i]['css'] + ':' + cssColor[i]['value'] + ';transition: all 600ms;}');
1452        }else{
1453          audioPlayer.prev('style').append(skin_prefix + player_uid + cssColor[i]['target'] + '{' + cssColor[i]['css'] + ':' + cssColor[i]['value'] + ';transition:' + cssColor[i]['css'] + ' 600ms;}');
1454        }
1455      }
1456    }
1457    if( !$(audioPlayer).hasClass('srp_tracklist_grid') ){
1458      audioPlayer.prev('style').append(player_uid + '.playlist{background-color:' + darkerColor(audioPlayer.paletteColorsHex[0],10) + ';}');
1459    }
1460     
1461    //check if audioPlayer contains a gradient (set with background-image) but not an image url
1462    if (audioPlayer.find('.srp_player_boxed').length && audioPlayer.find('.srp_player_boxed').css('background-image') != 'none' && audioPlayer.find('.srp_player_boxed').css('background-image').indexOf('url') == -1) {
1463      audioPlayer.prev('style').append(player_uid + '.srp_player_boxed{background-image:linear-gradient(0deg,' + darkerColor(audioPlayer.paletteColorsHex[4], 25) + ' 0%, ' + darkerColor(audioPlayer.paletteColorsHex[0],20) + ' 100%)!important;');
1464      if(affectSticky){
1465        $('#srp_stickyplayer').append('#sonaar-player .player{background-image:linear-gradient(45deg,' + darkerColor(audioPlayer.paletteColorsHex[4], 25) + ' 0%, ' + darkerColor(audioPlayer.paletteColorsHex[0],20) + ' 100%)');
1466      }
1467    }
1468  
1469    if(typeof audioPlayer.spectrumColor1 !== 'undefined' && !audioPlayer.spectrumColor1 && typeof audioPlayer.spectrumColor2 !== 'undefined' && !audioPlayer.spectrumColor2){
1470     
1471      let color1 = (audioPlayer.spectrumColor1) ? audioPlayer.spectrumColor1 : audioPlayer.paletteColorsHex[0];
1472      let color2 = (audioPlayer.spectrumColor2) ? audioPlayer.spectrumColor2 : audioPlayer.paletteColorsHex[2];
1473
1474      $('.srp_spectrum').each(function () {
1475        const canvas = this;
1476        const ctx = canvas.getContext('2d');
1477        const gradient = ctx.createLinearGradient(0, 0, 0, canvas.height); // vertical
1478        gradient.addColorStop(0.25, color1);
1479        gradient.addColorStop(1, color2);
1480        ctx.fillStyle = gradient;
1481        ctx.strokeStyle = gradient;
1482        if( 
1483          $(this).parents('#sonaar-player').length && sonaar_music.option.sticky_spectro_reflect === "true" ||
1484          ! $(this).parents('#sonaar-player').length && audioPlayer.spectroReflect
1485        ){
1486          srp_spectroReflect(ctx, canvas, 2.5, color1, color2);
1487        }
1488        
1489      })
1490    }
1491
1492    if(audioPlayer.attr('data-wave-color') == false){
1493      audioPlayer.soundwaveColorBG = audioPlayer.paletteColorsHex[2];
1494     // audioPlayer.find('.sonaar_wave_base').css('background-color',audioPlayer.paletteColorsHex[2]);
1495    }
1496    if(audioPlayer.attr('data-wave-progress-color') == false){
1497      audioPlayer.soundwaveProgressColor = audioPlayer.paletteColorsHex[1];
1498      //audioPlayer.find('.sonaar_wave_cut').css('background-color',audioPlayer.paletteColorsHex[1]);
1499    }
1500
1501    IRON.createFakeWave(audioPlayer, false);
1502
1503    if(IRON.audioPlayer.stickyEnable && IRON.sonaar.player.list.tracks.length) IRON.createFakeWave(false, true);
1504
1505    if(audioPlayer.adaptiveColorsFreeze == true){
1506      audioPlayer.adaptiveColorsSet = true;
1507    }
1508    // set timeout of 1 second to allow the image and colors to be loaded because of the color transition effect.
1509    setTimeout(function() {
1510      $(audioPlayer).css("opacity", 1);
1511    }, 1000);
1512  });
1513
1514  img.crossOrigin = 'anonymous';
1515  img.src = artworkUrl;
1516}
1517IRON.audioPlayer = (function ($) {
1518  "use strict";
1519  var seekTimeOut;
1520  var autoplayEnable;
1521  var audioPlayer;
1522  var playlist;
1523  var stickyEnable = false;
1524  var random_order = false;
1525 
1526  function setMediaSessionAPI(trackTitle, albumTitle, artistName, albumArt) {
1527    //WIP: Does not work with the mini-player play button. Works only when click in the tracklist.
1528    if ('mediaSession' in navigator) {
1529      navigator.mediaSession.metadata = new MediaMetadata({
1530        title: trackTitle,
1531        artist: albumTitle, // We want to show album Title instead of artist name in the Notification
1532        album: albumTitle,
1533        artwork: [
1534          { src: albumArt, sizes: '512x512', type: 'image/jpeg' },
1535        ]
1536      });
1537    }
1538  }
1539  function initPlayer(player) {
1540    audioPlayer = player;
1541
1542    if(typeof player.params == 'undefined'){
1543      player.params = {};
1544    }
1545    this.audioPlayer = player;
1546
1547   
1548    var waveContainer = this.audioPlayer.find(".player .wave").attr("id");
1549    playlist = audioPlayer.find(".playlist .srp_list")
1550    playlist.children(":not(li)").remove(); // woocommerce shop page insert a unwanted <a> tag in the playlist who cause a bug with the track index.
1551    this.playlist = playlist;
1552    this.autoplayEnable = audioPlayer.data("autoplay");
1553    audioPlayer.spectrumColor1 = false;
1554    audioPlayer.spectrumColor2 = false;
1555    audioPlayer.id = audioPlayer.data("id");
1556    audioPlayer.pagination_offset = parseInt(audioPlayer.attr("data-pagination_scroll_offset"), 10);
1557    audioPlayer.albums = audioPlayer.data("albums");
1558    audioPlayer.remove_wave = audioPlayer.data("no-wave");
1559    audioPlayer.shuffle = audioPlayer.data("shuffle") || false;
1560    audioPlayer.stickyPlayer = IRON.audioPlayer.stickyEnable;
1561    audioPlayer.notrackskip = audioPlayer.data("notrackskip");
1562    audioPlayer.playerType = audioPlayer.data("playertemplate");
1563    audioPlayer.hide_progressbar = audioPlayer.data("hide-progressbar") ? true : false;
1564    audioPlayer.adaptiveColors = audioPlayer.data("adaptive-colors");
1565    audioPlayer.adaptiveColorsFreeze = audioPlayer.data("adaptive-colors-freeze");
1566    audioPlayer.lazy_load = audioPlayer.data("lazyload");
1567    audioPlayer.progressType = audioPlayer.data("progress-bar-style");
1568    audioPlayer.setTrackSoundwaveCursor = audioPlayer.data("track-sw-cursor");
1569    audioPlayer.trackMemory = audioPlayer.hasClass('srp_track_memory');
1570
1571    // Define an async function for the fetch operation
1572    const urlParams = new URLSearchParams(document.location.search);
1573    audioPlayer.listJs = (audioPlayer.hasClass('srp_linked') || audioPlayer.find('.srp_search_container').length || document.querySelectorAll('[data-sr-dropdown-atts]').length || audioPlayer.find('.sr-cf-heading').length || audioPlayer.find('.srp_pagination').length || urlParams.has('srp_search')); //If Linked to a search or filter widget || If the current Player has a Search Input || If the current Player has CF Columns || Pagination is acitvated || if srp_search URL parameter
1574    audioPlayer.list = {};
1575    audioPlayer.list.tracks = [];
1576
1577    if(audioPlayer.trackMemory){
1578      IRON.localStorageTrackMemory = (localStorage.getItem('srp_tracks_memories') == null) ? {} : JSON.parse(localStorage.getItem('srp_tracks_memories'));
1579    }
1580
1581    playlist.find(".sr-playlist-item").each(function () {
1582        var $track = $(this);
1583        var trackData = {
1584            peakFile:             $track.data("peakfile"),
1585            mp3:                  $track.data("audiopath"),
1586            sourcePostID:         $track.data("post-id"),
1587            id:                   $track.data("trackid"), // Its the media attachment ID if set.
1588            track_pos:            $track.data("track-pos"),
1589            isPreview:            $track.data("is-preview"),
1590            peak_allow_frontend:  $track.data("peakfile-allow"),
1591            artwork:              $track.data("artwork"),
1592        };
1593        audioPlayer.list.tracks.push(trackData);
1594    });
1595
1596    $('.iron-audioplayer .srp_repeat').attr('data-repeat-status', IRON.repeatStatus);
1597    $('.iron-audioplayer .srp_repeat').attr('title', IRON.repeatToolTipLabel());
1598
1599    setTrackSoundwaveCursor(audioPlayer);
1600
1601    if(!audioPlayer.adaptiveColors){
1602      $(audioPlayer).css("opacity", 1);
1603    }
1604    sr_setPopUp();//set Popup, required for the store-content popup
1605    if (audioPlayer.shuffle) {
1606      var trackNumber = Math.floor(Math.random() * playlist.find("li").length);
1607    } else {
1608      var trackNumber = playlist.find("li").not('[data-relatedtrack="1"]').index();
1609    }
1610    random_order = setRandomList(playlist.find("li"), trackNumber);
1611
1612    if (audioPlayer.data("scrollbar")) {
1613      var scrollItem = $(audioPlayer).find(".playlist .srp_list")[0];
1614
1615      var ps = new PerfectScrollbar(scrollItem, {
1616        wheelSpeed: 0.7,
1617        swipeEasing: true,
1618        wheelPropagation: false,
1619        minScrollbarLength: 20,
1620        suppressScrollX: true,
1621        maxScrollbarLength: 100,
1622      });
1623      //$('.iron-audioplayer .playlist ul').perfectScrollbar({'suppressScrollX': true});
1624    }
1625    if (audioPlayer.data("wave-color") == false) {
1626      audioPlayer.soundwaveColorBG = (audioPlayer.soundwaveColorBG === '' || typeof audioPlayer.soundwaveColorBG == 'undefined') ? sonaar_music.option.music_player_timeline_color : audioPlayer.soundwaveColorBG;
1627    } else {
1628      audioPlayer.soundwaveColorBG = (audioPlayer.soundwaveColorBG === '' || typeof audioPlayer.soundwaveColorBG == 'undefined') ? audioPlayer.data("wave-color") : audioPlayer.soundwaveColorBG;
1629    }
1630    if (audioPlayer.data("wave-progress-color") == false) {
1631      audioPlayer.soundwaveProgressColor = (audioPlayer.soundwaveProgressColor === '' || typeof audioPlayer.soundwaveProgressColor == 'undefined') ? sonaar_music.option.music_player_progress_color : audioPlayer.soundwaveProgressColor;   
1632    } else {
1633      audioPlayer.soundwaveProgressColor = (audioPlayer.soundwaveProgressColor === '' || typeof audioPlayer.soundwaveProgressColor == 'undefined') ? audioPlayer.data("wave-progress-color") : audioPlayer.soundwaveProgressColor;   
1634    }
1635
1636    this.$audio_el = $("#" + waveContainer).find(".sonaar_media_element")[0];
1637    fakeWaveUpdate(this.$audio_el, audioPlayer, playlist);
1638    $(audioPlayer).find(".wave").css("opacity", "1");
1639    
1640    setPlaylist(playlist, this.$audio_el, audioPlayer);
1641
1642    var trackNumber;
1643    if (audioPlayer.shuffle) {
1644      const tracksPerPage = audioPlayer.data('tracks-per-page');
1645      if (typeof tracksPerPage === 'number' && !isNaN(tracksPerPage)) { //ifpagination is enabled
1646          trackNumber = Math.floor(Math.random() * playlist.find('.sr-playlist-item').length);
1647      } else {;
1648          trackNumber = random_order[0];
1649      }
1650    } else {
1651      trackNumber = playlist.find("li").not('[data-relatedtrack="1"]').index();
1652    }
1653    var track = playlist.find("li").eq(trackNumber);
1654    $(audioPlayer).attr("trackselected", trackNumber);
1655
1656    if(!IRON.audioPlayer.stickyEnable && !audioPlayer.hasClass('audio-playing') || IRON.audioPlayer.stickyEnable){ //Dont update the mini player if the player is already playing a track from another ajax page
1657      setCurrentTrack(track, trackNumber, audioPlayer, this.$audio_el);
1658      updateMiniPlayer(audioPlayer, track);
1659    }
1660    audioPlayer.find('.sr_it-playlist-publish-date').text(track.data('date'));
1661    if(track.data('tracktime')){
1662      audioPlayer.find('.totalTime').text('-' + track.data('tracktime'));
1663    }
1664    setControl(this.$audio_el, audioPlayer, playlist);
1665    
1666    if (audioPlayer.data("autoplay")) {
1667      autoplayEnable = true;
1668    }
1669
1670    sr_playerCTAresponsive();
1671    sr_initSlider(audioPlayer.find('.slider-container .slide'), audioPlayer, this.$audio_el);
1672    srp_js_dynamic_style(audioPlayer);
1673    IRON.favorites.setFavButtons(audioPlayer);
1674
1675    srp_setTrackListColumns(audioPlayer);
1676    
1677    if(typeof sonaar_music.option.general_volume != 'undefined' ){
1678      if( getCookieValue("sonaar_mp3_player_volume") != '' && IRON.audioPlayer.stickyEnable){
1679        sr_getCookieVolume();
1680      }else{
1681        sr_setVolume(sonaar_music.option.general_volume/100, audioPlayer, this.$audio_el);
1682      }
1683    }else{
1684      sr_setVolume(1, audioPlayer, this.$audio_el);
1685    } 
1686
1687    if( audioPlayer.find('.srp_swiper').length && typeof audioPlayer.swiper == 'undefined' && typeof Swiper != 'undefined' ){
1688      const numberOfSlidesRequiredForVirtual = 20;
1689      const selectedTrack = function(){
1690        if( audioPlayer.find('.srp_swiper').data('swiper-source') == 'track' ){
1691          var slideId = audioPlayer.attr('trackselected');
1692        }else{
1693          var slideId = $(audioPlayer).find('.sr-playlist-item').eq(audioPlayer.attr('trackselected')).data('post-id');
1694        }
1695        var initialSlideIndex = $(audioPlayer).find('.swiper-slide[data-slide-id="' + slideId + '"]').index();
1696        return initialSlideIndex;
1697      }
1698
1699      const setVirtualExtraSlides = function(){
1700        var extraSlidestValue = 3; //default value for ['virtual']['addSlidesAfter']  and ['virtual']['addSlidesAfter'] 
1701        if( typeof parameters['slidesPerView'] != 'undefined' && typeof parameters['loop'] != 'undefined' && parameters['loop'] == true){
1702          const numberOfSlide = $(audioPlayer).find('.swiper-slide').length;
1703          while (numberOfSlide < (parameters['slidesPerView'] + (extraSlidestValue*3))*2 && extraSlidestValue > 0 ) {
1704            extraSlidestValue--; 
1705          }
1706        }
1707        return extraSlidestValue;
1708      }
1709
1710
1711      var parameters =  eval('(' +audioPlayer.find('.srp_swiper').data('params')+ ')')
1712      if( typeof parameters['navigation'] != 'undefined' && parameters['navigation'] != false ){
1713        if( parameters['navigation'] == true ){
1714          parameters['navigation'] = {};
1715        }
1716        if( typeof parameters['navigation']['nextEl'] == 'undefined' || typeof parameters['navigation']['nextEl'] != 'undefined' && parameters['navigation']['nextEl'] == '.srp_swiper-button-next'){
1717          parameters['navigation']['nextEl'] = '.iron-audioplayer[data-id="' + audioPlayer.id + '"] .srp_swiper-button-next'; //Add the player id to the next button
1718        }
1719        if( typeof parameters['navigation']['prevEl'] == 'undefined' || typeof parameters['navigation']['prevEl'] != 'undefined' && parameters['navigation']['prevEl'] == '.srp_swiper-button-prev'){
1720          parameters['navigation']['prevEl'] = '.iron-audioplayer[data-id="' + audioPlayer.id + '"] .srp_swiper-button-prev'; //Add the player id to the prev button
1721        }
1722      }
1723      if( typeof parameters['pagination'] != 'undefined' && typeof parameters['pagination']['el'] != 'undefined' && parameters['pagination']['el'] == '.swiper-pagination'){
1724        parameters['pagination']['el'] = '.iron-audioplayer[data-id="' + audioPlayer.id + '"] .swiper-pagination'; //Add the player id to the pagination
1725      }
1726      if( typeof parameters['initialSlide'] == 'undefined' ){
1727        parameters['initialSlide'] = selectedTrack(); 
1728      }
1729      
1730      if( $(audioPlayer).find('.swiper-slide').length > numberOfSlidesRequiredForVirtual && audioPlayer.shuffle != true){
1731        if( typeof parameters['virtual'] == 'undefined' ){
1732          parameters['virtual'] = {};
1733          parameters['virtual']['enabled'] = true;
1734          parameters['virtual']['addSlidesAfter'] = setVirtualExtraSlides();
1735          parameters['virtual']['addSlidesBefore'] = setVirtualExtraSlides();
1736        } 
1737      }else{
1738        parameters['virtual'] = false;
1739      }
1740
1741      if( audioPlayer.find('.srp_swiper').data('init') !== 'true' ){
1742
1743        audioPlayer.swiper = new Srp_swiper(audioPlayer.find('.srp_swiper')[0], parameters);
1744  
1745        const playerEl = audioPlayer;
1746        audioPlayer.swiper.on('transitionEnd', function() { 
1747          if (!IRON.swiper.isTransitionEnd) {
1748            IRON.swiper.isTransitionEnd = true;
1749            IRON.swiper.showHiddenSlide( playerEl);
1750          }
1751        });
1752        IRON.swiper.showHiddenSlide( audioPlayer);
1753        audioPlayer.find('.srp_swiper').data('init', 'true');
1754        if( typeof parameters['autoplay'] != 'undefined' && parameters['autoplay'] !== false){
1755          audioPlayer.swiper.autoplay.start(); //Force autoplay to start when the player is loaded and the params autoplay is set to true. The autoplay is not working when we change player option in the elementor editor
1756        }
1757      }
1758    }
1759    if(typeof IRON.favorites.favoritesEnabled != 'undefined' && IRON.favorites.favoritesEnabled){ //If favorites list is already loaded
1760      audioPlayer.removeClass('srp_favorites_loading');
1761    }
1762   
1763    if(audioPlayer.trackMemory){
1764      const singleTrack = audioPlayer.find('.sr-playlist-item').eq(Number(audioPlayer.attr('trackselected')));
1765      if(singleTrack.length){
1766        const trackMemoryKey = IRON.getTrackMemoryKeyFormat(singleTrack.data('audiopath'));
1767        if(typeof IRON.localStorageTrackMemory[trackMemoryKey] == 'object'){
1768          const [currentTime, duration] = IRON.localStorageTrackMemory[trackMemoryKey];
1769          var $audio_el =  audioPlayer.find('.album-player .sonaar_media_element')[0];
1770          $audio_el.currentTime = currentTime;
1771          
1772          audioPlayer.find('.album-player .sonaar_wave_cut').width((currentTime / duration) * 100 + "%");
1773          setTimeCurrentTime(audioPlayer, $audio_el.currentTime)
1774        }
1775        singleTrack.data( 'track-memory-key', trackMemoryKey );
1776      }
1777    }
1778    
1779    $(audioPlayer).find('.srp_track_purchased .add_to_cart_button, .srp_track_purchased .srp_wc_variation_button').each(function () {
1780      const $btn = $(this);
1781    
1782      if($btn.hasClass('sr_cta_disabled')){
1783        $btn.css({
1784          pointerEvents: 'none',
1785          cursor: 'default',
1786        });
1787        $btn.attr('href', 'javascript:void(0)');
1788        $btn.attr('onclick', '');
1789      }
1790
1791      if($btn.hasClass('sr_cta_download')){
1792        $btn.removeClass('srp_wc_variation_button');
1793        $btn.attr('download', '');
1794        $btn.removeAttr('data-store-id');
1795        $btn.removeAttr('data-source-post-id');
1796        $btn.removeAttr('data-product_id');
1797        
1798
1799      }
1800
1801      if(sonaar_music.option.wc_bt_purchased_bg_color != ''){
1802        $btn.css('background-color', sonaar_music.option.wc_bt_purchased_bg_color);
1803      }
1804      if(sonaar_music.option.wc_bt_purchased_txt_color != ''){
1805        $btn.css('color', sonaar_music.option.wc_bt_purchased_txt_color);
1806      }
1807    });
1808  
1809
1810
1811    checkIfResult(audioPlayer);
1812  }
1813
1814  /* triggerPlay is called everytime NEW track (only) is clicked to play, and NOT on page load */
1815  var triggerPlay = function (audioPlayer) {
1816    if(audioPlayer.hasClass('srp_player_spectrum') && !IRON.audioPlayer.stickyEnable){
1817      const playerNum = srp_convertPlayerIdToPlayerNum(audioPlayer.attr('id'))
1818      if(typeof IRON.players[playerNum].audioElement == 'undefined'){
1819        startAudioSpectrum(audioPlayer);
1820      }else{
1821        startAudioSpectrum(audioPlayer, false, true);
1822      }
1823    }
1824  };
1825  
1826  function setSingleMetaHeadingInMiniplayer($source, $target) {
1827    if ($target.length) {
1828      $target.html('').hide(); // Empty the current field when we switch track
1829      if ((typeof $source !== 'undefined') && $source.length) {
1830        $target.html( $target.attr('data-prefix') + ' ' + $source).show();
1831      }
1832    }
1833  }
1834  
1835  /* setCurrentTrack is called on load before audio playing AND on play */
1836  function setCurrentTrack(track, index, audioPlayer, $audio_el) {
1837  
1838    audioPlayer.currentTrack = index; 
1839    
1840    if(typeof IRON.sonaar.player.selectedPlayer === 'undefined' || IRON.sonaar.player.selectedPlayer === null){
1841      IRON.getIceCastInfo(audioPlayer);
1842    }
1843
1844    var albumArt = audioPlayer.find(".album .album-art");
1845    var albumReleaseDate = audioPlayer.find(".srp_subtitle");
1846    var artworkUrl = (typeof audioPlayer.data('albumart') != 'undefined')? audioPlayer.data('albumart'): track.data('albumart');
1847
1848    if (audioPlayer.data('hide-artwork') != '1' && audioPlayer.data('hide-artwork') != 'true') {
1849      if (artworkUrl) {
1850        audioPlayer.removeClass('sonaar-no-artwork');
1851        if (albumArt.find("img").length) {
1852          albumArt.find("img").attr("src", artworkUrl);
1853        } else {
1854          albumArt.css("background-image", "url(" + artworkUrl + ")");
1855        }
1856      } else {
1857        audioPlayer.addClass('sonaar-no-artwork');
1858      }
1859
1860    }
1861    
1862
1863
1864    srp_getColorsFromImage(audioPlayer,artworkUrl);
1865    
1866
1867
1868    if (!audioPlayer.hasClass("show-playlist")) {
1869      albumArt.css("cursor", "pointer");
1870    }
1871    audioPlayer.data("currentTrack", index);
1872
1873    albumReleaseDate.text(track.data("releasedate"));
1874
1875    audioPlayer.find(".player").removeClass("hide");
1876    audioPlayer.find(".wave").removeClass("reveal");
1877
1878    if (!track.data("showloading")) {
1879      audioPlayer.find(".player").addClass("hide");
1880    } else {
1881      audioPlayer.find(".progressLoading").css("opacity", "0.75");
1882    }
1883
1884    //set time from memory
1885    if( audioPlayer.trackMemory && typeof audioPlayer.find('.sr-playlist-item').eq(index).data('current-time') != 'undefined' && !audioPlayer.stickyPlayer ){
1886      const audioInstance = sr_setAudioElementInstance(audioPlayer);
1887      audioInstance.currentTime = (audioPlayer.find('.sr-playlist-item').eq(index).data('current-time'));
1888    }
1889      
1890
1891   
1892
1893
1894    setTime(audioPlayer, $audio_el);
1895
1896    hideEmptyAttribut(track.data("releasedate"), audioPlayer.find(".srp_subtitle"));
1897
1898    if (!audioPlayer.hasClass('sr_selectedPlayer') || !audioPlayer.stickyPlayer) {
1899      IRON.audioPlayer.checkArtWorkFullBg(audioPlayer, artworkUrl);
1900      IRON.createFakeWave(audioPlayer);
1901    }
1902
1903    if (!audioPlayer.stickyPlayer) {
1904      updateMiniPlayer(audioPlayer, track);
1905      IRON.swiper.update(audioPlayer, index);
1906    }
1907    audioPlayer.find('.sr_it-playlist-publish-date').text(track.data('date'));
1908    if (! IRON.audioPlayer.stickyEnable) {
1909      audioPlayer.find('.sonaar_media_element')[0].playbackRate = audioPlayer.attr('data-speedrate');
1910    }
1911  }
1912
1913  function updateMiniPlayer(audioPlayer, track) {
1914    audioPlayer.find('.srp_player_boxed, .album-player, .album-store').removeClass('srp_hidden');
1915    $(audioPlayer).attr("trackselected",  track.index());
1916    if(track.attr('data-icecast_json') == '' || typeof track.attr('data-icecast_json') == 'undefined'){
1917      var playlistTitleElement = audioPlayer.find(".sr_it-playlist-title, .album-title");
1918      var prefixTitle = (typeof audioPlayer.find(".album-title").attr('data-prefix') === 'undefined')? '' : audioPlayer.find(".album-title").attr('data-prefix');
1919      if (typeof audioPlayer.data("playlist_title") !== "undefined" && audioPlayer.data("playlist_title").length) {
1920        playlistTitleElement.text(prefixTitle + ' ' + audioPlayer.data("playlist_title"));
1921      } else if(typeof track.attr('data-albumtitle') != 'undefined'){
1922        playlistTitleElement.text(prefixTitle + ' ' + track.attr('data-albumtitle'));
1923      }else{
1924        audioPlayer.find('.srp_player_boxed, .album-player, .album-store').addClass('srp_hidden');
1925      }
1926
1927      var trackTitleSource = (typeof track.data("tracktitle") != 'undefined')? track.data("tracktitle").toString().split('<span class="srp_trackartist">')[0] : '';
1928      setSingleMetaHeadingInMiniplayer( trackTitleSource,  audioPlayer.find('.track-title') );
1929    }
1930    setSingleMetaHeadingInMiniplayer( track.data("artist"), audioPlayer.find('.album-player .srp_artistname') );
1931    setSingleMetaHeadingInMiniplayer( track.data("tracktime"), audioPlayer.find('.album-player .srp_duration') );
1932    setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--description').text(), audioPlayer.find('.album-player .srp_description'));
1933    setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--product_cat').text(), audioPlayer.find('.album-player .srp_category'));
1934    setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--playlist-category').text(), audioPlayer.find('.album-player .srp_category'));
1935    setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--product_tag').text(), audioPlayer.find('.album-player .srp_tag'));
1936    setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--playlist-tag').text(), audioPlayer.find('.album-player .srp_tag'));
1937    setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--podcast-show').text(), audioPlayer.find('.album-player .srp_podcast_show'));
1938    audioPlayer.find('.srp_meta_cf').each(function(){
1939      setSingleMetaHeadingInMiniplayer(track.find('.srp_cf_data.sr-playlist-cf--' + $(this).data('cf')).html(), $(this));
1940    })
1941
1942    if (audioPlayer.data('playertemplate') == 'skin_boxed_tracklist' && audioPlayer.find('.srp_track_cta').length) {
1943      audioPlayer.find('.srp_track_cta .song-store-list-container').remove();
1944      audioPlayer.find('.srp_track_cta').append(track.find('.song-store-list-container').clone());
1945    }
1946    const $currentTrack = audioPlayer.find('.sr-playlist-item:not(.srp_related_track)').eq(track.index());
1947    /*Miniplayer Note Button*/
1948    if($currentTrack.find('.srp_noteButton').length || 
1949    $currentTrack.find('.srp_track_description').length && $currentTrack.find('.srp_track_description').html().length
1950    ){
1951      audioPlayer.find('.album-player .srp_noteButton').removeClass('srp_hide');
1952      audioPlayer.find('.album-player .srp_noteButton .sricon-info').attr('data-source-post-id', $currentTrack.attr('data-post-id'));
1953      audioPlayer.find('.album-player .srp_noteButton .sricon-info').attr('data-track-position', $currentTrack.attr('data-track-pos'));
1954      audioPlayer.find('.album-player .srp_noteButton .sricon-info').attr('data-track-title', $currentTrack.attr('data-tracktitle'));
1955    }else{
1956      audioPlayer.find('.album-player .srp_noteButton').addClass('srp_hide');
1957    }
1958    audioPlayer.find('.srp_player_boxed .srp_note').remove();
1959    /*End Miniplayer Note Button*/
1960  }
1961
1962  function checkArtWorkFullBg(audioPlayer, artwork) {
1963    var hasArtworkBgClass = (null !== audioPlayer) ? audioPlayer.closest('.srp_artwork_fullbackground_yes').length > 0 : false;
1964    if (hasArtworkBgClass) {
1965      if (audioPlayer.data('hide-artwork') != '1' && audioPlayer.data('hide-artwork') != 'true') {
1966        // Determine if this is the first call for this audio player
1967        var isFirstCall = typeof audioPlayer.data('firstCall') === 'undefined' || audioPlayer.data('firstCall') === false;
1968        audioPlayer.data('firstCall', true);
1969
1970        var hasArtworkBgClass_Gradient = audioPlayer.closest('.srp_artwork_fullbackground_wgradient_yes').length > 0;
1971        if (hasArtworkBgClass_Gradient) {
1972          audioPlayer.find('.srp-artworkbg-gradient').remove();
1973          var backgroundDiv = document.createElement('div');
1974          backgroundDiv.className = 'srp-artworkbg-gradient';
1975          audioPlayer[0].appendChild(backgroundDiv);
1976        }
1977  
1978        if (artwork === false) {
1979          var currentTrackIndex = audioPlayer.currentTrack;
1980          artwork = $(audioPlayer).find('.sr-playlist-item').eq(currentTrackIndex).data('albumart');
1981        }
1982
1983        if (artwork) {
1984          // Find existing background divs and fade them out
1985          var existingBackgrounds = audioPlayer.find('.srp-artworkbg');
1986          existingBackgrounds.addClass('srp-fade-out');
1987          setTimeout(function() {
1988            existingBackgrounds.remove();
1989          }, 2500); // Corresponds to the animation duration
1990  
1991          // Create new background div and append it
1992          var newBackgroundDiv = document.createElement('div');
1993          newBackgroundDiv.className = 'srp-artworkbg';
1994
1995          if (!isFirstCall) {
1996            newBackgroundDiv.className += ' srp-fade-in';
1997          }
1998
1999          newBackgroundDiv.style.backgroundImage = 'url(' + artwork + ')';
2000          audioPlayer[0].appendChild(newBackgroundDiv);
2001        } else {
2002          // Next track has no artwork, remove the previous image with fade-out effect
2003          var backgrounds = audioPlayer.find('.srp-artworkbg');
2004          backgrounds.addClass('srp-fade-out');
2005          setTimeout(function() {
2006            backgrounds.remove();
2007          }, 2500); // Corresponds to the animation duration
2008        }
2009      }
2010    }
2011  }
2012  
2013  
2014  function setRandomList(tracks, firstTrackIndex = null) {
2015    var poolTrack = new Array();
2016    var i = 0;
2017    $(tracks).each(function () {
2018      poolTrack.push(i);
2019      i++;
2020      poolTrack = poolTrack.sort(function (a, b) {
2021        return 0.5 - Math.random();
2022      });
2023    });
2024
2025    if (firstTrackIndex != null) {
2026      const indexTrack = poolTrack.indexOf(firstTrackIndex);
2027      if (indexTrack !== -1) {
2028        poolTrack.splice(indexTrack, 1);
2029        poolTrack.unshift(firstTrackIndex);
2030      }
2031    }
2032    return poolTrack;
2033  }
2034
2035  function setPlaylist(playlist, $audio_el, audioPlayer) {
2036
2037    let playlistTimeDuration = 0;
2038    let trackNumberArray = [];
2039
2040    playlist.find('li').each(function (i) {
2041      if( ! $(this).data('relatedtrack') ){
2042        trackNumberArray.push(i+1);
2043      }else{
2044        trackNumberArray.push('');
2045      }
2046      preSetSingleTrack($(this));
2047      if ($(this).data('relatedtrack') != '1') { //Count playlist time duration
2048        if ($(this).data('tracktime')) {
2049          convertTime($(this).data('tracktime'));
2050          playlistTimeDuration = playlistTimeDuration + convertTime($(this).data('tracktime'));
2051        }
2052      }
2053
2054    });
2055
2056    //Output playlist time duration
2057    playlistTimeDuration = Math.round(playlistTimeDuration / 60) * 60; //Round to minutes
2058    playlistTimeDuration = moment.duration(playlistTimeDuration, "seconds");
2059    let durationOutput = '';
2060    let timeDurationMinutes = playlistTimeDuration._milliseconds / 60000;
2061    let timeDurationHours = Math.floor(timeDurationMinutes / 60);
2062    if (timeDurationHours > 0) {
2063      timeDurationMinutes = timeDurationMinutes - (timeDurationHours * 60);
2064      durationOutput += timeDurationHours + ' ' + audioPlayer.find('.srp_playlist_duration').data('hours-label') + ' ';
2065    }
2066    durationOutput += timeDurationMinutes + ' ' + audioPlayer.find('.srp_playlist_duration').data('minutes-label');
2067    audioPlayer.find('.srp_playlist_duration').html(durationOutput);
2068    
2069    if (!audioPlayer.hasClass('srp_reordered') && audioPlayer.listJs) {
2070      listJsInit(audioPlayer);
2071    }
2072    
2073    playlist.find('li').each(function () { //have to be loaded after listJsInit
2074      setFrontendSingleTrack($(this), $(this).index(), trackNumberArray[$(this).index()], $audio_el, audioPlayer);
2075      if( audioPlayer.hasClass('srp_has_customfields') ){
2076        setColumnCta(this);
2077      }
2078    });
2079 
2080  }
2081  
2082  // Debounce function
2083  function debounce(func, wait) {
2084    let timeout;
2085    return function(...args) {
2086      const context = this;
2087      clearTimeout(timeout);
2088      timeout = setTimeout(() => func.apply(context, args), wait);
2089    };
2090  }
2091
2092  var srmp3ResizeHandler = debounce(function() {
2093    if(IRON.audioPlayer.activePlayer){
2094        startAudioSpectrum(IRON.audioPlayer.activePlayer);
2095    }
2096    if(typeof sonaar_music.option.sticky_spectro_style !== "undefined" && sonaar_music.option.sticky_spectro_style != "none"){
2097        startAudioSpectrum('#sonaar-player')
2098    }
2099    $('.iron-audioplayer').each(function(){
2100        srp_setTrackListColumns(this , true);
2101    })
2102    if(typeof IRON.sonaar != 'undefined' && typeof IRON.sonaar.player != 'undefined'){
2103        if ($(window).outerWidth() > 540) {
2104            IRON.sonaar.player.isSmallDevice = false;
2105        } else {
2106            IRON.sonaar.player.isSmallDevice = true;
2107        }
2108    }
2109    IRON.setExtendedPlayerHeightVar();
2110  }, 500); // 250ms debounce time
2111
2112  $(window).on('resize', srmp3ResizeHandler);
2113
2114  function updatePaginationAjax(player) {
2115
2116    let currentPage = parseInt(player.srp_player_param['srp_page'], 10);
2117    if (isNaN(currentPage)) {
2118      currentPage = 1;
2119    }
2120    let postperpage = parseInt(player.srp_player_param['posts_per_page'], 10);
2121    let totalPages = parseInt(player.attr('data-total_pages'), 10);
2122
2123    let output = '';
2124    
2125    const ellipsis = '<li class="disabled"><span class="page">...</span></li>';
2126
2127    if (totalPages == 1){
2128      player.find('.srp_pagination_container').remove();
2129    }
2130    if (totalPages <= 5) {
2131      for (let i = 1; i <= totalPages; i++) {
2132          output += `<li${i === currentPage ? ' class="active"' : ''}><span class="page" data-i="${i}" data-page="${postperpage}">${i}</span></li>`;
2133      }
2134    } else {
2135      // Always display the first page
2136      output += `<li${currentPage === 1 ? ' class="active"' : ''}><span class="page" data-i="1"  data-page="${postperpage}">1</span></li>`;
2137    
2138      if (currentPage === 1) {
2139          output += `<li><span class="page" data-i="2"  data-page="${postperpage}">2</span></li>`;
2140          output += ellipsis;
2141      
2142      } else if (currentPage === 2) {
2143          output += `<li class="active"><span class="page" data-i="2"  data-page="${postperpage}">2</span></li>`;
2144          output += `<li><span class="page" data-i="3"  data-page="${postperpage}">3</span></li>`;
2145          output += ellipsis;
2146      
2147      } else if (currentPage === 3) {
2148          for (let i = 2; i <= 4; i++) {
2149              output += `<li${i === currentPage ? ' class="active"' : ''}><span class="page" data-i="${i}"  data-page="${postperpage}">${i}</span></li>`;
2150          }
2151          output += ellipsis;
2152      
2153      } else if (currentPage >= 4 && currentPage <= totalPages-3) {
2154          output += ellipsis;
2155          for (let i = currentPage - 1; i <= currentPage + 1; i++) {
2156              output += `<li${i === currentPage ? ' class="active"' : ''}><span class="page" data-i="${i}"  data-page="${postperpage}">${i}</span></li>`;
2157          }
2158          output += ellipsis;
2159      
2160      } else if (currentPage >= totalPages-2 && currentPage <= totalPages) {
2161          output += ellipsis;
2162          for (let i = totalPages - 3; i <= totalPages - 1; i++) {
2163              output += `<li${i === currentPage ? ' class="active"' : ''}><span class="page" data-i="${i}"  data-page="${postperpage}">${i}</span></li>`;
2164          }
2165      }
2166     
2167      // Always display the last page
2168      output += `<li${currentPage === totalPages ? ' class="active"' : ''}><span class="page" data-i="${totalPages}"  data-page="${postperpage}">${totalPages}</span></li>`;
2169    }
2170
2171    player.find('.srp_pagination').html(output);
2172    player.find('.srp_pagination').off('click');
2173    player.find('.srp_pagination--prev').off('click');
2174    player.find('.srp_pagination--next').off('click');
2175
2176    player.find('.srp_pagination').on('click', '.page', function() {
2177      let pageNumber = $(this).data('i'); // Get the page number from the data-i attribute
2178      $(this).parents('li').addClass('active').siblings().removeClass('active');
2179      srp_updatePage(pageNumber, player);
2180      IRON.audioPlayer.reloadAjax(player, true);
2181    });
2182
2183    player.find('.srp_pagination--prev').on('click', function(){
2184      if(player.find('.srp_pagination').find('.active').prev().length > 0){
2185        player.find('.srp_pagination').find('.active').prev().find('span')[0].click()
2186      }
2187    })
2188    player.find('.srp_pagination--next').on('click', function(){
2189      if(player.find('.srp_pagination').find('.active').next().length > 0){
2190        player.find('.srp_pagination').find('.active').next().find('span')[0].click()
2191      }
2192    });
2193
2194    let elements = player[0].querySelectorAll('.srp_sort');
2195
2196    const unwantedValues = [
2197      'srmp3_cf_album_title',
2198      'srmp3_cf_album_img',
2199      'srmp3_cf_audio_title',
2200      'srmp3_cf_description',
2201      'srmp3_cf_artist',
2202      'podcast-show',
2203      'product_tag',
2204      'product_cat',
2205      'playlist-category',
2206      'playlist-tag'
2207    ];
2208    function handleElementClick(sortValue, e) {
2209      e.preventDefault();
2210      // Special condition for tracklist-item-title
2211      if (sortValue === 'tracklist-item-title') {
2212          sortValue = 'title';
2213      }
2214      if (sortValue === 'post_id') {
2215        sortValue = 'ID';
2216      }
2217      if (sortValue === 'post_date') {
2218        sortValue = 'date';
2219      }
2220      if (sortValue === 'post_modified') {
2221        sortValue = 'modified';
2222      }
2223
2224      // Check current URL for srp_order value and decide on ascending or descending
2225      const currentOrder = new URLSearchParams(window.location.search).get('srp_order');
2226      if (currentOrder === `${sortValue}_asc`) {
2227          sortValue += '_desc';
2228      } else {
2229          sortValue += '_asc';
2230      }
2231      srp_updatePage(1, player);
2232      srp_updateOrder(sortValue, player);
2233      IRON.audioPlayer.reloadAjax(player, true)
2234    }
2235
2236    elements.forEach(element => {
2237      if (element._clickHandler) {
2238        element.removeEventListener('click', element._clickHandler);
2239      }
2240      let sortValue = element.getAttribute('data-sort').replace('sr-playlist-cf--', '');
2241        // Skip unwanted values
2242      if (unwantedValues.includes(sortValue)) {
2243        $(element).removeClass('srp_sort');
2244        $(element).css('pointer-events', 'none');
2245        return;
2246      }
2247      const boundClickHandler = handleElementClick.bind(null, sortValue);
2248      element.addEventListener('click', boundClickHandler);
2249      element._clickHandler = boundClickHandler; // store the reference for later removal
2250      
2251    });
2252
2253  }
2254
2255
2256  //Reset the tracklist when is has been modified by the search/filter options
2257  var srp_wait = false; 
2258  function listJsInit(audioPlayer) {
2259   
2260    if(audioPlayer.lazy_load){
2261      return;
2262    }
2263    //return; //should do this if we are in lazyload...but the search seems to stop working (not added in the query url)
2264    if( !audioPlayer.find('.srp_list li').length )
2265      return;
2266
2267    
2268    if( typeof List == 'undefined')
2269    return;
2270
2271    const sortItems = ['srp_cf_data', 'tracklist-item-title', 'srp_track_description','tracklist-item-time', { name: 'srp_tracklist-item-date', attr: 'date' }]; // add default values
2272    const sortItemsFromCF = audioPlayer.find('.srp_list').data('filters').split(',').map(function(el) { return "sr-playlist-cf--" + el}); //get all elements from data-sortby, convert them to array and add prefix "sr-playlist-cf--" to all element. 
2273
2274    let sortOptions = sortItems.concat(sortItemsFromCF); //['tracklist-item-title', 'sr-playlist-cf--artist_name', 'sr-playlist-cf--acf_category', 'sr-playlist-cf--acf_beats_per_minutes', 'sr-playlist-cf--has_drum', 'srp_track_description', 'tracklist-item-time', { name: 'srp_tracklist-item-date', attr: 'date' }]; //Set searching area
2275
2276    var options = {
2277      valueNames: sortOptions,
2278      listClass: 'srp_list',
2279      searchClass: 'srp_search',
2280      sortClass: 'srp_sort',
2281      //page: audioPlayer.data("tracks-per-page"),
2282      /*pagination: [{
2283        name: "srp_pagination",
2284        paginationClass: "srp_pagination",
2285        outerWindow: 1
2286      }],*/
2287      //indexAsync: true,
2288      searchDelay: 1000,
2289 
2290     // pagination: true
2291    };
2292    
2293    if(audioPlayer.data("tracks-per-page")){
2294      options.page = audioPlayer.data("tracks-per-page");
2295      options.pagination = [{
2296        name: "srp_pagination",
2297        item: '<li><span class="page" onclick="srp_scrollToTrackListTop(\''+audioPlayer.id+'\')"></span></li>',
2298        paginationClass: "srp_pagination",
2299        outerWindow: 1,
2300        innerWindow: 1
2301      }]
2302      audioPlayer.find('.srp_pagination--prev').on('click', function(){
2303        if(audioPlayer.find('.srp_pagination').find('.active').prev().length > 0){
2304          audioPlayer.find('.srp_pagination').find('.active').prev().find('span')[0].click()
2305        }
2306      })
2307      audioPlayer.find('.srp_pagination--next').on('click', function(){
2308        if(audioPlayer.find('.srp_pagination').find('.active').next().length > 0){
2309          audioPlayer.find('.srp_pagination').find('.active').next().find('span')[0].click()
2310        }
2311      })   
2312      audioPlayer.addClass('srp_reordered');  
2313   }
2314
2315   
2316
2317
2318
2319    const tracklistID = audioPlayer.find('.playlist').attr('id');
2320    for (var playerIndex = 0; playerIndex < IRON.players.length && IRON.players[playerIndex].audioPlayer.attr('id') != tracklistID; playerIndex++) { }; //Set playerIndex
2321    audioPlayer.orderedList = new List(tracklistID, options);
2322    audioPlayer.orderedList.on('updated', function () {
2323
2324      if (IRON.audioPlayer.stickyEnable && IRON.sonaar.player.selectedPlayer == audioPlayer) { //if Sticky is sync to this widget player, unsync them before modifying the tracklist.
2325        IRON.sonaar.player.selectedPlayer = null;
2326        audioPlayer.removeClass('sr_selectedPlayer');
2327        audioPlayer.removeClass('audio-playing');
2328        IRON.sonaar.player.playlistID = null;
2329      }
2330      audioPlayer.addClass('srp_reordered');
2331      if (IRON.audioPlayer.stickyEnable || ! audioPlayer.hasClass('sr_selectedPlayer')) { //Reset the player if sticky is enabled or when the page is loaded with filterOrSearch parameter in the URL
2332      
2333        var player = Object.create(IRON.audioPlayer); // pour reloader avec pagnination (sans ajax)
2334        player.init(audioPlayer);
2335        IRON.players[playerIndex] = player;
2336      }else{ //keep the current track playing and unselect the current track from the track list
2337        audioPlayer.find('.srp_list .current').removeClass('current');
2338        audioPlayer.data('currentTrack', 999999);// CurrentTrack equal 999999 when we dont want a track selected in the tracklist
2339        var relatedtrackCount = 0;
2340        audioPlayer.find('.playlist li').each(function () { //initialize new tracklist
2341          if( $(this).data('relatedtrack') ){
2342            relatedtrackCount++;
2343          }
2344          var trackNumber = $(this).index() + 1 - relatedtrackCount;
2345          if($(this).data('init') !== true){ //Dont init twice the same track
2346            setFrontendSingleTrack($(this), $(this).index(), trackNumber, IRON.players[playerIndex].$audio_el, audioPlayer);
2347          }
2348        })
2349
2350      }
2351      srp_setTrackListColumns(audioPlayer);
2352
2353      if (audioPlayer.shuffle && !IRON.audioPlayer.stickyEnable) { //Reset random order if shuffle is enabled and sticky is not enabled
2354        random_order = setRandomList(audioPlayer.orderedList.visibleItems, 0);
2355      }
2356
2357    })
2358  }
2359
2360  function checkIfResult(audioPlayer){
2361    
2362    if( $(audioPlayer).find(".srp_list li").length){
2363      audioPlayer.find('.srp_notfound').css('display', 'none');
2364      audioPlayer.find('.sr-cf-heading').css('display', 'flex');
2365      audioPlayer.find('.srp_pagination_container').css('display', 'flex');
2366      //audioPlayer.find('.playlist').css('display', '');
2367    } else {      
2368      if( typeof audioPlayer.attr('data-total_items') != 'undefined' || audioPlayer.hasClass('srp_player_is_recentlyPlayed') || audioPlayer.hasClass('srp_player_is_purchased_track') || audioPlayer.hasClass('srp_player_is_favorite') ){
2369        // No track found and its from a search filters or from a specific player type. We want to display a not found notice.
2370        audioPlayer.find('.srp_notfound').css('display', 'block');
2371      }else{
2372        // No track found. We dont want to display the tracklist at all. (eg: a single widget player) we may want to keep the player tho because it may contains usefull admin notice (WIP).
2373      //  audioPlayer.find('.playlist').css('display', 'none');
2374      }
2375      audioPlayer.find('.sr-cf-heading').css('display', 'none');
2376      audioPlayer.find('.srp_pagination_container').css('display', 'none');
2377    }
2378   
2379    
2380  }
2381
2382  $('.srp_search').keydown(function(e) { //Trigger search on keyup - we are inittiating search field inside the player seperatly for ajax.
2383    if( !$(this).parents('.iron-audioplayer').length ){
2384      IRON.searchField.search(this, e);
2385    }
2386  });
2387
2388  $('.srp_search_container .srp_reset_search').click(function() {
2389    //delete search keywords on icon click
2390    const metaValue = $(this).parents('.srp_search_container').find('input')[0].value;
2391    const playerId = $(this).parents('.srp_search_container').data('player-id');
2392    srp_removeMeta('search', metaValue, playerId);
2393  });
2394
2395  function setTime(audioPlayer, $audio_el) {
2396    $($audio_el).on("timeupdate", function () {
2397      karaokeMode(audioPlayer, $audio_el.currentTime);
2398      setTimeCurrentTime(audioPlayer, $audio_el.currentTime);
2399      setTimeTotalTime(audioPlayer, $audio_el)
2400      IRON.setTracksTimeMemories(audioPlayer);
2401    });
2402  }
2403
2404  function setTimeCurrentTime(audioPlayer, currentTime) {;
2405    var time = moment.duration(currentTime, "seconds");
2406    if (time.hours() >= 12 || time.hours() <= 0) {
2407      audioPlayer.find(".currentTime").html(moment(time.minutes() + ":" + time.seconds(), "m:s").format("mm:ss"));
2408    } else {
2409      audioPlayer.find(".currentTime").html(moment(time.hours() + ":" + time.minutes() + ":" + time.seconds(), "h:m:s").format("h:mm:ss"));
2410    }
2411  }
2412
2413  function setTimeTotalTime(audioPlayer, $audio_el) {
2414    if ($audio_el.duration !== Infinity) {
2415      var timeLeft = moment.duration($audio_el.duration - $audio_el.currentTime, "seconds");
2416      if(timeLeft.milliseconds() > 0){
2417        if (timeLeft.hours() >= 12 || timeLeft.hours() <= 0) {
2418          audioPlayer.find(".totalTime").html("-" + moment(timeLeft.minutes() + ":" + timeLeft.seconds(), "m:s").format("mm:ss"));
2419        } else {
2420          audioPlayer.find(".totalTime").html("-" + moment(timeLeft.hours() + ":" + timeLeft.minutes() + ":" + timeLeft.seconds(), "h:m:s").format("h:mm:ss"));
2421        }
2422      }else{
2423        audioPlayer.find(".totalTime").html("");
2424      }
2425    } else {
2426      audioPlayer.find(".totalTime").html("");
2427    }
2428  }
2429
2430  function seekTime(time) {
2431    if (IRON.audioPlayer.stickyEnable) {
2432      IRON.sonaar.player.seekTime(time);
2433    } else {
2434      if (time) {
2435        if (this.audioPlayer.find('.sonaar_media_element')[0].duration !== Infinity) {
2436          this.audioPlayer.find('.sonaar_media_element')[0].currentTime = convertTime(time);
2437        }
2438      }
2439    }
2440  }
2441  /*
2442    setControl is called on load before audio playing
2443    */
2444  function setControl($audio_el, audioPlayer, playlist) {
2445    audioPlayer.unbind('click');
2446    if (audioPlayer.stickyPlayer) {
2447      audioPlayer.on("click", ".play, .album .album-art", function (event) {
2448        if ($(audioPlayer).hasClass("sr_selectedPlayer")) {
2449            IRON.sonaar.player.play();
2450        } else {
2451          if(audioPlayer.id == 'popup_player'){
2452              var playButton = IRON.bt_that_launched_the_popup.closest('li.sr-playlist-item').find('.srp_audio_trigger');
2453              var singlePlayerButton = IRON.bt_that_launched_the_popup.closest('.srp_control_box').find('.srp-play-button');
2454              if (playButton.length > 0) { // popup has been triggered from a widget player
2455                playButton.click(); 
2456              } else if(singlePlayerButton.length > 0){ // popup has been triggered from a single player
2457                singlePlayerButton.click();
2458              } else if(IRON.sonaar.player.selectedPlayer){ // popup has been triggered from a sticky player
2459                var selectedPlayerWidget = IRON.sonaar.player.selectedPlayer[0];
2460                var postId = audioPlayer.list.tracks[0].sourcePostID;
2461                var trackPos = audioPlayer.list.tracks[0].track_pos;
2462                playButton = $(selectedPlayerWidget).find('.sr-playlist-item[data-post-id="'+postId+'"][data-track-pos="'+trackPos+'"] .srp_audio_trigger');
2463                if(playButton.length > 0){
2464                  playButton.click();
2465                }else{
2466                  play(audioPlayer, $audio_el, playlist);
2467                }
2468              }else{ // condition cta wont work but the track will still be able to play
2469                play(audioPlayer, $audio_el, playlist);
2470              }
2471          }else{
2472            play(audioPlayer, $audio_el, playlist);
2473          }
2474        }
2475        event.preventDefault();
2476      });
2477      audioPlayer.on("click", ".previous", function (event) {
2478        previous(audioPlayer, playlist);
2479        event.preventDefault();
2480      });
2481      audioPlayer.on("click", ".next", function (event) {
2482        next(audioPlayer, $audio_el, playlist);
2483        event.preventDefault();
2484      });
2485    } else {
2486      audioPlayer.on("click", ".play, .album .album-art", function (event) {
2487
2488        if(!audioPlayer.hasClass('sr_selected') && !audioPlayer.hasClass('audio-playing')){
2489          sr_addTrackToPlaylist( $(audioPlayer).find('.playlist li').eq($(audioPlayer).attr('trackselected')), audioPlayer);
2490        }
2491        togglePause(audioPlayer);
2492
2493        if (!audioPlayer.hasClass("audio-playing")) {
2494          play(audioPlayer, $audio_el);
2495          triggerPlay(audioPlayer);
2496        } else {
2497          togglePause(audioPlayer);
2498        }
2499        togglePlaying(audioPlayer, $audio_el);
2500        event.preventDefault();
2501      });
2502      audioPlayer.on("click", ".previous", function (event) {
2503        previous(audioPlayer, playlist);
2504        event.preventDefault();
2505      });
2506      audioPlayer.on("click", ".next", function (event) {
2507        next(audioPlayer, $audio_el, playlist);
2508        event.preventDefault();
2509      });
2510    }
2511    audioPlayer.on("click", ".sr_skipForward", function () {
2512      sr_audioSkipTo(30, $audio_el);
2513    });
2514    audioPlayer.on("click", ".sr_skipBackward", function () {
2515      sr_audioSkipTo(-15, $audio_el);
2516    });
2517    audioPlayer.on("click", ".sr_shuffle", function (event) {
2518      sr_shuffleToggle(event, audioPlayer);
2519    });
2520    audioPlayer.on("click", ".srp_repeat", function () {
2521      IRON.repeatButtonToggle();
2522    });
2523    audioPlayer.on("click", ".sr_speedRate", function (event) {
2524      sr_setSpeedRate(event, audioPlayer, $audio_el);
2525    });
2526    audioPlayer.on("click", ".volume .sricon-volume", function (event) {
2527      sr_muteTrigger(event, audioPlayer, $audio_el);
2528    });
2529    audioPlayer.on("mouseenter", ".volume .sricon-volume", function (event) {
2530      sr_updateSlider(event, audioPlayer);
2531    });
2532    audioPlayer.on('click', '.srp_swiper-control .srp_play', function (event) {
2533      IRON.swiper.play(this, audioPlayer);
2534    });
2535
2536    audioPlayer.on("click", ".srp_noteButton i", function () {
2537      let noteParent;
2538      if ($(this).parents('.sr-playlist-item').length) {
2539        noteParent = $(this).parents('.sr-playlist-item');
2540      } else {
2541        noteParent = $(this).parents('.srp_player_boxed');
2542      }
2543      if (noteParent.find('.srp_note').length == 0) {
2544        const el = $(this);
2545        srp_wc_loadspinner(el);
2546        var data = {
2547          'action': 'load_track_note_ajax',
2548          'post-id': $(this).attr('data-source-post-id'),
2549          'track-position': $(this).attr('data-track-position'),
2550          'track-title': $(this).attr('data-track-title'),
2551          'track-desc-postcontent': $(this).attr('data-track-use-postcontent'),
2552          'nonce': sonaar_music.ajax.ajax_nonce
2553        };
2554
2555        $.post(sonaar_music.ajax.ajax_url, data, function (response) {
2556          srp_wc_unloadspinner(el);
2557          response = JSON.parse(response);
2558          const notePopup = $('<article/>', { class: 'srp_note' });
2559          $(notePopup).hide();
2560          $(notePopup).prepend('<div class="sr_close">' + closeSvg + '</div>' + response);
2561          if (el.parents('.sr-playlist-item').length) {
2562            if (el.parents('.sr-playlist-item').find('.srp_note').length == 0) { //not insert the note if it is already append
2563              if(el.parents('.srp_tracklist_grid').length){
2564                el.parents('.sr-playlist-item').find('.store-list').before(notePopup);
2565              }else{
2566                el.parents('.sr-playlist-item').append(notePopup);
2567              }
2568            }
2569            toggleNote(el);
2570          } else {
2571            $(audioPlayer).find('.srp_player_boxed').prepend(notePopup);
2572            toggleNote(el);
2573          }
2574        })
2575      } else {
2576        toggleNote($(this));
2577      }
2578    });
2579
2580    audioPlayer.on('click', '.sr_track_cover', function (event) {
2581      if( !audioPlayer.hasClass('srp_tracklist_grid') ) return;
2582      if ( $(event.target).is('.srp_play')) return;
2583      if( $('.srp_play:hover').length ) return; //if the play button is hovered, do nothing
2584      
2585      if ($(this).parents('.sr-playlist-item').data('post-url')) { 
2586       // l'option to link the tracklist title is enable
2587        // go to the post url
2588        window.location.href = $(this).parents('.sr-playlist-item').data('post-url');
2589      }
2590    });
2591    audioPlayer.on('click', '.sr_track_cover .srp_play', function () {
2592      $(this).parents('.sr-playlist-item').find('.srp_audio_trigger').click();
2593    });
2594    audioPlayer.on("click", ".srp_note .sr_close", function () {
2595      toggleNote($(this));
2596    });
2597    audioPlayer.on('mouseenter', '.sr-playlist-item:not(.srp_extendable) .song-store-list-menu', function () {
2598      openStoreListContainer(this);
2599    });
2600    audioPlayer.on('mouseleave', '.sr-playlist-item:not(.srp_extendable) .song-store-list-container', function () {
2601      closeStoreListContainer(this);
2602    });
2603    
2604    audioPlayer.on('mouseenter', '.srp_extendable, .song-store-list-menu, .srp_ellipsis', function () {
2605      if( 
2606        ($(audioPlayer).hasClass('srp_responsive') && $('.song-store-list-menu:hover, .srp_ellipsis:hover').length ) ||
2607        ! audioPlayer.hasClass('srp_responsive')  
2608        ){
2609          const el = ( $(this).hasClass('srp_extendable') )? $(this) : $(this).parents('.srp_extendable');
2610          el.find('.song-store-list-menu').width('fit-content');
2611          el.addClass('srp_extended')
2612      }
2613    });
2614    audioPlayer.on('mouseleave', '.srp_extendable', function () {
2615      let width;
2616      if(audioPlayer.hasClass('srp_responsive')){
2617        width = ( $(this).find('.song-store-list-menu').data('mobile-width') )? $(this).find('.song-store-list-menu').data('mobile-width') : 100 ;
2618      }else{
2619        width = ( $(this).find('.song-store-list-menu').data('width') )? $(this).find('.song-store-list-menu').data('width') : 200 ;
2620      }
2621      $(this).find('.song-store-list-menu').width(width);
2622      $(this).removeClass('srp_extended')
2623    });
2624
2625    audioPlayer.on('click', '.srp_wc_variation_button', function () {
2626      if($(this).find('.sricon-spinner-wrap').length) return; //if the button is already loading, do nothing
2627      srp_variation_button(this);
2628      return false;
2629    })
2630    audioPlayer.on('click', '.srp-make-offer-bt', function () {
2631      if($(this).find('.sricon-spinner-wrap').length) return; //if the button is already loading, do nothing
2632      srp_variation_button(this);
2633      return false;
2634    })
2635
2636    // Event listener for the regular audio player
2637    audioPlayer.on('click', '.sr_store_ask_email', function(e) {
2638      e.preventDefault();
2639      handleAskEmailClick($(this));
2640    });
2641
2642    audioPlayer.find('.playlist .ajax_add_to_cart').on('click', function () {
2643      srp_add_to_cart_loadspinner($(this));
2644    })
2645
2646    //Store button ajax call for popup
2647    audioPlayer.off('click', '.sr-store-popup');
2648    audioPlayer.on('click', '.sr-store-popup', function () {
2649      let playerId = 0;
2650      const el = this;
2651      $(IRON.players).each(function () {
2652        if (this.audioPlayer.id == $(el).parents('.iron-audioplayer').data('id')) {
2653          playerId = this.audioPlayer.id;
2654          return;
2655        }
2656      })
2657      const id = $(this).data('source-post-id');
2658      const storeId = $(this).data('store-id');
2659      const trackNumber = $(this).parents('.sr-playlist-item').index();
2660      sr_popUp(id, storeId, trackNumber, playerId, $(this));
2661    })
2662    audioPlayer.find('.srp_search').keydown(function(e) { //Trigger search on keyup 
2663        IRON.searchField.search(this, e);
2664    });
2665  }
2666
2667
2668  function toggleNote(el) {
2669    let noteParent;
2670    if (el.parents('.sr-playlist-item').length) {
2671      noteParent = el.parents('.sr-playlist-item');
2672    } else {
2673      noteParent = el.parents('.srp_player_boxed');
2674    }
2675    const currentOpened = (noteParent.find('.srp_note').attr('data-note') == 'opened') ? true : false;
2676    el.parents('.iron-audioplayer').find('.srp_note_opened').each(function () {
2677      const item = $(this);
2678      $(this).removeClass('srp_note_opened');
2679      $(this).find('.srp_note').attr('data-note', 'closed')
2680      if (el.parents('.sr-playlist-item').length) {
2681        $(this).find('.srp_noteButton i.sricon-close-circle').removeClass('sricon-close-circle').addClass('sricon-info');
2682        $(this).find('.srp_note').css('opacity', 1).slideUp(125, function () {
2683          if (item.find('.srp_track_description').length) {
2684            item.find('.srp_track_description').fadeIn(75);
2685          }
2686        }).animate(
2687          { opacity: 0 },
2688          { queue: false, duration: 125 }
2689        );
2690      } else {
2691        $(this).find('.srp_note').fadeOut(125);
2692      }
2693    });
2694    if (!currentOpened) {
2695      noteParent.find('.srp_note').attr('data-note', 'opened');
2696      if (el.parents('.sr-playlist-item').length) {
2697        noteParent.find('.srp_noteButton i.sricon-info').removeClass('sricon-info').addClass('sricon-close-circle');
2698        if (noteParent.find('.srp_track_description').length) {
2699          noteParent.find('.srp_track_description').fadeOut(75, function () {
2700            noteParent.find('.srp_note').css('opacity', 0).slideDown(125).animate(
2701              { opacity: 1 },
2702              { queue: false, duration: 250 }
2703            );
2704          });
2705        } else {
2706          noteParent.find('.srp_note').css('opacity', 0).slideDown(125).animate(
2707            { opacity: 1 },
2708            { queue: false, duration: 250 }
2709          );
2710        }
2711      } else {
2712        noteParent.find('.srp_note').fadeIn(125);
2713      }
2714      noteParent.addClass('srp_note_opened');
2715    }
2716  }
2717  /*
2718  Set Lyrics of what is currently playing
2719  */
2720  function karaokeMode(audioPlayer, currentTime) {
2721    var selectedLyricLine = '';
2722    var i = 0
2723    if ($(audioPlayer).length == 0 && IRON?.sonaar?.player?.currentTrack != null) {
2724      //Sticky player is loaded on page load setting. Check if it has lyrics.
2725      var currentTrack = IRON.sonaar.player.currentTrack;
2726      if(!IRON.sonaar.player.list.tracks[currentTrack].has_lyric) return;
2727      var playerId = 0;
2728    }else if (audioPlayer.stickyPlayer) {
2729      var currentTrack = IRON.sonaar.player.currentTrack;
2730      if(!IRON.sonaar.player.list.tracks[currentTrack].has_lyric) return;
2731      var playerId = IRON.sonaar.player.selectedPlayer.id;
2732    } else {
2733      if($(audioPlayer).find('.sr-playlist-item.current').data('track-lyric') != '1') return;
2734      var currentTrack = $(audioPlayer).find('.sr-playlist-item.current').index();
2735      var playerId = $('.iron-audioplayer.sr_selectedPlayer').data('id');
2736    }
2737
2738    $('.srp_selected_player').removeClass('srp_selected_player');
2739
2740    $('#sonaar-modal[data-track-number="' + currentTrack + '"][data-player-id="' + playerId + '"]').addClass("srp_
2740selected_player");
2741    while (i < 3 && selectedLyricLine.length == 0) {
2742      selectedLyricLine = $('#srmp3_lyrics_container p[begin="' + (currentTime - i) + '"], #srmp3_lyrics_container p[begin^="' + Math.floor(currentTime - i) + '."], #sonaar-modal.srp_selected_player p[begin="' + (currentTime - i) + '"], #sonaar-modal.srp_selected_player p[begin^="' + Math.floor(currentTime - i) + '."]')
2743      i++;
2744    }
2745
2746    if (selectedLyricLine.length) {
2747      selectedLyricLine.parents('.srmp3_lyrics, #sonaar-modal.srp_selected_player').addClass("srmp3_singning");
2748
2749      $(".srmp3_lyrics_read").removeClass("srmp3_lyrics_read");
2750      selectedLyricLine.addClass("srmp3_lyrics_read");
2751      jQuery('#srmp3_sticky_lyrics').replaceWith(
2752        jQuery('<span>', {
2753          id: 'srmp3_sticky_lyrics',
2754          class: 'srmp3_lyrics_container',
2755          title: $(selectedLyricLine[0]).text(),
2756          text: $(selectedLyricLine[0]).text()
2757        }).appendTo('#srmp3_lyricsplaying_container'));
2758
2759      // keep lyrics centered in the modal
2760      if (!document.getElementById('srmp3_lyrics_container').classList.contains('srp_lyric_unlock')) {
2761        srp_lyricsAreScrolling = true;
2762        var element = document.querySelector("#srmp3_lyrics_container .srmp3_lyrics_read");
2763        element.scrollIntoView({ behavior: "auto", block: "center", inline: "nearest" });
2764      }
2765    }
2766
2767  }
2768  function fakeWaveClick(from) {
2769    $(".sr_selectedPlayer .sonaar_fake_wave, #sonaar-player .sonaar_fake_wave, .mobileProgress").off("click");
2770    $(".sr_selectedPlayer .sonaar_fake_wave, #sonaar-player .sonaar_fake_wave, .mobileProgress").on("click", function (event) {
2771      if( $(this).parents('.iron-audioplayer').length && ! $(this).parents('.sr_selectedPlayer').length){
2772        return;
2773      }
2774      if($(this).parents('.sr-playlist-item:not(.current)').length){
2775        $(this).parents('.sr-playlist-item').find('.srp_audio_trigger').trigger('click');
2776      }
2777      if (from == "sticky") {
2778        var currentAudio = document.getElementById("sonaar-audio");
2779      } else {
2780        var currentAudio = $(this).parents('.iron-audioplayer').find('.album-player .sonaar_media_element')[0];
2781      }
2782      var progressedAudio = $(this).width() / event.offsetX;
2783
2784      function waitUntilNewTrackIsloaded() { //when we click on waveform from the tracklist, we need to wait until the new track is loaded before seeking to the right position
2785        if( !isNaN(currentAudio.duration) ) {
2786          const duration = (currentAudio.duration == 'Infinity')? currentAudio.buffered.end(currentAudio.buffered.length-1) : currentAudio.duration;
2787          currentAudio.currentTime = duration / progressedAudio;
2788          event.preventDefault();
2789          clearInterval(intervalId);
2790        }
2791      }
2792      const intervalId = setInterval(waitUntilNewTrackIsloaded, 50);
2793      setTimeout(() => {
2794          clearInterval(intervalId);
2795      }, 3000);
2796    });
2797  }
2798
2799  function preSetSingleTrack(singleTrack) {
2800    var soundwaveWrapper = singleTrack.find('.srp_soundwave_wrapper');
2801    var storeList = singleTrack.find('.store-list');
2802    var costumFieldColumns = singleTrack.find('.sr-playlist-cf-container');
2803    var noteButton = singleTrack.find('.srp_noteButton');
2804    const date = (typeof singleTrack.data('date-formated'))? singleTrack.data('date-formated') : '';
2805    singleTrack.removeAttr('data-date-formated');
2806
2807    singleTrack.find('.srp_soundwave_wrapper, .store-list, .sr-playlist-cf-container, .srp_noteButton').remove();
2808    singleTrack.find(".audio-track").remove();
2809
2810    $("");
2811    var audioTrigger = $("<div/>", {
2812      class: 'srp_audio_trigger'
2813    })
2814
2815    singleTrack.find('.srp_tracklist-item-date').remove();
2816    let tracklistItemMeta = '<span class="srp_tracklist-item-date" date="' + singleTrack.data('date') + '"';
2817    if (singleTrack.data('show-date') != '1') {
2818      tracklistItemMeta += ' style="display:none;"'
2819    }
2820    tracklistItemMeta += '>' + date + '</span>';
2821    tracklistItemMeta += '<span class="tracklist-item-time">' + singleTrack.data("tracktime") + '</span>';
2822
2823    if (singleTrack.data('post-url')) { // l'option to link the tracklist title is enable
2824      var tracklistItemContentBox = $("<div/>", { class: 'audio-track' });
2825      var playAndNumber = audioTrigger;
2826      var tracklistItemTitle = $("<a/>", { class: 'tracklist-item-title', href: singleTrack.data('post-url') }).append(singleTrack.data('tracktitle'));
2827    } else {
2828      var tracklistItemContentBox = $(audioTrigger).addClass('audio-track');
2829      var tracklistItemTitle = $("<div/>", { class: 'tracklist-item-title' }).append(singleTrack.data('tracktitle'));
2830      var playAndNumber = $("<span/>", {
2831        class: 'track-number',
2832        html:
2833          '<span class="number"></span><i class="sricon-play" aria-label="Play Track"></i>',
2834      });
2835    }
2836
2837   tracklistItemContentBox
2838   .append(playAndNumber)
2839   .append(tracklistItemTitle)
2840   .append(soundwaveWrapper)
2841   .append(tracklistItemMeta);
2842
2843   var playlistItemFlex = singleTrack.find('.sr-playlist-item-flex').length ? singleTrack.find('.sr-playlist-item-flex') : singleTrack;
2844   
2845   playlistItemFlex
2846   .append(tracklistItemContentBox)
2847   .append(costumFieldColumns)
2848   .append(storeList)
2849   .append(noteButton);
2850  }
2851
2852  function setFrontendSingleTrack(singleTrack, eq, trackNumber, $audio_el, audioPlayer) {
2853    singleTrack.data('init', true); //Dont init twice the same track with listjs
2854    singleTrack.find('.srp_audio_trigger').on("click", function (event) {
2855        if ($(event.target).closest('.srp_soundwave_wrapper').length) {
2856          return;
2857        }
2858        if ($(this).find('.srp_noteButton:hover').length ) { //if we click on the note button: Note button could be inside the srp_audio_trigger in the tracklist grid layout
2859          return;
2860        }
2861
2862        if ($(this).parents('.sr-playlist-item').attr("data-audiopath").length == 0) {
2863          return;
2864        }
2865
2866        if ( !IRON.audioPlayer.stickyEnable && audioPlayer.hasClass('srp_reordered') || audioPlayer.hasClass('srp_player_is_favorite')) { 
2867          eq = $(this).parents('.sr-playlist-item').index(); //Base the EQ value on the tracklist order when the track list has been manipulated by filter or favorite 
2868        }
2869
2870        if (audioPlayer.stickyPlayer && $(audioPlayer).hasClass('sr_selectedPlayer') && IRON.sonaar.player.currentTrack == eq) { //IF  track already loaded in the sticky player
2871          IRON.sonaar.player.play();
2872          return;
2873        }
2874
2875        if (audioPlayer.stickyPlayer) {
2876          IRON.sonaar.player.setPlaylist(audioPlayer, eq, srp_startingTime);
2877          srp_startingTime = 0;
2878          audioPlayer.data("currentTrack", eq);
2879        }
2880
2881        if (ifTrackIsPlaying($audio_el) && singleTrack.hasClass("current") && $(audioPlayer).hasClass('sr_selected')) {
2882          if (audioPlayer.stickyPlayer) {
2883            play(audioPlayer, $audio_el);
2884          } else {
2885
2886            togglePause(audioPlayer);
2887            togglePlaying(audioPlayer, $audio_el);
2888          }
2889        } else if (singleTrack.hasClass("current") && $(audioPlayer).hasClass('sr_selected')) {
2890          play(audioPlayer, $audio_el);
2891        } else {
2892          if (!audioPlayer.stickyPlayer) {
2893            togglePause(audioPlayer);
2894            setAudio(singleTrack.data("audiopath"), $audio_el);
2895            $audio_el.play();
2896          }  
2897          
2898          setCurrentTrack(singleTrack, eq, audioPlayer, $audio_el);
2899          $(document).trigger("sonaarStats", [audioPlayer]);
2900          audioPlayer.find(".playlist li").removeClass("current");
2901          singleTrack.addClass("current");
2902
2903
2904          if (!audioPlayer.stickyPlayer) {
2905            sr_addTrackToPlaylist(singleTrack, audioPlayer);
2906            IRON.audioPlayer.sr_loadLyricsAjax(singleTrack.attr("data-post-id"), singleTrack.attr("data-track-pos"));
2907          }
2908          triggerPlay(audioPlayer);
2909          togglePlaying(audioPlayer, $audio_el);
2910          IRON.audioPlayer.activePlayer = audioPlayer;
2911          var trackTitle = String(singleTrack.data("tracktitle")).replace(/<span.*?span>/g, '');
2912          var albumTitle = singleTrack.data("albumtitle");
2913          var artistName = singleTrack.data("artist");
2914          var albumArt = singleTrack.data("albumart");
2915
2916          IRON.audioPlayer.currentTrackData = {
2917            trackTitle: trackTitle,
2918            albumTitle: albumTitle,
2919            artistName: artistName,
2920            albumArt: albumArt
2921          }
2922
2923          setMediaSessionAPI(trackTitle, albumTitle, artistName, albumArt);
2924        }
2925        if(audioPlayer.hasClass('srp_player_spectrum') && !audioPlayer.stickyPlayer){
2926          startAudioSpectrum(audioPlayer);
2927        }
2928        
2929        IRON.init_generatePeaks(audioPlayer);
2930        
2931        event.preventDefault();
2932      });
2933
2934      if (singleTrack.data('post-url')) { // l'option to link the tracklist title is enable
2935        singleTrack.find('.srp_audio_trigger').addClass('track-number').html('<span class="number">' + trackNumber + '</span><i class="sricon-play" aria-label="Play Track"></i>');
2936      }else{
2937        singleTrack.find('.track-number .number').html(trackNumber);
2938      }
2939
2940      singleTrack.find('.store-list').before(singleTrack.find('.audio-track'));
2941      if( $(audioPlayer).hasClass('srp_tracklist_grid') ){
2942        singleTrack.find('.audio-track').after(singleTrack.find('.srp_soundwave_wrapper'));
2943        singleTrack.find('.store-list').before(singleTrack.find('.srp_tracklist-item-date'));
2944        singleTrack.find('.store-list').before(singleTrack.find('.srp_track_description'));
2945        singleTrack.find('.audio-track').append(singleTrack.find('.srp_noteButton'));
2946      }
2947
2948      singleTrack.find('.sr-playlist-cf-container').before(singleTrack.find('.audio-track'));
2949      singleTrack.find('.sr-playlist-cf-container').before(singleTrack.find('.sr_track_cover.srp_spacer'));
2950      if(singleTrack.find('.srp_soundwave_wrapper').length){
2951        IRON.createFakeWave(audioPlayer, false, singleTrack);
2952      }
2953
2954      if(audioPlayer.trackMemory){
2955        const trackMemoryKey = IRON.getTrackMemoryKeyFormat(singleTrack.data('audiopath'));
2956        if(typeof IRON.localStorageTrackMemory[trackMemoryKey] == 'object'){
2957          const [currentTime, duration] = IRON.localStorageTrackMemory[trackMemoryKey];
2958          singleTrack.data( 'current-time', IRON.localStorageTrackMemory[trackMemoryKey][0] );
2959          singleTrack.find('.sonaar_wave_cut').width((currentTime / duration) * 100 + "%");
2960          audioPlayer.list.tracks[eq].hasCompleted = (typeof IRON.localStorageTrackMemory[trackMemoryKey][2] != 'undefined' && IRON.localStorageTrackMemory[trackMemoryKey][2] == true)? true : false;
2961        }
2962        singleTrack.data( 'track-memory-key', trackMemoryKey );
2963      }
2964  }
2965
2966  function trackListItemResize() {
2967    $(".playlist li").each(function () {
2968      var storeWidth = $(this).find(".store-list").outerWidth();
2969      var trackWidth = $(this).find(".track-number").outerWidth();
2970      $(this)
2971        .find(".tracklist-item-title")
2972        .css("max-width", $(this).outerWidth() - storeWidth - trackWidth - 10);
2973    });
2974  }
2975
2976  var setAudio = function (audio, $audio_el) {
2977    // setAudio function is not called when sticky player is enable
2978
2979    if(typeof audioPlayer.hasPlayed == 'undefined'){ // Register the audio object a first time for iOS to continue to next track on lock mode.
2980      elementAudio.src = audio;
2981    }
2982    jQuery($audio_el).attr("src", audio);
2983    $audio_el.load();
2984    if (!audioPlayer.stickyPlayer) {
2985      $(".sr_selectedPlayer").removeClass("sr_selectedPlayer");
2986      $($audio_el).parents(".iron-audioplayer").addClass("sr_selectedPlayer");
2987    }
2988    fakeWaveClick("widget");
2989    audioPlayer.removeData('track_from_outer_page'); //'track_from_outer_page' is true when player play a track from another ajax page(pagination)
2990  };
2991
2992  function getTime($audio_el) {
2993    return $audio_el.getCurrentTime();
2994  }
2995
2996  function togglePlaying(audioPlayer, $audio_el) {
2997    $(".iron-audioplayer").removeClass("sr_selected");
2998    audioPlayer.addClass("sr_selected");
2999
3000    $(".iron-audioplayer, .srmp3_sonaar_ts_shortcode").removeClass("audio-playing");
3001
3002
3003    if (ifTrackIsPlaying($audio_el)) {
3004      audioPlayer.addClass("audio-playing");
3005      if (typeof audioPlayer.data('ts-sync') != 'undefined') {
3006        $('#sonaar_ts-' + audioPlayer.data('ts-sync')).addClass("audio-playing");
3007      }
3008      audioPlayer.find('.currentTime, .totalTime').show();
3009      return;
3010    }
3011
3012    $("#sonaar-player .play").removeClass("audio-playing");
3013
3014  }
3015
3016  function togglePause(audioPlayer) {
3017    $.each(IRON.players, function (index) {
3018      if (IRON.players[index] != audioPlayer) {
3019        IRON.players[index].audioPlayer.find(".album-player .sonaar_media_element")[0].pause()
3020      }
3021    });
3022  }
3023
3024  function play(audioPlayer, $audio_el, playlist) {
3025    var currentTrack = audioPlayer.data("currentTrack");
3026    IRON.init_generatePeaks(audioPlayer);
3027    if (audioPlayer.stickyPlayer) {
3028      $audio_el.pause();
3029      if (typeof playlist !== "undefined") {
3030        playlist.find("li").eq(currentTrack).find('.srp_audio_trigger').click();
3031      }
3032    } else {
3033      if(currentTrack != 999999){ // CurrentTrack equal 999999 when the track is not in a playlist caused by list.js
3034        if($($audio_el).attr('src') == ''){
3035          setAudio($(audioPlayer).find('.playlist li').eq($(audioPlayer).attr('trackselected')).data("audiopath"), $audio_el);
3036          $(document).trigger("sonaarStats", [audioPlayer]);
3037        }
3038        if (!audioPlayer.find(".playlist li").hasClass("current") && audioPlayer.data('track_from_outer_page') !== true) { //'track_from_outer_page' is true when player play a track from another ajax page(pagination), so dont set the current class to a track from the tracklist
3039          var trackListElement = $(audioPlayer).find('.playlist li').eq($(audioPlayer).attr('trackselected'));
3040          trackListElement.addClass("current");
3041          if (!audioPlayer.stickyPlayer) {
3042            IRON.audioPlayer.sr_loadLyricsAjax(trackListElement.attr("data-post-id"), trackListElement.attr("data-track-pos"));
3043          }
3044        }
3045      }
3046      if (ifTrackIsPlaying($audio_el)) {
3047        $audio_el.pause();
3048      } else {
3049        $audio_el.play();
3050      }
3051      togglePlaying(audioPlayer, $audio_el);
3052    }
3053  }
3054
3055  function previous(audioPlayer, playlist) {
3056
3057    var audio_el = ( IRON.audioPlayer.stickyPlayer )? document.getElementById('sonaar-audio') : audioPlayer.find('.sonaar_media_element')[0];
3058    if( audio_el.currentTime > IRON.previousTrackThreshold ){ //Resets the track to the beginning Or go to the previous track.
3059        audio_el.currentTime = 0;
3060        return;
3061    }
3062
3063    if (IRON.audioPlayer.stickyEnable && audioPlayer.hasClass('sr_selectedPlayer')) {
3064      IRON.sonaar.player.previous()
3065    } else {
3066      var currentTrack = audioPlayer.data("currentTrack");
3067      var nextTrack;
3068      if (audioPlayer.shuffle) {
3069        $(random_order).each(function (index) {
3070          if (this == currentTrack) {
3071            if (index == 0 && ! audioPlayer.hasClass('srp_noLoopTracklist')) {
3072              //if it is the first track form the shuffle order
3073              nextTrack = random_order[random_order.length - 1];
3074            } else {
3075              nextTrack = random_order[index - 1];
3076            }
3077          }
3078        });
3079      } else {
3080        nextTrack = currentTrack - 1;
3081      }
3082
3083      playlist.find("li").eq(nextTrack).find('.srp_audio_trigger').click();
3084    }
3085  }
3086
3087  function next(audioPlayer, $audio_el, playlist) {
3088    if (IRON.audioPlayer.stickyEnable && audioPlayer.hasClass('sr_selectedPlayer')) {
3089      IRON.sonaar.player.next()
3090    } else {
3091      var currentTrack = audioPlayer.data("currentTrack");
3092      var nextTrack;
3093
3094      if (audioPlayer.shuffle) {
3095        $(random_order).each(function (index) {
3096          if (this == currentTrack) {
3097            if (index >= random_order.length - 1 && ! audioPlayer.hasClass('srp_noLoopTracklist')) {
3098              //if it is the last track form the shuffle order
3099              nextTrack = random_order[0];
3100            } else {
3101              nextTrack = random_order[index + 1];
3102            }
3103          }
3104        });
3105      } else {
3106        nextTrack = currentTrack + 1; 
3107      }
3108
3109      if(!playlist.find("li").eq(nextTrack).length && audioPlayer.hasClass('srp_noLoopTracklist') && !IRON.audioPlayer.stickyEnable){
3110        wavesurfer.pause();
3111        audioPlayer.removeClass("audio-playing");
3112        $('.srmp3_sonaar_ts_shortcode').removeClass("audio-playing");
3113      }else{
3114        if (!playlist.find("li").eq(nextTrack).length) {
3115          nextTrack = 0;
3116        }
3117        $audio_el.pause();
3118        playlist.find("li").eq(nextTrack).find('.srp_audio_trigger').click();
3119      }
3120    }
3121  }
3122
3123  function getPlayer() {
3124    return this;
3125  }
3126  function getplay() {
3127    play(this.audioPlayer, this.$audio_el);
3128  }
3129
3130  function ifTrackIsPlaying($audio_el) {
3131    return !$audio_el.paused;
3132  }
3133
3134  var fakeWaveUpdate = function ($audio_el, audioPlayer, playlist) {
3135    $($audio_el).off("ended");
3136    $($audio_el).on("ended", function () {
3137      IRON.setTracksTimeMemories(audioPlayer, 0, true); //Reset the track time memory when the track is ended
3138      audioPlayer.list.tracks[audioPlayer.data('currentTrack')].hasCompleted = true;
3139      if(IRON.repeatStatus !== false){
3140        //console.log(audioPlayer.notrackskip);
3141        if(IRON.repeatStatus === 'track' && audioPlayer.notrackskip !== "on"){
3142          sr_setTrackCurrentTime(0);
3143          $audio_el.play();
3144          return;
3145        }
3146
3147        if(audioPlayer.data('currentTrack') + 1 >= audioPlayer.find('li').not('[data-relatedtrack="1"]').length && IRON.repeatStatus !== 'playlist' ){
3148          return;
3149        }
3150      }
3151
3152      if (audioPlayer.notrackskip !== "on") {
3153        audioPlayer.hasPlayed = true;
3154        next(audioPlayer, $audio_el, playlist);
3155      } else {
3156        audioPlayer.removeClass("audio-playing");
3157        $('.srmp3_sonaar_ts_shortcode').removeClass("audio-playing");
3158      }
3159    });
3160    $($audio_el).on("timeupdate", function () {
3161      const duration = (this.duration == 'Infinity')? this.buffered.end(this.buffered.length-1) : this.duration;
3162      $(audioPlayer)
3163        .find('.album-player .sonaar_wave_cut, .sr-playlist-item.current .sonaar_wave_cut')
3164        .width(((this.currentTime + 0.35) / duration) * 100 + "%");
3165    });
3166  };
3167
3168  function setTrackSoundwaveCursor($audioPlayer){
3169    if(!$audioPlayer.setTrackSoundwaveCursor || ! $audioPlayer.find('.srp_soundwave_wrapper').length) return;
3170    
3171    var player = $audioPlayer[0];
3172    var tooltip;
3173    var verticalLine;
3174    if (! $audioPlayer.find('.sr_tracklenght_tooltip').length){
3175      tooltip = document.createElement('div');
3176      tooltip.className = 'sr_tracklenght_tooltip';
3177      player.appendChild(tooltip);
3178
3179      verticalLine = document.createElement('div');
3180      verticalLine.className = 'sr_tracklenght_tooltip_vertical';
3181      player.appendChild(verticalLine);
3182    }else{
3183       tooltip = document.querySelector('.sr_tracklenght_tooltip');
3184       verticalLine = document.querySelector('.sr_tracklenght_tooltip_vertical');
3185    }
3186    
3187    player.querySelectorAll('.srp_soundwave_wrapper .sonaar_fake_wave').forEach(function (element) {
3188      element.addEventListener('mousemove', function(e) {
3189        const timelineWidth = this.offsetWidth;
3190        const rect = this.getBoundingClientRect();
3191        const offsetX = e.clientX - rect.left;
3192        const trackLength = $(element).parents('.sr-playlist-item').data('tracktime');
3193        const duration = convertTime(trackLength);
3194        const time = (offsetX / timelineWidth) * duration;
3195        const fixedTooltipTopPosition = $(element).offset().top - $(player).offset().top;
3196        if (isNaN(time)) {
3197          return;
3198        }
3199        tooltip.innerText = formatTime(time);
3200        tooltip.style.transform = 'translateY(5px) scale(1)';
3201        tooltip.style.opacity = '1';
3202        tooltip.style.left = `${e.pageX - $(player).offset().left - 59}px`;
3203        tooltip.style.top = `${fixedTooltipTopPosition - 30}
3203px`;
3204
3205        verticalLine.style.display = 'block';
3206        verticalLine.style.height = `${this.offsetHeight+20}px`;
3207        verticalLine.style.left = `${e.pageX  - $(player).offset().left}px`;
3208        verticalLine.style.top = `${fixedTooltipTopPosition-10}px`;
3209      });
3210
3211      element.addEventListener('mouseout', function() {
3212          tooltip.style.transform = 'translateY(20px) scale(0.5)';
3213          tooltip.style.opacity = '0';
3214          verticalLine.style.display = 'none';
3215      });
3216    });
3217
3218    function convertTime(time) {
3219      const parts = time.split(':');
3220      return (+parts[0]) * 60 + (+parts[1]);
3221    }
3222    function formatTime(seconds) {
3223      const date = new Date(0);
3224      date.setSeconds(seconds);
3225      return date.toISOString().slice(11, 19);
3226    }
3227      
3228  }
3229
3230
3231  function ajaxInitPage() {
3232    setIronAudioplayers();
3233    resetsrp_vars();
3234    setStickyPlayer();
3235    stickyPlayerFromPageOption();
3236  }
3237  function startAjaxPreloaderAnim(player){
3238    player.find('.srp_shimmer_container').remove();
3239    player.find('.srp_notfound').css('display', 'none');
3240    const container = document.createElement('div');
3241    container.className = 'srp_shimmer_container';
3242    var cardWidthPercentage;
3243    var shimmerNum = player.find('.srp_list .sr-playlist-item').length;
3244    if(player.find('.srp_list .sr-playlist-item').length < 1){
3245        shimmerNum = player.srp_player_param.posts_per_page;
3246    }
3247    const gridColumns = (typeof player.srp_player_param.grid_column_number != 'undefined') ? player.srp_player_param.grid_column_number[0]: false;
3248    let playerlayout = 'list';
3249    if(gridColumns) {
3250        playerlayout = 'grid';
3251    }
3252    
3253    if (playerlayout === 'list') {
3254        const widths = ['40px', '50%', '10%', '10%', '10%', '2%' ,'2%'];
3255        for (let i = 0; i < shimmerNum; i++) { 
3256            const rowContainer = document.createElement('div');
3257            rowContainer.className = 'srp_shimmer_row';
3258    
3259            for (let j = 0; j < widths.length; j++) {
3260                const placeholder = document.createElement('div');
3261                placeholder.className = 'srp_shimmer_row_el';
3262                placeholder.style.flex = `0 0 ${widths[j]}`;
3263
3264              if (j == 0){
3265                placeholder.style.height = '40px';
3266              }
3267            
3268              if( j>= widths.length-2){ // second last and last to be grow
3269                placeholder.style.flex = `1 0 ${widths[j]}`;
3270              }
3271                rowContainer.appendChild(placeholder);
3272            }
3273    
3274            container.appendChild(rowContainer);
3275        }
3276    
3277    } else if (playerlayout === 'grid') {
3278
3279       cardWidthPercentage = 100 / player.srp_player_param.grid_column_number[0] - 0.5 + "%"; // Subtracting 2% for margins
3280      for (let i = 0; i < shimmerNum; i++) {
3281          const cardContainer = document.createElement('div');
3282          cardContainer.className = 'srp_shimmer_card';
3283          cardContainer.style.width = cardWidthPercentage; // Set card width based on columns per row
3284      
3285          const imagePlaceholder = document.createElement('div');
3286          imagePlaceholder.className = 'srp_shimmer_row_el';
3287          cardContainer.appendChild(imagePlaceholder);
3288      
3289          const shimmerHeights = ['30px', '20px', '20px'];
3290          for (const height of shimmerHeights) {
3291              const placeholder = document.createElement('div');
3292              placeholder.className = 'srp_shimmer_row_el';
3293              placeholder.style.height = height;
3294              cardContainer.appendChild(placeholder);
3295          }
3296      
3297          container.appendChild(cardContainer);
3298        }
3299        
3300    }
3301    // Append the container to the desired location
3302    player.find('.srp_list').css('display', 'none');
3303    player.find('.srp_list').before(container);
3304    if (playerlayout === 'grid'){
3305      var cardWidth = $('.srp_tracklist_grid .srp_shimmer_card').width()-50;
3306      $('.srp_tracklist_grid .srp_shimmer_card > .srp_shimmer_row_el:first-child').css('height', cardWidth + 'px');
3307      $('.srp_tracklist_grid .srp_shimmer_card').css('width', `calc(${cardWidthPercentage}
3307 - 10px)`);
3308    }
3309
3310  }
3311
3312
3313  function reloadAjax(player = null, transition = false, forced = false, unsync = true){
3314
3315    if(!player.lazy_load && !forced){
3316      return;
3317    }
3318    console.log('reload Ajax')
3319    if(typeof player.params == 'undefined'){
3320      player.params = {}; // this seems undefined when loading an initial player...
3321    }
3322    //return
3323    if (typeof IRON.removePlayerResizeListeners === 'function') {
3324      IRON.removePlayerResizeListeners(player.attr('data-id'));
3325    } 
3326    
3327    var num = srp_convertPlayerIdToPlayerNum(player.attr('data-id'));
3328   
3329    var maxDuration = 4000; 
3330    var interval = 100; 
3331    var elapsedTime = 0;
3332    var intervalId = setInterval(function() { //Set interval to wait for the player to be loaded: required for player inside a popup
3333    var playerIndex = srp_convertPlayerIdToPlayerNum(player.attr('data-id'));
3334    
3335        if (playerIndex !== null) {
3336        
3337            var playerId = player.attr('data-id').split('-');
3338            playerId = playerId[playerId.length - 1]; // get last element of the array
3339            if( (typeof window['srp_player_params_' + playerId] == 'undefined' || typeof window['srp_player_params_args_' + playerId] == 'undefined') && $('#srp_js_params_' + playerId).length){ //if player params are not set yet (for gutenberg block editor)              
3340              const scriptElement = document.getElementById('srp_js_params_' + playerId).textContent;
3341              const parts = scriptElement.split('var ').map(part => part.trim().replace(';', ''));
3342              const jsonObjects = parts.map(part => {
3343                const match = part.match(/(\w+)\s*=\s*(\{[^{}]+\})/);
3344                return match ? { variable: match[1], json: match[2] } : null;
3345              }).filter(Boolean);
3346              
3347              jsonObjects.forEach(obj => {
3348                window[`${obj.variable}`] = JSON.parse(`${obj.json}`);
3349              });    
3350            }
3351
3352            var srp_player_param_args= window['srp_player_params_args_' + playerId];
3353            player.srp_player_param = window['srp_player_params_' + playerId];
3354
3355            if(player.data("tracks-per-page")){
3356              player.srp_player_param['posts_per_page'] = player.data("tracks-per-page");
3357            }else{
3358              if(!player.hasClass('srp_player_is_recentlyPlayed')){
3359                player.srp_player_param['posts_per_page'] = 50; //if keep this low IF Ajax is activated and we dont have a tracks per page to prevent loading too many tracks. It can crash elementor editor.
3360              }
3361            }
3362            
3363            player.srp_player_param['srp_callFromAjax'] = 'true';
3364           
3365            let reformat_meta;
3366            if (player.params['meta'] && typeof player.params['meta'] === 'object') {
3367                reformat_meta = Object.entries(player.params['meta']).map(([key, value]) => `${key}:${value}`).join(';');
3368            }
3369
3370            // meta
3371            player.srp_player_param['srp_meta'] = reformat_meta || '';
3372            
3373            // page
3374            player.srp_player_param['srp_page'] =  player.params['page']
3375
3376            //order
3377            player.srp_player_param['srp_order'] =  player.params['order']
3378
3379            // player id
3380            player.srp_player_param['srp_player_id'] = player.params['playerId']
3381 
3382            // search
3383            player.srp_player_param['srp_search'] =  player.params['search']
3384            //console.log(player.srp_player_param);
3385            player.srp_player_param['category'] =  player.data('category');
3386            
3387            if(transition){
3388              var $playlist = player.find('.srp_list');
3389              $playlist.css({ 'opacity': 0, 'transition': 'opacity 0.15s ease' });
3390              startAjaxPreloaderAnim(player);
3391            }
3392            var data = {
3393                'action': 'load_ajax_player',
3394                'nonce': sonaar_music.ajax.ajax_nonce,
3395                'args': srp_player_param_args,
3396                'parameters': player.srp_player_param,
3397            };
3398            //return;
3399            if (player.currentRequest) {
3400              player.currentRequest.abort(); // Abort the previous request
3401            }
3402            var isPlaying = player.hasClass('audio-playing');
3403            player.currentRequest = $.post(sonaar_music.ajax.ajax_url, data, function (response) {
3404                var parsedResponse = $(response);
3405
3406                var newClassList = parsedResponse.find('.iron-audioplayer').attr('class');
3407                player.attr('class', newClassList);
3408
3409                // Update the id and data-id attributes of .iron-audioplayer
3410                var newAudioPlayerId = parsedResponse.find('.iron-audioplayer').attr('id');
3411                var newAudioPlayerDataId = parsedResponse.find('.iron-audioplayer').attr('data-id');
3412                var newAudioPlayerUrlPlaylist = parsedResponse.find('.iron-audioplayer').attr('data-url-playlist');
3413                var newAudioPlayerTotalItems= parsedResponse.find('.iron-audioplayer').attr('data-total_items');
3414                var newAudioPlayerTotalPages = parsedResponse.find('.iron-audioplayer').attr('data-total_pages');
3415                player.attr('id', newAudioPlayerId);
3416                player.attr('data-id', newAudioPlayerDataId);
3417                player.attr('data-url-playlist', newAudioPlayerUrlPlaylist);
3418                player.attr('data-total_items', newAudioPlayerTotalItems);
3419                player.attr('data-total_pages', newAudioPlayerTotalPages);
3420
3421                if (unsync){
3422                  IRON.sonaar.player.unsyncWidgetPlayers();
3423                }
3424                
3425                // Replace the content of the .srp_list div
3426               
3427                var newTracklistContent = parsedResponse.find('.srp_tracklist');
3428                player.find('.srp_tracklist').replaceWith(newTracklistContent);
3429
3430                var newMiniPlayerMeta = parsedResponse.find('.album-player');
3431                player.find('.album-player').replaceWith(newMiniPlayerMeta);
3432
3433                // Insert columnHeadings before srp_tracklist in the player
3434                var columnHeadings = parsedResponse.find('.sr-cf-heading');
3435                // Check if .sr-cf-heading exists within the player
3436                if (player.find('.sr-cf-heading').length == 0) {
3437                  player.find('.srp_tracklist').before(columnHeadings);
3438  
3439                }
3440
3441                if(isPlaying && ! IRON.audioPlayer.stickyEnable){
3442                  player.addClass('audio-playing');
3443                  player.data('track_from_outer_page',true); //'track_from_outer_page' is true when player play a track from another ajax page(pagination)
3444                }
3445                
3446                var playerObj = Object.create(IRON.audioPlayer);
3447                playerObj.init(player);
3448
3449                IRON.players[num] = playerObj;
3450
3451                updatePaginationAjax(player);
3452
3453                if (typeof IRON.advancedTriggers !== 'undefined') {
3454                  IRON.advancedTriggers.applyAllScenarios();
3455                }
3456
3457                if(transition){
3458                  player.find('.srp_shimmer_container').remove(); // remove animation
3459                  $playlist.css('opacity',1); //show the playlist
3460                }
3461            }).fail(function() {
3462                console.log('An error occurred during the post operation.');
3463            }).always(function() {
3464              player.currentRequest = null; // Reset the request when it's complete.
3465          });
3466  
3467            clearInterval(intervalId);
3468        } else {
3469            if(transition){
3470              player.find('.srp_shimmer_container').remove();
3471              $playlist.css('opacity',1);
3472            }
3473            elapsedTime += interval;
3474            if (elapsedTime >= maxDuration) {
3475                clearInterval(intervalId);
3476            }
3477        }
3478    }, interval);
3479  }
3480
3481//Make these functions accessible from IRON.audioPlayer
3482  return {
3483    init: initPlayer,
3484    getPlayer: getPlayer,
3485    play: getplay,
3486    autoplayEnable: autoplayEnable,
3487    triggerPlay: triggerPlay,
3488    stickyEnable: stickyEnable,
3489    ajaxInitPage: ajaxInitPage,
3490    setIronAudioplayers: setIronAudioplayers,
3491    fakeWaveClick: fakeWaveClick,
3492    karaokeMode: karaokeMode,
3493    sr_loadLyricsAjax: sr_loadLyricsAjax,
3494    updateMiniPlayer: updateMiniPlayer,
3495    setRandomList: setRandomList,
3496    setMediaSessionAPI: setMediaSessionAPI,
3497    checkArtWorkFullBg: checkArtWorkFullBg,
3498    seekTime: seekTime,
3499    reloadAjax: reloadAjax,
3500    next: next,
3501  };
3502  
3503})(jQuery);
3504
3505function hideEmptyAttribut(string, selector) {
3506  if (string == "") {
3507    selector.css("display", "none");
3508  } else {
3509    selector.css("display", "block");
3510  }
3511}
3512
3513//Set Sticky player if it is enable once
3514function setStickyPlayer() {
3515  if (isGutenbergActive()) { //Dont load the sticky player if we are in the guttenberg editor
3516    return;
3517  }
3518  var cookieSettingsValue = getCookieValue("sonaar_mp3_player_settings");
3519  if (
3520    (typeof srp_vars !== 'undefined' && srp_vars.sonaar_music.footer_albums != "" && srp_vars.sonaar_music.footer_albums != [""]) ||
3521    (sonaar_music.option.overall_sticky_playlist != null && sonaar_music.option.overall_sticky_playlist != [""]) ||
3522    cookieSettingsValue != ""
3523  ) {
3524    IRON.audioPlayer.stickyEnable = true;
3525  } else {
3526    jQuery(".iron-audioplayer").each(function () {
3527      if (jQuery(this).data("sticky-player")) {
3528        IRON.audioPlayer.stickyEnable = true;
3529      }
3530    });
3531  }
3532}
3533
3534//Reset srp_vars on the ajaxify navigation
3535function resetsrp_vars() {
3536  var str = jQuery('script:contains("var srp_vars")').text();
3537  if (str !== "") {
3538    str = str.split("var srp_vars =")[1];
3539    srp_vars = JSON.parse(str.split(";")[0]);
3540  }
3541}
3542
3543//Load Music player Content
3544function setIronAudioplayers(specificParentSelector) {
3545  $ = jQuery;
3546
3547  //Set srp_linked to the audioplayer if a search or a selector widget interact with it
3548  $('.srp_search_container, .srp-filters-widget, .srp-tags-widget').each(function () {
3549    if( $(this).data('player-id') && $('#'+ $(this).data('player-id') + '.iron-audioplayer, #'+ $(this).data('player-id') + ' .iron-audioplayer' ).length ){
3550      $('#'+ $(this).data('player-id') + '.iron-audioplayer, #'+ $(this).data('player-id') + ' .iron-audioplayer' ).addClass('srp_linked');
3551    }else{
3552      $('.iron-audioplayer' ).eq(0).addClass('srp_linked');
3553    }
3554  })
3555  
3556  if (typeof IRON === 'undefined' || (typeof IRON !== 'undefined' && typeof IRON.audioPlayer === 'undefined'))
3557    return;
3558    
3559  if (typeof specificParentSelector !== "undefined") {
3560    if( $('#shortcode_builder').length ){
3561      return; //Avoid to set the player twice if we are in the shortcode builder. specificParentSelector is set when setIronAudioplayers is called from the widget inline script.
3562    }
3563    // set all audioplayers or only players inside a specific selector
3564    if (!specificParentSelector.includes('"') && !specificParentSelector.includes("'") && $('[data-id="' + specificParentSelector + '"]').hasClass('iron-audioplayer')) { //if specificParentSelector is the iron-audioplayer element (not parent)
3565      var playerSelector = $('[data-id="' + specificParentSelector + '"]');
3566    } else {
3567      var playerSelector = $(specificParentSelector + " .iron-audioplayer");
3568    }
3569    if (typeof IRON.players == "undefined") {
3570      IRON.players = []; //dont reset the IRON.players if they already exist and the setIronAudioplayers function is executed from sr-scripts.js
3571    }
3572  } else {
3573    var playerSelector = $(".iron-audioplayer");
3574    let protectedPlayer = [];
3575    if( typeof IRON.players != 'undefined'){
3576      for(const i in IRON.players) {  
3577        if(
3578            $(IRON.players[i].audioPlayer).parents(".elementor-widget-music-player").length || 
3579            $(IRON.players[i].audioPlayer).parents(".elementor-widget-woocommerce-products").length
3580          ){
3581            protectedPlayer.push(IRON.players[i]);
3582          }
3583      }
3584    }
3585    IRON.players = protectedPlayer;
3586  }
3587
3588  playerSelector.each(function () {
3589
3590    if (typeof specificParentSelector == "undefined" && $(this).parents(".elementor-widget-woocommerce-products").length) return;
3591
3592    if (typeof specificParentSelector == "undefined" && $(this).parents(".elementor-widget-music-player").length) return;
3593
3594    var player = Object.create(IRON.audioPlayer);
3595    player.init($(this));
3596    IRON.players.push(player);
3597
3598    if ($('.iron-audioplayer').parents('#sonaar-modal').length) {
3599      //if player is in a modal we dont want to continue because it creates a bug if its parent is ajax.
3600      return;
3601    }
3602
3603    if ( $('.iron-audioplayer').length - $('.elementor-location-popup').find('.iron-audioplayer').length == IRON.players.length){ //When is the last player to be init
3604      var urlParams = new URLSearchParams(document.location.search);
3605      if( 
3606        document.querySelectorAll('[data-sr-dropdown-atts]').length || //filter dropdown widget
3607        $('.srp_filters_container').length || //filter tag widget
3608        $('.iron-audioplayer').find('.srp_search_container').length || 
3609        $('.iron-audioplayer').find('.sr-cf-heading').length || 
3610        $('.iron-audioplayer').find('.srp_pagination').length ||
3611        urlParams.has('srp_search')
3612      ){
3613        srp_setSearchFiltersFromUrl();
3614      }
3615    }
3616  });
3617}
3618//Display stickyplayer from the page option
3619function stickyPlayerFromPageOption() {
3620  if (srp_vars.sonaar_music.footer_albums != "" && !IRON.sonaar.player.isPlaying && !IRON.sonaar.player.classes.continued) {
3621    if (Array.isArray(IRON.sonaar.player.playlistID)) {
3622      var currentPlaylist = IRON.sonaar.player.playlistID[0];
3623    } else {
3624      var currentPlaylist = IRON.sonaar.player.playlistID;
3625    }
3626    if (Array.isArray(srp_vars.sonaar_music.footer_albums)) {
3627      var newPlaylist = srp_vars.sonaar_music.footer_albums[0];
3628    } else {
3629      var newPlaylist = srp_vars.sonaar_music.footer_albums;
3630    }
3631
3632    if (newPlaylist != currentPlaylist) {
3633      IRON.sonaar.player.currentTime = "";
3634      IRON.sonaar.player.totalTime = "";
3635      IRON.sonaar.player.setPlayer({
3636        id: srp_vars.sonaar_music.footer_albums,
3637        autoplay: false,
3638        soundwave: true,
3639        shuffle: srp_vars.sonaar_music.footer_albums_shuffle,
3640      });
3641    }
3642    return;
3643  }
3644
3645  //Play from overall settings
3646  if (sonaar_music.option.overall_sticky_playlist != null && !IRON.sonaar.player.isPlaying && !IRON.sonaar.player.classes.continued) {
3647    if ( sonaar_music.option.sr_prevent_continuous_sticky_to_show === "true")
3648    return;
3649    
3650    // return if current page is edit post page
3651    if (window.location.href.indexOf('post.php') > -1 || window.location.href.indexOf('post-new.php') > -1)
3652    return;
3653
3654    IRON.sonaar.player.currentTime = "";
3655    IRON.sonaar.player.totalTime = "";
3656    IRON.sonaar.player.setPlayer({
3657      id: sonaar_music.option.overall_sticky_playlist,
3658      autoplay: false,
3659      soundwave: true,
3660      shuffle: sonaar_music.option.overall_shuffle === "on" ? "1" : "",
3661    });
3662  }
3663}
3664
3665var sonaarStatsTimeOut;
3666jQuery(document).on("sonaarStats", function (event, audioPlayer) {
3667
3668  if( $('.elementor-editor-active').length ) return;
3669
3670  if ($(audioPlayer).attr("id") == "sonaar-player") {
3671    var currentTrack = $(audioPlayer);
3672  } else {
3673    var currentTrackEQ = audioPlayer.data("currentTrack");
3674    var currentTrack = audioPlayer.find(".playlist .srp_list li").eq(currentTrackEQ);
3675  }
3676  clearTimeout(sonaarStatsTimeOut);
3677
3678  sonaarStatsTimeOut = setTimeout(function () {
3679    if (!IRON.sonaar.player.classes.dontCountContinuous) {
3680      var trackTitle = currentTrack.attr("data-tracktitle");
3681      trackTitle = trackTitle.replace(/<span class="srp_trackartist">.*?<\/span>/g, '').trim();
3682      albumTitle = currentTrack.attr("data-albumtitle");
3683      fileURL = currentTrack.attr("data-audiopath");
3684
3685      if (window['Matomo'] && sonaar_music.option.srmp3_use_matomo_mediaanalytics !== 'true'){
3686          console.log('send matomo stats for play');
3687          _paq.push(['trackEvent', 'MediaAudio', 'play', trackTitle ]);
3688      }
3689
3690      if (typeof gtag === 'function' && srp_vars.sonaar_music.ga_tag) {
3691        gtag('event', 'played', {
3692          'event_category': '[Playlist Played] ' + albumTitle,
3693          'event_label': '[Track Played] ' + trackTitle,
3694          'non_interaction': true
3695        });
3696      }
3697
3698      if (sonaar_music.option.srmp3_use_built_in_stats === 'true' || sonaar_music.option.srmp3_use_built_in_stats === true  ) {
3699        var target = currentTrack.attr("data-trackid") !== "" ? currentTrack.attr("data-trackid") : fileURL;
3700        var data = {
3701          action: "post_stats",
3702          nonce: sonaar_music.ajax.ajax_nonce,
3703          post_stats: {
3704            action: "play",
3705            target_title: trackTitle,
3706            target_url: target,
3707            page_title: sonaar_music.current_page.title,
3708            page_url: sonaar_music.current_page.url,
3709          },
3710        };
3711     
3712        jQuery.post(sonaar_music.ajax.ajax_url, data, function (response) { }); // this send stats in the wp db
3713      }
3714  
3715    }
3716    IRON.sonaar.player.classes.dontCountContinuous = false;
3717  }, 3000);
3718});
3719
3720jQuery(document).on("click", ".iron-audioplayer .playlist .store-list a[download], #sonaar-player .track-store a[download]", function (event) {
3721  jQuery(document).trigger("sonaarTrackDownload", jQuery(this));
3722});
3723
3724jQuery(document).on("sonaarTrackDownload", function (event, target) {
3725  if( $('.elementor-editor-active').length ) return;
3726
3727  if ($(target).parents("#sonaar-player").length) {
3728    var currentTrack = jQuery(target).parents("#sonaar-player");
3729  } else {
3730    var currentTrack = jQuery(target).parents("li");
3731  }
3732
3733  var trackTitle = currentTrack.attr("data-tracktitle");
3734  trackTitle = trackTitle.replace(/<span class="srp_trackartist">.*?<\/span>/g, '').trim();
3735  albumTitle = currentTrack.attr("data-albumtitle");
3736  fileURL = currentTrack.attr("data-audiopath");
3737
3738  if (window['Matomo'] && sonaar_music.option.srmp3_use_matomo_mediaanalytics !== 'true'){
3739    console.log('send matomo stats for download');
3740    _paq.push(['trackEvent', 'MediaAudio', 'download', trackTitle + '[' + target_id + ']']);
3741  }
3742
3743  if (typeof gtag === 'function' && srp_vars.sonaar_music.ga_tag) {
3744    console.log("GA - Download Tracked++");
3745    gtag('event', 'downloaded', {
3746      'event_category': '[Playlist Downloads] ' + albumTitle,
3747      'event_label': '[Track Download] ' + trackTitle,
3748      'non_interaction': true
3749    });
3750  }
3751
3752  if (sonaar_music.option.srmp3_use_built_in_stats) {
3753    var target_id = currentTrack.data("trackid") !== "" ? currentTrack.data("trackid") : fileURL;
3754    var data = {
3755      action: "post_stats",
3756      nonce: sonaar_music.ajax.ajax_nonce,
3757      post_stats: {
3758        nonce: sonaar_music.ajax.ajax_nonce,
3759        target_title: trackTitle,
3760        target_url: target_id,
3761        page_title: sonaar_music.current_page.title,
3762        page_url: sonaar_music.current_page.url,
3763      },
3764    };
3765    
3766    jQuery.post(sonaar_music.ajax.ajax_url, data, function (response) { }); // this send stats in the wp db
3767  }
3768});
3769
3770jQuery(document).ready(function () {
3771  setStickyPlayer();
3772  IRON.favorites.init();
3773  setIronAudioplayers();
3774  if (Boolean(sonaar_music.option.enable_continuous_player === "true") && !$("body").hasClass("wp-admin")) {
3775    if (!IRON.sonaar.player.preventContinuousUrl()) {
3776      sr_getCookieSettings();
3777    }
3778  } else if (IRON.audioPlayer.stickyEnable) {
3779    sr_getCookieVolume();
3780  }
3781  stickyPlayerFromPageOption();
3782  sr_filterInit();
3783  srp_getParamFromUrl();
3784  srp_initWC_JS();
3785  
3786});
3787 
3788
3789// Function to handle the Ask for Email click on the CTA
3790function handleAskEmailClick(element, scenario = null, playerID = null, trackIdToSave = null) {
3791  //srp_wc_loadspinner(element);
3792  sr_setPopUp();
3793  
3794  // Initialize variables to hold the values
3795  var postId, trackPos, trackTitle, image_src, trackId, dataAudioPath;
3796
3797  var playlistItem = element.closest('li.sr-playlist-item');
3798  var swiperSlide = element.closest('.swiper-slide');
3799
3800  if(element.parents('.album-player').length){ // If the click is from the mini player, get the tracklist item
3801    const trackselected = (typeof element.parents('.iron-audioplayer').attr('trackselected') !== 'undefined') ? element.parents('.iron-audioplayer').attr('trackselected') : 0;
3802    playlistItem = element.parents('.iron-audioplayer').find('li.sr-playlist-item').eq(trackselected);
3803  }
3804
3805  if (playlistItem.length) {
3806      postId = playlistItem.data('post-id');
3807      trackPos = playlistItem.data('track-pos');
3808      trackTitle = playlistItem.data('tracktitle');
3809      if(!postId){
3810        trackId = playlistItem.data('trackid');
3811        if(!trackId){
3812           dataAudioPath = playlistItem.data('audiopath');
3813        }
3814      }
3815      image_src = playlistItem.find('.sr_track_cover img').attr('src');
3816  } else if (swiperSlide.length) {
3817      postId = swiperSlide.data('post-id');
3818      trackPos = swiperSlide.data('track-pos');
3819      trackTitle = swiperSlide.find('.srp_swiper-track-title').text();
3820      image_src = swiperSlide.find('.srp_swiper-album-art').css('background-image').replace(/^url\(["']?/, '').replace(/["']?\)$/, ''); // Extract image URL
3821  } else {
3822      currentTrack = IRON.sonaar.player.currentTrack;
3823      postId = IRON.sonaar.player.list.tracks[currentTrack].sourcePostID;
3824      trackPos = IRON.sonaar.player.list.tracks[currentTrack].track_pos;
3825      trackTitle = IRON.sonaar.player.list.tracks[currentTrack].track_title;
3826      image_src = IRON.sonaar.player.list.tracks[currentTrack].poster;
3827  }
3828
3829  //console.log("Values extracted:", { postId, trackPos, trackTitle, image_src, trackId, dataAudioPath });
3830
3831  var nonce = sonaar_music.ajax.ajax_nonce;
3832  
3833  var data = {
3834      action: 'load_ask_for_email_popup_ajax',
3835      post_id: postId,
3836      track_pos: trackPos,
3837      track_title: trackTitle,
3838      image_src: image_src,
3839      nonce: nonce
3840  };
3841
3842
3843  //If a scenario is defined, add its id to the data object
3844  if (scenario) {
3845    data.scenario_id = scenario.id;
3846  }
3847
3848  //console.log("AJAX request data for loading popup:", data);
3849
3850  $.post(sonaar_music.ajax.ajax_url, data, function(response) {
3851      //console.log("AJAX response for loading popup:", response);
3852      response = JSON.parse(response);
3853      $('#sonaar-modal .sr_popup-body').html(response.html);
3854
3855      if (!response.has_image) {
3856          $('.sr_popup-body').addClass('srp_popup_no_image');
3857      } else {
3858          $('.sr_popup-body').removeClass('srp_popup_no_image');
3859      }
3860      srp_askForEmailForm(postId, trackPos, trackId, dataAudioPath, scenario, playerID, element, trackIdToSave);
3861      sr_openPopUp();
3862      srp_wc_unloadspinner(element);
3863  }).fail(function() {
3864    console.error("Failed to load ask-for-email popup.");
3865  });
3866}
3867function srp_initWC_JS() {
3868  // Your existing logic
3869  $('.srp-make-offer-bt').on('click', function(event) {
3870      event.preventDefault();
3871  });
3872
3873  // Check if we are in a single product page
3874  if (!$('.single-product').length) return;
3875
3876  var form = document.querySelector(".variations_form");
3877
3878  if (form && typeof srp_make_offer_variations !== 'undefined') {
3879    var variations = srp_make_offer_variations; // Use the global variable injected by PHP
3880
3881    function handleVisibility(variationId) {
3882        var priceElement = form.querySelector(".woocommerce-variation-
3882price");
3883        var addToCartButton = form.querySelector(".single_add_to_cart_button");
3884        var makeOfferButtons = document.querySelectorAll(".srp-make-offer-bt:not(.related .srp-make-offer-bt)");
3885        var variationsElement = form.querySelector(".woocommerce-variation-add-to-cart"); // Get the variations element
3886
3887        var selectedVariation = variations.find(function(variation) {
3888            return variation.variation_id == variationId;
3889        });
3890        if (selectedVariation) {
3891            if (selectedVariation.make_offer_hide_price === "yes") {
3892                if (priceElement) priceElement.style.display = "none";
3893                if (addToCartButton) addToCartButton.style.display = "none";
3894            } else {
3895                if (priceElement) priceElement.style.display = "";
3896                if (addToCartButton) addToCartButton.style.display = "";
3897            }
3898        } else {
3899            if (priceElement) priceElement.style.display = "";
3900            if (addToCartButton) addToCartButton.style.display = "";
3901        }
3902
3903        // Disconnect observer before DOM manipulation to prevent infinite loop
3904        observer.disconnect();
3905
3906        makeOfferButtons.forEach(function(button) {
3907            var wrapper = button.closest(".srp-make-offer-btn-wrapper");
3908
3909            // Move the "Make Offer" button before the "woocommerce-variation-add-to-cart" element
3910            if (variationsElement && wrapper && wrapper.parentNode !== variationsElement) {
3911                variationsElement.parentNode.insertBefore(wrapper, variationsElement);
3912            }
3913
3914            if (button.getAttribute("data-variation") == variationId) {
3915                wrapper.style.display = "block"; // Show correct wrapper with Make Offer button
3916            } else {
3917                wrapper.style.display = "none"; // Hide other wrappers
3918            }
3919        });
3920
3921        // Reconnect observer after DOM manipulation
3922        observer.observe(form.querySelector(".single_variation_wrap"), { childList: true, subtree: true });
3923    }
3924
3925    var observer = new MutationObserver(function() {
3926        var variationId = form.querySelector(".variation_id").value;
3927        handleVisibility(variationId);
3928    });
3929
3930    observer.observe(form.querySelector(".single_variation_wrap"), { childList: true, subtree: true });
3931
3932    // Triggered when a variation is selected
3933    jQuery(form).on("found_variation", function(event, variation) {
3934        handleVisibility(variation.variation_id);
3935    });
3936}
3937
3938}
3939
3940
3941
3942
3943function sr_filterInit(){
3944  setTimeout(function(){
3945    initFilterDropdowns();
3946    initFilterTags();
3947    initFilterRange();
3948  }, 0); // pushes the function execution to the end of the browser's event queue to allows filters in the popup working correctly
3949};
3950
3951function initFilterDropdowns(){
3952  /*------------------------------
3953  START: FILTER DROPDOWNS
3954  ------------------------------*/
3955  var filterDropdown = document.querySelectorAll('[data-sr-dropdown-atts]');
3956  if(filterDropdown.length){
3957    sonaarFilter = Vue.component('sonaar-filters',{
3958      components: {
3959        Multiselect: window.VueMultiselect.default
3960      },
3961      template: `
3962      <div class="srp-filters-widget" :data-player-id="atts.playerid">
3963          <!--<label class="typo__label">{{atts.metakey}}</label>-->
3964          <multiselect :data-catid="atts.catid" :key="componentKey" :ref="atts.metakey"
3965              v-model="value"
3966              :options="atts.options"
3967              placeholder="Pick some"
3968              :multiple="(atts.selecttype == 'singleselect') ? false : true"
3969              :close-on-select="(atts.close_on_select) ? true : false"
3970              :clear-on-select="false"
3971              :preserve-search="false"
3972              :placeholder="atts.label"
3973              :hide-selected="false"
3974              :show-labels="false"
3975              :searchable="(atts.searchable) ? true : false"
3976              :readonly="true"
3977              label=""
3978              track-by=""
3979              :preselect-first="false"
3980              @remove="removeTag"
3981              @input="listAllAction"
3982              @select="dispatchAction"
3983              @close="closeEventHandler"
3984              :data-metakey="atts.metakey" 
3985              :data-label="atts.label"
3986          >
3987          <span slot="noResult">
3988            No matching options.
3989          </span>
3990       
3991              <template slot="selection" slot-scope="{ values, search, isOpen }">
3992                  <span class="multiselect__multiple"  v-if="values.length">{{ atts.label }} ({{ values.length }}+)</span>
3993              </template>
3994              <template slot="tag">{{ "" }}</template>
3995          </multiselect>
3996      </div>
3997      `,
3998      props: ['atts'],
3999      data: function() { return {
4000        componentKey: 0,
4001        value:this.initializeFilter(),
4002        
4003      } },
4004      mounted: function() {
4005        // open-on-init-only (can close after)
4006        // move content down when open (position relative vs position absolute)
4007      
4008        if(this.atts.open_on_init || this.atts.open_always){
4009          this.$refs[this.atts.metakey].$el.querySelector('.multiselect__content-wrapper').style.position = 'relative';
4010          this.$refs[this.atts.metakey].isOpen = true;
4011        }
4012      },
4013      methods: {
4014        closeEventHandler(){
4015          // open-always (cannot close)
4016          if(this.atts.open_always){
4017            this.$refs[this.atts.metakey].isOpen = true;
4018          }
4019        },
4020        initializeFilter(){
4021          const playerId = srp_getPlayerIdParamFromUrl();
4022          if( 
4023            this.atts.playerid == '' && playerId === null ||
4024            playerId == this.atts.playerid
4025          ){
4026            return srp_getMetaParams(this.atts.metakey);
4027          }
4028        },
4029        dispatchAction (value) {
4030          if (this.atts.selecttype == "singleselect"){
4031            // when dealing with single select
4032            this.removeTag();
4033          }
4034
4035          srp_addMeta( this.atts.playerid, this.atts.metakey, value, this.atts.selecttype );
4036
4037        },
4038        removeTag(value){
4039          srp_removeMeta( this.atts.metakey, value, this.atts.playerid, this.atts.selecttype);
4040        },
4041        listAllAction (values) {
4042        }
4043      },
4044    });
4045
4046    filterDropdown.forEach(function(element) {
4047      var atts = JSON.parse(element.getAttribute('data-sr-dropdown-atts'));
4048      if (atts.options.length == 0)
4049      return;
4050  
4051      var playerId = atts.options[0].playerid;
4052      var player_cat_ids = [];
4053
4054      if(playerId){
4055        var player = document.getElementById(playerId);
4056        if(player){
4057            var audioPlayer = player.querySelector('.iron-audioplayer');
4058            if (audioPlayer) {
4059              player_cat_ids = audioPlayer.getAttribute('data-category');
4060              player_cat_ids = player_cat_ids.split(',').map(Number);
4061            }
4062        }
4063      }
4064  
4065      if (player_cat_ids.length > 0 && atts.options) { // Added the check for showOnlyIds.length > 0
4066        atts.options.forEach(filter => {
4067            if (filter.term_ids) {
4068                const filteredOptions = [];
4069                const filteredTermIds = [];
4070                filter.term_ids.forEach((id, index) => {
4071                    if (player_cat_ids.includes(id)) {
4072                        filteredOptions.push(filter.options[index]);
4073                        filteredTermIds.push(id);
4074                    }
4075                });
4076
4077                // Update filter with the filtered values only if there were matching IDs
4078                if (filteredOptions.length > 0) {
4079                    filter.options = filteredOptions;
4080                    filter.term_ids = filteredTermIds;
4081                }
4082            }
4083        });
4084      }
4085      const vm = new Vue({
4086          el: element,
4087          data: {},
4088          template: '<div :id="atts.id" class="srp-filters-container">' +
4089              '<sonaar-filters v-for="(filter, index) in atts.options" :atts="filter"/>' +
4090              '</div>',
4091          created: function() {
4092              this.atts = atts;
4093          }
4094      });
4095      myVueAr.push(vm);
4096    });
4097  
4098  }else{  
4099    myVueAr.forEach(function(vm){ //replacing the filter dropdowns with the new ones
4100      $('#'+ $(vm.$el).attr('id') ).replaceWith( vm.$el )
4101    })
4102  }
4103  /*------------------------------
4104  END: FILTER DROPDOWNS
4105  ------------------------------*/
4106}
4107function initFilterTags(){
4108  /*------------------------------
4109  START: FILTER TAGS
4110  ------------------------------*/
4111  var filterTags = document.querySelectorAll('[data-sr-tags-atts]');
4112
4113  if(!filterTags.length){
4114    myVueTag.forEach(function(vm){ //replacing the filter tags with the new ones
4115      $('#'+ $(vm.$el).attr('id') ).replaceWith( vm.$el )
4116    })
4117    return;
4118  } 
4119
4120    var filterButtonColors=['#E2675A','#FFA374', '#FDECB3','#FACA83','#FFCFD7', '#7E69FF','#EDFFAE','#9BC48D', '#D4FDE1','#CDF1F8','#B9C1E3', '#AE98E5','#7DB04D','#CCE780', '#8393CC','#00BFAF','#10A4EE', '#BFFB00','#FF94A6','#F7F47C', '#5171E4'];
4121    filterButtonColors = [...Array(3)].flatMap(() => filterButtonColors);
4122
4123  
4124
4125    Vue.component('sonaar-tags', {
4126      template: `
4127      <div class="srp-tags-widget">
4128          <div v-for="tagGroup in atts.options" class="srp_filter_container" :key="tagGroup.label" :data-randomcolor="tagGroup.randomcolor">
4129              <div class="srp_filter_button_label">{{ tagGroup.label }}</div>
4130              <transition-group name="list" tag="ul" class="srp_filter_buttons_list">
4131              <li v-for="(tagValue, index) in (showAllTags[tagGroup.label] ? tagGroup.options : limitedOptions(tagGroup))"
4132              :key="tagValue">
4133                      <div 
4134                          :class="['srp_filter_button', isActive(tagGroup, tagValue) ? 'srp_filter_button--active' : '']"
4135                          :style="getTagColor(tagGroup, index)"
4136                          :data-selecttype="tagGroup.selecttype"
4137                          :data-label="tagGroup.label"
4138                          :data-metakey="tagGroup.metakey"
4139                          :data-playerid="tagGroup.playerid"
4140                          :data-value="tagValue"
4141                          :data-cat="tagGroup.term_ids[index]"
4142                          @click="tagClicked(tagGroup, tagValue)">{{ tagValue }}</div>
4143                  </li>
4144              </transition-group>
4145              <div v-if="!showAllTags[tagGroup.label] && tagGroup.options.length > getItemsPerPage(tagGroup)">
4146                <a href="#" @click.prevent="toggleShowAll(tagGroup)" class="srp-filter-more-link">{{ tagGroup.show_more_label }}</a>
4147              </div>
4148              <div v-if="showAllTags[tagGroup.label] && tagGroup.options.length > getItemsPerPage(tagGroup)">
4149                  <a href="#" @click.prevent="toggleShowAll(tagGroup)" class="srp-filter-more-link">{{ tagGroup.show_less_label }}</a>
4150              </div>
4151          </div>
4152      </div>
4153      `,
4154    
4155      props: ['atts'],
4156      data: function() {
4157        const state = this.initializeState();
4158        return {
4159            showAllTags: state.showAllTags,
4160            activeTags: state.activeTags,
4161            filterButtonColors: filterButtonColors
4162        };
4163      },
4164
4165      methods: {
4166        initializeState() {
4167          const initialState = {
4168              showAllTags: {},
4169              activeTags: []
4170          };
4171          const playerId = srp_getPlayerIdParamFromUrl();
4172      
4173          if (this.atts && this.atts.options) {
4174              this.atts.options.forEach(tagGroup => {
4175                  initialState.showAllTags[tagGroup.label] = false;  // Initialize showAllTags for each group
4176      
4177                  if ((tagGroup.playerid === '' && playerId === null) || playerId == tagGroup.playerid) {
4178                      let groupActiveTagsValues = srp_getMetaParams(tagGroup.metakey);
4179                      
4180                      if (groupActiveTagsValues) { 
4181                          // Convert tag values to identifiers
4182                          let groupActiveTags = groupActiveTagsValues.map(tagV
4182alue => this.getTagIdentifier(tagGroup, tagValue));
4183                          initialState.activeTags = [...initialState.activeTags, ...groupActiveTags];  // Populate activeTags array
4184                      }
4185                  }
4186              });
4187          }
4188      
4189          return initialState;
4190        },
4191        getItemsPerPage(tagGroup) {
4192          if (tagGroup.items_per_page === "all" || tagGroup.options.length <= Number(tagGroup.items_per_page)) {
4193              return Infinity;
4194          } else {
4195              return Number(tagGroup.items_per_page);
4196          }
4197        },
4198        toggleShowAll(tagGroup) {
4199          this.$set(this.showAllTags, tagGroup.label, !this.showAllTags[tagGroup.label]);
4200        },
4201        limitedOptions: function(tagGroup) {
4202          if (tagGroup.items_per_page === "all") {
4203              return tagGroup.options;
4204          } else {
4205              return tagGroup.options.slice(0, tagGroup.items_per_page);
4206          }
4207        },
4208        tagClicked(tagGroup, tagValue) {
4209            let tagIdentifier = this.getTagIdentifier(tagGroup, tagValue);
4210            
4211            if (this.isActive(tagGroup, tagValue)) {
4212                // Remove the tagIdentifier from the activeTags list
4213                this.activeTags = this.activeTags.filter(tag => tag !== tagIdentifier);
4214                srp_removeMeta(tagGroup.metakey, tagValue, tagGroup.playerid, tagGroup.selecttype);
4215              } else {
4216                  if (tagGroup.selecttype === 'singleselect') {
4217                      this.activeTags= [];
4218                      srp_removeMeta(tagGroup.metakey, null, tagGroup.playerid, tagGroup.selecttype);
4219                  }
4220                  this.activeTags.push(tagIdentifier);
4221                  srp_addMeta(tagGroup.playerid, tagGroup.metakey, tagValue, tagGroup.selecttype);
4222              }
4223        },
4224        isActive(tagGroup, tagValue) {
4225            let tagIdentifier = this.getTagIdentifier(tagGroup, tagValue);
4226            return this.activeTags.includes(tagIdentifier);
4227        },
4228        getTagIdentifier(tagGroup, tagValue) {
4229            return tagGroup.metakey + "_" + tagValue;
4230        },
4231        getTagColor(tagGroup, index) {
4232          const isActive = this.isActive(tagGroup, tagGroup.options[index]);
4233          const color = filterButtonColors[index % filterButtonColors.length];
4234
4235          return tagGroup.randomcolor === 'true' && isActive ? { backgroundColor: color, borderColor: color } : {};
4236        },
4237      }
4238    });
4239
4240
4241    filterTags.forEach(element => {
4242      const atts = JSON.parse(element.getAttribute('data-sr-tags-atts'));
4243
4244      if (atts.options.length == 0)
4245      return;
4246      
4247      var playerId = atts.options[0].playerid;
4248      var player_cat_ids = [];
4249
4250      if(playerId){
4251        var player = document.getElementById(playerId);
4252        if(player){
4253            var audioPlayer = player.querySelector('.iron-audioplayer');
4254            if (audioPlayer) {
4255              player_cat_ids = audioPlayer.getAttribute('data-category');
4256              player_cat_ids = player_cat_ids.split(',').map(Number);
4257            }
4258        }
4259      }
4260
4261      if (player_cat_ids.length > 0 && atts.options) { // Added the check for showOnlyIds.length > 0
4262        atts.options.forEach(filter => {
4263            if (filter.term_ids) {
4264                const filteredOptions = [];
4265                const filteredTermIds = [];
4266                filter.term_ids.forEach((id, index) => {
4267                    if (player_cat_ids.includes(id)) {
4268                        filteredOptions.push(filter.options[index]);
4269                        filteredTermIds.push(id);
4270                    }
4271                });
4272
4273                // Update filter with the filtered values only if there were matching IDs
4274                if (filteredOptions.length > 0) {
4275                    filter.options = filteredOptions;
4276                    filter.term_ids = filteredTermIds;
4277                }
4278            }
4279        });
4280      }
4281      
4282      const vm = new Vue({
4283        el: element,
4284        data: { atts },
4285        template: '<sonaar-tags :id="atts.id" :atts="atts"/>'
4286      });
4287      
4288      myVueTag.push(vm);
4289  });
4290
4291
4292  /*------------------------------
4293  END: FILTER TAGS
4294  ------------------------------*/
4295}
4296
4297function initFilterRange(){
4298  /*------------------------------
4299  START: DOUBLE RANGE SELECTOR
4300  ------------------------------*/
4301  Vue.component('vue-slider', window['vue-slider-component']);
4302
4303  const sonaarDoubleRangeSelector = Vue.component('sonaar-double-range-selector', {
4304    template: `
4305    <div class="srp_range_container">
4306      <div class="srp_range_header">
4307        <div class="srp_filter_button_label">{{ sliderData.label }}</div>
4308        <div class="srp_range_value">{{ formattedSliderValue[0] }} - {{ formattedSliderValue[1] }} {{ sliderData.unit }}</div>
4309      </div>
4310      <vue-slider 
4311      v-model="sliderValue" 
4312      :tooltip="'focus'" 
4313      :marks="marks" 
4314      :min="computedMin" 
4315      :max="computedMax"
4316      :lazy="true"
4317      @change="updateRange" 
4318      :data-metakey="sliderData.metakey"
4319      :data-label="sliderData.label"
4320      >
4321        <template v-slot:tooltip="{ value }">
4322          <div class="vue-slider-dot-tooltip-inner vue-slider-dot-tooltip-inner-top">
4323            <span v-if="option.selecttype === 'time'" class="vue-slider-dot-tooltip-text">{{ secondsToTime(value) }}</span>
4324            <span v-else class="vue-slider-dot-tooltip-text">{{ value }}</span>
4325          </div>
4326        </template>
4327      </vue-slider>
4328      <div class="srp_range_buttons" v-if="option.selecttype === 'tempo'">
4329        <button class="srp_filter_button" @click="setTempoRange('slow')">Slow</button>
4330        <button class="srp_filter_button" @click="setTempoRange('medium')">Medium</button>
4331        <button class="srp_filter_button" @click="setTempoRange('fast')">Fast</button>
4332      </div>
4333    </div>
4334    `,
4335    props: ['option'],
4336    computed: {
4337        sliderValue: function() {
4338          //console.log(this.computedMin, this.computedMax);
4339            return [this.computedMin, this.computedMax];
4340        },
4341        computedMin: function() {
4342            if (this.option.selecttype === 'time') {
4343                return timeToSeconds(this.option.min);
4344            }
4345            let minVal = (!isNaN(this.option.min) && this.option.min !== null && this.option.min !== "") ? Number(this.option.min) : 0;
4346            return minVal;
4347        },
4348        computedMax: function() {
4349            if (this.option.selecttype === 'time') {
4350                return timeToSeconds(this.option.max);
4351            }
4352            let maxVal = (!isNaN(this.option.max) && this.option.max !== null && this.option.max !== "") ? Number(this.option.max) : 100;
4353            return maxVal;
4354        },
4355        formattedSliderValue: function() {
4356          if (this.option.selecttype === 'time') {
4357              return this.sliderValue.map(value => secondsToTime(value));
4358          } else {
4359              return this.sliderValue;
4360          }
4361        },
4362        marks: function() {
4363            function customRound(n) {
4364                n = Math.round(n);
4365                let lastDigit = n % 10;
4366                if (lastDigit < 3) {
4367                    return n - lastDigit;
4368                } else if (lastDigit < 8) {
4369                    return n + (5 - lastDigit);
4370                } else {
4371                    return n + (10 - lastDigit);
4372                }
4373            }
4374            let interval = (this.computedMax - this.computedMin) / 4; 
4375            let rawMarks = Array.from({ length: 5 }).map((_, idx) => customRound(this.computedMin + interval * idx));
4376        
4377            // If select type is 'time', convert the marks from seconds to HH:MM:SS format
4378            if (this.option.selecttype === 'time') {
4379                return rawMarks.reduce((acc, mark) => {
4380                    acc[mark] = secondsToTime(mark);
4381                    return acc;
4382                }, {});
4383            }
4384            return rawMarks.reduce((acc, mark) => {
4385                acc[mark] = mark.toString();
4386                return acc;
4387            }, {});
4388            }
4389    },
4390    data: function() {
4391      //console.log(this.option);
4392      return {
4393         // sliderValue: [null, null], // Temporary values
4394         sliderValue: this.option.selecttype === 'time' ? 
4395         [timeToSeconds(this.option.min), timeToSeconds(this.option.max)] : 
4396         [null, null],
4397          sliderData: {
4398              label: this.option.label,
4399              metakey: this.option.metakey,
4400              playerid: this.option.playerid,
4401              unit: this.option.unit
4402          }
4403      };
4404    },
4405    mounted: function() {
4406      this.sliderValue = [Number(this.computedMin), Number(this.computedMax)];
4407
4408      let searchParams = new URLSearchParams(window.location.search);
4409      let playerIdQuery = searchParams.get('srp_player_id');
4410
4411      if (playerIdQuery === this.sliderData.playerid) {
4412          let metaKeyQuery = searchParams.get('srp_meta');
4413          let decodedMetaKeyQuery = decodeURIComponent(metaKeyQuery);
4414          let metas = decodedMetaKeyQuery.split(';');
4415          metas.forEach((meta) => {
4416              let [key, value] = meta.split(':');
4417              if (key.endsWith('_minmax') && key.slice(0, -7) === this.sliderData.metakey) {
4418                  this.sliderValue = value.split('_').map(val => Number(val));
4419              }
4420          });
4421      }
4422      IRON.rangeSelector.push(this);
4423    },
4424    
4425    methods: {
4426      setTempoRange(tempo) {
4427        switch (tempo) {
4428          case 'slow':
4429            this.sliderValue = [this.computedMin, 64];
4430            break;
4431          case 'medium':
4432            this.sliderValue = [65, 115];
4433            break;
4434          case 'fast':
4435            this.sliderValue = [116, this.computedMax];
4436            break;
4437        }
4438        this.updateRange();
4439      },
4440      getUrlParams() {
4441        let vars = {};
4442        window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) {
4443            vars[key] = value;
4444        });
4445        return vars;
4446      },
4447      updateRange() {
4448          srp_removeMeta(this.sliderData.metakey, null, this.sliderData.playerid, 'range');
4449          srp_addMeta(this.sliderData.playerid, this.sliderData.metakey, this.sliderValue.join('_'), 'range'); // This will now use the updated slider values
4450      }
4451  }
4452});
4453
4454
4455
4456var rangeSelectors = document.querySelectorAll('[data-sr-range-atts]');
4457
4458if(!rangeSelectors.length){
4459  myVueRange.forEach(function(vm){ //replacing the filter Range with the new ones
4460    $('#'+ $(vm.$el).attr('id') ).replaceWith( vm.$el )
4461  })
4462  return;
4463} 
4464  
4465rangeSelectors.forEach(function(element) {
4466    var atts = JSON.parse(element.getAttribute('data-sr-range-atts'));
4467    const vm = new Vue({
4468      el: element,
4469      data: {
4470          atts
4471        },
4472      template: `
4473          <div :id="atts.id" class="srp_range_wrapper">
4474              <sonaar-double-range-selector 
4475                  v-for="option in atts.options" 
4476                  :key="option.metakey"
4477                  :option="option">
4478              </sonaar-double-range-selector>
4479          </div>
4480      `
4481  });
4482  myVueRange.push(vm);
4483});
4484
4485}
4486// Helper function to convert second string to time format
4487function secondsToTime(seconds) {
4488  const hours = Math.floor(seconds / 3600);
4489  seconds %= 3600;
4490  const minutes = Math.floor(seconds / 60);
4491  const secs = seconds % 60;
4492
4493  let result;
4494  if (hours > 0) {
4495      result = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
4496  } else if (minutes > 0) {
4497      result = `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
4498  } else {
4499      result = `00:${secs.toString().padStart(2, '0')}`;
4500  }
4501  //console.log(`Input seconds: ${seconds}, Formatted time: ${result}`);
4502  return result;
4503}
4504
4505// Helper function to convert time string to seconds
4506function timeToSeconds(timeStr) {
4507  const parts = timeStr.split(":").map(part => parseInt(part, 10));
4508
4509  if (parts.length === 3) { // HH:MM:SS format
4510      return parts[0] * 3600 + parts[1] * 60 + parts[2];
4511  } else if (parts.length === 2) { // MM:SS format
4512      return parts[0] * 60 + parts[1];
4513  } else {
4514      return 0;
4515  }
4516}
4517
4518function updateFilterSelector(metaParams, playerId = null){
4519  // updates options from filters dropdown
4520  for (const myVue in myVueAr){
4521    const vm = myVueAr[myVue];
4522    if( typeof vm != 'undefined'){
4523      if($(vm.$el).find('.srp-filters-widget').data('playerId') == playerId){
4524        for(const i in vm.$children){
4525          let params = metaParams[vm.$children[i].atts.metakey]
4526          if(typeof params == 'string'){
4527            vm.$children[i].value = params.split(',');
4528          }else{
4529            vm.$children[i].value = [];
4530          }
4531        }
4532      }
4533    }
4534  }
4535}
4536
4537let debounceTimeout;
4538
4539function sr_addTrackToPlaylist(track, $player, playlistName = 'RecentlyPlayed', mustPlayToProceed = true, maxPlaylistSize = 50, playerStateClass = 'srp_player_is_recentlyPlayed', debounceDelay = 3000) {
4540  if(sonaar_music.option.is_user_history_usermeta_enabled !== "true") return;
4541  
4542  isSrcLoaded = (typeof $("#sonaar-audio").attr("src") == "undefined") ? false : true;
4543
4544    function executeTrackLogic() {
4545        let trackId;
4546        let trackPos;
4547
4548        // Determine if the player is in the specified state
4549        if (typeof IRON.sonaar.player.list.tracks[0] !== 'undefined') {
4550
4551            if(IRON.sonaar.player.continuous && isSrcLoaded === false) return; // if continuous player is loaded from Cookie and track is not set yet
4552
4553            if(mustPlayToProceed && !IRON.sonaar.player.isPlaying) return;
4554
4555            if (IRON.sonaar.player.selectedPlayer !== null && IRON.sonaar.player.selectedPlayer !== undefined) {
4556                if (IRON.sonaar.player.selectedPlayer.hasClass(playerStateClass)) {
4557                    return; // if we want to prevent the current player from auto-adding its track
4558                }
4559            }
4560            //console.log("here"); // This will only log if the above condition is false
4561            if (typeof track !== 'undefined') {
4562                if (typeof track.sourcePostID !== 'undefined') {
4563                    trackId = track.sourcePostID;
4564                    trackPos = track.track_pos;
4565                }
4566            } else {
4567                console.error('No track information available');
4568                return;
4569            }
4570        } else if (typeof $player !== 'undefined' && !$player.hasClass(playerStateClass)) {
4571          if (mustPlayToProceed && track.length === 0) return;
4572            trackId = $(track).data('post-id');
4573            trackPos = $(track).data('track-pos');
4574        } else {
4575            return;
4576        }
4577
4578        if (!trackId) {
4579            console.error('Track ID is undefined');
4580            return;
4581        }
4582
4583        // Construct trackInfo object
4584        const trackInfo = {
4585            postId: trackId.toString(),
4586            trackPos: trackPos ? trackPos.toString() : '0',
4587        };
4588
4589        // Handle the playlist
4590        let playlistIndex = IRON.userPlaylists.findIndex(playlist => playlist.playlistName === playlistName);
4591        if (playlistIndex === -1) {
4592            IRON.userPlaylists.push({
4593                playlistName: playlistName,
4594                tracks: [trackInfo]
4595            });
4596        } else {
4597            let tracks = (typeof IRON.userPlaylists[playlistIndex].tracks === 'undefined') ? [] : IRON.userPlaylists[playlistIndex].tracks;
4598            tracks.unshift(trackInfo);
4599            IRON.userPlaylists[playlistIndex].tracks = tracks.slice(0, maxPlaylistSize);
4600        }
4601
4602        // Update server or cookies based on system setup
4603        updatePlaylistStorage();
4604    }
4605
4606    if (debounceDelay > 0) {
4607        clearTimeout(debounceTimeout);  // Clear existing timeout
4608        debounceTimeout = setTimeout(() => {
4609            executeTrackLogic();
4610        }, debounceDelay);
4611    } else {
4612        executeTrackLogic();
4613    }
4614}
4615
4616
4617
4618
4619function updatePlaylistStorage() {
4620  if (srp_vars.is_logged_in === 'no' && sonaar_music.option.is_user_history_cookie_enabled === "true" ) {
4621      document.cookie = "sonaar_mp3_playlists=" + encodeURIComponent(JSON.stringify(IRON.userPlaylists)) + "; max-age=31536000; path=/;";
4622      //check if $('.srp_player_is_recentlyPlayed') exist
4623      if ($('.srp_player_is_recentlyPlayed').length) {
4624        IRON.audioPlayer.reloadAjax($('.srp_player_is_recentlyPlayed'), false, true, false);
4625      }
4626  } else if (srp_vars.is_logged_in === 'yes') {
4627      $.ajax({
4628          url: sonaar_music.ajax.ajax_url,
4629          type: 'POST',
4630          dataType: 'json',
4631          data: {
4632              action: 'update_user_playlist',
4633              nonce: sonaar_music.ajax.ajax_nonce,
4634              playlists: IRON.userPlaylists
4635          },
4636          success: function (response) {
4637              //console.log(response);
4638              //console.log(IRON.userPlaylists);
4639              if ($('.srp_player_is_recentlyPlayed').length) {
4640                IRON.audioPlayer.reloadAjax($('.srp_player_is_recentlyPlayed'), false, true, false);
4641              }
4642          }
4643      });
4644  }
4645}
4646
4647function sr_setCookieSettings() {
4648  if (IRON.sonaar.player.classes.feedUrl && !IRON.sonaar.player.elWidgetId) {
4649    // Escape and delete cookies if the player is not playing a playlist post
4650    document.cookie = "sonaar_mp3_player_settings" + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
4651    document.cookie = "sonaar_mp3_player_time" + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
4652    return;
4653  }
4654
4655  let track_Id;
4656  if(typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack] != 'undefined' && typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].track_index != 'undefined'){
4657    track_Id = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].track_index;
4658  }else{
4659    track_Id = IRON.sonaar.player.currentTrack;
4660  }
4661  
4662  var playlistID, categoryID;
4663
4664  if( IRON.sonaar.player.playlistID != null){
4665    playlistID = IRON.sonaar.player.playlistID.toString().split(", ");
4666  }else{
4667    playlistID = '';
4668  }
4669  if( IRON.sonaar.player.categoryID != null){
4670    categoryID = IRON.sonaar.player.categoryID.toString().split(", ");
4671  }else{
4672    categoryID = '';
4673  }
4674
4675  cvalue = {
4676    playlistID: IRON.sonaar.player.elWidgetId ? IRON.sonaar.player.postId : playlistID,
4677    category: categoryID,
4678    trackID: track_Id ,
4679    elWidgetId: IRON.sonaar.player.elWidgetId,
4680    shuffle: IRON.sonaar.player.shuffle,
4681    mute: IRON.sonaar.player.mute,
4682    isPlaying: IRON.sonaar.player.isPlaying,
4683    minimize: IRON.sonaar.player.minimize,
4684    json: IRON.sonaar.player.cookieSetting.json, //Required for the continuous player with Post Related or "audio_meta_field" shorcode attribute as source
4685  };
4686
4687  if (cvalue.playlistID == "" && cvalue.category == "") {
4688    //Verify cookie value
4689    return;
4690  }
4691
4692  var now = new Date();
4693  var expires = (typeof sonaar_music.option.srmp3_cookie_expiration !== 'undefined') ? sonaar_music.option.srmp3_cookie_expiration : 3600;
4694  if(expires !=='default'){
4695    now.setTime(now.getTime() + expires * 1000); // Set the expiration time to 10 seconds from now
4696    expires = "expires=" + now.toUTCString();
4697  }
4698  document.cookie = "sonaar_mp3_player_settings" + "=" + JSON.stringify(cvalue) + ";" + expires + ";path=/";
4699}
4700
4701function sr_setCookieVolume() {
4702  document.cookie = "sonaar_mp3_player_volume" + "=" + IRON.sonaar.player.volume + ";default;path=/";
4703}
4704
4705function sr_setCookieTime() {
4706  if (IRON.sonaar.player.classes.continuousPlayer && ((IRON.sonaar.player.elWidgetId && IRON.sonaar.player.classes.feedUrl) || !IRON.sonaar.player.classes.feedUrl)) {
4707    // If Continuous player is enable AND if playlist is not built through a shortcode.
4708    var cvalue = sr_getTrackCurrentTime();
4709    document.cookie = "sonaar_mp3_player_time" + "=" + cvalue + ";default;path=/";
4710  }
4711}
4712
4713function sr_getCookieSettings() {
4714  var cookieSettingsValue = getCookieValue("sonaar_mp3_player_settings");
4715  var cookieVolumeValue = getCookieValue("sonaar_mp3_player_volume");
4716  var cookieTimeValue = getCookieValue("sonaar_mp3_player_time");
4717
4718  if (cookieSettingsValue != "") {
4719    cookieSettingsValue = JSON.parse(cookieSettingsValue);
4720    sr_setPlayerfromCookieSettings(cookieSettingsValue, cookieVolumeValue);
4721  } else {
4722    sr_setVolume(cookieVolumeValue);
4723  }
4724  if (cookieTimeValue != "") {
4725    sr_setTrackCurrentTime(cookieTimeValue);
4726  }
4727}
4728
4729function sr_getCookieVolume() {
4730  const cookieVolumeValue = getCookieValue("sonaar_mp3_player_volume");
4731  sr_setVolume(cookieVolumeValue);
4732}
4733
4734function getCookieValue(cname) {
4735  var name = cname + "=";
4736  var decodedCookie = decodeURIComponent(document.cookie);
4737  var ca = decodedCookie.split(";");
4738  for (var i = 0; i < ca.length; i++) {
4739    var c = ca[i];
4740    while (c.charAt(0) == " ") {
4741      c = c.substring(1);
4742    }
4743    if (c.indexOf(name) == 0) {
4744      return c.substring(name.length, c.length);
4745    }
4746  }
4747  return "";
4748}
4749
4750function sr_setPlayerfromCookieSettings(playerSetting, cookieVolumeValue) {
4751  IRON.sonaar.player.setPlayer({
4752    id: playerSetting.playlistID,
4753    category: playerSetting.category,
4754    elwidgetid: playerSetting.elWidgetId,
4755    trackid: playerSetting.trackID,
4756    shuffle: playerSetting.shuffle,
4757    json: playerSetting.json,
4758    continuous: true
4759  });
4760  var firstLoad = true;
4761
4762  sr_setVolume(cookieVolumeValue);
4763  sr_setMute(playerSetting.mute);
4764  if (playerSetting.isPlaying) {
4765    $("#sonaar-audio").on("loadeddata", function () {
4766      //when the audio element is loaded
4767      if (firstLoad) {
4768        //Dont want to SET current time on the second audio loading.
4769        firstLoad = false;
4770        IRON.sonaar.player.playAudio();
4771      }
4772    });
4773  }
4774  
4775  IRON.sonaar.player.classes.dontCountContinuous = true;
4776  IRON.sonaar.player.classes.continued = true;
4777  IRON.sonaar.player.minimize = playerSetting.minimize;
4778  IRON.sonaar.player.postId = playerSetting.playlistID;
4779  IRON.sonaar.player.elWidgetId = playerSetting.elWidgetId;
4780  IRON.sonaar.player.classes.feedUrl = IRON.sonaar.player.elWidgetId ? true : false;
4781  IRON.sonaar.player.cookieSetting.json = playerSetting.json; //Required for the continuous player with Post Related or "audio_meta_field" shorcode attribute as source
4782}
4783
4784function sr_getTrackCurrentTime(audioPlayer = null) {
4785  if (IRON.audioPlayer.stickyEnable){
4786    return document.getElementById("sonaar-audio").currentTime;
4787  }else if(audioPlayer != null){
4788    const audioInstance = sr_setAudioElementInstance(audioPlayer);
4789    return audioInstance.currentTime;
4790  }   
4791}
4792
4793function sr_getTrackDuration() {
4794  return document.getElementById("sonaar-audio").duration;
4795}
4796
4797function sr_setTrackCurrentTime(value) {
4798  IRON.sonaar.player.cookieSetting.currentTime = value;
4799
4800  var firstLoad = true;
4801  $("#sonaar-audio").on("loadeddata", function () {
4802    //when the audio element is loaded
4803    if (firstLoad) {
4804      //Dont want to SET current time on the second audio loading.
4805      firstLoad = false;
4806
4807      if (value > sr_getTrackDuration() || sr_getTrackDuration() == "Infinity") return;
4808
4809      document.getElementById("sonaar-audio").currentTime = value;
4810    }
4811  });
4812  
4813}
4814
4815//Set Modal Popup
4816let sr_modal_loaded = false;
4817const closeSvg = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve"><g><rect x="15.5" y="3.3" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -6.6274 16)" width="2" height="25.5"></rect><rect x="3.3" y="15.5" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -6.6274 16)" width="25.5" height="2"></rect></g></svg>';
4818function sr_setPopUp() {
4819  
4820  if (sr_modal_loaded !== true) {
4821    const popUp = '<div id="sonaar-modal" onclick="sr_closePopUp(this);"><div class="sr_popup-dialog"><div class="sr_popup-content"><div class="sr_close" onclick="sr_closePopUp(this)">' + closeSvg + '</div><div class="sr_popup-body"></div></div></div></div><div class="sr_popup-backdrop"></div>';
4822    jQuery('body').append(popUp);
4823    sr_modal_loaded = true;
4824  }
4825}
4826
4827
4828function sr_popUp(id, storeId, trackNumber = null, playerId = null, el) {
4829  srp_wc_loadspinner($(el))
4830  var data = {
4831    'action': 'load_post_by_ajax',
4832    'id': id,
4833    'store-id': storeId,
4834    'nonce': sonaar_music.ajax.ajax_nonce
4835  };
4836  $.post(sonaar_music.ajax.ajax_url, data, function (response) {
4837    srp_wc_unloadspinner($(el))
4838    response = srp_convertTTMLTime(JSON.parse(response));
4839    $('#sonaar-modal .sr_popup-body').html(response);
4840    $('#sonaar-modal').attr('data-track-number', trackNumber);
4841    $('#sonaar-modal').attr('data-player-id', playerId);
4842    sr_openPopUp();
4843  })
4844}
4845function sr_openPopUp() {
4846  $(document).keyup(function (e) {
4847    if (e.key === "Escape") {
4848      sr_closePopUp();
4849    }
4850  });
4851  sr_popup_maybe_apply_bg_img();
4852  $('body').addClass('sr_popup-open');
4853  $('#sonaar-modal, .sr_popup-backdrop').addClass('sr_show');
4854}
4855function sr_popup_maybe_apply_bg_img() {
4856  // Find the first image in the modal
4857  var $img = $('#sonaar-modal').find('img').first();
4858  if ($img.length > 0) {
4859    if(sonaar_music.option.cta_popup_background_image !== 'true') return;
4860    var imgUrl = $img.attr('src');
4861
4862    // Add the has-bg-image class and dynamically inject the background image
4863    $('#sonaar-modal').addClass('has-bg-image');
4864    
4865    // Inject CSS to the ::before pseudo-element
4866    var styleTag = $('#sr-popup-bg-style');
4867    if (styleTag.length === 0) {
4868      $('head').append('<style id="sr-popup-bg-style"></style>');
4869      styleTag = $('#sr-popup-bg-style');
4870    }
4871
4872    styleTag.html(`
4873      #sonaar-modal.has-bg-image .sr_popup-content::before {
4874        background-image: url('${imgUrl}');
4875      }
4876    `);
4877  } else {
4878    // Remove the background image if no image is found
4879    $('#sonaar-modal').removeClass('has-bg-image');
4880    
4881    // Remove the injected style if there's no background image
4882    $('#sr-popup-bg-style').remove();
4883  }
4884}
4885
4886function sr_closePopUp(el) {
4887
4888  // Prevent popup to be clicked outside and close if contain a form
4889  if (el !== undefined) {
4890    if (!$(el).hasClass('sr_close') && $('#sonaar-modal').find('input').length > 0) {
4891      return; // Exit the function and don't close the modal if it's a "Make Offer" form
4892    }
4893  }
4894  if ($(el).attr('id') == 'sonaar-modal' && $(".sr_popup-dialog:hover").length != 0) { //When "sr_closePopUp" function is cast from a click on 'sonaar-modal' we want exit the fucntion if the cursor is over the popup content.
4895    return;
4896  }
4897  //$(document).off(); // this conflict with Elementor Popup that does not open once our popup has been opened.
4898  $('body').removeClass('sr_popup-open');
4899  $('#sonaar-modal, .sr_popup-backdrop').removeClass('sr_show');
4900}
4901
4902function sr_audioSkipTo(seconds = 30, $audio_el = null) {
4903  const audioInstance = sr_setAudioElementInstance();
4904  audioInstance.currentTime = audioInstance.currentTime + seconds;
4905}
4906
4907function srp_toggleLyricsContainer() {
4908  if ($('#srmp3_lyrics_container').hasClass("open")) {
4909    $('#srmp3_lyrics_container').toggleClass("open");
4910    $('#srmp3_lyrics_container').toggle();
4911  }
4912}
4913
4914// embed Lyrics
4915//let sr_lyric_loaded = false;
4916
4917function sr_setLyricsPlayingContainer() {
4918
4919  if (sr_lyric_loaded !== true) {
4920    const popUp = '<!-- Lyrics Now Playing --><div id="srmp3_lyricsplaying_container"></div><div id="srmp3_lyrics_container" style="display:none;"><i class="sricon-close-circle"></i><div class="srmp3_lyrics"></div></div>';
4921    jQuery('body').append(popUp);
4922    document.getElementById("srmp3_lyricsplaying_container").addEventListener("click", toggleLyrics);
4923    function toggleLyrics() {
4924      $('#srmp3_lyrics_container').toggle();
4925      $('#srmp3_lyrics_container').toggleClass("open");
4926    }
4927
4928    var scrollItem = $('#srmp3_lyrics_container .srmp3_lyrics')[0];
4929    var ps = new PerfectScrollbar(scrollItem, {
4930      wheelSpeed: 1,
4931      swipeEasing: true,
4932      wheelPropagation: false,
4933      minScrollbarLength: 20,
4934      suppressScrollX: true,
4935      maxScrollbarLength: 100,
4936    });
4937
4938    $('#srmp3_lyrics_container .srmp3_lyrics').on('scroll', function () {
4939      if (!srp_lyricsAreScrolling) {
4940        if ($('#srmp3_lyrics_container').hasClass('srp_lyric_unlock')) {
4941          const srmp_lyrics_pos = $('#srmp3_lyrics_container .srmp3_lyrics_read').offset().top - $('#srmp3_lyrics_container').offset().top
4942          if (srmp_lyrics_pos < $('#srmp3_lyrics_container').height() && srmp_lyrics_pos > 50) { // if element is visible after scrolling
4943            $('#srmp3_lyrics_container').removeClass('srp_lyric_unlock');
4944          }
4945        } else {
4946          $('#srmp3_lyrics_container').addClass('srp_lyric_unlock');
4947        }
4948      }
4949      srp_lyricsAreScrolling = false;
4950    });
4951    sr_lyric_loaded = true;
4952  }
4953  $(document).keydown(function (event) {
4954    if (event.keyCode == 27) {
4955      srp_toggleLyricsContainer();
4956    }
4957  });
4958  $('#srmp3_lyrics_container .sricon-close-circle').on('click', function () {
4959    srp_toggleLyricsContainer();
4960  })
4961}
4962var sr_lyric_loaded = false;
4963function sr_loadLyricsAjax(postid, track_pos) {
4964  $('.srmp3_lyrics_title').empty();
4965  $('.srmp3_lyrics_album').empty();
4966  $('.srmp3_lyrics').empty();
4967  $('.srmp3_lyrics').removeClass('srmp3_singning');
4968  $('.srmp3_lyrics_container').empty();
4969  $('#srmp3_lyricsplaying_container').empty();
4970
4971
4972  if (typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack] != 'undefined' && IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].has_lyric ||
4973    $($('.sr-playlist-item[data-post-id="' + postid + '"][data-track-pos="' + track_pos + '"]')[0]).attr('data-track-lyric')
4974  ) {
4975
4976    if (!$('#srmp3_lyricsplaying_container').length)
4977      sr_setLyricsPlayingContainer();
4978
4979    if (typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack] != 'undefined') {
4980      track_title = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].track_title;
4981      album = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].album_title;
4982    } else {
4983      track_title = document.querySelector('.sr-playlist-item[data-post-id="' + postid + '"][data-track-pos="' + track_pos + '"]').getAttribute('data-tracktitle');
4984      album = document.querySelector('.sr-playlist-item[data-post-id="' + postid + '"][data-track-pos="' + track_pos + '"]').getAttribute('data-albumtitle');
4985    }
4986
4987    jQuery('.srmp3_lyrics_album').replaceWith($('<div>', {
4988      class: 'srmp3_lyrics_album',
4989      text: album
4990    }).prependTo('#srmp3_lyrics_container'));
4991    jQuery('.srmp3_lyrics_title').replaceWith($('<div>', {
4992      class: 'srmp3_lyrics_title',
4993      text: track_title
4994    }).prependTo('#srmp3_lyrics_container'));
4995
4996
4997    var data = {
4998      'action': 'load_lyrics_ajax',
4999      'post-id': postid,
5000      'track-position': track_pos,
5001      'nonce': sonaar_music.ajax.ajax_nonce
5002    };
5003
5004    $.post(sonaar_music.ajax.ajax_url, data, function (response) {
5005      response = srp_convertTTMLTime(JSON.parse(response));
5006      $('.srmp3_lyrics').html($(response).html());
5007    })
5008
5009  }
5010}
5011
5012function srp_convertTTMLTime(ttml) {
5013  ttml = $('<div>' + ttml + '</div>');
5014  $(ttml).find('p[begin]').each(function () {
5015    var nodeTimeRaw_begin = $(this).attr('begin');
5016    var nodeTimeRaw_end = $(this).attr('end');
5017
5018     // Check if the time format is in seconds and convert to hh:mm:ss.mmm
5019     if (nodeTimeRaw_begin.includes('s')) {
5020      var seconds = parseFloat(nodeTimeRaw_begin.slice(0, -1));
5021      var time = new Date(seconds * 1000).toISOString().substr(11, 12);
5022      $(this).attr('begin', time);
5023      nodeTimeRaw_begin = time;
5024    }
5025    if (nodeTimeRaw_end.includes('s')) {
5026      var seconds = parseFloat(nodeTimeRaw_end.slice(0, -1));
5027      var time = new Date(seconds * 1000).toISOString().substr(11, 12);
5028      $(this).attr('end', time);
5029      nodeTimeRaw_end = time;
5030    }
5031
5032    
5033    var a = nodeTimeRaw_begin.split(':');
5034    var b = nodeTimeRaw_end.split(':');
5035    $(this).attr('begin', (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]));
5036    $(this).attr('end', (+b[0]) * 60 * 60 + (+b[1]) * 60 + (+b[2]));
5037  });
5038  return ttml;
5039}
5040
5041function sr_shuffleToggle(event = null, audioPlayer = $('.iron-audioplayer.sr_selected')) {
5042  let shuffleValue
5043  if (IRON.audioPlayer.stickyEnable) {
5044    if (IRON.sonaar.player.shuffle) {
5045      IRON.sonaar.player.shuffle = false;
5046    } else {
5047      IRON.sonaar.player.shuffle = true;
5048      IRON.sonaar.player.setRandomList();
5049    }
5050    if (IRON.sonaar.player.classes.continuousPlayer) {
5051      sr_setCookieSettings();
5052    }
5053    shuffleValue = IRON.sonaar.player.shuffle;
5054  } else {
5055    if (audioPlayer.shuffle) {
5056      audioPlayer.shuffle = false;
5057    } else {
5058      audioPlayer.shuffle = true;
5059    }
5060    shuffleValue = audioPlayer.shuffle;
5061  }
5062  audioPlayer.attr('data-shuffle', shuffleValue);
5063}
5064
5065function sr_setSpeedRate(event = null, audioPlayer = $('.iron-audioplayer.sr_selected'), $audio_el = null) {
5066  var rateSpeed = [0.5, 1, 1.2, 1.5, 2]; // default speed rate
5067  if(typeof sonaar_music.option.playback_speed != 'undefined'){
5068    rateSpeed = sonaar_music.option.playback_speed.split(',').map(function (item) {
5069      item = parseFloat(item, 10); // convert to number
5070        return item;
5071    });
5072    rateSpeed = rateSpeed.filter(function (el) {
5073      return !isNaN(el);  // filter out NaN
5074    });
5075    rateSpeed = rateSpeed.sort(); // sort
5076  }
5077  if (IRON.audioPlayer.stickyEnable) {
5078    var currentRateSpeed = IRON.sonaar.player.classes.speedRate;
5079  } else {
5080    var currentRateSpeed = audioPlayer.attr('data-speedrate');
5081  }
5082  if (currentRateSpeed == rateSpeed[rateSpeed.length - 1]) {
5083    currentRateSpeed = rateSpeed[0]
5084  } else {
5085    $.each(rateSpeed, function () {
5086      if (this > currentRateSpeed) {
5087        currentRateSpeed = this
5088        return false
5089      }
5090    })
5091  }
5092  if (IRON.audioPlayer.stickyEnable) {
5093    document.getElementById("sonaar-audio").playbackRate = currentRateSpeed;
5094    IRON.sonaar.player.classes.speedRate = currentRateSpeed;
5095  } else {
5096    sr_setAudioElementInstance().playbackRate = currentRateSpeed;
5097  }
5098  audioPlayer.attr('data-speedrate', currentRateSpeed);
5099  audioPlayer.find('.sr_speedRate div').html(currentRateSpeed + 'x');
5100}
5101
5102function sr_setVolume(value, audioPlayer = null, $audio_el = null) {
5103
5104  if (value == '') {
5105    return;
5106  }
5107  
5108  value = parseFloat(value);
5109
5110  if(value > 1){
5111    value = 1;
5112  }
5113  if(value < 0){
5114    value = 0;
5115  }
5116
5117  if (audioPlayer) {
5118    audioPlayer.attr('data-volume', value)
5119  }
5120  if (IRON.audioPlayer.stickyEnable) {
5121    IRON.sonaar.player.volume = value;
5122    sr_setCookieVolume();
5123  }
5124  if ( audioPlayer || IRON.audioPlayer.stickyEnable ){
5125    sr_setAudioElementInstance(audioPlayer).volume = value;
5126  }
5127}
5128
5129function sr_setMute(value, $audio_el = null) {
5130  sr_setAudioElementInstance().muted = value;
5131  
5132  if (IRON.audioPlayer.stickyEnable) {
5133    IRON.sonaar.player.mute = value;
5134    if (IRON.sonaar.player.classes.continuousPlayer) {
5135      sr_setCookieSettings();
5136    }
5137  }
5138}
5139
5140function sr_muteTrigger(event = null, audioPlayer = $('.iron-audioplayer.sr_selected'), $audio_el = null) {
5141  if($('.slider-container:hover').length)
5142    return;
5143
5144  if (IRON.audioPlayer.stickyEnable && IRON.sonaar.player.mute || !IRON.audioPlayer.stickyEnable && audioPlayer.attr('data-mute') == 'true') {
5145    sr_setMute(false, $audio_el);
5146    if (audioPlayer) {
5147      audioPlayer.attr('data-mute', 'false');
5148    }
5149  } else {
5150    sr_setMute(true, $audio_el);
5151    if (audioPlayer) {
5152      audioPlayer.attr('data-mute', 'true');
5153    }
5154  }
5155
5156}
5157
5158function sr_initSlider(el, audioPlayer = null, $audio_el = null) {
5159  el.slider({
5160    orientation: "vertical",
5161    range: "min",
5162    min: 0,
5163    max: 100,
5164    value: 100,
5165    slide: function (event, ui) {
5166      sr_setVolume(ui.value / 100, audioPlayer, $audio_el);
5167      sr_setMute(false, $audio_el);
5168    },
5169  });
5170}
5171
5172function srp_js_dynamic_style(audioPlayer) {
5173  /*Add margin bottom to the DIV"audio-track" related to the text-size. Reomove unwanted avsolut behavior on Mobile*/
5174  const newMarge = $(audioPlayer).find('.srp_tracklist-item-date').css('font-size');
5175  $(audioPlayer).find('.sr-playlist-item[data-show-date="1"] .audio-track').css('margin-bottom', newMarge);
5176}
5177
5178function sr_updateSlider(event = null, audioPlayer = $('#sonaar-player')) { //update Volume slider when the volume has been set to another slider(widget or sticky)
5179  let volume;
5180  if (IRON.audioPlayer.stickyEnable) {
5181    volume = IRON.sonaar.player.volume;
5182  } else {
5183    volume = (audioPlayer.attr('data-volume') == NaN) ? 100 : audioPlayer.attr('data-volume');
5184  }
5185  volume = Math.floor(volume * 100) + '%';
5186  audioPlayer.find('.ui-slider-range').height(volume);
5187  audioPlayer.find('.ui-slider-handle ').css('bottom', volume);
5188}
5189
5190function sr_setAudioElementInstance(audioPlayer = null) {
5191  if (IRON.audioPlayer.stickyEnable) {
5192    return document.getElementById("sonaar-audio");
5193  } else {
5194    if( !$('.sr_selected .player audio').length && audioPlayer !==null ){
5195      return audioPlayer.find('audio')[0];
5196    }else{
5197      return document.querySelector('.sr_selected .player audio');
5198    }
5199  }
5200}
5201
5202
5203/*Function call from the shortcode [sonaar_ts] (Time Stamp)*/
5204function sonaar_ts_shortcode(params) { //eq: params = "{ id:'19', time: '0:10'}" 
5205  //params list: "id", "widget_id", "trackid", "time", "ts_id", "play_icon"
5206
5207  const el = '#sonaar_ts-' + params.ts_id;
5208  let newSonaarTS_selected = true;
5209  srp_startingTime = params.time;
5210  if (typeof params.trackid == 'undefined') {
5211    params.trackid = 0;
5212  }
5213
5214  $('.srmp3_sonaar_ts_shortcode:not(#sonaar_ts-' + params.ts_id).removeClass('sr_selected audio-playing'); //clear all other sonaar_ts
5215
5216  if ($(el).hasClass('sr_selected')) {  // Add and remove "sr_selected" Class
5217    newSonaarTS_selected = false;
5218    if (params.play_icon == 'true' && $(el).hasClass('sr_selected')) {  // When PLAY icon is enable, Only skip to the time parameter on the first click
5219      delete params.time;
5220    }
5221  } else {
5222    $('.srmp3_sonaar_ts_shortcode ').removeClass('sr_selected');
5223    $(el).addClass('sr_selected');
5224    if (IRON.audioPlayer.stickyEnable) {
5225      IRON.sonaar.player.selectedTimeStamp = $(el);
5226    }
5227  }
5228
5229  if ($(el).hasClass('audio-playing')) { // Add and remove "audio-playing" Class
5230    $(el).removeClass('audio-playing');
5231  } else {
5232    $(el).addClass('audio-playing');
5233  }
5234
5235  if (params.play_icon == 'true') { // Special Behaviors with the PLAY/PAUSE Button
5236    if (IRON.audioPlayer.stickyEnable && !$(el).hasClass('audio-playing')) { // Sync with the sticky player
5237      IRON.sonaar.player.pause();
5238      return;
5239    }
5240    if (!IRON.audioPlayer.stickyEnable && typeof $(el).data('ts-sync') != 'undefined' && !newSonaarTS_selected) { // If Sync with a widget when sticky disable and it is a new selected sonaar_ts: toggle between play and pause
5241      IRON.players[$(el).data('ts-sync')].play();
5242      return;
5243    }
5244  }
5245
5246
5247  if (typeof params.id == 'undefined') { //if no playlist post ID is targeted
5248
5249    /* WIDGET PLAYER INTERACTION  */
5250    if (typeof IRON.players != 'undefined' && IRON.players.length > 0) {
5251
5252      /* Find the widget player linked to the sonaar_ts */
5253      let player = 0;
5254      if (typeof params.widget_id != 'undefined') { //if sonaar_ts has widget_id parameters
5255        let playerID;
5256        if ($('#' + params.widget_id + ' .iron-audioplayer').length) { //if widget_id is an CSS id from a parent (eq: custom css id from elementor https://d.pr/i/kybO21)
5257          playerID = $('#' + params.widget_id + ' .iron-audioplayer').data('id');
5258        }
5259        if ($('#' + params.widget_id + '.iron-audioplayer').length) { //if widget_id is an CSS id from the iron-audioplayer itself (this should not happen because its ID is always different(regenerated), but who knows...)
5260          playerID = $('#' + params.widget_id + '.iron-audioplayer').data('id');
5261        }
5262        if ($('[data-id="' + params.widget_id + '"] .iron-audioplayer').length) { //if widget_id is the data-id from a parent (eq: the default elementor widget ID)
5263          playerID = $('[data-id="' + params.widget_id + '"] .iron-audioplayer').data('id');
5264        }
5265        if ($('[data-id="' + params.widget_id + '"].iron-audioplayer').length) {//if widget_id is the data-id from  the iron-audioplayer itself (The id can be set through the sonaar_audioplayer shortcode "id" parameter. Eq:[sonaar_audioplayer id="player1"])
5266          playerID = $('[data-id="' + params.widget_id + '"].iron-audioplayer').data('id');
5267        }
5268
5269        $(IRON.players).each(function (index) { // looking for the audioplayer ID
5270          if (IRON.players[index].audioPlayer.data('id') == playerID) {
5271            player = index;
5272            return;
5273          }
5274        })
5275      } else {
5276        $(IRON.players).each(function (index) { // looking for the audioplayer before the shortcode
5277          if (IRON.players[index].audioPlayer.offset().top > $(el).offset().top) {
5278            return;
5279          }
5280          player = index;
5281        })
5282      }
5283
5284
5285      IRON.players[player].audioPlayer.data('ts-sync', params.ts_id); // mark the sonaar_ts id to the player widget
5286      $(el).data('ts-sync', player); // mark the player id to the sonaar_ts button
5287      const trackIsPlaying = IRON.players[player].audioPlayer.hasClass('audio-playing') && IRON.players[player].audioPlayer.find('.sr-playlist-item').eq(params.trackid).hasClass('current')
5288
5289
5290      /* WIDGET PLAYER Behavior: Play, Pause or seektime */
5291      if (!trackIsPlaying) { //if the track is not currently playing
5292        IRON.players[player].audioPlayer.find('.srp_audio_trigger').eq(params.trackid).trigger('click'); //Play from widget
5293      } else {
5294        srp_startingTime = 0;
5295      }
5296      if (
5297        !IRON.audioPlayer.stickyEnable ||
5298        (IRON.audioPlayer.stickyEnable && trackIsPlaying) || // Always seekTime when the track already playing and the sonaar_ts play/pause icon feature is disable 
5299        (!IRON.players[player].audioPlayer.find('.sr-playlist-item').eq(params.trackid).hasClass('current') && newSonaarTS_selected) //always seekTime when we click on a new sonaar_ts and we targeted a new track
5300      ) {
5301        IRON.players[player].seekTime(params.time);
5302      }
5303      return;
5304
5305    } else {
5306      /* If no widget and no ID has been set, play tracks from the current post. */
5307      params.id = srp_vars.sonaar_music.currentPostId;
5308    }
5309  }
5310  /* STICKY play playlist from POST ID*/
5311  IRON.sonaar.player.setPlayerAndPlay(params);
5312}
5313
5314
5315$(document.body).on('click', '.view-license-button', function (event) {
5316  sr_setPopUp();
5317  srp_wc_loadspinner($(event.target));
5318
5319  var data = {
5320    'action': 'load_license_preview_ajax',
5321    'variationId': event.currentTarget.getAttribute('data-variation-id'),
5322    'licenseId': event.currentTarget.getAttribute('data-license-id'),
5323    'productName': event.currentTarget.getAttribute('data-product-name'),
5324    'nonce': sonaar_music.ajax.ajax_nonce
5325  };
5326  $.post(sonaar_music.ajax.ajax_url, data, function (response) {
5327    $('#sonaar-modal .sr_popup-body').html(response);
5328    sr_openPopUp();
5329    srp_wc_unloadspinner($(event.target));
5330  })
5331});
5332
5333/*
5334*****************************************************
5335START OF SHARE POPUP
5336*****************************************************
5337*/
5338$(document).on('click', '.sr_store_force_share_bt', function () {
5339  const link = $(this).attr('href');
5340  let id = (typeof $(this).data('source-post-id') != 'undefined') ? $(this).data('source-post-id') : '';
5341  let track_title, image_src, track_pos, current_time;
5342  let reverse_post_tracklist = false;
5343  let post_track_count = null;
5344
5345  // Check if this is within sticky player
5346  if ($(this).closest('.player').length > 0) {
5347    track_title = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].track_title;
5348    image_src = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].poster;
5349    id = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].sourcePostID;
5350    track_pos = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].track_pos
5351    if (typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].reverse_post_tracklist !== 'undefined' && IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].reverse_post_tracklist === true && typeof IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].post_track_count !== 'undefined') {
5352      post_track_count = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].post_track_count;
5353      reverse_post_tracklist = true;
5354    }
5355  
5356  // if this is within the mini player
5357  } else if ($(this).parents('.album-player').length > 0) {
5358    const trackIndex = $(this).parents('.iron-audioplayer').attr('trackselected');
5359    const $track = $(this).parents('.iron-audioplayer').find('.sr-playlist-item').eq(trackIndex);
5360    track_pos = $track.data('track-pos');
5361    track_title = $track.find('.tracklist-item-title').text();
5362    image_src = $track.data('albumart');
5363    if (typeof $track.data('reverse') !== 'undefined' && $track.data('reverse') === true && typeof $track.data('post_track_count') !== 'undefined') {
5364      post_track_count = $track.data('post_track_count');
5365      reverse_post_tracklist = true;
5366    }
5367    
5368    
5369    
5370  // Or if this is within .sr-playlist-item-flex
5371  } else if ($(this).closest('.sr-playlist-item').length > 0) {
5372    track_pos = $(this).closest('.sr-playlist-item').data('track-pos');
5373    track_title = $(this).closest('.sr-playlist-item').find('.tracklist-item-title').text();
5374    image_src = $(this).closest('.sr-playlist-item').data('albumart');
5375    if (typeof $(this).closest('.sr-playlist-item').data('reverse') !== 'undefined' && $(this).closest('.sr-playlist-item').data('reverse') == true && typeof $(this).closest('.sr-playlist-item').data('post_track_count') !== 'undefined') {
5376      post_track_count = $(this).closest('.sr-playlist-item').data('post_track_count');
5377      reverse_post_tracklist = true;
5378    }
5379
5380    // Or within .srp_swiper-album-art
5381  } else if ($(this).closest('.srp_swiper-album-art').length > 0) {
5382    track_title = $(this).closest('.srp_swiper-album-art').find('.srp_swiper-track-title').text();
5383    // Extract the image url from the 'background-image' CSS property
5384    const backgroundImage = $(this).closest('.srp_swiper-album-art').css('background-image');
5385    image_src = backgroundImage.slice(4, -1).replace(/"/g, "");
5386  }
5387  current_time = (IRON.sonaar.player.currentTime != '' && typeof IRON.sonaar.player.currentTime != 'undefined') ? IRON.sonaar.player.currentTime : '00:00';
5388
5389  if( reverse_post_tracklist && post_track_count !== null ){
5390    track_pos = post_track_count - track_pos - 1;
5391  }
5392
5393  srp_share_popup(id, $(this), link, track_title, image_src, track_pos,current_time);
5394
5395  return false;
5396});
5397
5398function srp_share_popup(id, el, link, track_title, image_src, track_pos, current_time = '00:00') {
5399  track_pos = (typeof track_pos != 'undefined') ? track_pos + 1 : '';
5400  var separator = link.includes('?') ? '&' : '?';
5401  var link = (link + separator + 'ts_post_id=' + id + '&ts_track_num=' + track_pos).replace(/([^:]\/)\/+/g, "$1");
5402  link = link.replace('#!', ''); // remove #! from
5403
5404  sr_setPopUp();
5405  var data = {
5406    'action': 'load_share_by_ajax',
5407    'id': id,
5408    'link': link,
5409    'track_title': track_title,
5410    'image_src': image_src,
5411    'current_time': current_time,
5412    'nonce': sonaar_music.ajax.ajax_nonce
5413  };
5414  
5415  $.post(sonaar_music.ajax.ajax_url, data, function (response) {
5416   
5417    response = JSON.parse(response);
5418    $('#sonaar-modal .sr_popup-body').html(response);
5419    
5420    // add more button on mobile
5421    function isSmallDevice() {
5422      return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
5423    }
5424    $('.srp-share-mobile-more').hide();
5425    if (navigator.share && isSmallDevice()) {
5426      $('.srp-share-mobile-more').show();
5427      $(document).on('click', '.srp-share-mobile-more', function (e) {
5428        navigator.share({
5429          url: link
5430        })
5431        .then(() => console.log('Successful share'))
5432        .catch((error) => console.log('Error sharing', error));
5433      }); 
5434    }
5435
5436   
5437    $('.srp-modal-sticky-player--time').hide();
5438    sr_openPopUp();
5439
5440    var input = $('#myInput');
5441
5442    // Store the initial url value
5443    var initialUrl = input.val();
5444    const domain = window.location.hostname;
5445    if (sonaar_music.option.share_email_body.includes("{{website_domain}}")) {
5446        sonaar_music.option.share_email_body = sonaar_music.option.share_email_body.replace("{{website_domain}}", domain);
5447    }
5448    // Function to update the social media share links
5449    function updateShareLinks() {
5450      link = input.val();
5451      // Now update the share URLs for each of the social media buttons
5452      $('.fab.fa-facebook').attr('href', 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(input.val()));
5453      $('.fab.fa-twitter').attr('href', 'https://twitter.com/intent/tweet?url=' + encodeURIComponent(input.val()));
5454      $('.fab.fa-whatsapp').attr('href', 'https://api.whatsapp.com/send?text=' + encodeURIComponent(input.val()));
5455      
5456      var mailto_link = 'mailto:?subject=' + encodeURIComponent(sonaar_music.option.share_email_subject) + '&body=' + encodeURIComponent(sonaar_music.option.share_email_body) + '%0D%0A%0D%0A' + encodeURIComponent(input.val());
5457      $('.fas.fa-envelope').attr('href', mailto_link);
5458
5459      var sms_link = 'sms:?body=' + encodeURIComponent(sonaar_music.option.share_email_body) + '%0D%0A%0D%0A' + encodeURIComponent(input.val());
5460      $('.fas.fa-sms').attr('href', sms_link);
5461    }
5462
5463    // Add an event listener to the checkbox
5464    $('#stickyPlayerCheckbox').on('change', function () {
5465      if (this.checked) {
5466        $('.srp-modal-sticky-player--time').show();
5467        var separator = window.location.href.includes('?') ? '&' : '?';
5468        var updatedUrl = (window.location.href + separator + 'ts_post_id=' + id + '&ts_track_num=' + track_pos).replace(/([^:]\/)\/+/g, "$1");
5469        updatedUrl = updatedUrl.replace('#!', ''); // remove #! from the url
5470
5471        var url = new URL(updatedUrl);
5472
5473        if ($('#stickyPlayerTimeCheckbox').is(':checked')) {
5474            var newTime = $('#stickyPlayerCurrentTime').val();
5475            url.searchParams.set('ts_time', newTime);
5476        } else {
5477            url.searchParams.set('ts_time', '00:00');
5478        }
5479
5480        input.val(url.toString().replace(/%3A/g, ':'));
5481      } else {
5482          $('.srp-modal-sticky-player--time').hide();
5483          input.val(initialUrl);
5484      }
5485      
5486      updateShareLinks();
5487    });
5488     // Add an event listener to the checkbox
5489     // Add an event listener to the checkbox
5490     $('#stickyPlayerCurrentTime').on('keypress', function (e) {
5491      var key = String.fromCharCode(!e.charCode ? e.which : e.charCode);
5492      if (!/^[0-9:]$/.test(key)) {
5493          e.preventDefault();
5494      }
5495      }).on('input', function () {
5496          var input = $(this);
5497          var newTime = input.val();
5498      
5499          // Check if newTime contains only numbers and ":" character
5500          if (!/^[0-9:]*$/.test(newTime)) {
5501              // Invalid input, revert to previous value
5502              input.val(input.data('oldValue') || '');
5503              return;
5504          }
5505      
5506          // Update old value
5507          input.data('oldValue', newTime);
5508      
5509          // Get the current URL from the myInput field
5510          var url = new URL($('#myInput').val());
5511      
5512          // Check if the stickyPlayerTimeCheckbox is checked
5513          if ($('#stickyPlayerTimeCheckbox').is(':checked')) {
5514              // Set the new ts_time value
5515              url.searchParams.set('ts_time', newTime);
5516          } else {
5517              // If the checkbox is not checked, reset ts_time to 00:00
5518              url.searchParams.set('ts_time', '00:00');
5519          }
5520      
5521          // Update the myInput field with the new URL, and replace the encoded ":" character
5522          $('#myInput').val(url.toString().replace(/%3A/g, ':'));
5523          updateShareLinks();
5524      });
5525  
5526    $('#stickyPlayerTimeCheckbox').on('change', function () {
5527      var url = new URL($('#myInput').val());
5528  
5529      if ($(this).is(':checked')) {
5530          // Checkbox is checked, grab the current time and update the ts_time value
5531          var newTime = $('#stickyPlayerCurrentTime').val();
5532  
5533          // Check if newTime contains only numbers and ":" character
5534          if (/^[0-9:]*$/.test(newTime)) {
5535              url.searchParams.set('ts_time', newTime);
5536          }
5537      } else {
5538          // Checkbox is unchecked, reset ts_time to 00:00
5539          url.searchParams.set('ts_time', '00:00');
5540      }
5541  
5542      // Update the myInput field with the new URL, and replace the encoded ":" character
5543      $('#myInput').val(url.toString().replace(/%3A/g, ':'));
5544      updateShareLinks();
5545  });
5546
5547  })
5548 
5549}
5550
5551async function srp_share_popup_CopyToClipboard() {
5552  const copyText = document.getElementById('myInput');
5553  const copyButton = document.getElementById('copyButton'); // You'll need to add an ID to your Copy button for this to work
5554  copyTxt = (typeof sonaar_music.option.share_label_copy != 'undefined') ? sonaar_music.option.share_label_copy : 'Copy';
5555  copiedTxt = (typeof sonaar_music.option.share_label_copied != 'undefined') ? sonaar_music.option.share_label_copied 
5555: 'Copied';
5556  try {
5557      await navigator.clipboard.writeText(copyText.value);
5558      // Change button text
5559      copyButton.innerText = copiedTxt;
5560      // Reset button text back to 'Copy' after some time
5561      setTimeout(() => copyButton.innerText = copyTxt, 3000);
5562  } catch (err) {
5563      console.error('Failed to copy text to clipboard', err);
5564      copyButton.innerText = 'Failed to copy';
5565  }
5566}
5567
5568/*
5569*****************************************************
5570END OF SHARE POPUP
5571*****************************************************
5572*/
5573
5574// Ensure to include this outside the object if jQuery is required globally
5575IRON.favorites = {
5576  /*
5577  *****************************************************
5578  ADD TO FAVORITE
5579  *****************************************************
5580  */
5581  init: function() {
5582    $ = jQuery;
5583    var self = this;
5584
5585    if (srp_vars.is_logged_in === 'yes') {
5586      // If the user is logged in, fetch their playlists.
5587
5588      self.initRightClick();
5589
5590      IRON.favorites.dataType = 'user_meta';
5591      IRON.userPlaylists = sonaar_music.playlists || [];
5592      
5593      self.processPlaylists();
5594
5595    } else if(sonaar_music.option.enable_favorites_for_anonymous ==='true'){
5596      // If the user is not logged in, use cookies
5597
5598      self.initRightClick();
5599
5600      IRON.favorites.dataType = 'cookies';      
5601      IRON.userPlaylists = sonaar_music.playlists || [];
5602      
5603      $('.srp_player_is_favorite').parent('.iron_widget_radio').css('opacity', 0); // Hide the player until the cookie is loaded by ajax     
5604      $('.iron-audioplayer').each(function(index) {
5605        if($(this).hasClass('srp_player_is_favorite')){
5606            IRON.favorites.reloadPlayerAjax(this, index, true);
5607        }
5608      });
5609      self.processPlaylists();
5610      $(IRON.favorites.favoriteTracks).each(function() {
5611        $('[data-post-id="' + this.postId + '"][data-track-pos="' + this.trackPos+ '"] .srp-fav-bt i').addClass(sonaar_music.option.srp_fav_remove_icon).removeClass(sonaar_music.option.srp_fav_add_icon);
5612      });
5613    }
5614  },
5615
5616  processPlaylists: function() {
5617      IRON.favorites.favoritesEnabled = true;
5618      $('.srp_favorites_loading').removeClass('srp_favorites_loading');
5619      // Find 'Favorites' playlist
5620      for (var i = 0; i < IRON.userPlaylists.length; i++) {
5621          if (IRON.userPlaylists[i].playlistName === 'Favorites') {
5622              //console.log("you have a playlist named 'Favorites'",  IRON.userPlaylists[i].tracks);
5623              if (!IRON.userPlaylists[i].tracks) {
5624                IRON.userPlaylists[i].tracks = [];
5625              }
5626              IRON.favorites.favoriteTracks = IRON.userPlaylists[i].tracks;
5627              IRON.favorites.favoritePlaylistIndex = i;
5628              break;
5629          }
5630      }
5631      this.hideShowPlayer();
5632      if(IRON.audioPlayer.stickyEnable && IRON.sonaar.player.list.tracks){//Verify if the sticky player is enable and if the playlist is loaded
5633        this.setStickyFavButtons(); //reset the sticky player favorite buttons after the ajax call: Fix issue with the favorite button from the CONTINUOUS sticky player
5634      }
5635  },
5636
5637  reloadPlayerAjax: function(currentplayer, num = null, transition = false){
5638    // transition means that the player is being loaded in a popup and we want a smooth fade in
5639    if(transition && $('.elementor-editor-active').length)
5640    return;
5641
5642    var $currentplayer = $(currentplayer);
5643    var playerParent = $currentplayer.parent('.iron_widget_radio');
5644    if(num === null){ 
5645        num = 0;
5646        $('.iron-audioplayer').each(function(){
5647            if($(this).data('id')=== $currentplayer.data('id')){
5648                return;
5649            }
5650            num++;
5651        });
5652    }
5653
5654    var maxDuration = 4000; 
5655    var interval = 100; 
5656    var elapsedTime = 0;
5657    if(transition){
5658        playerParent.css({ 'opacity': 0, 'transition': 'opacity 0.15s ease' });
5659    }
5660    
5661    var intervalId = setInterval(function() { //Set interval to wait for the player to be loaded: required for player inside a popup
5662        var playerIndex = srp_convertPlayerIdToPlayerNum($currentplayer.data('id'));
5663        if (playerIndex !== null) {
5664            var playerId = IRON.players[playerIndex].audioPlayer.id.split('-');
5665            playerId = playerId[playerId.length - 1];
5666            var srp_fav_player_param_args = window['srp_player_params_args_' + playerId];
5667            var srp_fav_player_param = window['srp_player_params_' + playerId];
5668            var data = {
5669                'action': 'load_ajax_player',
5670                'nonce': sonaar_music.ajax.ajax_nonce,
5671                'args': srp_fav_player_param_args,
5672                'parameters': srp_fav_player_param,
5673            };
5674    
5675            $.post(sonaar_music.ajax.ajax_url, data, function (response) {
5676                var parsedResponse = $(response);
5677                var newDiv = parsedResponse.find('.iron-audioplayer.srp_player_is_favorite');
5678                $currentplayer.replaceWith(newDiv);
5679                
5680                var player = Object.create(IRON.audioPlayer);
5681                player.init($($('.iron-audioplayer')[num]));
5682                IRON.players[num] = player;
5683    
5684                if($('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').length === 0) {  // If no items left, show the "not found" message
5685                    $('.srp-fav-removeall-bt').hide();
5686                }else{
5687                    $('.srp-fav-removeall-bt').show();
5688                }
5689                if(transition){
5690                    playerParent.css('opacity',1);
5691                }
5692            }).fail(function() {
5693                console.log('An error occurred during the post operation.');
5694            });
5695
5696            clearInterval(intervalId);
5697        } else {
5698            if(transition){
5699                playerParent.css('opacity',1);
5700            }
5701            elapsedTime += interval;
5702            if (elapsedTime >= maxDuration) {
5703                clearInterval(intervalId);
5704            }
5705        }
5706    }, interval);
5707  },
5708
5709  removeTrackFromFavorites: function(postId, trackPos) {
5710    const existingIndex = IRON.favorites.favoriteTracks.findIndex(track => Number(track.postId) === Number(postId) && Number(track.trackPos) === Number(trackPos));
5711    if (existingIndex !== -1) {
5712        IRON.favorites.favoriteTracks.splice(existingIndex, 1);
5713    }
5714    
5715    const $favoritePlayer = $('.iron-audioplayer.srp_player_is_favorite');
5716    if($favoritePlayer.length > 0) {
5717      $favoritePlayer.find('.sr-playlist-item').each(function() {
5718        const $track = $(this);
5719        const trackData = $track.data();
5720        if(trackData.postId === parseInt(postId, 10) && trackData.trackPos === parseInt(trackPos,10)) {
5721          if($track.hasClass('current')) {
5722            IRON.sonaar.player.next();
5723          }
5724          $track.fadeOut(400, function() {
5725            if($track.parents('.iron-audioplayer').hasClass('sr_selectedPlayer') && IRON.audioPlayer.stickyEnable && typeof IRON.sonaar.player.list.tracks[$track.index()] != 'undefined') {
5726              IRON.sonaar.player.list.tracks.splice($track.index(), 1) //Remove track from playlist
5727              if($track.index() <= IRON.sonaar.player.currentTrack) {
5728                IRON.sonaar.player.classes.preventHandleTrackChange = true; //Prevent to reinit the currentrack
5729                IRON.sonaar.player.currentTrack--; //Reduce currentTrack index if the track is before the currentTrack
5730              }
5731            }
5732            $track.remove();
5733            IRON.favorites.hideShowPlayer();
5734          });
5735        }
5736      });
5737    }
5738  },  
5739
5740  clearFavoriteList: function(){
5741    IRON.favorites.favoriteTracks = []; // Clear the favoriteTracks array
5742    IRON.userPlaylists[IRON.favorites.favoritePlaylistIndex].tracks = [];
5743     // Clear the tracks from the 'Favorites' playlist
5744
5745    if( IRON.favorites.dataType === 'cookies' ){
5746      document.cookie = "sonaar_mp3_playlists=; path=/;"; // Update the cookie with the modified playlists
5747    }else{
5748      $.ajax({
5749        url: sonaar_music.ajax.ajax_url,  // WordPress AJAX URL
5750        type: 'POST',
5751        dataType: 'json',
5752        data: {
5753            action: 'update_user_playlist',  // PHP function name
5754            nonce: sonaar_music.ajax.ajax_nonce,
5755            playlists: IRON.userPlaylists  // Playlist data
5756        },
5757        success: function(response) {
5758            //console.log(response);
5759        }
5760      });
5761    }
5762    $('.iron-audioplayer:not(.srp_player_is_favorite) .' + sonaar_music.option.srp_fav_remove_icon).addClass(sonaar_music.option.srp_fav_add_icon).removeClass(sonaar_music.option.srp_fav_remove_icon);
5763    
5764    var delay = 200;
5765
5766    $('.iron-audioplayer.srp_player_is_favorite').each(function() {
5767        var favoriteList = $(this).find('.sr-playlist-item');
5768        favoriteList.each(function(index) {
5769            var track = this;
5770            setTimeout(function() {
5771                $(track).fadeOut(delay, function() {
5772                    $(track).remove();
5773                    if(index + 1 >= favoriteList.length){
5774                        IRON.favorites.hideShowPlayer();
5775                    }
5776                });
5777            }, index * delay);
5778        });
5779    });
5780  },
5781
5782  hideShowPlayer: function(){
5783    if($('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').length === 0) {
5784      // If no items left, show the "not found" message
5785      $('.srp-fav-removeall-bt').hide();
5786      $('.srp-fav-notfound').show();
5787      $('.iron-audioplayer.srp_player_is_favorite').hide();
5788    }else{
5789      $('.srp-fav-removeall-bt').show();
5790    }
5791  },
5792
5793  setStickyFavButtons: function(){
5794    if(!IRON.favorites.favoritesEnabled)
5795    return;
5796      
5797    var currentTrackIndex = IRON.sonaar.player.currentTrack;
5798
5799    $('#sonaar-player').data('trackPos', IRON.sonaar.player.list.tracks[currentTrackIndex].track_pos);
5800    $('#sonaar-player').data('postId', IRON.sonaar.player.list.tracks[currentTrackIndex].sourcePostID);
5801    
5802    var isFavorite = IRON.favorites.favoriteTracks.some(function(track) {
5803      return track.postId == IRON.sonaar.player.list.tracks[currentTrackIndex].sourcePostID && track.trackPos == IRON.sonaar.player.list.tracks[currentTrackIndex].track_pos;
5804    });
5805
5806    var favButtonIndex = -1;
5807    for (var i = 0; i < IRON.sonaar.player.albumStoreList.length; i++) {
5808      if (IRON.sonaar.player.albumStoreList[i]['cta-class'] === 'srp-fav-bt') {
5809        favButtonIndex = i;
5810        break; 
5811      }
5812    }
5813    if( favButtonIndex === -1 ) return;
5814
5815    // Depending on isFavorite, set the appropriate icon class
5816    if (isFavorite) {
5817      IRON.sonaar.player.albumStoreList[favButtonIndex]['store-icon'] = sonaar_music.option.srp_fav_remove_icon;
5818    } else {
5819      IRON.sonaar.player.albumStoreList[favButtonIndex]['store-icon'] = sonaar_music.option.srp_fav_add_icon;
5820    }
5821  },
5822
5823  clickStickyFavButton: function(favButtonIndex){
5824    if(!IRON.favorites.favoritesEnabled)
5825    return;
5826
5827    event.preventDefault();
5828
5829    const $sonaarPlayer = $('#sonaar-player');
5830    const postId = $sonaarPlayer.data('postId');
5831    const trackPos = $sonaarPlayer.data('trackPos');
5832    const action = IRON.sonaar.player.list.tracks[IRON.sonaar.player.currentTrack].optional_storelist_cta[favButtonIndex]['store-icon'] == sonaar_music.option.srp_fav_remove_icon ? 'remove' : 'add';
5833    this.addRemoveFavorite(postId, trackPos, action);
5834  },
5835
5836  addRemoveFavorite: function(postId, trackPos, action){ //action = 'add' or 'remove'
5837    if(typeof postId === 'undefined' || typeof trackPos === 'undefined' || typeof action === 'undefined')
5838      return;
5839
5840    if(IRON.audioPlayer.stickyEnable && $('#sonaar-player .srp-fav-bt').length){
5841      var favButtonIndex = -1;
5842      for (var i = 0; i < IRON.sonaar.player.albumStoreList.length; i++) {
5843        if (IRON.sonaar.player.albumStoreList[i]['cta-class'] === 'srp-fav-bt') {
5844          favButtonIndex = i;
5845          break; 
5846        }
5847      }
5848      
5849      //toggle Sticky favorite icon
5850      IRON.sonaar.player.albumStoreList[favButtonIndex]['store-icon'] = action === 'remove' ? sonaar_music.option.srp_fav_add_icon : sonaar_music.option.srp_fav_remove_icon;
5851      IRON.sonaar.player.albumStoreList[favButtonIndex]['store-name'] = action === 'remove' ? sonaar_music.option.fav_label_add_action : sonaar_music.option.fav_label_remove_action;
5852
5853    }
5854    //toggle widget favorite icon
5855    const selector = `.srp-fav-bt[data-source-post-id="${postId}"][data-store-id^="${trackPos}-"]  i`;
5856    const selectorParent = `[data-post-id="${postId}"][data-track-pos="${trackPos}"] .srp-fav-bt`;
5857    const addClass = action === 'remove' ? sonaar_music.option.srp_fav_add_icon : sonaar_music.option.srp_fav_remove_icon;
5858    const removeClass = action === 'remove' ? sonaar_music.option.srp_fav_remove_icon : sonaar_music.option.srp_fav_add_icon;
5859    const title = action === 'remove' ? sonaar_music.option.fav_label_add_action : sonaar_music.option.fav_label_remove_action;
5860
5861    $(selector).each(function() {
5862      if( ! $(this).parents('.srp_player_is_favorite').length){
5863        $(this).addClass(addClass).removeClass(removeClass);
5864        $(this).attr('title', title).attr('aria-label', title);
5865      }
5866    })
5867    
5868
5869    //Update favoriteList
5870    let existingIndex = -1;
5871    if(Array.isArray(IRON.favorites.favoriteTracks)) {
5872      existingIndex = IRON.favorites.favoriteTracks.findIndex(function(track) {
5873        return Number(track.postId) === Number(postId) && Number(track.trackPos) === Number(trackPos);
5874      });
5875    }
5876    if(existingIndex === -1) {
5877      // If track doesn't exist in favorites, add it
5878      IRON.favorites.favoriteTracks.push({
5879        postId: postId.toString(),
5880        trackPos: trackPos.toString()
5881    });
5882    } else {
5883        IRON.favorites.removeTrackFromFavorites(postId, trackPos);
5884    }
5885    // Set the updated favorites list as a cookie
5886    if(IRON.favorites.favoritePlaylistIndex !== -1) {
5887      IRON.userPlaylists[IRON.favorites.favoritePlaylistIndex].tracks = IRON.favorites.favoriteTracks;
5888    }
5889
5890    if( IRON.favorites.dataType === 'cookies' ){
5891      // Set the updated playlists as a cookie
5892      document.cookie = "sonaar_mp3_playlists=" + encodeURIComponent(JSON.stringify(IRON.userPlaylists)) + "; max-age=31536000; path=/;";
5893      IRON.favorites.showNotificationAndReloadPlayer(action);
5894    }else{
5895      $.ajax({
5896        url: sonaar_music.ajax.ajax_url,  // WordPress AJAX URL
5897        type: 'POST',
5898        dataType: 'json',
5899        data: {
5900            action: 'update_user_playlist',  // PHP function name
5901            nonce: sonaar_music.ajax.ajax_nonce,
5902            playlists: IRON.userPlaylists  // Playlist data
5903        },
5904        success: function(response) {
5905          //console.log(response);
5906          IRON.favorites.showNotificationAndReloadPlayer(action);
5907           
5908        }
5909      });
5910    }
5911    
5912  },
5913
5914  showNotificationAndReloadPlayer: function(action){
5915    // Create and append the notification div to the body
5916    $('<div>')
5917      .addClass('srp-fav-notification')
5918      .text(sonaar_music.option[`fav_label_${action}`])
5919      .appendTo('body')
5920      .animate({ bottom: '100px', opacity: 1 }, 500)
5921      .delay(3000)
5922      .animate({ bottom: '80px', opacity: 0 }, 500, function() {
5923          $(this).remove();
5924      });
5925
5926    if(action === "add") {
5927      $('.iron-audioplayer').each(function(index) {
5928          if($(this).hasClass('srp_player_is_favorite')){
5929              IRON.favorites.reloadPlayerAjax(this, index);
5930          }
5931      });
5932    }
5933  },
5934  setFavButtons: function(audioPlayer){
5935    if(srp_vars.is_logged_in === "no" && sonaar_music.option.cta_favorites_dv_enable_redirect_main_settings === "true"){
5936      return;
5937    }
5938
5939    const $audioPlayer = $(audioPlayer);
5940    const $favRemoveAllBtn = $('.srp-fav-removeall-bt');
5941  
5942    $favRemoveAllBtn.each(function(){
5943      const $this = $(this);
5944      if(!$this.data('ready')) { 
5945        $this.data('ready', true).on('click', IRON.favorites.clearFavoriteList);
5946      }
5947    });
5948
5949  
5950    if($audioPlayer.hasClass('srp_player_is_favorite')){
5951      $('.srp-fav-notfound').toggle(!$audioPlayer.find('.sr-playlist-item, .swiper-slide').length);
5952    }
5953  
5954    const $favBtn = $audioPlayer.find('.srp-fav-bt');
5955    if($favBtn.data('event') != 'click'){
5956      $favBtn.data('event', 'click'); 
5957      $audioPlayer.on('click', '.srp-fav-bt', function () { 
5958        event.preventDefault();
5959        const $this = $(this);
5960        if($this.parents('.srp_favorites_loading').length)
5961          return;
5962
5963        const postId =  $(this).attr('data-source-post-id');
5964        if($audioPlayer.hasClass('srp_player_is_favorite')){
5965          var trackPos = $(this).parents('.sr-playlist-item').data('track-pos');
5966        }else{
5967          var trackPos = $(this).attr('data-store-id').split('-')[0];
5968        }
5969        const action = $this.find('i').hasClass(sonaar_music.option.srp_fav_remove_icon) ? 'remove' : 'add';
5970        IRON.favorites.addRemoveFavorite(postId, trackPos, action);
5971      });
5972    }
5973  
5974    $audioPlayer.find('.srp-fav-notfound').each(function() {
5975      const $this = $(this);
5976      $this.text($this.data('label'));
5977    });
5978  },
5979  initRightClick: function(){
5980    if(sonaar_music.option.fav_enable_contextual_menu !== "true")
5981    return;
5982    
5983    var lastSelectedTrack = null;
5984
5985    var style = document.createElement('style');
5986    style.innerHTML = `
5987      #contextMenu {
5988        display: none;
5989        position: absolute;
5990        z-index: 1000;
5991        background: #343a40;
5992        border-radius: 5px;
5993        padding: 4px;
5994      }
5995      #contextMenu ul {
5996        padding-left: 0;
5997      }
5998      #deleteFromFavorite {
5999        color: #fff;
6000        border-radius: 5px;
6001        font-size: 14px;
6002        padding: 5px 10px;
6003        cursor: pointer;
6004        list-style: none;
6005      }
6006      #deleteFromFavorite:hover {
6007        background-color: #6c757d;
6008      }
6009    `;
6010    document.head.appendChild(style);
6011
6012    // Create context menu
6013    $('<div>', { id: 'contextMenu' })
6014      .append($('<ul>').append($('<li>
6014', { id: 'deleteFromFavorite', text: sonaar_music.option.fav_label_rightclick_remove })))
6015      .appendTo('body');
6016
6017
6018
6019    $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').css({
6020      '-webkit-user-select': 'none',  /* Safari 3.1+ */
6021      '-moz-user-select': 'none',     /* Firefox 2+ */
6022      '-ms-user-select': 'none',      /* IE 10+ */
6023      'user-select': 'none'           /* Standard syntax */
6024    });
6025
6026    $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').click(function(e) {
6027        if (e.shiftKey && lastSelectedTrack != null) {
6028            var start = $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').index(this);
6029            var end = $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').index(lastSelectedTrack);
6030            $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').slice(Math.min(start, end), Math.max(start, end) + 1)
6031                .addClass('selected')
6032                .css('background-color', '#ccc');
6033        } else if (e.ctrlKey || e.metaKey) {
6034            $(this).toggleClass('selected')
6035                .css('background-color', function(index, value) {
6036                    return $(this).hasClass('selected') ? '#ccc' : '';
6037                });
6038        } else {
6039            $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item').removeClass('selected')
6040                .css('background-color', '');
6041            $(this).addClass('selected')
6042                .css('background-color', '#ccc');
6043        }
6044
6045        lastSelectedTrack = $(this).hasClass('selected') ? this : null;
6046    }).contextmenu(function(e) {
6047      e.preventDefault();
6048        
6049      if ($(this).hasClass('selected')) {
6050          $('#contextMenu').css({
6051              display: 'block',
6052              left: e.pageX,
6053              top: e.pageY
6054          });
6055      }
6056  });
6057
6058  $(document).click(function() {
6059      $('#contextMenu').hide();
6060  });
6061
6062  $('#deleteFromFavorite').click(function() {
6063      $('.iron-audioplayer.srp_player_is_favorite .sr-playlist-item.selected').each(function() {
6064          var postId = $(this).data('post-id');
6065          var trackPos = $(this).data('track-pos');
6066          IRON.favorites.addRemoveFavorite(postId, trackPos, 'remove');
6067         //IRON.favorites.removeTrackFromFavorites(postId, trackPos);
6068          $(this).removeClass('selected')
6069              .css('background-color', '');
6070      });
6071
6072      lastSelectedTrack = null;
6073  });
6074
6075  },
6076}
6077
6078function srp_variation_button(el, productId) {
6079  
6080  // can be a variation lightbox or a make an offer button
6081  if( $(el).find('a').length){
6082    el = $(el).find('a')[0];
6083  }
6084  // Check if this is within .sr-playlist-item-flex or .srp_swiper-album-art
6085  if ($(el).closest('.sr-playlist-item').find('.sr_track_cover img').length > 0) {
6086    image_src = $(el).closest('.sr-playlist-item').find('.sr_track_cover img').attr('src');
6087  } else if ($(el).closest('.sr-playlist-item').find('img.sr_track_cover').length > 0) {
6088    image_src = $(el).closest('.sr-playlist-item').find('img.sr_track_cover').attr('src');
6089  } else if ($(el).closest('.srp_swiper-album-art').length > 0) {
6090    // Extract the image url from the 'background-image' CSS property
6091    const backgroundImage = $(el).closest('.srp_swiper-album-art').css('background-image');
6092    image_src = backgroundImage.slice(4, -1).replace(/"/g, "");
6093  } else if ($(el).closest('.srmp3-product').length > 0){
6094    image_src = $(el).closest('.srmp3-product').find('img').attr('src');
6095  } else if ($(el).closest('#sonaar-player').find('.album-art img').length > 0) {
6096    // Check within #sonaar-player for the image inside .album-art
6097    image_src = $(el).closest('#sonaar-player').find('.album-art img').attr('src');
6098  } else if ($(el).closest('.srp_player_boxed').find('.sonaar-Artwort-box').find('img').length > 0) {
6099    image_src = $(el).closest('.srp_player_boxed').find('.sonaar-Artwort-box').find('img').attr('src');
6100  } else {
6101    // Fallback.
6102    image_src = '';
6103  }
6104
6105  if(productId == undefined){
6106    productId = (typeof $(el).data('product_id') != 'undefined') ? $(el).data('product_id') : $(el).data('source-post-id');
6107  }else{
6108    productId = productId;
6109  }
6110  
6111  srp_wc_variation_popup(productId, $(el), image_src);
6112}
6113
6114function srp_wc_variation_popup(productId, el, image_src) {
6115  el = $(el);
6116  IRON.bt_that_launched_the_popup =  el;
6117  srp_wc_loadspinner(el);
6118  sr_setPopUp();
6119  // Determine the action based on whether the element has the .srp-make-offer-bt class
6120  var action = $(el).hasClass('srp-make-offer-bt') ? 'load_make_offer_lightbox' : 'load_wc_variation_by_ajax';
6121  var variation_id = $('.srp-modal-variant-selector.srp_selected').data('variant_id');
6122  if (!variation_id) {
6123    if ($(el).hasClass('srp-make-offer-bt')) {
6124      variation_id = $(el).data('variation');
6125    }
6126  }
6127
6128  var data = {
6129    'action': action,
6130    'image_src': image_src,
6131    'product-id': productId,
6132    'variation-id': variation_id,
6133    'nonce': sonaar_music.ajax.ajax_nonce
6134  };
6135  $.post(sonaar_music.ajax.ajax_url, data, function (response) {
6136    
6137
6138    // Ensure that the response is in the correct format and check for success
6139    if (response.success) {
6140      $('#sonaar-modal .sr_popup-body').html(response.data.html);
6141
6142      // Check if the image exists and add/remove the body class accordingly
6143      if (!response.data.has_image) {
6144        $('.sr_popup-body').addClass('srp_popup_no_image');
6145      } else {
6146        $('.sr_popup-body').removeClass('srp_popup_no_image');
6147      }
6148
6149      srp_makeOfferForm(productId, variation_id);
6150      sr_openPopUp();
6151      srp_wc_unloadspinner(el);
6152    }
6153  });
6154}
6155function srp_makeOfferForm(product_id, variation_id) {
6156  $('#make-offer-form').on('submit', function(e) {
6157      e.preventDefault(); // Prevent the default form submission
6158
6159      $('#srp-make-offer-error').hide().text('');
6160
6161      // Get the selected variation's ID from the dropdown
6162      var selected_variation_id = $('#offer-variation').val();
6163      // Fallback: If no variation is selected, use the one provided in the function (variation_id)
6164      variation_id = selected_variation_id ? selected_variation_id : variation_id;
6165
6166      // Serialize the form data
6167      var formData = $(this).serialize();
6168
6169      // Add the action and nonce to the serialized form data
6170      formData += '&action=send_offer_to_admin';
6171      formData += '&nonce=' + sonaar_music.ajax.ajax_nonce;
6172      formData += '&product_id=' + product_id; // Add product_id to form data
6173      formData += '&variation_id=' + variation_id;
6174
6175      // Send the AJAX request
6176      $.post(sonaar_music.ajax.ajax_url, formData, function(response) {
6177          if (response.success) {
6178              $('#make-offer-form')[0].reset(); // Reset the form
6179              sr_closePopUp();
6180
6181              // Use the server-provided formatted notice
6182              var formatted_content = response.data.formatted_notice;
6183              $('#sonaar-modal .sr_popup-body').html(formatted_content);
6184              sr_openPopUp();
6185              
6186          } else {
6187            $('#srp-make-offer-error').text(response.data).css('color', 'red').show(); // Display error message from server
6188          }
6189      });
6190  });
6191}
6192
6193
6194
6195
6196function srp_askForEmailForm(post_id, track_pos, track_id, data_audio_path, scenario = null, playerID = 'allPlayers', element, trackIdToSave = null) {
6197  $('#ask-for-email-form').on('submit', function(e) {
6198      e.preventDefault(); // Prevent the default form submission
6199      //console.log("Form submitted, preparing AJAX request...");
6200
6201      $('#srp-dialog-error').hide().text('');
6202
6203      var form_title = (typeof sonaar_music.option.download_settings_afe_form_title !== 'undefined') ? sonaar_music.option.download_settings_afe_form_title : 'Free Download';
6204
6205      // Serialize the form data
6206      var formData = $(this).serialize();
6207
6208      // Add the action and nonce to the serialized form data
6209      formData += '&action=srp_ask_for_email_sender';
6210      formData += '&nonce=' + sonaar_music.ajax.ajax_nonce;
6211      formData += '&post_id=' + post_id; // Add product_id to form data
6212      formData += '&track_pos=' + track_pos;
6213      formData += '&track_id=' + track_id;
6214      formData += '&data_audio_path=' + data_audio_path;
6215
6216      // If a scenario is provided, add the scenario ID to the data
6217      if (scenario) {
6218        formData += '&scenario_id=' + scenario.id;
6219
6220        if(scenario.action_when.downloadButtonClicked){
6221          formData += '&scenario_action=download';
6222        }else{
6223          formData += '&scenario_action=play';
6224        }
6225      }
6226
6227      //console.log("Form Data being sent:", formData);
6228
6229      // Send the AJAX request
6230      $.post(sonaar_music.ajax.ajax_url, formData, function(response) {
6231          //console.log("AJAX response received:", response);
6232
6233          if (response.success) {
6234              //console.log("Form submission successful:", response.data);
6235              $('#ask-for-email-form')[0].reset(); // Reset the form
6236              sr_closePopUp();
6237
6238              // Use the server-provided formatted notice
6239              var formatted_content = response.data.formatted_notice;
6240              $('#sonaar-modal .sr_popup-body').html(formatted_content);
6241              sr_openPopUp();
6242              
6243              if (typeof IRON.advancedTriggers !== 'undefined') {
6244                IRON.advancedTriggers.markTrackAsActioned(scenario, playerID, `track_${trackIdToSave}`, 'popup');
6245              }
6246              // Update the element's href attribute with the provided download link
6247              if (response.data.download_link) {
6248                if (IRON.advancedTriggers) {
6249                  const player = $(element).closest('.iron-audioplayer');
6250                  const targetPlayer = player.length ? player[0] : IRON.audioPlayer.activePlayer?.[0];
6251              
6252                  if (targetPlayer) {
6253                      IRON.advancedTriggers.attachDownloadButtonListener(targetPlayer, scenario, true);
6254              
6255                      if (!player.length) {
6256                          $('#sonaar-player')
6257                              .find('.sr_store_force_dl_bt')
6258                              .attr('href', response.data.download_link);
6259                      }
6260                  }
6261              }
6262                //check if element has class sr_store_force_dl_bt
6263               /* if($(element).hasClass('sr_store_force_dl_bt')){
6264                  $(element).attr('href', response.data.download_link); // WIP: if Element is from widget, it wont get added to sticky player or vice versa.
6265                }else{
6266                  $(element).find('.sr_store_force_dl_bt').attr('href', response.data.download_link);
6267                }
6268
6269                //check if sticky player is present on the page
6270                if($('#sonaar-player').length){
6271                  $('#sonaar-player').find('.sr_store_force_dl_bt').attr('href', response.data.download_link);
6272                }
6273
6274                //check if closest has class sr_store_force_dl_bt
6275                if($(element).closest('#sonaar-player').length){
6276                  $(element).attr('href', response.data.download_link);
6277                  //check its active player widget
6278                  if(IRON.audioPlayer.activePlayer){
6279                    $(IRON.audioPlayer.activePlayer).find('li.current .sr_store_force_dl_bt').attr('href', response.data.download_link);
6280                  }
6281                }*/
6282              }
6283               
6284              if(srp_isPausedFromPopup && IRON.audioPlayer.activePlayer){
6285                // In some cases, the audio has been paused from the popup, we need to play it again to gain access
6286                const audioElement = sr_setAudioElementInstance(IRON.audioPlayer.activePlayer);
6287                audioElement.muted = false;
6288                srp_isPausedFromPopup = false;
6289                audioElement.play();
6290              }
6291
6292          } else {
6293            console.error("Error in response:", response.data);
6294            $('#srp-dialog-error').text(response.data).show(); // Display error message from server
6295          }
6296      }).fail(function() {
6297        console.error("AJAX request failed.");
6298        var formatted_content = '<h3 style="font-size:18px;font-weight:600;">' + form_title + '</h3><p style="color: var(--srp-global-modal-btn-bg-color);">Failed to send. Please contact support with code 91053</p>';
6299        $('#sonaar-modal .sr_popup-body').html(formatted_content);
6300        sr_openPopUp();
6301      }).always(function() {
6302        //console.log("AJAX request completed.");
6303      });
6304  });
6305}
6306
6307
6308function srp_add_to_cart_loadspinner(el) { //Add spinner animation from sonaar on the Add to Cart button from the variation modal.
6309  srp_wc_loadspinner(el);
6310  setInterval(function () {
6311    if (!el.hasClass('loading')) {
6312      clearInterval();
6313      srp_wc_unloadspinner(el);
6314    }
6315  }, 5);
6316}
6317
6318function srp_wc_loadspinner(el) {
6319  
6320  if (el.closest('#sonaar-player .track-store').length > 0 || el.parents('.srp_ext_featured_cta').length  || el.parents('.srp_ext_cta').length) { // Button is in the sticky player
6321    el = el.closest('a'); // Replace el with the <a> element or its closest ancestor <a>
6322
6323    el.parent().addClass('sricon-spinner');
6324    el.parent().css({
6325      width: el.parent().css("width"),
6326      fontSize: '16px',
6327      textAlign: 'center',
6328    });
6329    el.css({
6330      display: "none",
6331    });
6332    return;
6333  }
6334  var trigger_html = el.html();
6335  var computedStyles = window.getComputedStyle(el.get(0));
6336
6337  var trigger_bgcolor = computedStyles.backgroundColor;
6338  var trigger_color = computedStyles.color;
6339  var trigger_width = computedStyles.width;
6340  var trigger_height = computedStyles.height;
6341  el.data('html', trigger_html);
6342  el.css("pointer-events", "none");
6343  el.css({
6344    backgroundColor: trigger_bgcolor,
6345    color: trigger_color,
6346    width: trigger_width,
6347    height: trigger_height
6348  });
6349  if (el.attr('class') === 'sricon-info') {
6350    el.data('class', el.attr('class'));
6351    el.removeClass('sricon-info');
6352  }
6353  $spinnerWrap = $('<span class="sricon-spinner-wrap"></span>');
6354  $spinner = $('<span class="sricon-spinner"></span>');
6355  $spinnerWrap.html($spinner);
6356  el.html($spinnerWrap);
6357
6358  startButtonLoaderTimeout = setTimeout(function () {
6359    $spinnerWrap.addClass('sricon-spinner-wrap-ready');
6360  }, 5);
6361}
6362function srp_wc_unloadspinner(el) {
6363  if (el.closest('#sonaar-player .track-store').length > 0 || el.parents('.srp_ext_featured_cta').length || el.parents('.srp_ext_cta').length ) { // Button is in the sticky player
6364    el = el.closest('a'); // Replace el with the <a> element or its closest ancestor <a>
6365    el.parent().removeClass('sricon-spinner');
6366    el.parent().css({
6367      width: "initial",
6368      fontSize: 'initial',
6369      textAlign: 'initial',
6370    });
6371    el.css("display", "");
6372    return;
6373  }
6374
6375  if (el.data('class') === 'sricon-info') {
6376    el.addClass(el.data('class'));
6377  }
6378
6379  el.html(el.data('html'));
6380  var resetStyles = {
6381    backgroundColor: '',
6382    color: '',
6383    width: '',
6384    height: ''
6385  };
6386  el.css("pointer-events", "auto");
6387  el.css(resetStyles);
6388};
6389function srp_selectVariation(el) {
6390    $('.srp-modal-product-variation .srp_selected').removeClass('srp_selected');
6391    $(el).addClass('srp_selected');
6392    $('.srp-modal-variation-details[data-variant_id="' + $(el).data('variant_id') + '"]').addClass('srp_selected');
6393
6394    // Display Price from the selected variation
6395    $('.srp-modal-variant-main .srp-modal-variant-price .woocommerce-Price-amount').html($(el).find('.srp-modal-variant-price>.woocommerce-Price-amount').html());
6396
6397    // Set the selected variation URL to the "Add to cart" button
6398    var variationId = $(el).data('variant_id');
6399    var productId = $('.srp-modal-product-variation').data('product_id');
6400    $('#srp-add-to-cart-btn').attr('href', '?add-to-cart=' + productId + '&variation_id=' + variationId);
6401    $('#srp-add-to-cart-btn').attr('data-product_id', variationId);
6402
6403    // Toggle between "Make an Offer" button and "Add to Cart" button
6404    var makeOfferEnabled = $(el).data('make_offer_enabled');
6405    var hideAddToCart = $(el).data('make_offer_hide_addtocart');
6406    if (makeOfferEnabled === 'yes' && hideAddToCart === 'yes') {
6407        $('.srp-modal-product-variation #srp-add-to-cart-btn').hide(); // Hide Add to Cart button
6408        $('.srp-modal-product-variation #make-offer-btn').show(); // Show Make an Offer button
6409        $('.srp-modal-product-variation #srp-total-price').hide(); // Hide the total price
6410    } else if (makeOfferEnabled === 'yes' && hideAddToCart !== 'yes') {
6411        $('.srp-modal-product-variation #srp-add-to-cart-btn').show(); // Show Add to Cart button
6412        $('.srp-modal-product-variation #make-offer-btn').show(); // Show Make an Offer button
6413        $('.srp-modal-product-variation #srp-total-price').show(); // Show the total price
6414    } else {
6415        $('.srp-modal-product-variation #make-offer-btn').hide(); // Hide Make an Offer button
6416        $('.srp-modal-product-variation #srp-add-to-cart-btn').show(); // Show Add to Cart button
6417        $('.srp-modal-product-variation #srp-total-price').show(); // Show the total price
6418    }
6419  }
6420
6421
6422
6423
6424function srp_setTrackListColumns(player, fromResize = false){
6425  if( !$(player).hasClass('srp_has_customfields') || $(player).hasClass('srp_tracklist_grid'))
6426    return
6427
6428  if($(player).find('.playlist').width() < 500 && ! $(player).hasClass('srp_responsive') ){
6429    $(player).addClass('srp_responsive');
6430    $(player).find('.sr-playlist-item').each(function () {
6431      setColumnCta(this)
6432    }) 
6433  }else if( $(player).find('.playlist').width() >= 500 && $(player).hasClass('srp_responsive') ){
6434    $(player).removeClass('srp_responsive'); 
6435    $(player).find('.sr-playlist-item').each(function () {
6436      setColumnCta(this)
6437    })  
6438  }
6439
6440  const gabBetweenItem = 10; //Flex Gab value
6441  let responsiveHiddenSection = [];
6442
6443  const track = $(player).find('.sr-playlist-item:not([data-relatedtrack="1"])').eq(0);
6444  const ifSoundwaveWidthNotSet = Boolean(track.find('.srp_soundwave_wrapper').length && track.find('.srp_soundwave_wrapper').css('flex-basis') == '100%');
6445  var playlistItemElementsWidth = 0;
6446  if(!fromResize){
6447    /*Insert Spacer if doesnt have info button*/
6448    const noteButtonWidth = ($(player).find('.sr-playlist-item:not([data-relatedtrack="1"]) .srp_noteButton').length)? $(player).find('.sr-playlist-item:not([data-relatedtrack="1"]) .srp_noteButton').width() : 0;
6449    $(player).find('.srp_info_spacer').remove();
6450    $(player).find('.sr-playlist-item:not([data-relatedtrack="1"])').each(function(){
6451      if(noteButtonWidth && ! $(this).find('.srp_noteButton').length){
6452        let spacer = $('<div/>', { class: 'srp_info_spacer' }).css('min-width', noteButtonWidth);
6453        $(this).find('.store-list').after(spacer);
6454      }
6455    });
6456    
6457
6458    track.find('.audio-track > *').each(function () { 
6459
6460      playlistItemElementsWidth += this.getBoundingClientRect().width
6461    });
6462    if(track.find('.sr_track_cover').length){
6463      playlistItemElementsWidth += track.find('.sr_track_cover').width() - 12;//12px gap
6464    }
6465    if(track.find('.store-list').length){
6466      playlistItemElementsWidth += track.find('.store-list').width() - 12;//12px gap
6467    }
6468    $(player).data('playlistItemElementsWidth' , playlistItemElementsWidth);
6469  }else if(typeof $(player).data('playlistItemElementsWidth') != 'undefined' && ! ifSoundwaveWidthNotSet){
6470    playlistItemElementsWidth = $(player).data('playlistItemElementsWidth');
6471  }
6472  
6473  if(playlistItemElementsWidth !== 0 && $(player).find('.srp_soundwave_wrapper').length){
6474    if( typeof track.data('track-width') == 'undefined'){
6475      columnTotalWidth = track.width() - playlistItemElementsWidth;
6476      track.data('track-width', columnTotalWidth)
6477    }else{
6478      columnTotalWidth = track.data('track-width');     
6479    }
6480    $(player).find('.sr-playlist-cf-container').css('flex', '0 1 ' + columnTotalWidth + 'px');///When soundwave width is set, the CF column container width is based on the available space.
6481  }
6482  
6483  var biggestColumnContainer = 0
6484  track.find('.sr-playlist-cf-child').each(function(index){
6485    const sectionClass = $(this).data('id');
6486    let cfWidth = 0;
6487    for (let i = index; i < track.find('.sr-playlist-cf-child').length; i++) {
6488      let ii = track.find('.sr-playlist-cf-child').length - i -1;
6489      if( track.find('.sr-playlist-cf-child').eq(ii).attr('data-width')){
6490        cfWidth += parseInt(track.find('.sr-playlist-cf-child').eq(ii).attr('data-width'), 10) + gabBetweenItem;
6491      }else{
6492        track.find('.sr-playlist-cf-child').eq(ii).attr('data-width', track.find('.sr-playlist-cf-child').eq(ii).width() )
6493        cfWidth += track.find('.sr-playlist-cf-child').eq(ii).width() + gabBetweenItem;
6494      }
6495      if(ifSoundwaveWidthNotSet && i == track.find('.sr-playlist-cf-child').length - 1 && cfWidth > biggestColumnContainer){
6496        biggestColumnContainer = cfWidth;
6497        $(player).find('.sr-playlist-cf-container').css('flex', '0 1 ' + cfWidth + 'px') //When no soundwave width is set (100% by default), set the width of the columns container based on its requirements.
6498      }
6499    }
6500    if( track.find('.sr-playlist-cf-container').width() < cfWidth ){ //If no enough space for the custom heading
6501      responsiveHiddenSection.push(sectionClass);
6502    }
6503    
6504  });
6505
6506  responsiveHiddenSection = responsiveHiddenSection.filter(function(item, pos) { // Remove duplicated item from array
6507    return responsiveHiddenSection.indexOf(item) == pos;
6508  })
6509
6510  $(player).find('.sr-cf-heading .sr-playlist-heading-child').each(function(){
6511    const sectionClass = $(this).data('sort');
6512    
6513    if( $(this).index() > $(player).find('.sr-cf-heading .sr-playlist-heading-child').length - responsiveHiddenSection.length ){
6514      $(this).addClass('srp_hidden');
6515      $(player).find('.'+sectionClass).addClass('srp_hidden');
6516      srp_setTrackListColumns_headerPosition(player);
6517    }else{
6518      $(this).removeClass('srp_hidden');
6519      $(player).find('.'+sectionClass).removeClass('srp_hidden');
6520    }
6521  });
6522
6523  /*Set Header Custom field Position*/
6524  srp_setTrackListColumns_headerPosition(player);
6525}
6526
6527function setColumnCta(trackListItem) {
6528  if( !$(trackListItem).find('.store-list').length || $(trackListItem).parents('.srp_tracklist_grid').length )
6529    return;
6530  
6531  const storeListCurrentWidth = parseInt($(trackListItem).find('.store-list').css('flex').split(' ')[2], 10);
6532  const storeList = $(trackListItem).find('.store-list');
6533  let storeListWidth = 0;
6534  const dataWidth = ($(trackListItem).parents('.srp_responsive').length)? 'mobile-width' : 'width'; 
6535  if( typeof storeList.find('.song-store-list-menu').data( dataWidth ) == 'undefined' || $('.elementor-editor-active').length ){ 
6536    let storeListMinusWidth = 0;
6537    let extendable = false;
6538    let dotsPosition = 'right: 10px;'
6539    $(trackListItem).find('.song-store:not(.srp_hidden)').each(function () {
6540      if( $(this).offset().left < storeList.offset().left ){
6541        extendable = true;
6542      }else if( storeListMinusWidth == 0 && extendable){
6543        storeListMinusWidth = $(this).offset().left - storeList.offset().left 
6544        storeListWidth = Math.ceil(storeListCurrentWidth - storeListMinusWidth);
6545        dotsPosition = 'left:'+ ( storeListMinusWidth - 25 ) + 'px;'
6546      }
6547    })
6548    if( extendable ){
6549      $(trackListItem).addClass('srp_extendable');
6550      storeList.find('.song-store-list-menu').width( storeListWidth );
6551      storeList.find('.song-store-list-menu').data( dataWidth, storeListWidth + '');
6552      const dots = $('<i/>', { class: 'fas fa-ellipsis-h srp_ellipsis', style: 'position: absolute; ' + dotsPosition  });
6553      if(storeList.find('.srp_ellipsis').length){
6554        storeList.find('.srp_ellipsis').replaceWith(dots);
6555      }else{
6556        storeList.append(dots);
6557      }
6558    }else{
6559      storeList.find('.song-store-list-menu').data( dataWidth, 'none' )
6560    }
6561  }else{
6562    if( storeList.find('.song-store-list-menu').data( dataWidth ) == 'none' ){
6563      $(trackListItem).removeClass('srp_extendable');
6564      storeList.find('.song-store-list-menu').width( 'inherit' );
6565    }else{
6566      $(trackListItem).addClass('srp_extendable');
6567      storeListWidth = parseInt(storeList.find('.song-store-list-menu').data( dataWidth ), 10);
6568      dotsPosition = (storeListWidth == 0 )? (storeListWidth + 10) + 'px' : (storeListWidth + 10) + 'px';
6569      storeList.find('.song-store-list-menu').width( storeListWidth );
6570      storeList.find('.srp_ellipsis').css({'left':'unset','right': dotsPosition })
6571    }
6572  }
6573}
6574
6575function srp_setTrackListColumns_headerPosition(player){
6576  /*Set Header Custom field Position*/
6577  setTimeout(function(){
6578    $(player).find('.sr-playlist-item:not([data-relatedtrack="1"])').each(function(){
6579      $(this).find('.sr-playlist-cf-child').each(function(){
6580        const sectionClass = $(this).data('id');
6581        const sectionPosition = $(this)[0].offsetLeft;
6582        const sectionWidth = $(this).width();
6583        const elIndex = $(this).parents('.sr-playlist-cf-container').find('.'+sectionClass).index(this);//Use elIndex to select the right heading when many columns have the same data-id.
6584        $(player).find('[data-sort="'+ sectionClass +'"]').eq(elIndex).css({'position':'absolute','left': sectionPosition+'px', 'width': sectionWidth + 'px'});
6585      });
6586     });
6587  }, 60);//Requried a delai when we have many CTA
6588}
6589
6590
6591
6592/*------------------------------
6593Search & filter Parameters
6594------------------------------*/
6595function srp_getPlayerId(player){
6596    if( $(player).parents('.elementor-widget-music-player').length && typeof $(player).parents('.elementor-widget-music-player').attr('id') != 'undefined'){ //if mp3 player has id from elementor 
6597      playerId = ( $(player).parents('.elementor-widget-music-player').attr('id') )
6598    }else if( ! $(player).parents('.iron_widget_radio').attr('id').startsWith('arbitrary-instance-') ){ //if mp3 player has id from shortcode parameter 
6599      playerId = $(player).parents('.iron_widget_radio').attr('id');
6600    }else{
6601      playerId = $(player).parents('.iron-audioplayer').attr('id');
6602    }
6603    if(typeof playerId == 'undefined'){
6604      playerId = player.id;
6605    }
6606    return playerId;
6607  
6608}
6609function srp_scrollTo(player, offset){
6610  var element = player[0].querySelector('.playlist');
6611  var rect = element.getBoundingClientRect();
6612  var viewportTopPosition = rect.top;
6613  window.scroll({
6614      top: window.scrollY + viewportTopPosition - offset,
6615      left: 0,
6616      behavior: 'smooth'
6617  });
6618}
6619function srp_updatePage(pageNumber, player){
6620
6621  if(player.pagination_offset >= 0){
6622    srp_scrollTo(player, player.pagination_offset);
6623  }
6624
6625
6626  player.params.page = pageNumber;
6627  srp_updateURLParameter( 'srp_player_id', srp_getPlayerId(player) );
6628  srp_updateURLParameter('srp_page', pageNumber);
6629}
6630function srp_updateOrder(sortValue, player){
6631  player.params.order = sortValue;
6632  srp_updateURLParameter( 'srp_player_id', srp_getPlayerId(player) );
6633  srp_updateURLParameter('srp_order', sortValue);
6634}
6635//Add parameter to the URL
6636function srp_updateURLParameter(param, paramVal = null){
6637  if(paramVal === null)
6638   return
6639
6640  const url = window.location.href;
6641  let newAdditionalURL = '';
6642  let tempArray = url.split('?');
6643  const baseURL = tempArray[0];
6644  const additionalURL = (typeof tempArray[1] != 'undefined')? tempArray[1] : '';
6645  let temp = '';
6646  if (additionalURL != '') {
6647      tempArray = additionalURL.split('&');
6648      for (var i=0; i<tempArray.length; i++){
6649          if(tempArray[i].split('=')[0] != param){
6650              newAdditionalURL += temp + tempArray[i];
6651              temp = '&';
6652          }
6653      }
6654  }
6655  const newParam =  (paramVal != '')? encodeURIComponent(param) + '=' + encodeURIComponent(paramVal) : '';
6656  const rows_txt = temp + '' + newParam;
6657  newAdditionalURL += rows_txt;
6658  newAdditionalURL = (newAdditionalURL != '')? '?' + newAdditionalURL : '';
6659  if( newAdditionalURL.charAt(0) == '&'){
6660    newAdditionalURL = newAdditionalURL.substring(1);
6661  }
6662  if( newAdditionalURL.charAt(newAdditionalURL.length - 1) == '&'){
6663    newAdditionalURL = newAdditionalURL.slice(0, -1)
6664  }
6665  if( newAdditionalURL.replace('?','') != additionalURL){
6666      window.history.pushState(null, '', baseURL + newAdditionalURL )
6667  }
6668}
6669
6670function srp_removeMeta(metaName, metaValue = null, playerId, selecttype = 'singleselect') {
6671  if (selecttype == 'multiselect_or') {
6672      metaName = metaName + '_or';
6673  }
6674  if (selecttype == 'range') {
6675      metaName = metaName + '_minmax';
6676  }
6677  const playerNum = srp_convertPlayerIdToPlayerNum(playerId) !== null ? srp_convertPlayerIdToPlayerNum(playerId) : 0;
6678
6679  if (typeof IRON.players[playerNum].audioPlayer.params === 'undefined') {
6680      return;
6681  }
6682
6683  const clearSearch = () => {
6684      const searchBoxSelector = playerId != null ? `.srp_search_container[data-player-id="${playerId}"]` : '.srp_search_container:not([data-player-id])';
6685      $(searchBoxSelector).find('.srp_reset_search').css('display', 'none');
6686      $(searchBoxSelector).each(function() {
6687          $(this).find('.srp_search')[0].value = '';
6688      });
6689      IRON.players[playerNum].audioPlayer.params.search = '';
6690  };
6691
6692  const clearMetaFilter = (key) => {
6693      if(typeof IRON.players[playerNum].audioPlayer.params.meta != 'undefined'){
6694        IRON.players[playerNum].audioPlayer.params.meta[key] = '';
6695      }
6696      key = key.replace('_or', '');
6697      const activeButtons = $(document).find(`.srp_filter_button.srp_filter_button--active[data-metakey="${key}"]`);
6698      activeButtons.removeClass('srp_filter_button--active').removeAttr('style');
6699  };
6700
6701  if (metaName === 'all') {
6702    //usage : srp_removeMeta('all', null, 'myplayer01');
6703      clearSearch();
6704      if (typeof IRON.players[playerNum].audioPlayer.params.meta !== 'undefined') {
6705          Object.keys(IRON.players[playerNum].audioPlayer.params.meta).forEac
6705h(clearMetaFilter);
6706      }
6707  } else if (metaName === 'search') {
6708      clearSearch();
6709  } else {
6710      if (metaValue == null) {
6711          clearMetaFilter(metaName);
6712      } else if (typeof IRON.players[playerNum].audioPlayer.params.meta !== 'undefined' && typeof IRON.players[playerNum].audioPlayer.params.meta[metaName] !== 'undefined') {
6713          const metaString = IRON.players[playerNum].audioPlayer.params.meta[metaName].split(',');
6714          const index = metaString.indexOf(metaValue);
6715          if (index > -1) {
6716              metaString.splice(index, 1);
6717              IRON.players[playerNum].audioPlayer.params.meta[metaName] = metaString.join(',');
6718              const dataPlayerId = playerId ? `[data-playerid="${playerId}"]` : '';
6719              const activeButtons = $(document).find(`.srp_filter_button--active[data-value="${metaValue}"]${dataPlayerId}`);
6720              activeButtons.removeClass('srp_filter_button--active').removeAttr('style');
6721          }
6722      }
6723  }
6724
6725  srp_updatePage(1, IRON.players[playerNum].audioPlayer);
6726  srp_updateList(playerNum);
6727}
6728
6729
6730function srp_addMeta( playerId, metaName, metaValue, selecttype = null ){
6731  if(selecttype == 'multiselect_or' ){
6732    metaName = metaName + '_or';
6733  }
6734  if(selecttype == 'range'){
6735    metaName = metaName + '_minmax';
6736  }else{
6737    metaValue = metaValue.replace(',', 'ii44');
6738
6739  }
6740  const playerNum = ( srp_convertPlayerIdToPlayerNum(playerId) !== null)? srp_convertPlayerIdToPlayerNum(playerId) : 0 ;
6741  
6742  if( typeof IRON.players[playerNum].audioPlayer.params == 'undefined'){
6743    IRON.players[playerNum].audioPlayer.params = {};
6744  }
6745  if( typeof IRON.players[playerNum].audioPlayer.params.meta == 'undefined'){
6746    IRON.players[playerNum].audioPlayer.params.meta = false;
6747  }
6748 if( IRON.players[playerNum].audioPlayer.params.meta === false){
6749    let newValue = [];
6750    newValue[metaName] = metaValue;
6751    IRON.players[playerNum].audioPlayer.params.meta = newValue;
6752 }else if( metaName in IRON.players[playerNum].audioPlayer.params.meta ){
6753    const paramArray = IRON.players[playerNum].audioPlayer.params.meta[metaName].split(',')
6754    if( ! paramArray.includes(metaValue) ){
6755      IRON.players[playerNum].audioPlayer.params.meta[metaName] += ','+ metaValue;
6756    }
6757 }else{
6758  IRON.players[playerNum].audioPlayer.params.meta[metaName] = metaValue
6759 }
6760  IRON.players[playerNum].audioPlayer.params.playerId = playerId;
6761  srp_updatePage(1, IRON.players[playerNum].audioPlayer);
6762  //srp_updateURLParameter( 'srp_page', 1 );
6763  srp_updateList( playerNum );
6764}
6765
6766
6767/*Listener on the URL change*/
6768//Source: https://itsopensource.com/how-to-call-a-function-on-URL-change-in-javascript/
6769/*
6770(function(history){
6771  var pushState = history.pushState;
6772  history.pushState = function() {
6773    pushState.apply(history, arguments);
6774    srp_updateList()
6775  };
6776})(window.history);
6777*/
6778
6779function srp_setSearchFiltersFromUrl(){
6780  
6781  const urlParams = new URLSearchParams(document.location.search);
6782  const playerId = srp_getPlayerIdParamFromUrl();
6783  const playerNum = ( srp_convertPlayerIdToPlayerNum(playerId) !== null)? srp_convertPlayerIdToPlayerNum(playerId) : 0 ;
6784  var verifyParams = false;
6785  for (const key of urlParams.keys()) {
6786    if (key.startsWith('srp_')) {
6787      verifyParams = true;
6788    }
6789  }
6790
6791
6792
6793
6794  IRON.players[playerNum].audioPlayer.params = { //Save parameter
6795    playerId: playerId,
6796    search: urlParams.get('srp_search'),
6797    meta: srp_getAllMetaParams(),
6798    page: urlParams.get('srp_page'),
6799    order: urlParams.get('srp_order'),
6800  }
6801  for (let i = 0; i < IRON.players.length; i++) {
6802    if(i == playerNum){
6803      if(verifyParams || IRON.players[playerNum].audioPlayer.lazy_load){ //If no srp_ param in the URL
6804        srp_updateList( playerNum )
6805      }
6806    }else{
6807      IRON.audioPlayer.reloadAjax(IRON.players[i].audioPlayer, true);
6808    }
6809  }
6810}
6811
6812function srp_getPlayerIdParamFromUrl(){
6813  const urlParams = new URLSearchParams(document.location.search);
6814  let playerId = urlParams.get('srp_player_id');
6815  if( playerId != null && playerId.startsWith('playernum-') ){ //eq: playernum-1 target the first player even without ID. Used by the search f
6815ield from the mp3 player. 
6816    const playerNum = playerId.split('playernum-')[1]-1;
6817    playerId = $('.iron-audioplayer').eq(playerNum).attr('id');
6818  }
6819  return playerId;
6820}
6821
6822function srp_getAllMetaParams(){
6823  const urlParams = new URLSearchParams(document.location.search);
6824  let metaParams = urlParams.get('srp_meta');
6825  if( metaParams ){
6826    metaParams = metaParams.split(';');
6827    metaParams = metaParams.filter((_, index) => index != metaParams.indexOf('')); //Remove Empty array element
6828    let newmetaParamsArray = [];
6829    metaParams.map(function(el){
6830      const metaName = el.split(':', 1)[0];
6831      const metaValue = el.replace(metaName + ':', '');
6832      newmetaParamsArray[decodeURIComponent(metaName)] = decodeURIComponent(metaValue);
6833    })
6834    return newmetaParamsArray;
6835  }
6836  return false;
6837}
6838
6839function srp_getMetaParams(metaName){
6840  let meta = srp_getAllMetaParams();
6841  meta = meta[metaName];
6842  if(typeof meta == 'string'){
6843    meta = meta.split(',');
6844    meta = meta.map( el => { return el.replace('ii44',','); });
6845    return meta;
6846  }else{
6847    return null;
6848  }
6849}
6850
6851function srp_insertChips( playerNum = 0){
6852
6853  const metaParams = (typeof IRON.players[playerNum].audioPlayer.params.meta == 'object')? IRON.players[playerNum].audioPlayer.params.meta : [];
6854  let chipsSelector = '.srp_chips:not([data-player-id])';
6855  let chipsSelectorToRemove = chipsSelector;
6856  let playerId = ( typeof IRON.players[playerNum].audioPlayer.params.playerId !== 'undefined' )? IRON.players[playerNum].audioPlayer.params.playerId : null;
6857  if( playerId !== null ){
6858    if( $('.srp_chips[data-player-id="' + IRON.players[playerNum].audioPlayer.params.playerId + '"]').length ){
6859      chipsSelector = '.srp_chips[data-player-id="' + IRON.players[playerNum].audioPlayer.params.playerId + '"]'
6860      chipsSelectorToRemove = chipsSelector;
6861      if( playerNum == 0 ){
6862        chipsSelectorToRemove += ', .srp_chips:not([data-player-id])'   
6863      }
6864    }
6865  }
6866  
6867  $( chipsSelectorToRemove ).find('.srp_chip').remove();
6868  if( IRON.players[playerNum].audioPlayer.params.search != null){
6869    metaParams['search'] = IRON.players[playerNum].audioPlayer.params.search;
6870  }
6871  updateFilterSelector(metaParams, playerId);
6872  for (const property in metaParams) {
6873    const metaMultiParams = metaParams[property].split(',');
6874
6875    if(property.endsWith('_or')){
6876      var title = $('[data-metakey="' + property.slice(0, -3) + '"]').data('label');
6877    }else if(property.endsWith('_minmax')){
6878      var title = $('[data-metakey="' + property.slice(0, -7) + '"]').data('label');
6879    }else{
6880      var title = $('[data-metakey="' + property + '"]').data('label');
6881    }
6882   
6883    const playerWidgetId = (typeof IRON.players[playerNum] != 'undefined')? IRON.players[playerNum].audioPlayer.id : null ;
6884    const valueForHuman = [];
6885    for (let i = 0; i < metaMultiParams.length; i++) {
6886      valueForHuman[i] = metaMultiParams[i];
6887      if(metaMultiParams[i] != ''){
6888        // if metamultiparams[i] contains _ then it's a range so rename the param min > max
6889        if(metaMultiParams[i].includes('_')){
6890         // metaMultiParams[i] = metaMultiParams[i].replace('_', ' > ');
6891        }
6892        if(property == 'track_length_minmax'){
6893          const times = metaMultiParams[0].split('_');
6894          const startTime = secondsToTime(parseInt(times[0]));
6895          const endTime = secondsToTime(parseInt(times[1]));
6896          valueForHuman[i] = startTime + ' - ' + endTime;
6897        }
6898        
6899        metaMultiParams[i] = metaMultiParams[i].replace('ii44', ',');
6900        chip = $('<div/>', {
6901          class: 'srp_chip',
6902          data: { meta: property, playerid: playerWidgetId },
6903          html: title + ': ' + valueForHuman[i].replace('_', ' - ') + '<i class="sricon-close-circle"></i>'
6904        });
6905
6906        function compareSliderValue(array1, array2) {
6907          if (array1.length !== array2.length) {
6908            return false;
6909          }
6910          for (let i = 0; i < array1.length; i++) {
6911            const element1 = array1[i];
6912            const element2 = array2[i];
6913            if (element1 != element2) {
6914              return false;
6915            }
6916          }
6917          return true;
6918        }
6919
6920        function resetSliderValue(currentMinMaxValue){
6921          IRON.rangeSelector.forEach(function (slider) {
6922            if(compareSliderValue(slider.sliderValue, currentMinMaxValue)){
6923              slider.sliderValue = slider.sliderValue = [ Number(slider.computedMin), Number(slider.computedMax) ];
6924            }
6925          })
6926        }
6927        
6928        $(chip).on('click', function(){
6929          if(property.includes('_minmax')){
6930            resetSliderValue(metaMultiParams[0].split('_'));
6931          }
6932          const metaName = $(this).data('meta');
6933          srp_removeMeta( metaName, metaMultiParams[i], playerId);
6934        })
6935        $(chip).appendTo( chipsSelector );
6936      }
6937    }
6938  }
6939  if ($(chipsSelector).find('.srp_chip').length > 1 && !$(chipsSelector).data('hideclear')){
6940    // Retrieve the value of the data-clearall attribute
6941    const clearAllText = $(chipsSelector).data('clearall') || 'Clear All';
6942  
6943    const clearAllChip = $('<div/>', {
6944      class: 'srp_chip srp_chip_clear_all',
6945      data: { playerid: playerId },
6946      html: clearAllText + '<i class="sricon-close-circle"></i>',
6947    });
6948  
6949    $(clearAllChip).on('click', function() {
6950
6951
6952      for (const property in metaParams) {
6953        if(property.includes('_minmax')){
6954          resetSliderValue(metaParams[property].split('_'));
6955        }
6956      }
6957
6958
6959      srp_removeMeta('all', null, playerId);
6960    });
6961  
6962    $(clearAllChip).appendTo(chipsSelector);
6963  }
6964}
6965
6966function srp_updateList( playerNum ){
6967  if(  typeof IRON.players[playerNum].audioPlayer.params != 'undefined' ) {
6968    let playerId = IRON.players[playerNum].audioPlayer.params.playerId;
6969    /* Playerid Param*/
6970    if( typeof IRON.players[playerNum].audioPlayer.params.playerId != 'undefined' ) {
6971
6972      target_playerId = IRON.players[playerNum].audioPlayer.params.playerId;
6973      if(playerId != null && playerId.startsWith('arbitrary-instance-')){ //ID is provide the embed search
6974        playerId = 'playernum-' + ( parseInt(playerNum, 10) + 1);
6975      }
6976      srp_updateURLParameter( 'srp_player_id', playerId );
6977
6978    }else{
6979      target_playerId = null;
6980      srp_updateURLParameter( 'srp_player_id', '');
6981    }
6982
6983    /* Search Param*/
6984    if( 
6985      typeof IRON.players[playerNum].audioPlayer.params.search != 'undefined' &&
6986      (typeof IRON.players[playerNum].audioPlayer.orderedList != 'undefined' || IRON.players[playerNum].audioPlayer.lazy_load)
6987    ) {
6988      srp_updateURLParameter( 'srp_search', IRON.players[playerNum].audioPlayer.params.search );
6989      if( target_playerId ){
6990        if(target_playerId.startsWith('arbitrary-instance-')){ //ID is provide the embed search
6991          searchDiv = $(document).find('#' + target_playerId + ' .srp_search');
6992        }else{
6993          searchDiv = $(document).find('.srp_search_container[data-player-id=' + target_playerId + '] .srp_search');
6994        }
6995      }else{  
6996        searchDiv = $(document).find('.srp_search_container:not([data-player-id]) .srp_search');
6997      }
6998      searchDiv.val(IRON.players[playerNum].audioPlayer.params.search);
6999      if(typeof IRON.players[playerNum].audioPlayer.orderedList != 'undefined'){ 
7000        IRON.players[playerNum].audioPlayer.orderedList.search(IRON.players[playerNum].audioPlayer.params.search);
7001      }
7002      
7003    }else{
7004      srp_updateURLParameter( 'srp_search', '');
7005    }
7006    /* Meta Param*/
7007    if( typeof IRON.players[playerNum].audioPlayer.params.meta == 'object' ) {
7008      const metaParamsArray = IRON.players[playerNum].audioPlayer.params.meta;
7009      let metaParamsString = '';
7010      for (const property in metaParamsArray) {
7011        if(metaParamsArray[property] != ''){
7012          metaParamsString += property + ':' + metaParamsArray[property] + ';'
7013
7014          // Set active filter buttons from URL strings
7015          metaValues = metaParamsArray[property].split(',');
7016          for(value in metaValues){
7017            activeBt = document.querySelectorAll('.srp_filter_button[data-metakey="' + property + '"][data-value="' + metaValues[value] + '"][data-playerid="' + target_playerId + '"]');
7018            activeBt.forEach( function(el) {
7019              el.classList.add('srp_filter_button--active');
7020              el.style.backgroundColor = el.dataset.color;
7021              el.style.borderColor = el.dataset.color;
7022            })
7023          }
7024        }else{
7025          delete IRON.players[playerNum].audioPlayer.params.meta[property];
7026        }
7027      }
7028      srp_updateURLParameter( 'srp_meta', metaParamsString );
7029
7030      if( typeof IRON.players[playerNum].audioPlayer.orderedList != 'undefined' ){
7031        let paramName = '';
7032        let newMetaParamsArray = [];
7033        for (const property in metaParamsArray) {
7034          paramName = srp_addPrefixToParams(property);
7035          newMetaParamsArray[paramName] = metaParamsArray[property];
7036        }
7037        IRON.players[playerNum].audioPlayer.orderedList.filter(function (item) {
7038          var queryCondition = true;
7039          for (const property in newMetaParamsArray) { 
7040            let stripProperty = property.replace('_or', '');
7041            if( typeof item.values()[stripProperty] != 'undefined'){
7042              let valueToSearch = newMetaParamsArray[property].split(',');
7043              valueToSearch = valueToSearch.map( el => { return el.toLowerCase().replace('ii44',','); });
7044              let itemValue = item.values()[stripProperty].toLowerCase().split(', ');
7045              let alreadyMatched = false;
7046              for (const i in itemValue) {
7047                if( valueToSearch.includes( srp_decodeHTMLEntities(itemValue[i])) && !alreadyMatched ){
7048                  alreadyMatched = true;
7049                }
7050              }
7051              if(!alreadyMatched){
7052                queryCondition = false;
7053              }
7054            }
7055          }
7056          return queryCondition;
7057        });
7058      }
7059    } 
7060
7061    srp_insertChips(playerNum);
7062    IRON.audioPlayer.reloadAjax(IRON.players[playerNum].audioPlayer, true);
7063    
7064  } 
7065
7066}
7067
7068function srp_addPrefixToParams(param){ 
7069  switch(param) {
7070    case 'title':
7071      return 'tracklist-item-title';
7072    case 'description':
7073      return 'srp_track_description';
7074    case 'time':
7075      return 'tracklist-item-time';
7076    default:
7077      return 'sr-playlist-cf--' + param;
7078  }
7079}
7080
7081function srp_scrollToTrackListTop(id){
7082  if ($('#' + id).closest('.srp-scrolltotracklisttop-disable').length) { //Avoid scrolling to top when the class is present. Add the srp-scrolltotracklisttop-disable class to the player or to a parent to disable the scroll to top feature)
7083    return;
7084  }
7085  const yOffset = -30; 
7086  const element = document.getElementById(id);
7087  const y = element.getBoundingClientRect().top + window.pageYOffset + yOffset;
7088
7089  window.scrollTo({top: y, behavior: 'smooth'});
7090
7091  // $('#'+id)[0].scrollIntoView();
7092    $('#'+id).find('.srp_list').addClass('srp_contentLoading'); //prevent transiton width animation on Cta when a new content appears.
7093    setTimeout(function(){
7094      $('#'+id).find('.srp_list').removeClass('srp_contentLoading');
7095    }, 1000);
7096}
7097
7098/*------------------------------
7099END: Search & filter Parameters
7100------------------------------*/
7101
7102IRON.repeatButtonToggle = function(){
7103  const nextRepeatStatus = IRON.repeatNextStatus();
7104  IRON.repeatStatus = nextRepeatStatus;
7105  document.cookie = "sonaar_mp3_player_repeat" + "=" + nextRepeatStatus + ";default;path=/";
7106  $('.iron-audioplayer .srp_repeat').attr('data-repeat-status', nextRepeatStatus);
7107  $('.iron-audioplayer .srp_repeat').attr('title', IRON.repeatToolTipLabel());
7108  if( IRON.audioPlayer.stickyEnable ){
7109    IRON.sonaar.player.repeatStatus = nextRepeatStatus; //Update sticky player vue js variable
7110  }
7111}
7112
7113IRON.repeatNextStatus = function(){
7114  const repeatStatusList = ['playlist', 'track', 'null'];
7115  const currentRepeatIndex = repeatStatusList.indexOf(IRON.repeatStatus);
7116  const nextRepeatIndex = (currentRepeatIndex + 1) % repeatStatusList.length;
7117  const nextRepeatStatus = repeatStatusList[nextRepeatIndex];
7118  return nextRepeatStatus;
7119}
7120
7121IRON.repeatToolTipLabel = function(){
7122  const nextRepeatStatus = IRON.repeatNextStatus();
7123  switch (nextRepeatStatus) {
7124    case 'playlist':
7125      return sonaar_music.option.tooltip_repeat_playlist_btn;
7126      break;
7127    case 'track':
7128      return sonaar_music.option.tooltip_repeat_track_btn;
7129      break;
7130    case 'null':
7131      return sonaar_music.option.tooltip_repeat_disable_btn;
7132      break;
7133    default:
7134      return '';
7135  }
7136}
7137
7138function srp_decodeHTMLEntities(str) {
7139  return str
7140    .replace(/&amp;/g, '&')
7141    .replace(/&gt;/g, '>')
7142    .replace(/&lt;/g, '<')
7143    .replace(/&quot;/g, '"')
7144    .replace(/&#039;/g, "'")
7145    .replace(/&#39;/g, "'")
7146}
7147
7148/* Get PlayeNum */
7149function srp_convertPlayerIdToPlayerNum(playerID, playerToCheck = null) {
7150  let player = null
7151  let playerNum = null;
7152  if( playerID !== null && playerID !== ''){
7153    if( $('#' + playerID + '.iron-audioplayer').length ){
7154      player = $('#' + playerID + '.iron-audioplayer');
7155    }else if($('#' + playerID + ' .iron-audioplayer').length){
7156      player = $('#' + playerID + ' .iron-audioplayer');
7157    }
7158  }
7159  if(player !== null){
7160    if(playerToCheck === null ){
7161      for(const i in IRON.players){
7162        if( player.data('id') == IRON.players[i].audioPlayer.data('id')){
7163          playerNum = i;
7164        }
7165      }
7166    }else{
7167      if( player.data('id') == IRON.players[playerToCheck].audioPlayer.data('id')){
7168        playerNum = playerToCheck;
7169      }
7170    }
7171  }
7172  return playerNum;
7173}
7174
7175function srp_getParamFromUrl(){
7176    //params list: "id", "widget_id", "trackid", "time", "ts_id", "play_icon"
7177
7178  const urlParams = new URLSearchParams(document.location.search);
7179  let params = {};
7180  if(urlParams.get('ts_post_id')){ params.id = urlParams.get('ts_post_id') ; }
7181  if(urlParams.get('ts_time')){ params.time = urlParams.get('ts_time') ; }
7182  if(urlParams.get('ts_track_num')){ params.trackid = urlParams.get('ts_track_num') - 1 ; }
7183  if(urlParams.get('ts_player_index')){  //Seclect player
7184    setTimeout(function(){
7185      console.log('Change player');
7186      IRON.sonaar.player.selectedPlayer = $('.iron-audioplayer').eq( parseInt( urlParams.get('ts_player_index') ) - 1);
7187      IRON.sonaar.player.selectedPlayer.addClass('sr_selectedPlayer')
7188    }, 1000);
7189  }
7190
7191  if(Object.keys(params).length && typeof params.id != 'undefined' ){
7192    sonaar_ts_shortcode( params ); 
7193  }
7194
7195}
7196
7197
7198function srp_setPlayerParamUrl(){
7199
7200  if(typeof IRON.sonaar.player.currentTime == 'undefined' || IRON.sonaar.player.currentTime == ''){
7201    return false;
7202  }
7203
7204  const params = new URLSearchParams({
7205    ts_post_id: IRON.sonaar.player.elWidgetId ? IRON.sonaar.player.postId : IRON.sonaar.player.playlistID.toString().split(", "),
7206    ts_track_num: IRON.sonaar.player.currentTrack + 1,
7207    ts_player_index: (typeof IRON.sonaar.player.selectedPlayer != 'undefined')? parseInt( srp_convertPlayerIdToPlayerNum(IRON.sonaar.player.selectedPlayer.id) ) + 1 : null,
7208    ts_time: IRON.sonaar.player.currentTime
7209  });
7210
7211  const queryString = params.toString();
7212  let urlParams = window.location.origin + window.location.pathname + '?' + queryString;
7213
7214  return urlParams;
7215}
7216
7217IRON.swiper = {}; //Directory of custom functions for the swiper/slider
7218
7219IRON.swiper.isTransitionEnd = true;
7220
7221IRON.swiper.update = function(audioplayer, currentTrack) {
7222  if(typeof audioplayer == 'undefined')
7223    return;
7224
7225  if( audioplayer == null )
7226    return;
7227    
7228  if( typeof audioplayer.swiper == 'undefined' )
7229    return;
7230  
7231  if( audioplayer.find('.srp_swiper').data('swiper-source') == 'track' ){
7232    var slideIndex = currentTrack;
7233    var slidePostId = slideIndex;
7234  }else{
7235    var slidePostId = $(audioplayer).find('.sr-playlist-item').eq(currentTrack).data('post-id');
7236    var slideIndex = -1;
7237    var trackPostId = '';
7238    $(audioplayer).find('.sr-playlist-item').each( function(){
7239        if( trackPostId != $(this).data('post-id')){
7240          trackPostId = $(this).data('post-id'); 
7241          slideIndex++;
7242        }
7243        if(trackPostId == slidePostId){
7244          return false;
7245        }
7246    })
7247  }
7248  if( typeof audioplayer.swiper.params.centeredSlides != 'undefined' && audioplayer.swiper.params.centeredSlides === true ){
7249    audioplayer.swiper.slideToLoop(slideIndex); //If "centeredSlides", always "slideTo"
7250  }else{
7251    var visibleSlidesStartIndex = audioplayer.find('.swiper-slide-active').data('slide-index');
7252    var visibleSlidesEndIndex = visibleSlidesStartIndex + audioplayer.swiper.params.slidesPerView - 1;
7253    if (slideIndex < visibleSlidesStartIndex || slideIndex > visibleSlidesEndIndex) {
7254      audioplayer.swiper.slideToLoop(slideIndex); //If not "centeredSlides", "slideTo" only when the slide is not visible
7255    }
7256  }
7257  
7258  $(audioplayer).find('.swiper-slide.srp_current').removeClass('srp_current');
7259  $(audioplayer).find('.swiper-slide[data-slide-id="' + slidePostId + '"]').addClass('srp_current');
7260  if( $(audioplayer).find('.srp_swiper').data('swiper-source') == 'post' ){ //Only update track info when the swiper is from post.
7261    const titleAndArtistName = $(audioplayer).find('.sr-playlist-item').eq(currentTrack).data("tracktitle").split('<span class="srp_trackartist">');
7262    $(audioplayer).find('.swiper-slide[data-slide-id="' + slidePostId + '"] .srp_swiper-track-title').html(titleAndArtistName[0]);
7263    if( $(audioplayer).find('.srp_swiper-track-artist').length && titleAndArtistName.length > 1){
7264      var artistName = titleAndArtistName[1].split('</span>')[0];
7265      $(audioplayer).find('.swiper-slide[data-slide-id="' + slidePostId + '"] .srp_swiper-track-artist').html(artistName);
7266    }
7267  }
7268  IRON.swiper.isTransitionEnd = false;
7269}
7270
7271
7272IRON.swiper.play = function(el, audioPlayer){
7273  const playlistID = $(el).parents('.swiper-slide').data('slide-id');
7274  if( audioPlayer.find('.srp_swiper').data('swiper-source') == 'track' ){
7275    audioPlayer.find('.sr-playlist-item').eq(playlistID).find('.srp_audio_trigger').trigger('click');
7276  }else{
7277    const currentTrackIndex = (IRON.audioPlayer.stickyEnable)? IRON.sonaar.player.currentTrack : $('.sr-playlist-item.current').index();
7278    if(  audioPlayer.find('.sr-playlist-item').eq(currentTrackIndex).data('post-id') == playlistID ){
7279      audioPlayer.find('.sr-playlist-item .srp_audio_trigger').eq(currentTrackIndex).trigger('click');
7280    }else{
7281      audioPlayer.find('.sr-playlist-item[data-post-id="' + playlistID + '"] .srp_audio_trigger').eq(0).trigger('click');
7282    }
7283  }
7284}
7285
7286IRON.swiper.showHiddenSlide = function(audioPlayer){ //Do slideNext and slidePrev to make appearing the missing slide when we slideto the slider end and loop is enable.
7287  if(typeof audioPlayer.swiper.params != 'undefined' && audioPlayer.swiper.params.loop && typeof audioPlayer.swiper.params.centeredSlides != 'undefined' && audioPlayer.swiper.params.centeredSlides === true ){
7288    if(typeof IRON.players[0] != 'undefined'){
7289      audioPlayer.swiper.slideNext(0);
7290      audioPlayer.swiper.slidePrev(0);
7291    }
7292  }
7293}
7294IRON.searchField = {};
7294 //Directory of custom functions for the search field
7295IRON.searchField.wait = false; //Prevent multiple search when user type fast
7296IRON.searchField.search = function(field, e){ //Search field listener. field = input field, e = event
7297  if (e.ctrlKey || e.altKey || e.metaKey ) {
7298    return;
7299  }
7300
7301      let playerId = $(field).parents('.srp_search_container').data('player-id');
7302
7303      if($(field).parents('.iron-audioplayer').length){
7304        if( $(field).parents('.elementor-widget-music-player').length && typeof $(field).parents('.elementor-widget-music-player').attr('id') != 'undefined'){ //if mp3 player has id from elementor 
7305          playerId = ( $(field).parents('.elementor-widget-music-player').attr('id') )
7306        }else if( ! $(field).parents('.iron_widget_radio').attr('id').startsWith('arbitrary-instance-') ){ //if mp3 player has id from shortcode parameter 
7307          playerId = $(field).parents('.iron_widget_radio').attr('id');
7308        }else{
7309          playerId = $(field).parents('.iron-audioplayer').attr('id');
7310        }
7311        $(field).parents('.srp_search_container').attr('data-player-id', playerId);
7312      }
7313      if (e.keyCode === 13) {
7314        if($(field).parents('.srp_search_container').data('url')){
7315          var url = $(field).parents('.srp_search_container').data('url') + "?srp_search=" + $(field).val();
7316          if( playerId != undefined){
7317            url = url+'&srp_player_id='+playerId;
7318          }
7319          $(location).prop('href', url)
7320        }
7321        $('.srp_search').blur();
7322				e.preventDefault();
7323			}
7324      let searchBox = '.srp_search_container:not([data-player-id]) .srp_reset_search';
7325      if( playerId != undefined){
7326        searchBox = '.srp_search_container[data-player-id="' + playerId + '"] .srp_reset_search';
7327      }
7328      $(searchBox).css('display', 'initial');
7329      if($(field).val() ==''){
7330        $(field).parents('.srp_search_container').find('.srp_reset_search').css('display', 'none');
7331      }
7332      const el = field;
7333      if( IRON.searchField.wait === false ){
7334        IRON.searchField.wait = true;
7335        setTimeout(function(){
7336          const playerNum = ( srp_convertPlayerIdToPlayerNum(playerId) !== null)? srp_convertPlayerIdToPlayerNum(playerId) : 0 ;
7337          if( playerNum == 0 && playerId != undefined && $('.srp_search_container:not([data-player-id]) .srp_search').length && ! $(el).parents('.iron-audioplayer').length ){
7338            document.querySelector('.srp_search_container:not([data-player-id]) .srp_search').value = '';
7339          }
7340          if(typeof IRON.players[playerNum] != 'undefined'){
7341            if( typeof IRON.players[playerNum].audioPlayer.params == 'undefined'){
7342              IRON.players[playerNum].audioPlayer.params = { playerId: playerId, search: $(el).val() };
7343            }else{
7344              IRON.players[playerNum].audioPlayer.params.playerId = playerId;
7345              IRON.players[playerNum].audioPlayer.params.search = $(el).val();  
7346            }
7347            srp_updateURLParameter( 'srp_page', 1 );
7348            IRON.players[playerNum].audioPlayer.params['page'] = 1;
7349            srp_updateList(playerNum);
7350          }
7351          IRON.searchField.wait = false;
7352        }, 700);
7353      }
7354}
7355
7356if(IRON.audioPlayer.stickyEnable && sonaar_music.option.sticky_show_repeat_bt === 'true' || $('.iron-audioplayer .srp_repeat').length){//If a repeat button is visible use the cookie to set the repeat status
7357  IRON.repeatStatus = ($('.srp_noLoopTracklist').length)? 'null' : 'playlist'; //Set the default repeat status
7358  IRON.repeatStatus = ( getCookieValue("sonaar_mp3_player_repeat") )? getCookieValue("sonaar_mp3_player_repeat") : IRON.repeatStatus; //Get the repeat status from cookie if exist
7359}else{
7360  IRON.repeatStatus = false;
7361}
7362
7363IRON.getTrackMemoryKeyFormat = function($mp3Url){ //Reformat the mp3 url to be used as a key in the track memory
7364  return $mp3Url.replace(/[^a-zA-Z0-9]|https|http|/g, '');
7365}

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.