// JavaScript Document

/*
	El funcionamiento del menú se basa en estilos css: 
	por Jquery únicamente anadimos y eliminamos el class 'desplegado'
	de las listas anidadas (ver css/javascript.css).
*/
function ADImenu(lista){
	/*************************************************************************/
	// propiedades públicas
	/*************************************************************************/
	
	/*************************************************************************/
	// propiedades privadas
	/*************************************************************************/
	var classActivo      =     	"active";
	var classDesplegado  = 	"desplegado";
	var classEvitarFoco  = 	"evitarFoco";
	var classEvitarClick = "evitarClick";
	var classCurrent     =     "current";
	var classParent      =     	"parent";
	var lista = lista;
	var items = lista.find("li");
	/*************************************************************************/
	// métodos privados
	/*************************************************************************/
	
	/*
		Obtener la última parte de la url (la parte tras la última barra)
	*/
	var getCurrentFile = function(){
		var tmpUrl = window.location.href;
		var tmpUrl2array = tmpUrl.split("/");
		return tmpUrl2array[tmpUrl2array.length - 1].toString();
	}

	var replegarOtros = function(item){

		items.map(function(index){
			if($(this).hasClass(classActivo) == false){
				$(this).find("ul").removeClass(classDesplegado);
				$(this).find("li").removeClass(classDesplegado);
				$(this).removeClass(classDesplegado);
			}
		});
		
		item.parents("li").children("ul").addClass(classDesplegado);
		item.parents("li").addClass(classDesplegado);
	}
	
	function actualizar(item){
		
		// evitamos ocultar la parte del menú que representa la ruta de la página que visitamos 
		
		if(item.hasClass(classActivo)){
			return;
		}
		
		/*
			Anadimos y eliminamos el class 'desplegado'
			de las listas anidadas (ver css/javascript.css).
		*/
		
		var tmpLiUl = item.children("ul");
		
		if(tmpLiUl.html() != null){
		
			if(item.hasClass(classDesplegado)){
				tmpLiUl.removeClass(classDesplegado);
				item.removeClass(classDesplegado);
			}else{
				//replegarOtros(item);
				tmpLiUl.addClass(classDesplegado);
				item.addClass(classDesplegado);
			}
		}else{
			//replegarOtros(item);
		}
		
	}
	
	/*
		Buscar en un comentario inferior el orden en que se disparan los eventos
	*/
	
	function onMouseDown(event){
		$(this).addClass(classEvitarFoco);
		actualizar($(this));
		// para evitar que se siga propagando el evento desde el li origen hacia sus li ancestros
		event.stopPropagation();
	}
	
	function onKeyPress(event){
		// si clicamos intro
		if(event.which == 13){
			$(this).addClass(classEvitarClick);
		}
	}
	
	function onFocus(event){
		
		var tmpLi = $(this).parent();
		
		if(tmpLi.hasClass(classEvitarFoco)){
			tmpLi.removeClass(classEvitarFoco);
		}else{
			actualizar(tmpLi);
		}
	}
	/*
		Cuando navegamos con el ratón, al clicar sobre las opciones que contienen subopciones
		desplegamos el menú pero evitamos que se cargue una nueva página.
		
		Cuando navegamos con el teclado sí permitimos cargar dichas páginas.
	*/
	function onClick(event){
		var tmpLi = $(this).parent();
		var tmpLiUl = tmpLi.children("ul");
		
		if(tmpLiUl.html() != null){
			if(tmpLi.hasClass(classEvitarClick) == false){
				event.preventDefault();
			}else{
				tmpLi.removeClass(classEvitarClick);
			}
		}
	}
	
	/*************************************************************************/
	// métodos públicos
	/*************************************************************************/
	
	this.display = function(){
		
		// abrir el menú por la opción que estamos visitando
		
		var tmpA = lista.find("li#current").children("a");
		
		if(tmpA.html() == null){
			tmpA = lista.find('a[href="' + getCurrentFile() + '"]');
		}
		
		tmpA.parents("li").map(function(index){
			if(index == 0){
				if($(this).hasClass(classCurrent) == false){
					$(this).addClass(classCurrent);
				}
				
				// únicamente cuando navegamos con el teclado
				// podemos visitar la página de las opciones que contienen subopciones
				// en tal caso desplegamos el subnivel inmediato
				
				var tmpLiUl = $(this).children("ul");
				
				if(tmpLiUl.html() != null){
					tmpLiUl.addClass(classDesplegado);
				}
				
			}else{
				if($(this).hasClass(classActivo) == false){
					$(this).addClass(classActivo);
				}
				$(this).addClass(classDesplegado);
				$(this).children("ul").addClass(classDesplegado);
			}
		});
		
		items.map(function(index){
		
			var tmpLiUl = $(this).children("ul");
			
			// anadir un class parent a todos los li que contengan una lista anidada
			
			if(tmpLiUl.html() != null){
				if($(this).hasClass(classParent) == false){
					$(this).addClass(classParent);
				}
			}
			
			/*
				El orden en que se disparan los eventos es:
				
				- Al hacer click izquierdo:
						. mousedown
						. focus
						. click
				
				- Al pulsar intro:
						. keypress
						. click
						
				- Al usar el tabulador para navegar entre las opciones del menú:
						. focus
				
			*/
			
			$(this).unbind("mousedown",onMouseDown);
			$(this).bind("mousedown",onMouseDown);
			
			$(this).unbind("keypress",onKeyPress);
			$(this).bind("keypress",onKeyPress);
			
			$(this).children("a").unbind("focus",onFocus);
			$(this).children("a").bind("focus",onFocus);
			
			$(this).children("a").unbind("click",onClick);
			$(this).children("a").bind("click",onClick);
			
		});
		
		$("#enlace_anterior, #enlace_posterior").focus(function(){
			items.map(function(index){
				if($(this).hasClass(classDesplegado) == true && $(this).hasClass(classActivo) == false){
					$(this).removeClass(classDesplegado);
					$(this).children("ul").removeClass(classDesplegado);
				}
			});
		});
		
	}
}