// Variables globales
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_CERTIFICATE_FIND_SHA1_HASH = 0;
var CAPICOM_ENCODE_BASE64 = 0;
var CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
var CAPICOM_CERTIFICATE_FIND_ISSUER_NAME = 2;
var CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 0x00000080;

// Función que realiza la firma
function firmar() {

	var lStrFirmaPKCS7 = "";
	
	try {
	
		var lStrFirma;

		//Obtenemos los datos a firmar
		var lStrDatos = document.getElementById("txtSesion").value;
			
		// Obtenemos el fingerprint del certificado a utilizar
		var lStrFingerPrint = document.getElementById("idSel").value;
			
		var lObjCertificado = leerCertificadoPorFingerPrint(lStrFingerPrint);

		// Nos creamos los objetos
		var lObjFirma = new ActiveXObject("CAPICOM.SignedData");
		var lObjFirmante = new ActiveXObject("CAPICOM.Signer");

		// Asociamos los datos a firmar
		lObjFirma.Content = lStrDatos;

		// Asociamos el certificado
		lObjFirmante.Certificate = lObjCertificado;

		// Firmamos
		lStrFirmaPKCS7 = lObjFirma.Sign(lObjFirmante, true, CAPICOM_ENCODE_BASE64);

	}
	catch(e) {
		var lStrMensaje = DameMensaje("msjErrorFirma") + "\n";
		lStrMensaje+=e.message;
		alert(lStrMensaje);
		event.returnValue=false
		event.cancel=true
	}
	
	return lStrFirmaPKCS7;
}

// Función que muestra todos los certificados del repositorio
function MostrarCertificados() {
	try {
	
		// Creamos el almacen de certificados...
		var lObjAlmacen = new ActiveXObject("CAPICOM.Store");
		
		// Abrimos el almacen de certificados del usuario en sólo lectura
		lObjAlmacen.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);

		// Recuperamos la colección de certificados del almacen...
		//var lObjCertificados = lObjAlmacen.Certificates.Find(CAPICOM_CERTIFICATE_FIND_KEY_USAGE,CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE);
		
		// Para hacer la búsqueda por CA...
		//.Find(CAPICOM_CERTIFICATE_FIND_ISSUER_NAME, "CA-CCASA"
		var lObjCertificados = lObjAlmacen.Certificates.Find(CAPICOM_CERTIFICATE_FIND_ISSUER_NAME,"CA-CCASA");
		
		if (lObjCertificados.Count > 0){
			
			var lDiv = document.getElementById("certificados");
			var lStrHtml = '<table width="100%">';
			var i = 1;
			var lObjCertificado;
			
			for (i=1;i<=lObjCertificados.Count;i++){

				lObjCertificado = lObjCertificados.Item(i)

				// Para cada certificado, añadimos una fila
				lStrHtml+= '<tr bgcolor="#DDDDDD">';
				lStrHtml+= '<td>';
				if (i==1)
				{
					lStrHtml+= '<input type="radio" name="RadioCertificado" value="radiobutton" onclick=seleccionar("' + lObjCertificado.Thumbprint + '") checked>';
					document.getElementById("idSel").value=lObjCertificado.Thumbprint
				}
				else
					lStrHtml+= '<input type="radio" name="RadioCertificado" value="radiobutton" onclick=seleccionar("' + lObjCertificado.Thumbprint + '")>';
				lStrHtml+='</td>';
				lStrHtml+='<td  class="fuentenormal">';
				lStrHtml+= i;
				lStrHtml+='</td>';
				lStrHtml+='<td class="fuentenormal" >' + lObjCertificado.GetInfo(CAPICOM_INFO_SUBJECT_SIMPLE_NAME) + '</td>';
				//lStrHtml+='<td width="22%" class="letra_naranja_normal" >';
				//lStrHtml+='<div >' +  lObjCertificado.GetInfo(CAPICOM_INFO_ISSUER_SIMPLE_NAME) + '</div>';
				//lStrHtml+='</td>';
				lStrHtml+='</tr>';
			}

			lStrHtml+='</table>';

			lDiv.innerHTML=lStrHtml;
		}
		/*else {
			alert(DameMensaje("msjNoCertificado"));
		}*/
		return lObjCertificados.Count
	}
	catch(e) {
		var lStrMensaje = DameMensaje("msjErrorMostrarCertificados") + "\n";
		lStrMensaje+=e.message;
		//alert(lStrMensaje);
		return 0	
	}
}

function seleccionar(valor)
{
	document.getElementById("idSel").value=valor;
}

// Función que devuelve el certificado que seleccionamos para la firma
function leerCertificadoPorFingerPrint(pStrFingerPrint) {
	
	try {
		
		// Abrimos el almacén
		var lObjAlmacen = new ActiveXObject("CAPICOM.Store");
		lObjAlmacen.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);

		// Buscamos el certificado por el Hash que nos han pasado...
		var lObjCertificados = lObjAlmacen.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, pStrFingerPrint);

		// Devolvemos el certificado
		return lObjCertificados.Item(1);	
	}
	catch(e) {
		throw e;
	}
}

function enviar() {
	if (document.getElementById("idSel").value!="")
	{
		var lStrFirma = firmar();
		if (lStrFirma != "") {
			document.getElementById('txtFirma').value = lStrFirma;
			return true;
			//document.Formulario.submit();
		}
	}
	else
	{
		alert(DameMensaje("msjSeleccioneCertificado"))
		event.returnValue=false
		event.cancel=true
	}
}

