var CAPICOM_STORE_OPEN_READ_ONLY = 0;
var CAPICOM_CURRENT_USER_STORE = 2;
var CAPICOM_ENCODE_BASE64 = 0;
var CAPICOM_E_CANCELLED = -2138568446;
var CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
var CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
var CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 128;
var CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9;
var CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0;

var CAPICOM_MY_STORE = "My"; // Локальное хранилище сертификатов
var CERTIFICATES = "CAPICOM.Certificates"; // Сертификаты
var STORE = "CAPICOM.Store"; // Хранилище сертификатов
var SIGNED_DATA = "CAPICOM.SignedData"; // Подписанные данные

// Заполняет список сертификатов. Вход: элемент типа selectbox
function fillSertificateList(certList, button, buttonID) {
    if (certList == null) {
        return false;
    }
    if (typeof (certList).toLowerCase() == "string"){
        //certList = document.getElementById(getElementFullID(button, buttonID, certList));
        certList = document.getElementById(certList);
    }

    if (!certList) {
        return false;
    }
    // очистим список сертификатов
    certList.options.length = 0;

    try {
        var MyStore = new ActiveXObject(STORE);
        var FilteredCertificates = new ActiveXObject(CERTIFICATES);
    } catch (e) {
        alert("Не установлен объект CAPICOM");
        addOpt(certList,"withoutECP","Без электронно-цифровой подписи!");
        return false;
    }

    try {
        MyStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
                        CAPICOM_STORE_OPEN_READ_ONLY);
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            alert("Ошибка при открытии хранилища сертификатов");
            addOpt(certList,"withoutECP","Без электронно-цифровой подписи!");
            return false;
        } else {
            addOpt(certList,"withoutECP","Без электронно-цифровой подписи!");
            return false;
        }
    }

    var FilteredCertificates = MyStore.Certificates.Find(
                    CAPICOM_CERTIFICATE_FIND_KEY_USAGE,
                    CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE).Find(
                    CAPICOM_CERTIFICATE_FIND_TIME_VALID);
    
    if (FilteredCertificates.Count > 0) {
        var sFieldsList;
        var aFields = new Array();
        for (i = 1; i <= FilteredCertificates.Count; i++) {
            var oOption = document.createElement("OPTION");
            certList.add(oOption);
            oOption.innerText = FilteredCertificates.Item(i).GetInfo(
                            CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME);
            oOption.value = FilteredCertificates.Item(i).Thumbprint;
        }
        // Вставим Без электронно-цифровой подписи!
        addOpt(certList,"withoutECP","Без электронно-цифровой подписи!");
    } else {
        alert("Не найдено ни одного действующего сертификата для ЭЦП");
        // Вставим Без электронно-цифровой подписи!
        oOption = document.createElement("OPTION");
        certList.add(oOption);
        oOption.innerText = "Без электронно-цифровой подписи!";//'Без электронно-цифровой подписи!';
        oOption.value = "withoutECP";
        return false;
    }

    // Clean Up
    MyStore = null;
    FilteredCertificates = null;
}

function addOpt(tgt,val,text) {
   var optNew = document.createElement("option");
   optNew.setAttribute("value",val);
   optNew.appendChild(document.createTextNode(text));
   tgt.appendChild(optNew);
}

// Получает короткое имя элемента
function extractShortName(name){
    if(name == null){
        return null;
    }

    var shortname = name;
    if(name.indexOf(":") != -1){
        var arr = name.split(":");
        shortname = arr[arr.length-1];
    }

    return shortname;
}

//Подписывает форму form.
//sertList - элемент selectbox, содержащий заполненный список ЭЦП
function signData(form, certList, button, buttonID) {
    if (certList == null) {
        return false;
    }

    if (typeof (certList).toLowerCase() == "string"){
        certList = document.getElementById(certList);
    }

    if (!certList) {
        return false;
    }

    if(certList.options.length != 0 && certList.options[certList.selectedIndex].value =="withoutECP"){
        return false;
    }

    if(certList.options.length == 0){
        alert("Не найдено ни одного сертификата ЭЦП");
        return false;
    }

    var data = ""; // Данные для подписи
    var orderData = ""; // Порядок в котором собирались данные для подписи

    for(var i=0;i<form.elements.length;i++){
        if (form.elements[i].name != ''
            && extractShortName(form.elements[i].name) != "orderData"
            && extractShortName(form.elements[i].name) != "data"
            && extractShortName(form.elements[i].name) != "signature"
            && extractShortName(form.elements[i].name) != "signatures"){
            //if (form.elements[i].type == "checkbox" ||  form.elements[i].type == "radio" || form.elements[i].type == "text" || form.elements[i].type == "hidden" ||form.elements[i].type == "textarea"){
            if ( form.elements[i].type == "select-one"
                || form.elements[i].type == "checkbox"
                || form.elements[i].type == "radio"
                || form.elements[i].type == "text"
                || form.elements[i].type == "textarea"){
                if ((form.elements[i].type == "checkbox" || form.elements[i].type == "radio")
                    && form.elements[i].checked != true){
                    continue;
                }
                //alert(form.elements[i].name);
                data = data + extractShortName(form.elements[i].name) + "="
                    + form.elements[i].value + "|";
                orderData = orderData + extractShortName(form.elements[i].name) + "|";
                
            }
        }
    }
//    alert("data = "+data);
//    alert("orderdata = "+orderData);
    // получим и добавим нередактируемые данные, ранее сформированные и добавленные в сигнатуру
    otherSign = document.getElementById(getElementFullID(button, buttonID, 'signature')).value;
    otherOrder = document.getElementById(getElementFullID(button, buttonID, 'orderData')).value;
    data = data + otherSign;
    orderData = orderData + otherOrder;
//    alert("otherSign = "+otherSign);
//    alert("otherOrder = "+otherOrder);

    var MyStore = null;
    var SignedData = null;
    var Signer = null;
    try {
        MyStore = new ActiveXObject(STORE);
        SignedData = new ActiveXObject("CAPICOM.SignedData");
        Signer = new ActiveXObject("CAPICOM.Signer");
    } catch (e) {
        alert("Не установлен объект CAPICOM");
        return false;
    }
    try {
        MyStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
                        CAPICOM_STORE_OPEN_READ_ONLY);
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            alert("Ошибка при открытии персонального хранилища сертификатов.");
            return false;
        }
    }

    SignedData.Content = data;

    //alert(certList.selectedIndex);
    try {
        Signer.Certificate = MyStore.Certificates.Find(
                        CAPICOM_CERTIFICATE_FIND_KEY_USAGE,
                        CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE).Find(
                        CAPICOM_CERTIFICATE_FIND_TIME_VALID).Item(certList.selectedIndex+1);

        var signature = SignedData.Sign(Signer, false, CAPICOM_ENCODE_BASE64);
       // form.signature.value = signature;
       // form.orderData.value = orderData;
        document.getElementById(getElementFullID(button, buttonID, 'data')).value = data;
        document.getElementById(getElementFullID(button, buttonID, 'signature')).value = signature;
        document.getElementById(getElementFullID(button, buttonID, 'orderData')).value = orderData;
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            alert("Ошибка во время подписи данных: " + e.description);
            return false;
        }
    }
}

function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;

    do { curDate = new Date(); }
    while(curDate-date < millis);
} 

//Функция для подписи документа на клиенте.
//Форма должна содержать только 1 документ.
//Создается открепленная подпись.
function signDocument(form, certList, button, buttonID) {
    try {
        //Очистим поле сигнатуры, которое возможно осталось от прошлой загрузки файла
        document.getElementById(getElementFullID(button, buttonID, 'signatureDoc')).value = null;
    } catch (e) {
        //
    }
    
    if (certList == null || certList == "") {
        //alert("Не задано поле, содержащее ЭЦП");
        return true;
    }
    if (typeof (certList).toLowerCase() == "string"){
        certList = document.getElementById(certList);
    }
    if (!certList) {
        //alert("Не найдено поле, содержащее ЭЦП");
        return true;;
    }
    if(certList.options.length != 0 && certList.options[certList.selectedIndex].value =="withoutECP"){
        //pausecomp(1000);
        return true;;
    }

    var data = ""; // Данные для подписи
    var orderData = ""; // Порядок в котором собирались данные для подписи

//	for ( var i = 0; i < form.elements.length; i++) {
//		if (form.elements[i].name != '' && form.elements[i].name != "orderData"
//				&& form.elements[i].name != "signature") {
//			if (form.elements[i].type == "file") {
//				//data = Base64.encode( readFileToString(form.elements[i].value) );
//				data = readFileToString(form.elements[i].value);
//				orderData = form.elements[i].name;
//			}
//		}
//	}

//    for(var i=0;i<document.frames.length;i++){
//        var fileElement = document.frames[i].document.getElementById("upload");
//        if (fileElement != null){
//            data = readFileToString(fileElement.value);
//            orderData = extractShortName(fileElement.name);
//        }
//    }
    data = document.getElementById(getElementFullID(button, buttonID, 'digest64Doc')).value
//    data = readFileToString(document.getElementById(getElementFullID(button, buttonID, 'fileNameClientDoc')).value)
    orderData = extractShortName(document.getElementById(getElementFullID(button, buttonID, 'localFileNameDoc')).value)

    //alert('data = ' + data);
    //alert('orderData = ' + orderData);

    if(data == ""){
        alert("Ошибка: Файл не выбран или пустой файл.");
        return false;
    }

    var MyStore = new ActiveXObject("CAPICOM.Store");
    var SignedData = new ActiveXObject("CAPICOM.SignedData");
    var Signer = new ActiveXObject("CAPICOM.Signer");

    try {
        MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My",
                        CAPICOM_STORE_OPEN_READ_ONLY);
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            alert("Ошибка при открытии персонального хранилища сертификатов.");
            return false;
        }
    }

    SignedData.Content = data;

    try {
        Signer.Certificate = MyStore.Certificates.Find(
                        CAPICOM_CERTIFICATE_FIND_KEY_USAGE,
                        CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE).Find(
                        CAPICOM_CERTIFICATE_FIND_TIME_VALID).Item(certList.selectedIndex+1);
        var signature = SignedData.Sign(Signer, true, CAPICOM_ENCODE_BASE64);
        //alert('signature = ' + signature);
//        form.signature.value = signature;
//        form.orderData.value = orderData;
        document.getElementById(getElementFullID(button, buttonID, 'signatureDoc')).value = signature;
        document.getElementById(getElementFullID(button, buttonID, 'orderDataDoc')).value = orderData;
        //alert('FullID = ' + getElementFullID(button, buttonID, 'signatureDoc'));
        //alert('value = ' + document.getElementById(getElementFullID(button, buttonID, 'signatureDoc')).value);
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            alert("Ошибка во время подписи данных: " + e.description);
            return false;
        }
    }
    return true;
}

function readFileToString(strFileName) {
    var strContents;
    strContents = "";

    if (isFSOEnabled()) {
        objFSO = new ActiveXObject("Scripting.FileSystemObject");
        if (objFSO.FileExists(strFileName)) {
            strContents = objFSO.OpenTextFile(strFileName, 1).ReadAll();
        }
    }

    return strContents;
}
function isFSOEnabled() {
    var result = false;
    try {
        new ActiveXObject("Scripting.FileSystemObject");
        result = true;
    } catch (e) {
        result = false;
    }

    return result;
}
function getFSOInfo() {
    var result;
    try {
        new ActiveXObject("Scripting.FileSystemObject");
        result = 'Объект ActiveX Scripting.FileSystemObject создан успешно';
    } catch (e) {
        result = 'Ошибка при создании объекта ActiveX Scripting.FileSystemObject';
    }

    return (result);
}

// возвращает полное наименование элемента на форме
function getElementFullID (fromInputTextElement, fromInputTextID, toInputTextID) {
    ls_str = fromInputTextElement.id;
    li_pp = ls_str.indexOf(fromInputTextID);
    ls_str = ls_str.substring(0, li_pp) + toInputTextID;
    return ls_str;
}

// формирует строку с сигнатурой
function formSignStr(element, elementId, array) {
    str = "";
    for(var i=0;i<array.length;i++){
        if (document.getElementById(getElementFullID(element, elementId, array[i])) != null) {
            str = str + array[i] + "=" + document.getElementById(getElementFullID(element, elementId, array[i])).innerHTML + "|";
        }
    }
    return str;
}

// формирует строку с порядком следования элементов
function formOrderStr(element, elementId, array) {
    orderStr = "";
    for(var i=0;i<array.length;i++){
        if (document.getElementById(getElementFullID(element, elementId, array[i])) != null) {
            orderStr = orderStr + array[i] + "|";
        }
    }
    return orderStr;
}


/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
var Base64 = {

    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
                    this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
                    this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    },

    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output = output + String.fromCharCode(chr1);

            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }

        }

        output = Base64._utf8_decode(output);

        return output;

    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }
}

function submitForm()
 {
// 	var fileUploadFrame = document.getElementById('form:inputFileComponent:uploadFrame');
//
// 	var fileUploadDocument = fileUploadFrame.contentWindow || fileUploadFrame.contentDocument;
//
// 	if (fileUploadDocument.document)
// 	{
// 		fileUploadDocument = fileUploadDocument.document;
// 	}
//      fileUploadDocument.getElementById('fileUploadForm').submit();

//    var fr = document.getElementsByTagName("FRAME");
//    if (fr==null){
//        alert('fr==null');
//        var fileUploadForm = document.getElementById("fileUploadForm")
//        if (fileUploadForm != null){
//            alert('Submit!!!');
//            fileUploadForm.submit();
//        }
//    }
//    if (fr!=null){
//        alert(fr.length);
//        for(var i=0;i<fr.length;i++){
//            var fileUploadForm = fr[i].document.getElementById("fileUploadForm");
//            if (fileUploadForm != null){
//                alert('Submit fr!!!');
//                fileUploadForm.submit();
//            }
//        }
//    }
    if (document.frames!=null){
//        alert('document.frames.length ='+document.frames.length);
        for(var i=0;i<document.frames.length;i++){

//            alert('document.frames['+i+'].document.getElementById("fileUploadForm") ='+document.frames[i].document.getElementById("fileUploadForm"));
            var fileUploadForm = document.frames[i].document.getElementById("fileUploadForm");
            if (fileUploadForm != null){
//                alert('submit');
                fileUploadForm.submit();
            }
        }
    }
}

// Очищает hidden-поля для ЭЦП
function crearData(button, buttonID) {
    document.getElementById(getElementFullID(button, buttonID, 'data')).value = "";
    document.getElementById(getElementFullID(button, buttonID, 'signature')).value = "";
    document.getElementById(getElementFullID(button, buttonID, 'orderData')).value = "";
}

//Проверяем, может ли клиент подписывать ЭЦП.
//sertList - элемент selectbox, содержащий заполненный список ЭЦП
function checkSign(form, certList, button, buttonID) {
    document.getElementById(getElementFullID(button, buttonID, 'result')).value = "FALSE";
    if (certList == null) {
        document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Не найдено ни одного сертификата ЭЦП";
        return false;
    }
    if (typeof (certList).toLowerCase() == "string"){
        certList = document.getElementById(certList);
    }
    if (!certList) {
        document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Не найдено ни одного сертификата ЭЦП";
        return false;
    }
    if(certList.options.length == 0){
        document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Не найдено ни одного сертификата ЭЦП";
        return false;
    }

    var MyStore = null;
    var SignedData = null;
    var Signer = null;

    try {
        MyStore = new ActiveXObject(STORE);
        SignedData = new ActiveXObject("CAPICOM.SignedData");
        Signer = new ActiveXObject("CAPICOM.Signer");
    } catch (e) {
        document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Не установлен объект CAPICOM";
        return false;
    }

    try {
        MyStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
                        CAPICOM_STORE_OPEN_READ_ONLY);
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Ошибка при открытии персонального хранилища сертификатов.";
            return false;
        }
    }

    var data = "Тест ЭЦП"; // Данные для подписи
    var orderData = ""; // Порядок в котором собирались данные для подписи

    SignedData.Content = data;

    //alert(certList.selectedIndex);
    try {
        Signer.Certificate = MyStore.Certificates.Find(
                        CAPICOM_CERTIFICATE_FIND_KEY_USAGE,
                        CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE).Find(
                        CAPICOM_CERTIFICATE_FIND_TIME_VALID).Item(certList.selectedIndex+1);
        var signature = SignedData.Sign(Signer, false, CAPICOM_ENCODE_BASE64);
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Ошибка во время подписи данных: " + e.description;
            return false;
        }
    }
    document.getElementById(getElementFullID(button, buttonID, 'data')).value = data;
    document.getElementById(getElementFullID(button, buttonID, 'signature')).value = signature;
    document.getElementById(getElementFullID(button, buttonID, 'result')).value = "TRUE";
}

//Проверяем, может ли клиент подписывать ЭЦП и заполняем ID выбранного сертификата.
//sertList - элемент selectbox, содержащий заполненный список ЭЦП
function checkSignStep(form, certList, button, buttonID) {
    document.getElementById(getElementFullID(button, buttonID, 'result')).value = "FALSE";
    if (certList == null) {
        document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Не найдено ни одного сертификата ЭЦП";
        return false;
    }
    if (typeof (certList).toLowerCase() == "string"){
        certList = document.getElementById(certList);
    }
    if (!certList) {
        document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Не найдено ни одного сертификата ЭЦП";
        return false;
    }
    if(certList.options.length == 0){
        document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Не найдено ни одного сертификата ЭЦП";
        return false;
    }

    var MyStore = null;
    var SignedData = null;
    var Signer = null;

    try {
        MyStore = new ActiveXObject(STORE);
        SignedData = new ActiveXObject("CAPICOM.SignedData");
        Signer = new ActiveXObject("CAPICOM.Signer");
    } catch (e) {
        document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Не установлен объект CAPICOM";
        return false;
    }

    try {
        MyStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
                        CAPICOM_STORE_OPEN_READ_ONLY);
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Ошибка при открытии персонального хранилища сертификатов.";
            return false;
        }
    }

    var data = "Тест ЭЦП"; // Данные для подписи
    var orderData = ""; // Порядок в котором собирались данные для подписи

    SignedData.Content = data;

    //alert(certList.selectedIndex);
    try {
        Signer.Certificate = MyStore.Certificates.Find(
                        CAPICOM_CERTIFICATE_FIND_KEY_USAGE,
                        CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE).Find(
                        CAPICOM_CERTIFICATE_FIND_TIME_VALID).Item(certList.selectedIndex+1);

        document.getElementById(getElementFullID(button, buttonID, 'sertId')).value = MyStore.Certificates.Find(
                        CAPICOM_CERTIFICATE_FIND_KEY_USAGE,
                        CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE).Find(
                        CAPICOM_CERTIFICATE_FIND_TIME_VALID).Item(certList.selectedIndex+1).Thumbprint

        var signature = SignedData.Sign(Signer, false, CAPICOM_ENCODE_BASE64);
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            document.getElementById(getElementFullID(button, buttonID, 'errMsg')).value = "Ошибка во время подписи данных: " + e.description;
            return false;
        }
    }
    document.getElementById(getElementFullID(button, buttonID, 'data')).value = data;
    document.getElementById(getElementFullID(button, buttonID, 'signature')).value = signature;
    document.getElementById(getElementFullID(button, buttonID, 'result')).value = "TRUE";
}

//Подписывает форму form.
//sertList - элемент selectbox, содержащий заполненный список ЭЦП
function signDataStep(form, certList, button, buttonID) {
    if (certList == null) {
        return false;
    }
    if (typeof (certList).toLowerCase() == "string"){
        certList = document.getElementById(certList);
    }
    if (!certList) {
        return false;
    }
    
    if(certList.options.length != 0 && certList.options[certList.selectedIndex].value =="withoutECP"){
        return false;
    }
    
    if(certList.options.length == 0){
        alert("Не найдено ни одного сертификата ЭЦП");
        return false;
    }

    var data = ""; // Данные для подписи
    var orderData = ""; // Порядок в котором собирались данные для подписи

    for(var i=0;i<form.elements.length;i++){
        if (form.elements[i].name != ''
            && extractShortName(form.elements[i].name) != "orderData"
            && extractShortName(form.elements[i].name) != "data"
            && extractShortName(form.elements[i].name) != "signature"
            && extractShortName(form.elements[i].name) != "signatures"){
            //if (form.elements[i].type == "checkbox" ||  form.elements[i].type == "radio" || form.elements[i].type == "text" || form.elements[i].type == "hidden" ||form.elements[i].type == "textarea"){
            if ( form.elements[i].type == "select-one"
                || form.elements[i].type == "checkbox"
                || form.elements[i].type == "radio"
                || form.elements[i].type == "text"
                || form.elements[i].type == "textarea"){
                if ((form.elements[i].type == "checkbox" || form.elements[i].type == "radio")
                    && form.elements[i].checked != true){
                    continue;
                }
                data = data + extractShortName(form.elements[i].name) + "="
                    + form.elements[i].value + "|";
                orderData = orderData + extractShortName(form.elements[i].name) + "|";

            }
        }
    }
//    alert("data = "+data);
//    alert("orderdata = "+orderData);
    // получим и добавим нередактируемые данные, ранее сформированные и добавленные в сигнатуру
    otherSign = document.getElementById(getElementFullID(button, buttonID, 'signature')).value;
    otherOrder = document.getElementById(getElementFullID(button, buttonID, 'orderData')).value;
    data = data + otherSign;
    orderData = orderData + otherOrder;
//    alert("otherSign = "+otherSign);
//    alert("otherOrder = "+otherOrder);

    var MyStore = null;
    var SignedData = null;
    var Signer = null;

    try {
        MyStore = new ActiveXObject(STORE);
        SignedData = new ActiveXObject("CAPICOM.SignedData");
        Signer = new ActiveXObject("CAPICOM.Signer");
    } catch (e) {
        alert("Не установлен объект CAPICOM");
        return false;
    }

    try {
        MyStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
                        CAPICOM_STORE_OPEN_READ_ONLY);
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            alert("Ошибка при открытии персонального хранилища сертификатов.");
            return false;
        }
    }

    SignedData.Content = data;


    //alert(certList.selectedIndex);
    try {
        Signer.Certificate = MyStore.Certificates.Find(
                        CAPICOM_CERTIFICATE_FIND_KEY_USAGE,
                        CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE).Find(
                        CAPICOM_CERTIFICATE_FIND_TIME_VALID).Item(certList.selectedIndex+1);
        //Проверяем, совпадает ли текущий сертификат с выбранным.
        var sertIdCur = MyStore.Certificates.Find(
                        CAPICOM_CERTIFICATE_FIND_KEY_USAGE,
                        CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE).Find(
                        CAPICOM_CERTIFICATE_FIND_TIME_VALID).Item(certList.selectedIndex+1).Thumbprint;
        document.getElementById(getElementFullID(button, buttonID, 'sertIdCur')).value = sertIdCur;
        var sertId = document.getElementById(getElementFullID(button, buttonID, 'sertId')).value;
        if (sertId!=null&&sertId!=''&&sertId.toString().length>0&& sertId!=sertIdCur){
                            return false;
                        }

        var signature = SignedData.Sign(Signer, false, CAPICOM_ENCODE_BASE64);
        
       // form.signature.value = signature;
       // form.orderData.value = orderData;
//       alert("signature = "+signature);
        document.getElementById(getElementFullID(button, buttonID, 'data')).value = data;
        document.getElementById(getElementFullID(button, buttonID, 'signature')).value = signature;
        document.getElementById(getElementFullID(button, buttonID, 'orderData')).value = orderData;
        
    } catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            alert("Ошибка во время подписи данных: " + e.description);
            return false;
        }
    }
}

function isSertStepCheck () {
    if (document.getElementById('formMain:indSignatute').checked) return true;
    return false;
}

function clearData(){
    try{document.getElementById('formMain:data').value = ""}catch(e){};
    try{document.getElementById('formMain:signature').value = ""}catch(e){};
    try{document.getElementById('formMain:orderData').value = ""}catch(e){};
    try{document.getElementById('formMain:dataDoc').value = ""}catch(e){};
    try{document.getElementById('formMain:orderDataDoc').value = ""}catch(e){};
    try{document.getElementById('formMain:signatureDoc').value = ""}catch(e){};
    try{document.getElementById('formMain:errMsg').value = ""}catch(e){};
    try{document.getElementById('formMain:result').value = ""}catch(e){};    
}

////Проверяем, совпадает ли текущий сертификат с выбранным.
////sertList - элемент selectbox, содержащий заполненный список ЭЦП
//function isSertChange(form, certList, button, buttonID) {
//    var sertId = document.getElementById(getElementFullID(button, buttonID, 'sertId')).value;
//    if(sertId==null)return true;
//
//    if (certList == null) {
//        alert("Не найдено ни одного сертификата ЭЦП");
//        return false;
//    }
//    if (typeof (certList).toLowerCase() == "string"){
//        certList = document.getElementById(certList);
//    }
//    if (!certList) {
//        alert("Не найдено ни одного сертификата ЭЦП");
//        return false;
//    }
//    if(certList.options.length == 0){
//        alert("Не найдено ни одного сертификата ЭЦП");
//        return false;
//    }
//
//    var MyStore = null;
//
//    try {
//        MyStore = new ActiveXObject(STORE);
//    } catch (e) {
//        alert("Не установлен объект CAPICOM");
//        return false;
//    }
//
//    try {
//        MyStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
//                        CAPICOM_STORE_OPEN_READ_ONLY);
//    } catch (e) {
//        if (e.number != CAPICOM_E_CANCELLED) {
//            alert("Ошибка при открытии персонального хранилища сертификатов.");
//            return false;
//        }
//    }
//
//    //alert(certList.selectedIndex);
//    try {
//        var sertIdCur = MyStore.Certificates.Find(
//                        CAPICOM_CERTIFICATE_FIND_KEY_USAGE,
//                        CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE).Find(
//                        CAPICOM_CERTIFICATE_FIND_TIME_VALID).Item(certList.selectedIndex+1).Thumbprint;
//        document.getElementById(getElementFullID(button, buttonID, 'sertIdCur')).value = sertIdCur;
//        alert("sertIdCur = " + sertIdCur);
//        if (sertId != sertIdCur){
//                            alert("Выбранный сертификат не совпадает с проверенным");
//                            return false;
//                        }
//
//    } catch (e) {
//        if (e.number != CAPICOM_E_CANCELLED) {
//            alert("Ошибка во время проверки сертификата: " + e.description);
//            return false;
//        }
//    }
//    return true;
//}
