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.