I would do something like this:
function refreshCascadingLists($tr) {
var all_filled = true;
$tr.find(':input').each(function() {
if($(this).is('input[type=radio], input[type=checkbox]')) {
if(!$(this).is(':checked')) {
all_filled = false;
}
} else if($(this).val() == '') {
all_filled = false;
}
});
var $next_tr = $tr.next('tr');
if(all_filled) {
if(!$next_tr.is(':visible')) {
$next_tr.fadeIn(function() {
refreshCascadingLists($(this));
});
}
} else {
$tr.nextAll('tr').hide();
}
}
$(document).ready(function() {
$(":input").bind('keyup change', function() {
refreshCascadingLists($(this).closest('tr'));
});
});
Most of the function could actually be golfed down quite a bit, but I wrote it like that so you can easily see what it is doing.