You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							656 lines
						
					
					
						
							22 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							656 lines
						
					
					
						
							22 KiB
						
					
					
				
								/*******************************************************************************
							 | 
						|
								牛牛截图的JS部分的核心流程封装在此文件中,绝大部分情况下,您不需要修改此文件中的JS内容,它已经包含了在所有浏览器上应用
							 | 
						|
								牛牛截图所需要的所有代码,您只需要去修改capturewrapper.js,将相应的函数修改成与您的UI匹配的即可 
							 | 
						|
								*******************************************************************************/
							 | 
						|
								
							 | 
						|
								/*******************************************************************************/
							 | 
						|
								//设置截图的参数  
							 | 
						|
								var emPensize = 1;		//设置画笔大小
							 | 
						|
								var emDrawType = 2;		//设置是腾讯风格还是360风格 0: 腾讯风格   1: 360风格
							 | 
						|
								var	emTrackColor = 3;		//自动识别的边框的颜色
							 | 
						|
								var	emEditBorderColor = 4;	//文本输入的边框颜色
							 | 
						|
								var	emTransparent = 5;		//工具栏的透明度
							 | 
						|
								var	emWindowAware = 6;		//设置是否禁用随着DPI放大
							 | 
						|
								var	emSetSaveName = 8;		//设置保存时的开始文字     免费版本无效
							 | 
						|
								var	emSetMagnifierBkColor = 9; //设置放大镜的背景色,不设置则透明
							 | 
						|
								var	emSetMagnifierLogoText = 10; //设置放大镜上的LOGO字符,可提示快捷键,如: 牛牛截图(CTRL + SHIFT + A)     免费版本无效
							 | 
						|
								var emSetWatermarkPictureType = 20;						//设置水印的类型 
							 | 
						|
								var	emSetWatermarkPicturePath = 21;						//设置水印的路径 
							 | 
						|
								var	emSetWatermarkTextType = 22;						//设置水印文字的类型 
							 | 
						|
								var	emSetWatermarkTextValue = 23;                       //设置水印文字的字符串
							 | 
						|
								var emSetMosaicType = 24;               //指定马赛克的类型,1为矩形,2为画线 
							 | 
						|
								var emSetTooltipText = 25;               //用于设置工具栏图标的TOOLTIP文字 
							 | 
						|
								var emSetMoreInfo = 26;							//设置额外的信息,用于特殊需求 
							 | 
						|
								/*******************************************************************************/
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								var emClosed = 1;
							 | 
						|
								var emConnected = 2;
							 | 
						|
								var emConnecting = 3;
							 | 
						|
								
							 | 
						|
								var emCaptureSuccess = 0;
							 | 
						|
								var emCaptureFailed = 1;
							 | 
						|
								var emCaptureUnknown = 2;
							 | 
						|
								
							 | 
						|
								var emCmdReady = -1;
							 | 
						|
								var emCmdCapture = 0;
							 | 
						|
								var emCmdSaveFile = 1;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								function isMacintosh() {
							 | 
						|
								  return navigator.platform.indexOf('Mac') > -1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function rgb2value(r, g, b)
							 | 
						|
								{
							 | 
						|
								    return r | g << 8 | b << 16;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								var captureObjSelf = null;
							 | 
						|
								function onpluginLoaded()
							 | 
						|
								{
							 | 
						|
								    captureObjSelf.pluginLoaded(false);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function NiuniuCaptureObject() 
							 | 
						|
								{
							 | 
						|
								    var self = this;
							 | 
						|
								    captureObjSelf = this;
							 | 
						|
								    this.PenSize = 2;
							 | 
						|
								    this.DrawType = 0;
							 | 
						|
								    this.TrackColor = rgb2value(255, 0, 0);
							 | 
						|
								    this.EditBorderColor = rgb2value(255, 0, 0);
							 | 
						|
								    this.Transparent = 255;
							 | 
						|
								    this.WindowAware = 1;
							 | 
						|
								    this.MosaicType = 1;
							 | 
						|
								    this.SaveName = "测试保存";
							 | 
						|
								    this.MagnifierLogoText = "测试截图";
							 | 
						|
								    this.WatermarkPictureType = "2|100|100|400|400|20";
							 | 
						|
								    this.WatermarkPicturePath = "";
							 | 
						|
								    this.WatermarkTextType = "2|100|100|100|40|20|0|150|30|80,55,55,55";
							 | 
						|
								    this.WatermarkTextValue = "";
							 | 
						|
								    this.NiuniuAuthKey = "";
							 | 
						|
								    this.ToolTipText = "";  //tipRectangle|tipCircle|tipArrow|tipBrush|tipGlitter|tipMosaic|tipText|tipUndo|tipSave|tipCancel|tipFinish|txtFinish
							 | 
						|
								    this.MoreInfo = "1,100|300|600";
							 | 
						|
									
							 | 
						|
								    this.useCustomizedProtoco = true;   //是否使用浏览器自定义协议加websocket 
							 | 
						|
								    
							 | 
						|
								    this.IsWaitCustomizedCallBack = false;
							 | 
						|
									this.autoConnectAfterPageLoad = true;
							 | 
						|
									this.IsFirstConnect = true;
							 | 
						|
									this.IsEverConnected = false;
							 | 
						|
									this.reconnectTryTime = 0;
							 | 
						|
									this.TimeIntervalID = -1;
							 | 
						|
									this.ReceivedEchoBack = false;
							 | 
						|
									
							 | 
						|
									this.Version = "1.0.0.0";
							 | 
						|
								    this.hostPort = "30101,30102";  
							 | 
						|
									this.hostPortIndex = 0;
							 | 
						|
								    this.CaptureName = "NiuniuCapture";  
							 | 
						|
								    this.NiuniuSocket = null;
							 | 
						|
								    this.connectState = emClosed;
							 | 
						|
								    
							 | 
						|
									this.SocketTimeStamp = new Date().getTime();
							 | 
						|
									this.TimeOutID = -1;
							 | 
						|
									
							 | 
						|
								    this.FinishedCallback = null;
							 | 
						|
								    this.PluginLoadedCallback = null;
							 | 
						|
								    this.VersionCallback = null;
							 | 
						|
									this.OnConnectFailed = function(isReconnect)
							 | 
						|
									{
							 | 
						|
										self.WriteLog(isReconnect ? "reconnect failed, the capture control process is exit." : "connect failed at the first time.");
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
								    this.LoadPlugin = function()
							 | 
						|
								    {
							 | 
						|
								        var obj = $('#capturecontainer');
							 | 
						|
								        if(obj.length < 1)
							 | 
						|
								        {
							 | 
						|
								            $("body").append('<div id="capturecontainer" style="height:0px;width:0px;"></div>');
							 | 
						|
								            obj = $('#capturecontainer');
							 | 
						|
								        }        
							 | 
						|
								        obj.html('');
							 | 
						|
								        obj.html('<object id="niuniuCapture" type="application/x-niuniuwebcapture" width="0" height="0"><param name="onload" value="onpluginLoaded" /></object>');
							 | 
						|
										
							 | 
						|
										var iframeObj = $('startCaptureFrame');
							 | 
						|
										if(iframeObj.length < 1)
							 | 
						|
										{
							 | 
						|
											$("body").append('<iframe id="startCaptureFrame" style="display:none;"></iframe>');			
							 | 
						|
										}
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    this.niuniuCapture = function ()
							 | 
						|
								    {
							 | 
						|
								        return document.getElementById('niuniuCapture');
							 | 
						|
								    }
							 | 
						|
								        
							 | 
						|
								    this.addEvent = function(obj, name, func)
							 | 
						|
								    {
							 | 
						|
								        if (obj.attachEvent) {
							 | 
						|
								            obj.attachEvent("on"+name, func);
							 | 
						|
								        } else {
							 | 
						|
								            obj.addEventListener(name, func, false); 
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    this.pluginValid = function()
							 | 
						|
								    {
							 | 
						|
								        try
							 | 
						|
								        {
							 | 
						|
								            if(self.niuniuCapture().valid)
							 | 
						|
								            {
							 | 
						|
								                return true;
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								        catch(e)
							 | 
						|
								        {
							 | 
						|
								        }
							 | 
						|
								        return false;        
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    this.OnCaptureFinished = function(x, y, width, height, content,localpath) 
							 | 
						|
								    {
							 | 
						|
									    self.OnCaptureFinishedEx(1, x, y, width, height, "", content,localpath);      
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    this.OnCaptureFinishedEx = function(type, x, y, width, height, info, content,localpath) 
							 | 
						|
								    {
							 | 
						|
								        //交给上层去处理截图完成后的事项 
							 | 
						|
								        if(self.FinishedCallback != null)
							 | 
						|
								        {
							 | 
						|
								            self.FinishedCallback(type, x, y, width, height, info, content,localpath);
							 | 
						|
								        }
							 | 
						|
								        else
							 | 
						|
								        {
							 | 
						|
								            alert("截图完成的事件未绑定,将不能对图片进行处理,请指定FinishedCallback回调函数");
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    this.pluginLoaded = function(fromWebsocket)
							 | 
						|
								    {
							 | 
						|
								        if(!fromWebsocket && !self.pluginValid())
							 | 
						|
								        {
							 | 
						|
								            if(self.PluginLoadedCallback != null)
							 | 
						|
								            {
							 | 
						|
								                self.PluginLoadedCallback(false);
							 | 
						|
								            }
							 | 
						|
								            return false;
							 | 
						|
								        }
							 | 
						|
										
							 | 
						|
										self.GetVersion();
							 | 
						|
								    	if(self.PluginLoadedCallback != null)
							 | 
						|
								        {
							 | 
						|
								            self.PluginLoadedCallback(true);
							 | 
						|
								        }
							 | 
						|
										
							 | 
						|
								        if(!self.pluginValid())
							 | 
						|
										{
							 | 
						|
											return false;
							 | 
						|
										}
							 | 
						|
								        //此函数必需调用,传递正确的参数,且必需先于其他函数调用  
							 | 
						|
								        self.niuniuCapture().InitCapture(self.NiuniuAuthKey); 
							 | 
						|
								        
							 | 
						|
								        self.niuniuCapture().InitParam(emPensize, self.PenSize);
							 | 
						|
								        self.niuniuCapture().InitParam(emDrawType, self.DrawType);
							 | 
						|
								        self.niuniuCapture().InitParam(emTrackColor, self.TrackColor);
							 | 
						|
								        self.niuniuCapture().InitParam(emEditBorderColor, self.EditBorderColor);
							 | 
						|
								        self.niuniuCapture().InitParam(emTransparent, self.Transparent);
							 | 
						|
								         
							 | 
						|
								        self.niuniuCapture().InitParam(emSetSaveName, self.SaveName);            
							 | 
						|
								        self.niuniuCapture().InitParam(emSetMagnifierLogoText, self.MagnifierLogoText);
							 | 
						|
								        self.niuniuCapture().InitParam(emSetMosaicType, self.MosaicType);
							 | 
						|
								        
							 | 
						|
								        //设置工具栏上的按钮TOOLTIP  
							 | 
						|
								        self.niuniuCapture().InitParam(emSetTooltipText, self.ToolTipText);
							 | 
						|
										
							 | 
						|
										//self.niuniuCapture().InitParam(emSetMoreInfo, self.MoreInfo);
							 | 
						|
								        //niuniuCapture().InitParam(23, "测试文字.");
							 | 
						|
								        //此BASE64字符串表示牛牛默认的水印图片,可以替换
							 | 
						|
								       // niuniuCapture().InitParam(21, "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");
							 | 
						|
								         //注:以上设置LOGO及保存名的接口,免费版本无效
							 | 
						|
								        
							 | 
						|
								        //添加控件的事件监听 
							 | 
						|
									    self.addEvent(self.niuniuCapture(), 'CaptureFinishedEx', self.OnCaptureFinishedEx);
							 | 
						|
									    //以下这个事件主要是用于兼容旧的浏览器控件的事件通知
							 | 
						|
									    self.addEvent(self.niuniuCapture(), 'CaptureFinished', self.OnCaptureFinished);
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    this.SetWatermarkPicture = function(watermarPicData)
							 | 
						|
								    {
							 | 
						|
								          self.WatermarkPicturePath = watermarPicData;
							 | 
						|
								          //设置测试的水印图片的Base64字符串,此操作应该是在页面加载中处理比较合适 
							 | 
						|
								          if(!self.pluginValid())
							 | 
						|
								            return;
							 | 
						|
								          self.niuniuCapture().InitParam(emSetWatermarkPicturePath, self.WatermarkPicturePath);        
							 | 
						|
								          self.niuniuCapture().InitParam(emSetWatermarkPictureType, self.WatermarkPictureType);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    this.SetWatermarkText = function(watermarkText)
							 | 
						|
								    {
							 | 
						|
								        self.WatermarkTextValue = watermarkText;
							 | 
						|
								        //设置测试的水印文字,此操作应该是在页面加载中处理比较合适 
							 | 
						|
								        if(!self.pluginValid())
							 | 
						|
								            return;
							 | 
						|
										//nShowType|nMinWidth|nMinHeight|nVerticalInterval|nOffset|nFontSize|nIsBold|nTextWidth|nTextHeight|colorText
							 | 
						|
										 self.niuniuCapture().InitParam(emSetWatermarkTextValue, self.WatermarkTextValue);
							 | 
						|
								         self.niuniuCapture().InitParam(emSetWatermarkTextType, self.WatermarkTextType);
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    
							 | 
						|
								    this.SavePicture = function(savename)
							 | 
						|
								    {
							 | 
						|
								         if(self.pluginValid())
							 | 
						|
								         {
							 | 
						|
								            self.niuniuCapture().SavePicture(savename);
							 | 
						|
								         }
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    this.GetCursorPosition = function()
							 | 
						|
								    {
							 | 
						|
								        if(self.pluginValid())
							 | 
						|
								        {
							 | 
						|
								            var val = self.niuniuCapture().GetCursorPosition();
							 | 
						|
								            return val;
							 | 
						|
								        }
							 | 
						|
								        return "";
							 | 
						|
								    }
							 | 
						|
								        
							 | 
						|
								    this.NewCaptureParamObject = function(defaultpath, hideCurrWindow, autoCaptureFlag, x, y, width, height)
							 | 
						|
								    {  
							 | 
						|
								        var obj = new Object(); 
							 | 
						|
								        obj.CmdType = 1;
							 | 
						|
								        obj.IsGBK = 0;				//是否是GBK编码,这样会涉及到编码转换  
							 | 
						|
								        obj.AuthKey = self.NiuniuAuthKey;  //						
							 | 
						|
									    obj.Pensize = self.PenSize;		//设置画笔大小
							 | 
						|
									    obj.DrawType = self.DrawType;			//设置是腾讯风格还是360风格
							 | 
						|
									    obj.TrackColor= self.TrackColor;		//自动识别的边框的颜色
							 | 
						|
									    obj.EditBorderColor= self.EditBorderColor;	//文本输入的边框颜色
							 | 
						|
									    obj.Transparent = self.Transparent;		//工具栏的透明度
							 | 
						|
									    obj.SetSaveName = self.SaveName;									//设置保存时的开始文字
							 | 
						|
									    obj.SetMagnifierLogoText = self.MagnifierLogoText;						//设置放大镜上的LOGO字符   
							 | 
						|
									    obj.SetWatermarkPictureTypeEx = self.WatermarkPictureType;						//设置水印的类型 
							 | 
						|
									    obj.SetWatermarkPicturePath = self.WatermarkPicturePath;						//设置水印的路径 
							 | 
						|
									    obj.SetWatermarkTextTypeEx=self.WatermarkTextType;							//设置水印文字的类型 
							 | 
						|
									    obj.SetWatermarkTextValue= self.WatermarkTextValue;						//设置水印文字
							 | 
						|
								        obj.MosaicType = self.MosaicType;          //设置马赛克的类型 
							 | 
						|
								        obj.SetToolbarText = self.ToolTipText;
							 | 
						|
								        obj.MoreInfo = this.MoreInfo;
							 | 
						|
									    //以下是截图时传递的参数 
							 | 
						|
									    obj.DefaultPath = defaultpath;
							 | 
						|
									    obj.HideCurrentWindow = hideCurrWindow;
							 | 
						|
									    obj.AutoCaptureFlag = autoCaptureFlag;
							 | 
						|
									    obj.x = x;
							 | 
						|
									    obj.y = y;
							 | 
						|
									    obj.Width = width;
							 | 
						|
									    obj.Height = height;
							 | 
						|
								        return obj; 
							 | 
						|
								    } 
							 | 
						|
								    
							 | 
						|
								    this.DoCapture = function(name, hide, AutoCapture, x, y, width, height)
							 | 
						|
								    {        
							 | 
						|
								        if(self.IsNeedCustomizedProtocol())
							 | 
						|
								        {
							 | 
						|
								             return self.DoCaptureForCustomize(name, hide, AutoCapture, parseInt(x), parseInt(y), parseInt(width), parseInt(height));
							 | 
						|
								        }
							 | 
						|
								                 
							 | 
						|
								        if(!self.pluginValid())
							 | 
						|
								        {
							 | 
						|
								            return emCaptureFailed;
							 | 
						|
								        }
							 | 
						|
								        self.niuniuCapture().Capture(name, hide, AutoCapture, x, y, width, height);
							 | 
						|
								        return emCaptureSuccess;            
							 | 
						|
								    }
							 | 
						|
								 
							 | 
						|
								    this.InitNiuniuCapture = function()
							 | 
						|
								    {
							 | 
						|
								        self.LoadPlugin();
							 | 
						|
									    setTimeout("captureObjSelf.InitWebSocketAndBindCallback();", 200);
							 | 
						|
								    }
							 | 
						|
								        
							 | 
						|
								    this.InitWebSocketAndBindCallback = function()
							 | 
						|
								    {
							 | 
						|
										if(!self.autoConnectAfterPageLoad || !self.IsNeedCustomizedProtocol())
							 | 
						|
										{
							 | 
						|
											return;
							 | 
						|
										}
							 | 
						|
									    self.connectHost();
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
									this.getNextPort = function()
							 | 
						|
									{
							 | 
						|
										//init port params flag
							 | 
						|
										//进行拆分处理 self.hostPort;
							 | 
						|
										var portArray = self.hostPort.split(",");
							 | 
						|
										if(portArray.length < 1)
							 | 
						|
										{
							 | 
						|
											alert("服务端口为空");
							 | 
						|
											return 30101;
							 | 
						|
										}
							 | 
						|
										if(self.hostPortIndex < 0)
							 | 
						|
										{
							 | 
						|
											self.hostPortIndex = 0;				
							 | 
						|
										}
							 | 
						|
										if(self.hostPortIndex > portArray.length - 1)
							 | 
						|
										{
							 | 
						|
											self.hostPortIndex = portArray.length - 1;				
							 | 
						|
										}
							 | 
						|
										var nPort = parseInt(portArray[self.hostPortIndex]);
							 | 
						|
										self.hostPortIndex++;
							 | 
						|
										if(self.hostPortIndex > portArray.length - 1)
							 | 
						|
										{
							 | 
						|
											self.hostPortIndex = 0;				
							 | 
						|
										}	
							 | 
						|
										return nPort;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
								    this.connectHost = function()
							 | 
						|
								    {
							 | 
						|
											if(self.NiuniuSocket != null)
							 | 
						|
											{
							 | 
						|
												self.WriteLog("connectHost NiuniuSocket is not null, return.");
							 | 
						|
												return;
							 | 
						|
											}
							 | 
						|
											clearTimeout(self.TimeOutID);
							 | 
						|
											self.connectState = emConnecting;
							 | 
						|
											
							 | 
						|
											
							 | 
						|
											try{
							 | 
						|
												var wshosts = ['127.0.0.1', 'localhost'];
							 | 
						|
												for (var i in wshosts) {
							 | 
						|
													try{
							 | 
						|
														var host = "ws://127.0.0.1:" + self.getNextPort() + "/" + self.CaptureName;
							 | 
						|
														self.NiuniuSocket = new WebSocket(host);
							 | 
						|
														break;
							 | 
						|
													}
							 | 
						|
													catch(ee){
							 | 
						|
														var ggg= 0;
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
																
							 | 
						|
												//OutputLog('Socket Status: '+socket.readyState);
							 | 
						|
												self.NiuniuSocket.onopen = function(evt){					
							 | 
						|
													self.NiuniuSocket.send('0' + self.SocketTimeStamp);
							 | 
						|
													self.WriteLog("NiuniuSocket.onopen.");
							 | 
						|
													clearTimeout(self.TimeOutID);
							 | 
						|
												}
							 | 
						|
												
							 | 
						|
												self.NiuniuSocket.onmessage = function(msg){
							 | 
						|
													var str = "";
							 | 
						|
													str = msg.data;
							 | 
						|
													var id  = str.substr(0, 1);
							 | 
						|
													var arg1 = str.substr(1);
							 | 
						|
													clearTimeout(self.TimeOutID);
							 | 
						|
													if(id == "0"){
							 | 
						|
														self.hostPortIndex--;
							 | 
						|
														//表示连接成功,此时应该提示可以截图了 
							 | 
						|
														self.connectState = emConnected;
							 | 
						|
														self.pluginLoaded(true);
							 | 
						|
														self.IsEverConnected = true;
							 | 
						|
														self.IsFirstConnect = false;
							 | 
						|
														if(self.IsWaitCustomizedCallBack)
							 | 
						|
														{
							 | 
						|
														    setTimeout("captureObjSelf.SendReadyRecvData();", 3);
							 | 
						|
														}
							 | 
						|
														self.WriteLog("connect sucess.");
							 | 
						|
														self.ReceivedEchoBack = true;
							 | 
						|
														clearInterval(self.TimeIntervalID);
							 | 
						|
														self.TimeIntervalID = setInterval("captureObjSelf.LoopEchoMessage()", 3000);
							 | 
						|
													}
							 | 
						|
													if(id == "1"){
							 | 
						|
														//解析消息 
							 | 
						|
														var _aoResult = eval("(" + arg1 + ")");
							 | 
						|
														self.ReceivedEchoBack = true;
							 | 
						|
														if(_aoResult.command == "echo")
							 | 
						|
														{					
							 | 
						|
															self.WriteLog("received echo");
							 | 
						|
															return;
							 | 
						|
														}
							 | 
						|
														self.WriteLog("received capturedata.");
							 | 
						|
														if(_aoResult.command == "version")
							 | 
						|
														{
							 | 
						|
															self.WriteLog(_aoResult.Ver);
							 | 
						|
															self.VersionCallback(_aoResult.Ver);
							 | 
						|
														}
							 | 
						|
														else{
							 | 
						|
															self.OnCaptureFinishedEx(_aoResult.Type, _aoResult.x, _aoResult.y, _aoResult.Width, _aoResult.Height, _aoResult.Info, _aoResult.Content, _aoResult.LocalPath);						
							 | 
						|
														}
							 | 
						|
													}														
							 | 
						|
												}
							 | 
						|
												
							 | 
						|
												self.NiuniuSocket.onclose = function(evt){
							 | 
						|
													self.OnWebSocketError("self.NiuniuSocket.onclose." + evt.data);
							 | 
						|
												}	
							 | 
						|
												self.NiuniuSocket.onerror = function (evt) {					
							 | 
						|
													//self.OnWebSocketError("self.NiuniuSocket.onerror." + evt.data);
							 | 
						|
												  };
							 | 
						|
													
							 | 
						|
											} catch(e){
							 | 
						|
												self.OnWebSocketError("connect exception." + e.message);
							 | 
						|
											}
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
									this.WriteLog = function(txt)
							 | 
						|
									{
							 | 
						|
										//写日志 
							 | 
						|
										try{
							 | 
						|
											console.log(txt);
							 | 
						|
										}
							 | 
						|
										catch(e)
							 | 
						|
										{
							 | 
						|
											
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									this.OnWebSocketError = function(type)
							 | 
						|
									{		
							 | 
						|
										//如果不处于连接成功状态,说明不是断开连接,而是连接失败 
							 | 
						|
										var isConnectedFailed = false;
							 | 
						|
										if(self.connectState != emConnected)
							 | 
						|
										{
							 | 
						|
											isConnectedFailed = true;
							 | 
						|
										}
							 | 
						|
										self.WriteLog(type);
							 | 
						|
										self.ReceivedEchoBack = false;
							 | 
						|
										self.connectState = emClosed;		
							 | 
						|
										
							 | 
						|
										if(self.NiuniuSocket != null)
							 | 
						|
										{
							 | 
						|
											self.NiuniuSocket.close();
							 | 
						|
										}
							 | 
						|
										
							 | 
						|
										self.NiuniuSocket = null;
							 | 
						|
										clearTimeout(self.TimeOutID);
							 | 
						|
										clearInterval(self.TimeIntervalID);
							 | 
						|
										
							 | 
						|
										if(isConnectedFailed)
							 | 
						|
										{
							 | 
						|
											if(self.IsFirstConnect)
							 | 
						|
											{
							 | 
						|
												self.IsFirstConnect = false;
							 | 
						|
												if(self.OnConnectFailed != null)
							 | 
						|
												{
							 | 
						|
													self.OnConnectFailed(false);	
							 | 
						|
												}
							 | 
						|
												return;
							 | 
						|
											}
							 | 
						|
											
							 | 
						|
											if(self.IsEverConnected)
							 | 
						|
											{
							 | 
						|
												self.reconnectTryTime++;
							 | 
						|
												//通知连接连接断开
							 | 
						|
												if(self.reconnectTryTime > 3)
							 | 
						|
												{
							 | 
						|
													self.IsEverConnected = false;
							 | 
						|
													self.reconnectTryTime = 0;
							 | 
						|
													if(self.OnConnectFailed != null)
							 | 
						|
													{
							 | 
						|
														self.OnConnectFailed(true);	
							 | 
						|
													}			
							 | 
						|
													return;
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										
							 | 
						|
										self.TimeOutID = setTimeout("captureObjSelf.connectHost();", 800);
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									this.LoopEchoMessage = function()
							 | 
						|
									{
							 | 
						|
										if(!self.ReceivedEchoBack)
							 | 
						|
										{
							 | 
						|
											self.OnWebSocketError("this.LoopEchoMessage, !self.ReceivedEchoBack");
							 | 
						|
											self.ReceivedEchoBack = false;
							 | 
						|
											clearInterval(self.TimeIntervalID);
							 | 
						|
											self.TimeIntervalID = setInterval("captureObjSelf.LoopEchoMessage()", 3000);
							 | 
						|
											return;
							 | 
						|
										}
							 | 
						|
										self.ReceivedEchoBack = false;
							 | 
						|
										clearTimeout(self.TimeOutID);
							 | 
						|
										if(self.connectState != emConnected)
							 | 
						|
										{
							 | 
						|
											clearInterval(self.TimeIntervalID);
							 | 
						|
											return;
							 | 
						|
										}		
							 | 
						|
										var obj = new Object(); 
							 | 
						|
										obj.command = "echo";
							 | 
						|
										self.NiuniuSocket.send("1" + encodeURIComponent( $.toJSON(obj)) );		
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
								    this.SendReadyRecvData = function()
							 | 
						|
								    {
							 | 
						|
										self.WriteLog("SendReadyRecvData.");
							 | 
						|
								        var obj = self.NewCaptureParamObject("", 0, 0, 0, 0, 0, 0);
							 | 
						|
										obj.CmdType = -1;
							 | 
						|
										self.NiuniuSocket.send("1" + encodeURIComponent( $.toJSON(obj)) );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    this.DoCaptureForCustomize = function(name, hide, AutoCapture, x, y, width, height)
							 | 
						|
								    {
							 | 
						|
								        var obj = self.NewCaptureParamObject(name, hide, AutoCapture, x, y, width, height);
							 | 
						|
									    try
							 | 
						|
									    {
							 | 
						|
								    		//启动客户端,或者通过websocket去发送数据   
							 | 
						|
								    		if(self.connectState == emConnected)
							 | 
						|
								    		{
							 | 
						|
												var json = $.toJSON(obj);
							 | 
						|
								    		    self.NiuniuSocket.send('1' + encodeURIComponent(json) );
							 | 
						|
								    		}
							 | 
						|
										    else
							 | 
						|
										    {
							 | 
						|
												//首次启动时,不支持水印,否则会过长 
							 | 
						|
												obj.SetWatermarkPicturePath = "";
							 | 
						|
												//obj.SetWatermarkTextValue = "";	
							 | 
						|
												var json = $.toJSON(obj);
							 | 
						|
												self.WriteLog(json.length);
							 | 
						|
												var newUrl = self.CaptureName + "://" + encodeURIComponent(json);
							 | 
						|
												self.WriteLog(newUrl.length);
							 | 
						|
												
							 | 
						|
										        //启动客户端  
							 | 
						|
												$('#startCaptureFrame').attr('src', newUrl);
							 | 
						|
										        
							 | 
						|
										        self.IsWaitCustomizedCallBack = true;
							 | 
						|
												self.connectHost();
							 | 
						|
												return emCaptureUnknown;
							 | 
						|
										    }
							 | 
						|
										    
							 | 
						|
									        return emCaptureSuccess;
							 | 
						|
									    }
							 | 
						|
									    catch(e)
							 | 
						|
									    {
							 | 
						|
								    		alert(e.message);
							 | 
						|
									    }  
							 | 
						|
									    return emCaptureUnknown;       
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    
							 | 
						|
								    this.IsNeedCustomizedProtocol = function()
							 | 
						|
								    {
							 | 
						|
										if(isMacintosh())
							 | 
						|
										{
							 | 
						|
											return true;
							 | 
						|
										}
							 | 
						|
								        if(!self.useCustomizedProtoco)
							 | 
						|
								        {
							 | 
						|
								            return false;
							 | 
						|
								        }
							 | 
						|
								        
							 | 
						|
								        if(self.pluginValid())
							 | 
						|
								        {
							 | 
						|
								            return false;
							 | 
						|
								        }
							 | 
						|
								        
							 | 
						|
								        try
							 | 
						|
								        {
							 | 
						|
								            var agent = window.navigator.userAgent.toLowerCase();       
							 | 
						|
											var isIE = agent.indexOf("compatible") > -1 && agent.indexOf("msie") > -1;
							 | 
						|
											if(isIE)
							 | 
						|
											{
							 | 
						|
												return false;
							 | 
						|
											}
							 | 
						|
											
							 | 
						|
											var isIE11 = agent.indexOf('trident') > -1 && agent.indexOf("rv:11.0") > -1;
							 | 
						|
											if(isIE11)
							 | 
						|
											{
							 | 
						|
												return false;
							 | 
						|
											}
							 | 
						|
								            var isQQBrowser = agent.indexOf("qqbrowser") != -1;
							 | 
						|
								            //if(isQQBrowser)
							 | 
						|
								            //{
							 | 
						|
								            //    return false;
							 | 
						|
								            //}
							 | 
						|
											var isUBrowser = agent.indexOf("ubrowser") != -1;
							 | 
						|
											if(isUBrowser)
							 | 
						|
								            {
							 | 
						|
								                return false;
							 | 
						|
								            }
							 | 
						|
											
							 | 
						|
								            //如果是firefox 且在50版本以上,则需要             
							 | 
						|
											var isFirefox = agent.indexOf("firefox") != -1;
							 | 
						|
											if(isFirefox)
							 | 
						|
								            {
							 | 
						|
								                return true;
							 | 
						|
								            }
							 | 
						|
											
							 | 
						|
											var isEdge = agent.indexOf("edge") != -1;
							 | 
						|
											if(isEdge)
							 | 
						|
								            {
							 | 
						|
								                return true;
							 | 
						|
								            }
							 | 
						|
											
							 | 
						|
								            var isChrome = agent.indexOf("chrome") != -1;
							 | 
						|
								            if(isChrome)
							 | 
						|
								            {
							 | 
						|
												return true;
							 | 
						|
								            }
							 | 
						|
								            return false;
							 | 
						|
								        }
							 | 
						|
								        catch(e)
							 | 
						|
								        {
							 | 
						|
											self.WriteLog("IsNeedCustomizedProtocol exception: " + e.message);
							 | 
						|
								        }
							 | 
						|
								        return true;    
							 | 
						|
								    }
							 | 
						|
									
							 | 
						|
									this.GetVersion = function()
							 | 
						|
									{
							 | 
						|
								        if(self.IsNeedCustomizedProtocol())
							 | 
						|
								        {
							 | 
						|
											if(self.connectState != emConnected)
							 | 
						|
											{
							 | 
						|
												return;
							 | 
						|
											}		
							 | 
						|
											var obj = new Object(); 
							 | 
						|
											obj.command = "version";
							 | 
						|
											self.NiuniuSocket.send("1" + encodeURIComponent( $.toJSON(obj)) );
							 | 
						|
											return;
							 | 
						|
								        }
							 | 
						|
								                 
							 | 
						|
								        if(!self.pluginValid())
							 | 
						|
								        {
							 | 
						|
								            return;
							 | 
						|
								        }
							 | 
						|
								        var verSion = self.niuniuCapture().GetVersion();
							 | 
						|
										self.VersionCallback(verSion);
							 | 
						|
										self.WriteLog(verSion);
							 | 
						|
									}
							 | 
						|
								}
							 |