PageSourceSearch

https://www.kaosalonpartner.it/_ui/responsive/common/js/acc.cart.js

js kaosalonpartner.it collected 2026-10-09 00:13:21 UTC 39,897 bytes, 952 lines download raw bytes

1
2ACC.cart = {
3
4    _autoload: [
5        "bindHelp",
6        "cartRestoration",
7        "bindCartPage",
8        "bindMultiDEntryRemoval",
9        "bindMultidCartProduct",
10        ["bindApplyVoucher", $("#js-voucher-apply-btn").length != 0],
11        ["bindToReleaseVoucher", $("#js-applied-vouchers").length != 0],
12        "bindCartPlaceOrder",
13        "bindProductCodeToWishList",
14"bindDisableSubmitButtonOnFormSubmit",
15        "bindCartAlertDismiss",
16        "bindPotentialPromotion",
17        "bindStickyCartBtn"
18    ],
19
20    bindHelp: function () {
21        $(document).on("click", ".js-cart-help", function (e) {
22            e.preventDefault();
23            var title = $(this).data("help");
24            ACC.colorbox.open(title, {
25                html: $(".js-help-popup-content").html(),
26                width: "300px"
27            });
28        })
29    },
30
31    cartRestoration: function () {
32        $('.cartRestoration').click(function () {
33            var sCartUrl = $(this).data("cartUrl");
34            window.location = sCartUrl;
35        });
36    },
37
38    bindCartPage: function () {
39        // link to display the multi-d grid in read-only mode
40        $(document).on("click", '.js-show-editable-grid', function (event) {
41            ACC.cart.populateAndShowEditableGrid(this, event);
42        });
43       
44    },
45    bindMultiDEntryRemoval: function () {
46        $(document).on("click", '.js-submit-remove-product-multi-d', function () {
47            var itemIndex = $(this).data("index");
48            var $form = $('#updateCartForm' + itemIndex);
49            var initialCartQuantity = $form.find('input[name=initialQuantity]');
50            var cartQuantity = $form.find('input[name=quantity]');
51            var entryNumber = $form.find('input[name=entryNumber]').val();
52            var productCode = $form.find('input[name=productCode]').val();
53
54            cartQuantity.val(0);
55            initialCartQuantity.val(0);
56
57            ACC.track.trackRemoveFromCart(productCode, initialCartQuantity, cartQuantity.val());
58
59            var method = $form.attr("method") ? $form.attr("method").toUpperCase() : "GET";
60            $.ajax({
61                url: $form.attr("action"),
62                data: $form.serialize(),
63                type: method,
64                success: function (data) {
65                    location.reload();
66                },
67                error: function () {
68                    alert("Failed to remove quantity. Error details [" + xht + ", " + textStatus + ", " + ex + "]");
69                }
70
71            });
72
73        });
74    },
75
76
77    populateAndShowEditableGrid: function (element, event) {
78        var readOnly = $(element).data("readOnlyMultidGrid");
79        var itemIndex = $(element).data("index");
80        grid = $("#ajaxGrid" + itemIndex);
81
82        var gridEntries = $('#grid' + itemIndex);
83        var strSubEntries = gridEntries.data("sub-entries");
84        var arrSubEntries = strSubEntries.split(',');
85        var firstVariantCode = arrSubEntries[0].split(':')[0];
86
87        $(element).toggleClass('open');
88
89        var targetUrl = gridEntries.data("target-url");
90
91        var mapCodeQuantity = new Object();
92        for (var i = 0; i < arrSubEntries.length; i++) {
93            var arrValue = arrSubEntries[i].split(":");
94            mapCodeQuantity[arrValue[0]] = arrValue[1];
95        }
96
97        if (grid.children('#cartOrderGridForm').length > 0) {
98            grid.slideToggle("slow");
99        }
100        else {
101            var method = "GET";
102            $.ajax({
103                url: targetUrl,
104                data: {productCode: firstVariantCode, readOnly: readOnly},
105                type: method,
106                success: function (data) {
107                    grid.html(data);
108                    $("#ajaxGrid").removeAttr('id');
109                    var $gridContainer = grid.find(".product-grid-container");
110                    var numGrids = $gridContainer.length;
111                    for (var i = 0; i < numGrids; i++) {
112                        ACC.cart.getProductQuantity($gridContainer.eq(i), mapCodeQuantity, i);
113                    }
114                    grid.slideDown("slow");
115                    ACC.cart.coreCartGridTableActions(element, mapCodeQuantity);
116                    ACC.productorderform.coreTableScrollActions(grid.children('#cartOrderGridForm'));
117                },
118                error: function (xht, textStatus, ex) {
119                    alert("Failed to get variant matrix. Error details [" + xht + ", " + textStatus + ", " + ex + "]");
120                }
121
122            });
123        }
124    },
125
126
127    coreCartGridTableActions: function (element, mapCodeQuantity) {
128        ACC.productorderform.bindUpdateFutureStockButton(".update_future_stock_button");
129        ACC.productorderform.bindVariantSelect($(".variant-select-btn"), 'cartOrderGridForm');
130        var itemIndex = $(element).data("index");
131        var skuQuantityClass = '.sku-quantity';
132
133        var quantityBefore = 0;
134        var grid = $('#ajaxGrid' + itemIndex + " .product-grid-container");
135
136        grid.on('focusin', skuQuantityClass, function (event) {
137            quantityBefore = jQuery.trim(this.value);
138
139            $(this).parents('tr').next('.variant-summary').remove();
140            if ($(this).parents('table').data(ACC.productorderform.selectedVariantData)) {
141                ACC.productorderform.selectedVariants = $(this).parents('table').data(ACC.productorderform.selectedVariantData);
142            } else {
143                ACC.productorderform.selectedVariants = [];
144            }
145
146            if (quantityBefore == "") {
147                quantityBefore = 0;
148                this.value = 0;
149            }
150        });
151
152        grid.on('focusout keypress', skuQuantityClass, function (event) {
153            var code = event.keyCode || event.which || event.charCode;
154
155            if (code != 13 && code != undefined) {
156                return;
157            }
158
159            var quantityAfter = 0;
160            var gridLevelTotalPrice = "";
161
162            var indexPattern = "[0-9]+";
163            var currentIndex = parseInt($(this).attr("id").match(indexPattern));
164
165            this.value = ACC.productorderform.filterSkuEntry(this.value);
166
167            quantityAfter = jQuery.trim(this.value);
168            var variantCode = $("input[id='cartEntries[" + currentIndex + "].sku']").val();
169
170            if (isNaN(jQuery.trim(this.value))) {
171                this.value = 0;
172            }
173
174            if (quantityAfter == "") {
175                quantityAfter = 0;
176                this.value = 0;
177            }
178
179            var $gridTotalValue = grid.find("[data-grid-total-id=" + 'total_value_' + currentIndex + "]");
180            var currentPrice = $("input[id='productPrice[" + currentIndex + "]']").val();
181
182            if (quantityAfter > 0) {
183                gridLevelTotalPrice = ACC.productorderform.formatTotalsCurrency(parseFloat(currentPrice) * parseInt(quantityAfter));
184            }
185
186            $gridTotalValue.html(gridLevelTotalPrice);
187
188            var _this = this;
189            var priceSibling = $(this).siblings('.price');
190            var propSibling = $(this).siblings('.variant-prop');
191            var currentSkuId = $(this).next('.td_stock').data('sku-id');
192            var currentBaseTotal = $(this).siblings('.data-grid-total');
193
194            if (this.value != quantityBefore) {
195                var newVariant = true;
196                ACC.productorderform.selectedVariants.forEach(function (item, index) {
197                    if (item.id === currentSkuId) {
198                        newVariant = false;
199
200                        if(_this.value === '0' || _this.value === 0){
201                            ACC.productorderform.selectedVariants.splice(index, 1);
202                        } else {
203                            ACC.productorderform.selectedVariants[index].quantity = _this.value;
204                            ACC.productorderform.selectedVariants[index].total = ACC.productorderform.updateVariantTotal(priceSibling, _this.value, currentBaseTotal);
205                        }
206                    }
207                });
208
209                if(newVariant && this.value > 0){
210                    // update variantData
211                    ACC.productorderform.selectedVariants.push({
212                        id: currentSkuId,
213                        size: propSibling.data('variant-prop'),
214                        quantity: _this.value,
215                        total: ACC.productorderform.updateVariantTotal(priceSibling, _this.value, currentBaseTotal)
216                    });
217                }
218            }
219            ACC.productorderform.showSelectedVariant($(this).parents('table'));
220            if (this.value > 0 && this.value != quantityBefore) {
221                $(this).parents('table').addClass('selected');
222            } else {
223                if (ACC.productorderform.selectedVariants.length === 0) {
224                    $(this).parents('table').removeClass('selected').find('.variant-summary').remove();
225
226                }
227            }
228
229            if (quantityBefore != quantityAfter) {
230                var method = "POST";
231                $.ajax({
232                    url: ACC.config.encodedContextPath + '/cart/updateMultiD',
233                    data: {productCode: variantCode, quantity: quantityAfter, entryNumber: -1},
234                    type: method,
235                    success: function (data, textStatus, xhr) {
236                        ACC.cart.refreshCartData(data, -1, quantityAfter, itemIndex);
237                        mapCodeQuantity[variantCode] = quantityAfter;
238                    },
239                    error: function (xhr, textStatus, error) {
240                        var redirectUrl = xhr.getResponseHeader("redirectUrl");
241                        var connection = xhr.getResponseHeader("Connection");
242                        // check if error leads to a redirect
243                        if (redirectUrl !== null) {
244                            window.location = redirectUrl;
245                            // check if error is caused by a closed connection
246                        } else if (connection === "close") {
247                            window.location.reload();
248                        }
249                    }
250                });
251            }
252        });
253    },
254
255    refreshCartData: function (cartData, entryNum, quantity, itemIndex) {
256        // if cart is empty, we need to reload the whole page
257        if (cartData.entries.length == 0) {
258            location.reload();
259        }
260        else {
261            var form;
262
263            if (entryNum == -1) // grouped item
264            {
265                form = $('.js-qty-form' + itemIndex);
266                var productCode = form.find('input[name=productCode]').val();
267
268                var quantity = 0;
269                var entryPrice = 0;
270                for (var i = 0; i < cartData.entries.length; i++) {
271                    var entry = cartData.entries[i];
272                    if (entry.product.code == productCode) {
273                        quantity = entry.quantity;
274                        entryPrice = entry.totalPrice;
275                        ACC.cart.updateEntryNumbersForCartMenuData(entry);
276                        break;
277                    }
278                }
279
280                if (quantity == 0) {
281                    location.reload();
282                }
283                else {
284                    form.find(".qtyValue").html(quantity);
285                    form.parent().parent().find(".js-item-total").html(entryPrice.formattedValue);
286                }
287            }
288
289            ACC.cart.refreshCartPageWithJSONResponse(cartData);
290        }
291    },
292
293    refreshCartPageWithJSONResponse: function (cartData) {
294        // refresh mini cart
295        ACC.minicart.updateMiniCartDisplay();
296        $('.js-cart-top-totals').html($("#cartTopTotalSectionTemplate").tmpl(cartData));
297        $('div .cartpotproline').remove();
298        $('div .cartproline').remove();
299        $('.js-cart-totals').remove();
300        $('#ajaxCartPotentialPromotionSection').html($("#cartPotentialPromotionSectionTemplate").tmpl(cartData));
301        $('#ajaxCartPromotionSection').html($("#cartPromotionSectionTemplate").tmpl(cartData));
302        $('#ajaxCart').html($("#cartTotalsTemplate").tmpl(cartData));
303        ACC.quote.bindQuoteDiscount();
304    },
305    
306    updateEntryNumbersForCartMenuData: function (entry) {
307    	var entryNumbers = "";
308        $.each(entry.entries, function(index, subEntry) {
309        	if(index != 0){
310        		entryNumbers = entryNumbers + ";";
311        	}
312        	entryNumbers = entryNumbers + subEntry.entryNumber;
313        });
314        $('.js-execute-entry-action-button').data('actionEntryNumbers',entryNumbers); 
315    },
316
317    getProductQuantity: function (gridContainer, mapData, i) {
318        var tables = gridContainer.find("table");
319
320        $.each(tables, function (index, currentTable) {
321            var skus = jQuery.map($(currentTable).find("input[type='hidden'].sku"), function (o) {
322                return o.value
323            });
324            var quantities = jQuery.map($(currentTable).find("input[type='textbox'].sku-quantity"), function (o) {
325                return o
326            });
327            var selectedVariants = [];
328
329            $.each(skus, function (index, skuId) {
330                var quantity = mapData[skuId];
331                if (quantity != undefined) {
332                    quantities[index].value = quantity;
333
334                    var indexPattern = "[0-9]+";
335                    var currentIndex = parseInt(quantities[index].id.match(indexPattern));
336                    var gridTotalValue = gridContainer.find("[data-grid-total-id=" + 'total_value_' + currentIndex + "]");
337                    var gridLevelTotalPrice = "";
338                    var currentPrice = $("input[id='productPrice[" + currentIndex + "]']").val();
339                    if (quantity > 0) {
340                        gridLevelTotalPrice = ACC.productorderform.formatTotalsCurrency(parseFloat(currentPrice) * parseInt(quantity));
341                    }
342                    gridTotalValue.html(gridLevelTotalPrice);
343
344                    selectedVariants.push({
345                        id: skuId,
346                        size: $(quantities[index]).siblings('.variant-prop').data('variant-prop'),
347                        quantity: quantity,
348                        total: gridLevelTotalPrice
349                    });
350                }
351            });
352
353            if (selectedVariants.length != 0) {
354                $.tmpl(ACC.productorderform.$variantSummaryTemplate, {
355                    variants: selectedVariants
356                }).appendTo($(currentTable).addClass('selected'));
357                $(currentTable).find('.variant-summary .variant-property').html($(currentTable).find('.variant-detail').data('variant-property'));
358                $(currentTable).data(ACC.productorderform.selectedVariantData, selectedVariants);
359            }
360        });
361
362    },
363
364    bindMultidCartProduct: function () {
365        // link to display the multi-d grid in read-only mode
366        $(document).on("click",'.showQuantityProduct', function (event){
367            ACC.multidgrid.populateAndShowGrid(this, event, true);
368        });
369
370        // link to display the multi-d grid in read-only mode
371        $(document).on("click",'.showQuantityProductOverlay', function (event){
372            ACC.multidgrid.populateAndShowGridOverlay(this, event);
373        });
374
375    },
376
377    bindApplyVoucher: function () {
378
379        $(".js-voucher-apply-btn").on("click", function (e) {
380            var voucherCodeVal = $(this).parents('#applyVoucherForm').find('.js-voucher-code-text').val();
381            $(".js-voucher-code-text").val(voucherCodeVal);
382            ACC.cart.handleApplyVoucher(e, voucherCodeVal);
383        });
384
385        $(".js-voucher-code-text").on("keypress", function (e) {
386            var voucherCodeVal = $(this).val();
387            $(".js-voucher-code-text").val(voucherCodeVal);
388            var code = (e.keyCode ? e.keyCode : e.which);
389            if (code == 13) {
390                ACC.cart.handleApplyVoucher(e, voucherCodeVal);
391            }
392           
393        });
394        $(".js-voucher-code-text").keyup(function() {
395        	
396        	  var voucherCode = $(this).val().length;
397            if (voucherCode == 0) {
398            	 $(".validationCoupon").hide();
399            }
400        });
401      },
402
403    handleApplyVoucher: function (e, voucherVal) {
404        var voucherCode = $.trim(voucherVal);
405        if (voucherCode != '' && voucherCode.length > 0) {
406             if ($(window).width() > 991) {
407                 sessionStorage.setItem("cartPageScroll", $(e.currentTarget).parents(".table-summarize").offset().top);
408            }
409            $("#applyVoucherForm").submit();
410        }
411    },
412
413    bindToReleaseVoucher: function () {
414        $('.js-release-voucher-remove-btn').on("click", function (event) {
415            sessionStorage.setItem("cartPageScroll", $(this).offset().top);
416            $(this).closest('form').submit();
417        });
418    },
419    //Cart page placeOrder submit and validation
420    bindCartPlaceOrder: function () {
421    	
422    	 $('.js-cart-placeOrder').on("click", function (event) {
423             
424    		 $(this).closest('form').submit();
425    		
426         });
427    	 
428    	 $(".backOrderCartUpdate").click(function(){
429    	$('#parLoading').show();
430            var formId=$(this).attr("id");
431            var form = $('.'+formId);
432            var productCode = form.find('input[name=productCode]').val();
433            var initialCartQuantity = form.find('input[name=initialQuantity]').val();
434            var isBackOrderEnabled = form.find('input[name=isBackOrderEnabled]').val();
435            var newCartQuantity = form.find('input[name=quantity]').val()?form.find('input[name=quantity]').val():form.find('select[name=quantity]').val();
436                ACC.track.trackUpdateCart(productCode, initialCartQuantity, newCartQuantity);
437                sessionStorage.setItem("cartPageScroll", $(this).offset().top+100);
438                form.submit();
439                return true;
440            $('#parLoading').hide();
441            return false;
442        });
443    },
444    bindProductCodeToWishList: function () {
445    
446   //On cart page load it will add product code to js-wishListPopup div 
447   if($('.cart-list .product').length>0)
448      {
449   	   var productList = [];
450   	   var productOutletPromoFlagList = [];
451   	   var productOutletDiscountList = [];
452   	 $('.cart-list .product').each(function () {        		
453    		
454   		 var productCode=$(this).find('.js-execute-entry-action-button').attr("data-entry-product-code"); 
455   		 var productOultetPromoFlag=$(this).find('.js-execute-entry-action-button').attr("data-entry-product-outlet-promo-flag"); 
456   		 var productOutletDiscount=$(this).find('.js-execute-entry-action-button').attr("data-entry-product-outlet-discount"); 
457   		 if (productCode) {  
458               productList.push(productCode);
459               productOutletPromoFlagList.push(productOultetPromoFlag);
460               productOutletDiscountList.push(productOutletDiscount);
461          }
462           
463   		
464   	   });
465   	 $('.js-wishListPopup').attr('data-product-code', productList);
466   	 $('.js-wishListPopup').attr('data-outlet-promo-flag', productOutletPromoFlagList);
467   	 $('.js-wishListPopup').attr('data-outlet-discount', productOutletDiscountList);
468		  	
469       }
470    },
471
472    bindCartAlertDismiss: function() {
473        $('[data-dismiss="alert"]').click(function() {
474           $(this).parents().find('.global-alerts').removeClass('global-alerts');
475        });
476        if ($(window).width() > 991) {
477            setTimeout(function(){
478                $('.globalMessagesCart .global-alerts .alert-info').remove();
479            }, 10000);
480        }
481    },
482
483    bindPotentialPromotion: function() {
484        if ($(window).width() < 992) {
485            var cartElement = $('.cart-page-list .table-wrap .table-cart').first();
486            cartElement.prepend($('.cartpotproline'));
487            cartElement.prepend($('#ajaxCartPotentialPromotionSection'));
488        }
489
490    },
491
492    bindDisableSubmitButtonOnFormSubmit:function(){
493		$("form").submit(function(){
494			var isDisableBtn = false;
495			if($(this).closest(".page-cartPage").length > 0){
496				isDisableBtn = true;
497			}
498			if($(this).closest(".page-multiStepCheckoutSummaryPage").length > 0 ){
499				isDisableBtn = true;
500			}
501			
502			if(isDisableBtn){
503				var btn = $(this).find("button").attr("disabled","disabled");
504				$(this).find("a.btn-primary").attr("disabled","disabled");
505			}
506			
507		});
508		
509	},
510    bindStickyCartBtn: function() {
511        if($(window).width() > 991 && $("body").hasClass('page-cartPage') && $(".table-wrap--summarize").length) {
512                if(sessionStorage.getItem("cartPageScroll") != null && sessionStorage.getItem("cartPageScroll") != undefined){
513                    var cartScrollPosition = sessionStorage.getItem("cartPageScroll");
514                    if(cartScrollPosition > window.innerHeight) {
515                        $('html, body').animate({
516						   // 'scrollTop' : cartScrollPosition-140
517                            'scrollTop' : cartScrollPosition-($('.globalMessagesCart').height()+200)
518					    });
519                    }
520                    sessionStorage.removeItem("cartPageScroll");
521                }
522                if(($(window).outerHeight()+$(window).scrollTop()) > $(".cart-page-wishList").offset().top) {
523                    $('.cartSticky-Desktop').fadeOut(500);
524                } else {
525                    $('.cartSticky-Desktop').fadeIn(500);
526                }
527                var $globalmessagesContainer = $('.cart-wrapper .globalMessagesCart');
528                if($(window).scrollTop() > $(".cart-thead").offset().top-40) {
529                    $('.cart-wrapper .globalMessagesCart .stickyPlaceholder').addClass('container');
530                    if($('.nav-desktop').hasClass('nav-down')) {
531                        $globalmessagesContainer.addClass('stickyNavMessages').removeClass('stickyMessages');
532                    }
533                    else {
534                        $globalmessagesContainer.addClass('stickyMessages').removeClass('stickyNavMessages');
535                    }
536                } else {
537                    $('.cart-wrapper .globalMessagesCart .stickyPlaceholder').removeClass('container');
538                    $globalmessagesContainer.removeClass('stickyMessages stickyNavMessages');
539                }
540                
541                var ScrolledCart;
542                $(window).scroll(function(event){
543                    ScrolledCart = true;
544                });
545
546                setInterval(function() {
547                    if (ScrolledCart) {
548                        hasScrolledCart();
549                        ScrolledCart = false;
550                    }
551                }, 200);
552
553                function hasScrolledCart() {
554                    if(($(window).outerHeight()+$(window).scrollTop()) > $(".cart-page-wishList").offset().top) {
555                        $('.cartSticky-Desktop').fadeOut(500);
556                    } else {
557                        $('.cartSticky-Desktop').fadeIn(500);
558                    }
559
560                    if(($(window).scrollTop() > $(".cart-thead").offset().top-40) || ($('.nav-desktop').hasClass('nav-down') && $(window).scrollTop() > $(".cart-thead").offset().top-80)) {
561                        $('.cart-wrapper .globalMessagesCart .stickyPlaceholder').addClass('container');
562                        if($('.nav-desktop').hasClass('nav-down')) {
563                            $globalmessagesContainer.addClass('stickyNavMessages').removeClass('stickyMessages');
564                            $('.nav-desktop').addClass('cartStickyBar');
565                        }
566                        else {
567                           $globalmessagesContainer.addClass('stickyMessages').removeClass('stickyNavMessages');
568                           $('.nav-desktop').removeClass('cartStickyBar');
569                        }
570                    } else {
571                        $('.cart-wrapper .globalMessagesCart .stickyPlaceholder').removeClass('container');
572                       $globalmessagesContainer.removeClass('stickyMessages stickyNavMessages');
573                        $('.nav-desktop').removeClass('cartStickyBar');
574                    }
575                }	
576                
577        }
578    }
579    };
580$(function() {
581
582	try{
583
584		/* @author: 1digitals
585	 	 * 
586	 	 * .free class adds a grey background to the promotion products in entryRootGroup tag free class is added 
587	 	for products having promotion, but promotion may not be applied in those scenarios we should be toggling the grey background*/
588		
589		var promoCodeOne = getEntryNumbersFromPromoCodeOne();
590	 	removeDuplicateEntriesFromPromoCodeTwo(promoCodeOne);
591	 	function getEntryNumbersFromPromoCodeOne(){
592	 		var entryNums = [];
593	 		$.each($(".promotionCode.one"), function(i,e){
594	 			entryNums.push($(e).attr("entrynum"));
595	 		});
596	 		return entryNums;
597	 	}
598	 	function removeDuplicateEntriesFromPromoCodeTwo(entryNums){
599	 		$.each($(".promotionCode.two"), function(i,e){
600	 			if(entryNums.indexOf($(e).attr("entrynum")) !== -1){
601	 				$(e).remove();
602	 			} 
603	 		});
604	 	}
605		
606		 	var freeProductTitleList = $(".promotion-bundle-title");
607		 	var promotionCode = $(".promotionCode");
608		 	var entryNumbers = [];
609		 	var cartPickList = $("div[data-cartpicklist]");
610		 	
611		 	if(freeProductTitleList.length <= 0){
612		 		
613		 		$(".product").removeClass("free");
614		 	}else{
615		 		var titleList = [];
616		 		$.each(freeProductTitleList,function(index,title){
617		 			titleList.push($(title).attr("promotionTitle"));
618	 			});
619		 		$.each(promotionCode,function(index,ele){
620		 			var productCode = $(ele).attr("productCode");
621		 			if(!titleList.includes(ele.value)){		 				
622		 				$(".product[productCode='"+productCode+"']").removeClass("free");
623		 				$(".recommended[sourceproduct='"+productCode+"']").hide();
624		 			}else{
625                        $(".product[productCode='"+productCode+"']").addClass("free");
626		 				
627		 			}
628		 					 			
629		 		});
630		 	}
631		 	/* SW-1007,SW-1427
632		 	 * A foreach loop to group products based on promotion name, entry number
633		 	 */
634		 	
635		 	$.each(freeProductTitleList,function(index,ele){
636	 			var promotionTitle = $(ele).attr("promotiontitle");
637	 			var productCodeList = getProductCodeHavingPromotion(promotionTitle);
638	 			var entryNumberCodeList = getEntryNumberHavingPromotion(promotionTitle);
639	 			
640	 			$.each(entryNumberCodeList,function(index,entryCode){
641		 			var productRow = $(".product[entrynumber='"+entryCode+"']");
642		 		
643		 				$.each(productRow,function(index,product){
644		 					if($.inArray($(product).attr("entrynumber"),entryNumbers)<0){
645			 					if(!$(product).hasClass("free-product")){
646					 			if($(product).next('tr').is('.outofstock, .avaibility'))
647                                   {
648                                        var oosEle = $(product).next('tr'); 
649                                        $(ele).after(oosEle);
650                                        $(ele).after($(product));  
651                                    }else{
652                                        $(ele).after($(product)); 
653                                    }       
654                             }else{
655                                if($(product).next('tr').is('.outofstock, .avaibility'))
656                                {
657                                    var oosEle = $(product).next('tr');
658                                    $("tr[promotionTitle='"+promotionTitle+"']").after(oosEle);
659                                    $("tr[promotionTitle='"+promotionTitle+"']").after($(product));
660                                }else{
661                                    $("tr[promotionTitle='"+promotionTitle+"']").after($(product));
662                                }   
663                             }
664			 					entryNumbers.push($(product).attr("entrynumber"));
665		 					}
666		 				});
667		 			 			
668		 		});
669	 			hideRecProRowForPromotionProduct(productCodeList);	
670		 	});
671		
672		 	
673		 	/*	WEB-381 */
674		 	var lastProductRowIndex = $("tr.product").length -1;
675		 	var lastProductRow = $("tr.product")[lastProductRowIndex];
676		 	var sourceProductCode = $(lastProductRow).attr("productcode");
677		 	var lastRecProductRowIndex = $('.recommended[sourceproduct="'+sourceProductCode+'"]').length -1;
678		 	var lastRecProductRow = $('.recommended[sourceproduct="'+sourceProductCode+'"]')[lastRecProductRowIndex];
679		 	if(!$(lastRecProductRow).hasClass("promoRecommended")){
680		 		$(lastRecProductRow).removeClass("hide");
681			 	$(lastRecProductRow).show();
682		 	}
683		 	
684		 	/*$.each(freeProductTitleList,function(index,ele){
685	 			var promotionTitle = $(ele).attr("promotiontitle");
686	 			var productCodeList = getProductCodeHavingPromotion(promotionTitle);
687	 			var productCodeEntered = [];
688	 			
689	 			$.each(productCodeList,function(index,productCode){
690		 			var productRow = $(".product[productCode='"+productCode+"']");
691		 		
692		 				$.each(productRow,function(index,product){
693		 					if($.inArray($(product).attr("productCode"),productCodeEntered)<0 &&
694		 							$.inArray($(product).attr("entrynumber"),entryNumbers)<0){
695			 					if(!$(product).hasClass("free-product")){
696					 				$(ele).after($(product));		
697					 			}else{
698					 				
699					 				//var elements = $("input[productCode='"+$(product).attr("productCode")+"']");
700					 				var elements = $("input[productCode='"+$(product).attr("productCode")+"'][value='"+promotionTitle+"']");
701					 				$.each(elements,function(index,ele){
702					 					var title = $(ele).attr("promotionTitle");
703					 					if(title == promotionTitle){
704					 						$("tr[promotionTitle='"+promotionTitle+"']").after($(product));
705					 					}
706					 				});
707					 			}
708			 					productCodeEntered.push($(product).attr("productCode"));
709			 					entryNumbers.push($(product).attr("entrynumber"));
710		 					}
711		 				});
712		 			 			
713		 		});
714	 			hideRecProRowForPromotionProduct(productCodeList);	 			
715	 		});*/
716		 	
717		 	/* SW-1007,SW-1427
718		 	 * Method to get product code list based on promotion title
719		 	 * Input element with type hidden and class promotionCode are is added to DOM with productCode and promotionTile as value
720		 	 * 
721		 	 * */
722		 	function getProductCodeHavingPromotion(promotionTitle){
723		 		var productCodeList = [];
724		 		$.each(promotionCode,function(index,ele){
725		 			var productCode = $(ele).attr("productCode");
726		 			if(promotionTitle == ele.value){		 				
727		 				productCodeList.push(productCode);
728		 			}
729		 					 			
730		 		});
731		 		return productCodeList;
732		 	}
733		 	
734		 	function getEntryNumberHavingPromotion(promotionTitle){
735		 		var entryNumberCodeList = [];
736		 		$.each($(promotionCode),function(index,ele){
737		 			if(promotionTitle === ele.value){		 	
738		 				var entryNumberCode = $(ele).attr("entrynum");
739		 				entryNumberCodeList.push(entryNumberCode);
740		 			}
741		 					 			
742		 		});
743		 		return entryNumberCodeList;
744		 	}
745		 	
746		 	/*
747		 	 * SW-1427
748		 	 * Function to hide recommended product row for 
749		 	 * product part of promotion
750		 	 * 
751		 	 */
752		 	function hideRecProRowForPromotionProduct(productCodeList){
753		 		var recProducts = $(".recommended");
754		 		
755		 		$.each(recProducts,function(index,product){
756		 			var sourceProductCode = $(product).attr("sourceProduct");
757		 			if(productCodeList.includes(sourceProductCode)){
758		 				$(".recommended[sourceProduct='"+sourceProductCode+"']").hide();
759		 				$(".recommended[sourceproduct='"+sourceProductCode+"']").addClass("promoRecommended");
760		 			}
761		 		});
762		 	}
763		 	
764		 	//Update Quantity for recommended product row
765		 	$('.mirrorpdpAddtoCartInput').on("keyup change",function () {
766	    		 var value = $(this).val();
767	    		 $(this).val(value);
768	    		 $(this).closest(".recommended").find('.qty_rec_product').val(value);
769	    		
770	    	 });
771		 	
772		 	//Remove recommended product row and add to a list in a session object
773		 	$(".recommendedProductRemove").click(function(){		 		
774		 		$(this).closest(".recommended").remove();
775
776		 	});
777		 	
778		 	//Remove entries from grouping if not part of any promotion
779		 	$.each($("tr[entrynumber]"),function(index,ele){
780	 			var entryNum = $(ele).attr("entrynumber");
781	 			var splittedEntry = $(ele).attr("splittedEntry");
782	 			if(entryNumbers.includes(entryNum) && splittedEntry == "false"){
783	 				$(".product[entrynumber='"+entryNum+"']").addClass("free");
784	 			} else{
785 	 				$(".product[entrynumber='"+entryNum+"']").removeClass("free");
786	 			}
787	 					 			
788	 		});
789
790		 	
791		 	//Add recommended product to cart and page refresh
792			$(".recommendedAddToCart").click(function(e){
793		 		e.preventDefault();
794				$('#parLoading').show();
795		 	    var url = $(this).closest("form").attr('action');
796		 		$.ajax({
797		 	           type: "POST",
798		 	           url: url,
799		 	           data: $(this).closest("form").serialize(), // serializes the form's elements.
800		 	           success: function (response) {
801		 	        	if(!ACC.product.isEmpty(response)) {
802		 	        	  if (!ACC.product.isEmpty(response.oosProductInUnappliedPromotion)) {
803			 	        		 $('#promotionOOSProductModal').modal('show');
804			 	        		 $('#promotionOOSProductModal .errorMessageSection').html(htmlDecode(response.oosProductInUnappliedPromotion));
805			 	        		 $('body').find('div').removeClass('modal-backdrop');
806			 	        		 $(document).on("hidden.bs.modal","#promotionOOSProductModal",function(e){
807			 	        			 window.location.href = window.location.href;
808			 	        		 });
809			 	        } else if (!ACC.product.isEmpty(response.errorMessage.volumeRestrictedQty)
809) {
810		 	        		  $('.recommended:not(.hide) #recommendedProductMessageModal').modal('show');
811		 	        		  $('.recommended:not(.hide) #recommendedProductMessageModal .volumeRestriction').removeClass("hidden");
812		 	        		  $('.recommended:not(.hide) #recommendedProductMessageModal #volumeRestrictedQuantity').text(response.errorMessage.volumeRestrictedQtyValue);
813		 	        		  $('body').find('div').removeClass('modal-backdrop');
814		 	        	  }	else if (!ACC.product.isEmpty(response.errorMessage.priceRowNotFound)) {
815		 	        		 $('.recommended:not(.hide) #recommendedProductMessageModal').modal('show');
816		 	        		 $('.recommended:not(.hide) #recommendedProductMessageModal .priceRowNotFound').removeClass("hidden");
817		 	          		 $('body').find('div').removeClass('modal-backdrop');
818		 	        	  } else if (!ACC.product.isEmpty(response.errorMessage.maxOrderQuantityExceeded)) {
819		 	        		 $('.recommended:not(.hide) #recommendedProductMessageModal').modal('show');
820		 	        		 $('.recommended:not(.hide) #recommendedProductMessageModal .maxOrderQuantityExceeded').removeClass("hidden");
821		 	          		 $('body').find('div').removeClass('modal-backdrop');
822		 	           	  } else if (!ACC.product.isEmpty(response.errorMessage.noStock)) {
823		 	           		$('.recommended:not(.hide) #recommendedProductMessageModal').modal('show');
824		 	           		$('.recommended:not(.hide) #recommendedProductMessageModal .noStock').removeClass("hidden");
825		 	              	$('body').find('div').removeClass('modal-backdrop');
826		 	           	  } else if (!ACC.product.isEmpty(response.errorMessage.lowStock)) {
827		 	           		$('.recommended:not(.hide) #recommendedProductMessageModal').modal('show');
828		 	           		$('.recommended:not(.hide) #recommendedProductMessageModal .lowStock').removeClass("hidden");
829		 	          		$('body').find('div').removeClass('modal-backdrop');
830		 	           	  } else if (!ACC.product.isEmpty(response.errorMessage.reduceMaxOrderQuantityExceeded)) {
831		 	           		$('.recommended:not(.hide) #recommendedProductMessageModal').modal('show');
832		 	           		$('.recommended:not(.hide) #recommendedProductMessageModal .reduceMaxOrderQuantityExceeded').removeClass("hidden");
833		 	              	$('body').find('div').removeClass('modal-backdrop');
834		 	           	  } else {
835			            	 console.log("recommended product added successfully ");
836			            	 window.location.href = window.location.href;
837		 	           	  }
838		 	        	} else {
839		 	        			console.log("Error occured for recommended product ");
840		 	        			$('#parLoading').hide();
841		 	        	}
842			             },
843			             error: function (response) {
844			                 console.log("Error occured for recommended product ");
845							 $('#parLoading').hide();
846			             }
847		 	         });
848		 	});
849			
850			$(document).on("hidden.bs.modal","#recommendedProductMessageModal",function(e){
851				window.location.href = window.location.href;
852			});
853		 	//Clear jquery session object on logout
854		 	$("#salon-logout").click(function(){
855		 		$.session.clear();
856		 	});
857		 	//Clear jquery session object on login
858		 	$(".btn-login-custom").click(function(){
859		 		$.session.clear();
860		 	});
861		 	
862		 	
863		 	if(cartPickList.attr("data-cartpicklist") == "true"){
864		 		cartPickList.removeClass("hide");
865		 		$('#modal-promotion-products-display .modal-content').replaceWith(cartPickList);
866		 		$('#modal-promotion-products-display').modal();
867                 ACC.product.bindqtyValue();
868		        //ACC.productDetail.checkDropDownForPopup();
869		 	}
870		 	
871		 	$("tr[class='avaibility'] input[name='entryNumber']").each(function(){
872		 		$("tr[entrynumber="+$(this).val()+"]").after($(this).parent());
873		 	})
874             $.each($("tr.free"),function(index,ele){
875                var thisIndex = this.rowIndex+1;
876                console.log(this.rowIndex);
877                console.log(thisIndex);
878                if(!$('.table-cart tr:eq('+thisIndex+')').hasClass('free') && !$('.table-cart tr:eq('+thisIndex+')').hasClass('avaibility') && !$('.table-cart tr:eq('+thisIndex+')').hasClass('outofstock')){
879                    $(this).css("border-bottom", "2px solid #ebebeb" );
880                }              
881            });
882            $.each($("tr.promotion-bundle-title, tr.cart-bundle-details"),function(index,ele){
883                var thisIndex = this.rowIndex-1;
884                if($('.table-cart tr:eq('+thisIndex+')').hasClass('free') || $('.table-cart tr:eq('+thisIndex+')').hasClass('last-bundle-product') ){
885                   $('<tr class="emptySpace"><td></td></tr>').insertBefore($(this))
886                }              
887            });
888		 	
889	}catch(err){
890		
891	}
892
893	$(".showLoader").click(function(e){
894		var disablePlaceOrderButton=$('.disablePlaceOrderButton').attr("js-disable-place-order-button");
895    	if(disablePlaceOrderButton != "true")
896    		{
897		$('#parLoading').show();
898    		}
899	});
900	
901	$(".freeSelection").click(function(e) {
902		e.preventDefault();
903		var promotionCodeDetails = $(this).attr("promotionCode");
904		var productCode = $(".promotionCode.two." + promotionCodeDetails).attr("productCode");
905		var entryNumber = $(".promotionCode.two." + promotionCodeDetails).attr("entryNum");
906
907		$.ajax({
908			url: ACC.config.encodedContextPath + "/picklist/edit",
909			type: 'POST',
910			data: { "entryNumber": entryNumber, "productCode": productCode },
911			async: false,
912			dataType: "text",
913			success: function(response) {
914				console.log("Success");
915				console.log(response);
916				var result = $.parseJSON(response);
917				$('#modal-promotion-products-display .modal-content').replaceWith(result.addToCartLayer);
918				$('#modal-promotion-products-display').modal();
919				
920				ACC.productDetail.checkDropDownForPopup();
921				ACC.product.bindSelectDisplay();
922                ACC.product.bindqtyValue();
923					
924                
925			},
926			error: function(error) {
927				console.log("error");
928				console.log(error);
929				$('#modal-promotion-products-display .modal-content').replaceWith(error.responseText);
930				$('#modal-promotion-products-display').modal();
931			}
932		});
933	});
934	
935});
936
937function htmlDecode(input) {
938	  var doc = new DOMParser().parseFromString(input, "text/html");
939	  return doc.documentElement.textContent;
940}
941function statcb(result) {
942    alert(result.status);
943    if (result.status) {
944        console.log(result.status);
945    }
946 }
947 
948 
949$(".cartLoader").click(function(e){
950	$("#showLoading").show();
951});
952

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.