[SOLUCIONADO]Problemas para disparar un evento.

Hola!.. después de varios días buscando solución a mi problema, y sin encontrarla, decidí solicitar ayuda en el foro. La situación es la siguiente: Contamos dentro de un formulario con dos ef_editable_fecha, el primero representa a una fecha de inicio y el segundo a una fecha de finalización, el sistema requiere que al colocar estas dos fechas se complete un tercer campo que es un ef_editable_numero en donde debe aparecer la cantidad de meses que existen entre una fecha y la otra.
En un primer momento recurrí a Javascript, al evento validar de la segunda fecha, de esta manera cuando el usuario selecciona a través del almanaque la fecha se dispara el evento y todo funciona bien, pero!.. si el usuario en lugar de ingresar la fecha con el almanaque lo hace manualmente… el evento no se ejecuta…y no pasa nada, además de esto… funciona correctamente si estoy por ingresar a un nuevo registro (llegue a través del botón agregar), pero si voy por el modificar…se completa el formulario con todos los datos del registro que seleccione pero al intentar moverme sobre cualquier otro componente (Por ej ir a otra pestaña) me salta un error que adjunto en una imagen, donde me dice que la fecha final es nula cuando no es asi. Adjunto tambien el código javascript que utilice.
Después se me ocurrió colocar un botón al lado de la segunda fecha que diga “Calcular” y busque en el foro como acomodarlo donde yo quiero…vi algo de redefinir el método generar_botones en una subclase del formulario…la busque, la encontre en
proyectos/toba/2.1.0/php/nucleo/componentes/interface/toba_ei.php pero no veo sencilla la solución.
También podría colocar un check para que el usuario lo tilde y se dispare el evento de calcular, pero no lo veo como una forma elegante para el usuario. Acepto sugerencias y/o correcciones. Gracias!
Estamos trabajando con la versión de toba 2.1.0, sobre Ubuntu 10.10.

	function extender_objeto_js()
	{
		echo "
			
		{$this->objeto_js}.evt__fechabajaoriginal__validar = function()
		{	
			function DateDiff(d1,d2) {
				var d1Y = d1.getFullYear();
				var d2Y = d2.getFullYear();
				var d1M = fechaalta.getMonth();
				var d2M = fechahasta.getMonth();
		 		return ((d2M+12*d2Y)-(d1M+12*d1Y));
			}
			
			var fechaalta= this.ef('fechaaltacienciaytecnica').fecha();
			var fechahasta= this.ef('fechabajaoriginal').fecha();
			
			if  (this.ef('fechaaltacienciaytecnica').tiene_estado ()){
		
				if ((fechahasta-fechaalta)<0){
					alert ('Fecha de Alta del proyecto debe ser menor que la fecha de finalización'); 				
				}else{ 
					this.ef('duracion').set_estado(DateDiff(fechaalta,fechahasta));
					this.ef('fechabaja').set_estado(this.ef('fechabajaoriginal').get_estado());
				}
				
			}else {
				alert ('Primero debe ingresar la fecha de alta del proyecto');
			}
		}
		";
}

Hola… solucionado el problema, modifique un poco el código y fui probando hasta que logre que funcione…reemplace el método validar por el procesar y de esta manera ya no sale el error que les comentaba anteriormente, pero tuve que obligar al usuario a que ingrese el numero de proyecto antes que las fechas porque el procesar se ejecuta cuando se carga el formulario… y si no hacia eso le iban a saltar los alertar ni bien carga el formulario. Un poco enredado, pero solucionado(parchado)…Gracias igual…y adjunto los cambios

{$this->objeto_js}.evt__fechabajaoriginal__procesar = function()
		{    
			
			function DateDiff(d1,d2) {
					var d1Y = d1.getFullYear();
					var d2Y = d2.getFullYear();
					var d1M = d1.getMonth();
					var d2M = d2.getMonth();
					return ((d2M+12*d2Y)-(d1M+12*d1Y));
			}

			if  (this.ef('nroproyecto').tiene_estado ()){		
				if  (this.ef('fechaaltacienciaytecnica').tiene_estado ()){
					var fechaalta= this.ef('fechaaltacienciaytecnica').fecha();
					var fechahasta= this.ef('fechabajaoriginal').fecha();
				
					if ((fechahasta-fechaalta)<0){
						alert ('Fecha de Alta del proyecto debe ser menor que la fecha de finalizacion');                 
					}else{ 
						this.ef('duracion').set_estado(DateDiff(fechaalta,fechahasta));
						this.ef('fechabaja').set_estado(this.ef('fechabajaoriginal').get_estado());
					}
				
				}else {
					alert ('Primero debe ingresar la fecha de alta del proyecto');
				}
			}
		}

Hola Alejandra,

justo estaba por plantearte el tema del procesar (me ganaste de mano :D), el tema que tenias en el validar es que dicho metodo requiere que se retorne un valor booleano, esto es … si valida o no valida, como vos no retornabas nada… por coercion terminaba interpretandose un false (osea que no validaba) y por ello el mensaje. Si bien conceptualmente es correcto que se haga en dicho metodo, te faltaba retornar el valor.

Con respecto al procesar, el metodo recibe como parametro el valor es_inicial que te marca cuando el procesamiento es el de entrada a pagina y cuando se realiza por alguna accion del usuario.
Entonces por ahi el control sobre el nroproyecto lo podes reemplazar por un control sobre este parametro.

Saludos

Muchas Gracias!!! Ahora me quedo más claro el concepto…voy a realizar las modificaciones que me sugeriste. Gracias por tu tiempo!