$(function(){
				
	/**
	 * Plugin jQuery utilizado em estruturas de categoria em formato de arvore
	 * (hierarquica).
	 * 
	 * Para utiliza-la é necessário uma estrutura HTML onde os ítens da categoria
	 * são formados por uma lista ordernada (UL LI) contidos em uma DIV. Cada 
	 * elemento da lista (LI), deve conter um atributo REL contendo um valor
	 * ÚNICO, ou seja, o valor não deve se repetir nas demais categorias.
	 * 
	 * Ex:
	 * 
	 * <div id='menu'>
	 * 		<ul>
	 * 			<li rel="1">
	 * 				Carros
	 * 			</li>
	 * 			<li rel="2">
	 * 				Motos
	 * 				<ul>
	 * 					<li rel="3">
	 * 						Honda
	 * 					</li>
	 * 					<li rel="4">
	 * 						Dafra
	 * 					</li>
	 * 				</ul>
	 * 			</li>
	 * 		</ul>
	 * </div>
	 * 
	 * Chamada jQuery:
	 * $('#menu').treeCategory();
	 * 
	 * @author Andre Casertano (andre@internetbrasil.com.br)
	 */
	jQuery.fn.treeCategory = function(settings){
		
		// Variáveis de configuração.
		var opt = {
			currentNews:0,
			currentCategory:0,
			slideSpeed:500	
		}
		
		// Estende a array de configurações.
		jQuery.extend(opt, settings);
		
		/**
		 * Guarda a referência para o nível.
		 */
		var currentLevel;
		
		/**
		 * Guarda a referência da categoria.
		 */
		var currentCategory;
		
		/**
		 * Guarda a referência idTree.
		 */
		var currentRel;
		
		/**
		 * Faz a comparação dos níveis de categoria, referente
		 * a categoria selecionada, para que os mesmos sejam
		 * fechados.
		 * 
		 * @private
		 */
		function verifyCategory(li, level, rel) {
			
			if((currentLevel) && (currentLevel == level) && (currentRel != rel)) {
				
				// Recupera o número de parentes que o ítem selecionado possui.
				var parents = $(currentCategory).parents("ul").length;
				
				// Esconde as categorias de acordo com o nível da categoria
				// selecionada.
				switch(parents) {
					case 1:
						
						$("ul:first", currentCategory).slideUp(opt.slideSpeed);
						break;
					
					case 2:
						
						if(parents != currentLevel){
							$("ul:first", currentCategory).slideUp(opt.slideSpeed);
							$(currentCategory).parents("ul").eq(0).slideUp(opt.slideSpeed);	
						} else if(parents == currentLevel) {
							$("ul:first", currentCategory).slideUp(opt.slideSpeed);
						}	
						break;
					
					default:
						
						var totalClose = parents - level - 1;
						
						for(var i=0; i <= totalClose; i++) {
							$(currentCategory).parents("ul").eq(i).slideUp(opt.slideSpeed);
						}
						
						// Fecha a categoria atual.
						$("ul:first", currentCategory).slideUp(opt.slideSpeed);
						break;
				}
				
			} else if((currentLevel) && (currentLevel > level) && (currentRel != rel)) {
				
				// Recupera a quantidade de níveis da categoria antiga.
				var ul = $(currentCategory).parents("ul").length;
				
				// Calcula a difença entre os níveis. 
				var t = ul - level - 1;
				
				// Loop fechando as categorias pai.
				for(var i=0; i <= t; i++) {
					$(currentCategory).parents("ul").eq(i).slideUp(opt.slideSpeed);
				}
				
				// Fecha a categoria atual.
				$("ul:first", currentCategory).slideUp(opt.slideSpeed);
			
			} else if((currentRel != rel) && (level == 1)) {
				// Fecha a categoria antiga.
				//$("ul:first", currentCategory).slideUp(opt.slideSpeed);
			}
			
			currentLevel = level;
			currentCategory = li;
			currentRel = rel;
			
			return;
		}
		
		/**
		 * Abre a hierarquia da categoria corrente.
		 * 
		 * @private
		 */
		function openCurrentCategory(category, news) {
			// Verifica se foi passado o código da categoria...
			if(category){
				
				if(news){
					var id = category+'_'+news;
				} else {
					var id = category;
				}
				
				var parents = $("li[rel="+id+"]").parents("ul").length;
				
				for(var i=0; i <= parents; i++) {
					$("li[rel='"+id+"']").parents("ul").eq(i).slideDown(opt.slideSpeed);
				}
				
				$("a:first", "li[rel="+id+"]").addClass("selected");
				
				currentLevel = parents-1;
				currentCategory = $("li[rel="+id+"]");
				currentRel = id;
			
			// ... Se foi passada a penas o código da news, significa que é uma
			// news sem categoria. 
			} else if(news) {
				$("a:first", "li[rel=sc_"+news+"]").addClass("selected");	
			}
		}
		
		/**
		 * Main
		 */
		return this.each(function(){
			
			// Referência ao contéudo do menu.
			var menu = $(this);
			
			$("ul", menu).css({
				'padding-left':'5px',
				'cursor':'pointer'
			});
			
			// Esconde todas as categorias.
			$("ul", menu).hide();
			
			// Mostra somente as categorias iniciais.
			$("ul:first", menu).show();
			
			// Abre a categoria selecionada.
			openCurrentCategory(opt.currentCategory, opt.currentNews);
			
			// Ouvinte para seleção de categoria.
			$("li", menu).click(function(e){
				
				// Recupera o id da categoria selecionada.
				var rel = $(this).attr("rel");
				
				// Recupera o nível em que a ategoria se encontra.
				var level = $(this).parents("ul").length;
				
				// Faz a verificação da categoria.
				verifyCategory($(this), level, rel);
				
				// Abre os filhos.
				$("ul:first", $(this)).slideDown(opt.slideSpeed);
				
				// Evita a propagação.
				e.stopPropagation();
			});
		});
	}
});
