(function($) {
	$.fn.wnSimpleAccordion = function(options) {

		var defaults = {
			headerSelector : ".category > span",
			defaultExpanded: ".defaultExpanded",
			expandedPathClass: "menuOpened",
			collapsedPathClass: "menuCollapsed"
		};
		var options = $.extend(defaults, options);
		var $menu;
		
		var getNumericalPath = function($el) {
			var myNumericalPath = [];

			$el.parents("ul").each(function(i, ul) {
				var i = parseInt($(ul).data("numID"));
				if(!isNaN(i)) {
					myNumericalPath.push(i);
				}
			});
			
			return myNumericalPath;
		};
		
		/**
		 * chowa wszystkie "nie uzywane aktualnie" ul, tj
		 * takie ktore nie sa bezposrednio nad kliknietym elementem
		 * 
		 */
		var hideUnused = function($el) {
			var path = getNumericalPath($el);
			

			$("ul:visible", $menu).each(function(i, ul){
				var $ul = $(ul);
				var myNumID = parseInt($ul.data("numID"));
				
				if($.inArray(myNumID, path) == -1) {
					$ul.slideUp("fast");
				}
				
			});
			
		};
		
		/**
		 * Nadaje wszystkim rozwijalnym elementom indywidualny numerek, unikalny w danym menu
		 */
		var tagElements = function() {
			var ulNumID = 1;
			
			$("ul", $menu).each(function() {
				$(this).data("numID", ulNumID++);
			}).find("li").addClass(options.collapsedPathClass);
		};
		
		/**
		 * oznacza danego node jako zwiniety
		 */
		var setCollapsed = function($element) {
			$element.nextAll("ul").slideUp("fast").find("li").removeClass(options.expandedPathClass).addClass(options.collapsedPathClass);
			$element.closest("li").removeClass(options.expandedPathClass).addClass(options.collapsedPathClass);
		};
		
		/**
		 * oznacza node jako rozwiniety
		 */
		var setOpened = function($element) {
			hideUnused($element);
			$element.nextAll("ul").slideDown("fast");
			$element.closest("li").addClass(options.expandedPathClass);
		};
		
		return this.each(function() {
			$menu = $(this);
			
			tagElements();
			$menu.find("ul").hide();

			$(options.defaultExpanded).each(function() {
				$(this).removeClass(options.collapsedPathClass);

				// sobie tez nadajemy klase expanded, ale tylko jesli mam jakies dzieci
				if($("ul", $(this)).length > 0) {
					$(this).addClass(options.expandedPathClass);
				}
			}).parents("li").addClass(options.expandedPathClass).removeClass(options.collapsedPathClass);
			
			$(options.defaultExpanded).parents("ul").add(options.defaultExpanded+" > ul").show();
			
			$menu.find(options.headerSelector).click(function() {
				if($(this).next("ul").is(":not(:hidden)")) {
					// menu bylo juz rozwiniete
					setCollapsed($(this));
				} else {
					// menu bylo schowane, pokazmy je
					setOpened($(this));
				}

				return false;
			});
			
		});
	};
})(jQuery);
