{"version":3,"sources":["Searchbox.min__d957946aa95219e5e0e2.js","./src/magicbox/Grammars/Basic.ts","./src/ui/Querybox/Querybox.ts","./src/magicbox/Grammar.ts","./src/ui/Omnibox/Omnibox.ts","./src/ui/SearchButton/SearchButton.ts","./src/magicbox/Expression/ExpressionEndOfInput.ts","./src/magicbox/Expression/ExpressionConstant.ts","./src/magicbox/Grammars/Field.ts","./src/magicbox/SuggestionsManager.ts","./src/magicbox/MagicBox.ts","./src/magicbox/MagicBoxUtils.ts","./src/ui/Searchbox/Searchbox.ts","./src/magicbox/Expression/ExpressionRef.ts","./src/magicbox/Result/RefResult.ts","./src/magicbox/Expression/ExpressionOptions.ts","./src/magicbox/Result/OptionResult.ts","./src/magicbox/Expression/ExpressionRegExp.ts","./src/magicbox/Expression/ExpressionFunction.ts","./src/magicbox/Expression/ExpressionList.ts","./src/magicbox/Grammars/NestedQuery.ts","./src/magicbox/Grammars/Date.ts","./src/magicbox/Grammars/QueryExtension.ts","./src/magicbox/Grammars/SubExpression.ts","./src/magicbox/InputManager.ts","./src/magicbox/QueryProcessor.ts","./src/magicbox/Grammars/Complete.ts","./src/magicbox/Grammars/Expressions.ts","./src/events/ResultPreviewsManagerEvents.ts","./src/ui/Querybox/QueryboxOptionsProcessing.ts","./src/ui/Querybox/QueryboxQueryParameters.ts","./src/magicbox/Result/Result.ts","./src/magicbox/doMagicBoxExport.ts","./src/magicbox/Grammars/Grammars.ts","./src/magicbox/ResultPreviewsManager.ts","./src/magicbox/MagicBoxClear.ts","./src/ui/Omnibox/FieldAddon.ts","./src/ui/Omnibox/OldOmniboxAddon.ts","./src/ui/Omnibox/QueryExtensionAddon.ts","./src/ui/Omnibox/QuerySuggestAddon.ts","./src/utils/SearchBoxResize.ts"],"names":["webpackJsonpCoveo__temporary","131","module","exports","__webpack_require__","Object","defineProperty","value","notWordStart","notInWord","Basic","basicExpressions","grammars","DoubleQuoted","NotDoubleQuote","SingleQuoted","NotSingleQuote","Number","Word","input","end","expression","regex","RegExp","replace","groups","match","index","result","Result","isSuccess","length","EndOfInputResult","137","__extends","this","extendStatics","setPrototypeOf","__proto__","Array","d","b","p","hasOwnProperty","__","constructor","prototype","create","element","options","bindings","Querybox","ID","HTMLInputElement","logger","error","ComponentOptions","initComponentOptions","QueryboxOptionsProcessing","postProcess","$$","toggleClass","enableQuerySyntax","magicBox","createMagicBox","Grammar","Query","Term","Spaces","inline","find","setAttribute","placeholder","l","bind","onRootElement","QueryEvents","buildingQuery","args","handleBuildingQuery","StandaloneSearchInterfaceEvents","beforeRedirect","updateQueryState","onQueryState","MODEL_EVENTS","CHANGE_ONE","QUERY_STATE_ATTRIBUTES","Q","handleQueryStateChanged","enableSearchAsYouType","addClass","onchange","searchAsYouType","onsubmit","submit","onblur","onclear","triggerQueryOnClear","usageAnalytics","logSearchEvent","analyticsActionCauseList","searchboxClear","triggerNewQuery","_this","clearSuggestion","searchboxSubmit","setText","text","clear","getText","getResult","getDisplayedResult","getCursor","resultAtCursor","Assert","exists","queryBuilder","lastQuery","QueryboxQueryParameters","addParameters","clearTimeout","searchAsYouTypeTimeout","queryController","executeQuery","logInActionsHistory","queryStateModel","set","QueryStateModel","attributesEnum","q","window","setTimeout","logSearchAsYouType","searchboxAsYouType","searchAsYouTypeDelay","doExport","exportGlobally","buildBooleanOption","defaultValue","section","buildNumberOption","min","enableWildcards","enableQuestionMarks","depend","enableLowercaseOperators","enablePartialMatch","partialMatchKeywords","partialMatchThreshold","buildStringOption","Component","Initialization","registerAutoCreateComponent","173","start","expressions","ExpressionRef","addExpressions","_","each","basicExpression","id","addExpression","Error","buildExpression","getExpression","parse","grammar","isString","buildStringExpression","isArray","ExpressionOptions","map","v","i","isRegExp","ExpressionRegExp","isFunction","ExpressionFunction","matchs","stringMatch","spliter","ref","occurrence","ExpressionConstant","ExpressionList","str","re","cloneRegExp","source","group","exec","push","190","__assign","assign","t","s","n","arguments","call","Omnibox","lastSuggestions","movedOnce","skipAutoSuggest","originalValueForQuerySyntax","omniboxAnalytics","searchInterface","getOmniboxAnalytics","suggestionAddon","enableQuerySuggestAddon","QuerySuggestAddon","VoidQuerySuggestAddon","OldOmniboxAddon","newQuery","handleNewQuery","handleBeforeRedirect","querySuccess","handleQuerySuccess","isAutoSuggestion","duringQuery","handleDuringQuery","onComponentOptions","COMPONENT_OPTIONS_ATTRIBUTES","SEARCH_BOX","updateGrammar","OmniboxEvents","querySuggestGetFocus","handleQuerySuggestGetFocus","logSearchBoxSubmitEvent","blur","getInput","querySelector","createGrammar","Expressions","Complete","enableFieldAddon","FieldAddon","fieldAlias","listOfFields","concat","keys","enableQueryExtensionAddon","QueryExtensionAddon","Any","selectableSuggestionClass","selectedSuggestionClass","suggestionTimeout","omniboxTimeout","setupMagicBox","onmove","modifyEventTo","getOmniboxAnalyticsEventCause","onfocus","onSuggestions","suggestions","Utils","isEmptyString","partialQueries","undefined","onselect","suggestion","indexOf","compact","handleAutoSuggestionWithKeyboard","handleAutoSuggestionsWithMouse","cancelAllPendingEvents","buildCustomDataForPartialQueries","getQuery","sendAllPendingEvents","ontabpress","handleTabPress","getSuggestions","handleSuggestions","modifyCustomDataOnPending","modifyQueryContentOnPending","clearSearchAsYouType","pendingEvt","getPendingSearchEvent","PendingSearchAsYouTypeSearchEvent","k","modifyCustomData","queryContent","modifyQueryContent","updateOmniboxAnalytics","ranking","findWhere","suggestionRanking","querySuggestCharacterThreshold","suggestionsEventArgs","omnibox","triggerOmniboxSuggestions","isNullOrEmptyString","trigger","populateOmniboxSuggestions","isDescendant","root","data","clone","clean","preprocessResultForQueryArgs","notQuotedValues","findAll","fieldNames","alias","toLowerCase","triggerOmniboxPreprocessResultForQuery","query","toString","omniboxPreprocessResultForQuery","clearFiltersOnNewQuery","clearFiltersIfNewQuery","origin","firstQuery","validOrigins","type","getLastQuery","BreadcrumbEvents","clearBreadcrumb","handleTabPressForSuggestions","handleTabPressForOldOmniboxAddon","logCustomEvent","domSuggestions","filter","dom","selected","findAllElementsWithClass","selectable","elements","className","reduce","total","analyticsEvent","shouldExecuteQuery","cancel","wordCompletion","getWordCompletion","currentOmniboxSuggestion","getFirstSuggestion","textSuggestion","promise","then","pendingEvent","beforeResolve","evt","modifyEventCause","forceExecuteQuery","suggestionShouldTriggerQuery","allowQueriesWithoutKeywords","isNonEmptyString","executableConfidence","StandaloneSearchInterface","omniboxFromLink","postProcessing","enableSimpleFieldAddon","buildFieldsOption","buildLocalizedStringOption","numberOfSuggestions","192","SearchButton","AccessibleButton","withElement","withOwner","withLabel","withSelectAction","handleClick","build","trim","svgMagnifierContainer","SVGIcons","icons","search","el","SVGDom","addClassToSVGInContainer","svgLoadingAnimationContainer","loading","appendChild","click","debug","updateQueryStateModelWithSearchboxQuery","searchbox","215","ExpressionEndOfInput","216","success","217","Field","FieldQuery","FieldQueryOperation","FieldQueryValue","FieldQueryNumeric","FieldSimpleQuery","FieldName","FieldOperator","FieldOperatorNumeric","FieldValue","FieldValueNumeric","FieldValueString","FieldValueList","FieldValueStringList","FieldValueSeparator","FieldValueNotQuoted","NumberRange","include","Date","218","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","done","apply","__generator","body","verb","op","f","TypeError","y","label","ops","pop","trys","g","sent","throw","return","Symbol","iterator","Direction","magicBoxContainer","inputManager","suggestionListboxID","QueryUtils","createGuid","suggestionListboxClassName","resolveRoot","defaults","suggestionClass","selectedClass","timeout","on","handleMouseOver","handleMouseOut","suggestionsProcessor","QueryProcessor","resultPreviewsManager","ResultPreviewsManager","suggestionsListbox","buildSuggestionsContainer","append","addAccessibilityProperties","appendEmptySuggestionOption","get","currentSuggestions","enumerable","configurable","findClass","hasPreviews","hasClass","target","parents","processMouseSelection","contains","targetParents","relatedTarget","isValid","relatedTargetParents","removeSelectedStatus","querySuggestLoseFocus","moveDown","_a","move","Down","moveUp","Up","moveLeft","Left","moveRight","Right","selectAndReturnKeyboardFocusedElement","keyboardFocusedElement","clearKeyboardFocusedElement","receiveSuggestions","results","status","_b","processQueries","ProcessingStatus","Overriden","updateSuggestions","clearSuggestions","empty","activeDescendant","hasSuggestions","expanded","displaySearchResultPreviewsForSuggestion","sort","a","forEach","modifyDomFromExistingSuggestion","createDomFromSuggestion","querySuggestRendered","htmlElementIsSuggestion","returnMoved","processKeyboardSelection","addSelectedStatus","updateSelectedSuggestion","focusedSuggestion","processKeyboardPreviewSelection","preview","role","ariaLabel","selectSuggestion","html","innerHTML","separator","suggestionLabel","onSelect","querySuggestSelection","found","classList","direction","firstPreview","focusedPreviewElement","moveWithinPreview","previewElements","moveWithinSuggestion","currentlySelected","selectables","currentIndex","selectQuerySuggest","removeAttribute","newFocusedPreview","getElementInDirection","previewsOwner","HTMLElement","getElementsByClassName","elem","item","updateAreaSelectedIfDefined","removeClass","getAttribute","addAccessibilityPropertiesForMagicBox","addAccessibilityPropertiesForInput","omniboxSelectables","SuggestionsManager","219","MagicBoxInstance","callback","requestAnimationFrame","isUndefined","displayedResult","inputContainer","document","createElement","InputManager","firstSuggestionWithText","addSuggestions","existingValue","getValue","setResult","suggestionsContainer","suggestionsManager","magicBoxClear","MagicBoxClear","setupHandler","toggleTabindexAndAriaHidden","setCursor","resultAt","onkeydown","key","shouldMoveInSuggestions","KEYBOARD","ENTER","ESCAPE","onchangecursor","onkeyup","UP_ARROW","DOWN_ARROW","LEFT_ARROW","RIGHT_ARROW","selectedSuggestion","focusOnSuggestion","addSelectEventHandlers","setWordCompletion","firstSuggestionText","hasFocus","focus","doMagicBoxExport","220","escapeRegExp","highlightText","highligth","ignoreCase","matchClass","doNotMatchClass","escaped","stringRegex","notmatch","escapeText","classname","escape","MagicBoxUtils","278","Searchbox","initSearchBox","initSearchButton","applyMagicBoxIcon","applyCustomHeight","div","enableOmnibox","addSearchButton","anchor","searchButton","magicBoxIcon","mainClear","height","SearchBoxResize","resize","parent","extend","488","parseOnce","parseMany","refResult","RefResult","all","getBestExpect","expect","subResult","subResults","subInput","substr","getLength","requiredOccurance","isNumber","last","endOfInput","489","lastResult","failAttempt","getExpect","path","first","initial","rest","490","parts","OptionResult","491","492","493","func","494","JSON","stringify","495","NestedQuery","NestedField","496","DateYear","DateMonth","DateDay","DateRange","DateRelative","DateRelativeTerm","DateRelativeNegative","DateRelativeNegativeRef","497","QueryExtension","QueryExtensionName","QueryExtensionArguments","QueryExtensionArgumentList","QueryExtensionArgument","QueryExtensionArgumentName","QueryExtensionArgumentValue","498","SubExpression","499","underlay","highlightContainer","ghostTextContainer","insertBefore","addAccessibilitiesProperties","isExpanded","updateInput","updateHighlight","toHtmlElement","updateWordCompletion","createTextNode","updateScroll","createTextRange","range","select","selectionStart","setSelectionRange","defer","clientWidth","scrollWidth","style","visibility","scrollLeft","scrollTop","updateScrollDefer","keydown","keyup","oncut","onInputChange","onpaste","keyCode","which","TAB","tabPress","stopPropagation","preventDefault","handleLeftRightArrow","computeCssClassNameForType","500","racePromises","promises","queries","asyncQueries","overrideIfProcessing","processedResults","accumulateResultsChronologically","buildProcessResults","Finished","waitForOverride","waitForTimeout","TimedOut","override","flatten","orderedResults","output","items","503","504","loadSubGrammar","subGrammar","expressionDef","BasicExpression","Start","ExpressionsList","Expression","OptionalSpaces","Empty","subGrammars","505","buildingResultPreviewsQuery","updateResultPreviewsManagerOptions","populateSearchResultPreviews","ResultPreviewsManagerEvents","506","owner","componentOptionsModel","ComponentOptionsModel","searchBox","processQueryOnClearVersusEmptyQuery","processQueryOnClearVersusSearchAsYouType","warn","507","queryIsBlocked","queryIsCurrentlyBlocked","Defer","allowDuplicateQuery","isEmpty","add","51","until","findParent","subResultFind","expects","groupBy","bestResults","chain","sortBy","pluck","getHumanReadableExpect","getHumanReadable","join","before","after","nextIndex","subresult","559","MagicBox","Grammars","Instance","GrammarsImportedLocally","560","ExpressionsGrammar","561","previewHeaderText","previewHeaderFieldText","previewClass","previewsProcessor","lastDisplayedSuggestion","suggestionsPreviewContainer","focusedElement","previewSelectables","firstVerticalOffset","offsetTop","firstIndexOnNextRow","findIndex","previewSelectable","externalOptions","currentDelay","isQueryForSuggestionOngoing","arePreviewsForSuggestionCurrentlyDisplayed","getExternalOptions","lastDelay","resolveAfter","isNullOrUndefined","displayAfterDuration","lastQueriedSuggestion","getSearchResultPreviewsQuery","displaySuggestionPreviews","focusedIndex","getIncrementInDirection","numberOfResultsPerRow","setHasPreviews","shouldHavePreviews","initPreviewForSuggestions","revertPreviewForSuggestions","buildPreviewContainer","previewContainerId","remove","resultPreviewsContainer","optionsEventArgs","populateEventArgs","previewsQueries","appendSearchResultPreview","position","elementDom","appendSearchResultPreviews","previews","toggle","562","clearIcon","insertAfter","hasText","tabindex","563","571","572","cache","getSuggestion","hash","getHash","hashString","hashToString","hashValueToSuggestion","values","current","fieldValues","field","simpleFieldNames","catch","fieldName","currentField","fieldValue","fieldQuery","word","INDEX","getFields","fields","getEndpoint","listFields","fieldDescriptions","fieldDescription","includeInQuery","groupByField","name","withAt","fieldNameLC","matchFields","fieldNameBeginsWithAt","listFieldValues","pattern","patternType","sortCriteria","maximumNumberOfValues","573","eventArgs","buildPopulateOmniboxEventArgs","populateOmnibox","rowsToSuggestions","rows","getCurrentQueryExpression","cursorPos","substring","getRegexToSearch","strValue","escapeRegexCharacter","getQueryExpressionBreakDown","ret","queryWords","split","searchValue","newValue","clearCurrentExpression","insertAt","at","toInsert","oldValue","slice","replaceCurrentExpression","currentQueryExpression","completeQueryExpression","allQueryExpressions","cursorPosition","closeOmnibox","row","deferred","zIndex","574","names","attributeNames","used","queryExtension","queryExtensionArgumentResults","getExtensions","extensions","extensionName","matchExtensions","extension","difference","argumentNames","argumentName","575","suggestiontHtml","highlighted","part","notMatched","matched","corrected","outerHTML","isPartialMatch","StringUtils","firstFail","every","getQuerySuggest","payload","completions","locale","searchHub","pipeline","enableWordCompletion","context","count","tab","referrer","actionsHistory","timezone","visitorId","isGuestUser","getBindings","buildingQuerySuggest","querySuggestSuccess","completion","partial","T","String","getQueryContext","historyStore","buildHistoryStore","historyFromStore","getHistory","AnalyticsInformation","clientId","667","668","size","getSearchbox","elementToResize","getElementsToResize","magicboxInput","searchboxStyle","inputChangeStyle","magicboxInputStyle","applyStyle","HtmlElement","cssText"],"mappings":"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","file":"Searchbox.min__d957946aa95219e5e0e2.js","sourcesContent":["webpackJsonpCoveo__temporary([9,10,11,79],{\n\n/***/ 131:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Result_1 = __webpack_require__(51);\nvar Result_2 = __webpack_require__(51);\nexports.notWordStart = ' ()[],$@\\'\"';\nexports.notInWord = ' ()[],:';\nexports.Basic = {\n basicExpressions: ['Word', 'DoubleQuoted'],\n grammars: {\n DoubleQuoted: '\"[NotDoubleQuote]\"',\n NotDoubleQuote: /[^\"]*/,\n SingleQuoted: \"'[NotSingleQuote]'\",\n NotSingleQuote: /[^']*/,\n Number: /-?(0|[1-9]\\d*)(\\.\\d+)?/,\n Word: function (input, end, expression) {\n var regex = new RegExp('[^' + exports.notWordStart.replace(/(.)/g, '\\\\$1') + '][^' + exports.notInWord.replace(/(.)/g, '\\\\$1') + ']*');\n var groups = input.match(regex);\n if (groups != null && groups.index != 0) {\n groups = null;\n }\n var result = new Result_1.Result(groups != null ? groups[0] : null, expression, input);\n if (result.isSuccess() && end && input.length > result.value.length) {\n return new Result_2.EndOfInputResult(result);\n }\n return result;\n }\n }\n};\n\n\n/***/ }),\n\n/***/ 137:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__webpack_require__(563);\nvar QueryEvents_1 = __webpack_require__(11);\nvar StandaloneSearchInterfaceEvents_1 = __webpack_require__(98);\nvar GlobalExports_1 = __webpack_require__(3);\nvar Grammar_1 = __webpack_require__(173);\nvar MagicBox_1 = __webpack_require__(219);\nvar Assert_1 = __webpack_require__(5);\nvar Model_1 = __webpack_require__(18);\nvar QueryStateModel_1 = __webpack_require__(13);\nvar Strings_1 = __webpack_require__(6);\nvar Dom_1 = __webpack_require__(1);\nvar AnalyticsActionListMeta_1 = __webpack_require__(10);\nvar Component_1 = __webpack_require__(7);\nvar ComponentOptions_1 = __webpack_require__(8);\nvar Initialization_1 = __webpack_require__(2);\nvar QueryboxOptionsProcessing_1 = __webpack_require__(506);\nvar QueryboxQueryParameters_1 = __webpack_require__(507);\n/**\n * The `Querybox` component renders an input which the end user can interact with to enter and submit queries.\n *\n * When the end user submits a search request, the `Querybox` component triggers a query and logs the corresponding\n * usage analytics data.\n *\n * For technical reasons, it is necessary to instantiate this component on a `div` element rather than on an `input`\n * element.\n *\n * See also the [`Searchbox`]{@link Searchbox} component, which can automatically instantiate a `Querybox` along with an\n * optional [`SearchButton`]{@link SearchButton} component.\n */\nvar Querybox = /** @class */ (function (_super) {\n __extends(Querybox, _super);\n /**\n * Creates a new `Querybox component`. Creates a new `Coveo.Magicbox` instance and wraps the Magicbox methods\n * (`onblur`, `onsubmit` etc.). Binds event on `buildingQuery` and before redirection (for standalone box).\n * @param element The HTMLElement on which to instantiate the component. This cannot be an HTMLInputElement for\n * technical reasons.\n * @param options The options for the `Querybox` component.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n */\n function Querybox(element, options, bindings) {\n var _this = _super.call(this, element, Querybox.ID, bindings) || this;\n _this.element = element;\n _this.options = options;\n _this.bindings = bindings;\n if (element instanceof HTMLInputElement) {\n _this.logger.error('Querybox cannot be used on an HTMLInputElement');\n }\n _this.options = ComponentOptions_1.ComponentOptions.initComponentOptions(element, Querybox, options);\n new QueryboxOptionsProcessing_1.QueryboxOptionsProcessing(_this).postProcess();\n Dom_1.$$(_this.element).toggleClass('coveo-query-syntax-disabled', _this.options.enableQuerySyntax == false);\n _this.magicBox = MagicBox_1.createMagicBox(element, new Grammar_1.Grammar('Query', {\n Query: '[Term*][Spaces?]',\n Term: '[Spaces?][Word]',\n Spaces: / +/,\n Word: /[^ ]+/\n }), {\n inline: true\n });\n var input = Dom_1.$$(_this.magicBox.element).find('input');\n if (input) {\n Dom_1.$$(input).setAttribute('aria-label', _this.options.placeholder || Strings_1.l('Search'));\n }\n _this.bind.onRootElement(QueryEvents_1.QueryEvents.buildingQuery, function (args) { return _this.handleBuildingQuery(args); });\n _this.bind.onRootElement(StandaloneSearchInterfaceEvents_1.StandaloneSearchInterfaceEvents.beforeRedirect, function () { return _this.updateQueryState(); });\n _this.bind.onQueryState(Model_1.MODEL_EVENTS.CHANGE_ONE, QueryStateModel_1.QUERY_STATE_ATTRIBUTES.Q, function (args) {\n return _this.handleQueryStateChanged(args);\n });\n if (_this.options.enableSearchAsYouType) {\n Dom_1.$$(_this.element).addClass('coveo-search-as-you-type');\n _this.magicBox.onchange = function () {\n _this.searchAsYouType();\n };\n }\n _this.magicBox.onsubmit = function () {\n _this.submit();\n };\n _this.magicBox.onblur = function () {\n _this.updateQueryState();\n };\n _this.magicBox.onclear = function () {\n _this.updateQueryState();\n if (_this.options.triggerQueryOnClear) {\n _this.usageAnalytics.logSearchEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.searchboxClear, {});\n _this.triggerNewQuery(false);\n }\n };\n return _this;\n }\n /**\n * Adds the current content of the input to the query and triggers a query if the current content of the input has\n * changed since last submit.\n *\n * Also logs the `serachboxSubmit` event in the usage analytics.\n */\n Querybox.prototype.submit = function () {\n this.magicBox.clearSuggestion();\n this.updateQueryState();\n this.usageAnalytics.logSearchEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.searchboxSubmit, {});\n this.triggerNewQuery(false);\n };\n /**\n * Sets the content of the input.\n *\n * @param text The string to set in the input.\n */\n Querybox.prototype.setText = function (text) {\n this.magicBox.setText(text);\n this.updateQueryState();\n };\n /**\n * Clears the content of the input.\n *\n * See also the [`triggerQueryOnClear`]{@link Querybox.options.triggerQueryOnClear} option.\n */\n Querybox.prototype.clear = function () {\n this.magicBox.clear();\n };\n /**\n * Gets the content of the input.\n *\n * @returns {string} The content of the input.\n */\n Querybox.prototype.getText = function () {\n return this.magicBox.getText();\n };\n /**\n * Gets the result from the input.\n *\n * @returns {Result} The result.\n */\n Querybox.prototype.getResult = function () {\n return this.magicBox.getResult();\n };\n /**\n * Gets the displayed result from the input.\n *\n * @returns {Result} The displayed result.\n */\n Querybox.prototype.getDisplayedResult = function () {\n return this.magicBox.getDisplayedResult();\n };\n /**\n * Gets the current cursor position in the input.\n *\n * @returns {number} The cursor position (index starts at 0).\n */\n Querybox.prototype.getCursor = function () {\n return this.magicBox.getCursor();\n };\n /**\n * Gets the result at cursor position.\n *\n * @param match {string | { (result): boolean }} The match condition.\n *\n * @returns {Result[]} The result.\n */\n Querybox.prototype.resultAtCursor = function (match) {\n return this.magicBox.resultAtCursor(match);\n };\n Querybox.prototype.handleBuildingQuery = function (args) {\n Assert_1.Assert.exists(args);\n Assert_1.Assert.exists(args.queryBuilder);\n this.updateQueryState();\n this.lastQuery = this.magicBox.getText();\n new QueryboxQueryParameters_1.QueryboxQueryParameters(this.options).addParameters(args.queryBuilder, this.lastQuery);\n };\n Querybox.prototype.triggerNewQuery = function (searchAsYouType) {\n clearTimeout(this.searchAsYouTypeTimeout);\n var text = this.magicBox.getText();\n if (this.lastQuery != text && text != null) {\n this.lastQuery = text;\n this.queryController.executeQuery({\n searchAsYouType: searchAsYouType,\n logInActionsHistory: true\n });\n }\n };\n Querybox.prototype.updateQueryState = function () {\n this.queryStateModel.set(QueryStateModel_1.QueryStateModel.attributesEnum.q, this.magicBox.getText());\n };\n Querybox.prototype.handleQueryStateChanged = function (args) {\n Assert_1.Assert.exists(args);\n var q = args.value;\n if (q != this.magicBox.getText()) {\n this.magicBox.setText(q);\n }\n };\n Querybox.prototype.searchAsYouType = function () {\n var _this = this;\n clearTimeout(this.searchAsYouTypeTimeout);\n this.searchAsYouTypeTimeout = window.setTimeout(function () {\n _this.usageAnalytics.logSearchAsYouType(AnalyticsActionListMeta_1.analyticsActionCauseList.searchboxAsYouType, {});\n _this.triggerNewQuery(true);\n }, this.options.searchAsYouTypeDelay);\n };\n Querybox.ID = 'Querybox';\n Querybox.doExport = function () {\n GlobalExports_1.exportGlobally({\n Querybox: Querybox,\n QueryboxQueryParameters: QueryboxQueryParameters_1.QueryboxQueryParameters\n });\n };\n /**\n * The options for the Querybox.\n * @componentOptions\n */\n Querybox.options = {\n /**\n * Whether to enable the search-as-you-type feature.\n *\n * **Note:** Enabling this feature can consume lots of queries per month (QPM), especially if the [`searchAsYouTypeDelay`]{@link Querybox.options.searchAsYouTypeDelay} option is set to a low value.\n *\n * Default value is `false`.\n */\n enableSearchAsYouType: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false, section: 'Advanced Options' }),\n /**\n * If the [`enableSearchAsYouType`]{@link Querybox.options.enableSearchAsYouType} option is `true`, specifies how\n * long to wait (in milliseconds) between each key press before triggering a new query.\n *\n * Default value is `50`. Minimum value is `0`\n */\n searchAsYouTypeDelay: ComponentOptions_1.ComponentOptions.buildNumberOption({ defaultValue: 50, min: 0, section: 'Advanced Options' }),\n /**\n * Specifies whether to interpret special query syntax (e.g., `@objecttype=message`) when the end user types\n * a query in the `Querybox` (see\n * [Coveo Query Syntax Reference](https://docs.coveo.com/en/1552/searching-with-coveo/coveo-cloud-query-syntax)). Setting this\n * option to `true` also causes the `Querybox` to highlight any query syntax.\n *\n * Regardless of the value of this option, the Coveo Cloud REST Search API always interprets expressions surrounded\n * by double quotes (`\"`) as exact phrase match requests.\n *\n * See also [`enableLowercaseOperators`]{@link Querybox.options.enableLowercaseOperators}.\n *\n * **Notes:**\n * > * End user preferences can override the value you specify for this option.\n * >\n * > If the end user selects a value other than **Automatic** for the **Enable query syntax** setting (see\n * > the [`enableQuerySyntax`]{@link ResultsPreferences.options.enableQuerySyntax} option of the\n * > [`ResultsPreferences`]{@link ResultsPreferences} component), the end user preference takes precedence over this\n * > option.\n * >\n * > * On-premises versions of the Coveo Search API require this option to be set to `true` in order to interpret\n * > expressions surrounded by double quotes (`\"`) as exact phrase match requests.\n *\n * Default value is `false`.\n */\n enableQuerySyntax: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false, section: 'Advanced Options' }),\n /**\n * Specifies whether to expand basic expression keywords containing wildcards characters (`*`) to the possible\n * matching keywords in order to broaden the query (see\n * [Using Wildcards in Queries](https://docs.coveo.com/en/1580/)).\n *\n * See also [`enableQuestionMarks`]{@link Querybox.options.enableQuestionMarks}.\n *\n * **Note:**\n * > If you are using an on-premises version of the Coveo Search API, you need to set the\n * > [`enableQuerySyntax`]{@link Querybox.options.enableQuerySyntax} option to `true` to be able to set\n * > `enableWildcards` to `true`.\n *\n * Default value is `false`.\n */\n enableWildcards: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false, section: 'Advanced Options' }),\n /**\n * If [`enableWildcards`]{@link Querybox.options.enableWildcards} is `true`, specifies whether to expand basic\n * expression keywords containing question mark characters (`?`) to the possible matching keywords in order to\n * broaden the query (see\n * [Using Wildcards in Queries](https://docs.coveo.com/en/1580/)).\n *\n * **Note:**\n * > If you are using an on-premises version of the Coveo Search API, you also need to set the\n * > [`enableQuerySyntax`]{@link Querybox.options.enableQuerySyntax} option to `true` in order to be able to set\n * > `enableQuestionMarks` to `true`.\n *\n * Default value is `false`.\n */\n enableQuestionMarks: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false, depend: 'enableWildcards' }),\n /**\n * If the [`enableQuerySyntax`]{@link Querybox.options.enableQuerySyntax} option is `true`, specifies whether to\n * interpret the `AND`, `NOT`, `OR`, and `NEAR` keywords in the `Querybox` as query operators in the query, even if\n * the end user types those keywords in lowercase.\n *\n * This option applies to all query operators (see\n * [Coveo Query Syntax Reference](https://docs.coveo.com/en/1552/searching-with-coveo/coveo-cloud-query-syntax)).\n *\n * **Example:**\n * > If this option and the `enableQuerySyntax` option are both `true`, the Coveo Platform interprets the `near`\n * > keyword in a query such as `service center near me` as the `NEAR` query operator (not as a query term).\n *\n * > Otherwise, if the `enableQuerySyntax` option is `true` and this option is `false`, the end user has to type the\n * > `NEAR` keyword in uppercase for the Coveo Platform to interpret it as a query operator.\n *\n * Default value is `false`.\n */\n enableLowercaseOperators: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false, depend: 'enableQuerySyntax' }),\n /**\n * Whether to convert a basic expression containing at least a certain number of keywords (see the\n * [`partialMatchKeywords`]{@link Querybox.options.partialMatchKeywords} option) to *partial match expression*, so\n * that items containing at least a certain number of those keywords (see the\n * [`partialMatchThreshold`]{@link Querybox.options.partialMatchThreshold} option) will match the expression.\n *\n * **Notes:**\n * - Only the basic expression of the query (see [`q`]{@link q}) can be converted to a partial match expression.\n * - When the [`enableQuerySyntax`]{@link Querybox.options.enableQuerySyntax} option is set to `true`, this feature has no effect if the basic expression contains advanced query syntax (field expressions, operators, etc.).\n *\n * @notSupportedIn salesforcefree\n */\n enablePartialMatch: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false }),\n /**\n * The minimum number of keywords that need to be present in the basic expression to convert it to a partial match expression.\n *\n * See also the [`partialMatchThreshold`]{@link Querybox.options.partialMatchThreshold} option.\n *\n * **Notes:**\n *\n * - Repeated keywords count as a single keyword.\n * - Thesaurus expansions count towards the `partialMatchKeywords` count.\n * - Stemming expansions **do not** count towards the `partialMatchKeywords` count.\n *\n * @notSupportedIn salesforcefree\n */\n partialMatchKeywords: ComponentOptions_1.ComponentOptions.buildNumberOption({ defaultValue: 5, min: 1, depend: 'enablePartialMatch' }),\n /**\n * An absolute or relative value indicating the minimum number of partial match expression keywords an item must contain to match the expression.\n *\n * See also the [`partialMatchKeywords`]{@link Querybox.options.partialMatchKeywords} option.\n *\n * **Notes:**\n * - A keyword and its stemming expansions count as a single keyword when evaluating whether an item meets the `partialMatchThreshold`.\n * - When a relative `partialMatchThreshold` does not yield a whole integer, the fractional part is truncated (e.g., `3.6` becomes `3`).\n *\n * @notSupportedIn salesforcefree\n */\n partialMatchThreshold: ComponentOptions_1.ComponentOptions.buildStringOption({ defaultValue: '50%', depend: 'enablePartialMatch' }),\n /**\n * Whether to trigger a query when clearing the `Querybox`.\n *\n * Default value is `false`.\n */\n triggerQueryOnClear: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false })\n };\n return Querybox;\n}(Component_1.Component));\nexports.Querybox = Querybox;\nInitialization_1.Initialization.registerAutoCreateComponent(Querybox);\n\n\n/***/ }),\n\n/***/ 173:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ExpressionRef_1 = __webpack_require__(488);\nvar ExpressionOptions_1 = __webpack_require__(490);\nvar ExpressionRegExp_1 = __webpack_require__(492);\nvar _ = __webpack_require__(0);\nvar ExpressionFunction_1 = __webpack_require__(493);\nvar ExpressionConstant_1 = __webpack_require__(216);\nvar ExpressionList_1 = __webpack_require__(494);\nvar Grammar = /** @class */ (function () {\n function Grammar(start, expressions) {\n if (expressions === void 0) { expressions = {}; }\n this.expressions = {};\n this.start = new ExpressionRef_1.ExpressionRef(start, null, 'start', this);\n this.addExpressions(expressions);\n }\n Grammar.prototype.addExpressions = function (expressions) {\n var _this = this;\n _.each(expressions, function (basicExpression, id) {\n _this.addExpression(id, basicExpression);\n });\n };\n Grammar.prototype.addExpression = function (id, basicExpression) {\n if (id in this.expressions) {\n throw new Error('Grammar already contain the id:' + id);\n }\n this.expressions[id] = Grammar.buildExpression(basicExpression, id, this);\n };\n Grammar.prototype.getExpression = function (id) {\n return this.expressions[id];\n };\n Grammar.prototype.parse = function (value) {\n return this.start.parse(value, true);\n };\n Grammar.buildExpression = function (value, id, grammar) {\n var type = typeof value;\n if (type == 'undefined') {\n throw new Error('Invalid Expression: ' + value);\n }\n if (_.isString(value)) {\n return this.buildStringExpression(value, id, grammar);\n }\n if (_.isArray(value)) {\n return new ExpressionOptions_1.ExpressionOptions(_.map(value, function (v, i) { return new ExpressionRef_1.ExpressionRef(v, null, id + '_' + i, grammar); }), id);\n }\n if (_.isRegExp(value)) {\n return new ExpressionRegExp_1.ExpressionRegExp(value, id, grammar);\n }\n if (_.isFunction(value)) {\n return new ExpressionFunction_1.ExpressionFunction(value, id, grammar);\n }\n throw new Error('Invalid Expression: ' + value);\n };\n Grammar.buildStringExpression = function (value, id, grammar) {\n var matchs = Grammar.stringMatch(value, Grammar.spliter);\n var expressions = _.map(matchs, function (match, i) {\n if (match[1]) {\n // Ref\n var ref = match[1];\n var occurrence = match[3] ? Number(match[3]) : match[2] || null;\n return new ExpressionRef_1.ExpressionRef(ref, occurrence, id + '_' + i, grammar);\n }\n else {\n // Constant\n return new ExpressionConstant_1.ExpressionConstant(match[4], id + '_' + i);\n }\n });\n if (expressions.length == 1) {\n var expression = expressions[0];\n expression.id = id;\n return expression;\n }\n else {\n return new ExpressionList_1.ExpressionList(expressions, id);\n }\n };\n Grammar.stringMatch = function (str, re) {\n var groups = [];\n var cloneRegExp = new RegExp(re.source, 'g');\n var group = cloneRegExp.exec(str);\n while (group !== null) {\n groups.push(group);\n group = cloneRegExp.exec(str);\n }\n return groups;\n };\n Grammar.spliter = /\\[(\\w+)(\\*|\\+|\\?|\\{([1-9][0-9]*)\\})?\\]|(.[^\\[]*)/;\n return Grammar;\n}());\nexports.Grammar = Grammar;\n\n\n/***/ }),\n\n/***/ 190:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n///\n///\n///\n///\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__webpack_require__(571);\nvar _ = __webpack_require__(0);\nvar underscore_1 = __webpack_require__(0);\nvar BreadcrumbEvents_1 = __webpack_require__(35);\nvar OmniboxEvents_1 = __webpack_require__(34);\nvar QueryEvents_1 = __webpack_require__(11);\nvar StandaloneSearchInterfaceEvents_1 = __webpack_require__(98);\nvar GlobalExports_1 = __webpack_require__(3);\nvar Grammar_1 = __webpack_require__(173);\nvar Complete_1 = __webpack_require__(503);\nvar Expressions_1 = __webpack_require__(504);\nvar MagicBox_1 = __webpack_require__(219);\nvar Assert_1 = __webpack_require__(5);\nvar ComponentOptionsModel_1 = __webpack_require__(28);\nvar Model_1 = __webpack_require__(18);\nvar QueryStateModel_1 = __webpack_require__(13);\nvar Strings_1 = __webpack_require__(6);\nvar Dom_1 = __webpack_require__(1);\nvar Utils_1 = __webpack_require__(4);\nvar AnalyticsActionListMeta_1 = __webpack_require__(10);\nvar PendingSearchAsYouTypeSearchEvent_1 = __webpack_require__(126);\nvar SharedAnalyticsCalls_1 = __webpack_require__(124);\nvar Component_1 = __webpack_require__(7);\nvar ComponentOptions_1 = __webpack_require__(8);\nvar Initialization_1 = __webpack_require__(2);\nvar Querybox_1 = __webpack_require__(137);\nvar QueryboxOptionsProcessing_1 = __webpack_require__(506);\nvar QueryboxQueryParameters_1 = __webpack_require__(507);\nvar SearchInterface_1 = __webpack_require__(19);\nvar FieldAddon_1 = __webpack_require__(572);\nvar OldOmniboxAddon_1 = __webpack_require__(573);\nvar QueryExtensionAddon_1 = __webpack_require__(574);\nvar QuerySuggestAddon_1 = __webpack_require__(575);\nvar MINIMUM_EXECUTABLE_CONFIDENCE = 0.8;\n/**\n * The `Omnibox` component extends the [`Querybox`]{@link Querybox}, and thus provides the same basic options and\n * behaviors. Furthermore, the `Omnibox` adds a type-ahead capability to the search input.\n *\n * You can configure the type-ahead feature by enabling or disabling certain addons, which the Coveo JavaScript Search\n * Framework provides out-of-the-box (see the [`enableFieldAddon`]{@link Omnibox.options.enableFieldAddon},\n * [`enableQueryExtension`]{@link Omnibox.options.enableQueryExtensionAddon}, and\n * [`enableQuerySuggestAddon`]{@link Omnibox.options.enableQuerySuggestAddon} options).\n *\n * Custom components and external code can also extend or customize the type-ahead feature and the query completion\n * suggestions it provides by attaching their own handlers to the\n * [`populateOmniboxSuggestions`]{@link OmniboxEvents.populateOmniboxSuggestions} event.\n *\n * See also the [`Searchbox`]{@link Searchbox} component, which can automatically instantiate an `Omnibox` along with an\n * optional {@link SearchButton}.\n */\nvar Omnibox = /** @class */ (function (_super) {\n __extends(Omnibox, _super);\n /**\n * Creates a new Omnibox component. Also enables necessary addons and binds events on various query events.\n * @param element The HTMLElement on which to instantiate the component.\n * @param options The options for the Omnibox component.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n */\n function Omnibox(element, options, bindings) {\n var _this = _super.call(this, element, Omnibox.ID, bindings) || this;\n _this.element = element;\n _this.options = options;\n _this.lastSuggestions = [];\n _this.movedOnce = false;\n _this.skipAutoSuggest = false;\n _this.options = ComponentOptions_1.ComponentOptions.initComponentOptions(element, Omnibox, options);\n var originalValueForQuerySyntax = _this.options.enableQuerySyntax;\n new QueryboxOptionsProcessing_1.QueryboxOptionsProcessing(_this).postProcess();\n _this.omniboxAnalytics = _this.searchInterface.getOmniboxAnalytics();\n Dom_1.$$(_this.element).toggleClass('coveo-query-syntax-disabled', _this.options.enableQuerySyntax == false);\n _this.suggestionAddon = _this.options.enableQuerySuggestAddon ? new QuerySuggestAddon_1.QuerySuggestAddon(_this) : new QuerySuggestAddon_1.VoidQuerySuggestAddon();\n new OldOmniboxAddon_1.OldOmniboxAddon(_this);\n _this.createMagicBox();\n _this.bind.onRootElement(QueryEvents_1.QueryEvents.newQuery, function (args) { return _this.handleNewQuery(args); });\n _this.bind.onRootElement(QueryEvents_1.QueryEvents.buildingQuery, function (args) { return _this.handleBuildingQuery(args); });\n _this.bind.onRootElement(StandaloneSearchInterfaceEvents_1.StandaloneSearchInterfaceEvents.beforeRedirect, function () { return _this.handleBeforeRedirect(); });\n _this.bind.onRootElement(QueryEvents_1.QueryEvents.querySuccess, function () { return _this.handleQuerySuccess(); });\n _this.bind.onQueryState(Model_1.MODEL_EVENTS.CHANGE_ONE, QueryStateModel_1.QUERY_STATE_ATTRIBUTES.Q, function (args) {\n return _this.handleQueryStateChanged(args);\n });\n if (_this.isAutoSuggestion()) {\n _this.bind.onRootElement(QueryEvents_1.QueryEvents.duringQuery, function (args) { return _this.handleDuringQuery(args); });\n }\n _this.bind.onComponentOptions(Model_1.MODEL_EVENTS.CHANGE_ONE, ComponentOptionsModel_1.COMPONENT_OPTIONS_ATTRIBUTES.SEARCH_BOX, function (args) {\n if (args.value.enableQuerySyntax != null) {\n _this.options.enableQuerySyntax = args.value.enableQuerySyntax;\n }\n else {\n _this.options.enableQuerySyntax = originalValueForQuerySyntax;\n }\n _this.updateGrammar();\n });\n _this.bind.onRootElement(OmniboxEvents_1.OmniboxEvents.querySuggestGetFocus, function (args) { return _this.handleQuerySuggestGetFocus(args); });\n return _this;\n }\n /**\n * Adds the current content of the input to the query and triggers a query if the current content of the input has\n * changed since last submit.\n *\n * Also logs a `searchboxSubmit` event in the usage analytics.\n */\n Omnibox.prototype.submit = function () {\n var _this = this;\n this.magicBox.clearSuggestion();\n this.updateQueryState();\n this.triggerNewQuery(false, function () {\n SharedAnalyticsCalls_1.logSearchBoxSubmitEvent(_this.usageAnalytics);\n });\n this.magicBox.blur();\n };\n /**\n * Gets the current content of the input.\n * @returns {string} The current content of the input.\n */\n Omnibox.prototype.getText = function () {\n return this.magicBox.getText();\n };\n /**\n * Sets the content of the input\n * @param text The string to set in the input.\n */\n Omnibox.prototype.setText = function (text) {\n this.magicBox.setText(text);\n this.updateQueryState();\n };\n /**\n * Clears the content of the input.\n */\n Omnibox.prototype.clear = function () {\n this.magicBox.clear();\n };\n /**\n * Gets the `HTMLInputElement` of the Omnibox.\n */\n Omnibox.prototype.getInput = function () {\n return this.magicBox.element.querySelector('input');\n };\n Omnibox.prototype.getResult = function () {\n return this.magicBox.getResult();\n };\n Omnibox.prototype.getDisplayedResult = function () {\n return this.magicBox.getDisplayedResult();\n };\n Omnibox.prototype.getCursor = function () {\n return this.magicBox.getCursor();\n };\n Omnibox.prototype.resultAtCursor = function (match) {\n return this.magicBox.resultAtCursor(match);\n };\n Omnibox.prototype.createGrammar = function () {\n var grammar = null;\n if (this.options.enableQuerySyntax) {\n grammar = Expressions_1.Expressions(Complete_1.Complete);\n if (this.options.enableFieldAddon) {\n new FieldAddon_1.FieldAddon(this);\n }\n if (this.options.fieldAlias != null) {\n this.options.listOfFields = this.options.listOfFields || [];\n this.options.listOfFields = this.options.listOfFields.concat(_.keys(this.options.fieldAlias));\n }\n if (this.options.enableQueryExtensionAddon) {\n new QueryExtensionAddon_1.QueryExtensionAddon(this);\n }\n }\n else {\n grammar = { start: 'Any', expressions: { Any: /.*/ } };\n }\n if (this.options.grammar != null) {\n grammar = this.options.grammar(grammar);\n }\n return grammar;\n };\n Omnibox.prototype.updateGrammar = function () {\n var grammar = this.createGrammar();\n this.magicBox.grammar = new Grammar_1.Grammar(grammar.start, grammar.expressions);\n this.magicBox.setText(this.magicBox.getText());\n };\n Omnibox.prototype.createMagicBox = function () {\n var grammar = this.createGrammar();\n this.magicBox = MagicBox_1.createMagicBox(this.element, new Grammar_1.Grammar(grammar.start, grammar.expressions), {\n inline: this.options.inline,\n selectableSuggestionClass: 'coveo-omnibox-selectable',\n selectedSuggestionClass: 'coveo-omnibox-selected',\n suggestionTimeout: this.options.omniboxTimeout\n });\n var input = Dom_1.$$(this.magicBox.element).find('input');\n if (input) {\n Dom_1.$$(input).setAttribute('aria-label', Strings_1.l('Search'));\n }\n this.setupMagicBox();\n };\n Omnibox.prototype.setupMagicBox = function () {\n var _this = this;\n this.magicBox.onmove = function () {\n // We assume that once the user has moved its selection, it becomes an explicit omnibox analytics event\n if (_this.isAutoSuggestion()) {\n _this.modifyEventTo = _this.getOmniboxAnalyticsEventCause();\n }\n _this.movedOnce = true;\n };\n this.magicBox.onfocus = function () {\n if (_this.isAutoSuggestion()) {\n // This flag is used to block the automatic query when the UI is loaded with a query (#q=foo)\n // and then the input is focused. We want to block that query, even if it match the suggestion\n // Only when there is an actual change in the input (user typing something) is when we want the automatic query to kick in\n _this.skipAutoSuggest = true;\n }\n };\n this.magicBox.onSuggestions = function (suggestions) {\n // If text is empty, this can mean that user selected text from the search box\n // and hit \"delete\" : Reset the partial queries in this case\n if (Utils_1.Utils.isEmptyString(_this.getText())) {\n _this.omniboxAnalytics.partialQueries = [];\n }\n _this.movedOnce = false;\n _this.lastSuggestions = suggestions;\n if (_this.isAutoSuggestion() && !_this.skipAutoSuggest) {\n _this.searchAsYouType();\n }\n };\n if (this.options.enableSearchAsYouType) {\n Dom_1.$$(this.element).addClass('coveo-magicbox-search-as-you-type');\n }\n this.magicBox.onchange = function () {\n _this.skipAutoSuggest = false;\n var text = _this.getText();\n if (text != undefined && text != '') {\n if (_this.isAutoSuggestion()) {\n if (_this.movedOnce) {\n _this.searchAsYouType(true);\n }\n }\n else if (_this.options.enableSearchAsYouType) {\n _this.searchAsYouType(true);\n }\n }\n else {\n _this.clear();\n }\n };\n if (this.options.placeholder) {\n this.magicBox.element.querySelector('input').placeholder = this.options.placeholder;\n }\n this.magicBox.onsubmit = function () { return _this.submit(); };\n this.magicBox.onselect = function (suggestion) {\n var index = _.indexOf(_this.lastSuggestions, suggestion);\n var suggestions = _.compact(_.map(_this.lastSuggestions, function (suggestion) { return suggestion.text; }));\n _this.magicBox.clearSuggestion();\n _this.updateQueryState();\n // A bit tricky here : When it's machine learning auto suggestions\n // the mouse selection and keyboard selection acts differently :\n // keyboard selection will automatically do the query (which will log a search as you type event -> further modified by this.modifyEventTo if needed)\n // mouse selection will not \"auto\" send the query.\n // the movedOnce variable detect the keyboard movement, and is used to differentiate mouse vs keyboard\n if (!_this.isAutoSuggestion()) {\n _this.usageAnalytics.cancelAllPendingEvents();\n _this.triggerNewQuery(false, function () {\n _this.usageAnalytics.logSearchEvent(_this.getOmniboxAnalyticsEventCause(), _this.buildCustomDataForPartialQueries(index, suggestions));\n });\n }\n else if (_this.isAutoSuggestion() && _this.movedOnce) {\n _this.handleAutoSuggestionWithKeyboard(index, suggestions);\n }\n else if (_this.isAutoSuggestion() && !_this.movedOnce) {\n _this.handleAutoSuggestionsWithMouse(index, suggestions);\n }\n // Consider a selection like a reset of the partial queries (it's the end of a suggestion pattern)\n if (_this.isAutoSuggestion()) {\n _this.omniboxAnalytics.partialQueries = [];\n }\n };\n this.magicBox.onblur = function () {\n if (_this.isAutoSuggestion()) {\n _this.setText(_this.getQuery(true));\n _this.usageAnalytics.sendAllPendingEvents();\n }\n };\n this.magicBox.onclear = function () {\n _this.updateQueryState();\n if (_this.options.triggerQueryOnClear || _this.options.enableSearchAsYouType) {\n _this.triggerNewQuery(false, function () {\n _this.usageAnalytics.logSearchEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.searchboxClear, {});\n });\n }\n };\n this.magicBox.ontabpress = function () {\n _this.handleTabPress();\n };\n this.magicBox.getSuggestions = function () { return _this.handleSuggestions(); };\n };\n Omnibox.prototype.handleAutoSuggestionWithKeyboard = function (index, suggestions) {\n var _this = this;\n if (this.searchAsYouTypeTimeout) {\n // Here, there is currently a search as you typed queued up :\n // Think : user typed very quickly, then very quickly selected a suggestion (without waiting for the search as you type)\n // Cancel the search as you type query, then immediately do the query with the selection (+analytics event with the selection)\n this.usageAnalytics.cancelAllPendingEvents();\n clearTimeout(this.searchAsYouTypeTimeout);\n this.searchAsYouTypeTimeout = undefined;\n this.triggerNewQuery(false, function () {\n _this.usageAnalytics.logSearchEvent(_this.getOmniboxAnalyticsEventCause(), _this.buildCustomDataForPartialQueries(index, suggestions));\n });\n }\n else {\n // Here, the search as you type query has returned, but the analytics event has not ye been sent.\n // Think : user typed slowly, the query returned, and then the user selected a suggestion.\n // Since the analytics event has not yet been sent (search as you type event have a 5 sec delay)\n // modify the pending event, then send the newly modified analytics event immediately.\n this.modifyEventTo = this.getOmniboxAnalyticsEventCause();\n this.modifyCustomDataOnPending(index, suggestions);\n this.modifyQueryContentOnPending();\n this.usageAnalytics.sendAllPendingEvents();\n }\n };\n Omnibox.prototype.handleAutoSuggestionsWithMouse = function (index, suggestions) {\n var _this = this;\n if (this.searchAsYouTypeTimeout || index != 0) {\n // Here : the user either very quickly chose the first suggestion, and the search as you type is still queued up.\n // OR\n // the user chose something different then the first suggestion.\n // Remove the search as you type if it's there, and do the query with the suggestion directly.\n this.clearSearchAsYouType();\n this.usageAnalytics.cancelAllPendingEvents();\n this.triggerNewQuery(false, function () {\n _this.usageAnalytics.logSearchEvent(_this.getOmniboxAnalyticsEventCause(), _this.buildCustomDataForPartialQueries(index, suggestions));\n });\n }\n else {\n // Here : the user either very slowly chose a suggestion, and there is no search as you typed queued up\n // AND\n // the user chose the first suggestion.\n // this means the query is already returned, but the analytics event is still queued up.\n // modify the analytics event, and send it.\n this.modifyEventTo = this.getOmniboxAnalyticsEventCause();\n this.modifyCustomDataOnPending(index, suggestions);\n this.modifyQueryContentOnPending();\n this.usageAnalytics.sendAllPendingEvents();\n // This should happen if :\n // users did a (short) query first, which does not match the first suggestion. (eg: typed \"t\", then search)\n // then, refocus the search box. The same suggestion(s) will re-appear.\n // By selecting the first one with the mouse, we need to retrigger a query because this means the search as you type could not\n // kick in and do the query automatically.\n if (this.lastQuery != this.getText()) {\n this.triggerNewQuery(false, function () {\n _this.usageAnalytics.logSearchEvent(_this.getOmniboxAnalyticsEventCause(), _this.buildCustomDataForPartialQueries(index, suggestions));\n });\n }\n }\n };\n Omnibox.prototype.modifyCustomDataOnPending = function (index, suggestions) {\n var pendingEvt = this.usageAnalytics.getPendingSearchEvent();\n if (pendingEvt instanceof PendingSearchAsYouTypeSearchEvent_1.PendingSearchAsYouTypeSearchEvent) {\n var newCustomData_1 = this.buildCustomDataForPartialQueries(index, suggestions);\n _.each(_.keys(newCustomData_1), function (k) {\n pendingEvt.modifyCustomData(k, newCustomData_1[k]);\n });\n }\n };\n Omnibox.prototype.modifyQueryContentOnPending = function () {\n var pendingEvt = this.usageAnalytics.getPendingSearchEvent();\n if (pendingEvt instanceof PendingSearchAsYouTypeSearchEvent_1.PendingSearchAsYouTypeSearchEvent) {\n var queryContent = this.getQuery(this.options.enableSearchAsYouType);\n pendingEvt.modifyQueryContent(queryContent);\n }\n };\n Omnibox.prototype.buildCustomDataForPartialQueries = function (index, suggestions) {\n this.updateOmniboxAnalytics(suggestions, index);\n return this.omniboxAnalytics.buildCustomDataForPartialQueries();\n };\n Omnibox.prototype.handleQuerySuggestGetFocus = function (_a) {\n var suggestion = _a.suggestion;\n var suggestions = _.compact(_.map(this.lastSuggestions, function (suggestion) { return suggestion.text; }));\n var ranking = this.lastSuggestions.indexOf(underscore_1.findWhere(this.lastSuggestions, { text: suggestion }));\n this.updateOmniboxAnalytics(suggestions, ranking);\n };\n Omnibox.prototype.updateOmniboxAnalytics = function (suggestions, suggestionRanking) {\n this.omniboxAnalytics.suggestions = suggestions;\n this.omniboxAnalytics.suggestionRanking = suggestionRanking;\n };\n Omnibox.prototype.handleSuggestions = function () {\n var text = this.getText();\n if (this.options.querySuggestCharacterThreshold <= text.length) {\n var suggestionsEventArgs = {\n suggestions: [],\n omnibox: this\n };\n this.triggerOmniboxSuggestions(suggestionsEventArgs);\n if (!Utils_1.Utils.isNullOrEmptyString(text)) {\n this.omniboxAnalytics.partialQueries.push(text);\n }\n return _.compact(suggestionsEventArgs.suggestions);\n }\n else {\n return [];\n }\n };\n Omnibox.prototype.triggerOmniboxSuggestions = function (args) {\n this.bind.trigger(this.element, OmniboxEvents_1.OmniboxEvents.populateOmniboxSuggestions, args);\n if (!Dom_1.$$(this.element).isDescendant(this.root)) {\n this.bind.trigger(this.root, OmniboxEvents_1.OmniboxEvents.populateOmniboxSuggestions, args);\n }\n };\n Omnibox.prototype.handleBeforeRedirect = function () {\n this.updateQueryState();\n };\n Omnibox.prototype.handleBuildingQuery = function (data) {\n var _this = this;\n Assert_1.Assert.exists(data);\n Assert_1.Assert.exists(data.queryBuilder);\n this.updateQueryState();\n this.lastQuery = this.getQuery(data.searchAsYouType);\n var result = this.lastQuery == this.magicBox.getDisplayedResult().input\n ? this.magicBox.getDisplayedResult().clone()\n : this.magicBox.grammar.parse(this.lastQuery).clean();\n var preprocessResultForQueryArgs = {\n result: result\n };\n if (this.options.enableQuerySyntax) {\n var notQuotedValues = preprocessResultForQueryArgs.result.findAll('FieldValueNotQuoted');\n _.each(notQuotedValues, function (value) { return (value.value = '\"' + value.value.replace(/\"|\\u00A0/g, ' ') + '\"'); });\n if (this.options.fieldAlias) {\n var fieldNames = preprocessResultForQueryArgs.result.findAll(function (result) { return result.expression.id == 'FieldName' && result.isSuccess(); });\n _.each(fieldNames, function (result) {\n var alias = _.find(_.keys(_this.options.fieldAlias), function (alias) { return alias.toLowerCase() == result.value.toLowerCase(); });\n if (alias != null) {\n result.value = _this.options.fieldAlias[alias];\n }\n });\n }\n }\n this.triggerOmniboxPreprocessResultForQuery(preprocessResultForQueryArgs);\n var query = preprocessResultForQueryArgs.result.toString();\n new QueryboxQueryParameters_1.QueryboxQueryParameters(this.options).addParameters(data.queryBuilder, query);\n };\n Omnibox.prototype.triggerOmniboxPreprocessResultForQuery = function (args) {\n this.bind.trigger(this.element, OmniboxEvents_1.OmniboxEvents.omniboxPreprocessResultForQuery, args);\n if (!Dom_1.$$(this.element).isDescendant(this.root)) {\n this.bind.trigger(this.root, OmniboxEvents_1.OmniboxEvents.omniboxPreprocessResultForQuery, args);\n }\n };\n Omnibox.prototype.handleNewQuery = function (data) {\n Assert_1.Assert.exists(data);\n this.options.clearFiltersOnNewQuery && this.clearFiltersIfNewQuery(data);\n };\n Omnibox.prototype.clearFiltersIfNewQuery = function (_a) {\n var origin = _a.origin, searchAsYouType = _a.searchAsYouType;\n if (this.queryController.firstQuery) {\n return;\n }\n // Prevent queries triggered by unrelated components to clear the the filters\n // e.g., a facet selection\n var validOrigins = [Omnibox.ID, 'SearchButton'];\n if (!origin || validOrigins.indexOf(origin.type) === -1) {\n return;\n }\n var lastQuery = this.queryController.getLastQuery().q || '';\n var newQuery = this.getQuery(searchAsYouType);\n if (lastQuery !== newQuery) {\n this.bind.trigger(this.root, BreadcrumbEvents_1.BreadcrumbEvents.clearBreadcrumb);\n }\n };\n Omnibox.prototype.handleTabPress = function () {\n if (this.options.enableQuerySuggestAddon) {\n this.handleTabPressForSuggestions();\n }\n this.handleTabPressForOldOmniboxAddon();\n };\n Omnibox.prototype.handleTabPressForSuggestions = function () {\n if (!this.options.enableSearchAsYouType) {\n var suggestions = _.compact(_.map(this.lastSuggestions, function (suggestion) { return suggestion.text; }));\n this.usageAnalytics.logCustomEvent(this.getOmniboxAnalyticsEventCause(), this.buildCustomDataForPartialQueries(0, suggestions), this.element);\n }\n else {\n this.setText(this.getQuery(true));\n }\n };\n Omnibox.prototype.handleTabPressForOldOmniboxAddon = function () {\n var domSuggestions = this.lastSuggestions.filter(function (suggestions) { return suggestions.dom; }).map(function (suggestions) { return Dom_1.$$(suggestions.dom); });\n var selected = this.findAllElementsWithClass(domSuggestions, '.coveo-omnibox-selected');\n if (selected.length > 0) {\n Dom_1.$$(selected[0]).trigger('tabSelect');\n }\n else if (!this.options.enableQuerySuggestAddon) {\n var selectable = this.findAllElementsWithClass(domSuggestions, '.coveo-omnibox-selectable');\n if (selectable.length > 0) {\n Dom_1.$$(selectable[0]).trigger('tabSelect');\n }\n }\n };\n Omnibox.prototype.findAllElementsWithClass = function (elements, className) {\n return elements\n .map(function (element) { return element.find(className); })\n .filter(function (s) { return s; })\n .reduce(function (total, s) { return total.concat(s); }, []);\n };\n Omnibox.prototype.triggerNewQuery = function (searchAsYouType, analyticsEvent) {\n clearTimeout(this.searchAsYouTypeTimeout);\n var shouldExecuteQuery = this.shouldExecuteQuery(searchAsYouType);\n this.lastQuery = this.getQuery(searchAsYouType);\n shouldExecuteQuery && analyticsEvent();\n this.queryController.executeQuery({\n searchAsYouType: searchAsYouType,\n logInActionsHistory: true,\n cancel: !shouldExecuteQuery,\n origin: this\n });\n };\n Omnibox.prototype.getQuery = function (searchAsYouType) {\n if (this.lastQuery == this.magicBox.getText()) {\n return this.lastQuery;\n }\n if (!searchAsYouType) {\n return this.magicBox.getText();\n }\n var wordCompletion = this.magicBox.getWordCompletion();\n if (wordCompletion != null) {\n return wordCompletion;\n }\n var currentOmniboxSuggestion = this.magicBox.getWordCompletion() || this.getFirstSuggestion();\n if (currentOmniboxSuggestion) {\n return currentOmniboxSuggestion;\n }\n if (this.isAutoSuggestion()) {\n return this.lastQuery || this.magicBox.getText();\n }\n return this.magicBox.getText();\n };\n Omnibox.prototype.getFirstSuggestion = function () {\n if (this.lastSuggestions == null) {\n return '';\n }\n if (this.lastSuggestions.length <= 0) {\n return '';\n }\n var textSuggestion = _.find(this.lastSuggestions, function (suggestion) { return suggestion.text != null; });\n if (textSuggestion == null) {\n return '';\n }\n return textSuggestion.text;\n };\n Omnibox.prototype.updateQueryState = function () {\n this.queryStateModel.set(QueryStateModel_1.QueryStateModel.attributesEnum.q, this.magicBox.getText());\n };\n Omnibox.prototype.handleQueryStateChanged = function (args) {\n Assert_1.Assert.exists(args);\n var q = args.value;\n if (q != this.magicBox.getText()) {\n this.magicBox.setText(q);\n }\n };\n Omnibox.prototype.handleQuerySuccess = function () {\n if (!this.isAutoSuggestion()) {\n this.omniboxAnalytics.partialQueries = [];\n }\n };\n Omnibox.prototype.handleDuringQuery = function (args) {\n var _this = this;\n // When the query results returns ... (args.promise)\n args.promise.then(function () {\n // Get a handle on a pending search as you type (those events are delayed, not sent instantly)\n var pendingEvent = _this.usageAnalytics.getPendingSearchEvent();\n if (pendingEvent instanceof PendingSearchAsYouTypeSearchEvent_1.PendingSearchAsYouTypeSearchEvent) {\n pendingEvent.beforeResolve.then(function (evt) {\n // Check if we need to modify the event type beforeResolving it\n args.promise.then(function () {\n if (_this.modifyEventTo) {\n evt.modifyEventCause(_this.modifyEventTo);\n _this.modifyEventTo = null;\n }\n });\n });\n }\n });\n };\n Omnibox.prototype.searchAsYouType = function (forceExecuteQuery) {\n var _this = this;\n if (forceExecuteQuery === void 0) { forceExecuteQuery = false; }\n this.clearSearchAsYouType();\n if (this.shouldExecuteQuery(true)) {\n this.searchAsYouTypeTimeout = window.setTimeout(function () {\n if (_this.suggestionShouldTriggerQuery() || forceExecuteQuery) {\n var suggestions_1 = _.map(_this.lastSuggestions, function (suggestion) { return suggestion.text; });\n var index_1 = _.indexOf(suggestions_1, _this.magicBox.getWordCompletion());\n _this.triggerNewQuery(true, function () {\n _this.usageAnalytics.logSearchAsYouType(AnalyticsActionListMeta_1.analyticsActionCauseList.searchboxAsYouType, _this.buildCustomDataForPartialQueries(index_1, suggestions_1));\n });\n _this.clearSearchAsYouType();\n }\n }, this.options.searchAsYouTypeDelay);\n }\n };\n Omnibox.prototype.isAutoSuggestion = function () {\n return this.options.enableSearchAsYouType && this.options.enableQuerySuggestAddon;\n };\n Omnibox.prototype.shouldExecuteQuery = function (searchAsYouType) {\n var text = this.getQuery(searchAsYouType);\n if (this.searchInterface.options.allowQueriesWithoutKeywords === false) {\n return this.lastQuery != text && Utils_1.Utils.isNonEmptyString(text);\n }\n return this.lastQuery != text && text != null;\n };\n Omnibox.prototype.suggestionShouldTriggerQuery = function (suggestions) {\n if (suggestions === void 0) { suggestions = this.lastSuggestions; }\n if (this.shouldExecuteQuery(true)) {\n if (suggestions && suggestions[0]) {\n var suggestion = suggestions[0];\n // If we have access to a confidence level, return true if we are equal or above the minimum confidence level.\n if (suggestion && suggestion.executableConfidence != undefined) {\n return suggestion.executableConfidence >= MINIMUM_EXECUTABLE_CONFIDENCE;\n }\n // If we don't have access to a confidence level, return true only if it \"starts with\" the content of the search box\n if (suggestion.text && suggestion.text.indexOf(this.magicBox.getText()) == 0) {\n return true;\n }\n }\n }\n return false;\n };\n Omnibox.prototype.clearSearchAsYouType = function () {\n clearTimeout(this.searchAsYouTypeTimeout);\n this.searchAsYouTypeTimeout = undefined;\n };\n Omnibox.prototype.getOmniboxAnalyticsEventCause = function () {\n if (this.searchInterface instanceof SearchInterface_1.StandaloneSearchInterface) {\n return AnalyticsActionListMeta_1.analyticsActionCauseList.omniboxFromLink;\n }\n return AnalyticsActionListMeta_1.analyticsActionCauseList.omniboxAnalytics;\n };\n Omnibox.ID = 'Omnibox';\n Omnibox.doExport = function () {\n GlobalExports_1.exportGlobally({\n Omnibox: Omnibox,\n QueryboxQueryParameters: QueryboxQueryParameters_1.QueryboxQueryParameters\n });\n };\n /**\n * The options for the omnibox\n * @componentOptions\n */\n Omnibox.options = {\n /**\n * Specifies whether query completion suggestions appearing in the `Omnibox` should push the result list and facets\n * down, rather than rendering themselves over them (and partially hiding them).\n *\n * Set this option as well as {@link Omnibox.options.enableSearchAsYouType} and\n * {@link Omnibox.options.enableQuerySuggestAddon} to `true` for a cool effect!\n *\n * Default value is `false`.\n */\n inline: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false }),\n /**\n * Whether to automatically trigger a new query whenever the end user types additional text in the search box input.\n *\n * See also the [`searchAsYouTypeDelay`]{@link Omnibox.options.searchAsYouTypeDelay} option.\n *\n * **Note:**\n * > If you set this option and the [`enableQuerySuggestAddon`]{@link Omnibox.options.enableQuerySuggestAddon}\n * > option to `true`, the query suggestion feature returns the auto-completion of the currently typed keyword as\n * > its first suggestion.\n *\n * Default value is `false`.\n */\n enableSearchAsYouType: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false, section: 'Advanced Options' }),\n /**\n * If {@link Omnibox.options.enableSearchAsYouType} is `true`, specifies the delay (in milliseconds) before\n * triggering a new query when the end user types in the `Omnibox`.\n *\n * Default value is `2000`. Minimum value is `0`.\n */\n searchAsYouTypeDelay: ComponentOptions_1.ComponentOptions.buildNumberOption({\n defaultValue: 2000,\n min: 0,\n depend: 'enableSearchAsYouType',\n section: 'Advanced Options'\n }),\n /**\n * The `field` addon makes the `Omnibox` highlight and complete field syntax. Setting this option to `true` automatically sets\n * the [enableQuerySyntax]{@link Querybox.options.enableQuerySyntax} option to `true` as a side effect.\n *\n * **Example:**\n * > Suppose you want to search for PDF files. You start typing `@f` in the search box. The `Omnibox` provides\n * > you with several matching fields. You select the `@filetype` field. Then, you start typing `=p` in the input.\n * > This time, the `Omnibox` provides you with several matching values for the `@filetype` field. You select the\n * > `pdf` suggestion, and submit your search request. Since the `enableQuerySyntax` option is set to `true`, the\n * > Coveo Search API interprets the basic expression as query syntax and returns the items whose `@filetype` field\n * > matches the `pdf` value.\n *\n * Default value is `false`.\n */\n enableFieldAddon: ComponentOptions_1.ComponentOptions.buildBooleanOption({\n defaultValue: false,\n depend: 'enableQuerySyntax',\n postProcessing: function (value, options) {\n if (value) {\n options.enableQuerySyntax = true;\n }\n return value;\n },\n section: 'Advanced Options'\n }),\n enableSimpleFieldAddon: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false, depend: 'enableFieldAddon' }),\n listOfFields: ComponentOptions_1.ComponentOptions.buildFieldsOption({ depend: 'enableFieldAddon' }),\n /**\n * Whether to display Coveo Machine Learning (Coveo ML) query suggestions in the `Omnibox`.\n *\n * A Coveo ML query suggestions (QS) model must be properly configured in your Coveo Cloud organization, otherwise this\n * option has no effect (see\n * [Create a QS Model](https://docs.coveo.com/en/1832/#create-a-qs-model)).\n *\n * **Note:**\n * > When you set this option and the [`enableSearchAsYouType`]{@link Omnibox.options.enableSearchAsYouType} option\n * > to `true`, the query suggestion feature returns the auto-completion of the currently typed keyword as its first\n * > query suggestion.\n *\n * @availablesince [December 2015 Release (v1.0.273)](https://docs.coveo.com/en/289/#december-2015-release-v10273)\n */\n enableQuerySuggestAddon: ComponentOptions_1.ComponentOptions.buildBooleanOption({\n defaultValue: true,\n alias: ['enableTopQueryAddon', 'enableRevealQuerySuggestAddon']\n }),\n /**\n * If {@link Querybox.options.enableQuerySyntax} is `true`, specifies whether to enable the `query extension` addon.\n *\n * The `query extension` addon allows the Omnibox to complete the syntax for query extensions.\n *\n * Default value is `false`.\n */\n enableQueryExtensionAddon: ComponentOptions_1.ComponentOptions.buildBooleanOption({\n defaultValue: false,\n depend: 'enableQuerySyntax',\n postProcessing: function (value, options) {\n if (value) {\n options.enableQuerySyntax = true;\n }\n return value;\n },\n section: 'Advanced Options'\n }),\n /**\n * Specifies a placeholder for the input.\n *\n * @availablesince [July 2016 Release (v1.667.24)](https://docs.coveo.com/en/309/#july-2016-release-v166724)\n */\n placeholder: ComponentOptions_1.ComponentOptions.buildLocalizedStringOption(),\n /**\n * Specifies a timeout (in milliseconds) before rejecting suggestions in the Omnibox.\n *\n * Default value is `2000`. Minimum value is `0`.\n */\n omniboxTimeout: ComponentOptions_1.ComponentOptions.buildNumberOption({ defaultValue: 2000, min: 0 }),\n /**\n * Specifies whether the Coveo Platform should try to interpret special query syntax such as field references in the\n * query that the user enters in the Querybox (see\n * [Coveo Query Syntax Reference](https://docs.coveo.com/en/1552/searching-with-coveo/coveo-cloud-query-syntax)).\n *\n * Setting this option to `true` also causes the query syntax in the Querybox to highlight.\n *\n * Default value is `false`.\n */\n enableQuerySyntax: ComponentOptions_1.ComponentOptions.buildBooleanOption({\n defaultValue: false,\n section: 'Advanced Options'\n }),\n /**\n * Specifies the number of suggestions that should appear in standard ML-powered query suggestions.\n *\n * This option only affects the number of suggestions that appear with the {@link Omnibox.options.enableQuerySuggestAddon} option.\n *\n * This options does not affect the {@link AnalyticsSuggestions} or the {@link FieldSuggestions} component, which expose their own dedicated options for this parameter.\n *\n * Default value is `5`.\n *\n * Minimum value is `1`.\n */\n numberOfSuggestions: ComponentOptions_1.ComponentOptions.buildNumberOption({\n defaultValue: 5,\n min: 1\n }),\n /**\n * The minimum number of characters required in the in the text input before displaying available query suggestions when focus is on the component.\n *\n * Note: Only effective when [enableQuerySuggestAddon]{@link Omnibox.options.enableQuerySuggestAddon} is true.\n *\n * depend: 'enableQuerySuggestAddon'\n *\n * Default (and minimum): 0, meaning that trending query suggestions are displayed when focus is on the component, even if its text input is empty.\n *\n * @availablesince [July 2019 Release (v2.6459)](https://docs.coveo.com/en/2938/)\n */\n querySuggestCharacterThreshold: ComponentOptions_1.ComponentOptions.buildNumberOption({\n defaultValue: 0,\n min: 0\n }),\n /**\n * Whether to clear all active query filters when the end user submits a new query from the search box.\n *\n * Note: This does not include the filter expression enforced by the currently selected tab, if any.\n *\n * @availablesince [September 2019 Release (v2.7023)](https://docs.coveo.com/en/2990/)\n */\n clearFiltersOnNewQuery: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false })\n };\n return Omnibox;\n}(Component_1.Component));\nexports.Omnibox = Omnibox;\nOmnibox.options = __assign({}, Omnibox.options, Querybox_1.Querybox.options);\nInitialization_1.Initialization.registerAutoCreateComponent(Omnibox);\n\n\n/***/ }),\n\n/***/ 192:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GlobalExports_1 = __webpack_require__(3);\nvar Strings_1 = __webpack_require__(6);\nvar AccessibleButton_1 = __webpack_require__(17);\nvar Dom_1 = __webpack_require__(1);\nvar SVGDom_1 = __webpack_require__(15);\nvar SVGIcons_1 = __webpack_require__(12);\nvar Utils_1 = __webpack_require__(4);\nvar AnalyticsActionListMeta_1 = __webpack_require__(10);\nvar Component_1 = __webpack_require__(7);\nvar Initialization_1 = __webpack_require__(2);\nvar QueryStateModel_1 = __webpack_require__(13);\n/**\n * The SearchButton component renders a search icon that the end user can click to trigger a new query.\n *\n * See also the {@link Searchbox} component, which can automatically instantiate a SearchButton component along with a\n * {@link Querybox} component or an {@link Omnibox} component.\n */\nvar SearchButton = /** @class */ (function (_super) {\n __extends(SearchButton, _super);\n /**\n * Creates a new SearchButton. Binds a `click` event on the element. Adds a search icon on the element.\n * @param element The HTMLElement on which to instantiate the component.\n * @param options The options for the SearchButton component.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n */\n function SearchButton(element, options, bindings) {\n var _this = _super.call(this, element, SearchButton.ID, bindings) || this;\n _this.element = element;\n _this.options = options;\n new AccessibleButton_1.AccessibleButton()\n .withElement(element)\n .withOwner(_this.bind)\n .withLabel(Strings_1.l('Search'))\n .withSelectAction(function () { return _this.handleClick(); })\n .build();\n // Provide a magnifier icon if element contains nothing\n if (Utils_1.Utils.trim(Dom_1.$$(_this.element).text()) == '') {\n var svgMagnifierContainer = Dom_1.$$('span', { className: 'coveo-search-button' }, SVGIcons_1.SVGIcons.icons.search).el;\n SVGDom_1.SVGDom.addClassToSVGInContainer(svgMagnifierContainer, 'coveo-search-button-svg');\n var svgLoadingAnimationContainer = Dom_1.$$('span', { className: 'coveo-search-button-loading' }, SVGIcons_1.SVGIcons.icons.loading).el;\n SVGDom_1.SVGDom.addClassToSVGInContainer(svgLoadingAnimationContainer, 'coveo-search-button-loading-svg');\n element.appendChild(svgMagnifierContainer);\n element.appendChild(svgLoadingAnimationContainer);\n }\n return _this;\n }\n /**\n * Triggers the `click` event handler, which logs a `searchboxSubmit` event in the usage analytics and executes a\n * query.\n */\n SearchButton.prototype.click = function () {\n this.handleClick();\n };\n SearchButton.prototype.handleClick = function () {\n this.logger.debug('Performing query following button click');\n this.updateQueryStateModelWithSearchboxQuery();\n this.usageAnalytics.logSearchEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.searchboxSubmit, {});\n this.queryController.executeQuery({ origin: this, logInActionsHistory: true });\n };\n SearchButton.prototype.updateQueryStateModelWithSearchboxQuery = function () {\n var searchbox = this.options && this.options.searchbox;\n searchbox && this.queryStateModel.set(QueryStateModel_1.QueryStateModel.attributesEnum.q, searchbox.getText());\n };\n SearchButton.ID = 'SearchButton';\n SearchButton.doExport = function () {\n GlobalExports_1.exportGlobally({\n SearchButton: SearchButton\n });\n };\n SearchButton.options = {};\n return SearchButton;\n}(Component_1.Component));\nexports.SearchButton = SearchButton;\nInitialization_1.Initialization.registerAutoCreateComponent(SearchButton);\n\n\n/***/ }),\n\n/***/ 215:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExpressionEndOfInput = {\n id: 'end of input',\n parse: null\n};\n\n\n/***/ }),\n\n/***/ 216:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Result_1 = __webpack_require__(51);\nvar Result_2 = __webpack_require__(51);\nvar ExpressionConstant = /** @class */ (function () {\n function ExpressionConstant(value, id) {\n this.value = value;\n this.id = id;\n }\n ExpressionConstant.prototype.parse = function (input, end) {\n // the value must be at the start of the input\n var success = input.indexOf(this.value) == 0;\n var result = new Result_1.Result(success ? this.value : null, this, input);\n // if is successful and we require the end but the length of parsed is\n // lower than the input length, return a EndOfInputExpected Result\n if (success && end && input.length > this.value.length) {\n return new Result_2.EndOfInputResult(result);\n }\n return result;\n };\n ExpressionConstant.prototype.toString = function () {\n return this.value;\n };\n return ExpressionConstant;\n}());\nexports.ExpressionConstant = ExpressionConstant;\n\n\n/***/ }),\n\n/***/ 217:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Basic_1 = __webpack_require__(131);\nvar Date_1 = __webpack_require__(496);\nexports.Field = {\n basicExpressions: ['FieldSimpleQuery', 'FieldQuery', 'Field'],\n grammars: {\n FieldQuery: '[Field][OptionalSpaces][FieldQueryOperation]',\n FieldQueryOperation: ['FieldQueryValue', 'FieldQueryNumeric'],\n FieldQueryValue: '[FieldOperator][OptionalSpaces][FieldValue]',\n FieldQueryNumeric: '[FieldOperatorNumeric][OptionalSpaces][FieldValueNumeric]',\n FieldSimpleQuery: '[FieldName]:[OptionalSpaces][FieldValue]',\n Field: '@[FieldName]',\n FieldName: /[a-zA-Z][a-zA-Z0-9\\.\\_]*/,\n FieldOperator: /==|=|<>/,\n FieldOperatorNumeric: /<=|>=|<|>/,\n FieldValue: ['DateRange', 'NumberRange', 'DateRelative', 'Date', 'Number', 'FieldValueList', 'FieldValueString'],\n FieldValueNumeric: ['DateRelative', 'Date', 'Number'],\n FieldValueString: ['DoubleQuoted', 'FieldValueNotQuoted'],\n FieldValueList: '([FieldValueString][FieldValueStringList*])',\n FieldValueStringList: '[FieldValueSeparator][FieldValueString]',\n FieldValueSeparator: / *, */,\n FieldValueNotQuoted: /[^ \\(\\)\\[\\],]+/,\n NumberRange: '[Number][Spaces?]..[Spaces?][Number]'\n },\n include: [Date_1.Date, Basic_1.Basic]\n};\n\n\n/***/ }),\n\n/***/ 218:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [0, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar underscore_1 = __webpack_require__(0);\nvar OmniboxEvents_1 = __webpack_require__(34);\nvar Component_1 = __webpack_require__(7);\nvar Dom_1 = __webpack_require__(1);\nvar ResultPreviewsManager_1 = __webpack_require__(561);\nvar QueryProcessor_1 = __webpack_require__(500);\nvar QueryUtils_1 = __webpack_require__(21);\nvar Direction;\n(function (Direction) {\n Direction[\"Up\"] = \"Up\";\n Direction[\"Down\"] = \"Down\";\n Direction[\"Left\"] = \"Left\";\n Direction[\"Right\"] = \"Right\";\n})(Direction = exports.Direction || (exports.Direction = {}));\nvar SuggestionsManager = /** @class */ (function () {\n function SuggestionsManager(element, magicBoxContainer, inputManager, options) {\n var _this = this;\n this.element = element;\n this.magicBoxContainer = magicBoxContainer;\n this.inputManager = inputManager;\n this.suggestionListboxID = \"coveo-magicbox-suggestions-\" + QueryUtils_1.QueryUtils.createGuid();\n this.suggestionListboxClassName = \"coveo-magicbox-suggestions\";\n this.root = Component_1.Component.resolveRoot(element);\n this.options = underscore_1.defaults(options, {\n suggestionClass: 'magic-box-suggestion',\n selectedClass: 'magic-box-selected'\n });\n // Put in a sane default, so as to not reject every suggestions if not set on initialization\n if (this.options.timeout == undefined) {\n this.options.timeout = 500;\n }\n Dom_1.$$(this.element).on('mouseover', function (e) {\n _this.handleMouseOver(e);\n });\n Dom_1.$$(this.element).on('mouseout', function (e) {\n _this.handleMouseOut(e);\n });\n this.suggestionsProcessor = new QueryProcessor_1.QueryProcessor({ timeout: this.options.timeout });\n this.resultPreviewsManager = new ResultPreviewsManager_1.ResultPreviewsManager(element, {\n selectedClass: this.options.selectedClass,\n timeout: this.options.timeout\n });\n this.suggestionsListbox = this.buildSuggestionsContainer();\n Dom_1.$$(this.element).append(this.suggestionsListbox.el);\n this.addAccessibilityProperties();\n this.appendEmptySuggestionOption();\n }\n Object.defineProperty(SuggestionsManager.prototype, \"hasSuggestions\", {\n get: function () {\n return this.currentSuggestions && this.currentSuggestions.length > 0;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SuggestionsManager.prototype, \"hasFocus\", {\n get: function () {\n return Dom_1.$$(this.element).findClass(this.options.selectedClass).length > 0;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SuggestionsManager.prototype, \"hasPreviews\", {\n get: function () {\n return this.resultPreviewsManager.hasPreviews;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SuggestionsManager.prototype, \"focusedSuggestion\", {\n get: function () {\n var _this = this;\n return underscore_1.find(this.currentSuggestions, function (suggestion) {\n return Dom_1.$$(suggestion.dom).hasClass(_this.options.selectedClass) || Dom_1.$$(suggestion.dom).findClass(_this.options.selectedClass).length > 0;\n });\n },\n enumerable: true,\n configurable: true\n });\n SuggestionsManager.prototype.handleMouseOver = function (e) {\n var target = Dom_1.$$(e.target);\n var parents = target.parents(this.options.suggestionClass);\n if (target.hasClass(this.options.suggestionClass)) {\n this.processMouseSelection(target.el);\n }\n else if (parents.length > 0 && this.element.contains(parents[0])) {\n this.processMouseSelection(parents[0]);\n }\n };\n SuggestionsManager.prototype.handleMouseOut = function (e) {\n var target = Dom_1.$$(e.target);\n var targetParents = target.parents(this.options.suggestionClass);\n //e.relatedTarget is not available if moving off the browser window or is an empty object `{}` when moving out of namespace in LockerService.\n if (e.relatedTarget && Dom_1.$$(e.relatedTarget).isValid()) {\n var relatedTargetParents = Dom_1.$$(e.relatedTarget).parents(this.options.suggestionClass);\n if (target.hasClass(this.options.selectedClass) && !Dom_1.$$(e.relatedTarget).hasClass(this.options.suggestionClass)) {\n this.removeSelectedStatus(target.el);\n }\n else if (relatedTargetParents.length == 0 && targetParents.length > 0) {\n this.removeSelectedStatus(targetParents[0]);\n }\n }\n else {\n if (target.hasClass(this.options.selectedClass)) {\n this.removeSelectedStatus(target.el);\n }\n else if (targetParents.length > 0) {\n this.removeSelectedStatus(targetParents[0]);\n }\n }\n Dom_1.$$(this.root).trigger(OmniboxEvents_1.OmniboxEvents.querySuggestLoseFocus);\n };\n SuggestionsManager.prototype.moveDown = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.move(Direction.Down)];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n SuggestionsManager.prototype.moveUp = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.move(Direction.Up)];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n SuggestionsManager.prototype.moveLeft = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.move(Direction.Left)];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n SuggestionsManager.prototype.moveRight = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.move(Direction.Right)];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n SuggestionsManager.prototype.selectAndReturnKeyboardFocusedElement = function () {\n var selected = this.keyboardFocusedElement;\n if (selected) {\n Dom_1.$$(selected).trigger('keyboardSelect');\n // By definition, once an element has been \"selected\" with the keyboard,\n // it is not longer \"active\" since the event has been processed.\n this.keyboardFocusedElement = null;\n this.inputManager.blur();\n }\n return selected;\n };\n SuggestionsManager.prototype.clearKeyboardFocusedElement = function () {\n this.keyboardFocusedElement = null;\n };\n SuggestionsManager.prototype.receiveSuggestions = function (suggestions) {\n return __awaiter(this, void 0, void 0, function () {\n var _a, results, status;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0: return [4 /*yield*/, this.suggestionsProcessor.processQueries(suggestions)];\n case 1:\n _a = _b.sent(), results = _a.results, status = _a.status;\n if (status === QueryProcessor_1.ProcessingStatus.Overriden) {\n return [2 /*return*/, []];\n }\n this.updateSuggestions(results);\n return [2 /*return*/, results];\n }\n });\n });\n };\n SuggestionsManager.prototype.clearSuggestions = function () {\n this.updateSuggestions([]);\n };\n SuggestionsManager.prototype.updateSuggestions = function (suggestions) {\n var _this = this;\n this.suggestionsListbox.empty();\n this.inputManager.activeDescendant = null;\n this.currentSuggestions = suggestions;\n Dom_1.$$(this.element).toggleClass('magic-box-hasSuggestion', this.hasSuggestions);\n this.inputManager.expanded = this.hasSuggestions;\n this.resultPreviewsManager.displaySearchResultPreviewsForSuggestion(null);\n if (!this.hasSuggestions) {\n this.appendEmptySuggestionOption();\n Dom_1.$$(this.root).trigger(OmniboxEvents_1.OmniboxEvents.querySuggestLoseFocus);\n return;\n }\n suggestions\n .sort(function (a, b) { return (b.index || 0) - (a.index || 0); })\n .forEach(function (suggestion) {\n var dom = suggestion.dom ? _this.modifyDomFromExistingSuggestion(suggestion.dom) : _this.createDomFromSuggestion(suggestion);\n dom.setAttribute('id', \"magic-box-suggestion-\" + underscore_1.indexOf(suggestions, suggestion));\n dom.setAttribute('role', 'option');\n dom.setAttribute('aria-selected', 'false');\n dom.setAttribute('aria-label', dom.text());\n dom['suggestion'] = suggestion;\n _this.suggestionsListbox.append(dom.el);\n });\n Dom_1.$$(this.root).trigger(OmniboxEvents_1.OmniboxEvents.querySuggestRendered);\n };\n Object.defineProperty(SuggestionsManager.prototype, \"selectedSuggestion\", {\n get: function () {\n if (this.htmlElementIsSuggestion(this.keyboardFocusedElement)) {\n return this.returnMoved(this.keyboardFocusedElement);\n }\n return null;\n },\n enumerable: true,\n configurable: true\n });\n SuggestionsManager.prototype.processKeyboardSelection = function (suggestion) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n this.addSelectedStatus(suggestion);\n this.keyboardFocusedElement = suggestion;\n return [4 /*yield*/, this.updateSelectedSuggestion(this.focusedSuggestion)];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n SuggestionsManager.prototype.processKeyboardPreviewSelection = function (preview) {\n this.addSelectedStatus(preview);\n this.keyboardFocusedElement = preview;\n };\n SuggestionsManager.prototype.processMouseSelection = function (suggestion) {\n this.addSelectedStatus(suggestion);\n this.updateSelectedSuggestion(this.focusedSuggestion);\n this.keyboardFocusedElement = null;\n };\n SuggestionsManager.prototype.buildSuggestionsContainer = function () {\n return Dom_1.$$('div', {\n className: this.suggestionListboxClassName,\n id: this.suggestionListboxID,\n role: 'listbox',\n ariaLabel: 'Search Suggestions'\n });\n };\n SuggestionsManager.prototype.createDomFromSuggestion = function (suggestion) {\n var _this = this;\n var dom = Dom_1.$$('div', {\n className: \"magic-box-suggestion \" + this.options.suggestionClass\n });\n suggestion.dom = dom.el;\n dom.on('click', function () {\n _this.selectSuggestion(suggestion);\n });\n dom.on('keyboardSelect', function () {\n _this.selectSuggestion(suggestion);\n });\n if (suggestion.html) {\n dom.el.innerHTML = suggestion.html;\n return dom;\n }\n if (suggestion.text) {\n dom.text(suggestion.text);\n return dom;\n }\n if (suggestion.separator) {\n dom.addClass('magic-box-suggestion-seperator');\n var suggestionLabel = Dom_1.$$('div', {\n className: 'magic-box-suggestion-seperator-label'\n }, suggestion.separator);\n dom.append(suggestionLabel.el);\n return dom;\n }\n return dom;\n };\n SuggestionsManager.prototype.selectSuggestion = function (suggestion) {\n suggestion.onSelect();\n Dom_1.$$(this.root).trigger(OmniboxEvents_1.OmniboxEvents.querySuggestSelection, { suggestion: suggestion.text });\n };\n SuggestionsManager.prototype.appendEmptySuggestionOption = function () {\n // Accessibility tools reports that a listbox element must always have at least one child with an option\n // Even if there is no suggestions to show.\n this.suggestionsListbox.append(Dom_1.$$('div', { role: 'option' }).el);\n };\n SuggestionsManager.prototype.modifyDomFromExistingSuggestion = function (dom) {\n // this need to be done if the selection is in cache and the dom is set in the suggestion\n this.removeSelectedStatus(dom);\n var found = dom.classList.contains(this.options.suggestionClass) ? dom : Dom_1.$$(dom).find('.' + this.options.suggestionClass);\n this.removeSelectedStatus(found);\n return Dom_1.$$(dom);\n };\n SuggestionsManager.prototype.move = function (direction) {\n return __awaiter(this, void 0, void 0, function () {\n var firstPreview;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (!this.resultPreviewsManager.focusedPreviewElement) return [3 /*break*/, 2];\n return [4 /*yield*/, this.moveWithinPreview(direction)];\n case 1:\n _a.sent();\n return [2 /*return*/];\n case 2:\n if (direction === Direction.Right || direction === Direction.Left) {\n firstPreview = this.resultPreviewsManager.previewElements[0];\n if (firstPreview) {\n this.processKeyboardPreviewSelection(firstPreview);\n return [2 /*return*/];\n }\n }\n return [4 /*yield*/, this.moveWithinSuggestion(direction)];\n case 3:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n SuggestionsManager.prototype.moveWithinSuggestion = function (direction) {\n return __awaiter(this, void 0, void 0, function () {\n var currentlySelected, selectables, currentIndex, index;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n currentlySelected = Dom_1.$$(this.element).find(\".\" + this.options.selectedClass);\n selectables = Dom_1.$$(this.element).findAll(\".\" + this.options.suggestionClass);\n currentIndex = underscore_1.indexOf(selectables, currentlySelected);\n index = direction === Direction.Up ? currentIndex - 1 : currentIndex + 1;\n index = (index + selectables.length) % selectables.length;\n return [4 /*yield*/, this.selectQuerySuggest(selectables[index])];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n SuggestionsManager.prototype.selectQuerySuggest = function (suggestion) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (!suggestion) return [3 /*break*/, 2];\n return [4 /*yield*/, this.processKeyboardSelection(suggestion)];\n case 1:\n _a.sent();\n return [3 /*break*/, 3];\n case 2:\n this.keyboardFocusedElement = null;\n this.inputManager.input.removeAttribute('aria-activedescendant');\n _a.label = 3;\n case 3: return [2 /*return*/, suggestion];\n }\n });\n });\n };\n SuggestionsManager.prototype.moveWithinPreview = function (direction) {\n return __awaiter(this, void 0, void 0, function () {\n var newFocusedPreview;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n newFocusedPreview = this.resultPreviewsManager.getElementInDirection(direction);\n if (!!newFocusedPreview) return [3 /*break*/, 2];\n return [4 /*yield*/, this.selectQuerySuggest(this.resultPreviewsManager.previewsOwner.dom)];\n case 1:\n _a.sent();\n return [2 /*return*/];\n case 2:\n this.processKeyboardPreviewSelection(newFocusedPreview);\n return [2 /*return*/];\n }\n });\n });\n };\n SuggestionsManager.prototype.returnMoved = function (selected) {\n if (selected) {\n if (selected['suggestion']) {\n return selected['suggestion'];\n }\n if (selected['no-text-suggestion']) {\n return null;\n }\n if (selected instanceof HTMLElement) {\n return {\n text: Dom_1.$$(selected).text()\n };\n }\n }\n return null;\n };\n SuggestionsManager.prototype.addSelectedStatus = function (element) {\n var selected = this.element.getElementsByClassName(this.options.selectedClass);\n for (var i = 0; i < selected.length; i++) {\n var elem = selected.item(i);\n this.removeSelectedStatus(elem);\n }\n Dom_1.$$(element).addClass(this.options.selectedClass);\n this.updateAreaSelectedIfDefined(element, 'true');\n };\n SuggestionsManager.prototype.updateSelectedSuggestion = function (suggestion) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n Dom_1.$$(this.root).trigger(OmniboxEvents_1.OmniboxEvents.querySuggestGetFocus, {\n suggestion: suggestion.text\n });\n return [4 /*yield*/, this.resultPreviewsManager.displaySearchResultPreviewsForSuggestion(suggestion)];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n SuggestionsManager.prototype.removeSelectedStatus = function (suggestion) {\n Dom_1.$$(suggestion).removeClass(this.options.selectedClass);\n this.updateAreaSelectedIfDefined(suggestion, 'false');\n };\n SuggestionsManager.prototype.updateAreaSelectedIfDefined = function (element, value) {\n if (Dom_1.$$(element).getAttribute('aria-selected')) {\n this.inputManager.activeDescendant = element;\n Dom_1.$$(element).setAttribute('aria-selected', value);\n }\n };\n SuggestionsManager.prototype.addAccessibilityProperties = function () {\n this.addAccessibilityPropertiesForMagicBox();\n this.addAccessibilityPropertiesForInput();\n };\n SuggestionsManager.prototype.addAccessibilityPropertiesForMagicBox = function () {\n var magicBox = Dom_1.$$(this.magicBoxContainer);\n magicBox.setAttribute('role', 'search');\n magicBox.setAttribute('aria-haspopup', 'listbox');\n };\n SuggestionsManager.prototype.addAccessibilityPropertiesForInput = function () {\n var input = Dom_1.$$(this.inputManager.input);\n this.inputManager.activeDescendant = null;\n this.inputManager.expanded = false;\n input.setAttribute('aria-owns', this.suggestionListboxID);\n input.setAttribute('aria-controls', this.suggestionListboxID);\n };\n SuggestionsManager.prototype.htmlElementIsSuggestion = function (selected) {\n var omniboxSelectables = Dom_1.$$(this.element).findAll(\".\" + this.options.suggestionClass);\n return underscore_1.indexOf(omniboxSelectables, selected) > -1;\n };\n return SuggestionsManager;\n}());\nexports.SuggestionsManager = SuggestionsManager;\n\n\n/***/ }),\n\n/***/ 219:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [0, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar underscore_1 = __webpack_require__(0);\nvar Core_1 = __webpack_require__(20);\nvar Dom_1 = __webpack_require__(1);\nvar doMagicBoxExport_1 = __webpack_require__(559);\nvar InputManager_1 = __webpack_require__(499);\nvar MagicBoxClear_1 = __webpack_require__(562);\nvar SuggestionsManager_1 = __webpack_require__(218);\nvar MagicBoxInstance = /** @class */ (function () {\n function MagicBoxInstance(element, grammar, options) {\n if (options === void 0) { options = {}; }\n var _this = this;\n this.element = element;\n this.grammar = grammar;\n this.options = options;\n this.lastSuggestions = [];\n if (underscore_1.isUndefined(this.options.inline)) {\n this.options.inline = false;\n }\n Dom_1.$$(element).addClass('magic-box');\n if (this.options.inline) {\n Dom_1.$$(element).addClass('magic-box-inline');\n }\n this.result = this.grammar.parse('');\n this.displayedResult = this.result.clean();\n var inputContainer = Dom_1.$$(element).find('.magic-box-input');\n if (!inputContainer) {\n inputContainer = document.createElement('div');\n inputContainer.className = 'magic-box-input';\n element.appendChild(inputContainer);\n }\n this.inputManager = new InputManager_1.InputManager(inputContainer, function (text, wordCompletion) {\n if (!wordCompletion) {\n _this.setText(text);\n _this.addSuggestions();\n _this.onchange && _this.onchange();\n }\n else {\n _this.setText(text);\n _this.onselect && _this.onselect(_this.firstSuggestionWithText);\n }\n }, this);\n this.inputManager.ontabpress = function () {\n _this.ontabpress && _this.ontabpress();\n };\n var existingValue = this.inputManager.getValue();\n if (existingValue) {\n this.displayedResult.input = existingValue;\n }\n this.inputManager.setResult(this.displayedResult);\n var suggestionsContainer = document.createElement('div');\n suggestionsContainer.className = 'magic-box-suggestions';\n this.element.appendChild(suggestionsContainer);\n this.suggestionsManager = new SuggestionsManager_1.SuggestionsManager(suggestionsContainer, this.element, this.inputManager, {\n suggestionClass: this.options.selectableSuggestionClass,\n selectedClass: this.options.selectedSuggestionClass,\n timeout: this.options.suggestionTimeout\n });\n this.magicBoxClear = new MagicBoxClear_1.MagicBoxClear(this);\n this.setupHandler();\n }\n Object.defineProperty(MagicBoxInstance.prototype, \"firstSuggestionWithText\", {\n get: function () {\n return underscore_1.find(this.lastSuggestions, function (suggestion) { return suggestion.text; });\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MagicBoxInstance.prototype, \"firstSuggestionText\", {\n get: function () {\n var firstSuggestionWithText = this.firstSuggestionWithText;\n return firstSuggestionWithText ? firstSuggestionWithText.text : '';\n },\n enumerable: true,\n configurable: true\n });\n MagicBoxInstance.prototype.getResult = function () {\n return this.result;\n };\n MagicBoxInstance.prototype.getDisplayedResult = function () {\n return this.displayedResult;\n };\n MagicBoxInstance.prototype.setText = function (text) {\n Dom_1.$$(this.element).toggleClass('magic-box-notEmpty', text.length > 0);\n this.magicBoxClear.toggleTabindexAndAriaHidden(text.length > 0);\n this.result = this.grammar.parse(text);\n this.displayedResult = this.result.clean();\n this.inputManager.setResult(this.displayedResult);\n };\n MagicBoxInstance.prototype.setCursor = function (index) {\n this.inputManager.setCursor(index);\n };\n MagicBoxInstance.prototype.getCursor = function () {\n return this.inputManager.getCursor();\n };\n MagicBoxInstance.prototype.resultAtCursor = function (match) {\n return this.displayedResult.resultAt(this.getCursor(), match);\n };\n MagicBoxInstance.prototype.setupHandler = function () {\n var _this = this;\n this.inputManager.onblur = function () {\n Dom_1.$$(_this.element).removeClass('magic-box-hasFocus');\n _this.onblur && _this.onblur();\n if (!_this.options.inline) {\n _this.clearSuggestion();\n }\n };\n this.inputManager.onfocus = function () {\n Dom_1.$$(_this.element).addClass('magic-box-hasFocus');\n _this.addSuggestions();\n _this.onfocus && _this.onfocus();\n };\n this.inputManager.onkeydown = function (key) {\n if (_this.shouldMoveInSuggestions(key)) {\n return false;\n }\n if (key === Core_1.KEYBOARD.ENTER) {\n var suggestion = _this.suggestionsManager.selectAndReturnKeyboardFocusedElement();\n if (suggestion == null) {\n _this.onsubmit && _this.onsubmit();\n }\n return false;\n }\n else if (key === Core_1.KEYBOARD.ESCAPE) {\n _this.clearSuggestion();\n _this.blur();\n }\n else {\n _this.suggestionsManager.clearKeyboardFocusedElement();\n }\n return true;\n };\n this.inputManager.onchangecursor = function () {\n _this.addSuggestions();\n };\n this.inputManager.onkeyup = function (key) {\n _this.onmove && _this.onmove();\n if (!_this.shouldMoveInSuggestions(key)) {\n return true;\n }\n switch (key) {\n case Core_1.KEYBOARD.UP_ARROW:\n _this.suggestionsManager.moveUp();\n break;\n case Core_1.KEYBOARD.DOWN_ARROW:\n _this.suggestionsManager.moveDown();\n break;\n case Core_1.KEYBOARD.LEFT_ARROW:\n _this.suggestionsManager.moveLeft();\n break;\n case Core_1.KEYBOARD.RIGHT_ARROW:\n _this.suggestionsManager.moveRight();\n break;\n }\n if (_this.suggestionsManager.selectedSuggestion) {\n _this.focusOnSuggestion(_this.suggestionsManager.selectedSuggestion);\n }\n _this.onchange && _this.onchange();\n return false;\n };\n };\n MagicBoxInstance.prototype.addSuggestions = function () {\n return __awaiter(this, void 0, void 0, function () {\n var suggestions;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.suggestionsManager.receiveSuggestions(this.getSuggestions != null ? this.getSuggestions() : [])];\n case 1:\n suggestions = _a.sent();\n this.addSelectEventHandlers(suggestions);\n this.inputManager.setWordCompletion(this.firstSuggestionText);\n this.onSuggestions(suggestions);\n return [2 /*return*/];\n }\n });\n });\n };\n MagicBoxInstance.prototype.shouldMoveInSuggestions = function (key) {\n switch (key) {\n case Core_1.KEYBOARD.UP_ARROW:\n case Core_1.KEYBOARD.DOWN_ARROW:\n return true;\n case Core_1.KEYBOARD.LEFT_ARROW:\n case Core_1.KEYBOARD.RIGHT_ARROW:\n if (this.suggestionsManager.hasFocus && this.suggestionsManager.hasPreviews) {\n return true;\n }\n }\n return false;\n };\n MagicBoxInstance.prototype.addSelectEventHandlers = function (suggestions) {\n var _this = this;\n underscore_1.each(suggestions, function (suggestion) {\n if (suggestion.onSelect == null && suggestion.text != null) {\n suggestion.onSelect = function () {\n _this.setText(suggestion.text);\n _this.onselect && _this.onselect(suggestion);\n };\n }\n });\n };\n MagicBoxInstance.prototype.focus = function () {\n Dom_1.$$(this.element).addClass('magic-box-hasFocus');\n this.inputManager.focus();\n };\n MagicBoxInstance.prototype.blur = function () {\n this.inputManager.blur();\n };\n MagicBoxInstance.prototype.clearSuggestion = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n this.inputManager.setWordCompletion(null);\n this.suggestionsManager.clearSuggestions();\n this.onSuggestions([]);\n return [2 /*return*/];\n });\n });\n };\n MagicBoxInstance.prototype.focusOnSuggestion = function (suggestion) {\n if (suggestion == null || suggestion.text == null) {\n this.inputManager.setResult(this.displayedResult, this.firstSuggestionText);\n }\n else {\n this.inputManager.setResult(this.grammar.parse(suggestion.text).clean(), suggestion.text);\n }\n };\n MagicBoxInstance.prototype.getText = function () {\n return this.inputManager.getValue();\n };\n MagicBoxInstance.prototype.getWordCompletion = function () {\n return this.inputManager.getWordCompletion();\n };\n MagicBoxInstance.prototype.clear = function () {\n this.setText('');\n this.clearSuggestion();\n this.focus();\n this.onclear && this.onclear();\n };\n MagicBoxInstance.prototype.hasSuggestions = function () {\n return this.suggestionsManager.hasSuggestions;\n };\n return MagicBoxInstance;\n}());\nexports.MagicBoxInstance = MagicBoxInstance;\nfunction createMagicBox(element, grammar, options) {\n return new MagicBoxInstance(element, grammar, options);\n}\nexports.createMagicBox = createMagicBox;\nfunction requestAnimationFrame(callback) {\n if ('requestAnimationFrame' in window) {\n return window.requestAnimationFrame(callback);\n }\n return setTimeout(callback);\n}\nexports.requestAnimationFrame = requestAnimationFrame;\ndoMagicBoxExport_1.doMagicBoxExport();\n\n\n/***/ }),\n\n/***/ 220:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar _ = __webpack_require__(0);\nvar MagicBoxUtils = /** @class */ (function () {\n function MagicBoxUtils() {\n }\n MagicBoxUtils.escapeRegExp = function (str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n };\n MagicBoxUtils.highlightText = function (text, highligth, ignoreCase, matchClass, doNotMatchClass) {\n var _this = this;\n if (ignoreCase === void 0) { ignoreCase = false; }\n if (matchClass === void 0) { matchClass = 'magic-box-hightlight'; }\n if (doNotMatchClass === void 0) { doNotMatchClass = ''; }\n if (highligth.length == 0) {\n return text;\n }\n var escaped = this.escapeRegExp(highligth);\n var stringRegex = '(' + escaped + ')|(.*?(?=' + escaped + ')|.+)';\n var regex = new RegExp(stringRegex, ignoreCase ? 'gi' : 'g');\n return text.replace(regex, function (text, match, notmatch) { return _this.escapeText(match != null ? matchClass : doNotMatchClass, text); });\n };\n MagicBoxUtils.escapeText = function (classname, text) {\n return \"\" + _.escape(text) + \"\";\n };\n return MagicBoxUtils;\n}());\nexports.MagicBoxUtils = MagicBoxUtils;\n\n\n/***/ }),\n\n/***/ 278:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__webpack_require__(667);\nvar GlobalExports_1 = __webpack_require__(3);\nvar Dom_1 = __webpack_require__(1);\nvar SVGDom_1 = __webpack_require__(15);\nvar SVGIcons_1 = __webpack_require__(12);\nvar SearchBoxResize_1 = __webpack_require__(668);\nvar Component_1 = __webpack_require__(7);\nvar ComponentOptions_1 = __webpack_require__(8);\nvar Initialization_1 = __webpack_require__(2);\nvar Omnibox_1 = __webpack_require__(190);\nvar Querybox_1 = __webpack_require__(137);\nvar SearchButton_1 = __webpack_require__(192);\nvar underscore_1 = __webpack_require__(0);\n/**\n * The `Searchbox` component allows you to conveniently instantiate two components which end users frequently use to\n * enter and submit queries.\n *\n * This component attaches itself to a `div` element and takes care of instantiating either a\n * [`Querybox`]{@link Querybox} or an [`Omnibox`]{@link Omnibox} component (see the\n * [`enableOmnibox`]{@link Searchbox.options.enableOmnibox} option). Optionally, the `Searchbox` can also instantiate a\n * [`SearchButton`]{@link SearchButton} component, and append it inside the same `div` (see the\n * [`addSearchButton`]{@link Searchbox.options.addSearchButton} option).\n */\nvar Searchbox = /** @class */ (function (_super) {\n __extends(Searchbox, _super);\n /**\n * Creates a new `Searchbox` component. Creates a new `Coveo.Magicbox` instance and wraps magic box methods (`onblur`,\n * `onsubmit`, etc.). Binds event on `buildingQuery` and on redirection (for standalone box).\n * @param element The HTMLElement on which to instantiate the component. This cannot be an HTMLInputElement for\n * technical reasons.\n * @param options The options for the `Searchbox component`. These will merge with the options from the component set\n * directly on the `HTMLElement`.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n */\n function Searchbox(element, options, bindings) {\n var _this = _super.call(this, element, Searchbox.ID, bindings) || this;\n _this.element = element;\n _this.options = options;\n _this.bindings = bindings;\n _this.options = ComponentOptions_1.ComponentOptions.initComponentOptions(element, Searchbox, options);\n if (_this.options.inline) {\n Dom_1.$$(element).addClass('coveo-inline');\n }\n _this.initSearchBox();\n _this.initSearchButton();\n _this.applyMagicBoxIcon();\n _this.applyCustomHeight();\n return _this;\n }\n Searchbox.prototype.initSearchBox = function () {\n var div = document.createElement('div');\n this.element.appendChild(div);\n if (this.options.enableOmnibox) {\n this.searchbox = new Omnibox_1.Omnibox(div, this.options, this.bindings);\n }\n else {\n this.searchbox = new Querybox_1.Querybox(div, this.options, this.bindings);\n }\n };\n Searchbox.prototype.initSearchButton = function () {\n if (!this.options.addSearchButton) {\n return;\n }\n var anchor = Dom_1.$$('a');\n this.element.appendChild(anchor.el);\n this.searchButton = new SearchButton_1.SearchButton(anchor.el, { searchbox: this.searchbox }, this.bindings);\n };\n Searchbox.prototype.applyMagicBoxIcon = function () {\n var magicBoxIcon = Dom_1.$$(this.element).find('.magic-box-icon');\n magicBoxIcon.innerHTML = SVGIcons_1.SVGIcons.icons.mainClear;\n SVGDom_1.SVGDom.addClassToSVGInContainer(magicBoxIcon, 'magic-box-clear-svg');\n };\n Searchbox.prototype.applyCustomHeight = function () {\n if (!this.options.height) {\n return;\n }\n Dom_1.$$(this.element).addClass('coveo-custom-height');\n SearchBoxResize_1.SearchBoxResize.resize(this.element, this.options.height);\n };\n Searchbox.ID = 'Searchbox';\n Searchbox.parent = Omnibox_1.Omnibox;\n Searchbox.doExport = function () {\n GlobalExports_1.exportGlobally({\n Searchbox: Searchbox,\n SearchButton: SearchButton_1.SearchButton,\n Omnibox: Omnibox_1.Omnibox,\n Querybox: Querybox_1.Querybox\n });\n };\n /**\n * Possible options for the {@link Searchbox}\n * @componentOptions\n */\n Searchbox.options = {\n /**\n * Specifies whether to instantiate a [`SearchButton`]{@link SearchButton} component.\n *\n * Default value is `true`.\n */\n addSearchButton: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: true }),\n /**\n * A custom height for the search box (in pixels).\n *\n * Note: Avoid setting this option if you want to modify the search box styling through custom CSS.\n *\n * Minimum value is `25`\n *\n * Default behavior: The most specific CSS rules targeting HTML elements generated by the Searchbox component are used\n * (e.g., if you are only using the default CoveoFullSearch.css stylesheet with no further styling customizations,\n * the search box height will be set to 50 pixels by default).\n *\n * @availablesince [July 2019 Release (v2.6459)](https://docs.coveo.com/en/2938/)\n */\n height: ComponentOptions_1.ComponentOptions.buildNumberOption({ min: 25 }),\n /**\n * Specifies whether to instantiate an [`Omnibox`]{@link Omnibox} component.\n *\n * When this option is `false`, the `Searchbox` instantiates a [`Querybox`]{@link Querybox} component instead.\n *\n * **Note:**\n * > You can use configuration options specific to the component you choose to instantiate with the `Searchbox`.\n *\n * **Examples:**\n *\n * In this first case, the `Searchbox` instantiates a `Querybox` component. You can configure this `Querybox`\n * instance using any of the `Querybox` component options, such as\n * [`triggerQueryOnClear`]{@link Querybox.options.triggerQueryOnClear}.\n * ```html\n *
\n * ```\n *\n * In this second case, the `Searchbox` instantiates an `Omnibox` component. You can configure this `Omnibox`\n * instance using any of the `Omnibox` component options, such as\n * [`placeholder`]{@link Omnibox.options.placeholder}.\n * Moreover, since the `Omnibox` component inherits all of the `Querybox` component options, the\n * `data-trigger-query-on-clear` option from the previous example would also work on this `Omnibox` instance.\n * ```html\n *
\n * ```\n *\n * Default value is `true`.\n */\n enableOmnibox: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: true })\n };\n return Searchbox;\n}(Component_1.Component));\nexports.Searchbox = Searchbox;\nSearchbox.options = __assign({}, Searchbox.options, Omnibox_1.Omnibox.options, Querybox_1.Querybox.options);\n// Only parse omnibox option if omnibox is enabled\nunderscore_1.each(Searchbox.options, function (value, key) {\n if (key in Omnibox_1.Omnibox.options && !(key in Querybox_1.Querybox.options)) {\n Searchbox.options[key] = underscore_1.extend({ depend: 'enableOmnibox' }, value);\n }\n});\nInitialization_1.Initialization.registerAutoCreateComponent(Searchbox);\n\n\n/***/ }),\n\n/***/ 488:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Result_1 = __webpack_require__(51);\nvar RefResult_1 = __webpack_require__(489);\nvar ExpressionEndOfInput_1 = __webpack_require__(215);\nvar _ = __webpack_require__(0);\nvar ExpressionRef = /** @class */ (function () {\n function ExpressionRef(ref, occurrence, id, grammar) {\n this.ref = ref;\n this.occurrence = occurrence;\n this.id = id;\n this.grammar = grammar;\n }\n ExpressionRef.prototype.parse = function (input, end) {\n var ref = this.grammar.getExpression(this.ref);\n if (ref == null) {\n throw new Error('Expression not found:' + this.ref);\n }\n if (this.occurrence == '?' || this.occurrence == null) {\n return this.parseOnce(input, end, ref);\n }\n else {\n return this.parseMany(input, end, ref);\n }\n };\n ExpressionRef.prototype.parseOnce = function (input, end, ref) {\n var refResult = ref.parse(input, end);\n var success = refResult.isSuccess();\n if (!success && this.occurrence == '?') {\n if (end) {\n // if end was found\n if (input.length == 0) {\n return new RefResult_1.RefResult([], this, input, refResult);\n }\n // if end was not found and all error expression are EndOfInput, reparse with end = false.\n if (_.all(refResult.getBestExpect(), function (expect) { return expect.expression == ExpressionEndOfInput_1.ExpressionEndOfInput; })) {\n return new RefResult_1.RefResult([new Result_1.Result(null, ExpressionEndOfInput_1.ExpressionEndOfInput, input)], this, input, refResult);\n }\n return refResult;\n }\n // the ref is not required and it do not need to end the input\n return new RefResult_1.RefResult([], this, input, null);\n }\n return new RefResult_1.RefResult([refResult], this, input, success ? null : refResult);\n };\n ExpressionRef.prototype.parseMany = function (input, end, ref) {\n var subResults = [];\n var subResult;\n var subInput = input;\n var success;\n // try to parse until it do not match, do not manage the end yet\n do {\n subResult = ref.parse(subInput, false);\n success = subResult.isSuccess();\n if (success) {\n subResults.push(subResult);\n subInput = subInput.substr(subResult.getLength());\n }\n } while (success && subResult.input != subInput);\n // minimal occurance of a ref\n var requiredOccurance = _.isNumber(this.occurrence) ? this.occurrence : this.occurrence == '+' ? 1 : 0;\n // if the minimal occurance is not reached add the fail result to the list\n if (subResults.length < requiredOccurance) {\n subResults.push(subResult);\n }\n else if (end) {\n // if there is at least one match, check if the last match is at the end\n if (subResults.length > 0) {\n var last = _.last(subResults);\n subResult = ref.parse(last.input, true);\n if (subResult.isSuccess()) {\n // if successful, replace the last subResult by the one with end\n subResults[subResults.length - 1] = subResult;\n }\n else {\n // if not successful, we keep the last successful result and we add a endOfInputExpected Result after it\n subResults.push(new Result_1.Result(null, ExpressionEndOfInput_1.ExpressionEndOfInput, last.input.substr(last.getLength())));\n // we parse back the last with the length of the successful Result (at the same place we put the endOfInputExpected) and put it in failAttempt\n subResult = ref.parse(last.input.substr(last.getLength()), true);\n }\n }\n else if (input.length != 0) {\n // if there is no result at all and we are not at the end, return a endOfInputExpected Result\n var endOfInput = new Result_1.Result(null, ExpressionEndOfInput_1.ExpressionEndOfInput, input);\n return new RefResult_1.RefResult([endOfInput], this, input, subResult);\n }\n }\n return new RefResult_1.RefResult(subResults, this, input, subResult);\n };\n ExpressionRef.prototype.toString = function () {\n return this.id;\n };\n return ExpressionRef;\n}());\nexports.ExpressionRef = ExpressionRef;\n\n\n/***/ }),\n\n/***/ 489:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Result_1 = __webpack_require__(51);\nvar _ = __webpack_require__(0);\nvar RefResult = /** @class */ (function (_super) {\n __extends(RefResult, _super);\n function RefResult(results, expression, input, lastResult) {\n var _this = _super.call(this, results, expression, input) || this;\n _this.expression = expression;\n _this.input = input;\n if (_.last(results) != lastResult) {\n _this.failAttempt = lastResult;\n if (_this.failAttempt != null) {\n _this.failAttempt.parent = _this;\n }\n }\n return _this;\n }\n /**\n * Return all fail result.\n */\n RefResult.prototype.getExpect = function () {\n var expect = _super.prototype.getExpect.call(this);\n // add the failAttempt to the expect\n if (this.failAttempt != null) {\n return expect.concat(this.failAttempt.getExpect());\n }\n return expect;\n };\n /**\n * Clean the result to have the most relevant result. If the result is successful just return a clone of it.\n */\n RefResult.prototype.clean = function (path) {\n // if there is no failAttempt, we will use the default clean\n if (this.failAttempt != null && (path != null || !this.isSuccess())) {\n path = path || _.last(this.getBestExpect()).path(this);\n var next = _.first(path);\n // if the next is in the subResults, not the failAttempt, do the default clean;\n if (next != null && next == this.failAttempt) {\n var last = _.last(this.subResults);\n // if the last is not successful, remove it because we want the failAttempt path\n var subResults = _.map(last != null && last.isSuccess() ? this.subResults : _.initial(this.subResults), function (subResult) {\n return subResult.clean();\n });\n subResults.push(next.clean(_.rest(path)));\n return new Result_1.Result(subResults, this.expression, this.input);\n }\n }\n return _super.prototype.clean.call(this, path);\n };\n return RefResult;\n}(Result_1.Result));\nexports.RefResult = RefResult;\n\n\n/***/ }),\n\n/***/ 490:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar OptionResult_1 = __webpack_require__(491);\nvar ExpressionOptions = /** @class */ (function () {\n function ExpressionOptions(parts, id) {\n this.parts = parts;\n this.id = id;\n }\n ExpressionOptions.prototype.parse = function (input, end) {\n var failAttempt = [];\n for (var i = 0; i < this.parts.length; i++) {\n var subResult = this.parts[i].parse(input, end);\n if (subResult.isSuccess()) {\n return new OptionResult_1.OptionResult(subResult, this, input, failAttempt);\n }\n failAttempt.push(subResult);\n }\n return new OptionResult_1.OptionResult(null, this, input, failAttempt);\n };\n ExpressionOptions.prototype.toString = function () {\n return this.id;\n };\n return ExpressionOptions;\n}());\nexports.ExpressionOptions = ExpressionOptions;\n\n\n/***/ }),\n\n/***/ 491:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Result_1 = __webpack_require__(51);\nvar _ = __webpack_require__(0);\nvar OptionResult = /** @class */ (function (_super) {\n __extends(OptionResult, _super);\n function OptionResult(result, expression, input, failAttempt) {\n var _this = _super.call(this, result != null ? [result] : null, expression, input) || this;\n _this.result = result;\n _this.expression = expression;\n _this.input = input;\n _this.failAttempt = failAttempt;\n _.forEach(_this.failAttempt, function (subResult) {\n subResult.parent = _this;\n });\n return _this;\n }\n /**\n * Return all fail result.\n */\n OptionResult.prototype.getExpect = function () {\n var _this = this;\n var expect = [];\n if (this.result != null) {\n expect = this.result.getExpect();\n }\n expect = _.reduce(this.failAttempt, function (expect, result) { return expect.concat(result.getExpect()); }, expect);\n if (expect.length > 0 && _.all(expect, function (result) { return result.input == _this.input; })) {\n return [this];\n }\n return expect;\n };\n /**\n * Clean the result to have the most relevant result. If the result is successful just return a clone of it.\n */\n OptionResult.prototype.clean = function (path) {\n if (path != null || !this.isSuccess()) {\n // Result will be a ref. We skip it for cleaner tree.\n path = _.rest(path || _.last(this.getBestExpect()).path(this));\n // next can be Result or one of the failAttempt. In both case we have only one child\n var next = _.first(path);\n if (next == null) {\n return new Result_1.Result(null, this.expression, this.input);\n }\n return new Result_1.Result([next.clean(_.rest(path))], this.expression, this.input);\n }\n // Result will be a ref. We skip it for cleaner tree.\n return new Result_1.Result(_.map(this.result.subResults, function (subResult) { return subResult.clean(); }), this.expression, this.input);\n };\n return OptionResult;\n}(Result_1.Result));\nexports.OptionResult = OptionResult;\n\n\n/***/ }),\n\n/***/ 492:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Result_1 = __webpack_require__(51);\nvar Result_2 = __webpack_require__(51);\nvar ExpressionRegExp = /** @class */ (function () {\n function ExpressionRegExp(value, id, grammar) {\n this.value = value;\n this.id = id;\n }\n ExpressionRegExp.prototype.parse = function (input, end) {\n var groups = input.match(this.value);\n // if the RegExp do not match at the start, ignore it\n if (groups != null && groups.index != 0) {\n groups = null;\n }\n var result = new Result_1.Result(groups != null ? groups[0] : null, this, input);\n // if is successful and we require the end but the length of parsed is\n // lower than the input length, return a EndOfInputExpected Result\n if (result.isSuccess() && end && input.length > result.value.length) {\n return new Result_2.EndOfInputResult(result);\n }\n return result;\n };\n ExpressionRegExp.prototype.toString = function () {\n return this.id;\n };\n return ExpressionRegExp;\n}());\nexports.ExpressionRegExp = ExpressionRegExp;\n\n\n/***/ }),\n\n/***/ 493:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ExpressionFunction = /** @class */ (function () {\n function ExpressionFunction(func, id, grammar) {\n this.func = func;\n this.id = id;\n this.grammar = grammar;\n }\n ExpressionFunction.prototype.parse = function (input, end) {\n return this.func(input, end, this);\n };\n ExpressionFunction.prototype.toString = function () {\n return this.id;\n };\n return ExpressionFunction;\n}());\nexports.ExpressionFunction = ExpressionFunction;\n\n\n/***/ }),\n\n/***/ 494:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Result_1 = __webpack_require__(51);\nvar ExpressionList = /** @class */ (function () {\n function ExpressionList(parts, id) {\n this.parts = parts;\n this.id = id;\n if (parts.length == 0) {\n throw new Error(JSON.stringify(id) + ' should have at least 1 parts');\n }\n }\n ExpressionList.prototype.parse = function (input, end) {\n var subResults = [];\n var subResult;\n var subInput = input;\n for (var i = 0; i < this.parts.length; i++) {\n var part = this.parts[i];\n subResult = part.parse(subInput, end && i == this.parts.length - 1);\n subResults.push(subResult);\n // if the subResult do not succeed, stop the parsing\n if (!subResult.isSuccess()) {\n break;\n }\n else {\n subInput = subInput.substr(subResult.getLength());\n }\n }\n return new Result_1.Result(subResults, this, input);\n };\n ExpressionList.prototype.toString = function () {\n return this.id;\n };\n return ExpressionList;\n}());\nexports.ExpressionList = ExpressionList;\n\n\n/***/ }),\n\n/***/ 495:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Field_1 = __webpack_require__(217);\nexports.NestedQuery = {\n basicExpressions: ['NestedQuery'],\n grammars: {\n NestedQuery: '[[NestedField][OptionalSpaces][Expressions]]',\n NestedField: '[[Field]]',\n FieldValue: ['NestedQuery']\n },\n include: [Field_1.Field]\n};\n\n\n/***/ }),\n\n/***/ 496:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Basic_1 = __webpack_require__(131);\nexports.Date = {\n grammars: {\n Date: '[DateYear]/[DateMonth]/[DateDay]',\n DateYear: /([0-9]{4})/,\n DateMonth: /(1[0-2]|0?[1-9])/,\n DateDay: /([1-2][0-9]|3[0-1]|0?[1-9])/,\n DateRange: '[Date][Spaces?]..[Spaces?][Date]',\n DateRelative: ['DateRelativeNegative', 'DateRelativeTerm'],\n DateRelativeTerm: /now|today|yesterday/,\n DateRelativeNegative: '[DateRelativeTerm][DateRelativeNegativeRef]',\n DateRelativeNegativeRef: /([\\-\\+][0-9]+(s|m|h|d|mo|y))/\n },\n include: [Basic_1.Basic]\n};\n\n\n/***/ }),\n\n/***/ 497:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Basic_1 = __webpack_require__(131);\nexports.QueryExtension = {\n basicExpressions: ['QueryExtension'],\n grammars: {\n QueryExtension: '$[QueryExtensionName]([QueryExtensionArguments])',\n QueryExtensionName: /\\w+/,\n QueryExtensionArguments: '[QueryExtensionArgumentList*][QueryExtensionArgument]',\n QueryExtensionArgumentList: '[QueryExtensionArgument][Spaces?],[Spaces?]',\n QueryExtensionArgument: '[QueryExtensionArgumentName]:[Spaces?][QueryExtensionArgumentValue]',\n QueryExtensionArgumentName: /\\w+/,\n QueryExtensionArgumentValue: ['SingleQuoted', 'Expressions']\n },\n include: [Basic_1.Basic]\n};\n\n\n/***/ }),\n\n/***/ 498:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SubExpression = {\n basicExpressions: ['SubExpression'],\n grammars: {\n SubExpression: '([Expressions])'\n }\n};\n\n\n/***/ }),\n\n/***/ 499:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar _ = __webpack_require__(0);\nvar Core_1 = __webpack_require__(20);\nvar Strings_1 = __webpack_require__(6);\nvar Dom_1 = __webpack_require__(1);\nvar KeyboardUtils_1 = __webpack_require__(25);\nvar InputManager = /** @class */ (function () {\n function InputManager(element, onchange, magicBox) {\n this.onchange = onchange;\n this.magicBox = magicBox;\n this.hasFocus = false;\n this.root = Core_1.Component.resolveRoot(element);\n this.underlay = document.createElement('div');\n this.underlay.className = 'magic-box-underlay';\n this.highlightContainer = document.createElement('span');\n this.highlightContainer.className = 'magic-box-highlight-container';\n this.underlay.appendChild(this.highlightContainer);\n this.ghostTextContainer = document.createElement('span');\n this.ghostTextContainer.className = 'magic-box-ghost-text';\n this.underlay.appendChild(this.ghostTextContainer);\n this.input = Dom_1.$$(element).find('input');\n if (!this.input) {\n this.input = document.createElement('input');\n element.appendChild(this.underlay);\n element.appendChild(this.input);\n }\n else {\n element.insertBefore(this.underlay, this.input);\n }\n this.setupHandler();\n this.addAccessibilitiesProperties();\n }\n Object.defineProperty(InputManager.prototype, \"expanded\", {\n set: function (isExpanded) {\n this.input.setAttribute('aria-expanded', isExpanded.toString());\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(InputManager.prototype, \"activeDescendant\", {\n set: function (element) {\n if (element) {\n this.input.setAttribute('aria-activedescendant', element.id);\n }\n else {\n this.input.removeAttribute('aria-activedescendant');\n }\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Update the input with the result value\n */\n InputManager.prototype.updateInput = function () {\n if (this.input.value != this.result.input) {\n this.input.value = this.result.input;\n if (this.hasFocus) {\n this.setCursor(this.getValue().length);\n }\n }\n };\n /**\n * Update the highlight with the result value\n */\n InputManager.prototype.updateHighlight = function () {\n Dom_1.$$(this.highlightContainer).empty();\n this.highlightContainer.appendChild(this.result.toHtmlElement());\n };\n /**\n * Update the ghostText with the wordCompletion\n */\n InputManager.prototype.updateWordCompletion = function () {\n Dom_1.$$(this.ghostTextContainer).empty();\n this.ghostTextContainer.innerHTML = '';\n if (this.wordCompletion != null) {\n this.ghostTextContainer.appendChild(document.createTextNode(this.wordCompletion.substr(this.result.input.length)));\n }\n };\n /**\n * Set the result and update visual if needed\n */\n InputManager.prototype.setResult = function (result, wordCompletion) {\n this.result = result;\n this.updateInput();\n this.updateHighlight();\n // reuse last wordCompletion for a better visual\n if (_.isUndefined(wordCompletion) && this.wordCompletion != null && this.wordCompletion.indexOf(this.result.input) == 0) {\n this.updateWordCompletion();\n }\n else {\n this.setWordCompletion(wordCompletion);\n }\n this.updateScroll();\n };\n /**\n * Set the word completion. will be ignore if the word completion do not start with the result input\n */\n InputManager.prototype.setWordCompletion = function (wordCompletion) {\n if (wordCompletion != null && wordCompletion.toLowerCase().indexOf(this.result.input.toLowerCase()) != 0) {\n wordCompletion = null;\n }\n this.wordCompletion = wordCompletion;\n this.updateWordCompletion();\n this.updateScroll();\n };\n /**\n * Set cursor position\n */\n InputManager.prototype.setCursor = function (index) {\n this.input.focus();\n if (this.input.createTextRange) {\n var range = this.input.createTextRange();\n range.move('character', index);\n range.select();\n }\n else if (this.input.selectionStart != null) {\n this.input.focus();\n this.input.setSelectionRange(index, index);\n }\n };\n InputManager.prototype.getCursor = function () {\n return this.input.selectionStart;\n };\n InputManager.prototype.updateScroll = function (defer) {\n var _this = this;\n if (defer === void 0) { defer = true; }\n var callback = function () {\n // this is the cheapest call we can do before update scroll\n if (_this.underlay.clientWidth < _this.underlay.scrollWidth) {\n _this.underlay.style.visibility = 'hidden';\n _this.underlay.scrollLeft = _this.input.scrollLeft;\n _this.underlay.scrollTop = _this.input.scrollTop;\n _this.underlay.style.visibility = 'visible';\n }\n _this.updateScrollDefer = null;\n // one day we will have to remove this\n if (_this.hasFocus) {\n _this.updateScroll();\n }\n };\n // sometime we want it to be updated as soon as posible to have no flickering\n if (!defer) {\n callback();\n }\n else if (this.updateScrollDefer == null) {\n this.updateScrollDefer = requestAnimationFrame(callback);\n }\n };\n InputManager.prototype.setupHandler = function () {\n var _this = this;\n this.input.onblur = function () {\n _this.hasFocus = false;\n setTimeout(function () {\n if (!_this.hasFocus) {\n _this.onblur && _this.onblur();\n }\n }, 300);\n _this.updateScroll();\n };\n this.input.onfocus = function () {\n if (!_this.hasFocus) {\n _this.hasFocus = true;\n _this.updateScroll();\n _this.onfocus && _this.onfocus();\n }\n };\n this.input.onkeydown = function (e) {\n _this.keydown(e);\n };\n this.input.onkeyup = function (e) {\n _this.keyup(e);\n };\n this.input.oncut = function () {\n setTimeout(function () {\n _this.onInputChange();\n });\n };\n this.input.onpaste = function () {\n setTimeout(function () {\n _this.onInputChange();\n });\n };\n };\n InputManager.prototype.addAccessibilitiesProperties = function () {\n this.input.setAttribute('autocomplete', 'off');\n this.input.setAttribute('type', 'text');\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('form', 'coveo-dummy-form');\n this.input.setAttribute('aria-autocomplete', 'list');\n this.input.setAttribute('title', Strings_1.l('InsertAQuery') + \". \" + Strings_1.l('PressEnterToSend'));\n };\n InputManager.prototype.focus = function () {\n var _this = this;\n // neet a timeout for IE8-9\n setTimeout(function () {\n _this.input.focus();\n _this.setCursor(_this.getValue().length);\n });\n };\n InputManager.prototype.blur = function () {\n if (this.hasFocus) {\n this.input.blur();\n }\n };\n InputManager.prototype.keydown = function (e) {\n var _this = this;\n switch (e.keyCode || e.which) {\n case KeyboardUtils_1.KEYBOARD.TAB:\n // Take care of not \"preventing\" the default event behaviour : For accessibility reasons, it is much simpler\n // to simply let the browser do it's standard action (which is to focus out of the input).\n // Instead, handle \"tabPress\" immediately instead of \"keyup\".\n // The focus will be on the next element in the page when the key is released, so keyup on the input will never be triggered.\n this.tabPress();\n this.magicBox.clearSuggestion();\n break;\n default:\n e.stopPropagation();\n if (this.onkeydown == null || this.onkeydown(e.keyCode || e.which)) {\n requestAnimationFrame(function () {\n _this.onInputChange();\n });\n }\n else {\n e.preventDefault();\n }\n break;\n }\n };\n InputManager.prototype.keyup = function (e) {\n switch (e.keyCode || e.which) {\n case KeyboardUtils_1.KEYBOARD.LEFT_ARROW:\n case KeyboardUtils_1.KEYBOARD.RIGHT_ARROW:\n this.handleLeftRightArrow(e);\n break;\n default:\n if (this.onkeydown == null || this.onkeyup(e.keyCode || e.which)) {\n this.onInputChange();\n }\n else {\n e.preventDefault();\n }\n break;\n }\n };\n InputManager.prototype.handleLeftRightArrow = function (e) {\n var querySuggestPreview = Dom_1.$$(this.root).find(\".\" + Core_1.Component.computeCssClassNameForType('QuerySuggestPreview'));\n if (!querySuggestPreview) {\n this.onchangecursor();\n }\n var inputChanged = this.onkeydown == null || this.onkeyup(e.keyCode || e.which);\n inputChanged ? this.onInputChange() : e.preventDefault();\n };\n InputManager.prototype.tabPress = function () {\n this.ontabpress && this.ontabpress();\n this.onblur && this.onblur();\n };\n InputManager.prototype.onInputChange = function () {\n if (this.result.input != this.input.value) {\n this.onchange(this.input.value, false);\n }\n };\n InputManager.prototype.getValue = function () {\n return this.input.value;\n };\n InputManager.prototype.getWordCompletion = function () {\n return this.wordCompletion;\n };\n return InputManager;\n}());\nexports.InputManager = InputManager;\n\n\n/***/ }),\n\n/***/ 500:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [0, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar underscore_1 = __webpack_require__(0);\nvar ProcessingStatus;\n(function (ProcessingStatus) {\n ProcessingStatus[ProcessingStatus[\"Finished\"] = 0] = \"Finished\";\n ProcessingStatus[ProcessingStatus[\"TimedOut\"] = 1] = \"TimedOut\";\n ProcessingStatus[ProcessingStatus[\"Overriden\"] = 2] = \"Overriden\";\n})(ProcessingStatus = exports.ProcessingStatus || (exports.ProcessingStatus = {}));\n/**\n * IE11 equivalent of Promise.race\n * Adapted from Promise.race(iterable) polyfill on https://www.promisejs.org/api/\n */\nfunction racePromises(promises) {\n return new Promise(function (resolve, reject) { return promises.forEach(function (value) { return Promise.resolve(value).then(resolve, reject); }); });\n}\nvar QueryProcessor = /** @class */ (function () {\n function QueryProcessor(options) {\n if (options === void 0) { options = {}; }\n this.options = __assign({ timeout: 500 }, options);\n }\n /**\n * Overrides the previous queries and accumulates the result of promise arrays with a timeout.\n */\n QueryProcessor.prototype.processQueries = function (queries) {\n return __awaiter(this, void 0, void 0, function () {\n var _this = this;\n var asyncQueries;\n return __generator(this, function (_a) {\n this.overrideIfProcessing();\n this.processedResults = new Array(queries.length);\n asyncQueries = queries.map(function (query) { return (query instanceof Promise ? query : Promise.resolve(query)); });\n return [2 /*return*/, racePromises([\n this.accumulateResultsChronologically(asyncQueries).then(function () { return _this.buildProcessResults(ProcessingStatus.Finished); }),\n this.waitForOverride().then(function () { return _this.buildProcessResults(ProcessingStatus.Overriden); }),\n this.waitForTimeout().then(function () { return _this.buildProcessResults(ProcessingStatus.TimedOut); })\n ])];\n });\n });\n };\n QueryProcessor.prototype.overrideIfProcessing = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n if (this.override) {\n this.override();\n }\n return [2 /*return*/];\n });\n });\n };\n Object.defineProperty(QueryProcessor.prototype, \"orderedResults\", {\n get: function () {\n return underscore_1.flatten(this.processedResults.filter(function (result) { return !!result; }), true);\n },\n enumerable: true,\n configurable: true\n });\n QueryProcessor.prototype.buildProcessResults = function (status) {\n return {\n status: status,\n results: status !== ProcessingStatus.Overriden ? this.orderedResults : []\n };\n };\n QueryProcessor.prototype.accumulateResultsChronologically = function (queries) {\n return __awaiter(this, void 0, void 0, function () {\n var output;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n output = this.processedResults;\n return [4 /*yield*/, Promise.all(queries.map(function (query, i) { return query.then(function (items) { return (output[i] = items); }); }))];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n QueryProcessor.prototype.waitForOverride = function () {\n var _this = this;\n return new Promise(function (resolve) {\n _this.override = function () {\n _this.override = null;\n resolve();\n };\n });\n };\n QueryProcessor.prototype.waitForTimeout = function () {\n var _this = this;\n return new Promise(function (resolve) { return setTimeout(function () { return resolve(); }, _this.options.timeout); });\n };\n return QueryProcessor;\n}());\nexports.QueryProcessor = QueryProcessor;\n\n\n/***/ }),\n\n/***/ 503:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar NestedQuery_1 = __webpack_require__(495);\nvar QueryExtension_1 = __webpack_require__(497);\nvar Basic_1 = __webpack_require__(131);\nvar Field_1 = __webpack_require__(217);\nvar SubExpression_1 = __webpack_require__(498);\nexports.Complete = {\n include: [NestedQuery_1.NestedQuery, QueryExtension_1.QueryExtension, SubExpression_1.SubExpression, Field_1.Field, Basic_1.Basic]\n};\n\n\n/***/ }),\n\n/***/ 504:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Grammar_1 = __webpack_require__(173);\nvar _ = __webpack_require__(0);\nfunction loadSubGrammar(expressions, basicExpressions, grammars, subGrammar) {\n _.each(subGrammar.expressions, function (expression) {\n if (!_.contains(expressions, expression)) {\n expressions.push(expression);\n }\n });\n _.each(subGrammar.basicExpressions, function (expression) {\n if (!_.contains(basicExpressions, expression)) {\n basicExpressions.push(expression);\n }\n });\n _.each(subGrammar.grammars, function (expressionDef, id) {\n if (!(id in grammars)) {\n grammars[id] = expressionDef;\n }\n else {\n if (_.isArray(grammars[id]) && _.isArray(expressionDef)) {\n _.each(expressionDef, function (value) {\n grammars[id].push(value);\n });\n }\n else {\n _.each(expressionDef, function (value) {\n grammars[id].push(value);\n });\n throw new Error('Can not merge ' + id + '(' + JSON.stringify(expressionDef) + ' => ' + JSON.stringify(grammars[id]) + ')');\n }\n }\n });\n}\nfunction Expressions() {\n var subGrammars = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n subGrammars[_i] = arguments[_i];\n }\n var expressions = [];\n var BasicExpression = [];\n var grammars = {\n Start: ['Expressions', 'Empty'],\n Expressions: '[OptionalSpaces][Expression][ExpressionsList*][OptionalSpaces]',\n ExpressionsList: '[Spaces][Expression]',\n Expression: expressions,\n BasicExpression: BasicExpression,\n OptionalSpaces: / */,\n Spaces: / +/,\n Empty: /(?!.)/\n };\n for (var i = 0; i < subGrammars.length; i++) {\n loadSubGrammar(expressions, BasicExpression, grammars, subGrammars[i]);\n _.each(subGrammars[i].include, function (subGrammar) {\n if (!_.contains(subGrammars, subGrammar)) {\n subGrammars.push(subGrammar);\n }\n });\n }\n expressions.push('BasicExpression');\n return {\n start: 'Start',\n expressions: grammars\n };\n}\nexports.Expressions = Expressions;\nfunction ExpressionsGrammar() {\n var subGrammars = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n subGrammars[_i] = arguments[_i];\n }\n var grammar = Expressions.apply(this, subGrammars);\n return new Grammar_1.Grammar(grammar.start, grammar.expressions);\n}\nexports.ExpressionsGrammar = ExpressionsGrammar;\n\n\n/***/ }),\n\n/***/ 505:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Those are the string definitions of events for ResultPreviewsManager.\n *\n * Those events should be bound to the element returned by `resolveRoot`.\n */\nvar ResultPreviewsManagerEvents = /** @class */ (function () {\n function ResultPreviewsManagerEvents() {\n }\n /**\n * Executed when building a query to fetch result previews.\n * This always receives {@link IBuildingResultPreviewsQueryEventArgs} as arguments.\n */\n ResultPreviewsManagerEvents.buildingResultPreviewsQuery = 'buildingResultPreviewsQuery';\n /**\n * Executed when a {@link Suggestion} is focused before {@link PopulateSearchResultPreviews} is called to fetch more options.\n * This always receives {@link IUpdateResultPreviewsManagerOptionsEventArgs} as arguments.\n */\n ResultPreviewsManagerEvents.updateResultPreviewsManagerOptions = 'updateResultPreviewsManagerOptions';\n /**\n * Executed when a {@link Suggestion} is focused and waiting for search result previews.\n * This always receives {@link IPopulateSearchResultPreviewsEventArgs} as arguments.\n */\n ResultPreviewsManagerEvents.populateSearchResultPreviews = 'populateSearchResultPreviews';\n return ResultPreviewsManagerEvents;\n}());\nexports.ResultPreviewsManagerEvents = ResultPreviewsManagerEvents;\n\n\n/***/ }),\n\n/***/ 506:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ComponentOptionsModel_1 = __webpack_require__(28);\nvar QueryboxOptionsProcessing = /** @class */ (function () {\n function QueryboxOptionsProcessing(owner) {\n this.owner = owner;\n }\n Object.defineProperty(QueryboxOptionsProcessing.prototype, \"options\", {\n get: function () {\n return this.owner.options;\n },\n set: function (options) {\n this.owner.options = options;\n },\n enumerable: true,\n configurable: true\n });\n QueryboxOptionsProcessing.prototype.postProcess = function () {\n this.options = __assign({}, this.options, this.owner.componentOptionsModel.get(ComponentOptionsModel_1.ComponentOptionsModel.attributesEnum.searchBox));\n this.processQueryOnClearVersusEmptyQuery();\n this.processQueryOnClearVersusSearchAsYouType();\n };\n QueryboxOptionsProcessing.prototype.processQueryOnClearVersusEmptyQuery = function () {\n if (this.options.triggerQueryOnClear && this.owner.searchInterface.options.allowQueriesWithoutKeywords === false) {\n this.owner.logger.warn('Forcing option triggerQueryOnClear to false, as it is not supported when the search interface is configured to not allow queries without keywords (data-allow-queries-without-keywords=\"false\")', this.owner);\n this.options.triggerQueryOnClear = false;\n }\n };\n QueryboxOptionsProcessing.prototype.processQueryOnClearVersusSearchAsYouType = function () {\n if (this.owner.searchInterface.options.allowQueriesWithoutKeywords === true &&\n this.options.triggerQueryOnClear === false &&\n this.options.enableSearchAsYouType === true) {\n this.owner.logger.warn('Forcing option triggerQueryOnClear to true, since search-as-you-type is enabled', this.owner);\n this.options.triggerQueryOnClear = true;\n }\n };\n return QueryboxOptionsProcessing;\n}());\nexports.QueryboxOptionsProcessing = QueryboxOptionsProcessing;\n\n\n/***/ }),\n\n/***/ 507:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar _ = __webpack_require__(0);\nvar MiscModules_1 = __webpack_require__(72);\nvar QueryboxQueryParameters = /** @class */ (function () {\n function QueryboxQueryParameters(options) {\n this.options = options;\n }\n QueryboxQueryParameters.queryIsBlocked = function () {\n // This code runs on some assumption :\n // Since all \"buildingQuery\" events would have to be run in the same call stack\n // We can add a static flag to block 2 or more query box/omnibox from trying to modify the query inside the same event.\n // If 2 query box are activated, we get duplicate terms in the query, or duplicate term correction with did you mean.\n // This means that only one query box/searchbox would be able to modify the query in a single search page.\n // This also means that if there is 2 search box enabled, the first one in the markup in the page would be able to do the job correctly as far as the query is concerned.\n // The second one is inactive as far as the query is concerned.\n // The flag gets reset in \"defer\" (setTimeout 0) so that it gets reset correctly when the query event has finished executing\n if (!QueryboxQueryParameters.queryIsCurrentlyBlocked) {\n QueryboxQueryParameters.queryIsCurrentlyBlocked = true;\n MiscModules_1.Defer.defer(function () { return QueryboxQueryParameters.allowDuplicateQuery(); });\n return false;\n }\n return true;\n };\n QueryboxQueryParameters.allowDuplicateQuery = function () {\n QueryboxQueryParameters.queryIsCurrentlyBlocked = false;\n };\n QueryboxQueryParameters.prototype.addParameters = function (queryBuilder, lastQuery) {\n if (!QueryboxQueryParameters.queryIsBlocked()) {\n if (this.options.enableWildcards) {\n queryBuilder.enableWildcards = true;\n }\n if (this.options.enableQuestionMarks) {\n queryBuilder.enableQuestionMarks = true;\n }\n if (this.options.enableLowercaseOperators) {\n queryBuilder.enableLowercaseOperators = true;\n }\n if (!_.isEmpty(lastQuery)) {\n queryBuilder.enableQuerySyntax = this.options.enableQuerySyntax;\n queryBuilder.expression.add(lastQuery);\n if (this.options.enablePartialMatch) {\n queryBuilder.enablePartialMatch = this.options.enablePartialMatch;\n if (this.options.partialMatchKeywords) {\n queryBuilder.partialMatchKeywords = this.options.partialMatchKeywords;\n }\n if (this.options.partialMatchThreshold) {\n queryBuilder.partialMatchThreshold = this.options.partialMatchThreshold;\n }\n }\n }\n }\n };\n QueryboxQueryParameters.queryIsCurrentlyBlocked = false;\n return QueryboxQueryParameters;\n}());\nexports.QueryboxQueryParameters = QueryboxQueryParameters;\n\n\n/***/ }),\n\n/***/ 51:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ExpressionEndOfInput_1 = __webpack_require__(215);\nvar ExpressionConstant_1 = __webpack_require__(216);\nvar _ = __webpack_require__(0);\nvar Result = /** @class */ (function () {\n function Result(value, expression, input) {\n var _this = this;\n this.expression = expression;\n this.input = input;\n if (_.isString(value)) {\n this.value = value;\n }\n else if (_.isArray(value)) {\n this.subResults = value;\n _.forEach(this.subResults, function (subResult) {\n subResult.parent = _this;\n });\n }\n }\n Result.prototype.isSuccess = function () {\n // if null is the value, this mean the expression could not parse this input\n return this.value != null || (this.subResults != null && _.all(this.subResults, function (subResult) { return subResult.isSuccess(); }));\n };\n /**\n * Return path to this result ([parent.parent, parent, this])\n */\n Result.prototype.path = function (until) {\n var path = this.parent != null && this.parent != until ? this.parent.path(until) : [];\n path.push(this);\n return path;\n };\n /**\n * Return the closest parent that match the condition (can be it-self). If match is a string, it will search for the result expresion id\n */\n Result.prototype.findParent = function (match) {\n var parent = this;\n var iterator = _.isString(match) ? function (result) { return match == result.expression.id; } : match;\n while (parent != null && !iterator(parent)) {\n parent = parent.parent;\n }\n return parent;\n };\n /**\n * Return the first child that match the condition (can be it-self). If match is a string, it will search for the result expresion id\n */\n Result.prototype.find = function (match) {\n var iterator = _.isString(match) ? function (result) { return match == result.expression.id; } : match;\n if (iterator(this)) {\n return this;\n }\n if (this.subResults) {\n for (var i = 0; i < this.subResults.length; i++) {\n var subResultFind = this.subResults[i].find(iterator);\n if (subResultFind) {\n return subResultFind;\n }\n }\n }\n return null;\n };\n /**\n * Return all children that match the condition (can be it-self). If match is a string, it will search for the result expresion id\n */\n Result.prototype.findAll = function (match) {\n var results = [];\n var iterator = _.isString(match) ? function (result) { return match == result.expression.id; } : match;\n if (iterator(this)) {\n results.push(this);\n }\n if (this.subResults) {\n results = _.reduce(this.subResults, function (results, subResult) { return results.concat(subResult.findAll(iterator)); }, results);\n }\n return results;\n };\n /**\n * Return the first child that match the condition (can be it-self). If match is a string, it will search for the result expresion id\n */\n Result.prototype.resultAt = function (index, match) {\n if (index < 0 || index > this.getLength()) {\n return [];\n }\n if (match != null) {\n if (_.isString(match)) {\n if (match == this.expression.id) {\n return [this];\n }\n }\n else {\n if (match(this)) {\n return [this];\n }\n }\n }\n else {\n var value = this.value == null && this.subResults == null ? this.input : this.value;\n if (value != null) {\n return [this];\n }\n }\n if (this.subResults != null) {\n var results = [];\n for (var i = 0; i < this.subResults.length; i++) {\n var subResult = this.subResults[i];\n results = results.concat(subResult.resultAt(index, match));\n index -= subResult.getLength();\n if (index < 0) {\n break;\n }\n }\n return results;\n }\n return [];\n };\n /**\n * Return all fail result.\n */\n Result.prototype.getExpect = function () {\n if (this.value == null && this.subResults == null) {\n return [this];\n }\n if (this.subResults != null) {\n return _.reduce(this.subResults, function (expect, result) { return expect.concat(result.getExpect()); }, []);\n }\n return [];\n };\n /**\n * Return the best fail result (The farthest result who got parsed). We also remove duplicate and always return the simplest result of a kind\n */\n Result.prototype.getBestExpect = function () {\n var expects = this.getExpect();\n var groups = _.groupBy(expects, function (expect) { return expect.input; });\n var key = _.last(_.keys(groups).sort(function (a, b) {\n return b.length - a.length;\n }));\n var bestResults = groups[key];\n var groups = _.groupBy(bestResults, function (expect) { return expect.expression.id; });\n return _.map(groups, function (bestResults) {\n return _.chain(bestResults)\n .map(function (result) {\n return {\n path: result.path().length,\n result: result\n };\n })\n .sortBy('path')\n .pluck('result')\n .first()\n .value();\n });\n };\n Result.prototype.getHumanReadableExpect = function () {\n var expect = this.getBestExpect();\n var input = expect.length > 0 ? _.last(expect).input : '';\n return ('Expected ' +\n _.map(expect, function (result) { return result.getHumanReadable(); }).join(' or ') +\n ' but ' +\n (input.length > 0 ? JSON.stringify(input[0]) : 'end of input') +\n ' found.');\n };\n /**\n * Return a string that represent what is before this result\n */\n Result.prototype.before = function () {\n if (this.parent == null) {\n return '';\n }\n var index = _.indexOf(this.parent.subResults, this);\n return (this.parent.before() +\n _.chain(this.parent.subResults)\n .first(index)\n .map(function (subResult) { return subResult.toString(); })\n .join('')\n .value());\n };\n /**\n * Return a string that represent what is after this result\n */\n Result.prototype.after = function () {\n if (this.parent == null) {\n return '';\n }\n var index = _.indexOf(this.parent.subResults, this);\n return (_.chain(this.parent.subResults)\n .last(this.parent.subResults.length - index - 1)\n .map(function (subResult) { return subResult.toString(); })\n .join('')\n .value() + this.parent.after());\n };\n /**\n * Return the length of the result\n */\n Result.prototype.getLength = function () {\n if (this.value != null) {\n return this.value.length;\n }\n if (this.subResults != null) {\n return _.reduce(this.subResults, function (length, subResult) { return length + subResult.getLength(); }, 0);\n }\n return this.input.length;\n };\n Result.prototype.toHtmlElement = function () {\n var element = document.createElement('span');\n var id = this.expression != null ? this.expression.id : null;\n if (id != null) {\n element.setAttribute('data-id', id);\n }\n element.setAttribute('data-success', this.isSuccess().toString());\n if (this.value != null) {\n element.appendChild(document.createTextNode(this.value));\n element.setAttribute('data-value', this.value);\n }\n else if (this.subResults != null) {\n _.each(this.subResults, function (subResult) {\n element.appendChild(subResult.toHtmlElement());\n });\n }\n else {\n element.appendChild(document.createTextNode(this.input));\n element.setAttribute('data-input', this.input);\n element.className = 'magic-box-error' + (this.input.length > 0 ? '' : ' magic-box-error-empty');\n }\n element['result'] = this;\n return element;\n };\n /**\n * Clean the result to have the most relevant result. If the result is successful just return a clone of it.\n */\n Result.prototype.clean = function (path) {\n if (path != null || !this.isSuccess()) {\n path = path || _.last(this.getBestExpect()).path(this);\n var next = _.first(path);\n if (next != null) {\n var nextIndex = _.indexOf(this.subResults, next);\n var subResults = nextIndex == -1 ? [] : _.map(_.first(this.subResults, nextIndex), function (subResult) { return subResult.clean(); });\n subResults.push(next.clean(_.rest(path)));\n return new Result(subResults, this.expression, this.input);\n }\n else {\n return new Result(null, this.expression, this.input);\n }\n }\n if (this.value != null) {\n return new Result(this.value, this.expression, this.input);\n }\n if (this.subResults != null) {\n return new Result(_.map(this.subResults, function (subResult) { return subResult.clean(); }), this.expression, this.input);\n }\n };\n Result.prototype.clone = function () {\n if (this.value != null) {\n return new Result(this.value, this.expression, this.input);\n }\n if (this.subResults != null) {\n return new Result(_.map(this.subResults, function (subResult) { return subResult.clone(); }), this.expression, this.input);\n }\n return new Result(null, this.expression, this.input);\n };\n Result.prototype.toString = function () {\n if (this.value != null) {\n return this.value;\n }\n if (this.subResults != null) {\n return _.map(this.subResults, function (subresult) { return subresult.toString(); }).join('');\n }\n return this.input;\n };\n Result.prototype.getHumanReadable = function () {\n if (this.expression instanceof ExpressionConstant_1.ExpressionConstant) {\n return JSON.stringify(this.expression.value);\n }\n return this.expression.id;\n };\n return Result;\n}());\nexports.Result = Result;\nvar EndOfInputResult = /** @class */ (function (_super) {\n __extends(EndOfInputResult, _super);\n function EndOfInputResult(result) {\n var _this = _super.call(this, [result], ExpressionEndOfInput_1.ExpressionEndOfInput, result.input) || this;\n var endOfInput = new Result(null, ExpressionEndOfInput_1.ExpressionEndOfInput, result.input.substr(result.getLength()));\n endOfInput.parent = _this;\n _this.subResults.push(endOfInput);\n return _this;\n }\n return EndOfInputResult;\n}(Result));\nexports.EndOfInputResult = EndOfInputResult;\n\n\n/***/ }),\n\n/***/ 559:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GlobalExports_1 = __webpack_require__(3);\nvar ExpressionConstant_1 = __webpack_require__(216);\nvar ExpressionEndOfInput_1 = __webpack_require__(215);\nvar ExpressionFunction_1 = __webpack_require__(493);\nvar ExpressionList_1 = __webpack_require__(494);\nvar ExpressionOptions_1 = __webpack_require__(490);\nvar ExpressionRef_1 = __webpack_require__(488);\nvar ExpressionRegExp_1 = __webpack_require__(492);\nvar Grammar_1 = __webpack_require__(173);\nvar Grammars_1 = __webpack_require__(560);\nvar InputManager_1 = __webpack_require__(499);\nvar MagicBox_1 = __webpack_require__(219);\nvar MagicBoxUtils_1 = __webpack_require__(220);\nvar OptionResult_1 = __webpack_require__(491);\nvar RefResult_1 = __webpack_require__(489);\nvar Result_1 = __webpack_require__(51);\nvar SuggestionsManager_1 = __webpack_require__(218);\nexports.GrammarsImportedLocally = Grammars_1.Grammars;\nfunction doMagicBoxExport() {\n GlobalExports_1.exportGlobally({\n MagicBox: {\n EndOfInputResult: Result_1.EndOfInputResult,\n ExpressionConstant: ExpressionConstant_1.ExpressionConstant,\n ExpressionEndOfInput: ExpressionEndOfInput_1.ExpressionEndOfInput,\n ExpressionFunction: ExpressionFunction_1.ExpressionFunction,\n ExpressionList: ExpressionList_1.ExpressionList,\n ExpressionOptions: ExpressionOptions_1.ExpressionOptions,\n ExpressionRef: ExpressionRef_1.ExpressionRef,\n ExpressionRegExp: ExpressionRegExp_1.ExpressionRegExp,\n Grammar: Grammar_1.Grammar,\n Grammars: Grammars_1.Grammars,\n InputManager: InputManager_1.InputManager,\n Instance: MagicBox_1.MagicBoxInstance,\n OptionResult: OptionResult_1.OptionResult,\n RefResult: RefResult_1.RefResult,\n Result: Result_1.Result,\n SuggestionsManager: SuggestionsManager_1.SuggestionsManager,\n Utils: MagicBoxUtils_1.MagicBoxUtils,\n create: MagicBox_1.createMagicBox,\n requestAnimationFrame: MagicBox_1.requestAnimationFrame\n }\n });\n}\nexports.doMagicBoxExport = doMagicBoxExport;\n\n\n/***/ }),\n\n/***/ 560:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Basic_1 = __webpack_require__(131);\nvar Complete_1 = __webpack_require__(503);\nvar Date_1 = __webpack_require__(496);\nvar Expressions_1 = __webpack_require__(504);\nvar Field_1 = __webpack_require__(217);\nvar NestedQuery_1 = __webpack_require__(495);\nvar QueryExtension_1 = __webpack_require__(497);\nvar SubExpression_1 = __webpack_require__(498);\nexports.Grammars = {\n Basic: Basic_1.Basic,\n notInWord: Basic_1.notInWord,\n notWordStart: Basic_1.notWordStart,\n Complete: Complete_1.Complete,\n Date: Date_1.Date,\n Expressions: Expressions_1.Expressions,\n ExpressionsGrammar: Expressions_1.ExpressionsGrammar,\n Field: Field_1.Field,\n NestedQuery: NestedQuery_1.NestedQuery,\n QueryExtension: QueryExtension_1.QueryExtension,\n SubExpression: SubExpression_1.SubExpression\n};\n\n\n/***/ }),\n\n/***/ 561:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [0, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dom_1 = __webpack_require__(1);\nvar Strings_1 = __webpack_require__(6);\nvar underscore_1 = __webpack_require__(0);\nvar Component_1 = __webpack_require__(7);\nvar SuggestionsManager_1 = __webpack_require__(218);\nvar ResultPreviewsManagerEvents_1 = __webpack_require__(505);\nvar QueryProcessor_1 = __webpack_require__(500);\nvar Utils_1 = __webpack_require__(4);\nvar ResultPreviewsManager = /** @class */ (function () {\n function ResultPreviewsManager(element, options) {\n if (options === void 0) { options = {}; }\n this.element = element;\n this.options = underscore_1.defaults(options, {\n previewHeaderText: Strings_1.l('QuerySuggestPreview'),\n previewHeaderFieldText: Strings_1.l('QuerySuggestPreviewWithField'),\n previewClass: 'coveo-preview-selectable',\n selectedClass: 'magic-box-selected'\n });\n this.root = Component_1.Component.resolveRoot(element);\n this.previewsProcessor = new QueryProcessor_1.QueryProcessor({ timeout: this.options.timeout });\n }\n Object.defineProperty(ResultPreviewsManager.prototype, \"previewsOwner\", {\n get: function () {\n return this.lastDisplayedSuggestion;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ResultPreviewsManager.prototype, \"hasPreviews\", {\n get: function () {\n return !!this.suggestionsPreviewContainer;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ResultPreviewsManager.prototype, \"focusedPreviewElement\", {\n get: function () {\n if (!this.hasPreviews) {\n return null;\n }\n var focusedElement = this.suggestionsPreviewContainer.findClass(this.options.selectedClass)[0];\n if (!focusedElement || !focusedElement.classList.contains(this.options.previewClass)) {\n return null;\n }\n return focusedElement;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ResultPreviewsManager.prototype, \"previewElements\", {\n get: function () {\n if (!this.hasPreviews) {\n return [];\n }\n return this.suggestionsPreviewContainer.findClass(this.options.previewClass);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ResultPreviewsManager.prototype, \"suggestionsListbox\", {\n get: function () {\n return Dom_1.$$(Dom_1.$$(this.element).findClass('coveo-magicbox-suggestions')[0]);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ResultPreviewsManager.prototype, \"numberOfResultsPerRow\", {\n get: function () {\n var previewSelectables = this.suggestionsPreviewContainer.findClass(this.options.previewClass);\n if (previewSelectables.length === 0) {\n return 0;\n }\n var firstVerticalOffset = previewSelectables[0].offsetTop;\n var firstIndexOnNextRow = underscore_1.findIndex(previewSelectables, function (previewSelectable) { return previewSelectable.offsetTop !== firstVerticalOffset; });\n return firstIndexOnNextRow !== -1 ? firstIndexOnNextRow : previewSelectables.length;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ResultPreviewsManager.prototype, \"previewContainerId\", {\n get: function () {\n return \"coveo-previews-for-\" + this.lastDisplayedSuggestion.dom.id;\n },\n enumerable: true,\n configurable: true\n });\n ResultPreviewsManager.prototype.displaySearchResultPreviewsForSuggestion = function (suggestion) {\n return __awaiter(this, void 0, void 0, function () {\n var externalOptions, currentDelay, isQueryForSuggestionOngoing, arePreviewsForSuggestionCurrentlyDisplayed, _a, status, results;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n externalOptions = this.getExternalOptions();\n currentDelay = (this.lastDelay = Utils_1.Utils.resolveAfter(Utils_1.Utils.isNullOrUndefined(externalOptions.displayAfterDuration) ? 200 : externalOptions.displayAfterDuration));\n return [4 /*yield*/, currentDelay];\n case 1:\n _b.sent();\n if (currentDelay !== this.lastDelay) {\n return [2 /*return*/];\n }\n isQueryForSuggestionOngoing = suggestion && this.lastQueriedSuggestion === suggestion;\n if (isQueryForSuggestionOngoing) {\n return [2 /*return*/];\n }\n arePreviewsForSuggestionCurrentlyDisplayed = this.lastDisplayedSuggestion === suggestion;\n if (arePreviewsForSuggestionCurrentlyDisplayed) {\n this.previewsProcessor.overrideIfProcessing();\n this.lastQueriedSuggestion = null;\n return [2 /*return*/];\n }\n this.lastQueriedSuggestion = suggestion;\n if (!suggestion) {\n this.displaySuggestionPreviews(null, []);\n return [2 /*return*/];\n }\n return [4 /*yield*/, this.getSearchResultPreviewsQuery(suggestion)];\n case 2:\n _a = _b.sent(), status = _a.status, results = _a.results;\n if (status === QueryProcessor_1.ProcessingStatus.Overriden) {\n return [2 /*return*/];\n }\n this.lastQueriedSuggestion = null;\n this.displaySuggestionPreviews(suggestion, results);\n return [2 /*return*/];\n }\n });\n });\n };\n ResultPreviewsManager.prototype.getElementInDirection = function (direction) {\n var previewElements = this.previewElements;\n var focusedIndex = previewElements.indexOf(this.focusedPreviewElement);\n if (focusedIndex === -1) {\n return null;\n }\n if (focusedIndex === 0 && direction === SuggestionsManager_1.Direction.Left) {\n return null;\n }\n return previewElements[(focusedIndex + this.getIncrementInDirection(direction)) % previewElements.length];\n };\n ResultPreviewsManager.prototype.getIncrementInDirection = function (direction) {\n switch (direction) {\n case SuggestionsManager_1.Direction.Left:\n return -1;\n case SuggestionsManager_1.Direction.Right:\n return 1;\n case SuggestionsManager_1.Direction.Up:\n return -this.numberOfResultsPerRow;\n case SuggestionsManager_1.Direction.Down:\n return this.numberOfResultsPerRow;\n }\n };\n ResultPreviewsManager.prototype.setHasPreviews = function (shouldHavePreviews) {\n if (this.hasPreviews === !!shouldHavePreviews) {\n return;\n }\n if (shouldHavePreviews) {\n this.initPreviewForSuggestions();\n }\n else {\n this.revertPreviewForSuggestions();\n }\n };\n ResultPreviewsManager.prototype.initPreviewForSuggestions = function () {\n this.suggestionsPreviewContainer = Dom_1.$$('div', {\n className: 'coveo-suggestion-container'\n }, this.suggestionsListbox.el, this.buildPreviewContainer());\n this.element.appendChild(this.suggestionsPreviewContainer.el);\n this.suggestionsListbox.setAttribute('aria-controls', this.previewContainerId);\n };\n ResultPreviewsManager.prototype.revertPreviewForSuggestions = function () {\n this.element.appendChild(this.suggestionsListbox.el);\n this.suggestionsPreviewContainer.remove();\n this.suggestionsPreviewContainer = null;\n };\n ResultPreviewsManager.prototype.buildPreviewContainer = function () {\n return Dom_1.$$('div', {\n className: 'coveo-preview-container',\n id: this.previewContainerId\n }, (this.resultPreviewsContainer = Dom_1.$$('div', {\n className: 'coveo-preview-results',\n role: 'listbox',\n 'aria-orientation': 'horizontal'\n }))).el;\n };\n ResultPreviewsManager.prototype.getExternalOptions = function () {\n var optionsEventArgs = {};\n Dom_1.$$(this.root).trigger(ResultPreviewsManagerEvents_1.ResultPreviewsManagerEvents.updateResultPreviewsManagerOptions, optionsEventArgs);\n return optionsEventArgs;\n };\n ResultPreviewsManager.prototype.getSearchResultPreviewsQuery = function (suggestion) {\n var populateEventArgs = {\n suggestion: suggestion,\n previewsQueries: []\n };\n Dom_1.$$(this.root).trigger(ResultPreviewsManagerEvents_1.ResultPreviewsManagerEvents.populateSearchResultPreviews, populateEventArgs);\n return this.previewsProcessor.processQueries(populateEventArgs.previewsQueries);\n };\n ResultPreviewsManager.prototype.appendSearchResultPreview = function (preview, position) {\n this.resultPreviewsContainer.append(preview.element);\n preview.element.id = \"coveo-result-preview-\" + position;\n var elementDom = Dom_1.$$(preview.element);\n elementDom.setAttribute('aria-selected', 'false');\n elementDom.setAttribute('role', 'option');\n elementDom.on('click', function () { return preview.onSelect(); });\n elementDom.on('keyboardSelect', function () { return preview.onSelect(); });\n };\n ResultPreviewsManager.prototype.appendSearchResultPreviews = function (previews) {\n var _this = this;\n this.resultPreviewsContainer.empty();\n previews.forEach(function (preview, i) { return _this.appendSearchResultPreview(preview, i); });\n };\n ResultPreviewsManager.prototype.displaySuggestionPreviews = function (suggestion, previews) {\n this.lastDisplayedSuggestion = suggestion;\n this.setHasPreviews(previews && previews.length > 0);\n this.element.classList.toggle('magic-box-hasPreviews', this.hasPreviews);\n if (!this.hasPreviews) {\n return;\n }\n this.appendSearchResultPreviews(previews);\n };\n return ResultPreviewsManager;\n}());\nexports.ResultPreviewsManager = ResultPreviewsManager;\n\n\n/***/ }),\n\n/***/ 562:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dom_1 = __webpack_require__(1);\nvar Strings_1 = __webpack_require__(6);\nvar AccessibleButton_1 = __webpack_require__(17);\nvar MagicBoxClear = /** @class */ (function () {\n function MagicBoxClear(magicBox) {\n this.element = Dom_1.$$('div', {\n className: 'magic-box-clear'\n });\n var clearIcon = Dom_1.$$('div', {\n className: 'magic-box-icon'\n });\n this.element.append(clearIcon.el);\n this.element.insertAfter(Dom_1.$$(magicBox.element).find('input'));\n new AccessibleButton_1.AccessibleButton()\n .withElement(this.element)\n .withLabel(Strings_1.l('Clear'))\n .withSelectAction(function () { return magicBox.clear(); })\n .build();\n this.toggleTabindexAndAriaHidden(false);\n }\n MagicBoxClear.prototype.toggleTabindexAndAriaHidden = function (hasText) {\n var tabindex = hasText ? '0' : '-1';\n this.element.setAttribute('tabindex', tabindex);\n this.element.setAttribute('aria-hidden', \"\" + !hasText);\n };\n return MagicBoxClear;\n}());\nexports.MagicBoxClear = MagicBoxClear;\n\n\n/***/ }),\n\n/***/ 563:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 571:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 572:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar OmniboxEvents_1 = __webpack_require__(34);\nvar _ = __webpack_require__(0);\nvar MagicBoxUtils_1 = __webpack_require__(220);\nvar FieldAddon = /** @class */ (function () {\n function FieldAddon(omnibox) {\n var _this = this;\n this.omnibox = omnibox;\n this.cache = {};\n this.omnibox.bind.on(this.omnibox.element, OmniboxEvents_1.OmniboxEvents.populateOmniboxSuggestions, function (args) {\n args.suggestions.push(_this.getSuggestion());\n });\n }\n FieldAddon.prototype.getSuggestion = function () {\n var _this = this;\n var hash = this.getHash();\n if (hash == null) {\n return null;\n }\n var hashString = this.hashToString(hash);\n if (this.cache[hashString] != null) {\n return this.hashValueToSuggestion(hash, this.cache[hashString]);\n }\n var values;\n if (hash.type == 'FieldName') {\n values = this.fieldNames(hash.current);\n }\n if (hash.type == 'FieldValue') {\n values = this.fieldValues(hash.field, hash.current);\n }\n if (hash.type == 'SimpleFieldName') {\n values = this.simpleFieldNames(hash.current);\n }\n this.cache[hashString] = values;\n values.catch(function () {\n delete _this.cache[hashString];\n });\n return this.hashValueToSuggestion(hash, values);\n };\n FieldAddon.prototype.getHash = function () {\n var fieldName = _.last(this.omnibox.resultAtCursor('FieldName'));\n if (fieldName != null) {\n fieldName = fieldName.findParent('Field') || fieldName;\n var currentField = fieldName.toString();\n var before = fieldName.before();\n var after = fieldName.after();\n return { type: 'FieldName', current: currentField, before: before, after: after };\n }\n var fieldValue = _.last(this.omnibox.resultAtCursor('FieldValue'));\n if (fieldValue) {\n var fieldQuery = fieldValue.findParent('FieldQuery') || (this.omnibox.options.enableSimpleFieldAddon && fieldValue.findParent('FieldSimpleQuery'));\n if (fieldQuery) {\n var field = fieldQuery.find('FieldName').toString();\n if (this.omnibox.options.fieldAlias) {\n if (field in this.omnibox.options.fieldAlias) {\n field = this.omnibox.options.fieldAlias[field];\n }\n }\n var value = fieldValue.toString();\n var before = fieldValue.before();\n var after = fieldValue.after();\n return { type: 'FieldValue', field: field, current: value, before: before, after: after };\n }\n }\n if (this.omnibox.options.enableSimpleFieldAddon) {\n var word = _.last(this.omnibox.resultAtCursor('Word'));\n if (word != null) {\n var current = word.toString();\n var before = word.before();\n var after = word.after();\n return { type: 'SimpleFieldName', current: current, before: before, after: after };\n }\n }\n };\n FieldAddon.prototype.hashToString = function (hash) {\n if (hash == null) {\n return null;\n }\n return hash.type + hash.current + (hash.field || '');\n };\n FieldAddon.prototype.hashValueToSuggestion = function (hash, promise) {\n return promise.then(function (values) {\n var suggestions = _.map(values, function (value, i) {\n var suggestion = {\n text: hash.before +\n (hash.current.toLowerCase().indexOf(value.toLowerCase()) == 0 ? hash.current + value.substr(hash.current.length) : value) +\n hash.after,\n html: MagicBoxUtils_1.MagicBoxUtils.highlightText(value, hash.current, true),\n index: FieldAddon.INDEX - i / values.length\n };\n return suggestion;\n });\n return suggestions;\n });\n };\n FieldAddon.prototype.getFields = function () {\n var _this = this;\n if (this.fields == null) {\n this.fields = new Promise(function (resolve, reject) {\n if (_this.omnibox.options.listOfFields != null) {\n resolve(_this.omnibox.options.listOfFields);\n }\n else {\n var promise = _this.omnibox.queryController.getEndpoint().listFields();\n promise\n .then(function (fieldDescriptions) {\n var fieldNames = _.chain(fieldDescriptions)\n .filter(function (fieldDescription) { return fieldDescription.includeInQuery && fieldDescription.groupByField; })\n .map(function (fieldDescription) { return fieldDescription.name.substr(1); })\n .value();\n resolve(fieldNames);\n })\n .catch(function () {\n reject();\n });\n }\n });\n }\n return this.fields;\n };\n FieldAddon.prototype.fieldNames = function (current) {\n var withAt = current.length > 0 && current[0] == '@';\n var fieldName = withAt ? current.substr(1) : current;\n var fieldNameLC = fieldName.toLowerCase();\n return this.getFields().then(function (fields) {\n var matchFields = _.chain(fields)\n .map(function (fieldName) {\n var fieldNameBeginsWithAt = fieldName.length > 0 && fieldName[0] == '@';\n return {\n index: fieldName.toLowerCase().indexOf(fieldNameLC),\n field: fieldNameBeginsWithAt ? fieldName : '@' + fieldName\n };\n })\n .filter(function (field) {\n return field.index != -1 && field.field.length > current.length;\n })\n .sortBy('index')\n .map(function (field) { return field.field; })\n .value();\n matchFields = _.first(matchFields, 5);\n return matchFields;\n });\n };\n FieldAddon.prototype.fieldValues = function (field, current) {\n return this.omnibox.queryController\n .getEndpoint()\n .listFieldValues({\n pattern: '.*' + current + '.*',\n patternType: 'RegularExpression',\n sortCriteria: 'occurrences',\n field: '@' + field,\n maximumNumberOfValues: 5\n })\n .then(function (values) {\n return _.chain(values)\n .map(function (value) {\n return {\n index: value.value.toLowerCase().indexOf(current),\n value: value.value\n };\n })\n .filter(function (value) {\n return value.value.length > current.length;\n })\n .sortBy('index')\n .map(function (value) {\n return value.value.replace(/ /g, '\\u00A0');\n })\n .value();\n });\n };\n FieldAddon.prototype.simpleFieldNames = function (current) {\n var fieldName = current;\n var fieldNameLC = fieldName.toLowerCase();\n return this.getFields().then(function (fields) {\n var matchFields = _.chain(fields)\n .map(function (field) {\n return {\n index: field.toLowerCase().indexOf(fieldNameLC),\n field: field + ':'\n };\n })\n .filter(function (field) {\n return field.index != -1 && field.field.length > current.length;\n })\n .sortBy('index')\n .map(function (field) { return field.field; })\n .value();\n matchFields = _.first(matchFields, 5);\n return matchFields;\n });\n };\n FieldAddon.INDEX = 64;\n return FieldAddon;\n}());\nexports.FieldAddon = FieldAddon;\n\n\n/***/ }),\n\n/***/ 573:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar OmniboxEvents_1 = __webpack_require__(34);\nvar Dom_1 = __webpack_require__(1);\nvar Utils_1 = __webpack_require__(4);\nvar _ = __webpack_require__(0);\nvar OldOmniboxAddon = /** @class */ (function () {\n function OldOmniboxAddon(omnibox) {\n var _this = this;\n this.omnibox = omnibox;\n this.omnibox.bind.on(this.omnibox.element, OmniboxEvents_1.OmniboxEvents.populateOmniboxSuggestions, function (args) {\n _.each(_this.getSuggestion(), function (suggestion) {\n args.suggestions.push(suggestion);\n });\n });\n }\n OldOmniboxAddon.prototype.getSuggestion = function () {\n var text = this.omnibox.magicBox.getText();\n if (text.length == 0) {\n return null;\n }\n var eventArgs = this.buildPopulateOmniboxEventArgs();\n Dom_1.$$(this.omnibox.root).trigger(OmniboxEvents_1.OmniboxEvents.populateOmnibox, eventArgs);\n return this.rowsToSuggestions(eventArgs.rows);\n };\n OldOmniboxAddon.prototype.getCurrentQueryExpression = function () {\n var cursorPos = this.omnibox.getCursor();\n var value = this.omnibox.getText();\n var length = value.length;\n var start = cursorPos;\n var end = cursorPos;\n if (value[start] == ' ') {\n start--;\n }\n while (start > 0 && value[start] != ' ') {\n start--;\n }\n while (end < length && value[end] != ' ') {\n end++;\n }\n return value.substring(start, end);\n };\n OldOmniboxAddon.prototype.getRegexToSearch = function (strValue) {\n if (strValue == null) {\n strValue = this.omnibox.getText();\n }\n return new RegExp(Utils_1.Utils.escapeRegexCharacter(strValue), 'i');\n };\n OldOmniboxAddon.prototype.getQueryExpressionBreakDown = function () {\n var _this = this;\n var ret = [];\n var queryWords = this.omnibox.getText().split(' ');\n _.each(queryWords, function (word) {\n ret.push({\n word: word,\n regex: _this.getRegexToSearch(word)\n });\n });\n return ret;\n };\n OldOmniboxAddon.prototype.replace = function (searchValue, newValue) {\n this.omnibox.setText(this.omnibox.getText().replace(searchValue, newValue));\n };\n OldOmniboxAddon.prototype.clearCurrentExpression = function () {\n this.replace(this.getCurrentQueryExpression(), '');\n };\n OldOmniboxAddon.prototype.insertAt = function (at, toInsert) {\n var oldValue = this.omnibox.getText();\n var newValue = [oldValue.slice(0, at), toInsert, oldValue.slice(at)].join('');\n this.omnibox.setText(newValue);\n };\n OldOmniboxAddon.prototype.replaceCurrentExpression = function (newValue) {\n this.replace(this.getCurrentQueryExpression(), newValue);\n };\n OldOmniboxAddon.prototype.buildPopulateOmniboxEventArgs = function () {\n var _this = this;\n var currentQueryExpression = this.getCurrentQueryExpression();\n var ret = {\n rows: [],\n completeQueryExpression: {\n word: this.omnibox.getText(),\n regex: this.getRegexToSearch()\n },\n currentQueryExpression: {\n word: currentQueryExpression,\n regex: this.getRegexToSearch(currentQueryExpression)\n },\n allQueryExpressions: this.getQueryExpressionBreakDown(),\n cursorPosition: this.omnibox.getCursor(),\n clear: function () {\n _this.omnibox.clear();\n },\n clearCurrentExpression: function () {\n _this.clearCurrentExpression();\n },\n replace: function (searchValue, newValue) {\n _this.replace(searchValue, newValue);\n },\n replaceCurrentExpression: function (newValue) {\n _this.replaceCurrentExpression(newValue);\n },\n insertAt: function (at, toInsert) {\n _this.insertAt(at, toInsert);\n },\n closeOmnibox: function () {\n _this.omnibox.magicBox.blur();\n }\n };\n return ret;\n };\n OldOmniboxAddon.prototype.rowsToSuggestions = function (rows) {\n return _.map(rows, function (row) {\n if (!Utils_1.Utils.isNullOrUndefined(row.element)) {\n return new Promise(function (resolve) {\n resolve([\n {\n dom: row.element,\n index: row.zIndex\n }\n ]);\n });\n }\n else if (!Utils_1.Utils.isNullOrUndefined(row.deferred)) {\n return new Promise(function (resolve) {\n row.deferred.then(function (row) {\n if (row.element != null) {\n resolve([\n {\n dom: row.element,\n index: row.zIndex\n }\n ]);\n }\n else {\n resolve(null);\n }\n });\n });\n }\n return null;\n });\n };\n return OldOmniboxAddon;\n}());\nexports.OldOmniboxAddon = OldOmniboxAddon;\n\n\n/***/ }),\n\n/***/ 574:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n///\nvar OmniboxEvents_1 = __webpack_require__(34);\nvar _ = __webpack_require__(0);\nvar MagicBoxUtils_1 = __webpack_require__(220);\nvar QueryExtensionAddon = /** @class */ (function () {\n function QueryExtensionAddon(omnibox) {\n var _this = this;\n this.omnibox = omnibox;\n this.cache = {};\n this.omnibox.bind.on(this.omnibox.element, OmniboxEvents_1.OmniboxEvents.populateOmniboxSuggestions, function (args) {\n args.suggestions.push(_this.getSuggestion());\n });\n }\n QueryExtensionAddon.prototype.getSuggestion = function () {\n var _this = this;\n var hash = this.getHash(this.omnibox.magicBox);\n if (hash == null) {\n return null;\n }\n var hashString = this.hashToString(hash);\n if (this.cache[hashString] != null) {\n return this.hashValueToSuggestion(hash, this.cache[hashString]);\n }\n var values = hash.type == 'QueryExtensionName' ? this.names(hash.current) : this.attributeNames(hash.name, hash.current, hash.used);\n this.cache[hashString] = values;\n values.catch(function () {\n delete _this.cache[hashString];\n });\n return this.hashValueToSuggestion(hash, values);\n };\n QueryExtensionAddon.prototype.getHash = function (magicBox) {\n var queryExtension = _.last(magicBox.resultAtCursor('QueryExtension'));\n if (queryExtension != null) {\n var queryExtensionArgumentResults = queryExtension.findAll('QueryExtensionArgument');\n var current = _.last(magicBox.resultAtCursor('QueryExtensionName'));\n if (current != null) {\n return {\n type: 'QueryExtensionName',\n current: current.toString(),\n before: current.before(),\n after: current.after()\n };\n }\n current = _.last(magicBox.resultAtCursor('QueryExtensionArgumentName'));\n if (current != null) {\n var used = _.chain(queryExtensionArgumentResults)\n .map(function (result) {\n var name = result.find('QueryExtensionArgumentName');\n return name && name.toString();\n })\n .compact()\n .value();\n var name = queryExtension.find('QueryExtensionName').toString();\n return {\n type: 'QueryExtensionArgumentName',\n current: current.toString(),\n before: current.before(),\n after: current.after(),\n name: name,\n used: used\n };\n }\n }\n return null;\n };\n QueryExtensionAddon.prototype.hashToString = function (hash) {\n if (hash == null) {\n return null;\n }\n return [hash.type, hash.current, hash.name || '', hash.used ? hash.used.join() : ''].join();\n };\n QueryExtensionAddon.prototype.hashValueToSuggestion = function (hash, promise) {\n return promise.then(function (values) {\n var suggestions = _.map(values, function (value, i) {\n return {\n html: MagicBoxUtils_1.MagicBoxUtils.highlightText(value, hash.current, true),\n text: hash.before + value + hash.after,\n index: QueryExtensionAddon.INDEX - i / values.length\n };\n });\n return suggestions;\n });\n };\n QueryExtensionAddon.prototype.getExtensions = function () {\n if (this.extensions == null) {\n this.extensions = this.omnibox.queryController.getEndpoint().extensions();\n }\n return this.extensions;\n };\n QueryExtensionAddon.prototype.names = function (current) {\n var extensionName = current.toLowerCase();\n return this.getExtensions().then(function (extensions) {\n var matchExtensions = _.chain(extensions)\n .map(function (extension) {\n return {\n index: extension.name.toLowerCase().indexOf(extensionName),\n extension: extension.name\n };\n })\n .filter(function (extension) {\n return extension.index != -1 && extension.extension.length > extensionName.length;\n })\n .sortBy('index')\n .pluck('extension')\n .value();\n matchExtensions = _.first(matchExtensions, 5);\n return matchExtensions;\n });\n };\n QueryExtensionAddon.prototype.attributeNames = function (name, current, used) {\n return this.getExtensions().then(function (extensions) {\n var extension = _.find(extensions, function (extension) { return extension.name == name; });\n if (extension == null) {\n return [];\n }\n else {\n return _.filter(_.difference(extension.argumentNames, used), function (argumentName) { return argumentName.indexOf(current) == 0; });\n }\n });\n };\n QueryExtensionAddon.prototype.hash = function () {\n return;\n };\n QueryExtensionAddon.INDEX = 62;\n return QueryExtensionAddon;\n}());\nexports.QueryExtensionAddon = QueryExtensionAddon;\n\n\n/***/ }),\n\n/***/ 575:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [0, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dom_1 = __webpack_require__(1);\nvar ComponentOptionsModel_1 = __webpack_require__(28);\nvar OmniboxEvents_1 = __webpack_require__(34);\nvar StringUtils_1 = __webpack_require__(22);\nvar underscore_1 = __webpack_require__(0);\nvar QueryStateModel_1 = __webpack_require__(13);\nvar Utils_1 = __webpack_require__(4);\nvar HistoryStore_1 = __webpack_require__(88);\nvar AnalyticsInformation_1 = __webpack_require__(49);\nvar QuerySuggestAddon = /** @class */ (function () {\n function QuerySuggestAddon(omnibox) {\n var _this = this;\n this.omnibox = omnibox;\n Dom_1.$$(this.omnibox.element).on(OmniboxEvents_1.OmniboxEvents.populateOmniboxSuggestions, function (e, args) {\n args.suggestions.push(_this.getSuggestion());\n });\n }\n QuerySuggestAddon.suggestiontHtml = function (suggestion) {\n return suggestion.highlighted.replace(/\\[(.*?)\\]|\\{(.*?)\\}|\\((.*?)\\)/g, function (part, notMatched, matched, corrected) {\n var className = '';\n if (matched) {\n className = 'coveo-omnibox-hightlight';\n }\n if (corrected) {\n className = 'coveo-omnibox-hightlight2';\n }\n var ret;\n if (className) {\n ret = Dom_1.$$('span', {\n className: className\n });\n }\n else {\n ret = Dom_1.$$('span');\n }\n ret.text(notMatched || matched || corrected);\n return ret.el.outerHTML;\n });\n };\n QuerySuggestAddon.isPartialMatch = function (suggestion) {\n // groups : 1=notMatched, 2=matched, 3=corrected\n var parts = StringUtils_1.StringUtils.match(suggestion.highlighted, /\\[(.*?)\\]|\\{(.*?)\\}|\\((.*?)\\)/g);\n var firstFail = underscore_1.find(parts, function (part) { return part[1] != null; });\n // if no fail found, this is a partial or a full match\n if (firstFail == null) {\n return true;\n }\n // if all right parts are notMatched, the right parts is autocomplete\n return underscore_1.every(underscore_1.last(parts, underscore_1.indexOf(parts, firstFail) - parts.length), function (part) { return part[1] != null; });\n };\n QuerySuggestAddon.prototype.getSuggestion = function () {\n var text = this.omnibox.magicBox.getText();\n if (text.length >= this.omnibox.options.querySuggestCharacterThreshold) {\n return this.getQuerySuggest(text);\n }\n return Promise.resolve([]);\n };\n QuerySuggestAddon.prototype.getQuerySuggest = function (text) {\n return __awaiter(this, void 0, void 0, function () {\n var payload, results, _a, completions;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n payload = {\n q: text,\n locale: this.locale,\n searchHub: this.searchHub,\n pipeline: this.pipeline,\n enableWordCompletion: this.enableWordCompletion,\n context: this.context,\n count: this.count,\n tab: this.tab,\n referrer: document.referrer,\n actionsHistory: this.actionsHistory,\n timezone: this.timezone,\n visitorId: this.visitorId,\n isGuestUser: this.isGuestUser\n };\n Dom_1.$$(this.omnibox.getBindings().searchInterface.element).trigger(OmniboxEvents_1.OmniboxEvents.buildingQuerySuggest, {\n payload: payload\n });\n _b.label = 1;\n case 1:\n _b.trys.push([1, 3, , 4]);\n return [4 /*yield*/, this.omnibox.queryController.getEndpoint().getQuerySuggest(payload)];\n case 2:\n results = _b.sent();\n return [3 /*break*/, 4];\n case 3:\n _a = _b.sent();\n return [2 /*return*/, []];\n case 4:\n completions = results.completions;\n Dom_1.$$(this.omnibox.getBindings().searchInterface.element).trigger(OmniboxEvents_1.OmniboxEvents.querySuggestSuccess, {\n completions: completions\n });\n return [2 /*return*/, underscore_1.map(completions, function (completion, i) {\n return {\n html: QuerySuggestAddon.suggestiontHtml(completion),\n text: completion.expression,\n index: QuerySuggestAddon.INDEX - i / completions.length,\n partial: QuerySuggestAddon.isPartialMatch(completion),\n executableConfidence: completion.executableConfidence\n };\n })];\n }\n });\n });\n };\n Object.defineProperty(QuerySuggestAddon.prototype, \"tab\", {\n get: function () {\n var tab = this.omnibox.getBindings().queryStateModel.get(QueryStateModel_1.QUERY_STATE_ATTRIBUTES.T);\n if (Utils_1.Utils.isNonEmptyString(tab)) {\n return tab;\n }\n return undefined;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QuerySuggestAddon.prototype, \"locale\", {\n get: function () {\n return String['locale'];\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QuerySuggestAddon.prototype, \"searchHub\", {\n get: function () {\n return this.omnibox.getBindings().componentOptionsModel.get(ComponentOptionsModel_1.ComponentOptionsModel.attributesEnum.searchHub);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QuerySuggestAddon.prototype, \"pipeline\", {\n get: function () {\n return this.omnibox.getBindings().searchInterface.options.pipeline;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QuerySuggestAddon.prototype, \"enableWordCompletion\", {\n get: function () {\n return this.omnibox.options.enableSearchAsYouType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QuerySuggestAddon.prototype, \"context\", {\n get: function () {\n return this.omnibox.getBindings().searchInterface.getQueryContext();\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QuerySuggestAddon.prototype, \"count\", {\n get: function () {\n return this.omnibox.options.numberOfSuggestions;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QuerySuggestAddon.prototype, \"actionsHistory\", {\n get: function () {\n var historyStore = HistoryStore_1.buildHistoryStore();\n var historyFromStore = historyStore.getHistory();\n if (historyFromStore == null) {\n return [];\n }\n return historyFromStore;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QuerySuggestAddon.prototype, \"timezone\", {\n get: function () {\n return this.omnibox.getBindings().searchInterface.options.timezone;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QuerySuggestAddon.prototype, \"visitorId\", {\n get: function () {\n return new AnalyticsInformation_1.AnalyticsInformation().clientId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QuerySuggestAddon.prototype, \"isGuestUser\", {\n get: function () {\n return this.omnibox.getBindings().queryController.getEndpoint().options.isGuestUser;\n },\n enumerable: true,\n configurable: true\n });\n QuerySuggestAddon.INDEX = 60;\n return QuerySuggestAddon;\n}());\nexports.QuerySuggestAddon = QuerySuggestAddon;\nvar VoidQuerySuggestAddon = /** @class */ (function () {\n function VoidQuerySuggestAddon() {\n }\n VoidQuerySuggestAddon.prototype.getSuggestion = function () {\n return Promise.resolve([]);\n };\n return VoidQuerySuggestAddon;\n}());\nexports.VoidQuerySuggestAddon = VoidQuerySuggestAddon;\n\n\n/***/ }),\n\n/***/ 667:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 668:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dom_1 = __webpack_require__(1);\nvar SearchBoxResize = /** @class */ (function () {\n function SearchBoxResize() {\n }\n SearchBoxResize.resize = function (element, size) {\n var _this = this;\n var searchbox = this.getSearchbox(element);\n var elementToResize = this.getElementsToResize(element);\n var magicboxInput = this.getInput(element);\n var searchboxStyle = \"height: \" + size + \"px; line-height: \" + size + \"px;\";\n var inputChangeStyle = \"height: \" + size + \"px\";\n //This need to be a little bit smaller because when the height become smaller than 38px or to big, the bottom border of the Searchbox dissapear\n var magicboxInputStyle = \"height: \" + (size - 2) + \"px;\";\n this.applyStyle(searchbox, searchboxStyle);\n this.applyStyle(magicboxInput, magicboxInputStyle);\n elementToResize.forEach(function (HtmlElement) {\n _this.applyStyle(HtmlElement, inputChangeStyle);\n });\n };\n SearchBoxResize.applyStyle = function (element, style) {\n element.style.cssText += style;\n };\n SearchBoxResize.getSearchbox = function (element) {\n return Dom_1.$$(element).find('.CoveoOmnibox') || Dom_1.$$(element).find('.CoveoQuerybox');\n };\n SearchBoxResize.getElementsToResize = function (element) {\n return [\n Dom_1.$$(element).find('.CoveoSearchButton'),\n Dom_1.$$(Dom_1.$$(element).find('.magic-box-input')).find('input'),\n Dom_1.$$(element).find('.magic-box-icon'),\n Dom_1.$$(element).find('.magic-box-clear'),\n Dom_1.$$(element).find('.magic-box-underlay')\n ];\n };\n SearchBoxResize.getInput = function (element) {\n return Dom_1.$$(element).find('.magic-box-input');\n };\n return SearchBoxResize;\n}());\nexports.SearchBoxResize = SearchBoxResize;\n\n\n/***/ })\n\n});\n\n\n// WEBPACK FOOTER //\n// Searchbox.min__d957946aa95219e5e0e2.js","import { SubGrammar } from './Expressions';\nimport { Expression } from '../Expression/Expression';\nimport { Result } from '../Result/Result';\nimport { EndOfInputResult } from '../Result/Result';\n\nexport const notWordStart = ' ()[],$@\\'\"';\nexport const notInWord = ' ()[],:';\n\nexport const Basic: SubGrammar = {\n basicExpressions: ['Word', 'DoubleQuoted'],\n grammars: {\n DoubleQuoted: '\"[NotDoubleQuote]\"',\n NotDoubleQuote: /[^\"]*/,\n SingleQuoted: \"'[NotSingleQuote]'\",\n NotSingleQuote: /[^']*/,\n Number: /-?(0|[1-9]\\d*)(\\.\\d+)?/,\n Word: (input: string, end: boolean, expression: Expression) => {\n const regex = new RegExp('[^' + notWordStart.replace(/(.)/g, '\\\\$1') + '][^' + notInWord.replace(/(.)/g, '\\\\$1') + ']*');\n let groups = input.match(regex);\n if (groups != null && groups.index != 0) {\n groups = null;\n }\n const result = new Result(groups != null ? groups[0] : null, expression, input);\n if (result.isSuccess() && end && input.length > result.value.length) {\n return new EndOfInputResult(result);\n }\n return result;\n }\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Grammars/Basic.ts","import 'styling/_Querybox';\nimport { IBuildingQueryEventArgs, QueryEvents } from '../../events/QueryEvents';\nimport { StandaloneSearchInterfaceEvents } from '../../events/StandaloneSearchInterfaceEvents';\nimport { exportGlobally } from '../../GlobalExports';\nimport { Grammar } from '../../magicbox/Grammar';\nimport { createMagicBox, MagicBoxInstance } from '../../magicbox/MagicBox';\nimport { Result } from '../../magicbox/Result/Result';\nimport { Assert } from '../../misc/Assert';\nimport { IAttributeChangedEventArg, MODEL_EVENTS } from '../../models/Model';\nimport { QueryStateModel, QUERY_STATE_ATTRIBUTES } from '../../models/QueryStateModel';\nimport { l } from '../../strings/Strings';\nimport { $$ } from '../../utils/Dom';\nimport { analyticsActionCauseList, IAnalyticsNoMeta } from '../Analytics/AnalyticsActionListMeta';\nimport { Component } from '../Base/Component';\nimport { IComponentBindings } from '../Base/ComponentBindings';\nimport { ComponentOptions } from '../Base/ComponentOptions';\nimport { Initialization } from '../Base/Initialization';\nimport { QueryboxOptionsProcessing } from './QueryboxOptionsProcessing';\nimport { QueryboxQueryParameters } from './QueryboxQueryParameters';\n\nexport interface IQueryboxOptions {\n enableSearchAsYouType?: boolean;\n searchAsYouTypeDelay?: number;\n enableQuerySyntax?: boolean;\n enableWildcards?: boolean;\n enableQuestionMarks?: boolean;\n enableLowercaseOperators?: boolean;\n enablePartialMatch?: boolean;\n partialMatchKeywords?: number;\n partialMatchThreshold?: string;\n placeholder?: string;\n triggerQueryOnClear?: boolean;\n}\n\n/**\n * The `Querybox` component renders an input which the end user can interact with to enter and submit queries.\n *\n * When the end user submits a search request, the `Querybox` component triggers a query and logs the corresponding\n * usage analytics data.\n *\n * For technical reasons, it is necessary to instantiate this component on a `div` element rather than on an `input`\n * element.\n *\n * See also the [`Searchbox`]{@link Searchbox} component, which can automatically instantiate a `Querybox` along with an\n * optional [`SearchButton`]{@link SearchButton} component.\n */\nexport class Querybox extends Component {\n static ID = 'Querybox';\n\n static doExport = () => {\n exportGlobally({\n Querybox: Querybox,\n QueryboxQueryParameters: QueryboxQueryParameters\n });\n };\n\n /**\n * The options for the Querybox.\n * @componentOptions\n */\n public static options: IQueryboxOptions = {\n /**\n * Whether to enable the search-as-you-type feature.\n *\n * **Note:** Enabling this feature can consume lots of queries per month (QPM), especially if the [`searchAsYouTypeDelay`]{@link Querybox.options.searchAsYouTypeDelay} option is set to a low value.\n *\n * Default value is `false`.\n */\n enableSearchAsYouType: ComponentOptions.buildBooleanOption({ defaultValue: false, section: 'Advanced Options' }),\n\n /**\n * If the [`enableSearchAsYouType`]{@link Querybox.options.enableSearchAsYouType} option is `true`, specifies how\n * long to wait (in milliseconds) between each key press before triggering a new query.\n *\n * Default value is `50`. Minimum value is `0`\n */\n searchAsYouTypeDelay: ComponentOptions.buildNumberOption({ defaultValue: 50, min: 0, section: 'Advanced Options' }),\n\n /**\n * Specifies whether to interpret special query syntax (e.g., `@objecttype=message`) when the end user types\n * a query in the `Querybox` (see\n * [Coveo Query Syntax Reference](https://docs.coveo.com/en/1552/searching-with-coveo/coveo-cloud-query-syntax)). Setting this\n * option to `true` also causes the `Querybox` to highlight any query syntax.\n *\n * Regardless of the value of this option, the Coveo Cloud REST Search API always interprets expressions surrounded\n * by double quotes (`\"`) as exact phrase match requests.\n *\n * See also [`enableLowercaseOperators`]{@link Querybox.options.enableLowercaseOperators}.\n *\n * **Notes:**\n * > * End user preferences can override the value you specify for this option.\n * >\n * > If the end user selects a value other than **Automatic** for the **Enable query syntax** setting (see\n * > the [`enableQuerySyntax`]{@link ResultsPreferences.options.enableQuerySyntax} option of the\n * > [`ResultsPreferences`]{@link ResultsPreferences} component), the end user preference takes precedence over this\n * > option.\n * >\n * > * On-premises versions of the Coveo Search API require this option to be set to `true` in order to interpret\n * > expressions surrounded by double quotes (`\"`) as exact phrase match requests.\n *\n * Default value is `false`.\n */\n enableQuerySyntax: ComponentOptions.buildBooleanOption({ defaultValue: false, section: 'Advanced Options' }),\n\n /**\n * Specifies whether to expand basic expression keywords containing wildcards characters (`*`) to the possible\n * matching keywords in order to broaden the query (see\n * [Using Wildcards in Queries](https://docs.coveo.com/en/1580/)).\n *\n * See also [`enableQuestionMarks`]{@link Querybox.options.enableQuestionMarks}.\n *\n * **Note:**\n * > If you are using an on-premises version of the Coveo Search API, you need to set the\n * > [`enableQuerySyntax`]{@link Querybox.options.enableQuerySyntax} option to `true` to be able to set\n * > `enableWildcards` to `true`.\n *\n * Default value is `false`.\n */\n enableWildcards: ComponentOptions.buildBooleanOption({ defaultValue: false, section: 'Advanced Options' }),\n\n /**\n * If [`enableWildcards`]{@link Querybox.options.enableWildcards} is `true`, specifies whether to expand basic\n * expression keywords containing question mark characters (`?`) to the possible matching keywords in order to\n * broaden the query (see\n * [Using Wildcards in Queries](https://docs.coveo.com/en/1580/)).\n *\n * **Note:**\n * > If you are using an on-premises version of the Coveo Search API, you also need to set the\n * > [`enableQuerySyntax`]{@link Querybox.options.enableQuerySyntax} option to `true` in order to be able to set\n * > `enableQuestionMarks` to `true`.\n *\n * Default value is `false`.\n */\n enableQuestionMarks: ComponentOptions.buildBooleanOption({ defaultValue: false, depend: 'enableWildcards' }),\n\n /**\n * If the [`enableQuerySyntax`]{@link Querybox.options.enableQuerySyntax} option is `true`, specifies whether to\n * interpret the `AND`, `NOT`, `OR`, and `NEAR` keywords in the `Querybox` as query operators in the query, even if\n * the end user types those keywords in lowercase.\n *\n * This option applies to all query operators (see\n * [Coveo Query Syntax Reference](https://docs.coveo.com/en/1552/searching-with-coveo/coveo-cloud-query-syntax)).\n *\n * **Example:**\n * > If this option and the `enableQuerySyntax` option are both `true`, the Coveo Platform interprets the `near`\n * > keyword in a query such as `service center near me` as the `NEAR` query operator (not as a query term).\n *\n * > Otherwise, if the `enableQuerySyntax` option is `true` and this option is `false`, the end user has to type the\n * > `NEAR` keyword in uppercase for the Coveo Platform to interpret it as a query operator.\n *\n * Default value is `false`.\n */\n enableLowercaseOperators: ComponentOptions.buildBooleanOption({ defaultValue: false, depend: 'enableQuerySyntax' }),\n\n /**\n * Whether to convert a basic expression containing at least a certain number of keywords (see the\n * [`partialMatchKeywords`]{@link Querybox.options.partialMatchKeywords} option) to *partial match expression*, so\n * that items containing at least a certain number of those keywords (see the\n * [`partialMatchThreshold`]{@link Querybox.options.partialMatchThreshold} option) will match the expression.\n *\n * **Notes:**\n * - Only the basic expression of the query (see [`q`]{@link q}) can be converted to a partial match expression.\n * - When the [`enableQuerySyntax`]{@link Querybox.options.enableQuerySyntax} option is set to `true`, this feature has no effect if the basic expression contains advanced query syntax (field expressions, operators, etc.).\n *\n * @notSupportedIn salesforcefree\n */\n enablePartialMatch: ComponentOptions.buildBooleanOption({ defaultValue: false }),\n\n /**\n * The minimum number of keywords that need to be present in the basic expression to convert it to a partial match expression.\n *\n * See also the [`partialMatchThreshold`]{@link Querybox.options.partialMatchThreshold} option.\n *\n * **Notes:**\n *\n * - Repeated keywords count as a single keyword.\n * - Thesaurus expansions count towards the `partialMatchKeywords` count.\n * - Stemming expansions **do not** count towards the `partialMatchKeywords` count.\n *\n * @notSupportedIn salesforcefree\n */\n partialMatchKeywords: ComponentOptions.buildNumberOption({ defaultValue: 5, min: 1, depend: 'enablePartialMatch' }),\n\n /**\n * An absolute or relative value indicating the minimum number of partial match expression keywords an item must contain to match the expression.\n *\n * See also the [`partialMatchKeywords`]{@link Querybox.options.partialMatchKeywords} option.\n *\n * **Notes:**\n * - A keyword and its stemming expansions count as a single keyword when evaluating whether an item meets the `partialMatchThreshold`.\n * - When a relative `partialMatchThreshold` does not yield a whole integer, the fractional part is truncated (e.g., `3.6` becomes `3`).\n *\n * @notSupportedIn salesforcefree\n */\n partialMatchThreshold: ComponentOptions.buildStringOption({ defaultValue: '50%', depend: 'enablePartialMatch' }),\n\n /**\n * Whether to trigger a query when clearing the `Querybox`.\n *\n * Default value is `false`.\n */\n triggerQueryOnClear: ComponentOptions.buildBooleanOption({ defaultValue: false })\n };\n MagicBoxImpl;\n\n public magicBox: MagicBoxInstance;\n private lastQuery: string;\n private searchAsYouTypeTimeout: number;\n\n /**\n * Creates a new `Querybox component`. Creates a new `Coveo.Magicbox` instance and wraps the Magicbox methods\n * (`onblur`, `onsubmit` etc.). Binds event on `buildingQuery` and before redirection (for standalone box).\n * @param element The HTMLElement on which to instantiate the component. This cannot be an HTMLInputElement for\n * technical reasons.\n * @param options The options for the `Querybox` component.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n */\n constructor(public element: HTMLElement, public options?: IQueryboxOptions, public bindings?: IComponentBindings) {\n super(element, Querybox.ID, bindings);\n\n if (element instanceof HTMLInputElement) {\n this.logger.error('Querybox cannot be used on an HTMLInputElement');\n }\n\n this.options = ComponentOptions.initComponentOptions(element, Querybox, options);\n new QueryboxOptionsProcessing(this).postProcess();\n\n $$(this.element).toggleClass('coveo-query-syntax-disabled', this.options.enableQuerySyntax == false);\n this.magicBox = createMagicBox(\n element,\n new Grammar('Query', {\n Query: '[Term*][Spaces?]',\n Term: '[Spaces?][Word]',\n Spaces: / +/,\n Word: /[^ ]+/\n }),\n {\n inline: true\n }\n );\n\n const input = $$(this.magicBox.element).find('input');\n if (input) {\n $$(input).setAttribute('aria-label', this.options.placeholder || l('Search'));\n }\n\n this.bind.onRootElement(QueryEvents.buildingQuery, (args: IBuildingQueryEventArgs) => this.handleBuildingQuery(args));\n this.bind.onRootElement(StandaloneSearchInterfaceEvents.beforeRedirect, () => this.updateQueryState());\n this.bind.onQueryState(MODEL_EVENTS.CHANGE_ONE, QUERY_STATE_ATTRIBUTES.Q, (args: IAttributeChangedEventArg) =>\n this.handleQueryStateChanged(args)\n );\n\n if (this.options.enableSearchAsYouType) {\n $$(this.element).addClass('coveo-search-as-you-type');\n this.magicBox.onchange = () => {\n this.searchAsYouType();\n };\n }\n\n this.magicBox.onsubmit = () => {\n this.submit();\n };\n\n this.magicBox.onblur = () => {\n this.updateQueryState();\n };\n\n this.magicBox.onclear = () => {\n this.updateQueryState();\n if (this.options.triggerQueryOnClear) {\n this.usageAnalytics.logSearchEvent(analyticsActionCauseList.searchboxClear, {});\n this.triggerNewQuery(false);\n }\n };\n }\n\n /**\n * Adds the current content of the input to the query and triggers a query if the current content of the input has\n * changed since last submit.\n *\n * Also logs the `serachboxSubmit` event in the usage analytics.\n */\n public submit(): void {\n this.magicBox.clearSuggestion();\n this.updateQueryState();\n this.usageAnalytics.logSearchEvent(analyticsActionCauseList.searchboxSubmit, {});\n this.triggerNewQuery(false);\n }\n\n /**\n * Sets the content of the input.\n *\n * @param text The string to set in the input.\n */\n public setText(text: string): void {\n this.magicBox.setText(text);\n this.updateQueryState();\n }\n\n /**\n * Clears the content of the input.\n *\n * See also the [`triggerQueryOnClear`]{@link Querybox.options.triggerQueryOnClear} option.\n */\n public clear(): void {\n this.magicBox.clear();\n }\n\n /**\n * Gets the content of the input.\n *\n * @returns {string} The content of the input.\n */\n public getText(): string {\n return this.magicBox.getText();\n }\n\n /**\n * Gets the result from the input.\n *\n * @returns {Result} The result.\n */\n public getResult() {\n return this.magicBox.getResult();\n }\n\n /**\n * Gets the displayed result from the input.\n *\n * @returns {Result} The displayed result.\n */\n public getDisplayedResult(): Result {\n return this.magicBox.getDisplayedResult();\n }\n\n /**\n * Gets the current cursor position in the input.\n *\n * @returns {number} The cursor position (index starts at 0).\n */\n public getCursor(): number {\n return this.magicBox.getCursor();\n }\n\n /**\n * Gets the result at cursor position.\n *\n * @param match {string | { (result): boolean }} The match condition.\n *\n * @returns {Result[]} The result.\n */\n public resultAtCursor(match?: string | { (result): boolean }) {\n return this.magicBox.resultAtCursor(match);\n }\n\n private handleBuildingQuery(args: IBuildingQueryEventArgs): void {\n Assert.exists(args);\n Assert.exists(args.queryBuilder);\n\n this.updateQueryState();\n this.lastQuery = this.magicBox.getText();\n new QueryboxQueryParameters(this.options).addParameters(args.queryBuilder, this.lastQuery);\n }\n\n private triggerNewQuery(searchAsYouType: boolean): void {\n clearTimeout(this.searchAsYouTypeTimeout);\n let text = this.magicBox.getText();\n if (this.lastQuery != text && text != null) {\n this.lastQuery = text;\n this.queryController.executeQuery({\n searchAsYouType: searchAsYouType,\n logInActionsHistory: true\n });\n }\n }\n\n private updateQueryState(): void {\n this.queryStateModel.set(QueryStateModel.attributesEnum.q, this.magicBox.getText());\n }\n\n private handleQueryStateChanged(args: IAttributeChangedEventArg): void {\n Assert.exists(args);\n let q = args.value;\n if (q != this.magicBox.getText()) {\n this.magicBox.setText(q);\n }\n }\n\n private searchAsYouType(): void {\n clearTimeout(this.searchAsYouTypeTimeout);\n this.searchAsYouTypeTimeout = window.setTimeout(() => {\n this.usageAnalytics.logSearchAsYouType(analyticsActionCauseList.searchboxAsYouType, {});\n this.triggerNewQuery(true);\n }, this.options.searchAsYouTypeDelay);\n }\n}\nInitialization.registerAutoCreateComponent(Querybox);\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/Querybox/Querybox.ts","import { ExpressionRef } from './Expression/ExpressionRef';\nimport { Expression, ExpressionDef } from './Expression/Expression';\nimport { ExpressionOptions } from './Expression/ExpressionOptions';\nimport { ExpressionRegExp } from './Expression/ExpressionRegExp';\nimport _ = require('underscore');\nimport { ExpressionFunction, ExpressionFunctionArgument } from './Expression/ExpressionFunction';\nimport { ExpressionConstant } from './Expression/ExpressionConstant';\nimport { ExpressionList } from './Expression/ExpressionList';\nimport { Result } from './Result/Result';\n\nexport class Grammar {\n public start: ExpressionRef;\n public expressions: { [id: string]: Expression } = {};\n\n constructor(start: string, expressions: { [id: string]: ExpressionDef } = {}) {\n this.start = new ExpressionRef(start, null, 'start', this);\n this.addExpressions(expressions);\n }\n\n public addExpressions(expressions: { [id: string]: ExpressionDef }) {\n _.each(expressions, (basicExpression: ExpressionDef, id: string) => {\n this.addExpression(id, basicExpression);\n });\n }\n\n public addExpression(id: string, basicExpression: ExpressionDef) {\n if (id in this.expressions) {\n throw new Error('Grammar already contain the id:' + id);\n }\n this.expressions[id] = Grammar.buildExpression(basicExpression, id, this);\n }\n\n public getExpression(id: string) {\n return this.expressions[id];\n }\n\n public parse(value: string): Result {\n return this.start.parse(value, true);\n }\n\n public static buildExpression(value: ExpressionDef, id: string, grammar: Grammar): Expression {\n const type = typeof value;\n if (type == 'undefined') {\n throw new Error('Invalid Expression: ' + value);\n }\n if (_.isString(value)) {\n return this.buildStringExpression(value, id, grammar);\n }\n if (_.isArray(value)) {\n return new ExpressionOptions(_.map(value, (v: string, i) => new ExpressionRef(v, null, id + '_' + i, grammar)), id);\n }\n if (_.isRegExp(value)) {\n return new ExpressionRegExp(value, id, grammar);\n }\n if (_.isFunction(value)) {\n return new ExpressionFunction(value, id, grammar);\n }\n throw new Error('Invalid Expression: ' + value);\n }\n\n public static buildStringExpression(value: string, id: string, grammar: Grammar): Expression {\n const matchs = Grammar.stringMatch(value, Grammar.spliter);\n const expressions = _.map(matchs, (match: string[], i: number): Expression => {\n if (match[1]) {\n // Ref\n const ref = match[1];\n const occurrence = match[3] ? Number(match[3]) : match[2] || null;\n return new ExpressionRef(ref, occurrence, id + '_' + i, grammar);\n } else {\n // Constant\n return new ExpressionConstant(match[4], id + '_' + i);\n }\n });\n if (expressions.length == 1) {\n const expression = expressions[0];\n expression.id = id;\n return expression;\n } else {\n return new ExpressionList(expressions, id);\n }\n }\n\n public static stringMatch(str: string, re: RegExp) {\n const groups: string[][] = [];\n const cloneRegExp = new RegExp(re.source, 'g');\n let group: RegExpExecArray = cloneRegExp.exec(str);\n\n while (group !== null) {\n groups.push(group);\n group = cloneRegExp.exec(str);\n }\n return groups;\n }\n\n static spliter = /\\[(\\w+)(\\*|\\+|\\?|\\{([1-9][0-9]*)\\})?\\]|(.[^\\[]*)/;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Grammar.ts","///\n///\n///\n///\n\nimport 'styling/_Omnibox';\nimport * as _ from 'underscore';\nimport { findWhere } from 'underscore';\nimport { BreadcrumbEvents } from '../../events/BreadcrumbEvents';\nimport {\n IOmniboxPreprocessResultForQueryEventArgs,\n IPopulateOmniboxSuggestionsEventArgs,\n IQuerySuggestSelection,\n OmniboxEvents\n} from '../../events/OmniboxEvents';\nimport { IBuildingQueryEventArgs, IDuringQueryEventArgs, INewQueryEventArgs, QueryEvents } from '../../events/QueryEvents';\nimport { StandaloneSearchInterfaceEvents } from '../../events/StandaloneSearchInterfaceEvents';\nimport { exportGlobally } from '../../GlobalExports';\nimport { ExpressionDef } from '../../magicbox/Expression/Expression';\nimport { Grammar } from '../../magicbox/Grammar';\nimport { Complete } from '../../magicbox/Grammars/Complete';\nimport { Expressions } from '../../magicbox/Grammars/Expressions';\nimport { createMagicBox, MagicBoxInstance } from '../../magicbox/MagicBox';\nimport { Result } from '../../magicbox/Result/Result';\nimport { Suggestion } from '../../magicbox/SuggestionsManager';\nimport { Assert } from '../../misc/Assert';\nimport { COMPONENT_OPTIONS_ATTRIBUTES } from '../../models/ComponentOptionsModel';\nimport { IAttributeChangedEventArg, MODEL_EVENTS } from '../../models/Model';\nimport { QueryStateModel, QUERY_STATE_ATTRIBUTES } from '../../models/QueryStateModel';\nimport { l } from '../../strings/Strings';\nimport { $$, Dom } from '../../utils/Dom';\nimport { Utils } from '../../utils/Utils';\nimport {\n analyticsActionCauseList,\n IAnalyticsActionCause,\n IAnalyticsNoMeta,\n IAnalyticsOmniboxSuggestionMeta\n} from '../Analytics/AnalyticsActionListMeta';\nimport { PendingSearchAsYouTypeSearchEvent } from '../Analytics/PendingSearchAsYouTypeSearchEvent';\nimport { logSearchBoxSubmitEvent } from '../Analytics/SharedAnalyticsCalls';\nimport { Component } from '../Base/Component';\nimport { IComponentBindings } from '../Base/ComponentBindings';\nimport { ComponentOptions } from '../Base/ComponentOptions';\nimport { IFieldOption } from '../Base/IComponentOptions';\nimport { Initialization } from '../Base/Initialization';\nimport { IQueryboxOptions, Querybox } from '../Querybox/Querybox';\nimport { QueryboxOptionsProcessing } from '../Querybox/QueryboxOptionsProcessing';\nimport { QueryboxQueryParameters } from '../Querybox/QueryboxQueryParameters';\nimport { StandaloneSearchInterface } from '../SearchInterface/SearchInterface';\nimport { FieldAddon } from './FieldAddon';\nimport { OldOmniboxAddon } from './OldOmniboxAddon';\nimport { OmniboxAnalytics } from './OmniboxAnalytics';\nimport { QueryExtensionAddon } from './QueryExtensionAddon';\nimport { IQuerySuggestAddon, QuerySuggestAddon, VoidQuerySuggestAddon } from './QuerySuggestAddon';\n\nexport interface IOmniboxSuggestion extends Suggestion {\n executableConfidence?: number;\n}\n\nexport interface IOmniboxOptions extends IQueryboxOptions {\n inline?: boolean;\n enableFieldAddon?: boolean;\n enableSimpleFieldAddon?: boolean;\n listOfFields?: IFieldOption[];\n fieldAlias?: { [alias: string]: IFieldOption };\n enableQuerySuggestAddon?: boolean;\n enableQueryExtensionAddon?: boolean;\n omniboxTimeout?: number;\n placeholder?: string;\n numberOfSuggestions?: number;\n querySuggestCharacterThreshold?: number;\n grammar?: (grammar: {\n start: string;\n expressions: { [id: string]: ExpressionDef };\n }) => { start: string; expressions: { [id: string]: ExpressionDef } };\n clearFiltersOnNewQuery?: boolean;\n}\n\nconst MINIMUM_EXECUTABLE_CONFIDENCE = 0.8;\n\n/**\n * The `Omnibox` component extends the [`Querybox`]{@link Querybox}, and thus provides the same basic options and\n * behaviors. Furthermore, the `Omnibox` adds a type-ahead capability to the search input.\n *\n * You can configure the type-ahead feature by enabling or disabling certain addons, which the Coveo JavaScript Search\n * Framework provides out-of-the-box (see the [`enableFieldAddon`]{@link Omnibox.options.enableFieldAddon},\n * [`enableQueryExtension`]{@link Omnibox.options.enableQueryExtensionAddon}, and\n * [`enableQuerySuggestAddon`]{@link Omnibox.options.enableQuerySuggestAddon} options).\n *\n * Custom components and external code can also extend or customize the type-ahead feature and the query completion\n * suggestions it provides by attaching their own handlers to the\n * [`populateOmniboxSuggestions`]{@link OmniboxEvents.populateOmniboxSuggestions} event.\n *\n * See also the [`Searchbox`]{@link Searchbox} component, which can automatically instantiate an `Omnibox` along with an\n * optional {@link SearchButton}.\n */\nexport class Omnibox extends Component {\n public static ID = 'Omnibox';\n\n static doExport = () => {\n exportGlobally({\n Omnibox: Omnibox,\n QueryboxQueryParameters: QueryboxQueryParameters\n });\n };\n\n /**\n * The options for the omnibox\n * @componentOptions\n */\n static options: IOmniboxOptions = {\n /**\n * Specifies whether query completion suggestions appearing in the `Omnibox` should push the result list and facets\n * down, rather than rendering themselves over them (and partially hiding them).\n *\n * Set this option as well as {@link Omnibox.options.enableSearchAsYouType} and\n * {@link Omnibox.options.enableQuerySuggestAddon} to `true` for a cool effect!\n *\n * Default value is `false`.\n */\n inline: ComponentOptions.buildBooleanOption({ defaultValue: false }),\n\n /**\n * Whether to automatically trigger a new query whenever the end user types additional text in the search box input.\n *\n * See also the [`searchAsYouTypeDelay`]{@link Omnibox.options.searchAsYouTypeDelay} option.\n *\n * **Note:**\n * > If you set this option and the [`enableQuerySuggestAddon`]{@link Omnibox.options.enableQuerySuggestAddon}\n * > option to `true`, the query suggestion feature returns the auto-completion of the currently typed keyword as\n * > its first suggestion.\n *\n * Default value is `false`.\n */\n enableSearchAsYouType: ComponentOptions.buildBooleanOption({ defaultValue: false, section: 'Advanced Options' }),\n\n /**\n * If {@link Omnibox.options.enableSearchAsYouType} is `true`, specifies the delay (in milliseconds) before\n * triggering a new query when the end user types in the `Omnibox`.\n *\n * Default value is `2000`. Minimum value is `0`.\n */\n searchAsYouTypeDelay: ComponentOptions.buildNumberOption({\n defaultValue: 2000,\n min: 0,\n depend: 'enableSearchAsYouType',\n section: 'Advanced Options'\n }),\n\n /**\n * The `field` addon makes the `Omnibox` highlight and complete field syntax. Setting this option to `true` automatically sets\n * the [enableQuerySyntax]{@link Querybox.options.enableQuerySyntax} option to `true` as a side effect.\n *\n * **Example:**\n * > Suppose you want to search for PDF files. You start typing `@f` in the search box. The `Omnibox` provides\n * > you with several matching fields. You select the `@filetype` field. Then, you start typing `=p` in the input.\n * > This time, the `Omnibox` provides you with several matching values for the `@filetype` field. You select the\n * > `pdf` suggestion, and submit your search request. Since the `enableQuerySyntax` option is set to `true`, the\n * > Coveo Search API interprets the basic expression as query syntax and returns the items whose `@filetype` field\n * > matches the `pdf` value.\n *\n * Default value is `false`.\n */\n enableFieldAddon: ComponentOptions.buildBooleanOption({\n defaultValue: false,\n depend: 'enableQuerySyntax',\n postProcessing: (value, options: IOmniboxOptions) => {\n if (value) {\n options.enableQuerySyntax = true;\n }\n return value;\n },\n section: 'Advanced Options'\n }),\n enableSimpleFieldAddon: ComponentOptions.buildBooleanOption({ defaultValue: false, depend: 'enableFieldAddon' }),\n listOfFields: ComponentOptions.buildFieldsOption({ depend: 'enableFieldAddon' }),\n\n /**\n * Whether to display Coveo Machine Learning (Coveo ML) query suggestions in the `Omnibox`.\n *\n * A Coveo ML query suggestions (QS) model must be properly configured in your Coveo Cloud organization, otherwise this\n * option has no effect (see\n * [Create a QS Model](https://docs.coveo.com/en/1832/#create-a-qs-model)).\n *\n * **Note:**\n * > When you set this option and the [`enableSearchAsYouType`]{@link Omnibox.options.enableSearchAsYouType} option\n * > to `true`, the query suggestion feature returns the auto-completion of the currently typed keyword as its first\n * > query suggestion.\n *\n * @availablesince [December 2015 Release (v1.0.273)](https://docs.coveo.com/en/289/#december-2015-release-v10273)\n */\n enableQuerySuggestAddon: ComponentOptions.buildBooleanOption({\n defaultValue: true,\n alias: ['enableTopQueryAddon', 'enableRevealQuerySuggestAddon']\n }),\n\n /**\n * If {@link Querybox.options.enableQuerySyntax} is `true`, specifies whether to enable the `query extension` addon.\n *\n * The `query extension` addon allows the Omnibox to complete the syntax for query extensions.\n *\n * Default value is `false`.\n */\n enableQueryExtensionAddon: ComponentOptions.buildBooleanOption({\n defaultValue: false,\n depend: 'enableQuerySyntax',\n postProcessing: (value, options: IOmniboxOptions) => {\n if (value) {\n options.enableQuerySyntax = true;\n }\n return value;\n },\n section: 'Advanced Options'\n }),\n\n /**\n * Specifies a placeholder for the input.\n *\n * @availablesince [July 2016 Release (v1.667.24)](https://docs.coveo.com/en/309/#july-2016-release-v166724)\n */\n placeholder: ComponentOptions.buildLocalizedStringOption(),\n\n /**\n * Specifies a timeout (in milliseconds) before rejecting suggestions in the Omnibox.\n *\n * Default value is `2000`. Minimum value is `0`.\n */\n omniboxTimeout: ComponentOptions.buildNumberOption({ defaultValue: 2000, min: 0 }),\n /**\n * Specifies whether the Coveo Platform should try to interpret special query syntax such as field references in the\n * query that the user enters in the Querybox (see\n * [Coveo Query Syntax Reference](https://docs.coveo.com/en/1552/searching-with-coveo/coveo-cloud-query-syntax)).\n *\n * Setting this option to `true` also causes the query syntax in the Querybox to highlight.\n *\n * Default value is `false`.\n */\n enableQuerySyntax: ComponentOptions.buildBooleanOption({\n defaultValue: false,\n section: 'Advanced Options'\n }),\n /**\n * Specifies the number of suggestions that should appear in standard ML-powered query suggestions.\n *\n * This option only affects the number of suggestions that appear with the {@link Omnibox.options.enableQuerySuggestAddon} option.\n *\n * This options does not affect the {@link AnalyticsSuggestions} or the {@link FieldSuggestions} component, which expose their own dedicated options for this parameter.\n *\n * Default value is `5`.\n *\n * Minimum value is `1`.\n */\n numberOfSuggestions: ComponentOptions.buildNumberOption({\n defaultValue: 5,\n min: 1\n }),\n /**\n * The minimum number of characters required in the in the text input before displaying available query suggestions when focus is on the component.\n *\n * Note: Only effective when [enableQuerySuggestAddon]{@link Omnibox.options.enableQuerySuggestAddon} is true.\n *\n * depend: 'enableQuerySuggestAddon'\n *\n * Default (and minimum): 0, meaning that trending query suggestions are displayed when focus is on the component, even if its text input is empty.\n *\n * @availablesince [July 2019 Release (v2.6459)](https://docs.coveo.com/en/2938/)\n */\n querySuggestCharacterThreshold: ComponentOptions.buildNumberOption({\n defaultValue: 0,\n min: 0\n }),\n\n /**\n * Whether to clear all active query filters when the end user submits a new query from the search box.\n *\n * Note: This does not include the filter expression enforced by the currently selected tab, if any.\n *\n * @availablesince [September 2019 Release (v2.7023)](https://docs.coveo.com/en/2990/)\n */\n clearFiltersOnNewQuery: ComponentOptions.buildBooleanOption({ defaultValue: false })\n };\n\n public magicBox: MagicBoxInstance;\n private lastSuggestions: IOmniboxSuggestion[] = [];\n private lastQuery: string;\n private modifyEventTo: IAnalyticsActionCause;\n private movedOnce = false;\n private searchAsYouTypeTimeout: number;\n private skipAutoSuggest = false;\n private omniboxAnalytics: OmniboxAnalytics;\n\n public suggestionAddon: IQuerySuggestAddon;\n\n /**\n * Creates a new Omnibox component. Also enables necessary addons and binds events on various query events.\n * @param element The HTMLElement on which to instantiate the component.\n * @param options The options for the Omnibox component.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n */\n constructor(public element: HTMLElement, public options?: IOmniboxOptions, bindings?: IComponentBindings) {\n super(element, Omnibox.ID, bindings);\n\n this.options = ComponentOptions.initComponentOptions(element, Omnibox, options);\n const originalValueForQuerySyntax = this.options.enableQuerySyntax;\n new QueryboxOptionsProcessing(this).postProcess();\n this.omniboxAnalytics = this.searchInterface.getOmniboxAnalytics();\n $$(this.element).toggleClass('coveo-query-syntax-disabled', this.options.enableQuerySyntax == false);\n\n this.suggestionAddon = this.options.enableQuerySuggestAddon ? new QuerySuggestAddon(this) : new VoidQuerySuggestAddon();\n new OldOmniboxAddon(this);\n this.createMagicBox();\n\n this.bind.onRootElement(QueryEvents.newQuery, (args: INewQueryEventArgs) => this.handleNewQuery(args));\n this.bind.onRootElement(QueryEvents.buildingQuery, (args: IBuildingQueryEventArgs) => this.handleBuildingQuery(args));\n this.bind.onRootElement(StandaloneSearchInterfaceEvents.beforeRedirect, () => this.handleBeforeRedirect());\n this.bind.onRootElement(QueryEvents.querySuccess, () => this.handleQuerySuccess());\n this.bind.onQueryState(MODEL_EVENTS.CHANGE_ONE, QUERY_STATE_ATTRIBUTES.Q, (args: IAttributeChangedEventArg) =>\n this.handleQueryStateChanged(args)\n );\n if (this.isAutoSuggestion()) {\n this.bind.onRootElement(QueryEvents.duringQuery, (args: IDuringQueryEventArgs) => this.handleDuringQuery(args));\n }\n this.bind.onComponentOptions(MODEL_EVENTS.CHANGE_ONE, COMPONENT_OPTIONS_ATTRIBUTES.SEARCH_BOX, (args: IAttributeChangedEventArg) => {\n if (args.value.enableQuerySyntax != null) {\n this.options.enableQuerySyntax = args.value.enableQuerySyntax;\n } else {\n this.options.enableQuerySyntax = originalValueForQuerySyntax;\n }\n this.updateGrammar();\n });\n this.bind.onRootElement(OmniboxEvents.querySuggestGetFocus, (args: IQuerySuggestSelection) => this.handleQuerySuggestGetFocus(args));\n }\n\n /**\n * Adds the current content of the input to the query and triggers a query if the current content of the input has\n * changed since last submit.\n *\n * Also logs a `searchboxSubmit` event in the usage analytics.\n */\n public submit() {\n this.magicBox.clearSuggestion();\n this.updateQueryState();\n this.triggerNewQuery(false, () => {\n logSearchBoxSubmitEvent(this.usageAnalytics);\n });\n this.magicBox.blur();\n }\n\n /**\n * Gets the current content of the input.\n * @returns {string} The current content of the input.\n */\n public getText() {\n return this.magicBox.getText();\n }\n\n /**\n * Sets the content of the input\n * @param text The string to set in the input.\n */\n public setText(text: string) {\n this.magicBox.setText(text);\n this.updateQueryState();\n }\n\n /**\n * Clears the content of the input.\n */\n public clear() {\n this.magicBox.clear();\n }\n\n /**\n * Gets the `HTMLInputElement` of the Omnibox.\n */\n public getInput() {\n return this.magicBox.element.querySelector('input');\n }\n\n public getResult() {\n return this.magicBox.getResult();\n }\n\n public getDisplayedResult() {\n return this.magicBox.getDisplayedResult();\n }\n\n public getCursor() {\n return this.magicBox.getCursor();\n }\n\n public resultAtCursor(match?: string | { (result: Result): boolean }) {\n return this.magicBox.resultAtCursor(match);\n }\n\n private createGrammar() {\n let grammar = null;\n\n if (this.options.enableQuerySyntax) {\n grammar = Expressions(Complete);\n if (this.options.enableFieldAddon) {\n new FieldAddon(this);\n }\n if (this.options.fieldAlias != null) {\n this.options.listOfFields = this.options.listOfFields || [];\n this.options.listOfFields = this.options.listOfFields.concat(_.keys(this.options.fieldAlias));\n }\n if (this.options.enableQueryExtensionAddon) {\n new QueryExtensionAddon(this);\n }\n } else {\n grammar = { start: 'Any', expressions: { Any: /.*/ } };\n }\n\n if (this.options.grammar != null) {\n grammar = this.options.grammar(grammar);\n }\n\n return grammar;\n }\n\n private updateGrammar() {\n const grammar = this.createGrammar();\n this.magicBox.grammar = new Grammar(grammar.start, grammar.expressions);\n this.magicBox.setText(this.magicBox.getText());\n }\n\n private createMagicBox() {\n const grammar = this.createGrammar();\n this.magicBox = createMagicBox(this.element, new Grammar(grammar.start, grammar.expressions), {\n inline: this.options.inline,\n selectableSuggestionClass: 'coveo-omnibox-selectable',\n selectedSuggestionClass: 'coveo-omnibox-selected',\n suggestionTimeout: this.options.omniboxTimeout\n });\n\n const input = $$(this.magicBox.element).find('input');\n\n if (input) {\n $$(input).setAttribute('aria-label', l('Search'));\n }\n\n this.setupMagicBox();\n }\n\n private setupMagicBox() {\n this.magicBox.onmove = () => {\n // We assume that once the user has moved its selection, it becomes an explicit omnibox analytics event\n if (this.isAutoSuggestion()) {\n this.modifyEventTo = this.getOmniboxAnalyticsEventCause();\n }\n this.movedOnce = true;\n };\n\n this.magicBox.onfocus = () => {\n if (this.isAutoSuggestion()) {\n // This flag is used to block the automatic query when the UI is loaded with a query (#q=foo)\n // and then the input is focused. We want to block that query, even if it match the suggestion\n // Only when there is an actual change in the input (user typing something) is when we want the automatic query to kick in\n this.skipAutoSuggest = true;\n }\n };\n\n this.magicBox.onSuggestions = (suggestions: IOmniboxSuggestion[]) => {\n // If text is empty, this can mean that user selected text from the search box\n // and hit \"delete\" : Reset the partial queries in this case\n if (Utils.isEmptyString(this.getText())) {\n this.omniboxAnalytics.partialQueries = [];\n }\n this.movedOnce = false;\n this.lastSuggestions = suggestions;\n if (this.isAutoSuggestion() && !this.skipAutoSuggest) {\n this.searchAsYouType();\n }\n };\n\n if (this.options.enableSearchAsYouType) {\n $$(this.element).addClass('coveo-magicbox-search-as-you-type');\n }\n\n this.magicBox.onchange = () => {\n this.skipAutoSuggest = false;\n const text = this.getText();\n if (text != undefined && text != '') {\n if (this.isAutoSuggestion()) {\n if (this.movedOnce) {\n this.searchAsYouType(true);\n }\n } else if (this.options.enableSearchAsYouType) {\n this.searchAsYouType(true);\n }\n } else {\n this.clear();\n }\n };\n\n if (this.options.placeholder) {\n (this.magicBox.element.querySelector('input')).placeholder = this.options.placeholder;\n }\n this.magicBox.onsubmit = () => this.submit();\n\n this.magicBox.onselect = (suggestion: IOmniboxSuggestion) => {\n const index = _.indexOf(this.lastSuggestions, suggestion);\n const suggestions = _.compact(_.map(this.lastSuggestions, suggestion => suggestion.text));\n this.magicBox.clearSuggestion();\n this.updateQueryState();\n // A bit tricky here : When it's machine learning auto suggestions\n // the mouse selection and keyboard selection acts differently :\n // keyboard selection will automatically do the query (which will log a search as you type event -> further modified by this.modifyEventTo if needed)\n // mouse selection will not \"auto\" send the query.\n // the movedOnce variable detect the keyboard movement, and is used to differentiate mouse vs keyboard\n if (!this.isAutoSuggestion()) {\n this.usageAnalytics.cancelAllPendingEvents();\n this.triggerNewQuery(false, () => {\n this.usageAnalytics.logSearchEvent(\n this.getOmniboxAnalyticsEventCause(),\n this.buildCustomDataForPartialQueries(index, suggestions)\n );\n });\n } else if (this.isAutoSuggestion() && this.movedOnce) {\n this.handleAutoSuggestionWithKeyboard(index, suggestions);\n } else if (this.isAutoSuggestion() && !this.movedOnce) {\n this.handleAutoSuggestionsWithMouse(index, suggestions);\n }\n\n // Consider a selection like a reset of the partial queries (it's the end of a suggestion pattern)\n if (this.isAutoSuggestion()) {\n this.omniboxAnalytics.partialQueries = [];\n }\n };\n\n this.magicBox.onblur = () => {\n if (this.isAutoSuggestion()) {\n this.setText(this.getQuery(true));\n this.usageAnalytics.sendAllPendingEvents();\n }\n };\n\n this.magicBox.onclear = () => {\n this.updateQueryState();\n if (this.options.triggerQueryOnClear || this.options.enableSearchAsYouType) {\n this.triggerNewQuery(false, () => {\n this.usageAnalytics.logSearchEvent(analyticsActionCauseList.searchboxClear, {});\n });\n }\n };\n\n this.magicBox.ontabpress = () => {\n this.handleTabPress();\n };\n\n this.magicBox.getSuggestions = () => this.handleSuggestions();\n }\n\n private handleAutoSuggestionWithKeyboard(index: number, suggestions: string[]) {\n if (this.searchAsYouTypeTimeout) {\n // Here, there is currently a search as you typed queued up :\n // Think : user typed very quickly, then very quickly selected a suggestion (without waiting for the search as you type)\n // Cancel the search as you type query, then immediately do the query with the selection (+analytics event with the selection)\n this.usageAnalytics.cancelAllPendingEvents();\n clearTimeout(this.searchAsYouTypeTimeout);\n this.searchAsYouTypeTimeout = undefined;\n this.triggerNewQuery(false, () => {\n this.usageAnalytics.logSearchEvent(\n this.getOmniboxAnalyticsEventCause(),\n this.buildCustomDataForPartialQueries(index, suggestions)\n );\n });\n } else {\n // Here, the search as you type query has returned, but the analytics event has not ye been sent.\n // Think : user typed slowly, the query returned, and then the user selected a suggestion.\n // Since the analytics event has not yet been sent (search as you type event have a 5 sec delay)\n // modify the pending event, then send the newly modified analytics event immediately.\n this.modifyEventTo = this.getOmniboxAnalyticsEventCause();\n this.modifyCustomDataOnPending(index, suggestions);\n this.modifyQueryContentOnPending();\n this.usageAnalytics.sendAllPendingEvents();\n }\n }\n\n private handleAutoSuggestionsWithMouse(index: number, suggestions: string[]) {\n if (this.searchAsYouTypeTimeout || index != 0) {\n // Here : the user either very quickly chose the first suggestion, and the search as you type is still queued up.\n // OR\n // the user chose something different then the first suggestion.\n // Remove the search as you type if it's there, and do the query with the suggestion directly.\n this.clearSearchAsYouType();\n this.usageAnalytics.cancelAllPendingEvents();\n this.triggerNewQuery(false, () => {\n this.usageAnalytics.logSearchEvent(\n this.getOmniboxAnalyticsEventCause(),\n this.buildCustomDataForPartialQueries(index, suggestions)\n );\n });\n } else {\n // Here : the user either very slowly chose a suggestion, and there is no search as you typed queued up\n // AND\n // the user chose the first suggestion.\n // this means the query is already returned, but the analytics event is still queued up.\n // modify the analytics event, and send it.\n this.modifyEventTo = this.getOmniboxAnalyticsEventCause();\n this.modifyCustomDataOnPending(index, suggestions);\n this.modifyQueryContentOnPending();\n this.usageAnalytics.sendAllPendingEvents();\n\n // This should happen if :\n // users did a (short) query first, which does not match the first suggestion. (eg: typed \"t\", then search)\n // then, refocus the search box. The same suggestion(s) will re-appear.\n // By selecting the first one with the mouse, we need to retrigger a query because this means the search as you type could not\n // kick in and do the query automatically.\n if (this.lastQuery != this.getText()) {\n this.triggerNewQuery(false, () => {\n this.usageAnalytics.logSearchEvent(\n this.getOmniboxAnalyticsEventCause(),\n this.buildCustomDataForPartialQueries(index, suggestions)\n );\n });\n }\n }\n }\n\n private modifyCustomDataOnPending(index: number, suggestions: string[]) {\n const pendingEvt = this.usageAnalytics.getPendingSearchEvent();\n if (pendingEvt instanceof PendingSearchAsYouTypeSearchEvent) {\n const newCustomData = this.buildCustomDataForPartialQueries(index, suggestions);\n _.each(_.keys(newCustomData), (k: string) => {\n (pendingEvt).modifyCustomData(k, newCustomData[k]);\n });\n }\n }\n\n private modifyQueryContentOnPending() {\n const pendingEvt = this.usageAnalytics.getPendingSearchEvent();\n if (pendingEvt instanceof PendingSearchAsYouTypeSearchEvent) {\n const queryContent = this.getQuery(this.options.enableSearchAsYouType);\n pendingEvt.modifyQueryContent(queryContent);\n }\n }\n\n private buildCustomDataForPartialQueries(index: number, suggestions: string[]): IAnalyticsOmniboxSuggestionMeta {\n this.updateOmniboxAnalytics(suggestions, index);\n return this.omniboxAnalytics.buildCustomDataForPartialQueries();\n }\n\n private handleQuerySuggestGetFocus({ suggestion }: IQuerySuggestSelection) {\n const suggestions = _.compact(_.map(this.lastSuggestions, suggestion => suggestion.text));\n const ranking = this.lastSuggestions.indexOf(findWhere(this.lastSuggestions, { text: suggestion }));\n this.updateOmniboxAnalytics(suggestions, ranking);\n }\n\n private updateOmniboxAnalytics(suggestions: string[], suggestionRanking: number) {\n this.omniboxAnalytics.suggestions = suggestions;\n this.omniboxAnalytics.suggestionRanking = suggestionRanking;\n }\n\n private handleSuggestions() {\n const text = this.getText();\n if (this.options.querySuggestCharacterThreshold <= text.length) {\n const suggestionsEventArgs: IPopulateOmniboxSuggestionsEventArgs = {\n suggestions: [],\n omnibox: this\n };\n\n this.triggerOmniboxSuggestions(suggestionsEventArgs);\n\n if (!Utils.isNullOrEmptyString(text)) {\n this.omniboxAnalytics.partialQueries.push(text);\n }\n\n return _.compact(suggestionsEventArgs.suggestions);\n } else {\n return [];\n }\n }\n\n private triggerOmniboxSuggestions(args: IPopulateOmniboxSuggestionsEventArgs) {\n this.bind.trigger(this.element, OmniboxEvents.populateOmniboxSuggestions, args);\n\n if (!$$(this.element).isDescendant(this.root)) {\n this.bind.trigger(this.root, OmniboxEvents.populateOmniboxSuggestions, args);\n }\n }\n\n private handleBeforeRedirect() {\n this.updateQueryState();\n }\n\n private handleBuildingQuery(data: IBuildingQueryEventArgs) {\n Assert.exists(data);\n Assert.exists(data.queryBuilder);\n this.updateQueryState();\n this.lastQuery = this.getQuery(data.searchAsYouType);\n\n const result: Result =\n this.lastQuery == this.magicBox.getDisplayedResult().input\n ? this.magicBox.getDisplayedResult().clone()\n : this.magicBox.grammar.parse(this.lastQuery).clean();\n const preprocessResultForQueryArgs: IOmniboxPreprocessResultForQueryEventArgs = {\n result: result\n };\n\n if (this.options.enableQuerySyntax) {\n const notQuotedValues = preprocessResultForQueryArgs.result.findAll('FieldValueNotQuoted');\n _.each(notQuotedValues, (value: Result) => (value.value = '\"' + value.value.replace(/\"|\\u00A0/g, ' ') + '\"'));\n if (this.options.fieldAlias) {\n const fieldNames = preprocessResultForQueryArgs.result.findAll(\n (result: Result) => result.expression.id == 'FieldName' && result.isSuccess()\n );\n _.each(fieldNames, (result: Result) => {\n const alias = _.find(_.keys(this.options.fieldAlias), (alias: string) => alias.toLowerCase() == result.value.toLowerCase());\n if (alias != null) {\n result.value = this.options.fieldAlias[alias];\n }\n });\n }\n }\n\n this.triggerOmniboxPreprocessResultForQuery(preprocessResultForQueryArgs);\n const query = preprocessResultForQueryArgs.result.toString();\n new QueryboxQueryParameters(this.options).addParameters(data.queryBuilder, query);\n }\n\n private triggerOmniboxPreprocessResultForQuery(args: IOmniboxPreprocessResultForQueryEventArgs) {\n this.bind.trigger(this.element, OmniboxEvents.omniboxPreprocessResultForQuery, args);\n\n if (!$$(this.element).isDescendant(this.root)) {\n this.bind.trigger(this.root, OmniboxEvents.omniboxPreprocessResultForQuery, args);\n }\n }\n\n private handleNewQuery(data: INewQueryEventArgs) {\n Assert.exists(data);\n this.options.clearFiltersOnNewQuery && this.clearFiltersIfNewQuery(data);\n }\n\n private clearFiltersIfNewQuery({ origin, searchAsYouType }: INewQueryEventArgs) {\n if (this.queryController.firstQuery) {\n return;\n }\n\n // Prevent queries triggered by unrelated components to clear the the filters\n // e.g., a facet selection\n const validOrigins = [Omnibox.ID, 'SearchButton'];\n if (!origin || validOrigins.indexOf(origin.type) === -1) {\n return;\n }\n\n const lastQuery = this.queryController.getLastQuery().q || '';\n const newQuery = this.getQuery(searchAsYouType);\n if (lastQuery !== newQuery) {\n this.bind.trigger(this.root, BreadcrumbEvents.clearBreadcrumb);\n }\n }\n\n private handleTabPress() {\n if (this.options.enableQuerySuggestAddon) {\n this.handleTabPressForSuggestions();\n }\n this.handleTabPressForOldOmniboxAddon();\n }\n\n private handleTabPressForSuggestions() {\n if (!this.options.enableSearchAsYouType) {\n const suggestions = _.compact(_.map(this.lastSuggestions, suggestion => suggestion.text));\n this.usageAnalytics.logCustomEvent(\n this.getOmniboxAnalyticsEventCause(),\n this.buildCustomDataForPartialQueries(0, suggestions),\n this.element\n );\n } else {\n this.setText(this.getQuery(true));\n }\n }\n\n private handleTabPressForOldOmniboxAddon() {\n const domSuggestions = this.lastSuggestions.filter(suggestions => suggestions.dom).map(suggestions => $$(suggestions.dom));\n const selected = this.findAllElementsWithClass(domSuggestions, '.coveo-omnibox-selected');\n if (selected.length > 0) {\n $$(selected[0]).trigger('tabSelect');\n } else if (!this.options.enableQuerySuggestAddon) {\n const selectable = this.findAllElementsWithClass(domSuggestions, '.coveo-omnibox-selectable');\n if (selectable.length > 0) {\n $$(selectable[0]).trigger('tabSelect');\n }\n }\n }\n\n private findAllElementsWithClass(elements: Dom[], className: string): Dom[] {\n return elements\n .map(element => element.find(className))\n .filter(s => s)\n .reduce((total, s) => total.concat(s), []);\n }\n\n private triggerNewQuery(searchAsYouType: boolean, analyticsEvent: () => void) {\n clearTimeout(this.searchAsYouTypeTimeout);\n const shouldExecuteQuery = this.shouldExecuteQuery(searchAsYouType);\n this.lastQuery = this.getQuery(searchAsYouType);\n shouldExecuteQuery && analyticsEvent();\n\n this.queryController.executeQuery({\n searchAsYouType: searchAsYouType,\n logInActionsHistory: true,\n cancel: !shouldExecuteQuery,\n origin: this\n });\n }\n\n private getQuery(searchAsYouType: boolean) {\n if (this.lastQuery == this.magicBox.getText()) {\n return this.lastQuery;\n }\n\n if (!searchAsYouType) {\n return this.magicBox.getText();\n }\n\n const wordCompletion = this.magicBox.getWordCompletion();\n\n if (wordCompletion != null) {\n return wordCompletion;\n }\n\n const currentOmniboxSuggestion = this.magicBox.getWordCompletion() || this.getFirstSuggestion();\n if (currentOmniboxSuggestion) {\n return currentOmniboxSuggestion;\n }\n\n if (this.isAutoSuggestion()) {\n return this.lastQuery || this.magicBox.getText();\n }\n\n return this.magicBox.getText();\n }\n\n private getFirstSuggestion() {\n if (this.lastSuggestions == null) {\n return '';\n }\n\n if (this.lastSuggestions.length <= 0) {\n return '';\n }\n\n const textSuggestion = _.find(this.lastSuggestions, (suggestion: IOmniboxSuggestion) => suggestion.text != null);\n\n if (textSuggestion == null) {\n return '';\n }\n\n return textSuggestion.text;\n }\n\n public updateQueryState() {\n this.queryStateModel.set(QueryStateModel.attributesEnum.q, this.magicBox.getText());\n }\n\n private handleQueryStateChanged(args: IAttributeChangedEventArg) {\n Assert.exists(args);\n const q = args.value;\n if (q != this.magicBox.getText()) {\n this.magicBox.setText(q);\n }\n }\n\n private handleQuerySuccess() {\n if (!this.isAutoSuggestion()) {\n this.omniboxAnalytics.partialQueries = [];\n }\n }\n\n private handleDuringQuery(args: IDuringQueryEventArgs) {\n // When the query results returns ... (args.promise)\n args.promise.then(() => {\n // Get a handle on a pending search as you type (those events are delayed, not sent instantly)\n const pendingEvent = this.usageAnalytics.getPendingSearchEvent();\n if (pendingEvent instanceof PendingSearchAsYouTypeSearchEvent) {\n (pendingEvent).beforeResolve.then(evt => {\n // Check if we need to modify the event type beforeResolving it\n args.promise.then(() => {\n if (this.modifyEventTo) {\n evt.modifyEventCause(this.modifyEventTo);\n this.modifyEventTo = null;\n }\n });\n });\n }\n });\n }\n\n private searchAsYouType(forceExecuteQuery = false) {\n this.clearSearchAsYouType();\n if (this.shouldExecuteQuery(true)) {\n this.searchAsYouTypeTimeout = window.setTimeout(() => {\n if (this.suggestionShouldTriggerQuery() || forceExecuteQuery) {\n const suggestions = _.map(this.lastSuggestions, suggestion => suggestion.text);\n const index = _.indexOf(suggestions, this.magicBox.getWordCompletion());\n this.triggerNewQuery(true, () => {\n this.usageAnalytics.logSearchAsYouType(\n analyticsActionCauseList.searchboxAsYouType,\n this.buildCustomDataForPartialQueries(index, suggestions)\n );\n });\n this.clearSearchAsYouType();\n }\n }, this.options.searchAsYouTypeDelay);\n }\n }\n\n private isAutoSuggestion() {\n return this.options.enableSearchAsYouType && this.options.enableQuerySuggestAddon;\n }\n\n private shouldExecuteQuery(searchAsYouType: boolean) {\n const text = this.getQuery(searchAsYouType);\n if (this.searchInterface.options.allowQueriesWithoutKeywords === false) {\n return this.lastQuery != text && Utils.isNonEmptyString(text);\n }\n return this.lastQuery != text && text != null;\n }\n\n private suggestionShouldTriggerQuery(suggestions = this.lastSuggestions) {\n if (this.shouldExecuteQuery(true)) {\n if (suggestions && suggestions[0]) {\n const suggestion = suggestions[0];\n // If we have access to a confidence level, return true if we are equal or above the minimum confidence level.\n if (suggestion && suggestion.executableConfidence != undefined) {\n return suggestion.executableConfidence >= MINIMUM_EXECUTABLE_CONFIDENCE;\n }\n // If we don't have access to a confidence level, return true only if it \"starts with\" the content of the search box\n if (suggestion.text && suggestion.text.indexOf(this.magicBox.getText()) == 0) {\n return true;\n }\n }\n }\n return false;\n }\n\n private clearSearchAsYouType() {\n clearTimeout(this.searchAsYouTypeTimeout);\n this.searchAsYouTypeTimeout = undefined;\n }\n\n private getOmniboxAnalyticsEventCause() {\n if (this.searchInterface instanceof StandaloneSearchInterface) {\n return analyticsActionCauseList.omniboxFromLink;\n }\n return analyticsActionCauseList.omniboxAnalytics;\n }\n}\n\nOmnibox.options = { ...Omnibox.options, ...Querybox.options };\nInitialization.registerAutoCreateComponent(Omnibox);\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/Omnibox/Omnibox.ts","import { exportGlobally } from '../../GlobalExports';\nimport { l } from '../../strings/Strings';\nimport { AccessibleButton } from '../../utils/AccessibleButton';\nimport { $$ } from '../../utils/Dom';\nimport { SVGDom } from '../../utils/SVGDom';\nimport { SVGIcons } from '../../utils/SVGIcons';\nimport { Utils } from '../../utils/Utils';\nimport { IAnalyticsNoMeta, analyticsActionCauseList } from '../Analytics/AnalyticsActionListMeta';\nimport { Component } from '../Base/Component';\nimport { IComponentBindings } from '../Base/ComponentBindings';\nimport { Initialization } from '../Base/Initialization';\nimport { QueryStateModel } from '../../models/QueryStateModel';\n\nexport interface ISearchButtonOptions {\n searchbox?: ISearchButtonSearchbox;\n}\n\nexport interface ISearchButtonSearchbox {\n getText: () => string;\n}\n\n/**\n * The SearchButton component renders a search icon that the end user can click to trigger a new query.\n *\n * See also the {@link Searchbox} component, which can automatically instantiate a SearchButton component along with a\n * {@link Querybox} component or an {@link Omnibox} component.\n */\nexport class SearchButton extends Component {\n static ID = 'SearchButton';\n\n static doExport = () => {\n exportGlobally({\n SearchButton: SearchButton\n });\n };\n\n static options: ISearchButtonOptions = {};\n\n /**\n * Creates a new SearchButton. Binds a `click` event on the element. Adds a search icon on the element.\n * @param element The HTMLElement on which to instantiate the component.\n * @param options The options for the SearchButton component.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n */\n constructor(public element: HTMLElement, public options?: ISearchButtonOptions, bindings?: IComponentBindings) {\n super(element, SearchButton.ID, bindings);\n\n new AccessibleButton()\n .withElement(element)\n .withOwner(this.bind)\n .withLabel(l('Search'))\n .withSelectAction(() => this.handleClick())\n .build();\n\n // Provide a magnifier icon if element contains nothing\n if (Utils.trim($$(this.element).text()) == '') {\n const svgMagnifierContainer = $$('span', { className: 'coveo-search-button' }, SVGIcons.icons.search).el;\n SVGDom.addClassToSVGInContainer(svgMagnifierContainer, 'coveo-search-button-svg');\n const svgLoadingAnimationContainer = $$('span', { className: 'coveo-search-button-loading' }, SVGIcons.icons.loading).el;\n SVGDom.addClassToSVGInContainer(svgLoadingAnimationContainer, 'coveo-search-button-loading-svg');\n element.appendChild(svgMagnifierContainer);\n element.appendChild(svgLoadingAnimationContainer);\n }\n }\n\n /**\n * Triggers the `click` event handler, which logs a `searchboxSubmit` event in the usage analytics and executes a\n * query.\n */\n public click() {\n this.handleClick();\n }\n\n private handleClick() {\n this.logger.debug('Performing query following button click');\n this.updateQueryStateModelWithSearchboxQuery();\n this.usageAnalytics.logSearchEvent(analyticsActionCauseList.searchboxSubmit, {});\n this.queryController.executeQuery({ origin: this, logInActionsHistory: true });\n }\n\n private updateQueryStateModelWithSearchboxQuery() {\n const searchbox = this.options && this.options.searchbox;\n searchbox && this.queryStateModel.set(QueryStateModel.attributesEnum.q, searchbox.getText());\n }\n}\n\nInitialization.registerAutoCreateComponent(SearchButton);\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/SearchButton/SearchButton.ts","import { Expression } from './Expression';\n\nexport const ExpressionEndOfInput: Expression = {\n id: 'end of input',\n parse: null\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Expression/ExpressionEndOfInput.ts","import { Expression } from './Expression';\nimport { Result } from '../Result/Result';\nimport { EndOfInputResult } from '../Result/Result';\n\nexport class ExpressionConstant implements Expression {\n constructor(public value: string, public id: string) {}\n\n public parse(input: string, end: boolean): Result {\n // the value must be at the start of the input\n var success = input.indexOf(this.value) == 0;\n var result = new Result(success ? this.value : null, this, input);\n // if is successful and we require the end but the length of parsed is\n // lower than the input length, return a EndOfInputExpected Result\n if (success && end && input.length > this.value.length) {\n return new EndOfInputResult(result);\n }\n return result;\n }\n\n public toString() {\n return this.value;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Expression/ExpressionConstant.ts","import { Basic } from './Basic';\nimport { SubGrammar } from './Expressions';\nimport { Date } from './Date';\nexport const Field: SubGrammar = {\n basicExpressions: ['FieldSimpleQuery', 'FieldQuery', 'Field'],\n grammars: {\n FieldQuery: '[Field][OptionalSpaces][FieldQueryOperation]',\n FieldQueryOperation: ['FieldQueryValue', 'FieldQueryNumeric'],\n FieldQueryValue: '[FieldOperator][OptionalSpaces][FieldValue]',\n FieldQueryNumeric: '[FieldOperatorNumeric][OptionalSpaces][FieldValueNumeric]',\n FieldSimpleQuery: '[FieldName]:[OptionalSpaces][FieldValue]',\n Field: '@[FieldName]',\n FieldName: /[a-zA-Z][a-zA-Z0-9\\.\\_]*/,\n FieldOperator: /==|=|<>/,\n FieldOperatorNumeric: /<=|>=|<|>/,\n FieldValue: ['DateRange', 'NumberRange', 'DateRelative', 'Date', 'Number', 'FieldValueList', 'FieldValueString'],\n FieldValueNumeric: ['DateRelative', 'Date', 'Number'],\n FieldValueString: ['DoubleQuoted', 'FieldValueNotQuoted'],\n FieldValueList: '([FieldValueString][FieldValueStringList*])',\n FieldValueStringList: '[FieldValueSeparator][FieldValueString]',\n FieldValueSeparator: / *, */,\n FieldValueNotQuoted: /[^ \\(\\)\\[\\],]+/,\n NumberRange: '[Number][Spaces?]..[Spaces?][Number]'\n },\n include: [Date, Basic]\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Grammars/Field.ts","import { defaults, indexOf, find } from 'underscore';\nimport { IQuerySuggestSelection, OmniboxEvents } from '../events/OmniboxEvents';\nimport { Component } from '../ui/Base/Component';\nimport { $$, Dom } from '../utils/Dom';\nimport { InputManager } from './InputManager';\nimport { ResultPreviewsManager } from './ResultPreviewsManager';\nimport { QueryProcessor, ProcessingStatus } from './QueryProcessor';\nimport { QueryUtils } from '../utils/QueryUtils';\n\nexport interface Suggestion {\n text?: string;\n index?: number;\n html?: string;\n dom?: HTMLElement;\n separator?: string;\n advancedQuery?: string;\n onSelect?: () => void;\n}\n\nexport interface SuggestionsManagerOptions {\n suggestionClass?: string;\n selectedClass?: string;\n timeout?: number;\n previewHeaderText?: string;\n}\n\nexport enum Direction {\n Up = 'Up',\n Down = 'Down',\n Left = 'Left',\n Right = 'Right'\n}\n\nexport class SuggestionsManager {\n public suggestionsListbox: Dom;\n private suggestionsProcessor: QueryProcessor;\n private currentSuggestions: Suggestion[];\n private options: SuggestionsManagerOptions;\n private keyboardFocusedElement: HTMLElement;\n private resultPreviewsManager: ResultPreviewsManager;\n private root: HTMLElement;\n private suggestionListboxID = `coveo-magicbox-suggestions-${QueryUtils.createGuid()}`;\n private suggestionListboxClassName = `coveo-magicbox-suggestions`;\n\n public get hasSuggestions() {\n return this.currentSuggestions && this.currentSuggestions.length > 0;\n }\n\n public get hasFocus() {\n return $$(this.element).findClass(this.options.selectedClass).length > 0;\n }\n\n public get hasPreviews() {\n return this.resultPreviewsManager.hasPreviews;\n }\n\n private get focusedSuggestion() {\n return find(\n this.currentSuggestions,\n suggestion =>\n $$(suggestion.dom).hasClass(this.options.selectedClass) || $$(suggestion.dom).findClass(this.options.selectedClass).length > 0\n );\n }\n\n constructor(\n private element: HTMLElement,\n private magicBoxContainer: HTMLElement,\n private inputManager: InputManager,\n options?: SuggestionsManagerOptions\n ) {\n this.root = Component.resolveRoot(element);\n this.options = defaults(options, {\n suggestionClass: 'magic-box-suggestion',\n selectedClass: 'magic-box-selected'\n });\n // Put in a sane default, so as to not reject every suggestions if not set on initialization\n if (this.options.timeout == undefined) {\n this.options.timeout = 500;\n }\n\n $$(this.element).on('mouseover', e => {\n this.handleMouseOver(e);\n });\n\n $$(this.element).on('mouseout', e => {\n this.handleMouseOut(e);\n });\n\n this.suggestionsProcessor = new QueryProcessor({ timeout: this.options.timeout });\n this.resultPreviewsManager = new ResultPreviewsManager(element, {\n selectedClass: this.options.selectedClass,\n timeout: this.options.timeout\n });\n this.suggestionsListbox = this.buildSuggestionsContainer();\n $$(this.element).append(this.suggestionsListbox.el);\n this.addAccessibilityProperties();\n this.appendEmptySuggestionOption();\n }\n\n public handleMouseOver(e) {\n const target = $$(e.target);\n const parents = target.parents(this.options.suggestionClass);\n if (target.hasClass(this.options.suggestionClass)) {\n this.processMouseSelection(target.el);\n } else if (parents.length > 0 && this.element.contains(parents[0])) {\n this.processMouseSelection(parents[0]);\n }\n }\n\n public handleMouseOut(e) {\n const target = $$(e.target);\n const targetParents = target.parents(this.options.suggestionClass);\n\n //e.relatedTarget is not available if moving off the browser window or is an empty object `{}` when moving out of namespace in LockerService.\n if (e.relatedTarget && $$(e.relatedTarget).isValid()) {\n const relatedTargetParents = $$(e.relatedTarget).parents(this.options.suggestionClass);\n if (target.hasClass(this.options.selectedClass) && !$$(e.relatedTarget).hasClass(this.options.suggestionClass)) {\n this.removeSelectedStatus(target.el);\n } else if (relatedTargetParents.length == 0 && targetParents.length > 0) {\n this.removeSelectedStatus(targetParents[0]);\n }\n } else {\n if (target.hasClass(this.options.selectedClass)) {\n this.removeSelectedStatus(target.el);\n } else if (targetParents.length > 0) {\n this.removeSelectedStatus(targetParents[0]);\n }\n }\n $$(this.root).trigger(OmniboxEvents.querySuggestLoseFocus);\n }\n\n public async moveDown() {\n await this.move(Direction.Down);\n }\n\n public async moveUp() {\n await this.move(Direction.Up);\n }\n\n public async moveLeft() {\n await this.move(Direction.Left);\n }\n\n public async moveRight() {\n await this.move(Direction.Right);\n }\n\n public selectAndReturnKeyboardFocusedElement(): HTMLElement {\n const selected = this.keyboardFocusedElement;\n if (selected) {\n $$(selected).trigger('keyboardSelect');\n // By definition, once an element has been \"selected\" with the keyboard,\n // it is not longer \"active\" since the event has been processed.\n this.keyboardFocusedElement = null;\n this.inputManager.blur();\n }\n return selected;\n }\n\n public clearKeyboardFocusedElement() {\n this.keyboardFocusedElement = null;\n }\n\n public async receiveSuggestions(suggestions: (Promise | Suggestion[])[]) {\n const { results, status } = await this.suggestionsProcessor.processQueries(suggestions);\n if (status === ProcessingStatus.Overriden) {\n return [];\n }\n this.updateSuggestions(results);\n return results;\n }\n\n public clearSuggestions() {\n this.updateSuggestions([]);\n }\n\n public updateSuggestions(suggestions: Suggestion[]) {\n this.suggestionsListbox.empty();\n this.inputManager.activeDescendant = null;\n\n this.currentSuggestions = suggestions;\n\n $$(this.element).toggleClass('magic-box-hasSuggestion', this.hasSuggestions);\n this.inputManager.expanded = this.hasSuggestions;\n\n this.resultPreviewsManager.displaySearchResultPreviewsForSuggestion(null);\n\n if (!this.hasSuggestions) {\n this.appendEmptySuggestionOption();\n $$(this.root).trigger(OmniboxEvents.querySuggestLoseFocus);\n return;\n }\n\n suggestions\n .sort((a, b) => (b.index || 0) - (a.index || 0))\n .forEach(suggestion => {\n const dom = suggestion.dom ? this.modifyDomFromExistingSuggestion(suggestion.dom) : this.createDomFromSuggestion(suggestion);\n\n dom.setAttribute('id', `magic-box-suggestion-${indexOf(suggestions, suggestion)}`);\n dom.setAttribute('role', 'option');\n dom.setAttribute('aria-selected', 'false');\n dom.setAttribute('aria-label', dom.text());\n\n dom['suggestion'] = suggestion;\n this.suggestionsListbox.append(dom.el);\n });\n\n $$(this.root).trigger(OmniboxEvents.querySuggestRendered);\n }\n\n public get selectedSuggestion(): Suggestion {\n if (this.htmlElementIsSuggestion(this.keyboardFocusedElement)) {\n return this.returnMoved(this.keyboardFocusedElement) as Suggestion;\n }\n return null;\n }\n\n private async processKeyboardSelection(suggestion: HTMLElement) {\n this.addSelectedStatus(suggestion);\n this.keyboardFocusedElement = suggestion;\n await this.updateSelectedSuggestion(this.focusedSuggestion);\n }\n\n private processKeyboardPreviewSelection(preview: HTMLElement) {\n this.addSelectedStatus(preview);\n this.keyboardFocusedElement = preview;\n }\n\n private processMouseSelection(suggestion: HTMLElement) {\n this.addSelectedStatus(suggestion);\n this.updateSelectedSuggestion(this.focusedSuggestion);\n this.keyboardFocusedElement = null;\n }\n\n private buildSuggestionsContainer() {\n return $$('div', {\n className: this.suggestionListboxClassName,\n id: this.suggestionListboxID,\n role: 'listbox',\n ariaLabel: 'Search Suggestions'\n });\n }\n\n private createDomFromSuggestion(suggestion: Suggestion) {\n const dom = $$('div', {\n className: `magic-box-suggestion ${this.options.suggestionClass}`\n });\n\n suggestion.dom = dom.el;\n\n dom.on('click', () => {\n this.selectSuggestion(suggestion);\n });\n\n dom.on('keyboardSelect', () => {\n this.selectSuggestion(suggestion);\n });\n\n if (suggestion.html) {\n dom.el.innerHTML = suggestion.html;\n return dom;\n }\n\n if (suggestion.text) {\n dom.text(suggestion.text);\n\n return dom;\n }\n\n if (suggestion.separator) {\n dom.addClass('magic-box-suggestion-seperator');\n const suggestionLabel = $$(\n 'div',\n {\n className: 'magic-box-suggestion-seperator-label'\n },\n suggestion.separator\n );\n dom.append(suggestionLabel.el);\n return dom;\n }\n\n return dom;\n }\n\n private selectSuggestion(suggestion: Suggestion) {\n suggestion.onSelect();\n $$(this.root).trigger(OmniboxEvents.querySuggestSelection, { suggestion: suggestion.text });\n }\n\n private appendEmptySuggestionOption() {\n // Accessibility tools reports that a listbox element must always have at least one child with an option\n // Even if there is no suggestions to show.\n this.suggestionsListbox.append($$('div', { role: 'option' }).el);\n }\n\n private modifyDomFromExistingSuggestion(dom: HTMLElement) {\n // this need to be done if the selection is in cache and the dom is set in the suggestion\n this.removeSelectedStatus(dom);\n const found = dom.classList.contains(this.options.suggestionClass) ? dom : $$(dom).find('.' + this.options.suggestionClass);\n this.removeSelectedStatus(found);\n return $$(dom);\n }\n\n private async move(direction: Direction) {\n if (this.resultPreviewsManager.focusedPreviewElement) {\n await this.moveWithinPreview(direction);\n return;\n }\n if (direction === Direction.Right || direction === Direction.Left) {\n const firstPreview = this.resultPreviewsManager.previewElements[0];\n if (firstPreview) {\n this.processKeyboardPreviewSelection(firstPreview);\n return;\n }\n }\n await this.moveWithinSuggestion(direction);\n }\n\n private async moveWithinSuggestion(direction: Direction) {\n const currentlySelected = $$(this.element).find(`.${this.options.selectedClass}`);\n const selectables = $$(this.element).findAll(`.${this.options.suggestionClass}`);\n const currentIndex = indexOf(selectables, currentlySelected);\n\n let index = direction === Direction.Up ? currentIndex - 1 : currentIndex + 1;\n index = (index + selectables.length) % selectables.length;\n\n await this.selectQuerySuggest(selectables[index]);\n }\n\n private async selectQuerySuggest(suggestion: HTMLElement) {\n if (suggestion) {\n await this.processKeyboardSelection(suggestion);\n } else {\n this.keyboardFocusedElement = null;\n this.inputManager.input.removeAttribute('aria-activedescendant');\n }\n\n return suggestion;\n }\n\n private async moveWithinPreview(direction: Direction) {\n const newFocusedPreview = this.resultPreviewsManager.getElementInDirection(direction);\n if (!newFocusedPreview) {\n await this.selectQuerySuggest(this.resultPreviewsManager.previewsOwner.dom);\n return;\n }\n this.processKeyboardPreviewSelection(newFocusedPreview);\n }\n\n private returnMoved(selected) {\n if (selected) {\n if (selected['suggestion']) {\n return selected['suggestion'];\n }\n if (selected['no-text-suggestion']) {\n return null;\n }\n if (selected instanceof HTMLElement) {\n return {\n text: $$(selected).text()\n };\n }\n }\n return null;\n }\n\n private addSelectedStatus(element: HTMLElement): void {\n const selected = this.element.getElementsByClassName(this.options.selectedClass);\n for (let i = 0; i < selected.length; i++) {\n const elem = selected.item(i);\n this.removeSelectedStatus(elem);\n }\n $$(element).addClass(this.options.selectedClass);\n this.updateAreaSelectedIfDefined(element, 'true');\n }\n\n private async updateSelectedSuggestion(suggestion: Suggestion) {\n $$(this.root).trigger(OmniboxEvents.querySuggestGetFocus, {\n suggestion: suggestion.text\n });\n await this.resultPreviewsManager.displaySearchResultPreviewsForSuggestion(suggestion);\n }\n\n private removeSelectedStatus(suggestion: HTMLElement): void {\n $$(suggestion).removeClass(this.options.selectedClass);\n this.updateAreaSelectedIfDefined(suggestion, 'false');\n }\n\n private updateAreaSelectedIfDefined(element: HTMLElement, value: string): void {\n if ($$(element).getAttribute('aria-selected')) {\n this.inputManager.activeDescendant = element;\n $$(element).setAttribute('aria-selected', value);\n }\n }\n\n private addAccessibilityProperties() {\n this.addAccessibilityPropertiesForMagicBox();\n this.addAccessibilityPropertiesForInput();\n }\n\n private addAccessibilityPropertiesForMagicBox() {\n const magicBox = $$(this.magicBoxContainer);\n\n magicBox.setAttribute('role', 'search');\n magicBox.setAttribute('aria-haspopup', 'listbox');\n }\n\n private addAccessibilityPropertiesForInput() {\n const input = $$(this.inputManager.input);\n\n this.inputManager.activeDescendant = null;\n this.inputManager.expanded = false;\n input.setAttribute('aria-owns', this.suggestionListboxID);\n input.setAttribute('aria-controls', this.suggestionListboxID);\n }\n\n private htmlElementIsSuggestion(selected: HTMLElement) {\n const omniboxSelectables = $$(this.element).findAll(`.${this.options.suggestionClass}`);\n return indexOf(omniboxSelectables, selected) > -1;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/SuggestionsManager.ts","import { each, find, isUndefined } from 'underscore';\nimport { KEYBOARD } from '../Core';\nimport { $$ } from '../utils/Dom';\nimport { doMagicBoxExport } from './doMagicBoxExport';\nimport { Grammar } from './Grammar';\nimport { InputManager } from './InputManager';\nimport { MagicBoxClear } from './MagicBoxClear';\nimport { Result } from './Result/Result';\nimport { Suggestion, SuggestionsManager } from './SuggestionsManager';\n\nexport interface Options {\n inline?: boolean;\n selectableSuggestionClass?: string;\n selectedSuggestionClass?: string;\n suggestionTimeout?: number;\n}\n\nexport class MagicBoxInstance {\n public onblur: () => void;\n public onfocus: () => void;\n public onchange: () => void;\n public onSuggestions: (suggestions: Suggestion[]) => void;\n public onsubmit: () => void;\n public onselect: (suggestion: Suggestion) => void;\n public onclear: () => void;\n public onmove: () => void;\n public ontabpress: () => void;\n\n public getSuggestions: () => Array | Suggestion[]>;\n\n private inputManager: InputManager;\n private suggestionsManager: SuggestionsManager;\n private magicBoxClear: MagicBoxClear;\n\n private lastSuggestions: Suggestion[] = [];\n\n private result: Result;\n private displayedResult: Result;\n\n private get firstSuggestionWithText(): Suggestion {\n return find(this.lastSuggestions, suggestion => suggestion.text);\n }\n\n private get firstSuggestionText() {\n const firstSuggestionWithText = this.firstSuggestionWithText;\n return firstSuggestionWithText ? firstSuggestionWithText.text : '';\n }\n\n constructor(public element: HTMLElement, public grammar: Grammar, public options: Options = {}) {\n if (isUndefined(this.options.inline)) {\n this.options.inline = false;\n }\n $$(element).addClass('magic-box');\n if (this.options.inline) {\n $$(element).addClass('magic-box-inline');\n }\n\n this.result = this.grammar.parse('');\n this.displayedResult = this.result.clean();\n\n let inputContainer = $$(element).find('.magic-box-input');\n if (!inputContainer) {\n inputContainer = document.createElement('div');\n inputContainer.className = 'magic-box-input';\n element.appendChild(inputContainer);\n }\n\n this.inputManager = new InputManager(\n inputContainer,\n (text, wordCompletion) => {\n if (!wordCompletion) {\n this.setText(text);\n this.addSuggestions();\n this.onchange && this.onchange();\n } else {\n this.setText(text);\n this.onselect && this.onselect(this.firstSuggestionWithText);\n }\n },\n this\n );\n\n this.inputManager.ontabpress = () => {\n this.ontabpress && this.ontabpress();\n };\n\n const existingValue = this.inputManager.getValue();\n if (existingValue) {\n this.displayedResult.input = existingValue;\n }\n\n this.inputManager.setResult(this.displayedResult);\n\n const suggestionsContainer = document.createElement('div');\n suggestionsContainer.className = 'magic-box-suggestions';\n this.element.appendChild(suggestionsContainer);\n\n this.suggestionsManager = new SuggestionsManager(suggestionsContainer, this.element, this.inputManager, {\n suggestionClass: this.options.selectableSuggestionClass,\n selectedClass: this.options.selectedSuggestionClass,\n timeout: this.options.suggestionTimeout\n });\n\n this.magicBoxClear = new MagicBoxClear(this);\n this.setupHandler();\n }\n\n public getResult() {\n return this.result;\n }\n\n public getDisplayedResult() {\n return this.displayedResult;\n }\n\n public setText(text: string) {\n $$(this.element).toggleClass('magic-box-notEmpty', text.length > 0);\n this.magicBoxClear.toggleTabindexAndAriaHidden(text.length > 0);\n\n this.result = this.grammar.parse(text);\n this.displayedResult = this.result.clean();\n\n this.inputManager.setResult(this.displayedResult);\n }\n\n public setCursor(index: number) {\n this.inputManager.setCursor(index);\n }\n\n public getCursor() {\n return this.inputManager.getCursor();\n }\n\n public resultAtCursor(match?: string | { (result: Result): boolean }): Result[] {\n return this.displayedResult.resultAt(this.getCursor(), match);\n }\n\n private setupHandler() {\n this.inputManager.onblur = () => {\n $$(this.element).removeClass('magic-box-hasFocus');\n this.onblur && this.onblur();\n if (!this.options.inline) {\n this.clearSuggestion();\n }\n };\n\n this.inputManager.onfocus = () => {\n $$(this.element).addClass('magic-box-hasFocus');\n this.addSuggestions();\n this.onfocus && this.onfocus();\n };\n\n this.inputManager.onkeydown = (key: number) => {\n if (this.shouldMoveInSuggestions(key)) {\n return false;\n }\n if (key === KEYBOARD.ENTER) {\n const suggestion = this.suggestionsManager.selectAndReturnKeyboardFocusedElement();\n if (suggestion == null) {\n this.onsubmit && this.onsubmit();\n }\n return false;\n } else if (key === KEYBOARD.ESCAPE) {\n this.clearSuggestion();\n this.blur();\n } else {\n this.suggestionsManager.clearKeyboardFocusedElement();\n }\n return true;\n };\n\n this.inputManager.onchangecursor = () => {\n this.addSuggestions();\n };\n\n this.inputManager.onkeyup = (key: number) => {\n this.onmove && this.onmove();\n if (!this.shouldMoveInSuggestions(key)) {\n return true;\n }\n switch (key) {\n case KEYBOARD.UP_ARROW:\n this.suggestionsManager.moveUp();\n break;\n case KEYBOARD.DOWN_ARROW:\n this.suggestionsManager.moveDown();\n break;\n case KEYBOARD.LEFT_ARROW:\n this.suggestionsManager.moveLeft();\n break;\n case KEYBOARD.RIGHT_ARROW:\n this.suggestionsManager.moveRight();\n break;\n }\n if (this.suggestionsManager.selectedSuggestion) {\n this.focusOnSuggestion(this.suggestionsManager.selectedSuggestion);\n }\n this.onchange && this.onchange();\n return false;\n };\n }\n\n public async addSuggestions() {\n const suggestions = await this.suggestionsManager.receiveSuggestions(this.getSuggestions != null ? this.getSuggestions() : []);\n this.addSelectEventHandlers(suggestions);\n this.inputManager.setWordCompletion(this.firstSuggestionText);\n this.onSuggestions(suggestions);\n }\n\n private shouldMoveInSuggestions(key: KEYBOARD) {\n switch (key) {\n case KEYBOARD.UP_ARROW:\n case KEYBOARD.DOWN_ARROW:\n return true;\n case KEYBOARD.LEFT_ARROW:\n case KEYBOARD.RIGHT_ARROW:\n if (this.suggestionsManager.hasFocus && this.suggestionsManager.hasPreviews) {\n return true;\n }\n }\n return false;\n }\n\n private addSelectEventHandlers(suggestions: Suggestion[]) {\n each(suggestions, (suggestion: Suggestion) => {\n if (suggestion.onSelect == null && suggestion.text != null) {\n suggestion.onSelect = () => {\n this.setText(suggestion.text);\n this.onselect && this.onselect(suggestion);\n };\n }\n });\n }\n\n public focus() {\n $$(this.element).addClass('magic-box-hasFocus');\n this.inputManager.focus();\n }\n\n public blur() {\n this.inputManager.blur();\n }\n\n public async clearSuggestion() {\n this.inputManager.setWordCompletion(null);\n this.suggestionsManager.clearSuggestions();\n this.onSuggestions([]);\n }\n\n private focusOnSuggestion(suggestion: Suggestion) {\n if (suggestion == null || suggestion.text == null) {\n this.inputManager.setResult(this.displayedResult, this.firstSuggestionText);\n } else {\n this.inputManager.setResult(this.grammar.parse(suggestion.text).clean(), suggestion.text);\n }\n }\n\n public getText() {\n return this.inputManager.getValue();\n }\n\n public getWordCompletion() {\n return this.inputManager.getWordCompletion();\n }\n\n public clear() {\n this.setText('');\n this.clearSuggestion();\n this.focus();\n this.onclear && this.onclear();\n }\n\n public hasSuggestions() {\n return this.suggestionsManager.hasSuggestions;\n }\n}\n\nexport function createMagicBox(element: HTMLElement, grammar: Grammar, options?: Options) {\n return new MagicBoxInstance(element, grammar, options);\n}\n\nexport function requestAnimationFrame(callback: () => void) {\n if ('requestAnimationFrame' in window) {\n return window.requestAnimationFrame(callback);\n }\n return setTimeout(callback);\n}\n\ndoMagicBoxExport();\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/MagicBox.ts","import _ = require('underscore');\n\nexport class MagicBoxUtils {\n static escapeRegExp(str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n }\n\n static highlightText(\n text: string,\n highligth: string,\n ignoreCase = false,\n matchClass: string = 'magic-box-hightlight',\n doNotMatchClass: string = ''\n ) {\n if (highligth.length == 0) {\n return text;\n }\n const escaped = this.escapeRegExp(highligth);\n const stringRegex = '(' + escaped + ')|(.*?(?=' + escaped + ')|.+)';\n const regex = new RegExp(stringRegex, ignoreCase ? 'gi' : 'g');\n return text.replace(regex, (text, match, notmatch) => this.escapeText(match != null ? matchClass : doNotMatchClass, text));\n }\n\n private static escapeText = (classname: string, text: string) => {\n return `${_.escape(text)}`;\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/MagicBoxUtils.ts","import 'styling/_Searchbox';\nimport { exportGlobally } from '../../GlobalExports';\nimport { $$ } from '../../utils/Dom';\nimport { SVGDom } from '../../utils/SVGDom';\nimport { SVGIcons } from '../../utils/SVGIcons';\nimport { SearchBoxResize } from '../../utils/SearchBoxResize';\nimport { Component } from '../Base/Component';\nimport { IComponentBindings } from '../Base/ComponentBindings';\nimport { ComponentOptions } from '../Base/ComponentOptions';\nimport { Initialization } from '../Base/Initialization';\nimport { IOmniboxOptions, Omnibox } from '../Omnibox/Omnibox';\nimport { Querybox } from '../Querybox/Querybox';\nimport { SearchButton } from '../SearchButton/SearchButton';\nimport { each, extend } from 'underscore';\n\nexport interface ISearchboxOptions extends IOmniboxOptions {\n addSearchButton?: boolean;\n enableOmnibox?: boolean;\n height?: number;\n}\n\n/**\n * The `Searchbox` component allows you to conveniently instantiate two components which end users frequently use to\n * enter and submit queries.\n *\n * This component attaches itself to a `div` element and takes care of instantiating either a\n * [`Querybox`]{@link Querybox} or an [`Omnibox`]{@link Omnibox} component (see the\n * [`enableOmnibox`]{@link Searchbox.options.enableOmnibox} option). Optionally, the `Searchbox` can also instantiate a\n * [`SearchButton`]{@link SearchButton} component, and append it inside the same `div` (see the\n * [`addSearchButton`]{@link Searchbox.options.addSearchButton} option).\n */\nexport class Searchbox extends Component {\n static ID = 'Searchbox';\n static parent = Omnibox;\n\n static doExport = () => {\n exportGlobally({\n Searchbox: Searchbox,\n SearchButton: SearchButton,\n Omnibox: Omnibox,\n Querybox: Querybox\n });\n };\n\n /**\n * Possible options for the {@link Searchbox}\n * @componentOptions\n */\n static options: ISearchboxOptions = {\n /**\n * Specifies whether to instantiate a [`SearchButton`]{@link SearchButton} component.\n *\n * Default value is `true`.\n */\n addSearchButton: ComponentOptions.buildBooleanOption({ defaultValue: true }),\n /**\n * A custom height for the search box (in pixels).\n *\n * Note: Avoid setting this option if you want to modify the search box styling through custom CSS.\n *\n * Minimum value is `25`\n *\n * Default behavior: The most specific CSS rules targeting HTML elements generated by the Searchbox component are used\n * (e.g., if you are only using the default CoveoFullSearch.css stylesheet with no further styling customizations,\n * the search box height will be set to 50 pixels by default).\n *\n * @availablesince [July 2019 Release (v2.6459)](https://docs.coveo.com/en/2938/)\n */\n height: ComponentOptions.buildNumberOption({ min: 25 }),\n\n /**\n * Specifies whether to instantiate an [`Omnibox`]{@link Omnibox} component.\n *\n * When this option is `false`, the `Searchbox` instantiates a [`Querybox`]{@link Querybox} component instead.\n *\n * **Note:**\n * > You can use configuration options specific to the component you choose to instantiate with the `Searchbox`.\n *\n * **Examples:**\n *\n * In this first case, the `Searchbox` instantiates a `Querybox` component. You can configure this `Querybox`\n * instance using any of the `Querybox` component options, such as\n * [`triggerQueryOnClear`]{@link Querybox.options.triggerQueryOnClear}.\n * ```html\n *
\n * ```\n *\n * In this second case, the `Searchbox` instantiates an `Omnibox` component. You can configure this `Omnibox`\n * instance using any of the `Omnibox` component options, such as\n * [`placeholder`]{@link Omnibox.options.placeholder}.\n * Moreover, since the `Omnibox` component inherits all of the `Querybox` component options, the\n * `data-trigger-query-on-clear` option from the previous example would also work on this `Omnibox` instance.\n * ```html\n *
\n * ```\n *\n * Default value is `true`.\n */\n enableOmnibox: ComponentOptions.buildBooleanOption({ defaultValue: true })\n };\n\n /**\n * The [`SearchButton`]{@link SearchButton} component instance.\n */\n public searchButton: SearchButton;\n\n /**\n * The component instance which allows end users to input queries.\n *\n * Can be either a [`Querybox`]{@link Querybox} or an [`Omnibox`]{@link Omnibox} component, depending on the value of\n * [`enableOmnibox`]{@link Searchbox.options.enableOmnibox}.\n */\n public searchbox: Querybox | Omnibox;\n\n /**\n * Creates a new `Searchbox` component. Creates a new `Coveo.Magicbox` instance and wraps magic box methods (`onblur`,\n * `onsubmit`, etc.). Binds event on `buildingQuery` and on redirection (for standalone box).\n * @param element The HTMLElement on which to instantiate the component. This cannot be an HTMLInputElement for\n * technical reasons.\n * @param options The options for the `Searchbox component`. These will merge with the options from the component set\n * directly on the `HTMLElement`.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n */\n constructor(public element: HTMLElement, public options?: ISearchboxOptions, public bindings?: IComponentBindings) {\n super(element, Searchbox.ID, bindings);\n\n this.options = ComponentOptions.initComponentOptions(element, Searchbox, options);\n\n if (this.options.inline) {\n $$(element).addClass('coveo-inline');\n }\n\n this.initSearchBox();\n this.initSearchButton();\n this.applyMagicBoxIcon();\n this.applyCustomHeight();\n }\n\n private initSearchBox() {\n const div = document.createElement('div');\n this.element.appendChild(div);\n\n if (this.options.enableOmnibox) {\n this.searchbox = new Omnibox(div, this.options, this.bindings);\n } else {\n this.searchbox = new Querybox(div, this.options, this.bindings);\n }\n }\n\n private initSearchButton() {\n if (!this.options.addSearchButton) {\n return;\n }\n\n const anchor = $$('a');\n this.element.appendChild(anchor.el);\n this.searchButton = new SearchButton(anchor.el, { searchbox: this.searchbox }, this.bindings);\n }\n\n private applyMagicBoxIcon() {\n const magicBoxIcon = $$(this.element).find('.magic-box-icon');\n magicBoxIcon.innerHTML = SVGIcons.icons.mainClear;\n SVGDom.addClassToSVGInContainer(magicBoxIcon, 'magic-box-clear-svg');\n }\n\n private applyCustomHeight() {\n if (!this.options.height) {\n return;\n }\n\n $$(this.element).addClass('coveo-custom-height');\n SearchBoxResize.resize(this.element, this.options.height);\n }\n}\n\nSearchbox.options = { ...Searchbox.options, ...Omnibox.options, ...Querybox.options };\n\n// Only parse omnibox option if omnibox is enabled\neach(Searchbox.options, (value, key: string) => {\n if (key in Omnibox.options && !(key in Querybox.options)) {\n Searchbox.options[key] = extend({ depend: 'enableOmnibox' }, value);\n }\n});\n\nInitialization.registerAutoCreateComponent(Searchbox);\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/Searchbox/Searchbox.ts","import { Expression } from './Expression';\nimport { Result } from '../Result/Result';\nimport { Grammar } from '../Grammar';\nimport { RefResult } from '../Result/RefResult';\nimport { ExpressionEndOfInput } from './ExpressionEndOfInput';\nimport _ = require('underscore');\n\nexport class ExpressionRef implements Expression {\n constructor(public ref: string, public occurrence: string | number, public id: string, public grammar: Grammar) {}\n\n parse(input: string, end: boolean): Result {\n var ref = this.grammar.getExpression(this.ref);\n if (ref == null) {\n throw new Error('Expression not found:' + this.ref);\n }\n if (this.occurrence == '?' || this.occurrence == null) {\n return this.parseOnce(input, end, ref);\n } else {\n return this.parseMany(input, end, ref);\n }\n }\n\n parseOnce(input: string, end: boolean, ref: Expression): Result {\n var refResult = ref.parse(input, end);\n var success = refResult.isSuccess();\n if (!success && this.occurrence == '?') {\n if (end) {\n // if end was found\n if (input.length == 0) {\n return new RefResult([], this, input, refResult);\n }\n // if end was not found and all error expression are EndOfInput, reparse with end = false.\n if (_.all(refResult.getBestExpect(), expect => expect.expression == ExpressionEndOfInput)) {\n return new RefResult([new Result(null, ExpressionEndOfInput, input)], this, input, refResult);\n }\n return refResult;\n }\n // the ref is not required and it do not need to end the input\n return new RefResult([], this, input, null);\n }\n return new RefResult([refResult], this, input, success ? null : refResult);\n }\n\n parseMany(input: string, end: boolean, ref: Expression) {\n var subResults: Result[] = [];\n var subResult: Result;\n var subInput = input;\n var success: boolean;\n\n // try to parse until it do not match, do not manage the end yet\n do {\n subResult = ref.parse(subInput, false);\n success = subResult.isSuccess();\n if (success) {\n subResults.push(subResult);\n subInput = subInput.substr(subResult.getLength());\n }\n } while (success && subResult.input != subInput);\n\n // minimal occurance of a ref\n var requiredOccurance = _.isNumber(this.occurrence) ? this.occurrence : this.occurrence == '+' ? 1 : 0;\n\n // if the minimal occurance is not reached add the fail result to the list\n if (subResults.length < requiredOccurance) {\n subResults.push(subResult);\n } else if (end) {\n // if there is at least one match, check if the last match is at the end\n if (subResults.length > 0) {\n var last = _.last(subResults);\n subResult = ref.parse(last.input, true);\n if (subResult.isSuccess()) {\n // if successful, replace the last subResult by the one with end\n subResults[subResults.length - 1] = subResult;\n } else {\n // if not successful, we keep the last successful result and we add a endOfInputExpected Result after it\n subResults.push(new Result(null, ExpressionEndOfInput, last.input.substr(last.getLength())));\n // we parse back the last with the length of the successful Result (at the same place we put the endOfInputExpected) and put it in failAttempt\n subResult = ref.parse(last.input.substr(last.getLength()), true);\n }\n } else if (input.length != 0) {\n // if there is no result at all and we are not at the end, return a endOfInputExpected Result\n var endOfInput = new Result(null, ExpressionEndOfInput, input);\n return new RefResult([endOfInput], this, input, subResult);\n }\n }\n return new RefResult(subResults, this, input, subResult);\n }\n\n public toString() {\n return this.id;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Expression/ExpressionRef.ts","import { Result } from './Result';\nimport { Expression } from '../Expression/Expression';\nimport _ = require('underscore');\n\nexport class RefResult extends Result {\n public failAttempt: Result;\n constructor(results: Result[], public expression: Expression, public input: string, lastResult: Result) {\n super(results, expression, input);\n if (_.last(results) != lastResult) {\n this.failAttempt = lastResult;\n if (this.failAttempt != null) {\n this.failAttempt.parent = this;\n }\n }\n }\n\n /**\n * Return all fail result.\n */\n public getExpect(): Result[] {\n var expect = super.getExpect();\n // add the failAttempt to the expect\n if (this.failAttempt != null) {\n return expect.concat(this.failAttempt.getExpect());\n }\n return expect;\n }\n\n /**\n * Clean the result to have the most relevant result. If the result is successful just return a clone of it.\n */\n public clean(path?: Result[]): Result {\n // if there is no failAttempt, we will use the default clean\n if (this.failAttempt != null && (path != null || !this.isSuccess())) {\n path = path || _.last(this.getBestExpect()).path(this);\n var next = _.first(path);\n // if the next is in the subResults, not the failAttempt, do the default clean;\n if (next != null && next == this.failAttempt) {\n var last = _.last(this.subResults);\n // if the last is not successful, remove it because we want the failAttempt path\n var subResults: Result[] = _.map(last != null && last.isSuccess() ? this.subResults : _.initial(this.subResults), subResult =>\n subResult.clean()\n );\n subResults.push(next.clean(_.rest(path)));\n return new Result(subResults, this.expression, this.input);\n }\n }\n return super.clean(path);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Result/RefResult.ts","import { Expression } from './Expression';\nimport { ExpressionRef } from './ExpressionRef';\nimport { Result } from '../Result/Result';\nimport { OptionResult } from '../Result/OptionResult';\n\nexport class ExpressionOptions implements Expression {\n constructor(public parts: ExpressionRef[], public id: string) {}\n\n parse(input: string, end: boolean): Result {\n var failAttempt: Result[] = [];\n for (var i = 0; i < this.parts.length; i++) {\n var subResult = this.parts[i].parse(input, end);\n if (subResult.isSuccess()) {\n return new OptionResult(subResult, this, input, failAttempt);\n }\n failAttempt.push(subResult);\n }\n return new OptionResult(null, this, input, failAttempt);\n }\n\n public toString() {\n return this.id;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Expression/ExpressionOptions.ts","import { Result } from './Result';\nimport _ = require('underscore');\nimport { Expression } from '../Expression/Expression';\n\nexport class OptionResult extends Result {\n constructor(private result: Result, public expression: Expression, public input: string, public failAttempt: Result[]) {\n super(result != null ? [result] : null, expression, input);\n _.forEach(this.failAttempt, subResult => {\n subResult.parent = this;\n });\n }\n\n /**\n * Return all fail result.\n */\n public getExpect(): Result[] {\n var expect = [];\n if (this.result != null) {\n expect = this.result.getExpect();\n }\n expect = _.reduce(this.failAttempt, (expect: Result[], result: Result) => expect.concat(result.getExpect()), expect);\n if (expect.length > 0 && _.all(expect, result => result.input == this.input)) {\n return [this];\n }\n return expect;\n }\n\n /**\n * Clean the result to have the most relevant result. If the result is successful just return a clone of it.\n */\n public clean(path?: Result[]): Result {\n if (path != null || !this.isSuccess()) {\n // Result will be a ref. We skip it for cleaner tree.\n path = _.rest(path || _.last(this.getBestExpect()).path(this));\n // next can be Result or one of the failAttempt. In both case we have only one child\n var next = _.first(path);\n if (next == null) {\n return new Result(null, this.expression, this.input);\n }\n return new Result([next.clean(_.rest(path))], this.expression, this.input);\n }\n // Result will be a ref. We skip it for cleaner tree.\n return new Result(_.map(this.result.subResults, subResult => subResult.clean()), this.expression, this.input);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Result/OptionResult.ts","import { Expression } from './Expression';\nimport { Grammar } from '../Grammar';\nimport { Result } from '../Result/Result';\nimport { EndOfInputResult } from '../Result/Result';\n\nexport class ExpressionRegExp implements Expression {\n constructor(public value: RegExp, public id: string, grammar: Grammar) {}\n\n parse(input: string, end: boolean): Result {\n var groups = input.match(this.value);\n // if the RegExp do not match at the start, ignore it\n if (groups != null && groups.index != 0) {\n groups = null;\n }\n var result = new Result(groups != null ? groups[0] : null, this, input);\n // if is successful and we require the end but the length of parsed is\n // lower than the input length, return a EndOfInputExpected Result\n if (result.isSuccess() && end && input.length > result.value.length) {\n return new EndOfInputResult(result);\n }\n return result;\n }\n\n public toString() {\n return this.id;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Expression/ExpressionRegExp.ts","import { Expression } from './Expression';\nimport { Result } from '../Result/Result';\nimport { Grammar } from '../Grammar';\n\nexport interface ExpressionFunctionArgument {\n (input: string, end: boolean, expression: Expression): Result;\n}\n\nexport class ExpressionFunction implements Expression {\n constructor(public func: ExpressionFunctionArgument, public id: string, public grammar: Grammar) {}\n\n public parse(input: string, end: boolean): Result {\n return this.func(input, end, this);\n }\n\n public toString() {\n return this.id;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Expression/ExpressionFunction.ts","import { Result } from '../Result/Result';\nimport { Expression } from './Expression';\n\nexport class ExpressionList implements Expression {\n constructor(private parts: Expression[], public id: string) {\n if (parts.length == 0) {\n throw new Error(JSON.stringify(id) + ' should have at least 1 parts');\n }\n }\n\n parse(input: string, end: boolean): Result {\n var subResults: Result[] = [];\n var subResult: Result;\n var subInput = input;\n\n for (var i = 0; i < this.parts.length; i++) {\n var part = this.parts[i];\n subResult = part.parse(subInput, end && i == this.parts.length - 1);\n subResults.push(subResult);\n // if the subResult do not succeed, stop the parsing\n if (!subResult.isSuccess()) {\n break;\n } else {\n subInput = subInput.substr(subResult.getLength());\n }\n }\n return new Result(subResults, this, input);\n }\n\n public toString() {\n return this.id;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Expression/ExpressionList.ts","import { SubGrammar } from './Expressions';\nimport { Field } from './Field';\n\nexport var NestedQuery: SubGrammar = {\n basicExpressions: ['NestedQuery'],\n grammars: {\n NestedQuery: '[[NestedField][OptionalSpaces][Expressions]]',\n NestedField: '[[Field]]',\n FieldValue: ['NestedQuery']\n },\n include: [Field]\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Grammars/NestedQuery.ts","import { SubGrammar } from './Expressions';\nimport { Basic } from './Basic';\n\nexport const Date: SubGrammar = {\n grammars: {\n Date: '[DateYear]/[DateMonth]/[DateDay]',\n DateYear: /([0-9]{4})/,\n DateMonth: /(1[0-2]|0?[1-9])/,\n DateDay: /([1-2][0-9]|3[0-1]|0?[1-9])/,\n DateRange: '[Date][Spaces?]..[Spaces?][Date]',\n DateRelative: ['DateRelativeNegative', 'DateRelativeTerm'],\n DateRelativeTerm: /now|today|yesterday/,\n DateRelativeNegative: '[DateRelativeTerm][DateRelativeNegativeRef]',\n DateRelativeNegativeRef: /([\\-\\+][0-9]+(s|m|h|d|mo|y))/\n },\n include: [Basic]\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Grammars/Date.ts","import { Basic } from './Basic';\nimport { SubGrammar } from './Expressions';\nexport const QueryExtension: SubGrammar = {\n basicExpressions: ['QueryExtension'],\n grammars: {\n QueryExtension: '$[QueryExtensionName]([QueryExtensionArguments])',\n QueryExtensionName: /\\w+/,\n QueryExtensionArguments: '[QueryExtensionArgumentList*][QueryExtensionArgument]',\n QueryExtensionArgumentList: '[QueryExtensionArgument][Spaces?],[Spaces?]',\n QueryExtensionArgument: '[QueryExtensionArgumentName]:[Spaces?][QueryExtensionArgumentValue]',\n QueryExtensionArgumentName: /\\w+/,\n QueryExtensionArgumentValue: ['SingleQuoted', 'Expressions']\n },\n include: [Basic]\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Grammars/QueryExtension.ts","import { SubGrammar } from './Expressions';\n\nexport const SubExpression: SubGrammar = {\n basicExpressions: ['SubExpression'],\n grammars: {\n SubExpression: '([Expressions])'\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Grammars/SubExpression.ts","import * as _ from 'underscore';\nimport { Component } from '../Core';\nimport { l } from '../strings/Strings';\nimport { $$ } from '../utils/Dom';\nimport { KEYBOARD } from '../utils/KeyboardUtils';\nimport { MagicBoxInstance } from './MagicBox';\nimport { Result } from './Result/Result';\n\nexport class InputManager {\n public input: HTMLInputElement;\n private underlay: HTMLElement;\n private highlightContainer: HTMLElement;\n private ghostTextContainer: HTMLElement;\n private root: HTMLElement;\n\n private result: Result;\n private wordCompletion: string;\n\n private hasFocus: boolean = false;\n\n /**\n * Binding event\n */\n public onblur: () => void;\n public onfocus: () => void;\n public onkeyup: (key: number) => boolean;\n public onkeydown: (key: number) => boolean;\n public onchangecursor: () => void;\n public ontabpress: () => void;\n\n public set expanded(isExpanded: boolean) {\n this.input.setAttribute('aria-expanded', isExpanded.toString());\n }\n\n public set activeDescendant(element: HTMLElement) {\n if (element) {\n this.input.setAttribute('aria-activedescendant', element.id);\n } else {\n this.input.removeAttribute('aria-activedescendant');\n }\n }\n\n constructor(element: HTMLElement, private onchange: (text: string, wordCompletion: boolean) => void, private magicBox: MagicBoxInstance) {\n this.root = Component.resolveRoot(element);\n this.underlay = document.createElement('div');\n this.underlay.className = 'magic-box-underlay';\n\n this.highlightContainer = document.createElement('span');\n this.highlightContainer.className = 'magic-box-highlight-container';\n this.underlay.appendChild(this.highlightContainer);\n\n this.ghostTextContainer = document.createElement('span');\n this.ghostTextContainer.className = 'magic-box-ghost-text';\n this.underlay.appendChild(this.ghostTextContainer);\n\n this.input = $$(element).find('input') as HTMLInputElement;\n if (!this.input) {\n this.input = document.createElement('input');\n element.appendChild(this.underlay);\n element.appendChild(this.input);\n } else {\n element.insertBefore(this.underlay, this.input);\n }\n\n this.setupHandler();\n this.addAccessibilitiesProperties();\n }\n\n /**\n * Update the input with the result value\n */\n private updateInput() {\n if (this.input.value != this.result.input) {\n this.input.value = this.result.input;\n if (this.hasFocus) {\n this.setCursor(this.getValue().length);\n }\n }\n }\n\n /**\n * Update the highlight with the result value\n */\n private updateHighlight() {\n $$(this.highlightContainer).empty();\n this.highlightContainer.appendChild(this.result.toHtmlElement());\n }\n\n /**\n * Update the ghostText with the wordCompletion\n */\n private updateWordCompletion() {\n $$(this.ghostTextContainer).empty();\n this.ghostTextContainer.innerHTML = '';\n if (this.wordCompletion != null) {\n this.ghostTextContainer.appendChild(document.createTextNode(this.wordCompletion.substr(this.result.input.length)));\n }\n }\n\n /**\n * Set the result and update visual if needed\n */\n public setResult(result: Result, wordCompletion?: string) {\n this.result = result;\n\n this.updateInput();\n\n this.updateHighlight();\n\n // reuse last wordCompletion for a better visual\n if (_.isUndefined(wordCompletion) && this.wordCompletion != null && this.wordCompletion.indexOf(this.result.input) == 0) {\n this.updateWordCompletion();\n } else {\n this.setWordCompletion(wordCompletion);\n }\n\n this.updateScroll();\n }\n\n /**\n * Set the word completion. will be ignore if the word completion do not start with the result input\n */\n public setWordCompletion(wordCompletion: string) {\n if (wordCompletion != null && wordCompletion.toLowerCase().indexOf(this.result.input.toLowerCase()) != 0) {\n wordCompletion = null;\n }\n this.wordCompletion = wordCompletion;\n this.updateWordCompletion();\n this.updateScroll();\n }\n\n /**\n * Set cursor position\n */\n public setCursor(index: number) {\n this.input.focus();\n if ((this.input).createTextRange) {\n var range = (this.input).createTextRange();\n range.move('character', index);\n range.select();\n } else if (this.input.selectionStart != null) {\n this.input.focus();\n this.input.setSelectionRange(index, index);\n }\n }\n\n public getCursor() {\n return this.input.selectionStart;\n }\n\n /**\n * Update the scroll of the underlay this allowed the highlight to match the text\n */\n\n private updateScrollDefer: number;\n private updateScroll(defer = true) {\n var callback = () => {\n // this is the cheapest call we can do before update scroll\n if (this.underlay.clientWidth < this.underlay.scrollWidth) {\n this.underlay.style.visibility = 'hidden';\n this.underlay.scrollLeft = this.input.scrollLeft;\n this.underlay.scrollTop = this.input.scrollTop;\n this.underlay.style.visibility = 'visible';\n }\n this.updateScrollDefer = null;\n // one day we will have to remove this\n if (this.hasFocus) {\n this.updateScroll();\n }\n };\n // sometime we want it to be updated as soon as posible to have no flickering\n if (!defer) {\n callback();\n } else if (this.updateScrollDefer == null) {\n this.updateScrollDefer = requestAnimationFrame(callback);\n }\n }\n\n private setupHandler() {\n this.input.onblur = () => {\n this.hasFocus = false;\n setTimeout(() => {\n if (!this.hasFocus) {\n this.onblur && this.onblur();\n }\n }, 300);\n this.updateScroll();\n };\n this.input.onfocus = () => {\n if (!this.hasFocus) {\n this.hasFocus = true;\n this.updateScroll();\n this.onfocus && this.onfocus();\n }\n };\n this.input.onkeydown = e => {\n this.keydown(e);\n };\n this.input.onkeyup = e => {\n this.keyup(e);\n };\n this.input.oncut = () => {\n setTimeout(() => {\n this.onInputChange();\n });\n };\n this.input.onpaste = () => {\n setTimeout(() => {\n this.onInputChange();\n });\n };\n }\n\n private addAccessibilitiesProperties() {\n this.input.setAttribute('autocomplete', 'off');\n this.input.setAttribute('type', 'text');\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('form', 'coveo-dummy-form');\n this.input.setAttribute('aria-autocomplete', 'list');\n this.input.setAttribute('title', `${l('InsertAQuery')}. ${l('PressEnterToSend')}`);\n }\n\n public focus() {\n // neet a timeout for IE8-9\n setTimeout(() => {\n this.input.focus();\n this.setCursor(this.getValue().length);\n });\n }\n\n public blur() {\n if (this.hasFocus) {\n this.input.blur();\n }\n }\n\n private keydown(e: KeyboardEvent) {\n switch (e.keyCode || e.which) {\n case KEYBOARD.TAB:\n // Take care of not \"preventing\" the default event behaviour : For accessibility reasons, it is much simpler\n // to simply let the browser do it's standard action (which is to focus out of the input).\n // Instead, handle \"tabPress\" immediately instead of \"keyup\".\n // The focus will be on the next element in the page when the key is released, so keyup on the input will never be triggered.\n this.tabPress();\n this.magicBox.clearSuggestion();\n break;\n default:\n e.stopPropagation();\n if (this.onkeydown == null || this.onkeydown(e.keyCode || e.which)) {\n requestAnimationFrame(() => {\n this.onInputChange();\n });\n } else {\n e.preventDefault();\n }\n break;\n }\n }\n\n private keyup(e: KeyboardEvent) {\n switch (e.keyCode || e.which) {\n case KEYBOARD.LEFT_ARROW:\n case KEYBOARD.RIGHT_ARROW:\n this.handleLeftRightArrow(e);\n break;\n default:\n if (this.onkeydown == null || this.onkeyup(e.keyCode || e.which)) {\n this.onInputChange();\n } else {\n e.preventDefault();\n }\n break;\n }\n }\n\n private handleLeftRightArrow(e: KeyboardEvent) {\n const querySuggestPreview = $$(this.root).find(`.${Component.computeCssClassNameForType('QuerySuggestPreview')}`);\n if (!querySuggestPreview) {\n this.onchangecursor();\n }\n\n const inputChanged = this.onkeydown == null || this.onkeyup(e.keyCode || e.which);\n inputChanged ? this.onInputChange() : e.preventDefault();\n }\n\n private tabPress() {\n this.ontabpress && this.ontabpress();\n this.onblur && this.onblur();\n }\n\n private onInputChange() {\n if (this.result.input != this.input.value) {\n this.onchange(this.input.value, false);\n }\n }\n\n public getValue() {\n return this.input.value;\n }\n\n public getWordCompletion() {\n return this.wordCompletion;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/InputManager.ts","import { flatten } from 'underscore';\n\nexport interface IQueryProcessorOptions {\n timeout: number;\n}\n\nexport enum ProcessingStatus {\n Finished,\n TimedOut,\n Overriden\n}\n\nexport interface IQueryProcessResult {\n status: ProcessingStatus;\n results: T[];\n}\n\n/**\n * IE11 equivalent of Promise.race\n * Adapted from Promise.race(iterable) polyfill on https://www.promisejs.org/api/\n */\nfunction racePromises(promises: Thenable[]): Promise {\n return new Promise((resolve, reject) => promises.forEach(value => Promise.resolve(value).then(resolve, reject)));\n}\n\nexport class QueryProcessor {\n private override: () => void;\n private options: IQueryProcessorOptions;\n private processedResults: T[][];\n\n constructor(options: Partial = {}) {\n this.options = { timeout: 500, ...options };\n }\n\n /**\n * Overrides the previous queries and accumulates the result of promise arrays with a timeout.\n */\n public async processQueries(queries: (T[] | Promise)[]): Promise> {\n this.overrideIfProcessing();\n this.processedResults = new Array(queries.length);\n const asyncQueries = queries.map(query => (query instanceof Promise ? query : Promise.resolve(query)));\n\n return racePromises([\n this.accumulateResultsChronologically(asyncQueries).then(() => this.buildProcessResults(ProcessingStatus.Finished)),\n this.waitForOverride().then(() => this.buildProcessResults(ProcessingStatus.Overriden)),\n this.waitForTimeout().then(() => this.buildProcessResults(ProcessingStatus.TimedOut))\n ]);\n }\n\n public async overrideIfProcessing() {\n if (this.override) {\n this.override();\n }\n }\n\n private get orderedResults(): T[] {\n return flatten(this.processedResults.filter(result => !!result), true);\n }\n\n private buildProcessResults(status: ProcessingStatus): IQueryProcessResult {\n return {\n status,\n results: status !== ProcessingStatus.Overriden ? this.orderedResults : []\n };\n }\n\n private async accumulateResultsChronologically(queries: Promise[]) {\n const output = this.processedResults;\n await Promise.all(queries.map((query, i) => query.then(items => (output[i] = items))));\n }\n\n private waitForOverride() {\n return new Promise(resolve => {\n this.override = () => {\n this.override = null;\n resolve();\n };\n });\n }\n\n private waitForTimeout() {\n return new Promise(resolve => setTimeout(() => resolve(), this.options.timeout));\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/QueryProcessor.ts","import { SubGrammar } from './Expressions';\nimport { NestedQuery } from './NestedQuery';\nimport { QueryExtension } from './QueryExtension';\nimport { Basic } from './Basic';\nimport { Field } from './Field';\nimport { SubExpression } from './SubExpression';\n\nexport const Complete: SubGrammar = {\n include: [NestedQuery, QueryExtension, SubExpression, Field, Basic]\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Grammars/Complete.ts","import { Grammar } from '../Grammar';\nimport { ExpressionDef } from '../Expression/Expression';\nimport * as _ from 'underscore';\n\nexport interface SubGrammar {\n grammars?: { [id: string]: ExpressionDef };\n expressions?: string[];\n basicExpressions?: string[];\n include?: SubGrammar[];\n}\n\nfunction loadSubGrammar(\n expressions: string[],\n basicExpressions: string[],\n grammars: { [id: string]: ExpressionDef },\n subGrammar: SubGrammar\n) {\n _.each(subGrammar.expressions, expression => {\n if (!_.contains(expressions, expression)) {\n expressions.push(expression);\n }\n });\n _.each(subGrammar.basicExpressions, expression => {\n if (!_.contains(basicExpressions, expression)) {\n basicExpressions.push(expression);\n }\n });\n _.each(subGrammar.grammars, (expressionDef: ExpressionDef, id: string) => {\n if (!(id in grammars)) {\n grammars[id] = expressionDef;\n } else {\n if (_.isArray(grammars[id]) && _.isArray(expressionDef)) {\n _.each(expressionDef, (value: string) => {\n (grammars[id]).push(value);\n });\n } else {\n _.each(expressionDef, (value: string) => {\n (grammars[id]).push(value);\n });\n throw new Error('Can not merge ' + id + '(' + JSON.stringify(expressionDef) + ' => ' + JSON.stringify(grammars[id]) + ')');\n }\n }\n });\n}\n\nexport function Expressions(...subGrammars: SubGrammar[]): { start: string; expressions: { [id: string]: ExpressionDef } } {\n var expressions: string[] = [];\n var BasicExpression: string[] = [];\n var grammars: { [id: string]: ExpressionDef } = {\n Start: ['Expressions', 'Empty'],\n Expressions: '[OptionalSpaces][Expression][ExpressionsList*][OptionalSpaces]',\n ExpressionsList: '[Spaces][Expression]',\n Expression: expressions,\n BasicExpression: BasicExpression,\n OptionalSpaces: / */,\n Spaces: / +/,\n Empty: /(?!.)/\n };\n for (var i = 0; i < subGrammars.length; i++) {\n loadSubGrammar(expressions, BasicExpression, grammars, subGrammars[i]);\n _.each(subGrammars[i].include, subGrammar => {\n if (!_.contains(subGrammars, subGrammar)) {\n subGrammars.push(subGrammar);\n }\n });\n }\n expressions.push('BasicExpression');\n return {\n start: 'Start',\n expressions: grammars\n };\n}\n\nexport function ExpressionsGrammar(...subGrammars: SubGrammar[]) {\n var grammar = Expressions.apply(this, subGrammars);\n return new Grammar(grammar.start, grammar.expressions);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Grammars/Expressions.ts","import { ISearchResultPreview } from '../magicbox/ResultPreviewsManager';\nimport { Suggestion } from '../magicbox/SuggestionsManager';\nimport { IQuery } from '../rest/Query';\n\nexport interface IBuildingResultPreviewsQueryEventArgs {\n /**\n * The query to be sent to Search API.\n */\n query: IQuery;\n}\n\n/**\n * Executed when a {@link Suggestion} is focused before {@link PopulateSearchResultPreviews} is called to fetch more options.\n */\nexport interface IUpdateResultPreviewsManagerOptionsEventArgs {\n /**\n * How many milliseconds should a {@link Suggestion} be focused for before {@link PopulateSearchResultPreviews} is called.\n *\n * If this is not defined, it will default to 200ms.\n */\n displayAfterDuration?: number;\n}\n\n/**\n * Executed when a {@link Suggestion} is focused and waiting for search result previews.\n */\nexport interface IPopulateSearchResultPreviewsEventArgs {\n /**\n * The suggestion to look up search result previews for.\n */\n suggestion: Suggestion;\n /**\n * The result previews query. This must be set synchronously before the event resolves.\n * Setting this to a non-empty array will display the given search result previews.\n */\n previewsQueries: (ISearchResultPreview[] | Promise)[];\n}\n\n/**\n * Those are the string definitions of events for ResultPreviewsManager.\n *\n * Those events should be bound to the element returned by `resolveRoot`.\n */\nexport class ResultPreviewsManagerEvents {\n /**\n * Executed when building a query to fetch result previews.\n * This always receives {@link IBuildingResultPreviewsQueryEventArgs} as arguments.\n */\n public static buildingResultPreviewsQuery = 'buildingResultPreviewsQuery';\n /**\n * Executed when a {@link Suggestion} is focused before {@link PopulateSearchResultPreviews} is called to fetch more options.\n * This always receives {@link IUpdateResultPreviewsManagerOptionsEventArgs} as arguments.\n */\n public static updateResultPreviewsManagerOptions = 'updateResultPreviewsManagerOptions';\n /**\n * Executed when a {@link Suggestion} is focused and waiting for search result previews.\n * This always receives {@link IPopulateSearchResultPreviewsEventArgs} as arguments.\n */\n public static populateSearchResultPreviews = 'populateSearchResultPreviews';\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/events/ResultPreviewsManagerEvents.ts","import { Omnibox, IOmniboxOptions } from '../Omnibox/Omnibox';\nimport { Querybox, IQueryboxOptions } from './Querybox';\nimport { ComponentOptionsModel } from '../../models/ComponentOptionsModel';\n\nexport class QueryboxOptionsProcessing {\n constructor(public owner: Omnibox | Querybox) {}\n\n private get options() {\n return this.owner.options;\n }\n\n private set options(options: IOmniboxOptions | IQueryboxOptions) {\n this.owner.options = options;\n }\n\n public postProcess() {\n this.options = { ...this.options, ...this.owner.componentOptionsModel.get(ComponentOptionsModel.attributesEnum.searchBox) };\n this.processQueryOnClearVersusEmptyQuery();\n this.processQueryOnClearVersusSearchAsYouType();\n }\n\n private processQueryOnClearVersusEmptyQuery() {\n if (this.options.triggerQueryOnClear && this.owner.searchInterface.options.allowQueriesWithoutKeywords === false) {\n this.owner.logger.warn(\n 'Forcing option triggerQueryOnClear to false, as it is not supported when the search interface is configured to not allow queries without keywords (data-allow-queries-without-keywords=\"false\")',\n this.owner\n );\n this.options.triggerQueryOnClear = false;\n }\n }\n\n private processQueryOnClearVersusSearchAsYouType() {\n if (\n this.owner.searchInterface.options.allowQueriesWithoutKeywords === true &&\n this.options.triggerQueryOnClear === false &&\n this.options.enableSearchAsYouType === true\n ) {\n this.owner.logger.warn('Forcing option triggerQueryOnClear to true, since search-as-you-type is enabled', this.owner);\n this.options.triggerQueryOnClear = true;\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/Querybox/QueryboxOptionsProcessing.ts","import { IQueryboxOptions } from './Querybox';\nimport { QueryBuilder } from '../Base/QueryBuilder';\nimport * as _ from 'underscore';\nimport { Defer } from '../../MiscModules';\n\nexport class QueryboxQueryParameters {\n private static queryIsCurrentlyBlocked = false;\n\n constructor(private options: IQueryboxOptions) {}\n\n private static queryIsBlocked() {\n // This code runs on some assumption :\n // Since all \"buildingQuery\" events would have to be run in the same call stack\n // We can add a static flag to block 2 or more query box/omnibox from trying to modify the query inside the same event.\n // If 2 query box are activated, we get duplicate terms in the query, or duplicate term correction with did you mean.\n // This means that only one query box/searchbox would be able to modify the query in a single search page.\n // This also means that if there is 2 search box enabled, the first one in the markup in the page would be able to do the job correctly as far as the query is concerned.\n // The second one is inactive as far as the query is concerned.\n\n // The flag gets reset in \"defer\" (setTimeout 0) so that it gets reset correctly when the query event has finished executing\n if (!QueryboxQueryParameters.queryIsCurrentlyBlocked) {\n QueryboxQueryParameters.queryIsCurrentlyBlocked = true;\n Defer.defer(() => QueryboxQueryParameters.allowDuplicateQuery());\n return false;\n }\n return true;\n }\n\n public static allowDuplicateQuery() {\n QueryboxQueryParameters.queryIsCurrentlyBlocked = false;\n }\n\n public addParameters(queryBuilder: QueryBuilder, lastQuery: string) {\n if (!QueryboxQueryParameters.queryIsBlocked()) {\n if (this.options.enableWildcards) {\n queryBuilder.enableWildcards = true;\n }\n\n if (this.options.enableQuestionMarks) {\n queryBuilder.enableQuestionMarks = true;\n }\n\n if (this.options.enableLowercaseOperators) {\n queryBuilder.enableLowercaseOperators = true;\n }\n\n if (!_.isEmpty(lastQuery)) {\n queryBuilder.enableQuerySyntax = this.options.enableQuerySyntax;\n queryBuilder.expression.add(lastQuery);\n if (this.options.enablePartialMatch) {\n queryBuilder.enablePartialMatch = this.options.enablePartialMatch;\n if (this.options.partialMatchKeywords) {\n queryBuilder.partialMatchKeywords = this.options.partialMatchKeywords;\n }\n if (this.options.partialMatchThreshold) {\n queryBuilder.partialMatchThreshold = this.options.partialMatchThreshold;\n }\n }\n }\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/Querybox/QueryboxQueryParameters.ts","import { Expression } from '../Expression/Expression';\nimport { ExpressionEndOfInput } from '../Expression/ExpressionEndOfInput';\nimport { ExpressionConstant } from '../Expression/ExpressionConstant';\nimport _ = require('underscore');\n\nexport class Result {\n public value: string;\n public subResults: Result[];\n public parent: Result;\n\n constructor(value: string | Result[], public expression: Expression, public input: string) {\n if (_.isString(value)) {\n this.value = value;\n } else if (_.isArray(value)) {\n this.subResults = value;\n _.forEach(this.subResults, (subResult: Result) => {\n subResult.parent = this;\n });\n }\n }\n\n public isSuccess() {\n // if null is the value, this mean the expression could not parse this input\n return this.value != null || (this.subResults != null && _.all(this.subResults, subResult => subResult.isSuccess()));\n }\n\n /**\n * Return path to this result ([parent.parent, parent, this])\n */\n public path(until?: Result): Result[] {\n var path: Result[] = this.parent != null && this.parent != until ? this.parent.path(until) : [];\n path.push(this);\n return path;\n }\n\n /**\n * Return the closest parent that match the condition (can be it-self). If match is a string, it will search for the result expresion id\n */\n public findParent(match: string | { (result: Result): boolean }): Result {\n var parent = this;\n var iterator = _.isString(match) ? (result: Result) => match == result.expression.id : <{ (result: Result): boolean }>match;\n while (parent != null && !iterator(parent)) {\n parent = parent.parent;\n }\n return parent;\n }\n\n /**\n * Return the first child that match the condition (can be it-self). If match is a string, it will search for the result expresion id\n */\n public find(match: string | { (result: Result): boolean }): Result {\n var iterator = _.isString(match) ? (result: Result) => match == result.expression.id : <{ (result: Result): boolean }>match;\n if (iterator(this)) {\n return this;\n }\n if (this.subResults) {\n for (var i = 0; i < this.subResults.length; i++) {\n var subResultFind = this.subResults[i].find(iterator);\n if (subResultFind) {\n return subResultFind;\n }\n }\n }\n return null;\n }\n\n /**\n * Return all children that match the condition (can be it-self). If match is a string, it will search for the result expresion id\n */\n public findAll(match: string | { (result: Result): boolean }): Result[] {\n var results: Result[] = [];\n var iterator = _.isString(match) ? (result: Result) => match == result.expression.id : <{ (result: Result): boolean }>match;\n if (iterator(this)) {\n results.push(this);\n }\n if (this.subResults) {\n results = _.reduce(this.subResults, (results, subResult: Result) => results.concat(subResult.findAll(iterator)), results);\n }\n return results;\n }\n\n /**\n * Return the first child that match the condition (can be it-self). If match is a string, it will search for the result expresion id\n */\n public resultAt(index: number, match?: string | { (result: Result): boolean }): Result[] {\n if (index < 0 || index > this.getLength()) {\n return [];\n }\n if (match != null) {\n if (_.isString(match)) {\n if (match == this.expression.id) {\n return [this];\n }\n } else {\n if ((<{ (result: Result): boolean }>match)(this)) {\n return [this];\n }\n }\n } else {\n var value = this.value == null && this.subResults == null ? this.input : this.value;\n if (value != null) {\n return [this];\n }\n }\n\n if (this.subResults != null) {\n var results = [];\n for (var i = 0; i < this.subResults.length; i++) {\n var subResult = this.subResults[i];\n results = results.concat(subResult.resultAt(index, match));\n index -= subResult.getLength();\n if (index < 0) {\n break;\n }\n }\n return results;\n }\n\n return [];\n }\n\n /**\n * Return all fail result.\n */\n public getExpect(): Result[] {\n if (this.value == null && this.subResults == null) {\n return [this];\n }\n if (this.subResults != null) {\n return _.reduce(this.subResults, (expect: Result[], result: Result) => expect.concat(result.getExpect()), []);\n }\n return [];\n }\n\n /**\n * Return the best fail result (The farthest result who got parsed). We also remove duplicate and always return the simplest result of a kind\n */\n public getBestExpect(): Result[] {\n var expects = this.getExpect();\n var groups = _.groupBy(expects, expect => expect.input);\n var key = _.last(\n _.keys(groups).sort((a, b) => {\n return b.length - a.length;\n })\n );\n var bestResults = groups[key];\n var groups = _.groupBy(bestResults, expect => expect.expression.id);\n return _.map(groups, (bestResults: Result[]): Result => {\n return _.chain(bestResults)\n .map(result => {\n return {\n path: result.path().length,\n result: result\n };\n })\n .sortBy('path')\n .pluck('result')\n .first()\n .value();\n });\n }\n\n public getHumanReadableExpect() {\n var expect = this.getBestExpect();\n var input = expect.length > 0 ? _.last(expect).input : '';\n return (\n 'Expected ' +\n _.map(expect, (result: Result) => result.getHumanReadable()).join(' or ') +\n ' but ' +\n (input.length > 0 ? JSON.stringify(input[0]) : 'end of input') +\n ' found.'\n );\n }\n\n /**\n * Return a string that represent what is before this result\n */\n public before(): string {\n if (this.parent == null) {\n return '';\n }\n var index = _.indexOf(this.parent.subResults, this);\n return (\n this.parent.before() +\n _.chain(this.parent.subResults)\n .first(index)\n .map(subResult => subResult.toString())\n .join('')\n .value()\n );\n }\n\n /**\n * Return a string that represent what is after this result\n */\n public after(): string {\n if (this.parent == null) {\n return '';\n }\n var index = _.indexOf(this.parent.subResults, this);\n return (\n _.chain(this.parent.subResults)\n .last(this.parent.subResults.length - index - 1)\n .map(subResult => subResult.toString())\n .join('')\n .value() + this.parent.after()\n );\n }\n\n /**\n * Return the length of the result\n */\n public getLength() {\n if (this.value != null) {\n return this.value.length;\n }\n\n if (this.subResults != null) {\n return _.reduce(this.subResults, (length: number, subResult: Result) => length + subResult.getLength(), 0);\n }\n\n return this.input.length;\n }\n\n public toHtmlElement(): HTMLElement {\n var element = document.createElement('span');\n var id = this.expression != null ? this.expression.id : null;\n\n if (id != null) {\n element.setAttribute('data-id', id);\n }\n\n element.setAttribute('data-success', this.isSuccess().toString());\n\n if (this.value != null) {\n element.appendChild(document.createTextNode(this.value));\n element.setAttribute('data-value', this.value);\n } else if (this.subResults != null) {\n _.each(this.subResults, (subResult: Result) => {\n element.appendChild(subResult.toHtmlElement());\n });\n } else {\n element.appendChild(document.createTextNode(this.input));\n element.setAttribute('data-input', this.input);\n element.className = 'magic-box-error' + (this.input.length > 0 ? '' : ' magic-box-error-empty');\n }\n\n element['result'] = this;\n\n return element;\n }\n\n /**\n * Clean the result to have the most relevant result. If the result is successful just return a clone of it.\n */\n public clean(path?: Result[]): Result {\n if (path != null || !this.isSuccess()) {\n path = path || _.last(this.getBestExpect()).path(this);\n var next = _.first(path);\n if (next != null) {\n var nextIndex = _.indexOf(this.subResults, next);\n var subResults: Result[] = nextIndex == -1 ? [] : _.map(_.first(this.subResults, nextIndex), subResult => subResult.clean());\n subResults.push(next.clean(_.rest(path)));\n return new Result(subResults, this.expression, this.input);\n } else {\n return new Result(null, this.expression, this.input);\n }\n }\n if (this.value != null) {\n return new Result(this.value, this.expression, this.input);\n }\n if (this.subResults != null) {\n return new Result(_.map(this.subResults, subResult => subResult.clean()), this.expression, this.input);\n }\n }\n\n public clone(): Result {\n if (this.value != null) {\n return new Result(this.value, this.expression, this.input);\n }\n if (this.subResults != null) {\n return new Result(_.map(this.subResults, subResult => subResult.clone()), this.expression, this.input);\n }\n return new Result(null, this.expression, this.input);\n }\n\n public toString() {\n if (this.value != null) {\n return this.value;\n }\n if (this.subResults != null) {\n return _.map(this.subResults, subresult => subresult.toString()).join('');\n }\n return this.input;\n }\n\n public getHumanReadable() {\n if (this.expression instanceof ExpressionConstant) {\n return JSON.stringify((this.expression).value);\n }\n return this.expression.id;\n }\n}\n\nexport class EndOfInputResult extends Result {\n constructor(result: Result) {\n super([result], ExpressionEndOfInput, result.input);\n var endOfInput = new Result(null, ExpressionEndOfInput, result.input.substr(result.getLength()));\n endOfInput.parent = this;\n this.subResults.push(endOfInput);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Result/Result.ts","import { exportGlobally } from '../GlobalExports';\nimport { Expression } from './Expression/Expression';\nimport { ExpressionConstant } from './Expression/ExpressionConstant';\nimport { ExpressionEndOfInput } from './Expression/ExpressionEndOfInput';\nimport { ExpressionFunction, ExpressionFunctionArgument } from './Expression/ExpressionFunction';\nimport { ExpressionList } from './Expression/ExpressionList';\nimport { ExpressionOptions } from './Expression/ExpressionOptions';\nimport { ExpressionRef } from './Expression/ExpressionRef';\nimport { ExpressionRegExp } from './Expression/ExpressionRegExp';\nimport { Grammar } from './Grammar';\nimport { SubGrammar } from './Grammars/Expressions';\nimport { Grammars } from './Grammars/Grammars';\nimport { InputManager } from './InputManager';\nimport { createMagicBox, MagicBoxInstance, requestAnimationFrame } from './MagicBox';\nimport { MagicBoxUtils as Utils } from './MagicBoxUtils';\nimport { OptionResult } from './Result/OptionResult';\nimport { RefResult } from './Result/RefResult';\nimport { EndOfInputResult, Result } from './Result/Result';\nimport { Suggestion, SuggestionsManager } from './SuggestionsManager';\nexport type ExpressionImportedLocally = Expression;\nexport type SuggestionImportedLocally = Suggestion;\nexport type SubGrammarLocally = SubGrammar;\nexport type ExpressionFunctionArgumentLocally = ExpressionFunctionArgument;\nexport const GrammarsImportedLocally = Grammars;\n\nexport function doMagicBoxExport() {\n exportGlobally({\n MagicBox: {\n EndOfInputResult,\n ExpressionConstant,\n ExpressionEndOfInput,\n ExpressionFunction,\n ExpressionList,\n ExpressionOptions,\n ExpressionRef,\n ExpressionRegExp,\n Grammar,\n Grammars,\n InputManager,\n Instance: MagicBoxInstance,\n OptionResult,\n RefResult,\n Result,\n SuggestionsManager,\n Utils,\n create: createMagicBox,\n requestAnimationFrame\n }\n });\n}\n\nexport declare namespace MagicBox {\n export const EndOfInputResult: EndOfInputResult;\n export const ExpressionConstant: ExpressionConstant;\n export const ExpressionFunction: ExpressionFunction;\n export const ExpressionList: ExpressionList;\n export const ExpressionOptions: ExpressionOptions;\n export const ExpressionRef: ExpressionRef;\n export const ExpressionRegExp: ExpressionRegExp;\n export const Grammar: Grammar;\n export const InputManager: InputManager;\n export const Instance: MagicBoxInstance;\n export const OptionResult: OptionResult;\n export const RefResult: RefResult;\n export const Result: Result;\n export const SuggestionsManager: SuggestionsManager;\n export const Utils: Utils;\n export const ExpressionEndOfInput;\n export type Instance = MagicBoxInstance;\n export type Suggestion = SuggestionImportedLocally;\n\n export namespace Grammars {\n export const Basic: typeof GrammarsImportedLocally.Basic;\n export const notInWord: typeof GrammarsImportedLocally.notInWord;\n export const notWordStart: typeof GrammarsImportedLocally.notWordStart;\n export const Complete: typeof GrammarsImportedLocally.Complete;\n export const Date: typeof GrammarsImportedLocally.Date;\n export const Expressions: typeof GrammarsImportedLocally.Expressions;\n export const ExpressionsGrammar: typeof GrammarsImportedLocally.ExpressionsGrammar;\n export const Field: typeof GrammarsImportedLocally.Field;\n export const NestedQuery: typeof GrammarsImportedLocally.NestedQuery;\n export const QueryExtension: typeof GrammarsImportedLocally.QueryExtension;\n export const SubExpression: typeof GrammarsImportedLocally.SubExpression;\n }\n\n export const createMagicBox;\n export const create;\n export const requestAnimationFrame;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/doMagicBoxExport.ts","import { Basic, notInWord, notWordStart } from './Basic';\nimport { Complete } from './Complete';\nimport { Date } from './Date';\nimport { Expressions, ExpressionsGrammar, SubGrammar } from './Expressions';\nimport { ExpressionFunctionArgument } from '../Expression/ExpressionFunction';\nimport { Field } from './Field';\nimport { NestedQuery } from './NestedQuery';\nimport { QueryExtension } from './QueryExtension';\nimport { SubExpression } from './SubExpression';\nexport type SubGrammarImported = SubGrammar;\nexport type ExpressionFunctionArgumentImported = ExpressionFunctionArgument;\n\nexport const Grammars = {\n Basic,\n notInWord,\n notWordStart,\n Complete,\n Date,\n Expressions,\n ExpressionsGrammar,\n Field,\n NestedQuery,\n QueryExtension,\n SubExpression\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/Grammars/Grammars.ts","import { $$, Dom } from '../utils/Dom';\nimport { l } from '../strings/Strings';\nimport { defaults, findIndex } from 'underscore';\nimport { Component } from '../ui/Base/Component';\nimport { Direction, Suggestion } from './SuggestionsManager';\nimport {\n ResultPreviewsManagerEvents,\n IPopulateSearchResultPreviewsEventArgs,\n IUpdateResultPreviewsManagerOptionsEventArgs\n} from '../events/ResultPreviewsManagerEvents';\nimport { QueryProcessor, ProcessingStatus } from './QueryProcessor';\nimport { Utils } from '../utils/Utils';\n\nexport interface ISearchResultPreview {\n element: HTMLElement;\n onSelect: () => void;\n}\n\nexport interface IResultPreviewsManagerOptions {\n previewClass: string;\n selectedClass: string;\n previewHeaderText: string;\n previewHeaderFieldText: string;\n timeout: number;\n}\n\nexport class ResultPreviewsManager {\n private options: IResultPreviewsManagerOptions;\n private suggestionsPreviewContainer: Dom;\n private resultPreviewsContainer: Dom;\n private lastQueriedSuggestion: Suggestion;\n private lastDisplayedSuggestion: Suggestion;\n private previewsProcessor: QueryProcessor;\n private lastDelay: Promise;\n private root: HTMLElement;\n\n public get previewsOwner() {\n return this.lastDisplayedSuggestion;\n }\n\n public get hasPreviews() {\n return !!this.suggestionsPreviewContainer;\n }\n\n public get focusedPreviewElement() {\n if (!this.hasPreviews) {\n return null;\n }\n const focusedElement = this.suggestionsPreviewContainer.findClass(this.options.selectedClass)[0];\n if (!focusedElement || !focusedElement.classList.contains(this.options.previewClass)) {\n return null;\n }\n return focusedElement;\n }\n\n public get previewElements() {\n if (!this.hasPreviews) {\n return [];\n }\n return this.suggestionsPreviewContainer.findClass(this.options.previewClass);\n }\n\n private get suggestionsListbox() {\n return $$($$(this.element).findClass('coveo-magicbox-suggestions')[0]);\n }\n\n private get numberOfResultsPerRow() {\n const previewSelectables = this.suggestionsPreviewContainer.findClass(this.options.previewClass);\n if (previewSelectables.length === 0) {\n return 0;\n }\n const firstVerticalOffset = previewSelectables[0].offsetTop;\n const firstIndexOnNextRow = findIndex(previewSelectables, previewSelectable => previewSelectable.offsetTop !== firstVerticalOffset);\n return firstIndexOnNextRow !== -1 ? firstIndexOnNextRow : previewSelectables.length;\n }\n\n private get previewContainerId() {\n return `coveo-previews-for-${this.lastDisplayedSuggestion.dom.id}`;\n }\n\n constructor(private element: HTMLElement, options: Partial = {}) {\n this.options = defaults(options, {\n previewHeaderText: l('QuerySuggestPreview'),\n previewHeaderFieldText: l('QuerySuggestPreviewWithField'),\n previewClass: 'coveo-preview-selectable',\n selectedClass: 'magic-box-selected'\n });\n this.root = Component.resolveRoot(element);\n this.previewsProcessor = new QueryProcessor({ timeout: this.options.timeout });\n }\n\n public async displaySearchResultPreviewsForSuggestion(suggestion: Suggestion) {\n const externalOptions = this.getExternalOptions();\n const currentDelay = (this.lastDelay = Utils.resolveAfter(\n Utils.isNullOrUndefined(externalOptions.displayAfterDuration) ? 200 : externalOptions.displayAfterDuration\n ));\n await currentDelay;\n if (currentDelay !== this.lastDelay) {\n return;\n }\n const isQueryForSuggestionOngoing = suggestion && this.lastQueriedSuggestion === suggestion;\n if (isQueryForSuggestionOngoing) {\n return;\n }\n const arePreviewsForSuggestionCurrentlyDisplayed = this.lastDisplayedSuggestion === suggestion;\n if (arePreviewsForSuggestionCurrentlyDisplayed) {\n this.previewsProcessor.overrideIfProcessing();\n this.lastQueriedSuggestion = null;\n return;\n }\n this.lastQueriedSuggestion = suggestion;\n if (!suggestion) {\n this.displaySuggestionPreviews(null, []);\n return;\n }\n const { status, results } = await this.getSearchResultPreviewsQuery(suggestion);\n if (status === ProcessingStatus.Overriden) {\n return;\n }\n this.lastQueriedSuggestion = null;\n this.displaySuggestionPreviews(suggestion, results);\n }\n\n public getElementInDirection(direction: Direction) {\n const previewElements = this.previewElements;\n const focusedIndex = previewElements.indexOf(this.focusedPreviewElement);\n\n if (focusedIndex === -1) {\n return null;\n }\n\n if (focusedIndex === 0 && direction === Direction.Left) {\n return null;\n }\n\n return previewElements[(focusedIndex + this.getIncrementInDirection(direction)) % previewElements.length];\n }\n\n private getIncrementInDirection(direction: Direction) {\n switch (direction) {\n case Direction.Left:\n return -1;\n case Direction.Right:\n return 1;\n case Direction.Up:\n return -this.numberOfResultsPerRow;\n case Direction.Down:\n return this.numberOfResultsPerRow;\n }\n }\n\n private setHasPreviews(shouldHavePreviews: boolean) {\n if (this.hasPreviews === !!shouldHavePreviews) {\n return;\n }\n if (shouldHavePreviews) {\n this.initPreviewForSuggestions();\n } else {\n this.revertPreviewForSuggestions();\n }\n }\n\n private initPreviewForSuggestions() {\n this.suggestionsPreviewContainer = $$(\n 'div',\n {\n className: 'coveo-suggestion-container'\n },\n this.suggestionsListbox.el,\n this.buildPreviewContainer()\n );\n this.element.appendChild(this.suggestionsPreviewContainer.el);\n this.suggestionsListbox.setAttribute('aria-controls', this.previewContainerId);\n }\n\n private revertPreviewForSuggestions() {\n this.element.appendChild(this.suggestionsListbox.el);\n this.suggestionsPreviewContainer.remove();\n this.suggestionsPreviewContainer = null;\n }\n\n private buildPreviewContainer() {\n return $$(\n 'div',\n {\n className: 'coveo-preview-container',\n id: this.previewContainerId\n },\n (this.resultPreviewsContainer = $$('div', {\n className: 'coveo-preview-results',\n role: 'listbox',\n 'aria-orientation': 'horizontal'\n }))\n ).el;\n }\n\n private getExternalOptions() {\n const optionsEventArgs: IUpdateResultPreviewsManagerOptionsEventArgs = {};\n $$(this.root).trigger(ResultPreviewsManagerEvents.updateResultPreviewsManagerOptions, optionsEventArgs);\n return optionsEventArgs;\n }\n\n private getSearchResultPreviewsQuery(suggestion: Suggestion) {\n const populateEventArgs: IPopulateSearchResultPreviewsEventArgs = {\n suggestion,\n previewsQueries: []\n };\n $$(this.root).trigger(ResultPreviewsManagerEvents.populateSearchResultPreviews, populateEventArgs);\n return this.previewsProcessor.processQueries(populateEventArgs.previewsQueries);\n }\n\n private appendSearchResultPreview(preview: ISearchResultPreview, position: number) {\n this.resultPreviewsContainer.append(preview.element);\n preview.element.id = `coveo-result-preview-${position}`;\n const elementDom = $$(preview.element);\n elementDom.setAttribute('aria-selected', 'false');\n elementDom.setAttribute('role', 'option');\n elementDom.on('click', () => preview.onSelect());\n elementDom.on('keyboardSelect', () => preview.onSelect());\n }\n\n private appendSearchResultPreviews(previews: ISearchResultPreview[]) {\n this.resultPreviewsContainer.empty();\n previews.forEach((preview, i) => this.appendSearchResultPreview(preview, i));\n }\n\n private displaySuggestionPreviews(suggestion: Suggestion, previews: ISearchResultPreview[]) {\n this.lastDisplayedSuggestion = suggestion;\n this.setHasPreviews(previews && previews.length > 0);\n this.element.classList.toggle('magic-box-hasPreviews', this.hasPreviews);\n if (!this.hasPreviews) {\n return;\n }\n this.appendSearchResultPreviews(previews);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/ResultPreviewsManager.ts","import { $$, Dom } from '../utils/Dom';\nimport { MagicBoxInstance } from './MagicBox';\nimport { l } from '../strings/Strings';\nimport { AccessibleButton } from '../utils/AccessibleButton';\n\nexport class MagicBoxClear {\n public element: Dom;\n\n constructor(magicBox: MagicBoxInstance) {\n this.element = $$('div', {\n className: 'magic-box-clear'\n });\n const clearIcon = $$('div', {\n className: 'magic-box-icon'\n });\n this.element.append(clearIcon.el);\n\n this.element.insertAfter($$(magicBox.element).find('input'));\n\n new AccessibleButton()\n .withElement(this.element)\n .withLabel(l('Clear'))\n .withSelectAction(() => magicBox.clear())\n .build();\n\n this.toggleTabindexAndAriaHidden(false);\n }\n\n public toggleTabindexAndAriaHidden(hasText: boolean) {\n const tabindex = hasText ? '0' : '-1';\n this.element.setAttribute('tabindex', tabindex);\n this.element.setAttribute('aria-hidden', `${!hasText}`);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/magicbox/MagicBoxClear.ts","///\nimport { Omnibox, IOmniboxSuggestion } from './Omnibox';\nimport { OmniboxEvents, IPopulateOmniboxSuggestionsEventArgs } from '../../events/OmniboxEvents';\nimport { IFieldDescription } from '../../rest/FieldDescription';\nimport { IEndpointError } from '../../rest/EndpointError';\nimport * as _ from 'underscore';\nimport { Result } from '../../magicbox/Result/Result';\nimport { MagicBoxUtils } from '../../magicbox/MagicBoxUtils';\n\ninterface IFieldAddonHash {\n type: string;\n before: string;\n after: string;\n current: string;\n field?: string;\n}\n\nexport class FieldAddon {\n static INDEX = 64;\n cache: { [hash: string]: Promise } = {};\n\n constructor(public omnibox: Omnibox) {\n this.omnibox.bind.on(this.omnibox.element, OmniboxEvents.populateOmniboxSuggestions, (args: IPopulateOmniboxSuggestionsEventArgs) => {\n args.suggestions.push(this.getSuggestion());\n });\n }\n\n public getSuggestion(): Promise {\n const hash = this.getHash();\n if (hash == null) {\n return null;\n }\n const hashString = this.hashToString(hash);\n if (this.cache[hashString] != null) {\n return this.hashValueToSuggestion(hash, this.cache[hashString]);\n }\n let values: Promise;\n if (hash.type == 'FieldName') {\n values = this.fieldNames(hash.current);\n }\n if (hash.type == 'FieldValue') {\n values = this.fieldValues(hash.field, hash.current);\n }\n if (hash.type == 'SimpleFieldName') {\n values = this.simpleFieldNames(hash.current);\n }\n this.cache[hashString] = values;\n values.catch(() => {\n delete this.cache[hashString];\n });\n return this.hashValueToSuggestion(hash, values);\n }\n\n private getHash(): IFieldAddonHash {\n let fieldName: Result = _.last(this.omnibox.resultAtCursor('FieldName'));\n if (fieldName != null) {\n fieldName = fieldName.findParent('Field') || fieldName;\n const currentField = fieldName.toString();\n const before = fieldName.before();\n const after = fieldName.after();\n return { type: 'FieldName', current: currentField, before: before, after: after };\n }\n const fieldValue: Result = _.last(this.omnibox.resultAtCursor('FieldValue'));\n if (fieldValue) {\n const fieldQuery =\n fieldValue.findParent('FieldQuery') || (this.omnibox.options.enableSimpleFieldAddon && fieldValue.findParent('FieldSimpleQuery'));\n if (fieldQuery) {\n let field = fieldQuery.find('FieldName').toString();\n if (this.omnibox.options.fieldAlias) {\n if (field in this.omnibox.options.fieldAlias) {\n field = this.omnibox.options.fieldAlias[field];\n }\n }\n const value = fieldValue.toString();\n const before = fieldValue.before();\n const after = fieldValue.after();\n return { type: 'FieldValue', field: field, current: value, before: before, after: after };\n }\n }\n if (this.omnibox.options.enableSimpleFieldAddon) {\n const word: Result = _.last(this.omnibox.resultAtCursor('Word'));\n if (word != null) {\n const current = word.toString();\n const before = word.before();\n const after = word.after();\n return { type: 'SimpleFieldName', current, before, after };\n }\n }\n }\n\n private hashToString(hash: IFieldAddonHash) {\n if (hash == null) {\n return null;\n }\n return hash.type + hash.current + (hash.field || '');\n }\n\n private hashValueToSuggestion(hash: IFieldAddonHash, promise: Promise): Promise {\n return promise.then(values => {\n const suggestions = _.map(values, (value: string, i): IOmniboxSuggestion => {\n const suggestion: IOmniboxSuggestion = {\n text:\n hash.before +\n (hash.current.toLowerCase().indexOf(value.toLowerCase()) == 0 ? hash.current + value.substr(hash.current.length) : value) +\n hash.after,\n html: MagicBoxUtils.highlightText(value, hash.current, true),\n index: FieldAddon.INDEX - i / values.length\n };\n return suggestion;\n });\n return suggestions;\n });\n }\n\n private fields: Promise;\n\n private getFields(): Promise {\n if (this.fields == null) {\n this.fields = new Promise((resolve, reject) => {\n if (this.omnibox.options.listOfFields != null) {\n resolve(this.omnibox.options.listOfFields);\n } else {\n const promise: Promise = this.omnibox.queryController.getEndpoint().listFields();\n promise\n .then((fieldDescriptions: IFieldDescription[]) => {\n const fieldNames = _.chain(fieldDescriptions)\n .filter((fieldDescription: IFieldDescription) => fieldDescription.includeInQuery && fieldDescription.groupByField)\n .map((fieldDescription: IFieldDescription) => fieldDescription.name.substr(1))\n .value();\n\n resolve(fieldNames);\n })\n .catch(() => {\n reject();\n });\n }\n });\n }\n return this.fields;\n }\n\n private fieldNames(current: string): Promise {\n const withAt = current.length > 0 && current[0] == '@';\n const fieldName = withAt ? current.substr(1) : current;\n const fieldNameLC = fieldName.toLowerCase();\n\n return this.getFields().then((fields: string[] | IOmniboxSuggestion[]): any[] => {\n let matchFields = _.chain(fields)\n .map((fieldName: any) => {\n const fieldNameBeginsWithAt = fieldName.length > 0 && fieldName[0] == '@';\n return {\n index: fieldName.toLowerCase().indexOf(fieldNameLC),\n field: fieldNameBeginsWithAt ? fieldName : '@' + fieldName\n };\n })\n .filter(field => {\n return field.index != -1 && field.field.length > current.length;\n })\n .sortBy('index')\n .map(field => field.field)\n .value();\n matchFields = _.first(matchFields, 5);\n return matchFields;\n });\n }\n\n private fieldValues(field: string, current: string): Promise {\n return this.omnibox.queryController\n .getEndpoint()\n .listFieldValues({\n pattern: '.*' + current + '.*',\n patternType: 'RegularExpression',\n sortCriteria: 'occurrences',\n field: '@' + field,\n maximumNumberOfValues: 5\n })\n .then(values => {\n return _.chain(values)\n .map(value => {\n return {\n index: value.value.toLowerCase().indexOf(current),\n value: value.value\n };\n })\n .filter(value => {\n return value.value.length > current.length;\n })\n .sortBy('index')\n .map(value => {\n return value.value.replace(/ /g, '\\u00A0');\n })\n .value();\n });\n }\n\n private simpleFieldNames(current: string): Promise {\n const fieldName = current;\n const fieldNameLC = fieldName.toLowerCase();\n\n return this.getFields().then((fields: any[]): IOmniboxSuggestion[] => {\n let matchFields: any = _.chain(fields)\n .map((field: string) => {\n return {\n index: field.toLowerCase().indexOf(fieldNameLC),\n field: field + ':'\n };\n })\n .filter(field => {\n return field.index != -1 && field.field.length > current.length;\n })\n .sortBy('index')\n .map(field => field.field)\n .value();\n matchFields = _.first(matchFields, 5);\n return matchFields;\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/Omnibox/FieldAddon.ts","///\nimport { Omnibox, IOmniboxSuggestion } from './Omnibox';\nimport { IOmniboxDataRow } from './OmniboxInterface';\nimport {\n OmniboxEvents,\n IPopulateOmniboxEventArgs,\n IPopulateOmniboxEventRow,\n IPopulateOmniboxSuggestionsEventArgs\n} from '../../events/OmniboxEvents';\nimport { $$ } from '../../utils/Dom';\nimport { Utils } from '../../utils/Utils';\nimport * as _ from 'underscore';\n\nexport class OldOmniboxAddon {\n constructor(public omnibox: Omnibox) {\n this.omnibox.bind.on(this.omnibox.element, OmniboxEvents.populateOmniboxSuggestions, (args: IPopulateOmniboxSuggestionsEventArgs) => {\n _.each(this.getSuggestion(), suggestion => {\n args.suggestions.push(suggestion);\n });\n });\n }\n\n public getSuggestion(): Promise[] {\n const text = this.omnibox.magicBox.getText();\n\n if (text.length == 0) {\n return null;\n }\n\n const eventArgs = this.buildPopulateOmniboxEventArgs();\n $$(this.omnibox.root).trigger(OmniboxEvents.populateOmnibox, eventArgs);\n\n return this.rowsToSuggestions(eventArgs.rows);\n }\n\n private getCurrentQueryExpression() {\n const cursorPos = this.omnibox.getCursor();\n const value = this.omnibox.getText();\n const length = value.length;\n let start = cursorPos;\n let end = cursorPos;\n if (value[start] == ' ') {\n start--;\n }\n while (start > 0 && value[start] != ' ') {\n start--;\n }\n while (end < length && value[end] != ' ') {\n end++;\n }\n return value.substring(start, end);\n }\n\n private getRegexToSearch(strValue?: string) {\n if (strValue == null) {\n strValue = this.omnibox.getText();\n }\n return new RegExp(Utils.escapeRegexCharacter(strValue), 'i');\n }\n\n private getQueryExpressionBreakDown() {\n const ret = [];\n const queryWords = this.omnibox.getText().split(' ');\n _.each(queryWords, word => {\n ret.push({\n word: word,\n regex: this.getRegexToSearch(word)\n });\n });\n return ret;\n }\n\n private replace(searchValue: string, newValue: string) {\n this.omnibox.setText(this.omnibox.getText().replace(searchValue, newValue));\n }\n\n private clearCurrentExpression() {\n this.replace(this.getCurrentQueryExpression(), '');\n }\n\n private insertAt(at: number, toInsert: string) {\n const oldValue = this.omnibox.getText();\n const newValue = [oldValue.slice(0, at), toInsert, oldValue.slice(at)].join('');\n this.omnibox.setText(newValue);\n }\n\n private replaceCurrentExpression(newValue: string) {\n this.replace(this.getCurrentQueryExpression(), newValue);\n }\n\n private buildPopulateOmniboxEventArgs() {\n const currentQueryExpression = this.getCurrentQueryExpression();\n const ret: IPopulateOmniboxEventArgs = {\n rows: [],\n completeQueryExpression: {\n word: this.omnibox.getText(),\n regex: this.getRegexToSearch()\n },\n currentQueryExpression: {\n word: currentQueryExpression,\n regex: this.getRegexToSearch(currentQueryExpression)\n },\n allQueryExpressions: this.getQueryExpressionBreakDown(),\n cursorPosition: this.omnibox.getCursor(),\n clear: () => {\n this.omnibox.clear();\n },\n clearCurrentExpression: () => {\n this.clearCurrentExpression();\n },\n replace: (searchValue: string, newValue: string) => {\n this.replace(searchValue, newValue);\n },\n replaceCurrentExpression: (newValue: string) => {\n this.replaceCurrentExpression(newValue);\n },\n insertAt: (at: number, toInsert: string) => {\n this.insertAt(at, toInsert);\n },\n closeOmnibox: () => {\n this.omnibox.magicBox.blur();\n }\n };\n return ret;\n }\n\n private rowsToSuggestions(rows: IOmniboxDataRow[]): Promise[] {\n return _.map(rows, (row: IPopulateOmniboxEventRow) => {\n if (!Utils.isNullOrUndefined(row.element)) {\n return new Promise(resolve => {\n resolve([\n {\n dom: row.element,\n index: row.zIndex\n }\n ]);\n });\n } else if (!Utils.isNullOrUndefined(row.deferred)) {\n return new Promise(resolve => {\n row.deferred.then(row => {\n if (row.element != null) {\n resolve([\n {\n dom: row.element,\n index: row.zIndex\n }\n ]);\n } else {\n resolve(null);\n }\n });\n });\n }\n return null;\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/Omnibox/OldOmniboxAddon.ts","///\nimport { OmniboxEvents, IPopulateOmniboxSuggestionsEventArgs } from '../../events/OmniboxEvents';\nimport { Omnibox, IOmniboxSuggestion } from './Omnibox';\nimport { IExtension } from '../../rest/Extension';\nimport * as _ from 'underscore';\nimport { MagicBoxInstance } from '../../magicbox/MagicBox';\nimport { MagicBoxUtils } from '../../magicbox/MagicBoxUtils';\nimport { Result } from '../../magicbox/Result/Result';\n\ninterface IQueryExtensionAddonHash {\n type: string;\n before: string;\n after: string;\n current: string;\n name?: string;\n used?: string[];\n}\n\nexport class QueryExtensionAddon {\n static INDEX = 62;\n\n cache: { [hash: string]: Promise } = {};\n\n constructor(public omnibox: Omnibox) {\n this.omnibox.bind.on(this.omnibox.element, OmniboxEvents.populateOmniboxSuggestions, (args: IPopulateOmniboxSuggestionsEventArgs) => {\n args.suggestions.push(this.getSuggestion());\n });\n }\n\n public getSuggestion(): Promise {\n var hash = this.getHash(this.omnibox.magicBox);\n if (hash == null) {\n return null;\n }\n var hashString = this.hashToString(hash);\n if (this.cache[hashString] != null) {\n return this.hashValueToSuggestion(hash, this.cache[hashString]);\n }\n var values = hash.type == 'QueryExtensionName' ? this.names(hash.current) : this.attributeNames(hash.name, hash.current, hash.used);\n this.cache[hashString] = values;\n values.catch(() => {\n delete this.cache[hashString];\n });\n return this.hashValueToSuggestion(hash, values);\n }\n\n private getHash(magicBox: MagicBoxInstance): IQueryExtensionAddonHash {\n var queryExtension: Result = _.last(magicBox.resultAtCursor('QueryExtension'));\n if (queryExtension != null) {\n var queryExtensionArgumentResults = queryExtension.findAll('QueryExtensionArgument');\n var current = _.last(magicBox.resultAtCursor('QueryExtensionName'));\n if (current != null) {\n return {\n type: 'QueryExtensionName',\n current: current.toString(),\n before: current.before(),\n after: current.after()\n };\n }\n\n current = _.last(magicBox.resultAtCursor('QueryExtensionArgumentName'));\n if (current != null) {\n var used: string[] = _.chain(queryExtensionArgumentResults)\n .map(result => {\n var name = result.find('QueryExtensionArgumentName');\n return name && name.toString();\n })\n .compact()\n .value();\n\n var name = queryExtension.find('QueryExtensionName').toString();\n\n return {\n type: 'QueryExtensionArgumentName',\n current: current.toString(),\n before: current.before(),\n after: current.after(),\n name: name,\n used: used\n };\n }\n }\n return null;\n }\n\n private hashToString(hash: IQueryExtensionAddonHash) {\n if (hash == null) {\n return null;\n }\n return [hash.type, hash.current, hash.name || '', hash.used ? hash.used.join() : ''].join();\n }\n\n private hashValueToSuggestion(hash: IQueryExtensionAddonHash, promise: Promise): Promise {\n return promise.then(values => {\n var suggestions: IOmniboxSuggestion[] = _.map(values, (value, i) => {\n return {\n html: MagicBoxUtils.highlightText(value, hash.current, true),\n text: hash.before + value + hash.after,\n index: QueryExtensionAddon.INDEX - i / values.length\n };\n });\n return suggestions;\n });\n }\n\n private extensions: Promise;\n\n private getExtensions() {\n if (this.extensions == null) {\n this.extensions = this.omnibox.queryController.getEndpoint().extensions();\n }\n return this.extensions;\n }\n\n private names(current: string): Promise {\n var extensionName = current.toLowerCase();\n return this.getExtensions().then((extensions: IExtension[]) => {\n var matchExtensions = _.chain(extensions)\n .map((extension: IExtension) => {\n return {\n index: extension.name.toLowerCase().indexOf(extensionName),\n extension: extension.name\n };\n })\n .filter(extension => {\n return extension.index != -1 && extension.extension.length > extensionName.length;\n })\n .sortBy('index')\n .pluck('extension')\n .value();\n matchExtensions = _.first(matchExtensions, 5);\n return matchExtensions;\n });\n }\n\n private attributeNames(name: string, current: string, used: string[]): Promise {\n return this.getExtensions().then((extensions: IExtension[]) => {\n var extension = _.find(extensions, (extension: IExtension) => extension.name == name);\n if (extension == null) {\n return [];\n } else {\n return _.filter(_.difference(extension.argumentNames, used), (argumentName: string) => argumentName.indexOf(current) == 0);\n }\n });\n }\n\n public hash() {\n return;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/Omnibox/QueryExtensionAddon.ts","///\nimport { Omnibox, IOmniboxSuggestion } from './Omnibox';\nimport { $$, Dom } from '../../utils/Dom';\nimport { IQuerySuggestCompletion, IQuerySuggestRequest, IQuerySuggestResponse } from '../../rest/QuerySuggest';\nimport { ComponentOptionsModel } from '../../models/ComponentOptionsModel';\nimport {\n OmniboxEvents,\n IPopulateOmniboxSuggestionsEventArgs,\n IBuildingQuerySuggestArgs,\n IQuerySuggestSuccessArgs\n} from '../../events/OmniboxEvents';\nimport { StringUtils } from '../../utils/StringUtils';\nimport { map, every, last, indexOf, find } from 'underscore';\nimport { QUERY_STATE_ATTRIBUTES } from '../../models/QueryStateModel';\nimport { Utils } from '../../utils/Utils';\nimport { buildHistoryStore } from '../../utils/HistoryStore';\nimport { AnalyticsInformation } from '../Analytics/AnalyticsInformation';\n\nexport interface IQuerySuggestAddon {\n getSuggestion(): Promise;\n}\n\nexport class QuerySuggestAddon implements IQuerySuggestAddon {\n static INDEX = 60;\n\n private static suggestiontHtml(suggestion: IQuerySuggestCompletion) {\n return suggestion.highlighted.replace(/\\[(.*?)\\]|\\{(.*?)\\}|\\((.*?)\\)/g, (part, notMatched, matched, corrected) => {\n var className = '';\n if (matched) {\n className = 'coveo-omnibox-hightlight';\n }\n if (corrected) {\n className = 'coveo-omnibox-hightlight2';\n }\n\n let ret: Dom;\n if (className) {\n ret = $$('span', {\n className: className\n });\n } else {\n ret = $$('span');\n }\n ret.text(notMatched || matched || corrected);\n return ret.el.outerHTML;\n });\n }\n\n private static isPartialMatch(suggestion: IQuerySuggestCompletion) {\n // groups : 1=notMatched, 2=matched, 3=corrected\n var parts = StringUtils.match(suggestion.highlighted, /\\[(.*?)\\]|\\{(.*?)\\}|\\((.*?)\\)/g);\n var firstFail = find(parts, (part: string[]) => part[1] != null);\n // if no fail found, this is a partial or a full match\n if (firstFail == null) {\n return true;\n }\n // if all right parts are notMatched, the right parts is autocomplete\n return every(last(parts, indexOf(parts, firstFail) - parts.length), (part: string[]) => part[1] != null);\n }\n\n constructor(public omnibox: Omnibox) {\n $$(this.omnibox.element).on(OmniboxEvents.populateOmniboxSuggestions, (e: Event, args: IPopulateOmniboxSuggestionsEventArgs) => {\n args.suggestions.push(this.getSuggestion());\n });\n }\n\n public getSuggestion(): Promise {\n const text = this.omnibox.magicBox.getText();\n\n if (text.length >= this.omnibox.options.querySuggestCharacterThreshold) {\n return this.getQuerySuggest(text);\n }\n return Promise.resolve([]);\n }\n\n private async getQuerySuggest(text: string): Promise {\n const payload: IQuerySuggestRequest = {\n q: text,\n locale: this.locale,\n searchHub: this.searchHub,\n pipeline: this.pipeline,\n enableWordCompletion: this.enableWordCompletion,\n context: this.context,\n count: this.count,\n tab: this.tab,\n referrer: document.referrer,\n actionsHistory: this.actionsHistory,\n timezone: this.timezone,\n visitorId: this.visitorId,\n isGuestUser: this.isGuestUser\n };\n\n $$(this.omnibox.getBindings().searchInterface.element).trigger(OmniboxEvents.buildingQuerySuggest, {\n payload\n });\n\n let results: IQuerySuggestResponse;\n try {\n results = await this.omnibox.queryController.getEndpoint().getQuerySuggest(payload);\n } catch {\n return [];\n }\n const completions = results.completions;\n\n $$(this.omnibox.getBindings().searchInterface.element).trigger(OmniboxEvents.querySuggestSuccess, {\n completions\n });\n\n return map(completions, (completion, i) => {\n return {\n html: QuerySuggestAddon.suggestiontHtml(completion),\n text: completion.expression,\n index: QuerySuggestAddon.INDEX - i / completions.length,\n partial: QuerySuggestAddon.isPartialMatch(completion),\n executableConfidence: completion.executableConfidence\n };\n });\n }\n\n private get tab() {\n const tab = this.omnibox.getBindings().queryStateModel.get(QUERY_STATE_ATTRIBUTES.T) as string;\n\n if (Utils.isNonEmptyString(tab)) {\n return tab;\n }\n\n return undefined;\n }\n\n private get locale() {\n return String['locale'];\n }\n\n private get searchHub() {\n return this.omnibox.getBindings().componentOptionsModel.get(ComponentOptionsModel.attributesEnum.searchHub);\n }\n\n private get pipeline() {\n return this.omnibox.getBindings().searchInterface.options.pipeline;\n }\n\n private get enableWordCompletion() {\n return this.omnibox.options.enableSearchAsYouType;\n }\n\n private get context() {\n return this.omnibox.getBindings().searchInterface.getQueryContext();\n }\n\n private get count() {\n return this.omnibox.options.numberOfSuggestions;\n }\n\n private get actionsHistory() {\n const historyStore = buildHistoryStore();\n const historyFromStore = historyStore.getHistory();\n if (historyFromStore == null) {\n return [];\n }\n return historyFromStore;\n }\n\n private get timezone() {\n return this.omnibox.getBindings().searchInterface.options.timezone;\n }\n\n private get visitorId() {\n return new AnalyticsInformation().clientId;\n }\n\n private get isGuestUser() {\n return this.omnibox.getBindings().queryController.getEndpoint().options.isGuestUser;\n }\n}\n\nexport class VoidQuerySuggestAddon implements IQuerySuggestAddon {\n getSuggestion(): Promise {\n return Promise.resolve([]);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/Omnibox/QuerySuggestAddon.ts","import { $$ } from './Dom';\n\nexport class SearchBoxResize {\n public static resize(element: HTMLElement, size: number) {\n const searchbox = this.getSearchbox(element);\n const elementToResize: HTMLElement[] = this.getElementsToResize(element);\n const magicboxInput: HTMLElement = this.getInput(element);\n\n const searchboxStyle = `height: ${size}px; line-height: ${size}px;`;\n const inputChangeStyle = `height: ${size}px`;\n\n //This need to be a little bit smaller because when the height become smaller than 38px or to big, the bottom border of the Searchbox dissapear\n const magicboxInputStyle = `height: ${size - 2}px;`;\n\n this.applyStyle(searchbox, searchboxStyle);\n this.applyStyle(magicboxInput, magicboxInputStyle);\n\n elementToResize.forEach(HtmlElement => {\n this.applyStyle(HtmlElement, inputChangeStyle);\n });\n }\n\n private static applyStyle(element: HTMLElement, style: string) {\n element.style.cssText += style;\n }\n\n private static getSearchbox(element: HTMLElement): HTMLElement {\n return $$(element).find('.CoveoOmnibox') || $$(element).find('.CoveoQuerybox');\n }\n\n private static getElementsToResize(element: HTMLElement): HTMLElement[] {\n return [\n $$(element).find('.CoveoSearchButton'),\n $$($$(element).find('.magic-box-input')).find('input'),\n $$(element).find('.magic-box-icon'),\n $$(element).find('.magic-box-clear'),\n $$(element).find('.magic-box-underlay')\n ];\n }\n\n private static getInput(element: HTMLElement): HTMLElement {\n return $$(element).find('.magic-box-input');\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/SearchBoxResize.ts"],"sourceRoot":""}