+ return transition && {
+ end: transitions[ transition ]
+ };
+}());
+
+/**
+ * A shared event bus used to provide events into
+ * the media workflows that 3rd-party devs can use to hook
+ * in.
+ */
+media.events = _.extend( {}, Backbone.Events );
+
+/**
+ * Makes it easier to bind events using transitions.
+ *
+ * @param {string} selector
+ * @param {Number} sensitivity
+ * @returns {Promise}
+ */
+media.transition = function( selector, sensitivity ) {
+ var deferred = $.Deferred();
+
+ sensitivity = sensitivity || 2000;
+
+ if ( $.support.transition ) {
+ if ( ! (selector instanceof $) ) {
+ selector = $( selector );
+ }
+
+ // Resolve the deferred when the first element finishes animating.
+ selector.first().one( $.support.transition.end, deferred.resolve );
+
+ // Just in case the event doesn't trigger, fire a callback.
+ _.delay( deferred.resolve, sensitivity );
+
+ // Otherwise, execute on the spot.
+ } else {
+ deferred.resolve();
+ }
+
+ return deferred.promise();
+};
+
+media.controller.Region = require( './controllers/region.js' );
+media.controller.StateMachine = require( './controllers/state-machine.js' );
+media.controller.State = require( './controllers/state.js' );
+
+media.selectionSync = require( './utils/selection-sync.js' );
+media.controller.Library = require( './controllers/library.js' );
+media.controller.ImageDetails = require( './controllers/image-details.js' );
+media.controller.GalleryEdit = require( './controllers/gallery-edit.js' );
+media.controller.GalleryAdd = require( './controllers/gallery-add.js' );
+media.controller.CollectionEdit = require( './controllers/collection-edit.js' );
+media.controller.CollectionAdd = require( './controllers/collection-add.js' );
+media.controller.FeaturedImage = require( './controllers/featured-image.js' );
+media.controller.ReplaceImage = require( './controllers/replace-image.js' );
+media.controller.EditImage = require( './controllers/edit-image.js' );
+media.controller.MediaLibrary = require( './controllers/media-library.js' );
+media.controller.Embed = require( './controllers/embed.js' );
+media.controller.Cropper = require( './controllers/cropper.js' );
+media.controller.CustomizeImageCropper = require( './controllers/customize-image-cropper.js' );
+media.controller.SiteIconCropper = require( './controllers/site-icon-cropper.js' );
+
+media.View = require( './views/view.js' );
+media.view.Frame = require( './views/frame.js' );
+media.view.MediaFrame = require( './views/media-frame.js' );
+media.view.MediaFrame.Select = require( './views/frame/select.js' );
+media.view.MediaFrame.Post = require( './views/frame/post.js' );
+media.view.MediaFrame.ImageDetails = require( './views/frame/image-details.js' );
+media.view.Modal = require( './views/modal.js' );
+media.view.FocusManager = require( './views/focus-manager.js' );
+media.view.UploaderWindow = require( './views/uploader/window.js' );
+media.view.EditorUploader = require( './views/uploader/editor.js' );
+media.view.UploaderInline = require( './views/uploader/inline.js' );
+media.view.UploaderStatus = require( './views/uploader/status.js' );
+media.view.UploaderStatusError = require( './views/uploader/status-error.js' );
+media.view.Toolbar = require( './views/toolbar.js' );
+media.view.Toolbar.Select = require( './views/toolbar/select.js' );
+media.view.Toolbar.Embed = require( './views/toolbar/embed.js' );
+media.view.Button = require( './views/button.js' );
+media.view.ButtonGroup = require( './views/button-group.js' );
+media.view.PriorityList = require( './views/priority-list.js' );
+media.view.MenuItem = require( './views/menu-item.js' );
+media.view.Menu = require( './views/menu.js' );
+media.view.RouterItem = require( './views/router-item.js' );
+media.view.Router = require( './views/router.js' );
+media.view.Sidebar = require( './views/sidebar.js' );
+media.view.Attachment = require( './views/attachment.js' );
+media.view.Attachment.Library = require( './views/attachment/library.js' );
+media.view.Attachment.EditLibrary = require( './views/attachment/edit-library.js' );
+media.view.Attachments = require( './views/attachments.js' );
+media.view.Search = require( './views/search.js' );
+media.view.AttachmentFilters = require( './views/attachment-filters.js' );
+media.view.DateFilter = require( './views/attachment-filters/date.js' );
+media.view.AttachmentFilters.Uploaded = require( './views/attachment-filters/uploaded.js' );
+media.view.AttachmentFilters.All = require( './views/attachment-filters/all.js' );
+media.view.AttachmentsBrowser = require( './views/attachments/browser.js' );
+media.view.Selection = require( './views/selection.js' );
+media.view.Attachment.Selection = require( './views/attachment/selection.js' );
+media.view.Attachments.Selection = require( './views/attachments/selection.js' );
+media.view.Attachment.EditSelection = require( './views/attachment/edit-selection.js' );
+media.view.Settings = require( './views/settings.js' );
+media.view.Settings.AttachmentDisplay = require( './views/settings/attachment-display.js' );
+media.view.Settings.Gallery = require( './views/settings/gallery.js' );
+media.view.Settings.Playlist = require( './views/settings/playlist.js' );
+media.view.Attachment.Details = require( './views/attachment/details.js' );
+media.view.AttachmentCompat = require( './views/attachment-compat.js' );
+media.view.Iframe = require( './views/iframe.js' );
+media.view.Embed = require( './views/embed.js' );
+media.view.Label = require( './views/label.js' );
+media.view.EmbedUrl = require( './views/embed/url.js' );
+media.view.EmbedLink = require( './views/embed/link.js' );
+media.view.EmbedImage = require( './views/embed/image.js' );
+media.view.ImageDetails = require( './views/image-details.js' );
+media.view.Cropper = require( './views/cropper.js' );
+media.view.SiteIconCropper = require( './views/site-icon-cropper.js' );
+media.view.SiteIconPreview = require( './views/site-icon-preview.js' );
+media.view.EditImage = require( './views/edit-image.js' );
+media.view.Spinner = require( './views/spinner.js' );
+
+},{"./controllers/collection-add.js":1,"./controllers/collection-edit.js":2,"./controllers/cropper.js":3,"./controllers/customize-image-cropper.js":4,"./controllers/edit-image.js":5,"./controllers/embed.js":6,"./controllers/featured-image.js":7,"./controllers/gallery-add.js":8,"./controllers/gallery-edit.js":9,"./controllers/image-details.js":10,"./controllers/library.js":11,"./controllers/media-library.js":12,"./controllers/region.js":13,"./controllers/replace-image.js":14,"./controllers/site-icon-cropper.js":15,"./controllers/state-machine.js":16,"./controllers/state.js":17,"./utils/selection-sync.js":18,"./views/attachment-compat.js":20,"./views/attachment-filters.js":21,"./views/attachment-filters/all.js":22,"./views/attachment-filters/date.js":23,"./views/attachment-filters/uploaded.js":24,"./views/attachment.js":25,"./views/attachment/details.js":26,"./views/attachment/edit-library.js":27,"./views/attachment/edit-selection.js":28,"./views/attachment/library.js":29,"./views/attachment/selection.js":30,"./views/attachments.js":31,"./views/attachments/browser.js":32,"./views/attachments/selection.js":33,"./views/button-group.js":34,"./views/button.js":35,"./views/cropper.js":36,"./views/edit-image.js":37,"./views/embed.js":38,"./views/embed/image.js":39,"./views/embed/link.js":40,"./views/embed/url.js":41,"./views/focus-manager.js":42,"./views/frame.js":43,"./views/frame/image-details.js":44,"./views/frame/post.js":45,"./views/frame/select.js":46,"./views/iframe.js":47,"./views/image-details.js":48,"./views/label.js":49,"./views/media-frame.js":50,"./views/menu-item.js":51,"./views/menu.js":52,"./views/modal.js":53,"./views/priority-list.js":54,"./views/router-item.js":55,"./views/router.js":56,"./views/search.js":57,"./views/selection.js":58,"./views/settings.js":59,"./views/settings/attachment-display.js":60,"./views/settings/gallery.js":61,"./views/settings/playlist.js":62,"./views/sidebar.js":63,"./views/site-icon-cropper.js":64,"./views/site-icon-preview.js":65,"./views/spinner.js":66,"./views/toolbar.js":67,"./views/toolbar/embed.js":68,"./views/toolbar/select.js":69,"./views/uploader/editor.js":70,"./views/uploader/inline.js":71,"./views/uploader/status-error.js":72,"./views/uploader/status.js":73,"./views/uploader/window.js":74,"./views/view.js":75}],20:[function(require,module,exports){
+/**
+ * wp.media.view.AttachmentCompat
+ *
+ * A view to display fields added via the `attachment_fields_to_edit` filter.
+ *
+ * @class
+ * @augments wp.media.View
+ * @augments wp.Backbone.View
+ * @augments Backbone.View
+ */
+var View = wp.media.View,
+ AttachmentCompat;
+
+AttachmentCompat = View.extend({
+ tagName: 'form',
+ className: 'compat-item',
+
+ events: {
+ 'submit': 'preventDefault',
+ 'change input': 'save',
+ 'change select': 'save',
+ 'change textarea': 'save'
+ },
+
+ initialize: function() {
+ this.listenTo( this.model, 'change:compat', this.render );
+ },