{"version":3,"sources":["jsdelivr-header.js","/npm/angular-auto-complete@1.7.4/angular-auto-complete.js"],"names":[],"mappings":"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","file":"/npm/angular-auto-complete@1.7.4/angular-auto-complete.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/angular-auto-complete@1.7.4/angular-auto-complete.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(function (global, factory) {\r\n    'use strict';\r\n\r\n    if (typeof exports === 'object' && typeof module !== 'undefined') {\r\n        // commonJS\r\n        module.exports = factory(require('angular'));\r\n    }\r\n    else if (typeof define === 'function' && define.amd) {\r\n        // AMD\r\n        define(['module', 'angular'], function (module, angular) {\r\n            module.exports = factory(angular);\r\n        });\r\n    }\r\n    else {\r\n        factory(global.angular);\r\n    }\r\n}(this, function (angular) {\r\n    var helperService = new HelperService();\r\n\r\n    angular\r\n        .module('autoCompleteModule', ['ngSanitize'])\r\n        .directive('autoComplete', autoCompleteDirective)\r\n        .directive('autoCompleteItem', autoCompleteItemDirective)\r\n        .directive('autoCompleteNoMatch', autoCompleteNoMatchDirective);\r\n\r\n    autoCompleteDirective.$inject = ['$q', '$compile', '$document', '$window', '$timeout'];\r\n    function autoCompleteDirective($q, $compile, $document, $window, $timeout) {\r\n\r\n        return {\r\n            restrict: 'A',\r\n            scope: {},\r\n            transclude: false,\r\n            controllerAs: 'ctrl',\r\n            bindToController: {\r\n                initialOptions: '&autoComplete'\r\n            },\r\n            require: ['autoComplete', 'ngModel'],\r\n            link: postLinkFn,\r\n            controller: MainCtrl\r\n        };\r\n\r\n        function postLinkFn(scope, element, attrs, ctrls) {\r\n            var ctrl = ctrls[0]; //directive controller\r\n            ctrl.textModelCtrl = ctrls[1]; // textbox model controller\r\n\r\n            // store the jquery element on the controller\r\n            ctrl.target = element;\r\n\r\n            $timeout(function () {\r\n                // execute the options expression\r\n                $q.when(ctrl.initialOptions()).then(_initialize);\r\n            });\r\n\r\n            function _initialize(options) {\r\n                options = options || {};\r\n\r\n                ctrl.init(angular.extend({}, defaultOptions, options));\r\n\r\n                _initializeContainer();\r\n                _wireupEvents();\r\n            }\r\n\r\n            function _initializeContainer() {\r\n                ctrl.container = _getContainer();\r\n\r\n                if (ctrl.options.containerCssClass) {\r\n                    ctrl.container.addClass(ctrl.options.containerCssClass);\r\n                }\r\n\r\n                // if a jquery parent is specified in options append the container to that\r\n                // otherwise append to body\r\n                if (ctrl.options.dropdownParent) {\r\n                    ctrl.options.dropdownParent.append(ctrl.container);\r\n                }\r\n                else {\r\n                    $document.find('body').append(ctrl.container);\r\n                    ctrl.container.addClass('auto-complete-absolute-container');\r\n                }\r\n\r\n                // keep a reference to the <ul> element\r\n                ctrl.elementUL = angular.element(ctrl.container[0].querySelector('ul.auto-complete-results'));\r\n            }\r\n\r\n            function _getContainer() {\r\n                if (angular.isElement(ctrl.options.dropdownParent)) {\r\n                    return _getCustomContainer();\r\n                }\r\n\r\n                return _getDefaultContainer();\r\n            }\r\n\r\n            function _getCustomContainer() {\r\n                var container = ctrl.options.dropdownParent;\r\n\r\n                container.addClass('auto-complete-container unselectable');\r\n                container.attr('data-instance-id', ctrl.instanceId);\r\n\r\n                var linkFn = $compile(_getDropdownListTemplate());\r\n                var elementUL = linkFn(scope);\r\n                container.append(elementUL);\r\n\r\n                return container;\r\n            }\r\n\r\n            function _getDefaultContainer() {\r\n                var linkFn = $compile(_getContainerTemplate());\r\n                return linkFn(scope);\r\n            }\r\n\r\n            function _getContainerTemplate() {\r\n                var html = '';\r\n                html += '<div class=\"auto-complete-container unselectable\"';\r\n                html += '     data-instance-id=\"{{ ctrl.instanceId }}\"';\r\n                html += '     ng-show=\"ctrl.containerVisible\">';\r\n                html += _getDropdownListTemplate();\r\n                html += '</div>';\r\n\r\n                return html;\r\n            }\r\n\r\n            function _getDropdownListTemplate() {\r\n                var html = '';\r\n                html += '     <ul class=\"auto-complete-results\">';\r\n                html += '         <li ng-if=\"ctrl.renderItems.length\"';\r\n                html += '             ng-repeat=\"renderItem in ctrl.renderItems track by renderItem.id\"';\r\n                html += '             ng-click=\"ctrl.selectItem($index, true)\"';\r\n                html += '             class=\"auto-complete-item\" data-index=\"{{ $index }}\"';\r\n                html += '             ng-class=\"ctrl.getSelectedCssClass($index)\">';\r\n                html += '               <auto-complete-item index=\"$index\"';\r\n                html += '                      item-template-link-fn=\"ctrl.itemTemplateLinkFn\"';\r\n                html += '                      render-item=\"renderItem\"';\r\n                html += '                      search-text=\"ctrl.searchText\" />';\r\n                html += '         </li>';\r\n                html += '         <li ng-if=\"!ctrl.renderItems.length && ctrl.options.noMatchTemplateEnabled\"';\r\n                html += '             class=\"auto-complete-item auto-complete-no-match\">';\r\n                html += '               <auto-complete-no-match';\r\n                html += '                      template=\"ctrl.options.noMatchTemplate\"';\r\n                html += '                      search-text=\"ctrl.searchText\" />';\r\n                html += '         </li>';\r\n                html += '     </ul>';\r\n\r\n                return html;\r\n            }\r\n\r\n            function _wireupEvents() {\r\n\r\n                // when the target(textbox) gets focus activate the corresponding container\r\n                element.on(DOM_EVENT.FOCUS, function () {\r\n                    scope.$evalAsync(function () {\r\n                        ctrl.activate();\r\n                        if (ctrl.options.activateOnFocus) {\r\n                            _waitAndQuery(element.val(), 100);\r\n                        }\r\n                    });\r\n                });\r\n\r\n                element.on(DOM_EVENT.INPUT, function () {\r\n                    scope.$evalAsync(function () {\r\n                        _tryQuery(element.val());\r\n                    });\r\n                });\r\n\r\n                element.on(DOM_EVENT.KEYDOWN, function (event) {\r\n                    var $event = event;\r\n                    scope.$evalAsync(function () {\r\n                        _handleElementKeyDown($event);\r\n                    });\r\n                });\r\n\r\n                ctrl.container.find('ul').on(DOM_EVENT.SCROLL, function () {\r\n                    if (!ctrl.options.pagingEnabled) {\r\n                        return;\r\n                    }\r\n\r\n                    var list = this;\r\n                    scope.$evalAsync(function () {\r\n                        if (!ctrl.containerVisible) {\r\n                            return;\r\n                        }\r\n\r\n                        // scrolled to the bottom?\r\n                        if ((list.offsetHeight + list.scrollTop) >= list.scrollHeight) {\r\n                            ctrl.tryLoadNextPage();\r\n                        }\r\n                    });\r\n                });\r\n\r\n                $document.on(DOM_EVENT.KEYDOWN, function (event) {\r\n                    var $event = event;\r\n                    scope.$evalAsync(function () {\r\n                        _handleDocumentKeyDown($event);\r\n                    });\r\n                });\r\n\r\n                $document.on(DOM_EVENT.CLICK, function (event) {\r\n                    var $event = event;\r\n                    scope.$evalAsync(function () {\r\n                        _handleDocumentClick($event);\r\n                    });\r\n                });\r\n\r\n                // $window is a reference to the browser's window object\r\n                angular.element($window).on(DOM_EVENT.RESIZE, function () {\r\n                    if (ctrl.options.hideDropdownOnWindowResize) {\r\n                        scope.$evalAsync(function () {\r\n                            ctrl.autoHide();\r\n                        });\r\n                    }\r\n                });\r\n            }\r\n\r\n            function _ignoreKeyCode(keyCode) {\r\n                return [\r\n                    KEYCODE.TAB,\r\n                    KEYCODE.ALT,\r\n                    KEYCODE.CTRL,\r\n                    KEYCODE.LEFTARROW,\r\n                    KEYCODE.RIGHTARROW,\r\n                    KEYCODE.MAC_COMMAND_LEFT,\r\n                    KEYCODE.MAC_COMMAND_RIGHT\r\n                ].indexOf(keyCode) !== -1;\r\n            }\r\n\r\n            function _handleElementKeyDown(event) {\r\n                var keyCode = event.charCode || event.keyCode || 0;\r\n\r\n                if (_ignoreKeyCode(keyCode)) {\r\n                    return;\r\n                }\r\n\r\n                switch (keyCode) {\r\n                    case KEYCODE.UPARROW:\r\n                        ctrl.scrollToPreviousItem();\r\n\r\n                        event.stopPropagation();\r\n                        event.preventDefault();\r\n\r\n                        break;\r\n\r\n                    case KEYCODE.DOWNARROW:\r\n                        ctrl.scrollToNextItem();\r\n\r\n                        event.stopPropagation();\r\n                        event.preventDefault();\r\n\r\n                        break;\r\n\r\n                    case KEYCODE.ENTER:\r\n                        ctrl.selectItem(ctrl.selectedIndex, true);\r\n\r\n                        //prevent postback upon hitting enter\r\n                        event.preventDefault();\r\n                        event.stopPropagation();\r\n\r\n                        break;\r\n\r\n                    case KEYCODE.ESCAPE:\r\n                        ctrl.restoreOriginalText();\r\n                        ctrl.autoHide();\r\n\r\n                        event.preventDefault();\r\n                        event.stopPropagation();\r\n\r\n                        break;\r\n\r\n                    default:\r\n                        break;\r\n                }\r\n            }\r\n\r\n            function _handleDocumentKeyDown() {\r\n                // hide inactive dropdowns when multiple auto complete exist on a page\r\n                helperService.hideAllInactive();\r\n            }\r\n\r\n            function _handleDocumentClick(event) {\r\n                // hide inactive dropdowns when multiple auto complete exist on a page\r\n                helperService.hideAllInactive();\r\n\r\n                // ignore inline\r\n                if (ctrl.isInline()) {\r\n                    return;\r\n                }\r\n\r\n                // no container. probably destroyed in scope $destroy\r\n                if (!ctrl.container) {\r\n                    return;\r\n                }\r\n\r\n                // ignore target click\r\n                if (event.target === ctrl.target[0]) {\r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n\r\n                if (_containerContainsTarget(event.target)) {\r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n\r\n                ctrl.autoHide();\r\n            }\r\n\r\n            function _tryQuery(searchText) {\r\n                // query only if minimum number of chars are typed; else hide dropdown\r\n                if ((ctrl.options.minimumChars === 0)\r\n                    || (searchText && searchText.trim().length !== 0 && searchText.length >= ctrl.options.minimumChars)) {\r\n                    _waitAndQuery(searchText);\r\n                    return;\r\n                }\r\n\r\n                ctrl.autoHide();\r\n            }\r\n\r\n            function _waitAndQuery(searchText, delay) {\r\n                // wait few millisecs before calling query(); this to check if the user has stopped typing\r\n                var promise = $timeout(function () {\r\n                    // has searchText unchanged?\r\n                    if (searchText === element.val()) {\r\n                        ctrl.query(searchText);\r\n                    }\r\n\r\n                    //cancel the timeout\r\n                    $timeout.cancel(promise);\r\n\r\n                }, (delay || 300));\r\n            }\r\n\r\n            function _containerContainsTarget(target) {\r\n                // use native Node.contains\r\n                // https://developer.mozilla.org/en-US/docs/Web/API/Node/contains\r\n                var container = ctrl.container[0];\r\n                if (angular.isFunction(container.contains) && container.contains(target)) {\r\n                    return true;\r\n                }\r\n\r\n                // otherwise use .has() if jQuery is available\r\n                if (window.jQuery && angular.isFunction(ctrl.container.has) &&\r\n                    ctrl.container.has(target).length > 0) {\r\n\r\n                    return true;\r\n                }\r\n\r\n                // assume target is not in container\r\n                return false;\r\n            }\r\n\r\n            // cleanup on destroy\r\n            var destroyFn = scope.$on('$destroy', function () {\r\n                if (ctrl.container) {\r\n                    ctrl.container.remove();\r\n                    ctrl.container = null;\r\n                }\r\n\r\n                destroyFn();\r\n            });\r\n        }\r\n    }\r\n\r\n    MainCtrl.$inject = ['$q', '$window', '$document', '$timeout', '$templateRequest', '$compile', '$exceptionHandler'];\r\n    function MainCtrl($q, $window, $document, $timeout, $templateRequest, $compile, $exceptionHandler) {\r\n        var that = this;\r\n        var originalSearchText = null;\r\n        var queryCounter = 0;\r\n        var dataLoadInProgress = false;\r\n        var endOfPagedList = false;\r\n        var currentPageIndex = 0;\r\n\r\n        this.target = null;\r\n        this.instanceId = -1;\r\n        this.selectedIndex = -1;\r\n        this.renderItems = [];\r\n        this.containerVisible = false;\r\n        this.searchText = null;\r\n        this.itemTemplateLinkFn = null;\r\n\r\n        this.isInline = function () {\r\n            // if a dropdown jquery parent is provided it is assumed inline\r\n            return angular.isElement(that.options.dropdownParent);\r\n        };\r\n\r\n        this.init = function (options) {\r\n            that.instanceId = helperService.registerInstance(that);\r\n            that.options = options;\r\n            that.containerVisible = that.isInline();\r\n\r\n            _safeCallback(that.options.ready, publicApi);\r\n        };\r\n\r\n        this.activate = function () {\r\n            helperService.setActiveInstanceId(that.instanceId);\r\n            // do not reset if the container (dropdown list) is currently visible\r\n            // Ex: Switching to a different tab or window and switching back\r\n            // again when the dropdown list is visible.\r\n            if (!that.containerVisible) {\r\n                originalSearchText = that.searchText = null;\r\n            }\r\n        };\r\n\r\n        this.query = function (searchText) {\r\n            that.empty();\r\n            _reset();\r\n\r\n            return _query(searchText, 0);\r\n        };\r\n\r\n        this.show = function () {\r\n            // the show() method is called after the items are ready for display\r\n            // the textbox position can change (ex: window resize) when it has focus\r\n            // so reposition the dropdown before it's shown\r\n            _positionDropdown();\r\n\r\n            // callback\r\n            _safeCallback(that.options.dropdownShown);\r\n        };\r\n\r\n        this.autoHide = function () {\r\n            if (that.options && that.options.autoHideDropdown) {\r\n                _hideDropdown();\r\n            }\r\n        };\r\n\r\n        this.empty = function () {\r\n            that.selectedIndex = -1;\r\n            that.renderItems = [];\r\n        };\r\n\r\n        this.restoreOriginalText = function () {\r\n            if (!originalSearchText) {\r\n                return;\r\n            }\r\n\r\n            _setTargetValue(originalSearchText);\r\n        };\r\n\r\n        this.scrollToPreviousItem = function () {\r\n            var itemIndex = _getItemIndexFromOffset(-1);\r\n            if (itemIndex === -1) {\r\n                return;\r\n            }\r\n\r\n            _scrollToItem(itemIndex);\r\n        };\r\n\r\n        this.scrollToNextItem = function () {\r\n            var itemIndex = _getItemIndexFromOffset(1);\r\n            if (itemIndex === -1) {\r\n                return;\r\n            }\r\n\r\n            _scrollToItem(itemIndex);\r\n\r\n            if (_shouldLoadNextPageAtItemIndex(itemIndex)) {\r\n                _loadNextPage();\r\n            }\r\n        };\r\n\r\n        this.selectItem = function (itemIndex, closeDropdownAndRaiseCallback) {\r\n            var item = that.renderItems[itemIndex];\r\n            if (!item) {\r\n                return;\r\n            }\r\n\r\n            that.selectedIndex = itemIndex;\r\n\r\n            _updateTarget();\r\n\r\n            if (closeDropdownAndRaiseCallback) {\r\n                that.autoHide();\r\n\r\n                _safeCallback(that.options.itemSelected, { item: item.data });\r\n            }\r\n        };\r\n\r\n        this.getSelectedCssClass = function (itemIndex) {\r\n            return (itemIndex === that.selectedIndex) ? that.options.selectedCssClass : '';\r\n        };\r\n\r\n        this.tryLoadNextPage = function () {\r\n            if (_shouldLoadNextPage()) {\r\n                _loadNextPage();\r\n            }\r\n        };\r\n\r\n\r\n        function _loadNextPage() {\r\n            return _query(originalSearchText, (currentPageIndex + 1));\r\n        }\r\n\r\n        function _query(searchText, pageIndex) {\r\n            var params = {\r\n                searchText: searchText,\r\n                paging: {\r\n                    pageIndex: pageIndex,\r\n                    pageSize: that.options.pageSize\r\n                },\r\n                queryId: ++queryCounter\r\n            };\r\n\r\n            var renderListFn = (that.options.pagingEnabled ? _renderPagedList : _renderList);\r\n\r\n            return _queryInternal(params, renderListFn.bind(that, params));\r\n        }\r\n\r\n        function _queryInternal(params, renderListFn) {\r\n            // backup original search term in case we need to restore if user hits ESCAPE\r\n            originalSearchText = params.searchText;\r\n\r\n            dataLoadInProgress = true;\r\n\r\n            _safeCallback(that.options.loading);\r\n\r\n            return $q.when(that.options.data(params.searchText, params.paging),\r\n                function successCallback(result) {\r\n                    // verify that the queryId did not change since the possibility exists that the\r\n                    // search text changed before the 'data' promise was resolved. Say, due to a lag\r\n                    // in getting data from a remote web service.\r\n                    if (_didQueryIdChange(params)) {\r\n                        that.autoHide();\r\n                        return;\r\n                    }\r\n\r\n                    if (_shouldHideDropdown(params, result)) {\r\n                        that.autoHide();\r\n                        return;\r\n                    }\r\n\r\n                    renderListFn(result).then(function () {\r\n                        that.searchText = params.searchText;\r\n                        that.show();\r\n                    });\r\n\r\n                    // callback\r\n                    _safeCallback(that.options.loadingComplete);\r\n                },\r\n                function errorCallback(error) {\r\n                    that.autoHide();\r\n\r\n                    _safeCallback(that.options.loadingComplete, { error: error });\r\n                }).then(function () {\r\n                    dataLoadInProgress = false;\r\n                });\r\n        }\r\n\r\n        function _getItemIndexFromOffset(itemOffset) {\r\n            var itemIndex = that.selectedIndex + itemOffset;\r\n\r\n            if (itemIndex >= that.renderItems.length) {\r\n                return -1;\r\n            }\r\n\r\n            return itemIndex;\r\n        }\r\n\r\n        function _scrollToItem(itemIndex) {\r\n            if (!that.containerVisible) {\r\n                return;\r\n            }\r\n\r\n            that.selectItem(itemIndex);\r\n\r\n            var attrSelector = 'li[data-index=\"' + itemIndex + '\"]';\r\n\r\n            // use jquery.scrollTo plugin if available\r\n            // http://flesler.blogspot.com/2007/10/jqueryscrollto.html\r\n            if (window.jQuery && window.jQuery.scrollTo) {  // requires jquery to be loaded\r\n                that.elementUL.scrollTo(that.elementUL.find(attrSelector));\r\n                return;\r\n            }\r\n\r\n            var li = that.elementUL[0].querySelector(attrSelector);\r\n            if (li) {\r\n                // this was causing the page to jump/scroll\r\n                //    li.scrollIntoView(true);\r\n                that.elementUL[0].scrollTop = li.offsetTop;\r\n            }\r\n        }\r\n\r\n        function _safeCallback(fn, args) {\r\n            if (!angular.isFunction(fn)) {\r\n                return;\r\n            }\r\n\r\n            try {\r\n                return fn.call(that.target, args);\r\n            } catch (ex) {\r\n                //ignore\r\n            }\r\n        }\r\n\r\n        function _positionDropdownIfVisible() {\r\n            if (that.containerVisible) {\r\n                _positionDropdown();\r\n            }\r\n        }\r\n\r\n        function _positionDropdown() {\r\n            // no need to position if container has been appended to\r\n            // parent specified in options\r\n            if (that.isInline()) {\r\n                return;\r\n            }\r\n\r\n            var dropdownWidth = null;\r\n            if (that.options.dropdownWidth && that.options.dropdownWidth !== 'auto') {\r\n                dropdownWidth = that.options.dropdownWidth;\r\n            }\r\n            else {\r\n                // same as textbox width\r\n                dropdownWidth = that.target[0].getBoundingClientRect().width + 'px';\r\n            }\r\n            that.container.css({ 'width': dropdownWidth });\r\n\r\n            if (that.options.dropdownHeight && that.options.dropdownHeight !== 'auto') {\r\n                that.elementUL.css({ 'max-height': that.options.dropdownHeight });\r\n            }\r\n\r\n            // use the .position() function from jquery.ui if available (requires both jquery and jquery-ui)\r\n            var hasJQueryUI = !!(window.jQuery && window.jQuery.ui);\r\n            if (that.options.positionUsingJQuery && hasJQueryUI) {\r\n                _positionUsingJQuery();\r\n            }\r\n            else {\r\n                _positionUsingDomAPI();\r\n            }\r\n        }\r\n\r\n        function _positionUsingJQuery() {\r\n            var defaultPosition = {\r\n                my: 'left top',\r\n                at: 'left bottom',\r\n                of: that.target,\r\n                collision: 'none flip'\r\n            };\r\n\r\n            var position = angular.extend({}, defaultPosition, that.options.positionUsing);\r\n\r\n            // jquery.ui position() requires the container to be visible to calculate its position.\r\n            if (!that.containerVisible) {\r\n                that.container.css({ 'visibility': 'hidden' });\r\n            }\r\n            that.containerVisible = true; // used in the template to set ng-show.\r\n            $timeout(function () {\r\n                that.container.position(position);\r\n                that.container.css({ 'visibility': 'visible' });\r\n            });\r\n        }\r\n\r\n        function _positionUsingDomAPI() {\r\n            var rect = that.target[0].getBoundingClientRect();\r\n            var DOCUMENT = $document[0];\r\n\r\n            var scrollTop = DOCUMENT.body.scrollTop || DOCUMENT.documentElement.scrollTop || $window.pageYOffset;\r\n            var scrollLeft = DOCUMENT.body.scrollLeft || DOCUMENT.documentElement.scrollLeft || $window.pageXOffset;\r\n\r\n            that.container.css({\r\n                'left': rect.left + scrollLeft + 'px',\r\n                'top': rect.top + rect.height + scrollTop + 'px'\r\n            });\r\n\r\n            that.containerVisible = true;\r\n        }\r\n\r\n        function _updateTarget() {\r\n            var item = that.renderItems[that.selectedIndex];\r\n            if (!item) {\r\n                return;\r\n            }\r\n\r\n            _setTargetValue(item.value);\r\n        }\r\n\r\n        function _setTargetValue(value) {\r\n            that.target.val(value);\r\n            that.textModelCtrl.$setViewValue(value);\r\n        }\r\n\r\n        function _hideDropdown() {\r\n            if (that.isInline() || !that.containerVisible) {\r\n                return;\r\n            }\r\n\r\n            // reset scroll position\r\n            //that.elementUL[0].scrollTop = 0;\r\n            that.containerVisible = false;\r\n            that.empty();\r\n\r\n            _reset();\r\n\r\n            // callback\r\n            _safeCallback(that.options.dropdownHidden);\r\n        }\r\n\r\n        function _shouldHideDropdown(params, result) {\r\n            // do not hide the dropdown if the no match template is enabled\r\n            // because the no match template is rendered within the dropdown container\r\n            if (that.options.noMatchTemplateEnabled) {\r\n                return false;\r\n            }\r\n\r\n            // do we have results to render?\r\n            if (!_.isEmpty(result)) {\r\n                return false;\r\n            }\r\n\r\n            // if paging is enabled hide the dropdown only when rendering the first page\r\n            if (that.options.pagingEnabled) {\r\n                return (params.paging.pageIndex === 0);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        function _didQueryIdChange(params) {\r\n            return (params.queryId !== queryCounter);\r\n        }\r\n\r\n        function _renderList(params, result) {\r\n            return _getRenderFn().then(function (renderFn) {\r\n                if (_.isEmpty(result)) {\r\n                    return;\r\n                }\r\n\r\n                that.renderItems = _renderItems(renderFn, result);\r\n            });\r\n        }\r\n\r\n        function _renderPagedList(params, result) {\r\n            return _getRenderFn().then(function (renderFn) {\r\n                if (_.isEmpty(result)) {\r\n                    return;\r\n                }\r\n\r\n                var items = _renderItems(renderFn, result);\r\n\r\n                // in case of paged list we add to the array instead of replacing it\r\n                angular.forEach(items, function (item) {\r\n                    that.renderItems.push(item);\r\n                });\r\n\r\n                currentPageIndex = params.paging.pageIndex;\r\n                endOfPagedList = (items.length < that.options.pageSize);\r\n            });\r\n        }\r\n\r\n        function _renderItems(renderFn, dataItems) {\r\n            // limit number of items rendered in the dropdown\r\n            var dataItemsToRender = _.slice(dataItems, 0, that.options.maxItemsToRender);\r\n\r\n            var itemsToRender = _.map(dataItemsToRender, function (data, index) {\r\n                // invoke render callback with the data as parameter\r\n                // this should return an object with a 'label' and 'value' property where\r\n                // 'label' is the template for display and 'value' is the text for the textbox\r\n                // If the object has an 'id' property, it will be used in the 'track by' clause of ng-repeat in the template\r\n                var item = renderFn(data);\r\n\r\n                if (!item || !item.hasOwnProperty('label') || !item.hasOwnProperty('value')) {\r\n                    return null;\r\n                }\r\n\r\n                // store the data on the renderItem and add to array\r\n                item.data = data;\r\n                // unique 'id' for use in the 'track by' clause\r\n                item.id = item.hasOwnProperty('id') ? item.id : (item.value + item.label + index);\r\n\r\n                return item;\r\n            });\r\n\r\n            return _.filter(itemsToRender, function (item) {\r\n                return (item !== null);\r\n            });\r\n        }\r\n\r\n        function _getRenderFn() {\r\n            // user provided function\r\n            if (angular.isFunction(that.options.renderItem) && that.options.renderItem !== angular.noop) {\r\n                that.itemTemplateLinkFn = null;\r\n                return $q.when(that.options.renderItem.bind(null));\r\n            }\r\n\r\n            return _getItemTemplate().then(function (template) {\r\n                that.itemTemplateLinkFn = $compile(template);\r\n                return _getRenderItem.bind(null, template);\r\n            }).catch($exceptionHandler);\r\n        }\r\n\r\n        function _getItemTemplate() {\r\n            // itemTemplateUrl\r\n            if (that.options.itemTemplateUrl) {\r\n                return $templateRequest(that.options.itemTemplateUrl);\r\n            }\r\n\r\n            // itemTemplate or default\r\n            var template = that.options.itemTemplate || '<span ng-bind-html=\"entry.item\"></span>';\r\n            return $q.when(template);\r\n        }\r\n\r\n        function _getRenderItem(template, data) {\r\n            var value = (angular.isObject(data) && that.options.selectedTextAttr) ? data[that.options.selectedTextAttr] : data;\r\n            return {\r\n                value: value,\r\n                label: template\r\n            };\r\n        }\r\n\r\n        function _shouldLoadNextPage() {\r\n            return that.options.pagingEnabled && !dataLoadInProgress && !endOfPagedList;\r\n        }\r\n\r\n        function _shouldLoadNextPageAtItemIndex(itemIndex) {\r\n            if (!_shouldLoadNextPage()) {\r\n                return false;\r\n            }\r\n\r\n            var triggerIndex = that.renderItems.length - that.options.invokePageLoadWhenItemsRemaining - 1;\r\n            return itemIndex >= triggerIndex;\r\n        }\r\n\r\n        function _reset() {\r\n            originalSearchText = that.searchText = null;\r\n            currentPageIndex = 0;\r\n            endOfPagedList = false;\r\n        }\r\n\r\n        function _setOptions(options) {\r\n            if (_.isEmpty(options)) {\r\n                return;\r\n            }\r\n\r\n            angular.forEach(options, function (value, key) {\r\n                if (defaultOptions.hasOwnProperty(key)) {\r\n                    that.options[key] = value;\r\n                }\r\n            });\r\n        }\r\n\r\n        var publicApi = (function () {\r\n            return {\r\n                setOptions: _setOptions,\r\n                positionDropdown: _positionDropdownIfVisible,\r\n                hideDropdown: _hideDropdown\r\n            };\r\n        })();\r\n    }\r\n\r\n    autoCompleteItemDirective.$inject = ['$compile', '$rootScope', '$sce', '$controller'];\r\n    function autoCompleteItemDirective($compile, $rootScope, $sce, $controller) {\r\n        return {\r\n            restrict: 'E',\r\n            transclude: 'element',\r\n            scope: {},\r\n            controllerAs: 'ctrl',\r\n            bindToController: {\r\n                index: '<',\r\n                renderItem: '<',\r\n                searchText: '<',\r\n                itemTemplateLinkFn: '<'\r\n            },\r\n            controller: function () { },\r\n            link: function (scope, element) {\r\n                var linkFn = null;\r\n                if (_.isFunction(scope.ctrl.itemTemplateLinkFn)) {\r\n                    linkFn = scope.ctrl.itemTemplateLinkFn;\r\n                }\r\n                else {\r\n                    // Needed to maintain backward compatibility since the parameter passed to $compile must be html.\r\n                    // When 'item' is returned from the 'options.renderItem' callback the 'label' might contain\r\n                    // a trusted value [returned by a call to $sce.trustAsHtml(html)]. We can get the original\r\n                    // html that was provided to $sce.trustAsHtml using the valueOf() function.\r\n                    // If 'label' is not a value that had been returned by $sce.trustAsHtml, it will be returned unchanged.\r\n                    var template = $sce.valueOf(scope.ctrl.renderItem.label);\r\n                    linkFn = $compile(template);\r\n                }\r\n\r\n                linkFn(createEntryScope(scope), function (clonedElement) {\r\n                    // append to the directive element's parent (<li>) since this directive element is replaced (transclude is set to 'element').\r\n                    $(element[0].parentNode).append(clonedElement);\r\n                });\r\n            }\r\n        };\r\n\r\n        function createEntryScope(directiveScope) {\r\n            var entryScope = $rootScope.$new(true);\r\n\r\n            // for now its an empty controller. Additional logic can be added to this controller if needed\r\n            var entry = entryScope.entry = $controller(angular.noop);\r\n\r\n            var deregisterWatchesFn = _.map(['index', 'renderItem', 'searchText'], function (key) {\r\n                return directiveScope.$watch(('ctrl.' + key), function (newVal) {\r\n                    switch (key) {\r\n                        case 'renderItem':\r\n                            // add 'item' property on entryScope for backward compatibility\r\n                            entry.item = entryScope.item = newVal.data;\r\n                            break;\r\n                        default:\r\n                            entry[key] = newVal;\r\n                            break;\r\n                    }\r\n                });\r\n            });\r\n\r\n            helperService.deregisterOnDestroy(directiveScope, deregisterWatchesFn);\r\n\r\n            return entryScope;\r\n        }\r\n    }\r\n\r\n    autoCompleteNoMatchDirective.$inject = ['$compile', '$rootScope', '$controller'];\r\n    function autoCompleteNoMatchDirective($compile, $rootScope, $controller) {\r\n        return {\r\n            restrict: 'E',\r\n            transclude: 'element',\r\n            scope: {},\r\n            controllerAs: 'ctrl',\r\n            bindToController: {\r\n                template: '<',\r\n                searchText: '<'\r\n            },\r\n            controller: function () { },\r\n            link: function (scope, element) {\r\n                var linkFn = $compile(scope.ctrl.template);\r\n                linkFn(createEntryScope(scope), function (clonedElement) {\r\n                    // append to the directive element's parent (<li>) since this directive element is replaced (transclude is set to 'element').\r\n                    $(element[0].parentNode).append(clonedElement);\r\n                });\r\n            }\r\n        };\r\n\r\n        function createEntryScope(directiveScope) {\r\n            var entryScope = $rootScope.$new(true);\r\n\r\n            // for now its an empty controller. Additional logic can be added to this controller if needed\r\n            var entry = entryScope.entry = $controller(angular.noop);\r\n\r\n            var deregisterFn = directiveScope.$watch('ctrl.searchText', function (newVal) {\r\n                entry.searchText = newVal;\r\n            });\r\n\r\n            helperService.deregisterOnDestroy(directiveScope, [deregisterFn]);\r\n\r\n            return entryScope;\r\n        }\r\n    }\r\n\r\n    function HelperService() {\r\n        var that = this;\r\n        var plugins = [];\r\n        var instanceCount = 0;\r\n        var activeInstanceId = 0;\r\n\r\n        this.registerInstance = function (instance) {\r\n            if (instance) {\r\n                plugins.push(instance);\r\n                return ++instanceCount;\r\n            }\r\n\r\n            return -1;\r\n        };\r\n\r\n        this.setActiveInstanceId = function (instanceId) {\r\n            activeInstanceId = instanceId;\r\n            that.hideAllInactive();\r\n        };\r\n\r\n        this.hideAllInactive = function () {\r\n            angular.forEach(plugins, function (ctrl) {\r\n                // hide if this is not the active instance\r\n                if (ctrl.instanceId !== activeInstanceId) {\r\n                    ctrl.autoHide();\r\n                }\r\n            });\r\n        };\r\n\r\n        this.deregisterOnDestroy = function (scope, deregisterWatchesFn) {\r\n            // cleanup on destroy\r\n            var destroyFn = scope.$on('$destroy', function () {\r\n                _.each(deregisterWatchesFn, function (deregisterFn) {\r\n                    deregisterFn();\r\n                });\r\n\r\n                destroyFn();\r\n            });\r\n        };\r\n    }\r\n\r\n    var DOM_EVENT = {\r\n        RESIZE: 'resize',\r\n        SCROLL: 'scroll',\r\n        CLICK: 'click',\r\n        KEYDOWN: 'keydown',\r\n        FOCUS: 'focus',\r\n        INPUT: 'input'\r\n    };\r\n\r\n    var KEYCODE = {\r\n        TAB: 9,\r\n        ENTER: 13,\r\n        CTRL: 17,\r\n        ALT: 18,\r\n        ESCAPE: 27,\r\n        LEFTARROW: 37,\r\n        UPARROW: 38,\r\n        RIGHTARROW: 39,\r\n        DOWNARROW: 40,\r\n        MAC_COMMAND_LEFT: 91,\r\n        MAC_COMMAND_RIGHT: 93\r\n    };\r\n\r\n    var defaultOptions = {\r\n        /**\r\n         * CSS class applied to the dropdown container.\r\n         * @default null\r\n         */\r\n        containerCssClass: null,\r\n        /**\r\n         * CSS class applied to the selected list element.\r\n         * @default auto-complete-item-selected\r\n         */\r\n        selectedCssClass: 'auto-complete-item-selected',\r\n        /**\r\n         * Minimum number of characters required to display the dropdown.\r\n         * @default 1\r\n         */\r\n        minimumChars: 1,\r\n        /**\r\n         * Maximum number of items to render in the list.\r\n         * @default 20\r\n         */\r\n        maxItemsToRender: 20,\r\n        /**\r\n         * If true displays the dropdown list when the textbox gets focus.\r\n         * @default false\r\n         */\r\n        activateOnFocus: false,\r\n        /**\r\n         * Width in \"px\" of the dropddown list. This can also be applied using CSS.\r\n         * @default 'auto'\r\n         */\r\n        dropdownWidth: 'auto',\r\n        /**\r\n         * Maximum height in \"px\" of the dropddown list. This can also be applied using CSS.\r\n         * @default 'auto'\r\n         */\r\n        dropdownHeight: 'auto',\r\n        /**\r\n         * a jQuery object to append the dropddown list.\r\n         * @default null\r\n         */\r\n        dropdownParent: null,\r\n        /**\r\n         * If the data for the dropdown is a collection of objects, this should be the name \r\n         * of a property on the object. The property value will be used to update the input textbox.\r\n         * @default null\r\n         */\r\n        selectedTextAttr: null,\r\n        /**\r\n         * A template for the dropddown list item. For example \"<p ng-bind-html='entry.item.name'></p>\";\r\n         * Or using interpolation \"<p>{{entry.item.lastName}}, {{entry.item.firstName}}></p>\".\r\n         * @default null\r\n         */\r\n        itemTemplate: null,\r\n        /**\r\n         * This is similar to template but the template is loaded from the specified URL, asynchronously.\r\n         * @default null\r\n         */\r\n        itemTemplateUrl: null,\r\n        /**\r\n         * Set to true to enable server side paging. See \"data\" callback for more information.\r\n         * @default false\r\n         */\r\n        pagingEnabled: false,\r\n        /**\r\n         * The number of items to display per page when paging is enabled.\r\n         * @default 5\r\n         */\r\n        pageSize: 5,\r\n        /**\r\n         * When using the keyboard arrow key to scroll down the list, the \"data\" callback will \r\n         * be invoked when at least this many items remain below the current focused item. \r\n         * Note that dragging the vertical scrollbar to the bottom of the list might also invoke a \"data\" callback.\r\n         * @default 1\r\n         */\r\n        invokePageLoadWhenItemsRemaining: 1,\r\n        /**\r\n         * Set to true to position the dropdown list using the position() method from the jQueryUI library.\r\n         * See <a href=\"https://api.jqueryui.com/position/\">jQueryUI.position() documentation</a>\r\n         * @default true\r\n         * @bindAsHtml true\r\n         */\r\n        positionUsingJQuery: true,\r\n        /**\r\n         * Options that will be passed to jQueryUI position() method.\r\n         * @default null\r\n         */\r\n        positionUsing: null,\r\n        /**\r\n         * Set to true to let the plugin hide the dropdown list. If this option is set to false you can hide the dropdown list\r\n         * with the hideDropdown() method available in the ready callback.\r\n         * @default true\r\n         */\r\n        autoHideDropdown: true,\r\n        /**\r\n         * Set to true to hide the dropdown list when the window is resized. If this option is set to false you can hide\r\n         * or re-position the dropdown list with the hideDropdown() or positionDropdown() methods available in the ready.\r\n         * callback.\r\n         * @default true\r\n         */\r\n        hideDropdownOnWindowResize: true,\r\n        /**\r\n         * Set to true to enable the template to display a message when no items match the search text.\r\n         * @default true\r\n         */\r\n        noMatchTemplateEnabled: true,\r\n        /**\r\n         * The template used to display the message when no items match the search text.\r\n         * @default \"<span>No results match '{{entry.searchText}}'></span>\"\r\n         */\r\n        noMatchTemplate: \"<span>No results match '{{entry.searchText}}'</span>\",\r\n        /**\r\n         * Callback after the plugin is initialized and ready. The callback receives an object with the following methods:\r\n         * @default angular.noop\r\n         */\r\n        ready: angular.noop,\r\n        /**\r\n         * Callback before the \"data\" callback is invoked.\r\n         * @default angular.noop\r\n         */\r\n        loading: angular.noop,\r\n        /**\r\n         * Callback to get the data for the dropdown. The callback receives the search text as the first parameter.\r\n         * If paging is enabled the callback receives an object with \"pageIndex\" and \"pageSize\" properties as the second parameter.\r\n         * This function must return a promise.\r\n         * @default angular.noop\r\n         */\r\n        data: angular.noop,\r\n        /**\r\n         * Callback after the items are rendered in the dropdown\r\n         * @default angular.noop\r\n         */\r\n        loadingComplete: angular.noop,\r\n        /**\r\n         * Callback for custom rendering a list item. This is called for each item in the dropdown.\r\n         * This must return an object literal with \"value\" and \"label\" properties where\r\n         * \"label\" is the template for display and \"value\" is the text for the textbox.\r\n         * If the object has an \"id\" property, it will be used in the \"track by\" clause of the ng-repeat of the dropdown list.\r\n         * @default angular.noop\r\n         */\r\n        renderItem: angular.noop,\r\n        /**\r\n         * Callback after an item is selected from the dropdown. The callback receives an object with an \"item\" property representing the selected item.\r\n         * @default angular.noop\r\n         */\r\n        itemSelected: angular.noop,\r\n        /**\r\n         * Callback after the dropdown is shown.\r\n         * @default angular.noop\r\n         */\r\n        dropdownShown: angular.noop,\r\n        /**\r\n         * Callback after the dropdown is hidden.\r\n         * @default angular.noop\r\n         */\r\n        dropdownHidden: angular.noop\r\n    };\r\n\r\n}));"]}