(function(jQuery) {
	jQuery.fn.chTree = function(settings) {
	    
	    settings = jQuery.extend({
	        
	    }, settings);
	    
	    var $tree = $(this)
		var $lists = $tree.find('li');
		var $checkboxes = $tree.find(':checkbox');
			
		$lists.not(':has(.arrow)').each(function() {
			jQuery(this).prepend('<div class="arrow"></div>');
		});
		
		// Hide sub-trees
		$tree.find('li li > ul').css('display', 'none')
		
		$tree
			.find('li:has(li) > .arrow')
			.click(function(){ parentClick($(this).parent()) })
			.addClass('expanded')
		;
		
		$tree.find('li li:has(li) > .arrow').removeClass('expanded').addClass('collapsed');
				
		$tree
			.find('li:has(li) > label')
			.click(function(){ parentClick($(this).parent()) })
		;
		
		highlightParents();
		
		$checkboxes.change(function(){
			highlightParents();
		})
		
		function highlightParents() {
			$tree.find('label:half-checked').removeClass('half-checked');
			$tree.find(':checkbox:checked').parents('li').find('label:first').addClass('half-checked');
			$tree.find(':checkbox:checked').siblings('label').removeClass('half-checked');
		}
		
		function parentClick($parent) {
			$el = $parent.find('.arrow:first');
			$el
				.toggleClass('expanded')
				.toggleClass('collapsed')
				.siblings("ul:first")
					.toggle()
			;
		}
	};
})(jQuery);