diff options
Diffstat (limited to 'sites/all/modules/media/js/media.browser.js')
-rw-r--r-- | sites/all/modules/media/js/media.browser.js | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/sites/all/modules/media/js/media.browser.js b/sites/all/modules/media/js/media.browser.js new file mode 100644 index 000000000..88490e598 --- /dev/null +++ b/sites/all/modules/media/js/media.browser.js @@ -0,0 +1,124 @@ +/** + * @file + * Provides default functions for the media browser + */ + +(function ($) { +namespace('Drupal.media.browser'); + +Drupal.media.browser.selectedMedia = []; +Drupal.media.browser.mediaAdded = function () {}; +Drupal.media.browser.selectionFinalized = function (selectedMedia) { + // This is intended to be overridden if a callee wants to be triggered + // when the media selection is finalized from inside the browser. + // This is used for the file upload form for instance. +}; + +Drupal.behaviors.MediaBrowser = { + attach: function (context) { + if (Drupal.settings.media && Drupal.settings.media.selectedMedia) { + Drupal.media.browser.selectMedia(Drupal.settings.media.selectedMedia); + // Fire a confirmation of some sort. + Drupal.media.browser.finalizeSelection(); + } + + // Instantiate the tabs. + var showFunc = function(event, ui) { + // Store index of the tab being activated. + if (parent_iframe = Drupal.media.browser.getParentIframe(window)) { + $(parent_iframe).attr('current_tab', $('#media-tabs-wrapper > ul > li.ui-state-active').index()); + } + }; + var activeTab = Drupal.media.browser.tabFromHash(); + $('#media-browser-tabset').once('MediaBrowser').tabs({ + selected: activeTab, // jquery < 1.9 + active: activeTab, // jquery >= 1.9 + show: showFunc, // jquery ui < 1.8 + activate: showFunc // jquery ui >= 1.8 + }); + + $('.media-browser-tab').each( Drupal.media.browser.validateButtons ); + } + // Wait for additional params to be passed in. +}; + +Drupal.media.browser.getParentIframe = function (window) { + var arrFrames = parent.document.getElementsByTagName("IFRAME"); + for (var i = 0; i < arrFrames.length; i++) { + if (arrFrames[i].contentWindow === window) { + return arrFrames[i]; + } + } +} + +/** + * Get index of the active tab from window.location.hash + */ +Drupal.media.browser.tabFromHash = function () { + if (parent_iframe = Drupal.media.browser.getParentIframe(window)) { + return $(parent_iframe).attr('current_tab'); + } + return 0; +}; + +Drupal.media.browser.launch = function () { + +}; + +Drupal.media.browser.validateButtons = function() { + // The media browser runs in an IFRAME. The Drupal.media.popups.mediaBrowser() + // function sets up the IFRAME and an "OK" button that is outside of the + // IFRAME, so that its click handlers can destroy the IFRAME while retaining + // information about what media items were selected. However, Drupal UI + // convention is to place all action buttons on the same "line" at the bottom + // of the form, so if the form within the IFRAME contains a "Submit" button or + // other action buttons, then the "OK" button will appear below the IFRAME + // which breaks this convention and is confusing to the user. Therefore, we + // add a "Submit" button inside the IFRAME, and have its click action trigger + // the click action of the corresponding "OK" button that is outside the + // IFRAME. media.css contains CSS rules that hide the outside buttons. + + // If a submit button is present, another round-trip to the server is needed + // before the user's selection is finalized. For these cases, when the form's + // real Submit button is clicked, the server either returns another form for + // the user to fill out, or else a completion page that contains or sets the + // Drupal.media.browser.selectedMedia variable. If the latter, then + // Drupal.media.popups.mediaBrowser.mediaBrowserOnLoad() auto-triggers the + // "OK" button action to finalize the selection and remove the IFRAME. + + // We need to check for the fake submit button that is used on non-form based + // pane content. On these items we need to bind the clicks so that media can + // be selected or the window can be closed. This is still a hacky approach, + // but it is a step in the right direction. + + $('a.button.fake-submit', this).once().bind('click', Drupal.media.browser.submit); +}; + +Drupal.media.browser.submit = function () { + // @see Drupal.media.browser.validateButtons(). + var buttons = $(parent.window.document.body).find('#mediaBrowser').parent('.ui-dialog').find('.ui-dialog-buttonpane button'); + buttons[0].click(); + + // Return false to prevent the fake link "click" from continuing. + return false; +} + +Drupal.media.browser.selectMedia = function (selectedMedia) { + Drupal.media.browser.selectedMedia = selectedMedia; +}; + +Drupal.media.browser.selectMediaAndSubmit = function (selectedMedia) { + Drupal.media.browser.selectedMedia = selectedMedia; + Drupal.media.browser.submit(); +}; + +Drupal.media.browser.finalizeSelection = function () { + if (!Drupal.media.browser.selectedMedia) { + throw new exception(Drupal.t('Cannot continue, nothing selected')); + } + else { + Drupal.media.browser.selectionFinalized(Drupal.media.browser.selectedMedia); + } +}; + +}(jQuery)); |