/*! Weaver Xtreme JavaScript Library 3.1 - Copyright 2016,2017, Weaver Theme + Copyrights of sub-scripts */
/* Weaver Xtreme FitVids - added to end of page html. If add more than FitVids, need to fix
* how _disable_FitVids works.
* */
/*global jQuery */
/*jshint browser:true */
/*
* FitVids 1.1
*
* Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com
* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/
* Released under the WTFPL license - http://sam.zoy.org/wtfpl/
*
*/
(function($) {
'use strict';
$.fn.fitVids = function(options) {
var settings = {
customSelector: null,
ignore: '.wp-block-embed'
};
if (!document.getElementById('fit-vids-style')) {
// appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js
var head = document.head || document.getElementsByTagName('head')[0];
var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}';
var div = document.createElement("div");
div.innerHTML = '
x
';
head.appendChild(div.childNodes[1]);
}
if (options) {
$.extend(settings, options);
}
return this.each(function() {
var selectors = [
'iframe[src*="player.vimeo.com"]',
'iframe[src*="youtube.com"]',
'iframe[src*="youtu.be"]',
'iframe[src*="youtube-nocookie.com"]',
'iframe[src*="kickstarter.com"][src*="video.html"]',
'object',
'embed'
];
if (settings.customSelector) {
selectors.push(settings.customSelector);
}
var ignoreList = '.fitvidsignore';
if (settings.ignore) {
ignoreList = ignoreList + ', ' + settings.ignore;
}
var $allVideos = $(this).find(selectors.join(','));
$allVideos = $allVideos.not('object object'); // SwfObj conflict patch
$allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video.
$allVideos.each(function() {
var $this = $(this);
if ($this.parents(ignoreList).length > 0) {
return; // Disable FitVids on this video.
}
if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }
if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width')))) {
$this.attr('height', 9);
$this.attr('width', 16);
}
var height = (this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10)))) ? parseInt($this.attr('height'), 10) : $this.height(),
width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),
aspectRatio = height / width;
if (!$this.attr('id')) {
var videoID = 'fitvid' + Math.floor(Math.random() * 999999);
$this.attr('id', videoID);
}
$this.wrap('').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100) + '%');
$this.removeAttr('height').removeAttr('width');
});
});
};
// Works with either jQuery or Zepto
})(window.jQuery || window.Zepto);
// TABS - put in front to make show faster
jQuery(document).ready(function($) { // self-defining function - for tabs shortcode
// Tabs
$('.wvr-tabs-nav').delegate('span:not(.wvr-tabs-current)', 'click', function() {
$(this).addClass('wvr-tabs-current').siblings().removeClass('wvr-tabs-current')
.parents('.wvr-tabs').find('.wvr-tabs-pane').hide().eq($(this).index()).show();
});
$('.wvr-tabs-pane').hide();
$('.wvr-tabs-nav span:first-child').addClass('wvr-tabs-current');
$('.wvr-tabs-panes .wvr-tabs-pane:first-child').show();
});
/* -------------------------
support [showhide]
*/
function weaverx_ToggleDIV(his, me, show, hide, text) {
if (his.style.display != 'none') {
his.style.display = 'none';
if (text == 'img') {
me.innerHTML = '
';
} else {
me.innerHTML = '' + show + '';
}
} else {
his.style.display = '';
if (text == 'img') {
me.innerHTML = '
';
} else {
me.innerHTML = '' + hide + '';
}
}
}
function wvrxFlowColor() {
//version 1.1 - 20 oct 2014
//IE8 Fix
if ( typeof wvrxEndOpts === 'undefined' || wvrxEndOpts.flowColor == '0')
return;
var SdbConf = wvrxEndOpts.sbLayout; //get the sidebar layout
var MyContent = document.getElementById('content');
var MyPSdb = document.getElementById('primary-widget-area');
var MySSdb = document.getElementById('secondary-widget-area');
//reset min height, must be outside the sidebar test
if (MyPSdb) {
MyPSdb.style.minHeight = "";
}
if (MySSdb) {
MySSdb.style.minHeight = "";
}
if (MyContent) {
MyContent.style.minHeight = "";
}
function weaverxMarginTop(select) {
var val = jQuery(select).css('margin-top');
if (val == 'auto') // Fix for jQuery returning auto on IE7 and IE8 when no margin is set
val = '0px';
return parseInt(val);
}
function weaverxMarginBottom(select) {
var val = jQuery(select).css('margin-bottom');
if (val == 'auto') // Fix for jQuery returning auto on IE7 and IE8 when no margin is set
val = '0px';
return parseInt(val);
}
var ContTopM, ContHeight, MaxHeight, SSdbTopM, PSdbTopM, PSdbHeight, SSdbHeight;
//Test if on desktop size using weaverxBrowserWidth()
if (weaverxBrowserWidth() >= 768) {
//Start testing from actual presence of sidebar, regardless of sidebar config to cover cases of empty split sidebars
if (MyPSdb && (MySSdb === null) || MySSdb && (MyPSdb === null)) {
//--Single SB case--
if (MyPSdb) { //Primary SB only
ContTopM = weaverxMarginTop('#content');
PSdbTopM = weaverxMarginTop('#primary-widget-area');
PSdbHeight = MyPSdb.offsetHeight + PSdbTopM;
ContHeight = MyContent.offsetHeight + ContTopM;
//Take the highest content height
MaxHeight = Math.max(PSdbHeight, ContHeight);
//Apply appropriate min height to containers
MyContent.style.minHeight = (MaxHeight - ContTopM) + "px";
MyPSdb.style.minHeight = (MaxHeight - PSdbTopM) + "px";
} else { //Secondary SD only
ContTopM = weaverxMarginTop('#content');
SSdbTopM = weaverxMarginTop('#secondary-widget-area');
SSdbHeight = MySSdb.offsetHeight + SSdbTopM;
ContHeight = MyContent.offsetHeight + ContTopM;
//Take the highest content height
MaxHeight = Math.max(SSdbHeight, ContHeight);
//Apply appropriate min height to containers
MyContent.style.minHeight = (MaxHeight - ContTopM) + "px";
MySSdb.style.minHeight = (MaxHeight - SSdbTopM) + "px";
}
}
if (MyPSdb && MySSdb) {
if (SdbConf == 'right' || SdbConf == 'left' || SdbConf == 'right-top' || SdbConf == 'left-top') {
//--Two stacked Sidebars case--
ContTopM = weaverxMarginTop('#content');
SSdbTopM = weaverxMarginTop('#secondary-widget-area');
PSdbTopM = weaverxMarginTop('#primary-widget-area');
var PSdbBotM = weaverxMarginBottom('#primary-widget-area');
PSdbHeight = MyPSdb.offsetHeight + PSdbTopM + PSdbBotM;
SSdbHeight = MySSdb.offsetHeight + SSdbTopM;
ContHeight = MyContent.offsetHeight + ContTopM;
var TotSdbHeight = PSdbHeight + SSdbHeight;
//Take the highest content height
MaxHeight = Math.max(TotSdbHeight, ContHeight);
//Apply appropriate min height to containers
MyContent.style.minHeight = (MaxHeight - ContTopM) + "px";
MySSdb.style.minHeight = (MaxHeight - PSdbHeight - SSdbTopM) + "px";
}
if (SdbConf == 'split-top' || SdbConf == 'split') {
//--Two Split Sidebar case
ContTopM = weaverxMarginTop('#content');
SSdbTopM = weaverxMarginTop('#secondary-widget-area');
PSdbTopM = weaverxMarginTop('#primary-widget-area');
PSdbHeight = MyPSdb.offsetHeight + PSdbTopM;
SSdbHeight = MySSdb.offsetHeight + SSdbTopM;
ContHeight = MyContent.offsetHeight + ContTopM;
//Take the highest content height
MaxHeight = Math.max(PSdbHeight, ContHeight, SSdbHeight);
//Apply appropriate min height to containers
MyContent.style.minHeight = (MaxHeight - ContTopM) + "px";
MyPSdb.style.minHeight = (MaxHeight - PSdbTopM) + "px";
MySSdb.style.minHeight = (MaxHeight - SSdbTopM) + "px";
}
}
} else {
if (weaverxBrowserWidth() > 580) {
//Test if on small tablet size using screensize function
if (MyPSdb && MySSdb) {
if (SdbConf == 'right' || SdbConf == 'left' || SdbConf == 'split') { //Sidebar Right left or Split Sidebar are the only one side by side on small tablets
SSdbTopM = weaverxMarginTop('#secondary-widget-area');
PSdbTopM = weaverxMarginTop('#primary-widget-area');
PSdbHeight = MyPSdb.offsetHeight + PSdbTopM;
SSdbHeight = MySSdb.offsetHeight + SSdbTopM;
//Take the highest content height of both sidebars
MaxHeight = Math.max(PSdbHeight, SSdbHeight);
//Apply appropriate min height to containers
MyPSdb.style.minHeight = (MaxHeight - PSdbTopM) + "px";
MySSdb.style.minHeight = (MaxHeight - SSdbTopM) + "px";
}
}
}
}
}
// fix up vw widths
function weaverxScrollbarClass() {
//detect vertical Scrollbar and add a class to the body tag
var BrowserWidth = jQuery('#wvrx-page-width').width(); //width of browser
jQuery('#wvrx-page-width').css('width', '100vw'); //change width to 100vw to measure viewport
var expandWidth = jQuery('#wvrx-page-width').width(); //Width of the Expanded container (viewport)
if (expandWidth > BrowserWidth) { //If viewport is larger there is a scrollbar
jQuery('body').addClass('vert-scrollbar');
jQuery('body').removeClass('no-vert-scrollbar');
} else {
jQuery('body').addClass('no-vert-scrollbar');
jQuery('body').removeClass('vert-scrollbar');
}
jQuery('#wvrx-page-width').css('width', ''); //remove vw CSS on test container
}
/* -------------------------------------------------------------------------------
This is the full-width method using padding and margin
It requires the base rules (below) to be in the general CSS (no longer requires html {overflow-x:hidden;})
.content-box {box-sizing:content-box !important;
-moz-box-sizing:content-box !important;
-webkit-box-sizing:content-box !important;}
It requires the #wvrx-page-width to get the following CSS so it becomes 100% wide and works with the monitoring
#wvrx-page-width {
width:100%;
display:block;
direction: ltr;
position:absolute;
}
*/
function weaverxFullWidth() {
// V4.1 - minor syntax fix
//V4 merge Extend and Expand in same script
//V3.3.1 Auto overflow:visible for #content, #container when fullwidth used
//V3.3 Fixed prcision changes parseInt to parseFloat
//V3-2 testing a way to measure error in total width
//V3-1 Fixed RTL mode. The #wvrx-page-width div must be given direction:LTR for the real time monitoring to work
//V3- Fixed to support right and left padding and borders, as well as non centered containers.
//Only limitation: Width, left / right padding & border should not be set with inline style, but with a separate custom CSS rule.
//This is because the script will write its own computed width and padding as inline style, so anything already there would be lost and lead to wrong calculation.
var BrowserWidth = jQuery('#wvrx-page-width').width(); //Gather Internal(content) width of browser
var overFlowVisible = false;
//***SCAN BOTH CLASSES for Extend and Expand
jQuery(".wvrx-fullwidth, .wvrx-expand-full").each(function() {
jQuery(this).removeClass('content-box'); //reset container box-sizing status to its original state
jQuery(this).css({ //Remove previously computed inline width, paddings and margins to always measure original values
'width': '',
'margin-left': '',
'margin-right': '',
'padding-left': '',
'padding-right': ''
});
var ElemWidth = jQuery(this).width(); //width of content
var ElemOuterWidth = jQuery(this).outerWidth(); //width of content
var OrigLeftPad = parseFloat(jQuery(this).css("padding-left"));
var OrigRightPad = parseFloat(jQuery(this).css("padding-right"));
var OrigLeftBor = parseFloat(jQuery(this).css("border-left-width")) || 0; //or zero is for IE8 that returns NaN if not set
var OrigRightBor = parseFloat(jQuery(this).css("border-right-width")) || 0;
var LeftPadding, RightPadding;
var Extension = BrowserWidth - ElemOuterWidth; //Difference between browser and content
var LeftMargin, LeftMarginMinus, RightMargin, RightMarginMinus;
if (Extension > 4) { //If positive we must compute extensions
var ParentWidth = jQuery(this).parent().width(); //width of parents content
var ElemBoxSizing = jQuery(this).css("box-sizing"); //Box sizing
var OrigLeftMarg = parseFloat(jQuery(this).css("margin-left")) || 0; //Left margin
var LeftPosition = Math.ceil(jQuery(this).offset().left); //ceil is to avoid a 1px scrollbar in s0me configuration
// var LeftPosition = jQuery(this).offset().left; // don't need ceil on some browsers
var RightPosition = BrowserWidth - (LeftPosition + ElemOuterWidth); //Distance between right side of content and right side of browser
if (!overFlowVisible) { // auto fix these whenver fullwidth used
overFlowVisible = true;
jQuery("#content").css({ 'overflow': 'visible' });
jQuery(".content-page").css({ 'overflow': 'visible' });
jQuery("#container").css({ 'overflow': 'visible' });
}
if (Math.abs(LeftPosition - RightPosition) < 2) { //if object is centered compute margins from difference with parent
OrigLeftMarg = Math.max(0, ((ParentWidth - ElemOuterWidth) / 2)); //to workaround FF bug with jquery auto margins
}
//COmputing any error from jQuery so we can add it to the final padding
var WidthError = BrowserWidth - (LeftPosition + RightPosition + OrigLeftPad + OrigRightPad + OrigLeftBor + OrigRightBor + ElemWidth);
if (jQuery("body.rtl").length) {
//RTL loop
LeftMargin = LeftPosition + 'px'; //Make margin strings
LeftMarginMinus = '-' + LeftMargin;
RightMargin = (Math.max(0, RightPosition - OrigLeftMarg)) + 'px';
RightMarginMinus = '-' + RightMargin;
} else {
//LTR loop
LeftMargin = (Math.max(0, LeftPosition - OrigLeftMarg)) + 'px'; //Make margin strings
LeftMarginMinus = '-' + LeftMargin;
RightMargin = RightPosition + 'px';
RightMarginMinus = '-' + RightMargin;
}
//These are padding for Extend
if(jQuery(this).hasClass( "wvrx-fullwidth" )) {
LeftPadding = (LeftPosition + OrigLeftPad + WidthError) + 'px'; //Make padding strings with error correction
RightPadding = (RightPosition + OrigRightPad) + 'px';
if (ElemBoxSizing == "border-box") { //This checks if object is border box
jQuery(this).addClass('content-box'); //If so change container to content box
jQuery(this).css({ //and set the CSS width to the width without padding to match content box
'width': Math.floor(ElemWidth) + 'px'
});
}
}
//***These are paddings for Expand
if(jQuery(this).hasClass( "wvrx-expand-full" )) {
LeftPadding = OrigLeftPad + 'px';
RightPadding = OrigRightPad + 'px';
jQuery(this).css({ //Sets the inline margin and padding
'width': BrowserWidth,
'max-width': 'none'
});
}
jQuery(this).css({ //Sets the inline margin and padding
'margin-left': LeftMarginMinus,
'margin-right': RightMarginMinus,
'padding-left': LeftPadding,
'padding-right': RightPadding
});
}
});
}
function weaverxWidgetEq(WdgtClass, AreaId) {
//version 0.9 - 26 Nov 2014
//-- added check for actual margin and presence of widget area, and fixed bottom margin eval
//--use offsetxxx instead of clientxxx to account for borders
//--Capture margin in its actual form not only pixel value
//--remove position relative being added to the primary sidebar to avoid problem in split SB layout
//--Improved bottom margin handling, makes it fully ie8 compliant
//--Simplified with jQuery and added test for nobm class to decide on margin removal
//Equalizing widgets in any widget area
var WdgtArea = document.getElementById(AreaId);
if (WdgtArea !== null) {
var noBotMargin = jQuery('#' + AreaId).hasClass('nobm'); //checks if the nobm class is present
var widget = jQuery("#" + AreaId + ' .' + WdgtClass);
//Enter monitoring of widget area
var WgtPos = -10000;
var Rows = 0; //initialise row number
var WdgtInRow = [];
for (var i = 1; i <= 20; ++i) {
WdgtInRow[i] = 0;
}
//counting rows and widgets
for (i = 0; i < widget.length; i++) {
if (widget[i].offsetTop !== WgtPos) { //if dif position, new row
Rows = Rows + 1;
WdgtInRow[Rows] = 1; //initialize number of widgets in row
} else {
WdgtInRow[Rows] = WdgtInRow[Rows] + 1; //increment Nb of widget in row
}
WgtPos = widget[i].offsetTop; //set current top position
}
//reset the min-height to measure true height
for (i = 0; i < widget.length; i++) {
widget[i].style.minHeight = "0px";
}
//Running equalization row by row
var EqWdgt = 0; //initialize how manu widgets have been done
var start, end;
for (i = 1; i < (Rows + 1); i++) {
var maxHeight = 0;
// Calculate the max-height
start = (0 + EqWdgt);
end = (WdgtInRow[i] + EqWdgt);
for (j = start; j < end; j++) {
if (widget[j].offsetHeight > maxHeight) {
maxHeight = widget[j].offsetHeight;
}
}
// Apply the new max height as min-height
start = (0 + EqWdgt);
end = (WdgtInRow[i] + EqWdgt);
for (j = start; j < end; j++) {
widget[j].style.minHeight = (maxHeight + 1) + "px";
widget[j].style.marginBottom = ""; //Remove the zero bot margin in case it was set previously
if (i == Rows) {
if (noBotMargin) {
widget[j].style.marginBottom = "0px"; //remove bottom margin if nobm class present
}
}
EqWdgt = EqWdgt + 1;
}
}
}
}
// full_browser_height
function weaverxBottomFooter() {
//This function will push the footer to the bottom of the browser by adjusting the container height
jQuery('#container').css('min-height', ""); //resetting min-height
var ContHeight = jQuery('#container').height(); //needs to exclude padding as min-height will too
var PFHeight = 0; //set default postfooter height at zero
if (jQuery('#inject_postfooter')) { //If there is a postfooter area get its height
PFHeight = jQuery('#inject_postfooter').outerHeight(true);
}
var BrowserHeight = jQuery(window).height(); //get browserÕs height
var WrapperBottom = jQuery('#wrapper').position().top + jQuery('#wrapper').outerHeight(true); //get bottom position of the wrapper
var EmptySpace = BrowserHeight - WrapperBottom - PFHeight; //calculate empty space
if (EmptySpace > 0) { //if empty space is positive, push the footer
//alert ('pushing footer');
ContHeight = ContHeight + EmptySpace; //New Container Height (only needed for Method A)
jQuery('#container').css('min-height', ContHeight + "px"); //Method A pushes the footer by extending the container height
}
}
// called when window resizes
function weaverxResizeEnd() {
jQuery(".fixedtop").wvrx_fixWvrxFixedTop(); // fix up the fixedtop areas
var Wa2Eq = jQuery(".widget-eq"); // getting all the containers with the widget-eq class
jQuery(function($) {
for (var i = 0; i < Wa2Eq.length; i++) {
weaverxWidgetEq('widget', Wa2Eq[i].id); // Execute weaverxWidgetEq on all widget areas with the widget-eq class
}
});
wvrxFlowColor(); // fix Color Flow - must go after the weaverxWidgetEq calls.
}
function weaverxBrowserResizeEnd() {
// New function for things that need to use the monitoring of the browser width with #wvrx-page-width
weaverxScrollbarClass(); // Fixup scroll bar width for expanded areas
if (jQuery('.wvrx-fullwidth,.wvrx-expand-full').length) { // Only start monitoring if the class is being used
weaverxFullWidth(); // run full width script
}
if ( typeof wvrxEndOpts !== 'undefined' && wvrxEndOpts.full_browser_height == '1')
weaverxBottomFooter(); // fix full height browser
if (typeof(weaverxUserOnResize) == 'function') // call user function if there
weaverxUserOnResize();
}
// Invoke scripts
function weaverx_js_update() {
// need to run weaverxResizeEnd and weaverxBrowserResizeEnd on doc ready for at least some browsers
// As of October, 2014, these included Safari, Desktop Opera, IE9, and IE8.
// For other browsers, it doesn't seem needed, but it is harmless to do it anyway.
weaverxBrowserResizeEnd();
weaverxResizeEnd();
if ( typeof wvrxEndOpts !== 'undefined' ) {
if (wvrxEndOpts.hideTip == '1') {
jQuery('a[title]').mouseover(function(e) {
var tip = jQuery(this).attr('title');
jQuery(this).attr('title', '');
}).mouseout(function() {
jQuery(this).attr('title', jQuery('.tipBody').html());
});
}
if (wvrxEndOpts.hFontFamily != '0') {
var ffamily = 'font-' + wvrxEndOpts.hFontFamily;
//alert('ffamily:' + ffamily);
jQuery('.entry-content h1').addClass(ffamily);
jQuery('.entry-content h2').addClass(ffamily);
jQuery('.entry-content h3').addClass(ffamily);
jQuery('.entry-content h4').addClass(ffamily);
jQuery('.entry-content h5').addClass(ffamily);
jQuery('.entry-content h6').addClass(ffamily);
}
if (wvrxEndOpts.hFontMult != 1) {
var mult = wvrxEndOpts.hFontMult;
// these values computed base on original h sizes times multipler determined in footer.php
jQuery('.entry-content h1').css('font-size', (2.25 * mult) + 'em');
jQuery('.entry-content h2').css('font-size', (1.875 * mult) + 'em');
jQuery('.entry-content h3').css('font-size', (1.5 * mult) + 'em');
jQuery('.entry-content h4').css('font-size', (1.125 * mult) + 'em');
jQuery('.entry-content h5').css('font-size', (1.0 * mult) + 'em');
jQuery('.entry-content h6').css('font-size', (0.875 * mult) + 'em');
}
}
// Target your #container, #wrapper etc
// if ( ! weaver_disable_fitvids ) // one possible solution to disabling FitVids via localize_script in functions.php
jQuery("#wrapper").fitVids();
jQuery("#branding").fitVids();
}
// Handle sizing of dynamic containers like Extra menus
//function to allow people to launch their own monitoring
function weaverxMonitorContent(class2Mon) {
// This function gather the ID of all containers with the given class and executes weaverResizeEnd
// (flow color and widgetEq) when they change size
var XtraMenuAc = jQuery(class2Mon); // getting all the containers with the given class
jQuery(function($) {
for (var i = 0; i < XtraMenuAc.length; i++) {
$('#' + XtraMenuAc[i].id).resizeX(weaverxResizeEnd); //launching monitoring using the ID of the container
}
});
}
jQuery(function($) { // wrapper for jQuery utils
$(document).ready(function() { // stuff to do on .ready
weaverx_js_update();
});
// add dynamic monitoring for these two functions
$('#wrapper').resizeX(weaverxResizeEnd);
$('#wvrx-page-width').resizeX(weaverxBrowserResizeEnd);
// Finds the extra menus using accordion type and launches resizeX using the extra menu container ID for monitoring
weaverxMonitorContent('.menu-type-accordion');
weaverxMonitorContent('.extra-menu-xplus.menu-type-standard'); // why was this here?
weaverxMonitorContent('.dynamic-content');
weaverxMonitorContent('.header-image'); // need this to handle slow loading header image
//---------------------------------------------------
//Fix On Scroll Script
//---------------------------------------------------
//V4.6 Fixed wvrx-fixedon scroll rules to remove any top margin when fixed
//V4.5 removed global vars, wrapped with $ self-invoking function, changed $ to $
//v4.4 added compatibility with any other fixed top areas
//V4.3 Fixed a few bugs on mixing mix of fixed and fixed on scroll
//V4.1 added compatibility with fixed menu
//v4 of fix on scroll
/* Default is Stick, no transition
To define a custom transition, add two CSS rules:
One with .wvrx-scrollfix-trans to define initial state and transition values
One with .wvrx-scrollfix-trans.wvrx-fixonscroll to define final transition state
For a drop add (no need for final top, this is done by the script)
.wvrx-scrollfix-trans {transition:top .3s ease;top:-50px;}
For a custom background color and height change add
.wvrx-menu-container {transition: background-color .5s ease, padding .5s ease;}
.wvrx-menu-container.wvrx-fixonscroll {background-color:rgba(100,200,200,.8);padding-top:10px;padding-bottom:10px;}
*/
//Primary Only
if ((wvrxOpts.primaryScroll == 'scroll-fix') && (wvrxOpts.secondaryScroll != 'scroll-fix') && ($('#nav-primary').length) ) {
$(window).scroll(function() {
var wvrxAdminOffset = 0; //initialize offset for admin bar
var wvrxFixedOffset = 0;
var primarySelector = "#nav-primary .wvrx-menu-container"; //Defines the primary selector
var primaryHeight = $(primarySelector).outerHeight(); //Gathers the primary height
// Get the height of the WP Admin bar if present.
if ($('.admin-bar').length) {
wvrxAdminOffset = $('#wpadminbar').outerHeight();
}
// Check if there are other fixed areas, if so add offset
$('.wvrx-fixedtop').each(function () {
wvrxFixedOffset = wvrxFixedOffset + $(this).outerHeight() - 1;
});
wvrxAdminOffset = wvrxAdminOffset + wvrxFixedOffset;
var windowScroll = $(window).scrollTop(); //Collects the amount of scroll
var primaryPos = $('#nav-primary').offset().top - parseFloat($('body').css('marginTop')) + wvrxFixedOffset;
if (primaryPos < (windowScroll + wvrxAdminOffset)) {
$(primarySelector).addClass('wvrx-fixonscroll'); //Fix primary
//$(primarySelector).css('margin-top',0); // Need to remove top margn, but fix is really in .wvrx-fixonscroll CSS rule
$('body').css('margin-top', primaryHeight + wvrxFixedOffset); //Add body ossfet to compensate for primary fix
$(primarySelector).css('top', wvrxAdminOffset + 'px'); //change primary top
} else {
$(primarySelector).removeClass('wvrx-fixonscroll'); //Unfix Primary
$('body').css('margin-top', wvrxFixedOffset); //Remove Body offset as nothing is fixed
$(primarySelector).css('top', ''); //remove primary top
}
});
}
//Secondary only
if ((wvrxOpts.secondaryScroll == 'scroll-fix') && (wvrxOpts.primaryScroll != 'scroll-fix') && ($('#nav-secondary').length) ) {
$(window).scroll(function() {
var wvrxAdminOffset = 0; //initialize offset for admin bar
var wvrxFixedOffset = 0;
var secondarySelector = "#nav-secondary .wvrx-menu-container"; //Defines the secondary selector
var secondaryHeight = $(secondarySelector).outerHeight(); //Gathers the secondary height
// Get the height of the WP Admin bar if present.
if ($('.admin-bar').length) {
wvrxAdminOffset = $('#wpadminbar').outerHeight();
}
// Check if there are other fixed areas, if so add offset
$('.wvrx-fixedtop').each(function () {
wvrxFixedOffset = wvrxFixedOffset + $(this).outerHeight();
});
wvrxAdminOffset = wvrxAdminOffset + wvrxFixedOffset;
var windowScroll = $(window).scrollTop(); //Collects the amount of scroll
var secondaryPos = $('#nav-secondary').offset().top - parseFloat($('body').css('marginTop')) + wvrxFixedOffset;
if (secondaryPos < (windowScroll + wvrxAdminOffset)) {
$(secondarySelector).addClass('wvrx-fixonscroll'); //Fix secondary
$('body').css('margin-top', secondaryHeight + wvrxFixedOffset); //Add top margin to account for fixed secondary
$(secondarySelector).css('top', wvrxAdminOffset + 'px'); //Set secondary top
} else {
$(secondarySelector).removeClass('wvrx-fixonscroll'); //Unfix Secondary
$('body').css('margin-top', wvrxFixedOffset); //Remove body offset
$(secondarySelector).css('top', ''); //remove secondary top
}
});
}
//Primary & Secondary fixed
if ((wvrxOpts.primaryScroll == 'scroll-fix') && (wvrxOpts.secondaryScroll == 'scroll-fix')
&& ($('#nav-primary').length) && ($('#nav-secondary').length) ) {
//Scrool loop
$(window).scroll(function() {
var wvrxAdminOffset = 0; //initialize offset for admin bar
var wvrxFixedOffset = 0; //iniialize offset for fixed elemenst
var secondarySelector = "#nav-secondary .wvrx-menu-container"; //Defines the secondary selector
var secondaryHeight = $(secondarySelector).outerHeight(); //Gathers the secondary height
var primarySelector = "#nav-primary .wvrx-menu-container"; //Defines the primary selector
var primaryHeight = $(primarySelector).outerHeight(); //Gathers the primary height
// Set adjustement for the admin bar. May be able to move out of the scroll loop when inded the weaverjs
if ($('.admin-bar').length) {
wvrxAdminOffset = $('#wpadminbar').outerHeight();
}
// Check if other area are fixed, if so compute and offset
$('.wvrx-fixedtop').each(function () {
wvrxFixedOffset = wvrxFixedOffset + $(this).outerHeight();
});
wvrxAdminOffset = wvrxAdminOffset + wvrxFixedOffset;
var windowScroll = $(window).scrollTop(); //Collects the amount of scroll
//use parent container for position as when menu gets fixed its position changes
var secondaryPos = $('#nav-secondary').offset().top - parseFloat($('body').css('marginTop')) + wvrxFixedOffset;
var primaryPos = $('#nav-primary').offset().top - (parseFloat($('body').css('marginTop')) - secondaryHeight) + wvrxFixedOffset;
//need 3 stages before second is fixed - before first fixed too - after that
//Before secondary is fixed
if (secondaryPos > (windowScroll + wvrxAdminOffset)) {
$(secondarySelector).removeClass('wvrx-fixonscroll'); //Unfix secondary
$(primarySelector).removeClass('wvrx-fixonscroll'); //Unfix primary
$('body').css('margin-top', wvrxFixedOffset); //clear body offset as nothing is fixed
$(primarySelector).css('top', ''); //remove top on primary
$(secondarySelector).css('top', ''); //remove top on secondary if admin bar
}
//after secondary is fixed but before primary gets fixed
if ((secondaryPos <= (windowScroll + wvrxAdminOffset)) && (primaryPos > (windowScroll + secondaryHeight + wvrxAdminOffset))) { //use parent container position
$(secondarySelector).addClass('wvrx-fixonscroll'); //Fix secondary
$('body').css('margin-top', secondaryHeight + wvrxFixedOffset); //Set body offset to account for fixed secondary
$(primarySelector).removeClass('wvrx-fixonscroll'); //Unfix primary
$(primarySelector).css('top', ''); //remove top on primary
$(secondarySelector).css('top', wvrxAdminOffset + 'px'); //change secondary top
}
//after primary is fixed
if (primaryPos <= (windowScroll + secondaryHeight + wvrxAdminOffset)) {
$(primarySelector).addClass('wvrx-fixonscroll'); //fix primary
$(secondarySelector).addClass('wvrx-fixonscroll'); //fix secondary
$('body').css('margin-top', secondaryHeight + primaryHeight + wvrxFixedOffset); //Set body offset to account for fixed primary & secondary
$(primarySelector).css('top', (secondaryHeight + wvrxAdminOffset) + 'px'); //change primary top
$(secondarySelector).css('top', wvrxAdminOffset + 'px'); //change secondary top
}
});
}
});