Зачем же столько кода, если судя по вопросу нужно отправить любой выбор, то есть любой набор флажков с текстом или без, и наоборот.
$(function() {
$('div.who').on('input', 'input', function() {
var d = {};
$(this).parent().find('input').each(function() {
if(this.type=="text" && this.value.length >=2 || this.checked) d[this.name] = this.value
});
if(Object.keys(d).length) {
$.ajax({
type: 'post',
url: "search_ajax.php",
data: d,
...
})
}
});
});
Можно оставить одно событие input, оно будет возникать и у флажков (я говорил о двух для понимания процесса)