if (document.all && !window.setTimeout.isPolyfill) { var __nativeST__ = window.setTimeout; window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) { var aArgs = Array.prototype.slice.call(arguments, 2); return __nativeST__(vCallback instanceof Function ? function () { vCallback.apply(null, aArgs); } : vCallback, nDelay); }; window.setTimeout.isPolyfill = true; } var originalXMLHttpRequest = window.XMLHttpRequest; var ComponenteSle = ( function ( clientAddress, window, undefined) { var TEST_MODE = false; var SESION_TEST_MODE = "DMu0zoLXEe3b7uRCaugx"; var JAVA_ARGUMENTS = null; var SYSTEM_PROPERTIES = null; var selectedLocale = null; var PROTOCOL_URL_START_LOWER_CASE = "sle://"; var END_POINT = "/sle"; var ID_ITEM_SESSION_STORAGE = "sleStorage"; // Tiempo de espera entre los intentos de conexion var LAUNCHING_TIME = 2000; // Reintentos de conexion totales para detectar si la aplicacion esta instalada var CONNECTION_RETRIES = 10; var PROTOCOL_VERSION = 3; var SERVER_HOST = "127.0.0.1"; var SERVER_PORT = "48215"; var URL_REQUEST = "wss://" + SERVER_HOST + ":" + SERVER_PORT; /* Mayor entero. */ var MAX_NUMBER = 2147483648; /* Caracteres validos para los ID de sesion */ var VALID_CHARS_TO_ID = "1234567890abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; var IDIOMA = null; var mensajes_es = ['No se pudo contactar con el componente de licitación','Operacion cancelada por el usuario', 'El fichero que se pretende firmar o guardar excede de la memoria disponible para aplicación','Error desconocido', 'No se ha proporcionado funcion callback para procesar el resultado','Error al parsear el resultado']; var mensajes_cat = ["No es puc obrir l'aplicació de presentació d'ofertes","Operacion cancel·lada per l'usuari","El fitxer que es pretén signar o guardar excedeix de la memòria disponible per a aplicació", "Error desconegut","No s'ha proporcionat funcion callback per a processar el resultat","Error en analitzar el resultat"]; var mensajes_en = ["Could not contact component","Operation cancelled by user","The file that is intended to be signed or saved exceeds the memory available for application", "Unknown error","No callback function provided to process result","Error parsing result"]; var OPERATION_ECHO = "echo"; var OPERATION_SELECT_LOCAL_FILE = "selectfile"; var OPERATION_OPEN_LOCAL_FILE = "openfile"; var OPERATION_OPEN_SERVER_FILE = "openRemoteFile"; var OPERATION_INFO_LOCAL_FILE = "infofile"; var OPERATION_LIST_FILE_LOGS ="listFileLogs"; var OPERATION_DOWNLOAD_LOGS_BY_DATE="downloadLogsByDate"; var OPERATION_SEND_APPLICATION_ERRORS="enviarInformeErroresAplicacion"; var OPERATION_DOWNLOAD_LOGS_BETWEEN_DATES="downloadLogsBetweenDates"; var OPERATION_PARSE_LOT_FILE="parseLotFile"; var OPERATION_PARSE_CRITERIA_FILE="parseCriteriaFile"; var OPERATION_STORE_FILE="storeFile"; var OPERATION_GET_PATH_CRITERIA="getPathCriteria"; var OPERATION_TEST="test"; var OPERATION_SEND_TENDER="sendTender"; var OPERATION_SEND_SIGNATURES="sendSignatures"; var OPERATION_SEND_DOCUMENTS="sendDocuments"; var OPERATION_DOWNLOAD_OFFERS="downloadOffers"; var OPERATION_RESET_WORK_DIR="resetWorkDir"; var OPERATION_GET_WORK_DIR= "getWorkDir"; var OPERATION_DECRYPT_FILE="decryptFile"; var OPERATION_BUILD_FILE="buildFile"; var OPERATION_OBTAIN_DATA_CERTIFICATE="obtainDataCertificate"; //NUEVO var OPERATION_SEND_AWARDED_DOCUMENTS="sendAwardedDocuments"; var OPERATION_SIGN_PDF="signPDFdoc"; var OPERATION_FINISH_SIGN_PDF="finishSigningPDFdoc"; var OPERATION_SIGN_DOCUMENT="signDoc"; var OPERATION_FINISH_SING_DOCUMENT="finishSigningDoc"; var OPERATION_SIGN_MASSIVE_DOCS="signMassiveDocs"; var OPERATION_FINSH_SIGN_MASSIVE_DOCS="finishSignMassiveDocs"; /**** OPERACIONES DE @firmA *****/ var OPERATION_LOAD = "load"; var OPERATION_WITHOUT_RETURN = "save"; var OPERATION_BATCH = "batch"; var OPERATION_LOG = "log"; var OPERATION_SELECT_CERTIFICATE = "selectcert"; var OPERATION_SIGN = "sign"; /** Informacion de error. */ var errorMessage = ''; var errorType = ''; var idSession; /** WebSocket para la comunicacion con la aplicacion. Antes de crearlo * (new WebSocket(URL_REQUEST)) es necesario arrancar la aplicacion. */ var ws = ""; /** Operacion que se manda a ejecutar. */ var currentOperation = ""; /** URL de la peticion enviada. */ var currentOperationUrl = ""; /** Indica si se ha establecido la conexion o no */ var connected = false; /** Almacen de claves cargado por defecto */ var defaultKeyStore = null; /** Funcion callback que se lanza al obtener un resultado */ var successCallback = null; /** Funcion error callback */ var errorCallback = null; /** Establece el almacen de certificados de que se debe utilizar por defecto. */ var setKeyStore = function (keystore) { defaultKeyStore = keystore; }; /** METODOS PUBLICOS **/ function cargarApplet (rutaApplet) { console.log ("cargarApplet(rutaApplet=" +rutaApplet + ") BEGIN"); console.log ("Se Desactivan los applets, se usa unicamente el componente de escritorio, se mantiene el metodo por compatibilidad"); return; } function indicarIdioma(nuevoIdioma) { console.log ("indicarIdioma(idioma=" + nuevoIdioma +") BEGIN"); if (nuevoIdioma === 'Espanol') { IDIOMA = "es"; } else if (nuevoIdioma === 'Euskera') { IDIOMA = "gl"; } else if (nuevoIdioma === 'Ingles') { IDIOMA = "en"; } else if (nuevoIdioma === 'Catalan') { IDIOMA = "cat"; } console.log ("Nuevo idioma establecido = " + IDIOMA); } function isAppletAlive () { console.log ("Se Desactivan los applets, se usa unicamente el componente de escritorio, se mantiene el metodo por compatibilidad"); return false; } function echo (successCallbackFunction, errorCallbackFunction) { successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_ECHO; var data = new Object(); data.op = generateDataKeyValue("op","echo"); execAppIntent(buildUrl (data)); } function seleccionarFicheroLocal (title, extsAllowed, currentFileName, successCallbackFunction, errorCallbackFunction) { console.log ("seleccionarFicheroLocal(title=" +title + ", extsAllowed=" + extsAllowed + ",currentFileName=" + currentFileName + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_SELECT_LOCAL_FILE; extsAllowed = extsAllowed.replace(/\./g, ""); var data = new Object(); var extraParams = "title=" + title + "\n" + "filenameExts=" + extsAllowed + "\n" + "currentFileName=" + currentFileName; data.op = generateDataKeyValue("op","selectfile"); data.properties = generateDataKeyValue ("properties", extraParams != null ? Base64.encode(extraParams) : null); execAppIntent(buildUrl(data)); } function abrirFicheroLocal (path, extraParams, successCallbackFunction, errorCallbackFunction) { console.log ("abrirFicheroLocal(path=" +path + ", extraParams" + extraParams + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_OPEN_LOCAL_FILE; var data = new Object(); data.op = generateDataKeyValue ("op", "openfile"); data.pathFile = generateDataKeyValue ("pathFile", path); data.properties = generateDataKeyValue ("properties", extraParams != null ? Base64.encode(extraParams) : null); execAppIntent(buildUrl(data)); } function obtenerInfoFicheroLocal (path, successCallbackFunction, errorCallbackFunction) { console.log ("obtenerInfoFicheroLocal(path=" +path + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_INFO_LOCAL_FILE; var data = new Object(); data.op = generateDataKeyValue ("op", "infofile"); data.pathFile = generateDataKeyValue ("pathFile", path); //data.properties = generateDataKeyValue ("properties", extraParams != null ? Base64.encode(extraParams) : null); execAppIntent(buildUrl(data)); } function listarFicherosLog ( fechaInicial, fechaFinal, successCallbackFunction, errorCallbackFunction) { console.log ("listarFicherosLog (fechaInicial=" + fechaInicial + ", fechaFinal=" + fechaFinal +") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_LIST_FILE_LOGS; var data = new Object(); data.op = generateDataKeyValue("op", "listFileLogs"); data.startDate = generateDataKeyValue("startDate", fechaInicial); data.lastDate = generateDataKeyValue("lastDate", fechaFinal); execAppIntent(buildUrl(data)); } function descargarLogsPorFecha (fecha, successCallbackFunction, errorCallbackFunction) { console.log ("descargarLogsPorFecha(fecha=" + fecha + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_DOWNLOAD_LOGS_BY_DATE; var data = new Object(); data.op = generateDataKeyValue ("op", "downloadLogsByDate"); data.date = generateDataKeyValue ("date", fecha); execAppIntent(buildUrl(data)); } function enviarInformeErroresAplicacion(idExpediente, numExpediente, denominacionExpediente, numInscripcionGPA, dniUsuario, nombreUsuario, nifEmpresa, nombreEmpresa, successCallbackFunction, errorCallbackFunction){ console.log ("enviarInformeErroresAplicacion(idExpediente" +idExpediente + ",numExpediente=" + numExpediente + ",denominacionExpediente=" + denominacionExpediente + ",numInscripcionGPA="+numInscripcionGPA+",dniUsuario="+dniUsuario+",nombreUsuario"+nombreUsuario+",nifEmpresa=" + nifEmpresa + ",nombreEmpresa="+nombreEmpresa+") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_SEND_APPLICATION_ERRORS; var data = new Object(); data.op = generateDataKeyValue ("op", "enviarInformeErroresAplicacion"); data.idExpediente = generateDataKeyValue ("idExpediente", idExpediente); data.numExpediente = generateDataKeyValue ("numExpediente", numExpediente); data.denominacionExpediente = generateDataKeyValue ("denominacionExpediente", denominacionExpediente); data.numInscripcionGPA = generateDataKeyValue ("numInscripcionGPA", numInscripcionGPA); data.dniUsuario = generateDataKeyValue ("dniUsuario", dniUsuario); data.nombreUsuario = generateDataKeyValue ("nombreUsuario", nombreUsuario); data.nifEmpresa = generateDataKeyValue ("nifEmpresa", nifEmpresa); data.nombreEmpresa = generateDataKeyValue ("nombreEmpresa", nombreEmpresa); execAppIntent(buildUrl(data)); }//enviarInformeErroresAplicacion function descargarLogsIntervaloFechas (fechaInicio, successCallbackFunction, errorCallbackFunction) { console.log ("descargarLogsIntervaloFechas(fechaInicio=" + fechaInicio + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_DOWNLOAD_LOGS_BETWEEN_DATES; var data = new Object(); data.op = generateDataKeyValue ("op", "downloadLogsBetweenDates"); data.date = generateDataKeyValue ("date", fechaInicio); execAppIntent(buildUrl(data)); } function parsearDocumentoLotes(rutaAdjuntoValores, successCallbackFunction, errorCallbackFunction) { console.log ("parsearDocumentoLotes(rutaAdjuntoValores="+rutaAdjuntoValores+") : BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_PARSE_LOT_FILE; var data = new Object(); data.op = generateDataKeyValue ("op", "parseLotFile"); data.pathFileValues = generateDataKeyValue ("pathFileValues", rutaAdjuntoValores); execAppIntent(buildUrl(data)); } function parsearDocumentoCriterios (rutaAdjuntoValores,nombresColumna, cadenaCriterios, idCriterioEconomico, codigoLote, esOfertaFinalRestringida, successCallbackFunction, errorCallbackFunction) { console.log ("parsearDocumentoCriterios(rutaAdjuntoValores="+rutaAdjuntoValores+",nombresColumna="+nombresColumna+",cadenaCriterios="+cadenaCriterios+ ",idCriterioEconomico="+idCriterioEconomico+",codigoLote="+codigoLote+",esOfertaFinalRestringida="+esOfertaFinalRestringida+") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_PARSE_CRITERIA_FILE; var data = new Object(); data.op = generateDataKeyValue ("op", "parseCriteriaFile"); data.pathFileValues = generateDataKeyValue ("pathFileValues", rutaAdjuntoValores); data.columnName = generateDataKeyValue ("columnName", nombresColumna); data.stringCriteria = generateDataKeyValue("stringCriteria", cadenaCriterios); data.idEconomicCriteria = generateDataKeyValue("idEconomicCriteria", idCriterioEconomico); data.lotCode = generateDataKeyValue("lotCode", codigoLote); data.offerRestricted = generateDataKeyValue("offerRestricted", esOfertaFinalRestringida); execAppIntent(buildUrl(data)); } function guardarFichero (rutaFichero, nombreFichero, contenido, successCallbackFunction, errorCallbackFunction) { console.log ("guardarFichero(rutaFichero="+rutaFichero+",nombreFichero="+nombreFichero+",contenido="+contenido+") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_STORE_FILE; var data = new Object(); data.op = generateDataKeyValue ("op", "storeFile"); data.pathFile = generateDataKeyValue ("pathFile", rutaFichero); data.fileName = generateDataKeyValue ("fileName", nombreFichero); data.content = generateDataKeyValue ("content", contenido); execAppIntent(buildUrl(data)); } function getPathCriterios (successCallbackFunction, errorCallbackFunction) { console.log ("getPathCriterios() BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_GET_PATH_CRITERIA; var data = new Object(); data.op = generateDataKeyValue ("op", "getPathCriteria"); execAppIntent(buildUrl(data)); } function pruebaDeEnvioOferta (pathDocumento, hashDocumento, firmaDocumento, successCallbackFunction, errorCallbackFunction) { console.log ("pruebaDeEnvioOferta(pathDocumento=" +pathDocumento + ", hashDocumento=" + hashDocumento + ", firmaDocumento=" + firmaDocumento +") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_TEST; var data = new Object(); data.op = generateDataKeyValue("op", "test"); data.pathFile = generateDataKeyValue("pathFile", pathDocumento); data.hashFile = generateDataKeyValue("hashFile", hashDocumento); data.signFile = generateDataKeyValue("signFile", firmaDocumento); execAppIntent(buildUrl(data)); } function envioOferta (idExpediente, idEmpresa, cifEmpresa, nombreEmpresa, sessionId, tokenId, estructuraDocumentos, firmaXmlResumen, xmlResumen, urlGestor, certificados, puestos, successCallbackFunction, successCallbackFunctionApplet, errorCallbackFunction) { console.log ("envioOferta(idExpediente=" +idExpediente + ", idEmpresa=" + cifEmpresa + ", urlGestor=" + urlGestor + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; var obligatorios = []; var anexos = []; for (i = 0; i < estructuraDocumentos.docs.length; i++) { var aDoc = estructuraDocumentos.docs[i]; var documento = { "ruta" : aDoc.docPath, "sobre" : aDoc.envelopeType, "numeroDocumento" : aDoc.docNum, "cifrado" : aDoc.docCiphered, "firma" : aDoc.docSignature }; obligatorios[i] = documento; } for (i = 0; i < estructuraDocumentos.attachments.length; i++) { var aDoc = estructuraDocumentos.attachments[i]; var anexo = { "ruta" : aDoc.docPath, "sobre" : aDoc.envelopeType, "numeroDocumento" : aDoc.docNum, "cifrado" : aDoc.docCiphered, "firma" : aDoc.docSignature }; anexos[i] = anexo; } var documentos = { "obligatorios" : obligatorios, "anexos" : anexos }; currentOperation = OPERATION_SEND_TENDER; var data = new Object(); data.op = generateDataKeyValue("op", "sendTender"); data.idCallForTender = generateDataKeyValue("idCallForTender", idExpediente); data.idTender = generateDataKeyValue("idTender", idEmpresa); data.docTender = generateDataKeyValue("docTender", cifEmpresa); data.nameTender = generateDataKeyValue("nameTender", nombreEmpresa); data.sessionId = generateDataKeyValue("tokenId", tokenId); data.documentos = generateDataKeyValue("documentos",JSON.stringify(documentos)); data.firmaXML = generateDataKeyValue("firmaXML",firmaXmlResumen); data.xmlOferta = generateDataKeyValue("xmlOferta",xmlResumen); execAppIntent(buildUrl(data)); } function envioFirmas (idExpediente, idEmpresa, cifEmpresa, nombreEmpresa, sessionId, tokenId, estructuraDocumentos, firmaXmlResumen, xmlResumen, urlGestor, certificados, puestos, successCallbackFunction, successCallbackFunctionApplet, errorCallbackFunction) { console.log ("envioFirmas (idExpediente=" +idExpediente + ", idEmpresa=" +") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; var obligatorios = []; var anexos = []; for (i = 0; i < estructuraDocumentos.docs.length; i++) { var aDoc = estructuraDocumentos.docs[i]; var documento = { "ruta" : aDoc.docPath, "sobre" : aDoc.envelopeType, "numeroDocumento" : aDoc.docNum, "cifrado" : aDoc.docCiphered, "firma" : aDoc.docSignature }; obligatorios[i] = documento; } for (i = 0; i < estructuraDocumentos.attachments.length; i++) { var aDoc = estructuraDocumentos.attachments[i]; var anexo = { "ruta" : aDoc.docPath, "sobre" : aDoc.envelopeType, "numeroDocumento" : aDoc.docNum, "cifrado" : aDoc.docCiphered, "firma" : aDoc.docSignature } anexos[i] = anexo; } var documentos = { "obligatorios" : obligatorios, "anexos" : anexos }; currentOperation = OPERATION_SEND_SIGNATURES; var data = new Object(); data.op = generateDataKeyValue("op", "sendSignatures"); data.idCallForTender = generateDataKeyValue("idCallForTender", idExpediente); data.idTender = generateDataKeyValue("idTender", idEmpresa); data.docTender = generateDataKeyValue("docTender", cifEmpresa); data.nameTender = generateDataKeyValue("nameTender", nombreEmpresa); data.sessionId = generateDataKeyValue("tokenId", tokenId); data.documentos = generateDataKeyValue("documentos",JSON.stringify(documentos)); data.firmaXML = generateDataKeyValue("firmaXML",firmaXmlResumen); data.xmlOferta = generateDataKeyValue("xmlOferta",xmlResumen); execAppIntent(buildUrl(data)); } function envioDocumentos (idExpediente, idEmpresa, cifEmpresa, nombreEmpresa, sessionId, tokenId, estructuraDocumentos, firmaXmlResumen, xmlResumen, urlGestor, certificados, puestos, successCallbackFunction, successCallbackFunctionApplet, errorCallbackFunction) { console.log ("envioDocumentos (idExpediente=" +idExpediente + ", idEmpresa=" +") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; var obligatorios = []; var anexos = []; for (i = 0; i < estructuraDocumentos.docs.length; i++) { var aDoc = estructuraDocumentos.docs[i]; var documento = { "ruta" : aDoc.docPath, "sobre" : aDoc.envelopeType, "numeroDocumento" : aDoc.docNum, "cifrado" : aDoc.docCiphered, "firma" : aDoc.docSignature }; obligatorios[i] = documento; } for (i = 0; i < estructuraDocumentos.attachments.length; i++) { var aDoc = estructuraDocumentos.attachments[i]; var anexo = { "ruta" : aDoc.docPath, "sobre" : aDoc.envelopeType, "numeroDocumento" : aDoc.docNum, "cifrado" : aDoc.docCiphered, "firma" : aDoc.docSignature }; anexos[i] = anexo; } var documentos = { "obligatorios" : obligatorios, "anexos" : anexos }; currentOperation = OPERATION_SEND_DOCUMENTS; var data = new Object(); data.op = generateDataKeyValue("op", "sendDocuments"); data.idCallForTender = generateDataKeyValue("idCallForTender", idExpediente); data.idTender = generateDataKeyValue("idTender", idEmpresa); data.docTender = generateDataKeyValue("docTender", cifEmpresa); data.nameTender = generateDataKeyValue("nameTender", nombreEmpresa); data.sessionId = generateDataKeyValue("tokenId", tokenId); data.documentos = generateDataKeyValue("documentos",JSON.stringify(documentos)); data.firmaXML = generateDataKeyValue("firmaXML",firmaXmlResumen); data.xmlOferta = generateDataKeyValue("xmlOferta",xmlResumen); execAppIntent(buildUrl(data)); } function envioDocumentosAdjudicacion (idExpediente, idEmpresa, codLote, codVar, tokenId, estructuraDocumentos, firmaXmlResumen, xmlResumen, successCallbackFunction, successCallbackFunctionApplet, errorCallbackFunction) { console.log ("envioDocumentosAdjudicacion(idExpediente=" +idExpediente + ", idEmpresa=" + idEmpresa + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; var documentosAdj = []; for (i = 0; i < estructuraDocumentos.docs.length; i++) { var aDoc = estructuraDocumentos.docs[i]; var documento = { "numeroDocumento" : aDoc.idDoc, "firma" : aDoc.firma }; documentosAdj[i] = documento; } var documentos = { "documentosAdj" : documentosAdj}; currentOperation = OPERATION_SEND_AWARDED_DOCUMENTS; var data = new Object(); data.op = generateDataKeyValue("op", "sendAwardedDocuments"); data.idCallForTender = generateDataKeyValue("idCallForTender", idExpediente); data.idTender = generateDataKeyValue("idTender", idEmpresa); data.sessionId = generateDataKeyValue("tokenId", tokenId); data.codLot = generateDataKeyValue("codLote", codLote); data.codVar = generateDataKeyValue("codVar", codVar); data.documentos = generateDataKeyValue("documentos",JSON.stringify(documentos)); data.firmaXML = generateDataKeyValue("firmaXML",firmaXmlResumen); data.xmlOferta = generateDataKeyValue("xmlOferta",xmlResumen); execAppIntent(buildUrl(data)); } /* Funcion que envia a firmar un documento PDF */ function firmaDocumentoPDF(tipoDocPDF, idDocPDF, nombreDocPDF, idToken, nrt, moduloId, successCallbackFunction, errorCallbackFunction) { console.log("firmaDocumentoPDF() : BEGIN"); console.log("firmaDocumentoPDF : Ejecucion mediante componente de escritorio"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_SIGN_PDF; var data = new Object(); data.op = generateDataKeyValue("op", "signPDFdoc"); data.tipoDoc = generateDataKeyValue("tipoDoc", tipoDocPDF); data.idDoc = generateDataKeyValue("idDoc", idDocPDF); data.nombreDocumento = generateDataKeyValue("nombreDocumento", nombreDocPDF); data.tokenId = generateDataKeyValue("tokenId", idToken); data.nrt = generateDataKeyValue("nrt", nrt); data.moduloId = generateDataKeyValue("moduloId", moduloId); execAppIntent(buildUrl(data)); } /* Funcion que finaliza la firma de un documento PDF */ function finalizarFirmaDocumentoPDF(urlFirma, transactionId, nombreCarpeta, moduloId, successCallbackFunction, errorCallbackFunction) { console.log("finalizarFirmaDocumentoPDF() : BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_FINISH_SIGN_PDF; var data = new Object(); data.op = generateDataKeyValue("op", "finishSigningPDFdoc"); data.urlFirma = generateDataKeyValue("urlFirma", urlFirma); data.transactionId = generateDataKeyValue("transactionId", transactionId); data.nombreCarpeta = generateDataKeyValue("nombreCarpeta", nombreCarpeta); data.moduloId = generateDataKeyValue("moduloId", moduloId); execAppIntent(buildUrl(data)); } /* Funcion que envia a firmar un documento */ function firmarDocumento(xmlDoc, nombreDoc, nrt, moduloId, successCallbackFunction, errorCallbackFunction) { console.log("firmarDocumento() : BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_SIGN_DOCUMENT; var data = new Object(); data.op = generateDataKeyValue("op", "signDoc"); data.xmlDoc = generateDataKeyValue("xmlDoc", xmlDoc); data.nombreDocumento = generateDataKeyValue("nombreDocumento", nombreDoc); data.nrt = generateDataKeyValue("nrt", nrt); data.moduloId = generateDataKeyValue("moduloId", moduloId); execAppIntent(buildUrl(data)); } /* Funcion que finaliza la firma de un documento */ function finalizarFirmaDocumento(urlFirma, transactionId, nombreCarpeta, moduloId, successCallbackFunction, errorCallbackFunction) { console.log("finalizarFirmaDocumento() : BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_FINISH_SING_DOCUMENT; var data = new Object(); data.op = generateDataKeyValue("op", "finishSigningDoc"); data.urlFirma = generateDataKeyValue("urlFirma", urlFirma); data.transactionId = generateDataKeyValue("transactionId", transactionId); data.nombreCarpeta = generateDataKeyValue("nombreCarpeta", nombreCarpeta); data.moduloId = generateDataKeyValue("moduloId", moduloId); execAppIntent(buildUrl(data)); } /* Funcion que envia varios documentos a firmar */ function firmaMasivaDocumentos(jsonDocs, nrt, moduloId, successCallbackFunction, errorCallbackFunction) { console.log("firmaMasivaDocumentos() : BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_SIGN_MASSIVE_DOCS; var data = new Object(); data.op = generateDataKeyValue("op", "signMassiveDocs"); data.xmlDoc = generateDataKeyValue("jsonDocs", jsonDocs); data.nrt = generateDataKeyValue("nrt", nrt); data.moduloId = generateDataKeyValue("moduloId", moduloId); execAppIntent(buildUrl(data)); } /* Funcion que finaliza la firma masiva de varios documento */ function finalizarFirmaMasivaDocumentos(urlFirma, transactionId, nombreCarpeta, moduloId, successCallbackFunction, errorCallbackFunction) { console.log("finalizarFirmaDocumento() : BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation = OPERATION_FINSH_SIGN_MASSIVE_DOCS; var data = new Object(); data.op = generateDataKeyValue("op", "finishSignMassiveDocs"); data.urlFirma = generateDataKeyValue("urlFirma", urlFirma); data.transactionId = generateDataKeyValue("transactionId", transactionId); data.nombreCarpeta = generateDataKeyValue("nombreCarpeta", nombreCarpeta); data.moduloId = generateDataKeyValue("moduloId", moduloId); execAppIntent(buildUrl(data)); } function comprobarFicheroDescifrado (rutaCompleta, urlComprobacion, idToken, successCallbackFunction, errorCallbackFunction) { console.log("comprobarFicheroDescifrado (rutaCompleta=" + rutaCompleta + ", urlComprobacion=" + urlComprobacion + "idSession=" + idSession + ")"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; var httpRequest = getHttpRequest(); httpRequest.open("GET", urlComprobacion + "&idToken=" + idToken, true); httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); httpRequest.onreadystatechange = function() { if (this.readyState == 4) { if (this.status == 200) { successCallback(); } else { if (this.status == 404) { errorCallback("404", "No existe el fichero"); } else { errorCallback(this.status, "Error en la petición"); } } } } httpRequest.withCredentials = true; httpRequest.send(); } function abrirFicheroEnServidor (tipoDocumento, idExpediente, cifEmpresa, sobre, tipoSobre, numeroDocumento, nombreDocumento, tokenId, urlServidor, successCallbackFunction, errorCallbackFunction) { console.log ("abrirFicheroEnServidor(tipoDocumento=" + tipoDocumento + ", idExpediente=" +idExpediente + ", cifEmpresa=" + cifEmpresa + ", sobre=" + sobre + ", numeroDocumento=" + numeroDocumento + ", nombreDocumento=" + nombreDocumento + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation=OPERATION_OPEN_SERVER_FILE; var data = new Object(); data.op = generateDataKeyValue("op", "openRemoteFile"); data.tipoDocumento = generateDataKeyValue ("tipoDocumento", tipoDocumento); data.idExpediente = generateDataKeyValue ("idExpediente", idExpediente); data.cifEmpresa = generateDataKeyValue ("cifEmpresa", cifEmpresa); data.sobre = generateDataKeyValue ("sobre", sobre); data.tipoSobre = generateDataKeyValue ("tipoSobre", tipoSobre); data.numeroDocumento = generateDataKeyValue ("numeroDocumento", numeroDocumento); data.nombreDocumento = generateDataKeyValue ("nombreDocumento", nombreDocumento); data.tokenId = generateDataKeyValue ("tokenId", tokenId); execAppIntent(buildUrl(data)); } function descargarFragmentos (idExpediente, tipoMesa, tipoOferta, cifEmpresas, tokenId, sessionId, urlServidor, successCallbackFunction, errorCallbackFunction) { console.log ("descargarFragmentos (idExpediente=" +idExpediente + ", tipoMesa=" + tipoMesa + ", tipoOferta=" + tipoOferta + ", cifEmpresas=" + cifEmpresas + ", tokenId=" + tokenId + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; var data = new Object(); currentOperation=OPERATION_DOWNLOAD_OFFERS; data.op = generateDataKeyValue("op", "downloadOffers"); data.idExpediente = generateDataKeyValue("idExpediente", idExpediente); data.tipoMesa = generateDataKeyValue("tipoMesa", tipoMesa); data.tipoOferta = generateDataKeyValue("tipoOferta", tipoOferta); data.cifsEmpresa = generateDataKeyValue("cifsEmpresa", cifEmpresas); data.tokenId = generateDataKeyValue("tokenId", tokenId); execAppIntent(buildUrl(data)); } function reiniciarDirectorioDeTrabajo (idExpediente, successCallbackFunction, errorCallbackFunction) { console.log ("reiniciarDirectorioDeTrabajo (idExpediente=" +idExpediente + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation=OPERATION_RESET_WORK_DIR; var data = new Object(); data.op = generateDataKeyValue("op", "resetWorkDir"); data.idExpediente = generateDataKeyValue("idExpediente", idExpediente); execAppIntent(buildUrl(data)); } function obtenerDirectorioDeTrabajo (idExpediente, successCallbackFunction, errorCallbackFunction) { console.log("obtenerDirectorioDeTrabajo (idExpediente= " + idExpediente + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation=OPERATION_GET_WORK_DIR; var data = new Object(); data.op = generateDataKeyValue("op", "getWorkDir"); data.idExpediente = generateDataKeyValue("idExpediente", idExpediente); execAppIntent(buildUrl(data)); } function descifraFichero (documentoCertificado, rutaFichero, pedirCertificado, successCallbackFunction, errorCallbackFunction) { console.log("descifraFichero (documentoCertificado=" + documentoCertificado + ", rutaFichero=" + rutaFichero + ") BEGIN"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation=OPERATION_DECRYPT_FILE; var data = new Object(); data.op = generateDataKeyValue("op", "decryptFile"); data.documentoCertificado = generateDataKeyValue("certDoc", documentoCertificado); rutaFichero = rutaFichero.replace(/\\/g, "/"); data.rutaFichero = generateDataKeyValue("filePath", rutaFichero); data.pedirCertificado = generateDataKeyValue("pedirCertificado", pedirCertificado); execAppIntent(buildUrl(data)); } function recomponerDocumento (nombreDocumento, rutaLocal, numeroMinimoComponentes, numeroMaximoComponentes, idExpediente, sobreDocumento, contadorDocumento, cifEmpresa, idToken, urlServidor, successCallbackFunction, errorCallbackFunction) { console.log("recomponerDocumento (nombreDocumento=" + nombreDocumento + ", rutaLocal=" + rutaLocal + "numeroMinimoComponentes=" + numeroMinimoComponentes + "numeroMaximoComponentes=" + numeroMaximoComponentes + ", idExpediente=" + idExpediente + ", sobreDocumento=" + sobreDocumento + ", contadorDocumento=" + contadorDocumento + ", cifEmpresa=" + cifEmpresa + ")"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation=OPERATION_BUILD_FILE; var data = new Object(); data.op = generateDataKeyValue("op", "buildFile"); data.nombreDocumento = generateDataKeyValue("nombreDocumento", nombreDocumento); data.rutaLocal = generateDataKeyValue("rutaLocal", rutaLocal); data.numeroMinimoComponentes = generateDataKeyValue("numeroMinimoComponentes", numeroMinimoComponentes); data.numeroMaximoComponentes = generateDataKeyValue("numeroMaximoComponentes", numeroMaximoComponentes); data.idExpediente = generateDataKeyValue("idExpediente", idExpediente); data.sobreDocumento = generateDataKeyValue("sobreDocumento", sobreDocumento); data.contadorDocumento = generateDataKeyValue("contadorDocumento", contadorDocumento); data.cifEmpresa = generateDataKeyValue("cifEmpresa", cifEmpresa); data.idToken = generateDataKeyValue("idToken", idToken); execAppIntent(buildUrl(data)); } function obtenerCertificado (nifCertificado, successCallbackFunction, errorCallbackFunction) { console.log ("obtenerCertificado (nifCertificado=" + nifCertificado + ") INIT"); successCallback = successCallbackFunction; errorCallback = errorCallbackFunction; currentOperation=OPERATION_OBTAIN_DATA_CERTIFICATE; var data = new Object(); data.op = generateDataKeyValue("op", "obtainDataCertificate"); data.tipoDocumento = generateDataKeyValue ("nifCertificado", nifCertificado); execAppIntent(buildUrl(data)); } /** FIN METODOS PUBLICOS **/ function generateDataKeyValue(key, value) { var data = new Object(); data.key = key; data.value = value; return data; } /** Construye una URL que configura la operacion a realizar. */ function buildUrl (arr) { // Operacion seleccionada var params = []; // Convertimos el objeto con los datos en un array del tipo key value for (var x in arr){ params.push(arr[x]); } // Las URL seran del estilo "entidad://" + Id del tipo de operacion var intentURL = PROTOCOL_URL_START_LOWER_CASE + encodeURIComponent(arr.op.value) + '?'; for (var i = 0; i < params.length; i++) { if (params[i].value != null && params[i].value != "null") { intentURL += (i != 0 ? '&' : '') + params[i].key + '=' + (params[i].avoidEncoding === true ? params[i].value : encodeURIComponent(params[i].value)); } } if (IDIOMA != null) { intentURL +='&idioma=' + IDIOMA; } return intentURL; } /** Envia una peticion a la aplicacion de firma. Si no la encuentra abierta, la arranca. */ function execAppIntent (url) { // Almacenamos la URL en una propiedad global que se mantendra siempre actualizada porque // al invocar muchas peticiones consecutivas, en caso de introducir un retardo con setTimeout, // queremos que las peticiones se realicen siempre para la ultima operacion establecida y no // la que hubiese antes de empezar la espera (lo que ocurriria si le pasasemos la URL como // parametro). currentOperationUrl = url; // Si la aplicacion no esta abierta (primera ejecucion o se ejecuta despues del cierre de la aplicacion) // es necesario abrirla y esperar a que este lista if (!isAppOpened()) { // Invocamos a la aplicacion cliente openNativeApp(); // Enviamos la peticion a la app despues de esperar un tiempo prudencial setTimeout(waitAppAndProcessRequest, 3000, CONNECTION_RETRIES); } // Si la aplicacion esta abierta, se envia de inmediato la peticion else { console.log("Enviamos el mensaje al socket abierto"); processRequest (CONNECTION_RETRIES) } } /** Indica si se sabe que la aplicacion esta abierta y lista para recibir peticiones. */ function isAppOpened() { return !!ws && connected; } /** Abre la aplicacion para que empiece a escuchar en el puerto por defecto. */ function openNativeApp () { var parametroIdioma = "" if (IDIOMA != null) { parametroIdioma +='&idioma=' + IDIOMA; } if (TEST_MODE) { idSession = "DMu0zoLXEe3b7uRCaugx"; } else { if (isDataInSessionStorage()) { idSession = retrieveSessionFromSessionStorage(); if (idSession == "") { idSession = generateNewIdSession(); openUrl(PROTOCOL_URL_START_LOWER_CASE + "websocket?v=" + PROTOCOL_VERSION + "&idsession=" + idSession + parametroIdioma); } } else { idSession = generateNewIdSession(); openUrl(PROTOCOL_URL_START_LOWER_CASE + "websocket?v=" + PROTOCOL_VERSION + "&idsession=" + idSession + parametroIdioma); } } } /* * Abre una URL en el navegador. * @param url URL que se desea abrir. */ function openUrl (url) { // Usamos el modo de invocacion mas apropiado segun el entorno // Redireccion del navegador if (isChrome() || isIOS()) { // Usamos document.location porque tiene mejor soporte por los navegadores que // window.location que es el mecanismo estandar document.location = url; } // Apertura de un IFrame else { // Si ya existe el iframe, lo eliminamos para despues volverlo a crear if (document.getElementById("iframeSle") != null) { try { var element = document.getElementById("iframeSle"); element.outerHTML = ""; delete element; } catch (e) { // No hacemos nada } } // En el caso de ser una version de internet Explorer que soportase la deteccion de aplicacion // capaces de manejar el protocolo, aprovechamos esta caracteristica (Internet Explorer para Windows 8 Modern UI) if (navigator.msLaunchUri) { navigator.msLaunchUri( url, null, function() { // No se hace nada } ); } else { // Abrimos la URL por medio de un iframe openUrlWithIframe(url); } } } function openUrlWithIframe (url) { var iframeElem = document.createElement("iframe"); var idAttr = document.createAttribute("id"); idAttr.value = "iframeSle"; iframeElem.setAttributeNode(idAttr); var srcAttr = document.createAttribute("src"); srcAttr.value = url; iframeElem.setAttributeNode(srcAttr); var heightAttr = document.createAttribute("height"); heightAttr.value = 1; iframeElem.setAttributeNode(heightAttr); var widthAttr = document.createAttribute("width"); widthAttr.value = 1; iframeElem.setAttributeNode(widthAttr); // Ocultamos el frame en los sistemas en los que podemos mediante CSS if (!isInternetExplorer7orLower()) { var styleAttr = document.createAttribute("style"); styleAttr.value = "display: none;"; iframeElem.setAttributeNode(styleAttr); } document.body.appendChild(iframeElem); } /** Comprobacion recursiva de la disponibilidad de la aplicacion hasta un maximo del * numero de intentos indicados. */ function waitAppAndProcessRequest (retries) { if (!connected) { if (retries > 0) { console.log("Creamos el cliente para el socket"); if (isDataInSessionStorage() && idSession != "" && retries < CONNECTION_RETRIES / 2) { console.log("Es posible que el servidor se haya caido, volvemos a acceder"); idSession = ""; saveDataInSessionStorage (SERVER_PORT, idSession); openNativeApp(); setTimeout(waitAppAndProcessRequest, 3000, CONNECTION_RETRIES); } else { // Abrimos el websocket ws = createWebSocket(URL_REQUEST); setTimeout(waitAppAndProcessRequest, LAUNCHING_TIME, retries - 1); } } else { processErrorResponse("java.util.concurrent.TimeoutException", devolverMensajeMultiIdioma(0)); } } else { // Enviamos la peticion console.log("Enviamos el mensaje al socket"); processRequest (CONNECTION_RETRIES); } } /** * Crea el websocket con el comportamiento basico. */ function createWebSocket(url) { var webSocket; try { webSocket = new WebSocket(url); } catch (e) { console.log("Error estableciendo el WebSocket: " + e); } webSocket.onopen = function() { connected = true; saveDataInSessionStorage (SERVER_PORT, idSession) console.log("Se abre el socket"); }; webSocket.onclose = function() { connected = false; console.log("Se cierra el socket"); }; ws.onmessage = function(evt) { console.log("Procesado por defecto del mensaje"); } ws.onerror = function(evt) { console.log("Procesado por defecto del error"); } return webSocket; } /** * Intenta conectar con la aplicacion nativa mandando una peticion echo al puerto. * Si la aplicacion responde lanzamos la ejecucion del servicio. * Si la aplicacion no responde volvemos a lanzar cada 2 segundos otra peticion echo hasta que una * peticion sea aceptada. */ function processRequest (retries) { // Establecemos que se envie la peticion cuando responda algo ws.onmessage = onMessageEchoFunction; // Establecemos que se reintente la conexion en caso de error ws.onerror = function(evt) { console.log("Error en la comunicacion por websocket: " + evt); sendEcho(ws, idSession, retries - 1); } // Enviamos una peticion de eco para comprobar que esta operativo, lo que despues hara que // se lance la operacion real como se establece en la sentencia anterior sendEcho(ws, idSession, retries); } /** Funcion que identifica la respuesta de una peticion de echo y envia a la aplicacion la operacion real. */ var onMessageEchoFunction = function() { console.log("Respuesta de la peticion de eco"); ws.onmessage = function (evt) { console.log("Respuesta obtenida de la operacion enviada"); processResponse(evt.data); } ws.send(currentOperationUrl); }; /** Envia una peticion de eco y, en caso de error, aplica un retardo y lo reintenta hasta * un determinado numero de veces */ function sendEcho(ws, idSession, retries) { if (retries <= 0) { processErrorResponse("java.util.concurrent.TimeoutException", devolverMensajeMultiIdioma(0)); return; } try { ws.send("echo=-idsession=" + idSession + "@EOF"); } catch (ex) { console.log("Error en echo: " + ex); setTimeout(sendEcho, LAUNCHING_TIME, ws, idSession, retries - 1); } } /** * Procesa una respuesta del servicio, tratandola segun convenga si se trata de un error o segun sea * el tipo de operacion que la envie. */ function processResponse (data) { // No se ha obtenido respuesta o se notifica la cancelacion if (data == undefined || data == null || data == "CANCEL") { processErrorResponse("es.gob.afirma.core.AOCancelledOperationException", devolverMensajeMultiIdioma(1)); return; } // Error de memoria if (data == "MEMORY_ERROR") { processErrorResponse("es.gob.afirma.core.OutOfMemoryError", devolverMensajeMultiIdioma(2)); return; } // Se ha producido un error if (data.length > 4 && data.substr(0, 4) == "SAF_") { processErrorResponse("java.lang.Exception", data); return; } // Se ha producido un error y no se ha identificado el tipo if (data == "NULL") { processErrorResponse("java.lang.Exception", devolverMensajeMultiIdioma(3)); return; } // Operaciones de carga y guardado if (currentOperation == OPERATION_ECHO) { successStartEcHoOperationFuntion(data); } else if (currentOperation == OPERATION_SELECT_LOCAL_FILE) { successSelectFileServiceResponseFunction(data); } else if (currentOperation == OPERATION_OPEN_LOCAL_FILE) { successOpenFileServiceResponseFunction(data); } else if (currentOperation == OPERATION_INFO_LOCAL_FILE) { successInfoFileServiceResponseFunction(data); } else if (currentOperation == OPERATION_LIST_FILE_LOGS) { successShowLogFilesFuntion(data); } else if (currentOperation == OPERATION_DOWNLOAD_LOGS_BY_DATE) { successDownloadLogFilesByDateFuntion(data); } else if (currentOperation == OPERATION_SEND_APPLICATION_ERRORS) { successEnviarInformeErroresAplicacionFunction(data); } else if (currentOperation == OPERATION_DOWNLOAD_LOGS_BETWEEN_DATES) { successDownloadLogFilesBeetweenFuntion(data); } else if (currentOperation == OPERATION_PARSE_CRITERIA_FILE) { successParseCriteriaFileFuntion(data); } else if (currentOperation == OPERATION_STORE_FILE) { successSaveFileFuntion(data); } else if (currentOperation == OPERATION_GET_PATH_CRITERIA) { successGetPathCriteriaFuntion(data); } else if (currentOperation == OPERATION_TEST) { successTestSendTenderFuntion(data); } else if (currentOperation == OPERATION_SEND_TENDER) { successSendTenderFuntion(data); } else if (currentOperation == OPERATION_SEND_SIGNATURES) { successSendSignaturesFuntion(data); } else if (currentOperation == OPERATION_SEND_DOCUMENTS) { successSendDocumentsFuntion(data); } else if (currentOperation == OPERATION_SEND_AWARDED_DOCUMENTS) { successEnvioDocumentosAdjudicacion(data); } else if (currentOperation == OPERATION_SIGN_PDF) { successFirmaDocumentoPDF(data); } else if (currentOperation == OPERATION_FINISH_SIGN_PDF) { successFinalizarFirmaDocumentoPDF(data); } else if (currentOperation == OPERATION_SIGN_DOCUMENT) { successFirmarDocumento(data); } else if (currentOperation == OPERATION_FINISH_SING_DOCUMENT) { successFinalizarFirmaDocumento(data); } else if (currentOperation == OPERATION_SIGN_MASSIVE_DOCS) { successFirmaMasivaDocumentos(data); } else if (currentOperation == OPERATION_FINSH_SIGN_MASSIVE_DOCS) { successFinalizarFirmaMasivaDocumentos(data); } else if (currentOperation == OPERATION_OPEN_SERVER_FILE) { successOpenRemoteFileServiceResponseFunction(data); } else if (currentOperation == OPERATION_DOWNLOAD_OFFERS) { succesDownloadOffersOperation(data); } else if (currentOperation == OPERATION_RESET_WORK_DIR) { successResetWorkDir(data); } else if (currentOperation == OPERATION_GET_WORK_DIR) { successGetWorkDir(data); } else if (currentOperation == OPERATION_DECRYPT_FILE) { successDecryptFile(data); } else if (currentOperation == OPERATION_BUILD_FILE) { successBuildFile(data); } else if (currentOperation == OPERATION_OBTAIN_DATA_CERTIFICATE) { successObtainDataCertificate(data); } else { console.log("Operacion desconocida. Se devuelve directamente su resultado."); if (!!successCallback) { successCallback(data); } else { console.log("No se ha proporcionado funcion callback para procesar el resultado de la operacion"); } } } /** * Procesa la respuesta cuando se detecta un error. */ function processErrorResponse(exception, message) { errorType = exception; errorMessage = message; if (!!errorCallback) { errorCallback(exception, message); } } /********************************************************** * FUNCIONES RESPUESTA A LAS PETICIONES ***********************************************************/ function successStartEcHoOperationFuntion(data){ if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var version = elements[0]; var otroTexto = elements [1]; successCallback(version, otroTexto); } function successSelectFileServiceResponseFunction(data){ if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); try { var ruta = atob(elements[0]).replace(/\\/g, "/"); var nombre = atob(elements[1]); var tamanho = atob(elements[2]); var fecha = atob(elements[3]); var hash = atob(elements[4]); successCallback(ruta, nombre, tamanho, fecha, hash); } catch (e) { errorCallback("java.parse.base64", devolverMensajeMultiIdioma(5)); return; } } function successOpenFileServiceResponseFunction(data){ if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } successCallback(); } function successInfoFileServiceResponseFunction(data){ if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); //var ruta = Base64.decode(elements[0], true).replace(/\-/g, "+").replace(/\_/g, "/").replace(/\//g, "_").replace(/\\/g, "/"); //var nombre = Base64.decode(elements[1], true).replace(/\-/g, "+").replace(/\_/g, "/").replace(/\//g, "_"); //var tamanho = Base64.decode(elements[2], true).replace(/\-/g, "+").replace(/\_/g, "/").replace(/\//g, "_"); //var fecha = Base64.decode(elements[3], true).replace(/\-/g, "+").replace(/\_/g, "/").replace(/\//g, "_"); //var hash = Base64.decode(elements[4], true).replace(/\-/g, "+").replace(/\_/g, "/").replace(/\//g, "_"); var ruta = atob(elements[0]).replace(/\\/g, "/"); var nombre = atob(elements[1]); var tamanho = atob(elements[2]); var fecha = atob(elements[3]); var hash = atob(elements[4]); successCallback(ruta, nombre, tamanho, fecha, hash); } function successTestSendTenderFuntion (data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } successCallback(); } function successSendTenderFuntion (data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var numeroRegistro = elements[0]; var fechaRegistro = elements[1]; var envioDiferido = elements[2]; var primeraVezEnvioDiferido = elements[3]; successCallback(numeroRegistro, fechaRegistro, envioDiferido, primeraVezEnvioDiferido); } function successSendSignaturesFuntion (data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var numeroRegistro = elements[0]; var fechaRegistro = elements[1]; var envioDiferido =elements[2] var primeraVezEnvioDiferido = elements[3]; successCallback(numeroRegistro, fechaRegistro, envioDiferido, primeraVezEnvioDiferido); } function successSendDocumentsFuntion (data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var numeroRegistro = elements[0]; var fechaRegistro = elements[1]; var envioDiferido =elements[2] var primeraVezEnvioDiferido = elements[3]; successCallback(numeroRegistro, fechaRegistro, envioDiferido, primeraVezEnvioDiferido); } function successShowLogFilesFuntion (data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var lista = atob(elements[0]); successCallback(lista); } function successDownloadLogFilesByDateFuntion (data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var resultado = atob(elements[0]); successCallback(resultado); } function successEnviarInformeErroresAplicacionFunction(data){ if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } successCallback(data); } function successDownloadLogFilesBeetweenFuntion (data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var resultado = atob(elements[0]); successCallback(resultado); } function successSaveFileFuntion (data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var resultado = atob(elements[0]); successCallback(resultado); } function successParseCriteriaFileFuntion (data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var resultado = atob(elements[0]); successCallback(resultado); } function successGetPathCriteriaFuntion (data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var resultado = decodeURIComponent(atob(elements[0])); successCallback(resultado); } function successEnvioDocumentosAdjudicacion(data) { if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|"); var numeroRegistro = elements[0]; var fechaRegistro = elements[1]; successCallback(numeroRegistro, fechaRegistro); } function successFirmaDocumentoPDF(data) { console.log("successFirmaDocumentoPDF : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var sepPos = data.indexOf("|"); var urlFirma = data.substring(0, sepPos); var elements = urlFirma.split("id_transaction="); var idTransaction = elements[1]; var nombreCarpeta = data.substring(sepPos + 1).replace(/(\r\n|\n|\r)/gm, ""); successCallback(urlFirma, idTransaction, nombreCarpeta); }//successFirmaDocumentoPDF function successFinalizarFirmaDocumentoPDF(data) { console.log("successFinalizarFirmaDocumentoPDF : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } // var sepPos = data.indexOf("|"); // var certificate = data.substring(0, sepPos).replace(/\-/g, "+").replace(/\_/g, "/"); // var signature = data.substring(sepPos + 1).replace(/\-/g, "+").replace(/\_/g, "/"); var certificate = ""; var signature = data.replace(/\-/g, "+").replace(/\_/g, "/"); successCallback(signature, certificate); }//successFinalizarFirmaDocumentoPDF function successFirmarDocumento(data) { console.log("successFirmarDocumento : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var sepPos = data.indexOf("|"); var urlFirma= data.substring(0, sepPos); var elements = urlFirma.split("id_transaction="); var idTransaction = elements[1]; var nombreCarpeta = data.substring(sepPos + 1).replace(/(\r\n|\n|\r)/gm, ""); successCallback(urlFirma, idTransaction, nombreCarpeta); }//successFirmarDocumento function successFinalizarFirmaDocumento(data) { console.log("successFinalizarFirmaDocumento : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var sepPos = data.indexOf("|"); var certificate= data.substring(0, sepPos).replace(/\-/g, "+").replace(/\_/g, "/"); var signature = data.substring(sepPos + 1).replace(/\-/g, "+").replace(/\_/g, "/"); successCallback(signature, certificate); }//successFinalizarFirmaDocumento function successFirmaMasivaDocumentos(data) { console.log("successFirmaMasivaDocumentos : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var sepPos = data.indexOf("|"); var urlFirma= data.substring(0, sepPos); var elements = urlFirma.split("id_transaction="); var idTransaction = elements[1]; var nombreCarpeta = data.substring(sepPos + 1).replace(/(\r\n|\n|\r)/gm, ""); successCallback(urlFirma, idTransaction, nombreCarpeta); }//successFirmaMasivaDocumentos function successFinalizarFirmaMasivaDocumentos(data) { console.log("successFinalizarFirmaMasivaDocumentos : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var jsonDocs = data.replace(/\-/g, "+").replace(/\_/g, "/"); successCallback(jsonDocs); }//successFinalizarFirmaMasivaDocumentos function successOpenRemoteFileServiceResponseFunction(data){ console.log("successOpenRemoteFileServiceResponseFunction : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } successCallback(); } function succesDownloadOffersOperation (data) { console.log("succesDownloadOffersOperation : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|") var rutaDirectorioDeTrabajo = atob(elements[0]).replace(/\\/g, "/"); var separador = atob(elements[1]).replace(/\\/g, "/");; successCallback(rutaDirectorioDeTrabajo, separador); } function successResetWorkDir (data) { console.log("successResetWorkDir : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } successCallback(); } function successGetWorkDir (data) { console.log("successGetWorkDir : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|") var rutaDirectorioDeTrabajo = atob(elements[0]).replace(/\\/g, "/"); successCallback(rutaDirectorioDeTrabajo); } function successDecryptFile (data) { console.log("successGetWorkDir : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } successCallback(); } function successBuildFile (data) { console.log("successBuildFile : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } successCallback(); } function successObtainDataCertificate (data) { console.log("successObtainDataCertificate : " + data); if (!successCallback) { console.log("No se ha proporcionado funcion callback para procesar el resultado de la firma"); errorCallback("java.lang.Exception", devolverMensajeMultiIdioma(4)); return; } var elements = data.split("|") var certificado = atob(elements[0]); certificado = certificado.replace("+++++BEGIN CERTIFICATE+++++","-----BEGIN CERTIFICATE-----"); certificado = certificado.replace("+++++END CERTIFICATE+++++","-----END CERTIFICATE-----") successCallback(certificado); } /** Genera un nuevo identificador de sesion aleatorio. */ function generateNewIdSession () { var ID_LENGTH = 20; var random = ""; var randomInts; if (typeof window.crypto != "undefined" && typeof window.crypto.getRandomValues != "undefined") { randomInts = new Uint32Array(ID_LENGTH); window.crypto.getRandomValues(randomInts); } else { randomInts = new Array(ID_LENGTH); for (var i = 0; i < ID_LENGTH; i++) { randomInts[i] = rnd() * MAX_NUMBER; } } for (var i = 0; i < ID_LENGTH; i++) { random += VALID_CHARS_TO_ID.charAt(Math.floor(randomInts[i] % VALID_CHARS_TO_ID.length)); } return random; } /** Genera numeros aleatorios con una distribucion homogenea. */ var seed; function rnd () { if (seed == undefined) { seed = new Date().getMilliseconds() * 1000 * Math.random(); } seed = (seed * 9301 + 49297) % 233280; return seed / 233280; } /* * Funciones para almacenar informacion en el * almacenamiento de sesion */ function saveDataInSessionStorage (port, idSession) { var sessionObject = new Object(); try { sessionObject.port = port; sessionObject.idSession = idSession; } catch (e) { console.log("Error al guardar datos de acceso en el sessionStorage:" + e); return; } try { sessionStorage.setItem(ID_ITEM_SESSION_STORAGE, JSON.stringify(sessionObject)); } catch(e) { console.log("Error al guardar datos de acceso en el sessionStorage:" + e); } } function isDataInSessionStorage () { if (sessionStorage.getItem(ID_ITEM_SESSION_STORAGE)) { return true; } else { return false; } } function retrievePortFromSessionStorage () { var port = ""; if (sessionStorage.getItem(ID_ITEM_SESSION_STORAGE)) { try { var object = JSON.parse(sessionStorage.getItem(ID_ITEM_SESSION_STORAGE)); console.log(object) console.log(eval(object.port)); port = object.port; } catch (e) { console.log("Error al recuperar el puerto de la session storage: " + e); } } return port; } function retrieveSessionFromSessionStorage () { var idSession = ""; if (sessionStorage.getItem(ID_ITEM_SESSION_STORAGE)) { try { var object = JSON.parse(sessionStorage.getItem(ID_ITEM_SESSION_STORAGE)); idSession = object.idSession; } catch (e) { console.log("Error al recuperar el puerto de la session storage: " + e); } } return idSession; } function establecerUrlLlamada (nuevaUrl) { console.log ("establecerUrlLlamada(nuevaUrl=" +nuevaUrl + ") BEGIN"); PROTOCOL_URL_START_LOWER_CASE = nuevaUrl + "://"; END_POINT = "/" + nuevaUrl; } function establecerNumeroDeReintentos(nuevoNumeroDeReintentos) { console.log ("establecerNumeroDeReintentos(nuevoNumeroDeReintentos=" +nuevoNumeroDeReintentos + ") BEGIN"); CONNECTION_RETRIES = nuevoNumeroDeReintentos; } /* * FUNCIONES PARA ACCESO HTTPS */ function getHttpRequest() { var xmlHttp = null; if (typeof XMLHttpRequest != "undefined") { // Navegadores actuales xmlHttp = new XMLHttpRequest(); } else if (typeof window.ActiveXObject != "undefined") { // Internet Explorer antiguos try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP.4.0"); } catch (e) { try { xmlHttp = new ActiveXObject("MSXML2.XMLHTTP"); } catch (e) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { xmlHttp = null; } } } } return xmlHttp; } /** * Funciones de comprobacion de entorno. */ function isAndroid() { return navigator.userAgent.toUpperCase().indexOf("ANDROID") != -1 || navigator.appVersion.toUpperCase().indexOf("ANDROID") != -1 || // Para la deteccion de los Kindle Fire navigator.userAgent.toUpperCase().indexOf("SILK/") != -1 || navigator.userAgent.toUpperCase().indexOf("KFJWI") != -1 || navigator.userAgent.toUpperCase().indexOf("KFJWA") != -1 || navigator.userAgent.toUpperCase().indexOf("KFTT") != -1 || navigator.userAgent.toUpperCase().indexOf("KFOT") != -1 || navigator.userAgent.toUpperCase().indexOf("KINDLE FIRE") != -1 ; } /** Indica si el sistema operativo es iOS. */ function isIOS() { return (navigator.userAgent.toUpperCase().indexOf("IPAD") != -1) || (navigator.userAgent.toUpperCase().indexOf("IPOD") != -1) || (navigator.userAgent.toUpperCase().indexOf("IPHONE") != -1) || // En iOS 13, Safari tiene el mismo userAgent que el Safari de macOS, // asi que lo distinguimos por los puntos de presion admitidos (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1); } /** Indica si el navegador es Internet Explorer. */ function isInternetExplorer() { return !!(navigator.userAgent.match(/MSIE/)) /* Internet Explorer 10 o inferior */ || !!(navigator.userAgent.match(/Trident/) && navigator.userAgent.match(/rv:11/)) /* Internet Explorer 11 (Opcion 1) */ || !!navigator.userAgent.match(/Trident.*rv[ :]*11\./); /* Internet Explorer 11 (Opcion 2) */ } /** Indica si el navegador es Internet Explorer 10 o inferior. */ function isInternetExplorer10orLower() { return !!(navigator.userAgent.match(/MSIE/)); } /** Indica si el navegador es Internet Explorer 7 o inferior. */ function isInternetExplorer7orLower() { var myNav = navigator.userAgent.toLowerCase(); return 7 >= (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false; } /** Determina con un boolean si se accede a la web con Safari 10. */ function isSafari10() { navigator.sayswho= (function(){ var ua= navigator.userAgent, tem, M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; if(/trident/i.test(M[1])){ tem= /\brv[ :]+(\d+)/g.exec(ua) || []; return 'IE '+(tem[1] || ''); } if(M[1]=== 'Chrome'){ tem= ua.match(/\b(OPR|Edge)\/(\d+)/); if(tem!= null) return tem.slice(1).join(' ').replace('OPR', 'Opera'); } M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?']; if((tem= ua.match(/version\/(\d+)/i))!= null) M.splice(1, 1, tem[1]); return M.join(' '); })(); return navigator.sayswho == 'Safari 10'; } /** Indica si el navegador es Firefox. */ function isFirefox() { return navigator.userAgent.toUpperCase().indexOf("FIREFOX") != -1 } /** Indica si el navegador es Chrome. */ function isChrome() { return navigator.userAgent.toUpperCase().indexOf("CHROME/") != -1 || navigator.userAgent.toUpperCase().indexOf("CHROMIUM") != -1; } function devolverMensajeMultiIdioma (claveMensaje) { if (IDIOMA == "cat") { return mensajes_cat[claveMensaje]; } if (IDIOMA = "en") { return mensajes_en[claveMensaje]; } return mensajes_es[claveMensaje]; } /* Metodos que publicamos */ return { echo:echo, seleccionarFicheroLocal:seleccionarFicheroLocal, abrirFicheroLocal:abrirFicheroLocal, obtenerInfoFicheroLocal:obtenerInfoFicheroLocal, listarFicherosLog:listarFicherosLog, descargarLogsPorFecha:descargarLogsPorFecha, descargarLogsIntervaloFechas:descargarLogsIntervaloFechas, enviarInformeErroresAplicacion:enviarInformeErroresAplicacion, pruebaDeEnvioOferta:pruebaDeEnvioOferta, envioOferta:envioOferta, envioFirmas:envioFirmas, envioDocumentos:envioDocumentos, cargarApplet:cargarApplet, indicarIdioma:indicarIdioma, isAppletAlive:isAppletAlive, establecerUrlLlamada:establecerUrlLlamada, parsearDocumentoLotes:parsearDocumentoLotes, parsearDocumentoCriterios:parsearDocumentoCriterios, guardarFichero:guardarFichero, getPathCriterios:getPathCriterios, envioDocumentosAdjudicacion:envioDocumentosAdjudicacion, firmaDocumentoPDF:firmaDocumentoPDF, finalizarFirmaDocumentoPDF:finalizarFirmaDocumentoPDF, firmarDocumento:firmarDocumento, finalizarFirmaDocumento:finalizarFirmaDocumento, firmaMasivaDocumentos:firmaMasivaDocumentos, finalizarFirmaMasivaDocumentos:finalizarFirmaMasivaDocumentos, comprobarFicheroDescifrado:comprobarFicheroDescifrado, abrirFicheroEnServidor:abrirFicheroEnServidor, descargarFragmentos:descargarFragmentos, reiniciarDirectorioDeTrabajo:reiniciarDirectorioDeTrabajo, descifraFichero:descifraFichero, recomponerDocumento:recomponerDocumento, obtenerCertificado:obtenerCertificado, obtenerDirectorioDeTrabajo:obtenerDirectorioDeTrabajo }; })(null, window,undefined); /** * Base64 encode / decode * http://www.webtoolkit.info/ */ var Base64 = { // private property _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", _keyStr_URL_SAFE : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=", // public method for encoding encode : function (input, URL_SAFE) { var keyStr = (URL_SAFE == true) ? this._keyStr_URL_SAFE : this._keyStr; var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = Base64._utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); } return output; }, // public method for decoding decode : function (input, URL_SAFE) { var keyStr = (URL_SAFE == true) ? this._keyStr_URL_SAFE : this._keyStr; var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = (URL_SAFE == true) ? input.replace(/[^A-Za-z0-9\-\_\=]/g, "") : input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); enc4 = keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = Base64._utf8_decode(output); return output; }, // private method for UTF-8 encoding _utf8_encode : function (string) { string = string.replace(/\r\n/g,"\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }, // private method for UTF-8 decoding _utf8_decode : function (utftext) { var string = ""; var i = 0; var c = 0; var c1 = 0; var c2 = 0; while ( i < utftext.length ) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i+1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i+1); var c3 = utftext.charCodeAt(i+2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; } };