﻿/*Player播放类
接受参数:无
返回类型:无

应用技术：
javascript、ActiveXObject、plugins

制作人：
黄若儒 Roy.Huang

注意:
1、现在支持REALPLAY、WINDOW MEDIA PLAY、FLASH三个系列的文件播放以及插件检测
2、本对象应用分实例化应用以及对象化应用
3、全部采用静态/prototype写法，方便继承重载
4、不同的播放器支持的方法属性都略有不同，不同的浏览器对播放控制也有不同限制
5、FLASH方面在IE、FIREFOX、OPERA均能正常使用!
6、在FIREFOX以及OPERA中，能否正常播放，取决与是否已经安装指定插件
*/
var Player=function(){
	this.param=Player.param.slice(0);
	var date=new Date();
	this.objectId="org_developerworld_portlet_Player_object_"+date.getTime();
	while(Player.GEI(this.objectId)){
		date.setTime(date.getTime()+1);
		this.objectId="org_developerworld_portlet_Player_object_"+date.getTime();
	}
};

try{//设置命名空间
	ClassFactory.setNameSpace("org.developerworld.portlet.Player",Player);
	ClassFactory.getClass("org.developerworld.util.DocumentUtil").init(Player);
}
catch(e){
	alert("该类并非独立类");	
}

Player.prototype.panel=null;
Player.prototype.player=null;
Player.prototype.url=null;

Player.prototype.init=function(){//实例化
	if(!Player.setDefault(this))
		return;
};

Player.prototype.setParam=function(n,v){//设置/修改参数值
	if(this.param==null)
		this.param=Player.param.slice(0);
	for(var i=0;i<this.param.length;i++){
		if(this.param[i].name==n){
			this.param[i].value=v;
			return;
		}
	}
	this.param.push({name:n,value:v});
};

Player.prototype.getParam=function(n){//获取参数值
	var rst=null;
	if(this.param!=null){
		for(var i=0;i<this.param.length;i++){
			if(this.param[i].name==n){
				rst=this.param[i].value;
				break;
			}
		}
	}
	return rst;
};

Player.prototype.open=function(url){//打开文件
	this.stop();
	this.url=url;
	this.setParam("Filename",url);//WM-OLD
	this.setParam("Url",url);//WM-NEW
	this.setParam("Src",url);//RM
	this.setParam("movie",url);//flash
	return Player.setPlayer(this);
};

Player.prototype.play=function(url){//播放
	if(!url || this.open(url)){
		try{this.player.Play()}catch(e){};//WM-OLD
		try{this.player.controls.play()}catch(e){};//WM-NEW
		try{this.player.DoPlay()}catch(e){};//RM
	}
};

Player.prototype.stop=function(){//停止
	try{this.player.Stop()}catch(e){};//WM-OLD
	try{this.player.controls.stop()}catch(e){};//WM-NEW
	try{this.player.DoStop()}catch(e){};//RM
};

Player.prototype.pause=function(){//暂停
	try{this.player.Pause()}catch(e){}//WM-OLD
	try{this.player.controls.pause()}catch(e){}//WM-NEW
	try{this.player.DoPause()}catch(e){}//RM
};

Player.prototype.previous=function(){//上一首
	try{this.player.previous()}catch(e){};//WM-OLD
	try{this.player.controls.previous()}catch(e){};//WM-NEW
	try{this.player.DoPrevItem()}catch(e){};//RM
};

Player.prototype.next=function(){//下一首
	try{this.player.next()}catch(e){};//WM-OLD
	try{this.player.controls.next()}catch(e){};//WM-NEW
	try{this.player.DoNextItem()}catch(e){};//RM
};

Player.prototype.upVolume=function(v){//上升音量
	if(!v)
		v=10;
	this.setVolume(this.getVolume()+v);
};

Player.prototype.downVolume=function(v){//下降音量
	if(!v)
		v=10;
	this.setVolume(this.getVolume()-v);
};

Player.prototype.setVolume=function(v){//设置音量
	if(v<0)
		v=0;
	else if(v>100)
		v=100;
	try{this.player.Volume=(v*100)-10000}catch(e){};//WM-OLD
	try{this.player.settings.volume=v}catch(e){};//WM-NEW
	try{this.player.SetVolume(v)}catch(e){};//RM
};

Player.prototype.getVolume=function(){//获取音量
	var v=null;
	try{v=(this.player.Volume+10000)/100}catch(e){};//WM-OLD
	try{v=this.player.settings.volume}catch(e){};//WM-NEW
	try{v=this.player.GetVolume()}catch(e){};//RM
	return v;
};

Player.prototype.mute=function(v){//禁/开音量
	if(v==null){
		try{this.player.Mute=!this.player.Mute}catch(e){};//WM-OLD
		try{this.player.settings.mute=!this.player.settings.mute}catch(e){};//WM-NEW
		try{this.player.SetMute(!this.player.GetMute())}catch(e){};//RM
	}
	else{
		try{this.player.Mute=v}catch(e){};//WM-OLD
		try{this.player.settings.mute=v}catch(e){};//WM-NEW
		try{this.player.SetMute(v)}catch(e){};//RM
	}
};

Player.prototype.setFullScreen=function(){//全屏
	try{this.player.DisplaySize=3}catch(e){};//WM-OLD
	try{this.player.FullScreen=true}catch(e){};//WM-NEW
	try{this.player.SetFullScreen()}catch(e){};//RM
};

Player.prototype.getTimes=function(){//获取影片时长
	var v=null
	try{v=this.player.Duration}catch(e){};//WM-OLD
	try{v=this.player.currentMedia.duration}catch(e){};//WM-NEW
	try{v=this.player.GetLength()/1000}catch(e){};//RM
	return v;
};

Player.prototype.getPosition=function(){//获取当前播放中的点
	var v=null;
	try{v=this.player.currentPosition}catch(e){};//WM-OLD
	try{v=this.player.controls.currentPosition}catch(e){};//WM-NEW
	try{v=this.player.GetPosition()/1000}catch(e){};//RM
	return v;
};

Player.prototype.setPosition=function(v){//移到剪辑中指定的点
	try{this.player.currentPosition=v}catch(e){};//WM-OLD
	try{this.player.controls.currentPosition=v}catch(e){};//WM-NEW
	try{this.player.setPosition(v*1000)}catch(e){};//RM
};

Player.prototype.getStatus=function(){//返回播放器状态
	var v=null;
	try{v=this.player.GetPlayState()}catch(e){};//rm//0:停止,1:连接,2:缓冲,3:播放,4:暂停,5:寻找
	try{v=this.player.playState}catch(e){};//wm//3：正在播放，2：暂停1：已停止
	return v;
};

/**********WM-NEW独有方法**********/
Player.prototype.getBufferingProgress=function(){//获取缓冲百分比
	var v=null;
	try{v=this.player.network.bufferingProgress}catch(e){};
	return v;
};

Player.prototype.getLoaded=function(){//获取加载量百分比
	var v=null;
	try{v=this.player.network.downloadProgress}catch(e){}
	return v;
};

Player.prototype.setBalance=function(v){//设置声道
	try{this.player.settings.balance=v}catch(e){};//WM-NEW
};

Player.prototype.setRate=function(v){//设置播放速度
	try{this.player.settings.Rate=v}catch(e){};//WM-NEW
};

Player.prototype.getRate=function(){//获取播放速度
	var v=null;
	try{v=this.player.settings.Rate}catch(e){};//WM-NEW
	return v;
};

Player.prototype.reverse=function(){//快退
	try{this.player.controls.FastReverse()}catch(e){};//WM-NEW
};

Player.prototype.forward=function(){//快进
	try{this.player.controls.FastForward()}catch(e){};//WM-NEW
};
/**********WM-NEW独有方法**********/

Player.classId=[//驱动id
	//"CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95"//media play 6-
	"CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"//media play 6+
	,"CLSID:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"//realplay
	,"CLSID:D27CDB6E-AE6D-11CF-96B8-444553540000"//flash
];

Player.mimeType=[//mime类型
	["application/x-ms-wmp","application/x-mplayer2"]//media play
	,["application/vnd.rn-realplayer-javascript","x-pn-realaudio-plugin"]//realplay
	,["application/x-shockwave-flash"]//flash
];

Player.ActiveXObject=[//ActiveXObject名称
	"WMPlayer.OCX"//media play
	,"rmocx.RealPlayer G2 Control"//realplay
	,"ShockwaveFlash.ShockwaveFlash"//flash
];

Player.param=[//播放器默认参数
	/******************************公共部分******************************/
	{name:"AutoStart",value:true}//指定是否自动播放指定的源文件(true、非0自动播放，false、0不自动播放)
	/******************************WM-OLD部分******************************/
	//,{name:"AudioStream",value:"-1"}
	//,{name:"AutoSize",value:"0"}
	//,{name:"AnimationAtStart",value:"-1"}
	,{name:"AllowScan",value:true}
	//,{name:"AllowChangeDisplaySize",value:true}
	//,{name:"AutoRewind",value:true}//确定当停止播放时是否返回到电影剪辑的开始部分(true或false)
	//,{name:"BaseURL",value:"0"}//脚本命令设置:被调用的URL(未测试)
	//,{name:"BufferingTime",value:"5"}
	//,{name:"CurrentPosition",value:"0"}//控件设置:当前位置(秒)
	//,{name:"CurrentMarker",value:"0"}//控件设置:当前标记(未测试)
	//,{name:"CaptioningID",value:""}
	//,{name:"ClickToPlay",value:"-1"}
	//,{name:"CursorType",value:"0"}
	//,{name:"DefaultFrame",value:"0"}//显示默认框架(未测试)
	//,{name:"DisplayBackColor",value:"0"}
	//,{name:"DisplayForeColor",value:"16777215"}
	//,{name:"DisplayMode",value:"0"}
	//,{name:"DisplaySize",value:"0"}
	//,{name:"Enabled",value:"0"}//播放器是否可人为控制(true、非0可控制，false、0不可控制)
	//,{name:"EnableContextMenu",value:"0"}//是否启用上下文菜单(true、非0可控制，false、0不可控制)
	//,{name:"EnablePositionControls",value:"-1"}
	//,{name:"EnableFullScreenControls",value:true}
	//,{name:"EnableTracker",value:"-1"}
	//,{name:"Filename",value:""}
	//,{name:"FullScreen",value:true}//开始播放是否自动全屏(0,false不是,否则是)
	//,{name:"InvokeURLs",value:"0"}//脚本命令设置:是否调用URL(未测试)
	//,{name:"Language",value:"-1"}
	//,{name:"Mute",value:"0"}//是否静音(非0,true为静音，0,false为不静音)
	//,{name:"PlayCount",value:1}//播放次数(0为无限次)
	//,{name:"PreviewMode",value:"0"}
	//,{name:"Rate",value:"1"}//播放速率控制(以1为中心,必须大于0)
	//,{name:"SAMILang",value:""}//SAMI语言(未测试)
	//,{name:"SAMIStyle",value:""}//SAMI样式(未测试)
	//,{name:"SAMIFilename",value:""}//字幕ID(未测试)
	//,{name:"SelectionStart",value:"-1"}
	//,{name:"SelectionEnd",value:"-1"}
	//,{name:"SendOpenStateChangeEvents",value:"-1"}
	//,{name:"SendWarningEvents",value:"-1"}
	//,{name:"SendErrorEvents",value:"-1"}
	//,{name:"SendKeyboardEvents",value:"0"}
	//,{name:"SendMouseClickEvents",value:"0"}
	//,{name:"SendMouseMoveEvents",value:"0"}
	//,{name:"SendPlayStateChangeEvents",value:"-1"}
	//,{name:"ShowCaptioning",value:false}//是否显示字幕显示面板
	//,{name:"ShowControls",value:false}//是否显示控制栏(包括播放控件及可选的声音和位置控件)
	//,{name:"ShowAudioControls",value:false}//是否在控制栏显示声音控件(静音按钮和音量滑块)
	//,{name:"ShowDisplay",value:false}//是否显示显示面板(用来提供节目与剪辑的信息)
	//,{name:"ShowGotoBar",value:false}//是否显示转到栏
	//,{name:"ShowPositionControls",value:false}//是否在控制栏显示位置控件(包括向后跳进、快退、快进、向前跳进、预览播放列表中的每个剪辑)
	//,{name:"ShowStatusBar",value:false}//是否显示状态栏
	//,{name:"ShowTracker",value:false}//是否显示搜索栏
	//,{name:"TransparentAtStart",value:true}
	//,{name:"WindowLessVideo",value:"0"}//是否只能窗口化(0,false可以全屏,否则只能在窗口中查看)
	//,{name:"VideoBorderWidth",value:"0"}
	//,{name:"VideoBorderColor",value:"0"}
	//,{name:"VideoBorder3D",value:"0"}
	/******************************WM-NEW部分******************************/
	//,{name:"Balance",value:0}//调整左右声道平衡(小于0偏向左声道，0为立体声，大于0偏向右声道)
	,{name:"CanScan",value:true}//可否扫描
	//,{name:"EnableErrorDialogs",value:true}//是否启用错误提示报告(0,false不是,否则是。如无法获取文件等,不支持文件格式等)
	,{name:"StretchToFit",value:true}//是否按比例伸展(未测试)
	//,{name:"Volume",value:"100"}//默认声音大小(0-100)
	//,{name:"Url",value:""}//播放文件
	//,{name:"UiMode",value:"None"}//播放器显示模式(Full显示全部;mini最简化;None不显示播放控制,只显示视频窗口;invisible全部不显示)
	/******************************RM部分******************************/
	//,{name:"BackGroundColor",value:"#000000"}//指定图像窗口的背景颜色,任何用符号“#”开头的16进制数值或是任何预定义的颜色作用
	//,{name:"console",value:"clip1"}//任何字符串作用：可以将各种不同的RealPlayer控制聚集在网页上，这样它们可以交互使用或是保持独立，而且互相不影响
	//,{name:"Controls",value:"Imagewindow"}//指定那些控制是可见的(ImageWindow，All，ControlPanel，PlayButton，PlayOnlyButton， PauseButton,StopButton，FFCtrl，RWCtrl，MuteCtrl，MuteVolume，VolumeSlider，PositionSlider,TACCtrl，HomeCtrl，InfoVolumePanel，InfoPanel，StatusBar，StatusField，PositionField)
	//,{name:"center",value:"0"}//指定片断使用初始编码大小播放，并且在图像窗口的中央(True或是False)
	//,{name:"_ExtentX",value:"11298"}//未测试
	//,{name:"_ExtentY",value:"7938"}//未测试
	//,{name:"ImageStatus",value:"#000000"}//指定是否在图像窗口中显示状态信息，(True或是False,默认值是true) 
	//,{name:"Loop",value:"1"}//可以让你指定片断是否无限循环(True或是False)
	//,{name:"MainTainaSpect",value:"true"}//拉伸所有的片断来充满整个图像窗口(True或是False)
	//,{name:"NoLogo",value:"1"}//避免RealPlayer启动时在图像窗口中显示(True或是False)
	//,{name:"NumLoop",value:"1"}//任何整数值作用：让你能够指定文件片循环的次数，不需要参数loop
	//,{name:"NoLabels",value:"-1"}//可以禁止显示标题或是版权信息(realplayer5.0以上时，它是垃圾...)(True或是False)
	//,{name:"NoJava",value:"1"}//避免启动Java虚拟机(True或是False)
	//,{name:"Prefetch",value:"0"}//预先显示播放长度(true、非0显示，false、0不显示)
	//,{name:"Prefetch",value:"1"}//指定在播放前，RealPlayer是否可以获得流描述信息，默认值是False(True或是False)
	//,{name:"region",value:""}//任何字符串作用：同SMIL一起使用。允许你指定使用HTML代替SMIL
	//,{name:"Src",value:""}//播放文件
	//,{name:"shuffle",value:"false"}//同多文件片的ram文件或是SMIL文件一起使用。可以让RealPlayer随机播放列表中的文件(True或是False)
	//,{name:"scriptcallbacks",value:""}//用逗号分割的列表作用：指定浏览器的回调监控
	//,{name:"SHUFFLE",value:"0"}//未测试
	//,{name:"type",value:"audio/x-pn-realaudio-plugin"}//字符串作用：为嵌入插件指定MIME类型
	/******************************FLASH部分******************************/
	//,{name:"movie",value:""}//文件路径
	//,{name:"quality",value:"high"}//质量
	//,{name:"wmode",value:"transparent"}//透底
	//,{name:"flashvars",value:""}//传入变量
];

Player.setDefault=function(player){//播放器初始化
	var t=this.GEI(player.panel);
	var w=player.getParam("width");
	var h=player.getParam("height");
	if(w==null || h==null)
		return this.onError(0);
	if(t){
		t.style.width=w+"px";
		t.style.height=h+"px";
	}
};

Player.setPlayer=function(player){//设置播放器
	var classId="";
	var object="";
	var params="";
	var embeds="";
	var objectSub="";
	var panel=this.GEI(player.panel);
	switch(this.getFileExt(player.url).toUpperCase()){
		case "RA":
		case "RM":
		case "RAM":
		case "RMVB":
			if(!this.isInstall(this.ActiveXObject[1],this.mimeType[1][0]))
				return this.onError(2,this.getFileExt(player.url));
			classId=this.classId[1];
			objectSub="type=\""+this.mimeType[1][0]+"\"";
			break;
			
		case "SWF":
			if(!this.isInstall(this.ActiveXObject[2],this.mimeType[2]) && !this.onError(4,this.getFileExt(player.url)))
				return false;
			classId=this.classId[2];
			objectSub="type=\""+this.mimeType[2]+"\"" 
								+" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0\""
								+" pluginspage=\"http://www.macromedia.com/go/getflashplayer\"";
			break;
			
		case "WAV":
		case "MP1":
		case "MP2":
		case "MP3":
		case "MP4":
		case "WMV":
		case "WMA":
		case "MID":
		case "AVI":
		case "MPEG":
		case "MPG":
		case "DAT":
		case "ASF":
		case "MOV":
		default:
			if(!this.isInstall(this.ActiveXObject[0],this.mimeType[0][0]))
				return this.onError(3,this.getFileExt(player.url));
			classId=this.classId[0];
			objectSub="type=\""+this.mimeType[0][0]+"\""
								+" pluginspage=\"http://www.microsoft.com/windows/windowsmedia/\"";
			break;
	}
	for(var i=0;i<player.param.length;i++){
		params+="<param name=\""+player.param[i].name+"\" value=\""+player.param[i].value+"\"/>";
		embeds+=" "+player.param[i].name+"=\""+player.param[i].value+"\" ";
	}
	object="<object id=\""+player.objectId+"\" classid=\""+classId+"\" "+objectSub+" width=\""+player.getParam("width")+"\" height=\""+player.getParam("height")+"\">"
				+params
				+"<embed border=\"0\""
				+embeds
				+"/>"
				+"</object>";
	if(panel)
		panel.innerHTML=object;
	else
		document.write(object);
	player.player=this.GEI(player.objectId);
	return true;
};

Player.getFileExt=function(file){//获取文件后续名
	var e="";
	var p=file.lastIndexOf(".");
	if(p!=-1)
		e=file.substring(p+1,file.length);
	return e;
};

Player.isInstall=function(){//判断是否有安装指定插件
	var rst=false;
	for(var i=0;i<arguments.length;i++){
		try{
			if(navigator.mimeTypes[arguments[i]].enabledPlugin!=null){
				rst=i+1;
				break;
			}
		}
		catch(e){}
		try{
			new ActiveXObject(arguments[i]);
			rst=i+1;
			break;
		}
		catch(e){}
	}
	return rst;
};

Player.update=function(type){
	switch(type){
		case 2:
			if(confirm("是否现在下载RealPlay?"))
				window.open("http://cn.real.com/");
			break;
		case 3:
			if(confirm("是否现在下载Window Media Play?"))
				window.open("http://www.microsoft.com/windows/windowsmedia/default.mspx");
			break;
	}
	if(navigator.appName.toUpperCase()=="NETSCAPE"){
		if(confirm("是否现在下载FireFox相关播放插件?")){
			window.open("http://addons.sociz.com/firefox/116/");
			window.open("http://port25.technet.com/pages/windows-media-player-firefox-plugin-download.aspx");	
		}
		if(confirm("是否查看更多FireFox插件?"))
			window.open("https://addons.mozilla.org/zh-CN/firefox/");
	}
};

Player.onError=function(e,s){//错误控制
	switch(e){
		case 0:alert("必须通过setParam方法设置width和height属性！");break;
		case 1:alert("无效文件格式:'"+s+"'");break;
		case 2:
		case 3:
			alert("系统未安装支持'."+s+"'文件类型的播放器或浏览器插件！");
			this.update(e);
			break;
		case 4:return true;//FLASH能自动更新
		default:alert(e);
	}
	return false;
};
