{"version":3,"sources":["module.js","helpers.js","request-animation.js","spy-api.js","scroll-container-api.js","smooth-scroll.js","spy-context.js","scroll-container.js","scrollspy.js"],"names":["duScrollDefaultEasing","x","Math","pow","duScroll","angular","module","value","exports","run","$window","$q","cancelAnimation","requestAnimation","duScrollEasing","duScrollDuration","duScrollOffset","duScrollCancelOnEvents","proto","isDocument","el","HTMLDocument","nodeType","DOCUMENT_NODE","isElement","HTMLElement","ELEMENT_NODE","unwrap","duScrollTo","left","top","duration","easing","aliasFn","this","duScrollToElement","isDefined","duScrollToAnimated","apply","arguments","scrollTo","scrollLeft","scrollTop","scrollAnimation","deferred","startLeft","duScrollLeft","startTop","duScrollTop","deltaLeft","round","deltaTop","startTime","progress","cancelScrollAnimation","$event","which","unbind","reject","defer","resolve","promise","animationStep","timestamp","percent","ceil","bind","target","offset","isNumber","isNaN","getBoundingClientRect","scrollX","document","documentElement","body","scrollY","duScrollToElementAnimated","duScrollTopAnimated","duScrollLeftAnimated","forEach","fn","key","element","prototype","unprefixed","replace","isUndefined","factory","vendors","fnName","fallback","suffix","substr","toUpperCase","i","length","polyfill","$timeout","lastTime","callback","currTime","Date","getTime","timeToCall","max","id","cancel","$rootScope","$document","scrollContainerAPI","duScrollGreedy","duScrollSpyWait","duScrollBottomSpy","duScrollActiveClass","createScrollHandler","context","timer","queued","handler","bottomReached","container","containerEl","containerOffset","clientHeight","scrollHeight","documentScrollHeight","pageYOffset","innerHeight","currentlyActive","toBeActive","spies","spy","pos","compareProperty","undefined","getTargetPosition","height","$element","removeClass","$broadcast","getTargetElement","addClass","contexts","createContext","$scope","$id","$on","destroyContext","off","defaultContextId","getContextForScope","scope","$parent","getContextForSpy","contextId","indexOf","isElementInDocument","parentNode","addSpy","push","getContainer","on","triggerHandler","removeSpy","splice","containers","setContainer","getContainerId","removeContainer","directive","link","$attr","e","href","duSmoothScroll","substring","getElementById","getElementsByName","stopPropagation","preventDefault","parseInt","spyAPI","restrict","compile","tElement","tAttrs","transclude","pre","iElement","iAttrs","controller","$observe","isString","Spy","targetElementOrId","targetId","flushTargetCache","ngHref","duScrollspy","timeoutPromise","deregisterOnStateChange"],"mappings":"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","file":"angular-scroll.min.js","sourcesContent":["/**\n  * x is a value between 0 and 1, indicating where in the animation you are.\n  */\nvar duScrollDefaultEasing = function (x) {\n  'use strict';\n\n  if(x < 0.5) {\n    return Math.pow(x*2, 2)/2;\n  }\n  return 1-Math.pow((1-x)*2, 2)/2;\n};\n\nvar duScroll = angular.module('duScroll', [\n  'duScroll.scrollspy',\n  'duScroll.smoothScroll',\n  'duScroll.scrollContainer',\n  'duScroll.spyContext',\n  'duScroll.scrollHelpers'\n])\n  //Default animation duration for smoothScroll directive\n  .value('duScrollDuration', 350)\n  //Scrollspy debounce interval, set to 0 to disable\n  .value('duScrollSpyWait', 100)\n  //Wether or not multiple scrollspies can be active at once\n  .value('duScrollGreedy', false)\n  //Default offset for smoothScroll directive\n  .value('duScrollOffset', 0)\n  //Default easing function for scroll animation\n  .value('duScrollEasing', duScrollDefaultEasing)\n  //Which events on the container (such as body) should cancel scroll animations\n  .value('duScrollCancelOnEvents', 'scroll mousedown mousewheel touchmove keydown')\n  //Whether or not to activate the last scrollspy, when page/container bottom is reached\n  .value('duScrollBottomSpy', false)\n  //Active class name\n  .value('duScrollActiveClass', 'active');\n\nif (typeof module !== 'undefined' && module && module.exports) {\n  module.exports = duScroll;\n}\n","angular.module('duScroll.scrollHelpers', ['duScroll.requestAnimation'])\n.run(function($window, $q, cancelAnimation, requestAnimation, duScrollEasing, duScrollDuration, duScrollOffset, duScrollCancelOnEvents) {\n  'use strict';\n\n  var proto = {};\n\n  var isDocument = function(el) {\n    return (typeof HTMLDocument !== 'undefined' && el instanceof HTMLDocument) || (el.nodeType && el.nodeType === el.DOCUMENT_NODE);\n  };\n\n  var isElement = function(el) {\n    return (typeof HTMLElement !== 'undefined' && el instanceof HTMLElement) || (el.nodeType && el.nodeType === el.ELEMENT_NODE);\n  };\n\n  var unwrap = function(el) {\n    return isElement(el) || isDocument(el) ? el : el[0];\n  };\n\n  proto.duScrollTo = function(left, top, duration, easing) {\n    var aliasFn;\n    if(angular.isElement(left)) {\n      aliasFn = this.duScrollToElement;\n    } else if(angular.isDefined(duration)) {\n      aliasFn = this.duScrollToAnimated;\n    }\n    if(aliasFn) {\n      return aliasFn.apply(this, arguments);\n    }\n    var el = unwrap(this);\n    if(isDocument(el)) {\n      return $window.scrollTo(left, top);\n    }\n    el.scrollLeft = left;\n    el.scrollTop = top;\n  };\n\n  var scrollAnimation, deferred;\n  proto.duScrollToAnimated = function(left, top, duration, easing) {\n    if(duration && !easing) {\n      easing = duScrollEasing;\n    }\n    var startLeft = this.duScrollLeft(),\n        startTop = this.duScrollTop(),\n        deltaLeft = Math.round(left - startLeft),\n        deltaTop = Math.round(top - startTop);\n\n    var startTime = null, progress = 0;\n    var el = this;\n\n    var cancelScrollAnimation = function($event) {\n      if (!$event || (progress && $event.which > 0)) {\n        if(duScrollCancelOnEvents) {\n          el.unbind(duScrollCancelOnEvents, cancelScrollAnimation);\n        }\n        cancelAnimation(scrollAnimation);\n        deferred.reject();\n        scrollAnimation = null;\n      }\n    };\n\n    if(scrollAnimation) {\n      cancelScrollAnimation();\n    }\n    deferred = $q.defer();\n\n    if(duration === 0 || (!deltaLeft && !deltaTop)) {\n      if(duration === 0) {\n        el.duScrollTo(left, top);\n      }\n      deferred.resolve();\n      return deferred.promise;\n    }\n\n    var animationStep = function(timestamp) {\n      if (startTime === null) {\n        startTime = timestamp;\n      }\n\n      progress = timestamp - startTime;\n      var percent = (progress >= duration ? 1 : easing(progress/duration));\n\n      el.scrollTo(\n        startLeft + Math.ceil(deltaLeft * percent),\n        startTop + Math.ceil(deltaTop * percent)\n      );\n      if(percent < 1) {\n        scrollAnimation = requestAnimation(animationStep);\n      } else {\n        if(duScrollCancelOnEvents) {\n          el.unbind(duScrollCancelOnEvents, cancelScrollAnimation);\n        }\n        scrollAnimation = null;\n        deferred.resolve();\n      }\n    };\n\n    //Fix random mobile safari bug when scrolling to top by hitting status bar\n    el.duScrollTo(startLeft, startTop);\n\n    if(duScrollCancelOnEvents) {\n      el.bind(duScrollCancelOnEvents, cancelScrollAnimation);\n    }\n\n    scrollAnimation = requestAnimation(animationStep);\n    return deferred.promise;\n  };\n\n  proto.duScrollToElement = function(target, offset, duration, easing) {\n    var el = unwrap(this);\n    if(!angular.isNumber(offset) || isNaN(offset)) {\n      offset = duScrollOffset;\n    }\n    var top = this.duScrollTop() + unwrap(target).getBoundingClientRect().top - offset;\n    if(isElement(el)) {\n      top -= el.getBoundingClientRect().top;\n    }\n    return this.duScrollTo(0, top, duration, easing);\n  };\n\n  proto.duScrollLeft = function(value, duration, easing) {\n    if(angular.isNumber(value)) {\n      return this.duScrollTo(value, this.duScrollTop(), duration, easing);\n    }\n    var el = unwrap(this);\n    if(isDocument(el)) {\n      return $window.scrollX || document.documentElement.scrollLeft || document.body.scrollLeft;\n    }\n    return el.scrollLeft;\n  };\n  proto.duScrollTop = function(value, duration, easing) {\n    if(angular.isNumber(value)) {\n      return this.duScrollTo(this.duScrollLeft(), value, duration, easing);\n    }\n    var el = unwrap(this);\n    if(isDocument(el)) {\n      return $window.scrollY || document.documentElement.scrollTop || document.body.scrollTop;\n    }\n    return el.scrollTop;\n  };\n\n  proto.duScrollToElementAnimated = function(target, offset, duration, easing) {\n    return this.duScrollToElement(target, offset, duration || duScrollDuration, easing);\n  };\n\n  proto.duScrollTopAnimated = function(top, duration, easing) {\n    return this.duScrollTop(top, duration || duScrollDuration, easing);\n  };\n\n  proto.duScrollLeftAnimated = function(left, duration, easing) {\n    return this.duScrollLeft(left, duration || duScrollDuration, easing);\n  };\n\n  angular.forEach(proto, function(fn, key) {\n    angular.element.prototype[key] = fn;\n\n    //Remove prefix if not already claimed by jQuery / ui.utils\n    var unprefixed = key.replace(/^duScroll/, 'scroll');\n    if(angular.isUndefined(angular.element.prototype[unprefixed])) {\n      angular.element.prototype[unprefixed] = fn;\n    }\n  });\n\n});\n","//Adapted from https://gist.github.com/paulirish/1579671\nangular.module('duScroll.polyfill', [])\n.factory('polyfill', function($window) {\n  'use strict';\n\n  var vendors = ['webkit', 'moz', 'o', 'ms'];\n\n  return function(fnName, fallback) {\n    if($window[fnName]) {\n      return $window[fnName];\n    }\n    var suffix = fnName.substr(0, 1).toUpperCase() + fnName.substr(1);\n    for(var key, i = 0; i < vendors.length; i++) {\n      key = vendors[i]+suffix;\n      if($window[key]) {\n        return $window[key];\n      }\n    }\n    return fallback;\n  };\n});\n\nangular.module('duScroll.requestAnimation', ['duScroll.polyfill'])\n.factory('requestAnimation', function(polyfill, $timeout) {\n  'use strict';\n\n  var lastTime = 0;\n  var fallback = function(callback, element) {\n    var currTime = new Date().getTime();\n    var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n    var id = $timeout(function() { callback(currTime + timeToCall); },\n      timeToCall);\n    lastTime = currTime + timeToCall;\n    return id;\n  };\n\n  return polyfill('requestAnimationFrame', fallback);\n})\n.factory('cancelAnimation', function(polyfill, $timeout) {\n  'use strict';\n\n  var fallback = function(promise) {\n    $timeout.cancel(promise);\n  };\n\n  return polyfill('cancelAnimationFrame', fallback);\n});\n","angular.module('duScroll.spyAPI', ['duScroll.scrollContainerAPI'])\n.factory('spyAPI', function($rootScope, $timeout, $window, $document, scrollContainerAPI, duScrollGreedy, duScrollSpyWait, duScrollBottomSpy, duScrollActiveClass) {\n  'use strict';\n\n  var createScrollHandler = function(context) {\n    var timer = false, queued = false;\n    var handler = function() {\n      queued = false;\n      var container = context.container,\n          containerEl = container[0],\n          containerOffset = 0,\n          bottomReached;\n\n      if (typeof HTMLElement !== 'undefined' && containerEl instanceof HTMLElement || containerEl.nodeType && containerEl.nodeType === containerEl.ELEMENT_NODE) {\n        containerOffset = containerEl.getBoundingClientRect().top;\n        bottomReached = Math.round(containerEl.scrollTop + containerEl.clientHeight) >= containerEl.scrollHeight;\n      } else {\n        var documentScrollHeight = $document[0].body.scrollHeight || $document[0].documentElement.scrollHeight; // documentElement for IE11\n        bottomReached = Math.round($window.pageYOffset + $window.innerHeight) >= documentScrollHeight;\n      }\n      var compareProperty = (duScrollBottomSpy && bottomReached ? 'bottom' : 'top');\n\n      var i, currentlyActive, toBeActive, spies, spy, pos;\n      spies = context.spies;\n      currentlyActive = context.currentlyActive;\n      toBeActive = undefined;\n\n      for(i = 0; i < spies.length; i++) {\n        spy = spies[i];\n        pos = spy.getTargetPosition();\n        if (!pos) continue;\n\n        if((duScrollBottomSpy && bottomReached) || (pos.top + spy.offset - containerOffset < 20 && (duScrollGreedy || pos.top*-1 + containerOffset) < pos.height)) {\n          //Find the one closest the viewport top or the page bottom if it's reached\n          if(!toBeActive || toBeActive[compareProperty] < pos[compareProperty]) {\n            toBeActive = {\n              spy: spy\n            };\n            toBeActive[compareProperty] = pos[compareProperty];\n          }\n        }\n      }\n\n      if(toBeActive) {\n        toBeActive = toBeActive.spy;\n      }\n      if(currentlyActive === toBeActive || (duScrollGreedy && !toBeActive)) return;\n      if(currentlyActive) {\n        currentlyActive.$element.removeClass(duScrollActiveClass);\n        $rootScope.$broadcast(\n          'duScrollspy:becameInactive',\n          currentlyActive.$element,\n          angular.element(currentlyActive.getTargetElement())\n        );\n      }\n      if(toBeActive) {\n        toBeActive.$element.addClass(duScrollActiveClass);\n        $rootScope.$broadcast(\n          'duScrollspy:becameActive',\n          toBeActive.$element,\n          angular.element(toBeActive.getTargetElement())\n        );\n      }\n      context.currentlyActive = toBeActive;\n    };\n\n    if(!duScrollSpyWait) {\n      return handler;\n    }\n\n    //Debounce for potential performance savings\n    return function() {\n      if(!timer) {\n        handler();\n        timer = $timeout(function() {\n          timer = false;\n          if(queued) {\n            handler();\n          }\n        }, duScrollSpyWait, false);\n      } else {\n        queued = true;\n      }\n    };\n  };\n\n  var contexts = {};\n\n  var createContext = function($scope) {\n    var id = $scope.$id;\n    var context = {\n      spies: []\n    };\n\n    context.handler = createScrollHandler(context);\n    contexts[id] = context;\n\n    $scope.$on('$destroy', function() {\n      destroyContext($scope);\n    });\n\n    return id;\n  };\n\n  var destroyContext = function($scope) {\n    var id = $scope.$id;\n    var context = contexts[id], container = context.container;\n    if(container) {\n      container.off('scroll', context.handler);\n    }\n    delete contexts[id];\n  };\n\n  var defaultContextId = createContext($rootScope);\n\n  var getContextForScope = function(scope) {\n    if(contexts[scope.$id]) {\n      return contexts[scope.$id];\n    }\n    if(scope.$parent) {\n      return getContextForScope(scope.$parent);\n    }\n    return contexts[defaultContextId];\n  };\n\n  var getContextForSpy = function(spy) {\n    var context, contextId, scope = spy.$scope;\n    if(scope) {\n      return getContextForScope(scope);\n    }\n    //No scope, most likely destroyed\n    for(contextId in contexts) {\n      context = contexts[contextId];\n      if(context.spies.indexOf(spy) !== -1) {\n        return context;\n      }\n    }\n  };\n\n  var isElementInDocument = function(element) {\n    while (element.parentNode) {\n      element = element.parentNode;\n      if (element === document) {\n        return true;\n      }\n    }\n    return false;\n  };\n\n  var addSpy = function(spy) {\n    var context = getContextForSpy(spy);\n    if (!context) return;\n    context.spies.push(spy);\n    if (!context.container || !isElementInDocument(context.container)) {\n      if(context.container) {\n        context.container.off('scroll', context.handler);\n      }\n      context.container = scrollContainerAPI.getContainer(spy.$scope);\n      context.container.on('scroll', context.handler).triggerHandler('scroll');\n    }\n  };\n\n  var removeSpy = function(spy) {\n    var context = getContextForSpy(spy);\n    if(spy === context.currentlyActive) {\n      $rootScope.$broadcast('duScrollspy:becameInactive', context.currentlyActive.$element);\n      context.currentlyActive = null;\n    }\n    var i = context.spies.indexOf(spy);\n    if(i !== -1) {\n      context.spies.splice(i, 1);\n    }\n\t\tspy.$element = null;\n  };\n\n  return {\n    addSpy: addSpy,\n    removeSpy: removeSpy,\n    createContext: createContext,\n    destroyContext: destroyContext,\n    getContextForScope: getContextForScope\n  };\n});\n","angular.module('duScroll.scrollContainerAPI', [])\n.factory('scrollContainerAPI', function($document) {\n  'use strict';\n\n  var containers = {};\n\n  var setContainer = function(scope, element) {\n    var id = scope.$id;\n    containers[id] = element;\n    return id;\n  };\n\n  var getContainerId = function(scope) {\n    if(containers[scope.$id]) {\n      return scope.$id;\n    }\n    if(scope.$parent) {\n      return getContainerId(scope.$parent);\n    }\n    return;\n  };\n\n  var getContainer = function(scope) {\n    var id = getContainerId(scope);\n    return id ? containers[id] : $document;\n  };\n\n  var removeContainer = function(scope) {\n    var id = getContainerId(scope);\n    if(id) {\n      delete containers[id];\n    }\n  };\n\n  return {\n    getContainerId:   getContainerId,\n    getContainer:     getContainer,\n    setContainer:     setContainer,\n    removeContainer:  removeContainer\n  };\n});\n","angular.module('duScroll.smoothScroll', ['duScroll.scrollHelpers', 'duScroll.scrollContainerAPI'])\n.directive('duSmoothScroll', function(duScrollDuration, duScrollOffset, scrollContainerAPI) {\n  'use strict';\n\n  return {\n    link : function($scope, $element, $attr) {\n      $element.on('click', function(e) {\n        if((!$attr.href || $attr.href.indexOf('#') === -1) && $attr.duSmoothScroll === '') return;\n\n        var id = $attr.href ? $attr.href.replace(/.*(?=#[^\\s]+$)/, '').substring(1) : $attr.duSmoothScroll;\n\n        var target = document.getElementById(id) || document.getElementsByName(id)[0];\n        if(!target || !target.getBoundingClientRect) return;\n\n        if (e.stopPropagation) e.stopPropagation();\n        if (e.preventDefault) e.preventDefault();\n\n        var offset    = $attr.offset ? parseInt($attr.offset, 10) : duScrollOffset;\n        var duration  = $attr.duration ? parseInt($attr.duration, 10) : duScrollDuration;\n        var container = scrollContainerAPI.getContainer($scope);\n\n        container.duScrollToElement(\n          angular.element(target),\n          isNaN(offset) ? 0 : offset,\n          isNaN(duration) ? 0 : duration\n        );\n      });\n    }\n  };\n});\n","angular.module('duScroll.spyContext', ['duScroll.spyAPI'])\n.directive('duSpyContext', function(spyAPI) {\n  'use strict';\n\n  return {\n    restrict: 'A',\n    scope: true,\n    compile: function compile(tElement, tAttrs, transclude) {\n      return {\n        pre: function preLink($scope, iElement, iAttrs, controller) {\n          spyAPI.createContext($scope);\n        }\n      };\n    }\n  };\n});\n","angular.module('duScroll.scrollContainer', ['duScroll.scrollContainerAPI'])\n.directive('duScrollContainer', function(scrollContainerAPI){\n  'use strict';\n\n  return {\n    restrict: 'A',\n    scope: true,\n    compile: function compile(tElement, tAttrs, transclude) {\n      return {\n        pre: function preLink($scope, iElement, iAttrs, controller) {\n          iAttrs.$observe('duScrollContainer', function(element) {\n            if(angular.isString(element)) {\n              element = document.getElementById(element);\n            }\n\n            element = (angular.isElement(element) ? angular.element(element) : iElement);\n            scrollContainerAPI.setContainer($scope, element);\n            $scope.$on('$destroy', function() {\n              scrollContainerAPI.removeContainer($scope);\n            });\n          });\n        }\n      };\n    }\n  };\n});\n","angular.module('duScroll.scrollspy', ['duScroll.spyAPI'])\n.directive('duScrollspy', function(spyAPI, duScrollOffset, $timeout, $rootScope) {\n  'use strict';\n\n  var Spy = function(targetElementOrId, $scope, $element, offset) {\n    if(angular.isElement(targetElementOrId)) {\n      this.target = targetElementOrId;\n    } else if(angular.isString(targetElementOrId)) {\n      this.targetId = targetElementOrId;\n    }\n    this.$scope = $scope;\n    this.$element = $element;\n    this.offset = offset;\n  };\n\n  Spy.prototype.getTargetElement = function() {\n    if (!this.target && this.targetId) {\n      this.target = document.getElementById(this.targetId) || document.getElementsByName(this.targetId)[0];\n    }\n    return this.target;\n  };\n\n  Spy.prototype.getTargetPosition = function() {\n    var target = this.getTargetElement();\n    if(target) {\n      return target.getBoundingClientRect();\n    }\n  };\n\n  Spy.prototype.flushTargetCache = function() {\n    if(this.targetId) {\n      this.target = undefined;\n    }\n  };\n\n  return {\n    link: function ($scope, $element, $attr) {\n      var href = $attr.ngHref || $attr.href;\n      var targetId;\n\n      if (href && href.indexOf('#') !== -1) {\n        targetId = href.replace(/.*(?=#[^\\s]+$)/, '').substring(1);\n      } else if($attr.duScrollspy) {\n        targetId = $attr.duScrollspy;\n      } else if($attr.duSmoothScroll) {\n        targetId = $attr.duSmoothScroll;\n      }\n      if(!targetId) return;\n\n      // Run this in the next execution loop so that the scroll context has a chance\n      // to initialize\n      var timeoutPromise = $timeout(function() {\n        var spy = new Spy(targetId, $scope, $element, -($attr.offset ? parseInt($attr.offset, 10) : duScrollOffset));\n        spyAPI.addSpy(spy);\n\n        $scope.$on('$locationChangeSuccess', spy.flushTargetCache.bind(spy));\n        var deregisterOnStateChange = $rootScope.$on('$stateChangeSuccess', spy.flushTargetCache.bind(spy));\n        $scope.$on('$destroy', function() {\n          spyAPI.removeSpy(spy);\n          deregisterOnStateChange();\n        });\n      }, 0, false);\n      $scope.$on('$destroy', function() {$timeout.cancel(timeoutPromise);});\n    }\n  };\n});\n"],"sourceRoot":"/source/"}