function byId(id)
{
  return document.getElementById(id);
}

function haveClass(obj,cls)
{
  r=new RegExp("(^| )"+cls+"($| )");
  return r.test(obj.className);
}	

function removeClass(obj,cls)
{
  r=new RegExp("(^| )("+cls+")($| )");
  obj.className = obj.className.replace(r,"");
}

function addClass(obj,cls)
{
  if( !cls )
    return false;
  
  if( !haveClass(obj,cls) )
    obj.className += obj.className.length ? " "+cls : cls;
}

function firstParent(obj,tag,cls)
{
  if(tag)
  {
    while(obj=obj.parentNode)
      if(obj.nodeName==tag)
        if(!cls||haveClass(obj,cls))
          return obj;
  }
  else if(cls)
  {
    while(obj=obj.parentNode)
      if(haveClass(obj,cls))
        return obj;
  }
  else
  {
    return obj.parentNode;
  }
}

function turn( obj, mode, cls_arr, disable, except, disId )
{
  if(cls_arr.length>1)
  {
    removeClass(obj,cls_arr[mode?1:0]);
    addClass(obj,cls_arr[mode?0:1]);
  }
  
  if(disable)
  {
    var col = new Array();
    col[0]=obj.getElementsByTagName("INPUT");
    col[1]=obj.getElementsByTagName("TEXTAREA");
    col[2]=obj.getElementsByTagName("SELECT");
    
    for(var c=0;c<col.length;c++)
    {
      var el = col[c];
      for(var i=0;i<el.length;i++)
      {
        if( el[i].type!='hidden' && (!except || el[i]!=except) )
        {          
          if( !el[i].disabledby || el[i].disabledby==disId )
          {
            if( mode )
            {
              el[i].disabled=false;
              el[i].disabledby=null;
              removeClass(el[i],'disabled');
            }
            else
            {
              el[i].disabled=true;
              el[i].disabledby=disId;
              addClass(el[i],'disabled');
            }
          }
        }
      }
    }
  }
}

function turnCheckAll( ids, firstParentClass, classes )
{
  for( var i=0; i<ids.length; i++ )
  {
    var id = ids[i];
    var el = byId(id);
    
    turn(firstParent(el,0,firstParentClass),el.checked,[classes[0],classes[1]],1,el,id);
    
    el.onclick=function(e)
    {
      var e = window.event ? window.event : e;
      var obj = e.target ? e.target : e.srcElement;
      
      if( obj.type=='checkbox' )
      {
        turn(firstParent(obj,0,firstParentClass),obj.checked,[classes[0],classes[1]],1,obj,obj.id);
      }      
      if( obj.type=='radio' )
      {
        objs = document.getElementsByName( obj.name );
        for( var i=0; i<objs.length; i++ )
          turn(firstParent(objs[i],0,firstParentClass),objs[i].checked,[classes[0],classes[1]],1,objs[i],objs[i].id);
      }
    }
    
  }  
}

/*
sample onclick:
onclick="turn( firstParent(this,0,'aa'), this.checked, ['','changed'], 1, this, 'second' );"
*/