(function($) {
	$.fn.toggler = function(option) {
		var config = {
			closePrevious	: true,
			alwaysOneOpen	: true,
			classSelected	: "selected",
			doShow 			: 
				function(what) {
					what.stop(true,true).show(); 
				},
			doHide 			: 
				function(what) {
					what.stop(true,true).hide(); 
				}
		}
		config = $.extend(config, option);
		var jTogglerShow = config.doShow;
		var jTogglerHide = config.doHide;
			
		return this.each(function() {
			var links = [];
			var targets = [];
		   $(this).find('a[href*=#]').each(function() {
				if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
					if (this.hash != "") {
					var $target = $(this.hash);
					$target = $target.length && $target || $('[name=' + this.hash.slice(1) +']');
					if ($target.length) {
		            links.push(this);
		            targets.push($target.get(0));
					}
					}
				}
			});
			$(targets).hide();
			$(links).click(function () {
				if ($(this).hasClass(config.classSelected)) {
					if (config.alwaysOneOpen) { 
						if($(links).filter("."+config.classSelected).length == 1) {
							return false;
						}
					}
					jTogglerHide( $(targets).filter(this.hash) );
					$(this).removeClass(config.classSelected);
				} else {
					if (config.closePrevious) {
						// WARNING. May not be the real hash-value
						var hash = $(links).filter("."+config.classSelected).attr("href"); 
						jTogglerHide( $(targets).filter(hash) );
						$(links).removeClass(config.classSelected);
					}
					$(this).addClass(config.classSelected);
					jTogglerShow( $(targets).filter(this.hash) );
				}
				return false;
			});
			if (config.alwaysOneOpen) {
				$(links[0].hash).show();
				$(links[0]).addClass(config.classSelected);
			}
	  });
	};
})(jQuery);
