(function($) {
		$.fn.extend({
			reveal: function(settings) {
				var defaults = {
					enableShowAll   : false,
					intro   		: false,
					introHtml    	: '<p>Click the link to reveal the the text</p>',
					introLocation   : '',
					controlSuffix   : '',
					linkClass		: 'clickme',
					toggleClass     : 'clicked',
					wrapClass       : 'wrap',
					anim			: {height: 'toggle'},
					animDuration    : 500,
					animEasing		: 'linear',
					animCallback	: function() {}
	      	};

    	  	var settings = $.extend(defaults, settings);
			var container = $(this);
			var identifier = ( container.attr("id") !== '') ? container.attr("id")  : container.attr("class");
			identifier = ( settings.introLocation !== '' ) ? settings.introLocation : identifier;
			
			if(settings.enableShowAll  ) {
				$('<a class="revealShow'+settings.controlSuffix+'" href="#">show all</a>&nbsp;<a class="revealHide'+settings.controlSuffix+'" href="#">hide all</a>').prependTo('[id='+identifier+']:first,[class='+identifier+']:first' );
				$('.revealShow'+ settings.controlSuffix).bind("click", function(e) {
					e.preventDefault();
					$(container).find('.' + settings.linkClass).each( function (i) {
						$(this).addClass(settings.toggleClass);
						$(container).find('#revealwrap'+i).show();
					});
				});
				$('.revealHide'+ settings.controlSuffix).bind("click", function(e) {
					e.preventDefault();
					$(container).find('.' + settings.linkClass).each( function (i) {
						$(this).removeClass(settings.toggleClass);
						$(container).find('#revealwrap'+i).hide();
					});
				});
			}
			if(settings.intro) {
				$(settings.introHtml).prependTo('[id='+identifier+']:first,[class='+identifier+']:first' );
			}
    	  	$(container).find('.' + settings.linkClass).each( function (i) {
				var nodeType =  this.nodeName;
				var nodes = $(this).nextUntil(nodeType);
				$(nodes).wrapAll('<div class="'+settings.wrapClass+'"/>');
				$(this).nextUntil(nodeType).attr('id','revealwrap'+i);
				$(this).bind("click", function (e) {
					$(container).find('#revealwrap'+i).animate( settings.anim, settings.animDuration, settings.animEasing, settings.animCallback );
					$(this).toggleClass(settings.toggleClass);
				});
				$(container).find('#revealwrap'+i).animate( settings.anim, 10 );
			});
	    }
	});
})(jQuery);