: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
var option = self.item($option);
SelectAdapter.prototype.select = function (data) {
// If data.element is a DOM node, use it instead
if ($(data.element).is('option')) {
data.element.selected = true;
this.$element.trigger('change');
if (this.$element.prop('multiple')) {
this.current(function (currentData) {
data.push.apply(data, currentData);
for (var d = 0; d < data.length; d++) {
if ($.inArray(id, val) === -1) {
self.$element.trigger('change');
this.$element.trigger('change');
SelectAdapter.prototype.unselect = function (data) {
if (!this.$element.prop('multiple')) {
if ($(data.element).is('option')) {
data.element.selected = false;
this.$element.trigger('change');
this.current(function (currentData) {
for (var d = 0; d < currentData.length; d++) {
var id = currentData[d].id;
if (id !== data.id && $.inArray(id, val) === -1) {
self.$element.trigger('change');
SelectAdapter.prototype.bind = function (container, $container) {
this.container = container;
container.on('select', function (params) {
self.select(params.data);
container.on('unselect', function (params) {
self.unselect(params.data);
SelectAdapter.prototype.destroy = function () {
// Remove anything added to child elements
this.$element.find('*').each(function () {
// Remove any custom data set by Select2
$.removeData(this, 'data');
SelectAdapter.prototype.query = function (params, callback) {
var $options = this.$element.children();
$options.each(function () {
if (!$option.is('option') && !$option.is('optgroup')) {
var option = self.item($option);
var matches = self.matches(params, option);
SelectAdapter.prototype.addOptions = function ($options) {
Utils.appendMany(this.$element, $options);
SelectAdapter.prototype.option = function (data) {
option = document.createElement('optgroup');
option.label = data.text;
option = document.createElement('option');
if (option.textContent !== undefined) {
option.textContent = data.text;
option.innerText = data.text;
option.title = data.title;
var normalizedData = this._normalizeItem(data);
normalizedData.element = option;
// Override the option's data with the combined data
$.data(option, 'data', normalizedData);
SelectAdapter.prototype.item = function ($option) {
data = $.data($option[0], 'data');
if ($option.is('option')) {
disabled: $option.prop('disabled'),
selected: $option.prop('selected'),
title: $option.prop('title')
} else if ($option.is('optgroup')) {
text: $option.prop('label'),
title: $option.prop('title')
var $children = $option.children('option');
for (var c = 0; c < $children.length; c++) {
var $child = $($children[c]);
var child = this.item($child);
data.children = children;
data = this._normalizeItem(data);
data.element = $option[0];
$.data($option[0], 'data', data);
SelectAdapter.prototype._normalizeItem = function (item) {
if (!$.isPlainObject(item)) {
item.id = item.id.toString();
item.text = item.text.toString();
if (item._resultId == null && item.id && this.container != null) {
item._resultId = this.generateResultId(this.container, item);
return $.extend({}, defaults, item);
SelectAdapter.prototype.matches = function (params, data) {
var matcher = this.options.get('matcher');
return matcher(params, data);
S2.define('pumselect2/data/array',[
], function (SelectAdapter, Utils, $) {
function ArrayAdapter ($element, options) {
var data = options.get('data') || [];
ArrayAdapter.__super__.constructor.call(this, $element, options);
this.addOptions(this.convertToOptions(data));
Utils.Extend(ArrayAdapter, SelectAdapter);
ArrayAdapter.prototype.select = function (data) {
var $option = this.$element.find('option').filter(function (i, elm) {
return elm.value == data.id.toString();
if ($option.length === 0) {
$option = this.option(data);
this.addOptions($option);
ArrayAdapter.__super__.select.call(this, data);
ArrayAdapter.prototype.convertToOptions = function (data) {
var $existing = this.$element.find('option');
var existingIds = $existing.map(function () {
return self.item($(this)).id;
// Filter out all items except for the one passed in the argument
function onlyItem (item) {
return $(this).val() == item.id;
for (var d = 0; d < data.length; d++) {
var item = this._normalizeItem(data[d]);
// Skip items which were pre-loaded, only merge the data
if ($.inArray(item.id, existingIds) >= 0) {
var $existingOption = $existing.filter(onlyItem(item));
var existingData = this.item($existingOption);
var newData = $.extend(true, {}, item, existingData);
var $newOption = this.option(newData);
$existingOption.replaceWith($newOption);
var $option = this.option(item);
var $children = this.convertToOptions(item.children);
Utils.appendMany($option, $children);
S2.define('pumselect2/data/ajax',[
], function (ArrayAdapter, Utils, $) {
function AjaxAdapter ($element, options) {
this.ajaxOptions = this._applyDefaults(options.get('ajax'));
if (this.ajaxOptions.processResults != null) {
this.processResults = this.ajaxOptions.processResults;
AjaxAdapter.__super__.constructor.call(this, $element, options);
Utils.Extend(AjaxAdapter, ArrayAdapter);
AjaxAdapter.prototype._applyDefaults = function (options) {
data: function (params) {
return $.extend({}, params, {
transport: function (params, success, failure) {
var $request = $.ajax(params);
return $.extend({}, defaults, options, true);
AjaxAdapter.prototype.processResults = function (results) {
AjaxAdapter.prototype.query = function (params, callback) {
if (this._request != null) {
// JSONP requests cannot always be aborted
if ($.isFunction(this._request.abort)) {
if (typeof options.url === 'function') {
options.url = options.url.call(this.$element, params);
if (typeof options.data === 'function') {
options.data = options.data.call(this.$element, params);
var $request = options.transport(options, function (data) {
var results = self.processResults(data, params);
if (self.options.get('debug') && window.console && console.error) {
// Check to make sure that the response included a `results` key.
if (!results || !results.results || !$.isArray(results.results)) {
'Select2: The AJAX results did not return an array in the ' +
'`results` key of the response.'
self.trigger('results:message', {
self._request = $request;
if (this.ajaxOptions.delay && params.term !== '') {
if (this._queryTimeout) {
window.clearTimeout(this._queryTimeout);
this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
S2.define('pumselect2/data/tags',[
function Tags (decorated, $element, options) {
var tags = options.get('tags');
var createTag = options.get('createTag');
if (createTag !== undefined) {
this.createTag = createTag;
var insertTag = options.get('insertTag');
if (insertTag !== undefined) {
this.insertTag = insertTag;
decorated.call(this, $element, options);
for (var t = 0; t < tags.length; t++) {
var item = this._normalizeItem(tag);
var $option = this.option(item);
this.$element.append($option);
Tags.prototype.query = function (decorated, params, callback) {
if (params.term == null || params.page != null) {
decorated.call(this, params, callback);
function wrapper (obj, child) {
for (var i = 0; i < data.length; i++) {
option.children != null &&