/**

 * Appendo Plugin for jQuery v1.01

 * Creates interface to create duplicate clones of last table row (usually for forms)

 * (c) 2008 Kelly Hallman. Free software released under MIT License.

 * See http://deepliquid.com/content/Appendo.html for more info

 */



// Attach appendo as a jQuery plugin

jQuery.fn.appendo = function(opt)

{

	this.each(function() { jQuery.appendo.init(this,opt); });

	return this;

};



// appendo namespace

jQuery.appendo = function() {



	// Create a closure so that we can refer to "this" correctly down the line

	var myself = this;



	// Global Options

	// These can be set with inline Javascript like so:

	// jQuery.appendo.opt.maxRows = 5;

	// $.appendo.opt.allowDelete = false;

	// (no need, in fact you shouldn't, wrap in jQuery(document).ready() etc)

	this.opt = { };



	this.init = function(obj,opt) {



		// Extend the defaults with global options and options given, if any

		var options = jQuery.extend({

				labelAdd:		'Add Row',

				labelDel:		'Remove',

				allowDelete:	true,

				// copyHandlers does not seem to work

				// it's been removed from the docs for now...

				copyHandlers:	false,

				focusFirst:		true,

				onAdd:			function() { return true; },

				onDel:		function() { return true; },

				maxRows:		0,

				wrapClass:		'appendoButtons',

				wrapStyle:		{ padding: '.4em .2em .5em' },

				buttonStyle:	{ marginRight: '.5em' },

				subSelect:		'tr:last'

			},

			myself.opt,

			opt

		);



		// Store clone of last table row

		var $cpy = jQuery(obj).find(options.subSelect).clone(options.copyHandlers);

		// We consider this starting off with 1 row

		var rows = 1;

		// Create two button objects

		var $add_btn = jQuery('#form-child-add').click(clicked_add),

			$del_btn = new_button(options.labelDel).click(clicked_del).hide()

		;



		// Append a row to table instance

		function add_row()

		{

			var $dup = $cpy.clone(options.copyHandlers);

			$dup.appendTo(obj);

			update_buttons(1);

			if (typeof(options.onAdd) == "function") options.onAdd($dup);

			if (!!options.focusFirst) $dup.find('input:first').focus();

		};



		// Remove last row from table instance

		function del_row()

		{

			var $row = jQuery(obj).find(options.subSelect);

			if ((typeof(options.onDel) != "function") || options.onDel($row))

			{

				$row.remove();

				update_buttons(-1);

			}

		};



		// Updates the button states after rows change

		function update_buttons(rowdelta)

		{

			// Update rows if a delta is provided

			rows = rows + (rowdelta || 0);

			// Disable the add button if maxRows is set and we have that many rows

			// $add_btn.attr('disabled',(!options.maxRows || (rows < options.maxRows))?false:true);

			// Show remove button if we've added rows and allowDelete is set

			(options.allowDelete && (rows > 1))? $del_btn.show(): $del_btn.hide();

		};



		// Returns (jQuery) button objects with label

		function new_button(label)

		{

			return jQuery('<button />')

				.css(options.buttonStyle)

				.html(label);

		};



		// This function can be returned to kill a received event

		function nothing(e)

		{

			e.stopPropagation();

			e.preventDefault();

			return false;

		};



		// Handles a click on the add button

		function clicked_add(e)

		{

			if (!options.maxRows || (rows < options.maxRows)) add_row();

			return nothing(e);

		};



		// Handles a click event on the remove button

		function clicked_del(e)

		{

			if (rows > 1) del_row(); 

			return nothing(e);

		};

	

		// Add the buttons after the table instance

		/*

		jQuery('<div />')

			.addClass(options.wrapClass)

			.css(options.wrapStyle)

			.append( $add_btn, $del_btn )

			.insertAfter(obj);

		*/



		// Update the buttons

		update_buttons();



	};

	return this;

}();