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;

});