/**
 * @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);
