/**
* Header Component.
*
* @author Htmlstream
* @version 1.0
*
*/
;(function ($) {
'use strict';
$.HSCore.components.HSHeader = {
/**
* Base configuration.
*
* @var Object _baseConfig
*/
_baseConfig: {
headerFixMoment: 0,
headerFixEffect: 'slide',
breakpointsMap: {
'md': 768,
'sm': 576,
'lg': 992,
'xl': 1200
}
},
/**
* Initializtion of header.
*
* @param jQuery element
*
* @return jQuery
*/
init: function( element ) {
if( !element || element.length !== 1 || element.data('HSHeader')) return;
var self = this;
this.element = element;
this.config = $.extend(true, {}, this._baseConfig, element.data());
this.observers = this._detectObservers();
this.fixMediaDifference( this.element );
this.element.data('HSHeader', new HSHeader(this.element, this.config, this.observers ) );
$(window)
.on('scroll.uHeader', function(e){
element
.data('HSHeader')
.notify();
})
.on('resize.uHeader', function(e){
if( self.resizeTimeOutId ) clearTimeout( self.resizeTimeOutId );
self.resizeTimeOutId = setTimeout( function(){
element
.data('HSHeader')
.checkViewport()
.update();
}, 100 );
})
.trigger('scroll.uHeader');
return this.element;
},
/**
*
*
* @param
*
* @return
*/
_detectObservers: function() {
if(!this.element || !this.element.length) return;
var observers = {
'xs': [],
'sm': [],
'md': [],
'lg': [],
'xl': []
};
/* ------------------------ xs -------------------------*/
// Has Hidden Element
if( this.element.hasClass('u-header--has-hidden-element') ) {
observers['xs'].push(
new HSHeaderHasHiddenElement( this.element )
);
}
// Sticky top
if( this.element.hasClass('u-header--sticky-top') ) {
if( this.element.hasClass('u-header--show-hide') ) {
observers['xs'].push(
new HSHeaderMomentShowHideObserver( this.element )
);
}
else if( this.element.hasClass('u-header--toggle-section') ) {
observers['xs'].push(
new HSHeaderHideSectionObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo') ) {
observers['xs'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-appearance') ) {
observers['xs'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
}
// Floating
if( this.element.hasClass('u-header--floating') ) {
observers['xs'].push(
new HSHeaderFloatingObserver( this.element )
);
}
if( this.element.hasClass('u-header--invulnerable') ) {
observers['xs'].push(
new HSHeaderWithoutBehaviorObserver( this.element )
);
}
// Sticky bottom
if( this.element.hasClass('u-header--sticky-bottom') ) {
if(this.element.hasClass('u-header--change-appearance')) {
observers['xs'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo') ) {
observers['xs'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
}
// Abs top & Static
if( this.element.hasClass('u-header--abs-top') || this.element.hasClass('u-header--static')) {
if( this.element.hasClass('u-header--show-hide') ) {
observers['xs'].push(
new HSHeaderShowHideObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo') ) {
observers['xs'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-appearance') ) {
observers['xs'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
}
// Abs bottom & Abs top 2nd screen
if( this.element.hasClass('u-header--abs-bottom') || this.element.hasClass('u-header--abs-top-2nd-screen') ) {
observers['xs'].push(
new HSHeaderStickObserver( this.element )
);
if( this.element.hasClass('u-header--change-appearance') ) {
observers['xs'].push(
new HSHeaderChangeAppearanceObserver( this.element, {
fixPointSelf: true
} )
);
}
if( this.element.hasClass('u-header--change-logo') ) {
observers['xs'].push(
new HSHeaderChangeLogoObserver( this.element, {
fixPointSelf: true
} )
);
}
}
/* ------------------------ sm -------------------------*/
// Sticky top
// Has Hidden Element
if( this.element.hasClass('u-header--has-hidden-element--sm') ) {
observers['sm'].push(
new HSHeaderHasHiddenElement( this.element )
);
}
if( this.element.hasClass('u-header--sticky-top--sm') ) {
if( this.element.hasClass('u-header--show-hide--sm') ) {
observers['sm'].push(
new HSHeaderMomentShowHideObserver( this.element )
);
}
else if( this.element.hasClass('u-header--toggle-section--sm') ) {
observers['sm'].push(
new HSHeaderHideSectionObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--sm') ) {
observers['sm'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-appearance--sm') ) {
observers['sm'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
}
// Floating
if( this.element.hasClass('u-header--floating--sm') ) {
observers['sm'].push(
new HSHeaderFloatingObserver( this.element )
);
}
if( this.element.hasClass('u-header--invulnerable--sm') ) {
observers['sm'].push(
new HSHeaderWithoutBehaviorObserver( this.element )
);
}
// Sticky bottom
if( this.element.hasClass('u-header--sticky-bottom--sm') ) {
if(this.element.hasClass('u-header--change-appearance--sm')) {
observers['sm'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--sm') ) {
observers['sm'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
}
// Abs top & Static
if( this.element.hasClass('u-header--abs-top--sm') || this.element.hasClass('u-header--static--sm')) {
if( this.element.hasClass('u-header--show-hide--sm') ) {
observers['sm'].push(
new HSHeaderShowHideObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--sm') ) {
observers['sm'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-appearance--sm') ) {
observers['sm'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
}
// Abs bottom & Abs top 2nd screen
if( this.element.hasClass('u-header--abs-bottom--sm') || this.element.hasClass('u-header--abs-top-2nd-screen--sm') ) {
observers['sm'].push(
new HSHeaderStickObserver( this.element )
);
if( this.element.hasClass('u-header--change-appearance--sm') ) {
observers['sm'].push(
new HSHeaderChangeAppearanceObserver( this.element, {
fixPointSelf: true
} )
);
}
if( this.element.hasClass('u-header--change-logo--sm') ) {
observers['sm'].push(
new HSHeaderChangeLogoObserver( this.element, {
fixPointSelf: true
} )
);
}
}
/* ------------------------ md -------------------------*/
// Has Hidden Element
if( this.element.hasClass('u-header--has-hidden-element--md') ) {
observers['md'].push(
new HSHeaderHasHiddenElement( this.element )
);
}
// Sticky top
if( this.element.hasClass('u-header--sticky-top--md') ) {
if( this.element.hasClass('u-header--show-hide--md') ) {
observers['md'].push(
new HSHeaderMomentShowHideObserver( this.element )
);
}
else if( this.element.hasClass('u-header--toggle-section--md') ) {
observers['md'].push(
new HSHeaderHideSectionObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--md') ) {
observers['md'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-appearance--md') ) {
observers['md'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
}
// Floating
if( this.element.hasClass('u-header--floating--md') ) {
observers['md'].push(
new HSHeaderFloatingObserver( this.element )
);
}
if( this.element.hasClass('u-header--invulnerable--md') ) {
observers['md'].push(
new HSHeaderWithoutBehaviorObserver( this.element )
);
}
// Sticky bottom
if( this.element.hasClass('u-header--sticky-bottom--md') ) {
if(this.element.hasClass('u-header--change-appearance--md')) {
observers['md'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--md') ) {
observers['md'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
}
// Abs top & Static
if( this.element.hasClass('u-header--abs-top--md') || this.element.hasClass('u-header--static--md')) {
if( this.element.hasClass('u-header--show-hide--md') ) {
observers['md'].push(
new HSHeaderShowHideObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--md') ) {
observers['md'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-appearance--md') ) {
observers['md'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
}
// Abs bottom & Abs top 2nd screen
if( this.element.hasClass('u-header--abs-bottom--md') || this.element.hasClass('u-header--abs-top-2nd-screen--md') ) {
observers['md'].push(
new HSHeaderStickObserver( this.element )
);
if( this.element.hasClass('u-header--change-appearance--md') ) {
observers['md'].push(
new HSHeaderChangeAppearanceObserver( this.element, {
fixPointSelf: true
} )
);
}
if( this.element.hasClass('u-header--change-logo--md') ) {
observers['md'].push(
new HSHeaderChangeLogoObserver( this.element, {
fixPointSelf: true
} )
);
}
}
/* ------------------------ lg -------------------------*/
// Has Hidden Element
if( this.element.hasClass('u-header--has-hidden-element--lg') ) {
observers['lg'].push(
new HSHeaderHasHiddenElement( this.element )
);
}
// Sticky top
if( this.element.hasClass('u-header--sticky-top--lg') ) {
if( this.element.hasClass('u-header--show-hide--lg') ) {
observers['lg'].push(
new HSHeaderMomentShowHideObserver( this.element )
);
}
else if( this.element.hasClass('u-header--toggle-section--lg') ) {
observers['lg'].push(
new HSHeaderHideSectionObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--lg') ) {
observers['lg'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-appearance--lg') ) {
observers['lg'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
}
// Floating
if( this.element.hasClass('u-header--floating--lg') ) {
observers['lg'].push(
new HSHeaderFloatingObserver( this.element )
);
}
if( this.element.hasClass('u-header--invulnerable--lg') ) {
observers['lg'].push(
new HSHeaderWithoutBehaviorObserver( this.element )
);
}
// Sticky bottom
if( this.element.hasClass('u-header--sticky-bottom--lg') ) {
if(this.element.hasClass('u-header--change-appearance--lg')) {
observers['lg'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--lg') ) {
observers['lg'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
}
// Abs top & Static
if( this.element.hasClass('u-header--abs-top--lg') || this.element.hasClass('u-header--static--lg')) {
if( this.element.hasClass('u-header--show-hide--lg') ) {
observers['lg'].push(
new HSHeaderShowHideObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--lg') ) {
observers['lg'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-appearance--lg') ) {
observers['lg'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
}
// Abs bottom & Abs top 2nd screen
if( this.element.hasClass('u-header--abs-bottom--lg') || this.element.hasClass('u-header--abs-top-2nd-screen--lg') ) {
observers['lg'].push(
new HSHeaderStickObserver( this.element )
);
if( this.element.hasClass('u-header--change-appearance--lg') ) {
observers['lg'].push(
new HSHeaderChangeAppearanceObserver( this.element, {
fixPointSelf: true
} )
);
}
if( this.element.hasClass('u-header--change-logo--lg') ) {
observers['lg'].push(
new HSHeaderChangeLogoObserver( this.element, {
fixPointSelf: true
} )
);
}
}
/* ------------------------ xl -------------------------*/
// Has Hidden Element
if( this.element.hasClass('u-header--has-hidden-element--xl') ) {
observers['xl'].push(
new HSHeaderHasHiddenElement( this.element )
);
}
// Sticky top
if( this.element.hasClass('u-header--sticky-top--xl') ) {
if( this.element.hasClass('u-header--show-hide--xl') ) {
observers['xl'].push(
new HSHeaderMomentShowHideObserver( this.element )
);
}
else if( this.element.hasClass('u-header--toggle-section--xl') ) {
observers['xl'].push(
new HSHeaderHideSectionObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--xl') ) {
observers['xl'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-appearance--xl') ) {
observers['xl'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
}
// Floating
if( this.element.hasClass('u-header--floating--xl') ) {
observers['xl'].push(
new HSHeaderFloatingObserver( this.element )
);
}
// Sticky bottom
if( this.element.hasClass('u-header--invulnerable--xl') ) {
observers['xl'].push(
new HSHeaderWithoutBehaviorObserver( this.element )
);
}
// Sticky bottom
if( this.element.hasClass('u-header--sticky-bottom--xl') ) {
if(this.element.hasClass('u-header--change-appearance--xl')) {
observers['xl'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--xl') ) {
observers['xl'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
}
// Abs top & Static
if( this.element.hasClass('u-header--abs-top--xl') || this.element.hasClass('u-header--static--xl')) {
if( this.element.hasClass('u-header--show-hide--xl') ) {
observers['xl'].push(
new HSHeaderShowHideObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-logo--xl') ) {
observers['xl'].push(
new HSHeaderChangeLogoObserver( this.element )
);
}
if( this.element.hasClass('u-header--change-appearance--xl') ) {
observers['xl'].push(
new HSHeaderChangeAppearanceObserver( this.element )
);
}
}
// Abs bottom & Abs top 2nd screen
if( this.element.hasClass('u-header--abs-bottom--xl') || this.element.hasClass('u-header--abs-top-2nd-screen--xl') ) {
observers['xl'].push(
new HSHeaderStickObserver( this.element )
);
if( this.element.hasClass('u-header--change-appearance--xl') ) {
observers['xl'].push(
new HSHeaderChangeAppearanceObserver( this.element, {
fixPointSelf: true
} )
);
}
if( this.element.hasClass('u-header--change-logo--xl') ) {
observers['xl'].push(
new HSHeaderChangeLogoObserver( this.element, {
fixPointSelf: true
} )
);
}
}
return observers;
},
/**
*
*
* @param
*
* @return
*/
fixMediaDifference: function(element) {
if(!element || !element.length || !element.filter('[class*="u-header--side"]').length) return;
var toggleable;
if(element.hasClass('u-header--side-left--xl') || element.hasClass('u-header--side-right--xl')) {
toggleable = element.find('.navbar-expand-xl');
if(toggleable.length) {
toggleable
.removeClass('navbar-expand-xl')
.addClass('navbar-expand-lg');
}
}
else if(element.hasClass('u-header--side-left--lg') || element.hasClass('u-header--side-right--lg')) {
toggleable = element.find('.navbar-expand-lg');
if(toggleable.length) {
toggleable
.removeClass('navbar-expand-lg')
.addClass('navbar-expand-md');
}
}
else if(element.hasClass('u-header--side-left--md') || element.hasClass('u-header--side-right--md')) {
toggleable = element.find('.navbar-expand-md');
if(toggleable.length) {
toggleable
.removeClass('navbar-expand-md')
.addClass('navbar-expand-sm');
}
}
else if(element.hasClass('u-header--side-left--sm') || element.hasClass('u-header--side-right--sm')) {
toggleable = element.find('.navbar-expand-sm');
if(toggleable.length) {
toggleable
.removeClass('navbar-expand-sm')
.addClass('navbar-expand');
}
}
}
}
/**
* HSHeader constructor function.
*
* @param jQuery element
* @param Object config
* @param Object observers
*
* @return undefined
*/
function HSHeader( element, config, observers ) {
if( !element || !element.length ) return;
this.element = element;
this.config = config;
this.observers = observers && $.isPlainObject( observers ) ? observers : {};
this.viewport = 'xs';
this.checkViewport();
}
/**
*
*
* @return Object
*/
HSHeader.prototype.checkViewport = function() {
var $w = $(window);
if( $w.width() > this.config.breakpointsMap['sm'] && this.observers['sm'].length ){
this.prevViewport = this.viewport;
this.viewport = 'sm';
return this;
}
if( $w.width() > this.config.breakpointsMap['md'] && this.observers['md'].length ) {
this.prevViewport = this.viewport;
this.viewport = 'md';
return this;
}
if( $w.width() > this.config.breakpointsMap['lg'] && this.observers['lg'].length ) {
this.prevViewport = this.viewport;
this.viewport = 'lg';
return this;
}
if( $w.width() > this.config.breakpointsMap['xl'] && this.observers['xl'].length ) {
this.prevViewport = this.viewport;
this.viewport = 'xl';
return this;
}
if(this.prevViewport) this.prevViewport = this.viewport;
this.viewport = 'xs';
return this;
}
/**
* Notifies all observers.
*
* @return Object
*/
HSHeader.prototype.notify = function(){
if( this.prevViewport ) {
this.observers[this.prevViewport].forEach(function(observer){
observer.destroy();
});
this.prevViewport = null;
}
this.observers[this.viewport].forEach(function(observer){
observer.check();
});
return this;
}
/**
* Reinit all header's observers.
*
* @return Object
*/
HSHeader.prototype.update = function() {
// if( this.prevViewport ) {
// this.observers[this.prevViewport].forEach(function(observer){
// observer.destroy();
// });
// this.prevViewport = null;
// }
for(var viewport in this.observers) {
this.observers[viewport].forEach(function(observer){
observer.destroy();
});
}
this.prevViewport = null;
this.observers[this.viewport].forEach(function(observer){
observer.reinit();
});
return this;
}
/**
* Abstract constructor function for each observer.
*
* @param jQuery element
*
* @return Boolean|undefined
*/
function HSAbstractObserver(element) {
if( !element || !element.length ) return;
this.element = element;
this.defaultState = true;
this.reinit = function() {
this
.destroy()
.init()
.check();
}
return true;
}
/**
* Header's observer which is responsible for 'sticky' behavior.
*
* @param jQuery element
*/
function HSHeaderStickObserver( element ) {
if( !HSAbstractObserver.call(this, element) ) return;
this.init();
}
/**
*
*
* @param
*
* @return
*/
HSHeaderStickObserver.prototype.init = function() {
this.defaultState = true;
this.offset = this.element.offset().top;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderStickObserver.prototype.destroy = function() {
this.toDefaultState();
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderStickObserver.prototype.check = function() {
var $w = $(window),
docScrolled = $w.scrollTop();
if( docScrolled > this.offset && this.defaultState) {
this.changeState();
}
else if(docScrolled < this.offset && !this.defaultState){
this.toDefaultState();
}
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderStickObserver.prototype.changeState = function() {
this.element.addClass('js-header-fix-moment');
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderStickObserver.prototype.toDefaultState = function() {
this.element.removeClass('js-header-fix-moment');
this.defaultState = !this.defaultState;
return this;
}
/**
* Header's observer which is responsible for 'show/hide' behavior which is depended on scroll direction.
*
* @param jQuery element
*/
function HSHeaderMomentShowHideObserver( element ) {
if( !HSAbstractObserver.call(this, element) ) return;
this.init();
}
/**
*
*
* @return Object
*/
HSHeaderMomentShowHideObserver.prototype.init = function() {
this.direction = 'down';
this.delta = 0;
this.defaultState = true;
this.offset = isFinite( this.element.data('header-fix-moment') ) && this.element.data('header-fix-moment') != 0 ? this.element.data('header-fix-moment') : 5;
this.effect = this.element.data('header-fix-effect') ? this.element.data('header-fix-effect') : 'show-hide';
return this;
}
/**
*
*
* @return Object
*/
HSHeaderMomentShowHideObserver.prototype.destroy = function() {
this.toDefaultState();
return this;
}
/**
*
*
* @param
*
* @return Object
*/
HSHeaderMomentShowHideObserver.prototype.checkDirection = function() {
if( $(window).scrollTop() > this.delta ) {
this.direction = 'down';
}
else {
this.direction = 'up';
}
this.delta = $(window).scrollTop();
return this;
}
/**
*
*
* @return Object
*/
HSHeaderMomentShowHideObserver.prototype.toDefaultState = function() {
switch( this.effect ) {
case 'slide' :
this.element.removeClass('u-header--moved-up');
break;
case 'fade' :
this.element.removeClass('u-header--faded');
break;
default:
this.element.removeClass('u-header--invisible');
}
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @return Object
*/
HSHeaderMomentShowHideObserver.prototype.changeState = function() {
switch( this.effect ) {
case 'slide' :
this.element.addClass('u-header--moved-up');
break;
case 'fade' :
this.element.addClass('u-header--faded');
break;
default:
this.element.addClass('u-header--invisible');
}
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @return Object
*/
HSHeaderMomentShowHideObserver.prototype.check = function() {
var docScrolled = $(window).scrollTop();
this.checkDirection();
if( docScrolled >= this.offset && this.defaultState && this.direction == 'down' ) {
this.changeState();
}
else if ( !this.defaultState && this.direction == 'up') {
this.toDefaultState();
}
return this;
}
/**
*
*
* @param
*
* @return
*/
function HSHeaderShowHideObserver( element ) {
if( !HSAbstractObserver.call(this, element) ) return;
this.init();
}
/**
*
*
* @param
*
* @return Object
*/
HSHeaderShowHideObserver.prototype.init = function() {
if(!this.defaultState && $(window).scrollTop() > this.offset) return this;
this.defaultState = true;
this.transitionDuration = parseFloat( getComputedStyle( this.element.get(0) )['transition-duration'], 10 ) * 1000;
this.offset = isFinite( this.element.data('header-fix-moment') ) && this.element.data('header-fix-moment') > this.element.outerHeight() ? this.element.data('header-fix-moment') : this.element.outerHeight() + 100;
this.effect = this.element.data('header-fix-effect') ? this.element.data('header-fix-effect') : 'show-hide';
return this;
}
/**
*
*
* @param
*
* @return Object
*/
HSHeaderShowHideObserver.prototype.destroy = function() {
if( !this.defaultState && $(window).scrollTop() > this.offset ) return this;
this.element.removeClass('u-header--untransitioned');
this._removeCap();
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderShowHideObserver.prototype._insertCap = function() {
this.element.addClass('js-header-fix-moment u-header--untransitioned');
if( this.element.hasClass('u-header--static') ) {
$('html').css('padding-top', this.element.outerHeight() );
}
switch( this.effect ) {
case 'fade' :
this.element.addClass('u-header--faded');
break;
case 'slide' :
this.element.addClass('u-header--moved-up');
break;
default :
this.element.addClass('u-header--invisible')
}
this.capInserted = true;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderShowHideObserver.prototype._removeCap = function() {
var self = this;
this.element.removeClass('js-header-fix-moment');
if( this.element.hasClass('u-header--static') ) {
$('html').css('padding-top', 0 );
}
if(this.removeCapTimeOutId) clearTimeout(this.removeCapTimeOutId);
this.removeCapTimeOutId = setTimeout(function() {
self.element.removeClass('u-header--moved-up u-header--faded u-header--invisible');
}, 10);
this.capInserted = false;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderShowHideObserver.prototype.check = function() {
var $w = $(window);
if( $w.scrollTop() > this.element.outerHeight() && !this.capInserted ) {
this._insertCap();
}
else if($w.scrollTop() <= this.element.outerHeight() && this.capInserted) {
this._removeCap();
}
if( $w.scrollTop() > this.offset && this.defaultState) {
this.changeState();
}
else if( $w.scrollTop() <= this.offset && !this.defaultState ) {
this.toDefaultState();
}
}
/**
*
*
* @param
*
* @return
*/
HSHeaderShowHideObserver.prototype.changeState = function() {
this.element.removeClass('u-header--untransitioned');
if( this.animationTimeoutId ) clearTimeout( this.animationTimeoutId );
switch( this.effect ) {
case 'fade' :
this.element.removeClass('u-header--faded');
break;
case 'slide' :
this.element.removeClass('u-header--moved-up');
break;
default:
this.element.removeClass('u-header--invisible');
}
this.defaultState = !this.defaultState;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderShowHideObserver.prototype.toDefaultState = function() {
var self = this;
this.animationTimeoutId = setTimeout(function(){
self.element.addClass('u-header--untransitioned');
}, this.transitionDuration );
switch( this.effect ) {
case 'fade' :
this.element.addClass('u-header--faded');
break;
case 'slide' :
this.element.addClass('u-header--moved-up');
break;
default:
this.element.addClass('u-header--invisible');
}
this.defaultState = !this.defaultState;
}
/**
*
*
* @param
*
* @return
*/
function HSHeaderChangeLogoObserver( element, config ) {
if( !HSAbstractObserver.call( this, element ) ) return;
this.config = {
fixPointSelf: false
}
if( config && $.isPlainObject(config) ) this.config = $.extend(true, {}, this.config, config);
this.init();
}
/**
*
*
* @param
*
* @return
*/
HSHeaderChangeLogoObserver.prototype.init = function() {
if(this.element.hasClass('js-header-fix-moment')) {
this.hasFixedClass = true;
this.element.removeClass('js-header-fix-moment');
}
if( this.config.fixPointSelf ) {
this.offset = this.element.offset().top;
}
else {
this.offset = isFinite( this.element.data('header-fix-moment') ) ? this.element.data('header-fix-moment') : 0;
}
if(this.hasFixedClass) {
this.hasFixedClass = false;
this.element.addClass('js-header-fix-moment');
}
this.imgs = this.element.find('.u-header__logo-img');
this.defaultState = true;
this.mainLogo = this.imgs.filter('.u-header__logo-img--main');
this.additionalLogo = this.imgs.not('.u-header__logo-img--main');
if( !this.imgs.length ) return this;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderChangeLogoObserver.prototype.destroy = function() {
this.toDefaultState();
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderChangeLogoObserver.prototype.check = function() {
var $w = $(window);
if( !this.imgs.length ) return this;
if( $w.scrollTop() > this.offset && this.defaultState) {
this.changeState();
}
else if( $w.scrollTop() <= this.offset && !this.defaultState ) {
this.toDefaultState();
}
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderChangeLogoObserver.prototype.changeState = function() {
if(this.mainLogo.length) {
this.mainLogo.removeClass('u-header__logo-img--main');
}
if(this.additionalLogo.length) {
this.additionalLogo.addClass('u-header__logo-img--main');
}
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderChangeLogoObserver.prototype.toDefaultState = function() {
if(this.mainLogo.length) {
this.mainLogo.addClass('u-header__logo-img--main');
}
if(this.additionalLogo.length) {
this.additionalLogo.removeClass('u-header__logo-img--main');
}
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
function HSHeaderHideSectionObserver( element ) {
if( !HSAbstractObserver.call(this, element) ) return;
this.init();
}
/**
*
*
* @param
*
* @return Object
*/
HSHeaderHideSectionObserver.prototype.init = function() {
this.offset = isFinite( this.element.data('header-fix-moment') ) ? this.element.data('header-fix-moment') : 5;
this.section = this.element.find('.u-header__section--hidden');
this.defaultState = true;
this.sectionHeight = this.section.length ? this.section.outerHeight() : 0;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderHideSectionObserver.prototype.destroy = function() {
if( this.section.length ) {
this.element.css({
'margin-top': 0
});
}
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderHideSectionObserver.prototype.check = function() {
if(!this.section.length) return this;
var $w = $(window),
docScrolled = $w.scrollTop();
if( docScrolled > this.offset && this.defaultState) {
this.changeState();
}
else if( docScrolled <= this.offset && !this.defaultState ) {
this.toDefaultState();
}
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderHideSectionObserver.prototype.changeState = function() {
var self = this;
this.element.stop().animate({
'margin-top': self.sectionHeight * -1 - 1 // last '-1' is a small fix
});
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderHideSectionObserver.prototype.toDefaultState = function() {
this.element.stop().animate({
'margin-top': 0
});
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
function HSHeaderChangeAppearanceObserver(element, config) {
if( !HSAbstractObserver.call(this, element) ) return;
this.config = {
fixPointSelf: false
}
if( config && $.isPlainObject(config) ) this.config = $.extend(true, {}, this.config, config);
this.init();
}
/**
*
*
* @param
*
* @return
*/
HSHeaderChangeAppearanceObserver.prototype.init = function() {
if(this.element.hasClass('js-header-fix-moment')) {
this.hasFixedClass = true;
this.element.removeClass('js-header-fix-moment');
}
if( this.config.fixPointSelf ) {
this.offset = this.element.offset().top;
}
else {
this.offset = isFinite( this.element.data('header-fix-moment') ) ? this.element.data('header-fix-moment') : 5;
}
if( this.hasFixedClass ) {
this.hasFixedClass = false;
this.element.addClass('js-header-fix-moment');
}
this.sections = this.element.find('[data-header-fix-moment-classes]');
this.defaultState = true;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderChangeAppearanceObserver.prototype.destroy = function() {
this.toDefaultState();
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderChangeAppearanceObserver.prototype.check = function() {
if( !this.sections.length ) return this;
var $w = $(window),
docScrolled = $w.scrollTop();
if( docScrolled > this.offset && this.defaultState) {
this.changeState();
}
else if( docScrolled <= this.offset && !this.defaultState ) {
this.toDefaultState();
}
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderChangeAppearanceObserver.prototype.changeState = function() {
this.sections.each(function(i,el){
var $this = $(el),
classes = $this.data('header-fix-moment-classes'),
exclude = $this.data('header-fix-moment-exclude');
if( !classes && !exclude ) return;
$this.addClass( classes + ' js-header-change-moment');
$this.removeClass( exclude );
});
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderChangeAppearanceObserver.prototype.toDefaultState = function() {
this.sections.each(function(i,el){
var $this = $(el),
classes = $this.data('header-fix-moment-classes'),
exclude = $this.data('header-fix-moment-exclude');
if( !classes && !exclude ) return;
$this.removeClass( classes + ' js-header-change-moment' );
$this.addClass( exclude );
});
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
function HSHeaderHasHiddenElement(element, config) {
if( !HSAbstractObserver.call(this, element) ) return;
this.config = {
animated: true
}
if( config && $.isPlainObject(config) ) this.config = $.extend(true, {}, this.config, config);
this.init();
}
/**
*
*
* @param
*
* @return
*/
HSHeaderHasHiddenElement.prototype.init = function() {
this.offset = isFinite( this.element.data('header-fix-moment') ) ? this.element.data('header-fix-moment') : 5;
this.elements = this.element.find('.u-header--hidden-element');
this.defaultState = true;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderHasHiddenElement.prototype.destroy = function() {
this.toDefaultState();
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderHasHiddenElement.prototype.check = function() {
if( !this.elements.length ) return this;
var $w = $(window),
docScrolled = $w.scrollTop();
if( docScrolled > this.offset && this.defaultState) {
this.changeState();
}
else if( docScrolled <= this.offset && !this.defaultState ) {
this.toDefaultState();
}
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderHasHiddenElement.prototype.changeState = function() {
if(this.config.animated) {
this.elements.stop().slideUp();
}
else {
this.elements.hide();
}
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderHasHiddenElement.prototype.toDefaultState = function() {
if(this.config.animated) {
this.elements.stop().slideDown();
}
else {
this.elements.show();
}
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
function HSHeaderFloatingObserver(element, config) {
if( !HSAbstractObserver.call(this, element) ) return;
this.config = config && $.isPlainObject(config) ? $.extend(true, {}, this.config, config) : {};
this.init();
}
/**
*
*
* @param
*
* @return
*/
HSHeaderFloatingObserver.prototype.init = function() {
this.offset = this.element.offset().top;
this.sections = this.element.find('.u-header__section');
this.defaultState = true;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderFloatingObserver.prototype.destroy = function() {
this.toDefaultState();
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderFloatingObserver.prototype.check = function() {
var $w = $(window),
docScrolled = $w.scrollTop();
if( docScrolled > this.offset && this.defaultState) {
this.changeState();
}
else if( docScrolled <= this.offset && !this.defaultState ) {
this.toDefaultState();
}
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderFloatingObserver.prototype.changeState = function() {
this.element
.addClass('js-header-fix-moment')
.addClass( this.element.data('header-fix-moment-classes') )
.removeClass( this.element.data('header-fix-moment-exclude') );
if( this.sections.length ) {
this.sections.each(function(i, el){
var $section = $(el);
$section.addClass( $section.data('header-fix-moment-classes') )
.removeClass( $section.data('header-fix-moment-exclude') );
});
}
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
HSHeaderFloatingObserver.prototype.toDefaultState = function() {
this.element
.removeClass('js-header-fix-moment')
.removeClass( this.element.data('header-fix-moment-classes') )
.addClass( this.element.data('header-fix-moment-exclude') );
if( this.sections.length ) {
this.sections.each(function(i, el){
var $section = $(el);
$section.removeClass( $section.data('header-fix-moment-classes') )
.addClass( $section.data('header-fix-moment-exclude') );
});
}
this.defaultState = !this.defaultState;
return this;
}
/**
*
*
* @param
*
* @return
*/
function HSHeaderWithoutBehaviorObserver( element ) { if( !HSAbstractObserver.call(this, element) ) return; }
HSHeaderWithoutBehaviorObserver.prototype.check = function() {
return this;
}
HSHeaderWithoutBehaviorObserver.prototype.init = function() {
return this;
}
HSHeaderWithoutBehaviorObserver.prototype.destroy = function() {
return this;
}
HSHeaderWithoutBehaviorObserver.prototype.changeState = function() {
return this;
}
HSHeaderWithoutBehaviorObserver.prototype.toDefaultState = function() {
return this;
}
})(jQuery);