/***************************************************
 * Variables JavaScript utilisées par les méthodes.
 ***************************************************/

/* Identifiant de l'applet */
var cpsAppletId = "cpsApplet";

/* Identifiant de l'input correspondant au code PIN */
var cpsAppletCodePinHtmlId = "codePinFieldHtmlId";

/* Identifiant du boutton submit déclenchant l'action sur l'applet */
var cpsAppletOkButtonHtmlId = "okButtonHtmlId";

/* Identifiant de l'image CPS/NO CPS */
var cpsAppletBitmapHtmlId = "bitmapHtmlId";
var cpsAppletBitmapSrc = images_path + "module/login/cartecps.gif";
var cpsAppletBitmapDisabledSrc = images_path + "module/login/cartecpsdisabled.gif";

/* Identifiant du div d'erreur */
var cpsAppletErrorDivHtmlId = "errorDivHtmlId";

/* Identifiant de l'input des données à signer */
var cpsAppletDataToSignHtmlId = "dataToSignHtmlId";

/* Identifiant de l'input des données signées */
var cpsAppletSignedDataHtmlId = "signedDataHtmlId";

/* Identifiant de l'input du certificat de signature */
var cpsAppletSignCertHtmlId = "signCertHtmlId";

/* Fonctions de communication Javascript->JAVA */

/***************************************************
 * Indique si le code PIN de la carte est vérifié.
 ***************************************************/
function cpsIsCodePinVerified() {
	var applet = document.getElementById(cpsAppletId);
	if (applet) {
		return applet.isCodePinVerified();
	}
	return false;
}

/***************************************************
 * Lance la méthode d'authentification.
 ***************************************************/
function cpsActionValidation() {
	//alertCpsError('')
	var input = document.getElementById(cpsAppletCodePinHtmlId);
	var codePin;
	if (input) {
		codePin = input.value;
		input.value = "";
	}
	var applet = document.getElementById(cpsAppletId);
	if (applet) {
		applet.actionValidation(codePin);
	}
}

/***************************************************
 * Lance la méthode de signature de données.
 ***************************************************/
function cpsActionSignature() {
	//alertCpsError('')
	var input = document.getElementById(cpsAppletCodePinHtmlId);
	var codePin;
	var condensat;
	if (input) {
		codePin = input.value;
		input.value = "";
	}
	var condensatInput = document.getElementById(cpsAppletDataToSignHtmlId);
	if (condensatInput) {
		condensat = condensatInput.value;
	}
	var applet = document.getElementById(cpsAppletId);
	if (applet) {
		return applet.actionSignature(codePin, condensat);
	}
	return false;
}


/* Fonctions de communication JAVA->Javascript */

/***************************************************
 * Désactive le focus sur l'applet en le donnant à
 * un autre élément.
 ***************************************************/
function disableCpsFocus() {
	// A surcharger par une méthode du même nom
	var input = document.getElementById(cpsAppletCodePinHtmlId);
	if (input) {
		input.focus();
	}
}

/***************************************************
 * Dispatche les données signées et le certificat de
 * signature sur la page Web.
 ***************************************************/
function dispatchCpsSignature(signature, signatureCert) {
	var signatureInput = document.getElementById(cpsAppletSignedDataHtmlId);
	if (signatureInput) {
		signatureInput.value = signature;
	}
	var signatureCertInput = document.getElementById(cpsAppletSignCertHtmlId);
	if (signatureCertInput) {
		signatureCertInput.value = signatureCert;
	}
}

/***************************************************
 * Active les éléments HTML de la page Web pour
 * utiliser l'applet CPS.
 ***************************************************/
function enableCps() {
  	var button = document.getElementById(cpsAppletOkButtonHtmlId);
  	if (button) {
  		//button.disabled = null;
  		button.href = 'javascript:cpsActionValidation();';
  	}
  	var img = document.getElementById(cpsAppletBitmapHtmlId);
  	if (img) {
  		img.src = cpsAppletBitmapSrc;
  	}
  	return 0;
}

/***************************************************
 * Désactive les élements HTML de la page Web en cas
 * d'erreur de chargement de l'applet CPS.
 ***************************************************/
function disableCps() {
	var button = document.getElementById(cpsAppletOkButtonHtmlId);
	if (button) {
		//button.disabled = "true";
		button.href = '#';
	}
  	var img = document.getElementById(cpsAppletBitmapHtmlId);
  	if (img) {
  		img.src = cpsAppletBitmapDisabledSrc;
  	}
  	return 0;
}

/***************************************************
 * Désactive le code PIN de la page Web en cas
 * d'erreur de chargement de l'applet CPS.
 ***************************************************/
function lockCpsCodePin() {
	var input = document.getElementById(cpsAppletCodePinHtmlId);
	if (input) {
		input.disabled = "true";
		input.readonly = "true";
  		input.style.backgroundColor = "#CCCCCC";
	}
	return 0;
}

/***************************************************
 * Active le code PIN de la page Web pour utiliser
 * l'applet CPS.
 ***************************************************/
function unlockCpsCodePin() {
	var input = document.getElementById(cpsAppletCodePinHtmlId);
	if (input) {
		input.disabled = null;
		input.readonly = null;
		input.value = "";
		input.style.backgroundColor = "#FFFFFF";
	}
	return 0;
}

/***************************************************
 * Dispatche les erreurs de l'applet CPS sur la page
 * Web.
 ***************************************************/
function alertCpsError(message) {
	var div = document.getElementById(cpsAppletErrorDivHtmlId);
	if (div) {
		div.innerHTML = message;
	}
	return 0;
}

/***************************************************
 * Retourne le code de l'applet CPS.
 *
 * @param code la classe de l'applet
 * @param codeBase le chemin des jars (généralement: 'jars').
 * @param height la hauteur de l'applet (généralement: 0)
 * @param width la largeur de l'applet (généralement: 0)
 * @param cpsMode le mode de l'applet ('00', 'debug')
 * @param urlConnect l'URL où sera poster les informations de connexion
 * @param urlRedirect l'URL de redirection après le poste des informations de connexion
 * @param authChallenge le défi d'authentification à chiffrer par l'applet (Base64)
 *
 * Les informations postées par l'applet sur l'URL urlConnect sont :
 *
 * cpsAuthChallenge le défi d'authentification (Base64)
 * cpsAuthResponse la réponse d'authentification (Base64) à vérifier avec le certificat de la personne (de l'annuaire)
 * cpsAuthX509 le certificat de la personne (Base64)
 * cpsSigX509 le certificat de la personne (Base64)
 * cpsProfession le code profession
 * cpsAdeli le numéro d'identifiant national (ApsIdNat)
 * cpsNumcard le numéro de la carte
 * cpsLastname le nom
 * cpsFirstname le prénom
 * cpsError 'true' si erreur
 * cpsErrorCode le code d'erreur
 * cpsErrorMessage le message correspondant au code d'erreur
 ***************************************************/
function getApplet(code, codeBase, height, width, cpsMode, urlConnect, urlRedirect, authChallenge) {
    /* Configuration de l'applet */
	var cpsAppletCode = code;
	var cpsAppletCodebase = codeBase;
	if (!cpsAppletCodebase) {
		codeBase = "jars";
	}
	var cpsAppletArchive = "cps-all.jar, commons-codec-1.3.jar, iaikPkcs11Wrapper.jar";
	var cpsAppletMayscript = "true";
	var cpsAppletWidth = width;
	var cpsAppletHeight = height;
	var cpsAppletParamMode = cpsMode;
	if (!cpsAppletParamMode) {
		cpsAppletParamMode = "00";
	}
	var cpsAppletParamUrlConnect = urlConnect;
	if (!cpsAppletParamUrlConnect) {
		cpsAppletParamUrlConnect = "";
	}
	var cpsAppletParamUrlRedirect = urlRedirect;
	if (!cpsAppletParamUrlRedirect) {
		cpsAppletParamUrlRedirect = "";
	}
	var cpsAppletParamAuthChallenge = authChallenge;
	if (!cpsAppletParamAuthChallenge) {
		cpsAppletParamAuthChallenge = "";
	}
	var appletNotSupported = "No Java 2 SDK, Standard Edition v 1.4.2 support for APPLET!!";

	/* Affichage de l'applet en fonction du navigateur */
	var _info = navigator.userAgent;
    var _ns = false;
    var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);

    var appletCpsHtml;
    if (_ie == true) appletCpsHtml = ''
	    + '<object id="' + cpsAppletId + '" width="' + cpsAppletWidth + '" height="' + cpsAppletHeight + '" classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" codebase="https://java.sun.com/products/plugin/autodl/jinstall-1_4_2-windows-i586.cab#Version=1,4,2,0">'
	    	+ '<param name="name" value="' + cpsAppletId + '">'
			+ '<param name="java_type" value="application/x-java-applet;jpi-version=1.4.2"/>'
			+ '<param name="java_code" value="' + cpsAppletCode + '"/>'
			+ '<param name="java_codebase" value="' + cpsAppletCodebase + '"/>'
			+ '<param name="java_archive" value="' + cpsAppletArchive + '"/>'
			+ '<param name="scriptable" value="' + cpsAppletMayscript + '"/>'
			+ '<param name="mayscript" value="' + cpsAppletMayscript + '">'
			+ '<param name="mode" value="' + cpsAppletParamMode + '"/>'
			+ '<param name="urlConnect" value="' + cpsAppletParamUrlConnect + '"/>'
			+ '<param name="urlRedirect" value="' + cpsAppletParamUrlRedirect  + '"/>'
			+ '<param name="authChallenge" value="' + cpsAppletParamAuthChallenge + '"/>'
			+ appletNotSupported
		 + '</object>';
    else if (_ns == true) appletCpsHtml = ''
    	 + '<embed id="' + cpsAppletId + '" width="' + cpsAppletWidth + '" height="' + cpsAppletHeight + '" '
			 + 'name="' + cpsAppletId + '"'
			 + 'pluginspage="https://java.sun.com/j2se/1.4/download.html"'
			 + 'type="application/x-java-applet;jpi-version=1.4.2"'
			 + 'code="' + cpsAppletCode + '"'
			 + 'codebase="' + cpsAppletCodebase + '"'
			 + 'archive="' + cpsAppletArchive + '"'
			 + 'mayscript="' + cpsAppletMayscript + '"'
			 + 'scriptable="' + cpsAppletMayscript + '"'
			 + 'mode="' + cpsAppletParamMode + '"'
			 + 'urlConnect="' + cpsAppletParamUrlConnect + '"'
			 + 'urlRedirect="' + cpsAppletParamUrlRedirect  + '"'
			 + 'authChallenge="' + cpsAppletParamAuthChallenge + '"'
			 + '<noembed>'
			 + appletNotSupported
			 + '</noembed>'
		 + '</embed>';
    else appletCpsHtml = ''
	    + '<applet id="' + cpsAppletId + '" name="' + cpsAppletId + '" width="' + cpsAppletWidth + '" height="' + cpsAppletHeight + '" '
			+ 'mayscript="' + cpsAppletMayscript + '" scriptable="' + cpsAppletMayscript + '"'
			+ 'code="' + cpsAppletCode + '" codebase="' + cpsAppletCodebase + '" archive="' + cpsAppletArchive + '">'
			+ '<param name="mode" value="' + cpsAppletParamMode + '"/>'
			+ '<param name="urlConnect" value="' + cpsAppletParamUrlConnect + '"/>'
			+ '<param name="urlRedirect" value="' + cpsAppletParamUrlRedirect  + '"/>'
			+ '<param name="authChallenge" value="' + cpsAppletParamAuthChallenge + '"/>'
			+ appletNotSupported
		+ '</applet>';
	return appletCpsHtml;
}

/***************************************************
 * Retourne le code de l'applet de Test.
 ***************************************************/
function getAppletTest(codeBase) {
	return getApplet('com.sqli.cps.applet.AppletTest.class', codeBase, '0', '0');
}

/***************************************************
 * Ecrit le code de l'applet de Test sur le
 * document.
 ***************************************************/
function writeAppletTest(codeBase) {
	/**
	 * On écrit le code HTML de l'applet.
	 */
	var appletHtml = getAppletTest(codeBase);
	document.writeln(appletHtml);
}

/***************************************************
 * Retourne le code de l'applet CPS.
 ***************************************************/
function getAppletCps(codeBase, cpsMode, urlConnect, urlRedirect, authChallenge) {
	return getApplet('com.sqli.cps.applet.AppletCps.class', codeBase, '0', '0', cpsMode, urlConnect, urlRedirect, authChallenge);
}

/***************************************************
 * Ecrit le code de l'applet CPS sur le document.
 ***************************************************/
function writeAppletCps(codeBase, cpsMode, urlConnect, urlRedirect, authChallenge) {
   	/**
	 * Appel de la fonction disableCps() pour désactiver l'applet par défaut.
	 * C'est l'applet qui active les élements HTML.
	 */
	disableCps();
	lockCpsCodePin();

	/**
	 * On écrit le code HTML de l'applet.
	 */
	var appletCpsHtml = getAppletCps(codeBase, cpsMode, urlConnect, urlRedirect, authChallenge);
	document.writeln(appletCpsHtml);
}

