1(function (window) { 2 var helpers = window.SearchHelpers || (window.SearchHelpers = {}); 3 4 helpers.getFullImageUrl = function (imageUrl, catalogImageBaseUrl) { 5 if (!imageUrl) { 6 return ''; 7 } 8 9 var lowerUrl = imageUrl.toLowerCase(); 10 if (lowerUrl.indexOf('http://') === 0 || lowerUrl.indexOf('https://') === 0) { 11 return imageUrl; 12 } 13 14 var cleanPath = imageUrl.indexOf('/') === 0 ? imageUrl.substring(1) : imageUrl; 15 return catalogImageBaseUrl + '/' + cleanPath; 16 }; 17 18 helpers.escapeHtml = function (text) { 19 if (!text) { 20 return ''; 21 } 22 var map = { 23 '&': '&', 24 '<': '<', 25 '>': '>', 26 '"': '"', 27 "'": ''' 28 }; 29 return text.replace(/[&<>"']/g, function (m) { return map[m]; }); 30 }; 31 32 helpers.normalizeQuery = function (query, maxLength) { 33 if (!query) { 34 return ''; 35 } 36 37 var max = maxLength || 255; 38 if (query.length > max) { 39 return query.substring(0, max); 40 } 41 42 return query; 43 }; 44 45 helpers.buildSkuUrl = function (productUrl, sku) { 46 if (!productUrl || !sku) { 47 return productUrl || '#'; 48 } 49 var lastSlashIndex = productUrl.lastIndexOf('/'); 50 if (lastSlashIndex === -1) { 51 return productUrl; 52 } 53 return productUrl.substring(0, lastSlashIndex + 1) + encodeURIComponent(sku); 54 }; 55 56 helpers.addColorQueryParam = function (productUrl, colorName) { 57 if (!productUrl || !colorName) { 58 return productUrl; 59 } 60 61 var colorValue = colorName.toLowerCase(); 62 var urlParts = productUrl.split('#'); 63 var baseUrl = urlParts[0]; 64 var hash = urlParts.length > 1 ? '#' + urlParts[1] : ''; 65 var colorRegex = /([?&])color=[^&]*/i; 66 67 if (colorRegex.test(baseUrl)) { 68 return baseUrl.replace(colorRegex, '$1color=' + encodeURIComponent(colorValue)) + hash; 69 } 70 71 var separator = baseUrl.indexOf('?') === -1 ? '?' : '&'; 72 return baseUrl + separator + 'color=' + encodeURIComponent(colorValue) + hash; 73 }; 74 75 helpers.getPreferredSkuForQuery = function (productData, query, maxTerms) { 76 if (!productData || !productData.skus || productData.skus.length === 0) { 77 return null; 78 } 79 80 var terms = (query || '') 81 .toLowerCase() 82 .split(/\s+/) 83 .filter(function (term) { return term && term.length >= 3; }); 84 85 var max = maxTerms || 5; 86 terms = terms.slice(0, max); 87 if (terms.length === 0) { 88 return null; 89 } 90 91 var bestSku = null; 92 var bestScore = 0; 93 94 for (var i = 0; i < productData.skus.length; i++) { 95 var sku = productData.skus[i]; 96 if (!sku || !sku.color || !sku.imageUrl) { 97 continue; 98 } 99 100 var colorText = sku.color.toLowerCase(); 101 var hits = 0; 102 for (var t = 0; t < terms.length; t++) { 103 if (colorText.indexOf(terms[t]) !== -1) { 104 hits++; 105 } 106 } 107 108 if (hits > bestScore) { 109 bestScore = hits; 110 bestSku = sku; 111 } 112 } 113 114 return bestSku; 115 }; 116})(window);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.