﻿function CertificateHelper(storeName) {

    if (!IsCAPICOMInstalled())
        Load();

    if (!IsCAPICOMInstalled()) {
        alert("Can't install CAPICOM object!")
        return;
    }
    CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
    CAPICOM_CURRENT_USER_STORE = 2;
    CAPICOM_STORE_OPEN_READ_ONLY = 0;


    CAPICOM_INFO_SUBJECT_SIMPLE_NAME = 0;
    CAPICOM_INFO_ISSUER_SIMPLE_NAME = 1;
    CAPICOM_INFO_SUBJECT_EMAIL_NAME = 2;

    CAPICOM_PROPID_FRIENDLY_NAME = 11;

    CAPICOM_ENCODE_BINARY = 1;
    var Store = new ActiveXObject("CAPICOM.Store");

    this.GetCertificateByThumbprint = function(thumbprint) {
        try {
            Store.Open(CAPICOM_CURRENT_USER_STORE, storeName, CAPICOM_STORE_OPEN_READ_ONLY);

            var Certificates = Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint);

            return Certificates;
        }
        catch (e) {
            alert("Can't find certificate!");
        }
    }
    this.GetAllCertificates = function() {
        var cerList = new Array();
        Store.Open(CAPICOM_CURRENT_USER_STORE, storeName, CAPICOM_STORE_OPEN_READ_ONLY);
        for (i = 1; i <= Store.Certificates.Count; i++)
            cerList[i - 1] = Store.Certificates.item(i);
        return cerList;
    }

    this.GetCertInfoString = function(thumbprint) {
        var Certificates = this.GetCertificateByThumbprint(thumbprint);
        if (Certificates) {
            var res = Certificates.Item(1).GetInfo(CAPICOM_INFO_SUBJECT_SIMPLE_NAME);
            res += "; " + Certificates.Item(1).GetInfo(CAPICOM_INFO_SUBJECT_EMAIL_NAME);
           return res;
        }
    }
    this.displayCert = function(thumbprint) {
        var Certificates = this.GetCertificateByThumbprint(thumbprint);
        if (Certificates.Count > 0) Certificates.Item(1).Display();
        return;
    }
    this.Import = function(body) {
        var cert = new ActiveXObject("CAPICOM.Certificate");
        cert.Import(body);
        return cert;
    }

    this.GetFriendlyName = function(cert) {
        var result = "";
        for (j = 1; j <= cert.ExtendedProperties().Count; j++) {
            var property = cert.ExtendedProperties(j);
            if (property.PropID == CAPICOM_PROPID_FRIENDLY_NAME) {
                result = property.Value(CAPICOM_ENCODE_BINARY);
                var start = result.indexOf('\0');
                result = result.substr(0, start);
                return result;
            }
        }
        return result;
    }

    function IsCAPICOMInstalled() {
        if (typeof (oCAPICOM) == "object") {
            if ((oCAPICOM.object != null)) {
                // We found CAPICOM!
                return true;
            }
        }
    }

//    function RemoveCertificate(thumbprint) {
//    try
//    {
//        for(int i=0; i<Store.Certificates.Count; i++)
//            if(Store.Certificates[i].Thumbprint == thumbprint)
//                Store.Certificates.Remove(i);
//    }
//    catch (e) {
//        alert(e.description);
//    }
//}

    function Load() {
        var countDownloading = 100;
        if (document.getElementById('oCAPICOM') == null) {
            var cApi = '<OBJECT ID="oCAPICOM" WIDTH=0 HEIGHT=0 CLASSID="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679" codebase="capicom.dll"></OBJECT>';
            document.body.insertAdjacentHTML('beforeEnd', cApi);
        }
    }
}

