web/js/bootstrap_bc-bootstrap-collection_13.js
/* ==========================================================
* bc-bootstrap-collection.js
* http://bootstrap.braincrafted.com
* ==========================================================
* Copyright 2013 Florian Eckerstorfer
*
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* COLLECTION CLASS DEFINITION
* ====================== */
var addField = '[data-addfield="collection"]',
removeField = '[data-removefield="collection"]',
CollectionAdd = function (el) {
$(el).on('click', addField, this.addField);
},
CollectionRemove = function (el) {
$(el).on('click', removeField, this.removeField);
}
;
CollectionAdd.prototype.addField = function (e) {
var $this = $(this),
selector = $this.attr('data-collection'),
prototypeName = $this.attr('data-prototype-name')
;
e && e.preventDefault();
var collection = $('#'+selector),
list = collection.find('> ul'),
count = list.find('> li').length
;
var newWidget = collection.attr('data-prototype');
// Check if an element with this ID already exists.
// If it does, increase the count by one and try again
var newName = newWidget.match(/id="(.*?)"/);
var re = new RegExp(prototypeName, "g");
while ($('#' + newName[1].replace(re, count)).length > 0) {
count++;
}
newWidget = newWidget.replace(re, count);
newWidget = newWidget.replace(/__id__/g, newName[1].replace(re, count));
var newLi = $('<li></li>').html(newWidget);
newLi.appendTo(list);
$this.trigger('bc-collection-field-added');
};
CollectionRemove.prototype.removeField = function (e) {
var $this = $(this),
selector = $this.attr('data-field'),
parent = $this.closest('li').parent()
;
e && e.preventDefault();
$this.trigger('bc-collection-field-removed');
$this.trigger('bc-collection-field-removed-before');
var listElement = $this.closest('li').remove();
parent.trigger('bc-collection-field-removed-after');
}
/* COLLECTION PLUGIN DEFINITION
* ======================= */
var oldAdd = $.fn.addField;
var oldRemove = $.fn.removeField;
$.fn.addField = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('addfield')
;
if (!data) {
$this.data('addfield', (data = new CollectionAdd(this)));
}
if (typeof option == 'string') {
data[option].call($this);
}
});
};
$.fn.removeField = function (option) {
return this.each(function() {
var $this = $(this),
data = $this.data('removefield')
;
if (!data) {
$this.data('removefield', (data = new CollectionRemove(this)));
}
if (typeof option == 'string') {
data[option].call($this);
}
});
};
$.fn.addField.Constructor = CollectionAdd;
$.fn.removeField.Constructor = CollectionRemove;
/* COLLECTION NO CONFLICT
* ================= */
$.fn.addField.noConflict = function () {
$.fn.addField = oldAdd;
return this;
}
$.fn.removeField.noConflict = function () {
$.fn.removeField = oldRemove;
return this;
}
/* COLLECTION DATA-API
* ============== */
$(document).on('click.addfield.data-api', addField, CollectionAdd.prototype.addField);
$(document).on('click.removefield.data-api', removeField, CollectionRemove.prototype.removeField);
}(window.jQuery);