/**
* @namespace WORKAREA.dialog
*/
WORKAREA.registerModule('dialog', (function () {
'use strict';
var
/**
* Private
*/
close = function ($dialogs) {
if (_.isEmpty($dialogs)) { return; }
$dialogs.dialog('close');
},
destroy = function (event) {
$(event.target).dialog('destroy');
},
adjustWidth = function ($dialog) {
var buffer = WORKAREA.config.dialog.viewportBuffer * 2,
maxWidth = $(window).width() - buffer;
if ($dialog.outerWidth() > maxWidth) {
$dialog.dialog('option', 'width', maxWidth);
}
},
getZIndex = function (index, element) {
return _.parseInt($(element).dialog('widget').css('z-index'));
},
matchesZIndex = function (index, element, zIndex) {
return getZIndex(index, element) === zIndex;
},
/**
* Public Utility Methods
*/
/**
* @method
* @name all
* @memberof WORKAREA.dialog
*/
all = function () {
return $('.ui-dialog-content');
},
/**
* @method
* @name closest
* @memberof WORKAREA.dialog
*/
closest = function (element) {
return $(element).closest('.ui-dialog-content');
},
/**
* @method
* @name top
* @memberof WORKAREA.dialog
*/
top = function () {
var $allDialogs = all(),
zIndexes = _.toArray($allDialogs.map(getZIndex)),
maxZIndex = Math.max.apply(null, zIndexes);
return $allDialogs.filter(_.partialRight(matchesZIndex, maxZIndex));
},
/**
* @method
* @name current
* @memberof WORKAREA.dialog
*/
current = function (element) {
var $closest = closest(element);
if (!_.isEmpty($closest)) { return $closest; }
return top();
},
/**
* @method
* @name closeAll
* @memberof WORKAREA.dialog
*/
closeAll = _.flowRight(close, all),
/**
* @method
* @name closeClosest
* @memberof WORKAREA.dialog
*/
closeClosest = _.flowRight(close, closest),
/**
* @method
* @name closeTop
* @memberof WORKAREA.dialog
*/
closeTop = _.flowRight(close, top),
/**
* @method
* @name closeCurrent
* @memberof WORKAREA.dialog
*/
closeCurrent = _.flowRight(close, current),
/**
* @method
* @name withinDialog
* @memberof WORKAREA.dialog
*/
withinDialog = function ($collection) {
return !_.isEmpty($collection.closest('.ui-dialog-content'));
},
/**
* Public Create Methods
*/
/**
* @method
* @name create
* @memberof WORKAREA.dialog
*/
create = function (html, options) {
var $dialog = $(html).wrap('
').parent(),
$current,
currentOrigElement;
options = _.merge({}, WORKAREA.config.dialog.options, options);
if (options.closeAll) { closeAll(); }
if (options.replace) {
$current = current(options.originatingElement);
currentOrigElement = $current.data('dialog').originatingElement;
options.originatingElement = currentOrigElement;
$current.dialog('close');
}
$dialog
.dialog(options.uiDialogOptions)
.attr('role', 'complementary')
.on('dialogclose', destroy)
.data('dialog', { originatingElement: options.originatingElement })
.dialog('widget').focus();
adjustWidth($dialog);
if (options.initModules) { WORKAREA.initModules($dialog); }
return $dialog;
},
/**
* @method
* @name createFromTemplate
* @memberof WORKAREA.dialog
*/
createFromTemplate = function (template, options) {
var html = JST[template.path](template.data);
create(html, options);
},
/**
* @method
* @name createFromFragmentId
* @memberof WORKAREA.dialog
*/
createFromFragmentId = function (fragmentId, options) {
var promise = $.ajax({
url: WORKAREA.url.current(),
xhr: WORKAREA.jQuery.createXhrWithoutXhrHeader
});
WORKAREA.loading.createLoadingDialog(promise);
promise
.done(function (html) {
var $html = $('#' + fragmentId, html);
$html.removeClass('hidden-if-js-enabled');
$html = $html.uniqueClone(true, true, '-dialog-clone');
create($html, options);
})
.fail(_.partial(
createFromTemplate,
WORKAREA.config.dialog.errorTemplate
));
},
/**
* @method
* @name createFromPromise
* @memberof WORKAREA.dialog
*/
createFromPromise = function (promise, options) {
WORKAREA.loading.createLoadingDialog(promise);
promise
.done(function (html) {
create(html, options);
})
.fail(_.partial(
createFromTemplate,
WORKAREA.config.dialog.errorTemplate
));
},
/**
* @method
* @name createFromSrc
* @memberof WORKAREA.dialog
*/
createFromSrc = function (src, options) {
var imageDialogOptions = {
uiDialogOptions: { dialogClass: 'ui-dialog-image' }
},
promise = WORKAREA.image.get(src);
options = _.merge({}, imageDialogOptions, options);
createFromPromise(promise, options);
},
/**
* @method
* @name createFromUrl
* @memberof WORKAREA.dialog
*/
createFromUrl = function (url, options) {
var promise = $.get(url);
createFromPromise(promise, options);
},
/**
* @method
* @name createFromForm
* @memberof WORKAREA.dialog
*/
createFromForm = function ($form, options) {
var promise = $.ajax({
url: $form.attr('action'),
method: $form.attr('method'),
data: $form.serialize()
});
createFromPromise(promise, options);
};
return {
all: all,
closest: closest,
top: top,
current: current,
closeAll: closeAll,
closeClosest: closeClosest,
closeTop: closeTop,
closeCurrent: closeCurrent,
withinDialog: withinDialog,
create: create,
createFromTemplate: createFromTemplate,
createFromFragmentId: createFromFragmentId,
createFromPromise: createFromPromise,
createFromSrc: createFromSrc,
createFromUrl: createFromUrl,
createFromForm: createFromForm
};
}()));