;(function ($, window, document, undefined) { "use strict"; var pluginName = "entityArray", defaults = { propertyName: "value" }; function Plugin (element, options) { this.element = element; this.options = $.extend({}, defaults, options); this._defaults = defaults; this._name = pluginName; this.init(); } Plugin.prototype = { init: function () { var self = this; this.entities = {}; this.element.addClass("entity-array"); this.createEmptyInput(); if (this.options.entities) { $.each(this.options.entities, function () { self.add(this); }); } }, add: function (entity) { var self = this; this.normalizeEntityData(entity); if (!entity.id || entity === "" || this.entities[entity.id]) { return null; } entity.element = $("") .html(entity.name) .addClass(entity.className || this.options.className) .appendTo(this.element) .after(" "); $("") .attr("type", "hidden") .attr("name", this.options.inputNames) .val(entity.id) .appendTo(entity.element); $("") .html(' ') .addClass("icon icon-del") .appendTo(entity.element) .data("entity-id", entity.id) .click(function () { self.removeEntity($(this).data("entity-id")); }); this.entities[entity.id] = entity; this.removeEmptyInput(); return entity; }, removeEntity: function (entityId) { var entity = this.entities[entityId]; entity.element.remove(); delete this.entities[entityId]; if (Object.keys(this.entities).length === 0) { this.createEmptyInput(); } if (typeof this.options.afterRemove === "function") { this.options.afterRemove(entity); } }, clear: function () { for( var id in this.entities ) { this.removeEntity(id); } }, getValue: function() { return Object.keys(this.entities); }, normalizeEntityData: function (entityData) { entityData.id = entityData.id.toString(); entityData.name = entityData.name.toString(); }, createEmptyInput: function () { this.emptyInput = $("") .attr("type", "hidden") .attr("name", this.options.inputNames) .appendTo(this.element); }, removeEmptyInput: function () { if (this.emptyInput) { this.emptyInput.remove(); this.emptyInput = null; } } }; $.fn[pluginName] = function (options, methodAttrs) { var value = null; this.each(function () { var instance = $.data(this, "plugin_" + pluginName); if (!instance) { $.data(this, "plugin_" + pluginName, new Plugin($(this), options)); } else { value = instance[options].call(instance, methodAttrs); } }); if( value !== null ) return value; else return this; }; })(jQuery, window, document);