');\r\n slideContent.html($element.html());\r\n ctrl.$$dragDisabled = slideContent.find('carousel').length > 0 || (ctrl.$slideCount !== undefined && ctrl.slides && ctrl.slides.length <= ctrl.$slideCount);\r\n if (ctrl.carouselSync !== null) {\r\n ctrl.carouselIndex = ctrl.carouselSync.registerCarousel(ctrl);\r\n }\r\n \r\n if (ctrl.onInit) {\r\n ctrl.onInit({\r\n ctrl: ctrl\r\n });\r\n }\r\n };\r\n\r\n ctrl.$onChanges = function (changes) {\r\n if (changes.startSlide) {\r\n ctrl.goToSlide(changes.startSlide.currentValue, false);\r\n }\r\n $timeout(function () {\r\n ctrl.$$updateSlideReferences(true);\r\n if (ctrl.onChange) {\r\n ctrl.onChange({\r\n changes: changes\r\n });\r\n }\r\n });\r\n if (changes.slides && !changes.slides.previousValue && ctrl.auto) {\r\n ctrl.$$nextAutoStep();\r\n }\r\n };\r\n\r\n ctrl.$postLink = function () {\r\n var markup = `\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n `;\r\n var html = angular.element(markup);\r\n ctrl.$$dragger = html.find('.drag-tracker')[0];\r\n ctrl.$$slider = html.find('.slides').find('>div');\r\n html.find('.slide').html(slideContent.find('>slide').html().replace('carousel-repeat', 'ng-repeat'));\r\n html.find('.controls').html(slideContent.find('>controls').html());\r\n $element.html(html);\r\n $compile($element.contents())($scope);\r\n if (!ctrl.$$dragDisabled) {\r\n TweenLite.set(ctrl.$$dragger, {\r\n position: 'absolute',\r\n x: 0\r\n });\r\n ctrl.$$draggable = Draggable.create(ctrl.$$dragger, {\r\n type: 'x',\r\n trigger: $element,\r\n lockAxis: true,\r\n edgeResistance: .65,\r\n dragResistance: .1,\r\n dragClickables: true,\r\n throwResistance: .1,\r\n maxDuration: 3,\r\n throwProps: true,\r\n zIndexBoost: true,\r\n snap: function (endValue) {\r\n var snapData = ctrl.animationSnap({ offset: endValue, data: ctrl.animationData });\r\n ctrl.$$updateIndex(snapData.index);\r\n return snapData.position;\r\n },\r\n onDragStart: function () {\r\n if (ctrl.parentCarousel) {\r\n ctrl.parentCarousel.$$draggable[0].disable();\r\n }\r\n if (ctrl.auto) {\r\n $timeout.cancel(ctrl.$$autoRunner);\r\n }\r\n },\r\n onDragEnd: function () {\r\n if (ctrl.parentCarousel) {\r\n ctrl.parentCarousel.$$draggable[0].enable();\r\n }\r\n },\r\n onThrowComplete: function () {\r\n if (ctrl.auto) {\r\n ctrl.$$nextAutoStep();\r\n }\r\n },\r\n onThrowUpdate: ctrl.$$updateSlidePositions,\r\n onDrag: ctrl.$$updateSlidePositions\r\n });\r\n if (ctrl.disableDrag) {\r\n ctrl.$$draggable[0].disable();\r\n }\r\n }\r\n\r\n $timeout(function () {\r\n ctrl.$$slideElements = $element.find('> .loader-wrap > .slides > div > .slide');;\r\n ctrl.$$updateSlideReferences(false);\r\n });\r\n var updateWidth;\r\n function getWidth() {\r\n $timeout.cancel(ctrl.$$autoRunner);\r\n $timeout.cancel(updateWidth);\r\n updateWidth = $timeout(function () {\r\n ctrl.$$updateSlideReferences();\r\n ctrl.$$updateSlidePositions();\r\n ctrl.positionDraggable(false);\r\n if (ctrl.auto) {\r\n ctrl.$$nextAutoStep();\r\n }\r\n }, 100);\r\n }\r\n\r\n win = angular.element($window)\r\n .on('resize.carousel', getWidth)\r\n .on('changed.zf.mediaquery', function () {\r\n ctrl.$slideCount = utility.getResponsiveValue(ctrl.slideCount);\r\n if (ctrl.$slideCount === undefined) {\r\n ctrl.$slideCount = 1;\r\n }\r\n getWidth();\r\n });\r\n if (ctrl.slides) {\r\n getWidth();\r\n if (ctrl.auto) {\r\n ctrl.$$nextAutoStep();\r\n }\r\n }\r\n };\r\n\r\n ctrl.$$updateSlideReferences = function (slidesChanged) {\r\n if (slidesChanged) {\r\n ctrl.$$slideElements = $element.find('> .loader-wrap > .slides > div > .slide');\r\n }\r\n ctrl.maxHeight = 0;\r\n for (var i = 0; i < ctrl.$$slideElements.length; i++) {\r\n var slide = angular.element(ctrl.$$slideElements[i]);\r\n if (ctrl.maxHeight < slide.outerHeight()) {\r\n ctrl.maxHeight = slide.outerHeight();\r\n }\r\n }\r\n var slideContainerWidth = $element.find('.slides').width();\r\n ctrl.animationData = ctrl.animationPrep({\r\n data: {\r\n slideElements: ctrl.$$slideElements,\r\n slideData: ctrl.slides,\r\n carousel: $element,\r\n slideContainerWidth: slideContainerWidth,\r\n spacing: ctrl.spacing,\r\n slideWidth: ctrl.$slideCount && ctrl.slides ? (slideContainerWidth - (ctrl.spacing * (ctrl.$slideCount - 1))) / ctrl.$slideCount : 0\r\n }\r\n });\r\n if (ctrl.preAnimation) {\r\n ctrl.preAnimation({\r\n offset: 0,\r\n data: ctrl.animationData\r\n })\r\n }\r\n if (ctrl.animationData) {\r\n for (i = 0; i < ctrl.$$slideElements.length; i++) {\r\n TweenLite.set(\r\n ctrl.animationData.slideElements[i],\r\n ctrl.animation({\r\n offset: 0,\r\n direction: 0,\r\n index: i,\r\n data: ctrl.animationData\r\n }));\r\n }\r\n }\r\n };\r\n\r\n ctrl.$$nextAutoStep = function () {\r\n $timeout.cancel(ctrl.$$autoRunner);\r\n ctrl.$$autoRunner = $timeout(function () {\r\n ctrl.scrollWidthRight().then(ctrl.$$nextAutoStep);\r\n }, ctrl.autoInterval);\r\n };\r\n\r\n ctrl.handleChildEdgeHit = function (direction) {\r\n if (direction) {\r\n ctrl.nextSlide();\r\n }\r\n else {\r\n ctrl.prevSlide();\r\n }\r\n };\r\n\r\n ctrl.$onDestroy = function () {\r\n win.off('resize.carousel');\r\n };\r\n\r\n ctrl.$$findIndexByKey = function (target, start, promise) {\r\n for (var i = start; i < ctrl.slides.length; i++) {\r\n if (ctrl.slides[i].urlName === target) {\r\n promise.resolve(i);\r\n return;\r\n }\r\n }\r\n if (ctrl.paginator) {\r\n if (!ctrl.paginator.paginationPromise.$resolved) {\r\n ctrl.paginator.paginationPromise.$promise.then(function () {\r\n ctrl.$$findIndexByKey(target, 0, promise);\r\n });\r\n }\r\n else {\r\n ctrl.paginator.nextPage(function () {\r\n ctrl.$$findIndexByKey(target, i, promise);\r\n });\r\n }\r\n }\r\n else {\r\n promise.reject('Key not found');\r\n }\r\n };\r\n\r\n ctrl.$$updateSlidePositions = function () {\r\n var xShift = ctrl.$$dragger._gsTransform.x;\r\n if (ctrl.$previousOffset === undefined) {\r\n ctrl.$previousOffset = xShift;\r\n }\r\n var dir = xShift - ctrl.$previousOffset;\r\n if (dir) {\r\n dir = dir / Math.abs(dir);\r\n }\r\n if (ctrl.preAnimation) {\r\n ctrl.preAnimation({\r\n offset: xShift,\r\n data: ctrl.animationData\r\n })\r\n }\r\n if (ctrl.slides && ctrl.animationData) {\r\n for (var i = 0; i < ctrl.slides.length; i++) {\r\n TweenLite.set(\r\n ctrl.animationData.slideElements[i],\r\n ctrl.animation({\r\n offset: xShift,\r\n direction: dir,\r\n index: i,\r\n data: ctrl.animationData\r\n }));\r\n }\r\n }\r\n ctrl.$previousOffset = xShift;\r\n $scope.$broadcast('carouselV2.updated', {\r\n offset: xShift,\r\n direction: dir\r\n });\r\n };\r\n\r\n ctrl.$$updateIndex = function (index, synced) {\r\n if (ctrl.onEdge) {\r\n if (index >= ctrl.slides.length) {\r\n ctrl.onEdge({\r\n direction: 1\r\n });\r\n }\r\n else if (index < 0) {\r\n ctrl.onEdge({\r\n direction: 0\r\n });\r\n }\r\n }\r\n newIndex = index >= 0 ? index % ctrl.slides.length : ctrl.slides.length - 1 + ((index + 1) % ctrl.slides.length);\r\n if (ctrl.index !== newIndex) {\r\n var forward, backward;\r\n if (newIndex > ctrl.index) {\r\n forward = newIndex - ctrl.index;\r\n backward = ctrl.index + (ctrl.slides.length - newIndex);\r\n }\r\n else {\r\n forward = newIndex + (ctrl.slides.length - ctrl.index);\r\n backward = ctrl.index - newIndex;\r\n }\r\n if (forward <= backward) {\r\n ctrl.renderIndex += forward;\r\n }\r\n else {\r\n ctrl.renderIndex -= backward;\r\n }\r\n ctrl.index = newIndex;\r\n if (!synced) {\r\n if (ctrl.carouselSync) {\r\n ctrl.carouselSync.updateCarousels(newIndex, ctrl.carouselIndex);\r\n }\r\n if (ctrl.onSlideChange) {\r\n ctrl.onSlideChange({\r\n index: newIndex,\r\n slide: ctrl.slides[index],\r\n ctrl: ctrl\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n ctrl.updateSlides = function (data) {\r\n ctrl.nextDisabled = data.rows - 1 > ctrl.index;\r\n };\r\n\r\n ctrl.scrollWidthLeft = function () {\r\n return ctrl.$$scrollWidth(1);\r\n };\r\n\r\n ctrl.scrollWidthRight = function () {\r\n return ctrl.$$scrollWidth(-1);\r\n };\r\n\r\n ctrl.$$scrollWidth = function (dir) {\r\n var deferred = $q.defer();\r\n if (!ctrl.$$dragDisabled)\r\n ctrl.$$draggable[0].disable();\r\n var snap = ctrl.animationSnap({ offset: ctrl.$$dragger._gsTransform.x + (dir * ctrl.animationData.slideContainerWidth), data: ctrl.animationData });\r\n ctrl.$$updateIndex(snap.index);\r\n TweenLite.to(ctrl.$$dragger, .8, {\r\n throwProps: {\r\n x: {\r\n velocity: 'auto',\r\n end: snap.position\r\n }\r\n },\r\n onUpdate: ctrl.$$updateSlidePositions,\r\n onComplete: function () {\r\n if (!ctrl.$$dragDisabled) {\r\n ctrl.$$draggable[0].update();\r\n if (!ctrl.disableDrag) {\r\n ctrl.$$draggable[0].enable();\r\n }\r\n }\r\n deferred.resolve();\r\n }\r\n });\r\n return deferred.promise;\r\n };\r\n\r\n ctrl.goToSlide = function (index, animate, synced) {\r\n ctrl.$$updateIndex(index, synced);\r\n var animationComplete = ctrl.positionDraggable(animate);\r\n if (ctrl.index >= 0 && ctrl.index < ctrl.slides.length) {\r\n ctrl.prevDisabled = ctrl.index === 0;\r\n ctrl.nextDisabled = ctrl.index >= ctrl.slides.rows - 1;\r\n }\r\n return animationComplete;\r\n };\r\n\r\n ctrl.prevSlide = function () {\r\n if (ctrl.index === 0 && ctrl.onEdge) {\r\n ctrl.onEdge({\r\n direction: 0\r\n });\r\n }\r\n else {\r\n ctrl.goToSlide(ctrl.index - 1, true);\r\n }\r\n };\r\n\r\n ctrl.nextSlide = function () {\r\n if (ctrl.index === ctrl.slides.length - 1 && ctrl.onEdge) {\r\n ctrl.onEdge({\r\n direction: 1\r\n });\r\n }\r\n else {\r\n ctrl.goToSlide(ctrl.index + 1, true);\r\n }\r\n };\r\n\r\n ctrl.positionDraggable = function (animate) {\r\n var deferred = $q.defer();\r\n var target = ctrl.animation({\r\n offset: ctrl.$$dragger._gsTransform.x,\r\n index: ctrl.index,\r\n data: ctrl.animationData\r\n });\r\n var targetShift = target.offsetShift;\r\n if (targetShift === undefined) {\r\n targetShift = target.x;\r\n }\r\n if (animate) {\r\n if (!ctrl.$$dragDisabled)\r\n ctrl.$$draggable[0].disable();\r\n TweenLite.to(ctrl.$$dragger, .8, {\r\n throwProps: {\r\n x: {\r\n velocity: 'auto',\r\n end: ctrl.$$dragger._gsTransform.x - targetShift\r\n }\r\n },\r\n onComplete: function () {\r\n if (!ctrl.$$dragDisabled) {\r\n ctrl.$$draggable[0].update();\r\n if (!ctrl.disableDrag) {\r\n ctrl.$$draggable[0].enable();\r\n }\r\n }\r\n deferred.resolve();\r\n },\r\n onUpdate: ctrl.$$updateSlidePositions\r\n });\r\n }\r\n else if (target) {\r\n TweenLite.set(ctrl.$$dragger, {\r\n x: ctrl.$$dragger._gsTransform.x - targetShift\r\n });\r\n if (!ctrl.$$dragDisabled) {\r\n ctrl.$$draggable[0].update();\r\n }\r\n ctrl.$$updateSlidePositions();\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n };\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .directive('equalizer', equalizer)\r\n function equalizer() {\r\n var directive = {\r\n restrict: 'A',\r\n require: '^?equalizerManager',\r\n link: link\r\n };\r\n return directive;\r\n function link($scope, $element, $attrs, equalizerManager) {\r\n if (equalizerManager) {\r\n equalizerManager.registerEqualizer($attrs.equalizer, $element);\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .directive('equalizerManager', equalizerManager);\r\n\r\n function equalizerManager() {\r\n var directive = {\r\n restrict: 'A',\r\n controller: equalizerManagerController,\r\n link: function () { },\r\n priority: 99\r\n };\r\n return directive;\r\n }\r\n\r\n equalizerManagerController.$inject = ['$scope', '$element', '$attrs', '$window', 'helper', '$timeout','bmgLogger'];\r\n function equalizerManagerController($scope, $element, $attrs, $window, helper, $timeout, bmgLogger) {\r\n var ctrl = this;\r\n ctrl.$mediaQueries = helper.getMediaQueries();\r\n ctrl.counts = {};\r\n if ($attrs.class) {\r\n var keys = Object.keys(ctrl.$mediaQueries);\r\n for (var i = 0; i < keys.length; i++) {\r\n var key = keys[i];\r\n var regex = new RegExp('(' + key + '\\\\-up\\\\-)(\\\\d+)', 'g');\r\n var result = regex.exec($attrs.class);\r\n if (result !== null) {\r\n ctrl.counts[key] = parseInt(result[2]);\r\n }\r\n }\r\n }\r\n ctrl.mediaQuery = $attrs.equalizerManager ? ctrl.$mediaQueries[$attrs.equalizerManager] : $window.matchMedia('(min-width: 0px)');\r\n ctrl.$items = {};\r\n ctrl.registerEqualizer = function (key, element) {\r\n if (!ctrl.$items[key]) {\r\n ctrl.$items[key] = [];\r\n }\r\n ctrl.$items[key].push(element);\r\n ctrl.$updateHeights();\r\n };\r\n\r\n angular.element($window).on('resize.equalizerManager', function () {\r\n ctrl.$updateSize();\r\n ctrl.$updateHeights();\r\n });\r\n\r\n ctrl.$updateSize = function() {\r\n var size = 0;\r\n ctrl.$gridSize = 9999;\r\n var keys = Object.keys(ctrl.$mediaQueries);\r\n for (var i=0; i
1 && i % ctrl.$gridSize === 0) {\r\n ctrl.$calcHeights(itemSet);\r\n itemSet = [];\r\n }\r\n itemSet.push(angular.element(items[i]));\r\n }\r\n }\r\n if (itemSet.length > 0) {\r\n ctrl.$calcHeights(itemSet);\r\n }\r\n }\r\n });\r\n };\r\n\r\n ctrl.$calcHeights = function (itemSet) {\r\n var max = 0;\r\n for (var j = 0; j < itemSet.length; j++) {\r\n var element = itemSet[j];\r\n element.css({\r\n height: '',\r\n flex: ''\r\n });\r\n max = Math.max(element.outerHeight(), max);\r\n }\r\n\r\n if (ctrl.mediaQuery.matches && ctrl.$gridSize > 1 && itemSet.length > 1) {\r\n for (var j = 0; j < itemSet.length; j++) {\r\n var element = itemSet[j];\r\n if ($attrs.equalizerManager == 'flex') {\r\n element.css('flex', '0 0 ' + max + 'px')\r\n }\r\n else {\r\n element.css('height', max);\r\n }\r\n }\r\n }\r\n }\r\n\r\n ctrl.$updateSize();\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .component('compile', {\r\n bindings: {\r\n 'content': '<',\r\n 'ready': ''\r\n },\r\n controller: CompileController\r\n });\r\n\r\n CompileController.$inject = ['$compile', '$element', '$scope', '$attrs'];\r\n function CompileController($compile, $element, $scope, $attrs) {\r\n var ctrl = this;\r\n\r\n ctrl.$onInit = function () {\r\n if (!$attrs.ready || ctrl.ready) {\r\n $element.html(ctrl.content);\r\n $compile($element.contents())($scope.$parent);\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .component('expander', {\r\n bindings: {\r\n space: '=?',\r\n onInit: '&?',\r\n onStart: '&?',\r\n onFinish: '&?'\r\n },\r\n transclude: {\r\n trigger: 'trigger',\r\n content: '?content'\r\n },\r\n template: `\r\n \r\n \r\n \r\n `,\r\n controller: ExpanderController\r\n });\r\n\r\n\r\n var count = 0;\r\n ExpanderController.$inject = ['$scope', '$element', '$window', '$transclude', '$interval'];\r\n function ExpanderController($scope, $element, $window, $transclude, $interval) {\r\n var ctrl = this;\r\n ctrl._id = count++;\r\n ctrl.$onInit = function () {\r\n ctrl.open = false;\r\n ctrl._overlay = $element.find('.overlay div');\r\n ctrl._trigger = $element.find('.trigger');\r\n ctrl._content = $element.find('.content');\r\n ctrl._container = $element.closest('.expander-container');\r\n if (!ctrl.space) {\r\n ctrl.space = 16;\r\n }\r\n\r\n $transclude($scope, function (clone) {\r\n if (clone.length) {\r\n ctrl._content.append(clone);\r\n }\r\n }, null, 'content');\r\n $transclude($scope, function (clone) {\r\n if (clone.length) {\r\n ctrl._trigger.append(clone);\r\n }\r\n }, null, 'trigger');\r\n\r\n if (ctrl.onInit) {\r\n ctrl.onInit({\r\n expander: ctrl\r\n });\r\n }\r\n };\r\n\r\n ctrl.$postLink = function () {\r\n if ($element.find('[class*=\"fa-\"]').length) {\r\n var html = angular.element('html');\r\n var fontLoadCheck = $interval(function () {\r\n if (html.is('.fa-events-icons-ready,.fa-events-icons-failed')) {\r\n ctrl._setAnimation();\r\n $interval.cancel(fontLoadCheck);\r\n }\r\n }, 100);\r\n }\r\n else {\r\n ctrl._setAnimation();\r\n }\r\n ctrl._window = angular.element($window).on(`resize.expander${ctrl._id}`, ctrl._setAnimation);\r\n };\r\n\r\n ctrl.$destroy = function () {\r\n ctrl._window.off(`resize.expander${ctrl._id}`);\r\n };\r\n\r\n ctrl._setAnimation = function () {\r\n var width = ctrl._container.width();\r\n var doubleWidth = width * 2;\r\n var shift = ctrl._container[0].getBoundingClientRect().right - ctrl._trigger[0].getBoundingClientRect().right - parseInt(ctrl._container.css('padding-right'));\r\n ctrl._animation = new TimelineLite({\r\n paused: true,\r\n onComplete: function () {\r\n if (ctrl.onFinish) {\r\n $scope.$evalAsync(function () {\r\n ctrl.onFinish({\r\n expander: ctrl\r\n });\r\n });\r\n }\r\n },\r\n onReverseComplete: function () {\r\n if (ctrl.onFinish) {\r\n $scope.$evalAsync(function () {\r\n ctrl.onFinish({\r\n expander: ctrl\r\n });\r\n });\r\n }\r\n }\r\n })\r\n .set($element, { delay: .001, zIndex: 2 })\r\n .to(ctrl._overlay, .5, { width: doubleWidth, height: doubleWidth, x: -width, y: -width });\r\n if (shift > 0) {\r\n ctrl._animation\r\n .to($element, .3, { delay: -.2, x: shift, width: width });\r\n }\r\n ctrl._animation\r\n .set(ctrl._content, { right: ctrl._trigger.width() + ctrl.space, top: (ctrl._trigger.height() - ctrl._content.height()) / 2 })\r\n .to(ctrl._content, .3, { width: width - ctrl._trigger.width() - ctrl.space, opacity: 1 });\r\n };\r\n\r\n ctrl.toggle = function ($event) {\r\n if ($event) {\r\n $event.stopPropagation();\r\n }\r\n ctrl.open = !ctrl.open;\r\n if (ctrl.onStart) {\r\n ctrl.onStart({\r\n expander: ctrl\r\n });\r\n }\r\n if (ctrl.open) {\r\n $element.addClass('open');\r\n ctrl._animation.play();\r\n }\r\n else {\r\n $element.removeClass('open');\r\n ctrl._animation.reverse();\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .controller('FeaturesController', FeaturesController);\r\n\r\n FeaturesController.$inject = ['$element', '$window'];\r\n function FeaturesController($element, $window) {\r\n var ctrl = this;\r\n ctrl.featureText = $element.find('.feature-text');\r\n ctrl.calcHeight = function () {\r\n var height = ctrl.featureText.height();\r\n ctrl.textHeight = height === 0 ? 1000 : Math.max(ctrl.featureText.height() - 300, 300);\r\n };\r\n angular.element($window).on('resize', ctrl.calcHeight);\r\n ctrl.calcHeight();\r\n ctrl.getAnimationDuration = function () {\r\n return ctrl.textHeight;\r\n };\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .directive('imageSource', imageSource);\r\n\r\n var id = 0;\r\n imageSource.$inject = ['helper', '$window', '$parse', '$q', '$timeout'];\r\n function imageSource(helper, $window, $parse, $q, $timeout) {\r\n var directive = {\r\n priority: 99,\r\n restrict: 'A',\r\n link: link\r\n };\r\n return directive;\r\n\r\n function link($scope, $element, $attrs, carousel) {\r\n var directiveId = id;\r\n id++;\r\n var expression;\r\n var settings = $parse($attrs.imageSource)($scope);\r\n var queries = helper.getMediaQueries();\r\n var url;\r\n var win = angular.element($window);\r\n var deferred = $q.defer();\r\n var cancelListener = $scope.$on('carouselV2.updated', checkPosition);\r\n deferred.promise.then(cancelListener);\r\n var placeholder = angular.element('');\r\n var placeholderImage = placeholder.find('img');\r\n var positioned = false;\r\n //used 30 instead of 0 to get around microsoft edge image sizing bug, where images had a height of 30 before the source is loaded\r\n if ($element.height() > 30) {\r\n positioned = true;\r\n placeholderImage.css({\r\n top: -$element.outerHeight() / 2 - 17\r\n });\r\n }\r\n $element.on('transitionend.imageSource', function () {\r\n placeholder.remove();\r\n $element.off('transitionend.imageSource');\r\n });\r\n if ($element.is('img')) {\r\n $element.after(placeholder);\r\n }\r\n else {\r\n $element.append(placeholder);\r\n }\r\n function setSource() {\r\n deferred.promise.then(function () {\r\n if (!url) {\r\n $element.addClass('loaded no-image');\r\n placeholder.remove();\r\n }\r\n else {\r\n $element.removeClass('loaded');\r\n var image = new Image();\r\n image.onload = image.onerror = function () {\r\n $element.addClass('loaded');\r\n if (!positioned) {\r\n positioned = true;\r\n placeholderImage.css({\r\n position: 'absolute',\r\n top: -$element.outerHeight() / 2 - 17\r\n });\r\n }\r\n placeholder.remove();\r\n };\r\n image.src = url;\r\n if ($element.is('img')) {\r\n $element.attr('src', url);\r\n }\r\n else {\r\n $element.css('backgroundImage', \"url('\" + url + \"')\");\r\n }\r\n }\r\n scroller.off('scroll.imageSource' + directiveId);\r\n });\r\n }\r\n\r\n function checkPosition() {\r\n var rect = $element[0].getBoundingClientRect();\r\n if (rect.top <= win.height() && rect.left <= win.width() && rect.bottom <= win.height() + rect.height && rect.right >= 0) {\r\n deferred.resolve();\r\n }\r\n }\r\n\r\n var scroller = win.on('scroll.imageSource' + directiveId, checkPosition);\r\n var previousSize;\r\n\r\n //var offsets = scroller[0].getBoundingClientRect();\r\n if (!settings || typeof (settings) === 'string') {\r\n url = settings;\r\n setSource();\r\n }\r\n else {\r\n var retina = $window.matchMedia('only screen and (min-resolution: 124dpi), only screen and (min-resolution: 1.3dppx), only screen and (min-resolution: 48.8dpcm)');\r\n function getUrl() {\r\n var keys = Object.keys(queries);\r\n var result;\r\n for (var i = 0; i < keys.length; i++) {\r\n var key = keys[i];\r\n if (key.indexOf(\"down\") === -1 && key.indexOf(\"up\") === -1 && key.indexOf(\"only\") === -1) {\r\n if (queries[key].matches) {\r\n if (settings[key]) {\r\n result = key;\r\n }\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n }\r\n if (result) {\r\n if (retina.matches && settings[result + 'retina']) {\r\n result = result + 'retina';\r\n }\r\n url = settings[result];\r\n }\r\n if (previousSize !== result) {\r\n setSource();\r\n }\r\n previousSize = result;\r\n }\r\n\r\n win.on('resize.imageSource' + directiveId, getUrl);\r\n getUrl();\r\n }\r\n $timeout(function () {\r\n checkPosition();\r\n });\r\n }\r\n $scope.$on('$destroy', function () {\r\n win.off('resize.imageSource' + directiveId);\r\n scroller.off('scroll.imageSource' + directiveId);\r\n scroller.off('scroll.imageSource' + directiveId);\r\n $element.off('transitionend.imageSource');\r\n cancelListener();\r\n });\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .directive('fitText', fitText);\r\n\r\n var id = 0;\r\n fitText.$inject = ['$window'];\r\n function fitText($window) {\r\n var directive = {\r\n restrict: 'A',\r\n scope: {\r\n minWidth: '=',\r\n maxWidth: '=',\r\n minSize: '=',\r\n maxSize: '=?'\r\n },\r\n link: link\r\n };\r\n return directive;\r\n function link($scope, $element) {\r\n $scope.id = id++;\r\n\r\n function sizeText() {\r\n $element.css('font-size', '');\r\n $scope.$maxSize = $scope.maxSize || parseInt($element.css('font-size'));\r\n var width = $element.width();\r\n if (width <= $scope.minWidth) {\r\n $element.css('font-size', $scope.minSize);\r\n }\r\n else if (width <= $scope.maxWidth) {\r\n var widthDiff = $scope.maxWidth - $scope.minWidth;\r\n var sizeDiff = $scope.$maxSize - $scope.minSize;\r\n $element.css('font-size', (sizeDiff * ((width - $scope.minWidth) / widthDiff) + $scope.minSize) + 'px');\r\n }\r\n }\r\n sizeText();\r\n var win = angular.element($window)\r\n .on(`resize.fitText${id}`, sizeText);\r\n }\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .component('labeledList', {\r\n bindings: {\r\n space: ''\r\n },\r\n controller: labeledListController\r\n });\r\n\r\n labeledListController.$inject = ['$scope', '$element', '$filter'];\r\n function labeledListController($scope, $element, filter) {\r\n var ctrl = this;\r\n ctrl.$onInit = function () {\r\n ctrl.currentPadding = 0;\r\n ctrl.items = [];\r\n ctrl.$addedIds = [];\r\n }\r\n\r\n ctrl.updatePadding = function (item, remove) {\r\n if (ctrl.$addedIds.indexOf(item.id) === -1) {\r\n ctrl.items.push(item);\r\n ctrl.$addedIds.push(item.id);\r\n }\r\n else {\r\n var index = -1;\r\n for (var i = 0; i < ctrl.items.length; i++) {\r\n if (item.id === ctrl.items[i].id) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n if (remove) {\r\n if (index > -1) {\r\n ctrl.addedIds.slice(addedIndex, 1);\r\n }\r\n var addedIndex = ctrl.$addedIds.indexOf(item.id);\r\n if (addedIndex > -1) {\r\n ctrl.addedIds.slice(addedIndex, 1);\r\n }\r\n }\r\n else if (index > -1) {\r\n ctrl.items[index] = item;\r\n }\r\n }\r\n if (item.width > ctrl.currentPadding) {\r\n ctrl.currentPadding = item.width;\r\n }\r\n else if (item.width < ctrl.currentPadding) {\r\n var padding = 0;\r\n for (var i = 0; i < ctrl.items.length; i++) {\r\n var entry = ctrl.items[i];\r\n if (padding < entry.width) {\r\n padding = entry.width;\r\n }\r\n }\r\n ctrl.currentPadding = padding;\r\n }\r\n for (var i = 0; i < ctrl.items.length; i++) {\r\n ctrl.items[i].element.css('padding-left', ctrl.currentPadding + (ctrl.space || 16))\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .component('labeledListItem', {\r\n bindings: {\r\n label: '@?',\r\n labelClass: '@?'\r\n },\r\n template: `\r\n {{$ctrl.label}}\r\n \r\n `,\r\n transclude: true,\r\n require: {\r\n labeledList: '^labeledList'\r\n },\r\n controller: labeledListItemController\r\n });\r\n\r\n labeledListItemController.$inject = ['$scope', '$element', '$window', '$timeout', '$interval'];\r\n var id = 0;\r\n function labeledListItemController($scope, $element, $window, $timeout, $interval) {\r\n id++;\r\n var ctrl = this;\r\n ctrl.id = id;\r\n ctrl.$postLink = function () {\r\n ctrl.$labelElement = $element.find('> span');\r\n ctrl.previousWidth = ctrl.$labelElement.width();\r\n if (ctrl.labelClass) {\r\n var fontLoadCheck = $interval(function () {\r\n if (angular.element('html').is('.fa-events-icons-ready,.fa-events-icons-failed')) {\r\n ctrl.$updatePadding();\r\n $interval.cancel(fontLoadCheck);\r\n }\r\n }, 100);\r\n }\r\n else {\r\n $timeout(ctrl.$updatePadding, 15);\r\n }\r\n ctrl.$window = angular.element($window).on('resize.labeledListItem' + id, function () {\r\n $scope.$evalAsync(ctrl.$updatePadding);\r\n })\r\n $element.on('mutateme.zf.trigger click.zf.accordion keydown.zf.accordion', function () {\r\n $scope.$evalAsync(ctrl.$updatePadding);\r\n });\r\n var accordion = $element.closest('.accordion').on('down.zf.accordion', function () {\r\n $scope.$evalAsync(ctrl.$updatePadding);\r\n })\r\n };\r\n\r\n ctrl.$onDestroy = function () {\r\n ctrl.labeledList.updatePadding({\r\n element: $element,\r\n id: ctrl.id,\r\n width: 0\r\n }, true);\r\n ctrl.$window.off('resize.labeledListItem' + id);\r\n };\r\n\r\n ctrl.$updatePadding = function () {\r\n var newWidth = ctrl.$labelElement.width();\r\n if (newWidth && newWidth !== ctrl.previousWidth) {\r\n ctrl.labeledList.updatePadding({\r\n element: $element,\r\n id: ctrl.id,\r\n width: newWidth\r\n });\r\n ctrl.previousWidth = newWidth;\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .component('lazyPartial', {\r\n bindings: {\r\n pageId: '<',\r\n partial: '@',\r\n onReady: '&?'\r\n },\r\n template: `\r\n \r\n \r\n `,\r\n transclude: true,\r\n controller: LazyPartialController\r\n });\r\n\r\n LazyPartialController.$inject = ['lazyPartialService', '$element', '$compile', '$scope', '$timeout'];\r\n function LazyPartialController(lazyPartialService, $element, $compile, $scope, $timeout) {\r\n var ctrl = this;\r\n ctrl.$onInit = function () {\r\n ctrl._content = $element.find('> .content');\r\n ctrl._placeholder = $element.find('> .placeholder');\r\n lazyPartialService.getPartial(ctrl.pageId, ctrl.partial)\r\n .then(function (response) {\r\n ctrl._content.html(response.data);\r\n $compile(ctrl._content)($scope);\r\n $timeout(function () {\r\n $element.addClass('ready');\r\n if (ctrl.onReady) {\r\n ctrl.onReady({\r\n id: ctrl.id,\r\n partial: ctrl.partial\r\n });\r\n }\r\n else {\r\n new TimelineLite()\r\n .to(ctrl._placeholder, .4, { autoAlpha: 0 })\r\n .fromTo(ctrl._content, .5, { autoAlpha: 0, y: -20 }, { delay: .2, autoAlpha: 1, y: 0 })\r\n .set(ctrl._content, { clearProps: 'transform' });\r\n }\r\n });\r\n })\r\n .catch(function (error) {\r\n console.log(error);\r\n $element.append('Failed to load partial.
');\r\n });\r\n };\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .factory('lazyPartialService', lazyPartialService);\r\n\r\n lazyPartialService.$inject = ['$http', '$cacheFactory'];\r\n \r\n function lazyPartialService($http, $cacheFactory) {\r\n var dataCache = $cacheFactory.get('headerPartial');\r\n return {\r\n getPartial: function (pageId, partial) {\r\n return $http.get('/api/main/partial', {\r\n params: {\r\n pageId: pageId,\r\n partial: partial\r\n },\r\n cache: dataCache\r\n });\r\n }\r\n };\r\n }\r\n})();","(function () {\r\n angular.module('components.loader', [\r\n 'ngAnimate'\r\n ])\r\n .component('loader', {\r\n bindings: {\r\n onContentReady: '&?',\r\n onError: '&?'\r\n },\r\n template: '',\r\n transclude: {\r\n indicator: '?indicator',\r\n content: '?content'\r\n },\r\n controller: loaderController\r\n });\r\n\r\n loaderController.$inject = ['$element', '$attrs', '$q', '$transclude', '$timeout'];\r\n function loaderController($element, $attrs, $q, $transclude, $timeout) {\r\n var ctrl = this;\r\n ctrl.$onInit = function () {\r\n ctrl.ready = false;\r\n\r\n if (!$transclude.isSlotFilled('content')) {\r\n $transclude(function (clone) {\r\n if (clone.length)\r\n $element.find('.content').html(clone);\r\n });\r\n }\r\n else {\r\n $transclude(function (clone) {\r\n if (clone.length)\r\n $element.find('.loading-indicator').html(clone);\r\n }, null, 'indicator');\r\n $transclude(function (clone) {\r\n if (clone.length)\r\n $element.find('.content').html(clone);\r\n }, null, 'content');\r\n }\r\n }\r\n ctrl.$postLink = function () {\r\n ctrl.initialized = true;\r\n var deferred = $q.defer();\r\n if (ctrl.onContentReady !== undefined) {\r\n ctrl.onContentReady({deferred: deferred})\r\n }\r\n else {\r\n var count = 0;\r\n var images = $element.find('.content img').filter(function() {\r\n return !$(this).prop('complete');\r\n }).on('load.loader', function () {\r\n count++;\r\n if (count === images.length)\r\n deferred.resolve();\r\n }).on('error.loader', function (error) {\r\n images.off('load.loader');\r\n deferred.reject(error);\r\n });\r\n if (!images.length)\r\n deferred.resolve();\r\n }\r\n deferred.promise.then(function () {\r\n ctrl.ready = true;\r\n }).catch(function (error) {\r\n if (ctrl.onError !== undefined)\r\n ctrl.onError({ error: error });\r\n ctrl.ready = true;\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .directive('open', dataOpen);\r\n\r\n dataOpen.$inject = [];\r\n function dataOpen() {\r\n var directive = {\r\n restrict: 'A',\r\n require: {\r\n modalLoader: '^^modalLoader'\r\n },\r\n bindToController: true,\r\n controller: controller\r\n };\r\n\r\n controller.$inject = ['$element', '$timeout'];\r\n function controller($element, $timeout) {\r\n var ctrl = this;\r\n ctrl.$onInit = function () {\r\n $timeout(function () {\r\n ctrl.target = $element.data('open');\r\n ctrl.modalLoader.load(ctrl.target);\r\n });\r\n };\r\n }\r\n\r\n return directive;\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .directive('modalLoader', modalLoader);\r\n\r\n function modalLoader() {\r\n var directive = {\r\n restrict: 'A',\r\n controller: controller\r\n };\r\n\r\n controller.$inject = ['$timeout', '$attrs', '$http', '$compile', '$scope', '$window'];\r\n function controller($timeout, $attrs, $http, $compile, $scope, $window) {\r\n var ctrl = this;\r\n\r\n ctrl.$onInit = function () {\r\n ctrl.delay = $attrs.delay ? parseInt($attrs.delay) : 800;\r\n ctrl.loadedModals = [];\r\n ctrl._modalQueue = [];\r\n if ($attrs.rootId) {\r\n ctrl.rootId = parseInt($attrs.rootId);\r\n }\r\n };\r\n\r\n ctrl.load = function (modalName) {\r\n if (ctrl.loadedModals.indexOf(modalName) === -1) {\r\n ctrl.loadedModals.push(modalName);\r\n ctrl._modalQueue.push(modalName);\r\n $timeout.cancel(ctrl._requestTimer);\r\n ctrl._requestTimer = $timeout(function () {\r\n if (ctrl.rootId) {\r\n $http.get('/api/main/modals/get/' + ctrl.rootId, {\r\n params: {\r\n modals: ctrl._modalQueue\r\n }\r\n })\r\n .then(function (data) {\r\n var body = angular.element('body');\r\n var items = data.data.items;\r\n for (var i = 0; i < items.length; i++) {\r\n var modal = ctrl._buildModal(items[i]);\r\n body.append(modal);\r\n new Foundation.Reveal(modal);\r\n $compile(modal.contents())($scope);\r\n $timeout(function () {\r\n if ($window.bindUmbracoFormHandling) {\r\n var button = this.modal.find('.umbraco-forms-form [type=\"submit\"]:not(.cancel)');\r\n if (button.length) {\r\n $window.bindUmbracoFormHandling(button);\r\n }\r\n }\r\n var innerModals = this.modal.find('.reveal');\r\n if (innerModals.length) {\r\n for (var j = 0; j < innerModals.length; j++) {\r\n var innerModal = angular.element(innerModals[j]);\r\n new Foundation.Reveal(innerModal);\r\n }\r\n }\r\n }.bind({ modal: modal }));\r\n }\r\n })\r\n .catch(function (error) {\r\n console.log(error);\r\n });\r\n ctrl._modalQueue = [];\r\n }\r\n }, ctrl.delay);\r\n }\r\n };\r\n\r\n ctrl._buildModal = function (modal) {\r\n var modalString = `\r\n \r\n
\r\n
${modal.bodyText}
\r\n ${modal.closeButtonText ? `\r\n
\r\n ` : ''}\r\n
\r\n `;\r\n return angular.element(modalString);\r\n };\r\n }\r\n\r\n return directive;\r\n }\r\n})();","(function () {\r\n angular.module('components.pageModals', ['ngResource'])\r\n .component('pageModals', {\r\n bindings: {\r\n 'homeId': '@'\r\n },\r\n transclude: true,\r\n template: `\r\n 0 ? modal.backgroundColor : '#fff')}\">\r\n
\r\n
\r\n
\r\n
`,\r\n controller: pageModalsController\r\n })\r\n .directive('pageModalsRepeat', pageModalsRepeat)\r\n\r\n pageModalsController.$inject = ['$scope', '$element', '$resource', '$timeout'];\r\n function pageModalsController($scope, $element, $resource, $timeout) {\r\n var ctrl = this;\r\n ctrl.modals = [];\r\n ctrl.modalLoading = true;\r\n\r\n this.$onInit = function () {\r\n $timeout(function() {\r\n var linkModals = angular.element('a[data-open]');\r\n if (linkModals.length > 0) {\r\n var modals = [];\r\n $.each(linkModals, function (i) {\r\n var linkModal = $(linkModals[i]).attr('data-open');\r\n if (!modals.includes(linkModal) && angular.element('div#' + linkModal).length == 0) {\r\n modals.push($(linkModals[i]).attr('data-open'));\r\n }\r\n })\r\n\r\n if (modals.length > 0) {\r\n $resource('/api/main/modals/get/' + $scope.$ctrl.homeId).get({ modals: modals }, function (data) {\r\n //check if modal is already loaded\r\n angular.forEach(data.items, function (value, key) {\r\n if (angular.element('div#' + value.urlName).length == 0) {\r\n ctrl.modals.push(value);\r\n }\r\n });\r\n\r\n ctrl.modalLoading = false;\r\n });\r\n }\r\n }\r\n }, 2000);\r\n }\r\n }\r\n\r\n pageModalsRepeat.$inject = [];\r\n function pageModalsRepeat() {\r\n return {\r\n link: link\r\n };\r\n\r\n function link(scope, element, attrs) {\r\n new Foundation.Reveal($(element));\r\n }\r\n }\r\n\r\n})();","/**\r\n * @ngdoc directive\r\n * @module components.pagination\r\n * @name components.pagination:pagination\r\n * @scope\r\n * @restrict E\r\n * @description\r\n * The pagination component \r\n * @param {string=} service String that refers to an ngResource stored in a factory. Should be in the form of \"factory.resource.\" This resource will be called each time the filters change and when a new page is loaded. Should **not** be used together with the **data** param.\r\n * @param {number=} take Controls the number of items to include in each page. Defaults to 15.\r\n * @param {array=} data Array to be split up into pages. Should **not** be used with the **service** param.\r\n * @param {number=} page Page number to start on. Defaults to 1.\r\n * @param {string=} required Comma separated list of parameters that required. Delays the initial pagination load until each parameter has a value set. Used to avoid unnessary api calls.\r\n * @param {function=} onChange Callback function for when the page/filter is changed. Passes the following fields to the function.\r\n * - page: the current page\r\n * - newItems: the items that were just loaded\r\n * - items: all items that have been loaded for the current set of filters\r\n * - rows: the total number of items that can be loaded\r\n * - finished: flag indicating whether all items have been loaded\r\n * - empty: flag indicating that no items were found\r\n * @example\r\n \r\n \r\n \r\n \r\n \r\n (function() {\r\n angular.module('dataExample', ['components.pagination'])\r\n .controller('exampleController', exampleController);\r\n\r\n exampleController.$inject = ['$scope'];\r\n function exampleController($scope) {\r\n var data = [];\r\n for (var i=0; i<25; i++) {\r\n data.push('example ' + i);\r\n }\r\n $scope.exampleData = data;\r\n }\r\n })();\r\n \r\n \r\n */\r\n\r\n(function () {\r\n angular.module('components.pagination', [\r\n 'ngResource'\r\n ])\r\n .component('pagination', {\r\n bindings: {\r\n service: '@?',\r\n take: '',\r\n data: '',\r\n page: '',\r\n params: '',\r\n required: '@?',\r\n scrollContainer: '@?',\r\n disableScroll: '',\r\n container: '@?',\r\n onChange: '&?',\r\n onInit: '&?',\r\n onError: '&?',\r\n onFound: '&?'\r\n },\r\n require: {\r\n stickyManager: '^?stickyManager'\r\n },\r\n transclude: true,\r\n controller: paginationController\r\n });\r\n paginationController.$inject = ['$scope', '$element', '$transclude', '$injector', '$q', '$window', '$timeout']\r\n function paginationController($scope, $element, $transclude, $injector, $q, $window, $timeout) {\r\n var ctrl = this;\r\n ctrl.loading = false;\r\n ctrl.$onInit = function () {\r\n ctrl.$scroller = angular.element(!ctrl.scrollContainer ? $window : ctrl.scrollContainer);\r\n $timeout(function () {\r\n ctrl.$container = ctrl.container ? angular.element(ctrl.container) : $element;\r\n });\r\n if (!ctrl.take)\r\n ctrl.take = 15;\r\n if (!ctrl.page)\r\n ctrl.page = 1;\r\n if (!ctrl.$service && ctrl.data) {\r\n ctrl.rows = ctrl.data.length;\r\n ctrl.pageLimit = Math.ceil(ctrl.rows / ctrl.take);\r\n }\r\n else if (ctrl.onError) {\r\n ctrl.onError({ message: 'No content has been connected.' });\r\n }\r\n $transclude($scope, function (clone) {\r\n if (clone.length) {\r\n $element.append(clone);\r\n }\r\n });\r\n\r\n ctrl.$$initialized = true;\r\n if (ctrl.onInit) {\r\n ctrl.onInit({ ctrl: ctrl });\r\n }\r\n };\r\n\r\n ctrl.$onChanges = function (changes) {\r\n if (changes.service) {\r\n if (changes.service.currentValue) {\r\n var servicePieces = changes.service.currentValue.split('.');\r\n var serviceContainer = $injector.get(servicePieces[0]);\r\n ctrl.$resource = serviceContainer[servicePieces[1]];\r\n }\r\n else {\r\n ctrl.$resource = null;\r\n }\r\n }\r\n if (changes.params) {\r\n if (ctrl.$$paramsValid()) {\r\n ctrl.$$toPage(1, true);\r\n }\r\n else if (ctrl.onError) {\r\n ctrl.onError({ message: 'Required parameter is missing.' })\r\n }\r\n }\r\n };\r\n\r\n //$scope.$watch('$ctrl.params', function (newVal, prevVal) {\r\n // if (newVal !== undefined && !angular.equals(newVal, prevVal)) {\r\n // //console.info('DEBUG: changes.params' + changes.params);\r\n // ctrl.params = newVal;\r\n // if (ctrl.$$paramsValid()) {\r\n // ctrl.$$toPage(1, true);\r\n // }\r\n // else if (ctrl.onError) {\r\n // ctrl.onError({ message: 'Required parameter is missing.' })\r\n // }\r\n // }\r\n //}, true);\r\n //ctrl.$onChanges = function (changes) {\r\n // if (changes.params && !angular.equals(changes.params.currentValue, changes.params.previousValue)) {\r\n // //console.info('DEBUG: changes.params' + changes.params);\r\n // if (ctrl.$$paramsValid()) {\r\n // ctrl.$$toPage(1, true);\r\n // }\r\n // else if (ctrl.onError) {\r\n // ctrl.onError({ message: 'Required parameter is missing.' })\r\n // }\r\n // }\r\n //}\r\n\r\n ctrl.$postLink = function () {\r\n ctrl.$isInfinite = $element.find('pagination-page-links, pagination-load-more').length === 0 && !ctrl.disableScroll;\r\n ctrl.scrollTarget = angular.element('[pagination-scroll]');\r\n if (!ctrl.scrollTarget.length) {\r\n ctrl.scrollTarget = angular.element('body,html');\r\n }\r\n if (ctrl.$isInfinite) {\r\n ctrl.$scroller.on('scroll.pagination', function () {\r\n var boundingBox = $element[0].getBoundingClientRect();\r\n if (ctrl.$scroller.height() >= boundingBox.bottom - 500) {\r\n ctrl.nextPage();\r\n }\r\n });\r\n }\r\n };\r\n\r\n ctrl.$onDestroy = function () {\r\n if (ctrl.$scroller) {\r\n ctrl.$scroller.off('scroll.pagination');\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name pagination#updateParam\r\n * @methodOf components.pagination:pagination\r\n * @kind function\r\n * @description\r\n * Updates a param passed to the pagination service. Only works for service driven pagination.\r\n * @param {string} key The name of the parameter that will be passed to the api call.\r\n * @param {object} value The value of the parameter.\r\n */\r\n ctrl.updateParam = function (key, value) {\r\n //console.info('DEBUG: updateParam');\r\n //console.info(ctrl.params);\r\n if (!ctrl.params)\r\n ctrl.params = {};\r\n ctrl.params[key] = value;\r\n ctrl.$$toPage(1, true);\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name pagination#$$paramsValid\r\n * @methodOf components.pagination:pagination\r\n * @kind function\r\n * @description\r\n * Internal method used to check whether a value has been set for every required parameter. Used to delay service requests until all of the parameters have been populated.\r\n * @return {bool} True if all required parameters have a value.\r\n */\r\n ctrl.$$paramsValid = function () {\r\n if (!ctrl.required)\r\n return true;\r\n if (!ctrl.params) {\r\n return false;\r\n }\r\n var requirements = ctrl.required.replace(' ', '').split(',');\r\n for (var i = 0; i < requirements.length; i++) {\r\n var target = ctrl.params[requirements[i]];\r\n if (target === undefined || target === null)\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n\r\n\r\n /**\r\n * @ngdoc method\r\n * @name pagination#getParam\r\n * @methodOf components.pagination:pagination\r\n * @kind function\r\n * @description\r\n * Gets the current value of a filter parameter.\r\n * @param {string} param The key for the filter parameter.\r\n * @return {object} The value of the requested parameter. Returns undefined if no value has been set.\r\n */\r\n ctrl.getParam = function (param) {\r\n if (ctrl.params)\r\n return ctrl.params[param];\r\n return undefined;\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name pagination#prevPage\r\n * @methodOf components.pagination:pagination\r\n * @kind function\r\n * @description\r\n * Loads the items for the previous page of content.\r\n * @param {bool=} param If true, the newly loaded content will replace the current content.\r\n */\r\n ctrl.prevPage = function (refresh) {\r\n if (ctrl.page > 1 && ctrl.loading) {\r\n ctrl.$$toPage(ctrl.page - 1, refresh);\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name pagination#nextPage\r\n * @methodOf components.pagination:pagination\r\n * @kind function\r\n * @description\r\n * Loads the items for the next page of content.\r\n * @param {bool=} param If true, the newly loaded content will replace the current content.\r\n */\r\n ctrl.nextPage = function (refresh) {\r\n if (!ctrl.finished && !ctrl.loading) {\r\n ctrl.$$toPage(ctrl.page + 1, refresh);\r\n }\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name pagination#clearParam\r\n * @methodOf components.pagination:pagination\r\n * @kind function\r\n * @description\r\n * Used to remove a param from the pagination filtering. Primarily used to clear out search terms.\r\n * @param {string} param The filter parameter to be reset.\r\n */\r\n ctrl.clearParam = function (param) {\r\n ctrl.params[param] = null;\r\n ctrl.$$toPage(1, true);\r\n };\r\n\r\n /**\r\n * @ngdoc method\r\n * @name pagination#$$toPage\r\n * @methodOf components.pagination:pagination\r\n * @kind function\r\n * @description\r\n * Loads the content for a selected page.\r\n * @param {number} page The page to load content for.\r\n * @param {bool=} refresh Replace the existing list of content with the new list if true. Used when filter parameters change and when the pagination is navigable with buttons.\r\n */\r\n ctrl.$$toPage = function (page, refresh) {\r\n var skip = (page - 1) * ctrl.take;\r\n var deferred = $q.defer();\r\n ctrl.$promise = deferred.promise;\r\n ctrl.loading = true;\r\n ctrl.empty = false;\r\n if (ctrl.$resource) {\r\n if (refresh && ctrl.initialized) {\r\n var stickPoint = ctrl.stickyManager ? ctrl.stickyManager.getStickPoint(1) : 0;\r\n var top = $element[0].getBoundingClientRect().top;\r\n var shift = top - ctrl.$scroller.height() + stickPoint;\r\n if (top < stickPoint) {\r\n ctrl.scrollTarget.stop().animate({\r\n scrollTop: '+=' + (top - stickPoint)\r\n }, 300);\r\n }\r\n else if (top >= ctrl.$scroller.height()) {\r\n ctrl.scrollTarget.stop().animate({\r\n scrollTop: '+=' + (top - stickPoint)\r\n }, 300);\r\n }\r\n }\r\n var params = angular.copy(ctrl.params);\r\n params.pageSize = ctrl.take;\r\n params.offset = skip;\r\n ctrl.$resource.get(params).$promise.then(function (data) {\r\n deferred.resolve(data);\r\n }).catch(function (error) {\r\n deferred.reject(error);\r\n })\r\n }\r\n else if (ctrl.data) {\r\n if (skip > ctrl.data.length - 1)\r\n deferred.reject({ message: 'No content found for this page.' });\r\n else {\r\n deferred.resolve({\r\n items: ctrl.data.slice(skip, skip + ctrl.take),\r\n rows: ctrl.data.length\r\n });\r\n }\r\n }\r\n deferred.promise.then(function (data) {\r\n if (refresh) {\r\n ctrl.items = data.items;\r\n ctrl.$lastCheck = 0;\r\n }\r\n else {\r\n for (var i = 0; i < data.items.length; i++)\r\n ctrl.items.push(data.items[i]);\r\n }\r\n ctrl.page = page;\r\n ctrl.rows = data.rows;\r\n ctrl.pageLimit = Math.ceil(data.rows / ctrl.take);\r\n ctrl.finished = ctrl.page * ctrl.take >= ctrl.rows;\r\n ctrl.initialized = true;\r\n ctrl.empty = ctrl.items.length === 0;\r\n ctrl.loading = false;\r\n $timeout(function () {\r\n var boundingBox = $element[0].getBoundingClientRect();\r\n if (ctrl.$isInfinite && !ctrl.finished && ctrl.$scroller.height() >= boundingBox.bottom - 500) {\r\n ctrl.nextPage();\r\n }\r\n if (ctrl.onChange) {\r\n ctrl.onChange({\r\n page: ctrl.page,\r\n newItems: data.items,\r\n items: ctrl.items,\r\n rows: ctrl.rows,\r\n finished: ctrl.finished,\r\n empty: ctrl.empty,\r\n controller: ctrl\r\n })\r\n }\r\n })\r\n }).catch(function (error) {\r\n if (ctrl.onError)\r\n ctrl.onError({ message: error.message });\r\n });\r\n return deferred.promise;\r\n };\r\n\r\n ctrl.findItem = function (item, evaluator) {\r\n ctrl.$lastCheck = 0;\r\n if (ctrl.page > 1) {\r\n ctrl.$$toPage(1, true);\r\n ctrl.$promise.then(function () {\r\n findMatch(item, evaluator)\r\n })\r\n }\r\n else\r\n findMatch(item, evaluator);\r\n\r\n function findMatch(item, evaluator) {\r\n var match, matchIndex;\r\n for (var i = ctrl.$lastCheck; i < ctrl.items.length; i++) {\r\n if (evaluator(item, ctrl.items[i])) {\r\n match = ctrl.items[i];\r\n matchIndex = i;\r\n }\r\n }\r\n if (!match) {\r\n if (!ctrl.finished) {\r\n ctrl.$lastCheck = ctrl.items.length;\r\n ctrl.nextPage(true);\r\n ctrl.$promise.then(function () {\r\n findMatch(item, evaluator);\r\n });\r\n }\r\n else if (ctrl.onError) {\r\n ctrl.onError({ message: \"Item not found.\" });\r\n }\r\n }\r\n else if (ctrl.onFound) {\r\n $timeout(function () {\r\n var rect = $element.find('[ng-repeat$=\"$ctrl.items\"]')[matchIndex].getBoundingClientRect();\r\n var padding = 0;\r\n if (ctrl.scrollTarget.length > 1) {\r\n padding = parseInt(angular.element(ctrl.scrollTarget[1]).css('padding-top'))\r\n }\r\n ctrl.scrollTarget.animate({\r\n scrollTop: '+=' + (rect.top - padding)\r\n }, 500, function () {\r\n ctrl.onFound({ match: match });\r\n });\r\n });\r\n }\r\n }\r\n };\r\n }\r\n})();","/**\r\n * @ngdoc directive\r\n * @module components.pagination\r\n * @name components.pagination:paginationFilter\r\n * @requires pagination\r\n * @restrict E\r\n * @description\r\n * Filters paginated content. Must be nested within the pagination component\r\n * @param {string} param The name of the key that is passed to the pagination logic.\r\n * @param {string=} default The default value of the filter (not implemented yet).\r\n * @param {promise=} promise A promise that delays initialization of the filter. Used when the content of the filter is loaded asynchronously.\r\n * @param {function=} onUpdate Callback function that is triggered when the filter changes Passes the following fields to the function.\r\n * - key: the param the filter is tied to\r\n * - value: the filter's current value\r\n * @example\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n - \r\n
{{post.name}}
\r\n {{post.excerpt}}
\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n (function() {\r\n angular.module('example', ['components.pagination', 'services.global'])\r\n })();\r\n \r\n \r\n */\r\n\r\n(function () {\r\n angular.module('components.pagination')\r\n .component('paginationFilter', {\r\n require: {\r\n pagination: '^pagination'\r\n },\r\n bindings: {\r\n param: '@',\r\n promise: '', //used when filter content is loaded asyncronously\r\n delay: '',\r\n onUpdate: '&'\r\n },\r\n transclude: true,\r\n controller: paginationFilterController\r\n });\r\n\r\n paginationFilterController.$inject = ['$element', '$scope', '$transclude', '$compile', '$timeout'];\r\n function paginationFilterController($element, $scope, $transclude, $compile, $timeout) {\r\n var ctrl = this;\r\n ctrl.$$initalizeContent = function () {\r\n ctrl.value = ctrl.pagination.getParam(ctrl.param);\r\n ctrl.$$initialLoad = true;\r\n if (!ctrl.delay) {\r\n ctrl.delay = 0;\r\n }\r\n $transclude(function (clone, scope) {\r\n $element.empty().html(clone);\r\n $timeout(function () {\r\n var inputs = $element.find('input, select');\r\n if (inputs.is('[type=\"checkbox\"]')) {\r\n if (!ctrl.value) {\r\n ctrl.value = [];\r\n }\r\n var result = [];\r\n for (var i = 0; i < inputs.length; i++) {\r\n var input = angular.element(inputs[i]);\r\n var val = input.attr(\"ng-true-value\").replace(/'/g, '');\r\n result[i] = ctrl.value.indexOf(val) > -1 ? val : false;\r\n input.attr('ng-model', '$ctrl.value[' + i + ']');\r\n }\r\n ctrl.value = result;\r\n }\r\n else if (inputs.is('[type=\"radio\"]')) {\r\n for (var i = 0; i < inputs.length; i++) {\r\n var input = angular.element(inputs[i]);\r\n input.attr('ng-model', '$ctrl.value');\r\n }\r\n }\r\n else {\r\n inputs.attr('ng-model', '$ctrl.value');\r\n }\r\n if (!$element.find('[ng-submit]').length) {\r\n $scope.$watch('$ctrl.value', function (value) {\r\n if (!ctrl.$$initialLoad) {\r\n $timeout.cancel(ctrl.$updateTimer);\r\n ctrl.$updateTimer = $timeout(ctrl.updateFilterParam, ctrl.delay)\r\n }\r\n ctrl.$$initialLoad = false;\r\n }, true)\r\n }\r\n var repeaters = $element.find('[ng-repeat]');\r\n if (repeaters.length) {\r\n repeaters.removeAttr('ng-repeat')\r\n }\r\n $compile($element.contents())($scope);\r\n });\r\n });\r\n }\r\n\r\n ctrl.$onInit = function () {\r\n if (ctrl.promise) {\r\n ctrl.promise.then(ctrl.$$initalizeContent);\r\n }\r\n else {\r\n ctrl.$$initalizeContent();\r\n }\r\n }\r\n /**\r\n * @ngdoc method\r\n * @name paginationFilter#updateFilterParam\r\n * @methodOf components.pagination:paginationFilter\r\n * @description\r\n * Processes the filter's current value into what is expected and passes that value to the pagination component. Can be used inside ng-submit to only trigger the update on form submission.\r\n * @param {bool=} reset Clears the value of the filter after the update is passed to the pagination. Used to clear filter forms after submission.\r\n */\r\n ctrl.updateFilterParam = function (reset) {\r\n var val = angular.copy(ctrl.value);\r\n if (Array.isArray(val)) {\r\n var result = [];\r\n for (var i = 0; i < val.length; i++) {\r\n var v = val[i];\r\n if (v === 0 || !!v)\r\n result.push(v);\r\n }\r\n val = result;\r\n }\r\n ctrl.pagination.updateParam(ctrl.param, val);\r\n if (ctrl.onUpdate)\r\n ctrl.onUpdate({ key: ctrl.param, value: val });\r\n if (reset)\r\n ctrl.value = undefined;\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name paginationFilter#clearFilter\r\n * @methodOf components.pagination:paginationFilter\r\n * @description\r\n * Clears the value of the filter parameter.\r\n */\r\n ctrl.clearFilter = function () {\r\n ctrl.value = undefined;\r\n }\r\n }\r\n})();","/**\r\n * @ngdoc directive\r\n * @module components.pagination\r\n * @name components.pagination:paginationLoadMore\r\n * @restrict E\r\n * @requires pagination\r\n * @description\r\n * Appends the next page of paginated results to the current list when clicked. Any markup can be passed into the component. This button will disappear when there are no more items to load.\r\n * @example\r\n \r\n \r\n \r\n
\r\n \r\n Click me to load more!!!\r\n \r\n
\r\n \r\n \r\n (function() {\r\n angular.module('dataExample', ['components.pagination'])\r\n .controller('exampleController', exampleController);\r\n\r\n exampleController.$inject = ['$scope'];\r\n function exampleController($scope) {\r\n var data = [];\r\n for (var i=0; i<25; i++) {\r\n data.push('example ' + i);\r\n }\r\n $scope.exampleData = data;\r\n }\r\n })();\r\n \r\n \r\n */\r\n(function () {\r\n angular.module('components.pagination')\r\n .component('paginationLoadMore', {\r\n require: {\r\n pagination: '^pagination'\r\n },\r\n transclude: true,\r\n controller: paginationLoadMoreController,\r\n template: ''\r\n });\r\n\r\n paginationLoadMoreController.$inject = ['$element', '$transclude'];\r\n function paginationLoadMoreController($element, $transclude) {\r\n var ctrl = this;\r\n ctrl.$onInit = function () {\r\n $transclude(function (clone) {\r\n if (clone.length) {\r\n $element.find('div').html(clone);\r\n }\r\n })\r\n }\r\n\r\n ctrl.loadMore = function () {\r\n ctrl.pagination.nextPage();\r\n }\r\n }\r\n})();","/**\r\n * @ngdoc directive\r\n * @module components.pagination\r\n * @name components.pagination:paginationPageLinks\r\n * @restrict E\r\n * @requires pagination\r\n * @description\r\n * Lists links to the pages of paginated content.\r\n * @example\r\n \r\n \r\n \r\n
\r\n Current Page: {{$ctrl.page}}
\r\n \r\n Click me to load more!!!\r\n \r\n
\r\n \r\n \r\n (function() {\r\n angular.module('dataExample', ['components.pagination'])\r\n .controller('exampleController', exampleController);\r\n\r\n exampleController.$inject = ['$scope'];\r\n function exampleController($scope) {\r\n var data = [];\r\n for (var i=0; i<1000; i++) {\r\n data.push('example ' + i);\r\n }\r\n $scope.exampleData = data;\r\n }\r\n })();\r\n \r\n \r\n */\r\n\r\n(function () {\r\n\tangular.module('components.pagination')\r\n\t\t.component('paginationPageLinks', {\r\n\t\t\trequire: {\r\n\t\t\t\t'pagination': '^pagination'\r\n\t\t\t},\r\n\t\t\tbindings: {\r\n 'spacing': '<'\r\n\t\t\t},\r\n template: '',\r\n controller: paginationPageLinksController\r\n\t\t});\r\n\r\n\tpaginationPageLinksController.$inject = ['$scope', '$element'];\r\n\tfunction paginationPageLinksController($scope, $element) {\r\n\t\tvar ctrl = this;\r\n\t\tctrl.$onInit = function () {\r\n\t\t $element.addClass('ng-hide');\r\n\t\t $scope.$watch('$ctrl.pagination.$promise', function (promise) {\r\n\t\t if (promise !== undefined) {\r\n\t\t promise.then(function (data) {\r\n\t\t if (data.rows > data.items.length) {\r\n\t\t $element.removeClass('ng-hide');\r\n\t\t ctrl.$$calculateSpacing();\r\n\t\t }\r\n\t\t else {\r\n\t\t $element.addClass('ng-hide');\r\n\t\t }\r\n\t\t });\r\n\t\t }\r\n\t\t });\r\n\t\t}\r\n\r\n\t\tctrl.$$calculateSpacing = function () {\r\n\t\t var total = 0;\r\n\t\t for (var i = 0; i < ctrl.spacing.length; i++) {\r\n\t\t total += ctrl.spacing[i];\r\n\t\t }\r\n\t\t var set = [];\r\n\t\t for (var i = 1; i <= ctrl.pagination.pageLimit; i++) {\r\n\t\t set.push(i);\r\n\t\t }\r\n\t\t if (total >= ctrl.pagination.pageLimit)\r\n\t\t ctrl.blocks = [set];\r\n\t\t else {\r\n\t\t var gaps = ctrl.pagination.pageLimit - total;\r\n\t\t var space = gaps / (ctrl.spacing.length - 1);\r\n\t\t ctrl.blocks = [];\r\n\t\t var pos = 0;\r\n\t\t for (var i = 0; i < ctrl.spacing.length; i++) {\r\n\t\t ctrl.blocks.push(set.slice(Math.round(pos), ctrl.spacing[i] + pos));\r\n\t\t pos += ctrl.spacing[i] + space;\r\n\t\t }\r\n\t\t }\r\n\t\t}\r\n\r\n\t\tctrl.toPage = function (page) {\r\n\t\t ctrl.pagination.$$toPage(page, true);\r\n\t\t}\r\n\r\n\t\tctrl.prevPage = function() {\r\n\t\t ctrl.pagination.prevPage(true);\r\n\t\t}\r\n\r\n\t\tctrl.nextPage = function() {\r\n\t\t ctrl.pagination.nextPage(true);\r\n\t\t}\r\n\t}\r\n})();","(function () {\r\n angular.module('components.paginationOld', [\r\n 'services.global',\r\n 'components.sort'\r\n ])\r\n .controller('BmgPaginationController', bmgPaginationController)\r\n .directive('bmgPagination', bmgPagination)\r\n .directive('bmgPaginationModal', bmgPaginationModal)\r\n .directive('bmgPaginationPageLinks', bmgPaginationPageLinks)\r\n .directive('bmgPaginationTrigger', bmgPaginationTrigger)\r\n .directive('bmgPaginationFilter', bmgPaginationFilter)\r\n .directive('bmgPaginationParam', bmgPaginationParam)\r\n .directive('bmgPaginationEmpty', bmgPaginationEmpty)\r\n .directive('bmgPaginationFinished', bmgPaginationFinished);\r\n bmgPaginationTrigger.$inject = ['$animate'];\r\n bmgPaginationEmpty.$inject = ['$animate'];\r\n bmgPaginationFinished.$inject = ['$animate'];\r\n\r\n bmgPaginationController.$inject = ['$scope', '$injector', '$timeout', '$q', '$stateParams', 'FoundationApi'];\r\n function bmgPaginationController($scope, $injector, $timeout, $q, $stateParams, foundationApi) {\r\n var controller = this;\r\n var infinite = $scope.infinite = controller.infinite = $scope.infinite === 'false' ? false : true;\r\n var currentPage = controller.currentPage = $scope.currentPage = $scope.page || 0;\r\n var startPage = currentPage;\r\n var take = controller.take = $scope.take = $scope.take || 15;\r\n var service, method;\r\n var items = controller.items = $scope.items = [];\r\n var container = controller.container = angular.element($scope.container || '#content > .grid-content:first-child');\r\n var filters = {};\r\n var previousData;\r\n var delay;\r\n var initLoad = true;\r\n controller.empty = $scope.empty = false;\r\n controller.toPage = function (page, refresh, callback) {\r\n function processData(data) {\r\n if (infinite && !reset && !refresh) {\r\n for (var i = 0; i < data.items.length; i++)\r\n items.push(data.items[i]);\r\n }\r\n else\r\n items = controller.items = $scope.items = data.items;\r\n controller.rows = $scope.rows = data.totalCount || data.rows;\r\n controller.pageLimit = $scope.pageLimit = Math.ceil(data.rows / take);\r\n $scope.finished = items.length === data.totalCount || items.length === data.rows;\r\n controller.empty = $scope.empty = items.length === 0;\r\n reset = false;\r\n if (callback !== undefined) {\r\n callback(data);\r\n }\r\n }\r\n var newPage = currentPage;\r\n switch (page) {\r\n case 'prev':\r\n newPage--;\r\n break;\r\n case 'next':\r\n newPage++;\r\n break;\r\n default:\r\n newPage = page;\r\n break;\r\n }\r\n if (newPage > -1) {\r\n if (service) {\r\n $timeout.cancel(delay);\r\n delay = $timeout(function () {\r\n currentPage = newPage;\r\n var params = {\r\n pageSize: take,\r\n offset: currentPage * take\r\n };\r\n var preventExecution = false;\r\n for (var key in $scope.additionalParams) {\r\n if ($scope.additionalParams[key] === null) {\r\n preventExecution = true;\r\n break;\r\n }\r\n params[key] = $scope.additionalParams[key];\r\n }\r\n for (var key in filters) {\r\n if (!filters[key])\r\n delete params[key];\r\n else\r\n params[key] = filters[key];\r\n }\r\n if ((!preventExecution && !angular.equals(params, previousData)) || refresh) {\r\n $scope.currentPage = page;\r\n initLoad = false;\r\n previousData = params;\r\n controller.paginationPromise = $scope.paginationPromise = service[method].get(params, processData);\r\n }\r\n });\r\n }\r\n else if ($scope.data !== undefined) {\r\n var offset = currentPage * take;\r\n processData({\r\n ctrl: controller,\r\n items: angular.copy($scope.data.slice(offset, offset + take)),\r\n rows: $scope.data.length\r\n });\r\n }\r\n }\r\n };\r\n controller.nextPage = function (callback) {\r\n controller.toPage(currentPage + 1, false, callback);\r\n },\r\n controller.prevPage = function (callback) {\r\n controller.toPage(currentPage - 1, false, callback);\r\n }\r\n\r\n controller.hasMore = function () {\r\n return !$scope.finished;\r\n }\r\n\r\n controller.refresh = function () {\r\n controller.toPage(0, true);\r\n }\r\n\r\n controller.updateFilter = function (filterName, data) {\r\n filters[filterName] = data;\r\n reset = true;\r\n controller.toPage(0);\r\n }\r\n\r\n controller.reset = function () {\r\n filters = {};\r\n items = controller.items = $scope.items = [];\r\n controller.toPage(0);\r\n }\r\n\r\n controller.registerTrigger = function () {\r\n $scope.hasControls = true;\r\n }\r\n\r\n controller.switchService = function (serv) {\r\n if (serv !== service) {\r\n if (serv) {\r\n var servicePieces = serv.split('.');\r\n if (servicePieces.length !== 2)\r\n console.log('\"' + service + '\" is not a valid service');\r\n else {\r\n service = controller.service = $injector.get(servicePieces[0]);\r\n method = controller.method = servicePieces[1];\r\n controller.toPage(startPage);\r\n }\r\n }\r\n else\r\n console.log('Service is not defined');\r\n }\r\n }\r\n\r\n controller.pushToFront = function (item) {\r\n $scope.items.unshift(item);\r\n }\r\n\r\n //loads the initial set of data\r\n controller.switchService($scope.service);\r\n var reset = false;\r\n $scope.$watch('additionalParams', function (newVal) {\r\n reset = true;\r\n controller.toPage(initLoad && $stateParams.page !== undefined ? $stateParams.page - 1 : 0);\r\n }, true);\r\n\r\n // activity helper methods \r\n $scope.getItemTypeString = function (activity) {\r\n switch (activity.Item.Type) {\r\n case 0: return 'Idea';\r\n case 1: return 'Researach';\r\n case 2: return 'Innovation';\r\n case 3: return 'Feedback';\r\n }\r\n };\r\n\r\n $scope.getActionTypeString = function (activity) {\r\n switch (activity.ActionType) {\r\n case 0: return 'Added';\r\n case 1: return 'Submitted';\r\n case 2: return 'Created';\r\n case 3: return 'Updated';\r\n }\r\n };\r\n\r\n $scope.getHeader = function (activity) {\r\n return $scope.getItemTypeString(activity) + ' ' + $scope.getActionTypeString(activity);\r\n };\r\n\r\n $scope.$root.$on('refreshPagination', controller.refresh);\r\n }\r\n\r\n bmgPagination.$inject = ['$timeout', '$window', '$transitions'];\r\n function bmgPagination($timeout, $window, $transitions) {\r\n var nextId = 0;\r\n var directive = {\r\n scope: {\r\n take: '@?',\r\n service: '@?',\r\n page: '@?',\r\n container: '@?',\r\n infinite: '@?',\r\n additionalParams: '=?',\r\n data: '=?',\r\n onChange: '&?'\r\n },\r\n restrict: 'EA',\r\n transclude: true,\r\n replace: true,\r\n templateUrl: '/angular/components/pagination/pagination.html',\r\n controller: 'BmgPaginationController',\r\n link: link\r\n };\r\n return directive;\r\n function link(scope, element, attrs, controller, transclude) {\r\n if (attrs.state !== undefined) {\r\n controller.state = scope.state = attrs.state;\r\n $transitions.onEnter({\r\n to: attrs.state\r\n }, function ($transition$) {\r\n controller.toPage($transition$.params().page - 1, true);\r\n })\r\n }\r\n var id = nextId++;\r\n var itemContainer;\r\n var checkPoint;\r\n var window = angular.element($window);\r\n function updateCheckPoint() {\r\n checkPoint = window.height() * 1.5;\r\n }\r\n window.off('resize.pagination').on('resize.pagination', updateCheckPoint)\r\n updateCheckPoint();\r\n transclude(scope, function (clone, scope) {\r\n if (clone.length) {\r\n element.append(clone);\r\n }\r\n });\r\n scope.$emit('paginationReady');\r\n function loadCheck(event) {\r\n if (((scope.paginationPromise !== undefined && scope.paginationPromise.$resolved) || scope.data !== undefined) && itemContainer) {\r\n var bottom = itemContainer.getBoundingClientRect().bottom;\r\n if (bottom < checkPoint)\r\n controller.nextPage();\r\n }\r\n }\r\n\r\n var watchingScroll = false;\r\n scope.$watch('hasControls', function (hasControls) {\r\n if (hasControls)\r\n controller.container.off('scroll.paginate' + id);\r\n else {\r\n controller.container.on('scroll.paginate' + id, loadCheck);\r\n watchingScroll = true;\r\n scope.$on('$destroy', function () {\r\n controller.container.off('scroll.paginate' + id);\r\n });\r\n scope.$watch('items', function (items) {\r\n if (items !== undefined && items.length > 0 && itemContainer === undefined) {\r\n $timeout(function () {\r\n itemContainer = element.find('[ng-repeat*=\"in items\"]:eq(0)').parent()[0];\r\n }, 0);\r\n }\r\n if (scope.onChange !== undefined) {\r\n scope.onChange({\r\n items: items,\r\n rows: controller.rows\r\n });\r\n }\r\n scope.itemsBinding = items;\r\n });\r\n scope.$watch('finished', function (finished) {\r\n if (finished)\r\n controller.container.off('scroll.paginate' + id);\r\n else\r\n controller.container.on('scroll.paginate' + id, loadCheck);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n bmgPaginationPageLinks.$inject = [];\r\n function bmgPaginationPageLinks() {\r\n var directive = {\r\n restrict: 'E',\r\n replace: true,\r\n templateUrl: '/angular/components/pagination/pagination-page-links.html',\r\n require: '^bmgPagination',\r\n link: link\r\n }\r\n return directive;\r\n\r\n function link(scope, element, attrs, controller) {\r\n controller.registerTrigger();\r\n }\r\n }\r\n\r\n bmgPaginationModal.$inject = ['$window', '$templateRequest', '$compile'];\r\n function bmgPaginationModal($window, $templateRequest, $compile) {\r\n var nextId = 0;\r\n var directive = {\r\n scope: {\r\n initialLimit: '=?',\r\n take: '@?',\r\n service: '@?',\r\n page: '@?',\r\n params: '=?'\r\n },\r\n restrict: 'EA',\r\n transclude: {\r\n emptyMessage: '?emptyMessage',\r\n finishedMessage: '?finishedMessage',\r\n banner: '?banner',\r\n entry: '?entry'\r\n },\r\n replace: true,\r\n template: '',\r\n link: link\r\n };\r\n return directive;\r\n function link(scope, element, attrs, controller, transclude) {\r\n var id = nextId++;\r\n var itemContainer;\r\n var window = angular.element($window);\r\n var scroller;\r\n if (scope.initialLimit === undefined)\r\n scope.initialLimit = 5;\r\n $templateRequest('/angular/components/pagination/pagination-modal.html', true).then(function (markup) {\r\n if (scope.$$destroyed) return;\r\n var paginator = angular.element(markup);\r\n transclude(scope, function (clone) {\r\n if (clone.length)\r\n paginator.find('[ng-repeat]').html(clone);\r\n }, null, 'entry');\r\n transclude(scope, function (clone) {\r\n if (clone.length)\r\n paginator.find('.banner').html(clone);\r\n }, null, 'banner');\r\n transclude(function (clone) {\r\n if (clone.length)\r\n paginator.find('.empty').html(clone);\r\n }, null, 'emptyMessage');\r\n transclude(function (clone) {\r\n if (clone.length)\r\n paginator.find('.finished').html(clone);\r\n }, null, 'finishedMessage');\r\n if (attrs.take !== undefined)\r\n paginator.attr('take', attrs.take);\r\n var modalId = 'pagination-modal-' + id;\r\n paginator.attr({\r\n service: attrs.service,\r\n container: '#' + modalId + ' .pagination-container'\r\n });\r\n paginator.find('[zf-open]').attr('zf-open', modalId);\r\n paginator.find('zf-modal').attr('id', modalId);\r\n element.append(paginator);\r\n $compile(element.contents())(scope);\r\n });\r\n }\r\n }\r\n\r\n function bmgPaginationTrigger($animate) {\r\n var directive = {\r\n restrict: 'A',\r\n scope: {\r\n page: '@',\r\n trigger: '@?'\r\n },\r\n require: '^bmgPagination',\r\n controller: function () { },\r\n link: link\r\n }\r\n return directive;\r\n function link(scope, element, attrs, controller) {\r\n controller.registerTrigger();\r\n if (scope.trigger === undefined)\r\n scope.trigger = 'click';\r\n element.on(scope.trigger, function () {\r\n controller.toPage(scope.page);\r\n return false;\r\n });\r\n scope.$parent.$watch('finished', function (newVal) {\r\n if (newVal)\r\n $animate.addClass(element, 'ng-hide');\r\n else\r\n $animate.removeClass(element, 'ng-hide');\r\n });\r\n }\r\n }\r\n\r\n function bmgPaginationFilter() {\r\n var directive = {\r\n restrict: 'E',\r\n scope: {\r\n data: '=',\r\n name: '@',\r\n property: '@?',\r\n disableDataChanges: '=?'\r\n },\r\n transclude: true,\r\n replace: true,\r\n template: '',\r\n require: '^bmgPagination',\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, element, attrs, controller, transclude) {\r\n if (scope.property === undefined)\r\n scope.property = 'value';\r\n if (!scope.disableDataChanges) {\r\n scope.$watch('data', function (newVal) {\r\n if (newVal !== undefined) {\r\n var actives = [];\r\n for (var key in newVal) {\r\n if (newVal[key].active)\r\n actives.push(newVal[key][scope.property])\r\n }\r\n if (actives.length === 0)\r\n actives = undefined;\r\n controller.updateFilter(scope.name, actives);\r\n }\r\n }, true);\r\n }\r\n scope.$watch(scope.name, function (newVal, preVal) {\r\n if (newVal !== preVal)\r\n controller.updateFilter(scope.name, newVal);\r\n });\r\n transclude(scope, function (clone, scope) {\r\n element.append(clone);\r\n });\r\n }\r\n }\r\n\r\n function bmgPaginationParam() {\r\n var directive = {\r\n restrict: 'A',\r\n require: ['^bmgPagination', 'ngModel'],\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, element, attrs, controllers) {\r\n var paginator = controllers[0];\r\n var ngModel = controllers[1];\r\n var pieces = attrs.ngModel.split('.');\r\n var name = pieces[pieces.length - 1];\r\n scope.$watch('data', function (newVal) {\r\n if (newVal !== undefined) {\r\n var actives = [];\r\n for (var key in newVal) {\r\n if (newVal[key].active)\r\n actives.push(newVal[key].value)\r\n }\r\n if (actives.length === 0)\r\n actives = undefined;\r\n paginator.updateFilter(scope.name, actives);\r\n }\r\n }, true);\r\n ngModel.$viewChangeListeners.push(function () {\r\n paginator.updateFilter(name, ngModel.$modelValue);\r\n });\r\n }\r\n }\r\n\r\n function bmgPaginationServiceSwitcher() {\r\n var directive = {\r\n restrict: 'E',\r\n replace: true,\r\n scope: {\r\n services: '='\r\n },\r\n require: '^bmgPagination',\r\n template: '',\r\n link: link\r\n };\r\n return directive;\r\n function link(scope, element, attrs, controller) {\r\n scope.service = controller.service;\r\n scope.$watch('service', function (newVal) {\r\n\r\n })\r\n }\r\n }\r\n\r\n function bmgPaginationEmpty($animate) {\r\n var directive = {\r\n restrict: 'E',\r\n scope: {\r\n page: '@',\r\n trigger: '@?'\r\n },\r\n transclude: true,\r\n replace: true,\r\n template: '',\r\n require: '^bmgPagination',\r\n link: link\r\n }\r\n return directive;\r\n function link(scope, element, attrs, controller) {\r\n scope.$parent.$watch('items', function (newVal) {\r\n if (newVal && controller.empty)\r\n $animate.removeClass(element, 'ng-hide');\r\n else\r\n $animate.addClass(element, 'ng-hide');\r\n })\r\n }\r\n }\r\n\r\n function bmgPaginationFinished($animate) {\r\n var directive = {\r\n restrict: 'E',\r\n transclude: true,\r\n replace: true,\r\n template: '',\r\n require: '^bmgPagination',\r\n link: link\r\n }\r\n return directive;\r\n function link(scope, element, attrs, controller) {\r\n scope.$watch('finished', function (newVal) {\r\n if (newVal && !controller.empty)\r\n $animate.removeClass(element, 'ng-hide');\r\n else\r\n $animate.addClass(element, 'ng-hide');\r\n })\r\n }\r\n }\r\n})();","/**\r\n * @ngdoc directive\r\n * @module components.query\r\n * @name components.query:query\r\n * @scope\r\n * @restrict E\r\n * @description\r\n * A utility widget for calling apis. The data returned by the api is accessed with \"$ctrl.results.\"\r\n * @param {string} service The name of resource defined at /angular/services/global.js.\r\n * @param {number=} take The number of items to process. Typically used for apis that support pagination.\r\n * @param {string=} method The type of request to make to the service. Defaults to 'GET' if empty.\r\n * @param {object=} params Additional parameters that will be passed to the api.\r\n * @example\r\n \r\n \r\n \r\n
\r\n \r\n
{{post.name}}\r\n
{{post.summary}}\r\n
\r\n \r\n
\r\n \r\n \r\n (function() {\r\n angular.module('dataExample', ['components.query', 'services.global'])\r\n .controller('exampleController', exampleController);\r\n\r\n exampleController.$inject = ['$scope'];\r\n function exampleController($scope) {\r\n }\r\n })();\r\n \r\n \r\n */\r\n(function () {\r\n angular.module('components.query', [])\r\n .component('query', {\r\n bindings: {\r\n 'service': '@',\r\n 'take': '',\r\n 'method': '@?',\r\n 'params': '',\r\n 'trigger': '',\r\n 'required': '@?',\r\n 'onChange': '&?'\r\n },\r\n transclude: true,\r\n template: '',\r\n controller: queryController\r\n })\r\n\r\n queryController.$inject = ['$scope', '$injector', '$transclude', '$element', '$timeout'];\r\n function queryController($scope, $injector, $transclude, $element, $timeout) {\r\n var ctrl = this;\r\n\r\n ctrl.$onInit = function () {\r\n $transclude($scope, function (clone) {\r\n if (clone.length) {\r\n $element.find('.content').append(clone);\r\n }\r\n });\r\n };\r\n\r\n ctrl.$onChanges = function (changes) {\r\n if (changes.method && !changes.method.currentValue) {\r\n ctrl.method = 'get';\r\n }\r\n if (changes.params && !changes.params.currentValue) {\r\n ctrl.params = {};\r\n }\r\n\r\n if (ctrl.take !== undefined) {\r\n ctrl.params.pageSize = ctrl.take;\r\n }\r\n if (changes.service) {\r\n var servicePieces = ctrl.service.split('.');\r\n var serviceContainer = $injector.get(servicePieces[0]);\r\n ctrl.$resource = serviceContainer[servicePieces[1]];\r\n }\r\n\r\n if (changes.params && ctrl.$$paramsValid()) {\r\n ctrl.loading = true;\r\n ctrl.results = ctrl.$resource[ctrl.method](ctrl.params);\r\n ctrl.results.$promise.then(function (data) {\r\n $timeout(function () {\r\n ctrl.loading = false;\r\n if (ctrl.onChange) {\r\n ctrl.onChange({\r\n data: data\r\n });\r\n }\r\n })\r\n })\r\n }\r\n }\r\n\r\n ctrl.$$paramsValid = function () {\r\n if (!ctrl.required)\r\n return true;\r\n if (!ctrl.params) {\r\n return false;\r\n }\r\n var requirements = ctrl.required.replace(' ', '').split(',');\r\n for (var i = 0; i < requirements.length; i++) {\r\n var target = ctrl.params[requirements[i]];\r\n if (target === undefined || target === null)\r\n return false;\r\n }\r\n return true;\r\n }\r\n }\r\n})();","(function () {\r\n angular.module('components.relatedContent', [\r\n 'utility', \r\n 'ngAnimate'\r\n ]) \r\n .directive('relatedContent', relatedContent)\r\n .controller('relatedContentController', relatedContentController);\r\n \r\n relatedContentController.$inject = ['$scope', 'global']\r\n function relatedContentController($scope, global) {\r\n var controller = this;\r\n \r\n $scope.content = global.relatedContent.get({ id: $scope.id }, function (data) {\r\n $scope.maxCharacters = data.maxCharacters; \r\n $scope.emptySectionText = data.emptySectionText;\r\n $scope.news = data.news;\r\n $scope.projects = data.projects;\r\n $scope.resources = data.resources;\r\n $scope.services = data.services;\r\n $scope.technologies = data.technologies;\r\n $scope.isEmployeeView = data.isEmployeeView;\r\n $scope.hideSection = (data.news === undefined || data.news.length < 1) && (data.projects === undefined || data.projects.length < 1) &&\r\n (data.services === undefined || data.services.length < 1) && (data.resources === undefined || data.resources.length < 1); \r\n });\r\n }\r\n\r\n relatedContent.$inject = ['$window', '$filter', '$timeout', 'global'];\r\n function relatedContent($window, $filter, $timeout, global) {\r\n var directive = {\r\n scope: {\r\n id: '='\r\n },\r\n templateUrl: '/angular/components/relatedContent/relatedContent.html',\r\n replace: true,\r\n restrict: 'E',\r\n link: link,\r\n controller: 'relatedContentController',\r\n };\r\n return directive;\r\n function link(scope, element, attrs) {\r\n \r\n }\r\n }\r\n\r\n})();","(function () {\r\n angular.module('app')\r\n .factory('scrollMagicAnimations', scrollMagicAnimations);\r\n\r\n scrollMagicAnimations.$inject = [];\r\n\r\n function scrollMagicAnimations() {\r\n var animations = {\r\n moveUp: {\r\n parameters: ['$element', 'distance'],\r\n animation: function ($element, distance) {\r\n return new TweenLite.to($element, .5, { y: -distance });\r\n }\r\n },\r\n moveDown: {\r\n parameters: ['$element', 'distance'],\r\n animation: function ($element, distance) {\r\n return new TweenLite.to($element, .5, { y: distance });\r\n }\r\n },\r\n moveLeft: {\r\n parameters: ['$element', 'distance'],\r\n animation: function($element, distance) {\r\n return new TweenLite.to($element, .5, { x: distance });\r\n }\r\n },\r\n moveRight: {\r\n parameters: ['$element', 'distance'],\r\n animation: function ($element, distance) {\r\n return new TweenLite.to($element, .5, { x: -distance });\r\n }\r\n },\r\n upAndDown: {\r\n parameters: ['$element', '$size', 'selector', 'distance'],\r\n animation: function($element, $size, selector, distance) {\r\n if ($size === 'small') {\r\n return new TimelineLite();\r\n }\r\n var dist = typeof (distance) === 'string' ? '-' + distance : -distance;\r\n var content = $element.find(selector);\r\n return new TimelineLite()\r\n .fromTo(content, .5, { autoAlpha: 0, y: dist }, { autoAlpha: 1, y: 0 })\r\n .to(content, .5, { delay: .5, autoAlpha: 0, y: distance });\r\n },\r\n clear: function ($element, $size, selector, distance) {\r\n $element.find(selector).css({\r\n opacity: '',\r\n visibility: '',\r\n transform: '',\r\n height: '',\r\n width: ''\r\n });\r\n }\r\n },\r\n fillTarget: {\r\n parameters: ['$element', '$size', 'start', 'end'],\r\n animation: function ($element, $size, start, end) {\r\n var startElement = $element.find(start);\r\n var endElement = angular.element(end);\r\n startElement.css({\r\n width: '',\r\n height: '',\r\n transform: ''\r\n });\r\n endElement.css({\r\n opacity: ''\r\n });\r\n if ($size === 'small') {\r\n return new TimelineLite();\r\n }\r\n var startOffset = startElement[0].getBoundingClientRect();\r\n var endOffset = endElement[0].getBoundingClientRect();\r\n var pin = endElement.closest('.scrollmagic-pin-spacer');\r\n var pinAdjustment = pin.length ? parseInt(pin.css('padding-top')) : 0;\r\n return new TimelineLite()\r\n .set(endElement, { autoAlpha: 0 })\r\n .to(startElement, .5, { width: endOffset.width, height: endOffset.height, x: endOffset.left - startOffset.left, y: endOffset.top - pinAdjustment - startOffset.top })\r\n .set(endElement, { autoAlpha: 1 })\r\n .set(startElement, { autoAlpha: 0 });\r\n },\r\n clear: function($element, $size, start, end) {\r\n $element.find(start).css({\r\n opacity: '',\r\n visibility: '',\r\n width: '',\r\n height: '',\r\n translate: ''\r\n });\r\n angular.element(end).css({\r\n opacity: '',\r\n visibility: ''\r\n });\r\n }\r\n },\r\n softwareFree: {\r\n parameters: ['$element', '$size'],\r\n animation: function ($element, $size) {\r\n MorphSVGPlugin.convertToPath($element.find(\"circle, rect, ellipse, line, polygon, polyline\"));\r\n return new TimelineMax()\r\n\r\n // setup\r\n .set($element.find('.scene2-page'), { autoAlpha: 0 })\r\n\r\n // scene1\r\n .to($element.find('.scene1-fade-out-rect'), 1, { autoAlpha: 0 })\r\n .add('scene1-morph-to-page')\r\n .to($element.find('.scene1-morph-to-page'), 1, { morphSVG: $element.find('.scene2-page')[0] }, 'scene1-morph-to-page')\r\n .to($element.find('.scene1-content'), 1, { autoAlpha: 0 }, 'scene1-morph-to-page')\r\n\r\n // scene2\r\n .from($element.find('.scene2-mask'), 0.1, { autoAlpha: 0 }, 'scene2-show-content-with-line')\r\n .add('scene2-show-content-with-line')\r\n .from($element.find('.scene2-content'), 0.1, { autoAlpha: 0 }, 'scene2-show-content-with-line')\r\n .from($element.find('.scene2-show-mask-line'), 0.1, { autoAlpha: 0 }, 'scene2-show-content-with-line')\r\n .fromTo($element.find('.scene2-mask'), 1.1, { xPercent: 0, scaleX: 1 }, { xPercent: 80, scaleX: 0 }, 'scene2-show-content-with-line')\r\n .fromTo($element.find('.scene2-show-mask-line'), 1.1, { xPercent: 0 }, { xPercent: 90 }, 'scene2-show-content-with-line')\r\n .to($element.find('.scene2-show-mask-line'), 0.2, { autoAlpha: 0 })\r\n\r\n // scene3\r\n .add('scene3-morph-to-speech')\r\n .to($element.find('.scene2-content'), 0.3, { autoAlpha: 0 }, 'scene3-morph-to-speech')\r\n .to($element.find('.scene1-morph-to-page'), 0.3, { morphSVG: $element.find('.scene3-speech-bubble')[0] }, 'scene3-morph-to-speech')\r\n .add('scene3-animate-in')\r\n .from($element.find('.scene3-speech-bubble'), 0.1, { autoAlpha: 0 }, 'scene3-animate-in')\r\n .from($element.find('.scene3-headphones'), 0.1, { autoAlpha: 0 }, 'scene3-animate-in')\r\n .fromTo($element.find('.scene3-headphones-line-1'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-animate-in')\r\n .fromTo($element.find('.scene3-headphones-line-2'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-animate-in')\r\n .fromTo($element.find('.scene3-headphones-line-3'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-animate-in')\r\n .fromTo($element.find('.scene3-headphones-line-4'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-animate-in')\r\n .fromTo($element.find('.scene3-headphones-line-5'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-animate-in')\r\n .fromTo($element.find('.scene3-headphones-line-6'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-animate-in')\r\n .fromTo($element.find('.scene3-headphones-line-7'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-animate-in')\r\n .fromTo($element.find('.scene3-headphones-line-8'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-animate-in')\r\n .fromTo($element.find('.scene3-headphones-line-9'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-animate-in')\r\n .fromTo($element.find('.scene3-headphones-line-10'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-animate-in')\r\n .from($element.find('.scene3-speech-tail'), 1.5, { autoAlpha: 0, yPercent: -10 }, 'scene3-animate-in')\r\n .staggerFrom([$element.find('.scene3-speech-1'), $element.find('.scene3-speech-2'), $element.find('.scene3-speech-3')], 0.3, { autoAlpha: 0, cycle: { xPercent: [-10, 10, -10] } }, 0.1, 'scene3-animate-in');\r\n }\r\n },\r\n softwareProfessional: {\r\n parameters: ['$element', '$size'],\r\n animation: function ($element, $size) {\r\n MorphSVGPlugin.convertToPath($element.find(\"circle, rect, ellipse, line, polygon, polyline\"));\r\n return new TimelineMax()\r\n\r\n // setup\r\n .set($element.find('.scene2-page'), { autoAlpha: 0 })\r\n .set($element.find('.scene3-screen'), { autoAlpha: 0 })\r\n\r\n // scene1\r\n .to($element.find('.scene1-fade-out-rect'), 1, { autoAlpha: 0 })\r\n .add('scene1-morph-to-page')\r\n .to($element.find('.scene1-morph-to-page'), 1, { morphSVG: $element.find('.scene2-page')[0] }, 'scene1-morph-to-page')\r\n .to($element.find('.scene1-content'), 1, { autoAlpha: 0 }, 'scene1-morph-to-page')\r\n\r\n // scene2\r\n .add('scene2-fade-in')\r\n .from($element.find('.scene2-page-contents'), 0.5, { autoAlpha: 0 }, 'scene2-fade-in')\r\n .from($element.find('.scene2-list-graphic'), 0.5, { autoAlpha: 0 }, 'scene2-fade-in')\r\n .from($element.find('.scene2-connections'), 0.5, { autoAlpha: 0 }, 'scene2-fade-in')\r\n .fromTo($element.find('.scene2-connection-1'), 1, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene2-fade-in')\r\n .fromTo($element.find('.scene2-connection-2'), 1, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene2-fade-in')\r\n .fromTo($element.find('.scene2-connection-3'), 1, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene2-fade-in')\r\n\r\n // scene3\r\n .add('scene3-morph-to-screen')\r\n .to($element.find('.scene2-page-contents'), 0.5, { autoAlpha: 0 }, 'scene3-morph-to-screen')\r\n .to($element.find('.scene2-list-graphic'), 0.5, { autoAlpha: 0 }, 'scene3-morph-to-screen')\r\n .to($element.find('.scene2-connections'), 0.5, { autoAlpha: 0 }, 'scene3-morph-to-screen')\r\n .to($element.find('.scene1-morph-to-page'), 1, { morphSVG: $element.find('.scene3-screen')[0] }, 'scene3-morph-to-screen')\r\n .add('scene3-fade-in')\r\n .from($element.find('.scene3-screen-outlines'), 1, { autoAlpha: 0 }, 'scene3-fade-in')\r\n .fromTo($element.find('.scene3-screen-outline-1'), 1, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-fade-in')\r\n .fromTo($element.find('.scene3-screen-outline-2'), 1, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-fade-in')\r\n .fromTo($element.find('.scene3-screen-outline-3'), 1, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-fade-in')\r\n .fromTo($element.find('.scene3-screen-outline-4'), 1, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-fade-in')\r\n .fromTo($element.find('.scene3-screen-outline-5'), 1, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene3-fade-in')\r\n .from($element.find('.scene3-screen-content'), 1, { autoAlpha: 0 }, 'scene3-fade-in')\r\n .staggerFromTo([$element.find('.scene3-screen-line-1'), $element.find('.scene3-screen-line-2'), $element.find('.scene3-screen-line-3')], 1, { scaleX: 0 }, { scaleX: 1 }, 0.33, 'scene3-fade-in')\r\n\r\n // scene4\r\n .add('scene4-morph-to-speech')\r\n .to($element.find('.scene3-screen-outlines'), 0.3, { autoAlpha: 0 }, 'scene4-morph-to-speech')\r\n .to($element.find('.scene3-screen-content'), 0.3, { autoAlpha: 0 }, 'scene4-morph-to-speech')\r\n .to($element.find('.scene1-morph-to-page'), 0.3, { morphSVG: $element.find('.scene4-speech-bubble')[0] }, 'scene4-morph-to-speech')\r\n .add('scene4-animate-in')\r\n .from($element.find('.scene4-speech-bubble'), 0.1, { autoAlpha: 0 }, 'scene4-animate-in')\r\n .from($element.find('.scene4-headphones'), 0.1, { autoAlpha: 0 }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-1'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-2'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-3'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-4'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-5'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-6'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-7'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-8'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-9'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-10'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .from($element.find('.scene4-speech-tail'), 1.5, { autoAlpha: 0, yPercent: -10 }, 'scene4-animate-in')\r\n .staggerFrom([$element.find('.scene4-speech-1'), $element.find('.scene4-speech-2'), $element.find('.scene4-speech-3')], 0.3, { autoAlpha: 0, cycle: { xPercent: [-10, 10, -10] } }, 0.1, 'scene4-animate-in');\r\n }\r\n },\r\n softwareAutomation: {\r\n parameters: ['$element', '$size'],\r\n animation: function ($element, $size) {\r\n MorphSVGPlugin.convertToPath($element.find(\"circle, rect, ellipse, line, polygon, polyline\"));\r\n return new TimelineMax()\r\n\r\n // scene1\r\n .to($element.find('.scene1-gear'), 2, { transformOrigin: \"50% 50% 0\", rotation: 45, ease: Linear.easeNone }, 0)\r\n\r\n // time: 2\r\n\r\n // scene2\r\n .add('scene2-fade-in')\r\n .to($element.find('.scene1-background'), 0.5, { autoAlpha: 0 }, 'scene2-fade-in')\r\n .to($element.find('.scene1-gear-inner'), 0.5, { autoAlpha: 0 }, 'scene2-fade-in')\r\n .to($element.find('.scene1-gear-teeth'), 0.5, { autoAlpha: 0 }, 'scene2-fade-in')\r\n .to($element.find('.scene1-content'), 0.5, { autoAlpha: 0 }, 'scene2-fade-in')\r\n .to($element.find('.scene1-gear-morph'), 1, { morphSVG: $element.find('.scene2-outer-circle')[0] }, 'scene2-fade-in')\r\n .add('scene2-animate-in')\r\n .from($element.find('.scene2-content'), 0.5, { autoAlpha: 0 }, 'scene2-animate-in')\r\n .from($element.find('.scene2-node-1'), 0.5, { autoAlpha: 0 }, 'scene2-animate-in')\r\n .from($element.find('.scene2-node-2'), 0.5, { autoAlpha: 0 }, 'scene2-animate-in')\r\n .from($element.find('.scene2-node-3'), 0.5, { autoAlpha: 0 }, 'scene2-animate-in')\r\n .from($element.find('.scene2-square-1'), 1, { autoAlpha: 0, transformOrigin: \"50% 50% 0\", scale: 0.1 }, 2 + 0.5)\r\n .from($element.find('.scene2-square-2'), 1, { autoAlpha: 0, transformOrigin: \"50% 50% 0\", scale: 0.1 }, 2 + 0.6)\r\n .from($element.find('.scene2-square-3'), 1, { autoAlpha: 0, transformOrigin: \"50% 50% 0\", scale: 0.1 }, 2 + 0.7)\r\n\r\n // time: 3.7\r\n\r\n // scene3\r\n .add('scene3-morph-to-screen')\r\n .to($element.find('.scene1-gear-morph'), 0.5, { autoAlpha: 0 }, 'scene3-morph-to-screen')\r\n .to($element.find('.scene2-content'), 0.5, { autoAlpha: 0 }, 'scene3-morph-to-screen')\r\n .to($element.find('.scene2-node-1'), 0.5, { autoAlpha: 0 }, 'scene3-morph-to-screen')\r\n .to($element.find('.scene2-node-2'), 0.5, { autoAlpha: 0 }, 'scene3-morph-to-screen')\r\n .to($element.find('.scene2-node-3'), 0.5, { autoAlpha: 0 }, 'scene3-morph-to-screen')\r\n .to($element.find('.scene2-square-1'), 0.5, { autoAlpha: 0 }, 'scene3-morph-to-screen')\r\n .to($element.find('.scene2-square-3'), 0.5, { autoAlpha: 0 }, 'scene3-morph-to-screen')\r\n .to($element.find('.scene2-square-2'), 1, { morphSVG: $element.find('.scene3-morph-outline')[0] }, 'scene3-morph-to-screen')\r\n .from($element.find('.scene3-content'), 1, { autoAlpha: 0 }, 3.7 + 0.7)\r\n .from($element.find('.scene3-morph-outline'), 1, { autoAlpha: 0 }, 3.7 + 0.7)\r\n .from($element.find('.scene3-morph-rect'), 1, { autoAlpha: 0 }, 3.7 + 0.7)\r\n\r\n // time: 5.4\r\n\r\n // scene4\r\n .add('scene4-morph-to-speech')\r\n .to($element.find('.scene2-square-2'), 0.3, { autoAlpha: 0 }, 'scene4-morph-to-speech')\r\n .to($element.find('.scene3-content'), 0.3, { autoAlpha: 0 }, 'scene4-morph-to-speech')\r\n .to($element.find('.scene3-morph-outline'), 0.3, { autoAlpha: 0 }, 'scene4-morph-to-speech')\r\n .to($element.find('.scene3-morph-rect'), 0.5, { morphSVG: $element.find('.scene4-speech-bubble')[0] }, 'scene4-morph-to-speech')\r\n .add('scene4-animate-in')\r\n .from($element.find('.scene4-speech-bubble'), 0.1, { autoAlpha: 0 }, 'scene4-animate-in')\r\n .from($element.find('.scene4-headphones'), 0.1, { autoAlpha: 0 }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-1'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-2'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-3'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-4'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-5'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-6'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-7'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-8'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-9'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .fromTo($element.find('.scene4-headphones-line-10'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene4-animate-in')\r\n .from($element.find('.scene4-speech-tail'), 1.5, { autoAlpha: 0, yPercent: -10 }, 'scene4-animate-in')\r\n .staggerFrom([$element.find('.scene4-speech-1'), $element.find('.scene4-speech-2'), $element.find('.scene4-speech-3')], 0.3, { autoAlpha: 0, cycle: { xPercent: [-10, 10, -10] } }, 0.1, 'scene4-animate-in');\r\n }\r\n },\r\n softwareEnterprise: {\r\n parameters: ['$element', '$size'],\r\n animation: function ($element, $size) {\r\n MorphSVGPlugin.convertToPath($element.find(\"circle, rect, ellipse, line, polygon, polyline\"));\r\n return new TimelineMax()\r\n \r\n // scene1\r\n .from($element.find('.scene1-arrow-1'), 1, { autoAlpha: 0, xPercent: -10, yPercent: -10 })\r\n .from($element.find('.scene1-arrow-2'), 1, { autoAlpha: 0, xPercent: 10, yPercent: 10 }, 0.2)\r\n .from($element.find('.scene1-arrow-3'), 1, { autoAlpha: 0, xPercent: 10, yPercent: -10 }, 0.4)\r\n .from($element.find('.scene1-arrow-4'), 1, { autoAlpha: 0, xPercent: -10, yPercent: 2 }, 0.6)\r\n .from($element.find('.scene1-arrow-5'), 1, { autoAlpha: 0, xPercent: 10, yPercent: 0 }, 0.8)\r\n .from($element.find('.scene1-arrow-6'), 1, { autoAlpha: 0, xPercent: -2, yPercent: 10 }, 1)\r\n .to($element.find('.scene1-ring'), 2, { transformOrigin: \"50% 50% 0\", rotation: 30, ease: Linear.easeNone }, 0)\r\n\r\n // time: 2\r\n\r\n // scene2\r\n .add('scene1-fade-out')\r\n .to($element.find('.scene1-ring'), 1, { autoAlpha: 0 }, 'scene1-fade-out')\r\n .to($element.find('.scene1-graphic'), 1, { autoAlpha: 0 }, 'scene1-fade-out')\r\n .to($element.find('.scene1-arrows'), 1, { autoAlpha: 0 }, 'scene1-fade-out')\r\n .from($element.find('.scene2-ring'), 1, { autoAlpha: 0 }, 'scene1-fade-out')\r\n .from($element.find('.scene2-globe'), 1, { autoAlpha: 0 }, 'scene1-fade-out')\r\n .to($element.find('.scene2-ring'), 2.6, { transformOrigin: \"50% 50% 0\", rotation: 10, ease: Linear.easeNone }, 2 + 0)\r\n .from($element.find('.scene2-pin-1'), 1, { autoAlpha: 0, transformOrigin: \"50% 50% 0\", scale: 0.1 }, 2 + 1)\r\n .from($element.find('.scene2-pin-2'), 1, { autoAlpha: 0, transformOrigin: \"50% 50% 0\", scale: 0.1 }, 2 + 1.2)\r\n .from($element.find('.scene2-pin-3'), 1, { autoAlpha: 0, transformOrigin: \"50% 50% 0\", scale: 0.1 }, 2 + 1.4)\r\n .from($element.find('.scene2-pin-4'), 1, { autoAlpha: 0, transformOrigin: \"50% 50% 0\", scale: 0.1 }, 2 + 1.6)\r\n\r\n // time: 4.6\r\n\r\n // scene3\r\n .add('scene3-fade-in')\r\n .to($element.find('.scene2-ring'), 1, { autoAlpha: 0 }, 'scene3-fade-in')\r\n .to($element.find('.scene2-globe'), 1, { autoAlpha: 0 }, 'scene3-fade-in')\r\n .to($element.find('.scene2-pin-1'), 1, { autoAlpha: 0 }, 'scene3-fade-in')\r\n .to($element.find('.scene2-pin-2'), 1, { autoAlpha: 0 }, 'scene3-fade-in')\r\n .to($element.find('.scene2-pin-3'), 1, { autoAlpha: 0 }, 'scene3-fade-in')\r\n .to($element.find('.scene2-pin-4'), 1, { autoAlpha: 0 }, 'scene3-fade-in')\r\n .from($element.find('.scene3-page'), 1, { autoAlpha: 0 }, 'scene3-fade-in')\r\n .from($element.find('.scene3-glasses'), 1, { autoAlpha: 0 }, 'scene3-fade-in')\r\n\r\n // time: 5.6\r\n\r\n // scene4\r\n .add('scene4-morph-to-circle')\r\n .to($element.find('.scene3-page'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-part-1'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-part-2'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-part-3'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-part-4'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-part-5'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-part-6'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-part-7'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-part-8'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-part-9'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-part-10'), 0.5, { autoAlpha: 0 }, 'scene4-morph-to-circle')\r\n .to($element.find('.scene3-glasses-glass'), 1, { morphSVG: $element.find('.scene4-outer-circle')[0] }, 'scene4-morph-to-circle')\r\n .add('scene4-animate-in')\r\n .from($element.find('.scene4-content'), 0.5, { autoAlpha: 0 }, 'scene4-animate-in')\r\n .from($element.find('.scene4-node-1'), 0.5, { autoAlpha: 0 }, 'scene4-animate-in')\r\n .from($element.find('.scene4-node-2'), 0.5, { autoAlpha: 0 }, 'scene4-animate-in')\r\n .from($element.find('.scene4-node-3'), 0.5, { autoAlpha: 0 }, 'scene4-animate-in')\r\n .from($element.find('.scene4-square-1'), 1, { autoAlpha: 0, transformOrigin: \"50% 50% 0\", scale: 0.1 }, 5.6 + 0.5)\r\n .from($element.find('.scene4-square-2'), 1, { autoAlpha: 0, transformOrigin: \"50% 50% 0\", scale: 0.1 }, 5.6 + 0.6)\r\n .from($element.find('.scene4-square-3'), 1, { autoAlpha: 0, transformOrigin: \"50% 50% 0\", scale: 0.1 }, 5.6 + 0.7)\r\n\r\n // time: 7.3\r\n\r\n // scene5\r\n .add('scene5-morph-to-phone')\r\n .to($element.find('.scene3-glasses-glass'), 0.5, { autoAlpha: 0 }, 'scene5-morph-to-phone')\r\n .to($element.find('.scene4-content'), 0.5, { autoAlpha: 0 }, 'scene5-morph-to-phone')\r\n .to($element.find('.scene4-node-1'), 0.5, { autoAlpha: 0 }, 'scene5-morph-to-phone')\r\n .to($element.find('.scene4-node-2'), 0.5, { autoAlpha: 0 }, 'scene5-morph-to-phone')\r\n .to($element.find('.scene4-node-3'), 0.5, { autoAlpha: 0 }, 'scene5-morph-to-phone')\r\n .to($element.find('.scene4-square-1'), 0.5, { autoAlpha: 0 }, 'scene5-morph-to-phone')\r\n .to($element.find('.scene4-square-3'), 0.5, { autoAlpha: 0 }, 'scene5-morph-to-phone')\r\n .to($element.find('.scene4-square-2'), 0.5, { morphSVG: $element.find('.scene5-phone')[0] }, 'scene5-morph-to-phone')\r\n .from($element.find('.scene5-phone-gradient'), 0.5, { autoAlpha: 0 }, 7.3 + 0.25)\r\n .from($element.find('.scene5-phone-content'), 0.5, { autoAlpha: 0 }, 7.3 + 0.25)\r\n .from($element.find('.scene5-morph-button'), 0.5, { autoAlpha: 0 }, 7.3 + 0.25)\r\n .from($element.find('.scene5-phone'), 0.5, { autoAlpha: 0 }, 7.3 + 0.5)\r\n\r\n // time: 8.3\r\n\r\n // scene6\r\n .add('scene6-morph-to-fill')\r\n .to($element.find('.scene5-phone-gradient'), 0.5, { autoAlpha: 0 }, 'scene6-morph-to-fill')\r\n .to($element.find('.scene5-phone-content'), 0.5, { autoAlpha: 0 }, 'scene6-morph-to-fill')\r\n .to($element.find('.scene5-phone'), 0.5, { autoAlpha: 0 }, 'scene6-morph-to-fill')\r\n .to($element.find('.scene4-square-2'), 0.5, { autoAlpha: 0 }, 'scene6-morph-to-fill')\r\n .to($element.find('.scene5-morph-button'), 1, { morphSVG: $element.find('.scene6-fill-rect')[0] }, 'scene6-morph-to-fill')\r\n .add('scene6-fade-in')\r\n .from($element.find('.scene6-content'), 1, { autoAlpha: 0 }, 'scene6-fade-in')\r\n .from($element.find('.scene6-fill-rect'), 1, { autoAlpha: 0 }, 'scene6-fade-in')\r\n\r\n // time: 10.3\r\n\r\n // scene7\r\n .add('scene7-fade-in')\r\n .to($element.find('.scene6-content'), 0.5, { autoAlpha: 0 }, 'scene7-fade-in')\r\n .to($element.find('.scene6-fill-rect'), 0.5, { autoAlpha: 0 }, 'scene7-fade-in')\r\n .to($element.find('.scene5-morph-button'), 0.5, { autoAlpha: 0 }, 'scene7-fade-in')\r\n .from($element.find('.scene7-content'), 0.5, { autoAlpha: 0 }, 'scene7-fade-in')\r\n .fromTo($element.find('.scene7-checkmark-2'), 0.3, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, \"-=0.3\")\r\n .from($element.find('.scene7-checkmark-bg-2'), 0.3, { autoAlpha: 0 }, \"-=0.3\")\r\n .add('scene7-show-checkmark')\r\n .fromTo($element.find('.scene7-checkmark-1'), 0.3, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene7-show-checkmark')\r\n .from($element.find('.scene7-checkmark-bg-1'), 0.3, { autoAlpha: 0 }, 'scene7-show-checkmark')\r\n\r\n // time: 11.1\r\n\r\n // scene8\r\n .add('scene7-animate-out')\r\n .to($element.find('.scene7-content'), 0.3, { autoAlpha: 0 }, 'scene7-animate-out')\r\n .to($element.find('.scene7-checkmark-1'), 0.3, { autoAlpha: 0 }, 'scene7-animate-out')\r\n .to($element.find('.scene7-checkmark-bg-1'), 0.3, { autoAlpha: 0 }, 'scene7-animate-out')\r\n .to($element.find('.scene7-checkmark-2'), 0.3, { autoAlpha: 0 }, 'scene7-animate-out')\r\n .to($element.find('.scene7-checkmark-bg-2'), 0.3, { autoAlpha: 0 }, 'scene7-animate-out')\r\n .add('scene8-animate-in')\r\n .from($element.find('.scene8-speech-bubble'), 0.1, { autoAlpha: 0 }, 'scene8-animate-in')\r\n .from($element.find('.scene8-headphones'), 0.1, { autoAlpha: 0 }, 'scene8-animate-in')\r\n .fromTo($element.find('.scene8-headphones-line-1'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene8-animate-in')\r\n .fromTo($element.find('.scene8-headphones-line-2'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene8-animate-in')\r\n .fromTo($element.find('.scene8-headphones-line-3'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene8-animate-in')\r\n .fromTo($element.find('.scene8-headphones-line-4'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene8-animate-in')\r\n .fromTo($element.find('.scene8-headphones-line-5'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene8-animate-in')\r\n .fromTo($element.find('.scene8-headphones-line-6'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene8-animate-in')\r\n .fromTo($element.find('.scene8-headphones-line-7'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene8-animate-in')\r\n .fromTo($element.find('.scene8-headphones-line-8'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene8-animate-in')\r\n .fromTo($element.find('.scene8-headphones-line-9'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene8-animate-in')\r\n .fromTo($element.find('.scene8-headphones-line-10'), 0.7, { drawSVG: \"0% 0%\" }, { drawSVG: \"0% 100%\" }, 'scene8-animate-in')\r\n .from($element.find('.scene8-speech-tail'), 1.5, { autoAlpha: 0, yPercent: -10 }, 'scene8-animate-in')\r\n .staggerFrom([$element.find('.scene8-speech-1'), $element.find('.scene8-speech-2'), $element.find('.scene8-speech-3')], 0.3, { autoAlpha: 0, cycle: { xPercent: [-10, 10, -10] } }, 0.1, 'scene8-animate-in');\r\n }\r\n }\r\n };\r\n var callers = {};\r\n var keys = Object.keys(animations);\r\n for (var i = 0; i < keys.length; i++) {\r\n var key = keys[i];\r\n var animation = animations[key];\r\n callers[key] = {\r\n get: function (settings) {\r\n var params = [];\r\n for (var j = 0; j < this.parameters.length; j++) {\r\n params.push(settings[this.parameters[j]]);\r\n }\r\n return this.animation.apply(this, params);\r\n }.bind(animation),\r\n clear: function (settings) {\r\n if (!this.clear) {\r\n return function () { };\r\n }\r\n var params = [];\r\n for (var j = 0; j < this.parameters.length; j++) {\r\n params.push(settings[this.parameters[j]]);\r\n }\r\n return this.clear.apply(this, params);\r\n }.bind(animation)\r\n };\r\n }\r\n return callers;\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .directive('scrollMagicContainer', scrollMagicContainer);\r\n\r\n var id = 0;\r\n function scrollMagicContainer() {\r\n var directive = {\r\n restrict: 'A',\r\n bindToController: true,\r\n controller: controller\r\n };\r\n function controller($element, $attrs, $window) {\r\n var ctrl = this;\r\n var win = angular.element($window);\r\n ctrl._id = id++;\r\n ctrl._loadPosition = 0;\r\n ctrl._sceneQueue = {};\r\n\r\n ctrl.$onInit = function () {\r\n ctrl.magic = new ScrollMagic.Controller(); \r\n };\r\n\r\n ctrl.addScene = function (scene) {\r\n scene.addTo(ctrl.magic);\r\n ctrl._loadPosition++;\r\n var queue = ctrl._sceneQueue[ctrl._loadPosition];\r\n if (queue) {\r\n console.log(queue);\r\n for (var i = 0; i < queue.length; i++) {\r\n queue[i].finishInit();\r\n }\r\n }\r\n };\r\n\r\n ctrl.queueScene = function (scene) {\r\n if (scene.loadOrder) {\r\n var queue = ctrl._sceneQueue[scene.loadOrder];\r\n if (!queue) {\r\n queue = ctrl._sceneQueue[scene.loadOrder] = [];\r\n }\r\n queue.push(scene);\r\n }\r\n else {\r\n scene.finishInit();\r\n }\r\n };\r\n }\r\n controller.$inject = ['$element', '$attrs', '$window'];\r\n return directive;\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .component('scrollMagicScene', {\r\n bindings: {\r\n animation: '@',\r\n animationSettings: '',\r\n reset: '',\r\n enable: '@?',\r\n pin: '',\r\n triggerElement: '@?',\r\n triggerHook: '',\r\n duration: '',\r\n offset: '',\r\n loadOrder: '',\r\n hookPromise: ''\r\n },\r\n template: `\r\n \r\n `,\r\n transclude: true,\r\n require: {\r\n stickyManager: '^^?stickyManager',\r\n scrollMagicContainer: '^^scrollMagicContainer'\r\n },\r\n controller: scrollMagicSceneController\r\n });\r\n\r\n var id = 0;\r\n scrollMagicSceneController.$inject = ['$scope', '$element', 'scrollMagicAnimations', '$transclude', '$window', '$timeout'];\r\n function scrollMagicSceneController($scope, $element, scrollMagicAnimations, $transclude, $window, $timeout) {\r\n var ctrl = this;\r\n ctrl._id = id++;\r\n ctrl.$onInit = function () {\r\n ctrl._container = $element.find('>div');\r\n $transclude($scope, function (clone) {\r\n if (clone.length) {\r\n ctrl._container.html(clone);\r\n }\r\n });\r\n\r\n ctrl._win = angular.element($window);\r\n if (ctrl.loadOrder) {\r\n ctrl.scrollMagicContainer.queueScene(ctrl);\r\n }\r\n else {\r\n ctrl.finishInit();\r\n }\r\n\r\n ctrl._win.on(`resize.scrollMagic${ctrl._id}`, function () {\r\n if (ctrl.reset && ctrl._enabled) {\r\n ctrl._tween.progress(0);\r\n ctrl.animationFunction.clear(ctrl.animationSettings);\r\n ctrl._tween = ctrl.animationFunction.get(ctrl.animationSettings);\r\n ctrl.scene.setTween(ctrl._tween);\r\n ctrl.scene.triggerHook(ctrl.triggerHook || (ctrl.stickyManager ? ctrl.stickyManager.getStickPoint() / ctrl._win.height() : 0));\r\n }\r\n }).on('changed.zf.mediaquery', function (event, newSize) {\r\n var curEnabled = ctrl._enabled;\r\n ctrl.animationSettings.$size = newSize;\r\n ctrl._enabled = ctrl.enable === undefined || Foundation.MediaQuery.atLeast(ctrl.enable);\r\n ctrl.scene.enabled(ctrl._enabled);\r\n if (ctrl.pin) {\r\n if (curEnabled && !ctrl._enabled) {\r\n ctrl.scene.removePin(true);\r\n $element.find('.scrollmagic-pin-spacer').attr('style', '');\r\n ctrl._pinned = false;\r\n }\r\n else if (!curEnabled && ctrl._enabled) {\r\n ctrl.scene.setPin(ctrl._container[0]);\r\n }\r\n }\r\n if (!ctrl._enabled) {\r\n ctrl.animationFunction.clear(ctrl.animationSettings);\r\n }\r\n });\r\n };\r\n\r\n ctrl.finishInit = function () {\r\n $timeout(function () {\r\n ctrl.animationFunction = scrollMagicAnimations[ctrl.animation];\r\n ctrl.scene = new ScrollMagic.Scene({\r\n triggerElement: ctrl.triggerElement || ctrl._container[0],\r\n duration: ctrl.duration || 800,\r\n triggerHook: ctrl.triggerHook || (ctrl.stickyManager ? ctrl.stickyManager.getStickPoint() / ctrl._win.height() : 0),\r\n offset: ctrl.offset || 0\r\n });\r\n ctrl._enabled = ctrl.enable === undefined || Foundation.MediaQuery.atLeast(ctrl.enable);\r\n if (ctrl._enabled && ctrl.pin) {\r\n ctrl.scene.setPin(ctrl._container[0]);\r\n }\r\n\r\n if (!ctrl.animationSettings) {\r\n ctrl.animationSettings = {};\r\n }\r\n ctrl.animationSettings.$element = ctrl._container;\r\n ctrl.animationSettings.$size = Foundation.MediaQuery.current;\r\n ctrl._tween = ctrl.animationFunction.get(ctrl.animationSettings);\r\n ctrl.scene.setTween(ctrl._tween);\r\n ctrl.scrollMagicContainer.addScene(ctrl.scene);\r\n ctrl.scene.enabled(ctrl._enabled);\r\n \r\n if (ctrl.hookPromise) {\r\n ctrl.hookPromise.then(function () {\r\n ctrl.scene.triggerHook(ctrl.triggerHook || (ctrl.stickyManager ? ctrl.stickyManager.getStickPoint() / ctrl._win.height() : 0));\r\n });\r\n }\r\n });\r\n };\r\n\r\n ctrl.$onDestroy = function () {\r\n ctrl._win.off(`resize.scrollMagic${ctrl._id}`);\r\n };\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .controller('SideImageCarouselController', SideImageCarouselController);\r\n\r\n SideImageCarouselController.$inject = ['$scope'];\r\n function SideImageCarouselController($scope) {\r\n var ctrl = this;\r\n \r\n function getClientPos(data, index) {\r\n var start = Math.floor(index / data.slideData.length);\r\n var currentIndex = (index + Math.abs(data.slideData.length * start)) % data.slideData.length;\r\n return start * data.totalWidth + data.offsets[currentIndex];\r\n }\r\n\r\n ctrl.imageAnimation = function (offset, index, data) {\r\n var width = data.slideWidth;\r\n var rounds = -Math.floor((getClientPos(data, index) + offset + (data.slideData.length > 1 ? width : 0) + data.spacing) / data.totalWidth);\r\n var roundLength = data.slideData.length;\r\n var renderIndex = index + (rounds * roundLength);\r\n return {\r\n opacity: 1 - Math.max(0, Math.min(Math.abs((getClientPos(data, renderIndex) + offset) / width), 1)),\r\n y: 0,\r\n x: 0,\r\n width: width,\r\n offsetShift: getClientPos(data, renderIndex) + offset\r\n };\r\n };\r\n\r\n ctrl.slideAnimation = function (offset, index, data) {\r\n var width = data.slideWidth;\r\n var rounds = -Math.floor((getClientPos(data, index) + offset + (data.slideData.length > 1 ? width : 0) + data.spacing) / data.totalWidth);\r\n var roundLength = data.slideData.length;\r\n var renderIndex = index + (rounds * roundLength);\r\n return {\r\n opacity: 1 - Math.max(0, Math.min(Math.abs((getClientPos(data, renderIndex) + offset) / width), 1)),\r\n x: getClientPos(data, renderIndex) + offset,\r\n y: 0,\r\n width: width\r\n };\r\n };\r\n\r\n ctrl.slideAnimationPrep = function (data) {\r\n if (data.slideData) {\r\n var totalWidth = 0;\r\n var offsets = [];\r\n var breakpoints = [];\r\n var elements = [];\r\n var maxHeight = 0;\r\n var slides = data.carousel.find('.slides')\r\n .css('height', '');\r\n if (data.slideWidth) {\r\n data.slideElements.width(data.slideWidth);\r\n }\r\n for (var i = 0; i < data.slideData.length; i++) {\r\n offsets.push(totalWidth);\r\n var element = angular.element(data.slideElements[i]).find('>div,>a');\r\n var images = element.find('img');\r\n var width = data.slideWidth;\r\n elements.push(element);\r\n var imagesLoaded = images.hasClass('loaded');\r\n if (!imagesLoaded) {\r\n images.css('display', 'none');\r\n }\r\n var height = element.outerHeight();\r\n if (!imagesLoaded) {\r\n images.css('display', '');\r\n }\r\n var margin = data.spacing;\r\n maxHeight = Math.max(height, maxHeight);\r\n breakpoints.push(totalWidth + margin + (width / 2));\r\n totalWidth += width + margin;\r\n }\r\n data.elements = elements;\r\n data.totalWidth = totalWidth;\r\n data.offsets = offsets;\r\n data.breakpoints = breakpoints;\r\n slides.height(maxHeight);\r\n }\r\n return data;\r\n };\r\n\r\n ctrl.slideSnap = function (offset, data) {\r\n var pos = 0;\r\n var shift = Math.abs(offset % data.totalWidth);\r\n if (offset > 0) {\r\n shift = data.totalWidth - shift;\r\n }\r\n for (var i = 0; i < data.offsets.length; i++) {\r\n if (shift <= data.breakpoints[i]) {\r\n pos = i;\r\n break;\r\n }\r\n }\r\n var index = -(Math.ceil(offset / data.totalWidth) * data.slideData.length - pos);\r\n return {\r\n index: index,\r\n position: -getClientPos(data, index)\r\n };\r\n };\r\n }\r\n})();","/**\r\n * @ngdoc directive\r\n * @module components.sticky\r\n * @name components.sticky:sticky\r\n * @scope\r\n * @restrict E\r\n * @description\r\n * Used for elements that stick to the top of the defined scrollable region when the user scrolls past the element. Do note that there is an issue with how the sticky element displays caused by differences in how this page is structured with our typical front end.\r\n * @param {string} scrollTarget Selector for the scrollable element that will be stuck to.\r\n * @param {function=} onStick Callback triggered when sticky element starts sticking. (not implemented)\r\n * @param {function=} onRelease Callback triggered when sticky element stops sticking. (not implemented)\r\n * @example\r\n \r\n \r\n \r\n
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin ac condimentum neque, vitae faucibus ipsum. Ut porttitor justo nec ante ultricies, eget luctus massa porta. Curabitur pellentesque consequat nulla in tempor. Nullam rutrum odio non mattis sagittis. Vestibulum tincidunt enim vitae ex ultrices, id finibus quam tincidunt. Vivamus hendrerit lorem vitae diam porta luctus. Mauris fermentum imperdiet tempus. Fusce eu lacus est. Curabitur vel condimentum enim, sit amet auctor urna. Nam volutpat enim enim, vel egestas justo fermentum hendrerit. Donec sagittis tincidunt accumsan. Donec feugiat tempor orci. Maecenas condimentum ligula at accumsan fermentum. Integer cursus tellus non dictum condimentum.
\r\n
\r\n Testing things
\r\n \r\n
Cras lacinia iaculis ex, eu laoreet turpis semper ac. In vulputate sagittis sem nec laoreet. Nunc nec ornare sapien. Nam quis lectus felis. Pellentesque at eros accumsan, tincidunt lorem quis, aliquam leo. Integer in aliquet dolor. Integer interdum posuere dignissim. Donec commodo ligula a quam mattis, quis pharetra neque porta. Morbi facilisis ligula vitae ligula dignissim, at sollicitudin nibh ultrices. Proin at facilisis magna. Sed fermentum varius pulvinar. Fusce iaculis nibh eu mi rutrum egestas in vel felis. Suspendisse pulvinar ante vel ante ullamcorper maximus.
\r\n
Vivamus urna est, convallis nec aliquam et, dictum a erat. Praesent nunc est, viverra sit amet urna ac, eleifend tincidunt ligula. Praesent porta luctus tellus vel gravida. Ut leo lorem, finibus et rhoncus in, ornare at sapien. Aenean mi nibh, accumsan maximus volutpat sit amet, tincidunt in erat. Morbi eros tellus, ullamcorper vitae odio sed, egestas placerat nunc. Morbi ac lacinia felis. Integer posuere facilisis turpis at sollicitudin. Donec odio tellus, posuere eget neque et, imperdiet lobortis ligula. Aliquam quis dolor rhoncus, iaculis lacus tempus, pellentesque turpis. Cras lobortis leo sit amet magna ullamcorper semper. Proin gravida neque id metus commodo congue. Praesent condimentum, quam imperdiet pulvinar convallis, ex tellus tincidunt sapien, quis vulputate ex nulla quis eros.
\r\n
Donec ornare lectus sit amet ipsum scelerisque, eu varius nisi tincidunt. Pellentesque vestibulum justo eget risus commodo, sed vehicula magna consequat. Etiam mollis risus sit amet magna pellentesque hendrerit. Donec ut lorem tincidunt, semper massa in, pretium mauris. Quisque in tincidunt est, et finibus dolor. Aenean ac dolor eu mi laoreet suscipit vitae sed ipsum. Curabitur placerat varius lorem ac rutrum. Fusce in nibh et magna luctus vulputate. Pellentesque sit amet dictum magna, vitae molestie nunc. Morbi iaculis sapien mollis nulla blandit convallis. In a elementum elit. Sed vel dolor condimentum lectus lacinia accumsan quis vitae diam.
\r\n
Duis lectus libero, tempor quis neque ut, feugiat lacinia ex. Nunc sed tortor eget lacus bibendum congue. Sed eget mi sit amet elit volutpat tempus et quis nunc. Mauris id aliquam nulla. Phasellus cursus scelerisque mi. Nulla a suscipit quam. Sed eleifend odio non tellus tincidunt iaculis. Mauris nec tortor justo. Fusce pretium, velit at ultricies mattis, justo elit ultricies nibh, a elementum metus nibh rhoncus lorem. Pellentesque vitae nunc vel ante facilisis aliquet tincidunt et dolor. Etiam ante augue, laoreet ac elit vitae, tristique vestibulum ipsum. Vivamus faucibus mauris non nunc convallis, interdum interdum enim sodales. Cras ipsum neque, dignissim eu vestibulum et, tincidunt non odio. Morbi non ornare odio. Duis dignissim, sem at vehicula porttitor, libero lorem finibus turpis, nec pharetra neque augue ut eros.
\r\n
\r\n \r\n \r\n (function() {\r\n angular.module('dataExample', ['components.sticky'])\r\n .controller('exampleController', exampleController);\r\n\r\n exampleController.$inject = ['$scope'];\r\n function exampleController($scope) {\r\n }\r\n })();\r\n \r\n \r\n #content {\r\n height: 600px;\r\n overflow: auto;\r\n }\r\n \r\n \r\n */\r\n(function () {\r\n angular.module('components.sticky', [])\r\n .component('sticky', {\r\n bindings: {\r\n scrollTarget: '@',\r\n restrict: '@?',\r\n prioritize: '',\r\n onInit: '&?',\r\n onStick: '&?',\r\n onRelease: '&?'\r\n },\r\n require: {\r\n stickyManager: '?^^stickyManager',\r\n stickyContainer: '?^^stickyContainer'\r\n },\r\n template: '',\r\n transclude: true,\r\n controller: stickyController\r\n });\r\n\r\n stickyController.$inject = ['$element', '$window', '$scope', '$timeout'];\r\n var id = 0;\r\n function stickyController($element, $window, $scope, $timeout) {\r\n var ctrl = this;\r\n ctrl.$id = id++;\r\n ctrl.$onInit = function () {\r\n ctrl.sticking = false;\r\n ctrl.stickyManager.registerSticky(ctrl.$id, $element, ctrl);\r\n };\r\n ctrl.$postLink = function () {\r\n ctrl._stylesReady = new Promise(ctrl._stylesReadyCheck);\r\n ctrl._stylesReady.then(function () {\r\n ctrl.$sticker = $element.find('>.sticker');\r\n ctrl.$content = ctrl.$sticker.find('> .content');\r\n ctrl.$spacer = $element.find('>.spacer');\r\n ctrl.$spacer.height(ctrl.$content.outerHeight());\r\n ctrl.$scrollTarget = ctrl.scrollTarget ? angular.element(ctrl.scrollTarget) : angular.element($window);\r\n ctrl.$scrollTarget.on('scroll.sticky', ctrl.$$asyncUpdateSticky);\r\n ctrl.$window = angular.element($window).on('resize.sticky', function () {\r\n ctrl.$$updateSticky(true);\r\n });\r\n $timeout(function () {\r\n ctrl.$$updateSticky();\r\n if (ctrl.onInit) {\r\n ctrl.onInit({\r\n sticking: ctrl.sticking,\r\n element: $element\r\n });\r\n }\r\n });\r\n });\r\n };\r\n\r\n ctrl._stylesReadyCheck = function (resolve, reject) {\r\n if ($element.css('display') !== 'inline') {\r\n resolve();\r\n }\r\n else {\r\n $timeout(function () {\r\n ctrl._stylesReadyCheck(resolve, reject);\r\n }, 100);\r\n }\r\n };\r\n\r\n ctrl.$$asyncUpdateSticky = function () {\r\n $scope.$evalAsync(ctrl.$$updateSticky);\r\n };\r\n\r\n ctrl.$$updateSticky = function (forceUpdate) {\r\n ctrl.released = ctrl.$$isReleased();\r\n if (!ctrl.released) {\r\n var newSticky = ctrl.$$isSticky();\r\n if (newSticky !== ctrl.sticking || forceUpdate) {\r\n ctrl.sticking = newSticky;\r\n ctrl.$$updateStyling();\r\n }\r\n }\r\n ctrl.$content.css({\r\n maxHeight: ctrl.sticking ? 'calc(100vh - ' + ((ctrl.scrollTarget ? ctrl.$scrollTarget.offset().top : 0) + (ctrl.stickyManager ? ctrl.stickyManager.getStickPoint(ctrl.$id) : 0)) + 'px)' : ''\r\n });\r\n };\r\n\r\n ctrl.$$isSticky = function () {\r\n if (ctrl.restrict && !Foundation.MediaQuery.atLeast(ctrl.restrict)) {\r\n return false;\r\n }\r\n var offset = $element[0].getBoundingClientRect().top + parseInt($element.css('padding-top')) + parseInt($element.css('margin-top'));\r\n var topOffset = (ctrl.scrollTarget ? ctrl.$scrollTarget.offset().top : 0) + (ctrl.stickyManager ? ctrl.stickyManager.getStickPoint(ctrl.$id) : 0);\r\n return offset <= topOffset;\r\n };\r\n\r\n ctrl.$$isReleased = function () {\r\n if (!ctrl.stickyContainer || (ctrl.restrict && !Foundation.MediaQuery.atLeast(ctrl.restrict))) {\r\n return false;\r\n }\r\n return ctrl.$content.outerHeight() >= ctrl.stickyContainer.getBottom() - (ctrl.stickyManager ? ctrl.stickyManager.getStickPoint(ctrl.$id) : 0);\r\n };\r\n\r\n ctrl.$$updateStyling = function () {\r\n var elementOffset = $element[0].getBoundingClientRect();\r\n ctrl.$sticker.css({\r\n left: ctrl.sticking ? elementOffset.left : '',\r\n width: ctrl.sticking ? elementOffset.width : '',\r\n top: ctrl.sticking ? (ctrl.scrollTarget ? ctrl.$scrollTarget.offset().top : 0) + (ctrl.stickyManager ? ctrl.stickyManager.getStickPoint(ctrl.$id) : 0) : ''\r\n });\r\n var height = ctrl.$content.outerHeight();\r\n ctrl.$spacer.height(height);\r\n };\r\n\r\n ctrl.$onDestroy = function () {\r\n ctrl.$scrollTarget.off('scroll.sticky');\r\n ctrl.$window.off('resize.sticky');\r\n };\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .directive('stickyContainer', stickyContainer);\r\n \r\n function stickyContainer() {\r\n var directive = {\r\n restrict: 'A',\r\n require: {\r\n stickyManager: '?^^stickyManager'\r\n },\r\n bindToController: true,\r\n controller: controller,\r\n controllerAs: 'sc'\r\n };\r\n function controller($element, $timeout) {\r\n var ctrl = this;\r\n ctrl.getBottom = function () {\r\n return $element[0].getBoundingClientRect().bottom;\r\n };\r\n\r\n ctrl.scrollToTop = function () {\r\n $timeout(function () {\r\n var offset = $element[0].getBoundingClientRect().top;\r\n if (offset < 0) {\r\n angular.element('html, body').animate({\r\n scrollTop: '-=' + -(offset - (ctrl.stickyManager ? ctrl.stickyManager.getStickPoint(1) : 0))\r\n });\r\n }\r\n });\r\n };\r\n }\r\n controller.$inject = ['$element', '$timeout'];\r\n return directive;\r\n }\r\n})();","(function () {\r\n angular.module('app')\r\n .directive('stickyManager', stickyManager);\r\n\r\n stickyManager.$inject = [];\r\n function stickyManager() {\r\n var directive = {\r\n restrict: 'A',\r\n controller: controller\r\n };\r\n return directive;\r\n function controller() {\r\n var ctrl = this;\r\n ctrl.$onInit = function () {\r\n ctrl.stickies = [];\r\n };\r\n\r\n ctrl.stickPoint = 0;\r\n ctrl.getStickPoint = function (id) {\r\n var offset = 0;\r\n for (var i = 0; i < ctrl.stickies.length; i++) {\r\n var target = ctrl.stickies[i];\r\n if (target.id === id) {\r\n return offset;\r\n }\r\n else if (!target.controller.released && target.controller.sticking) {\r\n offset += target.element.height();\r\n }\r\n }\r\n return offset;\r\n };\r\n\r\n ctrl.registerSticky = function (id, element, controller) {\r\n var registration = {\r\n id: id,\r\n element: element,\r\n controller: controller\r\n };\r\n if (controller.prioritize) {\r\n ctrl.stickies.unshift(registration);\r\n }\r\n else {\r\n ctrl.stickies.push(registration);\r\n }\r\n };\r\n }\r\n }\r\n})();","\r\n(function () {\r\n angular.module('pages.home', [\r\n //'ngCookies'\r\n ])\r\n .controller('homeController', homeController);\r\n\r\n /**\r\n * @ngdoc controller\r\n * @name pages.homeController\r\n * @requires components.pagination\r\n * @description\r\n * Controller used for the blog and blog detail templates.\r\n */\r\n homeController.$inject = ['$scope', '$window'];//, '$cookies'];\r\n function homeController($scope, $window) {//, $cookies) {\r\n var ctrl = this;\r\n var banner = angular.element('.banner');\r\n\r\n var videoBackground = banner.find('.video-background');\r\n if (videoBackground.length) {\r\n videoBackground.YTPlayer({\r\n fitToBackground: true,\r\n videoId: videoBackground.attr('video-id')\r\n })\r\n }\r\n\r\n ctrl.$onInit = function () {\r\n ctrl.$win = angular.element($window).on('resize.home', ctrl.sizeBanner); \r\n }\r\n\r\n ctrl.$onDestroy = function () {\r\n ctrl.$win.off('resize.home');\r\n }\r\n var panels = angular.element('[data-tabs-content=\"home-sections\"] > div');\r\n if (panels.filter('.is-active').length > 1) {\r\n angular.element(panels[0]).removeClass('is-active');\r\n }\r\n else {\r\n var tabControls = angular.element('#home-sections').on('change.zf.tabs', function () {\r\n angular.element(panels[0]).removeClass('is-active');\r\n tabControls.off('change.zf.tabs');\r\n });\r\n }\r\n\r\n var alert = angular.element('.reveal.is-alert');\r\n if (alert.length) {\r\n //var alertTime = parseInt(alert.attr('last-update'));\r\n //var alertViewed = $cookies.get('alert-viewed');\r\n //if (!alertViewed || alertViewed < alertTime) {\r\n alert.foundation('open');\r\n //$cookies.put('alert-viewed', alertTime);\r\n //}\r\n }\r\n }\r\n})();","(function () {\r\n angular.module('pages.master', [\r\n 'app',\r\n 'components.anchor',\r\n 'components.sticky',\r\n 'components.carousel', \r\n 'components.loader',\r\n 'components.pagination',\r\n 'components.query',\r\n 'components.pageModals',\r\n 'pages.home',\r\n 'pages.scrolledContent',\r\n 'pages.tabbedContent',\r\n 'utility',\r\n 'softwareResource',\r\n 'printerResource',\r\n 'searchResource',\r\n 'geoCountryResource',\r\n 'ngResource',\r\n 'feedResource',\r\n 'relatedContentResource'\r\n ])\r\n .config(config)\r\n .run(run)\r\n .controller('modalSetController', modalSetController);\r\n \r\n run.$inject = ['$rootScope', '$window', '$timeout','$anchorScroll', '$location', '$compile', '$q'];\r\n function run($rootScope, $window, $timeout, $anchorScroll, $location, $compile, $q) {\r\n $rootScope.ready = true;\r\n var navReadyPromise = $q.defer();\r\n $rootScope.navReady = navReadyPromise.promise;\r\n $anchorScroll.yOffset = 100;\r\n \r\n $rootScope.toggleSearch = function () {\r\n $rootScope.searchOpen = !$rootScope.searchOpen;\r\n };\r\n var body = angular.element('body');\r\n body.css('border-right-width', $window.outerWidth - angular.element('body').width());\r\n var header, mobileNavigation, mainLinks, secondaryLinks, bar, buttonsL1, back, cont, layer2, innerLayers;\r\n $rootScope.toggleDropdown = function (expander) {\r\n header = header || angular.element('.header');\r\n mobileNavigation = header.find('.mobile-navigation');\r\n back = mobileNavigation.find('.back');\r\n cont = mobileNavigation.find('.continue');\r\n layer2 = mobileNavigation.find('.layer-2');\r\n mainLinks = mobileNavigation.find('.main-links .arrow-link');\r\n secondaryLinks = mobileNavigation.find('.secondary-links .arrow-link');\r\n bar = mobileNavigation.find('.bar div');\r\n buttonsL1 = mobileNavigation.find('.layer-1 .mdl-button');\r\n innerLayers = mobileNavigation.find('.inner-layer');\r\n if (expander.open) {\r\n new TimelineLite()\r\n .set(mobileNavigation, { height: 'calc(100vh - ' + header.height() + 'px)' })\r\n .fromTo(mobileNavigation, .5, { x: '-100%' }, { x: '0%' })\r\n .addLabel('navOpen')\r\n .staggerFromTo(mainLinks, .3, { x: '-=100', opacity: 0 }, { x: 0, opacity: 1 }, .1, 'navOpen-=.2')\r\n .fromTo(bar, .3, { width: 0 }, { width: 316 })\r\n .staggerFromTo(secondaryLinks, .3, { x: '-=100', opacity: 0 }, { x: 0, opacity: 1 }, .1)\r\n .staggerFromTo(buttonsL1, .4, { y: '+=50', opacity: 0 }, { y: 0, opacity: 1 }, .1);\r\n }\r\n else {\r\n new TimelineLite()\r\n .fromTo(mobileNavigation, .3, { x: '0%' }, { x: '-100%' })\r\n .set(mobileNavigation, { clearProps: 'all' })\r\n .set(back, { clearProps: 'all' })\r\n .set(cont, { clearProps: 'all' })\r\n .set(layer2, { clearProps: 'all' })\r\n .set(mainLinks, { clearProps: 'all' })\r\n .set(secondaryLinks, { clearProps: 'all' })\r\n .set(bar, { clearProps: 'all' })\r\n .set(buttonsL1, { clearProps: 'all' });\r\n }\r\n };\r\n var childReveal;\r\n $rootScope.showChildren = function ($event, url, index) {\r\n $rootScope.targetUrl = url;\r\n var aboveLinks = angular.element(mainLinks.filter(function (i) {\r\n return i < index;\r\n }).get().reverse());\r\n var target = angular.element(mainLinks[index]);\r\n var belowLinks = mainLinks.filter(function (i) {\r\n return i > index;\r\n });\r\n cont.html(target.html());\r\n var targetOffset = target[0].getBoundingClientRect();\r\n var contOffset = cont[0].getBoundingClientRect();\r\n var curLayer = angular.element(innerLayers[index]);\r\n childReveal = new TimelineLite({paused: true, onReverseComplete:$rootScope.reverseComplete})\r\n .set(cont, { position: 'absolute', top: 16, right: 16, autoAlpha: 1, y: targetOffset.top - contOffset.top + 1, width: targetOffset.width })\r\n .set(target, { autoAlpha: 0 })\r\n .addLabel('panelTransition')\r\n .staggerTo(aboveLinks, .3, { x: '-=100', autoAlpha: 0 }, .1)\r\n .staggerTo(belowLinks, .3, { x: '-=100', autoAlpha: 0 }, .1, 'panelTransition')\r\n .to(cont, .4, { y: 0, width: contOffset.width }, 'panelTransition')\r\n .to(bar, .3, { delay: -.3, width: 0, x: -316 })\r\n .staggerTo(secondaryLinks, .3, { x: '-=100', autoAlpha: 0 }, .1)\r\n .staggerTo(buttonsL1, .4, { y: '-=50', autoAlpha: 0 }, .1)\r\n .fromTo(back, .3, { rotationX: 90 }, { autoAlpha: 1, rotationX: 0 })\r\n .set(curLayer, { autoAlpha: 1, zIndex: 1 })\r\n .set(layer2, { x: '-100%' }, 'panelTransition');\r\n\r\n var ctaLinks = curLayer.find('.cta-links a');\r\n if (ctaLinks.length) {\r\n childReveal.staggerFromTo(ctaLinks, .3, { autoAlpha: 0, x: '-=70', y: '-=80' }, { autoAlpha: 1, x: 0, y: 0 }, .05);\r\n }\r\n var barredLinks = curLayer.find('.barred-links li');\r\n if (barredLinks.length) {\r\n var animateLeft = true;\r\n for (var i = 0; i < barredLinks.length; i++) {\r\n var link = angular.element(barredLinks[i]);\r\n var bars = link.find('div');\r\n childReveal\r\n .addLabel(`barsReveal${i}`)\r\n .set(bars[0], { justifyContent: animateLeft ? 'flex-end' : 'flex-start' })\r\n .to(angular.element(bars[0]).find('span'), .3, { width: '100%' })\r\n .fromTo(link.find('a'), .3, { autoAlpha: 0, scale: .5 }, { autoAlpha: 1, scale: 1 });\r\n animateLeft = !animateLeft;\r\n if (bars.length > 1) {\r\n childReveal\r\n .set(bars[1], { justifyContent: animateLeft ? 'flex-end' : 'flex-start' })\r\n .to(angular.element(bars[1]).find('span'), .3, { width: '100%' }, `barsReveal${i}`);\r\n animateLeft = !animateLeft;\r\n }\r\n }\r\n }\r\n var subLinks = curLayer.find('.sub-links > li');\r\n animateLeft = true;\r\n for (i = 0; i < subLinks.length; i++) {\r\n link = angular.element(subLinks[i]);\r\n var innerBar = link.find('.inner-bar');\r\n if (innerBar.length) {\r\n childReveal\r\n .set(innerBar, { justifyContent: animateLeft ? 'flex-end' : 'flex-start' })\r\n .fromTo(innerBar.find('span'), .3, { width: 0 }, { width: '100%' });\r\n animateLeft = !animateLeft;\r\n }\r\n childReveal\r\n .staggerFromTo(link.find('a'), .3, { y: '+=100', autoAlpha: 0 }, { y: 0, autoAlpha: 1 }, .1);\r\n }\r\n\r\n var additionalLinks = curLayer.find('.additional-links a');\r\n if (additionalLinks.length) {\r\n for (i = 0; i < additionalLinks.length; i++) {\r\n link = angular.element(additionalLinks[i]);\r\n var even = i % 2 === 0;\r\n childReveal\r\n .fromTo(link, .3, { x: even ? '-=100' : '+=100', delay: even ? 0 : -.3, autoAlpha: 0 }, { x: 0, autoAlpha: 1 });\r\n }\r\n }\r\n childReveal.play();\r\n };\r\n var scroller = angular.element('html,body');\r\n var accordions = angular.element('.accordion').on('down.zf.accordion', function (event) {\r\n header = header || angular.element('.header');\r\n event.stopPropagation();\r\n var target = angular.element(event.currentTarget).find('> .is-active');\r\n var shift = target[0].getBoundingClientRect().top - (header ? header.height() : 0);\r\n if (shift < 0) {\r\n scroller.animate({\r\n scrollTop: '+=' + shift\r\n }, 250);\r\n }\r\n });\r\n\r\n $rootScope.back = function () {\r\n childReveal.stop().reverse();\r\n };\r\n\r\n $rootScope.reverseComplete = function () {\r\n var cleanup = new TimelineLite()\r\n .set(back, { clearProps: 'all' })\r\n .set(cont, { clearProps: 'all' })\r\n .set(layer2, { clearProps: 'all' })\r\n .set(mainLinks, { clearProps: 'all' })\r\n .set(secondaryLinks, { clearProps: 'all' })\r\n .set(bar, { clearProps: 'all' })\r\n .set(buttonsL1, { clearProps: 'all' })\r\n .set(mainLinks, { x: 0, opacity: 1 })\r\n .set(secondaryLinks, { x: 0, opacity: 1 })\r\n .set(bar, { width: 316 })\r\n .set(buttonsL1, { y: 0, opacity: 1 });\r\n for (var i = 0; i < innerLayers.length; i++) {\r\n var curLayer = angular.element(innerLayers[i]);\r\n cleanup.set(curLayer, { autoAlpha: 0, zIndex: 0 });\r\n } \r\n };\r\n\r\n $rootScope.switchLanguage = function (url, expander) {\r\n if (url) {\r\n //removed for language subdirectories\r\n //if (location.origin + '/' === url) {\r\n // if (expander) {\r\n // expander.toggle();\r\n // }\r\n //}\r\n //else {\r\n location = url;\r\n //}\r\n }\r\n };\r\n\r\n $timeout(function () {\r\n var datepickers = $('.datepickerfield');\r\n if (datepickers.datepicker) {\r\n datepickers.datepicker({\r\n dateFormat: 'mm/dd/y',\r\n onClose: function (date, instance) {\r\n instance.input.valid();\r\n }\r\n });\r\n }\r\n\r\n $anchorScroll();\r\n });\r\n\r\n //Forces components that bind to \"params\" to update when it's modified.\r\n $rootScope.params = {};\r\n $rootScope.$watch('params', function (newVal) {\r\n if (newVal) {\r\n $rootScope.params = angular.copy($rootScope.params);\r\n }\r\n }, true);\r\n var searchExpander;\r\n\r\n $rootScope.searchData = {};\r\n\r\n $rootScope.registerSearchExpander = function (expander) {\r\n searchExpander = expander;\r\n };\r\n\r\n $rootScope.search = function ($event) {\r\n console.log(searchExpander);\r\n if (searchExpander && !searchExpander.open) {\r\n var input = angular.element($event.target).find('input');\r\n input.focus();\r\n if (!input.val()) {\r\n $event.preventDefault();\r\n }\r\n }\r\n else {\r\n $event.preventDefault();\r\n }\r\n };\r\n var expanderFix, gridContainer;\r\n var expanded = false;\r\n var expandTimeout;\r\n $rootScope.expanderFix = function () {\r\n header = header || angular.element('.header');\r\n $timeout.cancel(expandTimeout);\r\n if (!expanderFix) {\r\n expanderFix = header.find('.expander-fix');\r\n gridContainer = header.find('.grid-container');\r\n }\r\n expanded = !expanded;\r\n if (expanded) {\r\n expanderFix.width((header.width() - gridContainer.width()) / 2);\r\n }\r\n else {\r\n expandTimeout = $timeout(function () {\r\n expanderFix.width(0);\r\n }, 400);\r\n }\r\n };\r\n\r\n $rootScope.reinitializeTabs = function (element) {\r\n tabs = element.find('.tabs');\r\n new Foundation.Tabs(tabs);\r\n };\r\n\r\n $rootScope.openChat = function () {\r\n var target = angular.element('.zopim[data-test-id=\"ChatWidgetButton\"] iframe');\r\n if (target.length) {\r\n target.contents().find('.meshim_widget_components_ChatButton').click();\r\n }\r\n };\r\n var signupParams = \"GetFreeEditionPKC=true&screen=signUp&signupemail=\";\r\n var signupParamsFreeTrial = \"GetFreeEditionPKC=false&screen=signUp&signupemail=\";\r\n var params = $location.search();\r\n var trackData = params['TrackData'] || params['trackData'] || params['trackdata'];\r\n if (trackData) {\r\n trackData = encodeURIComponent(trackData);\r\n }\r\n $rootScope.requestFreeTrial = function ($event, email, url) {\r\n $event.preventDefault();\r\n if (!url) {\r\n url = \"https://portal.seagullscientific.com/\";\r\n }\r\n var target = url + \"?\" + signupParamsFreeTrial; //ASH 3/20/20: removed '+ email'\r\n if (trackData) {\r\n target += '&TrackData=' + trackData;\r\n }\r\n location = target;\r\n };\r\n\r\n $rootScope.addEmail = function($event, email) {\r\n $event.preventDefault();\r\n var target = angular.element($event.target).attr('href');\r\n target += (target.indexOf(\"?\") > -1 ? \"&\" : \"?\") + signupParams + email;\r\n if (trackData) {\r\n target += '&TrackData=' + trackData;\r\n }\r\n location = target;\r\n };\r\n\r\n $rootScope.prepReveal = function () {\r\n console.log('Header Ready: ' + (new Date().getTime() - $window.startTime));\r\n $window.navReady = true;\r\n //dynamically loads header dropdown elements\r\n function loadHeaderElements() {\r\n\r\n if (!Foundation.MediaQuery.atLeast('xlarge')) {\r\n var mobileNav = angular.element('.mobile-navigation').html($window.header.mobileNav);\r\n $compile(mobileNav.contents())($rootScope);\r\n win.off('changed.zf.mediaquery.header');\r\n }\r\n }\r\n var win = angular.element($window).on('changed.zf.mediaquery.header', loadHeaderElements);\r\n $timeout(function () {\r\n loadHeaderElements();\r\n navReadyPromise.resolve();\r\n });\r\n\r\n };\r\n\r\n $rootScope.gridStickyReady = function (element) {\r\n element.foundation();\r\n };\r\n }\r\n\r\n config.$inject = ['$locationProvider'];\r\n function config($locationProvider) {\r\n $locationProvider.html5Mode({\r\n enabled: true,\r\n requireBase: false,\r\n rewriteLinks: false\r\n });\r\n }\r\n\r\n function modalSetController() {\r\n\r\n }\r\n})();\r\n\r\n","(function () {\r\n angular.module('pages.scrolledContent', [])\r\n .controller('scrolledContentController', scrolledContentController);\r\n\r\n /**\r\n * @ngdoc controller\r\n * @name pages.scrolledContentController\r\n * @description\r\n * Controller used for scrolled content doc type.\r\n */\r\n scrolledContentController.$inject = ['$scope', '$location', '$window'];\r\n function scrolledContentController($scope, $location, $window) {\r\n $scope.checkHash = function (anchor) {\r\n fromUpdate = false;\r\n if (anchor.target === $location.hash()) {\r\n anchor.$$scrollToTarget(true);\r\n }\r\n }\r\n var fromUpdate = false;\r\n $scope.updateHash = function (anchor) {\r\n fromUpdate = true;\r\n if (anchor) {\r\n $location.hash(anchor.target).replace();\r\n }\r\n else {\r\n if (window.history) {\r\n history.replaceState('', document.title, $window.location.pathname);\r\n }\r\n }\r\n }\r\n\r\n var scrollLinks = angular.element('a[href*=\"' + $location.path() + '#\"]').on('click.scrolledContent', function ($event) {\r\n var target = angular.element($event.currentTarget).attr('href').split('#')[1];\r\n angular.element('anchor[target=\"' + target + '\"]').click();\r\n });\r\n }\r\n})();","(function () {\r\n angular.module('pages.tabbedContent', [])\r\n .controller('tabbedContentController', tabbedContentController);\r\n\r\n /**\r\n * @ngdoc controller\r\n * @name pages.scrolledContentController\r\n * @description\r\n * Controller used for scrolled content doc type.\r\n */\r\n tabbedContentController.$inject = ['$scope', '$location'];\r\n function tabbedContentController($scope, $location) {\r\n var tabs;\r\n $scope.reinitializeTabs = function () {\r\n tabs = angular.element('#section-tabs');\r\n new Foundation.Tabs(tabs);\r\n }\r\n\r\n var tabContent = angular.element('[data-tabs-content=\"section-tabs\"]');\r\n var header = angular.element('.header');\r\n\r\n $scope.backToTop = function ($event) {\r\n var shift = tabContent.offset().top - header.height() - tabs.height();\r\n if (shift < 0) {\r\n angular.element('#content').animate({\r\n scrollTop: '+=' + shift\r\n }, 300);\r\n }\r\n }\r\n }\r\n})();","/*\r\n * Jack Witt @ Bonsai Media Co\r\n * 1/17/19\r\n * A js file to handle transitions between pages while loading\r\n */\r\n\r\n$(function () { \r\n //Whenever a new page is loaded, show animation and store link \r\n var wrapper = $(\".page-transition-wrapper\");\r\n var upper = $(\".animate-down\");\r\n var lower = $(\".animate-up\");\r\n var icon = $(\".center-animated-icon\");\r\n \r\n //full transition animation timeline\r\n var lockAnimation = false;\r\n window.revealPromise\r\n .then(function () {\r\n var downloads = $('[driver-path]');\r\n if (downloads.length) {\r\n lockAnimation = true;\r\n for (var i = 0; i < downloads.length; i++) {\r\n var download = $(downloads[i]).attr('driver-path').trim();\r\n setTimeout(function () {\r\n window.location.assign(download);\r\n }.bind({ download: download }), 100);\r\n }\r\n }\r\n });\r\n //var wrapperAnimation = new TimelineLite({\r\n // paused: true,\r\n // onComplete: function () { \r\n // //bannerSVG(); //callback to banner svg anim\r\n // var downloads = $('[driver-path]');\r\n // if (downloads.length) {\r\n // lockAnimation = true;\r\n // for (var i = 0; i < downloads.length; i++) {\r\n // var download = $(downloads[i]).attr('driver-path').trim();\r\n // setTimeout(function () {\r\n // window.location.assign(download);\r\n // }.bind({ download: download }), 100);\r\n // }\r\n // }\r\n \r\n // }\r\n //});\r\n var rotatingText = $('.banner .rotating-text');\r\n window.fontReady(\"Open Sans\")\r\n .then(function () {\r\n for (i = 0; i < rotatingText.length; i++) {\r\n var rotator = $(rotatingText[i]);\r\n var containerTagName = rotator.closest('h1,h2,h3,h4,h5,h6,li,p').prop('tagName');\r\n var banner = rotator.closest('.banner');\r\n var containerTest = $('<' + containerTagName + '>g' + containerTagName + '>');\r\n containerTest.css('display', 'inline-block');\r\n var text = rotator.find('.r-text');\r\n banner.find('.rte').append(containerTest);\r\n var height = containerTest.height();\r\n var fontSize = parseInt(containerTest.css('fontSize'));\r\n //rotatingText.css('top', (height - fontSize) / 2);\r\n text.attr('y', height - 15);\r\n rotator.attr('viewport', '0 0 10 ' + height);\r\n rotator.height(height);\r\n text.css('fill', containerTest.css('color'));\r\n var masks = rotator.find('mask rect');\r\n var scanner = rotator.find('.scanner');\r\n var mask = $(masks[0]);\r\n var maxWidth = 0;\r\n for (var j = 0; j < text.length; j++) {\r\n var t = $(text[j]);\r\n containerTest.text(t.text());\r\n var tWidth = containerTest.width();\r\n maxWidth = Math.max(tWidth, maxWidth);\r\n }\r\n var tl = new TimelineMax({\r\n repeat: -1,\r\n repeatDelay: 1.5\r\n })\r\n .set(rotator, { width: maxWidth });\r\n for (j = 0; j < text.length; j++) {\r\n mask = $(masks[j]);\r\n var tNext = $(text[j + 1 === masks.length ? 0 : j + 1]);\r\n var next = $(masks[j + 1 === masks.length ? 0 : j + 1]);\r\n containerTest.text(tNext.text());\r\n var label = 'animation-' + j;\r\n tl\r\n .addLabel(label, j === 0 ? '+=0' : '+=1.5')\r\n .fromTo(scanner, .7, { x: 0 }, { x: maxWidth + 6 }, label)\r\n .fromTo(mask, .7, { attr: { x: 0 } }, { attr: { x: maxWidth } }, label)\r\n .fromTo(next, .7, { attr: { x: -10000 } }, { attr: { x: maxWidth - 10000 } }, label)\r\n .set(mask, { attr: { x: -10000 } });\r\n }\r\n tl.progress(1);\r\n\r\n containerTest.remove();\r\n }\r\n });\r\n window.onbeforeunload = function () {\r\n if (!lockAnimation && window.wrapperAnimation) {\r\n window.wrapperAnimation.reverse();\r\n }\r\n lockAnimation = false;\r\n };\r\n}); ","$(function () {\r\n console.log('Bootstrap: ' + + (new Date().getTime() - window.startTime));\r\n angular.bootstrap(document, ['pages.master']);\r\n});"]}