//registro del ultimo familiar para evitar que con los movimientos de familiares 
//se acoplen los nombres de los input.
var familiares=0;

//traída desde el framework de validación
function event_validar(json){
	var ok=true;
	//buscamos todos los nodos del arbol que tengan validación y ejecutamos la validación
	if(json['validacion']){
		//ejecutamos la validación para ese campo
		var validacion="parser_"+json['validacion']+"($(':input[name=\""+json['nombre']+"\"]'));";
		//alert(validacion);
		//hacer if contra arreglo global.
		var match= new RegExp(json['nombre']);

		//primero capturamos el selector
		if(!match.test(datos_sistema['campo_oculto'].join())){
			ok = eval(validacion);
		}
	}else if (json['templates']){
		//recorremos los templates y pedimos la validación de cada uno
		for(var i in json['templates']){
			ok = event_validar(json.templates[i]) && ok;
		}
	}
	//retornamos el ok, si no hay nada que validar se retorna true.
	return ok;
}

function parser_js_json(json){
	//alert("voy a parsear_js: "+json.template);
	//_error("voy a parsear_js: "+json.template);
	//si hay un validador para el template lo usamos
	var aux="if(typeof parser_js_"+json.template+" == 'function'){ parser_js_"+json.template+"(json); }else{ recurse_parser_js(json); };";
	eval(aux);
	event_validar(json);
}

function recurse_parser_js (json){
	for (var id in json.templates) {
			 parser_js_json(json.templates[id]);
	}
}

function parser_js_formulario (json){
	//funciones del formulario.
	js_formulario();
	for (var id in json.pestanas){
		parser_js_json(json.pestanas[id]);
	}
	carga_familiares();
	//especial para la fila del postulante en la tabla de ingresos
	parser_tabla_ingresos($("#ingresos"));
	actualizar_ingresos_totales();
	//especial para la alerta de neonatos
	parser_tabla_familiares($("#familiares"));
	//activa los seleccionables
	parser_select();
	parser_ayuda();
	parser_nombre();
	parser_apellido_materno();
	parser_apellido_paterno();
	parser_edad();
	parser_dominio();
	parser_eliminar();

}

function parser_js_cleditor(json){
	//ahora cargamos los datos del archivo si este existe.
	if(typeof json.archivo == 'string'){
		$.get(json.archivo,function(data){
				$("#"+json.nombre).val(data);
				$('#'+json.nombre).cleditor()[0].focus();
				});
	}else{
		$('#'+json.nombre).cleditor()[0].focus();
	}
}
	

function parser_js_formulario_acreditacion (json){
	parser_js_formulario(json);
}


function parser_js_form_registro (json){
	parser_select();
	recurse_parser_js(json);
}

function parser_js_select_lineal (json){
	parser_js_select(json);
}

function parser_js_select_cod_area (json){
	parser_js_select(json);
}

function parser_js_bloquetabla (json){
	recurse_parser_js(json);
}

function parser_js_tabla_ingresos (json){
	$(".hoverIngreso").hover(
		function(){
			var t = $(this);
			var tp = t.position();
			var to = t.offset();
			var prev = t.parent();
			var prevo = prev.offset();
			var arriba = prevo.top+prev.height();
			var izquierda = prevo.left;
			var desplegable=$(".infoingresos");
			desplegable.hide();
			//Condicion rara cuando no encuentra el t.text()
			_error('condición de text: '+t.text());
			var html=ayuda_tabla_ingresos[t.text()];
			desplegable.html(html);
			desplegable.css("top",arriba);
			desplegable.css("left",izquierda);
			desplegable.css("z-index",1000);
			desplegable.show();
		},
		function(){
			//_error("salgo");
			var desplegable=$(".infoingresos");
			desplegable.hide();
		}
	);
}

function parser_eliminar(){
	$(".eliminar").die("click",eliminar_eliminar);
	//$(".eliminar").die();
	//eliminar_eliminar para poder hacer el die nombrado
	//TODO implementar namespaces o probar otra cosa
	$(".eliminar").live("click",eliminar_eliminar);
}

function eliminar_eliminar(){
	//recogemos el ID
	var id=$(this).attr("id");
	//eliminamos el parent.
	$(this).parent().parent().remove();
	//ahora eliminamos de los ingresos.
	$(".tr_"+id).remove();
	//y por ultimo bajamos los valores del select.
	//obtenemos el valor de los familiares.
	var fam=$(":input",$(".seleccione_familiar").parent()).val();
	$(":input",$(".seleccione_familiar").parent()).val(fam-1);
	$("span",$(".seleccione_familiar").parent()).html(fam-1);
}

function parser_not_null(){
	$(".not_null").blur(function(){
		marcador_not_null($(this));
	});
}

function parser_smallint(){
	$(".smallint").blur(function(){
		marcador_smallint($(this));
	});
}

function parser_nombre_vacio(){
	$(".nombre_vacio").blur(function(){
		marcador_nombre_vacio($(this));
	});

	//validación de dobleespacio
	$(".nombre_vacio").keyup(function (e) {
		//32 es el código del espacio
		if (e.which == 32){ trim_dblsp($(this)); }
	});
}

function parser_sysname(){
	$(".sysname").blur(function(){
		marcador_sysname($(this));
	});
}

function parser_sysname_null(){
	$(".sysname").blur(function(){
		marcador_sysname_null($(this));
	});
}

function parser_nombre(){
	$(".nombre").blur(function(){
		marcador_nombre($(this));
	});

	//validación de dobleespacio
	$(".nombre").keyup(function (e) {
		//32 es el código del espacio
		//el replace pone el cursor al final del texto en IE6 de VM (en el mío no).
		//thisval = thisval.replace(/  +/g," ");
		if (e.which == 32){ trim_dblsp($(this)); }
	});
}

function parser_apellido_paterno(){
	$(".apellido_paterno").blur(function(){
		marcador_apellido_paterno($(this));
	});

	$(".apellido_paterno").keyup(function (e) {
		//32 es el código del espacio
		if (e.which == 32){ trim_dblsp($(this)); }
	});
}

function parser_apellido_materno(){
	$(".apellido_materno").blur(function(){
		marcador_apellido_materno($(this));
	});

	$(".apellido_materno").keyup(function (e) {
		//32 es el código del espacio
		if (e.which == 32){ trim_dblsp($(this)); }
	});
}

function parser_direccion(){
	$(".direccion").blur(function(){
		marcador_direccion($(this));
	});

	//validación de dobleespacio
	$(".direccion").keyup(function (e) {
		//32 es el código del espacio
		if (e.which == 32){ trim_dblsp($(this)); }
	});
}

function parser_departamento(){
	$(".departamento").blur(function(){
		marcador_departamento($(this));
	});

	//validación de dobleespacio
	$(".departamento").keyup(function (e) {
		//32 es el código del espacio
		if (e.which == 32){ trim_dblsp($(this)); }
	});
}

function parser_poblacion(){
	$(".poblacion").blur(function(){
		marcador_poblacion($(this));
	});

	//validación de dobleespacio
	$(".poblacion").keyup(function (e) {
		//32 es el código del espacio
		if (e.which == 32){ trim_dblsp($(this)); }
	});
}

function parser_edad(){
	$(".edad").blur(function(){
		marcador_edad($(this));
		});
}

function parser_ingreso(){
	$(".ingreso").blur(function(){
		marcador_ingreso($(this));
		});
}

function parser_ingreso_total(){
	$(".ingreso_total").blur(function(){
		marcador_ingreso_total($(this));
		});
}

function parser_id_comprobante(){
	$(".id_comprobante").blur(function(){
		marcador_id_comprobante($(this));
		});
}

function parser_cantidad_familiares(){
	$(".cantidad_familiares").blur(function(){
		marcador_cantidad_familiares($(this));
		});
}

function parser_cuenta_ahorro(){
	$(".cuenta_ahorro").blur(function(){
		marcador_radio($(this));
		});
}

function parser_radio(){
	$(".radio").click(function(){
		marcador_radio($(this));
		});
}

function parser_telefonos(){
	if(contador_alan == 0){
	//_error("parser_telefonos"+contador_alan);
	contador_alan++;
	$(".telefonos").blur(function(){
		//metadata, campos: ['cod_area','telefono','telefono_celular']
		//marcador_telefonos($(this));
		marcador_telefonos($("#telefono"));
	});
	}
}

function parser_dominio(){
	$(".dominio").change(function(){
		marcador_dominio($(this));
	});
}

function parser_tabla_familiares(){ _error('PARSER_TABLA_FAMILIARES'); }

function parser_nota(){
	$(".nota").blur(function(){
		marcador_nota($(this));
	});
}

function parser_fecha(){
	$(".fecha").blur(function(){
		marcador_fecha($(this));
	});
}

//para los datepicker
function parser_fecha_dma(){
	$(".fecha_dma").change(function(){
		marcador_fecha_dma($(this));
	});
}

//para los timeentry
function parser_hora_hms(){
	$(".hora_hms").change(function(){
		marcador_hora_hms($(this));
	});
}

//para hora-fecha comprobante
function parser_fecha_hhmmssddmmaaaa(){
	$(".fecha_hhmmssddmmaaaa").change(function(){
		marcador_fecha_hhmmssddmmaaaa($(this));
	});
}

function parser_igual(){
	$(".igual").blur(function(){
		marcador_igual($(this));
	});
}

function parser_correo_igual(){
	$(".correo_igual").blur(function(){
		marcador_correo_igual($(this));
	});
}

function parser_rut_alumno(){
	$(".rut_alumno").blur(function(){
		//se asume que hay un solo input de rut_alumno y rut_alumno_dv
		marcador_rut_alumno($(this));
	});
	$(".rut_alumno_dv").blur(function(){
		marcador_rut_alumno($(".rut_alumno",$(this).parent()));
	});
}

function parser_rut_inscripcion(){
	//++contador_alan;
	//alert("contador_alan: "+contador_alan);
	$(".rut_inscripcion").change(function(){
		//se asume que hay un solo input de rut_alumno y rut_alumno_dv
		marcador_rut_inscripcion($(this));
	});
	$(".rut_inscripcion_dv").change(function(){
		marcador_rut_inscripcion($(".rut_inscripcion",$(this).parent()));
	});
}

function parser_rut_generico(){
	$(".rut_generico").blur(function(){
		//se asume que hay un solo input de rut_generico y rut_generico_dv
		marcador_rut_generico($(this));
	});
	$(".rut_generico_dv").blur(function(){
		marcador_rut_generico($(".rut_generico",$(this).parent()));
	});
}

function parser_rut_familiar(numero){
	$("input[name='familiares["+numero+"][rut_familiar]']").blur(function(){
		marcador_rut_familiar($("input[name='familiares["+numero+"][rut_familiar]']"));
	});
}
function parser_rut_familiar_dv(numero){
	$("input[name='familiares["+numero+"][rut_familiar_dv]']").blur(function(){
		marcador_rut_familiar($("input[name='familiares["+numero+"][rut_familiar]']"));
	});
}

function parser_edad_familiar(tr){
	$(".edad_familiar",tr).blur(function(){
		marcador_edad($(this));
	});
}

function parser_password(){
	$(".password").blur(function(){
		//FORM
		//$(this).parent().parent().toggleClass("error", ! valido );
		marcador_password($(this));
	});
	//$(".password").keypress(function (e){ if( e.which == 13){ $(".submit").click(); } });

}

//esta variante es para el administrador de usuarios.
//no debe obligar el cambio de password.
function parser_password_vacio(){
	$(".password_vacio").blur(function(){
		//FORM
		//$(this).parent().parent().toggleClass("error", ! valido );
		marcador_password_vacio($(this));
	});
	//$(".password").keypress(function (e){ if( e.which == 13){ $(".submit").click(); } });
}

function parser_correo_electronico(json){
	$(".usuario_correo").blur(function(){
		marcador_correo_electronico($(this));
	});
	$(".dominio_correo").blur(function(){
		marcador_correo_electronico($(this));
	});
}

function parser_nombre_familiar(tr){
	$(".nombre_familiar",tr).blur(function(){
		marcador_nombre($(this));
		actualizar_nombre_ingreso($(this));
	});
}
function parser_apellido_paterno_familiar(tr){
	$(".apellido_paterno_familiar",tr).blur(function(){
		marcador_nombre($(this));
		actualizar_nombre_ingreso($(this));
	});
}
function parser_apellido_materno_familiar(tr){
	$(".apellido_materno_familiar",tr).blur(function(){
		marcador_nombre($(this));
		actualizar_nombre_ingreso($(this));
	});
}

function parser_igual(json){
	$(".igual").blur(function(){
		marcador_igual($(this));
	});
}

function parser_select(){

	$(".seleccione, .seleccione_min, .seleccione_familiar").live("click",function(){
		var prev= $(this).parent();
		var seleccione=$(this);
		var metadata = seleccione.metadata();
		var input=$(":input", prev);
	        var nombre;
		var inicio, termino;
		if(typeof input.metadata().nombre_parametro == "string"){
	        	nombre=input.metadata().nombre_parametro;
		}else{
			nombre=input.attr("name");
		}
		var pos=prev.position();
		var offset=prev.offset();
		var tope_derecho = $(window).width();
		var campo='';
		var desplegable=$(".desplegable");
		var parametro_aux;
		var api = desplegable.data('jsp');
		//si encadenamos a un sub selector entonces gatillamos el evento change del input
		var metacadena=metadata['subcadena'];
		while(metacadena){
			//alert('me cambiaron');
			input2= $(":input[name='"+metacadena+"']");
			//alert(input2.val());
			input2.val('');
			prev2=input2.parent();
			seleccione2= $('.seleccione',prev2);
			bloque=$('.bloqueTexto',prev2);
			seleccione2.text('Seleccione');
			bloque.text('');
			metacadena=seleccione2.metadata()['subcadena'];
			if(typeof(metacadena)==undefined){ metacadena=false; }
		}
		if(metadata['subcadena_texto']){
			input3= $(":input[name='"+metadata['subcadena_texto']+"']");
			input3.val('');
			input3.change();
		}
		//ya tenemos el parámetro, ahora cargamos los datos.
		//lo primero es ocultar el desplegable.
		desplegable.hide();
		var html="<ul>";

		//soporte para null
		if(metadata['nulo']){
			//parametro_aux[]=metadata['nulo'];
			//parametro_aux['nulo']=metadata['nulo'];
			html+="<li id='nulo'> "+metadata['nulo']+"</li>\n";
		}

		//soporte para metadata
		if(metadata['parametro']){
			//alert('tengo parametro '+metadata.parametro);
			if(metadata['parametro']=='_seq'){//parametro especial que significa que se usara una secuencia en vez de un parametro
				if(!metadata['min']){//tenemos el minimo, de lo contrario usamos el del imput
					inicio=input.val()*1;
				}else{
					inicio=metadata['min'];
				}

				if(!metadata['max']){//ERROR siempre debe estar definido el maximo
					_alert("error de construccion, se intento hacer un select con secuencia sin maximo");
				}else{
					termino=metadata['max'];
				}
				parametro_aux = new Array();
				for (var i=inicio;i<=termino;i++){
					parametro_aux[i]=i;
				}
			}else if(metadata['cadena']){//hay q sacar los datos de otro campo
				campo=$(":input[name='"+metadata['cadena']+"']").val();
				parametro_aux=eval(metadata['parametro']+"['"+campo+"']");
			}else{
				parametro_aux=eval(metadata['parametro']);
			}
		}else if(metadata['except']){
			//no mostramos el campo indicado en este input
			//id del campo
			campo=$(":input[name='"+metadata['except']+"']").val();
			parametro_aux=parametro[nombre];
		}else{
			parametro_aux=parametro[nombre];
		}
		
		//li desplegable
		for (var id in parametro_aux){
			if(id != campo){
				html+="<li id='li_"+id+"'> "+parametro_aux[id]+"</li>\n";
			}
		}
		html+="</ul>\n";
		//para calcular la altura tomamos el offset del div le agregamos la altura 
		//del div y le restamos la altura del div con el valor del seleccionable
		var altura_div=prev.height(); // el valor es en "px" por eso el tratamiento especial
		var altura_div_info=$(".bloqueTexto", prev).height();
		var arriba=offset.top+altura_div-altura_div_info;;
		var izquierda=offset.left;

		var ancho_div=desplegable.width();
		if( (izquierda+ancho_div) > tope_derecho ){
			izquierda = izquierda - ancho_div + seleccione.width();
		}
		if( izquierda < 0 ){
			izquierda = offset.left;
		}

		//alert('voy a mostrar el desplegable en '+izquierda+', '+arriba);	
		desplegable.css("top",arriba);
		desplegable.css("left",izquierda);
		desplegable.css("z-index",10000);
		desplegable.show();
		api.getContentPane().html(html);
		api.reinitialise();
		//ahora obtenemos el texto
		$(".desplegable li").click(function(){
			//desplegable.jScrollPaneRemove();
			desplegable.hide();
			//obtenemos el ID del li.
			var aux=$(this).attr("id").split("_");
			var id=aux[1];
			var bloque= $(".bloqueTexto",prev);
			var nulo = ( $(this).attr("id")=='nulo' );
			//vemos en la metadata si hay que poner el texto o el id.
			if(nulo){
				seleccione.text(metadata['nulo']);
			}else if(metadata['show']=='text'){
				seleccione.text(parametro_aux[id]);
			}else if(metadata['show']=='full'){
				seleccione.text(id+". "+parametro_aux[id]);
			}else{ 
				seleccione.text(id);
			}
			//seteamos el valor del input
			if(nulo){
				input.val(metadata['nulo']);
			}else if(metadata['val']=='text'){
				input.val(parametro_aux[id]);
			}else if(metadata['val']=='full'){
				input.val(id+". "+parametro_aux[id]);
			}else{ 
				input.val(id);
			}
			//vemos en la metadata si hay que poner footer
			if(nulo){
				bloque.text("");
			}else if(metadata['footer']=='text'){
				bloque.text(parametro_aux[id]);
			}else if(metadata['footer']=='none'){
				bloque.text("");
			}else if(metadata['footer']=='id'){ 
				bloque.text(id);
			}else {
				bloque.text(id+". "+parametro_aux[id]);
			}
			//se revisa que información va en el input
			//asignar
			if(metadata['asignar']){
				//var inputval = nulo?
				var input_asignar=$(":input[name='"+metadata['asignar']+"']");
				input_asignar.val(seleccione.text());
				input_asignar.change();
			}
			//gatillo el chequeo del select
			marcador_dominio(input);
			
			//tweek para familiares... no debería molestar
			//ahora cambiamos el valor del td en la tabla de familiares.
			var name=input.attr("name");
			$("#familiar_"+name).html(id);

			//se ejecuta la funcion final si es que viene en la metadata...
			if(metadata['function_final']){
				var test_datos="probando funcion";
				eval(metadata['function_final']);
			}


		});
		//hover para explorer 6
		//OJO
		//TODO cambiar los colores cuando se cambien en el css
		$(".desplegable li").hover(
			function(){
				//$(this).addClass("hover_ie6");
				$(this).css({'background-color' : '#999999'});
			},
			function(){
				//$(this).removeClass("hover_ie6");
				$(this).css({'background-color' : '#F6F6F6'});
			}
		);
	}
	);

}


function parser_js_select(json){
	//primero tenemos q ver si el campo es oculto... usamos match para eso...
	var match= new RegExp(json['nombre']);

	if(!match.test(datos_sistema['campo_oculto'].join())){
		//primero capturamos el selector
		var nombre=json.nombre;
		var input=$("input[name='"+nombre+"']");
		//el numero
		var id = input.val();
		//var prev= $(this).parent();
		var prev= input.parent();
		var seleccione = $(".seleccione", prev);
		var metadata = seleccione.metadata();
		var bloque= $(".bloqueTexto",prev);
		var parametro_aux=parametro[nombre];
		var campo='';
	 
		if( seleccione.text() == 'Seleccione' || metadata['nulo'] ){
			return;
		}

		//lo primero es ocultar el desplegable.
		//??

		//sacamos los parametros
		if(metadata['parametro']){
			if(metadata['cadena']){//hay q sacar los datos de otro campo
				campo=$(":input[name='"+metadata['cadena']+"']").val();
				//_error("campo de: "+metadata['parametro']+"."+campo);
				parametro_aux=eval(metadata['parametro']+"['"+campo+"']");
			}else
				parametro_aux=eval(metadata['parametro']);
		}else{
			parametro_aux=parametro[nombre];
		}

		//cargamos el valor en el footer del seleccionable

		//vemos en la metadata lo que va en el footer
		if(metadata['footer']=='text'){
			bloque.html(parametro_aux[id]);
		}else if(metadata['footer']=='none'){
			bloque.html("");
		}else if(metadata['footer']=='id'){ 
			bloque.html(id);
		}else if(metadata['footer']=='full'){ 
			bloque.html(id+". "+parametro_aux[id]);
		}else {//default full
			bloque.html(id+". "+parametro_aux[id]);
		}
		//vemos en la metadata si hay que poner el texto o el id.
		if(metadata['show']=='text'){
			//alert('voy a poner el text');
			seleccione.text(parametro_aux[id]);
		}else if(metadata['show']=='none'){
			seleccione.text("");
		}else if(metadata['show']=='id'){
			seleccione.text(id);
		}else if(metadata['show']=='full'){
			seleccione.text(id+". "+parametro_aux[id]);
		}else{//default id
			seleccione.text(id);
		}
		//asignar
		if(metadata['asignar']){
			//_error("ASIGNAR js: "+metadata['asignar']);
			var input_asignar=$("input[name='"+metadata['asignar']+"']");
			input_asignar.val(seleccione.text());
			input_asignar.change();
		}
	}
}

function parser_ayuda(){
	$(".ayuda").click(function(){
		var prev= $(this).parent();
		var prev= prev.parent();
		var input=$(":input", prev);
	        var nombre=input.attr("name");
		var pos=prev.position();
		//var offset=prev.offset();
		var offset=$(this).offset();
		var desplegable=$(".ayudas");
		//ya tenemos el parámetro, ahora cargamos los datos.
		//lo primero es ocultar el desplegable.
		desplegable.hide();

		//el <p></p> para inyectar el texto de ayuda
		var p = $("p",desplegable);

		var html=ayuda[nombre];

		p.html(html);

		//para calcular la altura tomamos el offset del div
		//y le agregamos la altura de la ayuda
		var altura_div=desplegable.height();
		var arriba=offset.top-altura_div;
		var izquierda=offset.left;
		desplegable.css("top",arriba);
		desplegable.css("left",izquierda);

		desplegable.show("slow");
	}
	);
}

function parser_select_familiar(id){
	//ahora agregamos los familiares que faltan
	//var faltan puede no tener el valor correcto si se eliminaron familiares con el seleccionable abierto
	//se resta el tr de header.
	var fam_act=$('tr',$("#familiares")).length-1;
	//se agrega el postulante, que no tiene vínculo eliminar
	//var fam_eli=$(".eliminar.vinculo").length+1;
	//alert(' a:'+fam_act+' e:'+fam_eli);
	var agregar=id-fam_act;
	for (var i=0;i<agregar;i++){
		//_error('parser_select_familiar: familiares:'+familiares);
		agrega_familiar(familiares);
		var context_ingreso=agrega_ingreso_familiar(familiares);
		//cargamos los eventos de las nuevas filas
		//no funca si pido los tr...
		var my_context = $("."+context_ingreso.attr("class"),context_ingreso.parent());
		parser_tabla_ingresos(my_context);
		parser_tabla_familiares($("#familiares"));
		familiares++;
	}
}


//eventos específicos del formulario
function js_formulario(){
	$(".tabMain:first").show();
	//nos aseguramos que el primero esté marcado.

	$("a.tab").click(function(){
			$("a.tab2").removeClass("tab2").addClass("tab");
			$(this).removeClass("tab");
			$(this).addClass("tab2");
			//$(".desplegable").jScrollPaneRemove();
			$(".desplegable").hide();
			$(".ayudas").hide();
			var splitter=$(this).attr("id").split("_");
			var id=splitter[1];
			$(".tabMain").hide("slow");
			$("#div_"+id).show("slow");
	});
	$("#pestana_1").removeClass("tab").addClass("tab2");
	//para generar la tabla de datos faltantes
	$("#pestana_4").click(function(){
			validador_datos_faltantes();
			marcador_tabla_familiares();
			$("a.tab2").removeClass("tab2").addClass("tab");
	});

}

function carga_familiares(){
	//tomamos los datos de usuario y recogemos los familiares.
	if(datos_usuario['familiares']){
		for (var i in datos_usuario.familiares){
			var familiar=datos_usuario.familiares[i];
			//_error('creando familiar: '+familiar.nombre_familiar);
			var context=agrega_familiar(i);//ingresa el template a la tabla familiares y retorna el tr
			var context_ingreso=agrega_ingreso_familiar(i);//ingresa el template a la tabla familiares y retorna el tr
			for(var j in familiar){
				//alert(j+": "+familiar[j]);
				$("."+j, context).val(familiar[j]);
			}
			var nombre=familiar.nombre_familiar+' '+familiar.apellido_paterno_familiar+' '+familiar.apellido_materno_familiar;
			$("td[rowspan='2']",context_ingreso).html(nombre);
			//ahora ingresamos los ingresos...
			for (var j in familiar.ingresos){
				var total=0;
				for(var h in familiar.ingresos[j]){
					//_error("voy a cargar el familiar: input[name=\"familiares["+i+"][ingresos]["+j+"]["+h+"]\"] con:"+familiar.ingresos[j][h]);
					$("input[name=\"familiares["+i+"][ingresos]["+j+"]["+h+"]\"]").val(familiar.ingresos[j][h]);
					//calculamos el total.
					//forzamos base 10 por si vienen 0's al principio
					total+= parseInt(familiar.ingresos[j][h],10);
				}
				$("#total_"+i+"_"+j).html(total);
				//alert(total);
			}
			//cargamos los eventos de las nuevas filas
			//no funca si pido los tr...
			var my_context = $("."+context_ingreso.attr("class"),context_ingreso.parent());
			parser_tabla_ingresos(my_context);
			parser_tabla_familiares($("#familiares"));

			//ahora asignamos los valores existentes a los select_min.
			$(".caja_selecciona_min",context).each(function(){
					//buscamos el input y sacamos el valor.
					var input=$(":input",$(this));
					var val=input.val();
					//ahora buscamos el span y lo asignamos
					$("span",$(this)).html((val!='')?val:"Sel");
			});
		}
		//ahora asignamos el numero de familiares al select.
		familiares=datos_usuario.familiares.length;
	}else{
		familiares=0;
	}
	//_error('familiares: '+familiares);
	//actualizamos el seleccionable
	$(":input",$(".seleccione_familiar").parent()).val(familiares+1);
	$("span",$(".seleccione_familiar").parent()).html(familiares+1);
}

function agrega_familiar(id){
	var tr=$("<tr></tr>");
	var html='<td>\n\
<span><input name="familiares['+id+'][nombre_familiar]" class="nombre_familiar {titulo: \'Nombres\'}" size="10" maxlength="200" type="text"/></span>\n\
 </td>\n\
 <td>\n\
<span><input name="familiares['+id+'][apellido_paterno_familiar]" class="apellido_paterno_familiar {titulo: \'Apellido paterno\'}" size="10" maxlength="200" type="text"/></span>\n\
</td>\n\
 <td>\n\
<span><input name="familiares['+id+'][apellido_materno_familiar]" class="apellido_materno_familiar {titulo: \'Apellido materno\'}" size="10" maxlength="200" type="text"/></span>\n\
</td>\n\
 <td>\n\
<span><input name="familiares['+id+'][rut_familiar]" class="rut_familiar {titulo: \'RUT\'}" size="10" maxlength="10" type="text"/> - <input name="familiares['+id+'][rut_familiar_dv]" class="rut_familiar_dv {titulo: \'DV\'}" size="1" maxlength="1" type="text"/></span>\n\
</td>\n\
 <td>\n\
<span><input name="familiares['+id+'][edad_familiar]" class="edad_familiar {titulo: \'Edad\'}" size="2" type="text"/></span>\n\
</td>\n\
 <td>\n\
 <div class="caja_selecciona_min">\n\
 <span class="seleccione_min">\n\
Sel</span>\n\
 <input type="hidden" name="familiares['+id+'][estadocivil]" class="estadocivil {nombre_parametro: \'estadocivil\', titulo: \'Estado Civil\'}"/>\n\
 </div>\n\
 </td>\n\
 <td>\n\
 <div class="caja_selecciona_min">\n\
 <span class="seleccione_min">\n\
Sel</span>\n\
 <input type="hidden" name="familiares['+id+'][parentesco]" class="parentesco {nombre_parametro: \'parentesco\' ,titulo: \'Parentesco\'}"/>\n\
 </div>\n\
 </td>\n\
 <td>\n\
 <div class="caja_selecciona_min">\n\
 <span class="seleccione_min">\n\
Sel</span>\n\
 <input type="hidden" name="familiares['+id+'][previsionsocial]" class=" previsionsocial {nombre_parametro: \'previsionsocial\', titulo: \'Previsión social\'}"/>\n\
 </div>\n\
 </td>\n\
 <td>\n\
 <div class="caja_selecciona_min">\n\
 <span class="seleccione_min">\n\
Sel</span>\n\
 <input type="hidden" name="familiares['+id+'][previsionsalud]" class="previsionsalud {nombre_parametro: \'previsionsalud\', titulo: \'Previsión salud\'}"/>\n\
 </div>\n\
 </td>\n\
 <td>\n\
 <div class="caja_selecciona_min">\n\
 <span class="seleccione_min">\n\
Sel</span>\n\
 <input type="hidden" name="familiares['+id+'][actividad]" class="actividad {nombre_parametro: \'actividad\', titulo: \'Actividad\'}"/>\n\
 </div>\n\
 </td>\n\
 <td>\n\
 <div class="caja_selecciona_min">\n\
 <span class="seleccione_min">\n\
Sel</span>\n\
 <input type="hidden" name="familiares['+id+'][estudios]" class="estudios {nombre_parametro: \'estudios\', titulo: \'Nivel de estudios\'}"/>\n\
 </div>\n\
 </td>\n\
 <td>\n\
<span id="'+id+'"class="eliminar vinculo">\n\
eliminar</span>\n\
</td>\n\
\n\
';
	tr.html(html);

	//_error(html);
	tr.appendTo($("#familiares"));
	/*
	 * carga los blur aca
	 * pero no soporta contexto
	 * lo que sobrecargaria el blur de los otros campos
	 */
	parser_nombre_familiar(tr);
	parser_apellido_paterno_familiar(tr);
	parser_apellido_materno_familiar(tr);
	parser_rut_familiar(id);
	parser_rut_familiar_dv(id);
	parser_edad_familiar(tr);
	//agregamos el evento para validacion
	$(".caja_selecciona_min :input",tr).blur(function(){
		marcador_dominio($(this));
	});

	return tr;
}

function agrega_ingreso_familiar(id){
	var html='<td rowspan="2" class="columna_nombre_ingresos_familiares"></td>\n';
 	//se cargan los datos de los ingresos.
	var class_agno="ingreso_anterior";
	var class_ingreso="";
	var class_celda_agno="celda_agnos fondo_ingresoAnterior";
	var agno=parametro['anio_anterior'];
	var total=0;
	var retorno;
	for(var i=0;i<2;i++){
		var tr=$("<tr class='tr_"+id+"'></tr>");
		html+='<td class="'+class_celda_agno+'"><span class="'+class_agno+'">'+agno+'</span></td>\n';
		//TODO recordar hacer variable los años...
		for(var j=0;j<8;j++){
			html+='<td '+class_ingreso+'><input type="text" name="familiares['+id+'][ingresos]['+i+']['+j+']" size="9" maxlength="9" value="0" class="{titulo: \'Ingreso de familiar\'}" /></td>\n';
		}
		html+='<td class="el_total"><span id="total_'+id+'_'+i+'">'+total+'</span></td>\n';
		tr.html(html);
		tr.appendTo("#ingresos");
		html='';
		agno=parametro['anio_actual'];
		total=0;
		class_agno="ingreso_actual";
		class_ingreso='class="fondo_ingresoActual"';
		class_celda_agno="celda_agnos fondo_ingresoActual";
		if(i==0){ retorno=tr;}
	}
	return retorno;
}

function parser_tabla_ingresos(context){
	//cargamos los eventos
	$(":input",context).focus(helper_focus_tabla_ingresos);
	$(":input",context).blur(helper_blur_tabla_ingresos);
	//aprovechamos de formatear
	$(":input",context).each(function(){
			clean_format_input($(this));
	});
	actualizar_ingresos_totales();
}

function parser_tabla_familiares(context){
	//cargamos los eventos
	$(":input",context).focus(helper_focus_tabla_familiares);
	//no se necesita por el momento
	//$(":input",context).blur(helper_blur_tabla_familiares);
}

function parser_checkbox(){
	marcador_checkbox($(this));
}

function helper_focus_tabla_ingresos(){
	//OJO con esto
	var input = $(this);
	if( typeof(primer_input_ingresos) != undefined ){
		if( primer_input_ingresos ){
			jQuery.facebox('<div class="alertas"><H1>Recuerda:</H1><p>Lo que debes declarar es el PROMEDIO MENSUAL  de los ingresos obtenidos durante el año (es decir, dividir el ingreso anual por 12 en '+parametro['anio_anterior']+' y por 10 en '+parametro['anio_actual']+')</p><img src="images/volver.jpg" alt="volver" class="close" /></div>');
			primer_input_ingresos = false;
		}
	}
	focus_input_tabla_ingresos(input);
	input.select();
}

function helper_focus_tabla_familiares(){
	//OJO con esto
	var input = $(this);
	if( typeof(primer_input_familiares) != undefined ){
		if( primer_input_familiares ){
			jQuery.facebox('<div class="alertas"><H1>Recuerda:</H1><p>Si tienes un familiar menor de un año, lo debes declarar con edad cero (0).</p><img src="images/volver.jpg" alt="volver" class="close" /></div>');
			primer_input_familiares = false;
		}
	}
	//focus_input_tabla_familiares(input);
	input.select();
}

function helper_blur_tabla_ingresos(){
	//OJO con esto
	var input = $(this);
	if(marcador_ingreso(input)){
		clean_format_input(input);
		actualizar_total_fila(input);
		actualizar_ingresos_totales();
	}
}

function focus_input_tabla_ingresos(input){
	//tomar el valor
	var valor = input.val();
	//pasarlo a int
	valor = clean_ingreso(valor);
	//actualizar el input
	input.val(valor);
}

function clean_format_input(input){
	//se asume que está validado
	var tmp = clean_ingreso(input.val());
	input.val(format_ingreso(tmp));
}

function actualizar_nombre_ingreso(input){
	//contexto
	var my_context = input.parent().parent().parent();
	//le saco el name
	var name = input.attr("name");
	//le saco el id
	var filter=/^familiares\[(\d+)\]\[(.*)\]$/;
	var my_id = filter.exec(name)[1];
	var nombre_1 = $(".nombre_familiar",my_context).val();
	var nombre_2 = $(".apellido_paterno_familiar",my_context).val();
	var nombre_3 = $(".apellido_materno_familiar",my_context).val();
	var nombre = nombre_1+' '+nombre_2+' '+nombre_3 ;

	//actualizamos en la tabla de ingresos
	$("#ingresos .tr_"+my_id+" .columna_nombre_ingresos_familiares").html(nombre);

}

function actualizar_total_fila(input){
	//actualizo el total
	var total = 0;
	var tr = input.parent().parent();
	$(":input",tr).each(function(i){
			//_error("campo: "+i+" val: "+$(this).val());
			var tmp = $(this).val().replace(/[^\d]/g,"");
			//forzamos base 10 por si vienen 0's al principio
			total+=parseInt(tmp,10);
	});
	//formatear total
	total = format_ingreso(total);
	$(".el_total span",tr).html(total);
	return total;
}

function actualizar_ingresos_totales(){
	var minimo_anual = 20000;
	var tabla_ingresos = $("#ingresos");
	//aprovechamos de formatear los totales
	var tmp = "";
	$(".el_total span",tabla_ingresos).each(function(){
			tmp = clean_ingreso($(this).html());
			$(this).html(format_ingreso(tmp));
	});
	
	var total = [0,0];
	var year = [parametro['anio_anterior'],parametro['anio_actual']];
	var id = "";
	$(".el_total span",tabla_ingresos).each(function(){
			id = $(this).attr("id");
			//ej: total_2_0
			id = id.split('_')[2];
			total[id]+=clean_ingreso($(this).html());
	});
	//alert_tramo(total[1]);
	$(".total_ingreso_"+year[0]+"_0").html(format_ingreso(total[0]));
	$(".total_ingreso_"+year[1]+"_1").html(format_ingreso(total[1]));
	//validamos que sean mayores que 0.
	$(".total_ingreso_"+year[0]+"_0").parent().toggleClass("error", total[0] < minimo_anual );
	$(".total_ingreso_"+year[1]+"_1").parent().toggleClass("error", total[1] < minimo_anual );
}

function alert_tramo(ingreso){
	var familiares;
	if(typeof $(':input[name="nro_familiares"]').val() == 'undefined'){//vemos si existe en datos_usuario
		if(typeof datos_envio["nro_familiares"] == 'undefined'){//no hay familiares retornamos sin alerta
			return false;
		}else{
			familiares=datos_envio["nro_familiares"];
		}
	}else{
		familiares=$(':input[name="nro_familiares"]').val();
	}

	tramo_formulario=tramo(familiares,ingreso);
	tramo_precarga=datos_usuario.precarga.tramo;
	//alert('el tramo calculado es '+tramo_formulario+ "\n\n tramo precarga "+tramo_precarga);
	if(tramo_precarga!=''){
		if(tramo_precarga>=3){
			//alert("vamos a analizar ya que el tramo precarga es mayor a 3");
			if(tramo_formulario<4 && tramo_precarga > tramo_formulario){
				return true;
			}
		}
	}
}

function tramo(familiares, ingreso){
	var ingreso_percapita=ingreso/familiares;
	for(var id in parametro['tramo']){
		if(ingreso_percapita <= parametro['tramo'][id]){
			return id;
		}
	}
	return 7;
}


