/************************************************************************/ /* MainPlugin 回调函数 /************************************************************************/ var VideoPluginReconnectTimeout = 5000; // 断开重新连接时间 var VideoPluginReconnectTimeoutId = null; // 重新连接超时ID //Firefox,Chrome中,回调函数名的字符串中不能出现“.”,否则插件无法识别,不能正确回调 function VideoPluginNotify(strXMLFormat, lStrLen) { var $xmlDoc = $(CommonFunctions.XMLStr2XMLDoc(strXMLFormat)); if ($("statenotify[type='NVMS_NAT_CMD']", $xmlDoc).length > 0) { //console.log("recive from: " + CMD_QUEUE.currentCmd.cmd); //console.log("recive data: " + strXMLFormat); var $response = $("statenotify[type='NVMS_NAT_CMD']>response", $xmlDoc); var $request = $("cmd[type='NVMS_NAT_CMD']>request", $(CommonFunctions.XMLStr2XMLDoc(CMD_QUEUE.currentCmd.cmd))), curCmdUrl = $request.attr("url"), curCmdFlay = $request.attr("flag"); if ($response.attr("flag") == curCmdFlay && $response.attr("url") == curCmdUrl) { try { CMD_QUEUE.unLock(); if (CMD_QUEUE.currentCmd) { clearTimeout(CMD_QUEUE.currentCmd.timeoutId); //result, textStatus, jqXHR CMD_QUEUE.currentCmd.DFD.resolve($response,"",{}); } }catch (ex){ }finally { CMD_QUEUE._queue.shift(); CMD_QUEUE.currentCmd = null; CMD_QUEUE.execute(); } } } //OCX已创建好窗口,通知可以登录了 else if ($("statenotify[type='InitialComplete']", $xmlDoc).length > 0) { //console.log("InitialComplete"); Plugin.SetVideoPluginStatus("InitialComplete"); Plugin.VideoPluginLogin(false); } //连接成功 else if ($("statenotify[type='connectstate']", $xmlDoc).length > 0) { //console.log("Connected"); var $xmlNote = $("statenotify[type='connectstate']", $xmlDoc); var status = $.trim($xmlNote.text()); if (status == "success") { Plugin.SetVideoPluginStatus("Connected"); if(Plugin.GetIsReconn()){ Loading.Hide(); var callBack = Plugin.GetReconnCallBack(); if (callBack) callBack(); Plugin.SetIsReconn(false); Plugin.SetReconnCallBack(null); } else { if (APP_TYPE == "P2P") { Loading.Hide(); if (VideoPluginReconnectTimeoutId != null) {// 重新连接成功,隐藏“加载中”状态 clearTimeout(VideoPluginReconnectTimeoutId); VideoPluginReconnectTimeoutId = null; } else { $.webSession('loginLock', null); $.webSession('loginLockCount', null); //DVR_TRUNK 1.3.0.15513B180416.D04.U1(16A41T) var reg1_3 = /^((?:\d+\.){3}\d+)b(?:[^\.]+\.)([^\.]+)\.(\w+)(?:\(\d+([a-z]).+\)).*$/; //"1.3.0.11127B171113.D02.U1(16A41T).bata" var reg1_2 = /^((?:\d+\.){3}\d+)r\d+\.b(?:[^\.]+\.){2}([^\.]+)\.(\w+)(?:\(\d+([a-d]).+\)).*$/; //"1.2.4.0R0.B171117b.0.N0I.U1(16A84G)" $.when( Plugin.P2pCmdSender.add(Communication.GetEmptyRequest("queryBasicCfg")).DFD, Plugin.P2pCmdSender.add(Communication.GetEmptyRequest("querySystemCaps")).DFD ).then( //doneFilter function (r_queryBasicCfg, r_querySystemCaps) { //从1.3.0开始,NVR和DVR代码分离,DVR进入[dvr]目录 var dvrForkVersion = [1, 3, 0, 0]; //从1.3.4开始,DVR不区分H264, H265,DVR进入[dvr/h265]目录 var dvrAllH265Version = [1, 3, 4, 0]; //模拟通道数量大于0为DVR,否则为NVR var analogChlCount = $("response>content>analogChlCount", r_querySystemCaps[0]).text() * 1; var infoArr = null; var infoStr = $("response>content>softwareVersion", r_queryBasicCfg[0]).text().toLowerCase(); var packageType = ""; if (reg1_3.test(infoStr)) { infoArr = infoStr.match(reg1_3); } else if (reg1_2.test(infoStr)) { infoArr = infoStr.match(reg1_2); } var enterCurrentSite = false; if (infoArr && infoArr.length == 5) { packageType = infoArr[2].toUpperCase(); var softVersion = infoArr[1], ui = infoArr[3] + infoArr[4]; var versionArr = softVersion.split("."); var DvrH264PkgIdList = ["D00", "D01", "D02", "D12", "D42", "D52"]; var siteRoot = N9K_P2P_ROOT; var siteDict = N9K_P2P_SITE_DICT; //如果版本号大于或等于 dvrForkVersion,且为dvr,就在DVR支持的站点版本列表中查找 var isDvrFork = (compareVersion(versionArr, dvrForkVersion) >= 0); var isDvr = analogChlCount > 0; var isDvrAllH265 = (compareVersion(versionArr, dvrAllH265Version) >= 0); var isDvrH264 = $.inArray(packageType, DvrH264PkgIdList) != -1; if (isDvrFork) { if (isDvr) { if (!isDvrAllH265 && isDvrH264) { siteRoot = N9K_P2P_ROOT_DVR_H264; siteDict = N9K_P2P_SITE_DICT_DVR_H264; } else { siteRoot = N9K_P2P_ROOT_DVR_H265; siteDict = N9K_P2P_SITE_DICT_DVR_H265; } } else { siteRoot = N9K_P2P_ROOT_NVR; siteDict = N9K_P2P_SITE_DICT_NVR; } } var i = 0; for (; i < siteDict.length; i++) { var siteVersionArr = siteDict[i]["version"].split("_"); if (compareVersion(versionArr, siteVersionArr) >= 0) { break; } } //低于支持P2P 2.0支持的最低版本的设备,访问P2P 1.0客户端,在1_1目录下 if (i >= siteDict.length) { window.location.href = N9K_P2P_ROOT + "1_1/index.htm"; } else { var targetSite = siteDict[i]; var p2pPath = window.location.pathname; if (isDvrFork) { if (isDvr) { var reg = /^(?:\/([^\/]+))(?:\/([^\/]+))(?:\/([^\/]+))(?:\/([^\/]+))(?:\/([^\/]+)).*$/; var p2pPathArr = p2pPath.match(reg); //目标网站版本和当前网站版本匹配,且目标UI和当前网站UI匹配,直接进入 if (p2pPathArr.length == 6 && "dvr" === p2pPathArr[2] && (isDvrH264 && p2pPathArr[3] == "h264" || (isDvrAllH265 || !isDvrH264) && p2pPathArr[3] == "h265") && targetSite["version"] === p2pPathArr[4] && ui === p2pPathArr[5]) { enterCurrentSite = true; } else { //进入目标网站版本下的目标UI,如果目标UI不存在,则进入第一个支持的ui if ($.inArray(ui, targetSite["ui"]) == -1) { if (p2pPathArr[4] == targetSite["version"] && p2pPathArr[5] == targetSite["ui"][0]) enterCurrentSite = true; else window.location.href = siteRoot + targetSite["version"] + "/" + targetSite["ui"][0] + "/index.html"; } else window.location.href = siteRoot + targetSite["version"] + "/" + ui + "/index.html"; } } else{ var reg = /^(?:\/([^\/]+))(?:\/([^\/]+))(?:\/([^\/]+))(?:\/([^\/]+)).*$/; var p2pPathArr = p2pPath.match(reg); //目标网站版本和当前网站版本匹配,且目标UI和当前网站UI匹配,直接进入 if (p2pPathArr.length == 5 && "nvr" === p2pPathArr[2] && targetSite["version"] === p2pPathArr[3] && ui === p2pPathArr[4]) { enterCurrentSite = true; } else { //进入目标网站版本下的目标UI,如果目标UI不存在,则进入第一个支持的ui if ($.inArray(ui, targetSite["ui"]) == -1) { if (p2pPathArr[3] == targetSite["version"] && p2pPathArr[4] == targetSite["ui"][0]) enterCurrentSite = true; else window.location.href = siteRoot + targetSite["version"] + "/" + targetSite["ui"][0] + "/index.html"; } else window.location.href = siteRoot + targetSite["version"] + "/" + ui + "/index.html"; } } } else { var reg = /^(?:\/([^\/]+))(?:\/([^\/]+))(?:\/([^\/]+)).*$/; var p2pPathArr = p2pPath.match(reg); //debugger; //目标网站版本和当前网站版本匹配,且目标UI和当前网站UI匹配,直接进入 if (p2pPathArr.length == 4 && targetSite["version"] === p2pPathArr[2] && ui === p2pPathArr[3]) { enterCurrentSite = true; } else { //进入目标网站版本下的目标UI,如果目标UI不存在,则进入第一个支持的ui if ($.inArray(ui, targetSite["ui"]) == -1) { if (p2pPathArr[2] == targetSite["version"] && p2pPathArr[3] == targetSite["ui"][0]) enterCurrentSite = true; else window.location.href = siteRoot + targetSite["version"] + "/" + targetSite["ui"][0] + "/index.html"; } else window.location.href = siteRoot + targetSite["version"] + "/" + ui + "/index.html"; } } } } else {//软件版本信息不符合规则的,访问P2P 1.0客户端 window.location.href = N9K_P2P_ROOT + "1_1/index.htm"; } if (enterCurrentSite) { //初始化多语言翻译模块 LangCtrl.Init(null, function () { $("#InitialView").hide(); var sendXML = OCX_XML_SetLang(); Plugin.GetVideoPlugin().ExecuteCmd(sendXML, sendXML.length); //初始化路由模块,默认界面:live Route.Init('live'); //执行标准客户端的登录流程 var userInfoArr = CommonFunctions.GetAuthInfo(); $("#topUserName").html(WidgetBase.ReplaceWithEntity(userInfoArr[0])); var sendXml = Communication.GetEmptyRequest("doLogin"); Communication.Request({ url: "doLogin", data: sendXml, checkCommonErrorSwitch: false }).done(function (result) { if ($("response>status", result).text() == "success") { $.cookie('lastSN', userInfoArr[2], {expires: 36500}); $.webSession("userId", $("response>content>userId", result).text()); $.webSession("rwKey", $("response>content>rwKey", result).text()); $.webSession("facePersonnalInfoMgr", $("response>content>systemAuth>facePersonnalInfoMgr", result).text()); $.webSession("authGroupId", $("response>content>authGroupId", result).text()); $.webSession("allowModifyPassword", $("response>content>modifyPassword", result).text()); $.webSession("adminName", $("response>content>adminName", result).text() || "admin"); $.webSession("resetPassword", $("response>content>resetPassword", result).text() || "MTIzNDU2"); if ($.trim(userInfoArr[0]) == $.webSession("adminName") && userInfoArr[1] == CharsetHelper.Decode64($.webSession("resetPassword"))) { $.webSession('defaultPwd', true); } else { $.webSession('defaultPwd', false); } $.webSession('isChangedPwd', false); $.webSession("pwdSaftyStrength",CommonFunctions.CheckPwdSaftyStrength(userInfoArr[1])); $.webSession("pwdExpired",$("response>content>passwordExpired", result).text()=="true"); CommonFunctions.InitSystemAuth(result); Communication.Request({ url: "querySystemCaps", data: Communication.GetEmptyRequest("querySystemCaps"), checkCommonErrorSwitch: false }).done(function (sysCapsResult) { $.webSession("analogChlCount", $("response>content>analogChlCount", sysCapsResult).text()); $.webSession("ipChlMaxCount", $("response>content>ipChlMaxCount", sysCapsResult).text()); if (!$.webSession("calendarType")) { $.webSession("calendarType", "Gregorian"); } Route.NavToInitUrl(); }); } else { Route.Logout(); } }); }); } }, //failFilter function () { }); } } } } else { Plugin.SetVideoPluginStatus("Disconnected"); if (Plugin.GetIsReconn()) { setTimeout(function () { Plugin.VideoPluginLogin(); }, 5000); } else { if (APP_TYPE == "P2P") { var errorCode = $("statenotify>errorCode", $xmlDoc).text(); var errorMsg = ""; if (errorCode) { switch (errorCode) { case "536870931": //SN掉线,重新连接 Plugin.SetVideoPluginStatus("Reconnecting"); Loading.Show(); VideoPluginReconnectTimeoutId = setTimeout(function () { Plugin.VideoPluginLogin(); }, VideoPluginReconnectTimeout); return; case "536870935": //SN不在线 errorMsg = getPluginLoadLang("IDCS_LOGIN_FAIL_REASON_DEV_OFFLINE"); break; case "536870947": case "536870948": case "536870951": errorMsg = getPluginLoadLang("IDCS_LOGIN_FAIL_REASON_U_P_ERROR"); break; //case "536870951": // errorMsg = getPluginLoadLang("IDCS_LOGIN_FAIL_USER_LOCKED"); // break; case "536870953": errorMsg = getPluginLoadLang("IDCS_LOGIN_FAIL_USER_LIMITED_TELNET"); break; default: errorMsg = getPluginLoadLang('IDCS_UNKNOWN_ERROR_CODE') + errorCode; } } else { errorMsg = getPluginLoadLang('IDCS_UNKNOWN_ERROR_CODE'); } //alert(errorMsg); Route.Logout(errorCode); } } } } VideoPluginNotify.notify.emit($xmlDoc, strXMLFormat); } function compareVersion(var1Arr, var2Arr) { for (var i = 0; i < var1Arr.length; i++) { if (var1Arr[i] * 1 > var2Arr[i] * 1) { return 1; } else if (var1Arr[i] * 1 == var2Arr[i] * 1) { continue; } else { return -1; } } return 0; } var videoPluginLoginForStandard_timeoutId = null; //标准客户端插件登录 //初始化成功后,检测到客户端登录成功后,插件立即登录 function videoPluginLoginForStandard() { var userInfoArr = CommonFunctions.GetAuthInfo(); if (userInfoArr != null) { if (videoPluginLoginForStandard_timeoutId != null) { clearTimeout(videoPluginLoginForStandard_timeoutId); videoPluginLoginForStandard_timeoutId = null; } if (!pluginPort) { //跳转初始页面前,获取OCX请求视频端口,只请求一次,全局保存 CommonFunctions.GetPort(function (port) { pluginPort = port; _videoPluginLoginForStandard(userInfoArr); }); } else { _videoPluginLoginForStandard(userInfoArr); } } else { videoPluginLoginForStandard_timeoutId = setTimeout(videoPluginLoginForStandard, 500); } } function _videoPluginLoginForStandard(userInfoArr) { var username = userInfoArr[0]; var password = userInfoArr[1]; var id = ""; var sendXML = OCX_XML_SetLoginInfo(username, password, serverIp, pluginPort, id); Plugin.GetVideoPlugin().ExecuteCmd(sendXML, sendXML.length); } function TimeSliderPluginNotify(strXMLFormat, lStrLen) { var $xmlDoc = $(CommonFunctions.XMLStr2XMLDoc(strXMLFormat)); TimeSliderPluginNotify.notify.emit($xmlDoc, strXMLFormat); } //命令发送队列 var CMD_QUEUE = { viewFlag: 1,//当页面切换后,该flag加1,OCX将不会处理上一个页面的请求 currentCmd: null, _queue: [], //{ cmd: string } _lock: false, //锁定标识:当前命令没有返回时,不能发送新的命令 _timeout: 60000, //命令超时时长,如果一个命令发出后,在_timeout时间内没返回,就认为超时 add: function (cmd) { if (CMD_QUEUE._queue.length > 10000) { throw "CMD_QUEUE is full"; } var cmdObj = new CmdDeferred(cmd); CMD_QUEUE._queue.push(cmdObj); if (CMD_QUEUE._queue.length == 1 && !CMD_QUEUE._lock) { setTimeout(CMD_QUEUE.execute, 10); } return cmdObj; }, execute: function () { if (CMD_QUEUE._queue.length == 0 || CMD_QUEUE._lock) { return; } CMD_QUEUE._lock = true; var cmdItem = CMD_QUEUE._queue[0]; CMD_QUEUE.currentCmd = cmdItem; //console.log(cmdItem.cmd); Plugin.GetVideoPlugin().ExecuteCmd(cmdItem.cmd, cmdItem.cmd.length); cmdItem.timeoutId = setTimeout(function () { if (CMD_QUEUE.currentCmd) { CMD_QUEUE._queue.shift(); CMD_QUEUE._lock = false; CMD_QUEUE.currentCmd.DFD.reject(); if (CMD_QUEUE._queue.length > 0) { CMD_QUEUE.execute(); } } }, CMD_QUEUE._timeout); }, unLock: function () { CMD_QUEUE._lock = false; }, clear: function () { CMD_QUEUE.currentCmd = null; CMD_QUEUE._queue.length = 0; CMD_QUEUE._lock = false; } }; function CmdDeferred(cmd) { this.DFD = $.Deferred(); this.cmd = cmd; } define(['jquery', 'CommonFunctions', 'dialog', 'Route', 'loading', 'widget.base', 'OCXCommon'], function () { var videoPlugin = null;//主视频插件 var videoPluginStatus = "Unloaded";//Unloaded, Loaded, InitialComplete, Connected, Disconnected, Reconnecting var timeSliderPluginStatus = "Unloaded";//Unloaded, Loaded, InitialComplete, Connected, Disconnected, Reconnecting var timeSliderPlugin; //主视频插件 var isReconn = false;//登录是否为重连 var reconCallBack;//重连回调函数 function getVideoPluginStatus() { return videoPluginStatus; } function setVideoPluginStatus(value) { return videoPluginStatus = value; } function getTimeSliderPluginStatus() { return timeSliderPluginStatus; } function setTimeSliderPluginStatus(value) { return timeSliderPluginStatus = value; } function iniVideoPlugin() { if (videoPlugin != null) return videoPlugin; videoPlugin = LoadPlugin($("body"), "VideoPlugin"); VideoPluginNotify.notify = WidgetBase.CreateEvent("notify"); if (videoPlugin) { setVideoPluginStatus("Loaded"); //设置OCX模式 try { //FOR MAC if (osType == "mac") { videoPlugin.LiveNotify2Js = VideoPluginNotify; } if (APP_TYPE === "P2P") { var sendXML = OCX_XML_Initial_P2P('Interactive', 'VideoPluginNotify', "Live", 1, natIp, natPort); videoPlugin.ExecuteCmd(sendXML, sendXML.length); } else { var sendXML = OCX_XML_Initial('Interactive', 'VideoPluginNotify', "Live"); videoPlugin.ExecuteCmd(sendXML, sendXML.length); } sendXML = OCX_XML_SetProperty({calendarType: $.webSession("calendarType"), supportRecStatus: true}); videoPlugin.ExecuteCmd(sendXML, sendXML.length); } catch (ex) { } var sendXML = OCX_XML_SetLang(); videoPlugin.ExecuteCmd(sendXML, sendXML.length); } } function initTimeSliderPlugin() { if (timeSliderPlugin != null) return timeSliderPlugin; timeSliderPlugin = LoadPlugin($("body"), "TimeSliderPlugin"); TimeSliderPluginNotify.notify = WidgetBase.CreateEvent("notify"); if (timeSliderPlugin) { setTimeSliderPluginStatus("Loaded"); //设置OCX模式 try { if (APP_TYPE === "P2P") { var sendXML = OCX_XML_Initial_P2P('Interactive', 'TimeSliderPluginNotify', "TimeSlider", 1, natIp, natPort); timeSliderPlugin.ExecuteCmd(sendXML, sendXML.length); } else { var sendXML = OCX_XML_Initial('Interactive', 'TimeSliderPluginNotify', "TimeSlider"); timeSliderPlugin.ExecuteCmd(sendXML, sendXML.length); } var sendXML = OCX_XML_SetProperty({ calendarType: $.webSession("calendarType")}); timeSliderPlugin.ExecuteCmd(sendXML, sendXML.length); sendXML = OCX_XML_SetProperty({supportIntelligent: $.webSession("ipChlMaxCount") * 1 > 0}); timeSliderPlugin.ExecuteCmd(sendXML, sendXML.length); } catch (ex) { } } } function videoPluginLogin() { if (APP_TYPE === "P2P") { //登陆页将登陆信息存储在localStorage内 if(!$.webSession('auInfo_N9K')&&$.webSession('auInfo_N9K')!="null"){ var storage=window.localStorage; var txtUserName=$.trim(storage.txtUserName); var txtPassword=$.trim(storage.txtPassword); var txtSN=$.trim(storage.txtSN); var AuthorizationBasic = txtUserName + ":" + txtPassword + ":"+ txtSN; var auInfo_N9K=CharsetHelper.Encode64(AuthorizationBasic); $.webSession('auInfo_N9K',auInfo_N9K); $.webSession('auInfo',auInfo_N9K); storage.removeItem("txtUserName"); storage.removeItem("txtPassword"); storage.removeItem("txtSN"); } // //从P2PWeb服务返回的cookie,存在sessionStorage // if (!$.webSession('auInfo_N9K') && $.cookie('auInfo_N9K')) { // $.webSession('auInfo_N9K', $.cookie('auInfo_N9K')); // $.cookie('auInfo_N9K', null); // } var userInfoArr = CommonFunctions.GetAuthInfo(); if (userInfoArr != null) { var pwd = userInfoArr[1]; var sendXML = OCX_XML_SetLoginInfo_P2P(userInfoArr[0], pwd, userInfoArr[2]); Plugin.GetVideoPlugin().ExecuteCmd(sendXML, sendXML.length); } else { // throw "No Login!"; } } else { videoPluginLoginForStandard(); } } //显示或隐藏OCX function displayOCX(isShow, context) { if (!context) context = document; if($(".tvt_dialog").size()>0 && isShow &&$("#popRec_content").size() ==0){ return ; } /*ocx假隐藏*/ var ocx = $("object,embed", context); for (var i = 0; i < ocx.length; i++) { var $ocxItem = $(ocx[i]); if (isShow && $ocxItem.prop("pluginPlaceholderId")) { if($ocxItem.prop("plugin_visible") == "false") setPluginSize($ocxItem.prop("pluginPlaceholderId"), ocx[i]); } else { $ocxItem.width(1).height(1); } if (isShow) { $ocxItem.prop("plugin_visible", "true"); } else { $ocxItem.prop("plugin_visible", "false"); } } } function setPluginSize(pluginPlaceholderId, pluginObj) { var $pluginRefDiv = $("#" + pluginPlaceholderId); if ($pluginRefDiv.size() == 0) return; var $plugin = $(pluginObj); $plugin.prop("pluginPlaceholderId", pluginPlaceholderId); if ($(".tvt_dialog").size() > 0 && ($("#divPopRecOCX").size() == 0 && $("#popLiveOCX").size() == 0 )) return; var offset = $pluginRefDiv.offset(); var refW = $pluginRefDiv.width(); var refH = $pluginRefDiv.height(); //解决chrome上最大化,插件位置不刷新的问题 $plugin.offset({ top: offset.top - 1, left: offset.left - 1 }).width(refW-1).height(refH-1); $plugin.offset({ top: offset.top, left: offset.left }).width(refW).height(refH); //Safari:将浏览器最大化,在退出最大化,视屏未整铺视屏框,需要重复设置一次 if (osType == "mac") { $plugin.offset({ top: offset.top, left: offset.left }).width($pluginRefDiv.width()).height($pluginRefDiv.height()); } } window.Plugin = { GetVideoPlugin: function () { if (videoPlugin == null) { iniVideoPlugin(); }else { if (getVideoPluginStatus() == "Disconnected") { setVideoPluginStatus("Reconnecting"); videoPluginLogin(); } } return videoPlugin; }, GetTimeSliderPlugin: function () { return timeSliderPlugin; }, P2pCmdSender: CMD_QUEUE, SetPluginSize: setPluginSize, /** * 插件显示/隐藏 * @param {Object} context :上下文对象 * @param {Boolean} isShow :true显示,false隐藏 */ DisplayOCX: displayOCX, //IniVideoPlugin: iniVideoPlugin, InitTimeSliderPlugin: initTimeSliderPlugin, //UnLoaded, InitialComplete, Connected, Login, Reconnecting GetVideoPluginStatus: getVideoPluginStatus, SetVideoPluginStatus: setVideoPluginStatus, GetTimeSliderPluginStatus: getTimeSliderPluginStatus, SetTimeSliderPluginStatus: setTimeSliderPluginStatus, SetVideoPluginDefaultZIndex: function () { if(osType === "mac" ||browser.type !=="chrome"){ $(videoPlugin).css("z-index",10); }else{ $(videoPlugin).css("z-index", 0); } }, VideoPluginLogin: videoPluginLogin, GetIsReconn: function () { return isReconn; }, SetIsReconn: function (isReconnect) { isReconn = isReconnect; }, SetReconnCallBack: function (callBack) { reconCallBack = callBack; }, GetReconnCallBack: function () { return reconCallBack; }, DisposePlugin:function(){ videoPlugin = null; $("#VideoPlugin").remove(); } }; return window.Plugin; });