/** * 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) { $('').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(); $('').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 += ''; s += ''; s += ''; s += ''; s += ''; s += ''; s += ''; s += ''; s += ''; s += ''; s += ''; s += ''; 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('' + (bUseSvgLoading ? bx_loading_svg('colored', sClassHeight) : '') + ''); if(!bUseSvgLoading) bx_loading_animate(oButton.find('.bx-loading-ajax-btn'), aSpinnerSmallOpts); } function bx_loading_content (oElement, bEnable, isReplace) { var oBlock = $(oElement); var oLoading = $('
' + (bUseSvgLoading ? bx_loading_svg('colored') : '') + '
'); 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('
'); } 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; $('').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