PageSourceSearch

https://mixing-tutorial.de/panzer/panzer.js

js mixing-tutorial.de collected 2026-10-08 09:43:53 UTC 9,730 bytes, 259 lines download raw bytes

1
2/* Panzer Audio Player by Liviu Holhos */
3(function($) {
4
5	var deviceAgent = navigator.userAgent.toLowerCase();
6	var iOS = deviceAgent.match(/(iphone|ipod|ipad)/);
7
8	var methods = {
9		init : function(options) {
10			return this.each(function() {
11				var $this = $(this);
12				if (!$this.is('audio')) return; // check if we are dealing with an audio HTML tag
13
14				var settings = $.extend({
15					layout       : 'mini', // sets the layout style: mini, big
16					theme        : 'dark', // sets the theme: dark, light, custom
17					expanded     : false,  // wheater to expand the player at layout full width
18					cover        : '',     // album cover
19					mousewheel   : false,  // support for mouse wheel seeking
20					pauseothers  : true,   // determines if the player should pause when other panzer player is played
21					showduration : false,  // determines if the player should contain a duration text 
22					showvolume   : false,  // determines if the player should contain a duration text 
23					volume       : 100,    // initial volume of the audio player
24					title        : ''      // set a song title to be displayed below the player
25				}, options);
26				if (settings.volume < 0 ) settings.volume = 0;
27				if (settings.volume >100 ) settings.volume = 100;
28				var $this = $(this), audio = $this.get(0), data = $this.data('panzer');
29				if ( ! data ) {
30					var additional_classes = '';
31					if (settings.layout == "big") additional_classes = ' panzer-big';
32					if (settings.theme == "light")
33						additional_classes += ' panzer-light';
34					else if (settings.theme == "dark")
35						additional_classes += ' panzer-dark';
36					else
37						additional_classes += ' panzer-custom';
38					if (settings.expanded) additional_classes += ' panzer-expand';
39					if (settings.pauseothers) additional_classes += ' pause-others';
40					if (!!this.canPlayType) {
41						controls = '<div class="controls"><span class="play"><em></em></span></div><div class="progress-wrapper"><div class="progress"><div class="elapsed" style="width:0;display:none"></div></div></div>';
42						if (settings.showduration) {
43							var m, s;
44							m = Math.floor( audio.duration / 60 );
45							m = isNaN( m ) ? '00' : ( m >= 10 ) ? m : '0' + m;
46							s = Math.floor( audio.duration % 60 );
47							s = isNaN( s ) ? '00' : ( s >= 10 ) ? s : '0' + s;
48							if (m>100) {
49								controls += '<span class="duration small">'+m+':'+s+'</span>';
50							} else {
51								controls += '<span class="duration">'+m+':'+s+'</span>';
52							}
53							additional_classes += ' show-duration';
54						}
55						if (settings.showvolume) {
56							controls += '<div class="volume-wrapper"><span></span><div class="volume"><div class="set" style="width:'+settings.volume+'%"></div></div></div>';
57							additional_classes += ' show-volume';
58						}
59					} else {
60						var src = $this.attr('src');
61						if (typeof src === 'undefined') src = $this.children('source:first').attr('src');
62						if (typeof src === 'undefined') {
63							controls = '<strong class="alert">Please specify an audio source file.</strong>';
64							additional_classes += ' panzer-unsupported';
65						}
66						else {
67							controls = '<div class="controls"><a class="download" href="'+src+'" title="Download File"><em></em></a></div><strong class="alert">Download Audio</strong>';
68							additional_classes += ' panzer-download';
69						}
70					}
71					if (settings.cover != '') {
72						album_cover = '<div class="cover"><img src="'+settings.cover+'" alt="" /></div>';
73					}
74					else {
75						album_cover = '';
76					}
77					if (!settings.title || 0 === settings.title.length) {
78						song_title = ($this.attr('title')) ?  '<div class="title">' + $this.attr('title') + '</div>' : '';
79					}
80					else {
81						song_title = '<div class="title">'+settings.title+'</div>';
82					}
83					$player = $('<div class="panzer' + additional_classes + '">' + album_cover + '<div class="player">' + controls + '</div>' + song_title + '</div>');
84					if (settings.mousewheel) {
85						$player.children('.player').bind('mousewheel', function(e, delta, deltaX, deltaY) {
86							if (delta) {
87								data = $(this).parents('.panzer').data('panzer');
88								time = data.audio.currentTime + (delta*5);
89								if ( data.audio.readyState === 0 ) {
90									data.audio.addEventListener('canplay', function() {
91										data = $(this).data('panzer');
92										data.audio.currentTime = time;
93									});
94								} else {
95									data.audio.currentTime = time;
96								}
97								e.preventDefault();
98							}
99						});
100					}
101					$this.after($player).data('panzer', {
102						target : $this,
103						audio  : audio,
104						player : $player,
105						loc    : $this.prev()
106					});
107					if (iOS) {
108						$this.css({
109							'position' : 'absolute',
110							'top'      : -9999,
111							'width'    : 0,
112							'height'   : 0,
113							'display'  : 'none',
114							'visibility' : 'hidden',
115							'overflow'   : 'hidden'
116						});
117					} else {
118						$this.detach();
119					}
120					$player.data('panzer', {
121						audio  : audio
122					});
123					if (!!this.canPlayType) {
124						$('.play',$player).click(function(e) {
125							if ($(this).hasClass('play')) {
126								$('.panzer.pause-others').each(function(){
127									var data = $(this).data('panzer');
128									if ( data && !data.audio.paused ) data.audio.pause();
129								});
130								$('.panzerlist.pause-others').each(function(){
131									var data = $(this).find('a.active').data('panzerlist');
132									if ( data && !data.audio.paused ) data.audio.pause();
133								});
134							}
135							data = $(this).parents('.panzer').data('panzer');
136							if ( data.audio.paused ) {
137								data.audio.play();
138							} else {
139								data.audio.pause();
140							}
141						});
142						audio.addEventListener("play", function() {
143							data = $(this).data('panzer');
144							$('.play',data.player).toggleClass('play pause');
145						});
146						audio.addEventListener("pause", function() {
147							data = $(this).data('panzer');
148							$('.pause',data.$player).toggleClass('play pause');
149						});
150						audio.addEventListener("ended", function() {
151							data = $(this).data('panzer');
152							data.audio.pause();
153						});
154						audio.addEventListener("timeupdate", function() {
155							data = $(this).data('panzer');
156							var percent = data.audio.currentTime * 100 / data.audio.duration;
157							if (!isNaN( percent )) {
158								var m, m_str, s;
159								m = Math.floor( data.audio.currentTime / 60 );
160								m_str = isNaN( m ) ? '00' : ( m >= 10 ) ? m : '0' + m;
161								s = Math.floor( data.audio.currentTime % 60 );
162								s = isNaN( s ) ? '00' : ( s >= 10 ) ? s : '0' + s;
163								if ( !isNaN( m ) && m > 99 ) $('span.duration',data.player).addClass('small');
164								$('span.duration',data.player).html(m_str + ':' + s);
165								if (percent == 0)
166									$('.elapsed',data.player).hide().css('width',0);
167								else
168									$('.elapsed',data.player).show().css('width', percent+'%');
169							}
170						});
171						if (settings.showvolume) {
172							audio.addEventListener("volumechange", function() {
173								data = $(this).data('panzer');
174								var percent = data.audio.volume * 100;
175								if (percent == 0)
176									$('.volume .set',data.player).hide().css('width',0);
177								else
178									$('.volume .set',data.player).show().css('width', percent+'%');
179							});
180							audio.volume = settings.volume / 100;
181							var leftButtonDown = false;
182							$('.volume').mousedown(function(e){
183								if(e.which === 1) {
184									leftButtonDown = true;
185									changeVolume($(this),e);
186								}
187							});
188							$('.volume').mouseup(function(e){
189								if(e.which === 1) leftButtonDown = false;
190							});
191							function tweakMouseMoveEvent(e) {
192								if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
193									leftButtonDown = false;
194								}
195								if(e.which === 1 && !leftButtonDown) e.which = 0;
196							}
197							function changeVolume($this,e) {
198								var offset = $this.offset();
199								var x = e.pageX - offset.left;
200								var percent = 100 * x / ($this.width()+1);
201								if (percent < 0) percent = 0;
202								if (percent > 100) percent = 100;
203								data = $this.parents('.panzer').data('panzer');
204								data.audio.volume = percent / 100;
205							}
206							$('.volume').mousemove(function(e){
207								tweakMouseMoveEvent(e);
208								if(e.which != 1 || e.button != 0) return;
209								changeVolume($(this),e);
210							});
211						}
212						$('.progress').click(function(e){
213							var offset = $(this).offset();
214							var x = e.pageX - offset.left;
215							var percent = 100 * x / ($(this).width()+1);
216							if (percent < 0) percent = 0;
217							if (percent > 100) percent = 100;
218							data = $(this).parents('.panzer').data('panzer');
219							var time = Math.round(data.audio.duration / 100 * percent);
220							if ( data.audio.readyState === 0 ) {
221								data.audio.addEventListener('canplay', function() {
222									data = $(this).data('panzer');
223									data.audio.currentTime = time;
224								});
225							} else {
226								data.audio.currentTime = time;
227							}
228						});
229					}
230				}
231			});
232		},
233		destroy : function( ) {
234			return this.each(function() {
235				var $this = $(this), data = $this.data('panzer');
236				if ( data ) {
237					if (iOS) {
238						$this.removeAttr("style");
239					} else {
240						if (data.loc) data.loc.after($this);
241					}
242					data.player.remove();
243					$this.removeData('panzer').removeAttr('style');
244				}
245			})
246		}
247	};
248
249	$.fn.panzer = function( method ) {
250		if ( methods[method] ) {
251			return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
252		} else if ( typeof method === 'object' || ! method ) {
253			return methods.init.apply( this, arguments );
254		} else {
255			$.error( 'Method ' +  method + ' does not exist on jQuery.panzer' );
256		}
257	};
258
259})( jQuery );

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.