/****************************************************
=================
adaptadorDWR.js
=================
Librería común para uso de DWR en cliente. 

Permite utilizar el framework DWR (Ajax) abstrayéndonos del funcionamiento 
y sintaxis del mismo y proporcionando unas funcionalidades. Esta librería 
se comunica con el servidor a través de la clase ProxyDWR.java que actúa 
como proxy para la ejecución remota de funciones del servidor desde el cliente.

francisco.gonzalez.guillen.ext@juntadeandalucia.es
****************************************************/


//////////////////////////////
// API PÚBLICA
// Estas funciones son las que ofrece la librería para su uso en el cliente
//////////////////////////////
/* Establece un mensaje en la esquina superior derecha de la página
   cuando esta se encuentra cargando información de forma asíncrona 
   (invocación remota)
   
   mensaje: Mensaje que se quiere mostrar
*/
function usarMensajeCargando(mensaje)
{
	DWRUtil.useLoadingMessage(mensaje);
}


/* Establece una imagen en la esquina superior derecha de la página
   cuando esta se encuentra cargando información de forma asíncrona 
   (invocación remota)
   
   ruta: Ruta de la imagen que se desea mostrar
*/
function usarImagenCargando(ruta)
{
	DWRUtil.useLoadingMessage(ruta);
}


/* 	Escribe en un campo (campoFragmento) el fragmento de código de la web 
	estática o dinámica) indicado en una URL (nombreURL)

	campoFragmento: Campo sobre el que vamos a escribir el contenido de la URL
	nombreURL: Texto con la dirección URL
*/
function incluirFragmento(campoFragmento, nombreURL) 
{
	ProxyDWR.obtenerFragmento(nombreURL, function(data) {
		dwr.util.setValue(campoFragmento, data, { escapeHtml:false });  
	});
}



/*	Marca un campo como erróneo, cambiándole el estilo y mostrando un popup con el 
	mensaje de eror, si la función nombreFuncion invocada con los parámetros
	contenidos en el array parametrosFuncion devuelve una cadena de texto con el error.
	
	String campoAValidar: Nombre del campo sobre el que se marcará como erróneo
	String nombreFuncion: Nombre de la función del servidor a invocar asíncronamente
	Array parametrosFuncion: Array con los parámetros que se pasarán a la función invocada
*/
function validarCampo(campoAValidar, nombreFuncion, parametrosFuncion)
{
	ProxyDWR.invocarConValidacion(nombreFuncion, parametrosFuncion, campoAValidar, function(data) {
		// Esto sólo se ejecuta si NO se lanza excepción, es decir, si el DNI es correcto
		quitarAvisoError(campoAValidar);
	});
}


/*	Carga en el campo nombreCampo la cadena de texto devuelta por la función nombreFuncion
	pasándole a la misma los parámetros contenidos en el array parametrosFuncion

	String nombreCampoID: Nombre del campo de donde tomamos el identificador (sólo para validación posterior)
	String nombreCampo: Nombre del campo donde queremos cargar la información
	String nombreFuncion: Nombre de la función del servidor a invocar asíncronamente
	Array parametrosFuncion: Array con los parámetros que se pasarán a la función invocada.
*/

function cargarCampo(nombreCampoDestino, nombreFuncion, parametrosFuncion)
{
dwr.util.setValue(nombreCampoDestino, "");  // Inicialmente lo vacío, por si hay erro no se quede el anterior
ProxyDWR.invocarPorReflexion(nombreFuncion, parametrosFuncion, function(data) {
	// Esto sólo se ejecuta si NO se lanza excepción, es decir, ej: si el DNI es correcto
	dwr.util.setValue(nombreCampoDestino, data); 
});
}

/*	Se realiza la invocacion a la funcion de validacion nombreFuncion con los parametrosFuncion.
 *  En caso de existir errores dicha funcion nos devolvera el error que se ha producido, dicho
 *  error se cargara en el nombreCampoError y se activara tambien el div que contiene a dicho campo
 *  cuyo id se pasara en nombreDivError
 */
function cargarCampoDivValidacion(nombreCampoError, nombreDivError, nombreFuncion, parametrosFuncion)
{
	ProxyDWR.invocarPorReflexion(nombreFuncion, parametrosFuncion, function(data) {
		if(data!= null && data!='' ){
			document.getElementById(nombreDivError).style.display= 'block';
			dwr.util.setValue(nombreCampoError, data); 
		}else{
			document.getElementById(nombreDivError).style.display= 'none';
			dwr.util.setValue(nombreCampoError, ""); 
		}
	});
}


/*	Carga en el campo nombreCampo la cadena de texto devuelta por la función nombreFuncion
	pasándole a la misma los parámetros contenidos en el array parametrosFuncion
	Controla además los errores en la introducción del datos poniendo el tooltip.
	
	String nombreCampoID: Nombre del campo de donde tomamos el identificador (sólo para validación posterior)
	String nombreCampo: Nombre del campo donde queremos cargar la información
	String nombreFuncion: Nombre de la función del servidor a invocar asíncronamente
	Array parametrosFuncion: Array con los parámetros que se pasarán a la función invocada.
*/
function cargarCampoConValidacion(nombreCampoID, nombreCampoDestino, nombreFuncion, parametrosFuncion)
{
	dwr.util.setValue(nombreCampoDestino, "");  // Inicialmente lo vacío, por si hay erro no se quede el anterior
	ProxyDWR.invocarConValidacion(nombreFuncion, parametrosFuncion, nombreCampoID, function(data) {
		// Esto sólo se ejecuta si NO se lanza excepción, es decir, ej: si el DNI es correcto
		dwr.util.setValue(nombreCampoDestino, data); 
		quitarAvisoError(nombreCampoID);
	});
}

/*	Recarga los combos contenidos en el array arrayCombos con la lista de 
	elementos devueltos por la función nombreFuncion pasándole a la misma 
	los parámetros contenidos en el array parametrosFuncion
	
	Array arrayCombos: Array de combos en los que queremos cargar la información
	String nombreFuncion: Nombre de la función del servidor a invocar asíncronamente
	Array parametrosFuncion: Array con los parámetros que se pasarán a la función invocada
*/
function recargarCombos(arrayCombos, nombreFuncion, parametrosFuncion)
{
	var i;
	
	for (i=0; i<arrayCombos.length; i++)
		DWRUtil.removeAllOptions(arrayCombos[i]);
	
	ProxyDWR.cargarCombo(nombreFuncion, parametrosFuncion, function(data) {
		for (i=0; i<arrayCombos.length; i++)
			DWRUtil.addOptions(arrayCombos[i], data,'identificacion', 'descripcion');
	});
}

var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0; i < iterable.length; i++)
      results.push(iterable[i]);
    return results;
  }
}

var $F =  function(element) { return $(element).value; }

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0; i < arguments.length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) {}
    }

    return returnValue;
  }
}
//////////////////////////////
// API PRIVADA
// Estas funciones no deben ser invocada directamente por el cliente de esta librería
//////////////////////////////

/*	Función para manejar las excepciones producidas en las invocaciones remotas
	
	NOTA: Estas funciones no debne ser invocadas directamente por el cliente de esta librería
*/
function manejadorExcepciones(msg, ex)
{
	if (ex.tipoTratable==false) 
		document.location.href=ex.urlErrorNoTratable;
	else // Si hay una excepción generada por nosotros mismos mostramos el error en el campo
		ponerAvisoError(ex.campoError,ex.localizedMessage);
}

// Establecemos el manejador de excepciones común a toda la librería
DWREngine.setErrorHandler(manejadorExcepciones);


/*	Función para invocación por evento de tooltip.js
	
	event: Evento disparado por el navegador
	
	NOTA: Estas funciones no deben ser invocadas directamente por el cliente de esta librería
*/
function invocacionPopUp (event) {popUp(event,'');}

/*	Función para poner aviso de error con un mensaje popup sobre un campo validado

	NOTA: Estas funciones no deben ser invocadas directamente por el cliente de esta librería
*/
function ponerAvisoError(campoAValidar, mensajeError)
{
		$(campoAValidar).alt=mensajeError;
	    $(campoAValidar).className="error";		
	 	addEvent($(campoAValidar),'mouseout',popDown);
		addEvent($(campoAValidar),'mouseover',invocacionPopUp);
}

/*	Función para quitar aviso de error con un mensaje popup sobre un campo validado

	NOTA: Estas funciones no deben ser invocadas directamente por el cliente de esta librería
*/
function quitarAvisoError(campoAValidar)
{
		$(campoAValidar).alt="";
	  	$(campoAValidar).className="";
		removeEvent($(campoAValidar),'mouseout',popDown);
	 	removeEvent($(campoAValidar),'mouseover',invocacionPopUp);
}


/*	Añade un evento a un objeto, independientemente del tipo de navegador usado.
	
	Object obj: Objeto al que corresponde el evento
	String type: Cadena de texto con el nombre del evento
	function fn: Función que se eliminará del evento
	
	NOTA: Estas funciones no deben ser invocadas directamente por el cliente de esta librería
*/
function addEvent( obj, type, fn ) {
   if ( obj.attachEvent) { // IE
   	 if (obj['e'+type+fn]==null)
	 {
	     obj['e'+type+fn] = fn;
	     obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
	     obj.attachEvent( 'on'+type, obj[type+fn] ); 
	 }
   } else //Firefox
     obj.addEventListener( type, fn, false ); 
 }


/*	Permite eliminar un evento a un objeto, independientemente del tipo de navegador usado.
	
	Object obj: Objeto al que corresponde el evento
	String type: Cadena de texto con el nombre del evento
	function fn: Función que se eliminará del evento
	
	NOTA: Estas funciones no deben ser invocadas directamente por el cliente de esta librería
*/
 function removeEvent( obj, type, fn ) {
  if ( obj.detachEvent ) { //IE
    obj.detachEvent( 'on'+type, obj[type+fn] ); 
     obj[type+fn] = null;
     obj['e'+type+fn]=null;
  } else //Firefox
    obj.removeEventListener( type, fn, false ); 
 }
 
 /*
  * Función para rellenar los campos de una tabla
  */
 var cellFuncs = [
  function(data) { return data.nif; },
  function(data) { return data.nombre; },
  function(data) {
  	return "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG SRC='../images/escfich_contract.gif' title='Obtener certificado' align='center' style='vertical-align:middle; text-align:center; cursor: hand' onclick='obtenerCertificado(" + data.codCliente + ")'/>";
    //return "<input type='button' value='Certificado' onclick='obtenerCertificado(" + data.codCliente + ")'/>";
  }
];
