/*
 *
 *	jxceal4.js
 *
 *	JX-CEAL v4.0 SCRIPTS
 *
 *	Date: 2001.12.5
 *	Revision: 2003.4.7
 *	Kim Hyun <hkim@jmi.co.kr>
 *
 **/
function JXCheckObject()
{

    var installed = false;
    try
    {
        var xObj = new ActiveXObject("JXCEALG2.JXCealG2Ctrl.1");
        if(xObj)
        {
            Installed = true;
        }
        else
        {
            Installed = false;
        }
    }

    catch(ex)
    {
        Installed = false;
    }

    if(Installed == true)
    {
        return true;
    }
    else
    {
        return false;
    }
}

function JXSetDlgImage(str)
{
	var host = document.domain;

	var ImagePath = host + str;
  
	if(str[0] == '/' ||str[0] == '\\')
	{ 
		ImagePath = host + str;
  }
  else
  {
		ImagePath = str;
  }


	JXCEAL.SetImage(ImagePath);
}

function JXSetAlertDay(nDay,strMsg)
{
	JXCEAL.SetExpireAlert(nDay,strMsg);
}

function JXObjectCheck(errText)
{
  var retBool = JXCheckObject();

  var strErr;

  if(errText== null ||errText.length < 1)
  {
	strErr ="ÀÎÁõ¼­ ¸ðµâÀÌ ¼³Ä¡µÇÁö ¾Ê¾Ò½À´Ï´Ù.\n\nÀÎÁõ¼­ ¸ðµâÀ» ¼³Ä¡ÇÏ¼¼¿ä";
  }    
  else
  {
	strErr = errText;
  } 
  if(!retBool)
  {
        alert(strErr);
  }
  return retBool;
}
function JXSignData(data) {
	JXCEAL.InitPageSession(SESSION_ID,"SEL_CERT_SESSION");  
//	JXCEAL.SetViewCertType(SESSION_ID,"N_NCASIGN|GPKI"); NPKI¸·À½
	JXCEAL.SetViewCertType(SESSION_ID,"GPKI");
//	JXCEAL.SetViewCertType(SESSION_ID,"ALL");
	var ret = JXCEAL.SignData(data);
	if(JXCEAL.LastErrCode() != "ERR0000") {
		return;
	}
	
	return ret;
}

function JXGpkiSignData(data) {
	JXCEAL.InitPageSession(SESSION_ID);  
//	JXCEAL.SetViewCertType(SESSION_ID,"N_NCASIGN|GPKI");  
	JXCEAL.SetViewCertType(SESSION_ID,"GPKI");  
	var ret = JXCEAL.SignData(data);
	if(JXCEAL.LastErrCode() != "ERR0000") {
		return;
	}
	
	return ret;
}


function JXGpkiSignDataWithCheck(data,times) {
	JXCEAL.InitPageSession(SESSION_ID,"SEL_CERT_SESSION");  
//	JXCEAL.SetViewCertType(SESSION_ID,"N_NCASIGN|GPKI");
	JXCEAL.SetViewCertType(SESSION_ID,"GPKI");
//	JXCEAL.SetViewCertType(SESSION_ID,"ALL");
	JXCEAL.SetCurrentTime(SESSION_ID,times);  
	var ret = JXCEAL.SignData(data);
	if(JXCEAL.LastErrCode() != "ERR0000") {
//		ÀÎÁõÃ¢¿¡¼­ Ãë¼Ò¹öÆ° Å¬¸¯ÇÒ °æ¿ì ³ªÅ¸³ª´Â ¿À·ùÄÚµå
//		alert(JXCEAL.LastErrCode());
//		ÀÎÁõÃ¢¿¡¼­ Ãë¼Ò¹öÆ° Å¬¸¯ÇÒ °æ¿ì ³ªÅ¸³ª´Â ¿À·ù ¸Þ½ÃÁö
//		alert(JXCEAL.LastErrMsg());
		return ;
	}
	
	return ret;
}

function JmiEncrypt(form)
{
		var funcname = "FormEncrypt";
	return _FEncrypt(funcname, SESSION_ID, servercert, form );
}

function JXEncSubmit(form)
{
		var funcname = "FormEncrypt";
		return _FSubmit(funcname, SESSION_ID, servercert, form);
}


function TotalEncrypt(funcname, servercert, form)
{
	return FCheck(funcname, servercert, form);
}

function FCheck(funcname, servercert, form )
{
	return _FSubmit(funcname, sessionid, servercert, form);
}

function _FSubmit(funcname, sessionid, servercert, form )
{
  	if (form == null || form == "undefined" ) 
	{
		alert("form is null");
		return;
	}
	else if ( form.ciphertext == null || form.ciphertext == "undefined") 
	{
	  	alert("form.ciphertext is null");
			return;
	}
	else 
	{

		if( _Encrypt(funcname, sessionid, servercert, form) == "TRUE" ) {
			 form.submit();
			return;
		}
		else
			return;
	}
}

function _FEncrypt(funcname, sessionid, servercert, form )
{
  	if (form == null || form == "undefined" ) 
	{
		alert("form is null");
		return false;
	}
	else if ( form.ciphertext == null || form.ciphertext == "undefined") 
	{
	  	alert("form.ciphertext is null");
			return false;
	}
	else 
	{

		if( _Encrypt(funcname, sessionid, servercert, form) == "TRUE" ) {
			return form;
		}
		else
			return false;
	}
}


function _Encrypt(funcname, sessionid, servercert, form)
{
	var encrypted_text = "";
  	var form_names = _MakeSendingForm(form); 
    form_names = encodeURI(form_names);
    form_names = form_names.replace(/\+/g, "%2B");
	_MakeFieldsNULL(form);

	if ( funcname == "FormEncrypt") 
	{
		if ( ( servercert != null && servercert !="") && 
			 ( sessionid != null && sessionid != "") )
		{
			encrypted_text = document.JXCEAL.FormEncrypt(sessionid, servercert, form_names);
			//if ( encrypted_text != null) {
			if ( encrypted_text.length > 0) {
				// using _ctForm, by powerway 2003.10
				 form.ciphertext.value = encrypted_text;
				//_ctForm.ciphertext.value = encrypted_text;
				return "TRUE";
			} 
			else {
			// ÀÓ½Ã begin 1 more encrypt
				encrypted_text = document.JXCEAL.FormEncrypt(sessionid, servercert, form_names);
				if(encrypted_text.length > 0) {
					// using _ctForm, by powerway 2003.10
					 form.ciphertext.value = encrypted_text;
					//_ctForm.ciphertext.value = encrypted_text;
					return "TRUE";
				}
			// ÀÓ½Ã end

				//alert("Form Encryption ERROR - ¼¼¼Ç¾ÆÀÌµð¿Í ¼­¹öÀÎÁõ¼­°¡ ¾ø½À´Ï´Ù.");
				return "FALSE";
			}
		}
		else
			return "FALSE";
	}
	else if ( funcname == "UnicodeFormEncrypt") 
	{
		if ( ( servercert != null && servercert !="") && 
			 ( sessionid != null && sessionid != "") )
		{
			encrypted_text = UnicodeFormEncrypt(sessionid, servercert, form_names);
			//if ( encrypted_text != null) {
			if ( encrypted_text.length > 0) {
				// using _ctForm, by powerway 2003.10
				 form.ciphertext.value = encrypted_text;
				//_ctForm.ciphertext.value = encrypted_text;
				return "TRUE";
			} 
			else {
			// ÀÓ½Ã begin 1 more encrypt
				encrypted_text = UnicodeFormEncrypt(sessionid, servercert, form_names);
				if(encrypted_text.length > 0) {
					// using _ctForm, by powerway 2003.10
					 form.ciphertext.value = encrypted_text;
					//_ctForm.ciphertext.value = encrypted_text;
					return "TRUE";
				}
			// ÀÓ½Ã end

				return "FALSE";
			}
		}
		else
			return "FALSE";
	}
	else if ( funcname == "BlockEncrypt")
	{
		if ( sessionid != null && sessionid != "") 
		{ 
			encrypted_text = document.JXCEAL.BlockEncrypt(sessionid, form_names);
			if ( encrypted_text != null) {
				// using _ctForm, by powerway 2003.10
				 form.ciphertext.value = encrypted_text;
				//_ctForm.ciphertext.value = encrypted_text;
				return "TRUE";
			}
			else {
				return "FALSE";
			}
		}
		else {
			return "FALSE";
		}
	}
	else if ( funcname == "UnicodeBlockEncrypt")
	{
		if ( sessionid != null && sessionid != "") 
		{ 
			encrypted_text = UnicodeBlockEncrypt(sessionid, form_names);
			if ( encrypted_text != null) {
				// using _ctForm, by powerway 2003.10
				 form.ciphertext.value = encrypted_text;
				//_ctForm.ciphertext.value = encrypted_text;
				return "TRUE";
			}
			else {
				return "FALSE";
			}
		}
		else {
			return "FALSE";
		}
	}
	else {
		return "FALSE";
	}

} // End of _Encrypt function



function _Escape(string)
{
	if (string == null )
		return "";
	else
		return escape(string);
}

function _MakeSendingForm( form )
{
  var name = ""; 
  var value = "";
  var retStr = ""; 
  var nElements = form.elements.length;
	
  for (var i = 0 ; i < nElements ; i++ )
  {
	name = form.elements[i].name;

	// test if the character '&' exists in the string. - Feb 1, 2002
	if ( name.indexOf("&") > -1)
		return;

	if ( name != null && name != "" && name != "ciphertext" ) 
	{
		if ( (form.elements[i].type != "submit") && 
			 (form.elements[i].type != "button") && 
			 (form.elements[i].type != "reset")  &&
  			 (form.elements[i].type != "file") )
		{
			// The case of radio button or checkbox
			if ( (form.elements[i].type == "radio") || 
				 (form.elements[i].type == "checkbox") )
			{
				if (form.elements[i].checked == true )
				{
					value = form.elements[i].value;
					retStr += name + "=";
					if ( value != null)	
						retStr += value + "&";
				}	
			}
			// not radio button or checkbox
			else
			{
				if ( form.elements[i].type == "select-one" )
				{
					var index = form.elements[i].selectedIndex;

					// appended by powerway, 2003.10.28
					if(index < 0) {
						value = "";
					// appended end

					} else if ( form.elements[i].options[index].value != '' )
					{
						value = form.elements[i].options[index].value;
					}
					else {
						//value = _Escape( form.elements[i].options[index].text );
						value = form.elements[i].options[index].text;
					}
					retStr += name + "=";
					if ( value != null)	{
						// alter '&' into '%amp;%'. - Feb 1, 2002
						value = value.replace(/&/g, "%amp;%");
						retStr += value + "&";
					}
				}
				else if ( form.elements[i].type == "hidden" )
				{
					//value = _Escape( form.elements[i].value );
					value = form.elements[i].value;
					retStr += name + "=";
					if ( value != null)	{
						// alter '&' into '%amp;%'. - Feb 1, 2002
						value = value.replace(/&/g, "%amp;%");
						retStr += value + "&";
					}
				}
				else
				{
					//value = _Escape( form.elements[i].value );
					value = form.elements[i].value;
					retStr += name + "=";
					if ( value != null)	{
						// alter '&' into '%amp;%'. - Feb 1, 2002
						value = value.replace(/&/g, "%amp;%");
						retStr += value + "&";
					}
				}
			}
		}// submit, button, reset ÀÌ ¾Æ´Ñ°æ¿ì 
	} // Enf of if loop  
  } // End of for loop
	
  retStr += "&";
  return retStr;

}

function _MakeFieldsNULL(form)
{
	var nElements = form.elements.length;
  	for (var i = 0 ; i < nElements ; i++ )
	{
		if ( (form.elements[i].type != "submit") && 
			 (form.elements[i].type != "button") && 
			 (form.elements[i].type != "reset")  &&
			 (form.elements[i].type != "file") )
		{
			if ( (form.elements[i].name != "ciphertext")  )
			{
				form.elements[i].value = "";
			}
		}
	} // End of for loop

}

function FormEncrypt(sessionid, servercert, plaintext)
{
	if(!CheckObject()) {
		return null;
	}

	return document.JXCEAL.FormEncrypt(sessionid, servercert, plaintext);
}

function BlockEncrypt(encData)
{
	if(!CheckObject()) {
		return null;
	}

	var sessionid = getSessionID();
	var decrypted = document.JXCEAL.BlockEncrypt(sessionid, encData); 
	return decrypted;
}

function BlockDecrypt(encData)
{
	if(!CheckObject()) {
		return null;
	}

	var sessionid = getSessionID();

	if( encData != "null" && encData != "" && encData != " ")
	{
		return document.JXCEAL.BlockDecrypt(sessionid, encData); 
	}
	else
	{
		return "";
	}
}

function LastErrCode()
{
	if(!CheckObject()) {
		return null;
	}

	return document.JXCEAL.LastErrCode();
}

function InitPageSession(sessionid, f)
{
	if(!CheckObject()) {
		return null;
	}

	if(!JXCheckObject()) {
		return null;
	}

	return document.JXCEAL.InitPageSession(sessionid, f);
}

function SignData(plaintext)
{
	if(!CheckObject()) {
		return null;
	}

	if(!JXCheckObject()) {
		return null;
	}

	return document.JXCEAL.SignData(plaintext);
}

function VerifyData(signed)
{
	if(!CheckObject()) {
		return null;
	}
	if(!JXCheckObject()) {
		return null;
	}

	return document.JXCEAL.VerifyData(signed);
}

function EnvelopeData(recipientsCerts, delimiter, content)
{
	if(!CheckObject()) {
		return null;
	}
	if(!JXCheckObject()) {
		return null;
	}

	return document.JXCEAL.EnvelopeData(recipientsCerts, delimiter, content);
}

function CertSearchAndEnvelopeData(searchReq, delimiter, contents)
{
	if(!CheckObject()) {
		return null;
	}
	if(!JXCheckObject()) {
		return null;
	}

	return document.JXCEAL.CertSearchAndEnvelopeData(searchReq, delimiter, contents);
}

function VerifyEnvelopedData(sessionid, cert, priKey, passwd, envelopedContentInfo)
{
	if(!CheckObject()) {
		return null;
	}

	if(!JXCheckObject()) {
		return null;
	}
	return document.JXCEAL.VerifyEnvelopedData(sessionid, cert, priKey, passwd, envelopedContentInfo);
}

function VerifyEnvelopedDataAndRecovery(sessionid, serverAddr, userid, ePasswd,
										cert, priKey, certPass, enveloped)
{
	if(!CheckObject()) {
		return null;
	}
	
	return document.JXCEAL.VerifyEnvelopedDataAndRecovery(sessionid, serverAddr,
		userid, ePasswd, cert, priKey, certPass, enveloped);

}

function SignAndRecovery2(server, userid, passwd, data)
{
	if(!CheckObject()) {
		return null;
	}

	return document.JXCEAL.SignAndRecovery2(server, userid, passwd, data);
}

/*
 *	Support multi-language
 */

function UnicodeFormEncrypt(sessionid, servercert, plaintext)
{
	hexastr = Byte2HexaStr(plaintext, false);
	return FormEncrypt(sessionid, servercert, hexastr);
}

function UnicodeBlockEncrypt(plaintext)
{
	hexastr = Byte2HexaStr(plaintext, false);
	return BlockEncrypt(hexastr);
}

function UnicodeBlockDecrypt(ciphertext)
{
	hexastr = BlockDecrypt(ciphertext);
	return HexaStr2UniStr(hexastr);
}

function UnicodeSignData(plaintext)
{
	hexastr = Byte2HexaStr(plaintext, false);
	return SignData(hexastr);
}

function UnicodeVerifyData(signed)
{
	hexastr = VerifyData(signed);
	return HexaStr2UniStr(hexastr);
}

function UnicodeEnvelopeData(recipientsCerts, delimiter, content)
{
	hexastr = Byte2HexaStr(content, false);
	return EnvelopeData(recipientsCerts, delimiter, hexastr);
}

function UnicodeCertSearchAndEnvelopeData(searchReq, delimiter, contents)
{
	hexastr = Byte2HexaStr(contents, false);
	return CertSearchAndEnvelopeData(searchReq, delimiter, hexastr);
}

function UnicodeVerifyEnvelopedData(sessionid, cert, priKey, passwd, envelopedContentInfo)
{
	hexastr = VerifyEnvelopedData(sessionid, cert, priKey, passwd, envelopedContentInfo);
	var reStr = HexaStr2UniStr(hexastr);

	if( reStr == "" ) return document.JXCEAL.FormDecryptOld(sessionid,"","",envelopedContentInfo);
	else return reStr;
}

function UnicodeVerifyEnvelopedDataAndRecovery(sessionid, serverAddr, userid, ePasswd,
											   cert, priKey, certPass, enveloped)
{
	hexastr = VerifyEnvelopedDataAndRecovery(sessionid, serverAddr,
		userid, ePasswd, cert, priKey, certPass, enveloped);
	var reStr = HexaStr2UniStr(hexastr);

	if( reStr == "" ) return hexastr;
	else return reStr;
		
}

function UnicodeSignAndRecovery2(server, userid, passwd, data)
{
	hexastr = Byte2HexaStr(data, false);
	return SignAndRecovery2(server, userid, passwd, hexastr);
}

function Byte2HexaStr(byte, bInsertBlank)
{
	var hexaCode = "0123456789ABCDEF";
	var code;
	var codeStr = "";

	for(i = 0; i < byte.length; i++) {
		code = byte.charCodeAt(i);
		if(code >= 16 * 16) {
			a = code % 16;
			b = ((code - a) / 16) % 16;
			c = ((code - (b * 16) - a) / (16 * 16)) % 16;
			d = (code - (c * 16 * 16) - (b * 16) - a) / (16 * 16 * 16);
			codeStr += hexaCode.charAt(d);
			codeStr += hexaCode.charAt(c);
			codeStr += hexaCode.charAt(b);
			codeStr += hexaCode.charAt(a);
		}
		else {
			a = code % 16;
			b = (code - a) / 16;
			codeStr += "00";
			codeStr += hexaCode.charAt(b);
			codeStr += hexaCode.charAt(a);
		}

		if(bInsertBlank == true)
			if(i % 2 == 1) codeStr += " ";
	}

	return codeStr;
}

function HexaStr2UniStr(hexaStr)
{
	var hexaCode = "0123456789ABCDEF";
	var uniStr = "";
	var unicode = 0;
	var hexalen;
	var i = 0;
	var j = 0;

	hexalen = hexaStr.length;

	while(i < hexalen) {
		c = hexaStr.charAt(i++);
		u = hexaCode.indexOf(c);

		if(u < 0) continue;

		unicode = unicode * 16 + u;

		if(j++ >= 3) {
			uniStr += String.fromCharCode(unicode);
			unicode = 0;
			j = 0;
		}
	}

	return uniStr;
}

function CheckObject()
{
	if(navigator.appName == 'Microsoft Internet Explorer') {
		/*if(checkControlIE()) {
			return false;
		}
	} else if(navigator.appName != 'Netscape') {
		alert('Current browser is unknown. This page is competible with IE or Netscape.');
		return false;
	}*/
	} else {
		alert('Current browser does not support this page. Try again with Microsoft Internet Explorer.');
		return false;
	}

	return true;
}

function getSessionID() 
{
	return SESSION_ID;
}


/* new algorithm load add by LJW 040311 */

function LoadAlg(b64dllstr) {
        var res = document.JXCEAL.LoadAlgDll(SESSION_ID, b64dllstr);
        return res;
}

function POP3LoadAlg(pop3sessionid, b64dllstr) {
        var res = document.JXCEAL.POP3LoadAlgDll(pop3sessionid, b64dllstr);
        return res;
}

function FormDecrypt(sessionid, priKey, passwd, envelopedContentInfo)
{
	var cert = "";
	hexastr = VerifyEnvelopedData(sessionid, cert, priKey, passwd, envelopedContentInfo);
	var reStr = HexaStr2UniStr(hexastr);
	
	if( reStr == "" ) return hexastr;
	else return reStr;
}

function replAmp(value) { return value.replace(/&/g, "%amp;%"); }
function replPlus(value) { return value.replace(/\+/g, "%2B"); }
function makeCT(key1, val1) 
{
    var tbe = key1+"="+replAmp(val1)+"&&";
    return _makeCT(tbe);
}
function makeCT(key1, val1, key2, val2) 
{
    var tbe = key1+"="+replAmp(val1)+"&"+
              key2+"="+replAmp(val2)+"&&";
    return _makeCT(tbe);
}
function makeCT(key1, val1, key2, val2, key3, val3) 
{
    var tbe = key1+"="+replAmp(val1)+"&"+
              key2+"="+replAmp(val2)+"&"+
              key3+"="+replAmp(val3)+"&&";
    return _makeCT(tbe);
}
function _makeCT(tbe) 
{
    var enc = document.JXCEAL.BlockEncrypt(SESSION_ID, tbe);
    if(enc.length == 0) {
      alert("Failed to Encryption of trans-data. "); return "";
    }
    return replPlus(escape(enc));
}

