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 foldersInit( selector, initState )
{
  ULs = new Array;
  if( initState=='' ){ initState = 'close' }
  if( typeof(selector) == 'object' ){ ULs[0] = selector; }
  else{ ULs = getElementsBySelector(selector); }
  
  for( var u=0; u < ULs.length; u++ )
  {
    folderInit( ULs[u], initState );        
  }
  
  return true;
}

function folderInit( UL, initState )
{
  var LIs = UL.childNodes;
  var last = false;
      
  for( var i=0; i < LIs.length; i++ )
  {    
    var LI = LIs[i];
    
    if( LI.nodeName=='LI' )
    {
      last = LI;
      var SUBs = LI.childNodes;
      var DIV = false;
      
      for( var n=0; n < SUBs.length; n++ )
      {
        var SUB = SUBs[n];
        
        if( SUB.nodeName=='DIV' )
        {
          DIV = SUB;
        }
        else if( SUB.nodeName=='UL' )
        {      
          if( DIV!=false )
          {
            if( initState=='close' && !haveClass(DIV, 'open') ){
              _fold_close(DIV, SUB);
            }else{
              _fold_open(DIV, SUB);                
            }
            
            DIV.style.cursor='pointer';
            folderInit( SUB, initState );
            DIV.onclick=function(e) { fold(e) };
          }
        }
        
      }
    }
  }
  
  if( last!=false )
  {
    addClass(last,'last');
  }    
}

function _fold_open(div_obj, ul_obj)
{
  ul_obj.style.display='block';
  removeClass(div_obj,'closed');      
  addClass(div_obj, 'open');    
}

function _fold_close(div_obj, ul_obj)
{
  ul_obj.style.display='none';
  removeClass(div_obj,'open');
  addClass(div_obj, 'closed');
}

function fold(e, op)
{
  var e = window.event ? window.event : e;  
  var obj = e.target ? e.target : e.srcElement;
  
  if( obj.parentNode.nodeName == 'DIV' )
  {
    obj = obj.parentNode;
  }
  
  var change = false;
  
  if( haveClass( obj,'open' ) )
    change='close';
  if( haveClass( obj,'closed' ) )
    change='open';
  
  if( change && (obj.parentNode.nodeName=='LI' || obj.parentNode.parentNode.nodeName=='LI') )
  {
    if( obj.parentNode.parentNode.nodeName=='LI' )
    {
      childs = obj.parentNode.parentNode.childNodes;
    }
    else
    {
      childs = obj.parentNode.childNodes;
    }
    
    for( key=0; key<childs.length; key++ )
    {
      if( childs[key].nodeName=='UL' )
      {
        if( change=='open' ){
          _fold_open(obj, childs[key]);
        }else{
          _fold_close(obj, childs[key]);
        }
      }
    }
  }
}

/* 
Function getElementsBySelector()
taken from http://pro.html.it/esempio/nifty/

The accepted parameters are:
  * Tag selector, i.e. "p" or "blockquote" or "h2"
  
  * Id selector, with specified tag of the element:
    for example "div#content" or "p#news" or "li#home"
    
  * Class selector, with specified tag of the element:
    for example "div.entry" or "h2.highlight"
    
  * Descendant selector, with some limitation:
    this has to be composed by an id selector followed by a tag selector.
    Valid examples are: "div#news div" or "ul#menu li"
*/
function getElementsBySelector(selector)
{
  var i;
  var s=[];
  var selid="";
  var selclass="";
  var tag=selector;
  var objlist=[];
  if(selector.indexOf(" ")>0){  //descendant selector like "tag#id tag"
    s=selector.split(" ");
    var fs=s[0].split("#");
    if(fs.length==1) return(objlist);
    return(document.getElementById(fs[1]).getElementsByTagName(s[1]));
  }
  if(selector.indexOf("#")>0){ //id selector like "tag#id"
    s=selector.split("#");
    tag=s[0];
    selid=s[1];
  }
  if(selid!=""){
    objlist.push(document.getElementById(selid));
    return(objlist);
  }
  if(selector.indexOf(".")>0){  //class selector like "tag.class"
    s=selector.split(".");
    tag=s[0];
    selclass=s[1];
  }
  var v=document.getElementsByTagName(tag);  // tag selector like "tag"
  if(selclass=="")
      return(v);
  for(i=0;i<v.length;i++){
    if(haveClass(v[i],selclass)){
      objlist.push(v[i]);
    }
  }
  return(objlist);
}
