????

Your IP : 216.73.216.174


Current Path : /home2/morganrand/www/wp-content/themes/wanderfuls-2/js/
Upload File :
Current File : /home2/morganrand/www/wp-content/themes/wanderfuls-2/js/functions.js

/**
 * Project: Wanderfuls WordPress Theme
 * Description: Initialize all scripts and add custom js
 * Author: TechBooth
 * Theme URI: http://www.techbooth.in
 * Author URI: http://www.techbooth.in
 * License: Custom
 * License URI: http://themeforest.net/licenses
 * Version: 3.0.0
 */
 

( function( $ ) {
	'use strict';

	var tbTheme = {

		/**
		 * Main init function
		 *
		 * @since 2.0.0
		 */
		init: function() {
			this.config();
			this.bindEvents();
		},

		/**
		 * Cache Elements
		 *
		 * @since 2.0.0
		 */
		config: function() {

			this.config = {
				$window                 : $( window ),
				$document               : $( document ),
				$windowWidth            : $( window ).width(),
				$windowHeight           : $( window ).height(),
				$windowTop              : $( window ).scrollTop(),
				$body                   : $( 'body' ),
				$mobileMenuBreakpoint   : 960,
				$siteHeader             : null,
				$siteHeaderHeight       : 0,
				$siteHeaderTop          : 0,
				$siteHeaderBottom       : 0,
				$siteLogo               : null,
				$siteLogoHeight         : 0,
				$siteLogoSrc            : null,
				$siteNavWrap            : null,
				$localScrollOffset      : 0,
				$localScrollSpeed       : 600,
				$localScrollArray       : [],
				$mobileMenuStyle        : null,
				$footerReveal           : false,
				$hasTopBar              : false,
				$hasHeaderOverlay       : false,
				$hasStickyHeader        : false,
				$stickyHeaderBreakPoint : 960,
				$hasStickyMobileHeader  : false,
				$hasStickyTopBar        : false,
				$stickyTopBar           : null,
				$stickyTopBarHeight     : 0,
				$is_rtl                 : false,
				$retinaLogo             : null,
				$isMobile               : false,
				$verticalHeaderActive   : false,
			};

		},

		/**
		 * Bind Events
		 *
		 * @since 2.0.0
		 */
		bindEvents: function() {
			var self = this;

			// Run on document ready
			self.config.$document.on( 'ready', function() {
				self.initUpdateConfig();
				self.pageAnimations();
				self.superFish();
				self.megaMenusWidth();
				self.mobileMenu();
				self.navNoClick();
				self.hideEditLink();
				self.customMenuWidgetAccordion();
				self.inlineHeaderLogo();
				self.menuSearch();
				self.headerCart();
				self.backTopLink();
				self.smoothCommentScroll();
				self.tipsyTooltips();
				self.customHovers();
				self.toggleBar();
				self.localScrollLinks();
				self.customSelects();
				self.skillbar();
				self.milestone();
				self.owlCarousel();
				self.archiveMasonryGrids();
				self.iLightbox();
				self.wooSelects();
				self.footerRevealLoadShow();
				self.overlayHovers();
				self.isotopeGrids();
			} );

			// Run on Window Load
			self.config.$window.on( 'load', function() {

				// Functions
				self.windowLoadUpdateConfig();
				self.megaMenusTop();
				self.flushDropdownsTop();
				self.equalHeights();
				self.footerRevealMainMargin();
				self.overlayHeaderTopWrapPadding();
				self.fadeIn();
				self.parallax();
				self.cartSearchDropdownsRelocate();
				self.sliderPro();

				// Delay functions if page animations are enabled
				if ( $.fn.animsition && tbLocalize.pageAnimation && tbLocalize.pageAnimationInDuration ) {
					setTimeout( function() {
						self.stickyTopBar();
						self.stickyHeader();
					}, tbLocalize.pageAnimationInDuration );
				} else {
					self.stickyTopBar();
					self.stickyHeader();
				}

				// Shrink header
				self.stickyHeaderShrink();

				// Scroll to hash
				window.setTimeout( function() {
					self.scrollToHash( self )
				}, 500 );

				// Scroll to links on hashchange
				self.config.$window.on( 'hashchange', function() {
					self.scrollToHash( self );
				} );

			} );

			// Run on "Smart" Window Resize
			self.config.$window.resize( function() {
				if ( self.config.$window.width() != self.config.$windowWidth ) {
					self.resizeUpdateConfig();
					self.megaMenusWidth();
					self.overlayHeaderTopWrapPadding();
					self.inlineHeaderLogo();
				}
			} );

			// Run on Scroll
			self.config.$window.scroll( function() {
				self.config.$windowTop = self.config.$window.scrollTop();
				self.localScrollHighlight();
				self.footerRevealScrollShow();
			} );

			// On orientation change
			self.config.$window.on( 'orientationchange',function() {
				self.resizeUpdateConfig();
				self.isotopeGrids();
				self.archiveMasonryGrids();
				self.inlineHeaderLogo();
			} );

			// On Document click
			self.config.$document.click( function() {
				$( '#searchform-dropdown, #searchform-header-replace' ).removeClass( 'show' );
				$( 'a.search-dropdown-toggle' ).parent( 'li' ).removeClass( 'active' );
				$( '#toggle-bar-wrap' ).removeClass( 'active-bar' );
				var $toggle = $( 'a.toggle-bar-btn' );
				if ( $toggle.length !== 0 ) {
					$toggle.children( '.fa' ).removeClass( $toggle.data( 'icon-hover' ) ).addClass( $toggle.data( 'icon' ) );
				}
			} );

		},

		/**
		 * Updates config on doc ready
		 *
		 * @since 3.0.0
		 */
		initUpdateConfig: function() {

			// Mobile check
			this.config.$isMobile = this.mobileCheck();

			// Local scroll speed
			if ( tbLocalize.localScrollSpeed ) {
				this.config.$localScrollSpeed = parseInt( tbLocalize.localScrollSpeed );
			}

			// Define header
			if ( $( '#site-header' ).length ) {
				this.config.$siteHeader = $( '#site-header' );
			}

			// Define logo
			if ( $( '#site-logo img' ).length ) {
				this.config.$siteLogo = $( '#site-logo img' );
				this.config.$siteLogoSrc = this.config.$siteLogo.attr( 'src' );
			}

			// Site nav wrap
			if ( $( '#site-navigation-wrap' ).length ) {
				this.config.$siteNavWrap = $( '#site-navigation-wrap' );
			}

			// Mobile menu style
			if ( $( '#site-navigation-wrap' ).length ) {
				this.config.$mobileMenuStyle = tbLocalize.mobileMenuStyle;
			}

			// Define local scrolling links
			this.config.$localScrollArray = this.localScrollLinksArray();
			
			// Footer reveal
			if ( $( '.footer-reveal' ).length && $( '#wrap' ).length && $( '#main' ).length ) {
				this.config.$footerReveal = true;
			}

			// Header overlay
			if ( this.config.$siteHeader && this.config.$siteHeader.hasClass( 'fix-overlay-header' ) ) {
				this.config.$hasHeaderOverlay = true;
			}

			// RTL
			if ( tbLocalize.isRTL ) {
				this.config.$isRTL = true;
			}

			// Top bar enabled
			if ( $( '#top-bar-wrap' ).length ) {
				this.config.$hasTopBar = true;
				if ( $( '#top-bar-wrap' ).hasClass( 'tb-top-bar-sticky' ) ) {
					this.config.$stickyTopBar = $( '#top-bar-wrap' );
				}
			}

			// Local scroll speed
			if ( tbLocalize.localScrollSpeed ) {
				this.config.localScrollSpeed = parseInt( tbLocalize.localScrollSpeed );
			}

			// Sticky TopBar Init
			if ( this.config.$stickyTopBar ) {
				if ( tbLocalize.hasStickyTopBarMobile || ( this.config.$windowWidth >= tbLocalize.stickyTopBarBreakPoint ) ) {
					this.config.$hasStickyTopBar = true;
				} else {
					this.config.$hasStickyTopBar = false;
				}
			}

			// Check if sticky is enabled for mobile
			this.config.$hasStickyMobileHeader = tbLocalize.hasStickyMobileHeader;

			// Sticky Header
			if ( tbLocalize.hasStickyHeader ) {
				if ( tbLocalize.stickyHeaderBreakPoint ) {
					this.config.$stickyHeaderBreakPoint = tbLocalize.stickyHeaderBreakPoint;
				}
				if ( this.config.$hasStickyMobileHeader || ( this.config.$windowWidth >= this.config.$stickyHeaderBreakPoint ) ) {
					this.config.$hasStickyHeader = true;
				} else {
					this.config.$hasStickyHeader = false;
				}
			}

			// Retina logo
			if ( typeof $tbRetinaLogo !== 'undefined' && window.devicePixelRatio >= 2 ) {
				this.config.retinaLogo = $tbRetinaLogo;
			}

			// Disable Sticky header on mobile for toggle style mobile menu
			if ( 'toggle' == this.config.$mobileMenuStyle ) {
				this.config.$hasStickyMobileHeader = false;
			}

			// Vertical header
			if ( this.config.$body.hasClass( 'tb-has-vertical-header' ) ) {
				this.config.$verticalHeaderActive = true;
			}

			// Remove active class from has-scroll links
			var $links = $( '.dropdown-menu a' );
			$links.each( function() {
				var $this = $( this ),
					$ref = $this.attr( 'href' );
					if ( $ref ) {
						if ( $ref.indexOf( 'localscroll-' ) != -1 ) {
							$this.parent( 'li.current-menu-item' ).removeClass( 'current-menu-item' );
						}
					}
			} );

		},

		/**
		 * Updates config on window load
		 *
		 * @since 3.0.0
		 */
		windowLoadUpdateConfig: function() {

			// Header bottom position
			if ( this.config.$siteHeader ) {
				var $siteHeaderTop = this.config.$siteHeader.offset().top;
				this.config.$windowHeight = this.config.$window.height();
				this.config.$siteHeaderHeight = this.config.$siteHeader.outerHeight();
				this.config.$siteHeaderBottom = $siteHeaderTop + this.config.$siteHeaderHeight;
				this.config.$siteHeaderTop = $siteHeaderTop;
				if ( this.config.$siteLogo ) {
					this.config.$siteLogoHeight = this.config.$siteLogo.height();
				}
			}

			/* Window height must be larger then the height plus header height
			if ( this.config.$document.height() < ( this.config.$windowHeight + this.config.$siteHeaderBottom ) ) {
				this.config.$hasStickyHeader = false;
			}*/

			// Add Local scroll offset based on header height
			this.config.$localScrollOffset = this.parseLocalScrollOffset();

		},

		/**
		 * Updates config whenever the window is resized
		 *
		 * @since 3.0.0
		 */
		resizeUpdateConfig: function() {

			// Update main configs
			this.config.$windowHeight = this.config.$window.height();
			this.config.$windowWidth = this.config.$window.width();
			this.config.$windowTop = this.config.$window.scrollTop();

			// Update header height
			if ( this.config.$siteHeader ) {

				// reset sticky height
				if ( $( '.tb-sticky-header-holder' ).length ) {
					$( '.tb-sticky-header-holder' ).height( '' );
				}

				// Get header height
				this.config.$siteHeaderHeight = this.config.$siteHeader.outerHeight();

				// Re add sticky height
				if ( $( '.tb-sticky-header-holder' ).length ) {
					$( '.tb-sticky-header-holder' ).height( this.config.$siteHeaderHeight );
				}

			}

			// Vertical Header
			if (  this.config.$windowWidth < 960 ) {
				this.config.$verticalHeaderActive = false;
			} else if ( this.config.$body.hasClass( 'tb-has-vertical-header' ) ) {
				this.config.$verticalHeaderActive = true;
			}

			// Update Topbar sticky height
			if ( this.config.$stickyTopBar ) {
				this.config.$stickyTopBarHeight = this.config.$stickyTopBar.outerHeight();
				$( '.tb-sticky-top-bar-holder' ).height( this.config.$stickyTopBarHeight );
			}

			// Re-stick topbar but check for mobile first
			if ( this.config.$hasStickyTopBar ) {

				// Unstick first
				this.stickyTopBar( 'unstick' );

				// Desktops or mobile enabled
				if ( tbLocalize.hasStickyTopBarMobile || ( this.config.$windowWidth >= tbLocalize.stickyTopBarBreakPoint ) ) {
					this.config.$hasStickyTopBar = true;
					this.stickyTopBar();
				}

				// Mobile
				else if ( ! tbLocalize.hasStickyTopBarMobile ) {
					this.config.$hasStickyTopBar = false;
				}

			}

			// Sticky Header (MUST CHECK tbLocalize.hasStickyHeader )
			if ( tbLocalize.hasStickyHeader ) {

				// Unstick first
				this.stickyHeader( 'unstick' );
				this.stickyHeaderShrink( 'destroy' );

				// Desktops
				if ( this.config.$hasStickyMobileHeader || ( this.config.$windowWidth >= tbLocalize.stickyHeaderBreakPoint ) ) {
					this.config.$hasStickyHeader = true;
					this.stickyHeader();
					this.stickyHeaderShrink();
				}

				// Mobile
				else if ( ! this.config.$hasStickyMobileHeader ) {
					this.config.$hasStickyHeader = false;
				}

			}

			// Local scroll offset => update last
			this.config.$localScrollOffset = this.parseLocalScrollOffset();

		},

		/**
		 * Mobile Check
		 *
		 * @since 2.1.0
		 */
		mobileCheck: function() {
			if ( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( navigator.userAgent ) ) {
				this.config.$body.addClass( 'tb-is-mobile-device' );
				return true;
			}
		},

		/**
		 * Page Animations
		 *
		 * @since 2.1.0
		 */
		pageAnimations: function() {

			if ( ! $.fn.animsition ) {
				return;
			}

			// Return if wrapper doesn't exist
			if ( ! tbLocalize.pageAnimation ) {
				return;
			}

			// Run animsition
			$( '.animsition' ).animsition( {
				touchSupport: false,
				inClass: tbLocalize.pageAnimationIn,
				outClass: tbLocalize.pageAnimationOut,
				inDuration: tbLocalize.pageAnimationInDuration,
				outDuration: tbLocalize.pageAnimationOutDuration,
				linkElement: 'a[href]:not([target="_blank"]):not([href^="#"]):not([href*="javascript"]):not([href*=".jpg"]):not([href*=".jpeg"]):not([href*=".gif"]):not([href*=".png"]):not([href*=".mov"]):not([href*=".swf"]):not([href*=".mp4"]):not([href*=".flv"]):not([href*=".avi"]):not([href*=".mp3"]):not([href^="mailto:"]):not([href*="?"]):not([href*="#localscroll"]):not([class="wcmenucart"])',
				loading: true
			} );

		},

		/**
		 * Superfish menus
		 *
		 * @since 2.0.0
		 */
		superFish: function() {

			if ( ! $.fn.superfish ) {
				return;
			}

			$( '#site-navigation ul.sf-menu' ).superfish( {
				delay: tbLocalize.superfishDelay,
				animation: {
					opacity: 'show'
				},
				animationOut: {
					opacity: 'hide'
				},
				speed: tbLocalize.superfishSpeed,
				speedOut: tbLocalize.superfishSpeedOut,
				cssArrows: false,
				disableHI: false
			} );


		},

		 /**
		 * MegaMenus Width
		 *
		 * @since 2.0.0
		 */
		megaMenusWidth: function() {

			if ( ! this.config.$siteHeader || tbLocalize.siteHeaderStyle !== 'one' ) {
				return;
			}

			var $siteNavigationWrap         = $( '#site-navigation-wrap' ),
				$headerContainerWidth       = this.config.$siteHeader.find( '.container' ).outerWidth(),
				$navWrapWidth               = $siteNavigationWrap.outerWidth(),
				$siteNavigationWrapPosition = $siteNavigationWrap.css( 'right' ),
				$siteNavigationWrapPosition = parseInt( $siteNavigationWrapPosition );

			if ( 'auto' == $siteNavigationWrapPosition ) {
				$siteNavigationWrapPosition = 0;
			}

			var $megaMenuNegativeMargin = $headerContainerWidth-$navWrapWidth-$siteNavigationWrapPosition;

			$( '#site-navigation-wrap .megamenu > ul' ).css( {
				'width': $headerContainerWidth,
				'margin-left': -$megaMenuNegativeMargin
			} );

		},

		/**
		 * MegaMenus Top Position
		 *
		 * @since 2.0.0
		 */
		megaMenusTop: function() {

			if ( ! this.config.$siteHeaderHeight
				|| ! this.config.$siteNavWrap
				|| ! this.config.$siteHeader.hasClass( 'header-one' )
				|| $( '#site-navigation-wrap' ).hasClass( 'tb-flush-dropdowns' )
				|| ! this.config.$siteHeader.hasClass( 'header-one' )
			) {
				return;
			}

			var $navHeight = this.config.$siteNavWrap.outerHeight(),
				$megaMenuTop = this.config.$siteHeaderHeight - $navHeight;

			$( '#site-navigation-wrap .megamenu > ul' ).css( {
				'top': $megaMenuTop/2 + $navHeight
			} );

		},

		/**
		 * FlushDropdowns top positioning
		 *
		 * @since 2.0.0
		 */
		flushDropdownsTop: function() {

			if ( ! this.config.$siteHeaderHeight
				|| ! this.config.$siteNavWrap
				|| ! this.config.$siteNavWrap.hasClass( 'tb-flush-dropdowns' )
			) {
				return;
			}

			var $navHeight = this.config.$siteNavWrap.outerHeight(),
				$dropTop = this.config.$siteHeaderHeight - $navHeight;

			$( '#site-navigation-wrap .dropdown-menu > .menu-item-has-children > ul' ).css( {
				'top': $dropTop/2 + $navHeight
			} );

		},

		/**
		 * Mobile Menu
		 *
		 * @since 2.0.0
		 */
		mobileMenu: function( event ) {

			var self = this;

			// Sidr
			if ( 'sidr' == this.config.$mobileMenuStyle && typeof tbLocalize.sidrSource !== 'undefined' ) {

				var self = this;

				// Add sidr
				$( 'a.mobile-menu-toggle, li.mobile-menu-toggle > a' ).sidr( {
					name: 'sidr-main',
					source: tbLocalize.sidrSource,
					side: tbLocalize.sidrSide,
					displace: tbLocalize.sidrDisplace,
					speed: parseInt( tbLocalize.sidrSpeed ),
					renaming: true,
					onOpen: function( name ) {

						// Prevent body scroll
						self.config.$body.addClass( 'tb-noscroll' );

						// Declare useful vars
						var $hasChildren = $( '.sidr-class-menu-item-has-children' );

						// Add dropdown toggle (arrow)
						$hasChildren.children( 'a' ).append( '<span class="sidr-class-dropdown-toggle"></span>' );

						// Toggle dropdowns
						$( '.sidr-class-dropdown-toggle' ).on( self.config.$isMobile ? 'touchstart' : 'click', function( event ) {
							var $toggleParentLink = $( this ).parent( 'a' ),
								$toggleParentLi = $toggleParentLink.parent( 'li' ),
								$allParentLis = $toggleParentLi.parents( 'li' ),
								$dropdown = $toggleParentLi.children( 'ul' );
							if ( ! $toggleParentLi.hasClass( 'active' ) ) {
								$hasChildren.not( $allParentLis ).removeClass( 'active' ).children( 'ul' ).slideUp( 'fast' );
								$toggleParentLi.addClass( 'active' ).children( 'ul' ).slideDown( 'fast' );
							} else {
								$toggleParentLi.removeClass( 'active' ).children( 'ul' ).slideUp( 'fast' );
							}
							return false;
						} );

						// Add dark overlay to content
						self.config.$body.append( '<div class="tb-sidr-overlay tb-hidden"></div>' );
						$( '.tb-sidr-overlay' ).fadeIn( tbLocalize.sidrSpeed );

						// Bind scroll
						$( '#sidr-main' ).bind( 'mousewheel DOMMouseScroll', function ( e ) {
							var e0 = e.originalEvent,
								delta = e0.wheelDelta || -e0.detail;
							this.scrollTop += ( delta < 0 ? 1 : -1 ) * 30;
							e.preventDefault();
						} );

						// Close sidr when clicking toggle
						$( 'a.sidr-class-toggle-sidr-close' ).on( self.config.$isMobile ? 'touchstart' : 'click', function( event ) {
							$.sidr( 'close', 'sidr-main' );
							return false;
						} );

						// Close sidr when clicking on overlay
						$( '.tb-sidr-overlay' ).on( self.config.$isMobile ? 'touchstart' : 'click', function( event ) {
							$.sidr( 'close', 'sidr-main' );
							return false;
						} );

						// Close on resize
						self.config.$window.resize( function() {
							if ( self.config.$windowWidth >= self.config.$mobileMenuBreakpoint ) {
								$.sidr( 'close', 'sidr-main' );
							}
						} );

					},
					onClose : function( name ) {

						// Allow body scroll
						self.config.$body.removeClass( 'tb-noscroll' );

						// Remove active dropdowns
						$( '.sidr-class-menu-item-has-children.active' ).removeClass( 'active' ).children( 'ul' ).hide();
						
						// FadeOut overlay
						$( '.tb-sidr-overlay' ).fadeOut( tbLocalize.sidrSpeed, function() {
							$( this ).remove();
						} );
					}

				} );

				// Close when clicking local scroll link
				$( 'li.sidr-class-local-scroll > a' ).click( function() {
					var $target = $( this.hash );
					$.sidr( 'close', 'sidr-main' );
					self.scrollTo( $target );
					return false;
				} );

			}

			// Toggle
			else if ( 'toggle' == this.config.$mobileMenuStyle && this.config.$siteHeader ) {

				// Insert nav
				if ( $( '#tb-mobile-menu-fixed-top' ).length ) {
					$( '#tb-mobile-menu-fixed-top' ).append( '<nav class="mobile-toggle-nav clr"></nav>' );
				} else {
					$( '<nav class="mobile-toggle-nav clr"></nav>' ).insertAfter( this.config.$siteHeader );
				}

				// Grab all content from menu and add into mobile-toggle-nav element
				if ( $( '#mobile-menu-alternative' ).length ) {
					var mobileMenuContents = $( '#mobile-menu-alternative .dropdown-menu' ).html();
				} else {
					var mobileMenuContents = $( '#site-navigation .dropdown-menu' ).html();
				}
				$( '.mobile-toggle-nav' ).html( '<ul class="mobile-toggle-nav-ul">' + mobileMenuContents + '</ul>' );

				// Remove all styles
				$( '.mobile-toggle-nav-ul, .mobile-toggle-nav-ul *' ).children().each( function() {
					var attributes = this.attributes;
					$( this ).removeAttr( 'style' );
				} );

				// Add classes where needed
				$( '.mobile-toggle-nav-ul' ).addClass( 'container' );

				// Show/Hide
				$( '.mobile-menu-toggle' ).on( self.config.$isMobile ? 'touchstart' : 'click', function( event ) {
					if ( tbLocalize.animateMobileToggle ) {
						$( '.mobile-toggle-nav' ).slideToggle( 'fast' ).toggleClass( 'visible' );
					} else {
						$( '.mobile-toggle-nav' ).toggle().toggleClass( 'visible' );
					}
					return false;
				} );

				// Close on resize
				self.config.$window.resize( function() {
					if ( self.config.$windowWidth >= self.config.$mobileMenuBreakpoint && $( '.mobile-toggle-nav' ).length ) {
						$( '.mobile-toggle-nav' ).hide().removeClass( 'visible' );
					}
				} );

				// Add search => not sure if I want to add yet...todo?
				// $( '.mobile-toggle-nav' ).append( $( '#mobile-menu-search' ) );
			}

			// Full-screen overlay
			else if ( 'full_screen' == this.config.$mobileMenuStyle && this.config.$siteHeader ) {

				// Style
				var $style = tbLocalize.fullScreenMobileMenuStyle ? tbLocalize.fullScreenMobileMenuStyle : false;

				// Insert new nav
				self.config.$body.append( '<div class="full-screen-overlay-nav clr '+ $style +'"><span class="full-screen-overlay-nav-close"></span><nav class="full-screen-overlay-nav-ul-wrapper"><ul class="full-screen-overlay-nav-ul"></ul></nav></div>' );

				// Grab all content from menu and add into mobile-toggle-nav element
				if ( $( '#mobile-menu-alternative' ).length ) {
					var mobileMenuContents = $( '#mobile-menu-alternative .dropdown-menu' ).html();
				} else {
					var mobileMenuContents = $( '#site-navigation .dropdown-menu' ).html();
				}
				$( '.full-screen-overlay-nav-ul' ).html( mobileMenuContents );

				// Remove all styles
				$( '.full-screen-overlay-nav, .full-screen-overlay-nav *' ).children().each( function() {
					var attributes = this.attributes;
					$( this ).removeAttr( 'style' );
				} );

				// Show
				$( '.mobile-menu-toggle' ).on( self.config.$isMobile ? 'touchstart' : 'click', function( event ) {
					$( '.full-screen-overlay-nav' ).addClass( 'visible' );
					self.config.$body.addClass( 'tb-noscroll' );
					return false;
				} );

				// Hide
				$( '.full-screen-overlay-nav-close' ).on( self.config.$isMobile ? 'touchstart' : 'click', function( event ) {
					$( '.full-screen-overlay-nav' ).removeClass( 'visible' );
					self.config.$body.removeClass( 'tb-noscroll' );
					return false;
				} );

			}

		},

		/**
		 * Prevent clickin on links
		 *
		 * @since 2.0.0
		 */
		navNoClick: function() {
			$( 'li.nav-no-click > a, li.sidr-class-nav-no-click > a' ).live( 'click', function() {
				return false;
			} );
		},

		/**
		 * Sticky Topbar
		 *
		 * @since 3.0.0
		 */
		stickyTopBar: function( event ) {

			// Return if no topbar
			if ( ! this.config.$hasTopBar
				|| ! this.config.$hasStickyTopBar
				|| ! this.config.$stickyTopBar
			) {
				return;
			}

			// Declare vars
			var self = this;

			// Unstick the topbar
			if ( 'unstick' == event && $( '.tb-sticky-top-bar-holder' ).length ) {

				// Unstick
				self.config.$stickyTopBar.unstick();

				// Reset topbar height
				self.config.$stickyTopBarHeight = $( '#top-bar-wrap' ).outerHeight();

				// Reset holder height
				$( '.tb-sticky-top-bar-holder' ).height( '' );

				// Return
				return;

			}
			
			// Stick the TopBar
			if ( self.config.$hasStickyTopBar && ! $( '.tb-sticky-top-bar-holder' ).length ) {

				// Offset the fixed mobile nav
				var $mobileMenu = $( '#tb-mobile-menu-fixed-top' );
				if ( $mobileMenu.is( ':visible' ) ) {
					var $topSpacing = $mobileMenu.outerHeight();
				} else {
					var $topSpacing = 0;
				}

				self.config.$stickyTopBar.sticky( {
					topSpacing: $topSpacing,
					getWidthFrom: '#wrap',
					responsiveWidth: true,
					wrapperClassName: 'tb-sticky-top-bar-holder'
				} );

				// Add topbar height to sticky wrapper
				self.config.$stickyTopBar.on( 'sticky-start', function() {
					$( '.tb-sticky-top-bar-holder' ).height( self.config.$stickyTopBar.outerHeight() );
				} );

			}

		},

		/**
		 * Sticky Header
		 *
		 * @since 2.0.0
		 */
		stickyHeader: function( event ) {

			var self = this,
				$fixedNav = $( '.fixed-nav' ),
				$topSpacing = 0,
				$mobileMenu = $( '#tb-mobile-menu-fixed-top' );

			// Descroty sticky and sticky functions
			if ( 'unstick' == event ) {

				if ( $( '.tb-sticky-header-holder' ).length ) {

					// Destroy shrink header
					self.stickyHeaderShrink( 'resize_destroy' );

					// Destroy sticky header
					$( '#site-header.fixed-scroll' ).unstick();

					// Set correct header height
					$( '.tb-sticky-header-holder' ).css( 'height', '' );

					// Return correct logo
					var $logo = self.config.retinaLogo ? self.config.retinaLogo : self.config.$siteLogoSrc;
					if ( $logo ) {
						self.config.$siteLogo.attr( 'src', $logo );
					}

				}

				if ( $( '.tb-sticky-menu-holder' ).length ) {
					$( '.fixed-nav' ).unstick();
				}

			}

			// Add Sticky
			else {

				// Sticky is disabled do nothing or header doesn't exist...return
				if ( ! this.config.$siteHeader
					|| ! this.config.$hasStickyHeader
				) {
				   return;
				}

				if ( self.config.$hasStickyTopBar ) {
					$topSpacing = $topSpacing + self.config.$stickyTopBar.outerHeight()
				}
				if ( $mobileMenu.is( ':visible' ) ) {
					$topSpacing = $topSpacing + $mobileMenu.outerHeight();
				}

				// Already sticky do nothing
				if ( $( '.tb-sticky-header-holder' ).length ) {
					return;
				}

				// Sticky header
				if ( self.config.$siteHeader.hasClass( 'fixed-scroll' ) ) {

					// Start sticky
					self.config.$siteHeader.sticky( {
						topSpacing: $topSpacing,
						getWidthFrom: '#wrap',
						responsiveWidth: true,
						wrapperClassName: 'tb-sticky-header-holder'
					} );

					// Set header height
					$( '.tb-sticky-header-holder' ).height( self.config.$siteHeaderHeight );

					// Sticky on start events
					self.config.$siteHeader.on( 'sticky-start', function() {

						// Sticky custom logo
						if ( self.config.$siteLogo
							&& tbLocalize.stickyheaderCustomLogo
							&& ! self.config.$siteHeader.hasClass( 'tb-shrink-sticky-header' )
						) {
							self.config.$siteLogo.attr( 'src', tbLocalize.stickyheaderCustomLogo );
						}

					} );

					// Sticky on end events
					self.config.$siteHeader.on( 'sticky-end', function() {

						// Return correct logo
						if ( ! self.config.$siteHeader.hasClass( 'tb-shrink-sticky-header' ) ) {
							var $logo = self.config.retinaLogo ? self.config.retinaLogo : self.config.$siteLogoSrc;
							if ( $logo ) {
								self.config.$siteLogo.attr( 'src', $logo );
							}
						}

					} );

				} 

				// Sticky nav
				else if ( $fixedNav.length ) {

					$fixedNav.sticky( {
						topSpacing: $topSpacing,
						getWidthFrom: '#wrap',
						responsiveWidth: true,
						wrapperClassName: 'tb-sticky-menu-holder'
					} );

					// Sticky on start events
					$fixedNav.on( 'sticky-start', function() {
						$( '.tb-sticky-menu-holder' ).height( $fixedNav.outerHeight() );
					} );

				}

			}

		},

		/**
		 * Shrink sticky header
		 *
		 * @since 2.0.0
		 */
		stickyHeaderShrink: function( event ) {

			// Initial checks
			if ( ! this.config.$siteHeader
				|| ! this.config.$siteHeader.hasClass( 'tb-shrink-sticky-header' )
				|| ! $( '.tb-sticky-header-holder' ).length
			) {
				return;
			}

			// Declare main vars
			var self = this,
				$siteHeaderInner = $( '#site-header-inner' ),
				$ogTopPadding = $( '#site-header-inner' ).css( 'padding-top' ),
				$ogBottomPadding = $( '#site-header-inner' ).css( 'padding-bottom' ),
				$ogHeight = $siteHeaderInner.outerHeight(),
				$shrunkHeight = 70,
				$shrunkHeightLogo = parseInt( tbLocalize.shrinkHeaderLogoHeight ),
				$shrunkSpeed = 300;

			// Destroy method
			function destroy() {

				if ( self.config.$siteHeader.hasClass( 'tb-header-shrunk' ) ) {

					// Reset header height
					$siteHeaderInner.stop(true,true).animate( {
						'height': $ogHeight,
						'padding-top': $ogTopPadding,
						'padding-bottom': $ogBottomPadding
					}, {
						duration: $shrunkSpeed,
						queue: false
					} );

					// Reset logo
					var $logo = self.config.retinaLogo ? self.config.retinaLogo : self.config.$siteLogoSrc;
					if ( $logo ) {
						self.config.$siteLogo.attr( 'src', $logo );
					}

					// Reset logo height
					if ( self.config.$siteLogo ) {
						self.config.$siteLogo.stop(true,true).animate( {
							'height': self.config.$siteLogoHeight,
						}, {
							duration: $shrunkSpeed,
							queue: false
						} );
					}

					// Get correct header height after animations are complete and re-position megamenus
					setTimeout( function() {
						self.config.$siteHeaderHeight = self.config.$siteHeader.outerHeight();
						self.megaMenusTop();
						self.flushDropdownsTop();
					}, $shrunkSpeed );

					// Remove shrunk class
					self.config.$siteHeader.removeClass( 'tb-header-shrunk' );

				}
			}

			// Destroy event
			if ( 'destroy' == event ) {
				destroy();
				return;
			}

			// Resize destroy method - required since header height can change on window resize
			function resizeDestroy() {

				// Reset header height
				$siteHeaderInner.css( {
					'height': '',
					'padding-top': '',
					'padding-bottom': '',
				} );

				// Reset logo
				var $logo = self.config.retinaLogo ? self.config.retinaLogo : self.config.$siteLogoSrc;
				if ( $logo ) {
					self.config.$siteLogo.attr( 'src', $logo );
				}

				// Reset logo height
				if ( self.config.$siteLogo ) {
					self.config.$siteLogo.css( {
						'height': self.config.$siteLogoHeight,
					} );
				}

				// Get correct header height and megaMenus top location
				self.config.$siteHeaderHeight = self.config.$siteHeader.outerHeight();
				self.megaMenusTop();
				self.flushDropdownsTop();

				// Remove shrunk class
				self.config.$siteHeader.removeClass( 'tb-header-shrunk' );

			}

			if ( 'resize_destroy' == event ) {
				resizeDestroy();
				return;
			}

			// Get offset
			var $offSet = tbLocalize.stickyShrinkOffset;
			if ( self.config.$siteHeaderBottom ) {
				$offSet = self.config.$siteHeaderBottom;
			}

			self.config.$window.scroll( function() {

				// Sticky header disabled = must check on scroll
				if ( ! self.config.$hasStickyHeader ) {
					return;
				}

				// Add shrink classes
				if ( self.config.$windowTop > $offSet ) {

					if ( ! self.config.$siteHeader.hasClass( 'tb-header-shrunk' ) ) {

						// Set header innner height
						$siteHeaderInner.stop(true,true).animate( {
							'height': $shrunkHeight,
							'padding-top': '0',
							'padding-bottom': '0'
						}, {
							duration: $shrunkSpeed,
							queue: false
						} );

						// Set logo height
						if ( self.config.$siteLogo ) {
							self.config.$siteLogo.stop(true,true).animate( {
								'height': $shrunkHeightLogo
							}, {
								duration: $shrunkSpeed,
								queue: false
							} );
						}

						// Sticky custom logo
						if ( self.config.$siteLogo && tbLocalize.stickyheaderCustomLogo ) {
							self.config.$siteLogo.attr( 'src', tbLocalize.stickyheaderCustomLogo );
						}

						// Get correct header height after animations are complete and re-position megamenus
						setTimeout( function() {
							self.config.$siteHeaderHeight = self.config.$siteHeader.outerHeight();
							self.megaMenusTop();
							self.flushDropdownsTop();
						}, $shrunkSpeed );

						// Add class to prevent events from running every time user scrolls
						self.config.$siteHeader.addClass( 'tb-header-shrunk' );

					}

				} else {

					destroy(); // As a function so we can destroy when sticky is destroyed also

				}

			} );

		},

		/**
		 * Overlay Header Topbar offset
		 *
		 * @since 2.0.0
		 */
		overlayHeaderTopWrapPadding: function() {

			// Topbar offset
			if ( ! this.config.$hasTopBar
				|| ! this.config.$hasHeaderOverlay
			) {
				return;
			}

			var $paddingEl = ( tbLocalize.mainLayout == 'boxed' ) ? $( '#wrap' ) : $( '#outer-wrap' );
			$( $paddingEl ).css( {
				'padding-top': $( '#top-bar-wrap' ).outerHeight()
			} );
			$( '#site-header.overlay-header' ).css( {
				'top': $( '#top-bar-wrap' ).outerHeight()
			} );

			// Content padding offset..
			var $offSetOverlayContent = $( '.offset-overlay-header' ).first();
			if ( $offSetOverlayContent.length && this.config.$siteHeaderHeight ) {
				$offSetOverlayContent.css( {
					'padding-top': this.config.$siteHeaderHeight + 60
				} );
			}

		},

		/**
		 * Header Search
		 *
		 * @since 2.0.0
		 */
		menuSearch: function() {

			// Dropdown
			if ( 'drop_down' == tbLocalize.menuSearchStyle ) {

				$( 'a.search-dropdown-toggle' ).click( function( event ) {
					$( '#searchform-dropdown' ).toggleClass( 'show' );
					$( '#searchform-dropdown input' ).focus();
					$( this ).parent( 'li' ).toggleClass( 'active' );
					$( 'div#current-shop-items-dropdown' ).removeClass( 'show' );
					$( 'li.wcmenucart-toggle-dropdown' ).removeClass( 'active' );
					return false;
				} );

				$( '#searchform-dropdown' ).click( function( event ) {
					event.stopPropagation();
				} );

			}

			// Overlay Modal
			else if ( 'overlay' == tbLocalize.menuSearchStyle ) {

				if ( ! $.fn.leanerModal ) {
					return;
				}

				var $searchOverlayToggle = $( 'a.search-overlay-toggle' );

				$searchOverlayToggle.leanerModal( {
					id      : '#searchform-overlay',
					top     : 100,
					overlay : 0.8
				} );

				$searchOverlayToggle.click( function() {
					$( '#site-searchform input' ).focus();
				} );

			}
			
			// Header Replace
			else if ( 'header_replace' == tbLocalize.menuSearchStyle ) {
				var $headerReplace = $( '#searchform-header-replace' );
				$( 'a.search-header-replace-toggle' ).click( function( event ) {
					$headerReplace.toggleClass( 'show' );
					$headerReplace.find( 'input' ).focus();
					return false;
				} );
				$( '#searchform-header-replace-close' ).click( function() {
					$headerReplace.removeClass( 'show' );
					return false;
				} );
				$headerReplace.click( function( event ) {
					event.stopPropagation();
				} );
			}

		},

		/**
		 * Header Cart
		 *
		 * @since 2.0.0
		 */
		headerCart: function() {

			if ( $( 'a.wcmenucart' ).hasClass( 'go-to-shop' ) ) {
				return;
			}

			// Drop-down
			if ( 'drop_down' == tbLocalize.wooCartStyle ) {

				// Display cart dropdown
				$( '.toggle-cart-widget' ).click( function( event ) {
					$( '#searchform-dropdown' ).removeClass( 'show' );
					$( 'a.search-dropdown-toggle' ).parent( 'li' ).removeClass( 'active' );
					$( 'div#current-shop-items-dropdown' ).toggleClass( 'show' );
					$( this ).toggleClass( 'active' );
					return false;
				} );

				// Hide cart dropdown
				$( 'div#current-shop-items-dropdown' ).click( function( event ) {
					event.stopPropagation(); 
				} );
				this.config.$document.click( function() {
					$( 'div#current-shop-items-dropdown' ).removeClass( 'show' );
					$( 'li.wcmenucart-toggle-dropdown' ).removeClass( 'active' );
				} );

				// Prevent body scroll on current shop dropdown
				$( '#current-shop-items-dropdown' ).bind( 'mousewheel DOMMouseScroll', function ( e ) {
					var e0 = e.originalEvent,
						delta = e0.wheelDelta || -e0.detail;
					this.scrollTop += ( delta < 0 ? 1 : -1 ) * 30;
					e.preventDefault();
				} );

			}

			// Modal
			else if ( 'overlay' == tbLocalize.wooCartStyle ) {

				if ( ! $.fn.leanerModal ) {
					return;
				}

				$( '.toggle-cart-widget' ).leanerModal( {
					id: '#current-shop-items-overlay',
					top: 100,
					overlay: 0.8
				} );

			}

		},

		/**
		 * Relocate the cart and search dropdowns for specific header styles
		 *
		 * @since 2.0.0
		 */
		cartSearchDropdownsRelocate: function() {

			// Get last menu item
			var $lastMenuItem = $( '#site-navigation .dropdown-menu > li:nth-last-child(1)' );

			// Validate first
			if ( this.config.$hasHeaderOverlay
				|| ! this.config.$siteHeader
				|| ! $lastMenuItem.length
				|| ! this.config.$siteHeader.hasClass( 'tb-reposition-cart-search-drops' )
			) {
				return;
			}

			// Define search and cart elements
			var $searchDrop = $( '#searchform-dropdown' ),
				$shopDrop   = $( '#current-shop-items-dropdown');

			// Get last menu item offset
			var $lastMenuItemOffset = $lastMenuItem.position();

			// Position search dropdown
			if ( $searchDrop.length ) {

				var $searchDropPosition = $lastMenuItemOffset.left - $searchDrop.outerWidth() + $lastMenuItem.width();

				$searchDrop.css( {
					'right' : 'auto',
					'left'  : $searchDropPosition
				} );

			}

			// Position Woo dropdown
			if ( $shopDrop.length ) {

				var $shopDropPosition = $lastMenuItemOffset.left - $shopDrop.outerWidth() + $lastMenuItem.width();

				$shopDrop.css( {
					'right': 'auto',
					'left': $shopDropPosition
				} );

			}

		},

		/**
		 * Hide post edit link
		 *
		 * @since 2.0.0
		 */
		hideEditLink: function() {

			$( 'a.hide-post-edit' ).click( function() {
				$( 'div.post-edit' ).hide();
				return false;
			} );

		},

		/**
		 * Custom menu widget toggles
		 *
		 * @since 2.0.0
		 */
		customMenuWidgetAccordion: function() {

			var self = this;

			$( '#main .widget_nav_menu .current-menu-ancestor' ).addClass( 'active' ).children( 'ul' ).show();

			$( '#main .widget_nav_menu' ).each( function() {
				var $widgetMenu  = $( this ),
					$hasChildren = $( this ).find( '.menu-item-has-children' ),
					$allSubs     = $hasChildren.children( '.sub-menu' );
				$hasChildren.each( function() {
					$( this ).addClass( 'parent' );
					var $links = $( this ).children( 'a' );
					$links.on( self.config.$isMobile ? 'touchstart' : 'click', function( event ) {
						var $linkParent = $( this ).parent( 'li' ),
							$allParents = $linkParent.parents( 'li' );
						if ( ! $linkParent.hasClass( 'active' ) ) {
							$hasChildren.not( $allParents ).removeClass( 'active' ).children( '.sub-menu' ).slideUp( 'fast' );
							$linkParent.addClass( 'active' ).children( '.sub-menu' ).slideDown( 'fast' );
						} else {
							$linkParent.removeClass( 'active' ).children( '.sub-menu' ).slideUp( 'fast' );
						}
						return false;
					} );
				} );
			} );

		},

		/**
		 * Header 5 - Inline Logo
		 *
		 * @since 2.0.0
		 */
		inlineHeaderLogo: function() {

			// Only needed for header style 5
			if ( 'five' != tbLocalize.siteHeaderStyle ) {
				return;
			}

			var $headerLogo        = $( '#site-header-inner > .header-five-logo' ),
				$headerNav         = $( '#site-header-inner .navbar-style-five' ),
				$navLiCount        = $headerNav.children( '#site-navigation' ).children( 'ul' ).children( 'li' ).size(),
				$navBeforeMiddleLi = Math.round( $navLiCount / 2 ) - parseInt( tbLocalize.headerFiveSplitOffset ),
				$centeredLogo      = $( '.menu-item-logo .header-five-logo' );

				// Add logo into menu
				if ( this.config.$windowWidth >= this.config.$mobileMenuBreakpoint && $headerLogo.length && $headerNav.length ) {
					$('<li class="menu-item-logo"></li>').insertAfter( $headerNav.find( '#site-navigation > ul > li:nth( '+ $navBeforeMiddleLi +' )' ) );
						$headerLogo.appendTo( $headerNav.find( '.menu-item-logo' ) );
				}

				// Remove logo from menu and add to header
				if ( this.config.$windowWidth < this.config.$mobileMenuBreakpoint && $centeredLogo.length ) {
					$centeredLogo.prependTo( $( '#site-header-inner' ) );
					$( '.menu-item-logo' ).remove();
				}

			// Add display class to logo (hidden by default)
			$headerLogo.addClass( 'display' );

		},

		/**
		 * Back to top link
		 *
		 * @since 2.0.0
		 */
		backTopLink: function() {

			var self = this,
				$scrollTopLink = $( 'a#site-scroll-top' );

			if ( $scrollTopLink.length ) {

				var $speed = tbLocalize.windowScrollTopSpeed ? tbLocalize.windowScrollTopSpeed : 2000,
					$speed = parseInt( $speed );

				this.config.$window.scroll( function() {
					if ( $( this ).scrollTop() > 100 ) {
						$scrollTopLink.addClass( 'show' );
					} else {
						$scrollTopLink.removeClass( 'show' );
					}
				} );

				$scrollTopLink.on( self.config.$isMobile ? 'touchstart' : 'click', function( event ) {
					$( 'html, body' ).stop(true,true).animate( {
						scrollTop : 0
					}, $speed );
					return false;
				} );

			}

		},

		/**
		 * Smooth Comment Scroll
		 *
		 * @since 2.0.0
		 */
		smoothCommentScroll: function() {

			$( '.single li.comment-scroll a' ).click( function( event ) {
				$( 'html, body' ).stop(true,true).animate( {
					scrollTop: $( this.hash ).offset().top -180
				}, 'normal' );
				return false;
			} );

		},

		/**
		 * Tooltips
		 *
		 * @since 2.0.0
		 */
		tipsyTooltips: function() {

			$( 'a.tooltip-left' ).tipsy( {
				fade    : true,
				gravity : 'e'
			} );

			$( 'a.tooltip-right' ).tipsy( {
				fade    : true,
				gravity : 'w'
			} );

			$( 'a.tooltip-up' ).tipsy( {
				fade    : true,
				gravity : 's'
			} );

			$( 'a.tooltip-down' ).tipsy( {
				fade    : true,
				gravity : 'n'
			} );

		},

		/**
		 * Custom hovers using data attributes
		 *
		 * @since 2.0.0
		 */
		customHovers: function() {

			$( '.tb-data-hover' ).each( function() {

				var $this = $( this ),
					$originalBg = $( this ).css( 'backgroundColor' ),
					$originalColor = $( this ).css( 'color' ),
					$hoverBg = $( this ).attr( 'data-hover-background' ),
					$hoverColor = $( this ).attr( 'data-hover-color' );

				$this.hover( function () {
					if ( CSSStyleDeclaration.prototype.setProperty !== 'undefined' ) {
						if ( $hoverBg ) {
							this.style.setProperty( 'background-color', $hoverBg, 'important' );
						}
						if ( $hoverColor ) {
							this.style.setProperty( 'color', $hoverColor, 'important' );
						}
					} else {
						if ( $hoverBg ) {
							$this.css( 'background-color', $hoverBg );
						}
						if ( $hoverColor ) {
							$this.css( 'color', $hoverColor );
						}
					}
				}, function () {
					if ( CSSStyleDeclaration.prototype.setProperty !== 'undefined' ) {
						if ( $hoverBg ) {
							this.style.setProperty( 'background-color', $originalBg, 'important' );
						}
						if ( $hoverColor ) {
							this.style.setProperty( 'color', $originalColor, 'important' );
						}
					} else {
						if ( $hoverBg && $originalBg ) {
							$this.css( 'background-color', $originalBg );
						}
						if ( $hoverColor && $originalColor ) {
							$this.css( 'color', $originalColor );
						}
					}
				} );

			} );

		},


		/**
		 * Togglebar toggle
		 *
		 * @since 2.0.0
		 */
		toggleBar: function() {

			var self = this,
				$toggle = $( 'a.toggle-bar-btn' );

			if ( $toggle.length ) {

				$toggle.on( self.config.$isMobile ? 'touchstart' : 'click', function( event ) {
					var $fa = $( '.toggle-bar-btn' ).find( '.fa' );
					$fa.toggleClass( $toggle.data( 'icon' ) );
					$fa.toggleClass( $toggle.data( 'icon-hover' ) );
					$( '#toggle-bar-wrap' ).toggleClass( 'active-bar' );
					return false;
				} );

				$( '#toggle-bar-wrap' ).click( function( event ) {
					event.stopPropagation();
				} );

			}

		},

		/**
		 * Skillbar
		 *
		 * @since 2.0.0
		 */
		skillbar: function() {

			$( '.vcex-skillbar' ).each( function() {
				var $this = $( this );
				$this.appear( function() {
					$this.find( '.vcex-skillbar-bar' ).animate( {
						width: $( this ).attr( 'data-percent' )
					}, 800 );
				} );
			}, {
				accX : 0,
				accY : 0
			} );

		},

		/**
		 * Milestones
		 *
		 * @since 2.0.0
		 */
		milestone: function() {

			$( '.vcex-animated-milestone' ).each( function() {
				$( this ).appear( function() {
					$( this ).find( '.vcex-milestone-time' ).countTo( {
						formatter: function ( value, options ) {
							return value.toFixed(options.decimals).replace(/\B(?=(?:\d{3})+(?!\d))/g, ',');
						},
					} );
				}, {
					accX : 0,
					accY : 0
				} );
			} );

		},

		/**
		 * Advanced Parallax
		 *
		 * @since 2.0.0
		 */
		parallax: function() {

			$( '.tb-parallax-bg' ).each( function() {
				var $this = $( this );
				$this.scrolly2().trigger( 'scroll' );
				$this.css( {
					'opacity' : 1
				} );
			} );

		},

		/**
		 * Local Scroll Offset
		 *
		 * @since 2.0.0
		 */
		parseLocalScrollOffset: function() {

			// Return custom offset
			if ( tbLocalize.localScrollOffset ) {
				return tbLocalize.localScrollOffset;
			}

			// Initial checks
			if ( ! this.config.$siteHeader || this.config.$verticalHeaderActive ) {
				return 0;
			}

			// Define return var
			var $offSet = 0;

			// Fixed header
			if ( this.config.$siteHeaderHeight && this.config.$siteHeader.hasClass( 'fixed-scroll' ) ) {


				// Return 0 for small screens if mobile fixed header is disabled
				if ( ! this.config.$hasStickyMobileHeader && this.config.$windowWidth <= tbLocalize.stickyHeaderBreakPoint ) {
					$offSet = 0;
				}

				// Return header height
				else {

					// Return shrink header height
					if ( this.config.$siteHeader.hasClass( 'tb-shrink-sticky-header' ) ) {
						$offSet = $offSet + 70;
					}

					// Return full header height
					else {

						$offSet = this.config.$siteHeaderHeight;

					}

				}

			}

			// Fixed Nav
			else if ( $( '#site-navigation-wrap' ).hasClass( 'fixed-nav' ) ) {
				if ( this.config.$windowWidth >= tbLocalize.stickyHeaderBreakPoint ) {
					$offSet = $offSet + $( '#site-navigation-wrap' ).outerHeight();
				}
			}

			// Add sticky topbar height offset
			if ( this.config.$hasStickyTopBar && this.config.$stickyTopBarHeight ) {
				$offSet = $offSet + this.config.$stickyTopBarHeight;
			}

			// Return offset
			return $offSet;

		},

		/**
		 * Local scroll links array
		 *
		 * @since 2.0.0
		 */
		localScrollLinksArray: function() {

			// Define array
			var $array = []

			// Return if no local-scroll links
			if ( ! $( 'li.local-scroll' ).length ) {
				return $array;
			}

			var $links = $( '#site-navigation li.local-scroll' ).children( 'a' );

			for ( var i=0; i < $links.length; i++ ) {
				var $link = $links[i],
					$hash = '#' + $( $link ).attr('href').replace(/^.*?(#|$)/,'');
				if ( $( $hash ).length ) {
					$array.push( $hash );
				}
			}

			// Return array of local scroll links
			return $array;

		},

		/**
		 * Scroll to function
		 *
		 * @since 2.0.0
		 */
		scrollTo: function( hash, offset, callback ) {

			var self = this,
				$target = $( hash );

			// Target check
			if ( $target.length ) {

				// Get offset
				var $offset = offset ? offset : $target.offset().top - self.config.$localScrollOffset;

				// Mobile toggle Menu needs it's own code
				if ( $( '.mobile-toggle-nav' ).length ) {
					if ( tbLocalize.animateMobileToggle ) {
						$( '.mobile-toggle-nav' ).slideUp( 'fast', function() {
							$( '.mobile-toggle-nav' ).removeClass( 'visible' );
							$( 'html,body' ).stop(true,true).animate( {
								scrollTop: $offset
							}, self.config.$localScrollSpeed, function() {
								if ( tbLocalize.localScrollUpdateHash ) {
									window.location.hash = hash;
								}
							} );
						} );
					} else {
						$( '.mobile-toggle-nav' ).hide().removeClass( 'visible' );
						$( 'html,body' ).stop(true,true).animate( {
							scrollTop: $offset
						}, self.config.$localScrollSpeed, function() {
							if ( tbLocalize.localScrollUpdateHash ) {
								window.location.hash = hash;
							}
						} );
					}
				}

				// Scroll to target
				else {

					$( 'html,body' ).stop(true,true).animate( {
						scrollTop: $offset
					}, self.config.$localScrollSpeed, function() {
						if ( tbLocalize.localScrollUpdateHash ) {
							window.location.hash = hash;
						}
					} );

				}

			}

		},


		/**
		 * Local Scroll link
		 *
		 * @since 2.0.0
		 */
		localScrollLinks: function() {

			// Set global object to "self" var
			var self = this;

			// Local Scroll - Menu
			$( 'li.local-scroll > a, .vcex-navbar-link.local-scroll' ).click( function() {
				var $hash = this.hash;
				self.scrollTo( $hash );
				return false;
			} );

			// Local Scroll Anylink
			$( '.local-scroll-link' ).click( function() {
				var $hash = this.hash;
				self.scrollTo( $hash );
				return false;
			} );

			// LocalScroll Woocommerce Reviews
			$( 'body.single div.entry-summary a.woocommerce-review-link' ).click( function() {
				var $hash   = this.hash,
					$target = $( $hash );
				if ( $target.length ) {
					var $offset = $target.offset().top - self.config.$localScrollOffset - 20;
					self.scrollTo( $hash, $offset );
				}
				return false;
			} );

		},

		/**
		 * Local Scroll Highlight on scroll
		 *
		 * @since 2.0.0
		 */
		localScrollHighlight: function() {

			// Get local scroll array
			var self = this,
				$localScrollArray = this.config.$localScrollArray;

			// Return if there aren't any local scroll items
			if ( $localScrollArray.length === 0 ) {
				return;
			}

			// Define vars
			var $windowPos    = this.config.$window.scrollTop(),
				$windowHeight = this.config.$windowHeight,
				$docHeight    = this.config.$document.height();

			// Highlight active items
			for ( var i=0; i < $localScrollArray.length; i++ ) {
				var $section = $localScrollArray[i];
				if ( $( $section ).length ) {
						var $divPos    = $( $section ).offset().top - self.config.$localScrollOffset - 1,
							$divHeight = $( $section ).outerHeight();
					if ( $windowPos >= $divPos && $windowPos < ( $divPos + $divHeight ) ) {
						$( "li.local-scroll a[href='" + $section + "']" ).parent( 'li' ).addClass( 'current-menu-item' );
					} else {
						$( "li.local-scroll a[href='" + $section + "']" ).parent( 'li' ).removeClass( 'current-menu-item' );
					}
				}
			}

			// Highlight last item if at bottom of page
			var $lastLink = $localScrollArray[$localScrollArray.length-1];
			if ( $windowPos + $windowHeight == $docHeight ) {
				$( '.local-scroll.current-menu-item' ).removeClass( 'current-menu-item' );
				$( "li.local-scroll a[href='" + $lastLink + "']" ).parent( 'li' ).addClass( 'current-menu-item' );
			}

		},

		/**
		 * Scroll to Hash
		 *
		 * @since 2.0.0
		 */
		scrollToHash: function( $this ) {

			// Declare function vars
			var self  = $this,
				$hash = location.hash;

			// Scroll to hash
			if ( $hash.indexOf( 'localscroll-' ) != -1 ) {

				// Set target
				var $target = $hash.replace( 'localscroll-','' );

				// Scroll to target
				self.scrollTo( $target );
				return;

			}

		},

		/**
		 * Equal heights function
		 *
		 * @since 2.0.0
		 */
		equalHeights: function() {

			// Make sure equal heights function is defined
			if ( ! $.fn.matchHeight ) {
				return;
			}
			
			// Add equal heights
			$( '.equal-height-column, .match-height-row .match-height-content, .vcex-feature-box-match-height .vcex-match-height, .equal-height-content, .match-height-grid .match-height-content, .blog-entry-equal-heights .blog-entry-inner, .tb-vc-row-columns-match-height .tb-vc-column-wrapper' ).matchHeight();

		},

		/**
		 * Footer Reveal Margin
		 *
		 * @since 2.0.0
		 */
		footerRevealMainMargin: function() {
			if ( this.config.$footerReveal ) {
				$( '#wrap' ).css( {
					'margin-bottom': $( '.footer-reveal' ).outerHeight()
				} );
			}
		},

		/**
		 * Footer Reveal Display on Load
		 *
		 * @since 2.0.0
		 */
		footerRevealLoadShow: function() {
			if ( this.config.$footerReveal ) {
				if ( $( window ).height() > $( '#wrap' ).height() ) {
					$( '.footer-reveal' ).show().toggleClass( 'footer-reveal footer-reveal-visible' );
				}
			}
		},

		/**
		 * Footer Reveal Display on Scroll
		 *
		 * @since 2.0.0
		 */
		footerRevealScrollShow: function() {
			if ( this.config.$footerReveal ) {
				if ( this.config.$windowTop > $( '#main' ).offset().top ) {
					if ( ! $( '.footer-reveal' ).hasClass( 'visible' ) ) {
						$( '.footer-reveal' ).show().addClass( 'visible' );
					}
				} else {
					if ( $( '.footer-reveal' ).hasClass( 'visible' ) ) {
						$( '.footer-reveal' ).removeClass( 'visible' ).hide();
					}
				}
			}
		},

		/**
		 * Custom Selects
		 *
		 * @since 2.0.0
		 */
		customSelects: function() {
			$( tbLocalize.customSelects ).customSelect( {
				customClass: 'theme-select'
			} );
		},

		/**
		 * FadeIn Elements
		 *
		 * @since 2.0.0
		 */
		fadeIn: function() {
			$( '.fade-in-image, .tb-show-on-load' ).addClass( 'no-opacity' );
		},

		/**
		 * OwlCarousel
		 *
		 * @since 2.0.0
		 */
		owlCarousel: function() {

			var self = this;
			
			$( '.tb-carousel' ).each( function() {

				var $this = $( this ),
					$data = $this.data();

				$this.owlCarousel( {
					animateIn: false,
					animateOut: false,
					lazyLoad: false,
					smartSpeed: self.parseData( $data.smartSpeed, tbLocalize.carouselSpeed ),
					rtl: self.config.$isRTL,
					dots: $data.dots,
					nav: $data.nav,
					items: $data.items,
					slideBy: $data.slideby,
					center: $data.center,
					loop: $data.loop,
					margin: $data.margin,
					autoplay: $data.autoplay,
					autoplayTimeout: $data.autoplayTimeout,
					navText: [ '<span class="fa fa-chevron-left"><span>', '<span class="fa fa-chevron-right"></span>' ],
					responsive: {
						0   : {
							items: $data.itemsMobilePortrait
						},
						480 : {
							 items: $data.itemsMobileLandscape
						},
						768 : {
							items: $data.itemsTablet
						},
						960 : {
							items: $data.items
						}
					}
				} );
			} );

		},

		/**
		 * SliderPro
		 *
		 * @since 2.0.0
		 */
		sliderPro: function() {

			// Set main object to self
			var self = this;

			// Loop through each slider
			$( '.tb-slider' ).each( function() {

				// Declare vars
				var $slider = $( this ),
					$data   = $slider.data();

				// Lets show things that were hidden to prevent flash
				$( '.tb-slider-slide, .tb-slider-thumbnails' ).css( {
						'opacity': 1,
						'display': 'block'
				} );

				// Get height based on first items to prevent animation on initial load
				var $preloader = $( '.tb-slider' ).prev( '.tb-slider-preloaderimg' ),
					$height = $preloader.length ? $preloader.outerHeight() : null,
					$heightAnimationDuration = self.parseData( $data.heightAnimationDuration, 500 );

				// Run slider
				$slider.sliderPro( {
					responsive: true,
					width: '100%',
					height: $height,
					fade: self.parseData( $data.fade, 600 ),
					touchSwipe: self.parseData( $data.touchSwipe, true ),
					fadeDuration: self.parseData( $data.animationSpeed, 600 ),
					slideAnimationDuration: self.parseData( $data.animationSpeed, 600 ),
					autoHeight: self.parseData( $data.autoHeight, true ),
					heightAnimationDuration: $heightAnimationDuration,
					arrows: self.parseData( $data.arrows, true ),
					fadeArrows: self.parseData( $data.fadeArrows, true ),
					autoplay: self.parseData( $data.autoPlay, true ),
					autoplayDelay: self.parseData( $data.autoPlayDelay, 5000 ),
					buttons: self.parseData( $data.buttons, true ),
					shuffle: self.parseData( $data.shuffle, false ),
					orientation: self.parseData( $data.direction, 'horizontal' ),
					loop: self.parseData( $data.loop, false ),
					keyboard: false,
					fullScreen: self.parseData( $data.fullscreen, false ),
					slideDistance: self.parseData( $data.slideDistance, 0 ),
					thumbnailHeight: self.parseData( $data.thumbnailHeight, 70 ),
					thumbnailWidth: self.parseData( $data.thumbnailWidth, 70 ),
					thumbnailPointer: self.parseData( $data.thumbnailPointer, false ),
					updateHash: self.parseData( $data.updateHash, false ),
					thumbnailArrows: false,
					fadeThumbnailArrows: false,
					thumbnailTouchSwipe: true,
					fadeCaption: self.parseData( $data.fadeCaption, true ),
					captionFadeDuration: 500,
					waitForLayers: true,
					autoScaleLayers: true,
					forceSize: 'none',
					thumbnailPosition: 'bottom',
					reachVideoAction: 'playVideo',
					leaveVideoAction: 'pauseVideo',
					endVideoAction: 'nextSlide',
					init: function( event ) {
						$slider.prev( '.tb-slider-preloaderimg' ).hide();
						if ( $slider.parent( '.gallery-format-post-slider' ) && $( '.blog-masonry-grid' ).length ) {
							setTimeout( function() {
								$( '.blog-masonry-grid' ).isotope( 'layout' );
							}, $heightAnimationDuration + 1 );
						}
					},
					gotoSlideComplete: function( event ) {
						if ( $slider.parent( '.gallery-format-post-slider' ) && $( '.blog-masonry-grid' ).length ) {
							$( '.blog-masonry-grid' ).isotope( 'layout' );
						}
					}

				} );

			} );

			// WooCommerce: Prevent clicking on Woo entry slider
			$( '.woo-product-entry-slider' ).click( function() {
				return false;
			} );

		   
		},

		/**
		 * Isotope Grids
		 *
		 * @since 2.0.0
		 */
		isotopeGrids: function() {

			var self = this;

			$( '.vcex-isotope-grid' ).each( function() {

				// Isotope layout
				var $container = $( this );
				$container.imagesLoaded( function() {
					$container.isotope( {
						itemSelector: '.vcex-isotope-entry',
						transformsEnabled: true,
						isOriginLeft: self.config.$isRTL ? false : true,
						transitionDuration: $container.data( 'transition-duration' ) ? $container.data( 'transition-duration' ) + 's' : '0.4s',
						layoutMode: $container.data( 'layout-mode' ) ? $container.data( 'layout-mode' ) : 'masonry',
						filter: $container.data( 'filter' ) ? $container.data( 'filter' ) : ''
					} );
				} );

				// Filter links
				var $filter = $container.prev( 'ul.vcex-filter-links' );
				if ( $filter.length ) {
					var $filterLinks = $filter.find( 'a' );
					$filterLinks.click( function() {
						var selector = $( this ).attr( 'data-filter' );
							$container.isotope( {
								filter: selector
							} );
							$( this ).parents( 'ul' ).find( 'li' ).removeClass( 'active' );
							$( this ).parent( 'li' ).addClass( 'active' );
						return false;
					} );
				}

			} );

		},

		/**
		 * Isotope Grids
		 *
		 * @since 2.0.0
		 */
		archiveMasonryGrids: function() {

			// Define main vars
			var self = this,
				$archives = $( '.blog-masonry-grid,div.tb-row.portfolio-masonry,div.tb-row.portfolio-no-margins,div.tb-row.staff-masonry,div.tb-row.staff-no-margins' );

			// Loop through archives
			$archives.each( function() {

				var $this = $( this ),
					$data = $this.data(),
					$transitionDuration = self.parseData( $data.transitionDuration, '0.0' ),
					$layoutMode = self.parseData( $data.layoutMode, 'masonry' );

				// Load isotope after images loaded
				$this.imagesLoaded( function() {
					$this.isotope( {
						itemSelector: '.isotope-entry',
						transformsEnabled: true,
						isOriginLeft: self.config.$isRTL ? false : true,
						transitionDuration: $transitionDuration + 's'
					} );
				} );

			} );

		},

		/**
		 * iLightbox
		 *
		 * @since 2.0.0
		 */
		iLightbox: function() {

			// Set main object to self
			var self = this;

			// Lightbox Standard
			$( '.tb-lightbox' ).each( function() {

				var $this = $( this );

				if ( ! $this.hasClass( 'tb-lightbox-group-item' ) ) {

					var $data = $this.data();

					$this.iLightBox( {
						skin: self.parseData( $data.skin, tbLocalize.iLightbox.skin ),
						controls: {
							fullscreen: tbLocalize.iLightbox.controls.fullscreen
						},
						show: {
							title: tbLocalize.iLightbox.show.title,
							speed: parseInt( tbLocalize.iLightbox.show.speed )
						},
						hide: {
							speed : parseInt( tbLocalize.iLightbox.hide.speed )
						},
						effects: {
							reposition: true,
							repositionSpeed: 200,
							switchSpeed: 300,
							loadedFadeSpeed: tbLocalize.iLightbox.effects.loadedFadeSpeed,
							fadeSpeed: tbLocalize.iLightbox.effects.fadeSpeed
						},
						overlay: tbLocalize.iLightbox.overlay,
						social: tbLocalize.iLightbox.social
					} );

				}

			} );

			// Lightbox Videos => OLD SCHOOL STUFF, keep for old customers
			$( '.tb-lightbox-video, .wpb_single_image.video-lightbox a, .tb-lightbox-autodetect, .tb-lightbox-autodetect a' ).each( function() {

				var $this = $( this ),
					$data = $this.data();

				$this.iLightBox( {
					smartRecognition : true,
					skin: self.parseData( $data.skin, tbLocalize.iLightbox.skin ),
					path: 'horizontal',
					controls: {
						fullscreen: tbLocalize.iLightbox.controls.fullscreen
					},
					show: {
						title: tbLocalize.iLightbox.show.title,
						speed: parseInt( tbLocalize.iLightbox.show.speed )
					},
					hide: {
						speed: parseInt( tbLocalize.iLightbox.hide.speed )
					},
					effects: {
						reposition: true,
						repositionSpeed: 200,
						switchSpeed: 300,
						loadedFadeSpeed: tbLocalize.iLightbox.effects.loadedFadeSpeed,
						fadeSpeed: tbLocalize.iLightbox.effects.fadeSpeed
					},
					overlay: tbLocalize.iLightbox.overlay,
					social: tbLocalize.iLightbox.social
				} );
			} );

			// Lightbox Galleries - NEW since 1.6.0
			$( '.lightbox-group' ).each( function() {

				// Get lightbox data
				var $this = $( this ),
					$item = $this.find( 'a.tb-lightbox-group-item' ),
					$data = $this.data();

				// Start up lightbox
				$item.iLightBox( {
					skin: self.parseData( $data.skin, tbLocalize.iLightbox.skin ),
					path: self.parseData( $data.path, tbLocalize.iLightbox.path ),
					infinite: true,
					show: {
						title: tbLocalize.iLightbox.show.title,
						speed: parseInt( tbLocalize.iLightbox.show.speed )
					},
					hide: {
						speed: parseInt( tbLocalize.iLightbox.hide.speed )
					},
					controls: {
						arrows: self.parseData( $data.arrows, tbLocalize.iLightbox.controls.arrows ),
						thumbnail: self.parseData( $data.thumbnails, tbLocalize.iLightbox.controls.thumbnail ),
						fullscreen: tbLocalize.iLightbox.controls.fullscreen,
						mousewheel: tbLocalize.iLightbox.controls.mousewheel
					},
					effects : {
						reposition: true,
						repositionSpeed: 200,
						switchSpeed: 300,
						loadedFadeSpeed: tbLocalize.iLightbox.effects.loadedFadeSpeed,
						fadeSpeed: tbLocalize.iLightbox.effects.fadeSpeed
					},
					overlay: tbLocalize.iLightbox.overlay,
					social: tbLocalize.iLightbox.social
				} );

			} );

			// Lightbox Gallery with custom imgs
			$( '.tb-lightbox-gallery' ).on( 'click', function( event ) {
				// event.preventDefault(); // to fix customizer bug
				var imagesArray = $( this ).data( 'gallery' ).split( ',' );
				if ( imagesArray ) {
					$.iLightBox( imagesArray, {
						skin: tbLocalize.iLightbox.skin,
						path: 'horizontal',
						infinite: true,
						show: {
							title: tbLocalize.iLightbox.show.title,
							speed: parseInt( tbLocalize.iLightbox.show.speed )
						},
						hide: {
							speed: parseInt( tbLocalize.iLightbox.hide.speed )
						},
						controls: {
							arrows: tbLocalize.iLightbox.controls.arrows,
							thumbnail: tbLocalize.iLightbox.controls.thumbnail,
							fullscreen: tbLocalize.iLightbox.controls.fullscreen,
							mousewheel: tbLocalize.iLightbox.controls.mousewheel
						},
						effects: {
							reposition: true,
							repositionSpeed: 200,
							switchSpeed: 300,
							loadedFadeSpeed: tbLocalize.iLightbox.effects.loadedFadeSpeed,
							fadeSpeed: tbLocalize.iLightbox.effects.fadeSpeed
						},
						overlay: tbLocalize.iLightbox.overlay,
						social : tbLocalize.iLightbox.social
					} );
				}
				return false;
			} );

		},

		/**
		 * Overlay Hovers
		 *
		 * @since 2.0.0
		 */
		overlayHovers: function() {

			$( '.overlay-parent-title-push-up' ).each( function() {

				// Define vars
				var $this = $( this ),
					$title = $this.find( '.overlay-title-push-up' ),
					$child = $this.find( 'a' ),
					$img = $child.find( 'img' ),
					$titleHeight = $title.outerHeight();

				// Create overlay after image is loaded to prevent issues
				$this.imagesLoaded( function() {

					// Position title
					$title.css( {
						'bottom': - $titleHeight
					} );

					// Add height to child
					$child.css( {
						'height': $img.outerHeight()
					} );

					// Position image
					$img.css( {
						'position': 'absolute',
						'top': '0',
						'left': '0',
						'width': '100%',
						'height': '100%'
					} );

					// Animate image on hover
					$this.hover( function() {
						$img.css( {
							'top': -20
						} );
						$title.css( {
							'bottom': 0
						} );
					}, function() {
						$img.css( {
							'top': '0'
						} );
						$title.css( {
							'bottom': - $titleHeight
						} );
					} );

				} );

			} );

		},

		/**
		 * WooCommerce Selects
		 *
		 * @since 2.0.0
		 */
		wooSelects: function() {
			if ( $.fn.select2 !== undefined ) {
				$( '#calc_shipping_country' ).select2();
			}
		},

		/**
		 * Parses data to check if a value is defined in the data attribute and if not returns the fallback
		 *
		 * @since 2.0.0
		 */
		parseData: function( val, fallback ) {
			return ( typeof val !== 'undefined' ) ? val : fallback;
		}


	}; // END tbTheme

	// Start things up
	tbTheme.init();

} ) ( jQuery );