{"version":3,"sources":["angucomplete-alt.js"],"names":["angular","module","directive","$q","$parse","$http","$sce","$timeout","$templateCache","KEY_DW","KEY_RT","KEY_UP","KEY_LF","KEY_ES","KEY_EN","KEY_TAB","MIN_LENGTH","PAUSE","BLUR_TIMEOUT","REQUIRED_CLASS","TEXT_SEARCHING","TEXT_NORESULTS","TEMPLATE_URL","put","restrict","require","scope","selectedObject","disableInput","initialValue","localData","lookupParams","remoteUrlRequestFormatter","remoteUrlResponseFormatter","remoteUrlErrorCallback","id","placeholder","remoteUrl","remoteUrlDataField","requestType","titleField","descriptionField","imageField","inputClass","pause","searchFields","minlength","matchClass","clearSelected","overrideSuggestions","fieldRequired","fieldRequiredClass","inputChanged","autoMatch","focusOut","fieldtabindex","fieldrequired","focusIn","selectionChanged","onEnter","maxDisplay","textFieldTitle","isLitescreen","enableRemoteCache","titleFieldSeperator","enableMinLengthFromConfig","autoLookupType","templateUrl","element","attrs","link","elem","ctrl","clickoutHandlerForDropdown","event","mousedownOn","hideResults","document","body","removeEventListener","handleInputChange","newval","initial","searchStr","extractTitle","callOrAssign","originalObject","length","console","error","handleRequired","ie8EventNormalizer","which","keyCode","value","validObjectSelected","callFunctionOrIdentity","fn","data","setInputString","str","clearResults","extractTitleJobLite","extractValue","split","map","field","join","obj","key","keys","result","forEach","k","findMatchString","target","matches","re","RegExp","match","replace","trustAsHtml","valid","validState","$setValidity","requiredClassName","keyupHandler","selectionCalled","preventDefault","showDropdown","initResults","searching","searchTimerComplete","$apply","inputField","val","searchTimer","cancel","undefined","handleOverrideSuggestions","dropdownRowOffsetHeight","row","css","getComputedStyle","offsetHeight","parseInt","marginTop","marginBottom","dropdownHeight","dd","getBoundingClientRect","top","maxHeight","dropdownRow","querySelectorAll","currentIndex","dropdownRowTop","paddingTop","dropdownScrollTopTo","offset","scrollTop","updateInputField","current","results","title","keydownHandler","rowTop","selectResult","isScrollOn","bottom","$digest","searchInProcess","log","httpSuccessCallbackGen","lookupUrl","responseData","status","headers","config","getKey","lookupResultCache","timestamp","Date","getTime","processResults","responseFormatter","httpErrorCallback","errorRes","cancelHttpRequest","httpCanceller","resolve","getRemoteResults","params","url","fromJson","q","search","defer","timeout","promise","cacheFound","cachedData","IsAutoLookupCacheExpired","post","success","get","published","getLocalResults","i","s","toString","toLowerCase","indexOf","checkExactMatch","description","image","text","formattedText","formattedDesc","desc","timeStamp","Math","floor","find","getAutoCompleteMinCharLength","then","hideTimer","unbindInitialValue","querySelector","on","addEventListener","className","$watch","oldval","newValue","oldValue","$on","elementId","onFocusHandler","resetHideResults","hoverRow","index","$","focus","inputChangeHandler","getTitle","getDescription","textSearching","textNoResults","overflowY"],"mappings":"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","file":"angucomplete-alt.js","sourcesContent":["/*\r\n * angucomplete-alt\r\n * Autocomplete directive for AngularJS\r\n * This is a fork of Daryl Rowland's angucomplete with some extra features.\r\n * By Hidenari Nozaki\r\n */\r\n\r\n/*! Copyright (c) 2014 Hidenari Nozaki and contributors | Licensed under the MIT license */\r\n\r\n'use strict';\r\n\r\nangular.module('angucomplete-alt', [])\r\n    .directive('angucompleteAlt', ['$q', '$parse', '$http', '$sce', '$timeout', '$templateCache', function ($q, $parse, $http, $sce, $timeout, $templateCache) {\r\n        // keyboard events\r\n        var KEY_DW = 40;\r\n        var KEY_RT = 39;\r\n        var KEY_UP = 38;\r\n        var KEY_LF = 37;\r\n        var KEY_ES = 27;\r\n        var KEY_EN = 13;\r\n        var KEY_BS = 8;\r\n        var KEY_DEL = 46;\r\n        var KEY_TAB = 9;\r\n\r\n        var MIN_LENGTH = 3;\r\n        var PAUSE = 1000;\r\n        var BLUR_TIMEOUT = 200;\r\n\r\n        // string constants\r\n        var REQUIRED_CLASS = 'autocomplete-required';\r\n        var TEXT_SEARCHING = 'Searching...';\r\n        var TEXT_NORESULTS = 'No results found';\r\n        var TEMPLATE_URL = '/angucomplete-alt/index.html';\r\n\r\n        // Set the default template for this directive\r\n        $templateCache.put(TEMPLATE_URL,\r\n            '<div class=\"angucomplete-holder\" ng-class=\"{\\'angucomplete-dropdown-visible\\': showDropdown}\">' +\r\n            '  <input id=\"{{id}}_value\" tabindex=\"{{fieldtabindex}}\" ng-required=\"{{fieldrequired}}\" ng-model=\"searchStr\" ng-disabled=\"disableInput\" type=\"text\" ng-attr-placeholder=\"placeholder\" ng-focus=\"onFocusHandler()\" class=\"{{inputClass}}\" ng-focus=\"resetHideResults()\" ng-blur=\"hideResults($event)\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" ng-change=\"inputChangeHandler(searchStr)\"/>' +\r\n            '  <div id=\"{{id}}_dropdown\" class=\"angucomplete-dropdown\" ng-show=\"showDropdown\">' +\r\n            '    <div class=\"angucomplete-searching\" ng-show=\"searching\" ng-bind=\"textSearching\"></div>' +\r\n            '    <div class=\"angucomplete-searching\" ng-show=\"!searching && (!results || results.length == 0)\" ng-bind=\"textNoResults\"></div>' +\r\n            '    <div class=\"angucomplete-client-row\" ng-repeat=\"result in results\" ng-click=\"selectResult(result)\" ng-mouseenter=\"hoverRow($index)\" ng-class=\"{\\'angucomplete-selected-row\\': $index == currentIndex}\">' +\r\n            '      <div ng-if=\"imageField\" class=\"angucomplete-image-holder\">' +\r\n            '        <img ng-if=\"result.image && result.image != \\'\\'\" ng-src=\"{{result.image}}\" class=\"angucomplete-image\"/>' +\r\n            '        <div ng-if=\"!result.image && result.image != \\'\\'\" class=\"angucomplete-image-default\"></div>' +\r\n            '      </div>' +\r\n            '      <div class=\"angucomplete-title\" ng-if=\"matchClass\" ng-bind-html=\"result.title\"></div>' +\r\n            '      <div class=\"angucomplete-title\" ng-if=\"!matchClass\">{{ result.title }}</div>' +\r\n            '      <div ng-if=\"matchClass && result.description && result.description != \\'\\'\" class=\"angucomplete-description\" ng-bind-html=\"result.description\"></div>' +\r\n            '      <div ng-if=\"!matchClass && result.description && result.description != \\'\\'\" class=\"angucomplete-description\">{{result.description}}</div>' +\r\n            '    </div>' +\r\n            '  </div>' +\r\n            '</div>'\r\n        );\r\n\r\n        return {\r\n            restrict: 'EA',\r\n            require: '^?form',\r\n            scope: {\r\n                selectedObject: '=',\r\n                disableInput: '=',\r\n                initialValue: '@',\r\n                localData: '=',\r\n                lookupParams: '@',\r\n                remoteUrlRequestFormatter: '=',\r\n                remoteUrlResponseFormatter: '=',\r\n                remoteUrlErrorCallback: '=',\r\n                id: '@',\r\n                placeholder: '@',\r\n                remoteUrl: '@',\r\n                remoteUrlDataField: '@',\r\n                requestType: '@',\r\n                titleField: '@',\r\n                descriptionField: '@',\r\n                imageField: '@',\r\n                inputClass: '@',\r\n                pause: '@',\r\n                searchFields: '@',\r\n                minlength: '@',\r\n                matchClass: '@',\r\n                clearSelected: '@',\r\n                overrideSuggestions: '@',\r\n                fieldRequired: '@',\r\n                fieldRequiredClass: '@',\r\n                inputChanged: '=',\r\n                autoMatch: '@',\r\n                focusOut: '&',\r\n                fieldtabindex: '@',\r\n                fieldrequired: '@',\r\n                focusIn: '&',\r\n                selectionChanged: '&',\r\n                onEnter: '&',\r\n                maxDisplay: '@',\r\n                textFieldTitle: '@',\r\n                isLitescreen: '@',\r\n                enableRemoteCache: '=',\r\n                titleFieldSeperator: '=',\r\n                enableMinLengthFromConfig: '=',\r\n                autoLookupType: '@'\r\n            },\r\n            templateUrl: function (element, attrs) {\r\n                return attrs.templateUrl || TEMPLATE_URL;\r\n            },\r\n            link: function (scope, elem, attrs, ctrl) {\r\n                var inputField = elem.find('textarea').length > 0 ? elem.find('textarea') : elem.find('input');\r\n                var minlength = MIN_LENGTH;\r\n                if (typeof (scope.enableMinLengthFromConfig) !== 'undefined' && scope.enableMinLengthFromConfig) {\r\n                    getAutoCompleteMinCharLength(scope.autoLookupType).then(function (result) {\r\n                        minlength = result;\r\n                        scope.pause = PAUSE;\r\n                    });\r\n                }\r\n                var searchTimer = null;\r\n                var hideTimer;\r\n                var requiredClassName = REQUIRED_CLASS;\r\n                var responseFormatter;\r\n                var validState = null;\r\n                var httpCanceller = null;\r\n                var dd = elem[0].querySelector('.angucomplete-dropdown');\r\n                var isScrollOn = false;\r\n                var mousedownOn = null;\r\n                var unbindInitialValue;\r\n                var validObjectSelected = false;\r\n                var selectionCalled = false;\r\n                var searchInProcess = false;\r\n                var lookupResultCache = {};\r\n                elem.on('mousedown', function (event) {\r\n                    if (event.target.id) {\r\n                        mousedownOn = event.target.id;\r\n                        if (mousedownOn === scope.id + '_dropdown') {\r\n                            document.body.addEventListener('click', clickoutHandlerForDropdown);\r\n                        }\r\n                    }\r\n                    else {\r\n                        mousedownOn = event.target.className;\r\n                    }\r\n                });\r\n\r\n                function clickoutHandlerForDropdown(event) {\r\n                    mousedownOn = null;\r\n                    scope.hideResults(event);\r\n                    document.body.removeEventListener('click', clickoutHandlerForDropdown);\r\n                }\r\n\r\n                scope.currentIndex = null;\r\n                scope.searching = false;\r\n                scope.searchStr = scope.initialValue;\r\n                unbindInitialValue = scope.$watch('initialValue', function (newval, oldval) {\r\n                    if (newval && newval.length > 0) {\r\n                        scope.searchStr = scope.initialValue;\r\n                        handleRequired(true);\r\n                        unbindInitialValue();\r\n                    }\r\n                });\r\n\r\n                scope.$watch('selectedObject', function (newValue, oldValue) { //2-way binding with object.\r\n                    if (newValue) {\r\n                        var result = newValue.originalObject || newValue;\r\n                        scope.selectedObject = result; // selectedobject must not have object.originalObject that is binded in parent page.\r\n                        if (newValue && !newValue.originalObject) {\r\n                            if (scope.textFieldTitle) {\r\n                                scope.searchStr = extractValue(result, scope.textFieldTitle) || extractTitle(result);\r\n                            } else {\r\n                                scope.searchStr = extractTitle(result);\r\n                            }\r\n\r\n                        }\r\n\r\n                        if (scope.selectionChanged) {\r\n                            scope.selectionChanged({ 'newValue': newValue });\r\n                        }\r\n                    }\r\n                });\r\n\r\n\r\n                scope.$on('angucomplete-alt:clearInput', function (event, elementId) {\r\n                    if (!elementId) {\r\n                        scope.searchStr = null;\r\n                        clearResults();\r\n                    }\r\n                    else { // id is given\r\n                        if (scope.id === elementId) {\r\n                            scope.searchStr = null;\r\n                            clearResults();\r\n                        }\r\n                    }\r\n                });\r\n\r\n                scope.$on('angucomplete-alt:changeInput', function (event, elementId, newval) {\r\n                    if (!!elementId && elementId === scope.id) {\r\n                        handleInputChange(newval);\r\n                    }\r\n                });\r\n\r\n                function handleInputChange(newval, initial) {\r\n                    if (newval) {\r\n                        if (typeof newval === 'object') {\r\n                            scope.searchStr = extractTitle(newval);\r\n                            callOrAssign({ originalObject: newval });\r\n                        } else if (typeof newval === 'string' && newval.length > 0) {\r\n                            scope.searchStr = newval;\r\n                        } else {\r\n                            if (console && console.error) {\r\n                                console.error('Tried to set ' + (!!initial ? 'initial' : '') + ' value of angucomplete to', newval, 'which is an invalid value');\r\n                            }\r\n                        }\r\n\r\n                        handleRequired(true);\r\n                    }\r\n                }\r\n\r\n                // for IE8 quirkiness about event.which\r\n                function ie8EventNormalizer(event) {\r\n                    return event.which ? event.which : event.keyCode;\r\n                }\r\n\r\n                  // check min length\r\n                if ((typeof (scope.enableMinLengthFromConfig) === 'undefined' || !scope.enableMinLengthFromConfig) && scope.minlength && scope.minlength !== '') {\r\n                    minlength = scope.minlength;\r\n                }\r\n\r\n                   // check pause time\r\n                if ((typeof (scope.enableMinLengthFromConfig) === 'undefined' || !scope.enableMinLengthFromConfig) && !scope.pause) {\r\n                    scope.pause = PAUSE;\r\n                }\r\n\r\n                function callOrAssign(value) {\r\n                    if (value) {\r\n                        validObjectSelected = true;\r\n                    } else {\r\n                        validObjectSelected = false;\r\n                    }\r\n                    if (typeof scope.selectedObject === 'function') {\r\n                        scope.selectedObject(value);\r\n                    }\r\n                    else {\r\n                        scope.selectedObject = value;\r\n                    }\r\n\r\n                    if (value) {\r\n                        handleRequired(true);\r\n                    }\r\n                    else {\r\n                        handleRequired(false);\r\n                    }\r\n                }\r\n\r\n                function callFunctionOrIdentity(fn) {\r\n                    return function (data) {\r\n                        return scope[fn] ? scope[fn](data) : data;\r\n                    };\r\n                }\r\n\r\n                function setInputString(str) {\r\n                    callOrAssign({ originalObject: str });\r\n\r\n                    if (scope.clearSelected) {\r\n                        scope.searchStr = null;\r\n                        validObjectSelected = false;\r\n                    }\r\n                    clearResults();\r\n                }\r\n\r\n                function extractTitleJobLite(data) {\r\n                    return extractValue(data, scope.titleField.split(',')[0]);\r\n                }\r\n\r\n                function extractTitle(data) {\r\n                    // split title fields and run extractValue for each and join with ' '\r\n                    return scope.titleField.split(',')\r\n                        .map(function (field) {\r\n                            return extractValue(data, field);\r\n                        })\r\n                        .join(scope.isLitescreen ? '\\n' : (scope.titleFieldSeperator ? scope.titleFieldSeperator : ' '));\r\n                }\r\n\r\n                function extractValue(obj, key) {\r\n                    var keys, result;\r\n                    if (key) {\r\n                        keys = key.split('.');\r\n                        result = obj;\r\n                        keys.forEach(function (k) { result = result[k]; });\r\n                    }\r\n                    else {\r\n                        result = obj;\r\n                    }\r\n                    return result;\r\n                }\r\n\r\n                function findMatchString(target, str) {\r\n                    var result, matches, re = new RegExp(str, 'i');\r\n                    if (!target) { return; }\r\n                    matches = target.match(re);\r\n                    if (matches) {\r\n                        result = target.replace(re,\r\n                            '<span class=\"' + scope.matchClass + '\">' + matches[0] + '</span>');\r\n                    }\r\n                    else {\r\n                        result = target;\r\n                    }\r\n                    return $sce.trustAsHtml(result);\r\n                }\r\n\r\n                function handleRequired(valid) {\r\n                    validState = scope.searchStr;\r\n                    if (scope.fieldRequired && ctrl) {\r\n                        ctrl.$setValidity(requiredClassName, valid);\r\n                    }\r\n                }\r\n\r\n                function keyupHandler(event) {\r\n                    var which = ie8EventNormalizer(event);\r\n                    if (selectionCalled) {\r\n                        selectionCalled = false;\r\n                    }\r\n\r\n                    if (which === KEY_LF || which === KEY_RT || which === KEY_TAB) {\r\n                        // do nothing\r\n                        return;\r\n                    }\r\n\r\n                    if (which === KEY_UP || which === KEY_EN) {\r\n                        event.preventDefault();\r\n                    }\r\n                    else if (which === KEY_DW) {\r\n                        event.preventDefault();\r\n                        if (!scope.showDropdown && scope.searchStr && scope.searchStr.length >= minlength) {\r\n                            initResults();\r\n                            scope.searching = true;\r\n                            searchTimerComplete(scope.searchStr);\r\n                        }\r\n                    }\r\n                    else if (which === KEY_ES) {\r\n                        clearResults();\r\n                        scope.$apply(function () {\r\n                            inputField.val(scope.searchStr);\r\n                        });\r\n                    }\r\n                    else {\r\n                        if (!scope.searchStr || scope.searchStr === '') {\r\n                            scope.showDropdown = false;\r\n                        } else if (scope.searchStr.length >= minlength) {\r\n                            initResults();\r\n\r\n                            if (searchTimer) {\r\n                                $timeout.cancel(searchTimer);\r\n                            }\r\n\r\n                            scope.searching = true;\r\n\r\n                            searchTimer = $timeout(function () {\r\n                                searchTimerComplete(scope.searchStr);\r\n                            }, scope.pause);\r\n                        }\r\n\r\n                        if (validState && validState !== scope.searchStr && !scope.clearSelected) {\r\n                            callOrAssign(undefined);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                function handleOverrideSuggestions(event) {\r\n                    if (scope.overrideSuggestions &&\r\n                        !(scope.selectedObject && scope.selectedObject.originalObject === scope.searchStr)) {\r\n                        if (event) {\r\n                            event.preventDefault();\r\n                        }\r\n                        setInputString(scope.searchStr);\r\n                    }\r\n                }\r\n\r\n                function dropdownRowOffsetHeight(row) {\r\n                    var css = getComputedStyle(row);\r\n                    return row.offsetHeight +\r\n                        parseInt(css.marginTop, 10) + parseInt(css.marginBottom, 10);\r\n                }\r\n\r\n                function dropdownHeight() {\r\n                    return dd.getBoundingClientRect().top +\r\n                        parseInt(getComputedStyle(dd).maxHeight, 10);\r\n                }\r\n\r\n                function dropdownRow() {\r\n                    return elem[0].querySelectorAll('.angucomplete-client-row')[scope.currentIndex];\r\n                }\r\n\r\n                function dropdownRowTop() {\r\n                    return dropdownRow().getBoundingClientRect().top -\r\n                        (dd.getBoundingClientRect().top +\r\n                            parseInt(getComputedStyle(dd).paddingTop, 10));\r\n                }\r\n\r\n                function dropdownScrollTopTo(offset) {\r\n                    dd.scrollTop = dd.scrollTop + offset;\r\n                }\r\n\r\n                function updateInputField() {\r\n                    var current = scope.results[scope.currentIndex];\r\n                    if (scope.matchClass) {\r\n                        inputField.val(extractTitle(current.originalObject));\r\n                    }\r\n                    else {\r\n                        inputField.val(current.title);\r\n                    }\r\n                }\r\n\r\n                function keydownHandler(event) {\r\n                    var which = ie8EventNormalizer(event);\r\n                    var row = null;\r\n                    var rowTop = null;\r\n\r\n                    if (which === KEY_EN && scope.results) {\r\n                        if (scope.currentIndex >= 0 && scope.currentIndex < scope.results.length) {\r\n                            event.preventDefault();\r\n                            scope.selectResult(scope.results[scope.currentIndex]);\r\n                        } else {\r\n                            handleOverrideSuggestions(event);\r\n                            clearResults();\r\n                        }\r\n                        scope.$apply();\r\n                    } else if (which === KEY_DW && scope.results) {\r\n                        event.preventDefault();\r\n                        if ((scope.currentIndex + 1) < scope.results.length && scope.showDropdown) {\r\n                            scope.$apply(function () {\r\n                                scope.currentIndex++;\r\n                                updateInputField();\r\n                            });\r\n\r\n                            if (isScrollOn) {\r\n                                row = dropdownRow();\r\n                                if (dropdownHeight() < row.getBoundingClientRect().bottom) {\r\n                                    dropdownScrollTopTo(dropdownRowOffsetHeight(row));\r\n                                }\r\n                            }\r\n                        }\r\n                    } else if (which === KEY_UP && scope.results) {\r\n                        event.preventDefault();\r\n                        if (scope.currentIndex >= 1) {\r\n                            scope.$apply(function () {\r\n                                scope.currentIndex--;\r\n                                updateInputField();\r\n                            });\r\n\r\n                            if (isScrollOn) {\r\n                                rowTop = dropdownRowTop();\r\n                                if (rowTop < 0) {\r\n                                    dropdownScrollTopTo(rowTop - 1);\r\n                                }\r\n                            }\r\n                        }\r\n                        else if (scope.currentIndex === 0) {\r\n                            scope.$apply(function () {\r\n                                scope.currentIndex = -1;\r\n                                inputField.val(scope.searchStr);\r\n                            });\r\n                        }\r\n                    } else if (which === KEY_TAB) {\r\n                        if (scope.results && scope.results.length > 0 && scope.showDropdown) {\r\n                            if (scope.currentIndex === -1 && scope.overrideSuggestions) {\r\n                                // intentionally not sending event so that it does not\r\n                                // prevent default tab behavior\r\n                                handleOverrideSuggestions();\r\n                            }\r\n                            else {\r\n                                if (scope.currentIndex === -1) {\r\n                                    scope.currentIndex = 0;\r\n                                }\r\n                                scope.selectResult(scope.results[scope.currentIndex]);\r\n                                scope.$digest();\r\n                            }\r\n                        }\r\n                        else {\r\n                            selectionCalled = true;\r\n                            $timeout(function () {\r\n                                if (searchInProcess == false && scope.searchStr && (!scope.results || scope.results.length == 0)) {\r\n                                    if (console) {\r\n                                        console.log(\"Re-try fetch\");\r\n                                    }\r\n\r\n                                    searchTimerComplete(scope.searchStr);\r\n                                }\r\n                            }, scope.pause);\r\n\r\n\r\n                            // no results\r\n                            // intentionally not sending event so that it does not\r\n                            // prevent default tab behavior\r\n                            if (scope.searchStr && scope.searchStr.length > 0) {\r\n                                handleOverrideSuggestions();\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (which == KEY_EN && scope.onEnter) {\r\n                        scope.onEnter();\r\n                    }\r\n                }\r\n\r\n                function httpSuccessCallbackGen(str, lookupUrl) {\r\n                    return function (responseData, status, headers, config) {\r\n                        if (console) {\r\n                            console.log(\"Service Success\");\r\n                        }\r\n                        if (scope.enableRemoteCache && lookupUrl && typeof responseData != 'undefined' && responseData.length > 0) {\r\n                            var key = getKey(str);\r\n                            lookupResultCache[key] = { \"result\": responseData, \"timestamp\": new Date().getTime() };\r\n                            console.log(\"result cached with key \" + key);\r\n                        }\r\n                        scope.searching = false;\r\n                        processResults(\r\n                            extractValue(responseFormatter(responseData), scope.remoteUrlDataField),\r\n                            str);\r\n                    };\r\n                }\r\n\r\n                function httpErrorCallback(errorRes, status, headers, config) {\r\n                    // cancelled/aborted                  \r\n                    if (status === 0 || status === -1) { return; }\r\n\r\n                    if (status && status !== 0) {\r\n\r\n                        if (scope.remoteUrlErrorCallback) {\r\n                            scope.remoteUrlErrorCallback(errorRes, status, headers, config);\r\n                        }\r\n                        else {\r\n                            if (console && console.error) {\r\n                                console.error('http error');\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                function cancelHttpRequest() {\r\n                    if (httpCanceller) {\r\n                        httpCanceller.resolve();\r\n                    }\r\n                }\r\n\r\n                function getRemoteResults(str) {\r\n                    if (console) {\r\n                        console.log(\"Service Call\");\r\n                    }\r\n                    searchInProcess = true;\r\n                    var params = {};\r\n                    var url = '';\r\n                    if (scope.requestType == 'POST') {\r\n                        scope.lookupParams = angular.fromJson(scope.lookupParams);\r\n                        scope.lookupParams.q = str;\r\n                        scope.lookupParams.search = str;\r\n                        url = scope.remoteUrl;\r\n                    }\r\n                    else {\r\n                        url = scope.remoteUrl + str;\r\n                        if (scope.remoteUrlRequestFormatter) {\r\n                            params = { params: scope.remoteUrlRequestFormatter(str) };\r\n                            url = scope.remoteUrl;\r\n                        }\r\n                    }\r\n\r\n                    cancelHttpRequest();\r\n                    httpCanceller = $q.defer();\r\n                    params.timeout = httpCanceller.promise;\r\n\r\n                    var cacheFound = false;\r\n                    var key = getKey(str);\r\n                    if (scope.enableRemoteCache && key in lookupResultCache) {\r\n\r\n                        var cachedData = lookupResultCache[key];\r\n                        if (!IsAutoLookupCacheExpired(cachedData.timestamp)) {\r\n                            cacheFound = true;\r\n                            console.log(\"result found cache key \" + key);\r\n                        } else {\r\n                            cacheFound = false;\r\n                            delete lookupResultCache[key];\r\n                            console.log(\"result Cache expired deleted key \" + key);\r\n                        }\r\n                    } else {\r\n                        cacheFound = false;\r\n                    }\r\n                    if (cacheFound) {\r\n                        scope.searching = false;\r\n                        processResults(\r\n                            extractValue(responseFormatter(lookupResultCache[key].result), scope.remoteUrlDataField),\r\n                            str);\r\n                    } else {\r\n                        if (scope.requestType == 'POST') {\r\n                            $http.post(url, scope.lookupParams)\r\n                                .success(httpSuccessCallbackGen(str, url))\r\n                                .error(httpErrorCallback)\r\n                                .finally(function () {\r\n                                    searchInProcess = false;\r\n                                });\r\n                        }\r\n                        else {\r\n                            $http.get(url, params)\r\n                                .success(httpSuccessCallbackGen(str, url))\r\n                                .error(httpErrorCallback)\r\n                                .finally(function () {\r\n                                    searchInProcess = false;\r\n                                });\r\n                        }\r\n                    }\r\n                }\r\n\r\n                function getKey(str) {\r\n                    var key;\r\n                    if (scope.requestType == 'POST') {\r\n                        key = scope.remoteUrl +\r\n                            scope.lookupParams.published +\r\n                            scope.lookupParams.q +\r\n                            scope.lookupParams.search;\r\n                    }\r\n                    else {\r\n                        key = scope.remoteUrl + str;\r\n                    }\r\n                    return key;\r\n                }\r\n\r\n                function clearResults() {\r\n                    scope.showDropdown = false;\r\n                    scope.results = [];\r\n                    if (dd) {\r\n                        dd.scrollTop = 0;\r\n                    }\r\n                }\r\n\r\n                function initResults() {\r\n                    scope.showDropdown = true;\r\n                    scope.currentIndex = -1;\r\n                    scope.results = [];\r\n                }\r\n\r\n                function getLocalResults(str) {\r\n                    var i, match, s, value,\r\n                        searchFields = scope.searchFields.split(','),\r\n                        matches = [];\r\n\r\n                    for (i = 0; i < scope.localData.length; i++) {\r\n                        match = false;\r\n\r\n                        for (s = 0; s < searchFields.length; s++) {\r\n                            value = extractValue(scope.localData[i], searchFields[s]) || '';\r\n                            match = match || (value.toString().toLowerCase().indexOf(str.toString().toLowerCase()) >= 0);\r\n                        }\r\n\r\n                        if (match) {\r\n                            matches[matches.length] = scope.localData[i];\r\n                        }\r\n                    }\r\n\r\n                    scope.searching = false;\r\n                    processResults(matches, str);\r\n                }\r\n\r\n                function checkExactMatch(result, obj, str) {\r\n                    for (var key in obj) {\r\n                        if (obj[key].toLowerCase() === str.toLowerCase()) {\r\n                            scope.selectResult(result);\r\n                            return;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                function searchTimerComplete(str) {\r\n                    // Begin the search\r\n                    if (!str || str.length < minlength) {\r\n                        return;\r\n                    }\r\n                    if (scope.localData) {\r\n                        scope.$apply(function () {\r\n                            getLocalResults(str);\r\n                        });\r\n                    }\r\n                    else {\r\n                        getRemoteResults(str);\r\n                    }\r\n                }\r\n\r\n                function processResults(responseData, str) {\r\n                    var i, description, image, text, formattedText, formattedDesc;\r\n\r\n                    if (responseData && responseData.length > 0) {\r\n                        scope.results = [];\r\n\r\n                        for (i = 0; i < responseData.length; i++) {\r\n                            if (scope.titleField && scope.titleField !== '') {\r\n                                text = formattedText = extractTitle(responseData[i]);\r\n                            }\r\n\r\n                            description = '';\r\n                            if (scope.descriptionField) {\r\n                                description = formattedDesc = extractValue(responseData[i], scope.descriptionField);\r\n                            }\r\n\r\n                            image = '';\r\n                            if (scope.imageField) {\r\n                                image = extractValue(responseData[i], scope.imageField);\r\n                            }\r\n\r\n                            if (scope.matchClass) {\r\n                                formattedText = findMatchString(text.toString(), str);\r\n                                formattedDesc = findMatchString(description.toString(), str);\r\n                            }\r\n\r\n                            scope.results[scope.results.length] = {\r\n                                title: formattedText,\r\n                                description: formattedDesc,\r\n                                image: image,\r\n                                originalObject: responseData[i]\r\n                            };\r\n\r\n                            if (scope.autoMatch) {\r\n                                checkExactMatch(scope.results[scope.results.length - 1],\r\n                                    { title: text, desc: description || '' }, scope.searchStr);\r\n                            }\r\n                        }\r\n\r\n                        if (selectionCalled) {\r\n                            if (scope.results.length > 0) {\r\n                                scope.selectResult(scope.results[0]);\r\n                            }\r\n                            else {\r\n                                selectionCalled = false;\r\n                            }\r\n                        }\r\n\r\n                    } else {\r\n                        scope.results = [];\r\n                    }\r\n                }\r\n\r\n                function IsAutoLookupCacheExpired(timeStamp) {\r\n                    return typeof timeStamp != 'undefined' && Math.floor((new Date().getTime() - timeStamp) / (1000 * 60)) >= 10;\r\n                }\r\n\r\n                scope.onFocusHandler = function () {\r\n                    if (scope.focusIn) {\r\n                        scope.focusIn();\r\n                    }\r\n                };\r\n\r\n                scope.hideResults = function (event) {\r\n                    if (mousedownOn === scope.id + '_dropdown') {\r\n                        mousedownOn = null;\r\n                    }\r\n                    else {\r\n                        hideTimer = $timeout(function () {\r\n                            clearResults();\r\n                            scope.$apply(function () {\r\n                                if (typeof scope.selectedObject === 'function') {\r\n                                    if (!validObjectSelected) {\r\n                                        scope.searchStr = null;\r\n                                    }\r\n                                }\r\n                                else if (!scope.selectedObject) {\r\n                                    scope.searchStr = null;\r\n                                }\r\n                                else if (scope.searchStr && scope.searchStr.length > 0) {\r\n                                    inputField.val(scope.searchStr);\r\n                                }\r\n                            });\r\n                        }, BLUR_TIMEOUT);\r\n                        cancelHttpRequest();\r\n\r\n                        if (scope.focusOut) {\r\n                            scope.focusOut();\r\n                        }\r\n                    }\r\n                };\r\n\r\n                scope.resetHideResults = function () {\r\n                    if (hideTimer) {\r\n                        $timeout.cancel(hideTimer);\r\n                    }\r\n                };\r\n\r\n                scope.hoverRow = function (index) {\r\n                    scope.currentIndex = index;\r\n                };\r\n\r\n                scope.selectResult = function (result) {\r\n                    // Restore original values\r\n                    if (scope.matchClass) {\r\n                        result.title = extractTitle(result.originalObject);\r\n                        result.description = extractValue(result.originalObject, scope.descriptionField);\r\n                    }\r\n\r\n                    callOrAssign(result);\r\n\r\n\r\n                    if (!selectionCalled) {\r\n                        $(inputField).focus();\r\n                    }\r\n\r\n                    if (selectionCalled) {\r\n                        selectionCalled = false;\r\n                    }\r\n\r\n                    if (scope.clearSelected) {\r\n                        scope.searchStr = null;\r\n                    }\r\n                    else {\r\n\r\n                        if (scope.textFieldTitle) {\r\n                            scope.searchStr = extractValue(result.originalObject, scope.textFieldTitle) || result.title;\r\n                        } else {\r\n                            scope.searchStr = result.title;\r\n                        }\r\n                    }\r\n\r\n                    clearResults();\r\n                };\r\n\r\n                scope.inputChangeHandler = function (str) {\r\n                    validObjectSelected = false;\r\n                    if (!str || str.length < minlength) {\r\n                        if (typeof scope.selectedObject !== 'function') {\r\n                            scope.selectedObject = null;\r\n                        }\r\n                        clearResults();\r\n                    }\r\n                    if (scope.inputChanged) {\r\n                        str = scope.inputChanged(str);\r\n                    }\r\n                    return str;\r\n                };\r\n\r\n                scope.getTitle = function (result) {\r\n                    return extractTitleJobLite(result.originalObject);\r\n                };\r\n\r\n                scope.getDescription = function (result) {\r\n                    return result.description;\r\n                };\r\n\r\n                // check required\r\n                if (scope.fieldRequiredClass && scope.fieldRequiredClass !== '') {\r\n                    requiredClassName = scope.fieldRequiredClass;\r\n                }\r\n\r\n                // check clearSelected\r\n                if (!scope.clearSelected) {\r\n                    scope.clearSelected = false;\r\n                }\r\n\r\n                // check override suggestions\r\n                if (!scope.overrideSuggestions) {\r\n                    scope.overrideSuggestions = false;\r\n                }\r\n\r\n                // check required field\r\n                if (scope.fieldRequired && ctrl) {\r\n                    // check initial value, if given, set validitity to true\r\n                    if (scope.initialValue) {\r\n                        handleRequired(true);\r\n                    }\r\n                    else {\r\n                        handleRequired(false);\r\n                    }\r\n                }\r\n\r\n                // set strings for \"Searching...\" and \"No results\"\r\n                scope.textSearching = attrs.textSearching ? attrs.textSearching : TEXT_SEARCHING;\r\n                scope.textNoResults = attrs.textNoResults ? attrs.textNoResults : TEXT_NORESULTS;\r\n\r\n                // register events\r\n                inputField.on('keydown', keydownHandler);\r\n                inputField.on('keyup', keyupHandler);\r\n\r\n                // set response formatter\r\n                responseFormatter = callFunctionOrIdentity('remoteUrlResponseFormatter');\r\n\r\n                scope.$on('$destroy', function () {\r\n                    // take care of required validity when it gets destroyed\r\n                    handleRequired(true);\r\n                });\r\n\r\n                // set isScrollOn\r\n                $timeout(function () {\r\n                    var css = getComputedStyle(dd);\r\n                    isScrollOn = css.maxHeight && css.overflowY === 'auto';\r\n                });\r\n            }\r\n        };\r\n    }]);\r\n"]}