{"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});"]}