{"version":3,"file":"SmartSearch.min.js","sources":["SmartSearch.js"],"sourcesContent":["(function(w, $, _) {\r\n 'use strict';\r\n\r\n const assetId = '~/Parts/Views/Site/SmartSearch.min.js';\r\n\r\n if (!w.umwAssets || !w.umwAssets[assetId]) {\r\n console.error('No context found for ' + assetId);\r\n return;\r\n }\r\n\r\n for (let ctx of w.umwAssets[assetId]) {\r\n\r\n // ReSharper disable UndeclaredGlobalVariableUsing\r\n const $mainPanel = $('#' + ctx.mainPanelId);\r\n const labels = ctx.labels;\r\n const settings = ctx.settings;\r\n const compiledTemplate = _.template(ctx.templateContent);\r\n const pubSub = w.PubSub;\r\n // ReSharper restore UndeclaredGlobalVariableUsing\r\n w.require(['typeahead', 'bloodhound'],\r\n function () {\r\n $(function () {\r\n let qtyMap = {};\r\n \r\n const $searchBtn = $mainPanel.find('.smart-search__btn');\r\n const $searchInput = $mainPanel.find('.smart-search__input');\r\n $searchBtn.on('click',\r\n function(e) {\r\n e.preventDefault();\r\n const term = $.trim($searchInput.val());\r\n if (term) {\r\n w.location = w.R + settings.searchUrl + encodeURIComponent(term);\r\n }\r\n });\r\n $searchInput.on('keypress',\r\n function(e) {\r\n if (e.keyCode == 13) {\r\n e.preventDefault();\r\n $searchBtn.trigger('click');\r\n }\r\n });\r\n\r\n function notify(message, type) {\r\n const channel = typeof (type) === 'string' && type ? 'notification.' + type : 'notification';\r\n w.PubSub.publish(channel, message);\r\n }\r\n\r\n w.PublicEStore.subscribe(w.PublicEStore.channels.callback.shopCart + '.' + w.PublicEStore.actions.addToCart, addToCartHandler);\r\n w.PublicEStore.subscribe(w.PublicEStore.channels.callback.shopCart + '.' + w.PublicEStore.actions.removeFromCart, removeFromCartHandler);\r\n w.PublicEStore.subscribe(w.PublicEStore.channels.callback.shopCart + '.' + w.PublicEStore.actions.emptyCart, emptyCartHandler);\r\n\r\n function addToCartHandler(topic, dataContract) {\r\n addToCartCallback(dataContract);\r\n }\r\n\r\n function removeFromCartHandler(topic, dataContract) {\r\n _.each(dataContract.result.items,\r\n function(prod) {\r\n if (prod.status.toLowerCase() === 'ok' && typeof (qtyMap[prod.productID]) === 'number') {\r\n qtyMap[prod.productID] = 0;\r\n const $prodCont = $mainPanel.find('[data-prodid=\"' + prod.productID + '\"]');\r\n $prodCont.removeClass('smart-search-suggestion_in-cart');\r\n $prodCont.find('.smart-search-suggestion__fa-shopping-cart').remove();\r\n }\r\n });\r\n }\r\n\r\n function emptyCartHandler(topic, dataContract) {\r\n if (dataContract.status.toLowerCase() === 'ok') {\r\n for (let qty in qtyMap) {\r\n if (qtyMap.hasOwnProperty(qty)) {\r\n qtyMap[qty] = 0;\r\n }\r\n }\r\n const $prodConts = $mainPanel.find('.smart-search-suggestion_product');\r\n $prodConts.removeClass('smart-search-suggestion_in-cart');\r\n $prodConts.find('.smart-search-suggestion__fa-shopping-cart').remove();\r\n }\r\n }\r\n\r\n function addToCartCallback(dataContract) {\r\n _.each(dataContract.result.items,\r\n function(prod) {\r\n if (prod.status.toLowerCase() === 'ok') {\r\n if (typeof (qtyMap[prod.productID]) === 'number') {\r\n if (qtyMap[prod.productID] === 0) {\r\n const $prodCont = $mainPanel.find('[data-prodid=\"' + prod.productID + '\"]');\r\n $prodCont.addClass('smart-search-suggestion_in-cart');\r\n $prodCont.find('.smart-search-suggestion__image-container')\r\n .append('');\r\n }\r\n\r\n qtyMap[prod.productID] += prod.quantity;\r\n }\r\n } else {\r\n notify(prod.message, 'error');\r\n }\r\n });\r\n }\r\n\r\n function errorCallback(errorContract) {\r\n if (errorContract) {\r\n const msg = typeof errorContract === 'string'\r\n ? errorContract\r\n : errorContract.result && errorContract.result.items[0]\r\n ? errorContract.result.items[0].message\r\n : errorContract.message;\r\n notify(msg, 'error');\r\n }\r\n };\r\n\r\n var qtyFocusing = false;\r\n\r\n function validateQty($cont) {\r\n const $qtyTxb = $cont.find('.js-qty-txb');\r\n const qtyVal = $qtyTxb.val();\r\n\r\n if (qtyVal && $.isNumeric(qtyVal)) {\r\n const intQty = parseInt(qtyVal);\r\n const minQty = $cont.data('qty');\r\n\r\n if (intQty >= minQty) {\r\n $cont.removeClass('has-error');\r\n return true;\r\n }\r\n }\r\n\r\n $cont.addClass('has-error');\r\n return false;\r\n }\r\n\r\n function changeQty($cont, diff) {\r\n if (validateQty($cont)) {\r\n const $qtyTxb = $cont.find('.js-qty-txb');\r\n let intQty = parseInt($qtyTxb.val());\r\n\r\n if (diff > 0) {\r\n intQty += diff;\r\n } else {\r\n const minQty = $cont.data('qty');\r\n\r\n if (intQty > minQty) {\r\n intQty += diff;\r\n }\r\n }\r\n\r\n $qtyTxb.val(intQty);\r\n }\r\n }\r\n\r\n // ReSharper disable UndeclaredGlobalVariableUsing\r\n var products = new Bloodhound({\r\n datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title'),\r\n queryTokenizer: Bloodhound.tokenizers.whitespace,\r\n remote: {\r\n url: w.R +\r\n 'handlers/public/ItemSearch.ashx?action=smartsearch' +\r\n '&types=' + (settings.types || '20') +\r\n (settings.rootPages ? '&rootpages=' + settings.rootPages : '') +\r\n (settings.rootFolders ? '&rootfolders=' + settings.rootFolders : '') +\r\n (settings.rootCategories ? '&rootcategories=' + settings.rootCategories : '') +\r\n (settings.imageWidth ? '&imageWidth=' + settings.imageWidth : '') +\r\n (settings.imageMod ? '&imageMod=' + settings.imageMod : '') +\r\n '&showPrice=' + settings.showPrice +\r\n (settings.showOriginalPrice ? '&showOriginalPrice=' + settings.showOriginalPrice : '') +\r\n '&showComparablePrice=' + settings.showComparablePrice +\r\n '&count=' + settings.resultsCount +\r\n '&term=%QUERY',\r\n wildcard: '%QUERY'\r\n }\r\n });\r\n // ReSharper restore UndeclaredGlobalVariableUsing\r\n\r\n const $ta = $mainPanel.find('.js-typeahead');\r\n $ta.typeahead(\r\n { highlight: true, hint: false, minLength: settings.minTermLength },\r\n {\r\n name: 'products',\r\n display: 'title',\r\n source: products,\r\n limit: (settings.resultsCount + 1) * 2, //note: typeahead workaround (rendered counter is incremented before slicing results array)\r\n templates: {\r\n empty: [\r\n '
',\r\n labels.noItemsFound,\r\n '
'\r\n ].join('\\n'),\r\n suggestion: function(context) {\r\n if (context.type === 'prod') {\r\n if (typeof (qtyMap[context.prodID]) === 'undefined') {\r\n qtyMap[context.prodID] = context.qtyInCart ? context.qtyInCart : 0;\r\n } else {\r\n context.qtyInCart = qtyMap[context.prodID];\r\n }\r\n }\r\n\r\n return compiledTemplate({\r\n ctx: context,\r\n searchUrl: w.R + settings.searchUrl,\r\n labels: labels,\r\n settings: settings\r\n });\r\n }\r\n }\r\n })\r\n .bind('typeahead:render',\r\n function () {\r\n $mainPanel.find('.js-qty-cont')\r\n .each(function(i, cont) {\r\n const $cont = $(cont);\r\n $cont.find('.js-btn-dec')\r\n .click(function() {\r\n changeQty($cont, -1);\r\n return false;\r\n });\r\n $cont.find('.js-btn-inc')\r\n .click(function() {\r\n changeQty($cont, 1);\r\n return false;\r\n });\r\n $cont.find('.js-qty-txb')\r\n .click(function() {\r\n qtyFocusing = true;\r\n const $this = $(this);\r\n $this[0].selectionStart = $this[0].selectionEnd = $this.val().length;\r\n $this.focus();\r\n return false;\r\n })\r\n .blur(function(e) {\r\n if (qtyFocusing) {\r\n qtyFocusing = false;\r\n } else if (!e.relatedTarget || !$.contains($mainPanel[0], e.relatedTarget)) {\r\n $ta.typeahead('close');\r\n }\r\n })\r\n .change(function () {\r\n validateQty($cont);\r\n });\r\n });\r\n\r\n $mainPanel.find('.smart-search-suggestion__buy-btn')\r\n .on('click',\r\n function() {\r\n const $cont = $(this).closest('.smart-search-suggestion_product');\r\n const $qtyCont = $cont.find('.js-qty-cont');\r\n let qty;\r\n\r\n if ($qtyCont.length) {\r\n if (!validateQty($qtyCont)) {\r\n return false;\r\n }\r\n\r\n qty = parseInt($cont.find('.js-qty-txb').val());\r\n } else {\r\n qty = $cont.data('qty');\r\n }\r\n\r\n const addContract = {\r\n productId: $cont.data('prodid'),\r\n quantity: qty\r\n };\r\n $.when(w.PublicEStore.addToCart([addContract]))\r\n .then(addToCartCallback, errorCallback);\r\n return false;\r\n });\r\n \r\n reportImpressions($mainPanel);\r\n })\r\n .bind('typeahead:select',\r\n function(e, data) {\r\n if (data) {\r\n if (data.type === 'prod' && data.prodUrl) {\r\n w.location = data.prodUrl;\r\n } else if (data.type === 'document' && data.documentUrl) {\r\n w.location = data.documentUrl;\r\n } else if (data.type === 'event' && data.eventUrl) {\r\n w.location = data.eventUrl;\r\n }\r\n }\r\n });\r\n\r\n //note: typeahead workaround - result items were closing on setting focus at quantity input\r\n var origClose = $ta.data('ttTypeahead').close;\r\n $ta.data('ttTypeahead').close = function() {\r\n if (!qtyFocusing) {\r\n origClose.apply(this, arguments);\r\n }\r\n qtyFocusing = false;\r\n };\r\n pubSub.publish(\"frontend.smartsearch.init\", \"init\");\r\n\r\n function reportImpressions($searchResults) {\r\n try {\r\n const listName = $.trim(document.title) + ' > ' + labels.smartSearch;\r\n const productImpressions = [];\r\n\r\n $searchResults.find('[data-prodid]').each(function () {\r\n const $prod = $(this);\r\n\r\n const productId = parseInt($prod.data('prodid'));\r\n if (productId > 0) {\r\n productImpressions.push({ productId: productId, $links: $prod.find('.js-product-link') });\r\n }\r\n });\r\n \r\n if (productImpressions.length > 0) {\r\n w.reportProductListView(w.productListType.searchResults, listName, productImpressions);\r\n }\r\n } catch (e) {\r\n console.error('Failed to report smartsearch\\'s products impressions. ' + e);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n})(window, window.jQuery, _);"],"names":["w","$","_","assetId","umwAssets","let","ctx","$mainPanel","mainPanelId","labels","settings","compiledTemplate","template","templateContent","pubSub","PubSub","require","qtyMap","$searchBtn","find","$searchInput","notify","message","type","publish","addToCartCallback","dataContract","each","result","items","prod","status","toLowerCase","productID","$prodCont","addClass","append","quantity","errorCallback","errorContract","on","e","preventDefault","term","trim","val","location","R","searchUrl","encodeURIComponent","keyCode","trigger","PublicEStore","subscribe","channels","callback","shopCart","actions","addToCart","topic","removeFromCart","removeClass","remove","emptyCart","qty","hasOwnProperty","$prodConts","qtyFocusing","validateQty","$cont","$qtyTxb","qtyVal","isNumeric","intQty","parseInt","data","changeQty","diff","minQty","products","Bloodhound","datumTokenizer","tokenizers","obj","whitespace","queryTokenizer","remote","url","types","rootPages","rootFolders","rootCategories","imageWidth","imageMod","showPrice","showOriginalPrice","showComparablePrice","resultsCount","wildcard","$ta","typeahead","highlight","hint","minLength","minTermLength","name","display","source","limit","templates","empty","noItemsFound","join","suggestion","context","prodID","qtyInCart","bind","i","cont","click","$this","this","selectionStart","selectionEnd","length","focus","blur","relatedTarget","contains","change","closest","$qtyCont","addContract","productId","when","then","reportImpressions","$searchResults","listName","document","title","smartSearch","productImpressions","$prod","push","$links","reportProductListView","productListType","searchResults","console","error","prodUrl","documentUrl","eventUrl","origClose","close","apply","arguments","window","jQuery"],"mappings":"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"}