//Implementation-Version: 6.1.0.0

/////////////////////////////////////////////////////////////////////////////////////////////////////
// EN CASO DE SER NECESARIO SOLO DEBE MODIFICARSE LA SECCION DE PROPERTIES MODIFICABLES ///
////////////////PROPERTIES MODIFICABLES BEGIN////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////

//Enable component error alerts
var showErrors = true;

//alternative user path for users with invalid chars at user home path
var ALTERNATIVE_USER_PATH_UNIX = "\\tmp";
var ALTERNATIVE_USER_PATH_WIN = "c:";
var ALTERNATIVE_USER_PATH_MACOS = "\\tmp";

//////////////////////////////////////////////////////////////////////
////////////////PROPERTIES MODIFICABLES END///////////////////////
//////////////////////////////////////////////////////////////////////

var lastErrorCode = 0;
var lastErrorDesc = "";

//Errores comunes
var ALG_HASH_NOT_SUPPORTED_ERROR = -1000;
var NO_TARGET_CERTIFICATES_ERROR = -1001;

//Errores propios del activex
var NO_WEBSIGNER_ERROR = -1002;
var DATA_NOT_FOUND_ERROR = -1003;
var OPERATION_CANCELLED_OR_WRONG_PIN_ERROR = -2147203492;
var DATA_TO_SAVE_NOT_FOUND_ERROR = -1009;

//Errores propios del applet
var OBJECT_NOT_DEFINED_ERROR = -1004;
var DLL_NOT_INSTALL_ERROR = -1005;
var JAVA_DISABLED_ERROR = -1006;
var APPLET_NOT_LOADED_ERROR = -1007;
var LIST_CERTS_NOT_LOADED_ERROR = -1008;

var i, index;
var jscriptURL, appletURL;
var activeXURL;

function browserLang() {   
	var idiomaNavegador;   
	if (navigator.language){      
		idiomaNavegador = navigator.language;     
		// En este caso, el idioma devuelto puede contener el       
		// subcódigo de idioma (p.ej. "es-ES").  
	} else {      
		idiomaNavegador = navigator.browserLanguage;     
		// En este caso, el idioma devuelto solo conteniene el       
		// código de idioma (p.ej. "es")   
	}  
	return idiomaNavegador;
}

for (i = 0; i < document.getElementsByTagName("script").length; i ++) {
	if (document.getElementsByTagName("script")[i].src != null) {
		index = document.getElementsByTagName("script")[i].src.indexOf("WS_Full.js");
		if (index != -1) {
			jscriptURL = document.getElementsByTagName("script")[i].src.substring(0, index);
			if (jscriptURL == "" || jscriptURL.substring(jscriptURL.length - 1, jscriptURL.length ) != "/") {
				jscriptURL = jscriptURL + "/";
			}
			index = jscriptURL.substring(0, jscriptURL.length - 1).lastIndexOf("/");
			if (index != -1) {
				activeXURL = jscriptURL.substring(0, index) + "/cab/";
				appletURL = jscriptURL.substring(0, index) + "/jar/";
			}
			else {
				activeXURL = "cab/";
				appletURL = "jar/";
			}		
			break;
		}
	}
}

//Log level
var ERROR = 10;
var TRACE = 20;
var DEBUG = 30;

//tipos de log
var FILE_LOG = 0;
var SYSTEMOUT_LOG = 1;
var DAILY_FILE_LOG = 2;
var NO_LOG = -1;

// Shared constants for certificate initialization
var ST_PRI_KEY="PRI";
var ST_PUB_KEY="PUB";
var ST_ALL_KEY="ALL";
var ST_ALL_WITH_CAS_KEY="ALLWITHCAS";

////////////////////////////
// PROPIEDADES FIRMA PDF  //
////////////////////////////

var PDF_FONT_COURIER = "Courier";
var PDF_FONT_COURIER_BOLD = "Courier-Bold";
var PDF_FONT_COURIER_OBLIQUE = "Courier-Oblique";
var PDF_FONT_COURIER_BOLDOBLIQUE = "Courier-BoldOblique";
var PDF_FONT_HELVETICA = "Helvetica";
var PDF_FONT_HELVETICA_BOLD = "Helvetica-Bold";
var PDF_FONT_HELVETICA_OBLIQUE = "Helvetica-Oblique";
var PDF_FONT_HELVETICA_BOLDOBLIQUE = "Helvetica-BoldOblique";
var PDF_FONT_SYMBOL = "Symbol";
var PDF_FONT_TIMES_ROMAN = "Times-Roman";
var PDF_FONT_TIMES_BOLD = "Times-Bold";
var PDF_FONT_TIMES_ITALIC = "Times-Italic";
var PDF_FONT_TIMES_BOLDITALIC = "Times-BoldItalic";
var PDF_FONT_ZAPFDINGBATS = "ZapfDingbats";

var properties = new Object();
var _WEBSIGNERACTIVEX_LOCATION = activeXURL;
var _WEBSIGNERACTIVEX_CLSID = "B178DBD1-25DF-4187-9BE0-05D123B91B98";
var _WEBSIGNERACTIVEX_NAME = "WebSigner2";
var _WEBSIGNERAPPLET_LOCATION = appletURL;
var _WEBSIGNER_VERSION = '6,1,0,0';

var INSTALLATION_WINDOW_TITTLE = "XPI Installation window";
var INSTALLATION_WINDOW_MESSAGE = "Para la ejecucion de ASF debe instalar el componente: ";

// Properties javascript


/* Nombre del elemento Applet. */
properties.initialLoadType = ST_ALL_KEY;

/* Nombre del elemento Applet. */
properties.appletName = "WebSigner";

/* Directorio donde se encuentra el JAR firmado con el applet de NetScape. */
/* Se supone que estara en un subdirectorio /applet que estara al mismo nivel que el directorio de los js's.*/
properties.appletCodebase		= _WEBSIGNERAPPLET_LOCATION;

properties.appletCode = "com.tbsolutions.asf.websigner.bl.core.WebSignerApplet";

/* Version requerida de ASF. Version actual del software a instalar. */
properties.appletArchiveVersion = "6.1.0.0";

/* Archivo con el applet para Netscape Navigator 6.x.  */
properties.appletArchivePlugin = "ws[XY]_Applet.jar";

/* Se utilizará com parámetro para indicar que se está usando internet explorer y que el almacen a usar debe ser el de windows */
properties.iexplorerKeyStore = 3;

/* Se utilizará com parámetro para indicar que se está usando firefox y que el almacen a usar debe ser el de firefox */
properties.firefoxKeyStore = 1;

/* Se utilizará com parámetro para indicar que se está usando firefox y que el almacen a usar debe ser el de firefox */
properties.macosKeyStore = 4;

// Si se autoregistra la dll
properties.isAutoInstall = true;

/* Idioma de ASF. */
properties.language = browserLang();

/* Titulo de la ventana de selecion de perfiles de ASF. */
properties.profileWinTitle = "Selection Profile Window";

var FINAL_REG_NAME = "plugins/@jss32.com/jss32";

logLevel = DEBUG;
logType = FILE_LOG;

// CRYPTOGRAPHIC MODES

var MT_PKCS7 = 1; /// Mode PKCS7
var MT_CMS = 3; /// Mode CMS
var MT_XMLDSIG = 2; /// Mode XMLDSig
var MT_SMIME = 4; /// Mode SMIME
var MT_XADES = 5; /// Mode XADES
var MT_XMLENC = 6; /// Mode XMLEnc
var MT_CAdES = 7; /// Mode CAdES
var MT_PDF = 8; /// Mode PDF
var MT_PADES = 9; /// Mode PAdES

// HASHING ALGORITHMS

var HASH_MD2 = "1.2.840.113549.2.2";
var HASH_MD4 = "1.2.840.113549.2.4";
var HASH_MD5 = "1.2.840.113549.2.5";
var HASH_SHA1 = "1.3.14.3.2.26";
var HASH_SHA_256 = "2.16.840.1.101.3.4.2.1";
var HASH_SHA_512 = "2.16.840.1.101.3.4.2.3";

//ASIMMETRIC ALGORITHMS
var RSA="1.2.840.113549.1.1.1";
var DH="1.2.840.10046.2.1";
var RSAOAEP="1.2.840.113549.1.1.7";

// SIGNATURE ALGORITHMS
var RSA_ASYMMETRIC_ALGORITHM = 7;
var DSA_ASYMMETRIC_ALGORITHM = 8;
var DIFFIE_HELLMAN_ALGORITHM = 9;

// CERTIFICATE VERIFICATION
var SIGNING_CERT_NO_VERIFY = 0;
var SIGNING_CERT_VALIDITY = 1;
var SIGNING_CERT_FULL = 2;

// INCLUDE CERTS IN SIGNATURE
var NOT_INCLUDE_CERTS = 0;
var INCLUDE_SIGNING_CERT = 1;
var INCLUDE_FULL_PATH = 2;
var INCLUDE_REFERENCES = 3;

// En caso de cms el tipo de identificador de certificados seleccionado
var PARAMETER_ISSUER_AND_SERIAL_NUMBER = "1";
var PARAMETER_SUBJECT_KEY_IDENTIFIER = "2";

//XADES_TYPE
var ATACHED_ENVELOPED = 0;
var ATACHED_ENVELOPING = 1;
var DETACHED_INTERNA = 2;
var DETACHED_EXTERNA = 3;

// Para la salida de Certificados
var OUT_JAVA = "Java"; //Salida esperada en JAVA
var OUT_MS = "Ms";     //Salida esperada en CapiCom 
var OUT_MS_SP3 = "MsSP3";		//Salida esperada en CapiCom para SP3 
var OUT_DEFAULT = "Default";     //Salida segun componente 

var deployJava={
	debug:null,
	firefoxJavaVersion:null,
	myInterval:null,
	preInstallJREList:null,
	returnPage:null,
	brand:null,
	locale:null,
	installType:null,
	EAInstallEnabled:false,
	EarlyAccessURL:null,
	
	getJavaURL:'http://java.sun.com/webapps/getjava/BrowserRedirect?host=java.com',
	appleRedirectPage:'http://www.apple.com/support/downloads/',
	oldMimeType:'application/npruntime-scriptable-plugin;DeploymentToolkit',
	mimeType:'application/java-deployment-toolkit',
	launchButtonPNG:'http://java.sun.com/products/jfc/tsc/articles/swing2d/webstart.png',
	browserName:null,
	browserName2:null,
	
	getJREs:function(){
		var list=new Array();
		if(deployJava.isPluginInstalled()){
			var plugin=deployJava.getPlugin();
			var VMs=plugin.jvms;
			for(var i=0;i<VMs.getLength();i++){
				list[i]=VMs.get(i).version;
			}
		}else{
			var browser=deployJava.getBrowser();
			if(browser=='MSIE'){
				if(deployJava.testUsingActiveX('1.7.0')){
					list[0]='1.7.0';
				}else if(deployJava.testUsingActiveX('1.6.0')){
					list[0]='1.6.0';
				}else if(deployJava.testUsingActiveX('1.5.0')){
					list[0]='1.5.0';
				}else if(deployJava.testUsingActiveX('1.4.2')){
					list[0]='1.4.2';
				}else if(deployJava.testForMSVM()){
					list[0]='1.1';
				}
			}else if(browser=='Netscape Family'){
				deployJava.getJPIVersionUsingMimeType();
				if(deployJava.firefoxJavaVersion!=null){
					list[0]=deployJava.firefoxJavaVersion;
				}else if(deployJava.testUsingMimeTypes('1.7')){
					list[0]='1.7.0';
				}else if(deployJava.testUsingMimeTypes('1.6')){
					list[0]='1.6.0';
				}else if(deployJava.testUsingMimeTypes('1.5')){
					list[0]='1.5.0';
				}else if(deployJava.testUsingMimeTypes('1.4.2')){
					list[0]='1.4.2';
				}else if(deployJava.browserName2=='Safari'){
					if(deployJava.testUsingPluginsArray('1.7.0')){
						list[0]='1.7.0';
					}else if(deployJava.testUsingPluginsArray('1.6')){
						list[0]='1.6.0';
					}else if(deployJava.testUsingPluginsArray('1.5')){
						list[0]='1.5.0';
					}else if(deployJava.testUsingPluginsArray('1.4.2')){
						list[0]='1.4.2';
					}
				}
			}
		}
		if(deployJava.debug){
			for(var i=0;i<list.length;++i){
				alert('We claim to have detected Java SE '+list[i]);
			}
		}
		return list;
	},
	
	installJRE:function(requestVersion){
		var ret=false;
		if(deployJava.isPluginInstalled()){
			if(deployJava.getPlugin().installJRE(requestVersion)){
				deployJava.refresh();
				if(deployJava.returnPage!=null){
					document.location=deployJava.returnPage;
				}
				return true;
			}else{
				return false;
			}
		}else{
			return deployJava.installLatestJRE();
		}
	},
	
	installLatestJRE:function(){
		if(deployJava.isPluginInstalled()){
			if(deployJava.getPlugin().installLatestJRE()){
				deployJava.refresh();
				if(deployJava.returnPage!=null){
					document.location=deployJava.returnPage;
				}
				return true;
			}else{
				return false;
			}
		}else{
			var browser=deployJava.getBrowser();
			var platform=navigator.platform.toLowerCase();
			if((deployJava.EAInstallEnabled=='true')&&(platform.indexOf('win')!=-1)&&(deployJava.EarlyAccessURL!=null)){
				deployJava.preInstallJREList=deployJava.getJREs();
				if(deployJava.returnPage!=null){
					deployJava.myInterval=setInterval("deployJava.poll()",3000);
				}
				location.href=deployJava.EarlyAccessURL;
				return false;
			}else{
				if(browser=='MSIE'){
					return deployJava.IEInstall();
				}else if((browser=='Netscape Family')&&(platform.indexOf('win32')!=-1)){
					return deployJava.FFInstall();
				}else{
					location.href=deployJava.getJavaURL+ ((deployJava.returnPage!=null)?('&returnPage='+deployJava.returnPage):'')+
							((deployJava.locale!=null)?('&locale='+deployJava.locale):'')+((deployJava.brand!=null)?('&brand='+deployJava.brand):'');
				}
				return false;
			}
		}
	},
		
	runApplet:function(attributes,parameters,minimumVersion){
		if(minimumVersion=='undefined'||minimumVersion==null){
			minimumVersion='1.1';
		}
		var regex="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
		var matchData=minimumVersion.match(regex);
		if(deployJava.returnPage==null){
			deployJava.returnPage=document.location;
		}
		if(matchData!=null){
			var browser=deployJava.getBrowser();
			if((browser!='?')&&('Safari'!=deployJava.browserName2)){
				if(deployJava.versionCheck(minimumVersion+'+')){
					deployJava.writeAppletTag(attributes,parameters);
				}else if(deployJava.installJRE(minimumVersion+'+')){
					deployJava.refresh();
					location.href=document.location;deployJava.writeAppletTag(attributes,parameters);
				}
			}else{
				deployJava.writeAppletTag(attributes,parameters);
			}
		}else{
			if(deployJava.debug){
				alert('Invalid minimumVersion argument to runApplet():'+minimumVersion);
			}
		}
	},
	
	writeAppletTag:function(attributes,parameters){
		var startApplet='<'+'applet ';
		var params='';
		var endApplet='<'+'/'+'applet'+'>';
		var addCodeAttribute=true;
		for(var attribute in attributes){
			startApplet+=(' '+attribute+'="'+attributes[attribute]+'"');
			if(attribute=='code'||attribute=='java_code'){
				addCodeAttribute=false;
			}
		}
		if(parameters!='undefined'&&parameters!=null){
			var codebaseParam=false;
			for(var parameter in parameters){
				if(parameter=='codebase_lookup'){
					codebaseParam=true;
				}
				if(parameter=='object'||parameter=='java_object'){
					addCodeAttribute=false;
				}
				params+='<param name="'+parameter+'" value="'+parameters[parameter]+'"/>';
			}
			if(!codebaseParam){
				params+='<param name="codebase_lookup" value="false"/>';
			}
		}
		if(addCodeAttribute){
			startApplet+=(' code="dummy"');
		}
		startApplet+='>';
		document.write(startApplet+'\n'+params+'\n'+endApplet);
	},
		
	versionCheck:function(versionPattern){
		var index=0;
		var regex="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?(\\*|\\+)?$";
		var matchData=versionPattern.match(regex);
		if(matchData!=null){
			var familyMatch=true;
			var patternArray=new Array();
			for(var i=1;i<matchData.length;++i){
				if((typeof matchData[i]=='string')&&(matchData[i]!='')){
					patternArray[index]=matchData[i];index++;
				}
			}
			if(patternArray[patternArray.length-1]=='+'){
				familyMatch=false;patternArray.length--;
			}else{
				if(patternArray[patternArray.length-1]=='*'){
					patternArray.length--;
				}
			}
			var list=deployJava.getJREs();
			for(var i=0;i<list.length;++i){
				if(deployJava.compareVersionToPattern(list[i],patternArray,familyMatch)){
					return true;
				}
			}
			return false;
		}else{
			alert('Invalid versionPattern passed to versionCheck: '+versionPattern);
			return false;
		}
	},
	
	isWebStartInstalled:function(minimumVersion){
		var browser=deployJava.getBrowser();
		if((browser=='?')||('Safari'==deployJava.browserName2)){
			return true;
		}
		if(minimumVersion=='undefined'||minimumVersion==null){
			minimumVersion='1.4.2';
		}
		var retval=false;
		var regex="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
		var matchData=minimumVersion.match(regex);
		if(matchData!=null){
			retval=deployJava.versionCheck(minimumVersion+'+');
		}else{
			if(deployJava.debug){
				alert('Invalid minimumVersion argument to isWebStartInstalled(): '+minimumVersion);
			}
			retval=deployJava.versionCheck('1.4.2+');
		}
		return retval;
	},
	
	getJPIVersionUsingMimeType:function(){
		for(var i=0;i<navigator.mimeTypes.length;++i){
			var s=navigator.mimeTypes[i].type;
			var m=s.match(/^application\/x-java-applet;jpi-version=(.*)$/);
			if(m!=null){deployJava.firefoxJavaVersion=m[1];
				if('Opera'!=deployJava.browserName2){
					break;
				}
			}
		}
	},
	
	launchWebStartApplication:function(jnlp){
		var uaString=navigator.userAgent.toLowerCase();
		deployJava.getJPIVersionUsingMimeType();
		if(deployJava.isWebStartInstalled('1.7.0')==false){
			if((deployJava.installJRE('1.7.0+')==false)||((deployJava.isWebStartInstalled('1.7.0')==false))){
				return false;
			}
		}
		var jnlpDocbase=null;
		if(document.documentURI){
			jnlpDocbase=document.documentURI;
		}
		if(jnlpDocbase==null){
			jnlpDocbase=document.URL;
		}
		var browser=deployJava.getBrowser();
		var launchTag;
		if(browser=='MSIE'){
			launchTag='<'+'object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" '+'width="0" height="0">'+'<'+'PARAM name="launchjnlp" value="'+jnlp+'"'+'>'
					+'<'+'PARAM name="docbase" value="'+jnlpDocbase+'"'+'>'+'<'+'/'+'object'+'>';
		}else if(browser=='Netscape Family'){
			launchTag='<'+'embed type="application/x-java-applet;jpi-version='+deployJava.firefoxJavaVersion+'" '+'width="0" height="0" '+'launchjnlp="'+jnlp+'"'
					+'docbase="'+jnlpDocbase+'"'+' />';
		}
		if(document.body=='undefined'||document.body==null){
			document.write(launchTag);document.location=jnlpDocbase;
		}else{
			var divTag=document.createElement("div");
			divTag.id="div1";divTag.style.position="relative";
			divTag.style.left="-10000px";
			divTag.style.margin="0px auto";
			divTag.className="dynamicDiv";
			divTag.innerHTML=launchTag;
			document.body.appendChild(divTag);
		}
	},
	
	createWebStartLaunchButtonEx:function(jnlp,minimumVersion){
		if(deployJava.returnPage==null){
			deployJava.returnPage=jnlp;
		}
		var url='javascript:deployJava.launchWebStartApplication(\''+jnlp+'\');';
		document.write('<'+'a href="'+url+'" onMouseOver="window.status=\'\'; '+'return true;"><'+'img '+'src="'+deployJava.launchButtonPNG+'" '+'border="0" /><'+'/'+'a'+'>');
	},
	
	createWebStartLaunchButton:function(jnlp,minimumVersion){
		if(deployJava.returnPage==null){
			deployJava.returnPage=jnlp;
		}
		var url='javascript:'+'if (!deployJava.isWebStartInstalled(&quot;'+minimumVersion+'&quot;)) {'+'if (deployJava.installLatestJRE()) {'+'if (deployJava.launch(&quot;'
			+jnlp+'&quot;)) {}'+'}'+'} else {'+'if (deployJava.launch(&quot;'+jnlp+'&quot;)) {}'+'}';
		document.write('<'+'a href="'+url+'" onMouseOver="window.status=\'\'; '+'return true;"><'+'img '+'src="'+deployJava.launchButtonPNG+'" '+'border="0" /><'+'/'+'a'+'>');
	},
	
	launch:function(jnlp){
		document.location=jnlp;
		return true;
	},
	
	isPluginInstalled:function(){
		var plugin=deployJava.getPlugin();
		if(plugin&&plugin.jvms){
			return true;
		}else{
			return false;
		}
	},
	
	isAutoUpdateEnabled:function(){
		if(deployJava.isPluginInstalled()){
			return deployJava.getPlugin().isAutoUpdateEnabled();
		}
		return false;
	},
	
	setAutoUpdateEnabled:function(){
		if(deployJava.isPluginInstalled()){
			return deployJava.getPlugin().setAutoUpdateEnabled();
		}
		return false;
	},
	
	setInstallerType:function(type){
		deployJava.installType=type;
		if(deployJava.isPluginInstalled()){
			return deployJava.getPlugin().setInstallerType(type);
		}
		return false;
	},
	
	setAdditionalPackages:function(packageList){
		if(deployJava.isPluginInstalled()){
			return deployJava.getPlugin().setAdditionalPackages(packageList);
		}
		return false;
	},
	
	setEarlyAccess:function(enabled){
		deployJava.EAInstallEnabled=enabled;
	},
	
	isPlugin2:function(){
		if(deployJava.isPluginInstalled()){
			if(deployJava.versionCheck('1.6.0_10+')){
				try{
					return deployJava.getPlugin().isPlugin2();
				}catch(err){
				}
			}
		}
		return false;
	},
	
	allowPlugin:function(){
		deployJava.getBrowser();
		var ret=('Safari'!=deployJava.browserName2&&'Opera'!=deployJava.browserName2);
		return ret;
	},
	
	getPlugin:function(){
		deployJava.refresh();
		var ret=null;
		if(deployJava.allowPlugin()){
			ret=document.getElementById('deployJavaPlugin');
		}
		return ret;
	},
	
	compareVersionToPattern:function(version,patternArray,familyMatch){
		var regex="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
		var matchData=version.match(regex);
		if(matchData!=null){
			var index=0;
			var result=new Array();
			for(var i=1;i<matchData.length;++i){
				if((typeof matchData[i]=='string')&&(matchData[i]!='')){
					result[index]=matchData[i];index++;
				}
			}
			var l=Math.min(result.length,patternArray.length);
			if(familyMatch){
				for(var i=0;i<l;++i){
					if(result[i]!=patternArray[i])return false;
				}
				return true;
			}else{
				for(var i=0;i<l;++i){
					if(result[i]<patternArray[i]){
						return false;
					}else if(result[i]>patternArray[i]){
						return true;
					}
				}
				return true;
			}
		}else{
			return false;
		}
	},
	
	getBrowser:function(){
		if(deployJava.browserName==null){
			var browser=navigator.userAgent.toLowerCase();
			if(deployJava.debug){
				alert('userAgent -> '+browser);
			}
			if(browser.indexOf('msie')!=-1){
				deployJava.browserName='MSIE';deployJava.browserName2='MSIE';
			}else if(browser.indexOf('iphone')!=-1){
				deployJava.browserName='Netscape Family';
				deployJava.browserName2='iPhone';
			}else if(browser.indexOf('firefox')!=-1){
				deployJava.browserName='Netscape Family';
				deployJava.browserName2='Firefox';
			}else if(browser.indexOf('chrome')!=-1){
				deployJava.browserName='Netscape Family';
				deployJava.browserName2='Chrome';
			}else if(browser.indexOf('safari')!=-1){
				deployJava.browserName='Netscape Family';
				deployJava.browserName2='Safari';
			}else if(browser.indexOf('mozilla')!=-1){
				deployJava.browserName='Netscape Family';
				deployJava.browserName2='Other';
			}else if(browser.indexOf('opera')!=-1){
				deployJava.browserName='Netscape Family';
				deployJava.browserName2='Opera';
			}else{
				deployJava.browserName='?';deployJava.browserName2='unknown';
			}
			if(deployJava.debug){
				alert('Detected browser name:'+deployJava.browserName+', '+deployJava.browserName2);
			}
		}
		return deployJava.browserName;
	},
		
	testUsingActiveX:function(version){
		var objectName='JavaWebStart.isInstalled.'+version+'.0';
		if(!ActiveXObject){
			if(deployJava.debug){
				alert('Browser claims to be IE, but no ActiveXObject object?');
			}
			return false;
		}
		try{
			return(new ActiveXObject(objectName)!=null);
		}catch(exception){
			return false;
		}
	},
	
	testForMSVM:function(){
		var clsid='{08B0E5C0-4FCB-11CF-AAA5-00401C608500}';
		if(typeof oClientCaps!='undefined'){
			var v=oClientCaps.getComponentVersion(clsid,"ComponentID");
			if((v=='')||(v=='5,0,5000,0')){
				return false;
			}else{
				return true;
			}
		}else{
			return false;
		}
	},
	
	testUsingMimeTypes:function(version){
		if(!navigator.mimeTypes){
			if(deployJava.debug){
				alert('Browser claims to be Netscape family, but no mimeTypes[] array?');
			}
			return false;
		}
		for(var i=0;i<navigator.mimeTypes.length;++i){
			s=navigator.mimeTypes[i].type;
			var m=s.match(/^application\/x-java-applet\x3Bversion=(1\.8|1\.7|1\.6|1\.5|1\.4\.2)$/);
			if(m!=null){
				if(deployJava.compareVersions(m[1],version)){
					return true;
				}
			}
		}
		return false;
	},
		
	testUsingPluginsArray:function(version){
		if((!navigator.plugins)||(!navigator.plugins.length)){
			return false;
		}
		var platform=navigator.platform.toLowerCase();
		for(var i=0;i<navigator.plugins.length;++i){
			s=navigator.plugins[i].description;
			if(s.search(/^Java Switchable Plug-in (Cocoa)/)!=-1){
				if(deployJava.compareVersions("1.5.0",version)){
					return true;
				}
			}else if(s.search(/^Java/)!=-1){
				if(platform.indexOf('win')!=-1){
					if(deployJava.compareVersions("1.5.0",version)||deployJava.compareVersions("1.6.0",version)){
						return true;
					}
				}
			}
		}
		if(deployJava.compareVersions("1.5.0",version)){
			return true;
		}
		return false;
	},
	
	IEInstall:function(){
		location.href=deployJava.getJavaURL+((deployJava.returnPage!=null)?('&returnPage='+deployJava.returnPage):'')+((deployJava.locale!=null)?('&locale='+deployJava.locale):'')
				+((deployJava.brand!=null)?('&brand='+deployJava.brand):'')+((deployJava.installType!=null)?('&type='+deployJava.installType):'');
		return false;
	},
	
	done:function(name,result){
	},
	
	FFInstall:function(){
		location.href=deployJava.getJavaURL+((deployJava.returnPage!=null)?('&returnPage='+deployJava.returnPage):'')+((deployJava.locale!=null)?('&locale='+deployJava.locale):'')
				+((deployJava.brand!=null)?('&brand='+deployJava.brand):'')+((deployJava.installType!=null)?('&type='+deployJava.installType):'');
		return false;
	},
	
	compareVersions:function(installed,required){
		var a=installed.split('.');
		var b=required.split('.');
		for(var i=0;i<a.length;++i){
			a[i]=Number(a[i]);
		}
		for(var i=0;i<b.length;++i){
			b[i]=Number(b[i]);
		}
		if(a.length==2){
			a[2]=0;
		}
		if(a[0]>b[0])return true;
		if(a[0]<b[0])return false;
		if(a[1]>b[1])return true;
		if(a[1]<b[1])return false;
		if(a[2]>b[2])return true;
		if(a[2]<b[2])return false;
		return true;
	},
	
	enableAlerts:function(){
		deployJava.browserName=null;
		deployJava.debug=true;
	},
	
	poll:function(){
		deployJava.refresh();
		var postInstallJREList=deployJava.getJREs();
		if((deployJava.preInstallJREList.length==0)&&(postInstallJREList.length!=0)){
			clearInterval(deployJava.myInterval);
			if(deployJava.returnPage!=null){
				location.href=deployJava.returnPage;
			};
		}
		if((deployJava.preInstallJREList.length!=0)&&(postInstallJREList.length!=0)&&(deployJava.preInstallJREList[0]!=postInstallJREList[0])){
			clearInterval(deployJava.myInterval);
			if(deployJava.returnPage!=null){
				location.href=deployJava.returnPage;
			}
		}
	},
		
	writePluginTag:function(){
		var browser=deployJava.getBrowser();
		if(browser=='MSIE'){
			document.write('<'+'object classid="clsid:CAFEEFAC-DEC7-0000-0000-ABCDEFFEDCBA" '+'id="deployJavaPlugin" width="0" height="0">'+'<'+'/'+'object'+'>');
		}else if(browser=='Netscape Family'&&deployJava.allowPlugin()){
			deployJava.writeEmbedTag();
		}
	},
	
	refresh:function(){
		navigator.plugins.refresh(false);
		var browser=deployJava.getBrowser();
		if(browser=='Netscape Family'&&deployJava.allowPlugin()){
			var plugin=document.getElementById('deployJavaPlugin');
			if(plugin==null){deployJava.writeEmbedTag();
			}
		}
	},
	
	writeEmbedTag:function(){
		var written=false;
		if(navigator.mimeTypes!=null){
			for(var i=0;i<navigator.mimeTypes.length;i++){
				if(navigator.mimeTypes[i].type==deployJava.mimeType){
					if(navigator.mimeTypes[i].enabledPlugin){
						document.write('<'+'embed id="deployJavaPlugin" type="'+deployJava.mimeType+'" hidden="true" />');
						written=true;
					}
				}
			}
			if(!written)
				for(var i=0;i<navigator.mimeTypes.length;i++){
					if(navigator.mimeTypes[i].type==deployJava.oldMimeType){
						if(navigator.mimeTypes[i].enabledPlugin){
							document.write('<'+'embed id="deployJavaPlugin" type="'+deployJava.oldMimeType+'" hidden="true" />');
						}
					}
				}
		}
	},
	
	do_initialize:function(){
		deployJava.writePluginTag();
		if(deployJava.locale==null){
			var loc=null;
			if(loc==null)
				try{
					loc=navigator.userLanguage;
				}catch(err){}
			if(loc==null)
				try{
					loc=navigator.systemLanguage;
				}catch(err){}
			if(loc==null)
				try{
					loc=navigator.language;
				}catch(err){}
			if(loc!=null){
				loc.replace("-","_")
				deployJava.locale=loc;
			}
		}
	}
	
};
deployJava.do_initialize();

//FUNCTIONS
/***************************************************
 Name: checkFormat
 Description: Check if the format  is valid
 Input:
 iType: int
 Output:
    boolean
***************************************************/
function checkFormat(iType) {
    return ((iType==MT_PKCS7) || (iType==MT_CMS) || (iType==MT_XMLDSIG) || (iType == MT_CAdES) || (iType == MT_XADES));
}


/***************************************************
 Name: checkAlgorithm
 Description: Check if the algorithm for sign is valid
 Input:
 sAlgorithm: string with the algorithm.
 Output:
    boolean
***************************************************/
function checkAlgorithm(sAlgorithm) {
    return ((sAlgorithm==HASH_MD2) || (sAlgorithm==HASH_MD4) || (sAlgorithm==HASH_MD5) || (sAlgorithm==HASH_SHA1) || (sAlgorithm==HASH_SHA_256));
}


//NAVIGATOR INFORMATION
var browser = navigator.userAgent.toLowerCase();
var opera = (browser.indexOf("opera") >= 0);
var Chrome = !opera && (browser.indexOf("chrome") >= 0);
var safari = !Chrome && !opera && (browser.indexOf("safari") >= 0);
var ie = !opera && !safari && !Chrome && ((browser.indexOf("msie") >= 0) || (browser.indexOf("boie") >= 0));
var firefox = !opera && !safari && !Chrome && !ie && (browser.indexOf("firefox") >= 0);

function getBrowser() {
	if (opera) {
		return "OPERA";
	} else if (Chrome) {
		return "CHROME";
	} else if (safari) {
		return "SAFARI";
	} else if (ie) {
		return "IEXPLORER";
	} else if (firefox) {
		return "FIREFOX";
	} else {
		return "";
	}
}

if (ie){
	document.write('<object id="oWebSigner_Crypto"  style="position:absolute;top:50;left=-3"');
	document.write('codebase="' + _WEBSIGNERACTIVEX_LOCATION + "" + _WEBSIGNERACTIVEX_NAME+'.cab#Version=' +  _WEBSIGNER_VERSION + '"');
	document.write('classid="CLSID:'+ _WEBSIGNERACTIVEX_CLSID +'" VIEWASTEXT>');
	document.write('</object>');
	
	
	
	document.write('<script language="JavaScript" src="' + jscriptURL + 'WSIE.js" type="text/javascript"></script>');
	document.write('<script language="JavaScript" src="' + jscriptURL + 'WSIE_const.js" type="text/javascript"></script>');
	document.write('<script language="JavaScript" src="' + jscriptURL + 'WSIE_utils.js" type="text/javascript"></script>');
}
if (firefox || Chrome || safari || opera){
	document.write('<script language="JavaScript" src="' + jscriptURL + 'WebSignerApplet_constants.js" type="text/javascript"></script>');
	document.write('<script language="JavaScript" src="' + jscriptURL + 'WebSignerApplet_utils.js" type="text/javascript"></script>');
	document.write('<script language="JavaScript" src="' + jscriptURL + 'WebSignerApplet.js" type="text/javascript"></script>');
	var ready = false;
	if (properties.isAutoInstall) {
		ready = true;
		if (ready == true) {
			properties.appletFirstInstallation = false;
		} else {
			properties.appletFirstInstallation = true;
		}
	} else {
		ready = true;
	}
	
	if (ready) {
		properties.appletInitialized = true;
		properties.appletCertificatesLoaded = true;
		if (firefox) {
			//icedtea no lo reconoce como plugin asi que podemo sdeducir que esta utilizando icedtea
			if (!deployJava.isPluginInstalled()) {
				document.write  ('<APPLET');
				document.write  (' NAME="'+ properties.appletName +'"');
				document.write  (' CODE="' + properties.appletCode +'"');
				document.write  (' CODEBASE="' + properties.appletCodebase + '"');
				document.write  (' WIDTH="1"');
				document.write  (' HEIGHT="1"');
				document.write  (' SCRIPTABLE=true');
				document.write  (' MAYSCRIPT');
				document.writeln('>');
					document.writeln('<PARAM NAME="NAME" VALUE="' + properties.appletName + '">');
					document.writeln('<PARAM NAME="CODE" VALUE="' + properties.appletCode + '">');
					document.writeln('<PARAM NAME="CODEBASE" VALUE="' + properties.appletCodebase + '">');
					document.writeln('<PARAM NAME="ARCHIVE" VALUE="' + appletURL + properties.appletArchivePlugin + ',' + appletURL + 'ws[XY]_Util.jar' + ',' +
										appletURL + 'ws[XY]_tbscrypto.jar' + ',' + appletURL + 'ws[XY]_Installer.jar' + ',' + appletURL + 'ws[XY]_Data.jar' + ',' + 
										appletURL + 'ws[XY]_Core.jar' + ',' + appletURL + 'ws[XY]_Theme.jar' + ',' + appletURL + 'ws[XY]_Launcher.jar' + '">');
					document.writeln('<PARAM NAME="ALTERNATIVE_USER_PATH_UNIX" VALUE="' + ALTERNATIVE_USER_PATH_UNIX + '">');
					document.writeln('<PARAM NAME="ALTERNATIVE_USER_PATH_WIN" VALUE="' + ALTERNATIVE_USER_PATH_WIN + '">');
					document.writeln('<PARAM NAME="ALTERNATIVE_USER_PATH_MACOS" VALUE="' + ALTERNATIVE_USER_PATH_MACOS + '">');
					document.writeln('<PARAM NAME="MAYSCRIPT" VALUE="true">');
					document.writeln('<PARAM NAME="SCRIPTABLE" VALUE="true">');
					document.writeln('<PARAM NAME="NAVIGATORINFO" VALUE="' + getBrowser() + '">');
					document.writeln('<PARAM NAME="LogLevel" VALUE="' + logLevel + '">');
					document.writeln('<PARAM NAME="LogType" VALUE="' + logType + '">');
					document.writeln('<PARAM NAME="WINDOWTITLE" VALUE="' + properties.windowTitle + '">');
					document.writeln('<PARAM NAME="PROFILEWINTITLE" VALUE="' + properties.profileWinTitle + '">');
					document.writeln('<PARAM NAME="LANGUAGE" VALUE="' + properties.language + '">');
					document.writeln('<PARAM NAME="LOADTYPE" VALUE="' + properties.initialLoadType + '">');		
				document.writeln('</APPLET>');
			} else {
				document.write  ('<OBJECT TYPE="application/x-java-vm"');
				document.write  (' WIDTH="1"');
				document.write  (' HEIGHT="1"');
				document.write  (' NAME="'+ properties.appletName +'"');
				document.write  (' ID="' + properties.appletName +'"');
				document.writeln('>');
					document.writeln('<param name="jnlp_href" value="../jnlp/websigner6100.jnlp">');		
					document.writeln('<PARAM NAME="ALTERNATIVE_USER_PATH_UNIX" VALUE="' + ALTERNATIVE_USER_PATH_UNIX + '">');
					document.writeln('<PARAM NAME="ALTERNATIVE_USER_PATH_WIN" VALUE="' + ALTERNATIVE_USER_PATH_WIN + '">');
					document.writeln('<PARAM NAME="ALTERNATIVE_USER_PATH_MACOS" VALUE="' + ALTERNATIVE_USER_PATH_MACOS + '">');
					document.writeln('<PARAM NAME="NAME" VALUE="' + properties.appletName + '">');
					document.writeln('<PARAM NAME="CODE" VALUE="' + properties.appletCode + '">');
					document.writeln('<PARAM NAME="CODEBASE" VALUE="' + properties.appletCodebase +'">');
					document.writeln('<PARAM NAME="mayscript" VALUE="true">');
					document.writeln('<PARAM NAME="SCRIPTABLE" VALUE="true">');
					document.writeln('<PARAM NAME="NAVIGATORINFO" VALUE="' + getBrowser() + '">');
					document.writeln('<PARAM NAME="LogLevel" VALUE="' + logLevel + '">');
					document.writeln('<PARAM NAME="LogType" VALUE="' + logType + '">');
					document.writeln('<PARAM NAME="WINDOWTITLE" VALUE="' + properties.windowTitle + '">');
					document.writeln('<PARAM NAME="LANGUAGE" VALUE="' + properties.language + '">');		
					document.writeln('<PARAM NAME="LOADTYPE" VALUE="' + properties.initialLoadType + '">');
					document.writeln('<PARAM NAME="PROFILEWINTITLE" VALUE="' + properties.profileWinTitle + '">');
					document.writeln('<p>You need the Java Plugin.Get it from <a href="http://java.sun.com/products/plugin/index.html">here.</a></p>');
				document.write ('</OBJECT>');
			}
		} else if (ie || Chrome || safari || opera) {
			document.write  ('<APPLET');
			document.write  (' NAME="'+ properties.appletName +'"');
			document.write  (' CODE="' + properties.appletCode +'"');
			document.write  (' CODEBASE="' + properties.appletCodebase + '"');
			document.write  (' WIDTH="1"');
			document.write  (' HEIGHT="1"');
			document.write  (' SCRIPTABLE=true');
			document.write  (' MAYSCRIPT');
			document.writeln('>');
				document.writeln('<PARAM NAME="NAME" VALUE="' + properties.appletName + '">');
				document.writeln('<PARAM NAME="CODE" VALUE="' + properties.appletCode + '">');
				document.writeln('<PARAM NAME="CODEBASE" VALUE="' + properties.appletCodebase + '">');
				if (safari) {
					document.writeln('<PARAM NAME="ARCHIVE" VALUE="' + appletURL + properties.appletArchivePlugin + ',' + appletURL + 'ws[XY]_Util.jar' + ',' +
									appletURL + 'ws[XY]_tbscrypto.jar' + ',' + appletURL + 'ws[XY]_Installer.jar' + ',' + appletURL + 'ws[XY]_Data.jar' + ',' + 
									appletURL + 'ws[XY]_Core.jar' + ',' + appletURL + 'ws[XY]_Theme.jar' + ',' + appletURL + 'ws[XY]_Launcher.jar' + '">');
				} else {
					document.writeln('<param name="jnlp_href" value="../jnlp/websigner6100.jnlp">');
				}
				document.writeln('<PARAM NAME="ALTERNATIVE_USER_PATH_UNIX" VALUE="' + ALTERNATIVE_USER_PATH_UNIX + '">');
				document.writeln('<PARAM NAME="ALTERNATIVE_USER_PATH_WIN" VALUE="' + ALTERNATIVE_USER_PATH_WIN + '">');
				document.writeln('<PARAM NAME="ALTERNATIVE_USER_PATH_MACOS" VALUE="' + ALTERNATIVE_USER_PATH_MACOS + '">');
				document.writeln('<PARAM NAME="MAYSCRIPT" VALUE="true">');
				document.writeln('<PARAM NAME="SCRIPTABLE" VALUE="true">');
				document.writeln('<PARAM NAME="NAVIGATORINFO" VALUE="' + getBrowser() + '">');
				document.writeln('<PARAM NAME="LogLevel" VALUE="' + logLevel + '">');
				document.writeln('<PARAM NAME="LogType" VALUE="' + logType + '">');
				document.writeln('<PARAM NAME="WINDOWTITLE" VALUE="' + properties.windowTitle + '">');
				document.writeln('<PARAM NAME="LANGUAGE" VALUE="' + properties.language + '">');
				document.writeln('<PARAM NAME="LOADTYPE" VALUE="' + properties.initialLoadType + '">');		
			document.writeln('</APPLET>');
		} else {
			alert("The navigator is unsupported");
		}
	} else {
		properties.appletInitialized = false;
		properties.appletCertificatesLoaded = false;
	}
}

function SignatureAppearance(iLeftLowerCornerX, iLeftLowerCornerY, iRightUpperCornerX, iRightUpperCornerY, iPage, sSignerName, sFontName, fFontSize, sImageBackGroud) {
	this.iLeftLowerCornerX = iLeftLowerCornerX;
	this.iLeftLowerCornerY = iLeftLowerCornerY;
	this.iRightUpperCornerX = iRightUpperCornerX;
	this.iRightUpperCornerY = iRightUpperCornerY;
	this.iPage = iPage;
	this.sSignerName = sSignerName;
	this.sFontName = sFontName;
	this.fFontSize = fFontSize;
	this.sImageBackGroud = sImageBackGroud;
}

function getLastErrorCode() {
	return lastErrorCode;
}

function getLastErrorDesc() {
	return lastErrorDesc;
}

var ws_loaded=true;

