{"version":3,"file":"xpect.min.js","sources":["xpect.min.js"],"sourcesContent":["/**\n * Cibis | Secure, high performance software\n * Copyright 2021 CIBIS International\n *\n * @author CIBIS International\n * @version 1.0.0\n */\nvar xpectWeb = xpectWeb || {\r\n enums: {\r\n stockOptionGroupSelectType: {\r\n listSingleSelection: 1,\r\n gridSingleSelection: 2,\r\n gridMultipleSelection: 3,\r\n textInput: 4\r\n }\r\n },\r\n timeoutIds: [],\r\n\r\n //\r\n // Check Verification\r\n //\r\n hasVerified: function () {\r\n return ($(\".xp-recaptcha\").length > 0 && typeof grecaptcha !== 'undefined' && grecaptcha.getResponse() !== \"\");\r\n },\r\n\r\n checkVerified: function (notificationContainer) {\r\n var isVerified = xpectWeb.hasVerified();\r\n\r\n if (isVerified) return true;\r\n\r\n xpectWeb.showVerificationNotification(notificationContainer);\r\n\r\n return false;\r\n },\r\n\r\n showVerificationNotification: function (notificationContainer) {\r\n // Show verification alert\r\n xpectWeb.showAlertDangerNotification(notificationContainer, \"verification-notification\", \"verification-notification\", \"

Please confirm you are not a robot.

\");\r\n },\r\n\r\n showAlertInfoNotification: function (notificationContainer, alertId, alertClass, alertHtmlMessage) {\r\n xpectWeb.showAlertNotification(notificationContainer, alertId, alertClass, alertHtmlMessage, 'alert-info');\r\n },\r\n\r\n showAlertSuccessNotification: function (notificationContainer, alertId, alertClass, alertHtmlMessage) {\r\n xpectWeb.showAlertNotification(notificationContainer, alertId, alertClass, alertHtmlMessage, 'alert-success');\r\n },\r\n\r\n showAlertWarningNotification: function (notificationContainer, alertId, alertClass, alertHtmlMessage) {\r\n xpectWeb.showAlertNotification(notificationContainer, alertId, alertClass, alertHtmlMessage, 'alert-warning');\r\n },\r\n\r\n showAlertDangerNotification: function (notificationContainer, alertId, alertClass, alertHtmlMessage) {\r\n xpectWeb.showAlertNotification(notificationContainer, alertId, alertClass, alertHtmlMessage, 'alert-danger');\r\n },\r\n\r\n showAlertNotification: function (notificationContainer, alertId, alertClass, alertHtmlMessage, alertTypeClass = 'alert-danger') {\r\n // Show alert\r\n var jqAlert = notificationContainer.find(\"#\" + alertId);\r\n\r\n /* Bootstrap 5 */\r\n if (jqAlert.length == 0) {\r\n jqAlert = $('
', {\r\n \"class\": \"alert mt-4 \" + alertTypeClass + \" \" + alertClass,\r\n id: alertId,\r\n html: '
' + alertHtmlMessage + '
'\r\n }).hide();\r\n\r\n notificationContainer.append(jqAlert);\r\n jqAlert = notificationContainer.find(\"#\" + alertId);\r\n jqAlert.slideDown();\r\n }\r\n\r\n // In case there's already a timeout in place, clear it\r\n if (typeof xpectWeb.timeoutIds[alertId] === 'number') {\r\n clearTimeout(xpectWeb.timeoutIds[alertId]);\r\n }\r\n\r\n // Remove the alert after a short delay\r\n xpectWeb.timeoutIds[alertId] = setTimeout(function () {\r\n jqAlert.slideUp(xpectWeb.settings.slideEasingDuration, function () {\r\n jqAlert.remove();\r\n });\r\n }, xpectWeb.settings.alertDuration);\r\n },\r\n\r\n //\r\n // Shopping Cart\r\n //\r\n cartQty: 0,\r\n setCartQuantity: function (qty, reloadMiniCart = true) {\r\n //console.log('setCartQuantity', { qty: qty, reloadMiniCart: reloadMiniCart });\r\n if (qty > 0) {\r\n xpectWeb.cartQty = qty;\r\n $('#xp-cart-widget-bubble').empty().append(qty).show();\r\n }\r\n else {\r\n xpectWeb.cartQty = 0;\r\n $('#xp-cart-widget-bubble').hide();\r\n }\r\n\r\n if (reloadMiniCart) {\r\n xpectWeb.loadMiniCart();\r\n }\r\n },\r\n increaseCartQuantity: function (qty) {\r\n xpectWeb.setCartQuantity(xpectWeb.cartQty + qty);\r\n },\r\n loadSpendLimit: function () {\r\n if ($(\"#xpSpendLimitContainer\").length > 0) {\r\n // clear the current container\r\n $('#xpSpendLimitContainer').empty();\r\n\r\n // Retrieve the current spend limit details\r\n $.post('/umbraco/Surface/ShoppingCart/RenderSpendLimit', null, function (successResponse) {\r\n $('#xpSpendLimitContainer').replaceWith(successResponse);\r\n });\r\n }\r\n },\r\n loadMiniCart: function (showLoadingSpinner = false) {\r\n //console.log('loadMiniCart', { showLoadingSpinner: showLoadingSpinner });\r\n if (showLoadingSpinner) {\r\n $('#xp-cart-widget-items').empty().append('');\r\n }\r\n $.post('/umbraco/Surface/ShoppingCart/LoadMiniCart', null, function (successResponse) {\r\n //console.log('loadMiniCart.success', { successResponse });\r\n $('#xp-cart-widget-items').empty().append(successResponse);\r\n\r\n // get the new qty set via the mini cart and ensure the global var is accurate\r\n // clear the qty bubble if it somehow became empty (session timeout etc)\r\n var miniCartQty = $('#xp-cart-widget-bubble').text();\r\n //console.log('loadMiniCart.miniCartQty', { miniCartQty });\r\n if (successResponse.includes('Your cart is empty')) {\r\n xpectWeb.setCartQuantity(0, false);\r\n } else {\r\n xpectWeb.setCartQuantity(parseInt(miniCartQty || 0), false);\r\n }\r\n\r\n //\r\n // Update other areas of template\r\n //\r\n\r\n // Update handheld toolbar cart price\r\n var $cartPrice = $(\".xp-cart-widget #xp-cart-widget-price\");\r\n var $handheldCartPrice = $(\".handheld-toolbar .xp-cart-widget-price\");\r\n if ($cartPrice.length > 0 && $handheldCartPrice.length > 0) {\r\n $handheldCartPrice.text($cartPrice.text());\r\n }\r\n\r\n // Update handheld toolbar cart quantity\r\n var $handheldCartQuantity = $(\".handheld-toolbar .xp-cart-widget-bubble\");\r\n if ($handheldCartQuantity.length > 0) {\r\n if (xpectWeb.cartQty > 0) {\r\n $handheldCartQuantity.text(xpectWeb.cartQty || '');\r\n $handheldCartQuantity.show();\r\n } else {\r\n $handheldCartQuantity.hide();\r\n }\r\n }\r\n });\r\n },\r\n\r\n //\r\n // DatePicker\r\n //\r\n datePickerChanged: function (fieldName, yearRequired) {\r\n var defaultYear = \"1904\";\r\n var deafultInvalidDateString = \"0000-00-00\";\r\n var dateFieldSelector = \"#\" + fieldName;\r\n\r\n var dateField = $(dateFieldSelector);\r\n\r\n if (dateField.length == 0) return;\r\n\r\n var dateFieldDay = $(dateFieldSelector + \"-day\");\r\n var dateFieldMonth = $(dateFieldSelector + \"-month\");\r\n var dateFieldYear = $(dateFieldSelector + \"-year\");\r\n\r\n var dateComponents = [];\r\n\r\n var dateFieldYearValue = \"\";\r\n\r\n if (dateFieldYear.length > 0) {\r\n dateFieldYearValue = dateFieldYear.val();\r\n\r\n if (dateFieldYearValue == \"\" && !yearRequired) {\r\n dateFieldYearValue = defaultYear;\r\n }\r\n\r\n if (dateFieldYearValue != \"\") {\r\n dateComponents.push(dateFieldYearValue);\r\n }\r\n } else {\r\n dateFieldYearValue = defaultYear;\r\n dateComponents.push(dateFieldYearValue);\r\n }\r\n\r\n var zeroPad = function (num, places) {\r\n return String(num).padStart(places, '0');\r\n };\r\n\r\n if (dateFieldMonth.length > 0 && dateFieldMonth.val() != \"\") {\r\n dateComponents.push(zeroPad(dateFieldMonth.val(), 2));\r\n }\r\n\r\n if (dateFieldDay.length > 0 && dateFieldDay.val() != \"\") {\r\n dateComponents.push(zeroPad(dateFieldDay.val(), 2));\r\n }\r\n\r\n // Check if valid date\r\n if (dateComponents.length == 3) {\r\n var dateString = dateComponents.join(\"-\");\r\n\r\n if (new Date(dateString).toISOString().substring(0, 10) === dateString) {\r\n dateField.val(dateString).valid();\r\n return;\r\n } else {\r\n dateField.val(deafultInvalidDateString).valid();\r\n return;\r\n }\r\n }\r\n\r\n // Clear non-empty field if we don't have a value\r\n if (dateField.val() != \"\") {\r\n dateField.val(\"\").valid();\r\n }\r\n },\r\n\r\n // convert a dotnet serialized date back to a ISO date\r\n // [ https://stackoverflow.com/questions/726334/asp-net-mvc-jsonresult-date-format ]\r\n dotNetDateToDate: function (value) {\r\n //console.log('dotNetDateToDate', { value: value });\r\n let result = value;\r\n if (typeof value === 'string') {\r\n // note: output as ISO string (via moment) as we dont want JS to localize the date\r\n result = (value) ? moment(value).format() : null;\r\n }\r\n // console.log('dotNetDateToDate.result', { value: value, result: result });\r\n return result;\r\n }\r\n};\r\n\r\n(function ($) {\r\n $.extend({\r\n xpectWeb: {\r\n addCheckboxRangeValidation: function () {\r\n // extend range validator method to treat checkboxes differently\r\n var defaultRangeValidator = $.validator.methods.range;\r\n $.validator.methods.range = function (value, element, param) {\r\n if (element.type === 'checkbox') {\r\n // if it's a checkbox return true if it is checked\r\n return element.checked;\r\n } else {\r\n // otherwise run the default validation function\r\n return defaultRangeValidator.call(this, value, element, param);\r\n }\r\n };\r\n }\r\n }\r\n });\r\n\r\n $.fn.extend({\r\n toggleVisibility: function (isVisible) {\r\n return this.each(function () {\r\n if (isVisible) {\r\n $(this).removeClass(\"xp-hidden\");\r\n } else {\r\n $(this).addClass(\"xp-hidden\");\r\n }\r\n });\r\n }\r\n });\r\n})(jQuery);\r\n\r\n$(function () {\r\n // Add maxlength attributes to fields\r\n $(\"input[data-val-length-max]\").each(function () {\r\n var $this = $(this);\r\n var data = $this.data();\r\n $this.attr(\"maxlength\", data.valLengthMax);\r\n });\r\n\r\n // Add maxlength attributes to fields\r\n $(\"input[data-val-maxlength-max]\").each(function () {\r\n var $this = $(this);\r\n var data = $this.data();\r\n $this.attr(\"maxlength\", data.valMaxlengthMax);\r\n });\r\n\r\n // Add checkbox range validation\r\n $.xpectWeb.addCheckboxRangeValidation();\r\n\r\n // Add recaptcha check on submit\r\n if ($(\".xp-recaptcha\").length > 0) {\r\n $(document).on(\"click\", \".xp-recaptcha-submit\", function (evt) {\r\n if (!xpectWeb.checkVerified($(this).parent())) {\r\n evt.preventDefault();\r\n return;\r\n }\r\n });\r\n }\r\n\r\n // Bind card checkbox and card radio inputs.\r\n // The parent container of all the checkboxes and radios for a specific form question\r\n // may have .xp-required which may have a child input.xp-selection-count which is\r\n // used for client-side validation across the range of inputs for the question.\r\n $(document).on(\"click\", \".xp-card-radio input, .xp-card-checkbox input\", function (evt) {\r\n evt.stopPropagation();\r\n });\r\n\r\n $(document).on(\"click\", \".xp-card-checkbox\", function (evt) {\r\n var card = $(this);\r\n\r\n card.toggleClass(\"xp-selected\")\r\n .find(\"input[type=checkbox]\").click();\r\n\r\n var requiredContainer = card.parents(\".xp-required\");\r\n\r\n if (requiredContainer.length > 0) {\r\n var selectionCountInput = requiredContainer.find(\"input.xp-selection-count\");\r\n\r\n if (selectionCountInput.length > 0) {\r\n // console.log(requiredContainer.find(\"input[type=checkbox]:checked\").length);\r\n selectionCountInput\r\n .val(requiredContainer.find(\"input[type=checkbox]:checked\").length)\r\n .valid();\r\n }\r\n }\r\n });\r\n\r\n $(document).on(\"click\", \".xp-card-radio\", function (evt) {\r\n // console.log(\"click .xp-card-radio\");\r\n var card = $(this);\r\n var cardRadioInput = card.find(\"input\");\r\n\r\n var triggerOnChangeEvent = false;\r\n\r\n // Uncheckable radio button functionality\r\n if (cardRadioInput.is(\":checked\")) {\r\n cardRadioInput.prop(\"checked\", false);\r\n triggerOnChangeEvent = true;\r\n // console.log('card: ' + cardRadioInput.is(\":checked\"));\r\n } else {\r\n cardRadioInput.click();\r\n }\r\n\r\n var cards = card.closest(\".xp-product-options-radiobutton-list\").find(\".xp-card\");\r\n cards.removeClass(\"xp-selected\");\r\n cards.find(\"input:checked\").parents(\".xp-card\").addClass(\"xp-selected\");\r\n\r\n var requiredContainer = card.parents(\".xp-required\");\r\n\r\n if (requiredContainer.length > 0) {\r\n var selectionCountInput = requiredContainer.find(\"input.xp-selection-count\");\r\n\r\n if (selectionCountInput.length > 0) {\r\n selectionCountInput\r\n .val(requiredContainer.find(\"input[type=radio]:checked\").length)\r\n .valid();\r\n }\r\n }\r\n\r\n // Unchecked radio buttons don't fire the changed event\r\n if (triggerOnChangeEvent) {\r\n // Manually trigger the on change event\r\n cardRadioInput.trigger(\"change\");\r\n // console.log('card: ' + cardRadioInput.is(\":checked\"));\r\n }\r\n // console.log('card: ' + cardRadioInput.is(\":checked\"));\r\n\r\n });\r\n\r\n // Have bootstrap select boxes fire validation\r\n $(document).on('changed.bs.select', function (e, clickedIndex, isSelected, previousValue) {\r\n $(e.target).valid();\r\n });\r\n\r\n /*\r\n * Hero Sliders\r\n */\r\n $('.xp-hero-slider-container').each(function () {\r\n var sliderContainer = $(this).find(\".swiper-container\");\r\n var sliderPrevEl = $(this).find(\".swiper-button-prev\");\r\n var sliderNextEl = $(this).find(\".swiper-button-next\");\r\n var sliderPagination = $(this).find(\".swiper-pagination\");\r\n \r\n if (sliderContainer.length > 0 && sliderPrevEl.length > 0 && sliderNextEl.length > 0 && sliderPagination.length > 0) {\r\n var slider = new Swiper(sliderContainer[0], {\r\n loop: true,\r\n freeMode: false,\r\n slidesPerView: 1,\r\n navigation: {\r\n nextEl: sliderNextEl[0],\r\n prevEl: sliderPrevEl[0],\r\n },\r\n pagination: {\r\n el: sliderPagination[0],\r\n clickable: true\r\n },\r\n breakpoints: {\r\n 1: {\r\n showNavigation: false,\r\n showPagination: true\r\n },\r\n 600: {\r\n showNavigation: false,\r\n showPagination: true\r\n },\r\n 1120: {\r\n showNavigation: true,\r\n showPagination: false\r\n }\r\n },\r\n on: {\r\n breakpoint: function (swiper) {\r\n if (swiper.params.showNavigation) {\r\n sliderPrevEl.removeClass(\"xp-hidden\");\r\n sliderNextEl.removeClass(\"xp-hidden\");\r\n } else {\r\n sliderPrevEl.addClass(\"xp-hidden\");\r\n sliderNextEl.addClass(\"xp-hidden\");\r\n }\r\n\r\n if (swiper.params.showPagination) {\r\n sliderPagination.removeClass(\"xp-hidden\");\r\n } else {\r\n sliderPagination.addClass(\"xp-hidden\");\r\n }\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n /*\r\n * Brand Sliders\r\n */\r\n $('.xp-brands-slider-container').each(function () {\r\n var sliderContainer = $(this).find(\".swiper-container\");\r\n var sliderPagination = $(this).find(\".swiper-pagination\");\r\n\r\n if (sliderContainer.length > 0 && sliderPagination.length > 0) {\r\n var slider = new Swiper(sliderContainer[0], {\r\n loop: true,\r\n freeMode: false,\r\n spaceBetween: 40,\r\n slidesPerView: 6,\r\n pagination: {\r\n el: sliderPagination[0],\r\n clickable: true\r\n },\r\n breakpoints: {\r\n 1: {\r\n slidesPerView: 1,\r\n spaceBetween: 20,\r\n },\r\n 600: {\r\n slidesPerView: 3,\r\n spaceBetween: 20,\r\n },\r\n 1000: {\r\n slidesPerView: 6,\r\n spaceBetween: 40,\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n /*\r\n * Products Sliders\r\n */\r\n $('.xp-items-slider-container').each(function () {\r\n var sliderContainer = $(this).find(\".swiper-container\");\r\n var sliderPagination = $(this).find(\".swiper-pagination\");\r\n\r\n if (sliderContainer.length > 0 && sliderPagination.length > 0) {\r\n var slideCount = sliderContainer.find(\".swiper-slide\").length;\r\n\r\n var slider = new Swiper(sliderContainer[0], {\r\n observer: true,\r\n observeParents: true,\r\n spaceBetween: 50,\r\n slidesPerView: 4,\r\n slidesPerGroup: 4,\r\n loop: false,\r\n freeMode: false,\r\n pagination: {\r\n el: sliderPagination[0],\r\n clickable: true\r\n },\r\n breakpoints: {\r\n 1: {\r\n slidesPerView: 1,\r\n slidesPerGroup: 1,\r\n spaceBetween: 20\r\n },\r\n 640: {\r\n slidesPerView: 2,\r\n slidesPerGroup: 2,\r\n spaceBetween: 20,\r\n },\r\n 768: {\r\n slidesPerView: 3,\r\n slidesPerGroup: 3,\r\n spaceBetween: 40,\r\n },\r\n 960: {\r\n slidesPerView: 4,\r\n slidesPerGroup: 4,\r\n spaceBetween: 40,\r\n },\r\n 1024: {\r\n slidesPerView: 4,\r\n slidesPerGroup: 4,\r\n spaceBetween: 40,\r\n }\r\n },\r\n on: {\r\n breakpoint: function (swiper) {\r\n if (slideCount > swiper.params.slidesPerView) {\r\n sliderPagination.removeClass(\"xp-hidden\");\r\n } else {\r\n sliderPagination.addClass(\"xp-hidden\");\r\n }\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n /*\r\n * Quantity Increment/Decrement\r\n */\r\n $(document).on(\"click\", \".xp-dec-btn\", function (evt) {\r\n var btnDec = $(this);\r\n var txtQty = $(this).siblings('input.xp-quantity-no');\r\n var btnInc = $(this).siblings('.xp-inc-btn');\r\n var value = parseFloat(txtQty.val(), 10);\r\n\r\n if (value >= 1) {\r\n var newValue = value - 1;\r\n var min = parseFloat(txtQty.attr(\"min\"));\r\n var max = parseFloat(txtQty.attr(\"max\"));\r\n\r\n if (isNaN(min)) {\r\n min = 0;\r\n }\r\n\r\n if (isNaN(max)) {\r\n max = 2147483647;\r\n }\r\n\r\n if (newValue >= min) {\r\n var autoNumeric = AutoNumeric.getAutoNumericElement(txtQty[0]);\r\n\r\n if (autoNumeric != null) {\r\n autoNumeric.set(newValue);\r\n } else {\r\n txtQty.val(newValue);\r\n }\r\n\r\n txtQty.blur();\r\n }\r\n\r\n if ((newValue - 1) < min) {\r\n btnDec.addClass(\"disabled\");\r\n }\r\n\r\n if (newValue < max) {\r\n btnInc.removeClass(\"disabled\");\r\n }\r\n } else {\r\n if (isNaN(value)) {\r\n btnDec.addClass(\"disabled\");\r\n } else {\r\n btnDec.addClass(\"disabled\");\r\n }\r\n }\r\n });\r\n\r\n $(document).on(\"click\", \".xp-inc-btn\", function (evt) {\r\n var btnInc = $(this);\r\n var txtQty = $(this).siblings('input.xp-quantity-no');\r\n var btnDec = $(this).siblings('.xp-dec-btn');\r\n var value = parseFloat(txtQty.val(), 10);\r\n\r\n if (value < 2147483647) {\r\n var newValue = value + 1;\r\n var min = parseFloat(txtQty.attr(\"min\"));\r\n var max = parseFloat(txtQty.attr(\"max\"));\r\n\r\n if (isNaN(min)) {\r\n min = 0;\r\n }\r\n\r\n if (isNaN(max)) {\r\n max = 2147483647;\r\n }\r\n\r\n if (newValue <= max) {\r\n var autoNumeric = AutoNumeric.getAutoNumericElement(txtQty[0]);\r\n\r\n if (autoNumeric != null) {\r\n autoNumeric.set(newValue);\r\n } else {\r\n txtQty.val(newValue);\r\n }\r\n\r\n txtQty.blur();\r\n }\r\n\r\n if (isNaN((newValue + 1)) || (newValue + 1) > max) {\r\n btnInc.addClass(\"disabled\");\r\n }\r\n\r\n if (newValue > min) {\r\n btnDec.removeClass(\"disabled\");\r\n }\r\n } else {\r\n if (isNaN(value)) {\r\n btnDec.addClass(\"disabled\");\r\n } else {\r\n btnInc.addClass(\"disabled\");\r\n }\r\n }\r\n });\r\n\r\n /* Make AutoNumeric wheel event to trigger a change event */\r\n $(document).on(\"wheel\", \"input.xp-quantity-no\", function (evt) {\r\n $(this).trigger('keyup');\r\n });\r\n\r\n $(document).on(\"change keyup\", \"input.xp-quantity-no\", function (evt) {\r\n var txtQty = $(this);\r\n var btnInc = txtQty.siblings('.xp-inc-btn');\r\n var btnDec = txtQty.siblings('.xp-dec-btn');\r\n var value = parseFloat(txtQty.val(), 10);\r\n\r\n var min = parseFloat(txtQty.attr(\"min\"));\r\n var max = parseFloat(txtQty.attr(\"max\"));\r\n\r\n if (isNaN(min)) {\r\n min = 0;\r\n }\r\n\r\n if (isNaN(max)) {\r\n max = 2147483647;\r\n }\r\n\r\n var autoNumeric = AutoNumeric.getAutoNumericElement(txtQty[0]);\r\n\r\n if (value <= min) {\r\n if (autoNumeric != null) {\r\n autoNumeric.set(min);\r\n } else {\r\n txtQty.val(min);\r\n }\r\n\r\n btnDec.addClass(\"disabled\");\r\n } else {\r\n btnDec.removeClass(\"disabled\");\r\n }\r\n \r\n if (value >= max) {\r\n //if (autoNumeric != null) {\r\n // autoNumeric.set(max);\r\n //} else {\r\n // txtQty.val(max);\r\n //}\r\n\r\n //txtQty.blur();\r\n\r\n btnInc.addClass(\"disabled\");\r\n } else {\r\n btnInc.removeClass(\"disabled\");\r\n }\r\n });\r\n});\n// Use xpectWeb.settings namespace\r\nvar xpectWeb = xpectWeb || {};\r\nxpectWeb.settings = {\r\n slideEasingDuration: 500,\r\n alertDuration: 5000,\r\n};\n// Use xpectWeb.utils namespace\r\nvar xpectWeb = xpectWeb || {};\r\nxpectWeb.utils = {\r\n // Returns the amount as a formatted currency string.\r\n formatCurrency: function (currencySymbol, amount, decimalPlaces, includeSign) {\r\n var sign = '';\r\n\r\n amount = +amount;\r\n\r\n if (includeSign) {\r\n if (amount != 0) {\r\n if (amount < 0) {\r\n sign = \"-\";\r\n } else {\r\n sign = \"+\";\r\n }\r\n\r\n amount = Math.abs(amount);\r\n }\r\n }\r\n\r\n const result = sign + currencySymbol + amount.toLocaleString(undefined, { minimumFractionDigits: decimalPlaces, maximumFractionDigits: decimalPlaces });\r\n\r\n // console.log('formatCurrency', { result: result, params: { currencySymbol: currencySymbol, amount: amount, decimalPlaces: decimalPlaces } });\r\n\r\n return result;\r\n },\r\n\r\n // Converts a currency amount into the users preferred display currency.\r\n convertCurrency: function (localAmountInc, localAmountEx, amountInc, amountEx, customerCurrency, displayCurrencyPreference) {\r\n var amount = 0;\r\n\r\n if (isNaN(localAmountInc) || isNaN(localAmountEx) || isNaN(amountInc) || isNaN(amountEx)) {\r\n return amount;\r\n }\r\n\r\n try {\r\n // If the customer currency and the display preference currency are different then use the local amount and apply the exchange rate.\r\n if (customerCurrency.currencyNo != displayCurrencyPreference.currencyNo) {\r\n if (displayCurrencyPreference.displayTaxInclusive) {\r\n // Apply exchange rate conversion\r\n amount = localAmountInc * displayCurrencyPreference.exchangeRate;\r\n }\r\n else {\r\n // Apply exchange rate conversion\r\n amount = localAmountEx * displayCurrencyPreference.exchangeRate;\r\n }\r\n }\r\n else {\r\n // The customer currency and the display preference currency are the same, so use the standard amount without applying the exchange rate.\r\n // This is to avoid potential rounding issues due to double conversions.\r\n\r\n if (displayCurrencyPreference.displayTaxInclusive) {\r\n amount = amountInc;\r\n }\r\n else {\r\n amount = amountEx;\r\n }\r\n }\r\n\r\n if (displayCurrencyPreference.decimalPlaces) {\r\n amount = Number((result.toLocaleString(undefined, { minimumFractionDigits: displayCurrencyPreference.decimalPlaces, maximumFractionDigits: displayCurrencyPreference.decimalPlaces })).replace(/[$,]+/g, \"\"));\r\n // console.log('convertCurrency decimalPlaces amount', amount);\r\n }\r\n } catch (err) { }\r\n\r\n return amount;\r\n },\r\n\r\n bootstrapMajorVersion: function () {\r\n var version = Number(bootstrap.Modal.VERSION[0]);\r\n //console.log('bootstrapMajorVersion', version);\r\n return version;\r\n },\r\n bootstrapModal: function (elementId) {\r\n //console.log('bootstrapModal', elementId);\r\n if (this.bootstrapMajorVersion() <= 4) {\r\n return $('#' + elementId).modal();\r\n }\r\n else {\r\n return new bootstrap.Modal(document.getElementById(elementId));\r\n }\r\n }\r\n};\nvar xpectWeb = xpectWeb || {};\r\n\r\nxpectWeb.contentPage = {\r\n init: function (model) {\r\n // console.log('xpectWeb.contentPage.init', { model: model });\r\n\r\n // check for any widgets\r\n if (typeof (model) !== 'undefined' && Array.isArray(model.Widgets)) {\r\n model.Widgets.forEach(function (widget) {\r\n $.post(widget.URL, { data: widget.Data }, function (successResponse) {\r\n $('#' + widget.Identifier).empty().append(successResponse);\r\n });\r\n });\r\n }\r\n }\r\n};\nvar xpectWeb = xpectWeb || {};\r\nxpectWeb.widgets = xpectWeb.widgets || {};\r\n\r\nxpectWeb.widgets.contactForm = {\r\n init: function (model, contactFormId, style) {\r\n // console.log('xpectWeb.widgets.contactForm.init', { model: model, contactFormId: contactFormId });\r\n \r\n var contactFormElement = document.getElementById(contactFormId);\r\n\r\n if (contactFormElement) {\r\n contactFormElement.setAttribute(\"config\", JSON.stringify(model.Config));\r\n contactFormElement.setAttribute(\"style\", style);\r\n contactFormElement.setAttribute(\"enable-cancel\", \"false\");\r\n contactFormElement.setAttribute(\"recaptcha-sitekey\", model.GoogleReCaptchaSiteKey);\r\n contactFormElement.addEventListener('onSubmitClick', (event) => {\r\n var url = model.SubmitURL;\r\n var params = event.detail;\r\n // console.log('onSubmitClick', url, params);\r\n params.recaptchaResponse = params.googleRECAPTCHAResponse; // need to map this for Umbraco base class usage\r\n contactFormElement.setAttribute(\"processing\", \"true\");\r\n $.post(url, params, function (response) {\r\n // console.log('onSubmitClick.response', response);\r\n if (!response.HasError) {\r\n contactFormElement.setAttribute(\"success\", \"true\");\r\n contactFormElement.setAttribute(\"custom-message\", JSON.stringify({ title: 'Submitted', success: response.Message }));\r\n }\r\n else {\r\n contactFormElement.setAttribute(\"processing\", \"false\");\r\n contactFormElement.setAttribute(\"custom-message\", JSON.stringify({ title: 'Error', error: response.Message }));\r\n }\r\n }).fail(function (errorResponse) {\r\n console.error('onSubmitClick', errorResponse);\r\n contactFormElement.setAttribute(\"custom-message\", JSON.stringify({ title: 'Error', error: 'Error submitting the contact form. Please try again.', autoHide: 5000 }));\r\n });\r\n });\r\n }\r\n }\r\n};\r\n\nvar xpectWeb = xpectWeb || {};\r\nxpectWeb.widgets = xpectWeb.widgets || {};\r\n\r\nxpectWeb.widgets.callToAction = {\r\n init: function (model) {\r\n //console.log('xpectWeb.widgets.callToAction.init', model);\r\n xpectWeb.widgets.callToAction.model = model;\r\n },\r\n initReCaptcha: function () {\r\n //console.log('xpectWeb.widgets.callToAction.initReCaptcha');\r\n if ($('#reCAPTCHA iframe').length <= 0) {\r\n grecaptcha.render(document.getElementById('reCAPTCHA'), { 'sitekey': xpectWeb.widgets.callToAction.model.XpectRecaptchaSiteKey });\r\n }\r\n },\r\n submit: function (form) {\r\n var formData = $(form).serialize();\r\n //console.log('xpectWeb.widgets.callToAction.submit', formData);\r\n $.post(xpectWeb.widgets.callToAction.model.SubmitURL, formData, function (successResponse) {\r\n $('#xpCallToActionFormContainer').empty().append(successResponse);\r\n xpectWeb.widgets.callToAction.initReCaptcha();\r\n });\r\n }\r\n};\r\n\nvar xpectWeb = xpectWeb || {};\r\n\r\nxpectWeb.forms = {\r\n init: function (model) {\r\n // console.log('xpectWeb.forms.init', model);\r\n if (model) {\r\n const xpectForm = document.getElementById(\"xpectFormRunnner\");\r\n if (xpectForm) {\r\n xpectForm.setAttribute(\"structure\", JSON.stringify(model.Structure));\r\n xpectForm.setAttribute(\"reference-data\", JSON.stringify(model.ReferenceData));\r\n xpectForm.setAttribute(\"user-preferences\", JSON.stringify(model.UserPreferences));\r\n xpectForm.setAttribute(\"person-data\", JSON.stringify(model.PersonData || {}));\r\n // load any response data (need to wait for component to load first)\r\n if (model.ResponseAsJsonStr) {\r\n setTimeout(function () {\r\n const responseData = {\r\n results: JSON.parse(model.ResponseAsJsonStr)\r\n };\r\n xpectForm.setAttribute(\"response\", JSON.stringify(responseData));\r\n }, 1000);\r\n }\r\n xpectForm.addEventListener('nextClick', (event) => {\r\n // console.log('nextClick', event);\r\n $('#xpectFormError').hide();\r\n });\r\n xpectForm.addEventListener('cancelClick', (event) => {\r\n // console.log('cancelClick', event, model);\r\n window.location.href = model.ReturnURL;\r\n });\r\n xpectForm.addEventListener('saveClick', (event) => {\r\n // console.log('saveClick', { event });\r\n const url = model.SubmitURL;\r\n const params = {\r\n formID: event.detail.formID,\r\n friendlyURL: event.detail.friendlyURL,\r\n responseAsJsonStr: JSON.stringify(event.detail.responses)\r\n };\r\n // console.log('saveClick.nonStock.post', { url, params });\r\n $.post(url, params, function (successResponse) {\r\n // console.log('saveClick.nonStock.post.success', { successResponse });\r\n // show success message and hide form etc (and bring into view)\r\n $('#xpectForm').hide();\r\n $('#xpectFormError').hide();\r\n // if we had items added to the cart, also show that msg\r\n if (Number(successResponse) > 0) {\r\n $('#xpectFormSuccessCart').show();\r\n }\r\n $('#xpectFormSuccess').show();\r\n // scroll into view (just in case)\r\n $('html, body').animate({ scrollTop: ($('.xp-content-above').first().offset().top) }, 500);\r\n }).fail(function (errorResponse) {\r\n console.error('saveClick.nonStock.post', { errorResponse });\r\n $('#xpectFormError').show();\r\n });\r\n });\r\n xpectForm.addEventListener('validationError', (event) => {\r\n // console.log('validationError', event);\r\n $('#xpectFormError').show();\r\n });\r\n }\r\n }\r\n\t}\r\n};\n// Use xpectWeb.members.join namespace\r\nvar xpectWeb = xpectWeb || {};\r\nxpectWeb.members = xpectWeb.members || {};\r\nxpectWeb.members.join = {\r\n //\r\n // Check Agreed Terms Conditions\r\n //\r\n hasAgreedTermsAndConditions: function () {\r\n var termsCheckbox = $(\"#AgreedTermsConditions\");\r\n\r\n if (termsCheckbox.length > 0) {\r\n return termsCheckbox.is(\":checked\");\r\n }\r\n\r\n return true;\r\n },\r\n\r\n hasReadTermsAndConditions: function() {\r\n var readTermsCheckbox = $(\"#ReadTermsAndConditions\");\r\n\r\n if (readTermsCheckbox.length > 0) {\r\n return readTermsCheckbox.is(\":checked\");\r\n }\r\n\r\n return true;\r\n },\r\n\r\n checkAgreedTermsConditions: function () {\r\n var hasAgreed = xpectWeb.members.join.hasAgreedTermsAndConditions();\r\n var hasReadTerms = xpectWeb.members.join.hasReadTermsAndConditions();\r\n\r\n if (hasAgreed && hasReadTerms) return true;\r\n\r\n if (!hasAgreed) {\r\n xpectWeb.members.join.showTermsConditionsAlert();\r\n } else if (!hasReadTerms) { \r\n xpectWeb.members.join.showReadTermsConditionsAlert();\r\n }\r\n\r\n return false;\r\n },\r\n\r\n showTermsConditionsAlert: function () {\r\n // Show terms and conditions alert\r\n xpectWeb.showAlertDangerNotification(xpectWeb.members.join.getNotificationContainer($(\".xp-member-join button[type='submit']\")), \"terms-and-conditions-notification\", \"terms-and-conditions-notification\", \"

You must agree to the terms and conditions.

\");\r\n },\r\n\r\n showReadTermsConditionsAlert: function () {\r\n // Show terms and conditions alert\r\n xpectWeb.showAlertDangerNotification(xpectWeb.members.join.getNotificationContainer($(\".xp-member-join button[type='submit']\")), \"read-terms-and-conditions-notification\", \"read-terms-and-conditions-notification\", '

You must read the terms and conditions. Click the link to read the Terms and Conditions.

');\r\n },\r\n\r\n showHideCompanyName: function (companyDropdown) {\r\n var selectedText = $(companyDropdown).find(\":selected\").text().toLowerCase();\r\n\r\n // Show/Hide the Company Name and Company Position fields\r\n if (selectedText == \"company\") {\r\n $(\"#CompanyFields\").slideDown();\r\n $(\".xp-company-fields\").slideDown();\r\n } else {\r\n $(\"#CompanyFields\").slideUp();\r\n $(\".xp-company-fields\").slideUp();\r\n }\r\n },\r\n\r\n //\r\n // Form Submit handler\r\n //\r\n wireUpFormSubmitHandler: function () {\r\n $(document).on(\"click\", \".xp-member-join button[type=submit]\", function (evt) {\r\n if (!xpectWeb.members.join.checkAgreedTermsConditions()) {\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n if (!xpectWeb.checkVerified(xpectWeb.members.join.getNotificationContainer($(this)))) {\r\n evt.preventDefault();\r\n return;\r\n }\r\n });\r\n },\r\n\r\n // Notifications can be placed in a specified location by using a container with the class \"xp-notification-container\", otherwise they will go in the parent of the element that initiated the notification.\r\n getNotificationContainer: function ($initiator) {\r\n $notificationContainer = $(\".xp-notification-container\");\r\n\r\n if ($notificationContainer.length == 0) {\r\n $notificationContainer = $initiator.parent();\r\n }\r\n\r\n return $notificationContainer;\r\n }\r\n};\r\n\r\n$(function () {\r\n if ($(\".xp-member-join\").length == 0) {\r\n return;\r\n }\r\n\r\n // Wire up the submit button\r\n xpectWeb.members.join.wireUpFormSubmitHandler();\r\n\r\n //\r\n // Required field validators\r\n //\r\n var requiredFieldMessages = {\r\n Title: 'Title',\r\n Gender: 'Gender',\r\n FirstName: 'First Name',\r\n LastName: 'Last Name',\r\n CompanyName: 'Company Name',\r\n CompanyPosition: 'Company Position',\r\n Phone: 'Phone',\r\n Fax: 'Fax',\r\n Mobile: 'Mobile',\r\n DateOfBirth: 'Date of Birth',\r\n PostalAddress1: 'Billing Address Line 1',\r\n PostalCity: 'City',\r\n PostalState: 'State',\r\n PostalPostcode: 'Postcode',\r\n Country: 'Postal Country',\r\n DeliveryAddress1: 'Delivery Address Line 1',\r\n DeliveryCity: 'City',\r\n DeliveryState: 'State',\r\n DeliveryPostcode: 'Postcode',\r\n DeliveryCountry: 'Country'\r\n };\r\n\r\n $(\".xp-required input:not([data-val-required]), .xp-required select:not([data-val-required])\").each((index, element) => {\r\n if (typeof requiredFieldMessages[element.name] === 'string') {\r\n $(element).attr(\"data-val-required\", \"The \" + requiredFieldMessages[element.name] + \" field is required.\");\r\n }\r\n });\r\n\r\n // Read terms and conditions\r\n $(\"#modal-terms .modal-footer .btn-primary\").on(\"click\", function() {\r\n var jqReadTerms = $(\"#ReadTermsAndConditions\");\r\n\r\n if (jqReadTerms.length > 0) {\r\n $(\"#ReadTermsAndConditions\").prop(\"checked\", true);\r\n }\r\n\r\n var jqAgreedTerms = $(\"#AgreedTermsConditions\");\r\n\r\n if (jqAgreedTerms.length > 0) {\r\n jqAgreedTerms.prop(\"checked\", true);\r\n }\r\n });\r\n\r\n // Delivery address section toggle\r\n $(\"#IsDeliveryAddressDifferentToPostalAddress\").click(function () {\r\n if ($(this).is(':checked')) {\r\n $(\"#DeliveryAddressFields\").slideDown();\r\n } else {\r\n $(\"#DeliveryAddressFields\").slideUp();\r\n }\r\n });\r\n});\nvar xpectWeb = xpectWeb || {};\r\n\r\nxpectWeb.productDetails = {\r\n /* vue.js app. Values initialised later. */\r\n app: {\r\n updated() {\r\n if (typeof xpectWeb.productDetails.productImageSlider === 'undefined' &&\r\n xpectWeb.productDetails.productImageSliderNeedsRefresh == true) {\r\n xpectWeb.productDetails.initProductImagesSlider();\r\n xpectWeb.productDetails.productImageSliderNeedsRefresh = false;\r\n }\r\n\r\n // Ensure the inc/dec buttons are appropriately enabled/disabled and maximum quantity is respected\r\n $(\"#quantity\").keyup();\r\n\r\n // Ensure there is an active tab\r\n if ($('.nav-tabs .active').length == 0) {\r\n $('.nav-tabs a:first').tab('show');\r\n } else {\r\n // A tab may have been hidden while active, if it's restored this will remove the active state\r\n $('.nav-tabs .active:gt(0)').removeClass('active');\r\n }\r\n },\r\n data() {\r\n return {\r\n componentKey: 0, // Used to force a re-render.\r\n\r\n appData: null, // App Data\r\n\r\n selectedVariant: null, // Selected single variant. For multi-variant this is set after colour and size have been selected. For single-variant it will be always set.\r\n selectedColour: 0, // Selected colour\r\n selectedColourDescription: '', // Selected colour description\r\n selectedSize: 0, // Selected size\r\n hasSomeStockAvailable: false, // If a single-variant is available, or if some colours/sizes available for a multi-variant (for out of stock message)\r\n isMultiVariant: false, // If this is a multi-variant\r\n hasRelatedInfoSheets: false, // If there are related information sheets\r\n\r\n stockMasterStockItemNo: 0,\r\n stockStockItemNo: 0, // Stock stockItemNo\r\n stockDescription: '', // Stock description\r\n stockStockNo: '', // (Selected) stock stockNo (product code)\r\n stockWeight: 0, // (Selected) stock weight\r\n stockDimensions: '', // (Selected) stock dimensions\r\n stockQtyOnHand: 0, // (Selected) stock item quantity on hand\r\n stockNonDepletingItem: false, \r\n stockSellingPriceDisplayString: '',\r\n stockSpecialPriceDisplayString: '',\r\n stockOnSpecial: false,\r\n stockBuildItem: false,\r\n fromPriceDisplayString: '',\r\n hasDifferentVariantPricing: false,\r\n\r\n // Total price (used for products with options)\r\n totalPriceDisplayString: '',\r\n\r\n // Terms and Conditions\r\n agreeTermsAndConditionsUrl: '',\r\n termsAttachmentDescription: '',\r\n termsAttachmentDownloadName: '',\r\n termsAttachmentFileSizeDisplayString: '',\r\n\r\n // Stock item attachment fields\r\n downloadItem: false,\r\n downloadID: 0,\r\n dateTransactionDisplayString: '',\r\n downloadExpiresOnDisplayString: '',\r\n downloadExpired: false,\r\n\r\n unitsMeasure: '',\r\n classDescription1: '',\r\n classDescription2: '',\r\n classDescription3: '',\r\n classDescription4: '',\r\n classDescription5: '',\r\n classDescription6: '',\r\n classDescription7: '',\r\n classDescription8: '',\r\n classDescription9: '',\r\n classDescription10: '',\r\n classDescription11: '',\r\n classDescription12: '',\r\n classWebInclude1: false,\r\n classWebInclude2: false,\r\n classWebInclude3: false,\r\n classWebInclude4: false,\r\n classWebInclude5: false,\r\n classWebInclude6: false,\r\n classWebInclude7: false,\r\n classWebInclude8: false,\r\n classWebInclude9: false,\r\n classWebInclude10: false,\r\n classWebInclude11: false,\r\n classWebInclude12: false,\r\n className1: '',\r\n className2: '',\r\n className3: '',\r\n className4: '',\r\n className5: '',\r\n className6: '',\r\n className7: '',\r\n className8: '',\r\n className9: '',\r\n className10: '',\r\n className11: '',\r\n className12: '',\r\n\r\n quantityAutoNumeric: null\r\n };\r\n },\r\n computed: {\r\n filteredStockImages() {\r\n var stockImages = [];\r\n\r\n if (this.appData == null) {\r\n return stockImages;\r\n }\r\n\r\n // Check if we should return multi-variant images or images for a single-variant\r\n if (this.isMultiVariant && this.appData.multiVariant.stockImages != null) {\r\n stockImages = this.appData.multiVariant.stockImages;\r\n\r\n // Filter images to the selected colour and size\r\n var filteredImages = stockImages.filter(x => (this.selectedColour == 0 && x.variantClassNo >= 0) || x.variantClassNo == 0 || x.variantClassNo == this.selectedColour);\r\n\r\n if (filteredImages.length > 0) {\r\n // Return filtered images\r\n return filteredImages;\r\n }\r\n } else if (this.selectedVariant != null && this.selectedVariant.stockImages != null) {\r\n stockImages = this.selectedVariant.stockImages;\r\n }\r\n\r\n if (stockImages == null || stockImages.length == 0) {\r\n // A placeholder image for when there's no stock image\r\n stockImages = [{\r\n imageUrl: this.appData.noImagePlaceholderLgUrl,\r\n thumbnailUrl: this.appData.noImagePlaceholderLgUrl, /* Just use the Large image here */\r\n variantClassNo: -1,\r\n variantDescription: '',\r\n variantCssClass: '',\r\n title: \"No image\"\r\n }];\r\n }\r\n\r\n return stockImages;\r\n },\r\n getMaxQuantity() {\r\n if (this.selectedVariant != null) {\r\n if (this.stockQtyOnHand > 0) {\r\n return this.stockQtyOnHand;\r\n } else if (!this.selectedVariant.stockDetails.nonDepletingItem && !this.selectedVariant.stockDetails.backOrderItem && !this.selectedVariant.stockDetails.buildItem) {\r\n return 0;\r\n }\r\n }\r\n\r\n return 2147483647;\r\n },\r\n getQuantityRegEx() {\r\n var decimalRegEx = \"\";\r\n\r\n if (this.selectedVariant != null && this.selectedVariant.stockDetails != null && this.selectedVariant.stockDetails.qtyDecimalPlaces > 0) {\r\n decimalRegEx = \"\\\\d{1,\" + this.selectedVariant.stockDetails.qtyDecimalPlaces + \"}\";\r\n }\r\n\r\n var regEx = \"^\\\\s*(?=.*[1-9])\\\\d*(?:\\\\.\" + decimalRegEx + \")?\\\\s*$\";\r\n\r\n return regEx;\r\n },\r\n hasAttachments() {\r\n if (this.selectedVariant != null && this.selectedVariant.stockAttachments != null && this.selectedVariant.stockAttachments.length > 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n filteredStockAttachments() {\r\n return this.selectedVariant.stockAttachments ? this.selectedVariant.stockAttachments : [];\r\n },\r\n showStockAvailability() {\r\n if (this.selectedVariant != null && !this.stockNonDepletingItem && this.selectedVariant.stockStatuses != null && this.selectedVariant.stockStatuses.length > 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n filteredStockStatuses() {\r\n return this.selectedVariant.stockStatuses ? this.selectedVariant.stockStatuses : [];\r\n },\r\n isPurchasableItem () {\r\n if (this.selectedVariant != null) {\r\n return this.hasSomeStockAvailable;\r\n } else {\r\n return true;\r\n }\r\n },\r\n isBackOrderItem() {\r\n // Check back order separate to non-depleting\r\n return (this.selectedVariant != null && !this.stockNonDepletingItem && (this.selectedVariant.stockDetails.backOrderItem || this.selectedVariant.stockDetails.buildItem) && this.stockQtyOnHand <= 0);\r\n },\r\n isBuildItem() {\r\n return (this.selectedVariant != null && this.stockBuildItem);\r\n },\r\n isPurchaseButtonDisabled() {\r\n return !this.stockNonDepletingItem && this.stockQtyOnHand <= 0 && !this.stockBuildItem;\r\n },\r\n showAddToCartButton() {\r\n return !this.hasSelectedVariant() || this.stockQtyOnHand > 0 || this.stockNonDepletingItem || this.stockBuildItem;\r\n }\r\n },\r\n methods: {\r\n forceRerender() {\r\n //console.log('forceRerender');\r\n this.componentKey += 1;\r\n },\r\n stockWeightDisplayString() {\r\n //console.log('stockWeightDisplayString');\r\n if (this.stockWeight == 0) {\r\n return '';\r\n }\r\n\r\n // Format stock weight to 3 decimal places\r\n var decimalPlaces = 3;\r\n return this.stockWeight.toLocaleString(undefined, { minimumFractionDigits: decimalPlaces, maximumFractionDigits: decimalPlaces }) + ' kg';\r\n },\r\n hasSelectedVariant() {\r\n //console.log('hasSelectedVariant');\r\n if (this.selectedVariant != null) {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n clearSelectedVariant() {\r\n //console.log('clearSelectedVariant');\r\n // Clear the selected variant\r\n this.selectedVariant = null;\r\n // Restore the default stock values\r\n this.restoreDefaultStockValues();\r\n },\r\n setSelectedColour(classNo) {\r\n //console.log('setSelectedColour', { classNo: classNo });\r\n // Destroy the current carousel\r\n xpectWeb.productDetails.destroyProductImagesCarousel();\r\n\r\n // Indicate we need to reinitialise the carousel\r\n xpectWeb.productDetails.productImageSliderNeedsRefresh = true;\r\n\r\n // Update the selected colour\r\n this.selectedColour = classNo;\r\n var colourDetails = this.appData.multiVariant.colours.find(x => x.classNo == this.selectedColour);\r\n\r\n if (typeof colourDetails !== 'undefined') {\r\n this.selectedColourDescription = colourDetails.description;\r\n } else {\r\n this.selectedColourDescription = '';\r\n }\r\n\r\n // Force a re-render so the v-for's render correctly\r\n this.forceRerender();\r\n },\r\n setSelectedVariant(singleVariant) {\r\n //console.log('setSelectedVariant', { singleVariant: singleVariant });\r\n // Set the selected stock item\r\n this.selectedVariant = singleVariant;\r\n\r\n this.setDefaultPropertiesFromVariant(singleVariant);\r\n },\r\n\r\n setDefaultPropertiesFromVariant(singleVariant) {\r\n //console.log('setDefaultPropertiesFromVariant', { singleVariant: singleVariant });\r\n if (!singleVariant) {\r\n return;\r\n }\r\n\r\n var stockDetails = singleVariant.stockDetails;\r\n\r\n if (!stockDetails) {\r\n return;\r\n }\r\n\r\n // Set the helper properties\r\n this.stockMasterStockItemNo = stockDetails.masterStockItemNo;\r\n this.stockStockNo = stockDetails.stockNo;\r\n this.stockStockItemNo = stockDetails.stockItemNo;\r\n this.stockDescription = stockDetails.description;\r\n this.stockWeight = stockDetails.weight;\r\n this.stockDimensions = stockDetails.dimensions;\r\n this.stockQtyOnHand = stockDetails.qtyOnHand;\r\n this.stockNonDepletingItem = stockDetails.nonDepletingItem;\r\n this.stockSellingPriceDisplayString = stockDetails.sellingPriceDisplayString;\r\n this.stockSpecialPriceDisplayString = stockDetails.specialPriceDisplayString;\r\n this.stockOnSpecial = stockDetails.onSpecial;\r\n this.stockBuildItem = stockDetails.buildItem;\r\n this.fromPriceDisplayString = '';\r\n this.hasDifferentVariantPricing = false;\r\n\r\n this.totalPriceDisplayString = stockDetails.specialPriceDisplayString;\r\n\r\n this.downloadItem = stockDetails.downloadItem ? stockDetails.downloadItem : false;\r\n this.downloadID = stockDetails.downloadID ? stockDetails.downloadID : 0;\r\n this.dateTransactionDisplayString = stockDetails.dateTransactionDisplayString;\r\n this.downloadExpiresOnDisplayString = stockDetails.downloadExpiresOnDisplayString;\r\n this.downloadExpired = stockDetails.downloadExpired;\r\n\r\n this.agreeTermsAndConditionsUrl = stockDetails.agreeTermsAndConditionsUrl;\r\n this.termsAttachmentDescription = stockDetails.termsAttachmentDescription;\r\n this.termsAttachmentDownloadName = stockDetails.termsAttachmentDownloadName;\r\n this.termsAttachmentFileSizeDisplayString = stockDetails.termsAttachmentFileSizeDisplayString;\r\n\r\n this.unitsMeasure = stockDetails.unitsMeasure;\r\n this.classDescription1 = stockDetails.classDescription1;\r\n this.classDescription2 = stockDetails.classDescription2;\r\n this.classDescription3 = stockDetails.classDescription3;\r\n this.classDescription4 = stockDetails.classDescription4;\r\n this.classDescription5 = stockDetails.classDescription5;\r\n this.classDescription6 = stockDetails.classDescription6;\r\n this.classDescription7 = stockDetails.classDescription7;\r\n this.classDescription8 = stockDetails.classDescription8;\r\n this.classDescription9 = stockDetails.classDescription9;\r\n this.classDescription10 = stockDetails.classDescription10;\r\n this.classDescription11 = stockDetails.classDescription11;\r\n this.classDescription12 = stockDetails.classDescription12;\r\n this.classWebInclude1 = stockDetails.classWebInclude1;\r\n this.classWebInclude2 = stockDetails.classWebInclude2;\r\n this.classWebInclude3 = stockDetails.classWebInclude3;\r\n this.classWebInclude4 = stockDetails.classWebInclude4;\r\n this.classWebInclude5 = stockDetails.classWebInclude5;\r\n this.classWebInclude6 = stockDetails.classWebInclude6;\r\n this.classWebInclude7 = stockDetails.classWebInclude7;\r\n this.classWebInclude8 = stockDetails.classWebInclude8;\r\n this.classWebInclude9 = stockDetails.classWebInclude9;\r\n this.classWebInclude10 = stockDetails.classWebInclude10;\r\n this.classWebInclude11 = stockDetails.classWebInclude11;\r\n this.classWebInclude12 = stockDetails.classWebInclude12;\r\n this.className1 = stockDetails.className1;\r\n this.className2 = stockDetails.className2;\r\n this.className3 = stockDetails.className3;\r\n this.className4 = stockDetails.className4;\r\n this.className5 = stockDetails.className5;\r\n this.className6 = stockDetails.className6;\r\n this.className7 = stockDetails.className7;\r\n this.className8 = stockDetails.className8;\r\n this.className9 = stockDetails.className9;\r\n this.className10 = stockDetails.className10;\r\n this.className11 = stockDetails.className11;\r\n this.className12 = stockDetails.className12;\r\n\r\n if (this.quantityAutoNumeric != null) {\r\n // Remove existing AutoNumeric\r\n this.quantityAutoNumeric.remove();\r\n }\r\n\r\n // Configure default options\r\n var options = {\r\n minimumValue: \"0\",\r\n maximumValue: \"2147483647\",\r\n wheelOn: \"hover\",\r\n wheelStep: \"1\",\r\n emptyInputBehavior: \"min\",\r\n allowDecimalPadding: 'floats',\r\n };\r\n\r\n // Set the decimal places from the stock details\r\n options.decimalPlaces = stockDetails.qtyDecimalPlaces;\r\n\r\n // Set up the AutoNumeric quantity\r\n var qty = $(\"#quantity\")[0];\r\n\r\n if (qty) {\r\n this.quantityAutoNumeric = new AutoNumeric(qty, [options, \"numericPos\"]);\r\n }\r\n },\r\n restoreDefaultStockValues() {\r\n //console.log('restoreDefaultStockValues');\r\n if (typeof this.appData === 'undefined') {\r\n return;\r\n }\r\n\r\n if (this.appData.multiVariant != null && this.appData.multiVariant.stockDetails != null) {\r\n var multiVariantStockDetails = this.appData.multiVariant.stockDetails;\r\n\r\n // Restore default values with multi-variant stock details if available\r\n this.stockMasterStockItemNo = multiVariantStockDetails.masterStockItemNo;\r\n this.stockStockNo = multiVariantStockDetails.masterStockNo; // TODO: Perhaps name this just stockNo\r\n this.stockStockItemNo = 0;\r\n this.stockDescription = multiVariantStockDetails.description;\r\n this.stockWeight = multiVariantStockDetails.weight;\r\n this.stockDimensions = multiVariantStockDetails.dimensions;\r\n this.stockQtyOnHand = 0;\r\n this.stockNonDepletingItem = false;\r\n this.stockSellingPriceDisplayString = multiVariantStockDetails.sellingPriceDisplayString;\r\n this.stockSpecialPriceDisplayString = this.stockSellingPriceDisplayString; // Note: Multi-variant doesn't have a special price\r\n this.stockOnSpecial = false;\r\n this.stockBuildItem = false;\r\n this.fromPriceDisplayString = multiVariantStockDetails.fromPriceDisplayString;\r\n this.hasDifferentVariantPricing = multiVariantStockDetails.hasDifferentVariantPricing;\r\n\r\n this.totalPriceDisplayString = multiVariantStockDetails.specialPriceDisplayString;\r\n\r\n this.downloadItem = false;\r\n this.downloadID = 0;\r\n this.dateTransactionDisplayString = '';\r\n this.downloadExpiresOnDisplayString = '';\r\n this.downloadExpired = false;\r\n\r\n this.agreeTermsAndConditionsUrl = '';\r\n this.termsAttachmentDescription = '';\r\n this.termsAttachmentDownloadName = '';\r\n this.termsAttachmentFileSizeDisplayString = '';\r\n\r\n this.unitsMeasure = multiVariantStockDetails.unitsMeasure;\r\n this.classDescription1 = multiVariantStockDetails.classDescription1;\r\n this.classDescription2 = multiVariantStockDetails.classDescription2;\r\n this.classDescription3 = multiVariantStockDetails.classDescription3;\r\n this.classDescription4 = multiVariantStockDetails.classDescription4;\r\n this.classDescription5 = multiVariantStockDetails.classDescription5;\r\n this.classDescription6 = multiVariantStockDetails.classDescription6;\r\n this.classDescription7 = multiVariantStockDetails.classDescription7;\r\n this.classDescription8 = multiVariantStockDetails.classDescription8;\r\n this.classDescription9 = multiVariantStockDetails.classDescription9;\r\n this.classDescription10 = multiVariantStockDetails.classDescription10;\r\n this.classDescription11 = multiVariantStockDetails.classDescription11;\r\n this.classDescription12 = multiVariantStockDetails.classDescription12;\r\n this.classWebInclude1 = multiVariantStockDetails.classWebInclude1;\r\n this.classWebInclude2 = multiVariantStockDetails.classWebInclude2;\r\n this.classWebInclude3 = multiVariantStockDetails.classWebInclude3;\r\n this.classWebInclude4 = multiVariantStockDetails.classWebInclude4;\r\n this.classWebInclude5 = multiVariantStockDetails.classWebInclude5;\r\n this.classWebInclude6 = multiVariantStockDetails.classWebInclude6;\r\n this.classWebInclude7 = multiVariantStockDetails.classWebInclude7;\r\n this.classWebInclude8 = multiVariantStockDetails.classWebInclude8;\r\n this.classWebInclude9 = multiVariantStockDetails.classWebInclude9;\r\n this.classWebInclude10 = multiVariantStockDetails.classWebInclude10;\r\n this.classWebInclude11 = multiVariantStockDetails.classWebInclude11;\r\n this.classWebInclude12 = multiVariantStockDetails.classWebInclude12;\r\n this.className1 = multiVariantStockDetails.className1;\r\n this.className2 = multiVariantStockDetails.className2;\r\n this.className3 = multiVariantStockDetails.className3;\r\n this.className4 = multiVariantStockDetails.className4;\r\n this.className5 = multiVariantStockDetails.className5;\r\n this.className6 = multiVariantStockDetails.className6;\r\n this.className7 = multiVariantStockDetails.className7;\r\n this.className8 = multiVariantStockDetails.className8;\r\n this.className9 = multiVariantStockDetails.className9;\r\n this.className10 = multiVariantStockDetails.className10;\r\n this.className11 = multiVariantStockDetails.className11;\r\n this.className12 = multiVariantStockDetails.className12;\r\n } else if (this.appData.singleVariants != null && this.appData.singleVariants.length > 0) {\r\n // Restore default values with single-variant stock details if available\r\n var singleVariant = this.appData.singleVariants[0];\r\n\r\n this.setDefaultPropertiesFromVariant(singleVariant);\r\n }\r\n },\r\n addToCartSubmitButtonClick(evt, btnJqueryId) {\r\n // Track which submit button was clicked\r\n xpectWeb.productDetails.jqClickedSubmitButton = $(btnJqueryId);\r\n\r\n //console.log('addToCartSubmitClick', { btnJqueryId: btnJqueryId, jqClickedSubmitButton: xpectWeb.productDetails.jqClickedSubmitButton, form: form });\r\n\r\n // Check terms and conditions (if required)\r\n var hasAgreed = xpectWeb.productDetails.hasAgreedTermsAndConditions();\r\n\r\n if (!hasAgreed) {\r\n xpectWeb.productDetails.checkAgreedTermsConditions();\r\n\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n // if we can place an order for contacts then we need to show a popup to select the contact(s)\r\n if (this.appData.canPlaceOnlineOrderForContacts) {\r\n xpectWeb.utils.bootstrapModal('xpShopForContactsModal').show();\r\n this.loadShopForContactsList();\r\n return;\r\n }\r\n\r\n xpectWeb.productDetails.addToCartFormSubmit();\r\n },\r\n loadShopForContactsList() {\r\n var elem = $('#xpShopForContacts');\r\n elem.empty().append('');\r\n $.post('/umbraco/Surface/ShoppingCart/LoadShopForContacts', null, function (successResponse) {\r\n //console.log('loadShopForContactsList.success', { successResponse });\r\n elem.empty().append(successResponse);\r\n xpectWeb.productDetails.checkShopForContactsAddButton();\r\n });\r\n },\r\n productGalleryIndex(index) {\r\n return \"product-image-\" + index\r\n },\r\n productGalleryIndexHref(index) {\r\n return \"#product-image-\" + index\r\n },\r\n productImageCss(index) {\r\n return index === 0 ? \"active\" : \"\"\r\n },\r\n }\r\n },\r\n\r\n /* vue.js view model. Initialised later. */\r\n vm: undefined,\r\n\r\n productImageSlider: undefined,\r\n productThumbsSlider: undefined,\r\n productImageSliderNeedsRefresh: false,\r\n selectedCartContactNos: [],\r\n\r\n jqClickedSubmitButton: null, // Holds which submit button was clicked\r\n\r\n // Helpers for calculating a running total for products with options\r\n stockOptionGroups: [],\r\n stockOptionGroupItems: [],\r\n\r\n /* Initialises the vue app. */\r\n init: function (appData) {\r\n // console.log('init', { appData: appData });\r\n // Mount the vue.js app\r\n this.vm = Vue.createApp(this.app).mount('#form');\r\n\r\n // Assign a default AutoNumeric quantity\r\n var qty = $(\"#quantity\")[0];\r\n\r\n if (qty) {\r\n this.vm.quantityAutoNumeric = new AutoNumeric(qty, \"integerPos\");\r\n }\r\n\r\n // Initialise the view model data\r\n this.vm.appData = appData;\r\n\r\n // If there are related information sheets\r\n this.vm.hasRelatedInfoSheets = typeof appData.stockInfoSheets != null && appData.stockInfoSheets.length > 0;\r\n\r\n // If this is a multi-variant product\r\n this.vm.isMultiVariant = appData.multiVariant != null;\r\n\r\n // Restore default values\r\n this.vm.restoreDefaultStockValues();\r\n\r\n // restore selected CartContactNos (coming from the session as a csv string in the AppData)\r\n this.selectedCartContactNos = (appData.selectedCartContactNos)\r\n ? appData.selectedCartContactNos.split(',').map(x => Number(x))\r\n : [];\r\n\r\n // Check if we are using multi-variant or single-variant mode\r\n if (this.vm.isMultiVariant) {\r\n // Set up the colours and sizes\r\n this.initMultiVariant();\r\n } else {\r\n this.initSingleVariant();\r\n }\r\n },\r\n\r\n // Initialises the vue app for a multi-variant stock item\r\n initMultiVariant: function () {\r\n //console.log('initMultiVariant');\r\n // Initial setup the colours/sizes on load\r\n this.setColourEnable();\r\n this.setSizeEnable();\r\n this.selectStockItem();\r\n },\r\n\r\n // Initialises the vue app for a single-variant stock item\r\n initSingleVariant: function () {\r\n //console.log('initSingleVariant');\r\n if (this.vm.appData.singleVariants != null && this.vm.appData.singleVariants.length > 0) {\r\n var firstSingleVariant = this.vm.appData.singleVariants[0];\r\n var firstSingleVariantStockDetails = firstSingleVariant.stockDetails;\r\n\r\n // Populate lookups for calculating running total for variants with options\r\n if (typeof firstSingleVariant.stockOptionGroups !== 'undefined' && firstSingleVariant.stockOptionGroups.length > 0) {\r\n $(firstSingleVariant.stockOptionGroups).each(function (index, stockOptionGroup) {\r\n xpectWeb.productDetails.stockOptionGroups.push({ id: stockOptionGroup.id, selectType: stockOptionGroup.selectType });\r\n\r\n $(stockOptionGroup.stockOptionGroupItems).each(function (index, stockOptionGroupItem) {\r\n xpectWeb.productDetails.stockOptionGroupItems.push({\r\n id: stockOptionGroupItem.id,\r\n stockOptionGroupID: stockOptionGroup.id,\r\n sellingPriceInc: xpectWeb.utils.convertCurrency(\r\n (stockOptionGroupItem.localSellingPriceInc ? stockOptionGroupItem.localSellingPriceInc : 0),\r\n (stockOptionGroupItem.localSellingPriceEx ? stockOptionGroupItem.localSellingPriceEx : 0),\r\n (stockOptionGroupItem.sellingPriceInc ? stockOptionGroupItem.sellingPriceInc : 0),\r\n (stockOptionGroupItem.sellingPriceEx ? stockOptionGroupItem.sellingPriceEx : 0),\r\n xpectWeb.productDetails.vm.appData.customerCurrency,\r\n xpectWeb.productDetails.vm.appData.displayCurrencyPreference)\r\n });\r\n });\r\n });\r\n }\r\n\r\n if (firstSingleVariantStockDetails != null) {\r\n // Check stock availability\r\n this.vm.hasSomeStockAvailable = (firstSingleVariantStockDetails.qtyOnHand > 0) || firstSingleVariantStockDetails.backOrderItem || firstSingleVariantStockDetails.buildItem || firstSingleVariantStockDetails.nonDepletingItem;\r\n\r\n // If we don't have a multi-variant and there is at least one single-variant then set the selected variant to the first variant\r\n this.vm.setSelectedVariant(firstSingleVariant);\r\n }\r\n }\r\n },\r\n\r\n initProductSliders: function () {\r\n //console.log('initProductSliders');\r\n /*\r\n * Product Images Slider\r\n */\r\n this.initProductImagesSlider();\r\n },\r\n\r\n initProductImagesSlider: function () {\r\n //console.log('initProductImagesSlider');\r\n\r\n if ($(\".product-gallery\").length == 0) {\r\n return;\r\n }\r\n\r\n // Initialise product gallery\r\n if (typeof xpectLib === 'object' && typeof xpectLib.default === 'object' && typeof xpectLib.default.productGallery === 'function') {\r\n xpectLib.default.productGallery();\r\n }\r\n\r\n // Initialise zoom\r\n if (typeof xpectLib === 'object' && typeof xpectLib.default === 'object' && typeof xpectLib.default.imageZoom === 'function') {\r\n xpectLib.default.imageZoom();\r\n }\r\n\r\n //if (typeof this.productThumbsSlider === 'undefined') {\r\n // this.productThumbsSlider = new Swiper('.gallery-thumbs', {\r\n // spaceBetween: 10,\r\n // slidesPerView: 5,\r\n // loop: false,\r\n // freeMode: true,\r\n // watchSlidesVisibility: true,\r\n // watchSlidesProgress: true,\r\n // });\r\n //}\r\n\r\n //if (typeof this.productImageSlider === 'undefined') {\r\n // this.productImageSlider = new Swiper('.gallery-top', {\r\n // zoom: true,\r\n // spaceBetween: 10,\r\n // loop: true,\r\n // thumbs: {\r\n // swiper: this.productThumbsSlider,\r\n // },\r\n // });\r\n\r\n // // Disable swiping when zoomed\r\n // this.productImageSlider.on('zoomChange', function (swiper, scale, imageEl, slideEl) {\r\n // this.allowTouchMove = scale === 1;\r\n // });\r\n //}\r\n\r\n // If an image exists for this colour display it\r\n //this.selectImage(this.vm.selectedColour);\r\n this.selectGalleryImage(this.vm.selectedColour);\r\n },\r\n\r\n destroyProductImagesCarousel: function () {\r\n //console.log('destroyProductImagesCarousel');\r\n if (typeof xpectWeb.productDetails.productImageSlider !== 'undefined') {\r\n xpectWeb.productDetails.productImageSlider.destroy(true, true);\r\n xpectWeb.productDetails.productImageSlider = undefined;\r\n }\r\n\r\n if (typeof xpectWeb.productDetails.productThumbsSlider !== 'undefined') {\r\n xpectWeb.productDetails.productThumbsSlider.destroy(true, true);\r\n xpectWeb.productDetails.productThumbsSlider = undefined;\r\n }\r\n },\r\n\r\n // Switch the main image\r\n selectImage: function (classNo) {\r\n //console.log('selectImage');\r\n var productImageIndex = xpectWeb.productDetails.vm.filteredStockImages.findIndex(x => x.variantClassNo == classNo);\r\n\r\n if (productImageIndex > 0) {\r\n this.productImageSlider.slideTo(productImageIndex + 1);\r\n }\r\n },\r\n\r\n // Switch the gallery image\r\n selectGalleryImage: function (classNo) {\r\n var $thumbnailImages = $(\".product-gallery .product-gallery-thumblist-item img\");\r\n\r\n if ($thumbnailImages.length > 0) {\r\n var productImageIndex = xpectWeb.productDetails.vm.filteredStockImages.findIndex(x => x.variantClassNo == classNo);\r\n\r\n if (classNo > 0 && productImageIndex > 0 && productImageIndex < $thumbnailImages.length) {\r\n $($thumbnailImages[productImageIndex]).click();\r\n }\r\n }\r\n },\r\n\r\n // Select a colour\r\n selectColour: function (classNo) {\r\n //console.log('selectColour');\r\n // Ignore selection if not available\r\n if (this.isAvailable(classNo, this.vm.selectedSize)) {\r\n // If this colour has already been selected, set the selection to 0\r\n if (this.vm.selectedColour === classNo) {\r\n this.vm.setSelectedColour(0);\r\n } else {\r\n this.vm.setSelectedColour(classNo);\r\n }\r\n\r\n this.setColourEnable();\r\n this.setSizeEnable(); // Disable sizes that are out of stock\r\n this.selectStockItem();\r\n }\r\n },\r\n\r\n // Select specified size\r\n selectSize: function (size) {\r\n //console.log('selectSize');\r\n // Ignore selection if not available\r\n if (this.isAvailable(this.vm.selectedColour, size)) {\r\n // If this size has already been selected, set the selection to 0\r\n if (this.vm.selectedSize === size) {\r\n this.vm.selectedSize = 0;\r\n } else {\r\n this.vm.selectedSize = size;\r\n }\r\n\r\n this.setColourEnable(); // Disable colours that are out of stock\r\n this.setSizeEnable();\r\n this.selectStockItem();\r\n }\r\n },\r\n\r\n // Select the stock item for the selected colour and size\r\n selectStockItem: function () {\r\n //console.log('selectStockItem');\r\n var j = 0;\r\n var noStock = this.vm.appData.singleVariants.length;\r\n this.vm.clearSelectedVariant();\r\n\r\n while (j < noStock) {\r\n var singleVariant = this.vm.appData.singleVariants[j];\r\n var stockDetails = singleVariant.stockDetails;\r\n\r\n if ((stockDetails.classNo4 == this.vm.selectedColour) && (stockDetails.classNo5 == this.vm.selectedSize)) {\r\n this.vm.setSelectedVariant(singleVariant);\r\n\r\n return;\r\n }\r\n\r\n j++;\r\n }\r\n\r\n // If we didn't select an item restore the default\r\n this.vm.restoreDefaultStockValues();\r\n },\r\n\r\n // Set colour button enable states based on available stock\r\n setColourEnable: function () {\r\n //console.log('setColourEnable');\r\n this.vm.hasSomeStockAvailable = false;\r\n\r\n if (typeof (this.vm.appData.multiVariant.colours) === 'undefined' || this.vm.appData.multiVariant.colours == null) {\r\n return;\r\n }\r\n\r\n // Disable colours that are out of stock\r\n var noColours = this.vm.appData.multiVariant.colours.length;\r\n for (var i = 0; i < noColours; i++) {\r\n var thisColour = this.vm.appData.multiVariant.colours[i].classNo;\r\n var colourVariant = $(\"#xp-colour-variant-\" + thisColour);\r\n\r\n // Check availability\r\n if (this.isAvailable(thisColour, this.vm.selectedSize)) {\r\n this.vm.hasSomeStockAvailable = true;\r\n colourVariant.removeClass(\"xp-unavailable\");\r\n\r\n // If this colour is selected then keep the selection\r\n if (thisColour == this.vm.selectedColour) {\r\n colourVariant.addClass(\"xp-selected\");\r\n } else {\r\n colourVariant.removeClass(\"xp-selected\");\r\n }\r\n } else {\r\n // If this colour was selected in a different size then deselect it as it is not available\r\n if (thisColour == this.vm.selectedColour) {\r\n this.vm.setSelectedColour(0);\r\n }\r\n\r\n colourVariant.removeClass(\"xp-selected\");\r\n colourVariant.addClass(\"xp-unavailable\");\r\n }\r\n }\r\n },\r\n\r\n // Set size button enable states based on available stock\r\n setSizeEnable: function () {\r\n //console.log('setSizeEnable');\r\n this.vm.hasSomeStockAvailable = false;\r\n\r\n if (typeof (this.vm.appData.multiVariant.sizes) === 'undefined' || this.vm.appData.multiVariant.sizes == null) {\r\n return;\r\n }\r\n\r\n // Disable sizes that are out of stock\r\n var noSizes = this.vm.appData.multiVariant.sizes.length;\r\n for (var i = 0; i < noSizes; i++) {\r\n var thisSize = this.vm.appData.multiVariant.sizes[i];\r\n var sizeVariant = $(\"#xp-size-variant-\" + thisSize);\r\n\r\n // Check availability\r\n if (this.isAvailable(this.vm.selectedColour, thisSize)) {\r\n this.vm.hasSomeStockAvailable = true;\r\n sizeVariant.removeClass(\"xp-unavailable\");\r\n\r\n // If this size is selected then keep the selection\r\n if (thisSize == this.vm.selectedSize) {\r\n sizeVariant.addClass(\"xp-selected\");\r\n } else {\r\n sizeVariant.removeClass(\"xp-selected\");\r\n }\r\n } else {\r\n // If this size was selected in a different colour then deselect it as it is not available\r\n if (thisSize == this.vm.selectedSize) {\r\n this.vm.selectedSize = 0;\r\n }\r\n\r\n sizeVariant.removeClass(\"xp-selected\");\r\n sizeVariant.addClass(\"xp-unavailable\");\r\n }\r\n }\r\n },\r\n\r\n // Is this colour and size available. Use 0 or -1 to ignore a parameter.\r\n isAvailable: function (colour, size) {\r\n //console.log('isAvailable');\r\n var j = 0;\r\n var isAvailable = false;\r\n var noStock = this.vm.appData.singleVariants.length;\r\n\r\n while (j < noStock) {\r\n var singleVariant = this.vm.appData.singleVariants[j];\r\n var stockDetails = singleVariant.stockDetails;\r\n\r\n if ((colour <= 0 || stockDetails.classNo4 == colour) && (size <= 0 || stockDetails.classNo5 == size)) {\r\n isAvailable = (stockDetails.qtyOnHand > 0) || stockDetails.backOrderItem || stockDetails.buildItem || stockDetails.nonDepletingItem;\r\n\r\n // If looking for a specific colour\r\n if (colour > 0 && size > 0) {\r\n break;\r\n } else if (isAvailable) {\r\n break;\r\n }\r\n }\r\n\r\n j++;\r\n }\r\n\r\n return isAvailable;\r\n },\r\n\r\n // submit the add-to-cart form\r\n addToCartFormSubmit: function () {\r\n //console.log('addToCartFormSubmit', { cartContactNos: this.selectedCartContactNos });\r\n if (this.selectedCartContactNos.length > 0) {\r\n $('#cartContactNos').val(this.selectedCartContactNos.join(','));\r\n }\r\n else {\r\n $('#cartContactNos').val('');\r\n }\r\n $('#form').find('form').submit();\r\n },\r\n\r\n /*\r\n * AJAX form submission, callbacks, and alerts\r\n */\r\n getSubmitSuccessMessage: function () {\r\n // Default\r\n return '
Thanks, this item has been added to your cart. Click here to view your cart.
';\r\n },\r\n\r\n showAddToCartSubmissionSuccessAlert: function () {\r\n //console.log('showAddToCartSubmissionSuccessAlert');\r\n // Show item added to cart alert\r\n var submitButtonDetails = this.getClickedSubmitButtonDetails();\r\n\r\n // Show success alert\r\n xpectWeb.showAlertSuccessNotification(submitButtonDetails.initiator.parents(\"div:eq(0)\"), 'item-success-' + submitButtonDetails.index, 'item-success mt-4', this.getSubmitSuccessMessage());\r\n },\r\n\r\n showAddToCartSubmissionErrorAlert: function (alertHtmlMessage) {\r\n //console.log('showAddToCartSubmissionErrorAlert', alertHtmlMessage);\r\n var submitButtonDetails = this.getClickedSubmitButtonDetails();\r\n\r\n // Show alert\r\n xpectWeb.showAlertDangerNotification(submitButtonDetails.initiator.parents(\"div:eq(0)\"), 'item-error-' + submitButtonDetails.index, 'item-error mt-4', alertHtmlMessage);\r\n },\r\n\r\n onAddToCartSubmitSuccessCallback: function (response) {\r\n //console.log('onAddToCartSubmitSuccessCallback', response);\r\n\r\n // Check if the item was added to the cart\r\n if (response.HasError) {\r\n var errorMessageHtml = \"
Error
\";\r\n\r\n // Show error alert to user\r\n if (typeof response.Message === 'string') {\r\n errorMessageHtml += \"
\" + response.Message + \"
\";\r\n }\r\n\r\n if (typeof response.Details === 'object' && Array.isArray(response.Details)) {\r\n if (response.Details.length > 0) {\r\n errorMessageHtml += '';\r\n }\r\n }\r\n\r\n xpectWeb.productDetails.showAddToCartSubmissionErrorAlert(errorMessageHtml);\r\n } else {\r\n if (xpectWeb.productDetails.jqClickedSubmitButton.length > 0) {\r\n var submitButtonValue = xpectWeb.productDetails.jqClickedSubmitButton.val().toLowerCase();\r\n\r\n // Check if the buy now button was clicked\r\n if (submitButtonValue === \"buy now\") {\r\n // Redirect to the cart\r\n window.location.href = xpectWeb.productDetails.vm.appData.cartUrl;\r\n return;\r\n }\r\n }\r\n\r\n // Show success alert to user\r\n xpectWeb.productDetails.showAddToCartSubmissionSuccessAlert();\r\n }\r\n\r\n // Clear the clicked submit button\r\n xpectWeb.productDetails.jqClickedSubmitButton = null;\r\n\r\n // Update the (mini) cart totals\r\n xpectWeb.increaseCartQuantity(response.Data || 0);\r\n },\r\n\r\n onAddToCartSubmitFailureCallback: function (data) {\r\n //console.log(\"onAddToCartSubmitFailureCallback\", data);\r\n\r\n // Show error alert to user\r\n xpectWeb.productDetails.showAddToCartSubmissionErrorAlert(\"
An error has occurred. Please try addding the item to your cart again.
\");\r\n\r\n // Clear the clicked submit button\r\n xpectWeb.productDetails.jqClickedSubmitButton = null;\r\n },\r\n\r\n //\r\n // Check Agreed Terms Conditions\r\n //\r\n hasAgreedTermsAndConditions: function () {\r\n //console.log('hasAgreedTermsAndConditions');\r\n var termsCheckbox = $(\"#agreeTermsConditions\");\r\n\r\n if (termsCheckbox.length > 0) {\r\n return termsCheckbox.is(\":checked\");\r\n }\r\n\r\n return true;\r\n },\r\n\r\n checkAgreedTermsConditions: function () {\r\n //console.log('checkAgreedTermsConditions');\r\n var agreed = this.hasAgreedTermsAndConditions();\r\n\r\n if (agreed) return;\r\n\r\n this.showTermsConditionsAlert();\r\n },\r\n\r\n showTermsConditionsAlert: function () {\r\n //console.log('showTermsConditionsAlert');\r\n // Show terms and conditions alert\r\n var submitButtonDetails = this.getClickedSubmitButtonDetails();\r\n\r\n // Show terms and conditions alert\r\n xpectWeb.showAlertDangerNotification(submitButtonDetails.initiator.parents(\"div:eq(0)\"), 'terms-and-conditions-notification-' + submitButtonDetails.index, 'terms-and-conditions-notification mt-4', '
You must agree to the terms and conditions to purchase this product.
');\r\n },\r\n\r\n //\r\n // Gets which submit button was clicked and it's corresponding index\r\n //\r\n getClickedSubmitButtonDetails: function () {\r\n var response = {\r\n initiator: undefined,\r\n index: undefined\r\n };\r\n\r\n var submitButtons = $(\"input[name='addToCartSubmitButton']\");\r\n\r\n // Check which add to cart button was clicked\r\n if (this.jqClickedSubmitButton != null) {\r\n response.initiator = this.jqClickedSubmitButton;\r\n response.index = submitButtons.index(response.initiator);\r\n } else {\r\n this.jqClickedSubmitButton = submitButtons[0];\r\n response.initiator = this.jqClickedSubmitButton;\r\n response.index = 0;\r\n }\r\n\r\n //console.log('getClickedSubmitButtonDetails', { response: response, submitButtons: submitButtons, jqClickedSubmitButton: this.jqClickedSubmitButton });\r\n\r\n return response;\r\n },\r\n\r\n //\r\n // Calculates the total price for products with optional extras.\r\n //\r\n calculateTotalPrice: function () {\r\n //console.info('calculateTotalPrice');\r\n var totalSellingPrice = xpectWeb.utils.convertCurrency(\r\n this.vm.selectedVariant.stockDetails.localSpecialPriceInc,\r\n this.vm.selectedVariant.stockDetails.localSpecialPriceEx,\r\n this.vm.selectedVariant.stockDetails.specialPriceInc,\r\n this.vm.selectedVariant.stockDetails.specialPriceEx,\r\n this.vm.appData.customerCurrency,\r\n this.vm.appData.displayCurrencyPreference);\r\n\r\n //console.log('totalSellingPrice', totalSellingPrice);\r\n for (var i = 0; i < xpectWeb.productDetails.stockOptionGroups.length; i++) {\r\n var stockOptionGroup = xpectWeb.productDetails.stockOptionGroups[i];\r\n\r\n var stockOptionGroupItem = undefined;\r\n var j = 0;\r\n\r\n // Dropdown list\r\n if (stockOptionGroup.selectType == xpectWeb.enums.stockOptionGroupSelectType.listSingleSelection) {\r\n var selected = $('#xp-og-' + stockOptionGroup.id);\r\n if (selected && selected.val() > 0) {\r\n for (j = 0; j < xpectWeb.productDetails.stockOptionGroupItems.length; j++) {\r\n stockOptionGroupItem = xpectWeb.productDetails.stockOptionGroupItems[j];\r\n if (stockOptionGroupItem.id == selected.val()) {\r\n //console.log('d stockOptionGroupItem.sellingPriceInc', stockOptionGroupItem.sellingPriceInc);\r\n\r\n totalSellingPrice += stockOptionGroupItem.sellingPriceInc;\r\n }\r\n }\r\n }\r\n }\r\n // Checkbox/radio\r\n else {\r\n for (j = 0; j < xpectWeb.productDetails.stockOptionGroupItems.length; j++) {\r\n stockOptionGroupItem = xpectWeb.productDetails.stockOptionGroupItems[j];\r\n if (stockOptionGroupItem.stockOptionGroupID == stockOptionGroup.id) {\r\n var el = $('#xp-gi-' + stockOptionGroupItem.id);\r\n var checked = el.is(':checked');\r\n var parent = el.parent();\r\n if (checked) {\r\n //console.log('cb r stockOptionGroupItem.sellingPriceInc', stockOptionGroupItem.sellingPriceInc);\r\n totalSellingPrice += stockOptionGroupItem.sellingPriceInc;\r\n parent.addClass(\"xp-checked\");\r\n } else {\r\n parent.removeClass('xp-checked');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Format the total amount to a currency string\r\n this.vm.totalPriceDisplayString = xpectWeb.utils.formatCurrency(\r\n this.vm.appData.displayCurrencyPreference.symbol,\r\n totalSellingPrice,\r\n this.vm.appData.displayCurrencyPreference.decimalPlaces,\r\n false);\r\n },\r\n\r\n //\r\n // Shop For Contact Selected/Unselected\r\n //\r\n shopForContactSelect: function (checkbox, contactNo) {\r\n this.selectedCartContactNos = this.selectedCartContactNos || [];\r\n var idx = this.selectedCartContactNos.indexOf(contactNo);\r\n //console.log('shopForContactSelect', { checked: checkbox.checked, contactNo: contactNo, selectedCartContactNos: this.selectedCartContactNos, idx: idx })\r\n if (checkbox.checked) {\r\n if (idx < 0) {\r\n this.selectedCartContactNos.push(contactNo);\r\n }\r\n }\r\n else {\r\n if (idx > -1) {\r\n this.selectedCartContactNos.splice(idx);\r\n }\r\n }\r\n\r\n this.checkShopForContactsAddButton();\r\n },\r\n\r\n //\r\n // Shop For Contact Add Selected Button\r\n //\r\n checkShopForContactsAddButton: function () {\r\n //console.log('checkShopForContactsAddButton', { selectedCartContactNos: this.selectedCartContactNos });\r\n var disabled = (!this.selectedCartContactNos || !this.selectedCartContactNos.length);\r\n $('#xpShopForContactsAddSelectedButton').prop('disabled', disabled);\r\n },\r\n\r\n //\r\n // Shop For Contact checkbox init\r\n //\r\n setShopForContactsCheckboxes: function () {\r\n //console.log('setShopForContactsCheckboxes', { selectedCartContactNos: this.selectedCartContactNos });\r\n this.selectedCartContactNos.forEach((contactNo) => {\r\n $(\"#cbx-contact-\" + contactNo).prop(\"checked\", true);\r\n });\r\n var disabled = (!this.selectedCartContactNos || !this.selectedCartContactNos.length);\r\n $('#xpShopForContactsAddSelectedButton').prop('disabled', disabled);\r\n }\r\n};\r\n\r\n$(function () {\r\n xpectWeb.productDetails.initProductSliders();\r\n});\nvar xpectWeb = xpectWeb || {};\r\n\r\nxpectWeb.search = {\r\n init: function (model) {\r\n //console.log('xpectWeb.search.init', { model: model });\r\n xpectWeb.search.model = model;\r\n $('#xp-search-input').focus();\r\n },\r\n run: function () {\r\n //console.log('xpectWeb.search.run', { model: xpectWeb.search.model });\r\n const url = xpectWeb.search.model.LoadMoreURL;\r\n const data = {\r\n searchPhrase: xpectWeb.search.model.SearchPhrase,\r\n paginationPageSize: xpectWeb.search.model.PageSize,\r\n paginationPageNo: ++xpectWeb.search.model.PageNumber\r\n };\r\n $.post(url, data, function (successResponse) {\r\n //console.log('xpectWeb.search.run.success', { url, successResponse });\r\n $('#xp-search-results-more').empty().append(successResponse);\r\n \r\n }).fail(function (errorResponse) {\r\n console.error('xpectWeb.search.run', { url, errorResponse });\r\n });\r\n }\r\n};\nvar xpectWeb = xpectWeb || {};\r\n\r\nxpectWeb.shoppingCart = {\r\n _lastRequestDateTime: null, // When the last API request was made\r\n _sessionExpiryWarningInterval: null, // The interval for checking for session expiry\r\n _sessionExpiryWarningModal: null, // The session expiry warning modal\r\n _sessionCountdownInterval: null, // The interval for the session expiry warning countdown\r\n _sessionExpiryWarningMilliseconds: 15*60*1000, // Hardcoded 15 mins session expiry check (default session is 20 mins).\r\n _sessionExpiryWarningDurationSeconds: 2*60, // Give user 2 minutes to complete checkout.\r\n checkSessionExpiry: function() {\r\n // console.log('checkSessionExpiry called', xpectWeb.shoppingCart._lastRequestDateTime, xpectWeb.shoppingCart._sessionExpiryWarningInterval, $('#xpSessionWarningModal'));\r\n \r\n if (xpectWeb.shoppingCart._lastRequestDateTime === null ||\r\n xpectWeb.shoppingCart._sessionExpiryWarningInterval === null ||\r\n $('#xpSessionWarningModal').length === 0 ||\r\n $('#xpSessionWarningModal').is(':visible')) {\r\n return;\r\n }\r\n\r\n var millisecondsSinceLastRequest = ((new Date()) - xpectWeb.shoppingCart._lastRequestDateTime);\r\n\r\n if (millisecondsSinceLastRequest >= xpectWeb.shoppingCart._sessionExpiryWarningMilliseconds) {\r\n // Clear countdown timer\r\n if (xpectWeb.shoppingCart._sessionCountdownInterval != null) {\r\n clearInterval(xpectWeb.shoppingCart._sessionCountdownInterval);\r\n xpectWeb.shoppingCart._sessionCountdownInterval = null;\r\n }\r\n\r\n // Ensure the modal is the last element as it will need to appear over the top of PayPal checkout overlay\r\n $('body').append($('#xpSessionWarningModal').detach());\r\n\r\n var sessionWarningDurationSeconds = xpectWeb.shoppingCart._sessionExpiryWarningDurationSeconds;\r\n $('#xpSessionTimeoutCountdown').html(sessionWarningDurationSeconds + ' seconds');\r\n\r\n // Show the model\r\n xpectWeb.shoppingCart._sessionExpiryWarningModal = xpectWeb.utils.bootstrapModal('xpSessionWarningModal');\r\n xpectWeb.shoppingCart._sessionExpiryWarningModal.show();\r\n\r\n // Create countdown timer\r\n var countdownStartDate = new Date();\r\n xpectWeb.shoppingCart._sessionCountdownInterval = setInterval(function() {\r\n var millisecondsSinceCountdownStarted = ((new Date()) - countdownStartDate);\r\n var secondsRemaining = Math.ceil(((sessionWarningDurationSeconds * 1000) - millisecondsSinceCountdownStarted) / 1000);\r\n \r\n if (secondsRemaining >= 0) {\r\n $('#xpSessionTimeoutCountdown').html(secondsRemaining + ' seconds');\r\n }\r\n\r\n if (secondsRemaining < 0) {\r\n xpectWeb.shoppingCart.endSession();\r\n }\r\n }, 1000);\r\n }\r\n },\r\n endSession: function() {\r\n clearInterval(xpectWeb.shoppingCart._sessionExpiryWarningInterval);\r\n xpectWeb.shoppingCart._sessionExpiryWarningInterval = null;\r\n\r\n clearInterval(xpectWeb.shoppingCart._sessionCountdownInterval);\r\n xpectWeb.shoppingCart._sessionCountdownInterval = null;\r\n\r\n // Ensure the session has ended. \r\n // TODO: Payment gateway Web hooks should be used to avoid browser/session issues. E.g., user manages to click the payment button just as the session expired.\r\n $.post(xpectWeb.shoppingCart.model.EndSessionURL, null, function (successResponse) {\r\n // 25/08/2023: Tony said to just redirect them to the homepage instead of creating a session expired error page.\r\n window.location.href = '/';\r\n }).fail(function (errorResponse) {\r\n // 25/08/2023: Tony said to just redirect them to the homepage instead of creating a session expired error page.\r\n window.location.href = '/';\r\n });\r\n },\r\n init: function (model) {\r\n // console.log('xpectWeb.shoppingCart.init', model);\r\n\r\n xpectWeb.shoppingCart._lastRequestDateTime = new Date();\r\n\r\n $(function() {\r\n // Start session expired interval\r\n if ($('#xpSessionWarningModal').length > 0) {\r\n xpectWeb.shoppingCart._sessionExpiryWarningInterval = setInterval(xpectWeb.shoppingCart.checkSessionExpiry, 1000); // Check every second (browser pausing background tabs may stop it)\r\n }\r\n });\r\n\r\n xpectWeb.shoppingCart.model = model;\r\n xpectWeb.shoppingCart.elem = document.getElementById(\"xpectShoppingCart\");\r\n if (xpectWeb.shoppingCart.elem) {\r\n //\r\n // events (must be added before properties as some event trigger property updates)\r\n //\r\n // onLoadCart\r\n xpectWeb.shoppingCart.elem.addEventListener('onLoadCart', (event) => {\r\n //console.log('onLoadCart', { event: event.detail });\r\n xpectWeb.shoppingCart.load(event.detail);\r\n });\r\n // onLoadDeliveryMethods\r\n xpectWeb.shoppingCart.elem.addEventListener('onLoadDeliveryMethods', (event) => {\r\n //console.log('onLoadDeliveryMethods', { event: event.detail });\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.DistributionMethodsURL,\r\n event.detail,\r\n function (successResponse) {\r\n xpectWeb.shoppingCart.elem.setAttribute('delivery-methods', JSON.stringify(successResponse));\r\n }\r\n );\r\n });\r\n // onLoginClick\r\n xpectWeb.shoppingCart.elem.addEventListener('onLoginClick', (event) => {\r\n //console.log('onLoginClick', { event: event.detail });\r\n window.location.href = xpectWeb.shoppingCart.model.LoginURL;\r\n });\r\n // onSignupClick\r\n xpectWeb.shoppingCart.elem.addEventListener('onSignupClick', (event) => {\r\n //console.log('onSignupClick', { event: event.detail });\r\n window.location.href = xpectWeb.shoppingCart.model.JoinURL;\r\n });\r\n // onEditForm\r\n xpectWeb.shoppingCart.elem.addEventListener('onEditForm', (event) => {\r\n //console.log('onEditForm', { event: event.detail });\r\n window.location = xpectWeb.shoppingCart.model.FormsPageURL + event.detail.friendlyURL;\r\n console.error('onEditForm not implemented!');\r\n });\r\n // onItemView\r\n xpectWeb.shoppingCart.elem.addEventListener('onItemView', (event) => {\r\n //console.log('onItemView', { event: event.detail });\r\n window.location.href = xpectWeb.shoppingCart.model.ViewCartItemURL + event.detail;\r\n });\r\n // onItemUpdate\r\n xpectWeb.shoppingCart.elem.addEventListener('onItemUpdate', (event) => {\r\n //console.log('onItemUpdate', { event: event.detail });\r\n const params = { quantity: event.detail.quantity };\r\n const loadParams = event.detail;\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.UpdateCartItemURL + event.detail.id,\r\n params,\r\n function (successResponse) {\r\n xpectWeb.shoppingCart.load(loadParams);\r\n }\r\n );\r\n });\r\n // onItemDelete\r\n xpectWeb.shoppingCart.elem.addEventListener('onItemDelete', (event) => {\r\n //console.log('onItemDelete', { event: event.detail });\r\n const loadParams = event.detail;\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.DeleteCartItemURL + event.detail.id,\r\n null,\r\n function (successResponse) {\r\n xpectWeb.shoppingCart.load(loadParams);\r\n }\r\n );\r\n });\r\n // onEmpty\r\n xpectWeb.shoppingCart.elem.addEventListener('onEmpty', (event) => {\r\n //console.log('onEmpty', { event: event.detail });\r\n const loadParams = event.detail;\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.EmptyCartURL,\r\n null,\r\n function (successResponse) {\r\n xpectWeb.shoppingCart.load(loadParams);\r\n }\r\n );\r\n });\r\n // onApplyPromotionCode\r\n xpectWeb.shoppingCart.elem.addEventListener('onApplyPromotionCode', (event) => {\r\n //console.log('onApplyPromotionCode', { event: event.detail });\r\n const loadParams = event.detail;\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.PromotionCodeURL,\r\n event.detail,\r\n function (successResponse) {\r\n if (successResponse && successResponse.PromotionCodeID) {\r\n xpectWeb.shoppingCart.model.promotionCode = successResponse;\r\n xpectWeb.shoppingCart.elem.setAttribute('promotion-code', successResponse.PromotionCodeID);\r\n xpectWeb.shoppingCart.elem.setAttribute('custom-message', JSON.stringify({ title: 'Promotion Code Applied', success: 'The promotion code was successfully applied.', autoHide: 3000}));\r\n loadParams.promotionCodeID = successResponse.PromotionCodeID;\r\n xpectWeb.shoppingCart.load(loadParams);\r\n }\r\n else {\r\n xpectWeb.shoppingCart.elem.setAttribute('custom-message', JSON.stringify({ title: 'Promotion Code Error', error: successResponse.Message || \"Invalid Promotion Code.\", autoHide: 5000 }));\r\n }\r\n }\r\n );\r\n });\r\n // onCompleteCheckout\r\n xpectWeb.shoppingCart.elem.addEventListener('onCompleteCheckout', (event) => {\r\n //console.log('onCompleteCheckout', { event: event.detail } );\r\n event.detail.Sale = event.detail.Sale || {};\r\n event.detail.Order = event.detail.Order || {};\r\n // store in mode as will re-use for if/when paypal authorised\r\n xpectWeb.shoppingCart.model.checkoutParams = event.detail;\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.CheckoutURL,\r\n xpectWeb.shoppingCart.model.checkoutParams,\r\n function (response) {\r\n // keep a copy of the response in case we need it (dont think we do)\r\n //xpectWeb.shoppingCart.model.CheckoutResponse = response;\r\n\r\n var checkoutResponse = (response && response.CheckoutResponse) ? response.CheckoutResponse : null;\r\n\r\n if (response && typeof response === 'object') {\r\n if (checkoutResponse && typeof checkoutResponse === 'object') {\r\n // notify component of checkout result (payment/gateway/transaction)\r\n xpectWeb.shoppingCart.elem.setAttribute('payment-result', JSON.stringify(checkoutResponse.Payment));\r\n }\r\n\r\n if (response.SessionData && typeof response.SessionData === 'object') {\r\n // notify component of new session details if a guest customer was created\r\n xpectWeb.shoppingCart.elem.setAttribute('session', JSON.stringify(response.SessionData));\r\n }\r\n }\r\n\r\n // checkout completed successfully\r\n if (checkoutResponse && checkoutResponse.Success) {\r\n if (checkoutResponse.Payment.Success) {\r\n xpectWeb.shoppingCart.applyReceipt(checkoutResponse.Receipt);\r\n }\r\n if (checkoutResponse.Payment.GatewayReady) {\r\n xpectWeb.shoppingCart.elem.setAttribute('custom-message', JSON.stringify({ title: 'Finalise your payment with PayPal', success: 'Your cart has been processed and is now awaiting your payment via PayPal within the next 15 minutes. Please commence your payment via the PayPal button below and ensure this page remains open.', autoHide: 0 }));\r\n }\r\n }\r\n // not completed - error/other\r\n else {\r\n xpectWeb.shoppingCart.elem.setAttribute('payment-error', 'false');\r\n xpectWeb.shoppingCart.elem.setAttribute('payment-error', 'true');\r\n\r\n var errorMessage = 'There was an error during checkout. Please contact us to confirm your order before reprocessing. We apologise for any inconvenience.';\r\n\r\n if (checkoutResponse && typeof checkoutResponse === 'object') {\r\n // DevOps #3247: The shopping cart API may return a custom error result object (not camel case) with Result and Message properties\r\n if (typeof checkoutResponse.ErrorMessage === 'string') {\r\n errorMessage = checkoutResponse.ErrorMessage;\r\n } else if (typeof checkoutResponse.Message === 'string') {\r\n errorMessage = checkoutResponse.Message;\r\n }\r\n\r\n // DevOps #3247: Check the error response for new session details which may have been created before something else failed\r\n if (checkoutResponse.SessionData && typeof checkoutResponse.SessionData === 'object') {\r\n // notify component of new session details if a guest customer was created\r\n xpectWeb.shoppingCart.elem.setAttribute('session', JSON.stringify(checkoutResponse.SessionData));\r\n }\r\n }\r\n else if (response && typeof response.Message === 'string') {\r\n errorMessage = response.Message;\r\n }\r\n\r\n // DevOps #3247: Check the error response for new session details which may have been created before something else failed\r\n if (response && response.SessionData && typeof response.SessionData === 'object') {\r\n // notify component of new session details if a guest customer was created\r\n xpectWeb.shoppingCart.elem.setAttribute('session', JSON.stringify(response.SessionData));\r\n }\r\n\r\n xpectWeb.shoppingCart.elem.setAttribute('custom-message', JSON.stringify({ title: 'Checkout Error', error: errorMessage, autoHide: 0 }));\r\n }\r\n },\r\n function onFail(errorResponse) {\r\n var errorMessage = 'An unknown server error occurred. Please try again or contact the Site Administrator if the issue continues.';\r\n\r\n if (errorResponse && typeof errorResponse === 'object') {\r\n // DevOps #3247: Check the error response for new session details which may have been created before something else failed\r\n if (errorResponse.SessionData && typeof errorResponse.SessionData === 'object') {\r\n // notify component of new session details if a guest customer was created\r\n xpectWeb.shoppingCart.elem.setAttribute('session', JSON.stringify(errorResponse.SessionData));\r\n }\r\n \r\n // DevOps #3247: The shopping cart API may return a custom error result object (not camel case) with Result and Message properties\r\n if (errorResponse.responseJSON && typeof errorResponse.responseJSON === 'object' && typeof errorResponse.responseJSON.Message === 'string') {\r\n errorMessage = errorResponse.responseJSON.Message;\r\n }\r\n }\r\n \r\n xpectWeb.shoppingCart.elem.setAttribute('custom-message', JSON.stringify({ title: 'Error', error: errorMessage, autoHide: 10000 }));\r\n \r\n // DevOps #3247: The web-components themselves have a different view of \"processing\". On first failure this will be set and seems to reflect in the web components, but subsequent calls to this don't work and the web-components get stuck in a forever \"processing\" state. Toggling to true then false seems to work.\r\n xpectWeb.shoppingCart.elem.setAttribute('processing', \"true\");\r\n xpectWeb.shoppingCart.elem.setAttribute('processing', \"false\");\r\n }\r\n );\r\n\r\n // Refresh the spend limit details\r\n if (typeof xpectWeb.loadSpendLimit === 'function') {\r\n xpectWeb.loadSpendLimit();\r\n }\r\n });\r\n // onDownloadReceipt\r\n xpectWeb.shoppingCart.elem.addEventListener('onDownloadReceipt', (event) => {\r\n const url = xpectWeb.shoppingCart.model.DownloadReceiptURL + '?orderNo=' + event.detail.orderNo + '&invoiceNo=' + event.detail.invoiceNo + '&taxInclusive=' + event.detail.taxInclusive;\r\n const orderOrInvoiceNo = (event.detail.orderNo || event.detail.invoiceNo);\r\n const filename = \"receipt-\" + orderOrInvoiceNo + \".pdf\";\r\n //console.log('onDownloadReceipt', { event: event, url, filename });\r\n // use a clickable link for the download\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n link.click();\r\n link.remove();\r\n });\r\n // onPayPalPaymentFinish\r\n xpectWeb.shoppingCart.elem.addEventListener('onPayPalPaymentFinish', (event) => {\r\n //console.log('onPayPalPaymentFinish', { event });\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.PayPalFinishURL, event.detail);\r\n });\r\n // onPayPalPaymentCancel\r\n xpectWeb.shoppingCart.elem.addEventListener('onPayPalPaymentCancel', (event) => {\r\n //console.log('onPayPalPaymentCancel', { event });\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.PayPalCancelURL, event.detail);\r\n });\r\n // onPayPalPaymentApprove\r\n xpectWeb.shoppingCart.elem.addEventListener('onPayPalPaymentApprove', (event) => {\r\n //console.log('onPayPalPaymentApprove', { event });\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.PayPalApprovedURL, event.detail);\r\n });\r\n // onPayPalPaymentAuthorised\r\n xpectWeb.shoppingCart.elem.addEventListener('onPayPalPaymentAuthorised', (event) => {\r\n //console.log('onPayPalPaymentAuthorised', { event });\r\n // copy the paypal event data into our checkout params for POSTing (reposting so can create order/sale)\r\n xpectWeb.shoppingCart.model.checkoutParams.transactionNo = event.detail.transactionNo;\r\n xpectWeb.shoppingCart.model.checkoutParams.status = event.detail.status;\r\n xpectWeb.shoppingCart.model.checkoutParams.responseJSON = event.detail.responseJSON;\r\n // post the data\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.PayPalAuthorisedURL,\r\n xpectWeb.shoppingCart.model.checkoutParams,\r\n function (response) {\r\n xpectWeb.shoppingCart.applyReceipt(response);\r\n }\r\n );\r\n });\r\n // onPayPalPaymentFailure\r\n xpectWeb.shoppingCart.elem.addEventListener('onPayPalPaymentFailure', (event) => {\r\n //console.log('onPayPalPaymentFailure', { event });\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.PayPalFailureURL, event.detail);\r\n });\r\n // onNotification\r\n xpectWeb.shoppingCart.elem.addEventListener('onNotification', (event) => {\r\n //console.log('onNotification', { event: event.detail });\r\n xpectWeb.shoppingCart.elem.setAttribute('custom-message', JSON.stringify({ title: 'Error', error: event.detail, autoHide: 5000 }));\r\n });\r\n // onNext\r\n xpectWeb.shoppingCart.elem.addEventListener('onNext', (event) => {\r\n //console.log('onNext', { event: event.detail });\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.KeepAliveURL, null);\r\n });\r\n // onCancelCheckoutStep\r\n xpectWeb.shoppingCart.elem.addEventListener('onCancelCheckoutStep', (event) => {\r\n //console.log('onCancelCheckoutStep', { event: event.detail });\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.KeepAliveURL, null);\r\n });\r\n // onCheckout\r\n xpectWeb.shoppingCart.elem.addEventListener('onCheckout', (event) => {\r\n //console.log('onCheckout', { event: event.detail });\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.KeepAliveURL, null);\r\n });\r\n // onEditStep\r\n xpectWeb.shoppingCart.elem.addEventListener('onEditStep', (event) => {\r\n //console.log('onEditStep', { event: event.detail });\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.KeepAliveURL, null);\r\n });\r\n // onSubmit\r\n xpectWeb.shoppingCart.elem.addEventListener('onSubmit', (event) => {\r\n //console.log('onSubmit', { event: event.detail });\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.SubmitForApprovalURL,\r\n null,\r\n function (successResponse) {\r\n xpectWeb.shoppingCart.elem.setAttribute('submitted', JSON.stringify(successResponse));\r\n }\r\n );\r\n });\r\n //\r\n // properties (must be added after events)\r\n //\r\n xpectWeb.shoppingCart.elem.setAttribute('session', JSON.stringify(model.SessionData));\r\n xpectWeb.shoppingCart.elem.setAttribute('reference-data', JSON.stringify(model.ReferenceData));\r\n xpectWeb.shoppingCart.elem.setAttribute('placeholder-image-url', model.PlaceholderImageURL);\r\n }\r\n },\r\n load: function (loadParams) {\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.LoadCartURL,\r\n loadParams,\r\n function (successResponse) {\r\n xpectWeb.shoppingCart.elem.setAttribute('contents', JSON.stringify(successResponse));\r\n // update the cart widget qty bubble\r\n var qty = 0;\r\n if (successResponse.Items) {\r\n qty = successResponse.Items.length;\r\n }\r\n xpectWeb.setCartQuantity(qty);\r\n }\r\n );\r\n },\r\n applyReceipt: function (receiptData) {\r\n //console.log('applyReceipt', { receiptData: receiptData });\r\n const receipt = {\r\n transaction: receiptData.Transaction,\r\n branchDetails: receiptData.Branch,\r\n orderSale: receiptData.Order || receiptData.Sale,\r\n items: receiptData.OrderItems || receiptData.SaleItems,\r\n taxSummary: receiptData.SaleTax || []\r\n };\r\n // fix dotNet dates\r\n receipt.orderSale.DateTransaction = xpectWeb.dotNetDateToDate(receipt.orderSale.DateTransaction);\r\n receipt.orderSale.DateDue = xpectWeb.dotNetDateToDate(receipt.orderSale.DateDue);\r\n receipt.orderSale.DueOn = xpectWeb.dotNetDateToDate(receipt.orderSale.DueOn);\r\n receipt.orderSale.DateDiscount = xpectWeb.dotNetDateToDate(receipt.orderSale.DateDiscount);\r\n // load into the web component\r\n xpectWeb.shoppingCart.elem.setAttribute('receipt', JSON.stringify(receipt));\r\n // clear the cart qty indicator\r\n xpectWeb.setCartQuantity(0);\r\n },\r\n httpPost: function (url, data, onSuccess, onFail) {\r\n //console.log('httpPost', { url: url, data: data });\r\n\r\n $.post(url, data, function (successResponse) {\r\n // Update the last request datetime\r\n xpectWeb.shoppingCart._lastRequestDateTime = new Date();\r\n\r\n //console.log('httpPost.success', { url, successResponse });\r\n\r\n // Check if the session has expired.\r\n if (xpectWeb.shoppingCart.checkHasSessionExpired(successResponse)) {\r\n return;\r\n }\r\n\r\n if (typeof onSuccess === 'function') {\r\n onSuccess(successResponse);\r\n }\r\n }).fail(function (errorResponse) {\r\n // Update the last request datetime\r\n xpectWeb.shoppingCart._lastRequestDateTime = new Date();\r\n\r\n console.error('httpPost fail', { url, errorResponse });\r\n\r\n // Check if the session has expired.\r\n if (xpectWeb.shoppingCart.checkHasSessionExpired(errorResponse)) {\r\n return;\r\n }\r\n\r\n if (typeof onFail === 'function') {\r\n onFail(errorResponse);\r\n return;\r\n }\r\n\r\n var errorMessage = 'An unknown server error occurred. Please try again or contact the Site Administrator if the issue continues.';\r\n xpectWeb.shoppingCart.elem.setAttribute('custom-message', JSON.stringify({ title: 'Error', error: errorMessage, autoHide: 10000 }));\r\n\r\n // DevOps #3247: The web-components themselves have a different view of \"processing\". On first failure this will be set and seems to reflect in the web components, but subsequent calls to this don't work and the web-components get stuck in a forever \"processing\" state. Toggling to true then false seems to work.\r\n xpectWeb.shoppingCart.elem.setAttribute('processing', \"true\");\r\n xpectWeb.shoppingCart.elem.setAttribute('processing', \"false\");\r\n });\r\n },\r\n checkHasSessionExpired: function(response) {\r\n var hasSessionExpired = false;\r\n var errorMessage = 'Your session has expired.';\r\n\r\n if (response && response !== null && typeof response === 'object') {\r\n if (typeof response.HasSessionExpired === 'boolean') {\r\n hasSessionExpired = response.HasSessionExpired;\r\n }\r\n\r\n if (typeof response.Message === 'string') {\r\n errorMessage = response.Message;\r\n }\r\n }\r\n\r\n if (hasSessionExpired) {\r\n // Session has expired.\r\n xpectWeb.shoppingCart.endSession();\r\n }\r\n\r\n return hasSessionExpired;\r\n },\r\n continueSession: function(continueSession) {\r\n if (continueSession) {\r\n if (xpectWeb.shoppingCart._sessionCountdownInterval != null) {\r\n clearInterval(xpectWeb.shoppingCart._sessionCountdownInterval);\r\n xpectWeb.shoppingCart._sessionCountdownInterval = null;\r\n }\r\n\r\n xpectWeb.shoppingCart.httpPost(xpectWeb.shoppingCart.model.KeepAliveURL, null, function() {\r\n if (xpectWeb.shoppingCart._sessionExpiryWarningModal != null) {\r\n xpectWeb.shoppingCart._sessionExpiryWarningModal.hide();\r\n }\r\n });\r\n } else {\r\n xpectWeb.shoppingCart.endSession();\r\n }\r\n }\r\n};"],"names":["xpectWeb","enums","stockOptionGroupSelectType","listSingleSelection","gridSingleSelection","gridMultipleSelection","textInput","timeoutIds","hasVerified","$","length","grecaptcha","getResponse","checkVerified","notificationContainer","showVerificationNotification","showAlertDangerNotification","showAlertInfoNotification","alertId","alertClass","alertHtmlMessage","showAlertNotification","showAlertSuccessNotification","showAlertWarningNotification","alertTypeClass","jqAlert","find","class","id","html","hide","append","slideDown","clearTimeout","setTimeout","slideUp","settings","slideEasingDuration","remove","alertDuration","cartQty","setCartQuantity","qty","reloadMiniCart","empty","show","loadMiniCart","increaseCartQuantity","loadSpendLimit","post","successResponse","replaceWith","showLoadingSpinner","miniCartQty","text","$cartPrice","includes","parseInt","$handheldCartPrice","$handheldCartQuantity","datePickerChanged","fieldName","yearRequired","defaultYear","dateFieldSelector","dateField","zeroPad","num","places","String","padStart","dateFieldDay","dateFieldMonth","dateFieldYear","dateComponents","dateFieldYearValue","val","push","dateString","join","Date","toISOString","substring","valid","dotNetDateToDate","value","let","result","moment","format","extend","addCheckboxRangeValidation","defaultRangeValidator","validator","methods","range","element","param","type","checked","call","this","fn","toggleVisibility","isVisible","each","removeClass","addClass","jQuery","$this","data","attr","valLengthMax","valMaxlengthMax","document","on","evt","parent","preventDefault","stopPropagation","selectionCountInput","card","requiredContainer","toggleClass","click","parents","cardRadioInput","triggerOnChangeEvent","cards","is","prop","closest","trigger","e","clickedIndex","isSelected","previousValue","target","sliderContainer","sliderPrevEl","sliderNextEl","sliderPagination","Swiper","loop","freeMode","slidesPerView","navigation","nextEl","prevEl","pagination","el","clickable","breakpoints","1","showNavigation","showPagination","600","1120","breakpoint","swiper","params","spaceBetween","1000","slideCount","observer","observeParents","slidesPerGroup","640","768","960","1024","newValue","min","max","autoNumeric","btnDec","txtQty","siblings","btnInc","parseFloat","isNaN","AutoNumeric","getAutoNumericElement","set","blur","utils","formatCurrency","currencySymbol","amount","decimalPlaces","includeSign","sign","Math","abs","toLocaleString","undefined","minimumFractionDigits","maximumFractionDigits","convertCurrency","localAmountInc","localAmountEx","amountInc","amountEx","customerCurrency","displayCurrencyPreference","currencyNo","displayTaxInclusive","exchangeRate","Number","replace","err","bootstrapMajorVersion","bootstrap","Modal","VERSION","bootstrapModal","elementId","modal","getElementById","contentPage","init","model","Array","isArray","Widgets","forEach","widget","URL","Data","Identifier","widgets","contactForm","contactFormId","style","contactFormElement","setAttribute","JSON","stringify","Config","GoogleReCaptchaSiteKey","addEventListener","url","SubmitURL","event","detail","recaptchaResponse","googleRECAPTCHAResponse","response","HasError","title","error","Message","success","fail","errorResponse","console","autoHide","callToAction","initReCaptcha","render","sitekey","XpectRecaptchaSiteKey","submit","form","formData","serialize","forms","xpectForm","Structure","ReferenceData","UserPreferences","PersonData","ResponseAsJsonStr","responseData","results","parse","window","location","href","ReturnURL","formID","friendlyURL","responseAsJsonStr","responses","animate","scrollTop","first","offset","members","hasAgreedTermsAndConditions","termsCheckbox","hasReadTermsAndConditions","readTermsCheckbox","checkAgreedTermsConditions","hasAgreed","hasReadTerms","showReadTermsConditionsAlert","showTermsConditionsAlert","getNotificationContainer","showHideCompanyName","companyDropdown","toLowerCase","wireUpFormSubmitHandler","$initiator","$notificationContainer","requiredFieldMessages","Title","Gender","FirstName","LastName","CompanyName","CompanyPosition","Phone","Fax","Mobile","DateOfBirth","PostalAddress1","PostalCity","PostalState","PostalPostcode","Country","DeliveryAddress1","DeliveryCity","DeliveryState","DeliveryPostcode","DeliveryCountry","index","name","jqAgreedTerms","productDetails","app","updated","productImageSlider","productImageSliderNeedsRefresh","initProductImagesSlider","keyup","tab","componentKey","appData","selectedVariant","selectedColour","selectedColourDescription","selectedSize","hasSomeStockAvailable","isMultiVariant","hasRelatedInfoSheets","stockMasterStockItemNo","stockStockItemNo","stockDescription","stockStockNo","stockWeight","stockDimensions","stockQtyOnHand","stockNonDepletingItem","stockSellingPriceDisplayString","stockSpecialPriceDisplayString","stockOnSpecial","stockBuildItem","fromPriceDisplayString","hasDifferentVariantPricing","totalPriceDisplayString","agreeTermsAndConditionsUrl","termsAttachmentDescription","termsAttachmentDownloadName","termsAttachmentFileSizeDisplayString","downloadItem","downloadID","dateTransactionDisplayString","downloadExpiresOnDisplayString","downloadExpired","unitsMeasure","classDescription1","classDescription2","classDescription3","classDescription4","classDescription5","classDescription6","classDescription7","classDescription8","classDescription9","classDescription10","classDescription11","classDescription12","classWebInclude1","classWebInclude2","classWebInclude3","classWebInclude4","classWebInclude5","classWebInclude6","classWebInclude7","classWebInclude8","classWebInclude9","classWebInclude10","classWebInclude11","classWebInclude12","className1","className2","className3","className4","className5","className6","className7","className8","className9","className10","className11","className12","quantityAutoNumeric","computed","filteredStockImages","stockImages","multiVariant","filteredImages","filter","x","variantClassNo","imageUrl","noImagePlaceholderLgUrl","thumbnailUrl","variantDescription","variantCssClass","getMaxQuantity","stockDetails","nonDepletingItem","backOrderItem","buildItem","getQuantityRegEx","decimalRegEx","qtyDecimalPlaces","hasAttachments","stockAttachments","filteredStockAttachments","showStockAvailability","stockStatuses","filteredStockStatuses","isPurchasableItem","isBackOrderItem","isBuildItem","isPurchaseButtonDisabled","showAddToCartButton","hasSelectedVariant","forceRerender","stockWeightDisplayString","clearSelectedVariant","restoreDefaultStockValues","setSelectedColour","classNo","destroyProductImagesCarousel","colourDetails","colours","description","setSelectedVariant","singleVariant","setDefaultPropertiesFromVariant","options","masterStockItemNo","stockNo","stockItemNo","weight","dimensions","qtyOnHand","sellingPriceDisplayString","specialPriceDisplayString","onSpecial","minimumValue","maximumValue","wheelOn","wheelStep","emptyInputBehavior","allowDecimalPadding","multiVariantStockDetails","masterStockNo","singleVariants","addToCartSubmitButtonClick","btnJqueryId","jqClickedSubmitButton","canPlaceOnlineOrderForContacts","loadShopForContactsList","addToCartFormSubmit","elem","checkShopForContactsAddButton","productGalleryIndex","productGalleryIndexHref","productImageCss","vm","productThumbsSlider","selectedCartContactNos","stockOptionGroups","stockOptionGroupItems","Vue","createApp","mount","stockInfoSheets","split","map","initMultiVariant","initSingleVariant","setColourEnable","setSizeEnable","selectStockItem","firstSingleVariant","firstSingleVariantStockDetails","stockOptionGroup","selectType","stockOptionGroupItem","stockOptionGroupID","sellingPriceInc","localSellingPriceInc","localSellingPriceEx","sellingPriceEx","initProductSliders","xpectLib","default","productGallery","imageZoom","selectGalleryImage","destroy","selectImage","productImageIndex","findIndex","slideTo","$thumbnailImages","selectColour","isAvailable","selectSize","size","j","noStock","classNo4","classNo5","noColours","i","thisColour","colourVariant","sizes","noSizes","thisSize","sizeVariant","colour","getSubmitSuccessMessage","cartUrl","showAddToCartSubmissionSuccessAlert","submitButtonDetails","getClickedSubmitButtonDetails","initiator","showAddToCartSubmissionErrorAlert","onAddToCartSubmitSuccessCallback","errorMessageHtml","Details","onAddToCartSubmitFailureCallback","submitButtons","calculateTotalPrice","totalSellingPrice","localSpecialPriceInc","localSpecialPriceEx","specialPriceInc","specialPriceEx","selected","symbol","shopForContactSelect","checkbox","contactNo","idx","indexOf","splice","disabled","setShopForContactsCheckboxes","search","focus","run","LoadMoreURL","searchPhrase","SearchPhrase","paginationPageSize","PageSize","paginationPageNo","PageNumber","shoppingCart","_lastRequestDateTime","_sessionExpiryWarningInterval","_sessionExpiryWarningModal","_sessionCountdownInterval","_sessionExpiryWarningMilliseconds","_sessionExpiryWarningDurationSeconds","checkSessionExpiry","sessionWarningDurationSeconds","countdownStartDate","clearInterval","detach","setInterval","millisecondsSinceCountdownStarted","secondsRemaining","ceil","endSession","EndSessionURL","load","httpPost","DistributionMethodsURL","LoginURL","JoinURL","FormsPageURL","ViewCartItemURL","quantity","loadParams","UpdateCartItemURL","DeleteCartItemURL","EmptyCartURL","PromotionCodeURL","PromotionCodeID","promotionCode","promotionCodeID","Sale","Order","checkoutParams","CheckoutURL","errorMessage","checkoutResponse","CheckoutResponse","Payment","SessionData","Success","applyReceipt","Receipt","GatewayReady","ErrorMessage","responseJSON","DownloadReceiptURL","orderNo","invoiceNo","taxInclusive","filename","link","createElement","download","PayPalFinishURL","PayPalCancelURL","PayPalApprovedURL","transactionNo","status","PayPalAuthorisedURL","PayPalFailureURL","KeepAliveURL","SubmitForApprovalURL","PlaceholderImageURL","LoadCartURL","Items","receiptData","receipt","transaction","Transaction","branchDetails","Branch","orderSale","items","OrderItems","SaleItems","taxSummary","SaleTax","DateTransaction","DateDue","DueOn","DateDiscount","onSuccess","onFail","checkHasSessionExpired","hasSessionExpired","HasSessionExpired","continueSession"],"mappings":"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0B,IAElEhP,SAASikB,aAAamB,SAASplB,SAASikB,aAAapW,MAAM+Z,kBAAmBzY,EAAMC,UAGxFpP,SAASikB,aAAalG,KAAK/O,iBAAiB,4BAA6B,IAGrEhP,SAASikB,aAAapW,MAAMwY,eAAewB,cAAgB1Y,EAAMC,OAAOyY,cACxE7nB,SAASikB,aAAapW,MAAMwY,eAAeyB,OAAS3Y,EAAMC,OAAO0Y,OACjE9nB,SAASikB,aAAapW,MAAMwY,eAAeY,aAAe9X,EAAMC,OAAO6X,aAEvEjnB,SAASikB,aAAamB,SAASplB,SAASikB,aAAapW,MAAMka,oBACvD/nB,SAASikB,aAAapW,MAAMwY,eAC5B,SAAU9W,GACNvP,SAASikB,aAAa4C,aAAatX,OAK/CvP,SAASikB,aAAalG,KAAK/O,iBAAiB,yBAA0B,IAElEhP,SAASikB,aAAamB,SAASplB,SAASikB,aAAapW,MAAMma,iBAAkB7Y,EAAMC,UAGvFpP,SAASikB,aAAalG,KAAK/O,iBAAiB,iBAAkB,IAE1DhP,SAASikB,aAAalG,KAAKpP,aAAa,iBAAkBC,KAAKC,UAAU,CAAEY,MAAO,QAASC,MAAOP,EAAMC,OAAQY,SAAU,SAG9HhQ,SAASikB,aAAalG,KAAK/O,iBAAiB,SAAU,IAElDhP,SAASikB,aAAamB,SAASplB,SAASikB,aAAapW,MAAMoa,aAAc,QAG7EjoB,SAASikB,aAAalG,KAAK/O,iBAAiB,uBAAwB,IAEhEhP,SAASikB,aAAamB,SAASplB,SAASikB,aAAapW,MAAMoa,aAAc,QAG7EjoB,SAASikB,aAAalG,KAAK/O,iBAAiB,aAAc,IAEtDhP,SAASikB,aAAamB,SAASplB,SAASikB,aAAapW,MAAMoa,aAAc,QAG7EjoB,SAASikB,aAAalG,KAAK/O,iBAAiB,aAAc,IAEtDhP,SAASikB,aAAamB,SAASplB,SAASikB,aAAapW,MAAMoa,aAAc,QAG7EjoB,SAASikB,aAAalG,KAAK/O,iBAAiB,WAAY,IAEpDhP,SAASikB,aAAamB,SAASplB,SAASikB,aAAapW,MAAMqa,qBACvD,KACA,SAAUhlB,GACNlD,SAASikB,aAAalG,KAAKpP,aAAa,YAAaC,KAAKC,UAAU3L,QAOhFlD,SAASikB,aAAalG,KAAKpP,aAAa,UAAWC,KAAKC,UAAUhB,EAAM8Y,cACxE3mB,SAASikB,aAAalG,KAAKpP,aAAa,iBAAkBC,KAAKC,UAAUhB,EAAMgD,gBAC/E7Q,SAASikB,aAAalG,KAAKpP,aAAa,wBAAyBd,EAAMsa,uBAG/EhD,KAAM,SAAUQ,GACZ3lB,SAASikB,aAAamB,SAASplB,SAASikB,aAAapW,MAAMua,YACvDzC,EACA,SAAUziB,GACNlD,SAASikB,aAAalG,KAAKpP,aAAa,WAAYC,KAAKC,UAAU3L,IAEnE,IAAIR,EAAM,EACNQ,EAAgBmlB,QAChB3lB,EAAMQ,EAAgBmlB,MAAM3nB,QAEhCV,SAASyC,gBAAgBC,MAIrCmkB,aAAc,SAAUyB,GAEpB,MAAMC,EAAU,CACZC,YAAaF,EAAYG,YACzBC,cAAeJ,EAAYK,OAC3BC,UAAWN,EAAYlC,OAASkC,EAAYnC,KAC5C0C,MAAOP,EAAYQ,YAAcR,EAAYS,UAC7CC,WAAYV,EAAYW,SAAW,IAGvCV,EAAQK,UAAUM,gBAAkBlpB,SAASoF,iBAAiBmjB,EAAQK,UAAUM,iBAChFX,EAAQK,UAAUO,QAAUnpB,SAASoF,iBAAiBmjB,EAAQK,UAAUO,SACxEZ,EAAQK,UAAUQ,MAAQppB,SAASoF,iBAAiBmjB,EAAQK,UAAUQ,OACtEb,EAAQK,UAAUS,aAAerpB,SAASoF,iBAAiBmjB,EAAQK,UAAUS,cAE7ErpB,SAASikB,aAAalG,KAAKpP,aAAa,UAAWC,KAAKC,UAAU0Z,IAElEvoB,SAASyC,gBAAgB,IAE7B2iB,SAAU,SAAUnW,EAAKnI,EAAMwiB,EAAWC,GAGtC9oB,EAAEwC,KAAKgM,EAAKnI,EAAM,SAAU5D,GAExBlD,SAASikB,aAAaC,qBAAuB,IAAIlf,KAK7ChF,SAASikB,aAAauF,uBAAuBtmB,IAIxB,mBAAdomB,GACPA,EAAUpmB,KAEf2M,KAAK,SAAUC,GAEd9P,SAASikB,aAAaC,qBAAuB,IAAIlf,KAEjD+K,QAAQL,MAAM,gBAAiB,CAAET,IAAAA,EAAKa,cAAAA,IAGlC9P,SAASikB,aAAauF,uBAAuB1Z,KAI3B,mBAAXyZ,EACPA,EAAOzZ,IAKX9P,SAASikB,aAAalG,KAAKpP,aAAa,iBAAkBC,KAAKC,UAAU,CAAEY,MAAO,QAASC,MADxE,+GAC6FM,SAAU,OAG1HhQ,SAASikB,aAAalG,KAAKpP,aAAa,aAAc,QACtD3O,SAASikB,aAAalG,KAAKpP,aAAa,aAAc,cAG9D6a,uBAAwB,SAASja,GAC7B,IAAIka,GAAoB,EAkBxB,OAfIla,GAAyB,OAAbA,GAAyC,iBAAbA,IACE,kBAA/BA,EAASma,oBAChBD,EAAoBla,EAASma,mBAGD,iBAArBna,EAASI,SACDJ,EAASI,SAI5B8Z,GAEAzpB,SAASikB,aAAagB,aAGnBwE,GAEXE,gBAAiB,SAASA,GAClBA,GACuD,MAAnD3pB,SAASikB,aAAaI,4BACtBM,cAAc3kB,SAASikB,aAAaI,2BACpCrkB,SAASikB,aAAaI,0BAA4B,MAGtDrkB,SAASikB,aAAamB,SAASplB,SAASikB,aAAapW,MAAMoa,aAAc,KAAM,WACnB,MAApDjoB,SAASikB,aAAaG,4BACtBpkB,SAASikB,aAAaG,2BAA2BtiB,UAIzD9B,SAASikB,aAAagB"}