﻿CAPICOM_LOCAL_MACHINE_STORE = 1;
CAPICOM_CURRENT_USER_STORE = 2;
CAPICOM_STORE_OPEN_READ_ONLY = 0;
CAPICOM_ENCODE_BASE64 = 0;
CAPICOM_ENCODE_BINARY = 1;
CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;

CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0;
CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME = 1;

ch = false;

function Sign(text, certificate, path) {
	storeName = "My";

	storeLocation = CAPICOM_CURRENT_USER_STORE;
	CertStore = new ActiveXObject("CAPICOM.Store");
	try {
		CertStore.Open(storeLocation, storeName, CAPICOM_STORE_OPEN_READ_ONLY);
		certificates = new ActiveXObject('CAPICOM.Certificate');

		certs = CertStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, certificate, 0);
		cert = null;
		if (certs.Count != 0) {
			cert = certs.Item(1);
			signer = new ActiveXObject("CAPICOM.Signer");
			signer.Certificate = cert;
			signData = new ActiveXObject("CAPICOM.SignedData");
			signData.Content = text;
			try {
				var sign = signData.Sign(signer, true, CAPICOM_ENCODE_BASE64);
				GetXmlHttpRequest(sign, path);
			}
			catch (e) {
				i = 0;
				alert('The Operation Failed!');
				return null;
			}
		}
		else {
			alert('Error:No signing certificate can be found!');
			return null;
		}
	}
	catch (e) {
		alert('This operation is cancel!');
		return null;
	}
}

function Decrypt(text, certificate, path) {
	ch = false;
	storeName = "My";
	storeLocation = CAPICOM_CURRENT_USER_STORE;
	CertStore = new ActiveXObject("CAPICOM.Store");
	try {
		CertStore.Open(storeLocation, storeName, CAPICOM_STORE_OPEN_READ_ONLY);
		certs = CertStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, certificate, 0);
		var cert;
		var EnvelopedData;
		if (certs.Count != 0) {
			cert = certs.Item(1);
			Utilities = new ActiveXObject('CAPICOM.Utilities');
			EnvelopedData = new ActiveXObject('CAPICOM.EnvelopedData');
			EnvelopedData.Recipients.Add(cert);
			try {
				var enc = Utilities.Base64Decode(text);
				EnvelopedData.Decrypt(enc);
				var dec = EnvelopedData.Content;
				ch = true;

				GetXmlHttpRequest(dec, path);
			}
			catch (e) {
				ch = false;
				i = 0;
				alert('This Operation Failed!');
				return e.message;
			}
		}
		else {
			ch = false;
			alert('Error:No decryption certificate can be found!');
			return null;
		}
	}
	catch (e) {
		ch = false;
		alert('This operation is cancel!');
	}
}

function redirect(redirectpath) {
	try {
		if (ch == true) {
			window.location.href(redirectpath);
		}
	}
	catch (e) {
	}
}

function GetXmlHttpRequest(text, path) {
	var xmlHttp;
	try {
		xmlHttp = new XMLHttpRequest();
	}
	catch (e) {
		try {
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			try {
				xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e) {
				alert("Your browser does not support AJAX!");
				return false;
			}
		}
	}

	xmlHttp.open("GET", path + text, true);
	xmlHttp.send();

	xmlHttp.onreadystatechange = function() {
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				document.getElementById('ctl00_cphRoot_divXmlHttp').innerHTML = xmlHttp.responseText;
			}
			else {
				alert("Problem retrieving XML data");
			}
		}
	}
}  
