Projet

Général

Profil

Bug #13145 » silverpeas-popup.js

David Lesimple, 05/07/2022 11:46

 
/*
* Copyright (C) 2000 - 2022 Silverpeas
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* As a special exception to the terms and conditions of version 3.0 of
* the GPL, you may redistribute this Program in connection withWriter Free/Libre
* Open Source Software ("FLOSS") applications as described in Silverpeas's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* "http://www.silverpeas.org/docs/core/legal/floss_exception.html"
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

/**
* Silverpeas plugin build upon JQuery to display a modal dialog box.
* It uses the JQuery UI framework.
*/
(function($, $window) {
if ($.popup) {
return;
}

var popupDebug = false;

var FS_MANAGER = new function() {
this.isWindowCompatible = function() {
return top.spLayout && !top.spLayout.isWindowTop($window);
};
this.getLayoutManager = function() {
var _topWindow = top.spLayout ? top.spLayout.getWindowTopFrom($window).window : $window;
return _topWindow.spAdminLayout ? _topWindow.spAdminLayout : $window.spLayout;
};
this.top$ = function() {
return top.spLayout ? top.spLayout.getWindowTopFrom($window).jQuery : $;
};
this.topDocument = function() {
return top.spLayout ? top.spLayout.getWindowTopFrom($window).document : document;
}
};

var __displayFullscreenModalBackground = FS_MANAGER.isWindowCompatible();

// Little hack to prevent some unexpected errors when escape key is
// pressed during an ajax request
const __preventEscape = function(e) {
if (e.keyCode === 27) {
e.preventDefault();
}
};

$.popup = {
/**
* Shows a waiting information. Usually used while the popup is rendering or when the treatment
* fired by the popup is being processed.
*/
showWaiting: function() {
var $waiting = $("#spWaiting");
if ($waiting.length === 0) {
$waiting = $("<div>").attr('id', 'spWaiting').attr('style',
'display: none; border: 0; padding: 0; text-align: center; overflow: hidden;');
$(document.body).append($waiting);
$waiting.popup("waiting");
$waiting.dialog("widget").keydown(__preventEscape);
}
$waiting.dialog("open");
},
/**
* Hides the waiting information. Usually used once the popup is fully rendered or once the
* treatment fired by the popin is done.
*/
hideWaiting: function() {
var $waiting = $("#spWaiting");
if ($waiting.length > 0) {
$waiting.dialog("close");
$waiting.dialog("destroy");
$waiting.remove();
}
},
/**
* Shows a confirmation popup with the specified message and the popup parameters.
* @param message the message to display in the popup.
* @param params the parameters to parametrize the popup window.
*/
confirm: function(message, params) {
var options = params;
var $confirm = $('<div>').append($('<p>').append(message));
if (typeof params === 'function') {
options = {
callback: params
}
}
$confirm.popup('confirmation', options);
},
/**
* Shows a validate popup with the specified message and the popup parameters.
* @param message the message to display in the popup.
* @param params the parameters to parametrize the popup window.
*/
validate: function(message, params) {
let options = params;
const $confirm = $('<div>').append($('<p>').append(message));
if (typeof params === 'function') {
options = {
callback: params
}
}
$confirm.popup('validation', options);
},
/**
* Shows an info popup with the specified message and the popup parameters.
* @param message the info message to display in the popup.
* @param params the parameters to parametrize the popup window.
*/
info: function(message, params) {
var options = params;
var $info = $('<div>').append($('<p>').append(message));
if (typeof params === 'function') {
options = {
callbackOnClose: params
}
}
$info.popup('information', options);
},
/**
* Shows an error popup with the specified message and the popup parameters.
* @param message the error message to display in the popup.
* @param params the parameters to parametrize the popup window.
*/
error: function(message, params) {
var options = params;
message = message.replaceAll('\n', '<br/>');
var $error = $('<div>').append($('<p>').append(message));
if (typeof params === 'function') {
options = {
callback: params
}
}
$error.popup('error', options);
},
/**
* Loads the popup from the specified URL.
* @param {string} url the url at which the popup's content is loaded.
* @param {object} [context] the HTTP context to use when requesting the popup's content: it is
* an object with as attributes:
* <ul>
* <li> method: the HTTP method to use. By default, if not set, 'GET'. Either 'GET' or 'POST'
* <li> params: the HTTP parameters to pass with the HTTP request.
* </ul>
* @return (*) a wrapper of the loaded popup.
*/
load: function(url, context) {
var loadRequest = sp.ajaxRequest(url);
if (context) {
if (context.method === 'POST') {
loadRequest = loadRequest.byPostMethod();
}
if (context.params) {
loadRequest = loadRequest.withParams(context.params);
}
}
var loadPromise = loadRequest.send();
return {
/**
* Shows the loaded popup by using the specified rendering type and popup parameters.
* @param type the popup rendering type.
* @param params the parameters to parametrize the popup window.
* @return a promise within which the popup is being rendered. Once the popup is rendered,
* any treatment declared in the then() function is then invoked.
*/
show: function(type, params) {
jQuery.popup.showWaiting();
return new Promise(function(resolve, reject) {
var options = params;
loadPromise.then(function(request) {
var data = request.responseText;
var $popup = $('#popupHelperContainer');
if ($popup.length !== 0) {
$popup.remove();
}
$popup = $('<div>', {id: 'popupHelperContainer', 'style' : 'display:none'});
$popup.appendTo(document.body);
$popup.append(data);
if (typeof params === 'function') {
options = {
callback: params
}
}
var onClose = options.callbackOnClose;
options.callbackOnClose = function(arg) {
if (typeof onClose === 'function') {
onClose.call(arg);
}
$popup.remove();
};
$popup.popup(type, options);
resolve(data);
if (sp.promise.isOne(options.openPromise)) {
options.openPromise.then(jQuery.popup.hideWaiting);
} else {
jQuery.popup.hideWaiting();
}
}, function(request) {
notyError(request.responseText);
reject();
jQuery.popup.hideWaiting();
});
});
},
close : function() {
jQuery('#popupHelperContainer').popup('close');
}
}
}
};

var __getLabel = function(key) {
return sp.i18n.get(key);
};

/**
* The different methods on messages handled by the plugin.
*/
var methods = {
/**
* Destroy the current popup
*/
destroy : function() {
$(this).dialog('close');
$(this).dialog('destroy');
},
/**
* Close the current popup
*/
close : function() {
$(this).dialog('close');
},
/**
* The modal free dialog : configure as you want your popup.
*/
free: function(options) {

// Common settings
var settings = __extendCommonSettings(options);

// Internal settings
settings = $.extend(__buildInternalSettings({
buttonDisplayed: false,
width: 'auto'
}), settings);

updateSettingsForIE7(settings, options);

// Dialog
return __openPopup($(this), settings);
},
/**
* The modal basic dialog. (scroll is deactivated)
* It accepts one parameter that is an object with following attributes:
* - title : the document title of the dialog box,
* - callback : the callback to invoke when the user clicks on the yes button. The callback must
* returns a boolean indicating that all is ok and the dialog box can be closed or a promise
* which resolve action close the dialog box,
* - callbackOnClose : the callback on dialog box closing,
* - width : width of content. Mandatory for IE7 browser and ignored in other cases,
* - height : height of content. Mandatory for IE7 browser and ignored in other cases.
*/
basic: function(options) {

// Common settings
var settings = __extendCommonSettings(options);

// Internal settings
$.extend(settings, __buildInternalSettings({
buttonDisplayed: false,
disabledParentScroll: true,
width: 'auto'
}));

updateSettingsForIE7(settings, options);

// Dialog
return __openPopup($(this), settings);
},
/**
* The modal information dialog.
* It accepts one parameter that is an object with following attributes:
* - title : the title of the dialog box (if it is empty a default title is used),
* - callback : the callback to invoke when the user clicks on the yes button. The callback must
* returns a boolean indicating that all is ok and the dialog box can be closed or a promise
* which resolve action close the dialog box,
* - callbackOnClose : the callback on dialog box closing.
*/
information: function(options) {

// Common settings
var settings = __extendCommonSettings(options);
if (!settings.title) {
settings.title = __getLabel('GML.information.dialog.title');
}

// Internal settings
$.extend(settings, __buildInternalSettings({
buttonTextNo: __getLabel('GML.ok'),
isMaxWidth: true
}));

// Dialog
return __openPopup($(this), settings);
},
/**
* The modal error dialog.
* It accepts one parameter that is an object with following attributes:
* - title : the title of the dialog box (if it is empty a default title is used),
* - callback : the callback to invoke when the user clicks on the yes button. The callback must
* returns a boolean indicating that all is ok and the dialog box can be closed or a promise
* which resolve action close the dialog box,
* - callbackOnClose : the callback on dialog box closing.
*/
error: function(options) {

// Common settings
var settings = __extendCommonSettings(options);
if (!settings.title) {
settings.title = __getLabel('GML.error.dialog.title');
}

// Internal settings
$.extend(settings, __buildInternalSettings({
buttonTextNo: __getLabel('GML.ok'),
isMaxWidth: true
}));

// Dialog
return __openPopup($(this), settings);
},
/**
* The modal help dialog.
* It accepts one parameter that is an object with following attributes:
* - title : the title of the dialog box (if it is empty a default title is used),
* - callback : the callback to invoke when the user clicks on the yes button. The callback must
* returns a boolean indicating that all is ok and the dialog box can be closed or a promise
* which resolve action close the dialog box,
* - callbackOnClose : the callback on dialog box closing.
*/
help: function(options) {

// Common settings
var settings = __extendCommonSettings(options);
if (!settings.title) {
settings.title = __getLabel('GML.help.dialog.title');
}

// Internal settings
$.extend(settings, __buildInternalSettings({
buttonTextNo: __getLabel('GML.ok'),
isMaxWidth: true,
dialogClass: 'help-modal-message'
}));

// Dialog
return __openPopup($(this), settings);
},
/**
* The modal validation dialog.
* It accepts one parameter that is an object with following attributes:
* - title : the title of the dialog box,
* - callback : the callback to invoke when the user clicks on the yes button. The callback must
* returns a boolean indicating that all is ok and the dialog box can be closed or a promise
* which resolve action close the dialog box,
* - callbackOnClose : the callback on dialog box closing.
*/
validation: function(options) {

// Common settings
var settings = __extendCommonSettings(options);

// Internal settings
settings = $.extend(__buildInternalSettings({
buttonTextYes: __getLabel('GML.validate'),
buttonTextNo: __getLabel('GML.cancel'),
isMaxWidth: true
}), settings);

// Dialog
return __openPopup($(this), settings);
},
/**
* The modal confirmation dialog.
* A warning icon is automatically inserted into the title bar.
* It accepts one parameter that is an object with following attributes:
* - title : the title of the dialog box (if it is empty a default title is used),
* - callback : the callback to invoke when the user clicks on the yes button. The callback must
* returns a boolean indicating that all is ok and the dialog box can be closed or a promise
* which resolve action close the dialog box,
* - callbackOnClose : the callback on dialog box closing.
*/
confirmation: function(options) {

// Common settings
var settings = __extendCommonSettings(options);
if (!settings.title) {
settings.title = __getLabel('GML.confirmation.dialog.title');
}
var $title = $('<div>').attr('style', 'display: table;');
var $titleRow = $('<div>').attr('style', 'display: table-row;');
$title.append($titleRow);
var $icon = $('<span>').addClass('ui-icon ui-icon-alert');
$icon.attr('style', 'float:left; margin:0 7px 0 0;');
var $titleText = $('<div>').attr('style', 'display: table-cell;vertical-align: bottom;');
$titleText.html(settings.title);
$titleRow.append($('<div>').attr('style',
'display: table-cell;vertical-align: middle;').append($icon));
$titleRow.append($titleText);
settings.title = $('<div>').append($title).html();

// Internal settings
$.extend(settings, __buildInternalSettings({
buttonTextYes: __getLabel('GML.yes'),
buttonTextNo: __getLabel('GML.no'),
isMaxWidth: true
}));

// Dialog
return __openPopup($(this), settings);
},
/**
* The modal preview dialog.
* It accepts one parameter that is an object with following attributes:
* - title : the document title of the dialog box,
* - callback : the callback to invoke when the user clicks on the yes button. The callback must
* returns a boolean indicating that all is ok and the dialog box can be closed or a promise
* which resolve action close the dialog box,
* - callbackOnClose : the callback on dialog box closing,
* - width : width of content. Mandatory for IE7 browser and ignored in other cases,
* - height : height of content. Mandatory for IE7 browser and ignored in other cases.
*/
preview: function(options) {

// Common settings
var settings = __extendCommonSettings(options);
settings.title = __getLabel('GML.preview.dialog.title');
if (options.title && options.title.length > 0) {
settings.title =
settings.title + " " + __getLabel('GML.preview.dialog.title.of') + " " + options.title;
}

// Internal settings
$.extend(settings, __buildInternalSettings({
buttonDisplayed: false,
width: 'auto'
}));

updateSettingsForIE7(settings, options);

// Dialog
return __openPopup($(this), settings);
},
/**
* The modal view dialog.
* It accepts one parameter that is an object with following attributes:
* - title : the document title of the dialog box,
* - callback : the callback to invoke when the user clicks on the yes button. The callback must
* returns a boolean indicating that all is ok and the dialog box can be closed or a promise
* which resolve action close the dialog box,
* - callbackOnClose : the callback on dialog box closing,
* - width : width of content. Mandatory for IE7 browser and ignored in other cases,
* - height : height of content. Mandatory for IE7 browser and ignored in other cases.
*/
view: function(options) {

// Common settings
var settings = __extendCommonSettings(options);
settings.title = __getLabel('GML.view.dialog.title');
if (options.title && options.title.length > 0) {
settings.title =
settings.title + " " + __getLabel('GML.view.dialog.title.of') + " " + options.title;
}

// Internal settings
$.extend(settings, __buildInternalSettings({
buttonDisplayed: false,
width: 'auto'
}));

updateSettingsForIE7(settings, options);

// Dialog
return __openPopup($(this), settings);
},
/**
* The modal waiting dialog.
*/
waiting: function() {
var $container = $(this);

// Common settings
var settings = __extendCommonSettings({});

// Internal settings
$.extend(settings, __buildInternalSettings({
displayTitle: false,
closeOnEscape: false,
buttonDisplayed: false,
width: "32px",
height: 39
}));

// Waiting animation
var imageUrl = popupViewGeneratorIconPath + '/inProgress.gif';
$container.html($('<img>').attr('src', imageUrl).attr('width', '32').attr('height', '32'));

// Dialog
return __openPopup($container, settings);
}
};

/**
* The modal dialog box Silverpeas plugin based on JQuery.
* This JQuery plugin abstrats the way an HTML element (usually a form or a div) is rendered
* within a JQuery UI dialog.
*
* Here the popup namespace in JQuery in which methods on messages are provided.
*/
$.fn.popup = function(method) {
if (methods[method]) {
return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
return methods.validation.apply(this, arguments);
} else {
return $.error('Method ' + method + ' does not exist on jQuery.popup');
}
};

/**
* Private function that centralizes extension of common settings
*/
function __extendCommonSettings(options) {
var settings = {
openPromise: undefined,
title: '',
callback: null,
alternativeCallback: null,
callbackOnClose: null
};
if (options) {
$.extend(settings, options);
}
return settings;
}

/**
* Private function that centralizes extension of internal settings
*/
function __buildInternalSettings(options) {
var settings = {
displayTitle: true,
closeOnEscape: true,
disabledParentScroll: false,
buttonDisplayed: true,
buttonTextYes: '',
buttonTextNo: '',
isMaxWidth: false,
minWidth: undefined,
maxWidth: undefined,
width: 570,
height: 'auto',
dialogClass: ''
};
if (options) {
$.extend(settings, options);
}
return settings;
}

/**
* Private function that checks if the browser is an IE7 one
*/
function __isIE7() {
return (navigator.appVersion.indexOf("MSIE 7.") !== -1);
}

function updateSettingsForIE7(settings, options) {
if (__isIE7()) {
// Width & Height
if (options.width) {
settings.width = options.width;
}
if (options.height) {
settings.height = Number(options.height) + 27;
}
}
}

/**
* Private function that centralizes a dialog creation and its opening.
* Be careful, options have to be well initialized before this function call
*/
function __openPopup($this, options) {
if (!$this.length) {
return $this;
}

return $this.each(function() {
var $_this = $(this);
if (!options.title) {
options.title = $_this.attr('title');
}

$_this.dialog({
closeOnEscape: options.closeOnEscape,
title: options.title,
autoOpen: false,
modal: true,
resizable: false,
height: options.height,
dialogClass: options.dialogClass
});

// Removing the title if requested
if (!options.displayTitle) {
$_this.dialog('widget').find(".ui-dialog-titlebar").hide();
}

// Buttons
if (options.buttonDisplayed) {
var buttons = [];
if (options.buttonTextYes) {
buttons.push({
text: options.buttonTextYes,
click: function() {
var whenIsOk;
if (options.callback) {
// A callback must be processed before closing the dialog
var result = options.callback.call($_this);
if (sp.promise.isOne(result)) {
// The result of the callback is a promise, the dialog is closed after resolve
whenIsOk = result;
} else if (typeof result === 'undefined' || result) {
// No result or true result, the dialog can be closed
whenIsOk = sp.promise.resolveDirectlyWith();
} else {
// Explicit false result, the dialog stays open
whenIsOk = sp.promise.rejectDirectlyWith();
}
} else {
// No callback, closing in any case
whenIsOk = sp.promise.resolveDirectlyWith();
}
// Closing the dialog if ok
whenIsOk.then(function() {
$_this.dialog("close");
})['catch'](function() {
sp.log.debug('dialog not closed as validation failed');
});
}
});
}
if (options.buttonTextNo) {
buttons.push({
text: options.buttonTextNo,
click: function() {
if (options.alternativeCallback) {
options.alternativeCallback.call($_this);
}
$_this.dialog("close");
}
});
}
if (buttons.length > 0) {
$_this.dialog("option", "buttons", buttons);
}
}

// Callback on close
$_this.dialog("option", "close", function(event, ui) {
if (options.callbackOnClose) {
options.callbackOnClose.call(this);
}
});

// Scroll
if (options.disabledParentScroll) {
$_this.dialog("option", "open", function(event, ui) {
$("html,body").css("overflow", "hidden");
});
$_this.dialog("option", "beforeClose", function(event, ui) {
$("html,body").css("overflow", "auto");
});
}

// Width
var width = "" + options.width;
var maxWidth = (width !== 'auto') ? width.replace(/px/, '') + 'px' : width;
if (options.isMaxWidth) {
$_this.dialog("option", "width", "auto");
} else {
$_this.dialog("option", "width", width);
}
var __openPopup = function() {
// Dialog opening
var $dialog = $_this.dialog('open');

// Since JQuery upgrade (jquery-1.10.1.min.js), HTML code in title is escaped.
// The below code surrounds this problem.
// For new version of jquery, please verify if it can be removed.
$dialog.data("uiDialog")._title = function(title) {
title.html(this.options.title);
};
$dialog.dialog('option', 'title', options.title);

// This below code handles the width of the dialog after it has been displayed.
if (options.isMaxWidth) {
// If max width is required, resizing and repositioning after the dialog open
$_this.dialog("widget").css('max-width', maxWidth);
$_this.dialog({position : $_this.dialog('option', 'position')});
}

// Min Width
if (options.minWidth) {
var _minWidth = "" + options.minWidth;
_minWidth = (_minWidth !== 'auto') ? _minWidth.replace(/px/, '') + 'px' : _minWidth;
$_this.dialog("widget").css('min-width', _minWidth);
}

// Max Width
if (options.maxWidth) {
var _maxWidth = "" + options.maxWidth;
_maxWidth = (_maxWidth !== 'auto') ? _maxWidth.replace(/px/, '') + 'px' : _maxWidth;
$_this.dialog("widget").css('max-width', _maxWidth);
}
};
if (sp.promise.isOne(options.openPromise)) {
options.openPromise.then(__openPopup);
} else {
__openPopup();
}
});
}

const spOnTopContext = new function() {
this.refreshState = function() {
const existsPopupsOnTop = FS_MANAGER.top$()('div.ui-dialog').filter(':visible').length > 0;
spFullscreenModalBackgroundContext.refreshBackgroundState(existsPopupsOnTop);
const __layoutManager = FS_MANAGER.getLayoutManager();
if (__layoutManager) {
if (existsPopupsOnTop) {
__layoutManager.getBody().getContent().forceOnBackground();
} else {
__layoutManager.getBody().getContent().unforceOnBackground();
}
}
}
}

function __openOnTop() {
spOnTopContext.refreshState();
}

function __closeFromTop() {
spOnTopContext.refreshState();
}

const spFullscreenModalBackgroundContext = new function() {
const __debug = function(message) {
__logDebug("FSContext -", message)
};
const removeContainers = function($containers) {
if ($containers.length > 0) {
$containers.each(function(index, $container){
$container.spUIManager.destroy();
});
__debug($containers.length + " dialogs removed");
}
};
this.refreshBackgroundState = function(forceBackground) {
const __layoutManager = FS_MANAGER.getLayoutManager();
if (__layoutManager) {
if (!forceBackground && this.getContainers().length > 0) {
__layoutManager.getBody().getContent().setOnForeground();
} else {
__layoutManager.getBody().getContent().setOnBackground();
}
}
};
this.clear = function() {
__debug("clearing");
removeContainers(this.getContainers());
this.refreshBackgroundState();
};
this.removeLast = function() {
__debug("removing last");
removeContainers(this.getContainers().filter(':last'));
this.refreshBackgroundState();
};
this.getContainers = function() {
return FS_MANAGER.top$()(".spFullscreenModalBackground", FS_MANAGER.topDocument());
};
};

/**
* Private function that centralizes a fullscreen modal background.
* Be careful, options have to be well initialized before this function call
*/
function __openFullscreenModalBackground($dialogInstance) {
spFullscreenModalBackgroundContext.refreshBackgroundState();
const $container = FS_MANAGER.top$()("<div>")
.attr('class', 'spFullscreenModalBackground ui-widget-overlay ui-front')
.attr('style', 'display: none; border: 0; padding: 0; overflow: hidden;');
FS_MANAGER.top$()(FS_MANAGER.topDocument().body).append($container);
const $containerElement = $container[0];
$containerElement.spUIManager = new function() {
this.isOpen = function() {
return $container.css('display') !== 'none';
};
this.open = function() {
return $container.show();
};
this.close = function() {
return $container.hide();
};
this.destroy = function() {
return $container.remove();
};
};

// Little hack to prevent some unexpected errors when escape key is
// pressed during an ajax request
$containerElement.addEventListener('keydown', __preventEscape);

// Handling HTML forms in order to close the dialog on submit action.
// As jQuery Handles only jQuery triggering, jQuery method and the standard one must be
// managed.
var $forms = $('form', $dialogInstance);
var dialogInstanceElement = $dialogInstance[0];
var forms = dialogInstanceElement.querySelectorAll("form");
var __lastRegisteredHandler = dialogInstanceElement.__lastRegisteredHandler;
if (__lastRegisteredHandler) {
$forms.unbind('submit', __lastRegisteredHandler);
[].slice.call(forms, 0).forEach(function(form) {
form.removeEventListener('submit', __lastRegisteredHandler);
});
}
dialogInstanceElement.__lastRegisteredHandler = function() {
try {
if ($containerElement.spUIManager.isOpen()) {
$containerElement.spUIManager.close();
}
} catch (e) {
sp.log.debug(e);
}
return true;
};
$forms.bind('submit', dialogInstanceElement.__lastRegisteredHandler);
[].slice.call(forms, 0).forEach(function(form) {
form.addEventListener('submit', dialogInstanceElement.__lastRegisteredHandler);
});

// Displaying the dialog.
$containerElement.spUIManager.open();
spFullscreenModalBackgroundContext.refreshBackgroundState();
}

function __closeFullscreenModalBackground() {
spFullscreenModalBackgroundContext.removeLast();
}

function __adjustPosition(dialogOptions) {
var position = dialogOptions.position;
if (position.my === "center" && position.at === "center" && position.of === window) {
var _layoutManager = FS_MANAGER.getLayoutManager();
var headerHeightOffset = _layoutManager.getHeader().getContainer().offsetHeight / 2;
var isContentFullWidth = !(FS_MANAGER.top$()(_layoutManager.getBody().getContent().getContainer()).position().left);
if (isContentFullWidth) {
var navigationHeightOffset = _layoutManager.getBody().getNavigation().getContainer().offsetHeight / 2;
position.at = "center center-" + (headerHeightOffset + navigationHeightOffset);
} else {
var navigationWidthOffset = _layoutManager.getBody().getNavigation().getContainer().offsetWidth / 2;
position.at = "center-" + navigationWidthOffset + " center-" + headerHeightOffset;
}
}
return position;
}

$.widget("ui.dialog", $.ui.dialog, {
open : function() {
if (!!$window.opener) {
return this._super();
}
const isFS = __displayFullscreenModalBackground && !this._isOpen;
if (isFS) {
__adjustPosition(this.options);
__openFullscreenModalBackground(this.element);
}
try {
return this._super();
} finally {
if (!isFS) {
__openOnTop();
}
}
},
close : function() {
if (!!$window.opener) {
return this._super();
}
const isFS = __displayFullscreenModalBackground && this._isOpen;
if (isFS) {
__closeFullscreenModalBackground();
}
try {
return this._super();
} finally {
if (!isFS) {
__closeFromTop();
}
}
},
destroy : function() {
if (!!$window.opener) {
return this._super();
}
const isFS = __displayFullscreenModalBackground && this._isOpen;
if (isFS) {
__closeFullscreenModalBackground();
}
try {
return this._super();
} finally {
if (!isFS) {
__closeFromTop();
}
}
}
});

if (__displayFullscreenModalBackground) {
__logDebug("cleaning popup from iframe, window " + window.name);
spFullscreenModalBackgroundContext.clear();
}

/**
* Logs debug messages.
* @private
*/
function __logDebug() {
if (popupDebug) {
var mainDebugStatus = sp.log.debugActivated;
sp.log.debugActivated = true;
var messages = [];
Array.prototype.push.apply(messages, arguments);
messages.splice(0, 0, "Popup -");
sp.log.debug.apply(this, messages);
sp.log.debugActivated = mainDebugStatus;
}
}
})(jQuery, window);
(2-2/3)