/**
 * VectorGrid jQuery Plugin
 * @author Rubens de Souza Silva (rubens21@gmail.com)
 * @requires jQuery v1.2.4 or later
 * @version 0.1
 *
 * Copyright (c) 2008 Vector Internet Bussiness - Belo Hozironte - Brazil
 * www.vectornet.com.br
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 */
 
 $.fn.vectorTree = function(options) {
	//Opções de configuração do sistema, veja mais a cima a definição do array cols
	options = $.extend({
		cssChecked: "tree_check",
		cssUnchecked: "tree_uncheck",
		cssSemichecked: "tree_semicheck",
		cssCollapsed: "tree_collapsed",
		cssExpanded: "tree_expanded",
		cssLastNo: "tree_sheet",
		cssPlus: "tree_plus",
		cssMinus: "tree_minus",
		oneInMin: true
	}, options);
	
	$.fn.analiseLista = function(objetoLi)//-1 nenhum, 0 algum, 1 todos, 2 =  não tem filhos
	{
		var folha 			= true;
		var marcado 		= false;
		var parcial;
		

		$($(objetoLi).children("input")).removeClass(options.cssChecked + " " + options.cssSemichecked + " " + options.cssUnchecked);
		if($(objetoLi).children("ul").length)
		{
			parcial = $(options.referencia).analiseNo($(objetoLi).children("ul"));
			folha = false;
		}
		if(folha)
		{
			$(objetoLi).addClass(options.cssLastNo);
			if($($(objetoLi).children("input")).attr('checked'))
			{
				$($(objetoLi).children("input")).addClass(options.cssChecked);
				return 1;
			}else
			{
				$($(objetoLi).children("input")).addClass(options.cssUnchecked);
				return -1;
			}
		}
		
		switch(parcial)
		{
			case -1:
				$($(objetoLi).children("input")).addClass(options.cssUnchecked).attr('checked', false);
				return -1;
			break;
			case 0:
				$($(objetoLi).children("input")).addClass(options.cssSemichecked).attr('checked', options.oneInMin);
				return 0;
			break;
			case 1:
				$($(objetoLi).children("input")).addClass(options.cssChecked).attr('checked', true);
				return 1;
			break;
			default:
				alert('erro = ' + parcial);
				return 0;//algum marcado
		}
		
	}
	
	$.fn.analiseNo = function(ObjNo)
	{
		var filhos 			= $(ObjNo).children();
		var filhoMarcado 	= false;
		var filhoDesmarcado = false;
		var filhoSemi 		= false;
		var situacao;
		for(var i=0; i< filhos.length;i++)
		{
			situacao = $(options.referencia).analiseLista(filhos[i]);
			
			if(situacao == -1)
				filhoDesmarcado = true;
			else if(situacao == 1)
				filhoMarcado = true;
			else if(situacao == 0)
				filhoSemi = true;
		}
		
		if(filhoSemi || (filhoMarcado && filhoDesmarcado))
			return 0;
		else if(filhoMarcado)
			return 1;
		else
			return -1;
	}
	
	$.fn.startNo = function(ObjNo)
	{
		var filhos 			= $(ObjNo).children();
		for(var i=0; i< filhos.length;i++)
			$(options.referencia).startLista(filhos[i]);
	}
	
	$.fn.startLista = function(objetoLi)
	{
		$($(objetoLi).children("input")).click(function(){
			$("#" + options.referencia.id).clickCheck(objetoLi, $(objetoLi).children("input").attr("checked"))
			return true;
		});
		
		if($(objetoLi).children("ul").length)
		{
			$(objetoLi).addClass(options.cssCollapsed)
			var Minus 		= document.createElement("a");
			Minus.href 		= "javascript://";
			Minus.innerHTML = "+";
			Minus.className		= options.cssPlus;
			$(Minus).click(function(){
				$("#" + options.referencia.id).show_hide(Minus);
			});
			$(Minus).insertBefore($(objetoLi).children("input"));
			$(options.referencia).startNo($(objetoLi).children("ul"));
		}		
	}
	
	$.fn.show_hide = function(link)
	{
		if($(link).hasClass(options.cssPlus))
		{
			link.innerHTML = "-";
			$(link).removeClass(options.cssPlus);
			$(link).addClass(options.cssMinus);
			$($(link).parent()).removeClass(options.cssCollapsed);
			$($(link).parent()).addClass(options.cssExpanded);
			
		}else
		{
			link.innerHTML = "+";
			$(link).removeClass(options.cssMinus);
			$(link).addClass(options.cssPlus);
			$($(link).parent()).removeClass(options.cssExpanded);
			$($(link).parent()).addClass(options.cssCollapsed);
		}
	}
	
	$.fn.clickCheck = function(objetoLi, NewValue)
	{
		$(objetoLi).children("input").attr("checked", NewValue);
		if($(objetoLi).children("ul").length)
		{
			var netos = $(objetoLi).children("ul").children();
			for(var j=0; j< netos.length;j++)
				$(options.referencia).clickCheck(netos[j], NewValue);
		}
		$("#" + options.referencia.id).analiseNo($("#" + options.referencia.id));
	}

	
	
	this.each(function(){
		options.referencia = this;
		$(options.referencia).startNo(this);
		$(options.referencia).analiseNo(this);

	});
};