var idCounter=0;
var tvLastNode=null;
var tvSelectNode=null;

var closedFolderImg="/sitevision/portlet/treeview/folderclosed.gif";
var openFolderImg="/sitevision/portlet/treeview/folderopen.gif";
var documentImg = "/sitevision/portlet/treeview/doc.gif";
var treeNodes = new Array();

function TreeView(root, _treeClass, _treeSelClass, _collapsedImage, _expandedImage, _documentImage, _openFrame) {
   this.root = root;
   this.render = tv_render;
   this.treeClass = _treeClass;
   this.treeSelClass = _treeSelClass;
   this.renderChild = tv_renderChild;
   this.toggleExpand = tv_toggleExpand;
   this.showRoot = false;
   this.getHtmlFor = tv_getHtmlFor;
   this.treeId = "treeView";
   if(_openFrame != "null") this.openFrame = _openFrame; else this.openFrame=null;
   if(_collapsedImage != "null") closedFolderImg=_collapsedImage;
   if(_expandedImage != "null") openFolderImg=_expandedImage;
   if(_documentImage != "null") documentImg=_documentImage;
}

function tv_render() {
   for(i=0; i<this.root.items.length; i++) {
      this.renderChild(this.root.items[i]);
   }
}

function tv_getHtmlFor(node, visible) {
   var html = "";
   var img = documentImg;
   if(node.hasChildren()) {
      if(tvSelectNode != null && (tvSelectNode.hasParent(node) || tvSelectNode==node)) {
        img = openFolderImg;
      } else
      img = closedFolderImg;
   }
   var fontClass = this.treeClass;
   if(node==tvSelectNode) {fontClass=this.treeSelClass;tvLastNode=node.id;}
   if(node.hasChildren()) {
      html += "<table cellspacing=0 cellpadding=0 border=0 style='cursor:pointer;cursor:hand'><tr><td valign=top>";
      html += "<img id=\"icon" + node.id + "\" src='" + img + "' onmousedown='" + this.treeId + ".toggleExpand(\"" + node.id + "\")' /></td><td valign=middle><a class='" + fontClass + "' style='cursor:pointer;cursor:hand' " + (node.url != null ? " href='" + node.url + "'" : "onmousedown='" + this.treeId + ".toggleExpand(\"" + node.id + "\")'") + ">" + node.title + "</a>" + (node.url==null ? "": "") + "<br>";
      html += "</td></tr></table>";
      html += "<div id='" + node.id + "' style='display:" + (visible ? "block" : "none") + ";margin-left:10px; '>";
      var i;
      html += "<div id=\"fill" + node.id + "\"></div>";
      if(tvSelectNode != null) {
        if(tvSelectNode.hasParent(node) || tvSelectNode==node) {
            node.isRendered=true;
            for(i=0; i<node.items.length; i++) {
               var nodeChild = node.items[i];
               html += this.getHtmlFor(nodeChild, true);
            }
        }
      }
      html += "</div>";
   } else {
      html += "<table cellspacing=0 cellpadding=0 border=0><tr><td valign=top>";
      html += "<img src='" + img + "' /></td><td valign=middle><a title='" + node.title + "'" + (this.openFrame != null ?  " target='" + this.openFrame + "'" : "") + " class='" + fontClass + "' href='" + node.url + "'>" + node.title + "</a><br>";
      html += "</td></tr></table>";
   }
   return html;
}

function tv_renderChild(node) {
    document.write(this.getHtmlFor(node, true));
}

function tv_toggleExpand(id) {
   var node = treeNodes[id];
//if(tvLastNode==id || (tvLastNode!=null&&treeNodes[tvLastNode].hasParent(node))) tvLastNode=null;
if(tvLastNode==id) tvLastNode=null;
   var justRendered=false;
   if(!node.isRendered) {
     var childElement = document.getElementById("fill" + node.id);
     var i;
     var html="";
     for(i=0;i<node.items.length;i++) {
        html += this.getHtmlFor(node.items[i], false);
     }
     childElement.innerHTML = html;
     node.isRendered=true;
     justRendered=true;
   }
   var toHide = tvLastNode;

   while(tvLastNode != null && treeNodes[id].parent.id!=tvLastNode) {
    tv_setHidden(tvLastNode, true);
    tvLastNode = treeNodes[tvLastNode].parent.id;
   }
//   if(tvLastNode!=null && treeNodes[id].parent.id!=tvLastNode) tv_setHidden(tvLastNode, true);
 //  if(tvLastNode!=null) tv_setHidden(tvLastNode, true);
   var icon = document.getElementById("icon" + id);
   var els = document.getElementById(id).style;
   icon.src=openFolderImg;
   if(els.display!="block") {
      els.display="block";
   }
   else if(!justRendered) {
      els.display="none";
      icon.src=closedFolderImg;
   }
   tvLastNode = id;
   if(event!=null) event.cancelBubble=true;
   return false;
}

function tv_setHidden(id, hidden) {
   var icon = document.getElementById("icon" + id);
   if(icon==null) return;
   var els = document.getElementById(id).style;
   if(hidden) {
      els.display="none";
      icon.src=closedFolderImg;
   } else {
      els.display="block";
      icon.src=openFolderImg;
   }
}


function TreeSubMenu(title, url, jsAction) {
   this.visible=false;
   this.title=title;
   this.url=url;
   this.jsAction=jsAction
   this.items=new Array();
   this.parent=null;
   this.level=0;
   // Prototypes
   this.addSubMenu=tree_addSubMenu;
   this.addItem=tree_addItem;
   this.hasChildren=tree_hasChildren;
   this.id="tv"+(idCounter++);
   this.hasParent=tree_hasParent;
   treeNodes[this.id]=this;
}

function tree_addSubMenu(title, url, jsAction, selectMe) {
   var subMenu=new TreeSubMenu(title,url, jsAction);
   this.items[this.items.length]=subMenu;
   subMenu.parent=this;
   subMenu.level=this.level+1;
   this.isRendered=false;
   if(selectMe) { tvSelectNode = subMenu; }
   return subMenu;
}

function tree_addItem(title, url, jsAction, selectMe) {
   var subMenu = this.addSubMenu(title, url, jsAction);
   if(selectMe) { tvSelectNode = subMenu;}
}

function tree_hasChildren() {
   return this.items.length!=0;
}

function tree_hasParent(aMenu) {
   if(this.parent==null) return false;
   if(this.parent==aMenu) return true;
   return this.parent.hasParent(aMenu);
}












function tvFolder(title) {
   // Attributes
   this.title = title;
   this.level = 0;
   this.isFolder = true;
   this.items = new Array();
   // Prototypes
   this.addItem = tvf_addItem;
   this.addFolder = tvf_addFolder;
   this.addObject = tvf_addObject;
   this.id = "tv"+(idCounter++);
}

function tvf_addItem(title, url) {
   var item = new tvItem(title, url);
   item.level = this.level+1;
   this.addObject(item);
   return item;
}

function tvf_addFolder(title) {
   var folder = new tvFolder(title);
   folder.level = this.level+1;
   this.addObject(folder);
   return folder;
}

function tvf_addObject(obj) {
   obj.parent = this;
   treeNodes[obj.id] = obj;
   this.items[this.items.length] = obj;
}

function tvItem(title, url) {
   this.title = title;
   this.url = url;
   this.id = "tv"+(idCounter++);
}





