var isIe=/MSIE\s\d/.test(navigator.userAgent);//Internet Explorer

function haltBubble(evt){//allow events to be handled without triggering the saem event in parent elements
 if(!evt)
  evt=window.event;
 if(evt.stopPropagation)
  evt.stopPropagation();
 else
  evt.cancelBubble=true;
}

//parse a <ol> or <ul> and make parent <li>s expandable and collapsable, then collapse the tree by default
function folderTreeInit(elemParent,folderClass){
 var elem,fc=eval('\/\\b'+folderClass.replace('-','\\-')+'\\b\/');
 for(var i=0;i<elemParent.childNodes.length;i++){
  elem=elemParent.childNodes[i];
  folderTreeInit(elem,folderClass);//recurse all subfolders
  if(elem.tagName!='LI')
   continue;
  if(fc.test(elem.className)){//folders
   if(isIe)
    elem.onclick=function(){folderTreeToggle(this,null)};
   else
    elem.setAttribute('onclick','folderTreeToggle(this,event);');
   folderTreeToggle(elem);//collapse folders initially
  }
  else{//files
   if(isIe)
    elem.onclick=haltBubble;
   else
    elem.setAttribute('onclick','haltBubble(event);');
  }
 }
}

//toggle visibility of <li>'s child elements
function folderTreeToggle(parentLi,evt){
 if(arguments.length>1)
  haltBubble(evt);
 if(parentLi.treeExpanded===undefined)
  parentLi.treeExpanded=true;
 var show=!parentLi.treeExpanded;
 parentLi.className=(show?parentLi.className.replace(/\s+collapsed/,''):parentLi.className+' collapsed');
 var child;
 for(var i=0;i<parentLi.childNodes.length;i++){
  child=parentLi.childNodes[i];
  if(child.tagName=='UL' || child.tagName=='OL')
   child.style.display=(show?'':'none');
 }
 parentLi.treeExpanded=show;
}
