live_list = function(input, target, datasource, clickback) {
    var source = $(input);
    var output = $(target);
    var offset = 0;
    $('.next_results').hide();
    $('.prev_results').hide();

    var reload_target = function() {
	output.load(datasource, 
		    {search_so_far: source.val(),
		     offset: offset});
    };

    var check_live_search = function() {
	var new_value = source.val();
	
	if(source.old_value == undefined) {
	    source.old_value = '';
	}

	if(source.old_value != new_value) {
	    offset = 0;
	    reload_target();
	}
	source.old_value = new_value;
    };
    
    $('a.next_results', output).livequery('click', function() {
	$(this).unbind();
	offset +=5;
	reload_target();
    });

    $('a.prev_results', output).livequery('click', function() {
	if(offset>0) {
	    $(this).unbind();
	    offset -= 5;
	    reload_target();
	}
    });

    $('>table tr', output)
      .livequery('click', function() {
	  clickback($(this).attr('asin_or_id'));
	  return false;
      });

    var search_timeout = undefined;

    source
      .unbind()
      .keyup(function() {
	  if(search_timeout != undefined) {
	      clearTimeout(search_timeout);
	  }
	  var $this = this;
	  search_timeout = setTimeout(check_live_search, 500);
      })
      .trigger('keyup');
	
};

