/*
**************************************************
Title:			BJCA SecXGlobal Web Application Interface
Version:		2.1
Author:
Date:			2005/7/08
Last Modify:	2005/7/18
Copyright:		BeiJing Certification Authentication
				http://www.bjca.org.cn
**************************************************
*/

var nCaCount;
var globalAppType;
//取得证书应用类型
gGetAppType();
/*
**************************************************
Begin Application Development Interface
*/



/*
描述：
	取得UniqueID列表
参数：
	strListID：下拉菜单的完整ID（框架ID、表单ID、下拉列表ID）
返回：
	无
*/
function gGetCertList(strListID) {
	var strTemp;
	var strOption;
	var len;
	var strName;
	var strUniqueID;
	var objListID = eval(strListID);

	try{
	        //alert(objListID);
		if(globalObj==0)
		{
			//alert("您没有安装证书应用升级包！");
		}
		nCaCount = getUserInfoByContainer("cacount",CERT_XML_CACOUNTS);
		if (nCaCount==0)
		{
			strTemp = BJCASecClt.GetCertList();
		}else
		{
			strTemp = getUserList();
		}
	}catch(e)
	{

		//strTemp = BJCASecClt.GetCertList();
		return ;
	}

	////////////////new add 06-25/////////////////

		if(strTemp == null)
		{
		   return ;
		}

	////////////////new add end/////////////////
	while (1) {
		i=strTemp.indexOf("&&&");
		if (i <= 0) {
			break;
		}
		strOption = strTemp.substring(0,i);
		strName = strOption.substring(0, strOption.indexOf("||"));
		strUniqueID = strOption.substring(strOption.indexOf("||") + 2, strOption.length);
		var objItem = new Option(strName,strUniqueID)
		objListID.add(objItem);
		len = strTemp.length;
        strTemp = strTemp.substring(i+3,len);
	}

	var objListID = null;
}
 
/*
Function:	gGetAppType
Parameter:
*/
function gGetAppType()
{
 
	nCaCount = getUserInfoByContainer("cacount",CERT_XML_CACOUNTS);
	if (nCaCount > 0)
	{
	 
		globalAppType = 1;
	}else
	{
		 
		globalAppType = 0;
	}
	return globalAppType;
}

/*
Function:	gFuncLogin
Parameter:	strFormName	表单的ID名称
			strUniqueID	证书的UniqueID
			strPassword	私钥保护口令
*/
function gLogin(strFormName, strUniqueID, strPassword)
{

	if (nCaCount > 0)
	{
		return Login(strFormName,strUniqueID,strPassword);
	}else
	{
		return gFuncLogin(strFormName, strUniqueID, strPassword);
	}
	return true;
}

/*
Function:	gFuncModifyPWD
Parameter:	strID		标识
			strKeyPWD		原始口令
			strNewPWD		新口令
*/
function gModifyPWD(strID, strKeyPWD, strNewPWD)
{
	if(globalAppType==1)
	{
		//新版证书应用口令修改
		return changeUserPassword(strID, strKeyPWD, strNewPWD);
	}
	else if(globalAppType==0)
	{
		//旧版证书应用口令修改
		return gFuncModifyPWD(strID, strKeyPWD, strNewPWD);
		/*if(ret == 0)
		{
		    alert("证书口令修改成功！\n");
		}else
		{
		    alert("证书口令修改失败！\n");
		} */
	}else
	{
		alert("未指定新旧版证书应用");
	}
}
 /*
Function:	gGetCert
Parameter:	strUniqueID		容器名（新接口）或者唯一标识（旧接口）
*/
function gGetCert(strUniqueID)
{
	if(globalAppType==1)
	{
		//新版版证书应用
		var sCert = getUserCert(strUniqueID);
		return sCert;
	}
	else if(globalAppType==0)
	{
		//旧版版证书应用
		var sCert = gFuncGetDetailNoInit(strUniqueID,0);
		return sCert;
	}else
	{
		alert("未指定新旧版证书应用");
	}
}

 /*
Function:	gGetCertDetail
Parameter:	strUniqueID		容器名（新接口）或者唯一标识（旧接口）
			ItemNo		    细目类型
 * 0证书PEM编码
 * 1证书版本
 * 2证书序列号
 * 3证书签名算法
 * 4证书发放者国家名
 * 5证书发放者组织名
 * 6证书发放者部门名
 * 7证书发放者省州名
 * 8证书发放者通用名
 * 9证书发放者城市名
 * 10证书发放者EMAIL地址
 * 11证书有效期起始
 * 12证书有效期截止
 * 13用户国家名
 * 14用户组织名
 * 15用户部门名
 * 16用户省州名
 * 17用户通用名
 * 18用户城市名
 * 19用户EMAIL地址
 * 20用户DER公钥值
 * 21用户证书自定义级别
 * 22证书UniqueID
 * 23证书剩余有效期
 * 24部门ID
 */
//Parse Cert /////////////////////////////////////
function gGetCertDetail(strUniqueID, ItemNo)
{
	if(globalAppType==1)
	{
		//新版证书应用获取细目
		var sCert = getUserCert(strUniqueID);
		switch(ItemNo)
		{
			case 0:
				return sCert;
				break;
			case 8:
				return getCertBasicInfo(sCert,4);
				break;
			case 11:
				return getCertBasicInfo(sCert,5);
				break;
			case 12:
				return getCertBasicInfo(sCert,6);
				break;
			case 13:
				return getCertBasicInfo(sCert,42);
				break;
			case 14:
				return getCertBasicInfo(sCert,45);
				break;
			case 15:
				return getCertBasicInfo(sCert,46);
				break;
			case 16:
				return getCertBasicInfo(sCert,44);
				break;
			case 17:
				return getCertBasicInfo(sCert,41);
				break;
			case 18:
				return getCertBasicInfo(sCert,43);
				break;
			case 20:
				return getCertBasicInfo(sCert,7);
				break;
			case 22:
				return getExtCertInfoByOID("2.16.840.1.113732.2");
				break;
			case 23:
				return checkValidaty();
				break;
			case 24:
				return getExtCertInfoByOID("1.2.86.840.1.176.2");
				break;
			default:
				return getCertBasicInfo(sCert,ItemNo);
				break;
		}
	}
	else if(globalAppType==0)
	{
		//旧版证书应用获取细目
		return gFuncGetDetailNoInit(strUniqueID, ItemNo);
	}else
	{
		alert("未指定新旧版证书应用");
	}
}
 /*
Function:	gGetCertDetailExt 不需要安装注册获得证书详细信息
Parameter:	readType		读证书类型（旧接口） 1：软盘 2：Key
			ItemNo		    细目类型
			strContainerName 容器名（新接口）
			keyType         key类型
 * 0证书PEM编码
 * 1证书版本
 * 2证书序列号
 * 3证书签名算法
 * 4证书发放者国家名
 * 5证书发放者组织名
 * 6证书发放者部门名
 * 7证书发放者省州名
 * 8证书发放者通用名
 * 9证书发放者城市名
 * 10证书发放者EMAIL地址
 * 11证书有效期起始
 * 12证书有效期截止
 * 13用户国家名
 * 14用户组织名
 * 15用户部门名
 * 16用户省州名
 * 17用户通用名
 * 18用户城市名
 * 19用户EMAIL地址
 * 20用户DER公钥值
 * 21用户证书自定义级别
 * 22证书UniqueID
 * 23证书剩余有效期
 * 24部门ID
 */
//Parse Cert /////////////////////////////////////
function gGetCertDetailExt(readType,ItemNo,strContainerName,keyType)
{
	if(globalAppType==1)
	{
		//新版证书应用获取细目
		if(keyType!=null)
		{
			importCert(strContainerName, CERT_SRC_CONTAINER_ENC, keyType);
		}
		else
		{
			importCert(strContainerName, CERT_SRC_CONTAINER_ENC, "M&W eKey XCSP");

		}
		switch(ItemNo)
		{
			case 0:
				var sCert = exportCert(CERT_DST_BASE64);
				return sCert;
				break;
			case 8:
				return getBasicCertInfoByOID(4);
				break;
			case 11:
				return getBasicCertInfoByOID(5);
				break;
			case 12:
				return getBasicCertInfoByOID(6);
				break;
			case 13:
				return getBasicCertInfoByOID(42);
				break;
			case 14:
				return getBasicCertInfoByOID(45);
				break;
			case 15:
				return getBasicCertInfoByOID(46);
				break;
			case 16:
				return getBasicCertInfoByOID(44);
				break;
			case 17:
				return getBasicCertInfoByOID(41);
				break;
			case 18:
				return getBasicCertInfoByOID(43);
				break;
			case 20:
				return getBasicCertInfoByOID(7);
				break;
			case 22:
				return getExtCertInfoByOID("2.16.840.1.113732.2");
				break;
			case 23:
				return checkValidaty();
				break;
			case 24:
				return getExtCertInfoByOID("1.2.86.840.1.176.2");
				break;
			default:
				return getBasicCertInfoByOID(ItemNo);
				break;
		}

	}
	else if(globalAppType==0)
	{
		//旧版证书应用获取细目
	    if(readType == "1")
		{
			var ret = gFuncGetCertDetailInfo("a:/UserCert.der", ItemNo, 1);
			return ret;
		}
		else if(readType == "2")
		{
			var ret = null;
			if(keyType!=null)
			{
				ret = gFuncGetCertDetailInfo_Key(keyType, ItemNo);
			}
			else
			{
				ret = gFuncGetCertDetailInfo_Key("BJ0D01", ItemNo);

			}
			return ret;
		}
		else
		{
		}

	}else
	{
		alert("未指定新旧版证书应用");
	}
}
 /*
Function:	gGetCertDetail_Key不需要安装注册从Key中获得证书详细信息
Parameter:	ItemNo		    细目类型
			keyType         key类型
 * 0证书PEM编码
 * 1证书版本
 * 2证书序列号
 * 3证书签名算法
 * 4证书发放者国家名
 * 5证书发放者组织名
 * 6证书发放者部门名
 * 7证书发放者省州名
 * 8证书发放者通用名
 * 9证书发放者城市名
 * 10证书发放者EMAIL地址
 * 11证书有效期起始
 * 12证书有效期截止
 * 13用户国家名
 * 14用户组织名
 * 15用户部门名
 * 16用户省州名
 * 17用户通用名
 * 18用户城市名
 * 19用户EMAIL地址
 * 20用户DER公钥值
 * 21用户证书自定义级别
 * 22证书UniqueID
 * 23证书剩余有效期
 * 24部门ID
 */
//Parse Cert /////////////////////////////////////
function gGetCertDetail_Key(ItemNo, keyType)
{
	if(globalAppType==1)
	{
		//新版证书应用获取细目
		var strTemp;
		var strContainerName;
		var strExpireTime;
		var i;
		var len;
		var sCert;
		if(keyType==null || keyType=="")
		{
			keyType = "M&W eKey XCSP";
		}
		strTemp = enumUserCertificates(keyType);
		while (1) {
			i=strTemp.indexOf("&&&");
			if (i <= 0) {
				break;
			}
			var strContainerNameTmp = strTemp.substring(0,i);
			importCert(strContainerNameTmp, CERT_SRC_CONTAINER_SIGN, keyType);
			sCert = exportCert(CERT_DST_BASE64);
			var strExpireTimeTmp = getCertBasicInfo(sCert,6);
			if(strExpireTime == null)
			{
				strExpireTime = strExpireTimeTmp;
				strContainerName = strContainerNameTmp;
			}
			else if(strExpireTime != null && strExpireTime < strExpireTimeTmp)
			{
				strExpireTime = strExpireTimeTmp;
				strContainerName = strContainerNameTmp;
			}
			else
			{
			}

			len = strTemp.length;
			strTemp = strTemp.substring(i+3,len);
		}
		importCert(strContainerName, CERT_SRC_CONTAINER_SIGN, keyType);
		switch(ItemNo)
		{
			case 0:
				sCert = exportCert(CERT_DST_BASE64);
				return sCert;
				break;
			case 8:
				return getBasicCertInfoByOID(4);
				break;
			case 11:
				return getBasicCertInfoByOID(5);
				break;
			case 12:
				return getBasicCertInfoByOID(6);
				break;
			case 13:
				return getBasicCertInfoByOID(42);
				break;
			case 14:
				return getBasicCertInfoByOID(45);
				break;
			case 15:
				return getBasicCertInfoByOID(46);
				break;
			case 16:
				return getBasicCertInfoByOID(44);
				break;
			case 17:
				return getBasicCertInfoByOID(41);
				break;
			case 18:
				return getBasicCertInfoByOID(43);
				break;
			case 20:
				return getBasicCertInfoByOID(7);
				break;
			case 22:
				return getExtCertInfoByOID("2.16.840.1.113732.2");
				break;
			case 23:
				return checkValidaty();
				break;
			case 24:
				return getExtCertInfoByOID("1.2.86.840.1.176.2");
				break;
			default:
				return getBasicCertInfoByOID(ItemNo);
				break;
		}

	}
	else if(globalAppType==0)
	{
		//旧版证书应用获取细目
		var ret = null;
		if(keyType!=null)
		{
			ret = gFuncGetCertDetailInfo_Key(keyType, ItemNo);
		}
		else
		{
			ret = gFuncGetCertDetailInfo_Key("BJ0D01", ItemNo);

		}
		return ret;

	}else
	{
		alert("未指定新旧版证书应用");
	}
}

//Encrypt Data ///////////////////////////////////
function gEncrypt(sInData, globalSvrCert)
{
	if(globalAppType==1)
	{
		//新版版证书应用加密
		return envelopedData(sInData, ENVELOP_ENC, globalSvrCert);
	}
	else if(globalAppType==0)
	{
		//旧版版证书应用加密
		return gFuncEncrypt(sInData);
	}else
	{
		alert("未指定新旧版证书应用");
	}
}

//Dencrypt Data //////////////////////////////////
function gDencrypt(sInData, sContainerName)
{
	if(globalAppType==1)
	{
		//新版版证书应用解密
		return envelopedDecodeData(sInData, sContainerName);
	}
	else if(globalAppType==0)
	{
		//旧版版证书应用解密
		return gFuncDencrypt(sInData);
	}else
	{
		alert("未指定新旧版证书应用");
	}
}

//Sign Data //////////////////////////////////////
function gSign(sInData, sContainerName)
{
	if(globalAppType==1)
	{
		//新版版证书应用签名
		return signedData(sInData, sContainerName);
	}
	else if(globalAppType==0)
	{
		//旧版版证书应用签名
		return gFuncSign(sInData);
	}else
	{
		alert("未指定新旧版证书应用");
	}
}

//Verify Signed Data /////////////////////////////
function gVerifySign(strSignedData, strUserCert, strOrigindata)
{
	if(globalAppType==1)
	{
		//新版版证书应用验证
		return verifySignedData(strSignedData, strUserCert, strOrigindata);
	}
	else if(globalAppType==0)
	{
		//旧版版证书应用验证
		return gFuncVerifySign(strSignedData, strUserCert, strOrigindata);
	}else
	{
		alert("未指定新旧版证书应用");
	}
}



/*
End About Ocx Crypt Operation
**************************************************
*/

/*
End Reserved Functions
**************************************************
*/
