ACC SHELL
/**
* 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;
}();
ACC SHELL 2018