ho provato il tuo codice e sembra che il modo in cui fai i controlli faccia invertire il risultato booleano degli oggetti regular expression. Che roba strana... (per le tue variabili e/o oggetti è meglio se eviti di usare nomi riservati come "length")

Io ti consiglio di usare una funzione di supporto per controllare il formato di user e upassword1 visto che è lo stesso

codice:
function ControllaFormato(str) {
	var re, msg='';
	re = /[A-Z]/g;
	if (!re.test(str)) msg += 'inserire almeno una lettera maiuscola\n';
	re = /[a-z]/g;
	if (!re.test(str)) msg += 'inserire almeno una lettera minuscola\n';
	re = /^.{8,12}$/g;
	if (!re.test(str)) msg += 'la lunghezza deve essere tra 8 e 12 caratteri\n';
	re = /^(\D*\d\D*){1,3}$/g;
	if (!re.test(str)) msg += 'inserire da 1 a 3 caratteri numerici\n';
	return msg;
}
da usare nella tua funzione di controllo così
codice:
//controllo user
	var msg=ControllaFormato(document.register_form.user.value);
	if (document.register_form.user.value == "") {
		alert("Username Mancante - Campo obbligatorio!");
		return;
	}
	else if(msg!=""){
		alert(msg);
		return;
	}
	//controllo la password
	msg=ControllaFormato(document.register_form.upassword1.value);
	if (document.register_form.upassword1.value == "") {
		alert("Password Mancante - Campo obbligatorio!");
		return;
	}
	else if(msg!="") {
		alert(msg);
		return;
	}