{"version":3,"file":"./modules/SearchResult.xxxxxxxx.js","mappings":"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","sources":["webpack:///../../../node_modules/rxjs/_esm5/internal/operators/pluck.js","webpack:///./modules/SearchAutoSuggestion.ts","webpack:///./modules/SearchInput.ts","webpack:///../../../node_modules/rxjs/_esm5/internal/observable/iif.js","webpack:///../../../node_modules/rxjs/_esm5/internal/observable/defer.js","webpack:///./modules/SearchResult.ts"],"sourcesContent":["/** PURE_IMPORTS_START _map PURE_IMPORTS_END */\nimport { map } from './map';\nexport function pluck() {\n var properties = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n properties[_i] = arguments[_i];\n }\n var length = properties.length;\n if (length === 0) {\n throw new Error('list of properties cannot be empty.');\n }\n return function (source) { return map(plucker(properties, length))(source); };\n}\nfunction plucker(props, length) {\n var mapper = function (x) {\n var currentProp = x;\n for (var i = 0; i < length; i++) {\n var p = currentProp[props[i]];\n if (typeof p !== 'undefined') {\n currentProp = p;\n }\n else {\n return undefined;\n }\n }\n return currentProp;\n };\n return mapper;\n}\n//# sourceMappingURL=pluck.js.map\n","import { fromEvent, from, merge, Observable } from 'rxjs';\r\nimport { debounceTime, pluck, filter, map, tap } from 'rxjs/operators';\r\nimport { getOptions, cleanString } from '../helpers/helperFunctions';\r\nimport { Optional } from '../typings/mapped-types';\r\nconst moduleSelector = '[data-module=\"SearchAutoSuggestion\"]';\r\n\r\ninterface SearchAutoSuggestionOptions {\r\n inputWrapperSelector: string;\r\n inputSelector: string;\r\n suggestionListSelector: string;\r\n formSelector: string;\r\n deleteBtnSelector: string;\r\n}\r\n\r\ninterface SearchAutoSuggestionResponseCache {\r\n [index: string]: string;\r\n}\r\n\r\nconst keyArrowUp = 38,\r\n keyArrowDown = 40,\r\n keyEnter = 13,\r\n filterTarget = ($mouseEventStream: Observable, targetTag: string) => $mouseEventStream.pipe(\r\n pluck('target'),\r\n map((target: HTMLElement) => target.closest(targetTag)),\r\n filter(suggestionItem => !!suggestionItem));\r\n\r\nexport default class SearchAutoSuggestion {\r\n private inputField: HTMLElement;\r\n private inputFieldText: HTMLInputElement;\r\n private suggestionField: HTMLElement;\r\n private form: HTMLFormElement;\r\n private deleteButton: HTMLElement;\r\n private ajaxResponseCache: SearchAutoSuggestionResponseCache = {};\r\n\r\n static setup(selector: string = moduleSelector): void {\r\n Array.from(document.querySelectorAll(selector)).filter((node: HTMLElement) => !node.dataset.moduleInitialized).forEach((element: HTMLElement) => {\r\n new SearchAutoSuggestion(element);\r\n element.dataset.moduleInitialized = 'true';\r\n });\r\n }\r\n\r\n constructor(public element: HTMLElement, private options: Optional = {}) {\r\n this.options = getOptions(this.element, Object.assign(this.getDefaultOptions(), this.options));\r\n this.inputField = this.element.querySelector(this.options.inputWrapperSelector);\r\n this.inputFieldText = this.inputField.querySelector(this.options.inputSelector);\r\n this.suggestionField = this.element.querySelector(this.options.suggestionListSelector);\r\n this.form = this.element.querySelector(this.options.formSelector) || element;\r\n this.deleteButton = this.element.querySelector(this.options.deleteBtnSelector);\r\n\r\n this.setInputEventHandler();\r\n }\r\n\r\n private setInputEventHandler(): SearchAutoSuggestion {\r\n const $input = fromEvent(this.inputFieldText, 'input').pipe(\r\n pluck('target'),\r\n debounceTime(500),\r\n filter(inputNode => (inputNode).value.length >= 3 ? true : this.hideDialog()),\r\n pluck('value'),\r\n map(cleanString)),\r\n\r\n $keyDown = fromEvent(this.inputFieldText, 'keydown').pipe(\r\n filter(({ target }) => (target).value != null)),\r\n\r\n $enterKey = $keyDown.pipe(\r\n filter((event: KeyboardEvent) => event.which === keyEnter),\r\n pluck('target', 'value')),\r\n\r\n $verticalArrowsKey = $keyDown.pipe(\r\n map(({ target, which }: KeyboardEvent) => ({ inputValue: cleanString((target).value), which })),\r\n filter(({ inputValue }) => inputValue.length >= 3),\r\n filter(({ which }) => [keyArrowUp, keyArrowDown].includes(which)),\r\n tap(({ inputValue }) => !this.isDialogVisible() && this.initSuggestion(inputValue))),\r\n\r\n $inputFieldClick = fromEvent(this.inputField, 'click').pipe(\r\n map(() => this.inputFieldText.value),\r\n filter(inputValue => inputValue.length >= 3),\r\n map(cleanString)),\r\n\r\n $deleteBtnClick = fromEvent(this.deleteButton, 'click'),\r\n\r\n $onBodyClick = fromEvent(document.body, 'click').pipe(\r\n pluck('target'),\r\n filter((target: HTMLElement) => target.closest(this.options.inputWrapperSelector) === null)),\r\n\r\n $onSuggestionFieldClick = fromEvent(this.suggestionField, 'click'),\r\n\r\n $onSearchResultHover = fromEvent(this.suggestionField, 'mouseover');\r\n\r\n // Subscriptions\r\n $input.subscribe(inputValue => this.initSuggestion(inputValue));\r\n\r\n $enterKey.subscribe((inputValue: string) => {\r\n let selectedElement = this.getSelectedElement(this.suggestionField),\r\n value = selectedElement ? selectedElement.textContent : inputValue;\r\n\r\n this.setToInputText(cleanString(value));\r\n });\r\n\r\n $verticalArrowsKey.subscribe(({ which }) => {\r\n switch (which) {\r\n case keyArrowDown:\r\n this.moveSelection(true);\r\n break;\r\n case keyArrowUp:\r\n this.moveSelection(false);\r\n break;\r\n }\r\n });\r\n\r\n $inputFieldClick.subscribe(inputValue => this.initSuggestion(inputValue));\r\n\r\n merge($deleteBtnClick, $onBodyClick).subscribe(() => this.hideDialog());\r\n\r\n filterTarget($onSuggestionFieldClick, 'li').subscribe((suggestionItem: HTMLElement) => {\r\n this.setToInputText(cleanString(suggestionItem.textContent))\r\n .submitForm();\r\n });\r\n\r\n filterTarget($onSearchResultHover, 'li').subscribe(\r\n suggestionItem =>\r\n this.removeSelection(Array.from(this.suggestionField.children))\r\n .setSelection(suggestionItem));\r\n\r\n return this;\r\n }\r\n\r\n private initSuggestion(searchTerm: string): SearchAutoSuggestion {\r\n this.clearSuggestion()\r\n .setLoader();\r\n\r\n this.isInCache(searchTerm)\r\n ? this.updateSuggestion(this.getResultsFromCache(searchTerm))\r\n : this.fetchSuggestions(searchTerm);\r\n\r\n return this;\r\n }\r\n\r\n // Cache Logic: START\r\n private isInCache(searchTerm: string): boolean {\r\n return searchTerm in this.ajaxResponseCache;\r\n }\r\n\r\n private setResultsToCache(searchTerm: string, resultsHTML: string): SearchAutoSuggestion {\r\n this.ajaxResponseCache[searchTerm] = resultsHTML;\r\n return this;\r\n }\r\n\r\n private getResultsFromCache(searchTerm: string) {\r\n return this.ajaxResponseCache[searchTerm];\r\n }\r\n // Cache Logic: END\r\n\r\n private updateSuggestion(resultsHTML: string): SearchAutoSuggestion {\r\n this.insertNodes(resultsHTML)\r\n .showDialog();\r\n\r\n return this;\r\n }\r\n\r\n private clearSuggestion(): SearchAutoSuggestion {\r\n this.suggestionField.innerHTML = \"\";\r\n return this;\r\n }\r\n\r\n private fetchSuggestions(searchTerm: string): SearchAutoSuggestion {\r\n //static AJAX usage\r\n // let ajaxUrl = window.location.protocol + \"//\" + window.location.host + \"/NiveaX/StaticPages/SearchSuggestions?q=\" + searchTerm;\r\n let ajaxUrl = window.location.protocol + \"//\" + window.location.host + \"/xajax/searchSuggestion?q=\" + searchTerm;\r\n let response = fetch(ajaxUrl, { credentials: 'include' })\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json();\r\n } else {\r\n throw new Error(`AutoSuggestion for \"${searchTerm}\" was not loaded. Response status: ${response.status}`)\r\n }\r\n });\r\n\r\n from(response)\r\n .pipe(\r\n map((data: string) => JSON.parse(data) || { Results: [] }),\r\n pluck('Results'),\r\n map(results => results.map(r => r.Name)),\r\n tap(results => results.length === 0 && this.hideDialog()),\r\n filter(results => results.length > 0))\r\n .subscribe(\r\n results => {\r\n let resultsHTML = this.createSuggestionHTML(results, searchTerm);\r\n\r\n this.setResultsToCache(searchTerm, resultsHTML)\r\n .updateSuggestion(resultsHTML);\r\n },\r\n err => {\r\n console.warn('Fetch Error', err);\r\n this.hideDialog();\r\n }\r\n );\r\n\r\n return this;\r\n }\r\n\r\n private createSuggestionHTML(results: string[], searchTerm: string): string {\r\n return results\r\n .map(res => `
  • ${res.replace(new RegExp(searchTerm, \"i\"), \"$&\")}
  • `)\r\n .join('');\r\n }\r\n\r\n private insertNodes(resultsHTML: string): SearchAutoSuggestion {\r\n this.suggestionField.innerHTML = resultsHTML;\r\n return this;\r\n }\r\n\r\n private showDialog(): SearchAutoSuggestion {\r\n this.suggestionField.classList.add('active');\r\n return this;\r\n }\r\n\r\n private hideDialog(): boolean {\r\n this.suggestionField.classList.remove('active');\r\n return false;\r\n }\r\n\r\n private isDialogVisible(): boolean {\r\n return this.suggestionField.classList.contains('active');\r\n }\r\n\r\n private setToInputText(value: string): SearchAutoSuggestion {\r\n this.inputFieldText.value = value;\r\n return this;\r\n }\r\n\r\n private setLoader(): SearchAutoSuggestion {\r\n this.suggestionField.innerHTML =\r\n `
    \r\n
    \r\n
    \r\n
    \r\n
    `;\r\n\r\n return this;\r\n }\r\n\r\n private moveSelection(toBottom: boolean): SearchAutoSuggestion {\r\n const suggestionList = this.suggestionField,\r\n suggestions = Array.from((suggestionList.children)),\r\n currentSelected = this.getSelectedElement(suggestionList),\r\n firstElement = suggestionList.firstChild,\r\n lastElement = suggestionList.lastElementChild;\r\n\r\n let nextElementToSelect;\r\n\r\n this.removeSelection(suggestions);\r\n\r\n if (toBottom) {\r\n nextElementToSelect = currentSelected ? currentSelected.nextElementSibling : firstElement;\r\n this.setSelection(nextElementToSelect || firstElement);\r\n } else {\r\n nextElementToSelect = currentSelected ? currentSelected.previousElementSibling : lastElement;\r\n this.setSelection(nextElementToSelect || lastElement);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private setSelection(element: HTMLElement): SearchAutoSuggestion {\r\n element.classList.add('selected');\r\n return this;\r\n }\r\n\r\n private removeSelection(elements: HTMLElement[]): SearchAutoSuggestion {\r\n elements.forEach(elem => elem.classList.remove('selected'));\r\n return this;\r\n }\r\n\r\n private getSelectedElement(list: HTMLElement): HTMLElement {\r\n return list.querySelector('.selected');\r\n }\r\n\r\n private submitForm(): SearchAutoSuggestion {\r\n this.form.submit();\r\n return this;\r\n }\r\n\r\n private getDefaultOptions(): Optional {\r\n return {\r\n inputWrapperSelector: '.nx-search-input__inner',\r\n inputSelector: '.nx-search-input__text',\r\n suggestionListSelector: '.nx-search__autosuggest',\r\n formSelector: '.nx-header-search-form',\r\n deleteBtnSelector: '.nx-search-input-clear__icon'\r\n };\r\n }\r\n}\r\n\r\n// Hot Module Replacement 2\r\nif (module.hot) {\r\n let nodesCache: HMRNodes[] = Array.from(document.querySelectorAll(moduleSelector)).map((element: Node) => ({ nodeToReplace: element, nodeOrigin: element.cloneNode(true) }));\r\n\r\n SearchAutoSuggestion.setup(moduleSelector);\r\n\r\n module.hot.accept(() => {\r\n SearchAutoSuggestion.setup(moduleSelector);\r\n });\r\n module.hot.dispose(() => {\r\n nodesCache.forEach(({ nodeToReplace, nodeOrigin }) => { nodeToReplace = nodeToReplace.parentElement.replaceChild(nodeOrigin.cloneNode(true), nodeToReplace) });\r\n });\r\n} else {\r\n SearchAutoSuggestion.setup(moduleSelector);\r\n}","import { focusInput } from '../helpers/helperFunctions';\r\n\r\nconst moduleSelector = '[data-module=\"SearchInput\"]';\r\n\r\nexport default class SearchInput {\r\n\r\n private searchClearIcon: HTMLElement;\r\n private searchInput: HTMLInputElement;\r\n static setup(selector: string = moduleSelector): void {\r\n Array.from(document.querySelectorAll(selector)).filter((node: HTMLElement) => !node.dataset.moduleInitialized).forEach((element: HTMLElement) => {\r\n new SearchInput(element);\r\n element.dataset.moduleInitialized = 'true';\r\n });\r\n }\r\n\r\n constructor(public element: HTMLElement) {\r\n this.searchClearIcon = this.element.querySelector('.nx-search-input-clear__icon');\r\n this.searchInput = this.element.querySelector('.nx-search-input__text');\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.searchInput.addEventListener('input', (event) => {\r\n this.checkEmpty();\r\n });\r\n\r\n this.searchClearIcon.addEventListener('click', (event: Event) => {\r\n this.clearInput();\r\n });\r\n\r\n this.setValueToInput();\r\n\r\n if (this.searchInput.value) {\r\n this.searchClearIcon.classList.add('nx-search-input-clear__icon--show');\r\n }\r\n\r\n if (this.element.closest('.nx-layer')) setTimeout(() => focusInput(this.searchInput), 0);\r\n }\r\n\r\n checkEmpty() {\r\n if (this.searchInput.value) {\r\n this.searchClearIcon.classList.add('nx-search-input-clear__icon--show');\r\n }\r\n else {\r\n this.searchClearIcon.classList.remove('nx-search-input-clear__icon--show');\r\n focusInput(this.searchInput);\r\n }\r\n }\r\n\r\n clearInput() {\r\n this.searchInput.value = '';\r\n this.checkEmpty();\r\n }\r\n\r\n setValueToInput() {\r\n var url = window.location.href;\r\n var name = this.searchInput.getAttribute(\"name\");\r\n this.searchInput.value = this.getParameterByName(name, url);\r\n }\r\n\r\n getParameterByName(name, url) {\r\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\r\n var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\r\n results = regex.exec(url);\r\n if (!results) return null;\r\n if (!results[2]) return '';\r\n\r\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n }\r\n\r\n}\r\n\r\n// Hot Module Replacement\r\nif (module.hot) {\r\n let nodesCache: HMRNodes[] = Array.from(document.querySelectorAll(moduleSelector)).map((element: Node) => ({ nodeToReplace: element, nodeOrigin: element.cloneNode(true) }));\r\n\r\n SearchInput.setup(moduleSelector);\r\n\r\n module.hot.accept(() => {\r\n SearchInput.setup(moduleSelector);\r\n });\r\n module.hot.dispose(() => {\r\n nodesCache.forEach(({ nodeToReplace, nodeOrigin }) => { nodeToReplace = nodeToReplace.parentElement.replaceChild(nodeOrigin.cloneNode(true), nodeToReplace) });\r\n });\r\n} else {\r\n SearchInput.setup(moduleSelector);\r\n}","/** PURE_IMPORTS_START _defer,_empty PURE_IMPORTS_END */\nimport { defer } from './defer';\nimport { EMPTY } from './empty';\nexport function iif(condition, trueResult, falseResult) {\n if (trueResult === void 0) {\n trueResult = EMPTY;\n }\n if (falseResult === void 0) {\n falseResult = EMPTY;\n }\n return defer(function () { return condition() ? trueResult : falseResult; });\n}\n//# sourceMappingURL=iif.js.map\n","/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */\nimport { Observable } from '../Observable';\nimport { from } from './from';\nimport { empty } from './empty';\nexport function defer(observableFactory) {\n return new Observable(function (subscriber) {\n var input;\n try {\n input = observableFactory();\n }\n catch (err) {\n subscriber.error(err);\n return undefined;\n }\n var source = input ? from(input) : empty();\n return source.subscribe(subscriber);\n });\n}\n//# sourceMappingURL=defer.js.map\n","import { fromEvent, of, Observable, merge, iif } from 'rxjs';\r\nimport { switchMap, tap, map, filter, delay } from 'rxjs/operators';\r\nimport SearchAutoSuggestion from './SearchAutoSuggestion';\r\nimport SearchInput from './SearchInput';\r\nimport { Optional } from '../typings/mapped-types';\r\nimport { getOptions, focusInput } from '../helpers/helperFunctions';\r\n// const ScrollTo = () => import(/* webpackChunkName: \"ScrollTo\" */'../ScrollTo').then(module => module.default);\r\n\r\nconst moduleSelector = '[data-module=\"SearchResult\"]';\r\n\r\ninterface SearchResultOptions {\r\n searchInputSelector: string;\r\n inputNodeSelector: string;\r\n mobileSearchButtonSelector: string;\r\n desktopSearchButtonSelector: string;\r\n mobileNavButtonSelector: string;\r\n}\r\n\r\nexport default class SearchResult {\r\n private searchInput: HTMLElement;\r\n private inputNode: HTMLInputElement;\r\n private scrollTo: ScrollTo;\r\n\r\n static setup(selector: string = moduleSelector): void {\r\n Array.from(document.querySelectorAll(selector)).filter((node: HTMLElement) => !node.dataset.moduleInitialized).forEach((element: HTMLElement) => {\r\n new SearchResult(element);\r\n element.dataset.moduleInitialized = 'true';\r\n });\r\n }\r\n\r\n constructor(public element: HTMLElement, private options: Optional = {}) {\r\n this.options = getOptions(this.element, Object.assign(this.getDefaultOptions(), this.options));\r\n this.searchInput = this.element.querySelector(this.options.searchInputSelector);\r\n this.inputNode = this.element.querySelector(this.options.inputNodeSelector);\r\n\r\n this.init();\r\n }\r\n\r\n private init(): SearchResult {\r\n this.initSearchInput()\r\n .initAutoSuggestion()\r\n .initSearchButtonsClick();\r\n\r\n return this;\r\n }\r\n\r\n private initSearchInput(): SearchResult {\r\n new SearchInput(this.searchInput);\r\n return this;\r\n }\r\n\r\n private initAutoSuggestion(): SearchResult {\r\n new SearchAutoSuggestion(this.element);\r\n return this;\r\n }\r\n\r\n private initSearchButtonsClick(): SearchResult {\r\n merge(\r\n this.getMobileNavInitStream(),\r\n this.getDesktopNavInitStream()\r\n )\r\n .subscribe((e) => {\r\n e.preventDefault();\r\n if(this.scrollTo == undefined) {\r\n const getScrollTo = () => import(/* webpackChunkName: \"ScrollTo\" */'../ScrollTo');\r\n getScrollTo().then((module) => {\r\n this.scrollTo = new module.default();\r\n this.scrollToSearchResult()\r\n .setFocusOnInputNode()\r\n });\r\n return;\r\n } \r\n this.scrollToSearchResult()\r\n .setFocusOnInputNode()\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private getMobileNavInitStream(): Observable {\r\n const getMobileSearchButton = () => document.querySelector(this.options.mobileSearchButtonSelector),\r\n closeMobileNav = () => document.querySelector(this.options.mobileNavButtonSelector).dispatchEvent(new MouseEvent('click')),\r\n\r\n $smartCompanionInit =\r\n iif(\r\n () => getMobileSearchButton() != null,\r\n of(getMobileSearchButton()),\r\n fromEvent(document, 'niveax:smartCompanionInitialized').pipe(map(getMobileSearchButton))\r\n )\r\n .pipe(\r\n filter(mobSearchBtn => !!mobSearchBtn),\r\n switchMap(mobSearchBtn => fromEvent(mobSearchBtn, 'click')\r\n .pipe(tap(e => e.preventDefault()))),\r\n tap(closeMobileNav),\r\n delay(0)\r\n );\r\n\r\n return $smartCompanionInit;\r\n }\r\n\r\n private getDesktopNavInitStream(): Observable {\r\n const getDesktopSearchButton = () => document.querySelector(this.options.desktopSearchButtonSelector),\r\n $desktopNavigationInit =\r\n iif(\r\n () => getDesktopSearchButton() != null,\r\n of(getDesktopSearchButton()),\r\n fromEvent(document, 'niveax:desktopActionIconInit').pipe(map(getDesktopSearchButton))\r\n )\r\n .pipe(\r\n filter(desktopSearchBtn => !!desktopSearchBtn),\r\n switchMap(desktopSearchBtn => fromEvent(desktopSearchBtn, 'click'))\r\n );\r\n\r\n return $desktopNavigationInit;\r\n }\r\n\r\n private scrollToSearchResult(): SearchResult {\r\n document.body.classList.add('nx-scrolling');\r\n let friction = 0.6;\r\n let duration = (document.documentElement.scrollTop || document.body.scrollTop) / 2 * friction;\r\n\r\n this.scrollTo.animateScrollTop(this.element, duration, 10, () => {\r\n document.body.classList.remove('nx-scrolling');\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private setFocusOnInputNode(): SearchResult {\r\n focusInput(this.inputNode);\r\n return this;\r\n }\r\n\r\n private getDefaultOptions(): Optional {\r\n return {\r\n searchInputSelector: '.nx-search-results__input',\r\n inputNodeSelector: '.nx-search-input__text',\r\n mobileSearchButtonSelector: '.nx-nav-action-menu__item[data-id=\"search\"]',\r\n desktopSearchButtonSelector: '[data-action-id=\"search\"]',\r\n mobileNavButtonSelector: '.nx-mob-nav__button'\r\n };\r\n }\r\n}\r\n\r\n// Hot Module Replacement\r\nif (module.hot) {\r\n let nodesCache: HMRNodes[] = Array.from(document.querySelectorAll(moduleSelector)).map((element: Node) => ({ nodeToReplace: element, nodeOrigin: element.cloneNode(true) }));\r\n\r\n SearchResult.setup(moduleSelector);\r\n\r\n module.hot.accept(() => {\r\n SearchResult.setup(moduleSelector);\r\n });\r\n module.hot.dispose(() => {\r\n nodesCache.forEach(({ nodeToReplace, nodeOrigin }) => { nodeToReplace = nodeToReplace.parentElement.replaceChild(nodeOrigin.cloneNode(true), nodeToReplace) });\r\n });\r\n} else {\r\n SearchResult.setup(moduleSelector);\r\n}"],"names":["pluck","properties","_i","arguments","length","Error","source","props","mapper","x","currentProp","i","p","plucker","moduleSelector","keyArrowUp","keyArrowDown","filterTarget","$mouseEventStream","targetTag","pipe","target","closest","suggestionItem","SearchAutoSuggestion","setup","selector","Array","from","document","querySelectorAll","filter","node","dataset","moduleInitialized","forEach","element","constructor","options","ajaxResponseCache","this","Object","assign","getDefaultOptions","inputField","querySelector","inputWrapperSelector","inputFieldText","inputSelector","suggestionField","suggestionListSelector","form","formSelector","deleteButton","deleteBtnSelector","setInputEventHandler","$input","inputNode","value","hideDialog","$keyDown","$enterKey","event","which","$verticalArrowsKey","inputValue","includes","isDialogVisible","initSuggestion","$inputFieldClick","$deleteBtnClick","$onBodyClick","body","$onSuggestionFieldClick","$onSearchResultHover","subscribe","selectedElement","getSelectedElement","textContent","setToInputText","moveSelection","submitForm","removeSelection","children","setSelection","searchTerm","clearSuggestion","setLoader","isInCache","updateSuggestion","getResultsFromCache","fetchSuggestions","setResultsToCache","resultsHTML","insertNodes","showDialog","innerHTML","ajaxUrl","window","location","protocol","host","response","fetch","credentials","then","status","json","data","JSON","parse","Results","results","map","r","Name","createSuggestionHTML","err","console","warn","res","replace","RegExp","join","classList","add","remove","contains","toBottom","suggestionList","suggestions","currentSelected","firstElement","firstChild","lastElement","lastElementChild","nextElementToSelect","nextElementSibling","previousElementSibling","elements","elem","list","submit","SearchInput","searchClearIcon","searchInput","init","addEventListener","checkEmpty","clearInput","setValueToInput","setTimeout","url","href","name","getAttribute","getParameterByName","exec","decodeURIComponent","iif","condition","trueResult","falseResult","E","observableFactory","Observable","subscriber","input","error","empty","SearchResult","searchInputSelector","inputNodeSelector","initSearchInput","initAutoSuggestion","initSearchButtonsClick","merge","getMobileNavInitStream","getDesktopNavInitStream","e","preventDefault","undefined","scrollTo","scrollToSearchResult","setFocusOnInputNode","getScrollTo","module","default","getMobileSearchButton","mobileSearchButtonSelector","of","fromEvent","mobSearchBtn","switchMap","tap","mobileNavButtonSelector","dispatchEvent","MouseEvent","delay","getDesktopSearchButton","desktopSearchButtonSelector","desktopSearchBtn","duration","documentElement","scrollTop","animateScrollTop"],"sourceRoot":""}