((body,topBody,bodyCl,topWindow) => { "use strict"; let _jsModulePrms=null, _stylePrms=null; if(!Themify.builder_url){ const baseUrl = new URL( doc.currentScript.src ); baseUrl.search = ''; baseUrl.pathname = baseUrl.pathname.replace('components.min.js', ''); Themify.builder_url=baseUrl.toString().replace('js/editor/build/',''); } window.tb_app = { breakpointsReverse: Object.keys(themify_vars.breakpoints).reverse(), isGSPage : bodyCl.contains('gs_post'), isVisual:topWindow !== window,//can be changed, in the frontend can be toggle backend mode isFrontend:false,//can't be changed init once, in backend false, in the frontend true activeBreakPoint: 'desktop', activeModel: null, isDocked: false, zoomMeta: false, isPreview: false, scrollTo: false, is_builder_ready:null, isSafari: /^((?!chrome|android).)*safari/i.test(navigator.userAgent), styleData:{}, jsModuleLoaded(){ if(_jsModulePrms===null){ this.inlineEditor=this.isFrontend=this.isVisual; const url = Themify.builder_url+'js/editor/', allPromisses = [Themify.loadJs(Themify.url+'js/admin/notification',!!window.TF_Notification)], addons=themifyBuilder.addons, componentUrl=url + 'lazy-components/'; this.componentsURL = componentUrl; if(addons){ for(let addonUrl in addons){ allPromisses.push(Themify.loadJs(addonUrl,null,addons[addonUrl])); } } if(this.isFrontend){ allPromisses.push( Themify.loadJs(url+'frontend/themify-builder-inline-editing'), Themify.loadJs('image-resize',!!window.ThemifyImageResize), Themify.loadJs(componentUrl+'correct-col-paddings') ); //allPromisses.push(Themify.loadJs(moduleUrl+'tree')); } if(!Themify.isTouch){ setTimeout(()=>{ Themify.loadJs(componentUrl + 'right-click'); // Themify.loadJs(componentUrl + 'drop-files'); },1000); } allPromisses[0].then(()=>{ TF_Notification.init().then(root=>{ if (this.isFrontend) { topBody.appendChild(root); } }); }); _jsModulePrms= Promise.all(allPromisses).then(()=>{ ThemifyConstructor.init(); setTimeout(()=>{ Themify.loadJs(componentUrl+'offline'); localStorage.removeItem('tb_visual_templates'); localStorage.removeItem('tb_form_templates_'); setInterval(()=>{Registry.observer();},15000); },10000); }); } return _jsModulePrms; }, loadJson(){ if(_stylePrms===null){ const fetchArgs={ method: 'GET' }, prms=[]; for(let files=themifyBuilder.style_json,i=files.length-1;i>-1;--i){ prms.push(new Promise(async (resolve,reject)=>{ try{ const f=new URL(files[i]), origin=window.location.origin; if(f.origin!==origin){ f.origin=origin; } const res=await Themify.fetch('', null, fetchArgs,f.toString() ); Object.assign(this.styleData,res); resolve(); } catch(e){ reject(e); } })); } _stylePrms=Promise.all(prms); } return _stylePrms; }, LocalFetch(data,type,params){ data.nonce=themifyBuilder.nonce; if(!data.bid){ let builder=this.Builder?.get(), bid=builder?.post_id || builder?.id || themifyBuilder.post_ID || ''; if(bid==='' || isNaN(bid)){ builder=this.Builder?.get(0); bid=builder?.post_id || builder?.id|| ''; } data.bid=bid; } if(!this.isFrontend){ data.admin=1; } Themify.trigger('tb_filter_fetch',data); return Themify.fetch(data,type,params); }, getColClass(){//backward compatibility return { //deprecated,don't use it need for backward compatibility 1: ['col-full'], 2: ['col4-2', 'col4-2'], 3: ['col3-1', 'col3-1', 'col3-1'], 4: ['col4-1', 'col4-1', 'col4-1', 'col4-1'], 5: ['col5-1', 'col5-1', 'col5-1', 'col5-1', 'col5-1'], 6: ['col6-1', 'col6-1', 'col6-1', 'col6-1', 'col6-1', 'col6-1'], 1_2: ['col3-1', 'col3-2'], 2_1: ['col3-2', 'col3-1'], 1_3: ['col4-1', 'col4-3'], 3_1: ['col4-3', 'col4-1'], 1_1_2: ['col4-1', 'col4-1', 'col4-2'], 1_2_1: ['col4-1', 'col4-2', 'col4-1'], 2_1_1: ['col4-2', 'col4-1', 'col4-1'] }; }, getColClassValues(){//backward compatibility return Array.from(new Set([].concat.apply([], Object.values(this.getColClass())))); } }; const api = tb_app; api.breakpointsReverse.push('desktop'); Themify.upload_url=themifyBuilder.upload_url; api.jsModuleLoaded(); api.loadJson(); api.Helper={ correctBuilderData(rows){ if(!rows || !Array.isArray(rows)){ rows=rows?Object.values(rows):[]; } for(let i=rows.length-1;i>-1;--i){ let r=rows[i]; if(r){ let {styling:rowSt,cols}=r; if(rowSt!==undefined && (!rowSt || Array.isArray(rowSt))){ r.styling={}; } if(cols){ if(!Array.isArray(cols)){ cols=r.cols=Object.values(cols); } for(let j=cols.length-1;j>-1;--j){ let col=cols[j]; if(col){ let {styling,modules}=col; if(styling!==undefined && (!styling || Array.isArray(styling))){ col.styling={}; } if(modules){ modules=this.correctBuilderData(modules); } } else{ cols.splice(j, 1); } } } } else{ rows.splice(i, 1); } } return rows; }, cloneDom(el,remove) { if (el === null) { return el; } if (el[0] !== undefined) { el = el[0]; } if(el.nodeType===Node.TEXT_NODE){ return el.cloneNode(true); } const node = remove===true?el:el.cloneNode(true); if (api.isVisual) { //after cloning dom the video is playing in bg const v = node.tfTag('video'); if (v.length > 0) { for (let i = v.length - 1; i > -1; --i) { v[i].pause(); } } for (let items = node.tfClass('tb_dragger'), i = items.length - 1; i > -1; --i) { items[i].remove(); } for (let items = Themify.selectWithParent('[contenteditable]', node), i = items.length - 1; i > -1; --i) { items[i].contentEditable=false; items[i].closest('.tb_editor_on')?.classList.remove('tb_editor_on', 'tb_editor_clicked'); } for (let items = Themify.selectWithParent('[draggable]', node), i = items.length - 1; i > -1; --i) { items[i].setAttribute('draggable', 'true'); } } for (let items = node.tfClass('tb_action_wrap'), i = items.length - 1; i > -1; --i) { let item=items[i]; item.replaceChildren(); item.removeAttribute('id'); item.removeAttribute('style'); } for (let items = node.querySelectorAll('.tb_del_btn,.tb_add_btn'), i = items.length - 1; i > -1; --i) { items[i].replaceChildren(); } const uiItems=node.querySelectorAll('.tb_editor_on,.tb_element_clicked,.tb_selected_img,.tb_editor_clicked,.tb_hide_drag_col_right,.tb_hide_drag_left,.tb_hide_drag_right,.tb_drag_one_column,.tb_drag_side_column,.tb_draggable_item,.tb_column_drag_inner,.tb_active_action_bar,.compact-mode,.tf_dragger_negative'); for (let i = uiItems.length - 1; i > -1; --i) { uiItems[i].classList.remove( 'tb_element_clicked','tb_editor_on','tb_selected_img','tb_editor_clicked', 'tb_hide_drag_col_right','tb_hide_drag_left','tb_hide_drag_right', 'tb_drag_one_column', 'tb_drag_side_column', 'tb_draggable_item', 'tb_column_drag_inner','tb_active_action_bar','compact-mode','tf_dragger_negative'); } for (let items = node.querySelectorAll('[data-drag-w],[data-pos]'), i = items.length - 1; i > -1; --i) { items[i].removeAttribute('data-drag-w'); items[i].removeAttribute('data-pos'); } node.classList.remove('tb_selected_img', 'tb_element_clicked','tb_editor_on','tb_editor_clicked', 'tb_hide_drag_col_right','tb_hide_drag_left','tb_hide_drag_right', 'tb_drag_one_column', 'tb_drag_side_column', 'tb_draggable_item', 'tb_column_drag_inner','tb_active_action_bar','compact-mode','tf_dragger_negative'); node.removeAttribute('data-drag-w'); node.removeAttribute('data-pos'); return node; }, cloneObject(obj){ return obj?JSON.parse(JSON.stringify(obj)):{}; }, compareObject(oldSettings,newSetting){ if(oldSettings && newSetting){ const size1=oldSettings.hasOwnProperty('length')?oldSettings.length:Object.keys(oldSettings).length, size2=newSetting.hasOwnProperty('length')?newSetting.length:Object.keys(newSetting).length; if(size1===size2){ if(size1>0){ for(let i in oldSettings){ if(newSetting[i]===undefined){ return true; } if(oldSettings[i]!==null && typeof oldSettings[i] === 'object'){ if(typeof newSetting[i]!=='object' || this.compareObject(oldSettings[i],newSetting[i])){ return true; } } else if(newSetting[i]!=oldSettings[i] || (typeof newSetting[i]==='object' && typeof oldSettings[i]!=='object')){ return true; } } } } else{ return true; } } else{ return true; } return false; }, isImageUrl(link) { if (!link) { return false; } const parts = link.split('?')[0].split('.'); return ['jpg', 'jpeg', 'tiff', 'png', 'gif', 'bmp', 'svg', 'svgz','webp','apng'].includes(parts[parts.length - 1]); }, limitString(str, limit=120) { let new_str = ''; if (str !== '' && str !== undefined) { const tmp = createElement(); tmp.innerHTML = str; str = tmp.textContent; // strip html tags new_str = str.length > limit ? (str.substr(0, limit)+'...') : str; } return new_str; }, loadJsZip(){ return Themify.loadJs('https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js',!!window.JSZip,false); }, toRGBA(v){ return ThemifyStyles.toRGBA(v); }, getIcon(icon, cl) { const fontello_prefix=themifyBuilder.fontello_prefix; if (typeof fontello_prefix!== 'undefined') { const fontello_regex = new RegExp(themifyBuilder.fontello_use_suffix ? fontello_prefix + '$' : '^' + fontello_prefix); if (fontello_regex.test(icon)) { return createElement('i',icon); } } icon = 'tf-' + icon.trim().replace(' ', '-'); let classes = 'tf_fa ' + icon; if (cl) { classes += ' ' + cl; } const svg = createElementNS('',classes); svg.appendChild(createElementNS('use',{href:'#' + icon})); return svg; }, getLottie(arr,sel){ if(arr.path && arr.seg){ let json={ path:arr.path, seg:arr.seg }, lottie=createElement('tf-lottie'), tmpl=createElement('template'); if(arr.st){ json.st=arr.st; } if(arr.sp && arr.sp!=1){ json.sp=arr.sp; } if(arr.dir){ json.dir=arr.dir; } if(arr.fid){ json.fid=arr.fid; } if(arr.r && arr.r!=='svg'){ json.r=arr.r; } if(arr.count>1){ json.count=arr.count; } if(sel){ json.sel=sel; } if(!arr.lp){ json={actions:json,loop:1}; } tmpl.innerHTML=JSON.stringify(json); lottie.appendChild(tmpl); return lottie; } return tb_createDocumentFragment(); }, getColor(el) { let v = el.value; if (v !== '') { if (el.getAttribute('data-tfminicolors-initialized') !== null) { v = jQuery(el).tfminicolors('rgbaString'); } else { const opacity = el.dataset.opacity; if (opacity !== '' && opacity !== null) { v = ThemifyStyles.toRGBA(v + '_' + opacity); } } } return v; }, getBreakpointName(bp){ return api.ToolBar.el.querySelector('.breakpoint-'+bp+' span').textContent; }, generateUniqueID() { const uid=(Math.random().toString(36).substr(2, 4) + (new Date().getUTCMilliseconds()).toString()).substr(0, 7); return Registry.get(uid)?this.generateUniqueID():uid; }, clearElementId(data, _new) { for (let i=data.length-1;i>-1;--i) { let item=data[i], opt = item.styling || item.mod_settings; if (_new === true) { item.element_id = this.generateUniqueID(); } else { delete item.element_id; } if (opt !== undefined) { const customCss=opt.custom_css_id; if (customCss !== undefined && customCss !== '') { let j = 1; while (true) { let id = j!==1?(customCss+'-'+j):customCss; if (!doc.tfId(id)?.closest('.module_row')) { opt.custom_css_id = id; break; } ++j; } } let nested=opt.content_accordion || opt.tab_content_tab, bulder=opt.builder_content; if (bulder !== undefined) { if(typeof bulder === 'string'){ bulder=JSON.parse(bulder); } this.clearElementId(bulder, true); opt.builder_content = bulder; } if(nested){ for (let j=nested.length-1;j>-1;--j) { let bulder=nested[j].builder_content; if(bulder){ if(typeof bulder === 'string'){ bulder=JSON.parse(bulder); } this.clearElementId(bulder, true); nested[j].builder_content = bulder; } } } /* Toggle module */ if ( opt.toggle1 ) { this.clearElementId(opt.toggle1, true); } if ( opt.toggle2 ) { this.clearElementId(opt.toggle1, true); } } if (item.cols !== undefined) { this.clearElementId(item.cols, _new); } else if (item.modules !== undefined) { this.clearElementId(item.modules, _new); } } }, async codeMirror(el,mode,conf={}){ try{ conf.isDarkMode=api.isDarked; await topWindow.Themify.loadJs(Themify.url+'js/admin/modules/codemirror/codemirror',!!topWindow.ThemifyCodeMiror); const obj=new topWindow.ThemifyCodeMiror(el,mode,conf); await obj.run(); return obj; } catch(e){ return null; } }, async gzip(data){ if(!window.CompressionStream || themifyBuilder.gzip_disabled){ throw 'err'; } const byteArray = new TextEncoder().encode(data), cs = new CompressionStream('gzip'), writer = cs.writable.getWriter(); writer.write(byteArray); writer.close(); const res=await (new Response(cs.readable)).arrayBuffer(); return btoa(String.fromCharCode(...new Uint8Array(res))); } }; api.Registry={ items : new Map, _events : new Map, observer(){ for(let [id,model] of this.items){ if(!model.el.isConnected){ this.remove(id); } } }, add(item) { this.items.set(item.id, item); return this; }, get(id) { return this.items.get(id) || null; }, remove(id,db=true) { const model = this.get(id); if (model) { model.el.remove(); if(db===true){ this.items.delete(id); this._events.delete(id); } } return this; }, destroy() { for(let v of this.items){ this.get(v[0])?.el.remove(); } this.items.clear(); this._events.clear(); return this; }, on(id, ev, f) { if(f!==undefined){ const events=this._events.get(id) || {}; events[ev]??=[]; events[ev].push(f); this._events.set(id, events); } return this; }, off(id, ev,f) { const events=this._events.get(id); if(events!==undefined){ if(!ev){ this._events.delete(id); } else if(events[ev]!==undefined){ if(f){ for(let i=events[ev].length-1;i>-1;--i){ if(events[ev][i]===f){ events[ev].splice(i, 1); } } if(events[ev].length===0){ delete events[ev]; } } else{ delete events[ev]; } this._events.set(id,events); } } return this; }, trigger(id, ev, ...args) { const events = this._events.get(id), proms=[]; if (events?.[ev]!==undefined) { let _this = typeof id === 'string' ? this.get(id) : id; if(!_this){ _this=id; } for (let i = events[ev].length-1; i>-1;--i) { let pr=events[ev][i].apply(_this, args); if(pr instanceof Promise){ proms.push(pr); } } } return Promise.all(proms).catch(()=>{}); } }; const isFrontend=api.isFrontend, Registry=api.Registry; api.Utils = { _onResizeEvents:new Set, async onResize(trigger) { if(api.isFrontend){ const events = $._data(window, 'events')?.resize; if (events) { for (let i = 0; i < events.length; ++i) { if (events[i].handler !== undefined) { this._onResizeEvents.add(events[i].handler); } } } $(window).off('resize'); if (trigger) { const e = $.Event('resize', { type: 'resize', isTrigger: false }); for (let handler of this._onResizeEvents) { try { handler.apply(window, [e, $]); }catch (e) { } } Themify.triggerEvent(window,'resize') .trigger('tfsmartresize', {w: Themify.w, h: Themify.h}); } } }, updateDocumentSize() { if (api.isVisual) { let req, timeout; (new ResizeObserver(entries => { Themify.trigger('documentsize'); if (api.activeBreakPoint !== 'desktop') { clearTimeout(timeout); timeout=setTimeout(() => { const _body=entries[0].target; cancelAnimationFrame(req); req = requestAnimationFrame(() => { topBody.style.height = _body.scrollHeight + 'px'; setTimeout(() => { this.onResize(true); topBody.style.height = _body.scrollHeight + 'px'; timeout=req=null; }, 220); }); }, 60); } })).observe(body); } }, findCssRule(rules, selector) { selector = selector.replace(/\s*>\s*/g, '>').replace(/\,\s/g, ',').trim(); const isCondition=selector[0]==='@'; for (let i = rules.length - 1; i > -1; --i) { if ((isCondition===true && rules[i].conditionText && rules[i].cssText.replace(/\s*>\s*/g, '>').replace(/\,\s/g, ',').trim().includes(selector)) || (isCondition===false && !rules[i].conditionText && selector === rules[i].selectorText.replace(/\s*>\s*/g, '>').replace(/\,\s/g, ',').trim())) { return i; } } return false; }, _filterClass(cl) { const _COL_CLASSES_VALUES=api.getColClassValues(); for (let i = cl.length - 1; i > -1; --i) { if (_COL_CLASSES_VALUES.includes(cl[i])) { return cl[i]; } } return ''; }, getRowSettings(base, type, saving) { type = type || 'row'; saving = !!saving; let option_data = {}, styling, model_r = Registry.get(base.dataset.cid); if (model_r) { const sel=type==='subrow'?'module_subrow':type + '_inner', inner = base.tfClass(sel)[0], columns=api.Utils.getColumns(inner), count = columns.length, points = api.breakpointsReverse, bpLength = points.length, cols = [], colPaddingsIds=['padding_top','padding_bottom','padding_left','padding_right','margin-bottom','margin-top'], paddingLen=colPaddingsIds.length; // cols for (let i = 0; i < count; ++i) { let model_c = Registry.get(columns[i].dataset.cid); if (model_c) { let modules = columns[i].tfClass('tb_holder')[0], cl = this._filterClass(columns[i].classList), index = cols.push({ element_id: model_c.id }); --index; if (cl !== '') { //backward compatibility cols[index].grid_class = cl; } styling = api.Helper.cloneObject(model_c.get('styling')); if (styling && Object.keys(styling).length > 0) { if(saving===true){ if(isFrontend){//in admin part we can't use iframe to convert paddings that is why skipping //we need always save padding/margin units as 2 "value1,value2"(when the unit is %) to detect the data is converted for(let j=paddingLen-1;j>-1;--j){ let prop=colPaddingsIds[j]; if(styling[prop+'_unit']==='%' && styling[prop]!=='' && styling[prop]!==undefined && !styling[prop].toString().includes(',')){ styling[prop]=','+styling[prop]; } for (let k = bpLength - 2; k>-1; --k) { if(styling['breakpoint_'+points[k]]!==undefined){ let p=styling['breakpoint_'+points[k]][prop]; if(p!=='' && p!==undefined && !p.toString().includes(',') && ThemifyStyles.getStyleVal(prop+'_unit',styling,points[k])==='%'){ styling['breakpoint_'+points[k]][prop]=','+p; } } } } } model_c.constructor.builderSave(styling); } if(styling && Object.keys(styling).length>0){ cols[index].styling = styling; } } if (modules !== undefined) { modules = modules.children; let items = []; for (let j = 0; j < modules.length; ++j) { let m = Registry.get(modules[j].dataset.cid), mname=m?.get('mod_name'); if (mname) { styling = api.Helper.cloneObject(m.get('mod_settings')); if(styling){ if(m.type==='module'){ m.parseHtml(styling,saving); } if(saving===true){ m.constructor.builderSave(styling); Themify.trigger( 'tb_save_component', { data : styling, slug : mname } ); } } let k = items.push({ mod_name:mname, element_id: m.id }); --k; if (styling && Object.keys(styling).length > 0) { delete styling.cid; items[k].mod_settings = styling; } // Sub Rows if (m.type==='subrow') { items[k] = this.getRowSettings(modules[j], 'subrow', saving); } } } if (items.length > 0) { cols[index].modules = items; } } } } option_data = { element_id: model_r.id, cols: cols }; let sizes = {...model_r.get('sizes')}; if (count>1) { for (let i = bpLength-1;i>-1;--i) {//make equal let bp = points[i], size = sizes[bp + '_size'], area = sizes[bp + '_area'], colh = sizes[bp + '_auto_h']; if (size) { size=ThemifyStyles.getColSize(size,false); if (size.includes(' ')) { size = size.replace(/\s\s+/g, ' ').split(' '); for (let j = size.length - 1; j > -1; --j) { let fr = parseFloat(size[j].trim()); if (fr !== 1) { size[j] = size[j].replace(fr.toString(), parseFloat(fr.toFixed(5)).toString()); } } size = size.join(' ').replaceAll('0.', '.').trim(); } sizes[bp + '_size']=size; } if (area) { if(bp==='desktop'){ delete sizes[bp + '_area']; } else{ if(area.includes(' ')){ area=area.replaceAll('col', '').replace(/\s\s+/g, ' ').trim(); sizes[bp + '_area']= area; if(size && !size.includes(' ')){ let checkArea=model_r.getGridCss({size:size},bp); if(checkArea['--area'] && checkArea['--area'].replaceAll('col', '').replace(/\s\s+/g, ' ').trim()===area){ delete sizes[bp + '_area']; } } } else if(!ThemifyStyles.getAreaValue(area)){ delete sizes[bp + '_area']; } } } if (colh) { sizes[bp + '_auto_h'] = parseInt(colh); } if (saving === true && sizes[bp + '_dir']!==undefined) {//backward delete sizes[bp + '_dir']; } } for (let i = 0; i < bpLength - 1; ++i) { //clean again duplicates let bp = points[i], gutter = sizes[bp + '_gutter'], colh = sizes[bp + '_auto_h'], size = sizes[bp + '_size'], align = sizes[bp + '_align']; if (gutter || align || colh || size) { for (let j = i + 1; j < bpLength; ++j) { let bp2 = points[j]; if (gutter && sizes[bp2 + '_gutter']) { if (sizes[bp2 + '_gutter'] === gutter) { delete sizes[bp + '_gutter']; } gutter = null; } if (align && sizes[bp2 + '_align']) { if (sizes[bp2 + '_align'] === align) { delete sizes[bp + '_align']; } align = null; } if (colh && sizes[bp2 + '_auto_h']) { if (sizes[bp2 + '_auto_h'] === colh) { delete sizes[bp + '_auto_h']; } colh = null; } if (size && sizes[bp2 + '_size']) { if (saving === true && sizes[bp2 + '_size'] === size) { delete sizes[bp + '_size']; } size = null; } if (!gutter && !align && !colh && !size) { break; } } } } if (sizes.desktop_area) { const area = []; for (let i = 0; i < count; ++i) { area.push(i + 1); } if (area.join(' ') === sizes.desktop_area) { delete sizes.desktop_area; } } //backward if ((sizes.mobile_dir !== undefined && (!sizes.desktop_dir || sizes.desktop_dir === sizes.tablet_landscape_dir) && sizes.tablet_dir === sizes.mobile_dir && sizes.tablet_landscape_dir === sizes.mobile_dir)) { delete sizes.desktop_dir; delete sizes.tablet_landscape_dir; delete sizes.tablet_dir; delete sizes.mobile_dir; } else if (sizes.desktop_dir === 'ltr') { delete sizes.desktop_dir; } if (sizes.desktop_auto_h === -1) { delete sizes.desktop_auto_h; } if (sizes.desktop_align === 'start' && api.isFullSection===false) { delete sizes.desktop_align; } if (sizes.desktop_gutter === 'gutter') { delete sizes.desktop_gutter; } for (let i in sizes) { if (sizes[i] === undefined || sizes[i] === '') { delete sizes[i]; } } } else{ sizes={}; } option_data.sizes = sizes; styling = api.Helper.cloneObject(model_r.get('styling')); if (styling) { delete styling.cid; if(Object.keys(styling).length > 0){ if(saving===true){ model_r.constructor.builderSave(styling); } option_data.styling = styling; } } } return option_data; }, getAllImages(type){ const images=new Map, localImages=new Set, externalImages=new Set, themifyImages=new Set, addImage=url=>{ if(api.Helper.isImageUrl(url) || url.includes('.mp4') || url.includes('.mpeg') || url.includes('.mp3')){ if(url.includes('themify.me')|| url.includes('themify.org')){ if(!url.includes(themifyBuilder.site_url)){ themifyImages.add(url); } } else if(url.includes(Themify.urlHost)){ localImages.add(url); } else{ externalImages.add(url); } } }, getImages=fields=>{ for(let i in fields){ if(fields[i]){ if(Array.isArray(fields[i]) || typeof fields[i]==='object'){ getImages(fields[i]); } else{ let v=fields[i].toString().trim(); if(v){ if(v.includes('-1;--j){ let {src,srcset}=allImages[j]; srcset=srcset?.split(' ') || []; if(src){ srcset.push(src); } for(let k=srcset.length-1;k>-1;--k){ if(srcset[k]){ addImage(srcset[k].trim()); } } } } else if(v[0]==='[' && v.includes('path=')){ let m=v.match(/path.*?=.*?['"](.+?)['"]/igm); if(m?.[0]){ m=m[0].split('path=')[1].replaceAll('"','').replace("'",'').split(','); for(let j=m.length-1;j>-1;--j){ if(m[j]){ addImage(m[j].trim()); } } } } else{ addImage(v); } } } } } }; for(let cid of Registry.items.keys()){ let v=Registry.get(cid); if(v?.el.isConnected){ getImages(v.get('styling')); } } const domImages=api.Builder.get().el.tfTag('img'); for(let i=domImages.length-1;i>-1;--i){ let src=domImages[i].src, srcset=domImages[i].srcset; srcset=srcset?.split(' ') ||[]; if(src){ srcset.push(src); } for(let j=srcset.length-1;j>-1;--j){ if(srcset[j]){ addImage(srcset[j].trim()); } } } images.set('themify',themifyImages); images.set('local',localImages); images.set('external',externalImages); return type?images.get(type):images; }, async importThemifyImages(images){ if(Themify.urlHost.includes('themify.me')){ return; } images??=this.getAllImages('themify'); if(images.size>0){ return new Promise(async (resolve,reject)=>{ try{ await Themify.loadJs(Themify.url+'js/admin/import/import-images',!!window.TF_ImportImages); const memory=~~themifyBuilder.memory || 64, chunkSize=memory>=255?4:(memory>=120?3:(memory>60?2:1)), res=await TF_ImportImages.init(images,themifyBuilder.nonce,i18n.uploading,chunkSize), breakpoints=api.breakpointsReverse, setImages=fields=>{ for(let i in fields){ if(fields[i]===undefined){ delete fields[i]; } else if(fields[i]){ if(Array.isArray(fields[i]) || typeof fields[i]==='object'){ setImages(fields[i]); } else{ let v=fields[i].toString().trim(); if(v && isNaN(v)){ if(v.includes(''; let content=tmp.content.firstChild, allImages= content.tfTag('img,video,audio'); for(let j=allImages.length-1;j>-1;--j){ let src=allImages[j].src; if(src){ for(let [k,img] of res){ if(img!==false && src.includes(k)){ allImages[j].outerHTML=img.html; } } } } fields[i]=content.innerHTML; } else if( v[0]==='[' || !v.includes(' ')){ if(v[0]==='[' && v.includes('path=')){ v=v.replace('path=','ids='); for(let [k,img] of res){ if(img!==false){ v=v.replaceAll(k,img.id); } } } else{ for(let [k,img] of res){ if(img!==false){ v=v.replaceAll(k,img.src); } } } fields[i]=v; } } } } } }; for(let [k,v] of res){ if(v!==false){ let domMedia=doc.querySelectorAll('[src="'+k+'"]'); for(let i=domMedia.length-1;i>-1;--i){ let tagName=domMedia[i].tagName; if(tagName==='IMG' || tagName==='VIDEO' || tagName==='AUDIO'){ domMedia[i].src=v.src; if(tagName==='IMG'){ domMedia[i].classList.add('wp-image-'+v.id); } else if(tagName==='VIDEO' ){ domMedia[i].load(); } } } domMedia=doc.querySelectorAll('img[data-orig="'+k+'"]'); for(let i=domMedia.length-1;i>-1;--i){ domMedia[i].dataset.orig=v.src; domMedia[i].classList.add('wp-image-'+v.id); } if(isFrontend){ for(let i=breakpoints.length-1;i>-1;--i){ let bp=breakpoints[i], rules=ThemifyStyles.getSheet(bp).cssRules, gsRules=ThemifyStyles.getSheet(bp,true).cssRules; for(let j=rules.length-1;j>-1;--j){ rules[j].style.cssText=rules[j].style.cssText.replaceAll(k,v.src); } for(let j=gsRules.length-1;j>-1;--j){ rules[j].style.cssText=rules[j].style.cssText.replaceAll(k,v.src); } } } } } for(let cid of Registry.items.keys()){ let v=Registry.get(cid); if(v){ setImages(v.get('styling')); } } TF_Notification.showHide('done','',100); resolve(res); } catch(e){ reject(e); } }); } }, grid(slug) { const cols = [], oldGrids=api.getColClass()[slug.toString()]; let len=oldGrids?.length || ~~slug; for (let i = 0; i < len; ++i) { let _c = oldGrids===undefined ? {} : { grid_class:oldGrids[i] }; cols.push(_c); } return [{ cols: cols }]; }, setColumnsCount(col) { const len = col.length; if (len > 0) { const parentNode=col[0].parentNode, cl = parentNode.classList; for (let i = cl.length - 1; i > -1; --i) { if (cl[i].indexOf('tb_col_count_') === 0) { cl.remove(cl[i]); break; } } cl.add('tb_col_count_' +this.getColumns(parentNode).length); } }, getColumns(row) { const arr=[]; for(let ch=row.children,i=0;i -1; --i) { let img=images[i], naturalWidth=img.naturalWidth, naturalHeight=img.naturalHeight; if (naturalWidth > 2560 || naturalHeight > 2560) { img.className += ' tf_large_img'; Themify.largeImages(img); } else { let w = img.getAttribute('width'), h = img.getAttribute('height'); if ((w || h) && (Math.abs(naturalWidth-w)>4 || Math.abs(naturalHeight-h)>4)) { if(len>max){ promises.push(new Promise((resolve,reject)=>{ setTimeout(()=>{ ThemifyImageResize.toBlob(img, w, h).then(resolve).catch(reject); },i*waitMls); })); } else{ promises.push(ThemifyImageResize.toBlob(img, w, h)); } } } } } } try{ await Promise.all(promises); } catch(e){ } if (el && window.Isotope) { for (let masonry = Themify.selectWithParent('masonry-done', el),i = masonry.length - 1; i > -1; --i) { Isotope.data(masonry[i])?.destroy(); masonry[i].classList.remove('masonry-done'); } } return Themify.reRun(el); // load module js ajax }, // get breakpoint width getBPWidth(device) { const bps=themify_vars.breakpoints, breakpoints = Array.isArray(bps[device]) ? bps[device] : bps[device].toString().split('-'); return breakpoints[breakpoints.length - 1]; }, scrollTo(el,offset,opt={}) { if (el) { if(!offset){ el.scrollIntoView(opt); } else{ opt.top=el.getBoundingClientRect().top-topBody.getBoundingClientRect().top-offset; window.scrollTo(opt); } } }, addViewPortClass(el) { el.style.transition = 'none'; this.removeViewPortClass(el); for (let cl = this._isInViewport(el), i = cl.length - 1; i > -1; --i) { el.classList.add(cl[i]); el.part.add(cl[i]); } el.style.transition = ''; }, removeViewPortClass(el) { for (let removeCl = ['top', 'left', 'bottom', 'right'],i = 4; i > -1; --i) { let cl='tb_touch_' + removeCl[i]; el.classList.remove(cl); el.part.remove(cl); } }, _isInViewport(el) { const offset = el.getBoundingClientRect(), cl = [], docEl=doc.documentElement; if (offset.left < 0) { cl.push('tb_touch_left'); } else if (offset.right - 1 >= docEl.clientWidth) { cl.push('tb_touch_right'); } if (offset.top < 0) { cl.push('tb_touch_top'); } else if(((offset.bottom+ 1) >= docEl.clientHeight) || ((window.innerHeight + window.scrollY) >= body.offsetHeight && (offset.bottom + 20) >= docEl.clientHeight)) { cl.push('tb_touch_bottom'); } return cl; } }; })(body,topBody,bodyCl,topWindow);