The Ahah Forms module is a utility framework for adding Ajax/javascript driven incremental page reloading to forms, without actually needing to write javascript.
It uses the FormAPI and a new property, #ahah_binding, to generate the javascript & jQuery bindings for you.

Ahah vs Ajax:
AHAH (Asynchronous HTTP And HTML) not AJAX (Asynchronous Javascript And XML), because there is no XML involved. 

How to use the #ahah_binding property: 
There are two places to use this property.

#1) Attached to an existing form element. ex:
	$subform['new_choice']['add_choice_button'] = array (
	    '#type' => 'button',
	    '#value' => t( 'Add New Choice' ),
	    '#id' => 'poll_add_choice_button', 
	    '#ahah_bindings' => array ( 
    		array( 
		    	'wrapper' => 'poll_choices_wrapper',
	 			'event' => 'click',
	  			'path' => 'poll/poll_update_js',
  			),
  		),
	);

#2) Attached to a wrapper, to bind to a dynamic set of elements, which do not exist when the page is first rendered. ex:
	// establish the choices wrapper
  	$form['choices'] = array (
  		'#type' => 'fieldset',
  		'#title' => 'Choices',
	    '#prefix' => '<div id="poll_choices_wrapper">',
	    '#suffix' => '</div>',
	    '#ahah_bindings' => array( 
	    	array (
	    		'class' => 'input.poll_choice_remove',
	    		'event' => 'click',
	    		'wrapper' => 'poll_choices_wrapper',
	  			'path' => 'poll/poll_update_js',
	    	),
	    	array (
	    		'class' => 'select.poll_choice_weight',
	    		'event' => 'change',
	    		'wrapper' => 'poll_choices_wrapper',
	  			'path' => 'poll/poll_update_js',
	    	),
	    ),	    	
	);

In both cases most of the sub-parameters are the same:
	'event' - javascript event - click and change are the only two currently supported
	'wrapper' - the area that will be replaced when the event occurs. It is currently assumed that the element is inside this wrapper.
	'path' - the Drupal system path to call to get the updated html to put into the wrapper
	'class' (optional) - the class of form elements to bind to.  If this is missing, the element's id is used.
	'params' (optional) - an array of parameters to pass back to the path.
	
Limitations: 
	Currently only works with Clean URL's enabled
	