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