//Error Message
function errormsg(index){
	var errormsg=new Array();
	errormsg[0]="功能處理成功！";
	errormsg[1]="非電子戶無法進行網路下單！";
	errormsg[2]="記憶體不足！";
	errormsg[3]="功能處理錯誤！";
	errormsg[4]="本機無可供下單憑證！";//憑證找不到
	errormsg[5]="憑證或CRL格式錯誤！";
	errormsg[6]="憑證或CRL找不到簽發單位！";
	errormsg[7]="憑證或CRL驗證失敗";
	errormsg[8]="憑證或CRL過期！";
	errormsg[9]="憑證未登記！";
	errormsg[10]="憑證已暫禁！";
	errormsg[11]="憑證已註銷！";
	errormsg[12]="找不到對應的Public Key！";
	errormsg[13]="找不到對應的Private Key！";
	errormsg[14]="憑證的Public Key與Private Key不相符！";
	errormsg[15]="上傳資料格式錯誤！";
	errormsg[16]="下載資料格式錯誤！";
	errormsg[17]="輸入資料格式錯誤！";
	errormsg[18]="Template格式錯誤！";
	errormsg[19]="資料找不到！";
	return errormsg[index];
}
function isCertificateBySerialNumber(){
	var SerialNumber = CertDBClientObj.get_SerialNumber();
	var EndDate = CertDBClientObj.get_EndDate();
	if(SerialNumber.indexOf("TBB")>-1)
		return CertDBClientObj.get_EndDate();
	else
		return false;
}
function isCertificate(){
	var SubjectName = CertDBClientObj.get_Subject();
	var EndDate = CertDBClientObj.get_EndDate();
	if(SubjectName.indexOf("TBB")>-1)
		return CertDBClientObj.get_EndDate();
	else
		return false;
}
function getCertStart(SubjectName){
	var SubjectName = CertDBClientObj.get_Subject();
	if(SubjectName.indexOf("TBB")>-1)
		return CertDBClientObj.get_EndDate();
	else
		return false;
}
function hasLocalCert(idno){
	CertDBClientObj.ImportPfxFile("C:\\"+idno+".pfx", 0);
    rtncode = CertDBClientObj.GetErrorCode();
	if (rtncode == 0) {
		CertDBClientObj.ClearImport();
		return true;
	} else {
    	//alert("Get PFX File Fail,return code=" + rtncode);
		return false;
	}
}

//取得憑證的序號(高橋用)
function getCertSerial(idno){
	getExpired(idno);
	var certSerial = CertDBClientObj.GetCertSerial();
	//alert("certSerial: "+certSerial);
	return certSerial;
}

function getExpired(idno){	
	//CertDBClientObj.ImportPfxFile("C:\\"+idno+".pfx", 0);
    //rtncode = CertDBClientObj.GetErrorCode();
	//if (rtncode == 0) {
		pbData = "x";
		strSubject = "CN="+idno;
		//strSubject = "CN="+idno+"\r\nOU=Fuhwa Securities Finance Company Limited:ADMIN\r\nO=TAIWAN-CA.COM INC.\r\nC=TW";
		iFlags = 522; //with clear text, with cert chain
		iKeyUsage = 0;
		//alert(strSubject);
		var result = CertDBClientObj.Sign(pbData, strSubject, 0x0002|0x0008|0x0000, iKeyUsage);//進行簽章
		//alert(CertDBClientObj.GetErrorMsg());
    	//alert(CertDBClientObj.GetCertNotAfter());		
		CertDBClientObj.ClearImport();
		var endDate = CertDBClientObj.GetCertNotAfter();
		if(endDate){
		endDate = 	endDate.substring(0,4) +"/"+ endDate.substring(4,6) +"/"+
			endDate.substring(6,8) +" "+ endDate.substring(8,10) +":"+
			endDate.substring(10,12) + ":" + endDate.substring(12);
		}
		//alert("return: "+endDate);
		return endDate;
	//} else {
    	//alert("Get PFX File Fail,return code=" + rtncode);
	//}
}
function getExpired2(statusInfo){
	//statusInfo = 0_20061124080000_20071125075959
	var tempArray = statusInfo.split("_");
	var sdate = tempArray[2].substring(6,8);
	var startmonth = tempArray[2].substring(4,6);
	var smonth = startmonth - 1;
	var syear = tempArray[2].substring(0,4);
	//你的憑證將於XXXX年XX月XX日到期,請於到期日前至憑證中心進行憑證展延作業,以免影響正常下單, 
	
	var endDate = syear + "年" + startmonth + "月" + sdate + "日";
	var showMsg = "您的憑證有效日期至" + endDate;
	var Now=new Date();
	var Compare=new Date(syear,smonth,sdate);
	Result=(Compare.getTime()-Now.getTime())/(24*60*60*1000);
	Result=Math.ceil(Result); 
	if(Result<31){
		showMsg = "<b>你的憑證將於" + endDate + "到期,<br>請於到期日前至憑證中心進行<br>憑證展延作業,以免影響正常下單!<b>";
	}
	
	return showMsg;
}
function getStarted(statusInfo){
	//statusInfo = 0_20061124080000_20071125075959
	var tempArray = statusInfo.split("_");
	var startDate = tempArray[1].substring(0,4)+"年"+tempArray[2].substring(4,6)+"月"+tempArray[2].substring(6,8)+"日";
	return startDate;
}
function showCertInfWindow()
{
	certInfWindow = window.open("", "CertInf", "width=500,height=300,toolbar=no,scrollbars=yes,resizable=yes");

	certInfWindow.document.open("text/html");
	certInfWindow.document.write("<TITLE>憑證內容</TITLE>");
	certInfWindow.document.bgColor = "#FFFFCC"
	certInfWindow.document.write("<B><CENTER>憑證內容</CENTER></B>");
	certInfWindow.document.write("<B><HR></B>");
	certInfWindow.document.write("<BR><B>Issusr Name:</B>"+CertDBClientObj.get_Issuer());
	certInfWindow.document.write("<BR><B>Subject Name:</B>"+CertDBClientObj.get_Subject());
	certInfWindow.document.write("<BR><B>Serial Number: </B>"+CertDBClientObj.get_SerialNumber());
	certInfWindow.document.write("<BR><B>Start Data:</B>"+CertDBClientObj.get_StartDate());
	certInfWindow.document.write("<BR><B>End Data:</B>"+CertDBClientObj.get_EndDate());
	certInfWindow.document.write("<BR><B>Key Usage:</B>"+CertDBClientObj.get_KeyUsage());
	certInfWindow.document.write("<BR><B>Certificate:<BR>"+CertDBClientObj.certificate+"</B>");
	certInfWindow.document.write("<B><HR></B>");
	certInfWindow.document.close();
}

//*****************************************************************************
// Function name : SelectAllCertificate
// 顯示出Microsoft CryptoAPI的Certificate Store (憑證儲存空間/或媒體)
// 內的所有憑證，由用戶選擇一簽章用的憑證。若用戶選擇簽章憑
// 證後，此簽章憑證會儲存於Attribute：certificate內。
//*****************************************************************************
function SelectAllCertificate()
{
	var lRtn = 0;
	if ((lRtn = CertDBClientObj.selectCertificate()) !=0)
	{
		alert("Select certificate fail!error code: "+lRtn)
	}
	else
	{
		showCertInfWindow();
	}
}

//*****************************************************************************
// Function name : SelectAllCertificateEx
// 顯示出Microsoft CryptoAPI的Certificate Store (憑證儲存空間/或媒體)
// 內的所有憑證，由用戶選擇一簽章用的憑證。若用戶選擇簽章憑
// 證後，此簽章憑證會儲存於Attribute：certificate內。
//*****************************************************************************
function SelectAllCertificate_Ex()
{
	var lRtn = 0;
	if ((lRtn = CertDBClientObj.selectCertificate_Ex(document.thisform.SelectAll_CertUsage.value)) !=0)
	{
		alert("Select certificate fail!error code: "+lRtn)
	}
	else
	{
		showCertInfWindow();
	}
}

//***************************************************************************************
// Function name: SelectCertificateBySubjectName
// 顯示出Microsoft CryptoAPI的Certificate Store (憑證儲存空間/或媒體)內的所有
// 符合Subject 'Name的憑證，由用戶選擇一簽章用的憑證。若符合的憑證只
// 有一張，則直接採用此張憑證。若用戶選擇簽章憑證後，此簽章憑證會儲
// 存於Attribute：certificate內。
//
// Subject Name的格式為一個字串，將Subject Name所有的屬性以逗號分開，如下例：
//  C=TW, O=HiTRUST, OU=HiTRUST UCA, OU=0040000-BOT, OU=FXML, CN=9695839500
//'***************************************************************************************
function SelectCertificateBySubjectName()
{

	var lRtn = 0;

	if (document.thisform.SubjectName.value =="" )
	{
			alert("請輸入憑證之Subject Name!");
			return;
	}
	//get certificate by subject name
	if ((lRtn = CertDBClientObj.selectCertificateBySubject(document.thisform.SubjectName.value)) !=0)
	{
		alert("Select certificate by subject name fail!error code: "+lRtn)
		return;
	}
	else
	{
		showCertInfWindow();
	}
}

//***************************************************************************************
// Function name: SelectCertificateBySubjectName_Ex
// 顯示出Microsoft CryptoAPI的Certificate Store (憑證儲存空間/或媒體)內的所有
// 符合Subject 'Name的憑證，由用戶選擇一簽章用的憑證。若符合的憑證只
// 有一張，則直接採用此張憑證。若用戶選擇簽章憑證後，此簽章憑證會儲
// 存於Attribute：certificate內。
//
// Subject Name的格式為一個字串，將Subject Name所有的屬性以逗號分開，如下例：
//  C=TW, O=HiTRUST, OU=HiTRUST UCA, OU=0040000-BOT, OU=FXML, CN=9695839500
//'***************************************************************************************
function SelectCertificateBySubjectName_Ex()
{

	var lRtn = 0;

	if (document.thisform.SubjectName.value =="" )
	{
			alert("請輸入憑證之Subject Name!");
			return;
	}
	//get certificate by subject name
	if ((lRtn = CertDBClientObj.selectCertificateBySubject_Ex(document.thisform.SubjectName.value, document.thisform.SelectSubjectName_CertUsage.value)) !=0)
	{
		alert("Select certificate by subject name fail!error code: "+lRtn)
		return;
	}
	else
	{
		showCertInfWindow();
	}
}

//***************************************************************************************
//Function name: SelectCertificateBySubjectName_CN
// 顯示出Microsoft CryptoAPI的Certificate Store (憑證儲存空間/或媒體)內的所有
// 符合Subject Name 中之CN attribute的憑證，由用戶選擇一簽章用的憑證。若
//符合的憑證只有一張，則直接採用此張憑證。若用戶選擇簽章憑證後，此簽
//章憑證會儲存於Attribute：certificate內。
//
//***************************************************************************************
//function SelectCertificateBySubjectName_CN()
function SelectCertificateBySubjectName_CN(SubjectName_CN){
	var lRtn = CertDBClientObj.selectCertificateBySubjectCN(SubjectName_CN);
	if (lRtn !=0){
		//document.write(errormsg(lRtn));
		return errormsg(lRtn);
		//alert("Select certificate by subject CN fail!error code: "+lRtn)
	}else{
		return lRtn+"_"+CertDBClientObj.get_StartDate()+"_"+CertDBClientObj.get_EndDate();
	}
}

function SelectCertificateBySerialNum(SerialNum){
	var lRtn = CertDBClientObj.selectCertificateBySerialNum(SerialNum);
	if (lRtn !=0){
		//document.write(errormsg(lRtn));
		return errormsg(lRtn);
		//alert("Select certificate by subject CN fail!error code: "+lRtn)
	}else{
		return lRtn+"_"+CertDBClientObj.get_StartDate()+"_"+CertDBClientObj.get_EndDate();
	}
}

//***************************************************************************************
//Function name: SelectCertificateBySubjectName_CN_Ex
// 顯示出Microsoft CryptoAPI的Certificate Store (憑證儲存空間/或媒體)內的所有
// 符合Subject Name 中之CN attribute的憑證，由用戶選擇一簽章用的憑證。若
//符合的憑證只有一張，則直接採用此張憑證。若用戶選擇簽章憑證後，此簽
//章憑證會儲存於Attribute：certificate內。
//
//***************************************************************************************
function SelectCertificateBySubjectName_CN_Ex()
{
	var lRtn = 0;

	if (document.thisform.SubjectName_CN.value =="")
	{
			alert("請輸入憑證之Subject Name CN attribute!");
			return;
	}

	//select certificate by subject CN
	
	if ((lRtn = CertDBClientObj.selectCertificateBySubjectCN_Ex(document.thisform.SubjectName_CN.value,document.thisform.SelectCN_CertUsage.value)) !=0)
	{
		alert("Select certificate by subject CN fail!error code: "+lRtn)
		return;
	}
	else
	{	//show result
		showCertInfWindow();
	}

}

//***************************************************************************************
//Function name: selectCertificateByMultipleIssuer
// 顯示出Microsoft CryptoAPI的Certificate Store (憑證儲存空間/或媒體)內的所有
// 符合Issuer Name 中之CN attribute的憑證，由用戶選擇一簽章用的憑證。若
//符合的憑證只有一張，則直接採用此張憑證。若用戶選擇簽章憑證後，此簽
//章憑證會儲存於Attribute：certificate內。
//
//***************************************************************************************
function SelectCertificateByMultipleIssuer()
{
	var lRtn = 0;

	if (document.thisform.MultipleIssuerName.value =="")
	{
			alert("請輸入憑證之Issuer Name attribute!");
			return;
	}

	//select certificate by subject CN
	
	if ((lRtn = CertDBClientObj.selectCertificateByMultipleIssuer(document.thisform.MultipleIssuerName.value)) !=0)
	{
		alert("Select certificate by Multiple Issuer fail!error code: "+lRtn)
		return;
	}
	else
	{	//show result
		showCertInfWindow();
	}

}

//***************************************************************************************
//Function name: selectCertificateByMultipleIssuer_Ex
// 顯示出Microsoft CryptoAPI的Certificate Store (憑證儲存空間/或媒體)內的所有
// 符合Issuer Name 中之CN attribute的憑證，由用戶選擇一簽章用的憑證。若
//符合的憑證只有一張，則直接採用此張憑證。若用戶選擇簽章憑證後，此簽
//章憑證會儲存於Attribute：certificate內。
//
//***************************************************************************************
function SelectCertificateByMultipleIssuer_Ex()
{
	var lRtn = 0;

	if (document.thisform.MultipleIssuerName.value =="")
	{
			alert("請輸入憑證之Issuer Name attribute!");
			return;
	}

	//select certificate by subject CN
	
	if ((lRtn = CertDBClientObj.selectCertificateByMultipleIssuer_Ex(document.thisform.MultipleIssuerName.value,
																	document.thisform.MultipleIssuerName_CertUsage.value)) !=0)
	{
		alert("Select certificate by Multiple Issuer fail!error code: "+lRtn)
		return;
	}
	else
	{	//show result
		showCertInfWindow();
	}

}

//***************************************************************************************
//Function name: GetCertificate
//根據憑證的簽發者(Issuer Name)及序號(Serial Number)從Microsoft CryptoAPI
//的Certificate Store '(憑證儲存空間/或媒體)內找到符合的憑證，並將此憑證
//儲存於Attribute：certificate內。
//***************************************************************************************

function  GetCertificate()
{
	var lRtn = 0;
	
	if (document.thisform.IssuerName.value =="" )
	{
			alert("請輸入憑證之Issuer Name!");
			return;
	}

	if (document.thisform.SerialNumber.value =="" )
	{
			alert("請輸入憑證之Serial Number!");
			return;
	}
	//get certificate by issuer name and serial number	
	if ((lRtn = CertDBClientObj.getCertificate(document.thisform.IssuerName.value, document.thisform.SerialNumber.value )) !=0)
	{
		alert("Select certificate by issuer name and serial number fail!error code: "+lRtn)
		return;
	}
	else
	{
		showCertInfWindow();
	}
}


//***************************************************************************************
//Function name: IsCertificateExpired
//
//檢查傳入的憑證(certificate)是否尚在有效期間內。若尚在有效期間內，
//則傳回0；否則傳回其他值。
//傳入檢查的憑證內容，以Base64編碼。
//
//***************************************************************************************

function  IsCertificateExpired()
{
	var lRtn = 0;

	if (document.thisform.CertContent_1.value =="" )
	{
			alert("請輸入憑證之內容(Base64)");
			return;
	}

	//check certificate
	if ((lRtn = CertDBClientObj.checkCertificateExpired(document.thisform.CertContent_1.value)) !=0)
	{
		if (lRtn == 8)
		{
			alert("憑證已過期");
		}
		else
		{
			alert("check certificate expired fail!error code: "+lRtn)
		}
	}
	else
	{
			alert("憑證未過期");
	}
}

//***************************************************************************************
//Function name: GetCertificateInf
//拆解傳入的憑證(certificate)，並將拆解的憑證欄位：Issuer Name, Subject Name,
//Serial Number, Key Usage, Start Date, End Date分別儲存於對應的Attributes內。
//
//***************************************************************************************

function GetCertificateInf()
{
	var lRtn = 0;

	if (document.thisform.CertContent_2.value =="" )
	{
			alert("請輸入憑證之內容(Base64)");
			return;
	}

	//get certificate all information
	if ((lRtn = CertDBClientObj.getCertificateInfo(document.thisform.CertContent_2.value)) !=0)
	{
		alert("get certificate all information fail!error code: "+lRtn)
		return;
	}
	else
	{
		showCertInfWindow();
	}
}