PageSourceSearch

https://www.casopisstavebnictvi.cz/assets/borekstavitel-bsmanager-…rsioned-assets-sa-modal.min.js?t=1790917629

js casopisstavebnictvi.cz collected 2026-10-02 14:38:44 UTC 39,502 bytes, 134 lines download raw bytes

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.