PageSourceSearch

https://ilovemusic-radio.com/radio/wp-content/plugins/qtmplayer/assets/js/qtmplayer.js?ver=PR.3.8.7

js ilovemusic-radio.com collected 2026-10-07 03:29:33 UTC 35,325 bytes, 1,251 lines download raw bytes

1/** @license
2 *
3 * ProRadio Music Player: JavaScript player with audio analyzer
4 * ----------------------------------------------
5 * http://proradio.com/
6 *
7 * Copyright (c) 2020-2021, ProRadio / Igor Nardo. All rights reserved.
8 * This software cna be used only within our products. It can't be edited or modified for reuse under other projects.
9 * Cannot be re-sold or embedded in other products for sale.
10 *
11 */
12
13
14// IMPORTANT: THE FOLLOWING IS NOT A COMMENT! IT IS JAVASCIPT IMPORTING! DO NOT DELETE
15// ===================================================================================
16// @codekit-prepend "../components/jquery.marquee.js"
17// @codekit-prepend "../components/raphael/raphael.min.js"
18// @codekit-prepend "../soundmanager/script/soundmanager2-nodebug-jsmin.js"
19// @codekit-prepend "qtmplayer-smpo.js"
20// @codekit-prepend "qtmplayer-radiofeed.js"
21
22// Not required			codekit-prepend "qtmplayer-webapiplayer.js" 
23
24(function($){
25	
26
27	var qtPlayDebug = $('#qtmplayer').data('qtmplayer-debugger');
28
29
30	var qtAnalyzer  = $('#qtmplayer').data('analyzer'); // disable webaudio
31	var qtInitialized = false;
32
33	var qtPlayIsAllowed = false;
34	var qtShowPlayer  = $('#qtmplayer').data('showplayer'); // disable webaudio
35
36	if( /MSIE|Edge|Trident/i.test(navigator.userAgent) || ( navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 ) ){
37		qtAnalyzer = 0;
38	}
39
40	function qtMplayer_filename(path){
41		path = path.substring(path.lastIndexOf("/")+ 1);
42		return (path.match(/[^.]+(\.[^?#]+)?/) || [])[0];
43	}
44
45
46	// since 3.0.2 moved browser detection to mobile
47	var qtMplayerisMobile = false;
48	if( /MSIE|Edge|Trident/i.test(navigator.userAgent) 
49		|| ( 
50			navigator.userAgent.indexOf('Safari') != -1 
51			&& 
52			navigator.userAgent.indexOf('Chrome') == -1 
53			) 
54		){
55		qtMplayerisMobile = true;
56	}
57	if( /iPad/i.test(navigator.userAgent) ){
58		qtMplayerisMobile = true;
59	}
60	if( /iPhone/i.test(navigator.userAgent) ){
61		qtMplayerisMobile = true;
62	}
63	if (window.matchMedia("(max-width: 1024px)").matches){ 
64		qtMplayerisMobile = true;
65	}
66	if(true === qtMplayerisMobile){
67		qtAnalyzer = 0;
68	}
69
70
71	$.qtMplayerPlaylistCue = {
72		minicue: false,
73		tadv: false,
74		init: function(){
75			$.qtMplayerPlaylistCue.destroy();
76			var item, offset, width,left,
77				minicue, det;;
78			item = $("li.qtmplayer-played");
79			if(item.length > 0){
80				offset = item.offset().left;
81				width =  item.width();
82				left = 0;
83				item.append('<div id="qtMplayerPlaylistTrack" class="qtmplayer-playlist__track"><span id="qtMplayerPlaylistTrackAdv" data-qtmplayer-trackadv class="qtmplayer-track-adv qtmplayer-content-accent"></span>
83<span id="qtMplayerPlaylistMinicue" class="qtmplayer-playlist-minicue"></span></div>');
84				$.qtMplayerPlaylistCue.minicue = $("#qtMplayerPlaylistMinicue");
85				$.qtMplayerPlaylistCue.tadv = $("#qtMplayerPlaylistTrackAdv");
86				det = $("#qtMplayerPlaylistTrack");
87				det.off("mousemove").off("click");
88				det.on("mousemove", function(e){
89					left = e.clientX - offset;
90					$.qtMplayerPlaylistCue.minicue.css({'left': left});
91				});
92				det.on("click", function(e){
93					$.qtPlayerObj.uniPlayer.seek((e.clientX - offset) / width * 100);
94				});
95			}
96		},
97		update:function(p){
98			if($.qtMplayerPlaylistCue.tadv){
99				$.qtMplayerPlaylistCue.tadv.css({"width": p+'%'});
100			}
101			if($.qtMplayerPlaylistCue.minicue){
102				// $.qtMplayerPlaylistCue.minicue.css({"left": p+'%'});
103			}
104		},
105		destroy: function(){
106			$("#qtMplayerPlaylistTrack").remove();
107		}
108	};
109
110	/**
111	 * ===========================================================================
112	 * Circle for podcast
113	 * @type {Object}
114	 * ===========================================================================
115	 */
116	$.qtRaphaelCircle = {
117		container: $(".qtmplayer-circularplayer"),
118		findXY: function(obj) {
119			var curleft = 0, curtop = 0;
120			do {
121				curleft += obj.offsetLeft;
122				curtop += obj.offsetTop;
123			} while (!!(obj = obj.offsetParent));
124			return [curleft,curtop];
125		},
126		getScrollLeft: function() {
127			return ($('body').scrollLeft+document.documentElement.scrollLeft);
128		},
129		getScrollTop: function() {
130			return ($('body').scrollTop+document.documentElement.scrollTop);
131		},
132		init: function(){
133			var RC = $.qtRaphaelCircle,
134				rcontainer = $("#qtdonut"),
135				
136				cH = rcontainer.height(),
137				cW = rcontainer.width(),
138				R = cH / 2;
139			RC.destroy();
140			rcontainer.find("svg").remove();
141			RC.R = R;
142			var archtype = new Raphael("qtdonut", cW, cH);
143			archtype.customAttributes.arc = function (xloc, yloc, value, total, R) {
144				var alpha = 360 / total * value,
145					a = (90 - alpha) * Math.PI / 180,
146					x = xloc + R * Math.cos(a),
147					y = yloc - R * Math.sin(a),
148					path;
149				if (total === value) {
150					path = [
151						["M", xloc, yloc - R],
152						["A", R, R, 0, 1, 1, xloc - 0.01, yloc - R]
153					];
154				} else {
155					path = [
156						["M", xloc, yloc - R],
157						["A", R, R, 0, +(alpha > 180), 1, x, y]
158					];
159				}
160				return {
161					path: path
162				};
163			};
164			var my_arc = archtype.path().attr({
165				"stroke": "#fff",
166				"stroke-width": '16px',
167				arc: [0, 0, 0, 0, 0]
168			});
169			RC.arc = my_arc;
170			RC.container = rcontainer;
171			var	uA = navigator.userAgent,
172				isOpera = (uA.match(/opera/i)),
173				isChrome = (uA.match(/chrome/i)),
174				isTouchDevice = (uA.match(/ipad|iphone/i)),
175				fullCircle = (isOpera||isChrome?359.9:360),
176				angle, offl, offt,
177				dx,dy,coords, perc;
178
179			rcontainer.on('click','svg',function(e){
180				e = e?e:window.event;
181				if (isTouchDevice && e.touches) {
182					e = e.touches[0];
183				}
184				if (e.pageX || e.pageY) {
185					coords = [e.pageX,e.pageY];
186				} else if (e.clientX || e.clientY) {
187					coords = [e.clientX+RC.getScrollLeft(),e.clientY+RC.getScrollTop()];
188				}
189				offl = rcontainer.offset().left;
190				offt = rcontainer.offset().top - $(window).scrollTop() ;
191				dx = e.clientX -  (offl + (cW / 2));
192				dy = e.clientY -  (offt + (cH / 2));
193				angle = Math.floor(fullCircle-(  (Math.atan2(dx,dy) * 180/Math.PI )  +180));
194				perc = angle/fullCircle * 100;
195				$.qtPlayerObj.uniPlayer.seek(perc);
196			});
197			rcontainer.addClass("active");
198		},
199		update: function(p){
200			var RC = $.qtRaphaelCircle,
201				R = RC.R;
202			if(typeof(p) === 'undefined' || typeof(RC.arc) === 'undefined' ){
203				return;
204			}
205			if(isNaN(p)){
206				return;
207			}
208			RC.arc.animate({
209				arc: [R, R, p*100, 100, R]
210			}, 2, "ease");
211		},
212		destroy: function(){
213			var RC = $.qtRaphaelCircle;
214
215			if(typeof(RC.arc) !== 'undefined'){
216				RC.arc.remove();
217				RC.container.removeClass('active');
218			}
219			if(typeof(RC.container) !== 'undefined'){
220				RC.container.removeClass('active');
221			}
222		}
223	};
224
225
226	$.qtPlayerObj = {
227		isSoundApi: false,
228		masterVolume:  $('#qtmplayer').data('qtmplayer-startvol'),//100,
229		uniPlayer: {
230			btnPlay: $("[data-qtmplayer-playbtn]"), //btnPlay: $("#qtmplayerPlay"),
231			canMoove: true,
232			pause: function(){
233				// qtmplayer-radiofeed.js
234				
235				if('object' === typeof($.qtmplayerRadioFeedObj)){ // check if the file is loaded
236					$.qtmplayerRadioFeedObj.fn.stopFeed();
237				}
238				$.qtPlayerObj.interface.justStop();
239				if( 'radio' === $.qtPlayerObj.songdata.type ){
240					// With this, after pausing from the bar, music can't restart
241					$.qtPlayerObj.songdata.file_hold = $.qtPlayerObj.songdata.file; // Store stream in a temorary object
242					$.qtPlayerObj.songdata.file = 'file_hold'; // replace stream with a string to block it
243					$.qtPlayerObj.interface.doSpinner(false);
244					if($.qtPlayerObj.isSoundApi === true){
245						$.qtWebApiPlayer.stop();
246					} else {
247						$.qtSMPO.smStop();
248					}
249
250				} else {
251					if($.qtPlayerObj.isSoundApi === true){
252						$.qtWebApiPlayer.pause();
253					} else {
254						$.qtSMPO.smPause();
255					}
256				}
257			},
258			webapiPlay: function(){
259				$.qtWebApiPlayer.play($.qtPlayerObj.songdata.file);
260			},
261			radioFeedCallback:function( feedImageUrl ){
262				var fallback = $.qtPlayerObj.imgCover.attr('data-fallback');
263				if(undefined !== feedImageUrl){
264					$.qtPlayerObj.imgCover.attr( 'src', feedImageUrl ).show();
265				} else {
266					if(fallback) {
267						$.qtPlayerObj.imgCover.attr('src', fallback).show();
268					} else {
269						$.qtPlayerObj.imgCover.hide();
270					}
271				}
272			},
273			play: function(){
274	
275				if ($.qtPlayerObj.uniPlayer.btnPlay.find("i.material-icons").html() === 'pause') {
276					return;
277				}
278				if(qtInitialized && qtPlayIsAllowed){
279
280
281					$.qtPlayerObj.uniPlayer.btnPlay.find("i.material-icons").html("pause");
282					if($.qtPlayerObj.isSoundApi === true){
283						$.qtWebApiPlayer.play($.qtPlayerObj.songdata.file);
284					} else {
285						if( 'radio' === $.qtPlayerObj.songdata.type && 'file_hold' === $.qtPlayerObj.songdata.file ){
286							$.qtPlayerObj.songdata.file = $.qtPlayerObj.songdata.file_hold;
287							// FIX-2021-06-16_01 - set volume fix after change track
288							// fix issue when after pause the feed doesn't restart
289							$.qtmplayerRadioFeedObj.fn.pushFeed( $.qtPlayerObj.songdata );
290						}
291						$.qtSMPO.smPause();
292						$.qtSMPO.smPlay();
293					}
294					// FIX-2021-06-16_02 - set volume fix after change track
295					setTimeout(
296						function(){
297							if($.qtPlayerObj.masterVolume !== 100){
298								var mvol = $.qtPlayerObj.masterVolume;
299								$.qtPlayerObj.uniPlayer.setVolume( mvol );
300								$("[data-qtmplayer-vball]").css({'top': 100 - mvol});
301								$("[data-qtmplayer-vfill]").css({'height':mvol+'%'});
302							}
303						}, 300
304					);
305				}
306			},
307			seek: function(p){ // p = percentage
308				if(isNaN(p)){
309					return;
310				}
311				p = parseFloat(p);
312				if(p > 100){
313					p = 100;
314				}
315				if($.qtPlayerObj.isSoundApi === true){
316					$.qtWebApiPlayer.seek(p);
317				} else {
318					$.qtSMPO.smSeek(p);
319				}
320			},
321			seekTime: function(t){
322				if(t === '00:00'){
323					t = '00:00:00';
324				}
325				if($.qtPlayerObj.isSoundApi === true){
326					$.qtWebApiPlayer.seekTime(t);
327				} else {
328					$.qtSMPO.smSeekTime(t);
329				}
330			},
331			setVolume: function(v){
332				$.qtPlayerObj.masterVolume = v;
333				if($.qtPlayerObj.isSoundApi === true){
334					$.qtWebApiPlayer.setvolume(v / 100);
335				} else {
336					$.qtSMPO.sm.setVolume(v);
337				}
338			}
339		},
340
341
342		/**
343		 * ================================================================
344		 * 
345		 * [interface functions controlling interaction and visual feedback]
346		 * @type {Object}
347		 *
348		 * ================================================================ 
349		 */
350		interface: {
351			window: $(window),
352			body: $("body"),
353			htmlAndbody: $('html,body'),
354			player: $('#qtmplayer'),
355			controls: $('#qtmplayer-controls'),
356			qtmplayer: $('#qtmplayer-playlistcontainer'),
357			playlist: $("#qtmplayer-playlist ul"),
358			grooveadv:  $('#qtMplayerTadv'), // music cue
359			buffer:  $('#qtMplayerBuffer'), // buffer
360			progWave:  $('#qtMplayerprogWave'), // buffer
361			advance: $("#qtMplayerTadv"),
362			btnPlay: $("[data-qtmplayer-playbtn]"), // $("#qtmplayerPlay"),
363			
364			control: $("#qtmplayerTrackControl"),
365			minicue: $("#qtMplayerMiniCue"),
366			minicueT: $("#qtMplayerPlaylistTrackMinicue"),
367			trackAdvance: $("#qtmplayerTrackAdv"),
368			time: $("#qtmplayerTime"),
369			autoplay: $('#qtmplayer').data('autoplay'),
370			artwork: $('#qtmplayer').data('artwork'),
371			dragging: false,
372			vdragging: false,
373			debug: function(msg){
374				$("#qtmplayerDebug").prepend(msg+'<br>');
375			},
376			doSpinner: function(state, content){
377				var notif = $('[data-qtmplayerNotif]');
378				notif.html(content);
379				if( true === state ){ 
380					notif.addClass("active qtmplayer-spinner"); 
381				} else {
382					notif.removeClass("active").removeClass("qtmplayer-spinner"); 
383				}
384			},
385			preloadTrack: function(){
386				var p = $.qtPlayerObj,
387					i = p.interface;
388				p.interface.doSpinner(true);
389				i.playlist.find("li:first-child .qtmplayer-play-btn").each(function(i,c){
390					var trk = $(c),
391						q = 'qtmplayer-';
392
393					p.songdata = {};
394					$.each(trk.data() , function(i,c){
395						var newKey = i.replace("qtmplayer", "").toLowerCase();
396						p.songdata[newKey] = c;
397					});
398
399
400					$('.qtmplayer-played').removeClass('qtmplayer-played');
401					trk.closest(".qtmplayer-trackitem").addClass("qtmplayer-played");
402					var c = $.qtPlayerObj.interface.controls,
403						ot = false;
404					if(qtShowPlayer){
405						p.interface.showhide();
406					}
407
408
409					if(p.interface.deployTrack()){
410						if(p.interface.autoplay){
411							setTimeout(
412								p.uniPlayer.play, 
413								2200
414							);
415						}
416					}
417				});
418			},
419
420			isMobile: function(){
421				return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || $.ProRadioMainObj.window.width() < 1170 ;
422			},
423
424
425			deployTrack: function(autoplay){
426				var o = $.qtPlayerObj,
427					i = o.interface,
428					hd = i.controls,
429					dt = o.songdata,
430					mp = i.qtmplayer,
431					durtime = $("#qtmplayerDuration"),
432					cartlink,
433					cartbt = hd.find('.qtmplayer__cart'),
434					cur_url = window.location.href,
435					wc_params = '',
436					wc_classes = '',
437					params, // for URL
438					params_str; // for URL
439				if(dt.file == ''){
440					return;
441				}
442
443				
444				if(true === qtMplayerisMobile && $.qtPlayerObj.songdata.file_mobile ){
445					$.qtPlayerObj.songdata.file = $.qtPlayerObj.songdata.file_mobile;
446				}
447
448
449				i.doSpinner(true);
450
451				if(false == qtInitialized){
452					setTimeout(
453						i.doSpinner, 
454						1000
455					);
456				}
457
458				if( 'radio' === dt.type ){
459					i.minicue.hide();
460					i.buffer.hide();
461					i.trackAdvance.hide();
462					durtime.hide();
463					$('#qtmplayerTrackControl canvas').remove();
464					if( $.qtmplayerRadioFeedObj ){
465						$.qtPlayerObj.songdata.callBack = false;
466						if( $.qtPlayerObj.interface.artwork ){
467							$.qtPlayerObj.imgCover = $.qtPlayerObj.interface.controls.find('.qtmplayer__cover img');
468							var original = $.qtPlayerObj.imgCover.attr('src');
469							if( original ){
470								$.qtPlayerObj.imgCover.attr('data-fallback', original);
471							}
472							$.qtPlayerObj.interface.controls.find('.qtmplayer__cover img').attr('data-fallback', original);
473							$.qtPlayerObj.songdata.callBack = $.qtPlayerObj.uniPlayer.radioFeedCallback;
474						}
475						$.qtmplayerRadioFeedObj.fn.pushFeed( $.qtPlayerObj.songdata );
476					}
477				} else {
478					if( $.qtmplayerRadioFeedObj ){
479						$.qtmplayerRadioFeedObj.fn.stopFeed();
480					}
481
482					i.minicue.show();
483					i.buffer.show();
484					i.trackAdvance.show();
485					durtime.show();
486					if( false === i.isMobile() ){
487						var comp = new RegExp(location.host);
488						try {
489							if(comp.test( dt.file ) && 'function' === typeof(qtDrawAudio)){
490								qtDrawAudio(dt.file);
491							} else {
492								$('#qtmplayerTrackControl canvas').remove();
493							}
494						} catch(e){
495							console.log(e);
496						}
497					}
498				}
499
500
501				if( dt.link !== ''){
502					hd.find('.qtmplayer__title').html('<a href="'+dt.link+'"><strong>'+dt.title+'</strong></a> ');
503				} else {
504					hd.find('.qtmplayer__title').html(dt.title);
505				}
506
507
508				hd.find('.qtmplayer__artist').text(dt.artist);
509				if(typeof( dt.album ) !== 'undefined' && dt.album !== ''){
510					hd.find('.qtmplayer__title').append('['+dt.album+']');
511				}
512				hd.find('.qtmplayer__cover').attr("href", dt.link);
513				// WooCommerce support added
514				cartbt.addClass('qtmplayer__disabled');
515				if(dt.buylink !== ''){
516
517					cartbt.removeClass('qtmplayer__disabled');
518					// WooCommerce
519					cartlink = dt.buylink;
520					if('undefined' !== typeof( dt.buylink )) { 
521						dt.buylink = dt.buylink.toString(); 
522						if (dt.buylink.match(/^-?\d+$/)) { // is a numeric ID
523							params = { "add-to-cart":dt.buylink };
524							params_str = jQuery.param( params );
525							if(cur_url.indexOf('?') != -1) {
526								cartlink = cur_url+"&"+params_str;
527							}else{
528								cartlink = cur_url+"?"+params_str;
529							}
530							// Extra cart classes and attrs
531							wc_classes = ' product_type_simple add_to_cart_button ajax_add_to_cart ';
532							cartbt.attr("href", cartlink).attr('data-quantity','1').attr('data-product_id', dt.buylink).addClass(wc_classes).show();
533						} else {
534							cartbt.attr("href", dt.buylink).removeClass('product_type_simple').removeClass('add_to_cart_button').removeClass('ajax_add_to_cart').show();
535
536						}
537					}
538				} else {
539					cartbt.removeClass('product_type_simple').removeClass('add_to_cart_button').removeClass('ajax_add_to_cart');
540				}
541
542				if(dt.icon == 'download') {
543					dt.icon = 'file_download';
544				} 
545				if(dt.buylink == ''){
546					cartbt.hide();
547				} else {
548					cartbt.show();
549				}
550
551				cartbt.find('i').html(dt.icon);
552
553				i.advance.width(0);
554				i.buffer.width(0);
555				if(dt.cover !== '' && dt.cover !== undefined){
556					mp.find('.qtmplayer__album img').attr("src", dt.cover).show();
557					hd.find('.qtmplayer__cover img').attr("src", dt.cover).show();
558					hd.find('.qtmplayer__bgimg').css({"background-image": 'url('+dt.cover+')' });
559				} else {
560					mp.find('.qtmplayer__album img').hide();
561					hd.find('.qtmplayer__cover img').hide();
562					hd.find('.qtmplayer__bgimg').css({"background-image": 'none' });
563				}
564				mp.find('.qtmplayer-albumlink').attr("href",dt.link);
565				if(qtShowPlayer){
566					i.showhide();
567				}
568
569
570
571
572				i.btnPlayClick();
573				i.playTrack();
574				if(autoplay){
575					o.uniPlayer.play();
576				}
577				return true;
578			},
579			btnPlaySetup: function(dt){
580				var state = 'pause', 
581					o = $.qtPlayerObj,
582					i = o.interface,
583					b = i.btnPlay,
584					p = o.uniPlayer;
585
586				b.off("click");
587				b.on("click", function(e){
588					e.preventDefault();
589					state = b.find("i").html();
590					if(state === 'pause'){
591						$(".qtmplayer-played .qtmplayer-play-btn").click();
592					} else {
593						$('#qtmplayer-playlist li:first-child').find(".qtmplayer-play-btn").click();
594					}
595				});
596			},
597			/**
598			 * Questa funzione è probabilmente inutile adesso
599			 */
600			btnPlayClick: function(){
601				var state = 'pause', 
602					o = $.qtPlayerObj,
603					i = o.interface,
604					b = i.btnPlay,
605					p = o.uniPlayer;
606				b.off("click");
607				b.on("click", function(e){
608					e.preventDefault();
609					// state = b.find("i").html();
610					state = b.find("i.material-icons").html();
611					if(state === 'pause'){
612						p.pause();
613					} else {
614						if(false == qtInitialized){
615							i.doSpinner(true);
616							i.initializeAudio();
617							qtPlayIsAllowed = true;
618							setTimeout(
619								p.play, 
620								200
621							);
622						} else {
623							// if(state === 'pause'){
624							// 	p.pause();
625							// } else {
626								qtPlayIsAllowed = true;
627								p.play();
628							// }
629						}
630					}
631					return true;
632				});
633			},
634			playTrack: function(){
635				var p = $.qtPlayerObj,
636					i = p.interface,
637					u = p.uniPlayer;
638				i.body.off("click", ".qtmplayer-play-btn");
639				i.body.on("click", ".qtmplayer-play-btn", function(e){
640					e.preventDefault();					
641					qtPlayIsAllowed = true;
642					i.doSpinner(true);
643					var tr = $(this),
644						item = tr.closest(".qtmplayer-trackitem"),
645						isDonut = item.hasClass("qtmplayer-donut"),
646						icon = tr.find("i"),
647						clickedsong = tr.attr('data-qtmplayer-file'),
648						playedclass = "qtmplayer-played",
649						playedtrack = i.body.find("."+playedclass),
650						iplay =  "dripicons-media-play",
651						ipause = "dripicons-media-pause";
652					if(item.hasClass(playedclass) && tr.find('i').html() === 'pause'){
653						i.switchicon(icon, 'play');
654						item.removeClass(playedclass);
655						i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play');
656						u.pause();
657						e.stopPropagation();
658						return;
659					} else {
660						// Check if is the same track. If yes pause, if not stop the first play the second
661						// update 2019 05 22
662						if(clickedsong === p.songdata.file) {
663							if(playedtrack.length > 0){
664
665								if(p.uniPlayer.btnPlay.find("i.material-icons").html() === 'pause'){
666									playedtrack.removeClass(playedclass);
667									i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play');
668									u.pause();
669									e.stopPropagation();
670									return;
671								} else {
672									u.pause();
673									i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play');
674									playedtrack.removeClass(playedclass);
675								}
676
677							}
678						} else {
679							i.switchicon(playedtrack.find('.qtmplayer-play-btn i.material-icons'), 'play');
680							playedtrack.removeClass(playedclass);
681							i.justStop();
682							u.pause();
683						}
684					
685
686						if( undefined === tr.data("qtmplayer-type") ){
687							tr.data("qtmplayer-type", 'track');
688						}
689
690
691						// 2019 12 29 new faster remapping of data
692						p.songdata = {};
693						
694						$.each(tr.data() , function(i,c){
695							var newKey = i.replace("qtmplayer", "").toLowerCase();
696							p.songdata[newKey] = c;
697						});
698
699						i.seekBtn();
700						i.switchicon(icon, 'pause');
701						item.addClass(playedclass);
702						if($("#qtdonut").length > 0){
703							$("#qtdonut").removeAttr("id");
704						}
705						if(isDonut){
706							item.attr("id", "qtdonut");
707							$.qtMplayerPlaylistCue.destroy();
708							if( 'track' === p.songdata.type){
709								$.qtRaphaelCircle.init();
710							}
711						} else {
712							if( 'track' === p.songdata.type){
713								$.qtMplayerPlaylistCue.init();
714							}
715						}
716						i.deployTrack();
717						// safe initialization
718						if(false == qtInitialized){
719							i.initializeAudio();
720							i.doSpinner(true);
721							setTimeout(
722								u.play, 
723								2200
724							);
725						} else {
726							u.play();
727						}
728
729						// u.play();
730					}
731					e.stopPropagation();
732				});
733			},
734			
735			switchicon: function(i, state) {
736				if(state === 'play'){
737					i.html('play_arrow');
738				} else if (state === 'pause') {
739					i.html('pause');
740				}
741			},
742			progressUpdate: function(perc){ // buffered
743				var i = $.qtPlayerObj.interface,
744					p = perc * 100;
745				i.buffer.css({width: p+'%'});
746				i.minicue.addClass('actvd');
747				
748			},
749			timeupdate: function(perc, time){
750				var i = $.qtPlayerObj.interface,
751					p = perc * 100;
752				i.advance.css({width: (p)+'%'});
753				i.time.html(time);
754				if(perc > 0.001){
755					i.doSpinner();
756					setTimeout(
757						i.doSpinner, 
758						300
759					);
760				}
761				if($('#qtMplayerprogWave')){
762					$('#qtMplayerprogWave').css({width: (p)+'%'});
763				}
764				if(i.dragging === false) {
765					i.minicue.css({left: (p)+'%'});
766				}
767			},
768			seekBtn: function(){
769				var o = $.qtPlayerObj,
770					i = o.interface,
771					c = i.control,
772					m = i.minicue,
773					ol = c.offset().left,
774					w = c.outerWidth(),
775					t = (o.songdata.type == 'radio') ? 'radio' : 'track',
776					l,
777					active = false,
778					currentX, currentY, initialX, initialY,
779					xOffset = 0;
780					yOffset = 0;
781					dragItem = m;
782				c.off("touchstart").off("touchend").off('touchmove').off('mousedown').off('mouseup').off('mouseleave').off('mousemove');
783				if(t === 'radio') {
784					m.css({'left': 0});
785				} else {
786					c.on("touchstart", dragStart);
787					c.on("touchend", dragEnd);
788					c.on("touchmove", drag);
789					c.on("mousedown", dragStart);
790					c.on("mouseup", dragEnd);
791					c.on("mouseleave", dragEnd);
792					c.on("mousemove", drag);
793					function dragStart(e) {
794						i.dragging = true; 
795						active = true;
796						m.addClass('qtmplayer-touch');
797					}
798					function dragEnd(e) {
799						i.dragging = false;
800						active = false;
801						m.removeClass('qtmplayer-touch');
802					}
803					function drag(e) {
804						ol = c.offset().left;
805						w = c.outerWidth();
806						if (e.type === "touchmove") {
807							l = e.originalEvent.touches[0].pageX - ol;
808						} else {
809							l = e.clientX - ol;
810						}
811						if(active){
812							relocate(l);
813						}
814					}
815					function relocate(l){
816						var p = l / w;
817						if( p < 0 || p > 99.9 ){
818							return;
819						}
820						m.css({'left': l});
821						o.uniPlayer.seek(p * 100);
822					}
823				}
824			},	
825			appendAlbum: function(){
826				var p = $.qtPlayerObj,
827					i = p.interface,
828					c = i.controls,
829					cartlink,
830					cur_url = window.location.href,
831					wc_params = '',
832					wc_classes = '',
833					params, // for URL
834					params_str, // for URL
835					ot = false, // timeout
836					notif = $('[data-qtmplayerNotif]');
837					i.body.on("click", "[data-qtmplayer-addrelease]", function(e){
838					e.preventDefault();
839					var that = $(this),
840						url = that.data("qtmplayer-addrelease"),
841						playnow = that.data("playnow"),
842						latestAdded = 'qtmplayer-latestadded';
843					if(that.data("qtmplayer-addrelease") == '0'  || that.hasClass("disabled")){
844						return;
845					}
846					$.getJSON(url, function( data ) {
847						var newitem,
848							special_action,
849							tn = data.length;
850						$.each( data, function( key, val ) {
851							// WooCommerce
852							cartlink = val.buylink;
853							if (val.buylink.match(/^-?\d+$/)) { // is a numeric ID
854								params = { "add-to-cart":val.buylink };
855								params_str = jQuery.param( params );
856								if( cur_url) {
857									if( cur_url.indexOf("?")>= 0 ) {
858										cartlink = cur_url+"&"+params_str;
859									}else{
860										cartlink = cur_url+"?"+params_str;
861									}
862								}
863								// Extra cart classes and attrs
864								wc_classes = ' product_type_simple add_to_cart_button ajax_add_to_cart ';
865								wc_params = ' data-quantity="1" data-product_id="'+ val.buylink +'" ';
866							}
867							special_action = '<i class="material-icons">'+val.icon+'</i>';
868							if( typeof(val.price) !== 'undefined'){
869								if (val.price !== ''){
870									special_action = '<span class="qtmplayer-price qtmplayer-btn qtmplayer-btn-xs qtmplayer-btn-primary">'+val.price+'</span>';
871								}
872							}
873							newitem = '<li class="qtmplayer-trackitem dynamic">';
874							if(val.cover !== ''){
875								newitem += '<img src="'+val.cover+'">';
876							}
877							newitem += '<span class="qtmplayer-play qtmplayer-link-sec qtmplayer-play-btn '+latestAdded+'" data-qtmplayer-type="track" data-qtmplayer-cover="'+val.cover+'" data-qtmplayer-price="'+val.price+'" data-qtmplayer-file="'+val.file+'" data-qtmplayer-title="'+val.title+'"'+'data-qtmplayer-artist="'+val.artist+'"'+'data-qtmplayer-album="'+val.album+'" data-qtmplayer-link="'+val.link+'" data-qtmplayer-buylink="'+val.buylink+'" data-qtmplayer-icon="'+val.icon+'"><i class="material-icons">play_arrow</i></span><p>	<span class="qtmplayer-tit">'+val.title+'</span><br>	<span class="qtmplayer-art">'+val.artist+'</span></p><a href="'+cartlink+'" '+wc_params+' class="qtmplayer-cart '+ wc_classes +'" target="_blank">'+special_action+'</a></li>';
878							i.playlist.append(newitem);
879							if(0 === key && playnow){
880								$.qtPlayerObj.interface.justStop();
881								$.qtPlayerObj.uniPlayer.pause();
882								p.songdata = val;
883								$("."+latestAdded).click();
884							}
885							latestAdded = '';
886						});
887						i.showhide();
888						if(that.data("clickonce") === 1){
889							that.hide();
890							
891							$(that.data("notificate")).addClass("active");
892
893						} else {
894							that.addClass('disabled');
895							
896						}
897						notif.addClass("wait").delay(1500).promise().done(function(){
898							notif.removeClass("wait");
899						});
900						// Disable the functionality
901						that.attr("data-qtmplayer-addrelease", '0');
902					});
903				});
904			},
905			showhide: function(){
906				var c = $.qtPlayerObj.interface.controls;
907				c.addClass('open');
908				ot = setTimeout(function() {
909					c.removeClass('open');
910					clearTimeout(ot);
911				}, 4000);
912			},
913			prevNext: function(){
914				$.qtPlayerObj.interface.controls.on("click",".qtmplayer__prev, .qtmplayer__next", function(e){
915					e.preventDefault();
916					var t = $(this), b;
917					$.qtPlayerObj.interface.doSpinner(true);
918					if(t.data("control") === "prev"){
919						b = $(".qtmplayer-played").prev();
920					} else {
921						b = $(".qtmplayer-played").next();
922					}
923					b.find(".qtmplayer-play-btn").click();
924				});
925			},
926			next: function(){
927				var i = $.qtPlayerObj.interface,
928					nt = $(".qtmplayer-played").next();
929				if(nt !== undefined){
930					if(nt.length > 0){
931						nt.find(".qtmplayer-play-btn").click();
932					} else {
933						i.justStop();
934					}
935				} else {
936					i.justStop();
937				}
938			},			
939			justStop: function(){
940				$.qtPlayerObj.interface.switchicon($(".qtmplayer-played .qtmplayer-play-btn i.material-icons"), 'play');
941				$.qtPlayerObj.uniPlayer.btnPlay.find("i.material-icons").html("play_arrow");
942			},
943			skipCue: function(){
944				var o = $.qtPlayerObj,
945					i = o.interface;
946				i.body.on('click', '[data-qtplayercue]',function(){
947					var t = $(this),
948						k = t.data('qttrackurl'),
949						c = t.data('qtplayercue');
950					if("undefined" === typeof( o.songdata.type )) {
951						return;
952					}
953					if(o.songdata.file === k) {
954						o.uniPlayer.seekTime(c);
955					}
956				});
957			},
958			volBtn: function(){
959				var o = $.qtPlayerObj,
960					i = o.interface,
961					c = $("[data-qtmplayer-vcontrol]");
962				if( 0 === c.length ){ return; }
963				var	ol = c.offset().top,
964					w = c.outerHeight(),
965					ct = $("[data-qtmplayer-vtrack]"), // cue
966					f = $("[data-qtmplayer-vfill]"), // fill
967					m = $("[data-qtmplayer-vball]"), // fill
968					off = c.offset().top,
969					h =  c.height(),
970					vi = $('[data-qtmplayer-vicon]'),
971					t, // top
972					p = 100, // percentage
973					tp = 100, // volume before muting to unmute
974					d; // delta
975				c.on("touchstart", vdragStart);
976				c.on("touchend", vdragEnd);
977				c.on("touchmove", vdrag);
978				c.on("mousedown", vdragStart);
979				c.on("mouseup", vdragEnd);
980				c.on("mouseleave", vdragEnd);
981				c.on("mousemove", vdrag);
982				var vactive = false;
983				var vcurrentX;
984				var vcurrentY;
985				var vinitialX;
986				var vinitialY;
987				var vxOffset = 0;
988				var vyOffset = 0;
989				var vdragItem = m;
990				function vdragStart(e) {
991					i.vdragging = true; 
992					vactive = true;
993					m.addClass('qtmplayer-touch');
994				}
995				function vdragEnd(e) {
996					i.vdragging = false;
997					vactive = false;
998					m.removeClass('qtmplayer-touch');
999				}
1000				function vdrag(e) {
1001					off = c.offset().top - $(window).scrollTop();
1002					if(vactive){
1003						ol = c.offset().top;
1004						w = c.outerHeight();
1005						if (e.type === "touchmove") {
1006							l = off - e.originalEvent.touches[0].pageY;
1007						} else {
1008							l = off - e.clientY;
1009						}
1010						vrelocate(100 - Math.abs(l) );
1011					}
1012				}
1013				function vrelocate(l){
1014					if(l < 0 ){
1015						l = 0;
1016					}
1017					if(l > 95 ){
1018						l = 100;
1019					}
1020					m.css({'top': 100 -l});
1021					p = l;
1022					f.css({'height':p+'%'});
1023					$.qtPlayerObj.uniPlayer.setVolume(p);
1024					if(p > 1){
1025						if(p < 50){
1026							vi.html('volume_down');
1027						} else {
1028							vi.html('volume_up');
1029						}
1030					} else {
1031						vi.html('volume_off');
1032					}
1033				}
1034				vi.on('click', function(e){
1035					e.preventDefault();
1036					
1037					if(p > 1){
1038						tp = p;
1039						vrelocate(0);
1040					} else {
1041						vrelocate(tp);
1042					}
1043					e.stopPropagation();
1044				});
1045				// Boot setup start volume
1046				var mvol = $.qtPlayerObj.masterVolume;
1047				if(mvol !== 100){					
1048					$.qtPlayerObj.uniPlayer.setVolume( mvol );
1049					vrelocate(mvol);
1050				}
1051			},
1052			setDuration: function(text){
1053				if(text === 'NaN:NaN' || text === '00:00'){
1054					$("#qtmplayerDuration").html();
1055					return;
1056				}
1057				$("#qtmplayerDuration").html(text);
1058			},
1059			bufferStart: function(){
1060				
1061				$("#qtmplayerDuration").html('...');
1062				$("#qtmplayer-buffer").show();
1063				$('#qtMplayerMiniCue,  #qtMplayerTadv').animate({'opacity':0.4}, 'fast' ).css({'pointer-events': 'none'});
1064			},
1065			bufferEnd: function(){
1066				$("#qtmplayer-buffer").hide();
1067				var returnAlive = setTimeout(function(){
1068					$('#qtMplayerMiniCue, #qtMplayerTadv').animate({'opacity':1}, 'fast' ).css({'pointer-events': 'all'});
1069				}, 300);
1070				
1071			},
1072			screenResize: function(){
1073				var resizeTimer,
1074					o = $.qtPlayerObj,
1075					i = o.interface,
1076					w = i.window,
1077					ww = w.width(),
1078					wh = w.height();
1079				w.on('resize', function() {
1080					clearTimeout(resizeTimer);
1081					resizeTimer = setTimeout(function() {
1082						if (w.width() !== ww || w.height() !== wh) {
1083							i.seekBtn();
1084							$.qtMplayerPlaylistCue.init();
1085						}
1086						
1087					}, 100);
1088				});
1089			},
1090			initializeAudio: function() {
1091				var o = $.qtPlayerObj,
1092				i = o.interface;
1093				i.doSpinner(true);
1094				if(qtAnalyzer){
1095					var hasAudioContext = false;
1096					try {
1097						hasAudioContext = window.AudioContext || window.webkitAudioContext;
1098					} catch(e) {
1099						if($.qtSMPO.init()){
1100							qtInitialized = true;
1101							return true;
1102						};
1103					}
1104					if(hasAudioContext !== false){
1105						o.isSoundApi = true;
1106						if($.qtWebApiPlayer.init()){
1107							qtInitialized = true;
1108							return true;
1109						}
1110					}
1111				} else {
1112					if($.qtSMPO.init()){
1113						qtInitialized = true;
1114						return true;
1115					};
1116				}
1117			},
1118			resumeAudioOld: function(){
1119				var o = $.qtPlayerObj,
1120					i = o.interface;
1121				i.initializeAudio(); // Appply new fixes
1122				qtPlayIsAllowed = true;
1123				if(i.autoplay){
1124					setTimeout(
1125						o.uniPlayer.play, 
1126						2200
1127					);
1128					
1129				}
1130				document.removeEventListener("click", i.resumeAudio);
1131			},
1132			resumeAudio: function(){
1133				// this seems to break the player by creating sometimes a parallel audio instance
1134				// return;
1135
1136				var o = $.qtPlayerObj,
1137					i = o.interface;
1138				i.log("resumeAudio A");
1139				i.initializeAudio(); // Appply new fixes
1140				qtPlayIsAllowed = true;
1141				if(i.autoplay){
1142					i.log("resumeAudio B");
1143					setTimeout(
1144						function(){ 
1145							i.btnPlay.click(); 
1146							i.log("resumeAudio A1");
1147							setTimeout(
1148								function(){ 
1149									i.log("resumeAudio AB");
1150									if(false === i.isMobile()){
1151										i.log("resumeAudio AB 0");
1152									} else {
1153										i.btnPlay.click();
1154										i.log("resumeAudio AB 1");
1155									}
1156								},
1157								10
1158							);
1159						},
1160						2200
1161					);					
1162				}
1163				i.log("resumeAudio C");
1164				document.removeEventListener("click", i.resumeAudio);
1165			
1166
1167			},
1168			triucco: function(){
1169				var b = $('body'),
1170					i = $.qtPlayerObj.interface,
1171					t; 
1172				$('#qtmusicplayer').addClass('qt-mplayer-mobile');
1173				i.initializeAudio(); 
1174				i.resumeAudio();
1175				b.addClass("qt-mplayer-enabled");
1176				i.log('mobile player enabled');
1177				setTimeout(
1178					function(){
1179						i.doSpinner();
1180					}, 
1181					1200
1182				);
1183				
1184			},
1185			log: function(m){
1186				var c = $("#qtmPlayerDebugger");
1187				if(c.length > 0){
1188					c.append(m+'<br>');
1189				}
1190			},
1191
1192		},
1193		initPlayer: function(){
1194			if(qtPlayDebug){
1195				$('#qtmplayer-playlist').append('<div class="qtmplayer__debugger" id="qtmPlayerDebugger"><h5>Player Debug</h5></div>');
1196			}
1197			var o = $.qtPlayerObj,
1198				i = o.interface,
1199				c = i.controls,
1200				b = i.body,
1201				ot; // ot = outTimer
1202			o.songdata = {};
1203			b.addClass("qtmplayer-enabled");
1204			$(document).on("click", "[data-playlistopen]", function(){
1205				b.toggleClass("qtmplayer-openplaylist");
1206			});
1207			b.on("click", "[data-playeropen]", function(){
1208				b.toggleClass("qtmplayer-open");
1209			});
1210			c.find('.qtmplayer__cover').html('<img src="">');
1211			i.qtmplayer.find('.qtmplayer__album').prepend('<img src="">');
1212			// i.initializeAudio(); // Appply new fixes
1213			// document.addEventListener("click", i.resumeAudio); // trick: if autoplay is enabled and blocked, any click will start audio
1214			
1215			if( qtMplayerisMobile ){
1216				i.triucco();
1217
1218			} 	else {
1219				b.addClass("qt-mplayer-enabled");
1220			}
1221
1222			i.preloadTrack();
1223			i.prevNext();
1224			i.appendAlbum();
1225			i.seekBtn();
1226			i.volBtn();
1227			i.bufferEnd();
1228			i.skipCue();
1229			i.screenResize();
1230			c.mouseenter(function(){
1231				c.addClass('open');
1232				i.seekBtn();
1233				clearTimeout(ot);
1234			}).mouseleave(function(){				
1235				ot = setTimeout(function() {
1236					c.removeClass('open');
1237				}, c.data('hidetimeout'));
1238			});
1239		},
1240	};
1241	$(document).ready(function() {
1242		if(0 === $('#qtmplayer-playlist li').length ){
1243			return;
1244		}
1245		$.qtPlayerObj.initPlayer();
1246	});
1247})(jQuery);
1248
1249
1250
1251

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.