/**
 * Objeto nodo del árbol de ayuda. Un nodo tiene un texto,
 * que es la etiqueta que se muestra, una página, que es la url de la página
 * que se cargará al pulsar el enlace y un array de nodos hijo.
 */
function nodo(texto, pagina, contenedor, ayuda) {
	
	// ATRIBUTOS --------------------------------------------------------------
	
	this.claveTexto = texto; // clave del texto del nodo de ayuda
	this.pagina = pagina; // Url de la página de ayuda de este nodo
	this.hijos = new Array(); // Array vacio con los nodos hijos (en caso de existir)
	this.ayuda = ayuda;
	this.padre = null;
	this.el = null;
	this.abierto = false;
	
	// Añadimos el nodo al contenedor
	if (this.claveTexto) {
		this.el = Ext.DomHelper.append(contenedor, {tag: 'div', cls: 'nodoAyudaPadre', id: this.claveTexto}, true);
		Ext.DomHelper.append(this.el, localize(this.claveTexto));
		
		var este = this; // para no tener que cambiar el scope de los manejadores de ext
		// Añadimos su manejador
		this.el.on('click', function(){
				ayuda.activar(este);
			}); 
	} else {
		this.el = Ext.DomHelper.append(contenedor, {tag: 'div', cls: 'separadorAyuda'}, true);
		Ext.DomHelper.append(this.el, " ");
	}
	
	// MÉTODOS ----------------------------------------------------------------
	/**
	 * Añade un nodo hijo a este nodo de ayuda
	 */	
	this.addNodo = function(nodo) {
		this.hijos[this.hijos.length] = nodo;
		nodo.setPadre(this);
		nodo.el.setHeight(0, false);
	}
	
	/**
	 * Establece el padre de este nodo 
	 */	
	this.setPadre = function(nodo) {
		this.padre = nodo;
		this.setClase('nodoAyudaHijo');
	}
	
	/**
	 * Establece la clase del objeto 
	 */	
	this.setClase = function(clase) {
		this.el.removeClass('nodoAyudaPadre');
		this.el.removeClass('nodoAyudaPadreExpandido');
		this.el.removeClass('nodoAyudaHijo');
		this.el.removeClass('nodoAyudaPadreActivo');
		this.el.removeClass('nodoAyudaPadreActivoColapsado');
		this.el.removeClass('nodoAyudaHijoActivo');
		
		this.el.addClass(clase);
	}
	
	/**
	 * Establece la clase del objeto 
	 */	
	this.esPadre = function() {
		return (this.hijos.length > 0);
	}
	
	/**
	 * Establece la clase del objeto 
	 */	
	this.esSeparador = function() {
		return (!this.claveTexto);
	}
	
	/**
	 * Desactiva un menú 
	 */	
	this.desactivar = function() {
		// Si es padre
		if (this.esPadre()) {
			this.setClase('nodoAyudaPadre');
			this.desactivarHijos();
		} else {
			if (this.padre) {
				this.setClase('nodoAyudaHijo');
			} else {
				this.setClase('nodoAyudaPadre');
			}
		}
	}
	
	/**
	 * Desactiva un menú 
	 */	
	this.desactivarHijos = function() {
		for (var i = 0; i < this.hijos.length; i++) {
			this.hijos[i].setClase('nodoAyudaHijo');
		}
	}
	
	/**
	 * Activa un menú 
	 */	
	this.activar = function() {
		// Cargamos la página
		if (this.pagina != '#')
			this.ayuda.cargar(this.pagina);
		if (this.abierto) { 
			this.colapsar();	
			this.ayuda.desactivarMenus();
			this.setClase('nodoAyudaPadreActivoColapsado');
		}
		else {
			// Si es padre
			if (this.esPadre()) {
				this.abierto = true; // Para evitar que por doble-click se pierda el estado
				// Si hay que desactivar los menus hermanos
				if (!this.padre) {
					this.ayuda.desactivarMenus();
				}
				// Cambiamos la clase
				this.setClase('nodoAyudaPadreActivo');
				// Expandimos el nodo
				this.expandir();
			} else {
				// Desactivamos los hermanos
				if (this.padre) {
					this.ayuda.desactivarMenus();
					this.padre.desactivarHijos();
					this.padre.setClase('nodoAyudaPadreActivo');
					// Activamos el menu y lo mostramos
					this.setClase('nodoAyudaHijoActivo');
				}
				else {
					this.ayuda.desactivarMenus();
					// Activamos el menu y lo mostramos
					this.setClase('nodoAyudaPadreActivo');
				};
			}
		}
	}
	
	this.mostrarHijos = function() {
		for (var i = 0; i < this.hijos.length; i++) {
			this.hijos[i].mostrar();
		}
	}
	
	this.expandir = function() {
		for (var i = 0; i < this.hijos.length; i++) {
			this.hijos[i].mostrar();
		}
		this.abierto = true;
	}
	
	this.colapsar = function() {
		for (var i = 0; i < this.hijos.length; i++) {
			this.hijos[i].el.setHeight(0);
		}
		this.abierto = false;
	}
	
	this.mostrar = function() { 
		this.el.autoHeight(true);
	}
}
