Current File : /home/bmofiscom/public_html/wp-content/plugins/mystickymenu/js/mystickymenu.js |
/*!
* myStickymenu by m.r.d.a
* v2.0.4
*/
(function( $ ) {
"use strict";
$(document).ready(function($){
if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) && option.device_mobile != 1) {
return false;
} else if ( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) != true && option.device_desktop != 1 ) {
return false;
}
// get Sticky Class setting if class name existts
if ($(option.mystickyClass) [0]){
// Do nothing
} else {
// Do something if class does not exist and stop
console.log("myStickymenu: Entered Sticky Class does not exist, change it in Dashboard / Settings / myStickymenu / Sticky Class. ");
return;
}
// Get class name
var mystickyClass = document.querySelector(option.mystickyClass);
// get disable at small screen size setting
var disableWidth = parseInt(option.disableWidth);
// get disable at large screen size setting
var disableLargeWidth = parseInt(option.disableLargeWidth);
// get transition effect (slide or fade)
var mystickyTransition = option.mystickyTransition;
// get activaton height setting
var activationHeight = parseInt(option.activationHeight);
// if is admin bar showing, needed for auto calc of activation height when admin bar is showing
var adminBar = option.adminBar;
// disable on scroll down
var mysticky_disable_down = option.mysticky_disable_down;
var viewportWidth;
function calcViewportWidth(e){
// Calculate actual viewport width
var e = window, a = 'inner';
if (!('innerWidth' in window )) {
a = 'client';
e = document.documentElement || document.body;
}
viewportWidth = e[ a+'Width' ];
}
calcViewportWidth();
var parentmysticky = mystickyClass.parentNode;
var wrappermysticky = document.createElement('div');
var position = 0;
for(var i = 0; i < parentmysticky.childNodes.length; i++) {
if(parentmysticky.childNodes[i] == mystickyClass) {
position = i;
break;
}
}
wrappermysticky.id = 'mysticky-wrap';
wrappermysticky.appendChild(mystickyClass);
parentmysticky.insertBefore(wrappermysticky, parentmysticky.childNodes[position]);
var parentnav = mystickyClass.parentNode;
var wrappernav = document.createElement('div');
wrappernav.id = 'mysticky-nav';
parentnav.replaceChild(wrappernav, mystickyClass);
wrappernav.appendChild(mystickyClass);
// get activation height from settings
if ( activationHeight == "0" ) {
var autoActivate = true;
}
var mydivHeight;
function initialDivHeight(){
// get initial element height of selected sticky class
mydivHeight = (mystickyClass.offsetHeight);
// when initial element have margin bottom - awaken example using #masthead class
if (parseInt($(mystickyClass).css("marginBottom")) > 0) {
// element have margin bottom, apply it to initial wrap
//$(mystickyClass).css("marginBottom").replace('px', '')
wrappermysticky.style.marginBottom = ($(mystickyClass).css("marginBottom"));
}
if (mydivHeight == "0") {
// something is wrong, wrapper cant be zero, if so content will jump while scroll. Awaken theme (for example) with .awaken-navigation-container class selected will use this part. Calculate height based on element children height
$(mystickyClass).children().filter(':visible').each(function(){
mydivHeight = $(this).outerHeight(true);
});
}
if (viewportWidth >= disableWidth) {
//wrappermysticky.style.height = mydivHeight + 'px';
}
}
initialDivHeight();
var myfixedHeight;
function fixedDivHeight(){
//if ( autoActivate == true ) {
// calculate element height while fixed
mystickyClass.classList.add('myfixed')
myfixedHeight = $(".myfixed").outerHeight();
if (myfixedHeight == "0") {
// something is wrong, wrapper cant be zero, try to calculate again with div children.
$(".myfixed").children().filter(':visible').each(function(){
myfixedHeight = $(this).outerHeight(true);
});
}
mystickyClass.classList.remove('myfixed');
}
fixedDivHeight();
var adminBarHeight = 0;
function calcAdminBarHeight(){
if ((adminBar == "true" ) && (viewportWidth > 600)) {
if ($("#wpadminbar")[0]){
adminBarHeight = $('#wpadminbar').height();
} else {
adminBarHeight = 0;
}
} else {
adminBarHeight = 0;
}
//wrappernav.style.top = adminBarHeight + "px";
if (mystickyTransition == "slide") {
wrappernav.style.top = "-" + myfixedHeight + "px";
//wrappernav.style.top = "-" + myfixedHeight + "px";
} else {
wrappernav.style.top = adminBarHeight + "px";
}
}
calcAdminBarHeight();
var mydivWidth;
function initialDivWidth(){
var rect = $(mystickyClass)[0].getBoundingClientRect();
mydivWidth = rect.width;
}
initialDivWidth();
var deactivationHeight = activationHeight;
function calcActivationHeight() {
// If activate height (Make visible on Scroll) is set to 0, automatic calculation will be used.
if ( autoActivate == true ) {
// Automatic calculation of activation and deactivation height (Make visible on Scroll is set to 0).
if (mystickyTransition == "slide") {
// Slide effect is selected
//activationHeight = $(mystickyClass).offset().top + mystickyClass.offsetHeight - adminBarHeight;
activationHeight = $(mystickyClass).offset().top + mydivHeight - adminBarHeight;
deactivationHeight = $(mystickyClass).offset().top + mydivHeight - adminBarHeight;
//deactivationHeight = $(mystickyClass).offset().top - adminBarHeight;
if (mysticky_disable_down == "on") {
deactivationHeight = $(mystickyClass).offset().top - adminBarHeight;
}
}
if (mystickyTransition == "fade") {
// Fade effect is selected
if (mysticky_disable_down == "false") {
activationHeight = $(mystickyClass).offset().top - adminBarHeight;
deactivationHeight = $(mystickyClass).offset().top - adminBarHeight;
}
if (mysticky_disable_down == "on") {
// Fade effect is selected
activationHeight = $(mystickyClass).offset().top - adminBarHeight + mydivHeight;
deactivationHeight = $(mystickyClass).offset().top - adminBarHeight;
}
}
}
}
calcActivationHeight();
function headerDeactivateOnHeight() {
if ( autoActivate == true ) {
if ( mydivHeight > myfixedHeight ){
// Auto activate is true, Make visible on Scroll is set to 0, menu is probably header
if (mystickyTransition == "slide") {
// slide effect is selected
deactivationHeight = activationHeight;
if (mysticky_disable_down == "on") {
deactivationHeight = activationHeight - myfixedHeight;
}
} else {
activationHeight = mydivHeight;
deactivationHeight = mydivHeight;
}
}
}
}
headerDeactivateOnHeight();
var hasScrollY = 'scrollY' in window;
var lastScrollTop = 0;
function onScroll(e) {
var mystickymenu_top_pos = $( '.mysticky-welcomebar-fixed' ).css( 'top' );
var welcombar_position = $( '.mysticky-welcomebar-fixed' ).data('position');
var welcombar_height = $( '.mysticky-welcomebar-fixed' ).outerHeight();
var mystickymenu_show = $( '.mysticky-welcomebar-fixed' ).length;
var welcomebar_appear = $( 'body' ).hasClass( 'mysticky-welcomebar-apper' );
if( mystickymenu_show && parseInt(mystickymenu_top_pos) >= 0 && welcombar_position == 'top' && welcomebar_appear ) {
var mystickymenu_pos = welcombar_height;
adminBarHeight = 0;
} else {
var mystickymenu_pos = '';
}
//initialDivHeight();
// if body width is larger than disable at small screen size setting
if (viewportWidth >= disableWidth) {
if ( disableLargeWidth == 0 || viewportWidth <= disableLargeWidth ) {
//if (mysticky_disable_down == "on") {
var y = hasScrollY ? window.scrollY : document.documentElement.scrollTop;
//var yScrollPosition = $(this).scrollTop();
/*30-04-2020 st*/
if( document.documentElement.scrollTop == 0 ) {
wrappernav.classList.remove('wrapfixed');
}
/*30-04-2020 end*/
// add up or down class to the element depending on scroll direction
if (0 <= y ) {
//var st = $(this).scrollTop();
if (y >= lastScrollTop){
// downscroll code
// add myfixed and wrapfixed class to selected fixed element while scroll down
y >= activationHeight ? mystickyClass.classList.add('myfixed') : "";
y >= activationHeight ? wrappernav.classList.add('wrapfixed') : "";
y >= activationHeight ? wrappermysticky.style.height = mydivHeight + 'px' : "";
y >= activationHeight ? mystickyClass.style.width = mydivWidth + "px" : "";
if (mystickyTransition == "slide") {
if (mysticky_disable_down == "false") {
//y < activationHeight + (myfixedHeight + 250) - adminBarHeight ? wrappernav.style.top = "-" + myfixedHeight + "px" : '';
//wrappernav.style.top = "-" + myfixedHeight + "px"
y >= activationHeight + myfixedHeight - adminBarHeight ? wrappernav.style.top = (adminBarHeight + mystickymenu_pos) + "px" : wrappernav.style.top = "-" + myfixedHeight + "px";
}
if ( mydivHeight > myfixedHeight ){
// if it's header (guess)
if (mysticky_disable_down == "false") {
y < activationHeight + myfixedHeight ? wrappernav.style.top = "-" + mydivHeight + "px" : '';
y >= activationHeight + myfixedHeight ? wrappernav.style.top = (adminBarHeight + mystickymenu_pos) + "px" : '';
}
}
}
wrappernav.classList.add('down');
wrappernav.classList.remove('up');
if (mysticky_disable_down == "on") {
wrappernav.style.top = "-" + (mydivHeight + adminBarHeight ) + "px";
jQuery('#mysticky-nav ' + option.mystickyClass+'.elementor-sticky').hide();
//jQuery('#mysticky-nav ' + option.mystickyClass).css( 'top' , "-" + (mydivHeight + adminBarHeight ) + "px");
}
} else {
// upscroll code
var x = hasScrollY ? window.scrollY : document.documentElement.scrollTop;
//x > deactivationHeight ? '' : mystickyClass.classList.remove('myfixed') ;
//x > deactivationHeight ? '' : wrappernav.classList.remove('wrapfixed');
x > deactivationHeight ? "" : wrappermysticky.style.height = "";
x > deactivationHeight ? "" : mystickyClass.style.width = "";
if (mystickyTransition == "slide") {
x > deactivationHeight ? '' : mystickyClass.classList.remove('myfixed') ;
x > deactivationHeight ? '' : wrappernav.classList.remove('wrapfixed');
if (mysticky_disable_down == "false") {
x < deactivationHeight + myfixedHeight + 200 - adminBarHeight ? wrappernav.style.top = "-" + myfixedHeight + "px" : '';
}
} else {
x > deactivationHeight ? "" : mystickyClass.classList.remove('myfixed') ;
x > deactivationHeight ? "" : wrappernav.classList.remove('wrapfixed');
}
wrappernav.classList.remove('down');
wrappernav.classList.add('up');
if (mysticky_disable_down == "on") {
wrappernav.style.top = (adminBarHeight + mystickymenu_pos) + "px";
jQuery('#mysticky-nav '+ option.mystickyClass).css( 'width' , mydivWidth + "px");
jQuery('#mysticky-nav ' + option.mystickyClass+'.elementor-sticky').show();
}
}
lastScrollTop = y;
} else {
//if (mysticky_disable_down == "on") {
wrappernav.classList.remove('up');
//}
}
} // if disableWidth is greater than zero
} // if disableLargeWidth is 0 or greater than zero
}
document.addEventListener('scroll', onScroll);
var width = $(window).width()
function OnResizeDocument () {
// don't recalculate on height change, only width
if($(window).width() != width ){
wrappernav.classList.remove('up');
wrappernav.classList.remove('down');
if ($(".wrapfixed")[0]){
// If class wrapfixed exists
// Remove myfixed and wrapfixed clases so we can calculate
//mystickyClass.classList.remove('myfixed');
//wrappernav.classList.remove('wrapfixed');
} else {
// Else class wrapfixed does not exists
initialDivHeight();
// Remove width
mystickyClass.style.removeProperty("width");
initialDivWidth();
}
calcViewportWidth();
calcAdminBarHeight();
fixedDivHeight();
calcActivationHeight();
headerDeactivateOnHeight();
}
}
window.addEventListener('resize', OnResizeDocument);
// need to test this, it should fire script on mobile orientation change, since onresize is somehow faulty in this case
window.addEventListener('orientationchange', OnResizeDocument);
if ( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) != true ) {
$("li.menu-item.menu-item-has-children").hover(
function(){
var window_height = window.innerHeight;
var header_height = $('#mysticky-wrap').outerHeight();
var submenu_height = $(this).find('ul.sub-menu').outerHeight();
if (window_height < submenu_height) {
$(this).find('ul.sub-menu').addClass('stickymenu-item-height');
jQuery(this).find('ul.sub-menu.stickymenu-item-height').css({"height": window_height-header_height + 'px'});
}
},
function(){
$(this).find('ul.sub-menu.stickymenu-item-height').css({"height": 'unset'});
$(this).find('ul.sub-menu').removeClass('stickymenu-item-height');
}
);
}
});
})(jQuery);