| define([
  'jquery'
], function ($) {
  function EventRelay () { }
  EventRelay.prototype.bind = function (decorated, container, $container) {
    var self = this;
    var relayEvents = [
      'open', 'opening',
      'close', 'closing',
      'select', 'selecting',
      'unselect', 'unselecting'
    ];
    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
    decorated.call(this, container, $container);
    container.on('*', function (name, params) {
      // Ignore events that should not be relayed
      if ($.inArray(name, relayEvents) === -1) {
        return;
      }
      // The parameters should always be an object
      params = params || {};
      // Generate the jQuery event for the Select2 event
      var evt = $.Event('select2:' + name, {
        params: params
      });
      self.$element.trigger(evt);
      // Only handle preventable events if it was one
      if ($.inArray(name, preventableEvents) === -1) {
        return;
      }
      params.prevented = evt.isDefaultPrevented();
    });
  };
  return EventRelay;
});
 |