<!-- // INICIO ChecksTree.js ---------------------------------------------------------
 
 
function Folder(key, description, folderChecked) { // Constructor del elemento
	// Datos constantes
	this.desc = description 
	this.id = -1
	this.idParent = -1
	this.key = key
	this.navObj = 0
	this.iconImg = 0
	this.nodeImg = 0
	this.isLastNode = 0
	this.checked = folderChecked	
	 
	// Datos dinamicos
	this.isOpen = true 
	// La imagen inicial depende del chequeo del elemento
	if (this.checked == true) {
		this.iconSrc = "images/treeview/ftv2checkenabled.gif"
	} else {
		this.iconSrc = "images/treeview/ftv2checkdisabled.gif"
	}
	this.children = new Array
	this.nChildren = 0
	 
	// Metodos
	this.initialize = initializeFolder 
	this.setState = setStateFolder 
	this.addChild = addChild 
	this.createIndex = createEntryIndex 
	this.hide = hideFolder 
	this.display = display 
	this.renderOb = drawFolder 
	this.totalHeight = totalHeight 
	this.subEntries = folderSubEntries 
	this.outputLink = outputFolderLink 
} 

 
function setStateFolder(isOpen) { 
	var subEntries 
	var totalHeight 
	var fIt = 0 
	var i=0 
 
	if (isOpen == this.isOpen) 
		return 
 
	if (browserVersion == 2) { 
		totalHeight = 0 
		for (i=0; i < this.nChildren; i++) 
			totalHeight = totalHeight + this.children[i].navObj.clip.height 
		subEntries = this.subEntries() 
		if (this.isOpen) 
			totalHeight = 0 - totalHeight 
		for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) 
			indexOfEntries[fIt].navObj.moveBy(0, totalHeight) 
	}
	this.isOpen = isOpen
	propagateChangesInState(this) 
}

 
function propagateChangesInState(folder) {   
    var i=0 
 
    if (folder.isOpen) { 
        if (folder.nodeImg) 
            if (folder.isLastNode) 
                folder.nodeImg.src = "images/treeview/ftv2mlastnode.gif" 
            else 
                folder.nodeImg.src = "images/treeview/ftv2mnode.gif"
            for (i=0; i<folder.nChildren; i++) 
                folder.children[i].display() 
    } else { 
        if (folder.nodeImg) 
            if (folder.isLastNode) 
                folder.nodeImg.src = "images/treeview/ftv2plastnode.gif" 
            else 
                folder.nodeImg.src = "images/treeview/ftv2pnode.gif"			
            for (i=0; i<folder.nChildren; i++) 
                folder.children[i].hide() 
    }  
} 

 
function hideFolder() { 

    if (browserVersion == 1) { 
        if (this.navObj.style.display == "none") 
            return 
        this.navObj.style.display = "none" 
    } else { 
        if (this.navObj.visibility == "hiden") 
            return 
        this.navObj.visibility = "hiden" 
    }    
    this.setState(0) 
} 

 
function initializeFolder(level, parentIdentifier, lastNode, leftSide) { 
	var j=0 
	var i=0 
	var numberOfFolders 
	var numberOfDocs 
	var nc 
	var myId
     
	nc = this.nChildren    
	this.createIndex() 
    this.idParent = parentIdentifier
	myId = this.id
	var auxEv = "" 
 
	if (browserVersion > 0) 
		auxEv = "<a href='javascript:clickOnNode("+this.id+")'>" 
	else 
		auxEv = "<a>" 
 
	if (level>0) 
		if (lastNode) { // El ultimo 'hermano' en el arreglo de hijos
			this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='images/treeview/ftv2mlastnode.gif' width=16 height=22 border=0></a>")
			leftSide = leftSide + "<img src='images/treeview/ftv2blank.gif' width=16 height=22>" 
			this.isLastNode = 1 
		} else { 
			this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='images/treeview/ftv2mnode.gif' width=16 height=22 border=0></a>") 
			leftSide = leftSide + "<img src='images/treeview/ftv2vertline.gif' width=16 height=22>" 
			this.isLastNode = 0 
		} 
	else 
		this.renderOb("") 
   
	if (nc > 0) { 
		level = level + 1 
		for (i=0 ; i < this.nChildren; i++) { 
			if (i == this.nChildren-1) 
				this.children[i].initialize(level, myId, 1, leftSide)
			else 
				this.children[i].initialize(level, myId, 0, leftSide)
		} 
	} 
} 

 
function drawFolder(leftSide) { 
	if (browserVersion == 2) { 
		if (!doc.yPos) 
			doc.yPos=8 
		doc.write("<layer id='folder" + this.id + "' top=" + doc.yPos + " visibility=hiden>") 
	} 
   
	doc.write("<table ") 
	if (browserVersion == 1) 
		doc.write(" id='folder" + this.id + "' style='position:block;' ") 
	doc.write(" border=0 cellspacing=0 cellpadding=0>") 
	doc.write("<tr><td>") 
	doc.write(leftSide) 
	this.outputLink() 
	doc.write("<img id='imgCheck" + this.id + "' ")
	doc.write("src='" + this.iconSrc+"' border=0></a>") 
	doc.write("</td><td valign=middle nowrap>") 
	if (useTextLinks) { 
		this.outputLink() 
		doc.write(this.desc + "</a>") 
	} else 
		doc.write("<SPAN class='itmOptionsTree'>" + this.desc + "</SPAN>")
	doc.write("</td>")  
	doc.write("</table>") 
   
	if (browserVersion == 2) { 
		doc.write("</layer>") 
	} 
 
	if (browserVersion == 1) { 
		this.navObj = doc.all["folder"+this.id] 
		this.iconImg = doc.all["imgCheck"+this.id] 
		this.nodeImg = doc.all["nodeIcon"+this.id] 
	} else if (browserVersion == 2) { 
		this.navObj = doc.layers["folder"+this.id] 
		this.iconImg = this.navObj.document.images["imgCheck"+this.id] 
		this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] 
		doc.yPos=doc.yPos+this.navObj.clip.height 
	} 
} 

 
function outputFolderLink() { 
	doc.write("<a style='CURSOR: default;' href='javascript:clickOnCheck("+this.id+")'>") 
} 


function addChild(childNode) { 
	this.children[this.nChildren] = childNode 
	this.nChildren++ 
	return childNode 
} 


function folderSubEntries() { 
	var i = 0 
	var se = this.nChildren 
 
	for (i=0; i < this.nChildren; i++) { 
		if (this.children[i].children) // Es un folder si tiene hijos
			se = se + this.children[i].subEntries() 
	} 
 
	return se 
} 
 
 
// Definicion de la clase Item (un link dentro de un Folder) 
// ************************************************************* 

function Item(key, itemDescription, itemChecked, toolTip) { // Constructor del item
	// Datos constantes
	this.key = key
	this.desc = itemDescription 
	// Inicializados posteriormente
	this.id = -1 
	this.idParent = -1	
	this.navObj = 0 
	this.iconImg = 0 
	this.link = "" 
	this.iconAlt = toolTip
	this.checked = itemChecked
	// Cargamos el valor de la imagen, segun el valor de checked
	if (this.checked == true) {
		this.iconSrc = "images/treeview/ftv2checkenabled.gif"
	} else {
		this.iconSrc = "images/treeview/ftv2checkdisabled.gif"
	}
	// Se supone que es una hoja, su cantidad de hijos quedara en cero
	this.nChildren = 0;
		
	// Metodos 
	this.initialize = initializeItem 
	this.createIndex = createEntryIndex 
	this.hide = hideItem 
	this.display = display 
	this.renderOb = drawItem 
	this.totalHeight = totalHeight 
} 

 
function hideItem() { 
	if (browserVersion == 1) { 
		if (this.navObj.style.display == "none") 
			return 
		this.navObj.style.display = "none" 
	} else { 
		if (this.navObj.visibility == "hiden") 
			return 
		this.navObj.visibility = "hiden" 
	}     
} 

 
function initializeItem(level, parentIdentifier, lastNode, leftSide) {  

    this.createIndex() 
    this.idParent = parentIdentifier
	this.link = "'javascript:clickOnCheck(" + this.id + ")'"
 
	if (level>0) 
		if (lastNode) { // El ultimo 'hermano' en el arreglo de hijos
			this.renderOb(leftSide + "<img src='images/treeview/ftv2lastnode.gif' width=16 height=22>") 
			leftSide = leftSide + "<img src='images/treeview/ftv2blank.gif' width=16 height=22>"  
		} else { 
			this.renderOb(leftSide + "<img src='images/treeview/ftv2node.gif' width=16 height=22>") 
			leftSide = leftSide + "<img src='images/treeview/ftv2vertline.gif' width=16 height=22>" 
		} 
	else 
		this.renderOb("")   
} 

 
function drawItem(leftSide) { 
	if (browserVersion == 2) 
		doc.write("<layer id='item" + this.id + "' top=" + doc.yPos + " visibility=hiden>") 
     
	doc.write("<table ") 
	if (browserVersion == 1) 
		doc.write(" id='item" + this.id + "' style='position:block;' ") 
	doc.write(" border=0 cellspacing=0 cellpadding=0>") 
	doc.write("<tr><td valign=top>") 
	doc.write(leftSide) 
	doc.write("<a style='CURSOR: default;' href=" + this.link + ">") 
	doc.write("<img id='imgCheck"+this.id+"' ") 
	doc.write("alt='" + this.iconAlt+"' ")   
	doc.write("src='"+this.iconSrc+"' border=0>") 
	doc.write("</a>") 
	doc.write("</td><td valign=middle nowrap>") 
	if (useTextLinks) 
		doc.write("<a href=" + this.link + ">" + this.desc + "</a>") 
	else 
		doc.write(this.desc) 
	doc.write("</table>") 
   
	if (browserVersion == 2) 
		doc.write("</layer>") 
 
	if (browserVersion == 1) { 
		this.navObj = doc.all["item"+this.id] 
		this.iconImg = doc.all["imgCheck"+this.id] 
	} else if (browserVersion == 2) { 
		this.navObj = doc.layers["item"+this.id] 
		this.iconImg = this.navObj.document.images["imgCheck"+this.id] 
		doc.yPos=doc.yPos+this.navObj.clip.height 
	} 
} 
 
 
// Metodos comunes a ambos objetos (seudo-herencia) 
// ******************************************************** 
 
function display() { 
	if (browserVersion == 1) 
		this.navObj.style.display = "block" 
	else 
		this.navObj.visibility = "show" 
} 

 
function createEntryIndex() { 
	this.id = nEntries 
	indexOfEntries[nEntries] = this 
	nEntries++ 
} 


function totalHeight() { // Utilizado con browserVersion == 2 
	// Largo total de las sub-entradas abiertas
	var h = this.navObj.clip.height 
	var i = 0 
   
	if (this.isOpen) // Es un folder y se encuentra abierto
		for (i=0 ; i < this.nChildren; i++)  
			h = h + this.children[i].totalHeight() 

  return h 
} 
 
 
// Funciones auxiliares para el manejo de los eventos
// *********************************************************

function applyEventNode(element, checkType) {
    var srcImagen
	
    // Aplicamos el evento
    if (element.checked != checkType) {
        if (checkType)
            srcImagen = "images/treeview/ftv2checkenabled.gif"
        else
            srcImagen = "images/treeview/ftv2checkdisabled.gif"
        if (browserVersion == 0)
            document.getElementById("imgCheck" + element.id).src = srcImagen
        else
            element.iconImg.src = srcImagen
        element.checked = checkType

        // Esta opcion es para casos propios de la pagina - cambio el estado
        applyCustomActions(element, true);
    } else {
        // Esta opcion es para casos propios de la pagina - no cambio el estado
        applyCustomActions(element, false);
    }
}


function applyCheckNode(elementId) {
    var checkedElement = 0 
    var srcImagen
	
    // Modificamos los datos del elemento al que se le hizo clic en el check
    checkedElement = indexOfEntries[elementId]

    if (!checkedElement.checked) {
        srcImagen = "images/treeview/ftv2checkenabled.gif"
        checkedElement.checked = true
    } else {
        srcImagen = "images/treeview/ftv2checkdisabled.gif"
        checkedElement.checked = false
    }
    if (browserVersion == 0)
        document.getElementById("imgCheck" + elementId).src = srcImagen
    else
        checkedElement.iconImg.src = srcImagen

    // Esta opcion es para casos propios de la pagina - siempre cambia el estado
    applyCustomActions(checkedElement, true);

    // Valor de retorno
    return checkedElement.checked
}


function applyCheckChildren(elementId, isChecked) {
	var i = 0
	var checkedElement = 0 

	// Obtenemos los datos del elemento por modificar
	checkedElement = indexOfEntries[elementId]
	
	// Le aplicamos el cambio a cada uno de sus hijos
	while (i < checkedElement.nChildren) {
		// Le aplicamos al hijo el chequeo
		applyEventNode(checkedElement.children[i], isChecked)
		// Revisamos si tiene hijos por chequear
		if (checkedElement.children[i].nChildren > 0)
			applyCheckChildren(checkedElement.children[i].id, isChecked)
		i += 1
	}
}


function applyCheckParent(elementId) {
	var i = 0
	var tmpElement = 0 
	var checkSomething = false

	// Elemento actual
	tmpElement = indexOfEntries[elementId]
	
	if (tmpElement.idParent != -1) {
		// Padre del elemento, por revisar
		tmpElement = indexOfEntries[tmpElement.idParent]

		i = 0
		checkSomething = false
		while ((i < tmpElement.nChildren) && (checkSomething == false))
		    if (tmpElement.children[i].checked == true)
		        checkSomething = true
		    else
		        i += 1
		applyEventNode(tmpElement, checkSomething)
		// Llamada recursiva, solo si el padre no es nulo
		if (tmpElement.idParent != -1) 
		    applyCheckParent(tmpElement.id)
	}
}


// Eventos 
// ********************************************************* 
 
function clickOnFolder(folderId) { 
	var clicked = indexOfEntries[folderId] 
 
	if (!clicked.isOpen) 
		clickOnNode(folderId) 
 
	return  
 
	if (clicked.isSelected) 
		return 
} 

 
function clickOnNode(folderId) { 
	var clickedFolder = 0 
	var state = 0 
	
	clickedFolder = indexOfEntries[folderId] 
	state = clickedFolder.isOpen
 
	clickedFolder.setState(!state) // Abierto <-> Cerrado
} 

 
function clickOnCheck(elementId) {
	
	// Modificamos los datos del elemento
	isChecked = applyCheckNode(elementId);

	// Modificamos los datos de los hijos
	applyCheckChildren(elementId, isChecked);
	
	// Modificamos los datos del padre
	applyCheckParent(elementId);
	
	// Actualizamos la vista
	UpdateView();
}


function initializeDocument() { 
	if (doc.all) 
		browserVersion = 1 // IE4   
	else 
		if (doc.layers) 
			browserVersion = 2 // NS4 
		else 
			browserVersion = 0 // Other 
 
	// La raiz del arbol no tiene padre => -1
	foldersTree.initialize(0, -1, 1, "") 
	foldersTree.display()
  
	if (browserVersion > 0) { 
		doc.write("<layer top="+indexOfEntries[nEntries-1].navObj.top+">&nbsp;</layer>") 
 
    // Cerrar todo el arbol
    clickOnNode(0) 
    // Abrir todo el arbol (el segundo nivel)
    clickOnNode(0) 
  } 
} 
 
// Funciones auxiliares para la compatibilidad del Folder-Treee backward 
// ********************************************************* 
 
function gFld(index, description, checked) { 
	folder = new Folder(index, description, checked) 
	return folder 
} 

 
function gLnk(index, description, checked, toolTip) { 
	linkItem = new Item(index, description, checked, toolTip)
	return linkItem 
} 

 
function insFld(parentFolder, childFolder) { 
	return parentFolder.addChild(childFolder) 
} 

 
function insLeaf(parentFolder, document) { 
	parentFolder.addChild(document)
}

 
// Variables globales
// **************** 
 
useTextLinks = 0 
indexOfEntries = new Array 
nEntries = 0 
doc = document 
browserVersion = 0 
selectedFolder = 0


// FINAL ChecksTree.js --------------------------------------------------------------->

