// get hex symbol for char have code: c
function _to_hex(c)
{
    var digits = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
    
    return digits[parseInt(c/16)] + digits[parseInt(c%16)];
}

// Convert unicode string: s to hex-string 
function _to_utf8_hex(s) {
  var c, d = "";
  for (var i = 0; i < s.length; i++) {
    c = s.charCodeAt(i);
    if (c <= 0x7f) {
      d += _to_hex(c);
    } else if (c >= 0x80 && c <= 0x7ff) {
      d += _to_hex(((c >> 6) & 0x1f) | 0xc0);
      d += _to_hex((c & 0x3f) | 0x80);
    } else {
      d += _to_hex((c >> 12) | 0xe0);
      d += _to_hex(((c >> 6) & 0x3f) | 0x80);
      d += _to_hex((c & 0x3f) | 0x80);
    }
  }
  return d;
}
function signData(_data, convert_to_utf8, silent, title)
{
  var str='',signed_text='';
  if (_data=="")
	  str="!Отсутствуют подписываемые данные!";
  else
  {
	  signed_text = SignText(_data, convert_to_utf8, silent, title);
	  if (signed_text=="")
		  str="!Отсутствует подпись!";
	  else
	  if(signed_text.charAt(0)=='!')
    	str=signed_text.indexOf('The requested operation has been cancelled by the user.')!=-1?
        '!Операция отменена пользователем.':
        signed_text.indexOf("The signer's certificate is not valid for signing")!=-1?
        '!Сертификат недействителен! Сообщение подписано не будет.':
        '!Ошибка'+signed_text;
  }
  if(str)
  {
	  if(silent)
	    signed_text=str;
	  else
	  	alert(str.substr(1));
  }
  return signed_text;
}

function SignText(text, convert_to_utf8, silent, title)
{
  var retStr = "";
  try
  {
	  var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
	  var CAPICOM_CURRENT_USER_STORE = 2;
	  var CAPICOM_STORE_OPEN_READ_ONLY = 0;
	  var CAPICOM_INFO_SUBJECT_SIMPLE_NAME = 0;
	  var CAPICOM_INFO_ISSUER_SIMPLE_NAME = 1;
	  var CAPICOM_INFO_SUBJECT_EMAIL_NAME = 2;
	  var CAPICOM_INFO_ISSUER_EMAIL_NAME = 3;
	  var CAPICOM_ENCODE_BASE64 = 0;
	  if (IsCAPICOMInstalled() != true)
	  {
		str="Библиотека CAPICOM не может быть загружена, возможно из-за низких прав доступа на данной локальной машине.";
		if(silent)
			return '! '+str;
		else
			alert(str);
	  }
	  else
	  {
			var MyStore = new ActiveXObject("CAPICOM.Store");
	       	MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
	       	var Certificates = MyStore.Certificates;
	       	Certificates = Certificates.Select("Выберите сертификат для подписи", ((typeof title != 'undefined')?title:"Выберите сертификат для подписи: "));
	       	var SigData = new ActiveXObject("CAPICOM.SignedData");
	       	var Signer = new ActiveXObject("CAPICOM.Signer");
	      	Signer.Certificate = Certificates.Item(1);

			if (convert_to_utf8 == 1){
	      		var CU = new ActiveXObject("CAPICOM.Utilities");
	       		SigData.Content=CU.HexToBinary(_to_utf8_hex(text));
            }
			else{
	       		SigData.Content=text;
			}
//	       	retStr=SigData.Sign(Signer, true, CAPICOM_ENCODE_BASE64);
	       	retStr=SigData.Sign(Signer, false, CAPICOM_ENCODE_BASE64);
  	  }
  }
  catch(e) 
  {
  		if(silent) 
  			retStr='! '+e.description;
  		else
  			alert('Исключение: '+e.description);
  }
  return retStr;
}

function IsCAPICOMInstalled()
{
	if ((typeof(oCAPICOM) == "object") && (oCAPICOM.object != null)) return true;
   	return false;
}

