(function($){ 
     $.fn.extend({  
         accordion: function(options) {       
            $.fn.accordion.defaults = {
					container_selector: '.accordion',
					links_selector: 'li.acc>h2',
					link_el: 'h2',
					li_selector: 'li.acc',
					contents_selector: 'ul.acc_sub, div.acc_sub',
					current_selector: 'li.current',
					link_highlight_class: 'highlight',
					li_highlight_class: 'active',
					open_selector: 'a.show_all_accordion',
					close_selector: 'a.close_all',
					txt_open: 'alle Artikel zeigen',
					txt_close: 'alle Artikel schließen',
					count_li: -1
			};
			
			// 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, 'slideToggle', 'parents', false);
						activate($(this), 'slideToggle', 'parents', false);
						return false;
					});
				});
				
				//open selected item------
				var active = false;
				
				if(location.hash) {
					//active = $(this).find('a[href=' + location.hash + ']')[0];
				} else {
					if($(this).find(opts.current_selector).length > 0) {
						active = $(this).find(opts.current_selector+' '+opts.link_el)[0];
						//2nd level?
						if ($(active).parent().find(opts.current_selector).length > 0) active = $(active).parent().find(opts.current_selector+' '+opts.link_el)[0];
					}
				}		
				 
				if(active){
					activate(active, 'toggle','parents', true);
					$(active).parents().show();
				}
				
				//init show all button -----------------------------------------
				opts.count_li = $(this).find(opts.links_selector).length;
				
				$(this).find(opts.open_selector).click(function(e){
						showAll(e.target);
						return false;
				});
				
				$(this).parents(opts.container_selector).find(opts.close_selector).click(function(e){
						closeAll(e.target);
						return false;
				});
				
				
				function activate(el,effect,parents, close_other){
					var liTag = $(el)[(parents || 'parent')](opts.li_selector); 
					
					if (close_other) liTag.siblings().children(opts.link_el).removeClass(opts.link_highlight_class);
					liTag.toggleClass(opts.li_highlight_class);
					if (close_other) liTag.siblings().removeClass(opts.li_highlight_class).children(opts.contents_selector).slideUp('fast');
				
					$(el).siblings(opts.contents_selector)[(effect || 'slideToggle')]((!effect)?'fast':'fast');
					liTag.children(opts.link_el).toggleClass(opts.link_highlight_class);
					
					updateShowAllBtn(el);

				}
				
				function showAll(el) {
					var elem = $(el);
					var open = elem.hasClass(opts.link_highlight_class); 
					
					if (open) {
						//close
						elem.html(opts.txt_open);
						elem.parent().siblings(opts.li_selector).removeClass(opts.li_highlight_class).children(opts.link_el).removeClass(opts.link_highlight_class).siblings(opts.contents_selector).slideUp('fast');
					} else {
						//open
						elem.html(opts.txt_close);
						elem.parent().siblings(opts.li_selector).addClass(opts.li_highlight_class).children(opts.link_el).addClass(opts.link_highlight_class).siblings(opts.contents_selector).slideDown('fast');
					}
					
					elem.toggleClass(opts.link_highlight_class);
					
				}
				
				function closeAll(el) {
					var elem = $(el);
					elem.parent().parent().find(opts.li_selector).removeClass(opts.li_highlight_class).children(opts.link_el).removeClass(opts.link_highlight_class).siblings(opts.contents_selector).slideUp('fast');
				}
				
				function updateShowAllBtn(el) {
					var elem = $(el);
					var list_el = elem.parent().parent();
					var currentCount =  list_el.find(opts.li_selector+"."+opts.li_highlight_class).length;
					
					if (currentCount == 0) {
						list_el.find(opts.open_selector).removeClass(opts.link_highlight_class).html(opts.txt_open);
					}

					if (currentCount == opts.count_li) {
						list_el.find(opts.open_selector).addClass(opts.link_highlight_class).html(opts.txt_close);
					}					
				}

				
				
            });
        } 
    }); 
})(jQuery);


