| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362 |
- /**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup UnaCore UNA Core
- * @{
- */
- function processJsonData(oData) {
- var fContinue = function(oData) {
- if(oData && oData.reload != undefined && parseInt(oData.reload) == 1)
- document.location = document.location;
- if(oData && oData.redirect != undefined && oData.redirect.length != 0)
- document.location = oData.redirect;
- if(oData && oData.popup != undefined) {
- var oPopup = null;
- var oOptions = {
- fog: {
- color: '#fff',
- opacity: .7
- },
- closeOnOuterClick: false
- };
- if(typeof(oData.popup) == 'object') {
- oOptions = $.extend({}, oOptions, oData.popup.options);
- oPopup = $(oData.popup.html);
- }
- else
- oPopup = $(oData.popup);
- if ('undefined' !== typeof(bx_editor_remove_all))
- bx_editor_remove_all($('#' + oPopup.attr('id')));
-
- $('#' + oPopup.attr('id')).remove();
- oPopup.hide().prependTo('body').bxProcessHtml().dolPopup(oOptions);
- }
- if(oData && oData.form != undefined && oData.form_id != undefined)
- $('form#' + oData.form_id).replaceWith(oData.form).bxProcessHtml();
- if (oData && oData.eval != undefined)
- eval(oData.eval);
- };
- // A reply can name its interface sound: 'error', or {cue: 'success', emphasis: 'subtle'}. It plays now, before any alert.
- if(oData && oData.cue != undefined)
- bx_sound(typeof(oData.cue) == 'object' ? oData.cue.cue : oData.cue, typeof(oData.cue) == 'object' ? oData.cue : undefined);
- if(oData && oData.object != undefined && oData.grid != undefined)
- if(glGrids[oData.object] != undefined)
- glGrids[oData.object].processJson(oData);
- if(oData && oData.message != undefined && oData.message.length != 0)
- bx_alert(oData.message, function() {
- fContinue(oData);
- });
- else if(oData && oData.msg != undefined && oData.msg.length != 0)
- bx_alert(oData.msg, function() {
- fContinue(oData);
- });
- else if(oData && oData.toast != undefined && oData.toast.length != 0) {
- bx_toast(oData.toast);
- fContinue(oData);
- }
- else
- fContinue(oData);
- };
- function getHtmlData( elem, url, callback, method, confirmation, values, loading)
- {
- var fPerform = function() {
- // in most cases it is element ID, in other cases - object of jQuery
- if (typeof elem == 'string')
- elem = '#' + elem; // create selector from ID
- var $block = $(elem);
- var blockPos = $block.css('position');
- $block.css('position', 'relative'); // set temporarily for displaying "loading icon"
- if ('undefined' === typeof(loading) || loading) {
- bx_loading_content($block, true);
- var $loadingDiv = $block.find('.bx-loading-ajax');
- var iLeftOff = parseInt(($block.innerWidth() / 2.0) - ($loadingDiv.outerWidth() / 2.0));
- var iTopOff = parseInt(($block.innerHeight() / 2.0) - ($loadingDiv.outerHeight()));
- if (iTopOff<0) iTopOff = 0;
- $loadingDiv.css({
- position: 'absolute',
- left: iLeftOff,
- top: iTopOff
- });
- }
- if (undefined != method && (method == 'post' || method == 'POST')) {
- if (typeof values == 'undefined')
- values = {};
- $.post(url, values, function(data) {
- $block.html(data);
- $block.css('position', blockPos).bxProcessHtml();
- if (typeof callback == 'function')
- callback.apply($block);
- });
- }
- else {
- $block.load(url + '&_r=' + Math.random(), function() {
- $(this).css('position', blockPos).bxProcessHtml();
- if (typeof callback == 'function')
- callback.apply(this);
- });
- }
- };
- if (typeof(confirmation) != 'undefined' && confirmation)
- bx_confirm(_t('_Are_you_sure'), fPerform);
- else
- fPerform();
- }
- function loadDynamicBlockAutoPaginate (e, iStart, iPerPage, sAdditionalUrlParams, sStartParamName, sPerPageParamName) {
- sUrl = location.href;
- sStartParamName = typeof sStartParamName !== 'undefined' ? sStartParamName : 'start';
- sPerPageParamName = typeof sPerPageParamName !== 'undefined' ? sPerPageParamName : 'per_page';
- sUrl = sUrl.replace(/start=\d+/, '').replace(/per_page=\d+/, '').replace(/[&\?]+$/, '');
- sUrl = bx_append_url_params(sUrl, sStartParamName + '=' + parseInt(iStart) + '&' + sPerPageParamName + '=' + parseInt(iPerPage));
- if ('undefined' != typeof(sAdditionalUrlParams))
- sUrl = bx_append_url_params(sUrl, sAdditionalUrlParams);
- if ($(e).parents('.bx-search-result-block-pagination').length > 0){
- $([document.documentElement, document.body]).animate({
- scrollTop: $(e).parents('.bx-search-result-block-pagination').first().offset().top
- }, 500);
- }
- return loadDynamicBlockAuto(e, sUrl);
- }
- function loadDynamicBlockAutoSort (e, sort, sAdditionalUrlParams) {
- sUrl = location.href;
- console.log(sort);
- sUrl = sUrl.replace(/sort=\d+/, '').replace(/[&\?]+$/, '');
- sUrl = bx_append_url_params(sUrl, 'sort' + '=' + sort);
- if ('undefined' != typeof(sAdditionalUrlParams))
- sUrl = bx_append_url_params(sUrl, sAdditionalUrlParams);
- if ($(e).parents('.bx-search-result-block-pagination').length > 0){
- $([document.documentElement, document.body]).animate({
- scrollTop: $(e).parents('.bx-search-result-block-pagination').first().offset().top
- }, 500);
- }
- return loadDynamicBlockAuto(e, sUrl);
- }
- /**
- * This function reloads page block automatically,
- * just provide any element inside the block and this function will reload the block.
- * @param e - element inside the block
- * @return true on success, or false on error - particularly, if block isn't found
- */
- function loadDynamicBlockAuto(e, sUrl, oPostData) {
- var oContainer = $(e).parents('.bx-page-block-container:first:not(.no-dynamic)');
- var sId = oContainer.attr('id');
- if ('undefined' == typeof(sUrl))
- sUrl = location.href;
- if (!sId || !sId.length)
- return false;
- var aMatches = sId.match(/\-(\d+)$/);
- if (!aMatches || !aMatches[1])
- return false;
- var oPaginate = oContainer.find('.bx-paginate');
- if(oPaginate.length > 0) {
- var iStart = parseInt(oPaginate.attr('bx-data-start'));
- var iPerPage = parseInt(oPaginate.attr('bx-data-perpage'));
- var oParams = {};
- if(!isNaN(iStart) && sUrl.indexOf('start') == -1)
- oParams.start = iStart;
- if(!isNaN(iPerPage) && sUrl.indexOf('per_page') == -1)
- oParams.per_page = iPerPage;
- sUrl = bx_append_url_params(sUrl, oParams);
- }
- loadDynamicBlock(parseInt(aMatches[1]), sUrl, oPostData);
- return true;
- }
- /**
- * Reload the current page block to show or hide a form secret field.
- * Reveal is POSTed with a CSRF token so it cannot be triggered by a GET param alone.
- * When the form is not inside a page block, the whole page is reloaded via POST.
- */
- function bx_form_secret_toggle(e) {
- var oToggle = $(e);
- var bHide = oToggle.closest('.bx-form-secret').hasClass('bx-form-secret-shown');
- var sField = oToggle.attr('bx_form_secret_field');
- var sCsrfToken = oToggle.attr('bx_form_secret_csrf');
- var sUrl = location.href;
- try {
- var oUrl = new URL(sUrl);
- oUrl.searchParams.delete('form_secret_reveal');
- oUrl.searchParams.delete('csrf_token');
- sUrl = oUrl.toString();
- } catch (oErr) {
- sUrl = sUrl.replace(/([?&])form_secret_reveal=[^&]*/g, '$1').replace(/([?&])csrf_token=[^&]*/g, '$1').replace(/[?&]$/, '');
- }
- if (bHide) {
- if (!loadDynamicBlockAuto(e, sUrl))
- location.href = sUrl;
- return false;
- }
- var oData = {form_secret_reveal: sField};
- if (sCsrfToken)
- oData.csrf_token = sCsrfToken;
- return loadDynamicBlockAuto(e, sUrl, oData);
- }
- function loadDynamicBlock(iBlockID, sUrl, oPostData) {
-
- var oCallback = null;
- if($('#bx-page-block-' + iBlockID + ' .bx-base-unit-showcase-wrapper').length){
- oCallback = bx_showcase_view_init;
- }
- if (typeof oPostData != 'undefined' && oPostData)
- getHtmlData($('#bx-page-block-' + iBlockID), bx_append_url_params(sUrl, 'dynamic=tab&pageBlock=' + iBlockID), oCallback, 'post', false, oPostData);
- else
- getHtmlData($('#bx-page-block-' + iBlockID), bx_append_url_params(sUrl, 'dynamic=tab&pageBlock=' + iBlockID), oCallback);
- return true;
- }
- function loadDynamicPopupBlock(iBlockID, sUrl) {
- if (!$('#dynamicPopup').length) {
- $('<div id="dynamicPopup" style="display:none;"></div>').prependTo('body');
- }
- $('#dynamicPopup').load(
- (sUrl + '&dynamic=popup&pageBlock=' + iBlockID),
- function() {
- $(this).dolPopup({
- left: 0,
- top: 0
- });
- }
- );
- }
- function closeDynamicPopupBlock() {
- $('#dynamicPopup').dolPopupHide();
- }
- function loadDynamicBlockAsync(iBlockID, sUrl, fCallback, bLoading, bLazyLoad) {
- if(!sUrl)
- sUrl = document.location.href;
- var fLoadBlock = function(iBlockID, sUrl) {
- if(fCallback == undefined || fCallback == true)
- fCallback = onAsyncBlockLoad;
- getHtmlData($('#bx-page-block-' + iBlockID), bx_append_url_params(sUrl, 'dynamic=tab&pageBlock=' + iBlockID), fCallback, 'post', false, {
- includedCss: JSON.stringify(aIncludedCss),
- includedJs: JSON.stringify(aIncludedJs)
- }, (bLoading != undefined && bLoading == true));
- };
- if(bLazyLoad == undefined || bLazyLoad == true) {
- const oObserver = new IntersectionObserver((aEntries, obs) => {
- aEntries.forEach(oEntry => {
- if(oEntry.isIntersecting) {
- const oElement = oEntry.target;
- fLoadBlock(iBlockID, sUrl);
- obs.unobserve(oElement);
- }
- });
- }, {
- root: null, // viewport
- threshold: 0.1 // trigger when 10% visible
- });
- document.querySelectorAll('.bx-db-placeholder-async').forEach(oElement => {
- oObserver.observe(oElement);
- });
- }
- else
- $(document).ready(function() {
- fLoadBlock(iBlockID, sUrl);
- });
- }
- function onAsyncBlockLoad() {
- var oBlock = $(this);
- if(!oBlock.html())
- oBlock.remove();
- }
- /**
- * Translate string
- */
- function _t(s, arg0, arg1, arg2) {
- if (!window.aDolLang || !aDolLang[s])
- return s;
- cs = aDolLang[s];
- cs = cs.replace(/\{0\}/g, arg0);
- cs = cs.replace(/\{1\}/g, arg1);
- cs = cs.replace(/\{2\}/g, arg2);
- return cs;
- }
- function showPopupAnyHtml(sUrl, sId) {
- var oPopupOptions = {};
- if (!sId || !sId.length)
- sId = 'login_div';
- $('#' + sId).remove();
- $('<div id="' + sId + '" style="display: none;"></div>').prependTo('body').load(
- sUrl.match('^http[s]{0,1}:\/\/') ? sUrl : sUrlRoot + sUrl,
- function() {
- $(this).dolPopup(oPopupOptions);
- }
- );
- }
- function bx_loading_svg(sType, sClass) {
- sClass = sClass != undefined && sClass.length > 0 ? sClass : '';
- if(sUseSvgLoading != undefined && sUseSvgLoading.length > 0)
- return sUseSvgLoading.replace(new RegExp('__type__','g'), sType).replace(new RegExp('__class__','g'), sClass);
- var s = '';
- s += '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 520 520" class="' + sClass + '" style="enable-background:new 0 0 520 520;" xml:space="preserve">';
- s += '<g class="' + sType + '">';
- s += '<g class="inner">';
- s += '<path class="p1" d="M152,260C152,260,152,260,152,260c0-59.8,48.4-108.4,108.1-108.4c43.3,0,80.9,25.6,97.9,62.4V107.3c-28-18.3-61.9-28.9-98.1-28.9C159.8,78.4,78.6,159.9,78.6,260c0,59.5,28.4,112.4,73.4,145.6V260z"/>';
- s += '<path class="p2" d="M368,114.4V260c0,59.8-48.4,108.4-108.1,108.4c-43.3,0-80.9-25.6-97.9-62.4v106.7c28,18.3,61.9,28.9,98.1,28.9c100.1,0,181.3-81.4,181.3-181.6C441.4,200.5,413,147.6,368,114.4z"/>';
- s += '</g>';
- s += '<g class="outer">';
- s += '<path class="p1" d="M146.9,106.7c-8.1-15-36.9-29.9-68.9-27.3v124.2C90,164.3,114.6,130.5,146.9,106.7z"/>';
- s += '<path class="p2" d="M373.1,413.3c8.1,15,36.7,29.9,68.9,27.3V316.4C429.8,355.7,405.4,389.5,373.1,413.3z"/>';
- s += '</g>';
- s += '</g>';
- s += '</svg>';
- return s;
- }
- function bx_loading_animate (e, aOptions) {
- e = $(e);
- if (!e.length)
- return false;
- if (e.find('.bx-sys-spinner').length)
- return false;
- return new Spinner(aOptions).spin(e.get(0));
- }
- function bx_loading_btn (oElement, bEnable) {
- var oButton = $(oElement);
- var sClassHeight = oButton.hasClass('bx-btn-small') ? 'bx-btn-small-height' : 'bx-btn-height';
- if (oButton.children('div').size())
- oButton = oButton.children('div').first();
- if(!bEnable)
- oButton.find('.bx-loading-ajax-btn').remove();
- else if (!oButton.find('.bx-loading-ajax-btn').length)
- oButton.append('<b class="bx-loading-ajax-btn ' + sClassHeight + '">' + (bUseSvgLoading ? bx_loading_svg('colored', sClassHeight) : '') + '</b>');
- if(!bUseSvgLoading)
- bx_loading_animate(oButton.find('.bx-loading-ajax-btn'), aSpinnerSmallOpts);
- }
- function bx_loading_content (oElement, bEnable, isReplace) {
- var oBlock = $(oElement);
- var oLoading = $('<div class="bx-loading-ajax bx-def-z-index-front">' + (bUseSvgLoading ? bx_loading_svg('colored') : '') + '</div>');
-
- if(!bEnable)
- oBlock.find(".bx-loading-ajax").remove();
- else if(!oBlock.find('.bx-loading-ajax').length) {
- if('undefined' != typeof(isReplace) && isReplace)
- oBlock.html(oLoading.addClass('static'));
- else
- oBlock.append(oLoading);
- if(!bUseSvgLoading)
- bx_loading_animate(oBlock.find('.bx-loading-ajax'), aSpinnerOpts);
- }
- }
- function bx_loading (elem, b) {
- if (typeof elem == 'string')
- elem = '#' + elem;
- var block = $(elem);
- if (block.hasClass('bx-btn')) {
- bx_loading_btn (block, b);
- return;
- }
- if (1 == b || true == b) {
- bx_loading_content(block, b);
- e = block.find(".bx-loading-ajax");
- e.css('left', parseInt(block.width()/2.0 - e.width()/2.0));
- var he = e.outerHeight();
- var hc = block.outerHeight();
- if (block.css('position') != 'relative' && block.css('position') != 'absolute') {
- if (!block.data('css-save-position'))
- block.data('css-save-position', block.css('position'));
- block.css('position', 'relative');
- }
- if (hc > he) {
- e.css('top', parseInt(hc/2.0 - he/2.0));
- }
- if (hc < he) {
- if (!block.data('css-save-min-height'))
- block.data('css-save-min-height', block.css('min-height'));
- block.css('min-height', he);
- e.css('top', 0);
- }
- } else {
- if (block.data('css-save-position'))
- block.css('position', block.data('css-save-position'));
- if (block.data('css-save-min-height'))
- block.css('min-height', block.data('css-save-min-height'));
- bx_loading_content(block, b);
- }
- }
- /**
- * Center content with floating blocks.
- * sSel - jQuery selector of content to be centered
- * sBlockSel - jquery selector of blocks
- */
- function bx_center_content (sSel, sBlockStyle, bListenOnResize) {
- var sId;
- if ($(sSel).parent().hasClass('bx-center-content-wrapper')) {
- sId = $(sSel).parent().attr('id');
- } else {
- sId = 'id' + (new Date()).getTime();
- $(sSel).wrap('<div id="'+sId+'" class="bx-center-content-wrapper"></div>');
- }
- var eCenter = $('#' + sId);
- var iAll = $('#' + sId + ' ' + sBlockStyle).size();
- var iWidthUnit = $('#' + sId + ' ' + sBlockStyle + ':first').outerWidth(true);
- var iWidthContainer = eCenter.innerWidth();
- var iPerRow = parseInt(iWidthContainer/iWidthUnit);
- var iLeft = (iWidthContainer - (iAll > iPerRow ? iPerRow * iWidthUnit : iAll * iWidthUnit)) / 2;
- if (iWidthUnit > iWidthContainer)
- return;
- if ('undefined' != typeof(bListenOnResize) && bListenOnResize) {
- $(window).on('resize.bx-center-content', function () {
- bx_center_content(sSel, sBlockStyle);
- });
- }
- eCenter.css("padding-left", iLeft);
- }
- /**
- * Show pointer popup with menu from URL.
- * @param o - menu object name
- * @param e - element to show popup at
- * @param options - popup options
- * @param vars - additional GET variables
- */
- function bx_menu_popup (o, e, options, vars) {
- var options = options || {};
- var vars = vars || {};
- if ('undefined' == typeof(e))
- e = window;
- //--- Only a trigger that names no target of its own is this popup's disclosure. A trigger carrying
- //--- aria-controls belongs to whatever it names - a sidebar, the search box - and that owner keeps
- //--- its state; writing to it from here would leave it describing the wrong thing.
- var bExpanded = e !== window && $(e).length != 0 && $(e).is('[aria-expanded]') && !$(e).is('[aria-controls]');
- var fOnShow = options.onShow, fOnHide = options.onHide;
- // a string onShow is handed back to dolPopup, which evaluates it; a string onHide has never been
- // supported on this path, since dolPopupAjax replaces onHide before dolPopup sees it
- var aExpanded = {};
- if(typeof fOnShow != 'string')
- aExpanded.onShow = function(oPopup) {
- if(bExpanded)
- $(e).attr('aria-expanded', 'true');
- // remembered on the popup: the hide handler dolPopup keeps is the one from the first show, whichever trigger opened it since
- oPopup.data('bx-popup-trigger', bExpanded ? $(e) : null);
- if(typeof fOnShow == 'function')
- fOnShow(oPopup);
- };
- if(typeof fOnHide != 'string')
- aExpanded.onHide = function(oPopup) {
- var oTrigger = oPopup.data('bx-popup-trigger');
- if(oTrigger)
- oTrigger.attr('aria-expanded', 'false');
- if(typeof fOnHide == 'function')
- fOnHide(oPopup);
- };
- var o = $.extend({}, $.fn.dolPopupDefaultOptions, {
- id: o,
- url: bx_append_url_params('menu.php', $.extend({o:o}, vars)),
- cssClass: 'bx-popup-menu'
- }, options, aExpanded);
- $(e).dolPopupAjax(o);
- }
- /**
- * Show pointer popup with menu from existing HTML.
- * @param jSel - jQuery selector for html to show in popup
- * @param e - element to show popup at
- * @param options - popup options
- */
- function bx_menu_popup_inline (jSel, e, options) {
- if ($(jSel + ':visible').length)
- $(jSel).dolPopupHide();
- else {
- var options = options || {};
- var bElement = e != undefined && $(e).length != 0;
- var bExpanded = bElement && $(e).is('[aria-expanded]');
- var fOnShow = options.onShow, fOnHide = options.onHide;
- var o = $.extend({}, $.fn.dolPopupDefaultOptions, options, {
- pointer: bElement ? {el:$(e)} : false,
- cssClass: 'bx-popup-menu',
- onShow: function(oPopup) {
- if(bExpanded)
- $(e).attr('aria-expanded', 'true');
- // remembered on the popup: the hide handler dolPopup keeps is the one from the first show, whichever trigger opened it since
- oPopup.data('bx-popup-trigger', bExpanded ? $(e) : null);
- oPopup.find('a').each(function () {
- $(this).off('click.bx-popup-menu');
- $(this).on('click.bx-popup-menu', function() {
- $(jSel).dolPopupHide();
- });
- });
- // keyboard focus leaving the menu (Shift+Tab from its first item) closes it, as Escape and an outer click do
- oPopup.off('focusout.bx-popup-menu').on('focusout.bx-popup-menu', function(oEvent) {
- var oTarget = oEvent.relatedTarget;
- if(!oTarget || oPopup.get(0).contains(oTarget) || (bElement && $(e).get(0).contains && $(e).get(0).contains(oTarget)))
- return;
- $(jSel).dolPopupHide();
- });
- if(typeof fOnShow == 'function')
- fOnShow(oPopup);
- },
- onHide: function(oPopup) {
- oPopup.off('focusout.bx-popup-menu');
- var oTrigger = oPopup.data('bx-popup-trigger');
- if(oTrigger && oTrigger.length)
- oTrigger.attr('aria-expanded', 'false');
- if(typeof fOnHide == 'function')
- fOnHide(oPopup);
- },
- });
- $(jSel).dolPopup(o);
- }
- }
- /**
- * Show pointer popup with menu from URL.
- * @param sObject - menu object name
- * @param oElement - element to show popup at
- * @param oOptions - popup options
- * @param oVars - additional GET variables
- */
- function bx_menu_slide (sObject, oElement, sPosition, oOptions, oVars) {
- var oVars = oVars || {};
- var oOptions = oOptions || {};
- oOptions = $.extend({}, {parent: 'body', container: '.bx-sliding-menu-content'}, oOptions);
- var sId = '';
- var sIdSel = '';
- var sIdPfx = 'bx-sliding-menu-wrapper-';
- if(typeof(oOptions.id) != 'undefined')
- switch(typeof(oOptions.id)) {
- case 'string':
- sId = sIdPfx + oOptions.id;
- break;
- case 'object':
- sId = typeof(oOptions.id.force) != 'undefined' && oOptions.id.force ? oOptions.id.value : sIdPfx + oOptions.id.value;
- break;
- }
- else
- sId = sIdPfx + parseInt(2147483647 * Math.random());
- sIdSel = '#' + sId;
-
- //--- If slider exists
- if ($(sIdSel).length) {
- bx_menu_slide_inline (sIdSel, oElement, sPosition);
- return;
- }
- //--- If slider doesn't exists
- else {
- var oMenuLoading = $('#bx-sliding-menu-loading');
- if(!oMenuLoading || !oMenuLoading.length)
- return;
- $('<div id="' + sId + '" style="display:none;">' + oMenuLoading.html() + '</div>').addClass(oMenuLoading.attr('class')).appendTo(oOptions.parent);
- var oLoading = $(sIdSel + ' .bx-sliding-menu-loading');
- bx_loading_content(oLoading, true, true);
- bx_menu_slide_inline (sIdSel, oElement, sPosition);
-
- var fOnLoad = function() {
- bx_loading_content(oLoading, false);
- $(sIdSel).bxProcessHtml().show();
- };
- $(sIdSel).find(oOptions.container).load(bx_append_url_params('menu.php', $.extend({o:sObject}, oVars)), function () {
- var f = function () {
- if($(sIdSel).find('img').length > 0 && !$(sIdSel).find('img').get(0).complete)
- $(sIdSel).find('img').load(fOnLoad);
- else
- fOnLoad();
- };
- setTimeout(f, 100); // TODO: better way is to check if item is animating before positioning it in the code where popup is positioning
- });
- }
-
- }
- /**
- * Show sliding menu from existing HTML.
- * @param sMenu - jQuery object or selector for html to show in popup
- * @param e - element to click to open/close slider
- * @param sPosition - 'block' for sliding menu in blocks, 'site' - for sliding main menu
- */
- function bx_menu_slide_inline (sMenu, e, sPosition) {
- var options = options || {};
- var eSlider = $(sMenu);
- if ('undefined' !== typeof (bx_menu_slide_inline_custom)) {
- return bx_menu_slide_inline_custom(sMenu, e, sPosition);
- }
- if ('undefined' == typeof(e))
- e = eSlider.data('data-control-btn');
- var eIcon = $(e).find('.sys-icon-a');
- var fPositionElement = function (oElement) {
- eSlider.css({
- position: 'absolute',
- top: oElement.outerHeight(true),
- left: 0
- });
- };
- var fPositionBlock = function () {
- var eBlock = eSlider.parents('.bx-page-block-container');
- eSlider.css({
- position: 'absolute',
- top: eBlock.find('.bx-db-header').outerHeight(true),
- left: 0
- //width: eBlock.width() TODO: Commited to test. Remove if everything is OK.
- });
- };
- var fPositionSite = function () {
- var eToolbar = $('#bx-toolbar');
- eSlider.css({
- position: 'fixed',
- top: eToolbar.outerHeight(true) + (typeof iToolbarSubmenuTopOffset != 'undefined' ? parseInt(iToolbarSubmenuTopOffset) : 0),
- left: 0
- });
- };
- var fClose = function () {
- if (eIcon.length)
- (new Marka(eIcon[0])).set(eIcon.attr('data-icon-orig'));
- eSlider.slideUp()
- };
- var fOpen = function () {
- if (eIcon.length) {
- eIcon.attr('data-icon-orig', eIcon.attr('data-icon'));
- (new Marka(eIcon[0])).set('times');
- }
- if(typeof sPosition == 'object')
- fPositionElement(sPosition);
- else if(typeof sPosition == 'string' && sPosition == 'block')
- fPositionBlock();
- else
- fPositionSite();
- eSlider.slideDown();
- eSlider.data('data-control-btn', e);
- };
-
- if ('undefined' == typeof(sPosition))
- sPosition = 'block';
- if (eSlider.is(':visible')) {
- if(typeof(bx_sound) == 'function')
- bx_sound('close', {emphasis: 'subtle'});
- fClose();
- $(e).focus();
- $(document).off('click.bx-sliding-menu touchend.bx-sliding-menu');
- $(window).off('resize.bx-sliding-menu');
- }
- else {
- bx_menu_slide_close_all_opened();
- $(document).off('click.bx-sliding-menu touchend.bx-sliding-menu');
- $(window).off('resize.bx-sliding-menu');
- // Some templates (Artificer) draw a sidebar instead and keep this call on the trigger: no menu, no sound.
- if(eSlider.length && typeof(bx_sound) == 'function')
- bx_sound('open', {emphasis: 'subtle'});
- fOpen();
- eSlider.find('.bx-popup-content a:first').focus();
- eSlider.find('a').each(function () {
- $(this).off('click.bx-sliding-menu');
- $(this).on('click.bx-sliding-menu', function () {
- fClose();
- });
- });
- setTimeout(function () {
- var iWidthPrev = $(window).width();
- $(window).on('resize.bx-sliding-menu', function () {
- if ($(this).width() == iWidthPrev)
- return;
- iWidthPrev = $(this).width();
- bx_menu_slide_close_all_opened();
- });
-
- $(document).on('click.bx-sliding-menu touchend.bx-sliding-menu', function (event) {
- if ($(event.target).parents('.bx-sliding-menu, .bx-sliding-menu-main, .bx-popup-slide-wrapper, .bx-db-header').length || $(event.target).filter('.bx-sliding-menu-main, .bx-popup-slide-wrapper, .bx-db-header').length || e === event.target)
- event.stopPropagation();
- else
- bx_menu_slide_close_all_opened();
- });
- }, 10);
- }
- }
- /**
- * Close all opened sliding menus
- */
- function bx_menu_slide_close_all_opened () {
- $('.bx-sliding-menu:visible, .bx-sliding-menu-main:visible, .bx-popup-slide-wrapper:visible').each(function () {
- bx_menu_slide_inline('#' + this.id);
- });
- }
- /*
- * Note. oData.count_old and oData.count_new are also available and can be checked or used in notification popup.
- */
- function bx_menu_show_live_update(oData) {
- var sSelectorAddon = '.bx-menu-item-addon';
- // Something arrived (a notification, a message, a request): one ready, however many counters went up.
- if(parseInt(oData.count_new) > parseInt(oData.count_old))
- bx_sound('ready');
- //--- Update Child Menu Item
- if(oData.mi_child) {
- var oMenuItem = $('.bx-menu-object-' + oData.mi_child.menu_object + ' .bx-menu-item-' + oData.mi_child.menu_item);
- var oMenuItemAddon = oMenuItem.find(sSelectorAddon);
- if(oMenuItemAddon.length > 0)
- oMenuItemAddon.html(oData.count_new);
- else
- oMenuItem.append(oData.code.replace('{count}', oData.count_new));
- //+++ Check for 0 value
- oMenuItemAddon = oMenuItem.find(sSelectorAddon);
- if(parseInt(oData.count_new) > 0)
- oMenuItemAddon.show();
- else
- oMenuItemAddon.hide();
- }
- //--- Update Parent Menu Item
- if(oData.mi_parent) {
- var oMenuItem = $('.bx-menu-object-' + oData.mi_parent.menu_object + ' .bx-menu-item-' + oData.mi_parent.menu_item);
- var oMenuItemAddon = oMenuItem.find(sSelectorAddon);
- var sMediaType = bx_check_mq();
- if(sMediaType == 'mobile')
- sMediaType = 'phone';
- var iSum = 0;
- $('.bx-media-' + sMediaType + ' .bx-menu-object-' + oData.mi_child.menu_object + ' .bx-menu-item:not(.bx-def-media-' + sMediaType + '-hide) .bx-menu-item-addon').each(function() {
- iValue = parseInt($(this).html());
- if(iValue && iValue > 0)
- iSum += iValue;
- });
- if(oMenuItemAddon.length > 0)
- oMenuItemAddon.html(iSum);
- else
- oMenuItem.append(oData.code.replace('{count}', iSum));
- //+++ Check for 0 value
- oMenuItemAddon = oMenuItem.find(sSelectorAddon);
- if(iSum > 0)
- oMenuItemAddon.show();
- else
- oMenuItemAddon.hide();
- }
- }
- function bx_menu_show_more_less(oLink, sMenu, sSelectorParent) {
- if(!sSelectorParent)
- sSelectorParent = 'ul';
- var sClass = 'bx-mi-hidden';
- $(oLink).parents(sSelectorParent + ':first').find('.bx-mi-aux, .bx-psmi-show-more, .bx-psmi-show-less').toggleClass(sClass);
- $.get(sUrlRoot + 'menu.php', {
- o: sMenu,
- a: 'set_collapsed',
- v: $(oLink).parents(sSelectorParent + ':first').find('.bx-mi-aux').hasClass(sClass) ? 1 : 0
- });
- }
- function bx_menu_toggle_contents(oLink, sSelectorParent) {
- if(!sSelectorParent)
- sSelectorParent = '.bx-menu-contents';
- var sClass = 'bx-m-collapsed';
- var oParent = $(oLink).parents(sSelectorParent + ':first');
- oParent.toggleClass(sClass);
- oParent.siblings('.bx-menu-content').toggle();
- return false;
- }
- function bx_menu_toggle(oLink, sMenu, sMenuItem, sSelectorParent) {
- if(!sSelectorParent)
- sSelectorParent = 'li';
- var sClass = 'bx-mi-collapsed';
- var oParent = $(oLink).parents(sSelectorParent + ':first');
- oParent.toggleClass(sClass);
- $.get(sUrlRoot + 'menu.php', {
- o: sMenu,
- a: 'set_collapsed_submenu',
- i: sMenuItem,
- v: oParent.hasClass(sClass) ? 1 : 0
- });
-
- return false;
- }
- function bx_menu_followings_load_more(oLink, sMenu, sContextModule, iStart, iPerPage) {
- var oLoadingParent = $(oLink).length ? $(oLink).parents('.bx-menu-item:first') : $('body');
- bx_loading(oLoadingParent, true);
- $.get(sUrlRoot + 'menu.php', {
- o: sMenu,
- a: 'load_more',
- v: sContextModule,
- start: iStart,
- per_page: iPerPage
- }, function(oData) {
- bx_loading(oLoadingParent, false);
- if(oData && oData.content != undefined)
- $(oLink).parents('.bx-menu-subitem:first').replaceWith(oData.content);
- }, 'json');
- }
- /**
- * Set ACL level for specified profile
- * @param iProfileId - profile id to set acl level for
- * @param iAclLevel - acl level id to assign to a given rofile
- */
- function bx_set_acl_level (iProfileId, iAclLevel, mixedLoadingElement) {
- var bBulk = !$.isNumeric(iProfileId);
- var iAclCard = !bBulk && $('#sys-acl-profile-' + iProfileId).length > 0 ? 1 : 0;
- var bLoading = typeof(mixedLoadingElement) != 'undefined';
- if(bLoading)
- bx_loading($(mixedLoadingElement), true);
- $.post(sUrlRoot + 'menu.php', {o:'sys_set_acl_level', profile_id: iProfileId, level_id: iAclLevel, card:iAclCard}, function(oData) {
- bx_on_set_acl_level(oData, mixedLoadingElement);
- }, 'json');
- }
- /**
- * Reset ACL level for specified profile to Standard.
- * @param iProfileId - profile id to reset acl level for
- */
- function bx_reset_acl_level (iProfileId, mixedLoadingElement) {
- var bBulk = !$.isNumeric(iProfileId);
- var iAclCard = !bBulk && $('#sys-acl-profile-' + iProfileId).length > 0 ? 1 : 0;
- var fPerform = function() {
- var bLoading = typeof(mixedLoadingElement) != 'undefined';
- if(bLoading)
- bx_loading($(mixedLoadingElement), true);
- $.post(sUrlRoot + 'menu.php', {o:'sys_set_acl_level', profile_id: iProfileId, level_id: 3, card: iAclCard}, function(oData) {
- bx_on_set_acl_level(oData, mixedLoadingElement);
- }, 'json');
- };
- bx_confirm(_t('_Are_you_sure'), fPerform);
- }
- function bx_on_set_acl_level(oData, oLoadingElement) {
- if(typeof(oLoadingElement) != 'undefined')
- bx_loading($(oLoadingElement), false);
- if(oData.msg != undefined && oData.msg.length) {
- bx_alert(oData.msg);
- return;
- }
- if($(oLoadingElement).hasClass('bx-popup-applied'))
- $(oLoadingElement).dolPopupHide().remove();
- if(typeof(oData.card) == 'object')
- for(var iField in oData.card) {
- var oCard = $(oData.card[iField]);
- $('#' + oCard.attr('id')).replaceWith(oCard.bxTime());
- }
- }
- /**
- * Set badge for specified content
- * @param sModule - current module for content
- * @param iContentId - content id to set badge for
- * @param iBadgeId - badge id to assign to a given content
- */
- function bx_set_badge (sModule, iContentId, iBadgeId, mixedLoadingElement) {
-
- var bLoading = typeof(mixedLoadingElement) != 'undefined';
- if(bLoading)
- bx_loading($(mixedLoadingElement), true);
- $.post(sUrlRoot + 'menu.php', {o:'sys_set_badges', module: sModule, content_id: iContentId, badge_id: iBadgeId}, function(oData) {
- if(bLoading)
- bx_loading($(mixedLoadingElement), false);
- if(oData.msg != undefined && oData.msg.length) {
- bx_alert(oData.msg);
- return;
- }
- if($(mixedLoadingElement).hasClass('bx-popup-applied'))
- $(mixedLoadingElement).dolPopupHide().remove();
- if(typeof(oData.card) == 'object')
- for(var iField in oData.card) {
- var oCard = $(oData.card[iField]);
- $('#' + oCard.attr('id')).replaceWith(oCard);
- }
-
- $('.bx-base-bages-container').html(oData.html);
-
- }, 'json');
- }
- function bx_get_notes(oSource, sModule, iContentId, oOptions, oVars) {
- var oOptions = oOptions || {};
- var oVars = oVars || {};
- $.post(
- sUrlRoot + 'modules/?r=' + sModule + '/get_notes/',
- $.extend({content_id: iContentId}, oVars),
- function(oData) {
- if(oData && oData.popup != undefined) {
- if(typeof(oData.popup) == 'string')
- oData.popup = {html: oData.popup, options: {}};
- oData.popup.options = $.extend({}, $.fn.dolPopupDefaultOptions, oData.popup.options, {
- id: sModule + '_notes_' + iContentId,
- closeOnOuterClick: false,
- removeOnClose: true,
- onBeforeShow: function(oPopup) {
- $(oPopup).find('.bx-popup-element-close').removeClass('bx-def-media-desktop-hide bx-def-media-tablet-hide');
- }
- }, oOptions);
- }
-
- processJsonData(oData);
- },
- 'json'
- );
- }
- function bx_approve(oSource, sModule, iContentId, oOptions, oVars) {
- var oOptions = oOptions || {};
- var oVars = oVars || {};
- var fPopupInit = function(oData) {
- if(oData && oData.popup != undefined) {
- if(typeof(oData.popup) == 'string')
- oData.popup = {html: oData.popup, options: {}};
- oData.popup.options = $.extend({}, $.fn.dolPopupDefaultOptions, oData.popup.options, {
- id: sModule + '_approve_' + iContentId,
- closeOnOuterClick: false,
- removeOnClose: true,
- onBeforeShow: function(oPopup) {
- $(oPopup).find('.bx-popup-element-close').removeClass('bx-def-media-desktop-hide bx-def-media-tablet-hide');
- var oForm = $(oPopup).find('form');
- if(oForm.length > 0) {
- oForm.ajaxForm({
- dataType: 'json',
- beforeSubmit: function(aFormData, oForm, oOptions) {
- bx_loading(oForm, true);
- },
- success: function(oData) {
- $('.bx-popup-applied:visible').dolPopupHide();
- fPopupInit(oData);
- processJsonData(oData);
- }
- });
- }
- }
- }, oOptions);
- }
- };
- $.post(
- sUrlRoot + 'modules/?r=' + sModule + '/approve/',
- $.extend({content_id: iContentId}, oVars),
- function(oData) {
- fPopupInit(oData);
- processJsonData(oData);
- },
- 'json'
- );
- }
- function bx_showcase_init(sSelWrapper, sSelItem) {
- var oWrapper = $(sSelWrapper);
- if(oWrapper.closest('.bx-popup-wrapper').length != 0)
- return;
- oWrapper.each(function() {
- var sClassEnabled = 'bx-sc-enabled';
- var oShowcase = $(this);
- var oCells = oShowcase.find(sSelItem);
- if(oCells.width() * oCells.length <= oShowcase.parent().width()) {
- if(oShowcase.hasClass('flickity-enabled'))
- oShowcase.flickity('destroy').removeClass(sClassEnabled);
- return;
- }
- if(oShowcase.hasClass('flickity-enabled'))
- return;
- var oShowcaseOptions = {
- cellSelector: sSelItem,
- cellAlign: 'left',
- imagesLoaded: true,
- wrapAround: true,
- pageDots: false
- };
- var iGroupCells = oShowcase.attr('bx-sc-group-cells');
- if(iGroupCells != undefined)
- oShowcaseOptions.groupCells = parseInt(iGroupCells);
- oShowcase.on('ready.flickity', function() {
- $(this).addClass(sClassEnabled);
- }).flickity(oShowcaseOptions);
- });
- }
- function validateLoginForm(eForm) {
- return true;
- }
- /**
- * convert <time> tags to human readable format
- * @param sLang - use sLang localization
- * @param isAutoupdate - for internal usage only
- */
- function bx_time(sLang, isAutoupdate, sRootSel) {
- if ('undefined' == typeof(sRootSel))
- sRootSel = 'body';
- var iAutoupdate = 22*60*60; // autoupdate time in realtime if less than 22 hours
- var sSel = 'time';
- if (typeof(sLang) != 'undefined')
- glBxTimeLang = sLang;
- else if(typeof(glBxTimeLang) != 'undefined')
- sLang = glBxTimeLang;
- if(!sLang)
- return;
- if ('undefined' != typeof(isAutoupdate) && isAutoupdate)
- sSel += '.bx-time-autoupdate';
- $(sRootSel).find(sSel).each(function () {
- var s;
- var sTime = $(this).attr('datetime');
- var iSecondsDiff = moment(sTime).unix() - moment().unix();
- if (iSecondsDiff < 0)
- iSecondsDiff = -iSecondsDiff;
- if (iSecondsDiff < $(this).attr('data-bx-autoformat'))
- s = moment(sTime).locale(sLang).fromNow(); // 'time ago' format
- else if (1 == $(this).attr('data-bx-utc'))
- s = moment.utc(sTime).locale(sLang).format($(this).attr('data-bx-format'));
- else
- s = moment(sTime).locale(sLang).format($(this).attr('data-bx-format'));
- if (iSecondsDiff < iAutoupdate)
- $(this).addClass('bx-time-autoupdate');
- else
- $(this).removeClass('bx-time-autoupdate');
- $(this).html(s);
- });
- if ($('time.bx-time-autoupdate').size()) {
- setTimeout(function () {
- bx_time(sLang, true);
- }, 20000);
- }
- }
- (function($) {
- $.fn.bxTime = function() {
- bx_time(undefined, undefined, this);
- return this;
- };
- /**
- * process HTML which was added dynamicly on the page
- */
- $.fn.bxProcessHtml = function (oCallback) {
- var eElement = $(this);
- if ('undefined' !== typeof(eElement)) {
- // process js time
- eElement.bxTime();
- bx_process_links();
-
- // process web forms
- if ($.isFunction($.fn.addWebForms))
- eElement.addWebForms();
-
- // process animating icons
- bx_activate_anim_icons();
- // process syntax hightlighing
- if ('undefined' !== typeof(Prism) && eElement[0] && eElement[0].querySelectorAll)
- Prism.highlightAllUnder(eElement[0]);
- // process links
- bx_redirect_for_external_links(eElement);
- // flickity update
- setTimeout(function () {
- const oFlickity = eElement.find('.flickity-enabled');
- if (oFlickity.length)
- oFlickity.flickity('resize');
- }, 250);
- }
- if ('undefined' !== typeof(oCallback)) {
- oCallback(eElement);
- }
- if (typeof glOnProcessHtml !== 'undefined' && glOnProcessHtml instanceof Array) {
- for (var i = 0; i < glOnProcessHtml.length; i++)
- if (typeof glOnProcessHtml[i] === "function")
- glOnProcessHtml[i](this);
- }
-
- return this;
- };
- $.fn.bxCheckOverflowHeight = function(sClass, onFind) {
- if(!sClass)
- sClass = 'bx-overflow';
- return this.each(function() {
- var oElement = $(this);
- if(oElement.hasClass(sClass) || oElement.css('overflow') != 'hidden')
- return;
- if(oElement.find('img').length > 0) {
- var oImg = oElement.find('img:first').get(0);
- const oImgCopy = new Image();
- oImgCopy.src = oImg.src;
- oImgCopy.onload = function() {
- var iHeightParent = oElement.height();
- var iHeightImg = oImg.clientHeight;
- var iOffsetTopImg = oImg.offsetTop;
- if(iOffsetTopImg < iHeightParent && iOffsetTopImg + iHeightImg > iHeightParent)
- oElement.css('max-height', (iOffsetTopImg + iHeightImg + 50) + 'px');
- if(oElement.prop('scrollHeight') <= Math.ceil(oElement.height()))
- return;
- oElement.addClass(sClass);
- if(typeof onFind === 'function')
- onFind(oElement);
- }
- }
- else {
- if(oElement.prop('scrollHeight') <= Math.ceil(oElement.height()))
- return;
- oElement.addClass(sClass);
- if(typeof onFind === 'function')
- onFind(oElement);
- }
- });
- };
- $.fn.bxConvertEmbeds = function() {
- return this.each(function() {
- $(this).find(".bx-embed-link").each(function() {
- var oItem = $(this);
- oItem.html(oItem.attr('source'));
- $.getJSON(sUrlRoot + '/embed.php?', {a: 'get_link', l: oItem.attr('source')}, function(oData) {
- oItem.html(oData.code)
- if(oItem.find('a').length > 0)
- bx_embed_link(oItem.find('a')[0]);
- });
- });
- });
- };
- } (jQuery));
- /**
- * Perform connections AJAX request.
- * In case of error - it shows js alert with error message.
- * In case of success - the page is reloaded.
- *
- * @param sObj - connections object
- * @param sAction - 'add', 'remove' or 'reject'
- * @param iContentId - content id, initiator is always current logged in user
- * @param bConfirm - show confirmation dialog
- */
- function bx_conn_action(e, sObj, sAction, iContentId, bConfirm, fOnComplete) {
- var fPerform = function() {
- var aParams = {
- obj: sObj,
- act: sAction,
- id: iContentId
- };
- var fCallback = function (data) {
- bx_loading_btn(e, 0);
- if ('object' != typeof(data))
- return;
- if (data.err) {
- bx_alert(data.msg);
- } else {
- if ('function' == typeof(fOnComplete))
- fOnComplete(data, e);
- else if (!loadDynamicBlockAuto(e))
- location.reload();
- else
- $('#bx-popup-ajax-wrapper-bx_persons_view_actions_more').remove();
- }
- };
-
- bx_loading_btn(e, 1);
-
- $.ajax({
- dataType: 'json',
- url: sUrlRoot + 'conn.php',
- data: aParams,
- type: 'POST',
- success: fCallback
- });
- };
- if (typeof(bConfirm) != 'undefined' && bConfirm)
- bx_confirm(_t('_Are_you_sure'), fPerform);
- else
- fPerform();
- }
- /**
- * Perform recommendations AJAX request.
- * In case of error - it shows js alert with error message.
- * In case of success - the page is reloaded.
- *
- * @param sObj - recommendation object
- * @param sAction - 'ignore'
- * @param iContentId - content id, initiator is always current logged in user
- * @param bConfirm - show confirmation dialog
- */
- function bx_recommendation_action(e, sObj, sAction, iContentId, bConfirm, fOnComplete) {
- var fPerform = function() {
- var aParams = {
- obj: sObj,
- act: sAction,
- id: iContentId
- };
- var fCallback = function (data) {
- bx_loading_btn(e, 0);
- if ('object' != typeof(data))
- return;
- if (data.msg)
- bx_alert(data.msg);
- else {
- if ('function' == typeof(fOnComplete))
- fOnComplete(data, e);
- else if (!loadDynamicBlockAuto(e))
- location.reload();
- }
- };
- bx_loading_btn(e, 1);
- $.ajax({
- dataType: 'json',
- url: sUrlRoot + 'recommendation.php',
- data: aParams,
- type: 'POST',
- success: fCallback
- });
- };
- if (typeof(bConfirm) != 'undefined' && bConfirm)
- bx_confirm(_t('_Are_you_sure'), fPerform);
- else
- fPerform();
- }
- function bx_append_url_params (sUrl, mixedParams) {
- var sParams = sUrl.indexOf('?') == -1 ? '?' : '&';
- var sHash = '';
- if(sUrl.indexOf('#') != -1) {
- var oUrl = new URL(sUrl);
- if(oUrl.hash.length > 0) {
- sHash = oUrl.hash;
- sUrl = sUrl.replace(sHash, '');
- }
- else
- sUrl = sUrl.replace('#', '');
- }
- if(mixedParams instanceof Array) {
- for(var i in mixedParams)
- sParams += i + '=' + mixedParams[i] + '&';
- sParams = sParams.substr(0, sParams.length-1);
- }
- else if(mixedParams instanceof Object) {
- $.each(mixedParams, function(sKey, sValue) {
- sParams += sKey + '=' + sValue + '&';
- });
- sParams = sParams.substr(0, sParams.length-1);
- }
- else
- sParams += mixedParams;
- return sUrl + sParams + sHash;
- }
- function bx_search_extnded_sort(obj, url){
- location.href = url + '&sort=' +$(obj).val();
- }
- function bx_search_on_type (e, n, sFormSel, sResultsContSel, sLoadingContSel, bSortResults, iMinLen, onComplete, onCancel) {
- var oForm = $(e.target).parents(sFormSel + ':first');
- if ('undefined' != typeof(e)) {
- if(e.keyCode == 13) {
- oForm.find('input[name=live_search]').val(0);
- oForm.submit();
- return false;
- }
- if(e.keyCode == 27) {
- if(typeof onCancel === 'function')
- onCancel(oForm);
- }
- }
- iMinLen = typeof(iMinLen) != 'undefined' ? parseInt(iMinLen) : 0;
- if(iMinLen > 0 && iMinLen > (oForm.find('input[name=keyword]').val().length + 1))
- return true;
- if ('undefined' != typeof(glBxSearchTimeoutHandler) && glBxSearchTimeoutHandler)
- clearTimeout(glBxSearchTimeoutHandler);
- glBxSearchTimeoutHandler = setTimeout(function () {
- bx_search (n, sFormSel, sResultsContSel, sLoadingContSel, bSortResults, onComplete);
- }, 500);
- return true;
- }
- function bx_search (n, sFormSel, sResultsContSel, sLoadingContSel, bSortResults, onComplete) {
- if ('undefined' == typeof(sLoadingContSel))
- sLoadingContSel = sResultsContSel;
- if ('undefined' == typeof(bSortResults))
- bSortResults = false;
- var sQuery = $('input', sFormSel).serialize();
- bx_loading($(sLoadingContSel), true);
- $.post(sUrlRoot + 'searchKeywordContent.php', sQuery, function(data) {
- bx_loading($(sLoadingContSel), false);
- if(!data)
- return;
- if (bSortResults) {
- var sAsk = $(data).filter(".bx-btn.sys-agents-ask");
- var aSortedUnits = $(data).find(".bx-def-unit-live-search").toArray().sort(function (a, b) {
- return b.getAttribute('data-ts') - a.getAttribute('data-ts');
- });
- data = '';
- if(sAsk.length)
- data += sAsk.get(0).outerHTML;
- $.each(aSortedUnits.slice(0, n), function (i, e) {
- data += e.outerHTML;
- });
-
-
- }
- var oContainer = $(sResultsContSel);
- oContainer.html(data).bxProcessHtml();
- if(typeof onComplete === 'function')
- onComplete(oContainer, data);
- });
- return false;
- }
- function on_filter_apply(e, sInputId, sFilterName)
- {
- var oRegExp = new RegExp("[&]{0,1}" + sFilterName + "=.*");
- var s = ('' + document.location).replace(oRegExp, ''); // remove filter
- s = s.replace(/page=\d+/, 'page=1'); // goto 1st page
- if (e.checked && $('#' + sInputId).val().length > 2)
- s += (-1 == s.indexOf('?') ? '?' : '&') + sFilterName + '=' + $('#' + sInputId).val(); // append filter
- document.location = s;
- }
- function on_filter_key_up (e, sCheckboxId)
- {
- if (13 == e.keyCode) {
- $('#' + sCheckboxId).click();
- return false;
- }
- else {
- $('#' + sCheckboxId).removeAttr('checked');
- return true;
- }
- }
- function on_copyright_click()
- {
- oDate = new Date();
- $(document).dolPopupAlert({
- message: _t('_copyright', oDate.getFullYear())
- });
- }
- function bx_activate_anim_icons(sColor)
- {
- if(typeof(sColor) != 'undefined')
- glBxAnimIconColor = sColor;
- else if(typeof(glBxAnimIconColor) != 'undefined')
- sColor = glBxAnimIconColor;
- if(!sColor)
- return;
- $('.sys-icon-a').not('.marka').each(function () {
- var e = $(this);
- var m = new Marka(e.get(0)), r = e.attr('data-rotate'), c = e.attr('data-color');
- m.set(e.attr('data-icon')).rotate(r ? r : 'down').color(c ? c : sColor);
- });
- }
- function bx_get_param(s) {
- if (!window.aDolOptions || !aDolOptions[s])
- return false;
- return aDolOptions[s];
- }
- function bx_autocomplete_fields(iId, sUrl, sName, bShowImg, bOnlyOnce, onSelect){
- if (!$('#' + iId).hasClass('bx-form-input-autotoken'))
- $('#' + iId).addClass('bx-form-input-autotoken');
-
- $('#' + iId + ' input[type=text]').autocomplete({
- source: sUrl,
- focus: function(e, ui ) {
- $(this).val(ui.item.label);
- e.preventDefault();
- },
- select: function(e, ui) {
- $(this).val(ui.item.label);
- $(this).trigger('superselect', ui.item);
-
- if (typeof onSelect === 'function')
- onSelect(ui);
-
- e.preventDefault();
- }
- });
- if ($('#' + iId + ' .val').length > 0 && bOnlyOnce)
- $('#' + iId + ' input[type=text]').hide();
- $('#' + iId + ' input[type=text]').on('superselect', function(e, item) {
- $(this).hide();
- if ('undefined' != typeof(item)) {
- var sImage = '';
- if(bShowImg && item.unit != undefined)
- sImage = item.unit;
- else if(bShowImg && item.thumb != undefined)
- sImage = '<img class="bx-def-thumb bx-def-icon-size bx-def-margin-sec-right" src="' + item.thumb + '">';
- $(this).before('<b class="val bx-def-color-bg-hl bx-def-round-corners">' + sImage + item.label + '<i class="sys-icon times ltr:ml-1 rtl:mr-1"></i><input type="hidden" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" name="' + sName + (bOnlyOnce ? '' : '[]') + '" value="' + item.value + '" /></b>');
- }
- if (!bOnlyOnce)
- {
- fAutoShrinkInput();
- $(this).show();
- this.value = '';
- }
- }).on('keydown', function(e) {
- // if: comma,enter (delimit more keyCodes with | pipe)
- if (/(13)/.test(e.which))
- e.preventDefault();
- });
- $('#' + iId).on('click', 'b', function() {
- $(this).remove();
-
- if (bOnlyOnce)
- $('#' + iId + ' input[type=text]').val('').show();
- else
- fAutoShrinkInput();
- });
- fAutoShrinkInput = function () {
- var iWidthCont = $('#' + iId + '.bx-form-input-autotoken').innerWidth();
- var iWidthExisting = 0;
- $('#' + iId + '.bx-form-input-autotoken b').each(function () {
- iWidthExisting += $(this).outerWidth(true);
- });
- $('#' + iId + '.bx-form-input-autotoken input').innerWidth(parseInt(iWidthCont - iWidthExisting > 180 ? iWidthCont - iWidthExisting : 180) - 5);
- };
- if (!bOnlyOnce)
- fAutoShrinkInput();
- else
- $('#' + iId + '.bx-form-input-autotoken input').outerWidth('100%');
- };
- function bx_alert(sMessage, fOnClickOk, oParams)
- {
- $(document).dolPopupAlert({
- message: sMessage,
- onClickOk: fOnClickOk,
- params: oParams
- });
- }
- function bx_confirm(sMessage, fOnClickYes, fOnClickNo, oParams)
- {
- $(document).dolPopupConfirm({
- message: sMessage,
- onClickYes: fOnClickYes,
- onClickNo: fOnClickNo,
- params: oParams
- });
- }
- function bx_prompt(sMessage, sValue, fOnClickOk, fOnClickCancel, oParams)
- {
- $(document).dolPopupPrompt({
- message: sMessage,
- value: sValue,
- onClickOk: fOnClickOk,
- onClickCancel: fOnClickCancel,
- params: oParams
- });
- }
- function bx_toast(sMessage, oParams)
- {
- var oDate = new Date();
- var sId = 'bx-popup-toast';
- var sIdClone = sId + '-' + oDate.getTime();
- var oHolder = $('#' + sId + '-holder');
- var oAlert = oHolder.find('#' + sId).clone();
- oAlert.attr('id', sIdClone).find('.bx-pt-text').html(sMessage);
- oHolder.append(oAlert.bx_anim('show', 'fade', 'slow', function() {
- if(oParams && typeof(oParams.onShow) == 'function')
- oParams.onShow();
- }));
- setTimeout(function() {
- $('#' + sIdClone).bx_anim('hide', 'fade', 'slow', function() {
- $(this).remove();
- if(oParams && typeof(oParams.onHide) == 'function')
- oParams.onHide();
- })
- }, 1000 * (oParams && oParams.autoHide !== undefined ? parseInt(oParams.autoHide) : 3));
- };
- function bx_is_color_scheme_dark()
- {
- return localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches);
- }
- function bx_get_color_scheme()
- {
- return 'theme' in localStorage ? localStorage.theme : 'auto';
- }
- function bx_set_color_scheme(iCode)
- {
- switch(iCode) {
- case 0:
- localStorage.removeItem('theme');
- break;
- case 1:
- localStorage.theme = 'sun'
- break;
- case 2:
- localStorage.theme = 'dark'
- break;
- }
- //--- Change scheme.
- bx_set_color_scheme_html();
- //--- Notify global handlers.
- if(typeof glOnColorSchemeChange === 'undefined' || !(glOnColorSchemeChange instanceof Array))
- return;
- if(typeof iCode === 'undefined' || !iCode)
- iCode = bx_is_color_scheme_dark() ? 2 : 1;
- for(var i = 0; i < glOnColorSchemeChange.length; i++)
- if(typeof glOnColorSchemeChange[i] === 'function')
- glOnColorSchemeChange[i](iCode);
- }
- function bx_set_color_scheme_html()
- {
- if(bx_is_color_scheme_dark())
- $('html').addClass('dark')
- else
- $('html').removeClass('dark')
- }
- /*
- * Interface sounds are Cuelume's cues (plugins_public/cuelume, MIT): one cue per
- * interface job, picked by the "Which cue?" table at https://cuelume.dev/agents.md.
- * Controls carry data-cuelume-* attributes, which Cuelume's bind() plays as they
- * are pressed; outcomes call bx_sound(). Nothing plays on hover, on page load, or
- * per item of a burst.
- *
- * Settings > Global > Sounds (BxDolSounds, passed to bx_sound_init) picks where
- * sounds play, the sound set, the volume, a set or silence for each kind of action,
- * and the level people start at. Each visitor picks their own level for this
- * browser: full, quiet or off (bx_sound_set_level). The module loads only once a
- * sound can play.
- */
- var glBxSounds = {url: '', config: null, module: null, cuelume: null, readyAt: 0, restore: null};
- /**
- * The kind of action each cue belongs to (its set or silence in the settings). Likes, reactions, ratings, favorites
- * and follows say so themselves: group 'reactions' in bx_sound(), or data-bx-sound-group on a control.
- */
- var aBxSoundGroups = {tap: 'buttons', select: 'choices', toggle: 'choices', open: 'menus', close: 'menus', navigate: 'navigation', loading: 'navigation', success: 'results', warning: 'results', error: 'results', ready: 'notifications', attention: 'notifications'};
- /**
- * The attributes bind() plays, and the cue each one plays when it doesn't name another.
- */
- var aBxSoundAttributes = {'data-cuelume-tap': 'tap', 'data-cuelume-select': 'select', 'data-cuelume-toggle': 'toggle', 'data-cuelume-open': 'open', 'data-cuelume-close': 'close', 'data-cuelume-navigate': 'navigate'};
- /**
- * The cue Settings > Sounds plays for each kind of action as it is changed.
- */
- var aBxSoundSamples = {buttons: 'tap', choices: 'toggle', reactions: 'toggle', menus: 'open', navigation: 'navigate', results: 'success', notifications: 'ready'};
- /**
- * Quiet plays at this share of the volume.
- */
- var BX_SOUND_QUIET = 0.4;
- function bx_sound_init(sUrl, oConfig)
- {
- glBxSounds.url = sUrl;
- glBxSounds.config = oConfig;
- // A module that fails to load leaves the page silent; nothing else depends on it.
- if(bx_sound_is_on())
- bx_sound_load().catch(function() {});
- $(document).ready(function() {
- bx_sound_mark_switches();
- });
- }
- function bx_sound_load()
- {
- if(!glBxSounds.url)
- return Promise.reject(new Error('Interface sounds are not set up on this page.'));
- if(!glBxSounds.module)
- glBxSounds.module = import(glBxSounds.url).then(function(oCuelume) {
- glBxSounds.cuelume = oCuelume;
- bx_sound_apply();
- // Ahead of bind(), which listens on document: the kind of action decides how this one press sounds.
- ['pointerdown', 'click', 'keydown', 'keyup', 'change'].forEach(function(sEvent) {
- window.addEventListener(sEvent, bx_sound_gate, true);
- });
- oCuelume.bind();
- return oCuelume;
- });
- return glBxSounds.module;
- }
- /**
- * The visitor's level: their own pick in this browser, or where the settings start everyone; off where sounds are off.
- */
- function bx_sound_level()
- {
- var oConfig = glBxSounds.config;
- if(!oConfig || !oConfig.on)
- return 'off';
- try {
- var sLevel = localStorage.getItem('bx-sounds');
- if(sLevel == 'full' || sLevel == 'quiet' || sLevel == 'off')
- return sLevel;
- }
- catch(e) {}
- return oConfig.level;
- }
- function bx_sound_is_on()
- {
- return bx_sound_level() != 'off';
- }
- function bx_sound_volume()
- {
- return glBxSounds.config.volume * (bx_sound_level() == 'quiet' ? BX_SOUND_QUIET : 1);
- }
- /**
- * The set a kind of action plays: its own, the main one, or 'off'.
- */
- function bx_sound_set(sGroup)
- {
- var oGroups = glBxSounds.config.groups || {};
- return sGroup && oGroups[sGroup] ? oGroups[sGroup] : glBxSounds.config.set;
- }
- /**
- * Cuelume's settings for this page. A press that needs other ones changes them for itself (bx_sound_gate).
- */
- function bx_sound_apply()
- {
- glBxSounds.restore = null;
- if(!glBxSounds.cuelume)
- return;
- glBxSounds.cuelume.setTheme(glBxSounds.config.set);
- glBxSounds.cuelume.setVolume(bx_sound_volume());
- }
- /**
- * Runs before bind() for each event that can press a marked control: a kind of action with a set of its own plays in
- * it, and one that is off, or a visitor who turned sounds off, plays nothing. Cuelume reads the set and volume as it
- * plays, so they are back to the page's own on the next tick.
- */
- function bx_sound_gate(oEvent)
- {
- if(!glBxSounds.cuelume || !(oEvent.target instanceof Element))
- return;
- var oControl = oEvent.target.closest(Object.keys(aBxSoundAttributes).map(function(sAttribute) {
- return '[' + sAttribute + ']';
- }).join(','));
- if(!oControl)
- return;
- var sSet = bx_sound_is_on() ? bx_sound_set(bx_sound_group(oControl)) : 'off';
- if(sSet == glBxSounds.config.set)
- return;
- if(sSet == 'off')
- glBxSounds.cuelume.setVolume(0);
- else
- glBxSounds.cuelume.setTheme(sSet);
- if(!glBxSounds.restore)
- glBxSounds.restore = setTimeout(bx_sound_apply, 0);
- }
- /**
- * The kind of action of a marked control: data-bx-sound-group on it or around it, otherwise the one of its cue.
- */
- function bx_sound_group(oControl)
- {
- var oGroup = oControl.closest('[data-bx-sound-group]');
- if(oGroup)
- return oGroup.getAttribute('data-bx-sound-group');
- for(var sAttribute in aBxSoundAttributes) {
- if(!oControl.hasAttribute(sAttribute))
- continue;
- var sCue = oControl.getAttribute(sAttribute);
- return aBxSoundGroups[aBxSoundGroups[sCue] ? sCue : aBxSoundAttributes[sAttribute]];
- }
- return '';
- }
- /**
- * Play the cue for an outcome, e.g. bx_sound('success', {emphasis: 'subtle'}) once a form is saved. `group` names
- * the kind of action when the cue alone doesn't ('reactions' for a like). Arrivals ('ready') that come together,
- * like several live updates in one poll, play once.
- */
- function bx_sound(sCue, oOptions)
- {
- if(!bx_sound_is_on())
- return;
- var sSet = bx_sound_set(oOptions && oOptions.group ? oOptions.group : aBxSoundGroups[sCue]);
- if(sSet == 'off')
- return;
- if(sCue == 'ready') {
- var iNow = Date.now();
- if(iNow - glBxSounds.readyAt < 2000)
- return;
- glBxSounds.readyAt = iNow;
- }
- bx_sound_load().then(function(oCuelume) {
- oCuelume.play(sCue, $.extend({}, oOptions, {theme: sSet}));
- }, function() {});
- }
- /**
- * The reply to an AJAX form: error when UNA refuses it (a non-zero code, or the form or a popup back with a field
- * error), a subtle success when it says the form went through (code 0, a redirect, a reload or a script to run).
- * A reply that names its own sound (`cue`) gets only that one, from processJsonData; a reply that only carries a
- * message plays nothing, since a message alone can say either.
- */
- function bx_sound_form_reply(oData)
- {
- if(!oData || oData.cue != undefined)
- return;
- var mixedPopup = oData.popup && typeof(oData.popup) == 'object' ? oData.popup.html : oData.popup;
- if((oData.code != undefined && Number.parseInt(oData.code) != 0) || bx_sound_has_field_error(oData.form) || bx_sound_has_field_error(mixedPopup))
- bx_sound('error');
- else if(oData.code != undefined || oData.redirect != undefined || oData.reload != undefined || oData.eval != undefined)
- bx_sound('success', {emphasis: 'subtle'});
- }
- /**
- * Whether a form's HTML came back with a field error in it.
- */
- function bx_sound_has_field_error(sHtml)
- {
- return typeof(sHtml) == 'string' && $('<div>' + sHtml + '</div>').find('.bx-form-warn').toArray().some(function(oWarn) {
- return oWarn.textContent.trim().length > 0;
- });
- }
- /**
- * The visitor's level of interface sounds in this browser: 'full', 'quiet' or 'off'. A new level that can be heard
- * answers from the same click, which also lets the browser start audio; off is heard as silence.
- */
- function bx_sound_set_level(sLevel)
- {
- if(!glBxSounds.config || !glBxSounds.config.on)
- return;
- var aLevels = ['off', 'quiet', 'full'];
- var iFrom = aLevels.indexOf(bx_sound_level());
- try {
- localStorage.setItem('bx-sounds', sLevel);
- }
- catch(e) {}
- bx_sound_mark_switches();
- if(sLevel == 'off') {
- // Whatever still rings stops at once; the module stays ready for the next level.
- if(glBxSounds.cuelume) {
- glBxSounds.cuelume.setEnabled(false);
- glBxSounds.cuelume.setEnabled(true);
- }
- return;
- }
- bx_sound_load().then(function() {
- bx_sound_apply();
- bx_sound('toggle', {direction: aLevels.indexOf(sLevel) > iFrom ? 'forward' : 'back'});
- }, function() {});
- }
- /**
- * The account menu's Sounds item steps through the levels: full, quiet, off.
- */
- function bx_sound_toggle(oSwitch)
- {
- bx_sound_set_level({full: 'quiet', quiet: 'off', off: 'full'}[bx_sound_level()]);
- }
- /**
- * Show the visitor's level on every Sounds control: the account menu item's name and icon (volume-up, volume-down,
- * volume-mute; the Lucide iconset redraws it from a new <i>), and the checked option of Studio's radio group. Where
- * sounds are off for everyone, the item goes away.
- */
- function bx_sound_mark_switches()
- {
- var oConfig = glBxSounds.config;
- var sLevel = bx_sound_level();
- var sIcon = {full: 'volume-up', quiet: 'volume-down', off: 'volume-mute'}[sLevel];
- var bRedraw = false;
- $('[data-bx-sounds-switch]').each(function() {
- if(!oConfig || !oConfig.on) {
- $(this).closest('li').hide();
- return;
- }
- $(this).attr({'aria-label': oConfig.labels[sLevel], title: oConfig.labels[sLevel]});
- $(this).find('.sys-icon.volume-up, .sys-icon.volume-down, .sys-icon.volume-mute').each(function() {
- if($(this).hasClass(sIcon))
- return;
- if(this.tagName.toLowerCase() == 'i')
- $(this).removeClass('volume-up volume-down volume-mute').addClass(sIcon);
- else {
- $(this).replaceWith($('<i>').addClass('sys-icon ' + sIcon));
- bRedraw = true;
- }
- });
- });
- $('[data-bx-sounds-level]').each(function() {
- var bChecked = $(this).attr('data-bx-sounds-level') == sLevel;
- $(this).attr('aria-checked', bChecked ? 'true' : 'false').attr('tabindex', bChecked ? '0' : '-1');
- });
- if(bRedraw && typeof(bx_iconset_init_lucide) == 'function')
- bx_iconset_init_lucide();
- }
- /**
- * Settings > Sounds: a choice plays as it is made, with the set and volume picked in the form, before it is saved and
- * even while sounds are off here.
- */
- function bx_sound_preview(oSelect)
- {
- var oForm = $(oSelect).closest('form');
- var fValue = function(sName) {
- return oForm.find('[name="sys_sounds_' + sName + '"]').val();
- };
- var sOption = $(oSelect).attr('data-bx-sound-option');
- var sValue = $(oSelect).val();
- var sSet = fValue('set') || 'default';
- var fVolume = (parseInt(fValue('volume')) || 100) / 100;
- var sCue = 'toggle';
- if(sOption == 'level') {
- if(sValue == 'off')
- return;
- if(sValue == 'quiet')
- fVolume *= BX_SOUND_QUIET;
- }
- else if(aBxSoundSamples[sOption]) {
- if(sValue == 'off')
- return;
- if(sValue)
- sSet = sValue;
- sCue = aBxSoundSamples[sOption];
- }
- bx_sound_load().then(function(oCuelume) {
- // play() takes the volume now; the page's own is back at once.
- oCuelume.setVolume(fVolume);
- oCuelume.play(sCue, {theme: sSet});
- bx_sound_apply();
- }, function() {});
- }
- $(document).ready(function() {
- // A cached menu can still carry the Sounds item where sounds are off for everyone.
- if(!glBxSounds.config)
- $('[data-bx-sounds-switch]').closest('li').hide();
- });
- function bx_is_mouse()
- {
- return matchMedia('(pointer:fine)').matches;
- }
- function bx_is_touch_device()
- {
- return (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0));
- }
- /**
- * Check if mobile or desktop device.
- */
- function bx_check_mq()
- {
- if (typeof glOnCheckMq === 'function') {
- return glOnCheckMq();
- }
- return window.getComputedStyle(document.querySelector('body'), '::before').getPropertyValue('content').replace(/'/g, "").replace(/"/g, "");
- }
- /**
- * This function loads the passed list of CSS files. In case when this function is called for dynamic loading
- * of the same file but many times it allows to avoid multiply loadings of the same file.
- */
- function bx_get_style(mixedUrl)
- {
- if(typeof(mixedUrl) === 'string')
- mixedUrl = new Array(mixedUrl);
- for(let i = 0; i < mixedUrl.length; i++) {
- if(mixedUrl[i] === undefined || !mixedUrl[i].length || $("link[href = '" + mixedUrl[i] + "']").length > 0)
- continue;
- $("head").append($("<link rel='stylesheet' href='" + mixedUrl[i] + "' type='text/css' />"));
- }
- }
- /**
- * This function loads the passed list of js files and executes callback function when the all files are loaded.
- * In case when this function is called for dynamic loading of the same file but many times (like Plyr video init)
- * it allows to avoid multiply loadings of the same file.
- */
- function bx_get_scripts (aFiles, fCallback)
- {
- let iCounter = 0;
- const
- iLength = aFiles.length,
- fHandler = function() {
- if (iCounter++ >= (iLength-1) && typeof(fCallback) === 'function')
- fCallback();
- else
- fExecute(aFiles[iCounter]);
- },
- // Check if js file is not loaded yet then start to load it and returns Promise.
- // All functions which try to load the same file will wait for loading of the file
- // and then continue to work
- fExecute = function(sFile) {
- if ('undefined' === typeof(glBxLoadedScripts[sFile]))
- glBxLoadedScripts[sFile] = { complete : $.bxGetCachedScript(sFile).done(fHandler) };
- else
- glBxLoadedScripts[sFile].complete.then(fHandler);
- };
- if ('undefined' === typeof(glBxLoadedScripts))
- glBxLoadedScripts = {};
- fExecute(aFiles[iCounter]);
- }
- jQuery.bxGetCachedScript = function(sUrl, oOptions)
- {
- oOptions = $.extend(oOptions || {}, {
- dataType: "script",
- cache: true,
- url: sUrl
- });
- return jQuery.ajax(oOptions);
- };
- function bx_is_selector_in_stylesheet(sSel)
- {
- var a = [];
- var aSs = document.styleSheets;
- for (var sSheet = 0; sSheet < aSs.length; sSheet++) {
- var ruleList = document.styleSheets[sSheet].cssRules;
- for (var rule = 0; rule < ruleList.length; rule++)
- a.push(ruleList[rule].selectorText);
- }
- return -1 !== a.indexOf(sSel);
- }
- function bx_copy_to_clipboard(s, onSuccess, onFail)
- {
- if ("undefined" === typeof(onSuccess))
- onSuccess = function (){};
- if ("undefined" === typeof(onFail))
- onFail = function (){};
- const oClip = navigator.clipboard;
- if ("undefined" !== typeof(oClip)) {
- navigator.clipboard.writeText(s).then(onSuccess, onFail);
- }
- else {
- if (document.execCommand) {
- const el = document.createElement("input");
- el.value = s;
- document.body.append(el);
- el.select();
- el.setSelectionRange(0, s.length);
- if (document.execCommand("copy")) {
- onSuccess();
- }
- el.remove();
- }
- else {
- onFail();
- }
- }
- }
- function bx_regexp_escape(s)
- {
- return s
- .replace(/[|\\{}()[\]^$+*?.]/mg, '\\$&')
- .replace(/-/mg, '\\x2d');
- }
- function bx_get_regexp(sType)
- {
- var o = {
- tag:"(<([^>]+bx-tag[^>]+)>)",
- mention: "(<([^>]+bx-mention-link[^>]+)>)",
- url: "(([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[\\-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9\\.\\-]+|(?:www\\.|[\\-;:&=\\+\\$,\\w]+@)[A-Za-z0-9\\.\\-]+)((?:\\/[\\+~%#\\/\\.\\w\\-_!\\(\\)]*)?\\??(?:[\\-\\+=&;%@\\.\\w_]*)#?(?:[\\.\\!\\/\\w]*))?"
- };
- return o[sType];
- }
- function bx_process_links()
- {
- // process links in container
- $('.bx-lnk-cnt .bx-lnk-src:not(.bx-inited)').each(function() {
- $(this).addClass('bx-inited');
- var sUrl = $(this).prop('href');
- $(this).parents('.bx-lnk-cnt').first().addClass('cursor-pointer').click(function(oEvent){
- if ($(oEvent.target).closest('a').length == 0 && $(oEvent.target).closest('button').length == 0 && $(oEvent.target).closest('form').length == 0 && $(oEvent.target).closest('input').length == 0){
- location.href = sUrl;
- }
- });
- });
- }
- function bx_redirect_for_external_links (e)
- {
- if ('undefined' === typeof(aDolOptions.sys_confirmation_before_redirect) || 'on' !== aDolOptions.sys_confirmation_before_redirect)
- return;
- var aExclude = ['javascript:', 'about:', sUrlRoot];
- var sPattern = 'a';
- $(aExclude).each(function () {
- sPattern += ':not([href^="' + this + '"])';
- });
- if ('undefined' !== typeof(aDolOptions.sys_storage_s3_endpoint) && aDolOptions.sys_storage_s3_endpoint.length)
- sPattern += ':not([href^="https://' + aDolOptions.sys_storage_s3_endpoint + '"])';
- sPattern += ":is([href^='http://'],[href^='https://'])";
- if ('undefined' === typeof(e))
- e = $('document');
- e.find(sPattern).each(function() {
- if ($(this).attr('href').match(/s3\.amazonaws\.com/))
- return;
-
- $(this).on('contextmenu', function(e) {
- e.preventDefault();
- });
- $(this).on('click', function() {
- var $this = $(this);
- bx_redirect_for_external_links_open($this.attr('href'));
- return false;
- });
- });
- }
- function bx_redirect_for_external_links_open (sHref)
- {
- //bx_confirm(_t('_sys_redirect_confirmation', sHref).replace(/\"/g, ''), function () {
- // window.open(sHref, '_blank').focus();
- //});
- window.open(sUrlRoot + 'page.php?i=redirect&url=' + encodeURIComponent(sHref), '_blank').focus();
- }
- function bx_agents_action(oElement, sTool, sAction, aParams)
- {
- var oDate = new Date();
- var sQueryUrl = sUrlRoot + 'agents.php';
- var oQueryParams = jQuery.extend({}, {t: sTool, a: sAction, _t:oDate.getTime()}, aParams != undefined ? aParams : {});
- bx_loading_btn(oElement, true);
- jQuery.post (
- sQueryUrl,
- oQueryParams,
- function(oData) {
- bx_loading_btn(oElement, false);
- processJsonData(oData);
- },
- 'json'
- );
- }
- function bx_get_focusable(oContext = 'document')
- {
- return Array.from(oContext.querySelectorAll('button, [href], input:not([type="hidden"]), textarea, select, [tabindex]:not(.bx-focus-trap, [tabindex="-1"])')).filter(function(oElement) {
- return !$(oElement).closest(':hidden').length;
- });
- }
- function bx_clicked_stack_register()
- {
- const iStackMaxLenth = 3;
- $('a,button').filter(function(iIndex, oElement) {
- return !$(oElement).closest('.bx-sidebar').length;
- }).on('click', function() {
- if(typeof window.glClickedStack === 'undefined')
- window.glClickedStack = [];
- window.glClickedStack.push(this);
- if(window.glClickedStack && window.glClickedStack.length > iStackMaxLenth)
- window.glClickedStack = window.glClickedStack.slice(-iStackMaxLenth);
- });
- }
- function bx_clicked_stack_lenth()
- {
- return window.glClickedStack ? window.glClickedStack.length : 0;
- }
- function bx_clicked_stack_get()
- {
- const iLenth = bx_clicked_stack_lenth();
- return iLenth > 0 ? window.glClickedStack[iLenth - 1] : false;
- }
- function bx_clicked_stack_pop()
- {
- return window.glClickedStack && window.glClickedStack.length > 0 ? window.glClickedStack.pop() : false;
- }
- /** @} */
|