Fujar.Tree = {
	instance : [],
	prefix : "admin_tree",
	prefixFile : "admin_tree_file",
	_tree : function(){
		me =  this;
		var indice = me.instance.length;
		if(!me.instance[indice]){
			me.instance[indice] = new me.c(me,indice);
		}
		return me.instance[indice];
	},
	// @pobj objeto padre
	// @ci indice de instancia
	// @fname funcion que se ejecuta al cargar el XML
	c : function(pobj,ci,fname){
		var self =  this;
		self._parent = pobj;
		self.xf  = Fujar.Utils._xml;
		self.mainID = "roottree";
		self.sfiles = "no";
		self.searchmode = false;
		self.handler = "../entidad/handler.php";
		self.ficon = _url + "/img/closed.gif";//Icono de cada elemento
		self.ficon_open = _url + "/img/open.gif";//Icono de cada elemento
		self.ficon_file = _url + "/img/page.png";//Icono de cada elemento
		self.xml = null;
		self.indice = ci;
		self.ckboxChecked = {};
		self.sboxname = "fjtree_comp_inst" + self.indice;
		self.selectedNode = null;
		self.prefix =  self.sboxname + "_" +self._parent.prefix;
		self.prefixFile = self.sboxname + "_" +self._parent.prefixFile;
		self.xnodes = []; //Contiene el siguiente nivel de los nodos seleccionados
		self.nodeChilds = [];
		self._onload = function(xml){};//Evento que se ejecuta al dar clic en un nodo
		self._onclick = function(nodo){};
		self._onlink = function(nodo){};
		self._onckbox = function(ck,nodo){};
		self._onclickfile = function(nodo){};
		self._peticion = [];		
		self._sync = function(arbolID,fname){
			var peticion = HTTP._create();
			peticion.url = self.handler;
			peticion.vars += "pg=npath";
			peticion.vars += "&id=" + arbolID;
			peticion.onFinish = function(){
				var str = peticion.response;
				var separa = [];
				if(str.indexOf(",")>-1)separa = str.split(",");
				else separa[0]=str;
				separa = separa.reverse();
				self._moveIdSequence(separa,0,fname);
			}
			peticion._get();
		}
		self._moveIdSequence = function(arreglo,index,fname){
			var nodoID = arreglo[index]; 
			self.read(nodoID,function(xml){
					if(xml.getAttribute("allowed")=="0"){
						document.title = "Acceso denegado";
						if(fname)fname();
					}
					var nIndex = index + 1;
					var li = document.getElementById(self.prefix + nodoID);
					var ulChildren = li.getElementsByTagName("ul");
					if(ulChildren.length > 0){
						for(var j=0;j<ulChildren.length;j++)ulChildren[j].parentNode.removeChild(ulChildren[j]);
					}
					self.nodeChilds[nodoID] = xml;
					self._parse(xml,li);
					self._img(nodoID,self.ficon_open);
					if(nIndex < arreglo.length){
						self._moveIdSequence(arreglo,nIndex,fname);
					}else{
						li.style.display = "none";
						$(li).fadeIn("slow");	
						if(fname)fname();

					}
			});
		};
		self.read = function(padreID,fname){
			if(!padreID)padreID = 0;
			var peticion = HTTP._create();
			peticion.url = self.handler;
			peticion.vars += "pg=listar";
			peticion.vars += "&padreID=" + padreID;
			peticion.vars += "&sfiles=" + self.sfiles;
			peticion.onFinish = function(){
				var node,rootNode;
				//alert(peticion.response);
				node = peticion.responseXML;
				//Obtenemos el documentElement del XML o el elemento raiz
				try{
					if(node.childNodes[0].nodeType == 7) {
						rootNode = node.childNodes[1];
					}else{
						rootNode = node.childNodes[0];
					}
					
					self.xml = rootNode;
					//Ejecutamos la funcion que pasamos como paramentro
					
					fname(rootNode);
					
				}catch(ex){
					//prompt("",ex.description + "---" + index + 	self._peticion[index].url + "?" + self._peticion[index].vars); 
				}
			}
			peticion._get();
			
		};
		//Jalamos los nodos cuyo padreID sea cero
		self.loadMain = function(fname){
			new self.read(0,function(xml){
				self._parse(xml,document.getElementById(self.mainID ));
				self.nodeChilds[0] = xml;
				if(fname)fname(xml);
			});	
		}
		//Busca el li correspondiente para cambiar un titulo
		self._title = function(nodoID,txt){
			var li = document.getElementById(self.prefix + nodoID);
			if(!li)return;
			var a_elems = li.getElementsByTagName("a");
			if(a_elems.length == 0)return;
			a_elems[0].innerHTML = txt;
		}
		self._img = function(nodoID,src){
			var li = document.getElementById(self.prefix + nodoID);
			if(!li)return;
			var img_elems = li.getElementsByTagName("img");
			if(img_elems.length == 0)return;
			var img = img_elems[0];
			img.src = src;
		}
		self._cache = function(xml){
			var items = xml.getElementsByTagName("item");
			for(var i = 0;i<items.length; i++){
				var n = items[i];
				var nodoID = n.getAttribute("arbolID");
				self.xnodes[nodoID] = n; // Guardamos cada nodo segun su nodoID
			}
		}
		//Funcion mas importante, parsea el xml y crea los elementos correspondientes para crear arbol
		self._parse = function(xml,obj,css){
			if(xml.getAttribute("allowed")=="0"){
				document.title = "Acceso Denegado";
				return;
			}
			var items = xml.getElementsByTagName("item");
			if(items.length == 0)return;
			var ul = document.createElement("ul");
			for(var i = 0;i<items.length; i++){
				var n = items[i];
				//Verificamos el tipo de nodo que sea uno
				if(n.nodeType == 1){
					//Agrega un li, img y link
					if(n.getAttribute("type")=="folder")
						self._add(n,ul,css);
					else if(n.getAttribute("type")=="file")
						self._addfile(n,ul,css);
				}
			}
			var ulChildren = obj.getElementsByTagName("ul");
			var nhijos = ulChildren.length;
			if(nhijos > 0){
				var childUL = ulChildren[0];
				childUL.parentNode.removeChild(childUL);
			}
			
			ul.style.display = "block";
			obj.appendChild(ul);
		};
		self._refresh = function(nodoID,padre,fname){
			var nodo = self.xnodes[nodoID];
			if(padre){
				nodoID = nodo.getAttribute("padreID");
				nodo = self.xnodes[nodoID];
			}
			if(nodoID == 0){
				self.cleanLi();
				self.loadMain(function(xml){
					if(fname)fname(xml);
				});
				return;
			}
			var nombre = self.xf._subnodevalue(nodo,"nombre");
			var padreID = nodo.getAttribute("padreID");
			var li = document.getElementById( self.prefix + nodoID);
			self.cleanLi(nodoID);
			self.read(nodoID,function(xml){
					self._parse(xml,li);
					self.nodeChilds[nodoID] = xml;
					if(fname)fname(xml);
			});
				
		};
		self.cleanLi = function(nodoID){
			var objID;
			if(!nodoID)objID = self.mainID;
			else objID = self.prefix + nodoID;
			var li = document.getElementById(objID);
			var ulChildren = li.getElementsByTagName("ul");
			var nhijos = ulChildren.length;
			if(nhijos > 0){
				var childUL = ulChildren[0];
				childUL.parentNode.removeChild(childUL);
			}	
		}
		self._each = function(nodo,li){};
        self._add = function(nodo,obj,css){
            var nombre = self.xf._subnodevalue(nodo,"nombre");
			var nodoID = nodo.getAttribute("arbolID");
			self.xnodes[nodoID] = nodo; // Guardamos cada nodo segun su nodoID
            var li = document.createElement("li");
			li.id = self.prefix + nodoID;
            var a = document.createElement("a");
            var img = document.createElement("img");
            //var ruta = self._path(nodo).reverse().join("/");
            a.title = nombre;
            a.href = "#";
            a.innerHTML = "&nbsp; " + nombre;
			img.src = self.ficon;
			li.className = self.cssCarpeta;
			if(css && css!=null && css!="")li.className += " " + css;
			img.onclick = function(){
				self.selectedNode = nodo;
				self._onclick(nodo);
				return false;
			};
			//_onckbox
			strdisplay = (self.searchmode)?"inline":"none";
			var ckbox = document.createElement("span");
			var ckbox_component = document.createElement("input");
			ckbox_component.type = "checkbox";
			ckbox_component.value = nodoID;
			ckbox_component.name = self.sboxname;
			ckbox_component.style.display = strdisplay;
			ckbox_component.checked = false;			
			ckbox_component.defaultChecked = false;
			if(self.ckboxChecked["" + nodoID]){
				ckbox_component.checked = true;
				ckbox_component.setAttribute("checked","checked");				
				ckbox_component.defaultChecked = true;
			}
			ckbox_component.onclick = function(){
				self._onckbox(this,nodo);
			}
			ckbox.appendChild(ckbox_component);
			/*ckbox.innerHTML = "<input type='checkbox' value='"+nodoID+"' name='"+self.sboxname+"' style='display:"+strdisplay+"' />";*/
			

			a.onclick = function(){
				self.selectedNode = nodo;
				self._onlink(nodo);
				return false;
			};
            li.appendChild(img);
			li.appendChild(ckbox);
            li.appendChild(a);
            obj.appendChild(li);
			self._each(nodo,li);
            
        };
		self._changeEditMode = function(istrue){
			self.searchmode	= istrue;
			var obj = document.getElementById(self.mainID );
			var cks = obj.getElementsByTagName("input");
			for(var i=0;i<cks.length;i++){
				if(cks[i].type == "checkbox")
					cks[i].style.display = (istrue)?"inline":"none";
			}
		};
		self._addfile = function(nodo,obj,css){
            var nombre = self.xf._subnodevalue(nodo,"nombre");
			var nodoID = nodo.getAttribute("entidadID");
			self.xnodes[nodoID] = nodo; // Guardamos cada nodo segun su nodoID
            var li = document.createElement("li");
			li.id = self.prefixFile + nodoID;
            var a = document.createElement("a");
            var img = document.createElement("img");
            //var ruta = self._path(nodo).reverse().join("/");
            a.title = nombre;
            a.href = "#";
            a.innerHTML = "&nbsp; " + nombre;
			img.src = self.ficon_file;
			li.className = self.cssCarpeta;
			if(css && css!=null && css!="")li.className += " " + css;
			a.onclick = function(){
				self.selectedNode = nodo;
				self._onclickfile(nodo);
				return false;
			};
            li.appendChild(img);
            li.appendChild(a);
            obj.appendChild(li);
			self._each(nodo,li);            
        };
		self._path = function(nodo,atributo,arreglo){
			var arreglo = self._recursivePath(nodo,atributo,arreglo);
			return arreglo.reverse();
		};
		self._recursivePath = function(nodo,atributo,arreglo){
			var padreID = nodo.getAttribute("padreID");
			var nombre = "";
			if("nombre,descripcion".indexOf(atributo)>-1){
				nombre = self.xf._subnodevalue(nodo,atributo);
			}else{
				nombre = nodo.getAttribute(atributo);
			}
			
			arreglo[arreglo.length] = nombre;
			if(padreID != 0 && padreID != "0"){
				var nodoPadre = self.xnodes[padreID];
				self._recursivePath(nodoPadre,atributo,arreglo);
			}
            return arreglo;  
        };
		self.strPath = function(nodo,sep){
			if(!sep)sep = ",";
			//return self._path(nodo).reverse().join(sep);
		};
		self._delete = function(arbolID,fname){
			var peticion = new Fujar.MyServer();
			peticion.url = self.handler;
			peticion.vars += "pg=accion";
			peticion.vars += "&accion=3";
			peticion.vars += "&nodos=" + escape(arbolID);
			peticion.onFinish = function(){
				if(fname){
					fname(peticion.response);	
				}
			}
			peticion._post();
			
		};
		self._accion = function(vars,fname){
			var peticion = new Fujar.MyServer();
			peticion.url = self.handler;
			peticion.vars += "pg=accion";
			peticion.vars += "&accion=" + vars["accion"];
			peticion.vars += "&nodoID=" + vars["nodoID"];
			peticion.vars += "&ispublic=" + vars["ispublic"];
			peticion.vars += "&isvisible=" + vars["isvisible"];
			peticion.vars += "&nombre=" + escape(vars["nombre"]);
			peticion.vars += "&descripcion=" + escape(vars["descripcion"]);
			peticion.vars += "&imagen=" + escape(vars["imagen"]);
			//alert(peticion.vars);
			peticion.onFinish = function(){
				alert(peticion.response);
				if(fname){
					fname(peticion.response);	
				}
			}
			peticion._post();
		}
	}
}

var HTTP = {
	instances : [],
	_create : function(){
		var _this = this;
		var instanceIndex = _this.instances.length;
		_this.instances[instanceIndex] = new _this._r(instanceIndex,_this);
		return _this.instances[instanceIndex];
	},
	_r : function(pindex,parentObject){
		var me = this;
		me.indice = pindex;
		me._parent = parentObject;
		me.http = new Array();
		me._nocache = true;
		me.status = null;
		me.onFinish = function(){};
		me.onStatus = function(n){};
		me.oVars = [];
		me.response = null;
		me.responseXML = null;
		me.url = "";
		me.vars = "";
		me.createRequestObject = function(){
			try { return new XMLHttpRequest(); } catch(e) {}
			try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) {}
			try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {}
			return null;	
		}
		me._send = function(_ispost){
			var n = me.http.length;
			me.http[n] = me.createRequestObject();
			if(me.oVars.length > 0)
				me.vars = me.StrVars();
			var strQry = me.url + "?" + me.vars;
			(_ispost)? me.http[n].open('POST', me.url,true) : me.http[n].open('GET', strQry);
			me.http[n].onreadystatechange = function()
			{
				if(me.http[n].readyState == 4){				
						me.status = me.http[n].status;
						me.onStatus(me.status);
						if (me.http[n].status == 200 || me.http[n] == 304){
							me.response = me.http[n].responseText;
							me.responseXML = me.http[n].responseXML;
							me.onFinish();
						}
				}
			}
			if(_ispost){
				me.http[n].setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
				me.http[n].setRequestHeader("Content-length", me.vars.length);
				me.http[n].setRequestHeader("Connection", "close");
				me.http[n].send(me.vars);
			}else{
				me.http[n].send(null);	
			}
		};
		me._post = function(){
			me._send(true);
		};
		me._get = function(){
			me._send(false);
		};
		me._add = function(name,value){
			var varsIndex = me.oVars.length;
			me.oVars[varsIndex] = encodeURIComponent(name) + "=" + encodeURIComponent(value);
		};
		me.StrVars = function(){
			if(me._nocache)me._add("ncacherand",Math.random());
			return me.oVars.join("&");
		}
	}
}
