Yo lo entiendo asi:
- los datos forman grupos.
- cada grupo se compone de un dato cabecera y tres datos cuerpo
- un grupo debe considerarse valido si ningun dato esta informado o si tiene informados el dato cabecera y uno (solo uno) de los datos cuerpo.
Asi que tenemos N grupos (N indefinido), numerados de 1 a N. Los datos que componen cada grupo se nombran cabeceraX, cuerpoX1, cuerpoX2, cuerpoX3, con X en el intervalo 1..N
Suponemos "pesos" a cada dato del grupo, el dato cabecera pesa 10, cada dato cuerpo pesa 1.
Para validar un grupo, lo "pesamos". Si un dato esta informado su peso cuenta, en caso contrario suma 0 al peso del grupo.
Asi un grupo será válido si pesa 0 (vacio) u 11 (cabecera + cuerpo).
El formulario sera válido si lo son todos sus grupos.
==================
No sabes a priori cuantos grupos tienes, asi que lo suyo es hacer un bucle, que itera mientras encuentra grupos. Podemos suponer que existe grupo, si existe el dato cabecera.
Para obtener el campo de cada dato puedes emplear "campos = document.getElementsByName(nombreCampo)". Si campos[0] esta definido es que existe.
El codigo queda como:
Código:
function formularioValido() {
for(var x=1; ; x++) { // bucle indefinido
var nombreCabecera = "cabecera" + x;
var campoCabecera = document.getElementsByName(nombreCabecera);
if (campoCabecera[0]) { // existe grupo X
if (!grupoValido(x)) { // comprobar su validez
return false; // si un grupo no es valido, no es valido el formulario
}
} else {
break; // grupo X no existe, finalizar el bucle
}
}
return true; // todos los grupos resultaron ser validos, el formulario es valido
}
function grupoValido(xGrupo) {
var pesoDatos = 0;
var nombreCabecera = "cabecera" + xGrupo;
var campoCabecera = document.getElementsByName(nombreCabecera);
if (datoInformado(campoCabecera[0])) pesoDatos +=10;
for(var idx=1; idx<=3; idx++) {
var nombreCuerpo = "cuerpo" + xGrupo + idx;
alert("Chequeando " + nombreCuerpo);
var campoCuerpo = document.getElementsByName(nombreCuerpo);
if (datoInformado(campoCuerpo[0])) pesoDatos +=1;
}
return ((pesoDatos==0) || (pesoDatos==11));
}
function datoInformado(campo) {
if (campo.value) {
return true;
}
return false;
}