// Automatically attach a listener to the window onload, to convert the trees
var m_changeTab = false;
var m_obj_menu = null;
var m_obj_submenu = null;

addEvent(window,"load",convertTrees);

// Utility function to add an event listener
function addEvent(o,e,f){
	if (o.addEventListener){ o.addEventListener(e,f,true); return true; }
	else if (o.attachEvent){ return o.attachEvent("on"+e,f); }
	else { return false; }
}

// utility function to set a global variable if it is not already set
function setDefault(name,val) {
	if (typeof(window[name])=="undefined" || window[name]==null) {
		window[name]=val;
	}
}

// Full expands a tree with a given ID
function expandTree(treeId) {
	var ul = document.getElementById(treeId);
	if (ul == null) { return false; }
	expandCollapseList(ul,nodeOpenClass);
}

// Fully collapses a tree with a given ID
function collapseTree(treeId) {
	var ul = document.getElementById(treeId);
	if (ul == null) { return false; }
	expandCollapseList(ul,nodeClosedClass);
}

// Expands enough nodes to expose an LI with a given ID
function expandToItem(treeId,itemId) {
	var ul = document.getElementById(treeId);
	if (ul == null) { return false; }
	var ret = expandCollapseList(ul,nodeOpenClass,itemId);
	if (ret) {
		var o = document.getElementById(itemId);
		if (o.scrollIntoView) {
			o.scrollIntoView(false);
		}
	}
}

// Performs 3 functions:
// a) Expand all nodes
// b) Collapse all nodes
// c) Expand all nodes to reach a certain ID
function expandCollapseList(ul,cName,itemId) {
	if (!ul.childNodes || ul.childNodes.length==0) { return false; }
	// Iterate LIs
	for (var itemi=0;itemi<ul.childNodes.length;itemi++) {
		var item = ul.childNodes[itemi];
		if (itemId!=null && item.id==itemId) {
			//Ed orig return true;
			//reemplazado para que a su vez expanda si corresponde el nodo hasta el cual se llega
			//esto es debido a que nodeClosedClass es una constante
			eval ("var rExp = /" + nodeClosedClass + "/g;");
			item.className=item.className.replace(rExp, nodeOpenClass); return true;
		}
		if (item.nodeName == "LI") {
			// Iterate things in this LI
			var subLists = false;
			for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) {
				var sitem = item.childNodes[sitemi];
				if (sitem.nodeName=="UL") {
					subLists = true;
					var ret = expandCollapseList(sitem,cName,itemId);
					if (itemId!=null && ret) {
						/*Ed orig
						item.className= cName;*/
						//reemplazo por esto
						aNodeClasses = item.className.split(' ');
						if ( (aNodeClasses[0]==nodeOpenClass) || (aNodeClasses[0]==nodeClosedClass))
							item.className= cName;
						else
							item.className= aNodeClasses[0] + ' ' + cName;
						return true;
					}
				}
			}
			if (subLists && itemId==null) {
				alert(item.className + ' = ' + cName);
				item.className = cName;
			}
		}
	}
}

// Search the document for UL elements with the correct CLASS name, then process them
function convertTrees() {
	setDefault("treeClass","mktree");
	setDefault("nodeClosedClass","liClosed");
	setDefault("nodeOpenClass","liOpen");
	setDefault("nodeBulletClass","liBullet");
	setDefault("nodeLinkClass","bullet");
	setDefault("preProcessTrees",true);
	setDefault("nodeLinkExtClass","liLink");
	if (preProcessTrees) {
		if (!document.createElement) { return; } // Without createElement, we can't do anything
		uls = document.getElementsByTagName("ul");
		for (var uli=0;uli<uls.length;uli++) {
			var ul=uls[uli];
			if (ul.nodeName=="UL" && ul.className==treeClass) {
				processList(ul);
			}
		}
	}
if (document.getElementById('treeExpandTo')!=null)
 	expandToItem('tree',document.getElementById('treeExpandTo').value);
}

// Process a UL tag and all its children, to convert to a tree
function processList(ul) {
	if (!ul.childNodes || ul.childNodes.length==0) { return; }
	// Iterate LIs
	for (var itemi=0;itemi<ul.childNodes.length;itemi++) {
		var item = ul.childNodes[itemi];
		if (item.nodeName == "LI") {
			// Iterate things in this LI
			var subLists = false;
			for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) {
				var sitem = item.childNodes[sitemi];
				if (sitem.nodeName=="UL") {
					subLists = true;
					processList(sitem);
				}
			}
			var s= document.createElement("SPAN");
			var t= '\u00A0'; // &nbsp;
			s.className = nodeLinkClass;
			if (subLists) {
				// This LI has UL's in it, so it's a +/- node
				/*ED orig if (item.className==null || item.className=="") {
					item.className = nodeClosedClass;
				}*/
				//reemplazado por esto
				item.className = item.className + ' ' + nodeClosedClass;

				// If it's just text, make the text work as the link also
				if (item.firstChild.nodeName=="#text") {
					t = t+item.firstChild.nodeValue;
					item.removeChild(item.firstChild);
				}
				s.onclick = function () {
					/*ED orig
					this.parentNode.className = (this.parentNode.className==nodeOpenClass) ? nodeClosedClass : nodeOpenClass;
					*/
					//reemplazado por esto
					aNodeClasses = this.parentNode.className.split(' ');
					if ( (aNodeClasses[0]==nodeOpenClass) || (aNodeClasses[0]==nodeClosedClass))
						this.parentNode.className = (this.parentNode.className==nodeOpenClass) ? nodeClosedClass : nodeOpenClass;
					else{
						aNodeClasses[1] = (aNodeClasses[1]==nodeOpenClass) ? nodeClosedClass : nodeOpenClass;
						this.parentNode.className = aNodeClasses[0] + ' ' + aNodeClasses[1];
					}

					return false;
				}
			}
			else {
				// No sublists, so it's just a bullet node
				/*ED orig item.className = nodeBulletClass; */
				//reemplazado por esto
				if (item.link != undefined) {
					item.className = item.className + ' ' + nodeLinkExtClass;
				} else {
					item.className = item.className + ' ' + nodeBulletClass;
				}

				s.onclick = function () { return false; }
			}
			s.appendChild(document.createTextNode(t));
			item.insertBefore(s,item.firstChild);
		}
	}
}

function activateTab(element,id_nodo,desc_nodo){
	var oUl = element.parentNode;
	for(var i = 0; i < oUl.childNodes.length; i++) {
		if (oUl.childNodes[i].className == "activo" && oUl.childNodes[i].id != element.id) {
			oUl.childNodes[i].className = "";
			break;
		}
	}
	//Cambio el estado a activo
	element.className = "activo";
	m_changeTab = false;
	if(destacados_change){
		destacados_change(id_nodo, desc_nodo);
	}
	if(recargarCintaDestacadosNuevoNodo){
		recargarCintaDestacadosNuevoNodo(id_nodo, desc_nodo);
	}
	if(recargarCintaListVideo){
		recargarCintaListVideo(id_nodo, desc_nodo);
	}
}

function nav_onmouseover(element) {
	m_changeTab = !(element.className == "activo");
	if (m_changeTab) {
		element.className = "activo";
	}
}

function nav_onmouseout(element) {
	if (m_changeTab) {
		element.className = "";
	}
}

/**
 * Funcion ejecutada por cada click que se hace en un arbol de tipo MENU
 *
 * @param	object	oParentElement	Objeto padre que contiene la opcion de menu
 * @param	number	nIdNodo			ID de nodo
 * @param	string	sNombreNodo		Nombre del nodo
 * @param	string	sUrl			URL que se debe llamar
 * @param	string	sFrame			Frame en donde se deben cargar las app's
 */
function menuOnClick(oElement,nIdNodo,sNombreNodo,sUrl ,sFrame) {

//-----------------
//se debe de utilizar getAttribute (ej getAttribute('subitems'))  para llamar a las propiedades creadas
//y se debe de  debe de utilizar setAttribute (ej setAttribute('subitems',0))  para setear las propiedades creadas
// así funciona en firefox safary y explorer
//soluciona problema firefox para innerText
//-----------------
if(!oElement.innerText && oElement.text)
{ oElement.innerText =oElement.text;}

	var oTr = oElement.parentNode.parentNode;

	for(var i = 0; i < oTr.cells.length; i++) {
		var oA = oTr.cells[i].childNodes[0];
		if (oA.className == "activo" && oA.id_nodo != nIdNodo) {
			oA.className = "";
			break;
		}
	}
	//Cambio el estado
	oElement.className = "activo";
	m_changeTab = false;
	//Verifico si debo obtener los subitems
	//FWK.debug = true;
	if (oElement.getAttribute('subitems') > 0 && oElement.getAttribute('isroot') == 1) {
		//Cambio la cabecera del padre solamente
		
		setCabecera(oElement.innerText);
		//Borro el submenu
		var oSubMenu = document.getElementById("submenu");
		oSubMenu.innerHTML = "";
		FWK.loadApiInto("submenu","tree|tree|tree|principal","a","&id_parent="+nIdNodo);
		//Si la cabecera esta oculta, la muestro
		if (oSubMenu.style.display == "none") {
			oSubMenu.style.display = "block";
		}
	} else {
		if (oElement.getAttribute('isroot') != 1) {
			//Cambio la cabecera del padre e hijo (primero debo obtener el parent activo
			var oMenu = document.getElementById("tbl_menu");
			var oTr = oMenu.rows[0];
			var sParent = "";
			var oParent;
			for (var i = 0; i < oTr.cells.length; i++) {
				var oA = oTr.cells[i].childNodes[0];
				if (oA.className == "activo") {
					sParent = oA.innerText;
					oParent = oA;
					break;
				}

			}
			setCabecera(sParent,oElement.innerText,oParent,oElement);
		} else {
			//no tiene hijos pero es MENU, asi que debo ocultar la barra de submenu
			document.getElementById("submenu").style.display = "none";
			//Seteo la cabecera
			setCabecera(oElement.innerText,null,oElement);
		}
	}
	//Disparo la url
	raiseUrlMenu(sUrl,sFrame,nIdNodo,sNombreNodo);
}

/**
 * Parece que estuviera haciendo un click, hace todo pero no dispara
 * ningun cambio (CREADA POR GOOSE! PARA FWK_IRENDER >> TEMPORAL PERPETUA)
 *
 * @param	object	oParentElement	Objeto padre que contiene la opcion de menu
 * @param	number	nIdNodo			ID de nodo
 * @param	string	sNombreNodo		Nombre del nodo
 * @param	string	sUrl			URL que se debe llamar
 * @param	string	sFrame			Frame en donde se deben cargar las app's
 */
function menuFakeOnClick(oElement,nIdNodo,sNombreNodo,sUrl ,sFrame) {
	var oTr = oElement.parentNode.parentNode;

	for(var i = 0; i < oTr.cells.length; i++) {
		var oA = oTr.cells[i].childNodes[0];
		if (oA.className == "activo" && oA.id_nodo != nIdNodo) {
			oA.className = "";
			break;
		}
	}
	//Cambio el estado
	oElement.className = "activo";
	m_changeTab = false;
	//Verifico si debo obtener los subitems
	//FWK.debug = true;
	if (oElement.subitems > 0 && oElement.isroot == 1) {
		//Cambio la cabecera del padre solamente
		setCabecera(oElement.innerText);
		//Borro el submenu
		var oSubMenu = document.getElementById("submenu");
		oSubMenu.innerHTML = "";
		FWK.loadApiInto("submenu","tree|tree|tree|principal","a","&id_parent="+nIdNodo);
		//Si la cabecera esta oculta, la muestro
		if (oSubMenu.style.display == "none") {
			oSubMenu.style.display = "block";
		}
	} else {
		if (oElement.isroot != 1) {
			//Cambio la cabecera del padre e hijo (primero debo obtener el parent activo
			var oMenu = document.getElementById("tbl_menu");
			var oTr = oMenu.rows[0];
			var sParent = "";
			var oParent;
			for (var i = 0; i < oTr.cells.length; i++) {
				var oA = oTr.cells[i].childNodes[0];
				if (oA.className == "activo") {
					sParent = oA.innerText;
					oParent = oA;
					break;
				}

			}
			setCabecera(sParent,oElement.innerText,oParent,oElement);
		} else {
			//no tiene hijos pero es MENU, asi que debo ocultar la barra de submenu
			document.getElementById("submenu").style.display = "none";
			//Seteo la cabecera
			setCabecera(oElement.innerText,null,oElement);
		}
	}
	//Disparo la url
	//raiseUrlMenu(sUrl,sFrame,nIdNodo,sNombreNodo);
}

/**
 * funtion raiseUrlMenu
 *
 * Dispara la url correspondiente al menu o submenu seleccionado
 *
 * @param	string	sUrl	URL que se debe llamar
 * @param	string	sFrame	FRAME que se debe ejecutar
 */
function raiseUrlMenu(sUrl,sFrame,nIdNodo,sNombreNodo) {
	if (sUrl != "") {
		document.location=unescape(sUrl); //javascript:
	} else {
		if (sFrame != "") {
			FWK.loadFrameInto("content",sFrame,"&FWK[id_nodo]="+nIdNodo+"&FWK[nombre_nodo]="+sNombreNodo);
		}
	}
}

function Cinta(cinta,itemWidth,itemTotal,step,callback)
{
	//-[propiedades]------------------------------------------------------------
	this.laCinta=document.getElementById(cinta);
	//alert("Scroll Width: " + this.laCinta.scrollWidth);
	//alert("Constructor (" + cinta + "): " + this.laCinta);
	this.nombreBotones=cinta;
	this.item=1; //item actual
	this.items=parseInt((itemTotal)?itemTotal:0); //cantidad de paginas
	this.itemWidth=parseInt((itemWidth)?itemWidth:100); //ancho a contar por item.
	this.step=parseInt((step)?step:1);
	this.pasos=100; //cantidad de intermedios de los saltos.
	//-[metodos]------------------------------------------------------------
	this.jumpToPixel = function(pixel)
	{
		//this.laCinta.scrollLeft=pixel;
		var p1 = parseInt(this.laCinta.scrollLeft);
		var p2 = parseInt(pixel);
		var paso = 0.5/this.pasos; //delta PI
		for(t=1.5; t<=2; t+=paso) //subo por cuarto cuadrante
			this.laCinta.scrollLeft=p1+(p2-p1)*Math.cos(t*Math.PI);
	}
	this.jumpToItem = function(itemNro) { this.jumpToPixel((itemNro-1)*this.itemWidth); this.item=itemNro; this.manageButtons(); }
	this.jumpTo = function(pageNro) { this.jumpToPixel((this.step*this.itemWidth)*(pageNro-1)); this.item=this.step*(pageNro-1)+1;  this.manageButtons();}
	this.jumpNext = function() { if(!this.eof()) this.jumpToItem(this.item+this.step); else if(callback!=null) {eval("oCallback = " + callback); oCallback("eof");} }
	this.jumpPrevius = function() { if(!this.bof()) this.jumpToItem(this.item-this.step); else if(callback!=null) {eval("oCallback = " + callback); oCallback("bof");} }
	//this.eof = function() {return( (this.item+this.step)>(this.items) );}
	this.eof = function()
	{
		//ant=document.getElementById(this.nombreBotones+"_anterior");
		//return (this.laCinta.clientWidth + this.laCinta.scrollLeft + ant.clientWidth == this.laCinta.scrollWidth);
		return (this.laCinta.clientWidth + this.laCinta.scrollLeft > (this.laCinta.scrollWidth - 10));
	}
	//this.bof = function() { return(this.item-this.step<=0); }
	this.bof = function() {return (this.laCinta.scrollLeft == 0);}
	this.manageButtons = function()
	{
		ant=document.getElementById(this.nombreBotones+"_anterior");
		sig=document.getElementById(this.nombreBotones+"_siguiente");
		if(this.bof())  {
			ant.style.display = "none";
		} else {
			ant.style.display = "block";
		}
		if(this.eof())	{
			sig.style.display = "none"
		} else {
			sig.style.display = "block"
		}
	}
}
