Io purtroppo non me ne intendo molto di Ajax però quando l'ho usato all'inizio non mi andava perchè c'erano problemi di tempi nella risposta, di chiamate sincrone e asincrone. Se vuoi ti posto il codice che uso io per inviare dati in POST con ajax così puoi confrontarlo, poi qualcun'altro più competente ti potrà dire dove sbagli e spiegarti meglio come funziona.

Ecco il codice del file js che includo io:
codice:
var ajax = assegnaXMLHttpRequest();

//
// funzione per assegnare l'oggetto XMLHttpRequest compatibile con i browsers più recenti e diffusi
//
function assegnaXMLHttpRequest() {

	// lista delle variabili locali
	var
		// variabile di ritorno, nulla di default
		XHR = null,
 
		// informazioni sul nome del browser
		browserUtente = navigator.userAgent.toUpperCase();


	// browser standard con supporto nativo
	// non importa il tipo di browser
	if(typeof(XMLHttpRequest) === "function" || typeof(XMLHttpRequest) === "object")
		XHR = new XMLHttpRequest();

	// browser Internet Explorer
	// è necessario filtrare la versione 4
	else if(window.ActiveXObject && browserUtente.indexOf("MSIE 4") < 0	) {
	
		// la versione 6 di IE ha un nome differente
		// per il tipo di oggetto ActiveX
		if(browserUtente.indexOf("MSIE 5") < 0)
			XHR = new ActiveXObject("Msxml2.XMLHTTP");

		// le versioni 5 e 5.5 invece sfruttano lo stesso nome
		else
		XHR = new ActiveXObject("Microsoft.XMLHTTP");
	}

	return XHR;
}

//
// funzione per inviare dati col metodo post ad un'altra pagina
//
function inviaPOST(pagina, dati, callback) {
	if (ajax) {
		// inizializzo la richiesta in post
		ajax.open("post", pagina, true);
		
		// imposto il giusto header
		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
		ajax.setRequestHeader("connection", "close")
		
		// effettuo la richiesta inviando i dati formati da coppie chiave-valore
		// dati = escape(dati);
		ajax.send(dati);
		
		ajax.onreadystatechange = function() {
			if(ajax.readyState === 4)			
				if(ajax.status == 200) 
					return callback(ajax.responseText);
				else{
					//alert("Operazione fallita, errore numero " + ajax.status);
					return null;
				}
		}
	}
}
per inviare i dati e ottenere la risposta assegni a un evento di un oggetto nella pagina con il form:
codice:
inviaPOST('pagina_che_esegue_il_controllo.php', 'variabile_a=valore_a', function(risposta){
	// se l'invio ha funzionato
	if (risposta) {
		// qui scrivi il codice che controlla la risposta
	}
	else // se l'invio non ha funzionato	
		return true;
});