function SignDataForm(dataToSign, dataSigned)
{
	dataToSign.value = trimStr(dataToSign.value);
	
	if (dataToSign.value != "") {
		var signed_data = [""];
		var signResult = -1;
		var dataToSign_text = normalizeNewLines(dataToSign.value);
		
		var dataSigned_text = "";
		
		dataSigned.value = "";
		
		if (window.crypto && window.crypto.signText) {
			signResult = SignDataCrypto(dataToSign_text, signed_data);
		} else {
			signResult = SignDataCAPICOM(dataToSign_text, signed_data);
		}
		
		switch (signResult) {
		case 0:  //OK
			dataSigned_text = PKCS7_BASE64_HEADER + "\r\n" + signed_data[0];
			if (dataSigned_text.charAt(dataSigned_text.length - 1) != '\n') {
				dataSigned_text += "\r\n";
			}
			dataSigned.value = dataSigned_text + PKCS7_BASE64_FOOTER;
			break;
			
		case 1:
			alert(msg_sign_error_capicom_notFound);
			break;
			
		case 2:
			alert(msg_sign_error_capicom_notLoad);
			break;
			
		case 3: //no cert selected
			break;
			
		case 4:
			alert(msg_sign_error_capicom_internalError + ' ' + msg_sign_error_capicom_additionalInfo + ' ' + signed_data[0]);
			break;
			
		case 10: //error:noMatchingCert
			alert(msg_sign_error_crypto_noMatchingCert);
			break;
			
		case 11: //error:userCancel
			break;
			
		case 12: //error:internalError
			alert(msg_sign_error_crypto_internalError);
			break;
		}
	}
	
	return false;
}

function CoSignDataForm(dataSigned, dataCoSigned)
{
	dataSigned = trimStr(dataSigned.value);
	
	if (dataSigned != "") {
		if (dataSigned.length > PKCS7_BASE64_HEADER.length + PKCS7_BASE64_FOOTER.length) {
			if ((dataSigned.substr(0, PKCS7_BASE64_HEADER.length) == PKCS7_BASE64_HEADER) && 
				(dataSigned.substr(dataSigned.length - PKCS7_BASE64_FOOTER.length) == PKCS7_BASE64_FOOTER)) {
				var pkcs7data_base64 = trimStr(dataSigned.substr(PKCS7_BASE64_HEADER.length, dataSigned.length - (PKCS7_BASE64_HEADER.length + PKCS7_BASE64_FOOTER.length)));
				
				var coSigned_data = [""];
				var coSignResult = -1;
				
				var dataCoSigned_text = "";
				dataCoSigned.value = dataCoSigned_text;
				
				if (window.crypto && window.crypto.signText) {
				} else {
					coSignResult = CoSignDataCAPICOM(pkcs7data_base64, coSigned_data);
				}
				
				switch (coSignResult) {
				case 0:  //OK
					dataCoSigned_text = PKCS7_BASE64_HEADER + "\r\n" + coSigned_data[0];
					if (dataCoSigned_text.charAt(dataCoSigned_text.length - 1) != '\n') {
						dataCoSigned_text += "\r\n";
					}
					dataCoSigned.value = dataCoSigned_text + PKCS7_BASE64_FOOTER;
					break;
					
				case 1:
					alert(msg_sign_error_capicom_notFound);
					break;
					
				case 2:
					alert(msg_sign_error_capicom_notLoad);
					break;
					
				case 3: //no cert selected
					break;
					
				case 4:
					alert(msg_sign_error_capicom_internalError + ' ' + msg_sign_error_capicom_additionalInfo + ' ' + coSigned_data[0]);
					break;
					
				case 10: //error:noMatchingCert
					alert(msg_sign_error_crypto_noMatchingCert);
					break;
					
				case 11: //error:userCancel
					break;
					
				case 12: //error:internalError
					alert(msg_sign_error_crypto_internalError);
					break;
				}
			}
		}
	}
	
	return false;
}

function normalizeNewLines(s) {
	var ws_cr = String.fromCharCode(13);
	
	var v_length = s.length;
	
	if (v_length > 0) {
		var iTemp = v_length - 1;
		
		while (iTemp > -1) {
			if (s.charAt(iTemp) == ws_cr) {
				s = s.substring(0, iTemp) + s.substring(iTemp + 1);
			}
			
			iTemp = iTemp - 1;
		}
	}
	
	return s;
}

function trimStr(s) {
	if (s.length < 1) {
		return "";
	}
	
	s = rightTrimStr(s);
	s = leftTrimStr(s);
	if (s == "") {
		return "";
	} else {
		return s;
	}
} //End Function

function rightTrimStr(s) {
	var ws_space = String.fromCharCode(32);
	var ws_cr = String.fromCharCode(13);
	var ws_lf = String.fromCharCode(10);
	var ws_tab = String.fromCharCode(9);
	
	var v_length = s.length;
	var strTemp = "";
	if (v_length < 0) {
		return "";
	}
	var iTemp = v_length - 1;
	
	while (iTemp > -1) {
		if ((s.charAt(iTemp) == ws_space) || (s.charAt(iTemp) == ws_cr) || (s.charAt(iTemp) == ws_lf) || (s.charAt(iTemp) == ws_tab)) {
		} else {
			strTemp = s.substring(0, iTemp + 1);
			break;
		}
		iTemp = iTemp - 1;
	} //End While

	return strTemp;
} //End Function

function leftTrimStr(s) {
	var ws_space = String.fromCharCode(32);
	var ws_cr = String.fromCharCode(13);
	var ws_lf = String.fromCharCode(10);
	var ws_tab = String.fromCharCode(9);
	if (v_length < 1) {
		return "";
	}
	var v_length = s.length;
	var strTemp = "";

	var iTemp = 0;

	while (iTemp < v_length) {
		if ((s.charAt(iTemp) == ws_space) || (s.charAt(iTemp) == ws_cr) || (s.charAt(iTemp) == ws_lf) || (s.charAt(iTemp) == ws_tab)) {
		} else {
			strTemp = s.substring(iTemp, v_length);
			break;
		}
		iTemp = iTemp + 1;
	} //End While
	
	return strTemp;
} //End Function
