Files
medicalalert-web-reloaded/wp/plugins/divi-builder/includes/builder/scripts/frontend/global-functions.js
2024-01-09 22:14:20 -05:00

649 lines
22 KiB
JavaScript

// Internal Dependencies
import { top_window } from '@core/admin/js/frame-helpers';
import { isBuilder } from '../utils/utils';
import { getClosestStickyModuleOffsetTop, isTargetStickyState } from '../utils/sticky';
(function($) {
const isBlockLayoutPreview = $('body').hasClass('et-block-layout-preview');
const $tbHeader = $('.et-l--header').first();
let tbHeaderMostLengthyFixedSectionHeight = 0;
// Modification of underscore's _.debounce()
// Underscore.js 1.8.3
// http://underscorejs.org
// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
// Underscore may be freely distributed under the MIT license.
window.et_pb_debounce = function(func, wait, immediate) {
let timeout; let args; let context; let timestamp; let
result;
const now = Date.now || new Date().getTime();
var later = function() {
const last = now - timestamp;
if (last < wait && last >= 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (! immediate) {
result = func.apply(context, args);
if (! timeout) context = args = null;
}
}
};
return function() {
context = this;
args = arguments;
timestamp = now;
const callNow = immediate && ! timeout;
if (! timeout) timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
context = args = null;
}
return result;
};
};
if ($tbHeader.length) {
const $tbHeaderSections = $tbHeader.find('.et_builder_inner_content').children('.et_pb_section--fixed');
// Get the most tall header fixed section height
const et_pb_header_most_lengthy_fixed_section_height = et_pb_debounce(e => {
tbHeaderMostLengthyFixedSectionHeight = 0;
$.each($tbHeaderSections, function(index, section) {
let $sectionHeight = $(section).outerHeight(true);
if ($sectionHeight > tbHeaderMostLengthyFixedSectionHeight) {
tbHeaderMostLengthyFixedSectionHeight = $sectionHeight;
}
});
}, 300);
$(window).on('resize', et_pb_header_most_lengthy_fixed_section_height);
}
window.et_pb_smooth_scroll = function($target, $top_section, speed, easing) {
const targetOffsetTop = $target.offset().top;
const $window_width = $(window).width();
let $menu_offset = 0;
let $scroll_position = 0;
let $menuLeft = '';
let $menuRight = '';
let $fixedHeaderSection = $tbHeader.find('.et_pb_section');
// If the target is in sticky state there should be no scroll so we can bail early.
if (isTargetStickyState($target)) {
return;
}
if ($('body').hasClass('et_fixed_nav') && $window_width > 980) {
const topHeaderHeight = $('#top-header').outerHeight() || 0;
const mainHeaderHeight = $('#main-header').outerHeight() || 0;
$menu_offset = topHeaderHeight + mainHeaderHeight - 1;
} else {
$menu_offset = 0;
}
if ($('#wpadminbar').length && $window_width > 600) {
const wpAdminBarHeight = $('#wpadminbar').outerHeight() || 0;
$menu_offset += wpAdminBarHeight;
}
if ($tbHeader.length) {
// attach targeted section just under header (if) fixed section
if ($fixedHeaderSection.hasClass('et_pb_section--fixed')) {
$menuLeft = Math.ceil(parseFloat($fixedHeaderSection.css('left')));
$menuRight = Math.ceil(parseFloat($fixedHeaderSection.css('right')));
if ($window_width < 980) {
$menu_offset += 90;
}
}
if (0 === $menuLeft + $menuRight) {
$menu_offset += tbHeaderMostLengthyFixedSectionHeight;
}
}
// Calculate offset that needs to be added due to the existence of sticky module(s).
// This avoids smooth scroll to stop beneath sticky module.
const closestStickyOffsetTop = getClosestStickyModuleOffsetTop($target);
if (closestStickyOffsetTop) {
// if automatic sticky offset exist, add additional 40px offset for UX reason
$menu_offset += (closestStickyOffsetTop + 40);
}
// fix sidenav scroll to top
if ($top_section) {
$scroll_position = 0;
} else {
$scroll_position = targetOffsetTop - $menu_offset;
}
// set swing (animate's scrollTop default) as default value
if ('undefined' === typeof easing) {
easing = 'swing';
}
$('html, body').animate({ scrollTop: $scroll_position }, speed, easing);
};
window.et_pb_form_placeholders_init = function($form) {
$form.find('input:text, input[type="email"], input[type="url"], textarea').each((index, domEle) => {
const $et_current_input = jQuery(domEle);
const $et_comment_label = $et_current_input.siblings('label');
let et_comment_label_value = $et_current_input.siblings('label').text();
if ($et_comment_label.length) {
$et_comment_label.hide();
if ($et_current_input.siblings('span.required')) {
et_comment_label_value += $et_current_input.siblings('span.required').text();
$et_current_input.siblings('span.required').hide();
}
$et_current_input.val(et_comment_label_value);
}
}).on('focus', function() {
let et_label_text = jQuery(this).siblings('label').text();
if (jQuery(this).siblings('span.required').length) et_label_text += jQuery(this).siblings('span.required').text();
if (jQuery(this).val() === et_label_text) jQuery(this).val('');
}).on('blur', function() {
let et_label_text = jQuery(this).siblings('label').text();
if (jQuery(this).siblings('span.required').length) et_label_text += jQuery(this).siblings('span.required').text();
if ('' === jQuery(this).val()) jQuery(this).val(et_label_text);
});
};
window.et_duplicate_menu = function(menu, append_to, menu_id, menu_class, menu_click_event) {
append_to.each(function() {
const $this_menu = $(this);
let $cloned_nav;
// Bail early if menu has already been duplicated.
if ($this_menu.find(`#${menu_id}`).length) {
return;
}
// make this function work with existing menus, without cloning
if ('' !== menu) {
menu.clone().attr('id', menu_id).removeClass().attr('class', menu_class)
.appendTo($this_menu);
}
$cloned_nav = $this_menu.find('> ul');
$cloned_nav.find('.menu_slide').remove();
$cloned_nav.find('.et_pb_menu__logo-slot').remove();
$cloned_nav.find('li').first().addClass('et_first_mobile_item');
$cloned_nav.find('a').on('click', function() {
$(this).parents('.et_mobile_menu').siblings('.mobile_menu_bar').trigger('click');
});
if ('no_click_event' !== menu_click_event) {
if (isBuilder) {
$this_menu.off('click');
}
$this_menu.on('click', '.mobile_menu_bar', function() {
// Close all other open menus.
$('.mobile_nav.opened .mobile_menu_bar').not($(this)).trigger('click');
if ($this_menu.hasClass('closed')) {
$this_menu.removeClass('closed').addClass('opened');
$cloned_nav.stop().slideDown(500);
} else {
$this_menu.removeClass('opened').addClass('closed');
$cloned_nav.stop().slideUp(500);
}
return false;
});
}
});
$('#mobile_menu .centered-inline-logo-wrap').remove();
};
// remove placeholder text before form submission
window.et_pb_remove_placeholder_text = function($form) {
$form.find('input:text, textarea').each((index, domEle) => {
const $et_current_input = jQuery(domEle);
const $et_label = $et_current_input.siblings('label');
const et_label_value = $et_current_input.siblings('label').text();
if ($et_label.length && $et_label.is(':hidden')) {
if ($et_label.text() == $et_current_input.val()) $et_current_input.val('');
}
});
};
window.et_fix_fullscreen_section = function() {
const $et_window = isBlockLayoutPreview ? $(top_window) : $(window);
$('section.et_pb_fullscreen').each(function() {
const $this_section = $(this);
et_calc_fullscreen_section.bind($this_section);
$et_window.on('resize', et_calc_fullscreen_section.bind($this_section));
});
};
window.et_bar_counters_init = function($bar_item) {
if (! $bar_item.length) {
return;
}
$bar_item.css({
width: `${parseFloat($bar_item.attr('data-width'))}%`,
});
};
window.et_fix_pricing_currency_position = function($pricing_table) {
setTimeout(() => {
const $all_pricing_tables = typeof $pricing_table !== 'undefined' ? $pricing_table : $('.et_pb_pricing_table');
if (! $all_pricing_tables.length) {
return;
}
$all_pricing_tables.each(function() {
const $this_table = $(this);
const $price_container = $this_table.find('.et_pb_et_price');
const $currency = $price_container.length ? $price_container.find('.et_pb_dollar_sign') : false;
const $price = $price_container.length ? $price_container.find('.et_pb_sum') : false;
if (! $currency || ! $price) {
return;
}
// adjust the margin of currency sign to make sure it doesn't overflow the price
$currency.css({ marginLeft: `${- $currency.width()}px` });
});
}, 1);
};
window.et_pb_set_responsive_grid = function($grid_items_container, single_item_selector) {
setTimeout(() => {
const container_width = $grid_items_container.innerWidth();
const $grid_items = $grid_items_container.find(single_item_selector);
const item_width = $grid_items.outerWidth(true);
const last_item_margin = item_width - $grid_items.outerWidth();
const columns_count = Math.round((container_width + last_item_margin) / item_width);
let counter = 1;
let first_in_row = 1;
let $first_in_last_row = $();
$grid_items.removeClass('last_in_row first_in_row on_last_row');
$grid_items.filter(':visible').each(function() {
const $this_element = $(this);
if (! $this_element.hasClass('inactive')) {
if (first_in_row === counter) {
$this_element.addClass('first_in_row');
$first_in_last_row = $this_element;
} else if (0 === counter % columns_count) {
$this_element.addClass('last_in_row');
first_in_row = counter + 1;
}
counter++;
}
});
if ($first_in_last_row.length) {
const $module = $first_in_last_row.parents('.et_pb_module');
// set margin bottom to 0 if the gallery is the last module on the column
if ($module.is(':last-child')) {
const column = $first_in_last_row.parents('.et_pb_column')[0];
$(column).find('.et_pb_grid_item').removeClass('on_last_row');
// keep gutter margin if gallery has pagination
let pagination = $module.find('.et_pb_gallery_pagination');
if (0 === pagination.length) {
pagination = $module.find('.et_pb_portofolio_pagination');
}
if (0 === pagination.length || (pagination.length > 0 && ! pagination.is(':visible'))) {
if (columns_count > 1) {
$first_in_last_row.addClass('on_last_row');
}
$first_in_last_row.nextAll().addClass('on_last_row');
}
}
}
}, 1); // need this timeout to make sure all the css applied before calculating sizes
};
window.et_pb_set_tabs_height = function($tabs_module) {
if ('undefined' === typeof $tabs_module) {
$tabs_module = $('.et_pb_tabs');
}
if (! $tabs_module.length) {
return;
}
$tabs_module.each(function() {
const $tab_controls = $(this).find('.et_pb_tabs_controls');
const $all_tabs = $tab_controls.find('li');
let max_height = 0;
const small_columns = '.et_pb_column_1_3, .et_pb_column_1_4, .et_pb_column_3_8';
const in_small_column = $(this).parents(small_columns).length > 0;
const on_small_screen = parseFloat($(window).width()) < 768;
const vertically_stacked = in_small_column || on_small_screen;
if (vertically_stacked) {
$(this).addClass('et_pb_tabs_vertically_stacked');
}
// determine the height of the tallest tab
if ($all_tabs.length) {
// remove the height attribute if it was added to calculate the height correctly
$tab_controls.children('li').removeAttr('style');
$all_tabs.each(function() {
const tab_height = $(this).outerHeight();
if (vertically_stacked) {
return;
}
if (tab_height > max_height) {
max_height = tab_height;
}
});
}
if (0 !== max_height) {
// set the height of tabs container based on the height of the tallest tab
$tab_controls.children('li').css('height', `${max_height}px`);
}
});
};
window.et_pb_box_shadow_apply_overlay = function(el) {
const pointerEventsSupport = document.body.style.pointerEvents !== undefined
// For some reasons IE 10 tells that supports pointer-events, but it doesn't
&& (document.documentMode === undefined || document.documentMode >= 11);
if (pointerEventsSupport) {
$(el).each(function() {
if (! $(this).children('.box-shadow-overlay').length) {
$(this)
.addClass('has-box-shadow-overlay')
.prepend('<div class="box-shadow-overlay"></div>');
}
});
} else {
$(el).addClass('.et-box-shadow-no-overlay');
}
};
window.et_pb_init_nav_menu = function($et_menus) {
$et_menus.each(function() {
const $et_menu = $(this);
// don't attach event handlers several times to the same menu
if ($et_menu.data('et-is-menu-ready')) {
return;
}
$et_menu.find('li').on('mouseenter', function() {
window.et_pb_toggle_nav_menu($(this), 'open');
}).on('mouseleave', function() {
window.et_pb_toggle_nav_menu($(this), 'close');
});
// close all opened menus on touch outside the menu
$('body').on('touchend', event => {
if ($(event.target).closest('ul.nav, ul.menu').length < 1 && $('.et-hover').length > 0) {
window.et_pb_toggle_nav_menu($('.et-hover'), 'close');
}
});
// Dropdown menu adjustment for touch screen
$et_menu.find('li.menu-item-has-children').on('touchend', function(event) {
const $closest_li = $(event.target).closest('.menu-item');
// no need special processing if parent li doesn't have hidden child elements
if (! $closest_li.hasClass('menu-item-has-children')) {
return;
}
const $this_el = $(this);
const is_mega_menu_opened = $closest_li.closest('.mega-menu-parent.et-touch-hover').length > 0;
// open submenu on 1st tap
// open link on second tap
if ($this_el.hasClass('et-touch-hover') || is_mega_menu_opened) {
const href = $this_el.find('>a').attr('href');
if (typeof href !== 'undefined') { // if parent link is not empty then open the link
window.location = $this_el.find('>a').attr('href');
}
} else {
const $opened_menu = $(event.target);
const $already_opened_menus = $opened_menu.closest('.menu-item').siblings('.et-touch-hover');
// close the menu before opening new one
if ($opened_menu.closest('.et-touch-hover').length < 1) {
window.et_pb_toggle_nav_menu($('.et-hover'), 'close', 0);
}
$this_el.addClass('et-touch-hover');
if ($already_opened_menus.length > 0) {
const $submenus_in_already_opened = $already_opened_menus.find('.et-touch-hover');
// close already opened submenus to avoid overlaps
window.et_pb_toggle_nav_menu($already_opened_menus, 'close');
window.et_pb_toggle_nav_menu($submenus_in_already_opened, 'close');
}
// open new submenu
window.et_pb_toggle_nav_menu($this_el, 'open');
}
event.preventDefault();
event.stopPropagation();
});
$et_menu.find('li.mega-menu').each(function() {
const $li_mega_menu = $(this);
const $li_mega_menu_item = $li_mega_menu.children('ul').children('li');
const li_mega_menu_item_count = $li_mega_menu_item.length;
if (li_mega_menu_item_count < 4) {
$li_mega_menu.addClass(`mega-menu-parent mega-menu-parent-${li_mega_menu_item_count}`);
}
});
// mark the menu as ready
$et_menu.data('et-is-menu-ready', 'ready');
});
};
window.et_pb_toggle_nav_menu = function($element, state, delay) {
if ('open' === state) {
if (! $element.closest('li.mega-menu').length || $element.hasClass('mega-menu')) {
$element.addClass('et-show-dropdown');
$element.removeClass('et-hover').addClass('et-hover');
}
} else {
const closeDelay = typeof delay !== 'undefined' ? delay : 200;
$element.removeClass('et-show-dropdown');
$element.removeClass('et-touch-hover');
setTimeout(() => {
if (! $element.hasClass('et-show-dropdown')) {
$element.removeClass('et-hover');
}
}, closeDelay);
}
};
window.et_pb_apply_sticky_image_effect = function($sticky_image_el) {
const $row = $sticky_image_el.closest('.et_pb_row');
const $section = $row.closest('.et_pb_section');
const $column = $sticky_image_el.closest('.et_pb_column');
const sticky_class = 'et_pb_section_sticky';
const sticky_mobile_class = 'et_pb_section_sticky_mobile';
const $lastRowInSection = $section.children('.et_pb_row').last();
const $lastColumnInRow = $row.children('.et_pb_column').last();
const $lastModuleInColumn = $column.children('.et_pb_module').last();
// If it is not in the last row, continue
if (! $row.is($lastRowInSection)) {
return true;
}
$lastRowInSection.addClass('et-last-child');
// Make sure sticky image is the last element in the column
if (! $sticky_image_el.is($lastModuleInColumn)) {
return true;
}
// If it is in the last row, find the parent section and attach new class to it
if (! $section.hasClass(sticky_class)) {
$section.addClass(sticky_class);
}
$column.addClass('et_pb_row_sticky');
if (! $section.hasClass(sticky_mobile_class) && $column.is($lastColumnInRow)) {
$section.addClass(sticky_mobile_class);
}
};
/**
* Inject a <li> element in the middle of a menu for the purposes of the menu module's
* inline centered logo style.
*
* @since 4.0
*
* @param {object} menu
*
* @returns {object|null}
*/
window.et_pb_menu_inject_inline_centered_logo = function(menu) {
const $listItems = $(menu).find('nav > ul > li');
const index = Math.round($listItems.length / 2);
const li = window.et_pb_menu_inject_item(menu, index, true);
if (li) {
$(li).addClass('et_pb_menu__logo-slot');
}
return li;
};
/**
* Inject a <li> element at the start of a menu for the purposes of the menu module's
* additional icons.
*
* @since 4.0
*
* @param {object} menu
* @param {number} index
* @param {boolean} fromTheBeginning
*
* @returns {object|null}
*/
window.et_pb_menu_inject_item = function(menu, index, fromTheBeginning) {
fromTheBeginning = undefined === fromTheBeginning ? true : fromTheBeginning;
index = Math.max(index, 0);
const $list = $(menu).find('nav > ul').first();
if (0 === $list.length) {
return null;
}
const $listItems = $list.find('> li');
const $li = $('<li></li>');
if (0 === $listItems.length) {
$list.append($li);
} else {
let action = fromTheBeginning ? 'before' : 'after';
let $sibling = fromTheBeginning
? $listItems.eq(index)
: $listItems.eq(($listItems.length - 1) - index);
if (0 === $sibling.length) {
action = fromTheBeginning ? 'after' : 'before';
$sibling = fromTheBeginning ? $listItems.last() : $listItems.first();
}
$sibling[action]($li);
}
return $li.get(0);
};
/**
* Reposition menu module dropdowns.
* This is necessary due to mega menus relying on an upper wrapper's width but
* still needing to be position relative to their parent li.
*
* @since 4.0
*
* @returns {void}
*/
window.et_pb_reposition_menu_module_dropdowns = et_pb_debounce(menus => {
const $menus = menus ? $(menus) : $('.et_pb_menu, .et_pb_fullwidth_menu');
$menus.each(function() {
const $row = $(this).find('.et_pb_row').first();
if (0 === $row.length) {
return true; // = continue.
}
const offset = $row.offset().top;
const moduleClass = $(this).attr('class').replace(/^.*?(et_pb(?:_fullwidth)?_menu_\d+[^\s]*).*$/i, '$1');
const isUpwards = $(this).find('.et_pb_menu__menu ul').first().hasClass('upwards');
const selector = '.et_pb_menu__menu > nav > ul > li.mega-menu.menu-item-has-children';
let css = '';
$(this).find(selector).each(function() {
const $li = $(this);
const liId = $li.attr('class').replace(/^.*?(menu-item-\d+).*$/i, '$1');
const selector = `.${moduleClass} li.${liId} > .sub-menu`;
if (isUpwards) {
// Offset by 1px to ensure smooth mouse hover.
var linkOffset = Math.floor(offset + $row.outerHeight() - $li.offset().top) - 1;
css += `${selector}{ bottom: ${linkOffset.toString()}px !important; }`;
} else {
// Offset by 1px to ensure smooth mouse hover.
var linkOffset = Math.floor($li.offset().top + $li.outerHeight() - offset) - 1;
css += `${selector}{ top: ${linkOffset.toString()}px !important; }`;
}
});
let $style = $(`style.et-menu-style-${moduleClass}`).first();
if (0 === $style.length) {
$style = $('<style></style>');
$style.addClass('et-menu-style');
$style.addClass(`et-menu-style-${moduleClass}`);
$style.appendTo($('head'));
}
const oldCss = $style.html();
if (css !== oldCss) {
$style.html(css);
}
});
}, 200);
})(jQuery);