(function($){ 
     $.fn.extend({  
         accordion: function(options) {       
            $.fn.accordion.defaults = {
					links_selector: 'li.acc>a',
					li_selector: 'li.acc',
					contents_selector: 'ul.acc_sub, div.acc_sub',
					current_selector: 'li.current',
					link_highlight_class: 'highlight',
					li_highlight_class: 'active'
			};
			
			// build main options before element iteration
			var opts = $.extend({}, $.fn.accordion.defaults, options);
			
			return this.each(function() {
				if($(this).data('accordiated'))
					return false;									
				$.each($(this).find(opts.contents_selector), function(){
					$(this).data('accordiated', true);
					$(this).hide();
				});
				$.each($(this).find(opts.links_selector), function(){
					$(this).click(function(e){
						activate(e.target);
						return void(0);
					});
				});
				
				var active = false;
				/*
				if(location.hash)
					active = $(this).find('a[href=' + location.hash + ']')[0];
				else if($(this).find('li.current'))
					active = $(this).find('li.current a')[0]; 
				*/
				
				if($(this).find(opts.current_selector).length > 0) {
					active = $(this).find(opts.current_selector+' a')[0];
					//2nd level?
					if ($(active).parent().find(opts.current_selector).length > 0) active = $(active).parent().find(opts.current_selector+' a')[0];
				}	
				 
				if(active){
					activate(active, 'toggle','parents');
					$(active).parents().show();
				}
				
				function activate(el,effect,parents){
					var liTag = $(el)[(parents || 'parent')](opts.li_selector); 
					
					liTag.siblings().children('a').removeClass(opts.link_highlight_class);
					
					liTag.toggleClass(opts.li_highlight_class).siblings().removeClass(opts.li_highlight_class).children(opts.contents_selector).slideUp('fast');
					$(el).siblings(opts.contents_selector)[(effect || 'slideToggle')]((!effect)?'fast':null);
					
					liTag.children('a').toggleClass(opts.link_highlight_class);
				}
				
            });
        } 
    }); 
})(jQuery);
