var appletActivo= false;

var textoNoVersion="";
var urlDescarga="";
var alternativoEnlace="";
var plataforma = "";
var idioma = "";

function firmar(textofirma,textoErrorFirmaNoValida,thumbprint)
{
	firmar(textofirma,textoErrorFirmaNoValida,thumbprint,0)
}

function firmarTexto(textofirma,textoErrorFirmaNoValida,thumbprint)
{
	//alert (Base64.encode(hexToByteArray("E512D8F90B680E0D76865A4B7754681BF73F0ED2")));
	return firmar(textofirma,textoErrorFirmaNoValida,thumbprint,"TEXTO");
//return VERIFICAR(textofirma,textoErrorFirmaNoValida,thumbprint,"TEXTO");
//return SHA(textofirma,textoErrorFirmaNoValida,thumbprint,"TEXTO");
}

/**
	Devuelve la firma digital del texto indicado
	@param textoFirma: TExto a firnmar, normalmente un sha
	@pram textoErrorFirmaNoVálida: Texto a mostrar si error en la firma
	*/
function firmar(textofirma,textoErrorFirmaNoValida,thumbprint,tipo)
{	
	if (textofirma == "")
	{
		alert(textoErrorFirmaNoValida);
		return "";
	}

	// si es explorer firmo con capicon			
	if (plataforma==5)//ZAIn
	{
		return firmarZain(textoErrorFirmaNoValida,textofirma,tipo);
	}
	else
	{
		if (noFirefox())
		{
			return firmarApplet(textoErrorFirmaNoValida,textofirma);
		}
		// navegadores no explorer , firmo con javascript
		else
		{
			return firmarMozilla(textofirma,textoErrorFirmaNoValida) ;		
		}
	}	
	
	//return firmarApplet(textoErrorFirmaNoValida,textofirma);
	
}



/** PRIVADA
	Devuelve la firma digital del texto indicado usanndo un MOZILLA;FIREFOX
	@param textoFirma: TExto a firnmar, normalmente un sha
	@pram textoErrorFirmaNoVálida: Texto a mostrar si error en la firma
	*/
function firmarMozilla(textoafirmar,textoErrorFirmaNoValida) 
{
	var signedText = window.crypto.signText(textoafirmar , "ask");
	if (signedText.substring(0,5) =="error") 
	{
		alert(textoErrorFirmaNoValida);
		return "";
	}
	else if (signedText =="no generada") 
	{
		 alert(textoErrorFirmaNoValida);
		 return "";
	}
  else 
	{
		return signedText ;
  }
}

function firmarZain(textoErrorFirmaNoValida,hash,tipo)
{
	if(appletActivo)
	{
		var	applet = document.getElementById('appletfirma');
		try
		{
			applet.clearInputs();
			
			if (idioma!="ue")
			{
				applet.setOption("lang","0");
			}
			else
			{
				applet.setOption("lang","1");
			}
			applet.setOption("dlgcertsel-selectfirst","1");
			applet.setOption("dlgcertsel-checkocsp","0");			
			if ("TEXTO"==tipo)
			{
				applet.setOption("dlgsign-show","1");
				applet.addInput("inline-text",hash,"inline",null);
			}
			else
			{
				applet.setOption("dlgsign-show","0");
				applet.addInput("inline-hash",hash,"inline",null);
			}
			applet.signSetAdESLevel("none");
			applet.setCryptoStoreAuto();
			applet.sign("cades-sign-dettached");			
			var firma=applet.getOutputContent(0,true);			
			if (firma=="error") 
				firma="";
			
			//INICIO COMENTARIIO
			/*if ("TEXTO"!=tipo)
			{
				var fichero ="C:\\Users\\FAlcaraz\\Desktop\\BDP_242849.sql.txt";
				applet.clearInputs();
				//applet.addInput("file",fichero,"inline",null);
				applet.signSetAdESLevel("none");
				//applet.sign("cades-sign-dettached");
				//var cms=applet.getOutputContent(0,true);
				//applet.clearInputs();
				applet.addInputWithAttachment("inline-binary",firma,"file",fichero,"none",null,null);
				if (!applet.verify("cms-verify-dettached"))
				{
					//firma ="";
				}
			}*/

			return firma;
			
			
			
  	}
  	catch(e)
  	{
	  	alert(textoErrorFirmaNoValida + " " +  e.description );
  	}
	}	
}

function VERIFICAR(textoErrorFirmaNoValida,hash,tipo)
{
	if(appletActivo)
	{
		var	applet = document.getElementById('appletfirma');
		try
		{
			applet.clearInputs();
			
			if (idioma!="ue")
			{
				applet.setOption("lang","0");
			}
			else
			{
				applet.setOption("lang","1");
			}
		 var fichero = applet.promptFileSystem(true,false,"txt");
		 var firma = applet.promptFileSystem(true,false,"p7b");
		 applet.addInputWithAttachment("file",fichero,"file",firma,"none",null,null);
			alert(applet.verify("cms-verify-dettached"));
			
  	}
  	catch(e)
  	{
	  	alert(textoErrorFirmaNoValida + " " +  e.description );
  	}
	}	
}

function SHA(textoErrorFirmaNoValida,hash,tipo)
{
	if(appletActivo)
	{
		var	applet = document.getElementById('appletfirma');
		try
		{
			applet.clearInputs();
			
			if (idioma!="ue")
			{
				applet.setOption("lang","0");
			}
			else
			{
				applet.setOption("lang","1");
			}
		 var fichero = applet.promptFileSystem(true,false,"txt");
			applet.addInput("file",fichero,"inline",null);
			applet.hash();
			var sha = applet.getOutputContent(0,true);			
			
			alert(sha);
			
  	}
  	catch(e)
  	{
	  	alert(textoErrorFirmaNoValida + " " +  e.description );
  	}
	}	
}

function noFirefox()
{
	return navigator.userAgent.toLowerCase().indexOf('firefox') == -1;
}

function esWebKit()
{
	return noFirefox  && navigator.appName.toLowerCase().indexOf('explorer') == -1;
}

function firmarApplet(textoErrorFirmaNoValida,hash)
{
	if(appletActivo)
	{
		var	applet = document.getElementById('appletfirma');
		try
		{			
			return applet.firmar(hash, 0, 0, "");
			
  	}
  	catch(e)
  	{
	  	alert(textoErrorFirmaNoValida + " " +  e.description );
  	}
	}	
}

function writeAppletFirma(certificado,alternativo,noApplets,textoCargandoApplet,rutaDescApplets,plataformaRecibida,idiomaRecibido) 
{
	plataforma= plataformaRecibida;
	idioma = idiomaRecibido;
	if (5==plataforma)
	{
		writeAppletFirmaZain(certificado,alternativo,noApplets,textoCargandoApplet,rutaDescApplets,idiomaRecibido)
	}
	else
	{
		writeAppletFirmaAytos(certificado,alternativo,noApplets,textoCargandoApplet,rutaDescApplets);
	}
}

function writeAppletFirmaAytos(certificado,alternativo,noApplets,textoCargandoApplet,rutaDescApplets) 
{
	var parrafoNoApplets = "";
  if(noApplets != '')
  {
  	parrafoNoApplets = "<p class='error'>"+ noApplets+ "</p>";
  }
	if(noFirefox())
	{
	  if(rutaDescApplets=='')
	  {
	   rutaDescApplets = 'http://net.aytos.es/accede/applets';
	  }
		appletActivo =false;
		var cosignature="";
	  var typebrowser = "1";
	
	  var strApplet = 
	  	"<div id='cargandoAppletDeFirma'>" +
			"<p class='cargando'>"+textoCargandoApplet+"</p>"+
			"</div><object";
			if (!esWebKit())
				strApplet+= " classid='clsid:CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA'";
			else
				strApplet+=" code='org.aytos.applet.firmaelectronica.firmador.class'";
				
				strApplet +=  " width='1' height='1' align='baseline' name='appletFirmaDigital' id='appletfirma'"+
				"codebase='"+rutaDescApplets+"/jinstall-6-fcs-windows-i586.cab'>"+
      "<param name='code' value='org.aytos.applet.firmaelectronica.firmador.class'>"+   
      "<param name='type' value='application/x-java-applet;jpi-version=1.6.0'>" +
      "<param name='scriptable' value='true'>" +
	      "<param name=\"portal\" value=\"1\">" +
	      "<param name=\"cer\" value=\"" + certificado + "\">" +
	      "<param name=\"brw\" value=\"" + typebrowser + "\">" +
	      "<param name=\"cosig\" value=\"" + cosignature + "\">" +
	      "<param name=\"name\" value=\"appletFirmaDigital\">" +
	      "<param name=\"id\" value=\"appletfirma\">" +
	      "<param name=\"img\" value=\"0\">" +
	      "<param name=\"archive\" value=\""+ 	rutaDescApplets + "/firmaelectronica.jar," + rutaDescApplets + "/bcprov-ext-jdk16-143.jar," +	      rutaDescApplets + "/bcmail-jdk16-143.jar," +	      rutaDescApplets + "/MITyCLibXADES.jar," +	      rutaDescApplets + "/MITyCLibAPI-1.0.4.jar," +	      rutaDescApplets + "/xmlsec.1.4.2-ADSI-1.0.jar," +	      rutaDescApplets + "/commons-logging-1.1.1.jar," +	      rutaDescApplets + "/commons-lang-2.4.jar," +	      rutaDescApplets + "/gnu-crypto.jar\">" +
	         parrafoNoApplets +
    "</object>";
    
			
			/*<applet name=\"appletFirmaDigital\" id=\"appletfirma\" alt=\""+alternativo+"\" archive=\"" +
	      rutaDescApplets + "/firmaelectronica.jar," +
	      rutaDescApplets + "/bcprov-ext-jdk16-143.jar," +
	      rutaDescApplets + "/bcmail-jdk16-143.jar," +
	      rutaDescApplets + "/MITyCLibXADES.jar," +
	      rutaDescApplets + "/MITyCLibAPI-1.0.4.jar," +
	      rutaDescApplets + "/xmlsec.1.4.2-ADSI-1.0.jar," +
	      rutaDescApplets + "/commons-logging-1.1.1.jar," +
	      rutaDescApplets + "/commons-lang-2.4.jar," +
	      rutaDescApplets + "/gnu-crypto.jar\" code=\"org.aytos.applet.firmaelectronica.firmador.class\" width=1 height=1>" +
	      "<param name=\"portal\" value=\"1\">" +
	      "<param name=\"cer\" value=\"" + certificado + "\">" +
	      "<param name=\"brw\" value=\"" + typebrowser + "\">" +
	      "<param name=\"cosig\" value=\"" + cosignature + "\">" +
	      parrafoNoApplets +
	      "</applet>";*/

	document.write(strApplet);
	}
	else		
	{
		setTimeout("activarBotonesFirma()", 100);			
		appletActivo= true;		
	}
}

function writeAppletFirmaZain(certificado,alternativo,noApplets,textoCargandoApplet,rutaDescApplets) 
{
	  var parrafoNoApplets = "";
	  if(noApplets != '')
	  {
	  	parrafoNoApplets = "<p class='error'>"+ noApplets+ "</p>";
	  }
	  
	  if(rutaDescApplets=='')
	  {
	   rutaDescApplets = 'http://net.aytos.es/accede/applets';
	  }
		appletActivo =false;
			
	  var strApplet = 
	  	"<div id='cargandoAppletDeFirma'>" +
			"<p class='cargando'>"+textoCargandoApplet+"</p>"+
			"</div>";
			
		strApplet+=	"</div><object";
			if (!esWebKit())
				strApplet+= " classid='clsid:CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA'";
			else
				strApplet+=" code='izenpe.app.applet.AppletApplication.class'";
				
				strApplet +=  " width='1' height='1' align='baseline' name='appletFirmaDigital' id='appletfirma'"+
				"codebase='"+rutaDescApplets+"/jinstall-6-fcs-windows-i586.cab'>"+
      "<param name='code' value='izenpe.app.applet.AppletApplication.class'>"+   
      "<param name='type' value='application/x-java-applet;jpi-version=1.6.0'>" +
      "<param name='scriptable' value='true'>" +
	      "<param name=\"cer\" value=\"" + certificado + "\">" +
	      "<param name=\"name\" value=\"appletFirmaDigital\">" +
	      "<param name=\"id\" value=\"appletfirma\">" +
	      "<param name=\"archive\" value=\""+ 	rutaDescApplets + "/izenpesigner-applet.jar\">" +
	         parrafoNoApplets +
    "</object>";
			
			
			
			
	    /*"<applet name=\"appletFirmaDigital\" id=\"appletfirma\" alt=\""+alternativo+"\" archive=\"" +
	      rutaDescApplets + "/izenpesigner-applet.jar\" code=\"izenpe.app.applet.AppletApplication.class\" width=1 height=1>" +
	      "<param name=\"portal\" value=\"1\">" +
	      "<param name=\"cer\" value=\"" + certificado + "\">" +
	      "<param name=\"brw\" value=\"" + typebrowser + "\">" +
	      "<param name=\"cosig\" value=\"" + cosignature + "\">" +
	      parrafoNoApplets +
	      "</applet>";*/
	

    document.write(strApplet);
	    
	  
		setTimeout("activeButtonSignature()", 100);						
}



function activeButtonSignature() 
{
	var capa = document.getElementById("cargandoAppletDeFirma");				
		if (capa != undefined)
		{
			capa.parentNode.removeChild(capa);			
		}	
	activarBotonesFirma();	
	appletActivo= true;
}

function isAppletDeFirmaActivo()
{
	return appletActivo;
	if(noFirefox())
	{
		return appletActivo;
	}
	else
	{
		return true;
	}
}


function writeAppletVerificacion(version,alternativoApplet,t_textoNoVersion,t_alternativoEnlace,t_urlDescarga,noApplets,rutaDescApplets) 
{
	textoNoVersion=t_textoNoVersion;
	alternativoEnlace= t_alternativoEnlace;
	urlDescarga=t_urlDescarga;
	
	if(noFirefox())
	{	
	  if(rutaDescApplets=='')
	  {
	   rutaDescApplets = 'http://net.aytos.es/accede/applets';
	  }
	  var strApplet = 
	  	"<div id='noJavaCorrecta'></div><object";
			if (!esWebKit())
				strApplet+= " classid='clsid:CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA'";
			else
				strApplet+=" code='org.aytos.applet.checksystemconfiguration.CheckSystemConfiguration.class'";
				
				strApplet +=  " width='1' height='1' align='baseline' name='appletComprobacionJava' id='appletComprobacionJava'"+
				"codebase='"+rutaDescApplets+"/jinstall-6-fcs-windows-i586.cab'>"+
      "<param name='code' value='org.aytos.applet.checksystemconfiguration.CheckSystemConfiguration.class'>"+   
      "<param name='type' value='application/x-java-applet;jpi-version=1.6.0'>" +
      "<param name='scriptable' value='true'>" +
	      "<param name=\"jvmin\" value=\""+version+"\">" +
	      "<param name=\"name\" value=\"appletComprobacionJava\">" +
	      "<param name=\"id\" value=\"appletComprobacionJava\">" +
	      "<param name=\"archive\" value=\""+ 	rutaDescApplets + "/checksystemconfiguration.jar\">" +
	         noApplets +
    "</object>";
		  /*"<applet name=\"appletComprobacionJava\" id=\"appletComprobacionJava\" alt=\""+alternativoApplet+"\" archive=\"" +
		   rutaDescApplets + "/checksystemconfiguration.jar\" code=\"org.aytos.applet.checksystemconfiguration.CheckSystemConfiguration.class\" width=1 height=1>" +
	      "<param name=\"jvmin\" value=\""+version+"\">" +
	      "<p class='error'>"+ noApplets+ "</p>"+
				"</applet>";*/
	
	  document.write(strApplet);  
	}
}

//función llamada por el aplet de verificación
function isJavaVersionCorrect(versionCorrecta)
{	
	if (!versionCorrecta)
	{
		var capa = document.getElementById("noJavaCorrecta");						
		if (capa != undefined)
		{
		  var parrafo = document.createElement('p');
			parrafo.setAttribute('class','error');			
			parrafo.appendChild(document.createTextNode(textoNoVersion));
			var enlace = document.createElement('a');
			enlace.setAttribute('href',urlDescarga);
			enlace.setAttribute('title',alternativoEnlace);
			enlace.setAttribute('target','_blank');
			enlace.appendChild(document.createTextNode(urlDescarga));						
			parrafo.appendChild(enlace);									
			capa.appendChild(parrafo);
		}		
	}	
}

function showErrorMessage(textoError)
{
	alert(textoError);
	}


function appletSysConfigStarted()
{
}


var Base64 = {
 
	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
	// public method for encoding
	encode : function (input) {
		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 +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 
		}
 
		return output;
	},
 
	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
		while (i < input.length) {
 
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._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 = c1 = 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);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
 }

 

 function hexToByteArray(hexString) {
var byteArray = [];
if (hexString.length % 2) // must have even length
return;
if (hexString.indexOf("0x") == 0 || hexString.indexOf("0X") == 0)
hexString = hexString.substring(2);
for (var i = 0; i<hexString.length; i += 2)
byteArray[Math.floor(i/2)] = parseInt(hexString.slice(i, i+2), 16);
var s= "";
for (var i=0;i<byteArray.length;i++)
{
	s+=String.fromCharCode(byteArray[i]);
}
return s;
}


