(function () { var isOpen = false; function onOverlayClick(e) { if (e.target.matches('#modal-overlay')) { e.stopPropagation(); e.preventDefault(); destroy(); } } function onCloseButtonClick() { KB.trigger('modal.close'); } function onFormSubmit() { KB.trigger('modal.loading'); submitForm(); } function getForm() { return document.querySelector('#modal-content form:not(.js-modal-ignore-form)'); } function submitForm() { var form = getForm(); if (form) { var url = form.getAttribute('action'); if (url) { KB.http.postForm(url, form).success(function (response) { KB.trigger('modal.stop'); if (response) { replace(response); } else { destroy(); } }).error(function (response) { KB.trigger('modal.stop'); if (response.hasOwnProperty('message')) { window.alert(response.message); } }); } } } function afterRendering() { var formElement = KB.find('#modal-content form'); if (formElement) { formElement.on('submit', onFormSubmit, false); } var autoFocusElement = document.querySelector('#modal-content input[autofocus]'); if (autoFocusElement) { autoFocusElement.focus(); } KB.render(); _KB.datePicker(); _KB.autoComplete(); _KB.tagAutoComplete(); _KB.get('Task').onPopoverOpened(); KB.trigger('modal.afterRender'); } function replace(html) { var contentElement = KB.find('#modal-content'); if (contentElement) { contentElement.replace(KB.dom('div') .attr('id', 'modal-content') .html(html) .build() ); afterRendering(); } } function create(html, width, overlayClickDestroy) { var closeButtonElement = KB.dom('a') .attr('href', '#') .attr('id', 'modal-close-button') .html('') .click(onCloseButtonClick) .build(); var headerElement = KB.dom('div') .attr('id', 'modal-header') .add(closeButtonElement) .build(); var contentElement = KB.dom('div') .attr('id', 'modal-content') .html(html) .build(); var boxElement = KB.dom('div') .attr('id', 'modal-box') .style('width', width) .add(headerElement) .add(contentElement) .build(); var overlayElement = KB.dom('div') .attr('id', 'modal-overlay') .add(boxElement) .build(); if (overlayClickDestroy) { overlayElement.addEventListener('click', onOverlayClick, false); } document.body.appendChild(overlayElement); afterRendering(); } function destroy() { isOpen = false; var overlayElement = KB.find('#modal-overlay'); if (overlayElement) { KB.trigger('modal.beforeDestroy'); overlayElement.remove(); } } function getWidth(size) { var viewport = KB.utils.getViewportSize(); if (viewport.width < 700) { return '99%'; } switch (size) { case 'large': return viewport.width < 1350 ? '98%' : '1350px'; case 'medium': return viewport.width < 1024 ? '70%' : '1024px'; } return viewport.width < 800 ? '75%' : '800px'; } KB.on('modal.close', function () { destroy(); }); KB.on('modal.submit', function () { submitForm(); }); KB.modal = { open: function (url, size, overlayClickDestroy) { KB.trigger('modal.open'); _KB.get('Dropdown').close(); destroy(); if (typeof overlayClickDestroy === 'undefined') { overlayClickDestroy = true; } KB.http.get(url).success(function (response) { isOpen = true; create(response, getWidth(size), overlayClickDestroy); }); }, close: function () { destroy(); }, isOpen: function () { return isOpen; }, replace: function (url) { KB.http.get(url).success(function (response) { replace(response); }); }, getForm: getForm, submitForm: submitForm }; }());