/** * smooth-scroll v5.3.6 * Animate scrolling to anchor links, by Chris Ferdinandi. * http://github.com/cferdinandi/smooth-scroll * * Free to use under the MIT License. * http://gomakethings.com/mit/ */ (function(root,factory){if(typeof define==='function'&&define.amd){define([],factory(root))}else if(typeof exports==='object'){module.exports=factory(root)}else{root.smoothScroll=factory(root)}})(this,function(root){'use strict';var smoothScroll={};var supports=!!document.querySelector&&!!root.addEventListener;var settings,eventTimeout,fixedHeader,headerHeight;var defaults={speed:500,easing:'easeInOutCubic',offset:0,updateURL:!0,callbackBefore:function(){},callbackAfter:function(){}};var forEach=function(collection,callback,scope){if(Object.prototype.toString.call(collection)==='[object Object]'){for(var prop in collection){if(Object.prototype.hasOwnProperty.call(collection,prop)){callback.call(scope,collection[prop],prop,collection)}}}else{for(var i=0,len=collection.length;i=0x0001&&codeUnit<=0x001F)||codeUnit==0x007F||(index===0&&codeUnit>=0x0030&&codeUnit<=0x0039)||(index===1&&codeUnit>=0x0030&&codeUnit<=0x0039&&firstCodeUnit===0x002D)){result+='\\'+codeUnit.toString(16)+' ';continue} if(codeUnit>=0x0080||codeUnit===0x002D||codeUnit===0x005F||codeUnit>=0x0030&&codeUnit<=0x0039||codeUnit>=0x0041&&codeUnit<=0x005A||codeUnit>=0x0061&&codeUnit<=0x007A){result+=string.charAt(index);continue} result+='\\'+string.charAt(index)} return result};var easingPattern=function(type,time){var pattern;if(type==='easeInQuad')pattern=time*time;if(type==='easeOutQuad')pattern=time*(2-time);if(type==='easeInOutQuad')pattern=time<0.5?2*time*time:-1+(4-2*time)*time;if(type==='easeInCubic')pattern=time*time*time;if(type==='easeOutCubic')pattern=(--time)*time*time+1;if(type==='easeInOutCubic')pattern=time<0.5?4*time*time*time:(time-1)*(2*time-2)*(2*time-2)+1;if(type==='easeInQuart')pattern=time*time*time*time;if(type==='easeOutQuart')pattern=1-(--time)*time*time*time;if(type==='easeInOutQuart')pattern=time<0.5?8*time*time*time*time:1-8*(--time)*time*time*time;if(type==='easeInQuint')pattern=time*time*time*time*time;if(type==='easeOutQuint')pattern=1+(--time)*time*time*time*time;if(type==='easeInOutQuint')pattern=time<0.5?16*time*time*time*time*time:1+16*(--time)*time*time*time*time;return pattern||time};var getEndLocation=function(anchor,headerHeight,offset){var location=0;if(anchor.offsetParent){do{location+=anchor.offsetTop;anchor=anchor.offsetParent}while(anchor)} location=location-headerHeight-offset;return location>=0?location:0};var getDocumentHeight=function(){return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)};var getDataOptions=function(options){return!options||!(typeof JSON==='object'&&typeof JSON.parse==='function')?{}:JSON.parse(options)};var updateUrl=function(anchor,url){if(history.pushState&&(url||url==='true')){history.pushState(null,null,[root.location.protocol,'//',root.location.host,root.location.pathname,root.location.search,anchor].join(''))}};var getHeaderHeight=function(header){return header===null?0:(getHeight(header)+header.offsetTop)};smoothScroll.animateScroll=function(toggle,anchor,options){var settings=extend(settings||defaults,options||{});var overrides=getDataOptions(toggle?toggle.getAttribute('data-options'):null);settings=extend(settings,overrides);anchor='#'+escapeCharacters(anchor.substr(1));var anchorElem=anchor==='#'?document.documentElement:document.querySelector(anchor);var startLocation=root.pageYOffset;if(!fixedHeader){fixedHeader=document.querySelector('[data-scroll-header]')} if(!headerHeight){headerHeight=getHeaderHeight(fixedHeader)} var endLocation=getEndLocation(anchorElem,headerHeight,parseInt(settings.offset,10));var animationInterval;var distance=endLocation-startLocation;var documentHeight=getDocumentHeight();var timeLapsed=0;var percentage,position;updateUrl(anchor,settings.updateURL);var stopAnimateScroll=function(position,endLocation,animationInterval){var currentLocation=root.pageYOffset;if(position==endLocation||currentLocation==endLocation||((root.innerHeight+currentLocation)>=documentHeight)){clearInterval(animationInterval);anchorElem.focus();settings.callbackAfter(toggle,anchor)}};var loopAnimateScroll=function(){timeLapsed+=16;percentage=(timeLapsed/parseInt(settings.speed,10));percentage=(percentage>1)?1:percentage;position=startLocation+(distance*easingPattern(settings.easing,percentage));root.scrollTo(0,Math.floor(position));stopAnimateScroll(position,endLocation,animationInterval)};var startAnimateScroll=function(){settings.callbackBefore(toggle,anchor);animationInterval=setInterval(loopAnimateScroll,16)};if(root.pageYOffset===0){root.scrollTo(0,0)} startAnimateScroll()};var eventHandler=function(event){var toggle=getClosest(event.target,'[data-scroll]');if(toggle&&toggle.tagName.toLowerCase()==='a'){event.preventDefault();smoothScroll.animateScroll(toggle,toggle.hash,settings)}};var eventThrottler=function(event){if(!eventTimeout){eventTimeout=setTimeout(function(){eventTimeout=null;headerHeight=getHeaderHeight(fixedHeader)},66)}};smoothScroll.destroy=function(){if(!settings)return;document.removeEventListener('click',eventHandler,!1);root.removeEventListener('resize',eventThrottler,!1);settings=null;eventTimeout=null;fixedHeader=null;headerHeight=null};smoothScroll.init=function(options){if(!supports)return;smoothScroll.destroy();settings=extend(defaults,options||{});fixedHeader=document.querySelector('[data-scroll-header]');headerHeight=getHeaderHeight(fixedHeader);document.addEventListener('click',eventHandler,!1);if(fixedHeader){root.addEventListener('resize',eventThrottler,!1)}};return smoothScroll})