function getParamValues (param_container, par_prefix)
{
  var request = '';
  for (var parameter = param_container.firstChild; parameter != null; parameter = parameter.nextSibling)
  {
    var p_name = parameter.attributes.getNamedItem('name') == null ? '' : parameter.attributes.getNamedItem('name').nodeValue;
    if (parameter.nodeName.toLowerCase() == 'parameter')
    {
      var control_id = (par_prefix == null || par_prefix == '' ? '' : par_prefix + '_') +
        'par_' + p_name;
      var p_type = parameter.attributes.getNamedItem('type') == null ? 'varchar' : parameter.attributes.getNamedItem('type').nodeValue;
      // p_type == 'image' ? Convert.ToBase64String(_file_upload_.FileBytes) :
      var obj = document.getElementById(control_id);
      if (obj != null)
      {
        var val = obj.value;
        request += '<parameter name="' + p_name + '" type="' + p_type + '" value="' + val.replace(new RegExp('"','g'), '&quot;') + '" />';
      }
    }
    else if (parameter.nodeName.toLowerCase() == "array")
    {
      var control_id = (par_prefix == null || par_prefix == '' ? '' : par_prefix + '_') +
        'arr_' + p_name;
      var sb1 = '';
      var rows = 0;

      if (parameter.hasChildNodes())
      {
        var obj = document.getElementById(control_id + '_lastindex');
        var last_index = obj == null ? 0 : parseInt(obj.value);
        if (isNaN(last_index)) last_index = 0;
        
        for (var i = 0; i <= last_index; i++)
        {
           var sb2 = getParamValues(parameter, control_id + '_' + i);
           if (sb2.length > 0)
           {
             sb1 += '<item>' + sb2 + '</item>';
             rows++;
           }
        }
      }
      if (rows > 0)
      {
        request += '<array name="' + p_name + '">' + sb1 + '</array>';
      }
    }
  }
  return request;
}

function generateRequest (function_definition)
{
  var function_id = function_definition.attributes.getNamedItem('id').nodeValue;
  return '<function id="' + function_id + '">' +
    getParamValues(function_definition) + '</function>';
}

var 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_INFO_ISSUER_EMAIL_NAME = 3, CAPICOM_ENCODE_ANY = -1, CAPICOM_ENCODE_BASE64 = 0, CAPICOM_ENCODE_BINARY = 1;
var ForReading = 1, ForWriting = 2;

function getSignerCertificate(SerialNumber)
{
  var ret = null;
  var oStore = new ActiveXObject("CAPICOM.Store");
  oStore.Open(CAPICOM_CURRENT_USER_STORE);
  for (var i = 1; i <= oStore.Certificates.Count; i ++)
  {
    var oCert = oStore.Certificates.Item(i);
    if (oCert.SerialNumber.replace(/[ -.]/g, '') == SerialNumber.replace(/[ -.]/g, ''))
    {
      ret = oCert;
      break;
    }
  }
  oStore.Close();
  return ret;
}

function singRequest (request)
{
  var obj = document.getElementById('certificate_serial_number');
  var sn = obj == null ? '' : obj.value;
  var oCert = getSignerCertificate(sn);
  if (oCert == null)
  {
    var oStore = new ActiveXObject("CAPICOM.Store");
    oStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
    var Certificates = oStore.Certificates.Select("Спискок сертификатов", "Выберите сертификат для подписи документа:", false);
    oStore.Close();
    if (Certificates.Count <= 0)
    {
      alert('Вы должны выбрать сертификат для подписи запроса.');
      return '';
    }
    oCert = Certificates.Item(1);
  }
  var SigData = new ActiveXObject("CAPICOM.SignedData");
  var Signer = new ActiveXObject("CAPICOM.Signer");
  Signer.Certificate = oCert;
  if (request.length % 2 > 0) request += ' '; // cheat for COM String problem
  SigData.Content = request;
  var signature = SigData.Sign(Signer, true, CAPICOM_ENCODE_BASE64);
  return signature;
}
