;(function($) {
/**
 * @class
 * @name jQuery.fn.jCollapseFormItems
 * @version 1.0
 * 
 * Takes a collection of divs and makes them collapsible
 * 
 * @example $("form div.colaapsible").jCollapseFormItems();
 * 
 * @requires jQuery 1.2.3
 */
$.fn.jCollapseFormItems = function(options) {
	var o = $.extend({}, $.fn.jCollapseFormItems.defaults, options);
	
	var allItems = this;
	var hiddenItems = [];
	
	function hideItem(oItem, oContainer) {
		var visibles = oItem.siblings().filter(":visible");
		var lastVisibleIndex = visibles.length-1;
		$(o.hideTrigger, oItem).hide();
		
		visibles.each(function(nIndex, oElement) {
			if (lastVisibleIndex == 0) {
				$(o.showTrigger, $(this)).show();
				$(o.hideTrigger, $(this)).hide();
			} else if (lastVisibleIndex != nIndex) {
				$(o.showTrigger, $(this)).hide();
				$(o.hideTrigger, $(this)).show();
			} else {
				$(o.showTrigger, $(this)).show();
			}
		});
		
		oItem.hide(o.duration);
		oItem.queue(function() {
			$(o.inputItem, oItem).val("");
			oItem.parent().append(oItem);
			oItem.dequeue();
		});
	};
	
	function showItem(oItem, oContainer) {
		var hiddenItems = oItem.parent().children().filter(":hidden");
		var nextItem = $(hiddenItems[0]);
		oItem.after(nextItem);
		
		$(o.showTrigger, oItem).hide();
		$(o.hideTrigger, oItem).show();
		
		if (hiddenItems.length > 1) {
			$(o.showTrigger, nextItem).show();
			$(o.hideTrigger, nextItem).show();
		} else {
			$(o.showTrigger, nextItem).hide();
			$(o.hideTrigger, nextItem).show();
		}
		
		nextItem.show(o.duration);
	};
	
	return this.each(function(nIndex, oElement) {
		var $this = $(this);
		var container = $this.parent();
		if (container.children().index($this[0]) > 0) {
			$this.hide();
		} else {
			$(o.showTrigger, $this).show();
		}
		
		$(o.showTrigger, $this).click(function(){
			showItem($this, container);
		});
		$(o.hideTrigger, $this).click(function(){
			hideItem($this, container);
		});

	});
};

// default options
$.fn.jCollapseFormItems.defaults = {
	hideTrigger: 	".remove",
	showTrigger: 	".add",
	inputItem:		"select, input[type=text]", 
	duration: 		"slow"
};

})(jQuery);
