Hola de nuevo:
Creo que con contadores es una manera complicada de hacerlo, ya que tenemos los checkbox ahí y solo tenemos que comprobar su propiedad checked. He variado el HTML para que sea un poco más correcto, y el script depende bastante de él, así que habría que amoldarlo a cada caso. De todas maneras esto es sólo un ejemplo de cómo se podría hacer:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<meta name="Author" content="derkeNuke" />
<title>Página nueva</title>
<style type="text/css">
</style>
</head>
<body>
<form>
<fieldset>
<legend><label> <input type="checkbox" onclick="cambiaGrupo(this)" />TODOS / NINGUNO</label></legend>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk1</label>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk2</label>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk3</label>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk4</label>
</fieldset>
<fieldset>
<legend><label> <input type="checkbox" onclick="cambiaGrupo(this)" />TODOS / NINGUNO</label></legend>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk1</label>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk2</label>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk3</label>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk4</label>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk5</label>
</fieldset>
<fieldset>
<legend><label> <input type="checkbox" onclick="cambiaGrupo(this)" />TODOS / NINGUNO</label></legend>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk1</label>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk2</label>
<label> <input type="checkbox" onclick="verSiEstanTodosChecked(this)" /> chk3</label>
</fieldset>
</form>
<script>
function cambiaGrupo(chk) {
var padreFIELDSET=chk;
while( padreFIELDSET.nodeType==1 && padreFIELDSET.tagName.toUpperCase()!="FIELDSET" )
padreFIELDSET=padreFIELDSET.parentNode;
// cogeremos todos sus checkboxes
var padreFIELDSETinputs=padreFIELDSET.getElementsByTagName("input");
for(var i=0; i<padreFIELDSETinputs.length; i++) {
if( padreFIELDSETinputs[i].getAttribute("type")=="checkbox" )
padreFIELDSETinputs[i].checked = chk.checked;
}
}
function verSiEstanTodosChecked(chk) {
var padreFIELDSET=chk;
while( padreFIELDSET.nodeType==1 && padreFIELDSET.tagName.toUpperCase()!="FIELDSET" )
padreFIELDSET=padreFIELDSET.parentNode;
var padreFIELDSEThijos=padreFIELDSET.childNodes;
for(var i=0, chk, todosChecked=true; i<padreFIELDSEThijos.length && todosChecked==true; i++) {
if( padreFIELDSEThijos[i].nodeType === 1 && // Tiene que ser un nodo tipo HTML, no texto
padreFIELDSEThijos[i].tagName.toUpperCase() != "LEGEND" && // No puede estar dentro de un LEGEND
padreFIELDSEThijos[i].hasChildNodes() && // Tiene que tener hijos (el checkbox)
(chk=padreFIELDSEThijos[i].getElementsByTagName("input")[0]) && // Seleccionamos al hijo input como chk
chk.getAttribute("type")=="checkbox" && // chk tiene que ser efectivamente un checkbox
chk.checked==false // y tiene que estar no seleccionado
) {
todosChecked = false;
}
}
// Si están todos checked tenemos que activar el primer checkbox hijo
// Si no están todos checked tenemos que desactivar el primer checkbox hijo
padreFIELDSET.getElementsByTagName("input")[0].checked = todosChecked
}
</script>
</body>
</html>
La condicional de dentro de
verSiEstanTodosChecked() es bastante compleja, se simplificaría bastante la función si asumimos que el checkbox para seleccionar todos los check va a estar el primero dentro del fieldset, podría quedar así:
Código PHP:
function verSiEstanTodosChecked(chk) {
var padreFIELDSET=chk;
while( padreFIELDSET.nodeType==1 && padreFIELDSET.tagName.toUpperCase()!="FIELDSET" )
padreFIELDSET=padreFIELDSET.parentNode;
var padreFIELDSETinputs=padreFIELDSET.getElementsByTagName("input");
for(var i=1, marcoElGeneral=true; i<padreFIELDSETinputs.length && marcoElGeneral==true; i++) { // empiezo de 1 para no mirar el primero
if( padreFIELDSETinputs[i].getAttribute("type")=="checkbox" &&
padreFIELDSETinputs[i].checked == false
)
marcoElGeneral = false;
}
padreFIELDSET.getElementsByTagName("input")[0].checked = marcoElGeneral;
}
Como ya te he dicho, depende mucho de la estructura HTML que quieras montarte. Yo la he hecho con LABEL y FIELDSET porque me parece correcto, pero me ha complicado el script un poco.
Espero que mi mensaje te aclare.
Saludos
PD: Te recomiento usar el BBCODE para mostrar código. Las etiquetas [ php ] colorean según sintaxis y a mi me parecen cómodas para leer. Usa cualquiera, PHP, HTML, CODE... pero no pegues el código sin más o será complicado leerlo.