{"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 '
' +\r\n ' ' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n ' ' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
{{ result.title }}
' +\r\n '
' +\r\n '
{{result.description}}
' +\r\n '
' +\r\n '
' +\r\n '
'\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 '' + matches[0] + '');\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"]}