{"version":3,"file":"DetailedSearch.min.js","sources":["DetailedSearch.js"],"sourcesContent":["// ReSharper disable StringLiteralTypo\n// ReSharper disable IdentifierTypo\n// ReSharper disable UndeclaredGlobalVariableUsing\n(function($, _, root) {\n 'use strict';\n var assetId = 'uc214-detailedsearch';\n var utils = new Utils();\n\n $(function domReady() {\n if (root.umwAssets && root.umwAssets[assetId]) {\n root.umwAssets[assetId].forEach(function(contextModel) {\n if (contextModel) {\n var mainPanelId = contextModel.mainPanelID;\n var $mainPanel = $('#' + mainPanelId);\n\n if ($mainPanel.length === 1) {\n var searchProccessor = new SearchProccessor($mainPanel, contextModel, utils);\n searchProccessor.init();\n } else if ($mainPanel.length === 0) {\n console.warn(assetId + ': detailed search main panel element was not found by id#' + mainPanelId);\n } else {\n console.warn(assetId + ': found > 1 detailed search main panel elements with id#' + mainPanelId);\n }\n }\n });\n }\n });\n\n function SearchProccessor($mainPanel, contextModel, utils) {\n var _$body = $('body');\n var _$mainPanel = $mainPanel;\n var _contextModel = contextModel;\n var _utils = utils;\n\n var _isFirstLoading = true;\n var _cache = { empty: {} };\n var _$searchInput, _$popupContainer, _$searchClearBtn;\n var _searchDelay = 1000;\n var _popupOpened = false;\n var _searchInProcess = false;\n var _productListController = null;\n var _clearBtnClick = false;\n const detailedSearchEvents = {\n show: 'detailedsearch.popup:show',\n hide: 'detailedsearch.popup:hide',\n onstatechange: 'detailedsearch.popup:onstatechange'\n };\n\n function _init() {\n _$searchClearBtn = _$mainPanel.find('.js-search-clear-input-btn');\n _$searchInput = _$mainPanel.find('.js-search-input');\n\n if (contextModel.alternativePopupContainerSelector) {\n _$popupContainer = $(contextModel.alternativePopupContainerSelector);\n } else {\n _$popupContainer = $('.js-detailed-search-popup');\n }\n\n if (root.PubSub) {\n root.PubSub.subscribe('detailedsearch', function (msg, data) {\n if(data.detailedSearchId !== _contextModel.mainPanelID) return; \n switch (msg) {\n case detailedSearchEvents.show:\n _togglePopup(true);\n break;\n case detailedSearchEvents.hide:\n if (!_searchInProcess) _togglePopup(false);\n break;\n }\n });\n }\n\n $(document).on('click',\n function (e) {\n if (!_$searchInput[0].contains(e.target) && !_$popupContainer[0].contains(e.target)) {\n if (_clearBtnClick) {\n _clearBtnClick = false;\n if(_popupOpened){\n return;\n }\n }\n _togglePopup(false);\n }\n });\n\n /* No need in submit button. Was requested to use clear button instead. Don't delete - can be used in future projects.\n var _$searchBtn = _$mainPanel.find('.js-search-btn');\n _$searchBtn.on('click',\n function(e) {\n var term = $.trim(_$searchInput.val());\n if (term && term.length && term.length >= _contextModel.minTermLength) {\n root.location = root.R + _contextModel.searchUrl + encodeURIComponent(term);\n } else {\n e.preventDefault();\n }\n });\n */\n\n _$searchClearBtn.on('click',\n function () {\n _clearBtnClick = true;\n _$searchInput.val('').focus();\n _$mainPanel.attr('data-input-has-term', 'false');\n }\n );\n\n _$searchInput\n .on('keyup',\n function (e) {\n if (e.key && typeof (e.key) !== 'undefined' && e.key.length && e.key !== 'Unidentified' && !e.repeat) {\n var term = $.trim(_$searchInput.val());\n // Has terms data required to show different icons depends on input state.\n if (term && term.length && term.length > 0) {\n _$mainPanel.attr('data-input-has-term', 'true');\n } else {\n _$mainPanel.attr('data-input-has-term', 'false');\n }\n if (e.key.length === 1 || e.key === 'Backspace' || e.key === 'Delete') {\n if (_searchInProcess) {\n return;\n }\n _searchInProcess = true;\n setTimeout(function () {\n _search();\n _searchInProcess = false;\n }, _searchDelay);\n }\n }\n })\n .on('keypress', function (e) {\n if (e.key && typeof (e.key) !== 'undefined' && e.key.length && e.key !== 'Unidentified' && !e.repeat && e.key === 'Enter') {\n e.preventDefault();\n var term = $.trim(_$searchInput.val());\n if (term && term.length && term.length) {\n root.location = root.R + _contextModel.searchUrl + encodeURIComponent(term);\n }\n }\n })\n .on('focus',\n function () {\n if (root.PubSub) {\n root.PubSub.publish('popup.lockRender');\n }\n _search();\n });\n }\n\n function _generatePopupHtml(searchResultModel) {\n if (_contextModel.popupTemplate) {\n return _.template(_contextModel.popupTemplate, searchResultModel);\n } else {\n console.error('Popup template does not exists in the context model.');\n return '';\n }\n }\n\n function _togglePopup(showOrHide) {\n if (_popupOpened === showOrHide) return;\n // Don't allow to toggle popup state if it's already opened.\n if(showOrHide) {\n //console.log(document.documentElement.getBoundingClientRect().width , window.innerWidth);\n const windowWidth = window.innerWidth;\n const documentWidth = document.documentElement.getBoundingClientRect().width;\n\n let scrollCompensation = windowWidth - documentWidth;\n\n if(scrollCompensation > 0) {\n $(\"body\").get(0).style.setProperty('--scrollbar-compensate', `${scrollCompensation}px`);\n }\n\n _$popupContainer.removeClass('hidden');\n _$body.addClass('detailed-search-modal-is-shown');\n _popupOpened = true;\n } else {\n $(\"body\").get(0).style.setProperty('--scrollbar-compensate', `0`);\n _$popupContainer.addClass('hidden');\n _$body.removeClass('detailed-search-modal-is-shown');\n _popupOpened = false;\n if (root.PubSub) {\n root.PubSub.publish('popup.unlockRender');\n }\n }\n if (root.PubSub) {\n root.PubSub.publish(detailedSearchEvents.onstatechange, { toggleState: showOrHide, detailedSearchId: _contextModel.mainPanelID });\n }\n };\n\n function _setLoadingUI() {\n if (_isFirstLoading) {\n _isFirstLoading = false;\n\n var popupHtml = _generatePopupHtml({ isLoading: true });\n _$popupContainer.empty();\n _$popupContainer.append(popupHtml);\n _togglePopup(true);\n }\n }\n\n function _proccessSearchResult(searchResultModel, searchInput) {\n _$popupContainer.empty();\n\n var searchResultModelEx = $.extend(searchResultModel,\n {\n isLoading: false,\n searchHref: root.R + _contextModel.searchUrl + encodeURIComponent(searchInput),\n labels: _contextModel.labels,\n });\n\n _.each(searchResultModelEx.documentsSection.documents, function (document) {\n // Strip html tags before embedding it into the markup. Documents can contain html which is not compatible with simple text presentation for teaser in detailed search popup.\n document.teaser = document.teaser.replace(/(<([^>]+)>)/gi, '');\n });\n var popupHtml = _generatePopupHtml(searchResultModelEx);\n _$popupContainer.empty();\n _$popupContainer.append(popupHtml);\n\n if (searchResultModelEx.productsSection.productListAssetContext) {\n var productListAssetContext = JSON.parse(searchResultModelEx.productsSection.productListAssetContext);\n if (productListAssetContext &&\n root.createProductListController &&\n typeof (root.createProductListController) == 'function') {\n productListAssetContext.skipFilterEvents = true;\n _productListController = createProductListController(productListAssetContext);\n if (_productListController) {\n _productListController.init();\n }\n }\n }\n\n if (searchResultModelEx.productsSection.productsCount && _$popupContainer.find('.lipscore-rating-small').length && lipscore) {\n lipscore.reInitWidgets();\n }\n\n _togglePopup(true);\n }\n\n function _search() {\n var searchInput = $.trim(_$searchInput.val());\n if (searchInput && searchInput.length && searchInput.length >= _contextModel.minTermLength) {\n\n _setLoadingUI();\n\n var cacheKey = searchInput;\n if (_cache[cacheKey]) {\n _proccessSearchResult(_cache[cacheKey], searchInput);\n } else {\n root.reporWebshopSearchEvent(searchInput);\n $.ajax({\n url: root.R + 'handlers/public/ItemSearch.ashx',\n type: 'GET',\n data: {\n action: 'detailedsearch',\n term: searchInput,\n productListResultsCount: _contextModel.productListResultsCount,\n pageResultsCount: _contextModel.pageResultsCount,\n documentResultsCount: _contextModel.documentResultsCount,\n eventResultsCount: _contextModel.eventResultsCount,\n imageWidth: _contextModel.imageWidth\n }\n })\n .success(function (result) {\n _cache[cacheKey] = result;\n _proccessSearchResult(result, searchInput);\n })\n .error(function (errResp) {\n var errorMessage = _utils.extractErrorMessageFromResponse(errResp);\n console.error('Failed to make search request with term \"' + searchInput + '\". ', errorMessage);\n });\n }\n }\n }\n\n return { init: _init }\n }\n\n function Utils() {\n return {\n extractErrorMessageFromResponse: function(errorResponse) {\n var message;\n if (typeof errorResponse === 'object' && errorResponse !== null) {\n // Extract error message\n try {\n var parsedResponseBody = JSON.parse(errorResponse.responseText);\n message = parsedResponseBody.ExceptionMessage ? parsedResponseBody.ExceptionMessage : (parsedResponseBody.Message ? parsedResponseBody.Message : errorResponse.statusText);\n } catch (e) {\n message = errorResponse.statusText;\n }\n } else {\n message = errorResponse;\n }\n\n return message;\n }\n }\n }\n\n})(jQuery, _, window);"],"names":["$","_","root","assetId","utils","extractErrorMessageFromResponse","errorResponse","parsedResponseBody","JSON","parse","responseText","message","ExceptionMessage","Message","statusText","e","SearchProccessor","$mainPanel","contextModel","_$searchInput","_$popupContainer","_$searchClearBtn","_$body","_$mainPanel","_contextModel","_utils","_isFirstLoading","_cache","empty","_popupOpened","_searchInProcess","_productListController","_clearBtnClick","detailedSearchEvents","show","hide","onstatechange","_generatePopupHtml","searchResultModel","popupTemplate","template","console","error","_togglePopup","showOrHide","scrollCompensation","window","innerWidth","document","documentElement","getBoundingClientRect","width","get","style","setProperty","removeClass","addClass","PubSub","publish","toggleState","detailedSearchId","mainPanelID","_proccessSearchResult","searchInput","searchResultModelEx","extend","isLoading","searchHref","R","searchUrl","encodeURIComponent","labels","popupHtml","each","documentsSection","documents","teaser","replace","append","productsSection","productListAssetContext","createProductListController","skipFilterEvents","init","productsCount","find","length","lipscore","reInitWidgets","_search","cacheKey","trim","val","minTermLength","reporWebshopSearchEvent","ajax","url","type","data","action","term","productListResultsCount","pageResultsCount","documentResultsCount","eventResultsCount","imageWidth","success","result","errResp","errorMessage","alternativePopupContainerSelector","subscribe","msg","on","contains","target","focus","attr","key","repeat","setTimeout","preventDefault","location","umwAssets","forEach","mainPanelId","warn","jQuery"],"mappings":"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"}