//状态常值定义：
var E_OK = 1;//正常
var E_FAIL = E_OK << 1;//失败
var E_UNKNOWN = E_FAIL << 1;//不能确定
var E_PENDING = E_UNKNOWN << 1;//进行中
var E_NO_RIGHT = E_PENDING << 1;//权限不够
var E_REPAIR = E_NO_RIGHT << 1;//修复
var E_INSTALL = E_REPAIR << 1;//安装
var E_UPDATE = E_INSTALL << 1;//更新
var E_RESTART_IE = E_UPDATE << 1;//需要重启IE
var E_RELOGIN = E_RESTART_IE << 1;//同机多窗口登录了。
//DLL索引
var ID_CSCM = 0;
var ID_EPND = ID_CSCM+1;
var ID_IEHELPER = ID_EPND+1;
var ID_CLIENTNSP = ID_IEHELPER+1;
var ID_PROXYIE = ID_CLIENTNSP+1;
var ID_COMPINSP = ID_PROXYIE+1;
var ID_DLL_MAX = ID_COMPINSP;
//DLL属性索引
var ID_VER = 0;
var ID_NAME = ID_VER+1;
var ID_PROGID = ID_NAME+1;
//DLLS
//集中管理控件的版本
//当控件的版本需要更新时，更新以下版本号，并且更新安装页面的<object>
//标签中的版本号。
var G_DLLS = new Array(ID_DLL_MAX+1);
G_DLLS[ID_CSCM] = ["1,0,0,10", "Client Management Controls ", "CSClientManagerPrj.CSClientManager.1"];
G_DLLS[ID_EPND] = ["1,0,0,6", "DKEY Inspection Control ", "Epnd.Epassnd.1"];
G_DLLS[ID_CLIENTNSP] = ["1,0,0,7", "Name Resolution service ", "ClientNSPPrj.ClientNSP.1"];
G_DLLS[ID_IEHELPER] = ["1,0,3,8", "Browser Auxiliary Controls ", "IEHelper.ProxyHelper.1"];
G_DLLS[ID_PROXYIE] = ["1,0,2,31", "ProxyIE Controls", "ProxyIE.CSProxy.1"];

//通过相对URL，得到绝对URL
function getHostPath(path)
{
	var loc = window.location;
	return loc.protocol + "//" + loc.host + path;
}
//IE是否支持新进程模式打开，只有新进程模式打开才能加载新的DLL
function isBrowseNewProcess(cscmobj)
{
	try {
		var result = cscmobj.RegValueOf("HKEY_CURRENT_USER", "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BrowseNewProcess", "BrowseNewProcess");
		result = result.toLowerCase();
		if (result == "yes")
			return true;
		else
			return false;
	}
	catch (e) {
		return false;
	}
}
//设置以新进程模式打开
function setBrowseNewProcess(cscmobj)
{
	try
	{
		cscmobj.RegValueOf("HKEY_CURRENT_USER", "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BrowseNewProcess", "BrowseNewProcess") = "Yes";
	}
	catch(e)//若权限不够，会导致异常
	{
		return false;
	}
	return isBrowseNewProcess(cscmobj);
}
//尝试以新进程模式打开IE访问登陆页面
//只有更新了控件（不包括新安装）才需要重启浏览器，
//使浏览器加载最新的控件
function newProcessLogin(cscmobj)
{
	try
	{
		if (! isBrowseNewProcess(cscmobj) && ! setBrowseNewProcess(cscmobj))
			return false;
		var result = cscmobj.Explore(getHostPath("/core/index.sin"));
		if (result == 1)
		{
			return true;
		}
	}
	catch(e)
	{
	}
	return false;
}

//重启IE，使用最新的控件
function restartExplorer(cscmobj)
{	
	if (! newProcessLogin(cscmobj))
	{
		alert("Please close IE, and restart it.");
	}
	Close();
}
function Close() 
{ 
       window.opener =null; 
       window.close(); 
}
//阻塞安装URL地址指定的控件
//true		安装成功
//false		安装失败
function installDll(cscmobj, codebase)
{
	var url = getHostPath(codebase);
	try
	{
		if(1 == cscmobj.InstallClientInetCom(url, 0))
			return true;
	}
	catch(e)
	{
		return false;
	}
	
	return false;
}

function installDllByCAB(cscmobj, codebase, file)
{
	var url = getHostPath(codebase);
	try
	{
		if(1 == cscmobj.InstallClientInetComCAB(url, file))
			return true;
	}
	catch(e)
	{
		return false;
	}
	
	return false;
}
//查找progid指定对象的版本号
//失败时返回空字符串
function versionOfDll(cscmobj, progid)
{
	try
	{
		var guid = "";
		guid = cscmobj.CLSIDFromProgID(progid);
		var path = cscmobj.DllPathByGUID(guid);
		var ver = cscmobj.VersionOfFile(path);
		return ver;
	}
	catch(e)
	{
		window.status = "Exception occur when getting version of " + progid;
		return "";
	}
}
//通过progid创建对象，返回创建的对象，失败返回null
function createObject(progid)
{
	var obj = null;
	try
	{
		obj = new ActiveXObject(progid);
	}
	catch(e)
	{
		obj = null;
	}
	return obj;
}
//检查版本是否匹配
//true	匹配
//false 不匹配
function isDllVersionOK(cscmobj, progid, requireVer)
{
	try
	{
		var ver = "";
		ver = versionOfDll(cscmobj, progid);
		if (0 == cscmobj.CompareVersion(ver, requireVer))
			return true;//版本匹配
		else
			return false;
	}
	catch(e)
	{
		alert("Exception with control version check:" + progid + "=>"+ e.description);
		return false;
	}
}
//卸载控件
//true	卸载成功
//false 卸载失败
function uninstallDll(cscmobj, progid)
{
	try
	{
		var guid = cscmobj.CLSIDFromProgID(progid);		
		var path = cscmobj.DllPathByGUID(guid);
		if (1 == cscmobj.UnregisterDll(path))
			return true;
		else
			return false;
	}
	catch(e)
	{
		alert("Exception with unregister: " + progid + "=>" + e.description);
		return false;
	}
}
//判断用户帐号权限
function isAdminAccount(cscmobj)
{
	var admin = 0x220;
	return cscmobj.loginAccountType == admin;
}
function isUserAccount(cscmobj)
{
	var user = 0x221;
	return cscmobj.loginAccountType == user;
}
function isGuestAccount(cscmobj)
{
	var guest = 0x222;
	return cscmobj.loginAccountType == guest;
}
function isPowerUserAccount(cscmobj)
{
	var powerUser = 0x223;
	return cscmobj.loginAccountType == powerUser;
}
function isUnknownAccount(cscmobj)
{
	return cscmobj.loginAccountType == 0;
}
//判断控件是否更新到指定版本
function isInstalledOK(cscmobj, progid, ver)
{
	try
	{
		var obj = null;
		obj = new ActiveXObject(progid);
		if (obj == null)
			return false;

		if (cscmobj != null && cscmobj.CompareVersion(versionOfDll(cscmobj, progid), ver) != 0)
		{
			return false;
		}
		return true;
	}
	catch(e)
	{		
		return false;
	}
}
//----------------------------------------------------------

//必须先创建CSClientManager对象，才能对其他组件进行检查

function createCSCM()
{
	var obj = null;//客户端管理控件
	var res = checkCSCM();
	if (res == E_OK)
	{
		obj = createObject(G_DLLS[ID_CSCM][ID_PROGID]);
	}
	else
	{
		window.status = "Error on " + G_DLLS[ID_CSCM][ID_NAME];		
	}
	return obj;
}
//客户端管理控件安装正确，这是所有工作的前提
function checkCSCM()
{	
	var progid = G_DLLS[ID_CSCM][ID_PROGID];
	var codeBase = "/core/images/CSClientManagerPrj.CAB";
	var installWeb = "/core/images/installCSCM.html";
	var requireVer = G_DLLS[ID_CSCM][ID_VER];
	var ctrlname = G_DLLS[ID_CSCM][ID_NAME];
	var obj = null;
	//确保安装了
	obj = createObject(progid);
	if (null == obj)
	{
		//没有安装，则先通过IE来安装
		window.location.href = installWeb;
		return E_UNKNOWN|E_INSTALL;
	}
	//1,0,0,5以前版本不支持某些接口，所以需先由IE来升级
	if (obj.CompareVersion(obj.SelfVersion, "1,0,0,5") <= 0)
	{
		window.location.href = installWeb;
		return E_UNKNOWN|E_UPDATE;
	}
	//检查版本，是否需要更新
	if (isDllVersionOK(obj, progid, requireVer) == true)
	{
		window.status = ctrlname + " version ok.";
		return E_OK;
	}
	if (!isAdminAccount(obj) && !isPowerUserAccount(obj))
	{
		alert("Please login with Admin or Power user.");
		return E_NO_RIGHT|E_UPDATE|E_FAIL;
	}
	//开始更新
	uninstallDll(obj, progid);
	if (false == installDllByCAB(obj, codeBase, "CSClientManagerPrj.dll"))
	{
		alert("Update " + ctrlname + " failed!");
		return E_UPDATE|E_FAIL;
	}
	restartExplorer(obj);
	return E_UPDATE|E_FAIL;
}

//检查名字解析服务是否完好
function checkClientNSP(cscmobj)
{
	var nsp = null;
	var progid = G_DLLS[ID_CLIENTNSP][ID_PROGID];
	var codeBase = "/core/images/ClientNSPPrj.CAB";
	var requireVer = G_DLLS[ID_CLIENTNSP][ID_VER];
	var ctrlname = G_DLLS[ID_CLIENTNSP][ID_NAME];
	//zwb add 20070131
	if(!makeComponentUnblocked(cscmobj, progid))
	{
			alert("Component：" + progid + "labeled as unblocked failure !");	
	}
	//zwb add 20070131 end
	
	nsp = createObject(progid);		
	//安装新控件
	if (nsp == null)
	{
		if (! isAdminAccount(cscmobj))
		{
			alert("Please login windows with Admin!");
			return E_NO_RIGHT|E_INSTALL|E_FAIL;
		}
		if (false == installDllByCAB(cscmobj, codeBase, "ClientNSPPrj.dll"))
		{
			alert("Install " + ctrlname + " failed!");
			return E_INSTALL|E_FAIL;
		}
		nsp = createObject(progid);
		if (nsp != null)
		{
			window.status = ctrlname + " has installed.";
			return E_OK|E_INSTALL;
		}
		return E_INSTALL|E_FAIL;
	}
	
	var result = 0;
	//检查版本
	try{
		if (isDllVersionOK(cscmobj, progid, requireVer))
		{
			//检查HOOK注册键是否完好
			result = nsp.CheckProvider;
			if (result == 0)//注册键被破坏
			{
				if (! isAdminAccount(cscmobj))
				{
					alert(ctrlname + " error, please login with admin.");
					return E_NO_RIGHT|E_REPAIR|E_FAIL;
				}
				var tmp = nsp.InstallProvider;
				if(tmp == 0)
				{
					alert(ctrlname + " start fail!");
					return E_REPAIR|E_FAIL;
				}
				return E_REPAIR|E_OK;
			}
			return E_OK;
		}
	}catch(e){
	}
	
	//需要更新
	if (! isAdminAccount(cscmobj))
	{
		alert("Please login windows with Admin.");
		return E_NO_RIGHT|E_UPDATE|E_FAIL;
	}
	//新安装控件，不需要其他检查
	uninstallDll(cscmobj, progid);
	if (false == installDllByCAB(cscmobj, codeBase, "ClientNSPPrj.dll") )
	{
		alert("Update " + ctrlname + " failed!");
		return E_UPDATE|E_FAIL;
	}
	return E_OK|E_UPDATE|E_RESTART_IE;
}
//浏览器辅助控件
function checkIEHelper(cscmobj)
{
	var result = 0;
	var ieHelper = null;
	var progid = G_DLLS[ID_IEHELPER][ID_PROGID];
	var codeBase = "/core/images/IEHelper.CAB";
	var requireVer = G_DLLS[ID_IEHELPER][ID_VER];
	var ctrlname = G_DLLS[ID_IEHELPER][ID_NAME];
	//zwb add 20070131
	if(!makeComponentUnblocked(cscmobj, progid))
	{
			alert("Component：" + progid + "labeled as unblocked failure !");	
	}
	//zwb add 20070131 end
	
	ieHelper = createObject(progid);	
	if (ieHelper == null)
	{
		if (!isAdminAccount(cscmobj) && !isPowerUserAccount(cscmobj))
		{
			alert("Please login windows with Admin!");
			return E_NO_RIGHT|E_INSTALL|E_FAIL;
		}
		if (false == installDllByCAB(cscmobj, codeBase, "IEHelper.dll"))
		{
			alert("Install " + ctrlname + " failed!");
			return E_INSTALL|E_FAIL;
		}
		
		ieHelper = createObject(progid);
		if (ieHelper != null)
		{
			//要重启，IE才能加载控件
			return E_INSTALL|E_OK|E_RESTART_IE;
		}
		return E_INSTALL|E_FAIL;
	}
	
	try {
		//检查版本
		if (true == isDllVersionOK(cscmobj, progid, requireVer))
		{
			//检查HOOK
			result = ieHelper.CheckProvider;
			if (result == 0)
			{
				if (!isAdminAccount(cscmobj) && !isPowerUserAccount(cscmobj))
				{
					alert("Please login windows with Admin!");
					return E_NO_RIGHT|E_REPAIR|E_FAIL;
				}
				var tmp = ieHelper.InstallProvider;
				if(tmp == 0)
				{
					alert("Error on " + ctrlname);
					return E_REPAIR|E_FAIL;
				}
				//要重启，IE才能加载控件
				return E_OK|E_REPAIR|E_RESTART_IE;
			}
			return E_OK;
		}
	}catch(e) {
	}
	
	if (!isAdminAccount(cscmobj) && !isPowerUserAccount(cscmobj))
	{
		alert("Please login windows with Admin.");
		return E_NO_RIGHT|E_UPDATE|E_FAIL;
	}
	//新安装控件，不需要其他检查
	uninstallDll(cscmobj, progid);
	if (!installDllByCAB(cscmobj, codeBase, "IEHelper.dll"))
	{
		alert("Update " + ctrlname + " failed!");
		return E_UPDATE|E_FAIL;
	}
	return E_UPDATE|E_OK|E_RESTART_IE;
}
//DKEY检查控件
function checkEpnd(cscmobj)
{
	var result = 0;
	var epnd = null;
	var progid = G_DLLS[ID_EPND][ID_PROGID];
	var codeBase = "/core/images/epnd.CAB";
	var requireVer = G_DLLS[ID_EPND][ID_VER];
	var ctrlname = G_DLLS[ID_EPND][ID_NAME];
	//zwb add 20070131
	if(!makeComponentUnblocked(cscmobj, progid))
	{
			alert("Component：" + progid + "labeled as unblocked failure !");	
	}
	//zwb add 20070131 end
	
	epnd = createObject(progid);
	if (epnd == null)
	{
		if (!isAdminAccount(cscmobj) && !isPowerUserAccount(cscmobj))
		{
			alert("Please login windows with Admin.");
			return E_NO_RIGHT|E_INSTALL|E_FAIL;
		}
		if(!installDllByCAB(cscmobj, codeBase, "epnd.dll"))
		{
			alert("Install " + ctrlname + " failed!");
			return E_INSTALL|E_FAIL;
		}
		epnd = createObject(progid);
		if (epnd != null)
		{
			window.status = "Install " + ctrlname + " ok.";
			return E_OK|E_INSTALL;
		}
		return E_INSTALL|E_FAIL;
	}
	//检查版本
	if (isDllVersionOK(cscmobj, progid, requireVer))
	{
		window.status = ctrlname + "'s version ok";
		return E_OK;
	}
	if (!isAdminAccount(cscmobj) && !isPowerUserAccount(cscmobj))
	{
		alert("Please login windows with Admin.");
		return E_NO_RIGHT|E_UPDATE|E_FAIL;
	}
	uninstallDll(cscmobj, progid);
	if (!installDllByCAB(cscmobj, codeBase, "epnd.dll"))
	{
		alert("Update " + ctrlname + " failed!");
		return E_UPDATE|E_FAIL;
	}
	return E_UPDATE|E_OK|E_RESTART_IE;
}
//ProxyIE控件
function checkProxyIE(cscmobj)
{
	var proxyie = null;
	var progid = G_DLLS[ID_PROXYIE][ID_PROGID];
	var codeBase = "/core/images/ProxyIE.CAB";
	var requireVer = G_DLLS[ID_PROXYIE][ID_VER];
	var ctrlname = G_DLLS[ID_PROXYIE][ID_NAME];
	//zwb add 20070131
	if(!makeComponentUnblocked(cscmobj, progid))
	{
			alert("Component：" + progid + "labeled as unblocked failure !");	
	}
	//zwb add 20070131 end
	
	proxyie = createObject(progid);		
	//新安装控件
	if (proxyie == null)
	{
		if (!isAdminAccount(cscmobj))
		{
			alert("Please login windows with Admin.");
			return E_NO_RIGHT|E_INSTALL|E_FAIL;
		}
		if (!installDllByCAB(cscmobj, codeBase, "ProxyIE.dll")) {
			alert("Install " + ctrlname + " failed!");
			return E_INSTALL|E_FAIL;
		}
		proxyie = createObject(progid);
		if (proxyie == null)
		{
			window.status = ctrlname + " create failed!";
			return E_INSTALL|E_FAIL;
		}
		window.status = ctrlname + " create ok.";
		return E_OK|E_INSTALL|E_RESTART_IE;
	}
	
	//检查版本是否合适
	if (isDllVersionOK(cscmobj, progid, requireVer))
	{
		window.status = ctrlname + "'s version ok.";
		//检查HOOK注册键是否完好
		try
		{
			proxyie.test();//当不完好时，会异常
		}
		catch(e)
		{
			if (!isAdminAccount(cscmobj))
			{
				alert("Please login windows with Admin.");
				return E_NO_RIGHT|E_REPAIR|E_FAIL;
			}
			window.status = ctrlname + " is restoring.";
			window.location.href = "/core/images/instHook.html";
			return E_REPAIR|E_UNKNOWN;
		}
		//是否重复登陆
		var relogin = proxyie.relogin;
		if (relogin == 1)
		{//是否已登录
			window.location.href = "/core/images/relogin.html";
			return E_OK|E_RELOGIN;
		}
		
		return E_OK;
	}
	if (!isAdminAccount(cscmobj))
	{
		alert("Please login windows with Admin.");
		return E_NO_RIGHT|E_UPDATE|E_FAIL;
	}
	uninstallDll(cscmobj, progid);
	if (!installDllByCAB(cscmobj, codeBase, "ProxyIE.dll")) {
		alert("Update " + ctrlname + " failed!");
		return E_UPDATE|E_FAIL;
	}
	return E_UPDATE|E_OK|E_RESTART_IE;
}

//IPTunnel 服务

function canInstallIPTun(cscmobj)
{
    var win2000 = 5;
    var os = CSCMObj.OsVersion;
    if (os < win2000)
	return false;
    if (!isAdminAccount(cscmobj) && !isPowerUserAccount(cscmobj))
	return false;
    else
	return true;
}
function canInstallVNIC(cscmobj)
{
    var win2000 = 5;
    var os = CSCMObj.OsVersion;
    if (os < win2000)
	return false;
    return isAdminAccount(cscmobj);
}
function isIPTunInstalled(cscmobj)
{
    var ver = cscmobj.IPTunnelVersion;
    if (ver == "")
	return false;
    else
	return true;
}
function isVNICInstalled(cscmobj)
{
    var ver = cscmobj.VNICVersion;
    if (ver == "")
	return false;
    else
	return true;
}
function isIPTunNeedUpdate(cscmobj)
{
    var requireVer = "1,0,0,11";
    var ver = cscmobj.IPTunnelVersion;
    if (cscmobj.CompareVersion(ver, requireVer) != 0)
	return true;
    else
	return false;
}
function isVNICNeedUpdate(cscmobj)
{
    var requireVer = "1,0,0,7";
    var ver = cscmobj.VNICVersion;
    if (cscmobj.CompareVersion(ver, requireVer) != 0)
	return true;
    else
	return false;
}
function installIPTun(cscmobj)
{
    var downloadUrl = getHostPath("/core/images/CSAppSupportInstaller.exe");
    var result = cscmobj.UpdateIPTunnel(downloadUrl, "");
    if (result == 0)
	return false;
    else
	return true;
}

// 如果SVPNMonitor开启了但没有运行，则启动它
function checkSVPNMonitor(cscmobj)
{
	if(isVista())
	{
		return;
	}
	if(user_sddn == 1 && cscmobj.SVPNMonitorRunningState == 0)
	{
		SVPNMonitor_start();
	}
}

function installVNIC(cscmobj)
{
    var downloadUrl = getHostPath("/core/images/VNICInstaller.exe");
    var result = cscmobj.UpdateVNIC(downloadUrl, "");
    // UpdateVNIC使用RunUntilExit()函数，当它运行时间超过SVPNMonitor的心跳超时时
    // SVPNMonitor就会退出，使用checkSVPNMonitor()防止它的非正常退出。 
    checkSVPNMonitor(cscmobj);
    if (result == 0)
	return false;
    else
	return true;
}
function uninstallIPTun(cscmobj)
{
    var dir = cscmobj.IPTunnelUninstDir;
    var param = "/S _?=" + dir;
    var result = cscmobj.UninstallIPTunnel(param);
    if (result == 0)
	return false;
    else
	return true;
}
function uninstallVNIC(cscmobj)
{
    var dir = cscmobj.VNICUninstDir;
    var param = "/S _?=" + dir;
    result = cscmobj.UninstallVNIC(param);
    if (result == 0)
	return false;
    else
	return true;
}
//zwb add 20070131
/*
* ie7对未加载过的控件会要求提示
* 本函数通过写注册表将所有控件标
* 注为已加载过状态
*/
function makeComponentUnblocked(cscmobj, progid)
{
	var nav=navigator.appVersion;
	if( nav.indexOf('MSIE') != -1 )
	{
  		var curIE = nav.substr(nav.indexOf('MSIE')+5,3);
		if(curIE < 7)
			return true;
	}
	else
		return true;
		
	if(!cscmobj)
	{
		return false;
	}
	try
	{
		var clsid = cscmobj.CLSIDFromProgID(progid);
		var key   = "Software\\Microsoft\\Windows\\CurrentVersion\\Ext\\Stats\\" + clsid + "\\iexplore";
		cscmobj.TypeRegValueOf("HKEY_CURRENT_USER", key, "Flags", 4) = "4";
		return true;
	}
	catch(e)
	{
		alert(e);
		return false;
	}	
}
//zwb add 20070131 end

//
// return true if the client is vister, otherwise return false 
//
function isVista()
{
	var nav = navigator.appVersion;
	if(nav.indexOf('Windows NT') != -1)
	{
		var OSVersion = nav.substr(nav.indexOf('Windows NT')+11,3);
		if(OSVersion >= 6)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	return false;
	
}
