﻿/**
 * @Author Lion Shooray 2007-7-24 iTruschina. Co.,Ltd
 * @Version 2.5
 */

//global const 
var INPUT_BASE64 = 0x1;
var INPUT_HEX = 0x2;
var OUTPUT_BASE64 = 0x4;
var OUTPUT_HEX = 0x8;

/**
 * JSDateAdd Javascript 计算给定日期+天数
 * @param theDate: 给定日期，Date类型
 * @param days: 整型
 * @return 计算结果，Date类型
 */
function JSDateAdd(theDate, days) {
	var dateValue = theDate.valueOf()
	dateValue += days * 1000 * 60 * 60 * 24;
	var newDate = new Date(dateValue);
	return newDate;
}

/**
 * filterCerts 根据所设置条件过滤证书
 * @param arrayIssuerDN: Array()，可设置多个IssuerDN过滤
 * @param dateFlag 0表示所有证书，1表示处于有效期内的证书，2表示待更新证书，3表示未生效或已过期证书，缺省为所有证书
 * @param serialNumber: 证书序列号（微软格式）
 * @return Array(), PTALib.Certificate
 */
function filterCerts(arrayIssuerDN, dateFlag, serialNumber) {
	var m_certs = new Array();
	var i = 0;
	for(i = 0; i < arrayIssuerDN.length; i++){
		var CertFilter = iTrusPTA.Filter;
		CertFilter.Clear();
		CertFilter.Issuer = arrayIssuerDN[i];
		CertFilter.SerialNumber = serialNumber;
		var t_Certs = iTrusPTA.MyCertificates; //临时变量
		var now = new Date();
		if(parseInt(t_Certs.Count) > 0) { //找到了证书
			for(var j = 1; j <= parseInt(t_Certs.Count) ; j++) {
				switch (dateFlag){
   					case 0://所有证书
						m_certs.push(t_Certs(j));
						break;
					case 1://处于有效期内的证书
						if(t_Certs(j).ValidFrom < now && t_Certs(j).validTo > now)
							m_certs.push(t_Certs(j));
						break;
					case 2://待更新证书
						if(t_Certs(j).validTo > now	&& t_Certs(i).validTo < JSDateAdd(now, 30))
							m_certs.push(t_Certs(j));
						break;
					case 3://未生效或已过期证书
						if(t_Certs(j).ValidFrom > now || t_Certs(j).validTo < now)
							m_certs.push(t_Certs(j));
						break;
					default://缺省当作所有证书处理
						m_certs.push(t_Certs(j));
						break;
				}
			}
		}
	}
	return m_certs;
}

/**
 * signLogonData 登陆签名
 * @param certList 证书列表<select>对象
 * @param inputToSign: 用于签名登陆的被签名<input>对象
 * @return 成功返回签名值，失败返回""
 */
function sign(toSign) {

	if(toSign == "") return "";
	var toSignVal = toSign;
	var arrayIssuerDN = new Array(
		//天威诚信体验CA
		"C=CN, O=\"iTruschina Co., Ltd.\", OU=China Trust Network, CN=iTruschina XP Personal CA"
		//VeriSign Class1 free 60 days mail cert
		, "O=\"iTruschina Co., Ltd.\", OU=VeriSign Trust Network, OU=Terms of use at https://www.itrus.com.cn/rpa (c)01, CN=iTruschina Class 1 Consumer Individual Subscriber CA"
	);
	
	//filterCerts的第一个参数为证书的颁发者字符串数组，支持多个CA
	/*filterCerts的第二个参数dateFlag
		0表示所有证书
		1表示处于有效期内的证
		2表示待更新证书
		3表示未生效或已过期证书
		缺省为所有证书
	*/
	//filterCerts的第三个参数serialNumber为证书序列号，可过滤出唯一一张证书
	
	var arrayCerts = filterCerts(arrayIssuerDN, 1, "");
	if(arrayCerts.length == 0){
		alert("获取数据证书失败");
		return "";
	}
	var signer = arrayCerts[0];
	try {
		var signedData;
		/*var ptaVersion = iTrusPTA.Version;
		
		if(ptaVersion == null){ 
			//PTA Version = 1.0.0.3
			signedData  = signer.SignMessage(toSignVal, OUTPUT_BASE64);
		} else {
			//PTA Version > 2
			toSignVal = "LOGONDATA:" + toSignVal;
			signedData = signer.SignLogonData(toSignVal, OUTPUT_BASE64);
		}
		*/
		signedData  = signer.SignMessage(toSignVal, OUTPUT_BASE64);
		return signedData;
	} catch (e) {
		if(-2147483135 == e.number) {
			//用户取消签名
		}	else if(e.number == -2146885621) {
			alert("您不拥有证书“" + CurCert.CommonName + "”的私钥，签名失败。");
			return "";
		} else {
			alert("PTA签名时发生错误\n错误号: " + e.number + "\n错误描述: " + e.description);
			return "";
		}
	}
}
