3 $.widget( "panik.playlist", {
10 emission: "episode.slug",
11 episode: "episode.slug",
17 html5audioOptions:{class:"hidden", controls:false,preload:true},
20 playlistContainer: $('<ol>'),
23 // Initialization logic here
25 this.debugContainer = $('<pre>').hide();
26 this.playlistContainer = this.options.playlistContainer;
27 this.element.addClass(this.options.classes);
28 this.element.append(this.playlistContainer);
29 this.element.append(this.debugContainer);
30 this.playlist = this.loadPlaylist();
34 _setOption: function( key, value ) {
35 this.options[ key ] = value;
40 this.playlistContainer.find('audio').each(function(){
42 self.playlist.push(self.jsonifyAudio($(this)));
45 this.debugContainer.text(
46 JSON.stringify(this.playlist, null, '\t')
50 savePlaylist: function(){
51 localStorage['playlist'] = JSON.stringify(this.playlist, null, '\t');
53 loadPlaylist: function(){
54 this.playlist = localStorage['playlist']?JSON.parse(localStorage['playlist']):this.playlist;
55 $.each(this.playlist,function(k,v){
56 self.playlistContainer.append(self._htmlifyJsonSound(v));
60 // Transform HTML5 <audio> to simple JSON object.
61 jsonifyAudio: function(audio) {
64 title: audio.attr('title'),
67 audio.children('source').each(function(){
68 sound.source[$(this).attr('type')] = $(this).attr('src');
72 // Transform JSON sound object to HTML container for playlist.
73 _htmlifyJsonSound: function(sound) {
74 var container = $('<div>',this.options.itemClasses);
75 var audio = $('<audio>',this.options.html5audioOptions);
76 $.each(sound.source,function(k,v){
77 var source = $('<source>',{src:v,type:k});
80 audio.attr('title',sound.title);
81 audio.attr('data-origin',sound.id);
82 var title = $('<button>',{html:sound.title,click:function(){
83 if (audio[0].paused == false) {
85 $(this).removeClass('active');
87 self.playlistContainer.find('.active').removeClass('active');
88 $(this).addClass('active');
93 var remover = $('<button>',{class:'icon-remove',click:function(){
97 container.append(remover).append(title).append(audio);
100 // Create a public method.
101 registerAudio: function(audio) {
102 var htmlAudio = this._htmlifyJsonSound(this.jsonifyAudio(audio));
103 this.playlistContainer.append(htmlAudio);
106 registerSound: function(sound) {
107 this.playlist.push(sound);
110 removeSound: function(k) {
111 this.playlist.splice(k, 1);
114 pauseSounds: function() {
115 this.playlistContainer.find('audio').each(function(){$(this)[0].pause();});
117 _buildhtmlSound: function(sound,k) {
118 var container = $('<div>');
119 var audio = $('<audio>',this.options.html5audioOptions);
120 $.each(sound.source,function(k,v){
121 var source = $('<source>',{src:v,type:k});
122 audio.append(source);
125 var title = $('<button>',{html:sound.title,click:function(){
126 if (audio[0].paused == false) {
128 $(this).removeClass('active');
130 self.playlistContainer.find('.active').removeClass('active');
131 $(this).addClass('active');
136 var remover = $('<button>',{class:'icon-remove',click:function(){
139 return container.append(remover).append(title).append(audio);
141 _buildhtmlPlaylist: function( argument ) {
143 self.playlistContainer.empty();
144 $.each(this.playlist,function(k,v){
145 var soundHtml = self._buildhtmlSound(v,k);
146 var listItem = $('<li>',{html:soundHtml});
147 self.playlistContainer.append(listItem);