// Constructor
function FolderCheckbox(folderDescription, checkboxDomId) {
  this.inheritFrom = Folder;
  this.inheritFrom(folderDescription, ""); // Don't need hreference
	
  // Variables
  this.checkboxDomId = checkboxDomId;
  this.prependHTML = "<td valign=middle><input type=checkbox id=" + checkboxDomId + " onclick='javascript:clickOnCheckbox(\"" + checkboxDomId + "\");'></td>";

  // Methods
  this.renderOb = drawFolderCheckbox;
}

// Rendering function
function drawFolderCheckbox(insertAtObj) 
{ 
  var nodeName = ""
  var auxEv = ""
  var docW = ""

  var leftSide = leftSideHTML(this.leftSideCoded)

  if (browserVersion > 0) 
    auxEv = "<a href='javascript:clickOnNode(\""+this.getID()+"\")'>" 
  else 
    auxEv = "<a>" 

  nodeName = this.nodeImageSrc()
 
  if (this.level>0) 
    if (this.isLastNode) //the last child in the children array 
	    leftSide = leftSide + "<td valign=top>" + auxEv + "<img name='nodeIcon" + this.id + "' id='nodeIcon" + this.id + "' src='" + nodeName + "' width=16 height=22 border=0></a></td>"
    else 
      leftSide = leftSide + "<td valign=top background=" + ICONPATH + "ftv2vertline.gif>" + auxEv + "<img name='nodeIcon" + this.id + "' id='nodeIcon" + this.id + "' src='" + nodeName + "' width=16 height=22 border=0></a></td>"

  this.isRendered = 1

  if (browserVersion == 2) { 
    if (!doc.yPos) 
      doc.yPos=20 
  } 

  docW = this.blockStartHTML("folder");

  docW = docW + "<tr>" + leftSide + "<td valign=top>";
  // Icons
  if (this.prependHTML == "")
    docW = docW + "<img src=" + ICONPATH + "ftv2blank.gif height=2 width=2>"
  
  docW = docW + "</td>"+this.prependHTML+"<td valign=middle width=100%>" 
  

  docW = docW + this.desc
  
  docW = docW + "</td>"

  docW = docW + this.blockEndHTML()

  if (insertAtObj == null)
  {
	  if (supportsDeferral) {
	      doc.write("<div id=domRoot></div>") //transition between regular flow HTML, and node-insert DOM DHTML
		  insertAtObj = getElById("domRoot")
		  insertAtObj.insertAdjacentHTML("beforeEnd", docW)
	  }
	  else
		  doc.write(docW)
  }
  else
  {
      insertAtObj.insertAdjacentHTML("afterEnd", docW)
  }
 
  if (browserVersion == 2) 
  { 
    this.navObj = doc.layers["folder"+this.id] 
    if (USEICONS)
      this.iconImg = this.navObj.document.images["folderIcon"+this.id] 
    this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] 
    doc.yPos=doc.yPos+this.navObj.clip.height 
  } 
  else if (browserVersion != 0)
  { 
    this.navObj = getElById("folder"+this.id)
    if (USEICONS)
      this.iconImg = getElById("folderIcon"+this.id) 
    this.nodeImg = getElById("nodeIcon"+this.id)
  } 
} 

// Event handler
function clickOnCheckbox(checkboxDomId) {
  var clicked = findCheckbox(checkboxDomId);
  checkChildren(clicked);
  checkParents(clicked);
}

// Recursively select/deselect the children's checkboxes of a node
function checkChildren(clicked) {
  var form = document.forms[FORM];
  if (form.elements[clicked.checkboxDomId].checked && !clicked.isOpen)
      clickOnNodeObj(clicked);
  var i = 0;
  for (i = 0; i < clicked.nChildren; i++) {
    var child = clicked.children[i];
    //child.folderMstr(clicked.navObj)
    //this.renderOb(clicked)
    form.elements[child.checkboxDomId].checked = form.elements[clicked.checkboxDomId].checked;
    checkChildren(child);
  }
}

// Recursively select/deselect the parents' checkboxes of a node.
function checkParents(clicked) {
  var parent = clicked.parentObj;
  if (parent.checkboxDomId == null) {
    return ;
  }
  var form = document.forms[FORM];
  var isChecked = true;
  var i = 0;
  for (i = 0; i < parent.nChildren; i++) {
    var child = parent.children[i];
    if (!form.elements[child.checkboxDomId].checked) {
      isChecked = false;
    }
  }
  form.elements[parent.checkboxDomId].checked = isChecked;
  checkParents(parent);
}

// Finds a checkbox given the checkboxDomId
function findCheckbox(checkboxDomId)
{
  var i=0;
  var id = nEntries;
  while ((i < nEntries) && (indexOfEntries[i].checkboxDomId != checkboxDomId))
    i++;
  id = i;
  if (id >= nEntries)
    return null; 
  else
    return indexOfEntries[id];
}

// Retuens a checkbox
function gFldChk(description, checkboxDomId)
{ 
  folderCheckbox = new FolderCheckbox(description, checkboxDomId);
  return folderCheckbox;
} 

// Creates a checkbox and insert it into its parent
function generateCheckbox(parentfolderObject, itemLabel, checkboxDomId) {
  var newObj;
  newObj = insDoc(parentfolderObject, gFldChk(itemLabel, checkboxDomId));
  return newObj;
}

// Returns an array of the ids of the checked
function getChecked() {
  var checkedArray  = new Array;
  form = document.forms[FORM];
  var index = 0;
  var i = 0;
  for (i = 0; i < nEntries; i++) {
    var node = indexOfEntries[i];
    
    if (node.checkboxDomId != null) {
      if (form.elements[node.checkboxDomId] != null) {
        if (form.elements[node.checkboxDomId].checked) {
          checkedArray[index] = indexOfEntries[i].checkboxDomId;
          index++;
        }
      }
    }
  }
  return checkedArray;
}


