{"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","angular","module","value","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","createScrollHandler","context","timer","queued","handler","bottomReached","container","containerEl","containerOffset","clientHeight","scrollHeight","pageYOffset","innerHeight","currentlyActive","toBeActive","spies","spy","pos","compareProperty","undefined","getTargetPosition","height","$element","removeClass","$broadcast","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","getTargetElement","flushTargetCache","ngHref","duScrollspy","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\nangular.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","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) {\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        bottomReached = Math.round($window.pageYOffset + $window.innerHeight) >= $document[0].body.scrollHeight;\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('active');\n        $rootScope.$broadcast('duScrollspy:becameInactive', currentlyActive.$element);\n      }\n      if(toBeActive) {\n        toBeActive.$element.addClass('active');\n        $rootScope.$broadcast('duScrollspy:becameActive', toBeActive.$element);\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      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      $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    }\n  };\n});\n"],"sourceRoot":"/source/"}