/**
* JS amb tots els possibles callbacks que retorna l'applet.
* Tots es defineixen sobre el context global (window)
* pq des dels applets java no es poden cridar metodes sobre
* objectes només sobre el context global.
*
* author: albciff
**/

/**
* Callback: Usuari cancel·la operació
**/
function onSignCancel() {
	appletAlert.alert('Procés cancel·lat per l\'usuari');
}

/**
* Callback: Error durant el procés de signatura
**/
function onSignError(msg) {
	appletAlert.alert('Error durant la generació de la signatura: \n' + msg);
}

/**
* Callback: Applet disponible i carregat
**/
function onSignLoad() {
	// amaguem el modal
	$('#carregaApplet').modal('hide');
	// un cop l'applet el tenim carregat creem l'objecte js dins
	// del context global per a poder fer les signatures
	appletJS = new AppletJS();
	
	appletAlert.alert('Applet de signatura carregat correctament');
}

/**
* Callback: Error durant la carrega de l'applet.
**/
function onLoadError(msg) {
	appletAlert.alert('Error durant la càrrega de l\'applet:\n' + msg);
}

/**
* Callback: Operació de signatura correcte.
**/
function onSignOK(signature) {
	appletAlert.alert('Signatura generada correctament:\n' + signature);
}

/**
* Callback: Seleccio de fitxer, amb el path per si es vol
* mostrar a l'usuari
**/
function onFileUpload(path){
	$('#documentToSignPath').val(path);
}

/**
* Callback: Seleccio de fitxer cancel·lada per l'usuari
**/
function onFileCancel(){
	// l'usuari ha cancel·lat...
}

/**
* Callback: Retorna els alies del certificat disponibles del magatzem. Només funciona
* en mode embedded. En mode embedded no es crida el callback onSignLoad()
**/
function onReturnCerts(certs){

	var certValues;
	
	// certValues no es un array... pq es un objecte "castejat"
	// des de java... :(
	if(Object.prototype.toString.call(certs) === "[object String]"){
		certValues = [certs];
	}else{
		certValues =  certs;
	}
	
	var certList = $("#certificatesList");
	//for(var cert in certValues){
	for(var i = 0; i < certValues.length; i++){
		var listElement = $('<a href="#" class="list-group-item"/>').text(certValues[i]);
		// nomes al primer li afegim el format de selecció
		if(i == 0) listElement.addClass('list-group-item-success');
		certList.append(listElement);
	}	
	
	// per cadascun dels elements afegits a la certList
	// els fem seleccionables
	certList.find('a').each(function (){
		$(this).click(function (){
		    // elimina la seleccio de l'anterior element
			$(this).parent().find('.list-group-item-success').removeClass('list-group-item-success');
			// marca aquest element
			$(this).addClass('list-group-item-success');
		});
	});

	// amaguem el modal
	$('#carregaApplet').modal('hide');	
	// ara ja podem crear l'objecte de l'applet en el context global
	appletJS = new AppletJS();

}

/**
* Callback: Retorna el certificat seleccionat codificat en base64
**/
function onCertExported(certificate){
	// retorna el ceritficat en un alert...
	appletAlert.alert('Certificat exportat en base64: \n' + certificate);
}

/**
* Callback: Retorn de l'applet amb el certificat del signant. Si no s'ha
* realitzat la signatura encara el valor del paràmetre cert sera un msg
* d'error.
**/
function getSignCert(cert){
	appletAlert.alert("El certificat del signant és: \n" + cert);
}

/**
* Callback: Funció que es crida des de l'applet amb la signatura per parts. Aquesta crida es realitza
* si la signatura resultant excedeix els 4MB i el paràmetre js_event=true, cas que la signatura no excedeixi
* aquesta mida es retornarà de forma normal a través del onSignOK();
**/
function jsEventAppender(data){
	var elem$ = $('#appletCATCertReturnId');
	// en cas que la signatura resultant superi els 4MB, es torna el resultat via stream a 
	// través de la function jsEventAppender(data), a la última crida per saber que ha finalitzat el paràmetre data
	// pendra el valor "JS_EVENT_EXCEDS_SIZE_LIMIT" per a que es pugui recuperar la signatura sencera de l'element on s'ha
	// anat desant
	if(data === "JS_EVENT_EXCEDS_SIZE_LIMIT"){
		// a l'element document.getElementById("appletCATCertReturnId").value disposem de la signatura
		// ara es podria enviar p.e amb una crida ajax al servidor
		appletAlert.alert("Signatura resultant a través del jsEventAppender: " + elem$.val());	
	}else{
		elem$.val(elem$.val()+data);
	}
}

/**
* 	Callback: Específic per a la gestió dinàmica de la signatura PDF en funció del signant.
* 	Reb un map amb les parelles clau, valor dels atributs i el resultat de validar el certificat contra PSIS.
*	
*	Aquest callback només es produeix en cas de que els paràmetres siguin pdf_dinamic_signature_image	i pdf_visible_signature
*   tinguin valor true.
*	
*   Això permet realitzar comprovacions sobre els valors dels atributs i actuar en conseqüencia canviant el format de la signatura
*   visible del pdf, per exemple la imatge de la signatura del pdf fent una crida a setAppletParam(name,value) especificant com a name "pdf_signature_image" i
*	com a value la imatge codificada en base64.
*
*	També permet abortar l'execució de la signatura fent una crida a setAppletParam(name,value) especificant com a name "abort_pdf_sign_operation" i
*	com a value = "true"
*
**/
function pdfDinamicSignatureImage(javaMap){

	var psisAttr = javaMap.keySet().toArray();
	for(var i = 0;i<psisAttr.length;i++){
		console.log(psisAttr[i] + ' : ' + javaMap.get(psisAttr[i]));
	}
	
	// podriem implementar una casuística per a decidir si quina imatge posem
	// if(javaMap.get(psisAttr[i]) === value){
	// 		appletJS.setParameter("pdf_signature_image","iVBORw0KGgoAAAANSUhEUgAAAZk.....");
	// }else{
	// ...
	// }
	
	// Si volguessim abortar el procés podriem cridar
	// appletJS.setParameter("abort_pdf_sign_operation","true");
}
