i_folderfiletree_nVersion=0.129;

/* 	Intelygenz  - www.intelygenz.com
	[VER] 	 P:\IG_IntelyGenZ\IG11_Desarrollo_Librerias\IG11_01_Js\docs\i_folderfiletree.txt
	[UPDATE] P:\IG_IntelyGenZ\IG11_Desarrollo_Librerias\IG11_01_Js\src\i_folderfiletree.js
		Open -> i_core.js, i_marray.js, i_exml.js
*/

oIGZ.f_require("i_core", 0.760);
oIGZ.f_require("i_igz", 0.719);
oIGZ.f_require("i_marray", 0.267);
oIGZ.f_require("i_exml", 1.212);

oIGZ.f_loadLib("i_folderfiletree", i_folderfiletree_nVersion);

function FolderFileTree ( sObj, maData, sEXML_TitleFolder, sEXML_TitleFile, f_folder, f_file, bAlwaysReload ) {
	this.m_sObj     = sObj;
	this.m_nVersion = i_folderfiletree_nVersion;
	this.m_sKeyName = "[i_folderfiletree v"+this.m_nVersion+"] - ";
	this.m_oObj	    = null;
	this.m_nTreeWidth = null;	//ancho maximo del arbol (es necesario para que las cosas salgan alineadas)
	this.m_sSeparadorHilo = ">";

	if ( IsMArrayOld(maData) ) {
		ErrorJS(this.m_sKeyName+" No se recomienda utilizar MArray antiguos. Usa un objeto MArray más moderno.");
		maDataNew = new MArray();
		maDataNew.f_fillFromOldMArray( maData );
		maData = maDataNew;
	}

	this.m_maData   = maData.f_getClone();
	this.m_maDataP  = maData;

	this.f_folder = f_folder;
	this.f_file	  = f_file;

	this.bAlwaysReload = bAlwaysReload;

	this.m_sEXML_TitleFolder = sEXML_TitleFolder;
	this.m_sEXML_TitleFile	 = sEXML_TitleFile;

	this.m_vIdNodeActive = null;

	this.m_sColNameId 		= "vId";
	this.m_sColNameIdParent = "vIdParent";
	this.m_sColNameIsFile   = "bFile";
	this.m_sColNameTitle    = "sTitle";

	this.f_setColNames = function (sColNameId, sColNameIdParent, sColNameIsFile, sColNameTitle){
		if ( sColNameId ) 		this.m_sColNameId		= sColNameId;
		if ( sColNameIdParent ) {
			this.m_sColNameIdParent = sColNameIdParent;
			this.m_maCache = new MArray([this.m_sColNameIdParent, "sHTML"], []);
		}
		if ( sColNameIsFile ) 	this.m_sColNameIsFile 	= sColNameIsFile;
		if ( sColNameTitle ) 	this.m_sColNameTitle	= sColNameTitle;
	}
	this.f_subColNames = function (){
		return [this.m_sColNameId, this.m_sColNameIdParent, this.m_sColNameIsFile, this.m_sColNameTitle];
	}

	this.m_sFolderId = this.m_sObj+"_Folder_";
	this.m_sFileId 	 = this.m_sObj+"_File_";

	this.f_setConfig = function (a_sConfig) {
		for ( var f=0, F=a_sConfig.length; f<F; f+=2 ) {
			if( this.m_maConfig.f_getColPos(a_sConfig[f])!=-1 ) {
				this.m_maConfig.f_setVal(a_sConfig[f], a_sConfig[f+1], 0);
			}
			else {
				ErrorJS(this.m_sKeyName+this.m_sObj+".f_setConfig -> No existe el elemento '"+a_sConfig[f]+"' en el Array de configuración.");
			}
		}
	}
	this.f_getConfig = function (sConfigName) {
		return this.m_maConfig.f_getVal(sConfigName, 0);
	}
	// ATENCION!!! No cambiar de sitio los parámetros de imagenes de los ejes
	this.m_a_sTreeIMGs = [ oIGZ.m_sRootPath+"pix/folderfiletree/", 21, 21							// 0, 1, 2
						 , "axis.gif", "axis_node.gif", "axis_node_first.gif", "axis_node_last.gif" // 3, 4, 5, 6
						 , "folder_closed.gif", "folder_opened.gif", "folder_void.gif"				// 7, 8, 9
						 , "file.gif"																// 10
						 ];
	this.m_a_sStyles   = [ "FolderFileTree_NodeChilds", "FolderFileTree_NodeVoid", "FolderFileTree_FolderClosed" // 0, 1, 2
						 , "FolderFileTree_TitleOff", "FolderFileTree_TitleOn", "FolderFileTree_TitleSelected"	// 3, 4, 5
						 , "FolderFileTree_TitleNoFunc"															// 6
						 ];
	this.m_maConfig = new MArray(["sImgFullPath", "nImgX", "nImgY"
								 ,"sImgAxis", "sImgAxisNode", "sImgAxisNodeFirst", "sImgAxisNodeLast"
								 ,"sImgFolderClosed", "sImgFolderOpened", "sImgFolderVoid"
								 ,"sImgFile"
								 ,"sCssNodeChilds","sCssNodeVoid","sCssFolderClosed"
								 ,"sCssTitleOff","sCssTitleOn","sCssTitleSelected"
								 ,"sCssTitleNoFunc"
								 ]
								 ,[this.m_a_sTreeIMGs.concat(this.m_a_sStyles)]
								);

	this.m_a_sOwnTAGs = ["<CHILDS>", "this.f_getChildsRegs(vId).length"
	                    ];
	this.f_parseOwnTAGs = function (sStr){
		var sOwnTAG, sOwnEXML, nAttPos;
		for(var f=0; f<this.m_a_sOwnTAGs.length; f+=2){
			sOwnTAG =this.m_a_sOwnTAGs[f];
			sOwnEXML=this.m_a_sOwnTAGs[f+1];
			sStr=sStr.f_replace(sOwnTAG, sOwnEXML);
		}
		return (sStr);
	}


	this.f_subParents = function (vId) {
		var vIdParent, a_vIdParents = [];
		while ( vId != "" && !IsNull(vId)) {
			vIdParent = this.m_maData.f_getValIf(this.m_sColNameId, vId, this.m_sColNameIdParent);
			a_vIdParents.push(vIdParent);
			vId = vIdParent;
		}
		return a_vIdParents.reverse();
	}

	this.f_getChildsRegs = function (vId) {
		var a_vIdParents = this.m_maData.f_subIndexOf(this.m_sColNameIdParent, vId);
		return (a_vIdParents);
	}

	this.m_bLock = 0;
	this.f_lock   = function (){ this.m_bLock = 1; }
	this.f_unlock = function (){ this.m_bLock = 0; }

	this.f_init = function (vId, bOpenFolder, bExeFunc) {
		this.m_oObj = GetElement(this.m_sObj+"_Level0");
		this.f_printLevel0();

		if ( vId ) {
			var a_parents = this.f_subParents(vId);
			a_parents.push(vId);
			this.f_autoUnFold( a_parents, bOpenFolder, 1, bExeFunc);
		}
	}

	this.f_refresh = function (maData, vId, bOpenFolder, bExeFunc){
		this.m_maData = maData;
		this.f_init(vId, bOpenFolder, bExeFunc);
	}

	this.m_a_vIdAutoUnFold = [];
	this.f_autoUnFold = function (a_vIdAutoUnFold, bOpenFolder, bReLoad, bExeFunc, f_call) {
		var oFolderFilesTree = this;
		if ( a_vIdAutoUnFold ) {
			this.m_a_vIdAutoUnFold = a_vIdAutoUnFold;
			this.m_nAutoUnFold	   = 0;
		}
		this.m_nAutoUnFold++;
		var vIdParent = this.m_a_vIdAutoUnFold[this.m_nAutoUnFold];

		if ( this.m_nAutoUnFold < this.m_a_vIdAutoUnFold.length-1 ) {
			var oObj = GetElement( this.m_sFolderId+vIdParent );
			if (oObj!=null && ( oObj.getAttribute("m_bOpened") == "0" || bOpenFolder)){
				this.f_treeAction( vIdParent, bReLoad, function (){ oFolderFilesTree.f_autoUnFold(null, bOpenFolder, bReLoad, bExeFunc, f_call); } );
			}
			else{
				this.f_autoUnFold(null, bOpenFolder, bReLoad, bExeFunc, f_call);
			}
		}
		else {
			var bFile = this.m_maData.f_getValIf(this.m_sColNameId, vIdParent, this.m_sColNameIsFile);

			var sId	  = this.f_getIdNode(vIdParent)+"_Inner";
			var bExe  = 1;
			if ( bOpenFolder && bFile==0 ) {
				bExe = 0;
				this.f_treeAction( vIdParent, bReLoad, function (){ } );
			}
			this.f_mouseSelect( GetElement(sId) );
			if ( bExeFunc ) {
				this.f_exeFunction( this.m_a_vIdAutoUnFold[this.m_a_vIdAutoUnFold.length-1] );
			}
			if (f_call ) f_call();
		}
	}

	this.f_exeFunction = function (vId){
		if ( !this.m_bLock ) {
			var oObj = GetElement(this.f_getIdNode(vId));
			if (oObj!=null && oObj.getAttribute("m_bFile")==1 && this.f_file) this.f_file(vId);
			else if (this.f_folder) this.f_folder(vId);
		}
	}

	this.f_reload = function (maData, bOpenFolder, bExeFunc) {
		this.f_update(maData, bOpenFolder, bExeFunc);

		this.f_add(maData, bOpenFolder, bExeFunc);
	}

	this.f_add = function (maDataAdd, bOpenFolder, bExeFunc) {
		if(IsNull(bOpenFolder)) bOpenFolder = 1;
		var maDataAdd = this.m_maData.f_boolean(maDataAdd, 2, 3, [this.m_sColNameId]);
		if ( maDataAdd.f_length()>0 ) {
			for ( var f=0, F=maDataAdd.f_length(); f<F; f++ ) {
				var vId 	  = maDataAdd.f_getVal(this.m_sColNameId, f);
				var vIdParent = maDataAdd.f_getVal(this.m_sColNameIdParent, f);

				this.m_maData.f_addRow(maDataAdd.f_getRow(f), this.m_maData.f_length());

				var a_parents = this.f_subParents(vIdParent);
				a_parents.push(vIdParent);

				var oTree = this;

				if ( vIdParent=="" ) {
					this.f_printLevel0();
				}
				else {
					oTree.f_refreshInner(vIdParent);
					this.f_autoUnFold(a_parents, bOpenFolder, 1, bExeFunc
														, function () {
					//											oTree.f_refreshInner(vId);
														  }
														);
				}
			}
		}
	}

	this.f_update = function (maDataUpdate, bOpenFolder, bExeFunc){
		if(IsNull(bOpenFolder)) bOpenFolder = 1;

		var maDataMod = this.m_maData.f_boolean(maDataUpdate, 1, 3, [this.m_sColNameId]);

		if ( maDataMod.f_length()>0 ) {
			for(var f=0, F=maDataMod.f_length(); f<F; f++ ) {
				var vId = maDataMod.f_getVal(this.m_sColNameId, f);
				var a_aROW = maDataMod.f_subRowsIf(this.m_sColNameId, vId);
				if ( a_aROW.length > 0 ) {
					var nReg = this.m_maData.f_getReg(this.m_sColNameId, vId);
					this.m_maData.f_addRow(a_aROW[0], nReg, 1);
				}
				var a_parents = this.f_subParents(vId);
				a_parents.push(vId);

				var oTree = this;
				this.f_autoUnFold(a_parents, bOpenFolder, 1, bExeFunc
													, function () {
																//Solo refresca el inner ya que la imagen no puede cambiar
																//y tampoco la del padre porque no se borra, sólo se modifica
																oTree.f_refreshInner(vId);
														}
													);
			}
		}
	}

	this.f_del = function (maDataDel, bOpenFolder, bExeFunc) {
		// var maDataDel = this.m_maData.f_boolean(maDataDel, -1, 2, [this.m_sColNameId]);
		if ( maDataDel.f_length()>0 ) {
			var vId, vIdParent, oObj;

			maDataTmp = this.m_maData.f_getClone();
			this.m_maData.f_boolean(maDataDel, -1, 2, [this.m_sColNameId]);

			for ( var f=0, F=maDataDel.f_length(); f<F; f++ ) {
				vId 	  = maDataDel.f_getVal(this.m_sColNameId, f);
				vIdParent = maDataDel.f_getVal(this.m_sColNameIdParent, f);

				oObj = GetElement( this.f_getIdNode( vId, maDataTmp ) );

				if ( !IsNull(oObj) ) oObj.parentNode.removeChild( oObj );

				var a_parents = this.f_subParents(vIdParent);

				if ( vIdParent ) {
					a_parents.push(vIdParent);

					var oTree = this;

					oTree.f_refreshInner(vIdParent);
					oTree.f_refreshNodeIMG(vIdParent);
				}

				this.f_autoUnFold(a_parents, bOpenFolder, 1, bExeFunc
													, function () {

														}
													);
			}

		}
	}


	this.f_addTo = function (maDataAdd, vIdParent, bOpenFolder, bExeFunc) {
		if ( vIdParent ) {
			var a_aROW = maDataAdd.f_subRowsIf("vId", vIdParent);
			if ( a_aROW.length > 0 ) {
				var nReg = this.m_maData.f_getReg("vId", vIdParent);
				this.m_maData.f_addRow(a_aROW[0], nReg, 1);
			}
			maDataAdd.f_delRowIf("vId", vIdParent);
			this.m_maData.f_concat(maDataAdd);

			var a_parents = this.f_subParents(vIdParent);
			a_parents.push(vIdParent);

			var oTree = this;
			this.f_autoUnFold(a_parents, bOpenFolder, 1, bExeFunc
												, function () {
															oTree.f_refreshInner(vIdParent);
															oTree.f_refreshNodeIMG(vIdParent);
													}
												);
		}
	}

	this.f_updateNode = function (maDataUpdate, bOpenFolder, bExeFunc) {
		var vId = maDataUpdate.f_getVal("vId", 0);
		var a_aROW = maDataUpdate.f_subRowsIf("vId", vId);

		if ( a_aROW.length > 0 ) {
			var nReg = this.m_maData.f_getReg("vId", vId);
			this.m_maData.f_addRow(a_aROW[0], nReg, 1);
		}

		var a_parents = this.f_subParents(vId);
		a_parents.push(vId);

		var oTree = this;
		this.f_autoUnFold(a_parents, bOpenFolder, 1, bExeFunc
											, function () {
														//Solo refresca el inner ya que la imagen no puede cambiar
														//y tampoco la del padre porque no se borra, sólo se modifica
														oTree.f_refreshInner(vId);
												}
											);
	}

	this.f_delOf = function (maDataDel, vIdParent, bOpenFolder, bExeFunc) {
		if ( vIdParent ) {
			var a_aROW = maDataDel.f_subRowsIf("vId", vIdParent);
			if ( a_aROW.length > 0 ) {
				var nReg = this.m_maData.f_getReg("vId", vIdParent);
				this.m_maData.f_addRow(a_aROW[0], nReg, 1);
			}
			maDataDel.f_delRowIf("vId", vIdParent);
			this.m_maData.f_boolean(maDataDel, -1);

			var oObj;
			for(var f=0, F=maDataDel.f_length(); f<F; f++ ) {
				oObj = GetElement( this.f_getIdNode( maDataDel.f_getVal("vId", f) ) );
				if ( !IsNull(oObj) ) oObj.parentNode.removeChild( oObj );
			}

			var a_parents = this.f_subParents(vIdParent);
			a_parents.push(vIdParent);

			var oTree = this;
			this.f_autoUnFold(a_parents, bOpenFolder, 1, bExeFunc
												, function () {
															oTree.f_refreshInner(vIdParent);
															oTree.f_refreshNodeIMG(vIdParent);
													}
												);
		}
	}

	// maData necesario MArray con datos temporales para cuando se eliminan nodos
	this.f_getIdNode = function (vId, maData, bAlert) {
		if( IsNull(maData) ) maData = this.m_maData;
		return maData.f_getValIf(this.m_sColNameId, vId, this.m_sColNameIsFile)==1 ? this.m_sFileId+vId : this.m_sFolderId+vId;
	}

	this.f_refreshInner = function (vId){
		var oObj = GetElement(this.f_getIdNode(vId)+"_Inner");
		if ( oObj==null ) ErrorJS(this.m_sKeyName+" No existe el elemento '"+this.f_getIdNode(vId)+"_Inner' probablemente estes intentando repintar un nodo que no esta visible");
		else {
			var oNode	= oObj.parentNode;
			//var nReg 	= oNode.getAttribute("m_nReg");
			var nReg 	= this.m_maData.f_getReg(this.m_sColNameId,vId);
			var nChilds = this.f_getChildsRegs(vId).length;
			oNode.setAttribute("m_nChilds", nChilds);
			if ( nChilds==0 ) oNode.setAttribute("m_bOpened", 0);
			var bFile	= oNode.getAttribute("m_bFile");
			var sTitle = this.f_drawTitle(nReg, nChilds, bFile);

			oObj.innerHTML = sTitle;
		}
	}

	this.f_refreshNodeIMG = function (vId){
		var oObj = GetElement(this.f_getIdNode(vId)+"_Img");
		if ( oObj==null ) ErrorJS(this.m_sKeyName+" No existe el elemento '"+this.f_getIdNode(vId)+"_Inner' probablemente estes intentando repintar un nodo que no esta visible");
		else {
			var oNode	= oObj.parentNode;
			//var nReg 	= oNode.getAttribute("m_nReg");
			var nReg 	= this.m_maData.f_getReg(this.m_sColNameId,vId);
			var nChilds = oNode.getAttribute("m_nChilds");
			var bFile	= oNode.getAttribute("m_bFile");
			var sNodeIMG = this.f_drawNodeIMG(nReg, nChilds, bFile);
			oObj.innerHTML = sNodeIMG;
		}
	}

	this.f_drawLoading = function (){
/*
		var sHTML += "<TABLE cellpadding=0 cellspacing=0 border=0><TR>"
			  +"<TD> loading ... </TD></TR></TABLE>";
*/
	}

	this.f_drawNode = function (vId, bFile, a_nParents, bLastNode, sIMG_EjeNodo, nReg) {
		var nSizeX = this.f_getConfig("nImgX");
		var nSizeY = this.f_getConfig("nImgY");
		var sId    		= "";
		var sMagic 		= "<IMG src='"+oIGZ.m_sRootPath+"pix/magic.gif' width="+nSizeX+" height="+nSizeY+" border=0 />";
		var sHTML 		= "";
		var nChilds 	= "";
		var sClassName	= "";

		// TIPO NODO
		if ( bFile==1 ) {
			sId = this.m_sFileId+vId;
			sHTML = "<TR id='"+sId+"' m_bFile=1 m_bFolder=0 m_nReg="+nReg+" m_vId='"+vId+"' m_bLastNode="+bLastNode+" >";
		}
		else {
			sId = this.m_sFolderId+vId;
			nChilds = this.f_getChildsRegs(vId).length;

			sHTML = "<TR id='"+sId+"' m_bFolder=1 m_bFile=0 m_bOpened='0' m_nReg="+nReg+" m_nChilds='"+nChilds+"' m_bLastNode="+bLastNode+" m_vId='"+vId+"' >";
		}

		// EJEs NIVEL
		var sStyle = " style='background: url("+this.f_getConfig("sImgFullPath")+this.f_getConfig("sImgAxis")+"); width: "+nSizeX+"; height: "+nSizeY+"; ' ";
		var oParent;
		var nParents =a_nParents.length; 
		for ( var f=1, F=nParents; f<F; f++) {
			oParent = GetElement ( this.m_sFolderId+a_nParents[f] );
			if (oParent==null
				|| (oParent!=null && oParent.getAttribute("m_bLastNode")==1)
			) {
				sHTML += "<TD>"+sMagic+"</TD>";
			}
			else {
				sHTML += "<TD "+sStyle+" >"+sMagic+"</TD>";
			}
		}

		// EJE NODO
		sStyle = " style='background: url("+sIMG_EjeNodo+"); width: "+nSizeX+"; height: "+nSizeY+"; ' ";
		sHTML += "<TD id='"+sId+"_Img' "+sStyle+" "
		if ( bFile!=1 ) sHTML += " onclick='"+this.m_sObj+".f_treeAction(\""+vId+"\");' ";
		sClassName = this.f_getConfig("sCssNodeChilds");
		if (!nChilds) sClassName = this.f_getConfig("sCssNodeVoid");
		sHTML += " class='" +sClassName+ "'>"+this.f_drawNodeIMG(nReg, nChilds, bFile)+"</TD>";

		// INNER TEXT
		var sTdWidth = ""		//0.128
		if (this.m_nTreeWidth) {
			sTdWidth = " style='width:"+ (this.m_nTreeWidth-(nParents*this.f_getConfig("nImgX"))) + "px'";
		}
		sHTML += "<TD id='"+sId+"_Inner'"+sTdWidth;
		sHTML += " class='"+this.f_getConfig("sCssTitleOff")+"' onclick='"+this.m_sObj+".f_mouseSelect(this);"+this.m_sObj+".f_exeFunction(\""+vId+"\");' onmouseover='"+this.m_sObj+".f_mouseOver(this)' onmouseout='"+this.m_sObj+".f_mouseOut(this)' ";

		var sTitle = this.f_drawTitle(nReg, nChilds, bFile);
		sHTML += " nowrap style='white-space: nowrap;'>"+sTitle+"</TD>";
		sHTML += "</TR>";

		return sHTML;
	}

	this.f_drawNodeIMG = function (nReg, nChilds, bFile) {
		sClassFolderImg = "";
		if ( bFile==1 ) {
			nIMG = 10;
		}
		else {
			nIMG = 9;
			if ( nChilds>0 ) {
				nIMG = 7; 	// Cerrado con hijos
				sClassFolderImg = this.f_getConfig("sCssFolderClosed");
			}
			var oObj = GetElement(this.f_getIdNode)
			if ( !IsNull(oObj) && oObj.getAttribute("m_bOpened") ) {
				if ( nChilds>0 ) nIMG = 8; 	// Abierto con hijos
			}
		}
		return "<IMG class='"+sClassFolderImg+"' src='"+this.f_getConfig("sImgFullPath")+this.m_a_sTreeIMGs[nIMG]+"' width="+this.f_getConfig("nImgX")+" height="+this.f_getConfig("nImgY")+" border=0 />";
	}

	this.f_drawTitle = function (nReg, nChilds, bFile) {
		var sTitle = this.m_maData.f_getVal(this.m_sColNameTitle, nReg);
		if ( !IsNull(this.m_sEXML_TitleFolder) ) {
			if ( bFile != 1) {
				var sEXML = this.m_sEXML_TitleFolder.f_replace("<CHILDS />", nChilds);
				sTitle = ParseEXMLs (sEXML, "", this.m_maData, nReg);
			}
		}
		if ( !IsNull(this.m_sEXML_TitleFile) ) {
			if ( bFile == 1 ) {
				sTitle = ParseEXMLs (this.m_sEXML_TitleFile, "", this.m_maData, nReg);
			}
		}
		return (sTitle);
	}

	this.f_drawChilds = function (vIdParent) {
		var nReg, vId, sTitle, bFile;
		var a_vChildsRegs = this.f_getChildsRegs(vIdParent);

		var a_sHTML = [];

		a_sHTML.push("<TABLE cellpadding=0 cellspacing=0 border=0>");

		if ( a_vChildsRegs.length > 0 ) {
			a_nParents = this.f_subParents( this.m_maData.f_getVal(this.m_sColNameId, a_vChildsRegs[0]) )
		}

		var sIMG_EjeNodo, nEjeNodo = ( !vIdParent )? 5 : 4;	// Primer Nodo o Nodo Normal
		for ( var f=0, F=a_vChildsRegs.length; f<F; f++ ) {
			nReg	= a_vChildsRegs[f];
			vId	  	= this.m_maData.f_getVal(this.m_sColNameId	 , nReg);
			//sTitle	= this.m_maData.f_getVal(this.m_sColNameTitle, nReg);
//			sFunc 	= this.m_maData.f_getVal("sFunc" , nReg);
			bFile 	= this.m_maData.f_getVal(this.m_sColNameIsFile , nReg);

			if (f+1==F) {	nEjeNodo = 6; // Ultimo Nodo
				bLastNode = 1;
			}
			else bLastNode = 0;

			sIMG_EjeNodo = this.f_getConfig("sImgFullPath")+this.m_a_sTreeIMGs[nEjeNodo];
			a_sHTML.push( this.f_drawNode( vId, bFile, a_nParents, bLastNode, sIMG_EjeNodo, nReg)  );
		}

		a_sHTML.push("</TABLE>");

		return ( a_sHTML.join("") );
	}

	this.f_printLevel0 = function (){
		this.m_oObj.innerHTML = this.f_drawChilds("");
	}

	this.f_draw = function  () { return "<TABLE cellpadding=0 cellspacing=0 border=0><TR><TD id='"+this.m_sObj+"_Level0' ></TD></TR></TABLE>"; }
	this.f_print = function () { document.write( this.f_draw() ); }


	//
	// Cache para IE hasta que funcione correctamente el display
	this.m_maCache = new MArray([this.m_sColNameIdParent, "sHTML"], []);
	this.f_saveCache = function ( vIdParent, sHTML ) {
		var nReg = this.m_maCache.f_getReg(this.m_sColNameIdParent, vIdParent);
		if ( nReg==-1 ) {
			this.m_maCache.f_addRow([vIdParent, sHTML]);
		}
		else {
			this.m_maCache.f_setVal("sHTML", sHTML, nReg);
		}
//alert("[this.f_saveCache]\n"+this.m_sColNameIdParent+"\n"+this.m_maCache.f_debug())		
	}
	this.f_getCache = function ( vIdParent ) {
		var sReturn = "";
		var nReg = this.m_maCache.f_getReg(this.m_sColNameIdParent, vIdParent);
		if ( nReg!=-1 ) sReturn = this.m_maCache.f_getVal("sHTML", nReg);
//alert("[this.f_getCache]"+this.m_sColNameIdParent+"="+vIdParent+"\n"+nReg)		
		return sReturn;
	}

	this.f_treeAction = function (vIdParent, bReLoad, f_func) {
		var sLoadingMSG = "(loading)";
		var oObj   = GetElement( this.m_sFolderId+vIdParent );
		var oInner = GetElement( oObj.id+"_Inner" );
		var oIMG   = GetElement( oObj.id+"_Img").childNodes[0];
		if ( oObj.getAttribute("m_bFolder")==1 && oObj.getAttribute("m_nChilds")>0 ) {
			if ( !bReLoad && oObj.getAttribute("m_bOpened")==1 ) {
				oObj.setAttribute("m_bOpened", 0);
				this.f_setNodeClosed(oIMG);
				if ( oIGZ.m_bIE ) {
					oObj.m_oChild.childNodes[0].innerHTML = "";
				}
				oObj.m_oChild.style.display = "none";
				//if (f_func) f_func();
			}
			else {
				oObj.setAttribute("m_bOpened", 1);
				this.f_setNodeOpened(oIMG);
				if ( oObj.m_oChild ) {
					oObj.m_oChild.style.display = "";
					if ( oIGZ.m_bIE ) {
						oObj.m_oChild.childNodes[0].innerHTML = this.f_getCache(vIdParent);
					}
				}
				else {
					bReLoad = 1;
					var nLevel = this.f_subParents( vIdParent ).length+1;
					var oTD		  = document.createElement("TD");
					oTD.setAttribute("colspan", nLevel);
					oTD.colSpan = nLevel;
					oObj.m_oChild = document.createElement("TR");
					oObj.m_oChild.appendChild(oTD);
					oObj.m_oChild.childNodes[0].innerHTML = "";
					oObj.parentNode.insertBefore(oObj.m_oChild, oObj.nextSibling);
				}

				if ( this.bAlwaysReload ) bReLoad = 1;
//alert("Pinta hijos de "+(this.m_sFolderId+vIdParent)+" _ bReLoad["+bReLoad+"]");
				if (bReLoad) {
					oInner.innerHTML += sLoadingMSG;
					var oFolderFileTree = this;
//					setTimeout( function (){
							oObj.m_oChild.childNodes[0].innerHTML = oFolderFileTree.f_drawChilds(vIdParent);
							oInner.innerHTML = String(oInner.innerHTML).f_replace(sLoadingMSG, "");
							if ( oIGZ.m_bIE ) {
								oFolderFileTree.f_saveCache(vIdParent, oObj.m_oChild.childNodes[0].innerHTML);
							}
							if (f_func) f_func();
//						}
//					  , 1
//					);
				}
				else if (f_func) f_func();
			}
		}
		else if (f_func) f_func();
	}

	this.f_setNodeOpened = function (oIMG){
		oIMG.src = this.f_getConfig("sImgFullPath")+this.f_getConfig("sImgFolderOpened");
	}

	this.f_setNodeClosed = function (oIMG){
		oIMG.src = this.f_getConfig("sImgFullPath")+this.f_getConfig("sImgFolderClosed");
	}

	this.f_mouseOver = function (oTD) {
		if ( !this.m_bLock ) {
			if ( this.m_vIdNodeActive != oTD.parentNode.id ) {
				oTD.className = this.f_getConfig("sCssTitleOn");
			}
		}
	}

	this.f_mouseOut = function (oTD) {
		if ( !this.m_bLock ) {
			if ( this.m_vIdNodeActive != oTD.parentNode.id ) {
				oTD.className = this.f_getConfig("sCssTitleOff");
			}
		}
	}

	this.f_mouseSelect = function (oTD) {
		if ( !this.m_bLock ) {
			if ( this.m_vIdNodeActive!=null ){
				var vIdNodeActive = this.m_vIdNodeActive;
				this.m_vIdNodeActive=null;
				var oTD_old = GetElement(vIdNodeActive+"_Inner");
				if ( oTD_old!=null ) {
					this.f_mouseOut( oTD_old );
				}
			}

			if ( oTD!=null ) {
				this.m_vIdNodeActive = oTD.parentNode.id;
				oTD.className = this.f_getConfig("sCssTitleSelected");
			}
		}
	}

	this.f_drawHilo = function (f_call) {
		var sHTML = "";
		if ( this.m_vIdNodeActive && GetElement( this.m_vIdNodeActive )!=null ) {
			var vId = GetElement( this.m_vIdNodeActive ).getAttribute("m_vId");
			var sTitle, sAction;
			var a_ascendencia = this.f_subParents( vId );
			for ( var f=1, F=a_ascendencia.length; f<F; f++ ) {
				nReg	= this.m_maData.f_getReg(this.m_sColNameId, a_ascendencia[f]);
				sTitle  = this.m_maData.f_getVal(this.m_sColNameTitle, nReg);
				sAction = this.m_sObj+".f_actionNode(\""+a_ascendencia[f]+"\",1,1);";
				sHTML += "<A href='javascript:"+sAction+"'>"+sTitle+"</A> "+this.m_sSeparadorHilo+" ";
			}
			sHTML += this.m_maData.f_getValIf(this.m_sColNameId, vId, this.m_sColNameTitle);
		}
		return (sHTML);
	}

	this.f_actionNode = function (vIdParent, bExeFunc, bReload, f_call){
		var a_parents = this.f_subParents(vIdParent);
		a_parents.push(vIdParent);
		this.f_autoUnFold( a_parents, 1, bReload, bExeFunc, f_call);
	}

}
