1document.addEventListener('DOMContentLoaded',()=>{Sa.behaviors.registerSelector('modal','a.js-modal',function(el){el.addEventListener('click',function(e){e.preventDefault();Sa.ui.modal.open({button:el})})})});if(typeof Sa==='undefined')Sa={};if(!Sa.ui)Sa.ui={};class Modal{constructor(id){if(!id){this.id='modal-'+Math.random().toString(36).substring(2,9)}else{this.id=id} 2this.modalElement=null;this.iframeElement=null;this.currentArgs={};this.iframeResizeInterval=null;this.isModalOpen=!1;this.iconResizeFull='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M200 32L56 32C42.7 32 32 42.7 32 56l0 144c0 9.7 5.8 18.5 14.8 22.2s19.3 1.7 26.2-5.2l40-40 79 79-79 79L73 295c-6.9-6.9-17.2-8.9-26.2-5.2S32 302.3 32 312l0 144c0 13.3 10.7 24 24 24l144 0c9.7 0 18.5-5.8 22.2-14.8s1.7-19.3-5.2-26.2l-40-40 79-79 79 79-40 40c-6.9 6.9-8.9 17.2-5.2 26.2s12.5 14.8 22.2 14.8l144 0c13.3 0 24-10.7 24-24l0-144c0-9.7-5.8-18.5-14.8-22.2s-19.3-1.7-26.2 5.2l-40 40-79-79 79-79 40 40c6.9 6.9 17.2 8.9 26.2 5.2s14.8-12.5 14.8-22.2l0-144c0-13.3-10.7-24-24-24L312 32c-9.7 0-18.5 5.8-22.2 14.8s-1.7 19.3 5.2 26.2l40 40-79 79-79-79 40-40c6.9-6.9 8.9-17.2 5.2-26.2S209.7 32 200 32z"/></svg>';this.iconResizeSmall='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M439 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2s-12.5 14.8-22.2 14.8l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39L439 7zM72 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39L73 505c-9.4 9.4-24.6 9.4-33.9 0L7 473c-9.4-9.4-9.4-24.6 0-33.9l87-87L55 313c-6.9-6.9-8.9-17.2-5.2-26.2s12.5-14.8 22.2-14.8z"/></svg>'} 3_emitEvent(eventName,detail={}){if(this.modalElement){const event=new CustomEvent(eventName,{bubbles:!0,cancelable:!0,detail:{modalId:this.id,...detail}});this.modalElement.dispatchEvent(event)}} 4_getTopWindow(){let w=window;while(w.parent&&w!==w.parent){try{w.parent.document;w=w.parent}catch(e){break}} 5return w} 6_getTopPickerLayer(root){let topLayer=0;root.querySelectorAll('.opti-dialog').forEach(picker=>{const layers=[picker,picker.querySelector('.overlay'),picker.querySelector('.wrapper')];layers.forEach(el=>{if(!el){return} 7const zIndex=parseInt(window.getComputedStyle(el).zIndex,10);if(!isNaN(zIndex)&&zIndex>topLayer){topLayer=zIndex}})});return topLayer} 8_handleContentLoaded(modalIframeHtml=null,modalIframeBody=null,modalPageConfig=null,startObserver=null){const{showNow,buttonLoadingClass,button,mode}=this.currentArgs;const topWindow=this.currentArgs.parentWindow||this._getTopWindow();const modalInner=this.modalElement.querySelector('.sa-modal-inner');const modalTitleElement=this.modalElement.querySelector('.sa-modal-title');const modalBody=this.modalElement.querySelector('.sa-modal-body');const modalBodyInner=this.modalElement.querySelector('.sa-modal-body-inner');const skeletonLoader=this.modalElement.querySelector('.skeleton-loader');let modalTitle=this.currentArgs.title;let modalWidth=this.currentArgs.width;let modalHeight=this.currentArgs.height;let timeout=0;let currentPageConfig=modalPageConfig;if(modalIframeBody){const modalPageConfigElement=modalIframeBody.querySelector('*[data-modal-page-config]');if(modalPageConfigElement){try{currentPageConfig=JSON.parse(modalPageConfigElement.dataset.modalPageConfig)}catch(e){console.error('Failed to parse data-modal-page-config from iframe:',e)}} 9if(!modalIframeBody.querySelector('.skeleton-loader')){if(modalIframeBody.querySelector('*[data-wysiwyg-config]')||modalIframeBody.querySelector('*[data-select2-config]')){timeout=300;console.log('timeout used for WYSIWYG/Select2 in iframe')}}}else if(!currentPageConfig){const modalPageConfigElement=modalBodyInner.querySelector('*[data-modal-page-config]');if(modalPageConfigElement){try{currentPageConfig=JSON.parse(modalPageConfigElement.dataset.modalPageConfig)}catch(e){console.error('Failed to parse data-modal-page-config from direct HTML:',e)}}} 10const finalTimeout=Math.max(timeout,50);setTimeout(()=>{if(modalIframeHtml){modalIframeHtml.classList.add('opened-with-modal');modalIframeHtml.style.marginRight='20px'} 11modalInner.style.overflow='hidden';modalBodyInner.style.opacity='1';if(currentPageConfig){if(currentPageConfig.title){modalTitle=currentPageConfig.title} 12if(!this.currentArgs.keepSizes){if(currentPageConfig.width){modalWidth=currentPageConfig.width} 13if(currentPageConfig.height){modalHeight=currentPageConfig.height}} 14if(currentPageConfig.spec){if(currentPageConfig.spec.css){for(const key in currentPageConfig.spec.css){if(currentPageConfig.spec.css.hasOwnProperty(key)){modalInner.style[key]=currentPageConfig.spec.css[key]}}} 15if(currentPageConfig.spec.classes){for(const key in currentPageConfig.spec.classes){if(currentPageConfig.spec.classes.hasOwnProperty(key)){modalInner.classList.add(currentPageConfig.spec.classes[key])}}} 16if(currentPageConfig.spec.attrs){for(const key in currentPageConfig.spec.attrs){if(currentPageConfig.spec.attrs.hasOwnProperty(key)){modalInner.setAttribute(key,currentPageConfig.spec.attrs[key])}}}} 17if(currentPageConfig.ajaxify){console.warn('`currentPageConfig.ajaxify` requires jQuery\'s `$.ajaxLink` and `$.each` and needs a custom implementation in pure JS.')} 18if(currentPageConfig.runScript){for(const key in currentPageConfig.runScript){if(currentPageConfig.runScript.hasOwnProperty(key)){const fn=new Function(currentPageConfig.runScript[key]);fn.call(this)}}} 19if(currentPageConfig.reloadDataGrid){$.each(currentPageConfig.reloadDataGrid,function(key,value){if(value==='all'){for(let id in Sa.datagrid.getDataGrids()){Sa.datagrid.getDataGrid(id).reloadData()}}else{let $datagrid=Sa.datagrid.getDataGrid(value);if($datagrid){$datagrid.reloadData()}}})} 20if(currentPageConfig.say){for(const key in currentPageConfig.say){if(currentPageConfig.say.hasOwnProperty(key)){if(typeof say==='function'){say(currentPageConfig.say[key].message,currentPageConfig.say[key].error)}else{console.warn('Global function `say` is not defined for `modalPageConfig.say`.',currentPageConfig.say[key])}}}} 21if(currentPageConfig.close===!0){this.close();if(currentPageConfig.redirect){window.location.href=currentPageConfig.redirect} 22if(currentPageConfig.reloadParent){window.location.reload()} 23return} 24if(mode==='fetch'){if(currentPageConfig.includeJs&&Array.isArray(currentPageConfig.includeJs)){currentPageConfig.includeJs.forEac
24h(path=>{Sa.assets.loadScript(path,{doc:topWindow.document})})} 25if(currentPageConfig.includeCss&&Array.isArray(currentPageConfig.includeCss)){currentPageConfig.includeCss.forEach(path=>{Sa.assets.loadCss(path,{doc:topWindow.document})})}}} 26if(!modalWidth){modalWidth=Sa.ui.modal.defaults.width} 27modalTitleElement.innerHTML=modalTitle||'';modalInner.style.width=modalWidth;if(!this.iframeElement&&!modalHeight){modalBody.style.height='auto';modalBodyInner.style.height='auto'}else if(modalHeight){modalBody.style.height='100%';modalBodyInner.style.height='100%';modalInner.style.height=modalHeight} 28skeletonLoader.style.display='none';modalBodyInner.style.opacity='1';Sa.ui.modal.loader(!1,topWindow);if(!this.isModalOpen){this.modalElement.style.opacity='1';setTimeout(()=>{this.modalElement.classList.remove('is-hidden')},100);if(button&&button.classList){button.classList.remove(buttonLoadingClass)} 29Sa.ui.modal.loader(!1,topWindow)} 30if(startObserver){startObserver()} 31this.isModalOpen=!0;this._emitEvent('modal:opened',{currentArgs:this.currentArgs})},finalTimeout)} 32async open(args){if(Sa.ui.modal._openModals.has(this.id)){console.warn(`Modal with ID "${this.id}" already exists. Closing the old instance before opening a new one.`);Sa.ui.modal.get(this.id).close(0)} 33const openButtonElement=args.button||null;this.currentArgs={...Sa.ui.modal.defaults,button:openButtonElement,href:null,parentWindow:null,parentBody:null,keepSizes:!1,...args};let{href,title,height,width,modalCss,modalInnerCss,parentWindow,parentBody,buttonLoadingClass,showNow,mode,srcDoc,htmlContent,htmlContentSelector}=this.currentArgs;if(openButtonElement){if(href===null){href=openButtonElement.getAttribute('href')} 34if(title===Sa.ui.modal.defaults.title||title===undefined||title===null){const dataTitle=openButtonElement.getAttribute('data-modal-title');const attrTitle=openButtonElement.getAttribute('title');title=dataTitle||attrTitle||Sa.ui.modal.defaults.title} 35if(width===Sa.ui.modal.defaults.width||width===undefined||width===null){width=openButtonElement.getAttribute('data-modal-width')||Sa.ui.modal.defaults.width} 36if(height===Sa.ui.modal.defaults.height||height===undefined||height===null){height=openButtonElement.getAttribute('data-modal-height')||Sa.ui.modal.defaults.height} 37if(modalCss===Sa.ui.modal.defaults.modalCss||modalCss===undefined||modalCss===null){modalCss=openButtonElement.getAttribute('data-modal-css')||Sa.ui.modal.defaults.modalCss} 38if(modalInnerCss===Sa.ui.modal.defaults.modalInnerCss||modalInnerCss===undefined||modalInnerCss===null){modalInnerCss=openButtonElement.getAttribute('data-modal-inner-css')||Sa.ui.modal.defaults.modalInnerCss} 39this.currentArgs.keepSizes=(parseInt(openButtonElement.getAttribute('data-modal-keep-sizes'))===1);mode=openButtonElement.getAttribute('data-modal-mode')||mode;srcDoc=openButtonElement.getAttribute('data-modal-srcdoc')||srcDoc;htmlContent=openButtonElement.getAttribute('data-modal-html')||htmlContent;htmlContentSelector=openButtonElement.getAttribute('data-modal-html-selector')||htmlContentSelector} 40if(htmlContentSelector){mode='html'} 41if(htmlContentSelector){htmlContent=document.querySelector(htmlContentSelector).innerHTML} 42this.currentArgs.href=href;this.currentArgs.title=title;this.currentArgs.height=height;this.currentArgs.width=width;this.currentArgs.modalCss=modalCss;this.currentArgs.modalInnerCss=modalInnerCss;this.currentArgs.mode=mode;this.currentArgs.srcDoc=srcDoc;this.currentArgs.htmlContent=htmlContent;const topWindow=parentWindow||this._getTopWindow();Sa.ui.modal.loader(!0,topWindow);const modalTargetBody=parentBody||topWindow.document.querySelector('body');let finalHref=href;if((mode==='url'||mode==='fetch')&&!finalHref){console.error(`Missing \`href\` parameter for mode "${mode}". The modal cannot be opened.`);Sa.ui.modal.loader(!1,topWindow);return} 43if(mode==='srcDoc'&&!srcDoc){console.error(`Missing \`srcDoc\` parameter for mode "srcDoc". The modal cannot be opened.`);Sa.ui.modal.loader(!1,topWindow);return} 44if(mode==='html'&&!htmlContent){console.error(`Missing \`htmlContent\` parameter for mode "html". The modal cannot be opened.`);Sa.ui.modal.loader(!1,topWindow);return} 45if(!showNow&&openButtonElement&&openButtonElement.classList){openButtonElement.classList.add(buttonLoadingClass)} 46Sa.ui.modal.loader(!0,topWindow);const addHref=openButtonElement?openButtonElement.getAttribute('data-modal-href-params'):null;
46if(addHref&&finalHref){finalHref+=(finalHref.includes('?')?'&':'?')+addHref}else if(finalHref&&(mode==='url'||mode==='fetch')){finalHref+=(finalHref.includes('?')?'&':'?')+'isSAModal=1'} 47const modal=document.createElement('div');modal.className='sa-modal is-hidden';modal.setAttribute('data-modal-id',this.id);modal.style.cssText=`${modalCss}`;modal.innerHTML=` 48 <div class="sa-modal-inner" style="width: 1200px; ${modalInnerCss}"> 49 <div class="sa-modal-header"> 50 <div class="sa-modal-title"></div> 51 <div class="sa-modal-controls"> 52 <button type="button" class="sa-modal-resize-full" style="display: none"> 53 ${this.iconResizeFull} 54 </button> 55 <button type="button" class="sa-modal-reload" style="display: none"> 56 <i class="icon-refresh"></i> 57 </button> 58 <button type="button" class="sa-modal-close"> 59 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"> 60 <path d="M18 6L6 18M6 6L18 18" stroke="#314158" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 61 </svg> 62 </button> 63 </div> 64 </div> 65 <div class="sa-modal-body"> 66 <div class="skeleton-loader" hidden><div class="skeleton-line" style="width: 30%"></div><div class="skeleton-line" style="width: 50%"></div><div class="skeleton-line" style="width: 80%"></div></div> 67 <div class="sa-modal-body-inner"> 68 </div> 69 </div> 70 </div> 71 `;this.modalElement=modal;const modalInner=modal.querySelector('.sa-modal-inner');const modalTitleElement=modal.querySelector('.sa-modal-title');const modalBody=modal.querySelector('.sa-modal-body');const modalBodyInner=modal.querySelector('.sa-modal-body-inner');const modalResizeFull=modal.querySelector('.sa-modal-resize-full');const modalReload=modal.querySelector('.sa-modal-reload');const modalClose=modal.querySelector('.sa-modal-close');const skeletonLoader=modal.querySelector('.skeleton-loader');modalTargetBody.appendChild(modal);const dialogLayer=this._getTopPickerLayer(modalTargetBody);if(dialogLayer){modal.style.zIndex=String(dialogLayer+1)} 72modalBodyInner.style.opacity='0';modalBodyInner.style.height='400px';modalBody.style.overflow='hidden';if(width){modalInner.style.width=width}else{modalInner.style.width=Sa.ui.modal.defaults.width} 73if(showNow){modal.style.opacity='1';setTimeout(()=>{modal.classList.remove('is-hidden')},10);if(Sa.ui.modal._openModalsCount===0){topWindow.document.documentElement.style.overflow='hidden'} 74Sa.ui.modal._openModalsCount++}else{modal.style.opacity='0'} 75if(mode==='url'||mode==='srcDoc'){const modalIframe=document.createElement('iframe');if(mode==='url'){modalIframe.src=finalHref}else{modalIframe.srcdoc=srcDoc} 76modalIframe.style.height='100%';modalIframe.style.border='none';modalIframe.style.width='100%';modalBodyInner.appendChild(modalIframe);modalBody.style.display='flex';modalBody.style.flexDirection='column';this.iframeElement=modalIframe;modalIframe.addEventListener('load',()=>{clearInterval(this.iframeResizeInterval);const iframeContents=this.iframeElement.contentDocument||this.iframeElement.contentWindow.document;const iframeBody=iframeContents.querySelector('body');const iframeHtml=iframeContents.querySelector('html');iframeContents.addEventListener('keydown',(iframeEvent)=>{if(iframeEvent.key==='Escape'){iframeEvent.preventDefault();if(window.parent&&window.parent.Sa&&window.parent.Sa.ui&&window.parent.Sa.ui.modal){window.parent.Sa.ui.modal.close(this.id)}else{console.warn('Parent Sa.ui.modal object not found to close modal from iframe.')}}});if(this.iframeElement.contentWindow){this.iframeElement.contentWindow.addEventListener('beforeunload',()=>{Sa.ui.modal.loader(!0,topWindow);if(showNow){skeletonLoader.style.display='';modalBodyInner.style.opacity='0';modalBody.style.right='0';modalBody.style.left='0'}})} 77let startObserver=null 78if(!height){startObserver=()=>{const iframeDoc=this.iframeElement.contentDocument||this.iframeElement.contentWindow.document;const mainElement=iframeDoc.body.querySelector('#hlavni')||iframeDoc.body;console.log(mainElement);if(mainElement){mainElement.style.height='auto';const setupHeight=function(){const newHeight=mainElement.scrollHeight;if(modalBodyInner.style.height!==newHeight+'px'){modalBodyInner.style.height=newHeight+'px'}};const observer=new ResizeObserver(entries=>{window.requestAnimationFrame(()=>{if(!Array.isArray(entries)||!entries.length)return;setupHeight()})});observer.observe(mainElement)}}}else{this.iframeElement.style.height='100%';modalBody.style.height='100%';modalInner.style.height=height} 79this._handleContentLoaded(iframeHtml,iframeBody,null,startObserver)});modalReload.addEventListener('click',()=>{if(this.iframeElement&&this.iframeElement.contentWindow){this.iframeElement.contentWindow.location.reload()}});const currentModalWidth=width;const currentModalHeight=height;modalResizeFull.addEventListener('click',function(){if(this.classList.contains('resized')){this.classList.remove('resized');modalInner.style.width=currentModalWidth;modalInner.style.height=currentModalHeight;this.innerHTML=this.iconResizeFull}else{this.classList.add('resized');modalInner.style.width='100%';modalInner.style.height='100%';this.innerHTML=this.iconResizeSmall}}.bind(this))}else if(mode==='html'){modalBodyInner.innerHTML=htmlContent;console.warn('Scripts inside HTML content (mode "html") inserted via innerHTML will generally not execute. Consider using `url` or `srcDoc` for interactive content.');this.iframeElement=null;modalResizeFull.style.display='none';modalReload.style.display='none';this._handleContentLoaded()}else if(mode==='fetch'){modalBodyInner.innerHTML='<div class="skeleton-loader"><div class="skeleton-line" style="width: 30%"></div><div class="skeleton-line" style="width: 50%"></div><div class="skeleton-line" style="width: 80%"></div></div>';this.iframeElement=null;modalResizeFull.style.display='none';modalReload.addEventListener('click',async()=>{await this._fetchContentAndInject(finalHref,modalBodyInner,skeletonLoader)});await this._fetchContentAndInject(finalHref,modalBodyInner,skeletonLoader)}else{console.error(`Unsupported modal mode: "${mode}"`);Sa.ui.modal.loader(!1,topWindow);return} 80modalClose.addEventListener('click',()=>this.close());Sa.ui.modal._openModals.set(this.id,this);return this} 81close(transitionDuration=300){if(!this.modalElement){console.warn(`Modal with ID "${this.id}" is not currently open or has already been closed.`);return} 82const topWindow=this.currentArgs.parentWindow||this._getTopWindow();this._emitEvent('modal:closing',{currentArgs:this.currentArgs});this.modalElement.style.opacity='0';setTimeout(()=>{if(this.modalElement){this.modalElement.remove()} 83this.modalElement=null;this.iframeElement=null;
83Sa.ui.modal._openModals.delete(this.id);Sa.ui.modal._openModalsCount--;if(Sa.ui.modal._openModalsCount<0){Sa.ui.modal._openModalsCount=0} 84if(Sa.ui.modal._openModalsCount===0){topWindow.document.documentElement.style.overflow=''} 85clearInterval(this.iframeResizeInterval);this.isModalOpen=!1;this._emitEvent('modal:closed',{currentArgs:this.currentArgs});Sa.ui.modal.loader(!1,topWindow)},transitionDuration)} 86updateTitle(newTitle){if(this.modalElement){const modalTitleElement=this.modalElement.querySelector('.sa-modal-title');if(modalTitleElement){modalTitleElement.innerHTML=newTitle||'';this.currentArgs.title=newTitle;this._emitEvent('modal:title-updated',{newTitle:newTitle})}}} 87updateHref(newHref){if(this.iframeElement&&newHref){this.iframeElement.src=newHref;this.currentArgs.href=newHref;this._emitEvent('modal:href-updated',{newHref:newHref})}else if(this.currentArgs.mode==='fetch'&&newHref){this.currentArgs.href=newHref;this._fetchContentAndInject(newHref,this.modalElement.querySelector('.sa-modal-body-inner'),this.modalElement.querySelector('.skeleton-loader'));this._emitEvent('modal:href-updated',{newHref:newHref})}else{console.warn('`updateHref` is only supported for `url`, `srcDoc` or `fetch` modes.')}} 88async _fetchContentAndInject(url,targetElement,loaderElement){if(loaderElement)loaderElement.style.display='';targetElement.innerHTML='';try{const response=await fetch(url,{headers:{'sa-modal-mode':'fetch'}});if(!response.ok){throw new Error(`HTTP error! status: ${response.status}`)} 89const data=await response.json();if(data.htmlContent){targetElement.innerHTML=data.htmlContent;console.warn('Scripts inside HTML content (mode "fetch") inserted via innerHTML will generally not execute. Consider using `url` or `srcDoc` for interactive content.')}else{console.warn('Fetch response in "fetch" mode did not contain `htmlContent`.');targetElement.innerHTML=`<div style="padding: 20px; color: orange;">Obsah JSON odpovÄdi neobsahuje klÃÄ 'htmlContent'.</div>`} 90this._handleContentLoaded(null,null,data)}catch(error){console.error('Failed to fetch modal content or parse JSON:',error);targetElement.innerHTML=`<div style="padding: 20px; color: red;">NepodaÅilo se naÄÃst obsah modalu: ${error.message}</div>`}finally{if(loaderElement)loaderElement.style.display='none';const topWindow=this.currentArgs.parentWindow||this._getTopWindow();Sa.ui.modal.loader(!1,topWindow)}}} 91Sa.ui.modal={_openModals:new Map(),_openModalsCount:0,defaults:{width:'900px',height:null,showNow:!1,buttonLoadingClass:'c-button--loading',modalCss:'',modalInnerCss:'',title:'',mode:'url',srcDoc:'',htmlContent:''},loader:function(show,topWindow){if(topWindow&&topWindow.Sa&&topWindow.Sa.ui&&topWindow.Sa.ui.loader){topWindow.Sa.ui.loader(show)}else{console.warn('topWindow.Sa.ui.loader is not defined. Using default console logging for loader.');console.log(`Loader: ${show ? 'Zobrazuji' : 'Skrývám'}`)}},open:function(args={}){const modalId=args.id||'modal-'+Math.random().toString(36).substring(2,9);const newModalInstance=new Modal(modalId);return newModalInstance.open(args)},get:function(id){return Sa.ui.modal._openModals.get(id)},getAll:function(){return Array.from(Sa.ui.modal._openModals.values())},close:function(id,transitionDuration=300){const modalInstance=Sa.ui.modal._openModals.get(id);if(modalInstance){modalInstance.close(transitionDuration)}else{console.warn(`Modal with ID "${id}" not found or already closed.`)}},closeAll:function(transitionDuration=300){const modalIdsToClose=Array.from(Sa.ui.modal._openModals.keys());modalIdsToClose.forEach(id=>{Sa.ui.modal.close(id,transitionDuration)})},_loadedScripts:new Set(),_loadedStyles:new Set(),loadScript:function(path,doc=document){console.warn("Sa.ui.modal.loadScript() is deprecated. Use Sa.ui.assets.loadScript() instead.");Sa.ui.assets.loadScript(path,doc)},loadCss:function(path,doc=document){console.warn("Sa.ui.modal.loadCss() is deprecated. Use Sa.ui.assets.loadCss() instead.");Sa.ui.assets.loadCss(path,doc)}};document.addEventListener('keydown',(event)=>{if(event.key==='Escape'){const allModals=Sa.ui.modal.getAll();if(allModals.length>0){const topModal=allModals[allModals.length-1];if(topModal){topModal.close();event.preventDefault()}}}});SaScriptManager.registerModule('modal',{init:function(self){},openModal($openButton,$modalTargetHtml,buttonLoadingClass,reloadEditor){const showNow=!0;let topWindow=(function(){let w=window;while(w.parent&&w!==w.parent){try{w.parent.document;w=w.parent}catch(e){break}} 92return w})();topWindow.Sa.ui.loader(!0);let module=SaScriptManager.getModule('modal');if(!$modalTargetHtml){$modalTargetHtml=topWindow.$('html')} 93if(!buttonLoadingClass){buttonLoadingClass='c-button--loading'} 94let $modalTargetBody=$modalTargetHtml.find('body');
94if(typeof $openButton==='string'){$openButton=$('<a href="'+$openButton+'">')} 95if(!showNow){$openButton.addClass(buttonLoadingClass)} 96if(module.loader){module.loader(!0)} 97let modalTitle;let dataTitle=$openButton.attr('data-modal-title');let attrTitle=$openButton.attr('title');let modalWidth=$openButton.attr('data-modal-width');let modalHeight=$openButton.attr('data-modal-height');let modalCss=$openButton.attr('data-modal-css');let modalInnerCss=$openButton.attr('data-modal-inner-css');let keepSizes=parseInt($openButton.attr('data-modal-keep-sizes'))===1;let addHref=$openButton.attr('data-modal-href-params');let href=$openButton.attr('href');if(addHref){href+=(href.includes('?')?'&':'?')+addHref}else{href+=(href.includes('?')?'&':'?')+'isSAModal=1'} 98if(dataTitle){modalTitle=dataTitle}else{modalTitle=attrTitle} 99let iconResizeFull='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. --><path d="M200 32L56 32C42.7 32 32 42.7 32 56l0 144c0 9.7 5.8 18.5 14.8 22.2s19.3 1.7 26.2-5.2l40-40 79 79-79 79L73 295c-6.9-6.9-17.2-8.9-26.2-5.2S32 302.3 32 312l0 144c0 13.3 10.7 24 24 24l144 0c9.7 0 18.5-5.8 22.2-14.8s1.7-19.3-5.2-26.2l-40-40 79-79 79 79-40 40c-6.9 6.9-8.9 17.2-5.2 26.2s12.5 14.8 22.2 14.8l144 0c13.3 0 24-10.7 24-24l0-144c0-9.7-5.8-18.5-14.8-22.2s-19.3-1.7-26.2 5.2l-40 40-79-79 79-79 40 40c6.9 6.9 17.2 8.9 26.2 5.2s14.8-12.5 14.8-22.2l0-144c0-13.3-10.7-24-24-24L312 32c-9.7 0-18.5 5.8-22.2 14.8s-1.7 19.3 5.2 26.2l40 40-79 79-79-79 40-40c6.9-6.9 8.9-17.2 5.2-26.2S209.7 32 200 32z"/></svg>';let iconResizeSmall='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. --><path d="M439 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2s-12.5 14.8-22.2 14.8l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39L439 7zM72 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39L73 505c-9.4 9.4-24.6 9.4-33.9 0L7 473c-9.4-9.4-9.4-24.6 0-33.9l87-87L55 313c-6.9-6.9-8.9-17.2-5.2-26.2s12.5-14.8 22.2-14.8z"/></svg>';let $modal=$('<div class="sa-modal hidden"'+modalCss+'">\n'+' <div class="sa-modal-inner" style="width: 1200px;'+modalInnerCss+'">\n'+' <div class="sa-modal-header">\n'+' <div class="sa-modal-title"></div>\n'+' <div class="sa-modal-controls">\n'+' <button type="button" class="sa-modal-resize-full" style="display: none">\n'+' '+iconResizeFull+'\n'+' </button>\n'+' <button type="button" class="sa-modal-reload">\n'+' <i class="icon-refresh"></i>'+' </button>\n'+' <button type="button" class="sa-modal-close">\n'+' <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"/></svg>\n'+' </button>\n'+' </div>\n'+' </div>\n'+' <div class="sa-modal-body">\n'+' <div class="skeleton-loader"><div class="skeleton-line" style="width: 30%"></div><div class="skeleton-line" style="width: 50%"></div><div class="skeleton-line" style="width: 80%"></div></div>\n'+' <div class="sa-modal-body-inner">\n'+' </div>\n'+' </div>\n'+' </div>\n'+' </div>');let $modalInner=$modal.find('.sa-modal-inner');let $modalTitle=$modal.find('.sa-modal-title');let $modalBody=$modal.find('.sa-modal-body');let $modalBodyInner=$modal.find('.sa-modal-body-inner');let $modalResizeFull=$modal.find('.sa-modal-resize-full');let $modalReload=$modal.find('.sa-modal-reload');let $modalClose=$modal.find('.sa-modal-close');let $modalFooter=$modal.find('.sa-modal-footer');let $skeletonLoader=$modal.find('.skeleton-loader');$modalTargetBody.append($modal);$modal.removeClass('hidden');setTimeout(()=>{$modal.addClass('modal-visible')},10);if(showNow){$modal.css('opacity',1);$modalTargetHtml.css('overflow','hidden');$modalBodyInner.css('opacity',0);if(modalWidth){$modalInner.css('width',modalWidth)}else{$modalInner.css('width',900)}}else{$modal.css('opacity',0)} 100let $modalIframe=$('<iframe />').attr('src',href).css('height',200);$modalBodyInner.append($modalIframe);let iframeResizeInterval;let $modalIframeBody;let $modalIframeHtml;let $modalIframeContents;let $modalIframeSrc;let isModalOpen=!1;$modalIframe.on('load',function(){clearInterval(iframeResizeInterval);$modalIframeContents=$modalIframe.contents();$modalIframeBody=$modalIframeContents.find('body');$modalIframeHtml=$modalIframeContents.find('html');let timeout=0;if($modalIframeBody.find('.skeleton-loader').length===0){if($modalIframeBody.find('*[data-wysiwyg-config]').length>0||$modalIframeBody.find('*[data-select2-config]').length>0){timeout=0;console.log('timeout used')}} 101$modalIframe[0].contentWindow.addEventListener('beforeunload',function(e){if(module.loader){module.loader(!0)} 102if(showNow){$skeletonLoader.css('display','');$modalBodyInner.css('opacity',0);$modalBody.css('margin-right','0');$modalBody.css('margin-left','0');
102topWindow.Sa.ui.loader(!0)}});setTimeout(function(){$modalIframeHtml.addClass('opened-with-modal');$modalBody.css('margin-right','-20px');$modalBody.css('margin-left','-20px');$modalInner.css('overflow','hidden');$modalIframeHtml.css('margin-right','20px');$modalIframeHtml.css('margin-left','20px');$modalBodyInner.css('opacity',1);let modalPageConfig=$modalIframeBody.find('*[data-modal-page-config]').data('modal-page-config');if(modalPageConfig){if(modalPageConfig.title){modalTitle=modalPageConfig.title} 103if(!keepSizes){if(modalPageConfig.width){modalWidth=modalPageConfig.width} 104if(modalPageConfig.height){modalHeight=modalPageConfig.height}} 105if(modalPageConfig.spec){if(modalPageConfig.spec.css){$.each(modalPageConfig.spec.css,function(key,value){$modalInner.css(key,value)});$.each(modalPageConfig.spec.classes,function(key,value){$modalInner.addClass(value)});$.each(modalPageConfig.spec.attrs,function(key,value){$modalInner.setAttr(key,value)})}} 106if(modalPageConfig.ajaxify){$.each(modalPageConfig.ajaxify,function(url,refresh){let ajaxLinkConfig={'history':!1,'refresh':refresh};if(url==='this'){url=window.location.href} 107$.ajaxLink(url,ajaxLinkConfig,$('body'),'GET')})} 108if(modalPageConfig.runScript){$.each(modalPageConfig.runScript,function(key,value){let fn=Function(value);fn.call()})} 109if(modalPageConfig.reloadDataGrid){$.each(modalPageConfig.reloadDataGrid,function(key,value){if(value==='all'){for(let id in Sa.datagrid.getDataGrids()){Sa.datagrid.getDataGrid(id).reloadData()}}else{let $datagrid=Sa.datagrid.getDataGrid(value);if($datagrid){$datagrid.reloadData()}}})} 110if(modalPageConfig.say){$.each(modalPageConfig.say,function(key,value){say(value.message,value.error)})} 111if(modalPageConfig.close===!0){closeModal();if(modalPageConfig.redirect){window.location.href=modalPageConfig.redirect} 112if(modalPageConfig.reloadParent){window.location.reload()} 113return}} 114$modalIframeSrc=$modalIframe.prop('src');if(!modalWidth){modalWidth='900px'} 115$modalTitle.html(modalTitle);$modalInner.css('width',modalWidth);$modalBody.css('overflow','hidden');$modalBodyInner.css('overflow','hidden');$modalBodyInner.css('opacity',1);if(modalHeight){$modalIframe.css('height','100%');$modalBody.css('height','100%');$modalBodyInner.css('height','100%');$modalInner.css('height',modalHeight);$modalIframeHtml.css('scrollbar-width','thin');$modalIframeBody.css('scrollbar-width','thin')}else{$modalIframe.css('height',0);resizeIframe();iframeResizeInterval=setInterval(resizeIframe,500)} 116$skeletonLoader.css('display','none');topWindow.Sa.ui.loader(!1);if(!isModalOpen){$modal.css('opacity','1');$openButton.removeClass(buttonLoadingClass);if(module.loader){module.loader(!1)} 117$modalIframeHtml.css('scrollbar-width','thin');$modalTargetHtml.css('overflow','hidden');$modalIframeHtml.css('scrollbar-width','thin');$modalIframeBody.css('scrollbar-width','thin');setTimeout(function(){$modalBody.css('transition','height .3s')},300)} 118isModalOpen=!0},timeout)});$modalClose.click(function(){closeModal()});$modalReload.click(function(){$modalIframeContents[0].location.reload()});$modalResizeFull.click(function(){let $this=$(this);if($this.hasClass('resized')){$this.removeClass('resized');$modalInner.css('width',modalWidth).css('height',modalHeight);$this.html(iconResizeFull)}else{$this.addClass('resized');$modalInner.css('width','100%').css('height','100%');$this.html(iconResizeSmall)}});function setupModalButtons(){return;let $controlBar=$modalIframeBody.find('.universal-form-control-bar');$modalFooter.html('');$controlBar.attr('hidden',!0);$controlBar.find('button, a').each(function(){let $this=$(this);let $clone=$this.clone();$clone.appendTo($modalFooter);$clone.click(function(){$this.click();if(!$modalIframeBody.find('form').hasClass('is-invalid')){$clone.addClass('c-button--loading')}})})} 119function closeModal(){$modal.css('opacity',0);setTimeout(function(){$modal.remove()},300);clearInterval(iframeResizeInterval);$modalTargetHtml.css('overflow','');isModalOpen=!1} 120function resizeIframe(){if(modalHeight){return} 121let allowShrink=!1;let currentHeight=$modalIframe.height();let scrollHeight;if($modalIframeHtml.find('.opti-dialog').length>0){if(currentHeight<700){scrollHeight=700}else{scrollHeight=currentHeight}}else{if(allowShrink){$modalIframe.css('height',0)} 122$modalIframeHtml.css('overflow','initial');scrollHeight=$modalIframeHtml.prop('scrollHeight')} 123$modalIframeHtml.css('scrollbar-width','thin');if(scrollHeight>currentHeight||allowShrink){$modalBody.css('height',scrollHeight);let modalbodyOuterHeight=$modalBody.outerHeight();if(modalbodyOuterHeight<scrollHeight){scrollHeight=modalbodyOuterHeight} 124$modalBodyInner.css('height',scrollHeight);$modalIframe.css('height',scrollHeight)}}},openModalWithSrcDoc(parameters){let module=SaScriptManager.getModule('modal');let $modalTargetHtml=$('html');let $modalTargetBody=$('body');let srcDoc=parameters.srcDoc;let modalTitle=parameters.title;let modalWidth=parameters.width;
124let modalHeight=parameters.height;let $modal=$('<div class="sa-modal">\n'+' <div class="sa-modal-inner">\n'+' <div class="sa-modal-header">\n'+' <div class="sa-modal-title"></div>\n'+' <div class="sa-modal-controls">\n'+' <button type="button" class="sa-modal-close">\n'+' <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"/></svg>\n'+' </button>\n'+' </div>\n'+' </div>\n'+' <div class="sa-modal-body">\n'+' <div class="sa-modal-body-inner">\n'+' </div>\n'+' </div>\n'+' </div>\n'+' </div>');let $modalInner=$modal.find('.sa-modal-inner');let $modalTitle=$modal.find('.sa-modal-title');let $modalBody=$modal.find('.sa-modal-body');let $modalBodyInner=$modal.find('.sa-modal-body-inner');let $modalResizeFull=$modal.find('.sa-modal-resize-full');let $modalReload=$modal.find('.sa-modal-reload');let $modalClose=$modal.find('.sa-modal-close');let $modalFooter=$modal.find('.sa-modal-footer');$modal.css('opacity',0).removeClass('hidden');$modalTargetBody.append($modal);let $modalIframe=$('<iframe />').attr('srcdoc',srcDoc).css('height',200);$modalBodyInner.append($modalIframe);let iframeResizeInterval;let $modalIframeBody;let $modalIframeHtml;let $modalIframeContents;let $modalIframeSrc;let isModalOpen=!1;$modalIframe.on('load',function(){clearInterval(iframeResizeInterval);$modalIframeContents=$modalIframe.contents();$modalIframeBody=$modalIframeContents.find('body');$modalIframeHtml=$modalIframeContents.find('html');$modalIframeContents[0].addEventListener('beforeunload',function(e){if(module.loader){module.loader(!0)}});$modalIframeSrc=$modalIframe.prop('src');if(!modalWidth){modalWidth='1200px'} 125$modalTitle.html(modalTitle);$modalInner.css('width',modalWidth);$modalBody.css('overflow','hidden');$modalBodyInner.css('overflow','hidden');if(modalHeight){$modalIframe.css('height','100%');$modalBody.css('height','100%');$modalBodyInner.css('height','100%');$modalInner.css('height',modalHeight);$modalIframeHtml.css('scrollbar-width','thin');$modalIframeBody.css('scrollbar-width','thin')}else{$modalIframe.css('height',0);resizeIframe();iframeResizeInterval=setInterval(resizeIframe,500)} 126if(!isModalOpen){$modal.css('opacity','1');if(module.loader){module.loader(!1)} 127$modalIframeHtml.css('scrollbar-width','thin');$modalTargetHtml.css('overflow','hidden');$modalIframeHtml.css('scrollbar-width','thin');$modalIframeBody.css('scrollbar-width','thin');setTimeout(function(){$modalBody.css('transition','height .3s')},300)} 128isModalOpen=!0});$modalClose.click(function(){closeModal()});function closeModal(){$modal.css('opacity',0);setTimeout(function(){$modal.remove()},300);clearInterval(iframeResizeInterval);$modalTargetHtml.css('overflow','');isModalOpen=!1} 129function resizeIframe(){if(modalHeight){return} 130let allowShrink=!1;let currentHeight=$modalIframe.height();let scrollHeight;if($modalIframeHtml.find('.opti-dialog').length>0){if(currentHeight<700){scrollHeight=700}else{scrollHeight=currentHeight}}else{if(allowShrink){$modalIframe.css('height',0)} 131$modalIframeHtml.css('overflow','initial');scrollHeight=$modalIframeHtml.prop('scrollHeight')} 132$modalIframeHtml.css('scrollbar-width','thin');if(scrollHeight>currentHeight||allowShrink){$modalBody.css('height',scrollHeight);let modalbodyOuterHeight=$modalBody.outerHeight();if(modalbodyOuterHeight<scrollHeight){scrollHeight=modalbodyOuterHeight} 133$modalBodyInner.css('height',scrollHeight);$modalIframe.css('height',scrollHeight)}}},openModalWithHtml(parameters){let module=SaScriptManager.getModule('modal');let $modalTargetHtml=$('html');let $modalTargetBody=$('body');let html=parameters.html;let modalTitle=parameters.title;let modalWidth=parameters.width;let modalHeight=parameters.height;let $modal=$('<div class="sa-modal">\n'+' <div class="sa-modal-inner">\n'+' <div class="sa-modal-header">\n'+' <div class="sa-modal-title"></div>
133\n'+' <div class="sa-modal-controls">\n'+' <button type="button" class="sa-modal-close">\n'+' <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"/></svg>\n'+' </button>\n'+' </div>\n'+' </div>\n'+' <div class="sa-modal-body">\n'+' <div class="sa-modal-body-inner">\n'+' </div>\n'+' </div>\n'+' </div>\n'+' </div>');let $modalInner=$modal.find('.sa-modal-inner');let $modalTitle=$modal.find('.sa-modal-title');let $modalBody=$modal.find('.sa-modal-body');let $modalBodyInner=$modal.find('.sa-modal-body-inner');let $modalClose=$modal.find('.sa-modal-close');let $modalFooter=$modal.find('.sa-modal-footer');if(!modalWidth){modalWidth='1200px'} 134$modalTitle.html(modalTitle);$modalInner.css('width',modalWidth);$modalBodyInner.html(html);$modal.removeClass('hidden');$modalTargetBody.append($modal);$modal.css('opacity',1);$modalClose.click(function(){closeModal()});function closeModal(){$modal.css('opacity',0);setTimeout(function(){$modal.remove()},300);$modalTargetHtml.css('overflow','')}},closeModal($closeButton){let $modal=$closeButton.closest('.sa-modal');$modal.css('opacity',0);setTimeout(function(){$modal.remove()},300)},loader:function(state){if(state){$(".page-loader").addClass("is-loading")}else{$(".page-loader").removeClass("is-loading")}},});$(function(){$(document).on('keydown-no',function(e){if(e.keyCode===27){let $modal=$('.sa-modal:last-of-type');if($modal.length>0){$modal.css('opacity',0);setTimeout(function(){$modal.remove()},300);$('html').css('overflow','')}}})});document.addEventListener('click-no',function(e){const modal=e.target.closest('.sa-modal');if(!modal||e.target!==modal)return;modal.remove()})
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.