function LinkedList(){}LinkedList.prototype={list:new Array(),length:0,first:null,last:null};LinkedList.Circular=function(){};LinkedList.Circular.prototype=new LinkedList();LinkedList.Circular.prototype.append=function(B,A){var A=A||false;if(this.first===null){B.prev=B;B.next=B;this.first=B;this.last=B}else{B.prev=this.last;B.next=this.first;this.first.prev=B;this.last.next=B;if(!A){this.last=B}else{this.first=B}}this.length++};LinkedList.Circular.prototype.insertAfter=function(B,A){A.prev=B;A.next=B.next;B.next.prev=A;B.next=A;if(A.prev==this.last){this.last=A}this.length++};LinkedList.Circular.prototype.remove=function(A){if(this.length>1){A.prev.next=A.next;A.next.prev=A.prev;if(A==this.first){this.first=A.next}if(A==this.last){this.last=A.prev}}else{this.first=null;this.last=null}A.prev=null;A.next=null;this.length--};LinkedList.Node=function(A){this.prev=null;this.next=null;this.data=A};function BlipControl(A){this.options=A||{};this.events={};this.events.init=new YAHOO.util.CustomEvent("init",this);this.events.beforeShutdown=new YAHOO.util.CustomEvent("beforeShutdown",this);this.events.shutdown=new YAHOO.util.CustomEvent("shutdown",this);this.events.mediaHandlersReady=new YAHOO.util.CustomEvent("mediaHandlersReady",this);this.events.preview=new YAHOO.util.CustomEvent("preview",this);this.events.previewPlaying=new YAHOO.util.CustomEvent("previewPlaying",this);this.events.previewStop=new YAHOO.util.CustomEvent("previewStop",this);this.events.create=new YAHOO.util.CustomEvent("create",this);this.events.add=new YAHOO.util.CustomEvent("add",this);this.events.beforeRemove=new YAHOO.util.CustomEvent("beforeRemove",this);this.events.remove=new YAHOO.util.CustomEvent("remove",this);this.events.play=new YAHOO.util.CustomEvent("play",this);this.events.pause=new YAHOO.util.CustomEvent("pause",this);this.events.resume=new YAHOO.util.CustomEvent("resume",this);this.events.stop=new YAHOO.util.CustomEvent("stop",this);this.events.next=new YAHOO.util.CustomEvent("next",this);this.events.mediaFilterSkip=new YAHOO.util.CustomEvent("mediaFilterSkip",this);this.events.markAsFiltered=new YAHOO.util.CustomEvent("markAsFiltered",this);this.events.prev=new YAHOO.util.CustomEvent("prev",this);this.events.volume=new YAHOO.util.CustomEvent("volume",this);this.events.playing=new YAHOO.util.CustomEvent("playing",this);this.events.buffering=new YAHOO.util.CustomEvent("buffering",this);this.events.doneBuffering=new YAHOO.util.CustomEvent("doneBuffering",this);this.events.progress=new YAHOO.util.CustomEvent("progress",this);this.events.loadComplete=new YAHOO.util.CustomEvent("loadComplete",this);this.events.playTime=new YAHOO.util.CustomEvent("playTime",this);this.events.trackListen=new YAHOO.util.CustomEvent("trackListen",this);this.events.available=new YAHOO.util.CustomEvent("available",this);this.events.error=new YAHOO.util.CustomEvent("error",this);this.events.previewError=new YAHOO.util.CustomEvent("previewError",this);this.events.songUrlReplace=new YAHOO.util.CustomEvent("songUrlReplace",this);this.keylisteners={};this.keylisteners.shortcuts=new YAHOO.util.KeyListener(document,{keys:[32,37,39,45,61,107,109,187,189]},{fn:this.doKeyPress,scope:this,correctScope:true})}BlipControl.instances=0;BlipControl.prototype={_player:null,_volume:0.8,_init:false,_mediaHandlers:new Array(),_mediaHandlersByType:new Array(),_playlist:new LinkedList.Circular(),_nodesById:new Array(),_currentNode:null,_currentPlayStart:0,_currentPlayTime:0,_currentTrackLength:0,_preview:null,_playing:false,init:function(){console.log("Init");this.options.direction=this.options.direction||-1;this.options.playlistMax=this.options.playlistMax||25;this._volume=(this.options.volume!="undefined")?this.options.volume:0.8;this.keylisteners.shortcuts.enable();$E.addListener(window,"beforeunload",function(){if(this&&this.shutdown){this.shutdown()}},this,true);this._init=true;this.events.init.fire()},shutdown:function(){if(!this._init){return false}this.events.beforeShutdown.fire();console.log("BlipControl Shutdown");this._init=false;if(this._currentNode&&this.trackListen){this.trackListen()}if(this._player&&this._player.stopTrack){this._player.stopTrack()}this._currentNode=null;this._playing=false;this.events.shutdown.fire();return true},registerMediaHandler:function(A){if(!A.type||!(A.type instanceof Array)||!A.type.length){throw new Error("BlipMediaHandler.type must be an array of media types.")}this._mediaHandlers[this._mediaHandlers.length]=A;for(var B=0;B<A.type.length;B++){this._mediaHandlersByType[A.type[B]]=A}A.events.init.subscribe(function(){console.log("Registered media handler for '"+A.type+"'");A.setVolume(this._volume);for(var C in this._nodesById){if(A.handles(this._nodesById[C].data.type)){if(!this._nodesById[C].data.available){this._nodesById[C].data.available=true;this.events.available.fire(this._nodesById[C].data)}if(A.filterBit&this.options.mediaFilter){this.events.markAsFiltered.fire(this._nodesById[C].data)}}}this.alertMediaHandlersReady()},this,true);A.events.playing.subscribe(function(){var C=this;if(this._statusInterval){clearInterval(this._statusInterval)}this._statusInterval=setInterval(function(){C.updatePlayTime()},1000);this.events.playing.fire(this._currentNode.data)},this,true);A.events.buffering.subscribe(function(){this.events.buffering.fire()},this,true);A.events.doneBuffering.subscribe(function(C,D){this.events.doneBuffering.fire(D[0],D[1])},this,true);A.events.end.subscribe(function(){clearInterval(this._statusInterval);this._statusInterval=null;this.next()},this,true);A.events.error.subscribe(this.handleMediaError,this,true);A.init()},alertMediaHandlersReady:function(){var C=new Array();for(var B in this._mediaHandlers){if(this._mediaHandlers[B].status=="initializing"){return false}for(var A in this._mediaHandlers[B].type){C.push(this._mediaHandlers[B].type[A])}}this.events.mediaHandlersReady.fire(C)},handleMediaError:function(B,A,C){switch(A[0]){case"IO":A[1].available=false;this.events.error.fire("IO Error",A[1]);if(this._currentNode&&this._currentNode.data.id==A[1].id){this.next()}break;case"previewIO":this.previewError();break}},setPlayer:function(A){if(!this._mediaHandlersByType[A]){throw new Error("No media handler registered for '"+A+"'.")}if(this._mediaHandlersByType[A].status=="initializing"){throw new Error("The media handler for type '"+A+"' is still loading.")}if(!this._player||!(this._player==this._mediaHandlersByType[A])){if(this._player){this._player.events.ready.unsubscribe(this._player.playTrack);this._player.stopTrack();this._player.hide()}this._player=this._mediaHandlersByType[A];this._player.events.ready.subscribe(this._player.playTrack);this._player.show()}return this._player},setPreviewPlayer:function(A){if(A&&((!this._mediaHandlersByType[A])||this._mediaHandlersByType[A].status=="initializing")){throw new Error("No media handler registered for '"+A+"'.")}if(!A||!this._previewPlayer||!(this._previewPlayer==this._mediaHandlersByType[A])){if(this._previewPlayer){this._previewPlayer.previewStop();if(this._player!=this._previewPlayer){this._previewPlayer.hide()}}if(A){this._previewPlayer=this._mediaHandlersByType[A];this._previewPlayer.show()}else{this._previewPlayer=null}}return this._previewPlayer},load:function(B,A){console.log("Load");var A=A||false;for(var C=0;C<B.length;C++){try{this.add(B[C],A)}catch(D){console.log("Unable to add "+B[C].id,B[C],D)}}},create:function(A){console.log("Create",A);this.events.create.fire(A);this.add(A)},add:function(C,A){console.log("Add",C.id,C.url);var A=A||false;C.type=C.type||"songUrl";if(!this._init){return false}if(!this._nodesById[C.id]){C.available=true;var B=new LinkedList.Node(C);this._playlist.append(B,A);this._nodesById[C.id]=B;if(this._mediaHandlersByType[C.type]){this._mediaHandlersByType[C.type].addTrack(C)}}this.events.add.fire(C)},remove:function(B){console.log("Remove",B);var A=(B)?this._nodesById[B]:this._playlist.first;this.events.beforeRemove.fire(A.data);if(B){this._playlist.remove(A);if(this._currentNode&&(this._currentNode.data.id==A.data.id)){this._currentNode=null}}this.events.remove.fire(A.data)},get:function(A){return this._nodesById[A]?this._nodesById[A].data:false},inheritPreview:function(C){console.log("Inherit Preview",C);if(!this._init){return false}var A=this._currentNode;this._currentNode=this._nodesById[C];try{this.setPlayer(this._currentNode.data.type);this._previewPlayer=null}catch(B){this._currentNode.data.available=false;return this.events.error.fire("Unknown media type.",this._currentNode.data,(A)?A.data:null)}this.events.play.fire(this._currentNode.data,(A)?A.data:null);this._currentPlayStart=this.getUTCTime();this._currentPlayTime=0;this._currentTrackLength=0;this._player.inheritPreview();this._preview=false;this._playing=true},play:function(C){console.log("Play",C);if(!this._init||(C&&(this._nodesById[C]&&!this._nodesById[C].data.available))){return false}if(this._playing&&this._currentNode){this.trackListen()}if(this._preview){this.previewStop();this.setPreviewPlayer(false)}var C=C||null;var A=null;if(!(C==null&&this._currentNode)){var A=this._currentNode;if(C!==null){this._currentNode=this._nodesById[C]}else{if(this.options.direction>=0){this._currentNode=this._playlist.first}else{this._currentNode=this._playlist.last}C=this._currentNode.data.id}}try{this.setPlayer(this._currentNode.data.type)}catch(B){this._currentNode.data.available=false;this.events.error.fire("Unknown media type.",this._currentNode.data,(A)?A.data:null);return this.next()}this.events.play.fire(this._currentNode.data,(A)?A.data:null);this._currentPlayStart=this.getUTCTime();this._currentPlayTime=0;this._currentTrackLength=0;this._player.loadTrack(this._currentNode.data);this._playing=true},pause:function(){console.log("Pause");if(!this._currentNode){return this.stop()}this._player.pauseTrack();this.events.pause.fire(this._currentNode.data);this._playing=false},resume:function(){console.log("Resume");if(this._preview){this.previewStop();this.setPreviewPlayer(false)}if(!this._currentNode){return false}try{this.setPlayer(this._currentNode.data.type);this._player.resumeTrack()}catch(A){this.next()}this.events.resume.fire(this._currentNode.data);this._playing=true},stop:function(){console.log("Stop");if(this._currentNode){this.trackListen()}if(this._playing){this._player.stopTrack()}this.events.stop.fire((this._currentNode)?this._currentNode.data:null);this._currentNode=null;this._playing=false},next:function(){console.log("Next");if(!this._init){return false}var A=false;var C=this._currentNode;var D=C;do{var B=C;if(this.options.direction>=0){C=(C&&C.next)?C.next:this._playlist.first}else{C=(C&&C.prev)?C.prev:this._playlist.last}if(this._mediaHandlersByType[C.data.type].filterBit&this.options.mediaFilter){this.events.mediaFilterSkip.fire(C.data);A=true}else{A=false}if((B&&C.data.id==B.data.id)||(D&&(C.data.id==D.data.id))){return this.stop()}if(!D){D=C}}while((C.data.available==false)||A);this.events.next.fire(C.data);this.play(C.data.id)},prev:function(){console.log("Prev");if(!this._init){return false}var A=false;var C=this._currentNode;var D=C;do{var B=C;if(this.options.direction>=0){C=(C)?C.prev:this._playlist.last}else{C=(C)?C.next:this._playlist.first}if(this._mediaHandlersByType[C.data.type].filterBit&this.options.mediaFilter){this.events.mediaFilterSkip.fire(C.data);A=true}else{A=false}if((B&&C.data.id==B.data.id)||(D&&C.data.id==D.data.id)){return this.stop()}if(!D){D=C}}while((C.data.available==false)||A);this.events.prev.fire(C.data);this.play(C.data.id)},preview:function(B,A){console.log("Preview");var A=A||"songUrl";if(this._playing){this.pause()}if(this._preview){this.previewStop()}try{this.setPreviewPlayer(A)}catch(C){this.events.previewError.fire("Unknown media type");return }this._previewPlayer.previewTrack(B,A);this._preview=true;this.events.preview.fire()},previewStop:function(){console.log("Stop preview");if(!this._preview){return false}if(this._previewPlayer){this._previewPlayer.previewStop()}this._preview=false;this.events.previewStop.fire()},previewError:function(){console.log("Preview error");this._preview=false;this.events.previewError.fire()},updatePlayTime:function(){if(!this._playing){return false}this.events.playTime.fire(this._player.getTrackPosition(),this._player.getTrackLength())},trackListen:function(){console.log("Track Listen");var C=this._currentNode;if(!C||!this._player){return false}var B=Math.round(this._player.getTrackLength());var D=this._player.getTrackPosition();var A=this._currentPlayStart;this.events.trackListen.fire({data:C.data,trackLength:B,playTime:D,playStart:A})},doKeyPress:function(E,F){var B=F[0];var C=F[1];var D=$E.getTarget(C);if(D.tagName=="INPUT"||D.tagName=="TEXTAREA"||D.tagName=="BUTTON"||C.metaKey||C.altKey){return false}switch(B){case 32:(this._playing)?this.pause():(this._currentNode)?this.resume():this.play();break;case 37:if(this.options.direction>=0&&this._currentNode.data.id!=this._playlist.first.data.id){this.prev()}else{if(this.options.direction<0&&this._currentNode.data.id!=this._playlist.last.data.id){this.prev()}}break;case 39:this.next();break;case 45:case 109:case 189:var A=((this._volume*100)-10)/100;this.setVolume(A);break;case 61:case 107:case 187:var A=((this._volume*100)+10)/100;this.setVolume(A);break}$E.stopEvent(C)},setVolume:function(A){if(A>1){this._volume=1}else{if(A<0.1){this._volume=0.1}else{this._volume=A}}console.log("Volume",this._volume);for(i in this._mediaHandlers){if(this._mediaHandlers[i].status=="initializing"){continue}this._mediaHandlers[i].setVolume(this._volume)}this.events.volume.fire(this._volume)},getUTCTime:function(){var A=new Date();return(A.getTime()+A.getTimezoneOffset())}};