PageSourceSearch

https://www.discountschoolsupply.com/_ui/responsive/common/js/acc.quickorder.js?v=S530

js discountschoolsupply.com collected 2026-09-25 18:18:44 UTC 16,248 bytes, 347 lines download raw bytes

1var ACC = ACC || {}; // make sure ACC is available
2
3if ($("#quickOrder").length > 0) {
4    ACC.quickorder = {
5        _autoload: [
6            "bindClearQuickOrderRow",
7            "bindAddSkuInputRow",
8            "bindResetFormBtn",
9            "bindAddToCartClick",
10            "bindPreLoadProducts"
11        ],
12
13        $quickOrderContainer: $('.js-quick-order-container'),
14        $quickOrderMinRows: Number($('.js-quick-order-container').data('quickOrderMinRows')),
15        $quickOrderMaxRows: Number($('.js-quick-order-container').data('quickOrderMaxRows')),
16        $productExistsInFormMsg: $('.js-quick-order-container').data('productExistsInFormMsg'),
17        $quickOrderLeavePageMsg: $('#quickOrder').data('gridConfirmMessage'),
18        $hiddenSkuInput: 'input.js-hidden-sku-field',
19        $addToCartBtn: $('#js-add-to-cart-quick-order-btn-top, #js-add-to-cart-quick-order-btn-bottom'),
20        $resetFormBtn: $('#js-reset-quick-order-form-btn-top, #js-reset-quick-order-form-btn-bottom'),
21        $productInfoContainer: '.js-product-info',
22        $skuInputField: '.js-sku-input-field',
23        $qtyInputField: '.js-quick-order-qty',
24        $jsLiContainer: 'li.js-li-container',
25        $removeQuickOrderRowBtn: '.js-remove-quick-order-row',
26        $skuValidationContainer: '.js-sku-validation-container',
27        $qtyValidationContainer: '.js-qty-validation-container',
28        $productItemTotal: '.js-quick-order-item-total',
29        $classHasError: 'has-error',
30
31        bindResetFormBtn: function () {
32            ACC.quickorder.$resetFormBtn.on("click", ACC.quickorder.clearForm);
33        },
34
35        bindAddToCartClick: function () {
36            ACC.quickorder.$addToCartBtn.on("click", ACC.quickorder.addToCart);
37        },
38
39        bindAddSkuInputRow: function () {
40            $(ACC.quickorder.$skuInputField).on("focusin", ACC.quickorder.addInputRow).on("focusout keydown", ACC.quickorder.handleFocusOutOnSkuInput);
41        },
42
43        bindPreLoadProducts: function () {
44            var inputs = $(ACC.quickorder.$skuInputField),
45                value;
46
47            inputs.each(function(x, el){
48                value = $(el).val();
49                if(value.length && value.length > 0) {
50                    ACC.quickorder.handleGetProduct(null, el);
51                }
52            });
53        },
54
55        bindClearQuickOrderRow: function () {
56            $(ACC.quickorder.$removeQuickOrderRowBtn).on("mousedown", function(){
57                ACC.quickorder.clearQuickOrderRow(this);
58            });
59        },
60
61        addToCart: function () {
62            ACC.global.showLoadingScreen();
63            $.ajax({
64                url: ACC.quickorder.$quickOrderContainer.data('quickOrderAddToCartUrl'),
65                type: 'POST',
66                dataType: 'json',
67                contentType: 'application/json',
68                data: ACC.quickorder.getJSONDataForAddToCart(),
69                async: false,
70                success: function (response) {
71                    ACC.quickorder.handleAddToCartSuccess(response);
72                    // Push Quick Order product analytics data to GTM.
73                    // This data is used for Google Analytics and Bloomreach Add to Cart tracking.
74                    addQuickOrderdataToGTM(response.gtmCartAnalyticsData);
75                },
76                error: function (jqXHR, textStatus, errorThrown) {
77                    // log the error to the console
78                    console.log("The following error occurred: " + textStatus, errorThrown);
79                }
80            });
81        },
82
83        handleAddToCartSuccess: function (response) {
84            var lookup = {};
85            response.quickOrderErrorData.forEach(function (el) {
86                lookup[el.sku] = el.errorMsg;
87            });
88
89            $(ACC.quickorder.$qtyInputField).each(function () {
90                var parentLi = ACC.quickorder.getCurrentParentLi(this);
91                var sku = ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuInputField).val();
92                var errorMsg = lookup[sku];
93
94                if (errorMsg) {
95                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer).text(errorMsg);
96                }
97                else {
98                    ACC.quickorder.clearQuickOrderRow(this);
99                }
100            });
101            ACC.global.hideLoadingScreen();
102            ACC.product.displayAddToCartPopup(response);
103        },
104
105        getJSONDataForAddToCart: function () {
106            var skusAsJSON = [];
107            $(ACC.quickorder.$qtyInputField).each(function () {
108                var qty = Number($(this).val());
109                if (qty > 0) {
110                    var sku = jQuery.trim(ACC.quickorder.findElementInCurrentParentLi(this, ".js-quickorder-code").val());
111                    skusAsJSON.push({"product": {"code": sku}, "quantity": qty});
112                }
113            });
114            return JSON.stringify({"cartEntries": skusAsJSON});
115        },
116
117        handleFocusOutOnSkuInput: function (event) {
118        	var key = event.charCode ? event.charCode : event.keyCode ? event.keyCode : 0;
119        	if (key == 13) {
120        		$(event.target).focusout();
121        	}
122        	if (event.type == "focusout") {
123        		ACC.quickorder.handleGetProduct(event);
124        	}
125        },
126
127        handleFocusOutOnQtyInput: function (event) {
128        	var key = event.charCode ? event.charCode : event.keyCode ? event.keyCode : 0;
129        	if (key == 13) {	
130        		event.preventDefault();
131        		var parentLi = ACC.quickorder.getCurrentParentLi(event.target);        		
132        		parentLi.next().find(ACC.quickorder.$skuInputField).focus();
133        		$(event.target).focusout();
134        	}
135        	if (event.type == "focusout") {
136        		ACC.quickorder.validateAndUpdateItemTotal(event);
137        		ACC.quickorder.enableDisableAddToCartBtn();
138        	}
139        },
140
141        clearForm: function () {
142        	window.location.reload();
143        },
144
145        validateAndUpdateItemTotal: function (event) {
146            var parentLi = ACC.quickorder.getCurrentParentLi(event.target);
147            var qtyValue = jQuery.trim(ACC.productorderform.filterSkuEntry($(event.target).val()));
148            if (isNaN(qtyValue) || qtyValue == "") {
149                qtyValue = 0;
150                $(event.target).removeClass(ACC.quickorder.$classHasError);
151                ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyValidationContainer).text('');
152                $(event.target).val(0);
153            }
154            else {
155                qtyValue = Number(qtyValue);
156                $(event.target).val(qtyValue);
157                var maxQty = jQuery.trim(ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyInputField).data('maxProductQty'));
158                var stockLevelStatus = jQuery.trim(ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyInputField).data('stockLevelStatus'));
159                maxQty = ($.isEmptyObject(maxQty) && stockLevelStatus == "inStock") ? "FORCE_IN_STOCK" : Number(maxQty);
160                if (!isNaN(maxQty) && qtyValue > maxQty) {
161                    $(event.target).addClass(ACC.quickorder.$classHasError);
162                    var qtyValidationContainer = ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyValidationContainer);
163                    qtyValidationContainer.text(qtyValidationContainer.data('maxProductQtyMsg'));
164                    qtyValue = maxQty;
165                    $(event.target).val(maxQty);
166                }
167                else {
168                    $(event.target).removeClass(ACC.quickorder.$classHasError);
169                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyValidationContainer).text('');
170                }
171            }
172
173            if (qtyValue > 0) {
174                var itemPrice = parseFloat(ACC.quickorder.findElement(parentLi, '.js-product-price').data('productPrice'));
175                ACC.quickorder.findElement(parentLi, ACC.quickorder.$productItemTotal)
176                    .html(ACC.productorderform.formatTotalsCurrency(itemPrice * qtyValue));
177            }
178            else {
179                ACC.quickorder.findElement(parentLi, ACC.quickorder.$productItemTotal).text('');
180            }
181        },
182
183        clearQuickOrderRow: function (el) {
184            var quickOrderMinRows = ACC.quickorder.$quickOrderMinRows;
185            var input = (el && el != null) ? el : this;
186            var parentLi = ACC.quickorder.getCurrentParentLi(input);
187            if ($('.js-ul-container li.js-li-container').length > quickOrderMinRows && !parentLi.is(':last-child')) {
188                parentLi.remove();
189
190                if($('.js-ul-container li.js-li-container:last-child').find(ACC.quickorder.$productInfoContainer).length > 0) {
191                    ACC.quickorder.addInputRow(true);
192                }
193            }
194            else {
195                ACC.quickorder.findElement(parentLi, ACC.quickorder.$productInfoContainer).remove();
196                ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer).text('');
197                ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuInputField).val('');
198                ACC.quickorder.findElement(parentLi, ACC.quickorder.$hiddenSkuInput).val('');
199            }
200            ACC.quickorder.enableDisableAddToCartBtn();
201        },
202
203        addInputRow: function (event) {
204
205            if ((event == true || $('.js-quick-order-container li.js-li-container:last-child').find(ACC.quickorder.$skuInputField).is($(event.target))) &&
206                $(ACC.quickorder.$jsLiContainer).length < ACC.quickorder.$quickOrderMaxRows) {
207                var liClone = $('.js-quick-order-container li.js-li-container:first').clone();
208                ACC.quickorder.findElement(liClone, ACC.quickorder.$productInfoContainer).remove();
209                ACC.quickorder.findElement(liClone, ACC.quickorder.$skuValidationContainer).text('');
210                ACC.quickorder.findElement(liClone, ACC.quickorder.$hiddenSkuInput).val('');
211                var currentSkuInputField = ACC.quickorder.findElement(liClone, ACC.quickorder.$skuInputField);
212                currentSkuInputField.val('');
213                currentSkuInputField.focusin(ACC.quickorder.addInputRow).focusout(ACC.quickorder.handleFocusOutOnSkuInput).keydown(ACC.quickorder.handleFocusOutOnSkuInput);
214                ACC.quickorder.findElement(liClone, ACC.quickorder.$removeQuickOrderRowBtn).click(function(){ ACC.quickorder.clearQuickOrderRow(this); });
215                $('.js-ul-container').append(liClone);
216            }
217        },
218
219        handleGetProduct: function (event, el) {
220            var input = el;
221            if(event && null !== event) {
222                input = event.target;
223            }
224            var parentLi = ACC.quickorder.getCurrentParentLi(input);
225            var productCode = $.trim(input.value);
226            $(input).val(productCode);
227            if (productCode.length > 0) {
228                ACC.quickorder.findElement(parentLi, ACC.quickorder.$productInfoContainer).remove();
229
230                if (ACC.quickorder.isDuplicateSku(input, productCode)) {
231                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer).text(ACC.quickorder.$productExistsInFormMsg);
232                }
233                else {
234                    ACC.quickorder.getAndDisplayProductInfo(input, parentLi, productCode);
235                }
236                ACC.quickorder.findElement(parentLi, ACC.quickorder.$hiddenSkuInput).val(productCode);
237            }
238        },
239
240        isCurrentSkuSameAsPrevious: function (parentLi, productCode) {
241            return ACC.quickorder.findElement(parentLi, ACC.quickorder.$hiddenSkuInput).val() == productCode;
242        },
243
244        isDuplicateSku: function (currentInput, productCode) {
245            var exists = false;
246            $(ACC.quickorder.$skuInputField).each(function () {
247                if ($(this).val() == productCode && !$(this).is($(currentInput))) {
248                    exists = true;
249                    return false
250                }
251            });
252            return exists;
253        },
254
255        getAndDisplayProductInfo: function (input, parentLi, productCode) {
256            var url = ACC.config.encodedContextPath + '/quickOrder/productInfo?code=' + encodeURIComponent(productCode);
257            $.getJSON(url, function (result) {
258
259                var newProductCode = result.productData && result.productData.code ? result.productData.code : null,
260                    productsAdded = $("input.js-quickorder-code"),
261                    productExist = false;
262
263                $.each(productsAdded, function(key, el){
264                    if($(el).val() == newProductCode) {
265                        productExist = true;
266                    }
267                });
268
269                if(productExist == true) {
270                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer).text(ACC.quickorder.$productExistsInFormMsg);
271                }
272
273                if (result.errorMsg != null && result.errorMsg.length > 0) {
274                    $(input).addClass(ACC.quickorder.$classHasError);
275                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer).text(result.errorMsg);
276                }
277                else if(productExist == false){
278                    $(input).removeClass(ACC.quickorder.$classHasError);
279                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer).text('');
280                    $('#quickOrderRowTemplate').tmpl(result.productData).insertAfter(ACC.quickorder.findElement(parentLi, '.js-sku-container'));
281                    var qtyInputField = ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyInputField);
282                    qtyInputField.focusout(ACC.quickorder.handleFocusOutOnQtyInput).keydown(ACC.quickorder.handleFocusOutOnQtyInput);
283                    var stockLevelStatus = result.productData.stock.stockLevelStatus.code;
284                    if (stockLevelStatus == "outOfStock") {
285                        qtyInputField.val(0);
286                        qtyInputField.prop('disabled', true);
287                    }
288                    else {
289                    	qtyInputField.focus().select();
290                    }
291                    ACC.quickorder.enableDisableAddToCartBtn();
292                }
293            });
294        },
295
296        enableDisableAddToCartBtn: function () {
297            var addToCartButtonEnabled = ACC.quickorder.shouldAddToCartBeEnabled();
298
299            // if there are no items to add, disable addToCartBtn, otherwise, enable it
300            if (addToCartButtonEnabled) {
301                ACC.quickorder.$addToCartBtn.removeAttr('disabled');
302            } else {
303                ACC.quickorder.$addToCartBtn.attr('disabled', 'disabled');
304            }
305        },
306
307        shouldAddToCartBeEnabled: function () {
308            var sum = 0;
309            var enable = false;
310            $(ACC.quickorder.$qtyInputField).each(function () {
311                var str = this.value.trim();  // .trim() may need a shim
312                if (str) {   // don't send blank values to `parseInt`
313                    sum += parseInt(str, 10);
314                }
315                if (sum >= 1) {
316                    enable = true;
317                    return false;
318                }
319            });
320            return enable;
321        },
322
323        isAnySkuPresent: function () {
324            var present = false;
325            $(ACC.quickorder.$skuInputField).each(function () {
326                var str = jQuery.trim(this.value);  // .trim() may need a shim
327                if (str) {
328                    present = true;
329                    return false;
330                }
331            });
332            return present;
333        },
334
335        getCurrentParentLi: function (currentElement) {
336            return $(currentElement).closest(ACC.quickorder.$jsLiContainer);
337        },
338
339        findElement: function (currentElement, toFind) {
340            return $(currentElement).find(toFind);
341        },
342
343        findElementInCurrentParentLi: function (currentElement, toFind) {
344            return $(currentElement).closest(ACC.quickorder.$jsLiContainer).find(toFind);
345        }
346    };
347}

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.