codice:
<form method="post" action="invia_dati.php" name="form_b" id="form_b" enctype="multipart/form-data" onsubmit="return validateForm_prev()">
..............
<input name="Submit" id="Submit" tabindex="5" value="Invia dati" type="submit"/>
</form>
Il controllo si fa sull'evento onsubmit del form, fatto sull'onclick del pulsante submit (che non puo' avere name="submit" ) fa vedere gli eventuali alert ma non impedisce l'invio del form.

codice:
function validateForm_prev(){
	formObj = document.form_b;
	if (formObj.nome.value == "") {
		alert("Non hai inserito il tuo Nome!");
		return false;
	}

	if (formObj.cod.value == "") {
		alert("Non hai inserito il tuo Codice Fiscale o Partita IVA ");
		return false;
	}

	if (formObj.email.value == "") {
		alert("Non hai inserito il tuo indirizzo email!");
		return false;
	}

	if (!formObj.autorizzo.checked) {
		alert("Per continuare accettare il trattamento dei dati personali!");
		return false;
	}

	wcod = document.form_b.cod.value;
	if( wcod == '' ) {
		err = "hai lasciato in bianco il campo!\n"
	} else {
		if( wcod.length == 16 ) 
			err = ControllaCF(wcod);
		else if( wcod.length == 11 ) 
			err = ControllaPIVA(wcod);
		else
			err = "la lunghezza del codice e' errata!\n";
	}
	if( err > '' ) {
		alert(err);
		document.form_b.cod.focus();
		return false;
	} 
}
L'use degli else if l'ho eliminato perche' (a me ) rende poco chiaro il flusso delle istruzioni... se sei convinto ripristinalo
Non puoi usare i nomi delle variabili uguali ai nomi dei campi del form... il javascript (soppratutto in IE) impazzisce a cercare di capire di quale oggetto nella pagina tu stai parlando.
L'ultima parte della funzione e' cambiata... studiala per capirne il motivo, e' solo una delle possibili soluzioni, ovviamente.

codice:
function ControllaCF(cf) {
	var validi, i, s, set1, set2, setpari, setdisp;
	if( cf == '' ) return '';
	cf = cf.toUpperCase();
	if( cf.length != 16 )
		return "La lunghezza del codice fiscale non è\n"
		+"corretta: il codice fiscale dovrebbe essere lungo\n"
		+"esattamente 16 caratteri.\n";
	validi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	for( i = 0; i < 16; i++ ) {
		if( validi.indexOf( cf.charAt(i) ) == -1 )
			return "Il codice fiscale contiene un carattere non valido `" +
			cf.charAt(i) +
			"'.\nI caratteri validi sono le lettere e le cifre.\n";
	}
	set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
	setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
	s = 0;
	for( i = 1; i <= 13; i += 2 ) 
		s += setpari.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	for( i = 0; i <= 14; i += 2 )
		s += setdisp.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	if( s%26 != cf.charCodeAt(15)-'A'.charCodeAt(0) )
		return "Controlla il campo del codice fiscale:\n"+
		"il codice di controllo non corrisponde.\n";
	return "";
}


function ControllaPIVA(pi) {
	if( pi == '' ) return '';
	if( pi.length != 11 )
		return "La lunghezza della partita IVA non è\n" +
		"corretta: la partita IVA dovrebbe essere lunga\n" +
		"esattamente 11 caratteri.\n";
	validi = "0123456789";
	for( i = 0; i < 11; i++ ){
		if( validi.indexOf( pi.charAt(i) ) == -1 )
			return "La partita IVA contiene un carattere non valido `" +
			pi.charAt(i) + "'.\nI caratteri validi sono le cifre.\n";
	}
	s = 0;
	for( i = 0; i <= 9; i += 2 )
		s += pi.charCodeAt(i) - '0'.charCodeAt(0);
	for( i = 1; i <= 9; i += 2 ){
		c = 2*( pi.charCodeAt(i) - '0'.charCodeAt(0) );
		if( c > 9 ) c = c - 9;
		s += c;
	}
	if( ( 10 - s%10 )%10 != pi.charCodeAt(10) - '0'.charCodeAt(0) )
		return "Controlla il campo della partita IVA:\n" +
		"il codice di controllo non corrisponde.\n";
	return '';
}
Nulla da dire sulle ultime due funzioni, le ho solo indentate per leggibilita'.

ciao