
            // array de certificados disponibles
            var arrCertificates = new Array();
            //boolenao que inica si la firma era detached o no
            var bDetached = false;  // solo sera true para la primera firma
            //formato de la firma: MT_PKCS7 | MT_CMS
            var sFormat = MT_CMS;
            //algoritmo de hash para la firma: HASH_MD2 | HASH_MD4 | HASH_MD5 | HASH_SHA1
            var sHashAlgorithm = HASH_SHA1;
            // variables para el parametro iomode de FileSystemObject
            var ForReading = 1;
            var ForWriting = 2;
            // variables para el parametro format de FileSystemObject
            var TristateUseDefault = -2;  // abre usando el modo por defecto del sistema
            var TristateFalse = 0;  // abre como ASCII


            //añadir opcion a una lista
            function addOption(list,optionText,optionValue){
               list.options[list.options.length] = new Option(optionText,optionValue);
            }//fin de addOption

            //obtengo los datos del certificado seleccionado
            function getCertInfo(){
               if (document.formData.select1.value != -1){
                  //llamo a la funcion getInfoByIndex para recuperar info del certificado
                  var result = getInfoByIndex(document.formData.select1.value);
                  //muestro el campo Subject
                  document.formData.subject.value =  result[1];
               }//fin del if
            }//fin de getCertInfo

            //añado certificados a una lista
            function addCertificates(){
               for (var i=0;i< arrCertificates.length;i++){
                  if (arrCertificates[i] != null){
                     if (arrCertificates[i] != ""){
                        addOption(document.formData.select1,arrCertificates[i][1],arrCertificates[i][0]);
                     }//fin de if
                  }//fin de if
               }//fin de for
            }//fin de addCertificates

            //inicio websigner
            // la variable addCert me indica si crear la lista de certificaciones existentes
            function init(bAddCert){
               //inicio el webSigner con los certificados que contienen clave privada o no: ST_PRI_KEY |  ST_PUB_KEY | ST_ALL_KEY
               if (initWebSigner(ST_PRI_KEY)){

                  //variables
                  //booleano que indica si se recuperan todos los certificados o solo los de las CAs de confianza indicadas en arrCAs
                  var bFilterCAs = false;
                  //array que contiene las CAs de confianza
                  var arrCAs = new Array();
                  //array de restricciones que deben cumplir los certificados
                  var arrRestrictions = new Array();
                  //string que indica si se desean cargar los certificados con clave privada o no (depende de como se haya iniciado el webSigner): ST_PRI_KEY |  ST_PUB_KEY | ST_ALL_KEY
                  var sOnlyWithPrivateKey = ST_PRI_KEY;  // sólo las que tienen clave privada
                  //booleano que indica si se ha de tener en cuenta que los certificados esten caducados
                  var bOnlyNotExpired = true;
                  //campo del certificado que se ha de devolver en el array de certificados: CERTIFICATE_SUBJECT | CERTIFICATE_ISSUER | CERTIFICATE_SERIALNUMBRE | CERTIFICATE_DATE_FROM | CERTIFICATE_DATE_TO | CERTIFICATE_SUBJECT_KEY_IDENTIFIER | CERTIFICATE_AUTHORITY_KEY_IDENTIFIER
                  var sCertificateField = CERTIFICATE_SUBJECT;
                  //campo del sCertificateField que ha de devolver: CERTIFICATE_ALL | CERTIFICATE_CN | CERTIFICATE_OU | CERTIFICATE_O | CERTIFICATE_C | CERTIFICATE_E
                  var sCertificateFieldPart = CERTIFICATE_CN;

                  //recupero los certificados
                  arrCertificates = getCertificates(bFilterCAs,
                  arrCAs,
                  arrRestrictions,
                  sOnlyWithPrivateKey,
                  bOnlyNotExpired,
                  sCertificateField,
                  sCertificateFieldPart);

                  if (bAddCert){
                     // reseteo el combo de certificados, borrando todos los valores anteriores
                     for (var s in document.formData.select1){
                        document.formData.select1.remove(s);
                     }
                     //añado los certificdos recuperados a una lista
                     addCertificates();
                  }
               }//fin de if
               else{
                  alert("se ha producido un error al iniciar WebSigner");
               }//fin de else
            }//fin de init


            // devolvemos el contenido de un fichero con ruta 'strFichero'
            function cargarFichero(sRutaFichero){
              	var fso = new ActiveXObject("Scripting.FileSystemObject");

               // abre el archivo como ASCII.  Si no existe da error
               try{
                  // devuelve un TextStream Object
                  if (fso.FileExists(sRutaFichero)){
                     var objStream = fso.OpenTextFile(sRutaFichero, ForReading, false, TristateFalse);
                     if(objStream.AtEndOfStream)
                        return "";
                     else
                        return objStream.ReadAll();
                  } else{
                     return "";
                  }
               }
               catch(e)
               {
                  alert(e.description);
                  return false;
               }
            }


            // comprueba la firma del archivo
            // strPathFichero: ruta del fichero cuya firma se desea comprobar
            function compruebaFirma(strPathFichero){
                // cargamos el fichero de firma
                var strFirmaBase64 = cargarFichero(strPathFichero+'.firma');
                // cargamos el fichero firmado, para comprobar la primera firma
                var strBase64 = getFileByPathUtil(strPathFichero);

                if (strFirmaBase64 != false){
                    verificaFirma(strFirmaBase64,strBase64);
                }
            }

            function compruebaFirmaRemoto(idDocumento){
                var sFirmaBase64 = getFicheroFromServer(idDocumento,false,1);
                var sFicheroBase64 = getFicheroFromServer(idDocumento,false,0);
                verificaFirma(sFirmaBase64,sFicheroBase64);
            }

            //comprueba una firma
            // sFirmContent: resultado de la firma (que está en base 64)
            // sContent: contenido del fichero firmado en base 64 (sólo necesario en caso de ser bDetached = true)
            function verificaFirma(sFirmContent, sContent){
            	//variables
               //string resultado a mostrar
               var sResult = null;
               //array resultado de la verificacion
               var arrResult = null;
               //detached porque la primera firma lo es
               var bDetachedVerificacion = true;
					//llamamos a la funcion verificar fichero
					arrResult = verifyFile(sFirmContent, bDetachedVerificacion, sContent, sFormat);

     				//comprobamos resultado
					sResult = "RESULTADO DE LA VERIFICACION\n";
					sResult += "--------------------------------------------\n";

					if (arrResult!=null){
						for (var i=0;i < arrResult.length;i++){
							//obtengo el resultado de comprobacion
							var iVerifyResult = arrResult[i][ERROR_VERIFY_INDEX];
							var sSigner = arrResult[i][SIGNER_VERIFY_INDEX];

							//comprueba si ha habido error en la firma
							var sVerifyResult;
							if (iVerifyResult == VERIFY_OK) sVerifyResult = "\n-Firma Correcta ";
							//si ha habido error obtenemos el tipo de error
							else {
								switch(iVerifyResult){
									case VERIFY_BAD_SIGNATURE:
									sVerifyResult = "\n-Firma Incorrecta VERIFY_BAD_SIGNATURE";
									break
									case VERIFY_BAD_CERT_CHAIN:
									sVerifyResult = "\n-Firma Incorrecta VERIFY_BAD_CERT_CHAIN";
									break
									case VERIFY_BAD_SIGNATURE_AND_CERT:
									sVerifyResult = "\n-Firma Incorrecta VERIFY_BAD_SIGNATURE_AND_CERT";
									break
									case VERIFY_ALGORITHM_NOT_DEFINED:
									sVerifyResult = "\n-Firma Incorrecta VERIFY_ALGORITHM_NOT_DEFINED";
									break
									case CERTIFICATE_NOT_FOUND:
									sVerifyResult = "\n-Firma Incorrecta CERTIFICATE_NOT_FOUND";
									break
									case VERIFY_BAD_CERT_USAGE:
									sVerifyResult = "\n-Firma Incorrecta VERIFY_BAD_CERT_USAGE";
									break
									case VERIFY_BAD_CERT_VALIDITY:
									sVerifyResult = "\n-Firma Incorrecta VERIFY_BAD_CERT_VALIDITY";
									break
									case INVALID_SIGNATURE_FORMAT:
									sVerifyResult = "\n-Firma Incorrecta INVALID_SIGNATURE_FORMAT";
									break
									default : sVerifyResult = "\n-Firma Incorrecta ";
								}
							}
							//añade el firmante
							if (sSigner != "")
								sVerifyResult += "\nFirmado por:" + sSigner;
							sVerifyResult += "\n";
							sResult += sVerifyResult;
						}
						alert(sResult);
					}
               else
                  alert("Error. Archivo modificado.");
            }

            //comprueba que un fichero no ha sido modificado
            // strPathLocal: ruta del archivo en el servidor
            function verificaFichero(idDocumento,esNotificacion,datosCifrados){
            	iniciaAjax("");
            	peticion.open("POST", "verificaFichero.php?idDocumento="+idDocumento+"&esNotificacion="+esNotificacion, false);
            	peticion.onreadystatechange=function()
            	{
            		if (peticion.readyState==4)
            		{
                     if (peticion.status == 200) { // OK response
                        if(peticion.responseText!=''){
                           if (peticion.responseText == "6"){
                              alert("Sesión expirada.  Introduzca de nuevo su usuario y contraseña.");
                              document.location.reload();
                           } else
                              alert('El documento ha sido modificado.\r\n'+peticion.responseText);
                        }
                     }
            		}
            	}
               peticion.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
               peticion.send(datosCifrados);
            }


            /*******************************************************************************************************
            NOMBRE: getFicheroFromServer
            DESCRIPTION: obtiene el contenido en base64 de un fichero asociado a un documento del servidor
                        (ya sea el fichero del documento o la firma)
            INPUT:
             idDocumento: Documento que se desea leer
             esNotificacion: Señala si el documento es notificación o no
             bFirma: Señala si el fichero a leer es de firma.  Si lo es, se leera tal cual, porque ya está en base64
            OUTPUT:
             contenido del fichero en base64
            *******************************************************************************************************/
            function getFicheroFromServer(idDocumento,esNotificacion,bFirma){
                var respuesta;
            	iniciaAjax("");
            	peticion.open("POST", "/intranet/firma/recogeFirma_p.php", false);
            	peticion.onreadystatechange=function()
            	{
            		if (peticion.readyState==4)
            		{
                     if (peticion.status == 200) { // OK response
                        if(peticion.responseText!=''){
                           if (peticion.responseText == "6"){
                              alert("Sesión expirada.  Introduzca de nuevo su usuario y contraseña.");
                              document.location.reload();
                           } else{
                                respuesta = peticion.responseText;
                           }
                        } else{
                           alert("Error al verificar la firma.");
                        }
                     }
            		}
            	}
               peticion.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
               peticion.send("idDocumento="+idDocumento+"&esNotificacion="+esNotificacion+"&esFirma="+bFirma);
               return respuesta;
            }

            /***********************************************************************************
            NOMBRE: verificaFirma_y_Fichero
            DESCRIPTION: verifica la firma de un documento, y la integridad de su fichero adjunto
            INPUT:
             idDocumento: Documento que se desea comprobar
             esNotificacion: Señala si se trata de una notificación o no
             bCifrado: Señala si es una firma de un documento cifrado o no
            ***********************************************************************************/
            function verificaFirma_y_Fichero(idDocumento,esNotificacion,bCifrado){
                // recoge contenido firma en base64
                var sFirmaBase64 = getFicheroFromServer(idDocumento,esNotificacion,1);
                // recoge contenido del fichero en base64
                var sFicheroBase64 = getFicheroFromServer(idDocumento,esNotificacion,0);

                if (bCifrado){
                    sFicheroBase64 = decryptFile(sFicheroBase64);
                    if ( (sFicheroBase64!=null) && (sFicheroBase64!="") ){
                        verificaFirma(sFirmaBase64,sFicheroBase64);
                        verificaFichero(idDocumento,esNotificacion,sFicheroBase64);
                    } else{
                        txtError = "No tiene permiso para verificar el archivo cifrado " + idDocumento + '.';
                        alert(txtError);
                        registrarError(txtError);
                    }
                } else{
                    verificaFirma(sFirmaBase64,sFicheroBase64);
                    verificaFichero(idDocumento,esNotificacion,'');
                }
            }