(function($){var sticky=function(element,usersettings){var $element,issticky=false,isfollowingparent=false,isreachedeffectspoint=false,elements={},settings;var defaultsettings={to:"top",offset:0,effectsoffset:0,parent:false,classes:{sticky:"sticky",stickyactive:"sticky-active",stickyeffects:"sticky-effects",spacer:"sticky-spacer"}};var initelements=function(){$element=$(element).addclass(settings.classes.sticky);elements.$window=$(window);if(settings.parent){if("parent"===settings.parent){elements.$parent=$element.parent()}else{elements.$parent=$element.closest(settings.parent)}}};var initsettings=function(){settings=jquery.extend(true,defaultsettings,usersettings)};var bindevents=function(){elements.$window.on({scroll:onwindowscroll,resize:onwindowresize})};var unbindevents=function(){elements.$window.off("scroll",onwindowscroll).off("resize",onwindowresize)};var init=function(){initsettings();initelements();bindevents();checkposition()};var backupcss=function($elementbackupcss,backupstate,properties){var css={},elementstyle=$elementbackupcss[0].style;properties.foreach(function(property){css[property]=undefined!==elementstyle[property]?elementstyle[property]:""});$elementbackupcss.data("css-backup-"+backupstate,css)};var getcssbackup=function($elementcssbackup,backupstate){return $elementcssbackup.data("css-backup-"+backupstate)};var addspacer=function(){elements.$spacer=$element.clone().addclass(settings.classes.spacer).css({visibility:"hidden",transition:"none",animation:"none"});$element.after(elements.$spacer)};var removespacer=function(){elements.$spacer.remove()};var stickelement=function(){backupcss($element,"unsticky",["position","width","margin-top","margin-bottom","top","bottom"]);var css={position:"fixed",width:getelementoutersize($element,"width"),margintop:0,marginbottom:0};css[settings.to]=settings.offset;css["top"===settings.to?"bottom":"top"]="";$element.css(css).addclass(settings.classes.stickyactive)};var unstickelement=function(){$element.css(getcssbackup($element,"unsticky")).removeclass(settings.classes.stickyactive)};var followparent=function(){backupcss(elements.$parent,"childnotfollowing",["position"]);elements.$parent.css("position","relative");backupcss($element,"notfollowing",["position","top","bottom"]);var css={position:"absolute"};css[settings.to]="";css["top"===settings.to?"bottom":"top"]=0;$element.css(css);isfollowingparent=true};var unfollowparent=function(){elements.$parent.css(getcssbackup(elements.$parent,"childnotfollowing"));$element.css(getcssbackup($element,"notfollowing"));isfollowingparent=false};var getelementoutersize=function($elementoutersize,dimension,includemargins){var computedstyle=getcomputedstyle($elementoutersize[0]),elementsize=parsefloat(computedstyle[dimension]),sides="height"===dimension?["top","bottom"]:["left","right"],propertiestoadd=[];if("border-box"!==computedstyle.boxsizing){propertiestoadd.push("border","padding")}if(includemargins){propertiestoadd.push("margin")}propertiestoadd.foreach(function(property){sides.foreach(function(side){elementsize+=parsefloat(computedstyle[property+"-"+side])})});return elementsize};var getelementviewportoffset=function($elementviewportoffset){var windowscrolltop=elements.$window.scrolltop(),elementheight=getelementoutersize($elementviewportoffset,"height"),viewportheight=innerheight,elementoffsetfromtop=$elementviewportoffset.offset().top,distancefromtop=elementoffsetfromtop-windowscrolltop,topfrombottom=distancefromtop-viewportheight;return{top:{fromtop:distancefromtop,frombottom:topfrombottom},bottom:{fromtop:distancefromtop+elementheight,frombottom:topfrombottom+elementheight}}};var stick=function(){addspacer();stickelement();issticky=true;$element.trigger("sticky:stick")};var unstick=function(){unstickelement();removespacer();issticky=false;$element.trigger("sticky:unstick")};var checkparent=function(){var elementoffset=getelementviewportoffset($element),istop="top"===settings.to;if(isfollowingparent){var isneedunfollowing=istop?elementoffset.top.fromtop>settings.offset:elementoffset.bottom.frombottom<-settings.offset;if(isneedunfollowing){unfollowparent()}}else{var parentoffset=getelementviewportoffset(elements.$parent),parentstyle=getcomputedstyle(elements.$parent[0]),borderwidthtodecrease=parsefloat(parentstyle[istop?"borderbottomwidth":"bordertopwidth"]),parentviewportdistance=istop?parentoffset.bottom.fromtop-borderwidthtodecrease:parentoffset.top.frombottom+borderwidthtodecrease,isneedfollowing=istop?parentviewportdistance<=elementoffset.bottom.fromtop:parentviewportdistance>=elementoffset.top.frombottom;if(isneedfollowing){followparent()}}};var checkeffectspoint=function(distancefromtriggerpoint){if(isreachedeffectspoint&&-distancefromtriggerpoint=settings.effectsoffset){$element.addclass(settings.classes.stickyeffects);isreachedeffectspoint=true}};var checkposition=function(){var offset=settings.offset,distancefromtriggerpoint;if(issticky){var spacerviewportoffset=getelementviewportoffset(elements.$spacer);distancefromtriggerpoint="top"===settings.to?spacerviewportoffset.top.fromtop-offset:-spacerviewportoffset.bottom.frombottom-offset;if(settings.parent){checkparent()}if(distancefromtriggerpoint>0){unstick()}}else{var elementviewportoffset=getelementviewportoffset($element);distancefromtriggerpoint="top"===settings.to?elementviewportoffset.top.fromtop-offset:-elementviewportoffset.bottom.frombottom-offset;if(distancefromtriggerpoint<=0){stick();if(settings.parent){checkparent()}}}checkeffectspoint(distancefromtriggerpoint)};var onwindowscroll=function(){checkposition()};var onwindowresize=function(){if(!issticky){return}unstickelement();stickelement();if(settings.parent){isfollowingparent=false;checkparent()}};this.destroy=function(){if(issticky){unstick()}unbindevents();$element.removeclass(settings.classes.sticky)};init()};$.fn.sticky=function(settings){var iscommand="string"===typeof settings;this.each(function(){var $this=$(this);if(!iscommand){$this.data("sticky",new sticky(this,settings));return}var instance=$this.data("sticky");if(!instance){throw error("trying to perform the `"+settings+"` method prior to initialization")}if(!instance[settings]){throw referenceerror("method `"+settings+"` not found in sticky instance")}instance[settings].apply(instance,array.prototype.slice.call(arguments,1));if("destroy"===settings){$this.removedata("sticky")}});return this};window.sticky=sticky})(jquery);