{"version":3,"sources":["scrolltracker.js"],"names":["define","$","ScrollMagic","app","headerOffset","directive","$rootScope","$sce","restrict","scope","bindToController","navtitle","issticky","scrollController","scrollItems","navItems","navSizeStyle","activetitle","controllerAs","controller","$scope","buffer","getParentElement","stickyNavigation","navSize","shouldUpdateNav","$safeApply","fn","phase","this","$root","$$phase","$apply","addNavItem","title","n","push","id","active","getTrustedText","addScrollItem","length","elementId","getParent","setActiveSection","state","angular","forEach","item","key","setActiveNav","removeActive","onNavigation","$item","scrollTop","offset","top","document","width","animate","promise","done","toggleDropDown","text","trustAsHtml","link","pre","$element","$attrs","Controller","$window","element","attrs","bind","$sitebanner","find","pageYOffset","outerHeight","require","navitem","trustedtitle","scrollTrackerLink","onClick","attr","scrollItem","post","parentController","duration","offsetHeight","$parent","height","window","resize","Scene","triggerElement","triggerHook","addTo","on","event","onEnterPanel","onLeavePanel","setNavSize","$watch"],"mappings":"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","file":"scrolltracker.js","sourcesContent":["/* \tNOTE:\r\n */\r\ndefine(['jquery', 'scrollmagic'], function ($, ScrollMagic) {\r\n return function (app) {\r\n var headerOffset = 0;\r\n\r\n app.directive('scrollTracker', ['$rootScope', '$sce', function ($rootScope, $sce) {\r\n return {\r\n restrict: \"A\",\r\n scope: true,\r\n bindToController: {\r\n navtitle: '=',\r\n issticky: '&',\r\n scrollController: '&',\r\n scrollItems: '@',\r\n navItems: '@',\r\n navSizeStyle: '&',\r\n activetitle: '&'\r\n },\r\n controllerAs: 'ctrl',\r\n controller: ['$scope', function ($scope) {\r\n $scope.buffer = 0;\r\n $scope.scrollItems = [];\r\n $scope.navItems = [];\r\n $scope.scrollController = null;\r\n $scope.getParentElement = null;\r\n $scope.stickyNavigation = false;\r\n $scope.navSize = 0;\r\n $scope.activetitle = false;\r\n $scope.issticky = false;\r\n\r\n var defaulttitle = 'Default Title';\r\n var shouldUpdateNav = true;\r\n\r\n $scope.$safeApply = function (fn) {\r\n var phase = this.$root.$$phase;\r\n if (phase == '$apply' || phase == '$digest') {\r\n if (fn && (typeof (fn) === 'function')) {\r\n fn();\r\n }\r\n } else {\r\n this.$apply(fn);\r\n }\r\n };\r\n\r\n $scope.addNavItem = function (title) {\r\n var n = ($scope.navItems.length);\r\n $scope.navItems.push({\r\n 'id': n + 1,\r\n 'title': (title || 'Nav Item ' + n),\r\n 'active': false\r\n });\r\n\r\n if (n === 0) {\r\n $scope.navtitle = $scope.getTrustedText($scope.navItems[0].title);\r\n }\r\n\r\n return $scope.navItems[n];\r\n };\r\n\r\n $scope.addScrollItem = function () {\r\n var n = $scope.scrollItems.length;\r\n var elementId = 'scroll-section-' + (n);\r\n $scope.scrollItems.push({\r\n 'elementId': elementId,\r\n 'id': n,\r\n 'active': false\r\n });\r\n return $scope.scrollItems[n];\r\n }\r\n\r\n $scope.getParent = function () {\r\n return $scope.scrollController;\r\n };\r\n\r\n $scope.setActiveSection = function (state, id) {\r\n $scope.$safeApply(function () {\r\n\r\n angular.forEach($scope.scrollItems, function (item, key) {\r\n item.active = (item.id === id);\r\n });\r\n\r\n if (shouldUpdateNav == true) {\r\n $scope.setActiveNav(id);\r\n } \r\n });\r\n };\r\n\r\n $scope.setActiveNav = function (id) {\r\n angular.forEach($scope.navItems, function (item, key) {\r\n item.active = (item.id === id);\r\n if (item.id === id) {\r\n $scope.navtitle = $scope.getTrustedText(item.title);\r\n }\r\n });\r\n };\r\n\r\n $scope.removeActive = function (state, id) {\r\n $scope.$safeApply(function () {\r\n angular.forEach($scope.scrollItems, function (item, key) {\r\n if (item.id !== 0) {\r\n item.active = (id !== 0 && item.id === id);\r\n }\r\n }); \r\n });\r\n }; \r\n\r\n $scope.onNavigation = function (id) {\r\n\r\n $scope.activetitle = false;\r\n\r\n var $item = $('#' + $scope.scrollItems[id].elementId);\r\n\r\n //If already active, do not do anything\r\n if ($item.length < 1) return;\r\n //if ($scope.scrollItems[id].active || $item.length < 1) return;\r\n var scrollTop = ($('.sticky-nav').length === 1) ? $item.offset().top - (headerOffset) : $item.offset().top - (headerOffset * 1.25);\r\n //var scrollTop = $item.offset().top - (headerOffset)\r\n\r\n //reduce scroll top by section padding height on mobile to offest header\r\n if ($(document).width() < 675) {\r\n scrollTop -= 45;\r\n }\r\n\r\n shouldUpdateNav = false;\r\n\r\n $scope.setActiveNav(id);\r\n\r\n $('html, body').animate({\r\n scrollTop: scrollTop\r\n }, 1000).promise().done(function () {\r\n shouldUpdateNav = true;\r\n });\r\n };\r\n\r\n $scope.toggleDropDown = function () {\r\n $scope.activetitle = !$scope.activetitle;\r\n };\r\n\r\n $scope.getTrustedText = function (text) {\r\n return $sce.trustAsHtml(text);\r\n };\r\n\r\n }],\r\n link: {\r\n pre: function ($scope, $element, $attrs) {\r\n $scope.scrollController = new ScrollMagic.Controller({}); //END ScrollMagic Controller\r\n } //END pre\r\n }\r\n }\r\n }]);\r\n\r\n app.directive(\"scrollWatch\", ['$window', function ($window) {\r\n return function (scope, element, attrs) {\r\n angular.element($window).bind(\"scroll\", function () {\r\n var $sitebanner = $(element).find('.site-banner');\r\n if (this.pageYOffset >= $sitebanner.outerHeight()) {\r\n scope.issticky = true;\r\n } else {\r\n scope.issticky = false;\r\n }\r\n scope.$apply();\r\n });\r\n };\r\n }]);\r\n\r\n app.directive('scrollTrackerLink', [function () {\r\n return {\r\n restrict: \"A\",\r\n require: \"^scrollTracker\",\r\n scope: true,\r\n bindToController: {\r\n 'navitem': '&'\r\n },\r\n controllerAs: 'ctrl',\r\n controller: ['$scope', function ($scope) {\r\n $scope.trustedtitle = function () {\r\n return $scope.getTrustedText($scope.navitem.title);\r\n };\r\n }],\r\n link: {\r\n pre: function ($scope, $element, $attrs) {\r\n $scope.navitem = $scope.addNavItem($attrs.scrollTrackerLink);\r\n\r\n $scope.onClick = function () {\r\n $scope.onNavigation($scope.navitem.id);\r\n }\r\n\r\n $element.attr('id', 'nav-link-' + $scope.navitem.id);\r\n }\r\n }\r\n }\r\n }]);\r\n\r\n app.directive('scrollTrackerItem', ['$rootScope', function ($rootScope) {\r\n return {\r\n restrict: \"A\",\r\n require: \"^scrollTracker\",\r\n scope: true,\r\n bindToController: {\r\n scrollItem: '&',\r\n navSize: '='\r\n },\r\n controllerAs: 'ctrl',\r\n controller: ['$scope', function ($scope) {\r\n $scope.navSize = 'auto';\r\n if ($scope.addScrollItem) $scope.scrollItem = $scope.addScrollItem();\r\n }],\r\n link: {\r\n post: function ($scope, $element, $attrs) {\r\n\r\n const id = $scope.scrollItem.id;\r\n const parentController = $scope.getParent();\r\n\r\n $element.attr('id', $scope.scrollItem.elementId);\r\n\r\n var duration = $element[0].offsetHeight;\r\n var offset = -($scope.$parent.navSize);\r\n var triggerHook = 'onLeave';\r\n\r\n //we are assuming that 0 is the navigation element\r\n switch (id) {\r\n case 0:\r\n $scope.$parent.navSize = $element[0].offsetHeight;\r\n //this ensures that as soon as you start scrolling the nav will stick\r\n var offset = -($('.site-banner').height());\r\n duration = 0;\r\n\r\n $(window).resize(function () {\r\n $scope.$parent.navSize = $element[0].offsetHeight;\r\n });\r\n\r\n break;\r\n default:\r\n }\r\n\r\n var scene = new ScrollMagic.Scene({\r\n triggerElement: $element[0],\r\n duration: duration,\r\n offset: offset,\r\n triggerHook: triggerHook\r\n })\r\n .addTo(parentController)\r\n .on('enter', function (event) {\r\n onEnterPanel(event);\r\n })\r\n .on('leave', function (event) {\r\n onLeavePanel(event);\r\n });\r\n\r\n //When user enters the panel - usually on scroll enter\r\n const onEnterPanel = function (event) {\r\n $scope.setActiveSection(event.state, id);\r\n }\r\n\r\n //When user leaves the panel - usually on scroll leave\r\n const onLeavePanel = function (event) {\r\n $scope.removeActive(event.state, id);\r\n }\r\n\r\n if (id === 0) {\r\n $scope.setNavSize = function () {\r\n $scope.navSize = 'auto';\r\n $scope.navSize = $($element).height();\r\n headerOffset = $scope.navSize;\r\n if ($(document).width() < 675) {\r\n //add header to offset on mobile\r\n headerOffset += 21;\r\n }\r\n };\r\n\r\n $rootScope.$watch('windowWidth', function () {\r\n $scope.setNavSize();\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }]);\r\n } //end return\r\n});"]}