Element.addMethods({
	addrow: function(element) {
		var options = Object.extend({
			resetform:				true,
			hide:					false,
			rownumclass:			'rownum',
			removelinkclass:		'removelink',
			minrows:				1,
			removeinnewrowclass:	'RemoveInNewRow'
		}, arguments[1] || {});
		var container = $(element);
		if (container.tagName == 'TABLE')
			container = Element.extend(container.tBodies[0]);
		var rows = container.immediateDescendants();
		var newrow = Element.extend(rows[0].cloneNode(true));
		
		// Reset Form Elements inside new element
		if (options.resetform) {
			var children = newrow.descendants();
			var cnt;
			var child;
			for (cnt = 0; cnt < children.length; cnt++) {
				child = $(children[cnt]);
				switch (child.tagName.toLowerCase()) {
					case 'input' :
						if (!['button', 'reset', 'submit'].include(child.type))
							child.clear();
						break;
					case 'textarea' :
						child.clear();
						break;
					case 'select' :
						child.selectedIndex = -1;
						break;
				}
			}
		}
		
		// Place number of current row inside element marked by rownumclass
		if (options.rownumclass != null) {
			newrow.select('.' + options.rownumclass).each(function (rownum) {
				rownum.update(rows.length + 1);
			});
		}
		
		// Fix up labels contained inside the new row
		newrow.select('label').each(function (label) {
			if (label.htmlFor) {
				element = newrow.select('input[id="' + label.htmlFor + '"]', 
					'textarea[id="' + label.htmlFor + '"]',
					'select[id="' + label.htmlFor + '"]').first();
				if (element) {
					element.writeAttribute('id', '');
					label.htmlFor = element.identify();
				} // if (element)
			} // if (label.htmlFor)
		});
		
		newrow.select('.' + options.removeinnewrowclass).each(function (element) {
			element.remove();
		});
		
		// Determine if remove link should be hidden/unhidden
		if ((rows.length + 1) > options.minrows) {
			newrow.select('.' + options.removelinkclass).invoke('show');
			container.select('.' + options.removelinkclass).invoke('show');
		} else {
			newrow.select('.' + options.removelinkclass).invoke('hide');
		}
		
		if (options.hide) newrow.hide();
		container.appendChild(newrow);
		return(newrow);
	},
	
	delrow: function(element, row) {
		row = $(row);
		var options = Object.extend({
			rownumclass:		'rownum',
			removelinkclass:	'removelink',
			minrows:			1
		}, arguments[1] || {});
		var container = $(element);
		if (container.tagName == 'TABLE')
			container = Element.extend(container.tBodies[0]);
		row.remove();
		var rows = container.immediateDescendants();
		
		
		// Place number of current row inside element marked by rownumclass
		if (options.rownumclass != null) {
			rows.each(function (r, index) {
				r.select('.' + options.rownumclass).each(function (rownum) {
					rownum.update(index + 1);
				});
			});
		}
		
		// Determine if remove link should be hidden/unhidden
		if (rows.length > options.minrows) {
			container.select('.' + options.removelinkclass).invoke('show');
		} else {
			container.select('.' + options.removelinkclass).invoke('hide');
		}
	}
});

