jQuery.fn.hasManyForm = function( options )
{
	var defaults =
	{
		add_element:		'input.add_has_many',
		remove_element:		'input.borrar',
		has_many_element:	'fieldset.has_many fieldset',
		success_add:		null,
		success_remove:		null,
		beforeSend:			function()
		{
			jQuery('#flashMessage').remove();
		}
	};

	jQuery.extend( defaults, options );

	var num_elementos_has_many;

	return this.each( function()
	{
		num_elementos_has_many = jQuery( defaults.has_many_element ).size();

		jQuery( defaults.add_element ).live( 'click', function()
		{
			var accion = jQuery(this).parents('form:first').attr('action');

			if( defaults.beforeSend )
			{
				defaults.beforeSend( jQuery(this) );
			}

			var nombre = jQuery(this).attr("name");
			var datos = {};
			datos[nombre] = num_elementos_has_many;
			
			var $elemento;
			var elemento_y_numero_boton = /\[(.+)\]\[([0-9]+)\]$/.exec( nombre );
			if( elemento_y_numero_boton )
			{
				//Asumimos que el botón está dentro del fieldset de un elemento, y
				//lo metemos antes del fieldset al que pertenece el botón
				$elemento = jQuery(this).parents('fieldset:first');

				var tipo_elemento = elemento_y_numero_boton[1];
				var numero_boton = parseInt(elemento_y_numero_boton[2]);
				var re = eval("/\\\[" + tipo_elemento + "\\\]\\\[([0-9])+\\\]/");
				cambiar_nombres_en_elementos_posteriores( re, numero_boton );
			}
			else
			{
				//El padre del botón es el div al que pertenece. Asumimos que lo estamos
				//metiendo al final de la lista de elementos.
				$elemento = jQuery(this).parent();
			}		

			$elemento.before('<div id="falso" style="display:none"></div>');
			var falso = jQuery('#falso');

			falso.load( accion, datos, function()
			{
				falso.slideDown('slow',function()
				{
					$elemento.before( falso.html() );
					falso.remove();
					num_elementos_has_many++;

					if( defaults.success_add )
					{
						defaults.success_add();
					}
				});
			});

			return false;
		});

		jQuery( defaults.remove_element ).live( 'click', function()
		{
			var accion = jQuery(this).parents('form:first').attr('action');
			/*El padre es el div con el botón de "borrar".
			Asumimos que el siguiente elemento es el input de tipo hidden
			correspondiente a la ID del elemento*/
			var id = jQuery(this).parent().next().val();
			var nombre = jQuery(this).attr("name");

			var datos = {};
			datos[nombre] = id;

			$.post( accion, datos );

			jQuery(this).parent().parent().slideUp('slow', function()
			{
				if( defaults.success_remove )
				{
					defaults.success_remove( jQuery( this ));
				}

				jQuery(this).remove();
			});
			return false;
		});
	});
}

function cambiar_nombres_en_elementos_posteriores( re, numero_boton )
{
	$('input').each( function()
	{
		var name = jQuery(this).attr('name');
		var matches = name.match( re );
		if( matches )
		{
			var numero = matches[1];
			if( parseInt(numero) >= numero_boton )
			{
				jQuery(this).attr('name',
					name.replace( numero, (parseInt(numero) + 1).toString())
					);
			}
		};
	});
}
