(function(jQuery) {
	jQuery.fn.checkboxTree = function(settings) {

		settings = jQuery.extend({
			collapsedarrow: "img-arrow-collapsed.gif",
			expandedarrow: "img-arrow-expanded.gif",
			blankarrow: "img-arrow-blank.gif",
			activeClass: "checkboxtreeactive",
			hoverClass: "over",
			checkchildren: false,
			checkparents: true,
			collapsed: true,
			hidecbwithjs:false,
			is_multiple: false,
			checkedClass: "checked"},settings);

		var $group = this;
		var $labels = jQuery(":checkbox + label",$group)
		var $checkboxes = jQuery(":checkbox",$group)

		//set up the tree
		jQuery("li",$group).each(function(){
			
			var $this = jQuery(this)
			var $collapseImage;
			//alert($this.html());
			if(settings.checkparents){
				var checkedchildren = jQuery("ul li input:checked",$this).length
				var $firstcheckbox = $this.children("input:checkbox:first")
				
				if((!$this.children("input:checkbox:first").is(":checked")) && (checkedchildren>0)){
					$firstcheckbox.attr("checked","checked")
				}
			}

			if($this.is(":has(ul)")){
				if(settings.collapsed){
					$this.find("ul").hide();
					$collapseImage = jQuery('<img class="checkboxtreeimage" src="' + settings.collapsedarrow + '" / >')
					$collapseImage.data("collapsedstate",0)
				}else{
					$collapseImage = jQuery('<img class="checkboxtreeimage" src="' + settings.expandedarrow + '" / >')
					$collapseImage.data("collapsedstate",1)
				}
				$this.prepend($collapseImage);
			}//else{
				//$collapseImage = jQuery('<img src="' + settings.blankarrow + '" / >')
			//}
			
			
		})

		//add class signifying the tree has been setup
		$group.addClass(settings.activeClass);

		$group.bind("mousedown.checkboxtree",function(e,a){
			var $clicked = jQuery(e.target)

			if(!settings.is_multiple && $clicked.is("label") && !$clicked.hasClass("categoria") ){
				jQuery("li",$group).each(function(){
					var $this = jQuery(this)
						var $checkbox = $this.children("input:checkbox:first");
						if($checkbox.is(":checked")){
							$checkbox.attr("checked",false);
						}
				});
				jQuery("label",$group).removeClass(settings.checkedClass)
			}
			
			var $clickedcheck = $clicked.prev()
			var $currrow = $clicked.parents("li:first")
			var $clickedparent = $currrow.parents("li:first").find(":checkbox:first");
			var $clickedparentlabel = $clickedparent.next("label");
			var clickedlabel = false;
			var clickedimage = false;
			
			if($clicked.is(":checkbox + label")){
				clickedlabel=true;
			}
			
			if($clicked.is(":checkbox + label[class]")){
				clickedlabel=true;
				$image = $clickedcheck.prev();
				clickedimage=true;
			}
			
			if($clicked.is("img.checkboxtreeimage")){
				clickedimage=true;
				$image = $clicked;
			}
			
			//when the label is clicked, set the checkbox to the opposite clicked state, and toggle the checked class
			if(clickedlabel){
				$clicked.prev().attr({checked: !$clickedcheck.attr("checked")}).end().toggleClass(settings.checkedClass);
				
				//check parents if that option is set
				if(settings.checkparents){
					var checkedchildren = jQuery("input:checked",$currrow).length
					
					if((!$clickedparent.is(":checked")) && (checkedchildren>0)){
						$clickedparentlabel.trigger("mousedown.checkboxtree",["checkparents"])
					}
				}
				
				//check child checkboxes if settings say so
				if(settings.checkchildren&&a!=="checkparents"){
					$currrow.find(":checkbox + label").prev().attr({checked: $clickedcheck.attr("checked")?"checked":""})
					.next()
					.addClass($clicked.hasClass(settings.checkedClass)?settings.checkedClass:"")
					.removeClass($clicked.hasClass(settings.checkedClass)?"":settings.checkedClass)
				}
			}
			
			//handle expanding of levels
			if(clickedimage){
			/*	var clickstate=$image.data("collapsedstate")
				if(clickstate===0){
					$currrow.children("ul").show();
					$currrow.children("img").attr("src",settings.expandedarrow);
					$image.data("collapsedstate",1)
				}else if(clickstate===1){
					$currrow.children("ul").hide();
					$currrow.children("img").attr("src",settings.collapsedarrow);
					$image.data("collapsedstate",0)
				}*/
			}
		})
		
		//set the class correctly for the labels that contain checked checkboxes
		jQuery("input:checked + label",$group).addClass(settings.checkedClass)

		//add hover class for labels if is ie 6
		if(jQuery.browser.msie&&jQuery.browser.version<7){
			$labels.hover( 
				function(){jQuery(this).addClass(settings.hoverClass)},
				function(){jQuery(this).removeClass(settings.hoverClass); }
			)
		}		

		//hide the checkboxes with js if set option set to true
		if(settings.hidecbwithjs){
			$checkboxes.hide();
		}
		
		return $group;
	};
})(jQuery);


