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.