blob: 08821e5e419ee1698595f2b0d3dea63179143904 [file] [log] [blame]
/**
* @module RD Navbar
* @author Evgeniy Gusarov
* @see https://ua.linkedin.com/pub/evgeniy-gusarov/8a/a40/54a
* @version 2.1.0
*/
(function(){var f;f="ontouchstart"in window;(function(c,n,m){var l;l=function(){function d(a,b){this.options=c.extend(!1,{},this.Defaults,b);this.$element=c(a);this.$clone=null;this.$win=c(m);this.$doc=c(n);this.currentLayout=this.options.layout;this.loaded=!1;this.focusOnHover=this.options.focusOnHover;this.isStuck=this.cloneTimer=this.focusTimer=!1;this.initialize()}d.prototype.Defaults={layout:"rd-navbar-static",deviceLayout:"rd-navbar-fixed",focusOnHover:!0,focusOnHoverTimeout:800,linkedElements:["html"],
domAppend:!0,stickUp:!0,stickUpClone:!0,stickUpOffset:"100%",anchorNavSpeed:400,anchorNavOffset:0,anchorNavEasing:"swing",responsive:{0:{layout:"rd-navbar-fixed",focusOnHover:!1,stickUp:!1},992:{layout:"rd-navbar-static",focusOnHover:!0,stickUp:!0}},callbacks:{onToggleSwitch:!1,onToggleClose:!1,onDomAppend:!1,onDropdownOver:!1,onDropdownOut:!1,onDropdownToggle:!1,onDropdownClose:!1,onStuck:!1,onUnstuck:!1,onAnchorChange:!1}};d.prototype.initialize=function(){this.$element.addClass("rd-navbar").addClass(this.options.layout);
f&&this.$element.addClass("rd-navbar--is-touch");this.options.domAppend&&this.createNav(this);this.options.stickUpClone&&this.createClone(this);this.applyHandlers(this);this.offset=this.$element.offset().top;this.height=this.$element.outerHeight();this.loaded=!0;return this};d.prototype.resize=function(a,b){var e,h;h=f?a.getOption("deviceLayout"):a.getOption("layout");e=a.$element.add(a.$clone);h===a.currentLayout&&a.loaded||(a.switchClass(e,a.currentLayout,h),null!=a.options.linkedElements&&c.grep(a.options.linkedElements,
function(b,c){return a.switchClass(b,a.currentLayout+"-linked",h+"-linked")}),a.currentLayout=h);a.focusOnHover=a.getOption("focusOnHover");return a};d.prototype.stickUp=function(a,b){var e,h,d,g;h=a.getOption("stickUp");e=a.$doc.scrollTop();g=null!=a.$clone?a.$clone:a.$element;d=a.getOption("stickUpOffset");d="string"===typeof d?0<d.indexOf("%")?parseFloat(d)*a.height/100:parseFloat(d):d;if(h){if(e>=d&&!a.isStuck||e<d&&a.isStuck)if(a.$element.add(a.$clone).find("[data-rd-navbar-toggle]").each(function(){c.proxy(a.closeToggle,
this)(a,!1)}).end().find(".rd-navbar-submenu").removeClass("opened").removeClass("focus"),e>=d&&!a.isStuck)"resize"===b.type?a.switchClass(g,"","rd-navbar--is-stuck"):g.addClass("rd-navbar--is-stuck"),a.isStuck=!0,a.options.callbacks.onStuck&&a.options.callbacks.onStuck.call(a);else{if("resize"===b.type)a.switchClass(g,"rd-navbar--is-stuck","");else g.removeClass("rd-navbar--is-stuck").one("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",c.proxy(a.resizeWrap,a,b));a.isStuck=!1;a.options.callbacks.onUnstuck&&
a.options.callbacks.onUnstuck.call(a)}}else a.isStuck&&(a.switchClass(g,"rd-navbar--is-stuck",""),a.isStuck=!1,a.resizeWrap(b));return a};d.prototype.resizeWrap=function(a){var b;if(null==this.$clone&&!this.isStuck)return b=this.$element.parent(),this.height=this.$element.outerHeight(),"resize"===a.type?(b.addClass("rd-navbar--no-transition").css("height",this.height),b[0].offsetHeight,b.removeClass("rd-navbar--no-transition")):b.css("height",this.height)};d.prototype.createNav=function(a){a.$element.find(".rd-navbar-dropdown, .rd-navbar-megamenu").each(function(){var a;
a=c(this);return a.hasClass("rd-navbar-megamenu")?a.parent().addClass("rd-navbar--has-megamenu"):a.parent().addClass("rd-navbar--has-dropdown")}).parents("li").addClass("rd-navbar-submenu").append(c("<span/>",{"class":"rd-navbar-submenu-toggle"}));a.options.callbacks.onDomAppend&&a.options.callbacks.onDomAppend.call(this);return a};d.prototype.createClone=function(a){a.$clone=a.$element.clone().insertAfter(a.$element).addClass("rd-navbar--is-clone");return a};d.prototype.closeToggle=function(a,b){var e,
d,f;e=c(b.target);d=!1;b.target!==this&&!e.parents("[data-rd-navbar-toggle]").length&&(f=this.getAttribute("data-rd-navbar-toggle"))&&(e=c(this).parents(".rd-navbar").find(f).add(c(this).parents(".rd-navbar")[0]),e.each(function(){if(!d)return d=!0===(b.target===this||c.contains(this,b.target))}),d||(e.add(this).removeClass("active"),a.options.callbacks.onToggleClose&&a.options.callbacks.onToggleClose.call(this,a)));return this};d.prototype.switchToggle=function(a,b){var e;b.preventDefault();if(e=
this.getAttribute("data-rd-navbar-toggle"))c("[data-rd-navbar-toggle]").not(this).each(function(){var a;if(a=this.getAttribute("data-rd-navbar-toggle"))return c(this).parents(".rd-navbar").find(a).add(this).add(-1<c.inArray(".rd-navbar",a.split(/\s*,\s*/i))?c(this).parents(".rd-navbar")[0]:!1).removeClass("active")}),c(this).parents(".rd-navbar").find(e).add(this).add(-1<c.inArray(".rd-navbar",e.split(/\s*,\s*/i))?c(this).parents(".rd-navbar")[0]:!1).toggleClass("active"),a.options.callbacks.onToggleSwitch&&
a.options.callbacks.onToggleSwitch.call(this,a);return this};d.prototype.dropdownOver=function(a,b){var e;a.focusOnHover&&!f&&(e=c(this),clearTimeout(b),e.addClass("focus").siblings().removeClass("opened").each(a.dropdownUnfocus),a.options.callbacks.onDropdownOver&&a.options.callbacks.onDropdownOver.call(this,a));return this};d.prototype.dropdownOut=function(a,b){var e;a.focusOnHover&&!f&&(e=c(this),e.one("mouseenter.navbar",function(){return clearTimeout(b)}),clearTimeout(b),b=setTimeout(c.proxy(a.dropdownUnfocus,
this,a),a.options.focusOnHoverTimeout),a.options.callbacks.onDropdownOut&&a.options.callbacks.onDropdownOut.call(this,a));return this};d.prototype.dropdownUnfocus=function(a){c(this).find("li.focus").add(this).removeClass("focus");return this};d.prototype.dropdownClose=function(a,b){var e;b.target===this||c(b.target).parents(".rd-navbar-submenu").length||(e=c(this),e.find("li.focus").add(this).removeClass("focus").removeClass("opened"),a.options.callbacks.onDropdownClose&&a.options.callbacks.onDropdownClose.call(this,
a));return this};d.prototype.dropdownToggle=function(a){c(this).toggleClass("opened").siblings().removeClass("opened");a.options.callbacks.onDropdownToggle&&a.options.callbacks.onDropdownToggle.call(this,a);return this};d.prototype.goToAnchor=function(a,b){var e,d;d=this.hash;e=c(d);e.length&&(b.preventDefault(),c("html, body").stop().animate({scrollTop:e.offset().top+a.getOption("anchorNavOffset")+1},a.getOption("anchorNavSpeed"),a.getOption("anchorNavEasing"),function(){return a.changeAnchor(d)}));
return this};d.prototype.activateAnchor=function(a){var b,e,d,f,g,k;k=this.$doc.scrollTop();g=this.$win.height();b=this.$doc.height();a=this.getOption("anchorNavOffset");if(k+g>b-50)return b=c('[data-type="anchor"]').last(),b.length&&b.offset().top>=k&&(f="#"+b.attr("id"),e=c('.rd-navbar-nav a[href^="'+f+'"]').parent(),e.hasClass("active")||(e.addClass("active").siblings().removeClass("active"),this.options.callbacks.onAnchorChange&&this.options.callbacks.onAnchorChange.call(b[0],this))),b;g=c('.rd-navbar-nav a[href^="#"]').get();
for(e in g)b=g[e],d=c(b),f=d.attr("href"),b=c(f),b.length&&b.offset().top+a<=k&&b.offset().top+b.outerHeight()>k&&(d.parent().addClass("active").siblings().removeClass("active"),this.options.callbacks.onAnchorChange&&this.options.callbacks.onAnchorChange.call(b[0],this));return null};d.prototype.getAnchor=function(){return history&&history.state?history.state.id:null};d.prototype.changeAnchor=function(a){history&&(history.state?history.state.id!==a?history.replaceState({anchorId:a},null,a):history.pushState({anchorId:a},
null,a):history.pushState({anchorId:a},null,a));return this};d.prototype.applyHandlers=function(a){null!=a.options.responsive&&a.$win.on("resize.navbar",c.proxy(a.resize,a.$win[0],a)).on("resize.navbar",c.proxy(a.resizeWrap,a)).on("resize.navbar",c.proxy(a.stickUp,null!=a.$clone?a.$clone:a.$element,a)).on("orientationchange.navbar",c.proxy(a.resize,a.$win[0],a)).trigger("resize.navbar");a.$doc.on("scroll.navbar",c.proxy(a.stickUp,null!=a.$clone?a.$clone:a.$element,a)).on("scroll.navbar",c.proxy(a.activateAnchor,
a));a.$element.add(a.$clone).find("[data-rd-navbar-toggle]").each(function(){var b;b=c(this);b.on(f?"touchstart":"click",c.proxy(a.switchToggle,this,a));return b.parents("body").on(f?"touchstart":"click",c.proxy(a.closeToggle,this,a))});a.$element.add(a.$clone).find(".rd-navbar-submenu").each(function(){var b,d;b=c(this);d=b.parents(".rd-navbar--is-clone").length?a.cloneTimer:a.focusTimer;b.on("mouseleave.navbar",c.proxy(a.dropdownOut,this,a,d));b.find("> a").on("mouseenter.navbar",c.proxy(a.dropdownOver,
this,a,d));b.find("> .rd-navbar-submenu-toggle").on(f?"touchstart":"click",c.proxy(a.dropdownToggle,this,a));return b.parents("body").on(f?"touchstart":"click",c.proxy(a.dropdownClose,this,a))});a.$element.add(a.$clone).find('.rd-navbar-nav a[href^="#"]').each(function(){return c(this).on(f?"touchstart":"click",c.proxy(a.goToAnchor,this,a))});return a};d.prototype.switchClass=function(a,b,d){a=a instanceof jQuery?a:c(a);a.addClass("rd-navbar--no-transition").removeClass(b).addClass(d);a[0].offsetHeight;
return a.removeClass("rd-navbar--no-transition")};d.prototype.getOption=function(a){var b,c;for(b in this.options.responsive)b<=this.$win.width()&&(c=b);return null!=this.options.responsive[c][a]?this.options.responsive[c][a]:this.options[a]};return d}();c.fn.extend({RDNavbar:function(d){var a;a=c(this);if(!a.data("RDNavbar"))return a.data("RDNavbar",new l(this,d))}});return m.RDNavbar=l})(window.jQuery,document,window);"undefined"!==typeof module&&null!==module?module.exports=window.RDNavbar:"function"===
typeof define&&define.amd&&define(["jquery"],function(){return window.RDNavbar})}).call(this);