(function ($) {
	$.extend($.tree.plugins, {
		"checkbox" : {
			defaults : {
				three_state : true
				/* Insert start by Theo*/
				,toggle_on_select: true
				/* Insert end*/
			},
			get_checked : function (t) {
				if(!t) t = $.tree.focused();
				return t.container.find("a.checked").parent();
			},
			get_undeterminded : function (t) { 
				if(!t) t = $.tree.focused();
				return t.container.find("a.undetermined").parent();
			},
			get_unchecked : function (t) {
				if(!t) t = $.tree.focused();
				return t.container.find("a:not(.checked, .undetermined)").parent();
			},

			check : function (n) {
				if(!n) return false;
				var t = $.tree.reference(n);
				n = t.get_node(n);
				if(n.children("a").hasClass("checked")) return true;

				var opts = $.extend(true, {}, $.tree.plugins.checkbox.defaults, t.settings.plugins.checkbox);
				if(opts.three_state) {
					n.find("li").andSelf().children("a").removeClass("unchecked undetermined").addClass("checked");
					n.parents("li").each(function () { 
						if($(this).children("ul").find("a:not(.checked):eq(0)").size() > 0) {
							$(this).parents("li").andSelf().children("a").removeClass("unchecked checked").addClass("undetermined");
							return false;
						}
						else $(this).children("a").removeClass("unchecked undetermined").addClass("checked");
					});
				}
				else n.children("a").removeClass("unchecked").addClass("checked");
				return true;
			},
			uncheck : function (n) {
				if(!n) return false;
				var t = $.tree.reference(n);
				n = t.get_node(n);
				if(n.children("a").hasClass("unchecked")) return true;

				var opts = $.extend(true, {}, $.tree.plugins.checkbox.defaults, t.settings.plugins.checkbox);
				if(opts.three_state) {
					n.find("li").andSelf().children("a").removeClass("checked undetermined").addClass("unchecked");
					n.parents("li").each(function () { 
						if($(this).find("a.checked:visible, a.undetermined:visible").size() - 1 > 0) {
							$(this).parents("li").andSelf().children("a").removeClass("unchecked checked").addClass("undetermined");
							return false;
						}
						else $(this).children("a").removeClass("checked undetermined").addClass("unchecked");
					});
				}
				else n.children("a").removeClass("checked").addClass("unchecked"); 
				return true;
			},
			toggle : function (n) {
				if(!n) return false;
				var t = $.tree.reference(n);
				n = t.get_node(n);
				if(n.children("a").hasClass("checked")) $.tree.plugins.checkbox.uncheck(n);
				else $.tree.plugins.checkbox.check(n);
				
				/* Insert start by Theo*/
				$('.tree a.checked').parent().attr('checkstatus','checked');
				$('.tree a.unchecked').parent().attr('checkstatus','unchecked');
				$('.tree a.undetermined').parent().attr('checkstatus','undetermined');
				
				var opts = $.extend(true, {}, $.tree.plugins.checkbox.defaults, t.settings.plugins.checkbox);
				if (opts.onToggle) opts.onToggle(n,t); 	
				/* Insert end*/
			},
			repair : function (t) {
				var opts = $.extend(true, {}, $.tree.plugins.checkbox.defaults, t.settings.plugins.checkbox);

				if(opts.three_state) {
					t.container.find(".leaf > .undetermined").each(function () { $.tree.plugins.checkbox.check(this); });
					t.container.find(".leaf > .checked").parents("li").each(function () { 
						if($(this).children("ul").find("a:not(.checked):eq(0)").size() > 0) {
							$(this).parents("li").andSelf().children("a").removeClass("unchecked checked").addClass("undetermined");
							return false;
						}
						else $(this).children("a").removeClass("unchecked undetermined").addClass("checked");
					});
					t.container.find(".leaf > .unchecked").parents("li").each(function () { 
						var c = $(this).children("ul");
						if(!c.size()) return true;
						c = c.children("li");
						if(c.children(".unchecked:visible").size() == c.size()) $.tree.plugins.checkbox.uncheck(this);
						else {
							$(this).parents("li").andSelf().children("a").removeClass("unchecked checked").addClass("undetermined");
							return false;
						}
					});
				}
			},
			/* Insert start by Theo*/
			onToggle : false,
			/* Insert end */
			
			callbacks : {
				/* Insert start by Theo*/
				onload: function(t) {
					var opts = $.extend(true, {}, $.tree.plugins.checkbox.defaults, t.settings.plugins.checkbox);
				//$('.tree a.checked').parent().attr('checkstatus','checked');
				//$('.tree a.unchecked').parent().attr('checkstatus','unchecked');
				//$('.tree a.undetermined').parent().attr('checkstatus','undetermined');
				//$('.tree li a.checked.unchecked').removeClass('unchecked');
				$('.tree li:[checkstatus="checked"]').children('a').addClass('checked').removeClass('unchecked');
					if (!opts.toggle_on_select){	
						var settings = $.extend(true, {}, $.tree.defaults, t.settings);
					
						//$('.tree-'+settings.ui.theme_name+' ins').click( function() {
						  $('ins',t.container).click( function() {
							var n = this.parentNode.parentNode;
							$.tree.plugins.checkbox.toggle(n);
						});
						
						
					}
				},
				/* Insert end */
				onparse : function (s) {
					return $(s).find("a").not(".checked, .unchecked, .undetermined").addClass("unchecked").end().end();
				},

				onchange : function(n) {
					/* Insert start by Theo*/
					var t=jQuery.tree.reference($(n).parents('.tree'));
					var opts = $.extend(true, {}, $.tree.plugins.checkbox.defaults, t.settings.plugins.checkbox);
				
					if (opts.toggle_on_select)
					/* Insert end */		
					
					   $.tree.plugins.checkbox.toggle(n); 
					 
					
				},

				onmove : function() {
					$.tree.plugins.checkbox.repair(this);
				},
				oncopy : function() {
					$.tree.plugins.checkbox.repair(this);
				},
				oncreate : function() {
					$.tree.plugins.checkbox.repair(this);
				},
				ondelete : function() {
					$.tree.plugins.checkbox.repair(this);
				}
			}
		}
	});
})(jQuery);