(function($) {
    $.fn.TreeToggleMenu = function(options) {
    
        var settings = {
			skin:'Tips',
			speed:300,
			initialExpandAll:false,
			initialExpandSelectedPath:true,
			oneBranchOpenedAtTime:false,
			toggleOnOver:false,
			onOverSpeed: 700
		};
		
		if(options) { $.extend(settings, options); }
    
        $('li > div', this).each( function() {
            $("a", this).before('<div class="Handle">&nbsp;</div> ');
            if ($(this).parent().hasClass('selected') || $(this).parent().hasClass('selectedPath')) $("a", this).prev().addClass('UnFolded');
            if ($(this).siblings('ul').length == 0) $("a", this).prev().removeClass('UnFolded').addClass('NoChild');
        });
        
        $('a', this).css('margin-left','0px');

        var cur = $(' .selected', this);
        if (cur.length > 0) {
            while ( $(cur)[0] != $(this)[0] ) {
                cur = $(cur).parent();
                cur.addClass('selectedPath');
            }
        }
        
        var cancel = false;
        var wait = false;
        
        if (settings.toggleOnOver)
        {
            $('li > div', this).hover( 
            
            function() {
                cancel = false;
                
                $self = $(this);
                if (!wait)
                {
                    wait = true;
                    setTimeout( function() {
                        
                        if (!cancel)
                        {
                            $self.siblings('ul').slideToggle(settings.speed, function() { 
                                $self.siblings('div').children('.Handle').toggleClass('UnFolded');
                            });
                            
                            if (settings.oneBranchOpenedAtTime) {
                                $self.parent().siblings().children('ul').slideUp(settings.speed, function() {
                                    $self.parent().children('div').children('.Handle').removeClass('UnFolded');
                                });
                            }
                            
                            cancel = false;
                        }
                        
                        wait= false;
                            
                    }, settings.onOverSpeed );
                }
            },
            
            function() {
                cancel = true;
            } );
        }
        else
        {
            $('li > div', this).click( function() {
                $(this).siblings('ul').slideToggle(settings.speed, function() { 
                        $(this).siblings('div').children('.Handle').toggleClass('UnFolded');
                });
                    
                if (settings.oneBranchOpenedAtTime) {
                    $(this).parent().siblings().children('ul').slideUp(settings.speed, function() {
                        $(this).parent().children('div').children('.Handle').removeClass('UnFolded');
                    });
                }
                
            });
        }
        
        if (settings.initialExpandSelectedPath) {
            $('.selectedPath', this).css('display', 'block');
            $('.selectedPath > .Handle', this).addClass('UnFolded');
            $('.selected > ul', this).css('display', 'block');
            $('.selected > .Handle', this).addClass('UnFolded');
        }
    };
})(jQuery);

