define([
  'jquery',
  './base',
  '../utils'
], function ($, BaseSelection, Utils) {
  function MultipleSelection ($element, options) {
    MultipleSelection.__super__.constructor.apply(this, arguments);
  }
  Utils.Extend(MultipleSelection, BaseSelection);
  MultipleSelection.prototype.render = function () {
    var $selection = MultipleSelection.__super__.render.call(this);
    $selection.addClass('select2-selection--multiple');
    $selection.html(
      '<ul class="select2-selection__rendered"></ul>'
    );
    return $selection;
  };
  MultipleSelection.prototype.bind = function (container, $container) {
    var self = this;
    MultipleSelection.__super__.bind.apply(this, arguments);
    this.$selection.on('click', function (evt) {
      self.trigger('toggle', {
        originalEvent: evt
      });
    });
    this.$selection.on(
      'click',
      '.select2-selection__choice__remove',
      function (evt) {
        // Ignore the event if it is disabled
        if (self.isDisabled()) {
          return;
        }
        var $remove = $(this);
        var $selection = $remove.parent();
        var data = Utils.GetData($selection[0], 'data');
        self.trigger('unselect', {
          originalEvent: evt,
          data: data
        });
      }
    );
  };
  MultipleSelection.prototype.clear = function () {
    var $rendered = this.$selection.find('.select2-selection__rendered');
    $rendered.empty();
    $rendered.removeAttr('title');
  };
  MultipleSelection.prototype.display = function (data, container) {
    var template = this.options.get('templateSelection');
    var escapeMarkup = this.options.get('escapeMarkup');
    return escapeMarkup(template(data, container));
  };
  MultipleSelection.prototype.selectionContainer = function () {
    var $container = $(
      '<li class="select2-selection__choice">' +
        '<span class="select2-selection__choice__remove" role="presentation">' +
          '×' +
        '</span>' +
      '</li>'
    );
    return $container;
  };
  MultipleSelection.prototype.update = function (data) {
    this.clear();
    if (data.length === 0) {
      return;
    }
    var $selections = [];
    for (var d = 0; d < data.length; d++) {
      var selection = data[d];
      var $selection = this.selectionContainer();
      var formatted = this.display(selection, $selection);
      $selection.append(formatted);
      var title = selection.title || selection.text;
      if (title) {
        $selection.attr('title', title);
      }
      Utils.StoreData($selection[0], 'data', selection);
      $selections.push($selection);
    }
    var $rendered = this.$selection.find('.select2-selection__rendered');
    Utils.appendMany($rendered, $selections);
  };
  return MultipleSelection;
});
 
  |