

var CAPICOM_STORE_OPEN_READ_ONLY = 0;
var CAPICOM_CURRENT_USER_STORE = 2;
var CAPICOM_SMART_CARD_USER_STORE = 4;
var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
var CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6;
var CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9;
var CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
var CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 0x00000080;
var CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
var CAPICOM_INFO_SUBJECT_SIMPLE_NAME = 0;
var CAPICOM_ENCODE_BASE64 = 0;
var CAPICOM_E_CANCELLED = -2138568446;
var CERT_KEY_SPEC_PROP_ID = 6;
var CAPICOM_HASH_ALGORITHM_SHA1 = 0;

var CAPICOM_CHECK_NONE = 0;
var CAPICOM_CHECK_TRUSTED_ROOT = 1;
var CAPICOM_CHECK_TIME_VALIDITY = 2;
var CAPICOM_CHECK_SIGNATURE_VALIDITY = 4;
var CAPICOM_CHECK_ONLINE_REVOCATION_STATUS = 8;
var CAPICOM_CHECK_OFFLINE_REVOCATION_STATUS = 16;

var CAPICOM_TRUST_IS_NOT_TIME_VALID = 1;
var CAPICOM_TRUST_IS_NOT_TIME_NESTED = 2;
var CAPICOM_TRUST_IS_REVOKED = 4;
var CAPICOM_TRUST_IS_NOT_SIGNATURE_VALID = 8;
var CAPICOM_TRUST_IS_NOT_VALID_FOR_USAGE = 16;
var CAPICOM_TRUST_IS_UNTRUSTED_ROOT = 32;
var CAPICOM_TRUST_REVOCATION_STATUS_UNKNOWN = 64;
var CAPICOM_TRUST_IS_CYCLIC = 128;
var CAPICOM_TRUST_IS_PARTIAL_CHAIN = 65536;
var CAPICOM_TRUST_CTL_IS_NOT_TIME_VALID = 131072;
var CAPICOM_TRUST_CTL_IS_NOT_SIGNATURE_VALID = 262144;
var CAPICOM_TRUST_CTL_IS_NOT_VALID_FOR_USAGE = 524288;
var CAPICOM_VERIFY_SIGNATURE_ONLY = 0;

var MyStore = new ActiveXObject("CAPICOM.Store");
var FilteredCertificates = new ActiveXObject("CAPICOM.Certificates");
var Certificate = null

var req;
var sender;

function IsCAPICOMInstalled()
{
if(typeof(oCAPICOM) == "object")
{
 if( (oCAPICOM.object != null) )
 {
  // We found CAPICOM!
  return true;
 }
}
}


function checkCertStatus(oCertificate)
{
if (IsCAPICOMInstalled)
{
 // find the certificate specified!
 var Certificate = oCertificate;

 window.status="Checking Certificate Status....";
 // CAPICOM exposes Certificate status checking through IsValid, the CheckFlag parameter
 // allows you to specify the items you want to have checked for you.

//-- say. changed for no chanin check need 87 05 12
// Certificate.IsValid().CheckFlag = (CAPICOM_CHECK_TIME_VALIDITY | CAPICOM_CHECK_SIGNATURE_VALIDITY );
 Certificate.IsValid().CheckFlag = (CAPICOM_CHECK_TRUSTED_ROOT | CAPICOM_CHECK_TIME_VALIDITY | CAPICOM_CHECK_SIGNATURE_VALIDITY );//| CAPICOM_CHECK_ONLINE_REVOCATION_STATUS);
 if (Certificate.IsValid().Result == true)
 {
  // clear the status window
  window.status="";
  //alert("CryptoAPI believes \"" +  Certificate.GetInfo(CAPICOM_INFO_SUBJECT_SIMPLE_NAME) + "\" to be trustworthy.");
  return true;
 }
 else
 {
  var Chain = new ActiveXObject("CAPICOM.Chain");
  Chain.Build(Certificate)

  // clear the status window
  window.status="";
  if (CAPICOM_TRUST_IS_NOT_SIGNATURE_VALID & Chain.Status)
  {
   alert("CryptoAPI found a problem with the signature on '" +  Certificate.GetInfo(CAPICOM_INFO_SUBJECT_SIMPLE_NAME) + "'");
   return false;
  }
  if ((CAPICOM_TRUST_IS_UNTRUSTED_ROOT & Chain.Status) || (CAPICOM_TRUST_IS_PARTIAL_CHAIN & Chain.Status))
  {
   alert("CryptoAPI was unable to chain '" +  Certificate.GetInfo(CAPICOM_INFO_SUBJECT_SIMPLE_NAME) + "' to a trusted authority");
   return false;
  }
  if (CAPICOM_TRUST_IS_CYCLIC & Chain.Status)
  {
   alert("CAPICOM_TRUST_IS_CYCLIC");
   return false;
  }
  if (CAPICOM_TRUST_CTL_IS_NOT_TIME_VALID & Chain.Status)
  {
   alert("CAPICOM_TRUST_CTL_IS_NOT_TIME_VALID");
   return false;
  }
  if (CAPICOM_TRUST_CTL_IS_NOT_SIGNATURE_VALID & Chain.Status)
  {
   alert("CAPICOM_TRUST_CTL_IS_NOT_SIGNATURE_VALID");
   return false;
  }
  if (CAPICOM_TRUST_CTL_IS_NOT_VALID_FOR_USAGE & Chain.Status)
  {
   alert("CAPICOM_TRUST_CTL_IS_NOT_VALID_FOR_USAGE");
   return false;
  }
  if (CAPICOM_TRUST_IS_NOT_TIME_VALID & Chain.Status)
  {
//   alert("CAPICOM_TRUST_IS_NOT_TIME_VALID");
   alert("تاریخ اعتبار امضاء دیجیتال منقضی شده است. جهت تمدید آن با بخش پشتیبانی امضاء دیجیتال تماس حاصل نمایید.");
   return false;
  }
  if (CAPICOM_TRUST_IS_NOT_TIME_NESTED & Chain.Status)
  {
   alert("CAPICOM_TRUST_IS_NOT_TIME_NESTED");
   return false;
  }
  if (CAPICOM_TRUST_IS_NOT_VALID_FOR_USAGE & Chain.Status)
  {
   alert("CAPICOM_TRUST_IS_NOT_VALID_FOR_USAGE");
   return false;
  }
  if (CAPICOM_TRUST_IS_REVOKED & Chain.Status)
  {
   alert("CryptoAPI determined that '" +  Certificate.GetInfo(CAPICOM_INFO_SUBJECT_SIMPLE_NAME) + "' or one of its issuers was revoked.");
   return false;
  }
  if (CAPICOM_TRUST_REVOCATION_STATUS_UNKNOWN & Chain.Status)
  {
   //alert("CryptoAPI was unable to determine the certificate status for '" +  Certificate.GetInfo(CAPICOM_INFO_SUBJECT_SIMPLE_NAME) + "'");
   	alert('اعتبار گواهي ديجيتال ' + Certificate.GetInfo(CAPICOM_INFO_SUBJECT_SIMPLE_NAME) + 'قابل تاييد نمي باشد')
   return false;
  }
 }
}
}


function CheckToken(DBUserCert)
{
		if(DBUserCert == "")
		{
			alert('لطفا سخت افزار حاوي گواهي ديجيتال خود را به كامپيوتر متصل نمائيد')
			return false;
		}


	   try
	   {
	   	MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
	   	
	    FilteredCertificates = MyStore.Certificates;

	   	if(FilteredCertificates.Count > 0)
	   	{

	   		Certificate = new ActiveXObject("CAPICOM.Certificate");

	   		if (FilteredCertificates.Count > 1) {

	   				FilteredCertificates = FilteredCertificates.Select('انتخاب گواهی دیجیتال','لطفا گواهی دیجیتال مربوط به خود را برای انجام عملیات امضای دیجیتال انتخاب نمائید',false);
	   			if (FilteredCertificates.Count >0 ) {
	   				Certificate=FilteredCertificates.Item(1)
	   			} else {
		            alert('لطفا گواهی مربوط به خود را انتخاب نمائید')
		            return false;
	   			}

	   		} else {
   				Certificate=FilteredCertificates.Item(1);
	   		}
	   		

    		if(Certificate.Thumbprint.toUpperCase() == DBUserCert.toUpperCase())
    		{
    			if(checkCertStatus(Certificate))
    			{
    				return true;
    			}
    			else
    				return false;

   			}
    		else
    		{
    			alert('گواهي ديجيتال موجود در سخت افزار متعلق به كد كاربري وارد شده نمي باشد')
    			return false;
   			}

   			//return(Certificate.Thumbprint);
	   	}
		else
		{
            alert('لطفا سخت افزار حاوي گواهي ديجيتال خود را به كامپيوتر متصل نمائيد')
            return false;
        }
		
	   }
	   catch (e)
	   {
		if (e.number != CAPICOM_E_CANCELLED)
		{
	   		alert("An error occurred while opening your personal certificate store, aborting");
			alert(e.description)
			return false;
		}
	   }
}



function DoHash(val)
{
	var HashedData = new ActiveXObject("CAPICOM.HashedData");
	HashedData.Algorithm=CAPICOM_HASH_ALGORITHM_SHA1;
	HashedPass = Unicode2Ansi(val);
	HashedData.Hash(HashedPass);
	return HashedData.Value
}


function DoSign(val, UserCert)
{

if(!CheckToken(UserCert))
{
//alert('لطفا سخت افزار حاوي گواهي ديجيتال خود را به كامپيوتر متصل نمائيد')
return false
}
var SignedData = new ActiveXObject("CAPICOM.SignedData");
var Signer = new ActiveXObject("CAPICOM.Signer");
var TimeAttribute = new ActiveXObject("CAPICOM.Attribute");
SignedData.Content = val;

try
{
Signer.Certificate = Certificate;
var Today = new Date();
TimeAttribute.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
TimeAttribute.Value = Today.getVarDate();
Today = null;
Signer.AuthenticatedAttributes.Add(TimeAttribute);

// Do the Sign operation
szSignature = SignedData.Sign(Signer, true, CAPICOM_ENCODE_BASE64);
return szSignature
}
catch (e)
{
alert(e.description)
//if (e.number != CAPICOM_E_CANCELLED) {
alert('فرآیند امضای دیجیتال امکان پذیر نمی باشد')
return '';
//}
}

}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	alert(document.cookie)
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

////////////////////
function setCookie(c_name,value,expiredays)
{
var exdate=new Date()
exdate.setDate(exdate.getDate()+expiredays)
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}

function getCookie(c_name)
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=")
  if (c_start!=-1)
    { 
    c_start=c_start + c_name.length+1 
    c_end=document.cookie.indexOf(";",c_start)
    if (c_end==-1) c_end=document.cookie.length
    return unescape(document.cookie.substring(c_start,c_end))
    } 
  }
return ""
}

function makeRequest(url, Func, Method, Param) { 

   if (window.XMLHttpRequest) { 
       req = new XMLHttpRequest(); 
   } 
   else if (window.ActiveXObject) { 
       req = new ActiveXObject('Microsoft.XMLHTTP'); 
   } 

   //req = new XMLHttpRequest(); 

   req.onreadystatechange = Func;
   
   req.open(Method, url, true); 
   if( Method == 'GET')
       req.send(null); 
   else
   {
		req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		req.setRequestHeader("Content-length", Param.length);
		req.setRequestHeader("Connection", "close");   
   
       req.send(Param); 
    }

} 



function CheckToken_Say(DBUserCert)
{
//		if(DBUserCert == "")
//		{
//			alert('لطفا سخت افزار حاوي گواهي ديجيتال خود را به كامپيوتر متصل نمائيد')
//			return false;
//		}

	   try
	   {
	   	MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
	   	
	    FilteredCertificates = MyStore.Certificates;

	   	if(FilteredCertificates.Count > 0)
	   	{

	   		Certificate = new ActiveXObject("CAPICOM.Certificate");

	   		if (FilteredCertificates.Count > 1) {

	   				FilteredCertificates = FilteredCertificates.Select('انتخاب گواهی دیجیتال','لطفا گواهی دیجیتال مربوط به خود را برای انجام عملیات امضای دیجیتال انتخاب نمائید',false);
	   			if (FilteredCertificates.Count >0 ) {
	   				Certificate=FilteredCertificates.Item(1)
	   			} else {
		            alert('لطفا گواهی مربوط به خود را انتخاب نمائید')
		            return false;
	   			}

	   		} else {
   				Certificate=FilteredCertificates.Item(1);
	   		}
	   		

    		if(Certificate.Thumbprint.toUpperCase() == DBUserCert.toUpperCase())
    		{
    			if(checkCertStatus(Certificate))
    			{
    				return true;
    			}
    			else
    				return false;

   			}
    		else
    		{
    			alert('گواهي ديجيتال موجود در سخت افزار متعلق به كد كاربري وارد شده نمي باشد')
    			return false;
   			}

   			//return(Certificate.Thumbprint);
	   	}
		else
		{
            alert('برای فعال سازی گواهی دیجیتال خود، لطفا سخت افزار حاوي گواهي ديجيتال خود را به كامپيوتر متصل نمائيد')
            return true;
        }
		
	   }
	   catch (e)
	   {
		if (e.number != CAPICOM_E_CANCELLED)
		{
	   		alert("An error occurred while opening your personal certificate store, aborting");
			alert(e.description)
			return false;
		}
	   }
}

