/* -------------------------------------------------- *
* Collapsorz 1.1
* Updated: 04/21/09
* -------------------------------------------------- *
* Author: Aaron Kuzemchak
* URL: http://aaronkuzemchak.com/
* Copyright: 2008-2009 Aaron Kuzemchak
* License: MIT License
** -------------------------------------------------- */

(function($) {
	$.fn.collapsorz = function(options) {
		// default settings
		var defaults = {
		toggle: "> *", // elements inside the object to toggle
		minimum: 5, // number to show in collapsed form
		showText: "Show", // text for the expand link
		hideText: "Hide", // text for the collapse link
		linkLocation: "after", // use "after" or "before" to determine where link displays
		defaultState: "collapsed", // use "collapsed" or "expanded" to show or hide items by default
		wrapLink: null // specify HTML code to wrap around the link
		};
		var options = $.extend(defaults, options);
		return this.each(function() {
				
				// only execute if there are more than minimum items
				if($(options.toggle, this).length > options.minimum) {
				
				// setup variables
				var $obj = $(this);
				var $targets = $(options.toggle, this);
				
					// hide the items if necessary
					if(options.defaultState == "collapsed") {
					$targets.filter(":gt("+(options.minimum-1)+")").hide();
					}

					// append/prepend the toggle link to the object
					var $toggler = $('<a href="#" class="toggler"></a>');
					
					if(options.linkLocation == "before") {
						$obj.before($toggler);
					}
					else {
						$obj.after($toggler);
					}
					if(options.wrapLink) {
						$toggler.wrap(options.wrapLink);
					}

				// set data, link class, and link text
					if(options.defaultState == "expanded") {
						$obj.data("status", "expanded");
						$toggler.addClass("expanded");
						$toggler.html(options.hideText);
					}
					else {
						$obj.data("status", "collapsed");
						$toggler.addClass("collapsed");
						$toggler.html(options.showText);
					}
				
				// click actions
					$toggler.click(function() {
					if($obj.data("status") == "collapsed") {
							$targets.filter(":hidden").slideToggle();
							$toggler.html(options.hideText);
							$obj.data("status", "expanded");
						}
						else if($obj.data("status") == "expanded") {
							$targets.filter(":gt("+(options.minimum-1)+")").slideToggle();
							$toggler.html(options.showText);
							$obj.data("status", "collapsed");
						}
						$(this).toggleClass("collapsed").toggleClass("expanded");
						return false;
				});
			}
		});
	}
})(jQuery);
