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

		settings = jQuery.extend({
			collapsedarrow: "img/fletxa_dreta_petita.gif",
			expandedarrow: "img/fletxa_down_petita.gif",
			blankarrow: "img/fletxa_blanc_petita.gif",
			activeClass: "checkboxtreeactive",
			hoverClass: "over",
			divname: "",
			checkchildren: false,
			checkdisabledparent: true,
			checkparents: true,
			collapsed: true,
			hidecbwithjs:false,
			checkedClass: "checked",
			showdiv: true
		}, 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;

			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)")){
				//No amaguem sempre o mostrem sempre
				
				if(settings.collapsed){
					//ocultem
					$this.find("ul").hide();
					$collapseImage = jQuery('<img class="checkboxtreeimage" data-isParent="1" src="' + settings.collapsedarrow + '" / >');
					$collapseImage.data("collapsedstate",0);
				}else{
					//mostrem nomes el triat
					if (!$this.find('a').hasClass('triat') ){
						$collapseImage = jQuery('<img class="checkboxtreeimage" data-isParent="1" src="' + settings.collapsedarrow + '" / >');
						$this.children().each( function (){
							$(this).hide();								 
						});			
						$collapseImage.data("collapsedstate",0);		
					}else{
						$collapseImage = jQuery('<img class="checkboxtreeimage" data-isParent="1" src="' + settings.expandedarrow + '" / >');
						$collapseImage.data("collapsedstate",1);
					}
				}
				
				/*
				//Si està clickat, obrim. sino, no
				if(!$this.children("input:checkbox:first").is(":checked")){
					//ocultem
					$this.find("ul").hide();
					$collapseImage = jQuery('<img class="checkboxtreeimage" src="' + settings.collapsedarrow + '" / >');
					$collapseImage.data("collapsedstate",0);
				}
				else {
					//mostrem
					$collapseImage = jQuery('<img class="checkboxtreeimage" src="' + settings.expandedarrow + '" / >');
					$collapseImage.data("collapsedstate",1);
				
				}
				*/
			}
			else{
				$collapseImage = jQuery('<img src="' + settings.blankarrow + '" / >');
			}
			$this.prepend($collapseImage);
			
		})

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

		$group.bind("click.checkboxtree",function(e,a){
			var $clicked = jQuery(e.target);
			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("img.checkboxtreeimage")){
				clickedimage=true;
			}
			//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("click.checkboxtree",["checkparents"]);
					}
				}
				//check child checkboxes if settings say so
				if(settings.checkchildren&&a!=="checkparents"){
					//desactivem/activem els fills
					$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)
				}
				//mirem si hem de desactivar els fills de l'actual
				if(settings.checkdisabledparent){
					//si està desactivat, desactivem els fills
					if(!($clickedcheck.attr("checked"))){
						$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=$clicked.data("collapsedstate");
				$('#menu_interior').children('ul ul').removeClass('clickat');
				$('#menu_interior').find("img").each(function(){
					if( $(this).attr("src") != 'img/fletxa_blanc_petita.gif' )
						$(this).attr("src",settings.collapsedarrow);
				});
				$('#menu_interior').find("img").data("collapsedstate",0);
				$clicked.addClass('clickat');
				
				if( $clicked.parent().parent().hasClass('nivell_2') ){
					$('#menu_interior').find('ul ul').each(function(){
						if(!$(this).hasClass('clickat') ){
							$(this).hide();
						}
					});
				}else if( $clicked.parent().parent().hasClass('nivell_3') ){
					$clicked.parent().parent().find('ul').each(function(){
						if(!$(this).hasClass('clickat') ){
							$(this).hide();
						}
					});
				}
														  
				if(clickstate===0){
					console.log($clickedparent.toSource());
					jQuery('#menu_home').find("ul").each(function () {
						var c=$(this).data("collapsedstate");
						if (c == undefined) console.log(c);
					});
					//jQuery('#menu_home').find("ul").hide();
					
					$currrow.children("ul").show();
					$currrow.children("img").attr("src",settings.expandedarrow);
					$clicked.data("collapsedstate",1);
					
				}else if(clickstate===1){
					$currrow.children("ul").hide();
					$currrow.children("img").attr("src",settings.collapsedarrow);
					$clicked.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();
		}
		
		// mostrem el div un cop ha fet tota la feina del checkboxTree
		if ((settings.divname != '') && (settings.showdiv)){
			jQuery("#"+settings.divname).show();	
		}		
		
		//retorn
		return $group;
	};
})(jQuery);
