var SimpleMusicBox=Class.create();
SimpleMusicBox.prototype={
initialize:function(targetId,urlList,debug){
this.targetId=targetId;
this.urlList=urlList;
this.debug=debug;
this.curIndex=0;
this.retryIndex=0;
this.playId=0;
this.retryLimit=(this.urlList.length*2>5)?5:(this.urlList.length*2);
this.taskMap={};
if(this._isIE()){
var target=this._getTarget();
target.settings.playCount=10;
target.settings.autoStart=false;
if(this.debug){
target.attachEvent('PlayStateChange',this._playStateChange.bind(this));
target.attachEvent('OpenStateChange',this._openStateChange.bind(this));
}
window.setInterval(this._checkState.bind(this),300);
}
},
load:function(){
if(this.urlList&&this.urlList.length>0){
this._play(this.urlList[this.curIndex]);
this.curIndex++;
if(this.curIndex==this.urlList.length)
this.curIndex=0;
}
},
_play:function(url){
if(this._isIE()){
var target=this._getTarget();
target.controls.stop();
this.playId++;
this.lastStartTime=new Date().getTime();
target.URL=url;
target.controls.play();
}else{
this._getTarget().innerHTML=this._genMediaPlayFF(url);
}
},
_checkState:function(){
var target=this._getTarget();
if(!target||!target.currentMedia)return;
var s=target.PlayState;
var len=target.currentMedia.duration;
switch(s){
case 1:
this.clearTask(["connect","buffer"]);
break;
case 10:
this.clearTask(["connect","buffer"]);
if(this.lastPlayId==this.playId){
this._retry();
}else{
this.lastPlayId=this.playId;
}
break;
case 2:
case 3:
case 4:
case 5:
this.clearTask(["connect","buffer"]);
if(len<10){
this._retry();
}
break;
case 6:
if(len<10){
this.clearTask(["connect","buffer"]);
this._retry();
}else{
this.clearTask("connect");
this.registerTask("buffer",this._retry.bind(this),6000);
}
break;
case 9:
this.clearTask("buffer");
this.registerTask("connect",this._retry.bind(this),6000);
break;
}
},
_retry:function(){
var target=this._getTarget();
if(this.retryIndex>=this.retryLimit){
target.controls.stop();
return;
}
this.retryIndex++;
this.load();
},
_playStateChange:function(s){
$('debug').innerHTML+=s+","
},
_openStateChange:function(s){
$('debug').innerHTML+="["+s+"],"
},
_getTarget:function(){
return $(this.targetId);
},
registerTask:function(n,task,time){
if(!this.taskMap[n]){
this.taskMap[n]=window.setTimeout(function(){task();this.taskMap[n]=null;}.bind(this),time);
}
},
_clearTask:function(n){
if(this.taskMap[n]){
window.clearTimeout(this.taskMap[n]);
this.taskMap[n]=null;
}
},
clearTask:function(n){
if(n==null){
for(var t in this.taskMap){
this._clearTask(t);
}
}else if(typeof n==String){
this._clearTask(n);
}else if(n.constructor==Array){
n.each(this._clearTask.bind(this));
}
},
_genMediaPlayFF:function(url){
if(url==null||url=='')
url='http://unknown';
var src=['<embed src="'];
src.push(url);
src.push('" align="baseline" border="0" width="460" height="68" type="application/x-mplayer2" pluginspage="http://www.microsoft.com/isapi/redir.dll?prd=windows&amp;sbp=mediaplayer&amp;ar=media&amp;sba=plugin&amp;"');
src.push(' name="MediaPlayer" wmode="transparent" showcontrols="1" showpositioncontrols="0" ');
src.push(' showaudiocontrols="1" showtracker="1" showdisplay="0" showstatusbar="1" autosize="0" showgotobar="0" showcaptioning="0" autostart="1" playCount="10" autorewind="0"');
src.push(' animationatstart="0" transparentatstart="0" allowscan="1" enablecontextmenu="1" clicktoplay="0" invokeurls="0" defaultframe="datawindow"></embed>');
return src.join('');
},
_isIE:function(){
return(document.all&&window.ActiveXObject)?true:false;
}
}