{"version":3,"names":[],"mappings":"","sources":["app.js"],"sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i 0) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction initializeCache() {\r\n $cache.container = $(config.container);\r\n}\r\n\r\nfunction daysInMonth(month, year) {\r\n if (empty(year)) {\r\n year = new Date().getFullYear();\r\n }\r\n var dd = new Date(year, month, 0);\r\n return dd.getDate();\r\n}\r\n\r\nfunction setDays($day, $month, $year) {\r\n var day = $day.val(),\r\n month = $month.val(),\r\n year = $year.val(),\r\n options = $day[0].options,\r\n days = empty(month) ? 31 : daysInMonth(month, year),\r\n selectBoxIt = $day.data('selectBox-selectBoxIt'),\r\n i;\r\n\r\n options.length = 29;\r\n\r\n for (i = 29; i <= days; i++) {\r\n options[options.length] = new Option(i, i);\r\n }\r\n\r\n $day.val(day > days ? days : day);\r\n if (selectBoxIt) {\r\n selectBoxIt.refresh();\r\n }\r\n}\r\n\r\nfunction initializeEvents() {\r\n var $day, $month, $year;\r\n $cache.container.each(function () {\r\n var $this = $(this);\r\n $day = $this.find(config.daySelect);\r\n $month = $this.find(config.monthSelect);\r\n $year = $this.find(config.yearSelect);\r\n var setDate = function () {\r\n setDays($day, $month, $year);\r\n };\r\n\r\n $month.on('change', setDate);\r\n $year.on('change', setDate);\r\n });\r\n\r\n if ($cache.container.length) {\r\n setDays($day, $month, $year);\r\n }\r\n}\r\n\r\nvar accountSelectDate = {\r\n init: function () {\r\n initializeCache();\r\n initializeEvents();\r\n }\r\n};\r\n\r\nmodule.exports = accountSelectDate;\r\n\n},{}],2:[function(require,module,exports){\nvar $cache = {};\r\n\r\nfunction initializeCache() {\r\n $cache.registrationForm = $('#RegistrationForm');\r\n $cache.birthDate = $('#birthDate', $cache.registrationForm);\r\n $cache.birthMonth = $('#birthMonth', $cache.registrationForm);\r\n $cache.birthYear = $('#birthYear', $cache.registrationForm);\r\n $cache.birthDateControl = $cache.registrationForm.find('select[name$=\\'birthdayfields_day\\']');\r\n $cache.birthMonthControl = $cache.registrationForm.find('select[name$=\\'birthdayfields_dobmonth\\']');\r\n $cache.birthYearControl = $cache.registrationForm.find('select[name$=\\'birthdayfields_dobyear\\']');\r\n $cache.birthDateError = $('#dobError');\r\n}\r\n\r\nfunction initializeEvents() {\r\n $cache.registrationForm.on('submit', function (event) {\r\n\r\n var birthdayError = false,\r\n isBirthdayValidVal = isBirthdayValid(),\r\n isBirthdayFilledVal = isBirthdayFilled(),\r\n isBirthdayLessThanAgeLimitVal = isBirthdayLessThanAgeLimit();\r\n\r\n if (isBirthdayFilledVal) {\r\n birthdayError = isBirthdayLessThanAgeLimitVal;\r\n if (birthdayError) {\r\n $cache.birthDateError.text(Resources.DOB_LESS_THAN_AGE_LIMIT);\r\n }\r\n }\r\n\r\n if ($cache.birthMonthControl.val() || $cache.birthDateControl.val() || $cache.birthYearControl.val()) {\r\n birthdayError = !isBirthdayValidVal;\r\n if (birthdayError) {\r\n $cache.birthDateError.text(Resources.DOB_WRONG);\r\n }\r\n }\r\n\r\n $cache.birthDateError.toggle(birthdayError);\r\n return !birthdayError;\r\n });\r\n\r\n $('select', $cache.registrationForm).on('change', function(e) {\r\n if ($cache.birthDateError.length) {\r\n var isBirthdayFilledVal = isBirthdayFilled(),\r\n isBirthdayValidVal = isBirthdayValid(),\r\n isBirthdayLessThanAgeLimitVal = isBirthdayLessThanAgeLimit();\r\n\r\n if (isBirthdayFilledVal && isBirthdayValidVal) {\r\n $cache.birthDateError.hide();\r\n }\r\n if (isBirthdayFilledVal && isBirthdayLessThanAgeLimitVal) {\r\n $cache.birthDateError.text(Resources.DOB_LESS_THAN_AGE_LIMIT).show();\r\n }\r\n if (isBirthdayFilledVal && !isBirthdayLessThanAgeLimitVal) {\r\n $cache.birthDateError.hide();\r\n }\r\n if (isBirthdayFilledVal && !isBirthdayValidVal) {\r\n $cache.birthDateError.text(Resources.DOB_WRONG).show();\r\n }\r\n }\r\n\r\n if ($cache.birthDateControl.val() || $cache.birthMonthControl.val() || $cache.birthYearControl.val()) {\r\n $cache.birthDateControl.attr('required', true);\r\n $cache.birthMonthControl.attr('required', true);\r\n $cache.birthYearControl.attr('required', true);\r\n } else {\r\n $cache.birthDateControl.removeAttr('required').removeClass('error');\r\n $cache.birthMonthControl.removeAttr('required').removeClass('error');\r\n $cache.birthYearControl.removeAttr('required').removeClass('error');\r\n\r\n $('.error-message.list-13').empty();\r\n }\r\n });\r\n\r\n selectBirthday();\r\n}\r\n\r\nfunction isBirthdayFilled() {\r\n return $cache.birthMonthControl.val() && $cache.birthDateControl.val() && $cache.birthYearControl.val();\r\n}\r\n\r\nfunction isBirthdayValid() {\r\n if (isBirthdayFilled()) {\r\n var month = $cache.birthMonthControl.val(),\r\n date = $cache.birthDateControl.val(),\r\n year = $cache.birthYearControl.val();\r\n\r\n return (new Date(year, month - 1, date)).getDate() === parseInt(date);\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction isBirthdayLessThanAgeLimit() {\r\n var minimumAgeLimit = SitePreferences.MINIMUM_AGE_LIMIT;\r\n if (minimumAgeLimit == 0) {\r\n return false;\r\n }\r\n\r\n if (isBirthdayFilled()) {\r\n var month = $cache.birthMonthControl.val(),\r\n date = $cache.birthDateControl.val(),\r\n year = $cache.birthYearControl.val(),\r\n dob = new Date(year, month - 1, date),\r\n now = new Date(),\r\n customerAge = now.getFullYear() - dob.getFullYear();\r\n\r\n if (new Date(now.getFullYear(), dob.getMonth(), dob.getDate()) > new Date(now.getFullYear(), now.getMonth(), now.getDate())) {\r\n customerAge--;\r\n }\r\n return customerAge > 0 && customerAge < minimumAgeLimit;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction selectBirthday() {\r\n\r\n if ($cache.birthMonth.val() != 0) {\r\n var monthOfBirthSelect = $cache.registrationForm.find('#dwfrm_profile_customer_birthdayfields_dobmonth');\r\n monthOfBirthSelect.find('option[value=\\'' + $cache.birthMonth.val() + '\\']').prop('selected', 'selected').attr('selected', 'selected');\r\n monthOfBirthSelect.trigger('change');\r\n }\r\n\r\n if ($cache.birthDate.val() != 0) {\r\n var dayOfBirthSelect = $cache.registrationForm.find('#dwfrm_profile_customer_birthdayfields_day');\r\n dayOfBirthSelect.find('option[value=\\'' + $cache.birthDate.val() + '\\']').prop('selected', 'selected').attr('selected', 'selected');\r\n dayOfBirthSelect.trigger('change');\r\n }\r\n\r\n if ($cache.birthYear.val() != 0) {\r\n var yearOfBirthSelect = $cache.registrationForm.find('#dwfrm_profile_customer_birthdayfields_dobyear');\r\n yearOfBirthSelect.find('option[value=\\'' + $cache.birthYear.val() + '\\']').prop('selected', 'selected').attr('selected', 'selected');\r\n yearOfBirthSelect.trigger('change');\r\n }\r\n}\r\n\r\nvar validatedob = {\r\n init: function() {\r\n initializeCache();\r\n initializeEvents();\r\n }\r\n}\r\n\r\nmodule.exports = validatedob;\r\n\n},{}],3:[function(require,module,exports){\n/* --- handle Clean button for Address list --- */\r\nvar initCleanAutoFill = {\r\n init: function() {\r\n $('#clear-auto-fill').on('click', function() {\r\n var $auto_fill = $('.auto-fill');\r\n $auto_fill.find('input').val('');\r\n $auto_fill.find('select').prop('selectedIndex', 0);\r\n });\r\n }\r\n}\r\n\r\nmodule.exports = initCleanAutoFill;\n},{}],4:[function(require,module,exports){\n'use strict';\r\n\r\nvar dialog = require('./dialog');\r\n\r\n/**\r\n* @function \r\n* @description toggle multiple payment section on checkout page\r\n*/\r\nfunction initAfterPayCheckout(){\r\n\tvar afterPayPaymentMethodID = \"AFTERPAY_PBI\";\r\n\t$(document).on('click','.afterpay-payment-method-wrapper .afterpay-payment-method input',function(e){\r\n\t\tvar isAfterPayPaymentEnabled = $(\".afterpay-payment-method-wrapper .afterpay-payment-method input.after-pay-input-radio\").is(':enabled');\r\n\t\tif(isAfterPayPaymentEnabled){\r\n\t\t\t$(\".multiple-payment-selection-wrapper .payment-method-radio-btn input#is-\"+afterPayPaymentMethodID).trigger(\"click\");\r\n\t\t\t$(\".afterpay-payment-method-wrapper .afterpay-payment-method-message\").removeClass(\"hide\");\r\n\t\t\t$(\"button#dwfrm_billing_save\").removeAttr(\"disabled\");\r\n\t\t\t//$('.spc-cc-title').addClass('spc-cc-expanded');\r\n\t\t\t//$('.creditcard-form-container').hide();\r\n\t\t}\r\n\t});\r\n\t\r\n\t$(document).on('click','.multiple-payment-selection-wrapper .payment-method-radio-btn input',function(e){\r\n\t\tvar selectedID = $(this).attr(\"id\");\r\n\t\tif(selectedID != 'is-'+afterPayPaymentMethodID){\r\n\t\t\t$(\".afterpay-payment-method-wrapper .afterpay-payment-method input.after-pay-input-radio\").removeAttr(\"checked\");\r\n\t\t\t$(\".afterpay-payment-method-wrapper .afterpay-payment-method-message\").addClass(\"hide\");\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n* @function \r\n* @description open afterpay modal window on pdp and cart page\r\n*/\r\nfunction initAfterPayPopUp(){\r\n\tlet $body = $('body');\r\n\t\r\n\tlet modalResize = function() {\r\n\t\tif($(window).height() > $('.afterpay-payment').height()){\r\n\t\t\t$('.afterpay-payment').css({\r\n\t\t\t\tposition : 'absolute',\r\n\t\t\t\tleft : '50%',\r\n\t\t\t\ttop : '50%',\r\n\t\t\t\ttransform: 'translate(-50%, -50%)',\r\n\t\t\t\theight: 'auto'\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t$('.afterpay-payment').css({\r\n\t\t\t\tposition : 'absolute',\r\n\t\t\t\tleft : '50%',\r\n\t\t\t\ttop : '0',\r\n\t\t\t\ttransform: 'translateX(-50%)',\r\n\t\t\t\theight: '100%'\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\t$(document).on('click', '.afterpay-btn', function (e) {\r\n \te.preventDefault();\r\n \tdialog.open({\r\n \t\turl: $(this).attr('href'),\r\n \t\toptions: {\r\n width: 970,\r\n dialogClass: \"afterpay-payment\"\r\n },\r\n callback: function() {\r\n \t$body.addClass('afterpay-dialog-open');\r\n \tmodalResize();\r\n }\r\n \t});\r\n \t\r\n });\r\n\t$body.on( \"dialogclose\", '.afterpay-payment', function( event, ui ) {\r\n\t\t$body.removeClass('afterpay-dialog-open');\r\n\t});\r\n\t$( window ).on(\"resize\", modalResize);\r\n}\r\n\r\n\r\nvar afterpay = {\r\n init: function () {\r\n \tinitAfterPayCheckout();\r\n \tinitAfterPayPopUp();\r\n }\r\n}\r\n\r\nmodule.exports = afterpay;\r\n\n},{\"./dialog\":16}],5:[function(require,module,exports){\n'use strict';\r\n\r\nvar progress = require('./progress'),\r\n util = require('./util');\r\n\r\nvar currentRequests = [];\r\n\r\n/**\r\n * @function\r\n * @description Ajax request to get json response\r\n * @param {Boolean} async Asynchronous or not\r\n * @param {String} url URI for the request\r\n * @param {Object} data Name/Value pair data request\r\n * @param {Function} callback Callback function to be called\r\n */\r\nvar getJson = function (options) {\r\n options.url = util.toAbsoluteUrl(options.url);\r\n // return if no url exists or url matches a current request\r\n if (!options.url || currentRequests[options.url]) {\r\n return;\r\n }\r\n\r\n currentRequests[options.url] = true;\r\n\r\n // make the server call\r\n $.ajax({\r\n dataType: 'json',\r\n url: options.url,\r\n async: (typeof options.async === 'undefined' || options.async === null) ? true : options.async,\r\n data: options.data || {}\r\n })\r\n // success\r\n .done(function (response) {\r\n if (options.callback) {\r\n options.callback(response);\r\n }\r\n })\r\n // failed\r\n .fail(function (xhr, textStatus) {\r\n if (textStatus === 'parsererror') {\r\n window.alert(Resources.BAD_RESPONSE);\r\n }\r\n if (options.callback) {\r\n options.callback(null);\r\n }\r\n })\r\n // executed on success or fail\r\n .always(function () {\r\n // remove current request from hash\r\n if (currentRequests[options.url]) {\r\n delete currentRequests[options.url];\r\n }\r\n });\r\n};\r\n/**\r\n * @function\r\n * @description ajax request to load html response in a given container\r\n * @param {String} url URI for the request\r\n * @param {Object} data Name/Value pair data request\r\n * @param {Function} callback Callback function to be called\r\n * @param {Object} target Selector or element that will receive content\r\n */\r\nvar load = function (options) {\r\n options.url = util.toAbsoluteUrl(options.url);\r\n // return if no url exists or url matches a current request\r\n if (!options.url || currentRequests[options.url]) {\r\n return;\r\n }\r\n\r\n currentRequests[options.url] = true;\r\n\r\n // make the server call\r\n $.ajax({\r\n dataType: 'html',\r\n url: util.appendParamToURL(options.url, 'format', 'ajax'),\r\n data: options.data,\r\n xhrFields: {\r\n withCredentials: true\r\n }\r\n })\r\n .done(function (response) {\r\n // success\r\n if (options.target) {\r\n $(options.target).empty().html(response);\r\n }\r\n if (options.callback) {\r\n options.callback(response);\r\n }\r\n })\r\n .fail(function (xhr, textStatus) {\r\n // failed\r\n if (textStatus === 'parsererror') {\r\n window.alert(Resources.BAD_RESPONSE);\r\n }\r\n options.callback(null, textStatus);\r\n })\r\n .always(function () {\r\n progress.hide();\r\n // remove current request from hash\r\n if (currentRequests[options.url]) {\r\n delete currentRequests[options.url];\r\n }\r\n });\r\n};\r\n\r\nexports.getJson = getJson;\r\nexports.load = load;\r\n\n},{\"./progress\":75,\"./util\":87}],6:[function(require,module,exports){\nvar util = require(\"./util\");\r\nvar unbind = 0;\r\nvar unbindcarousel = 0;\r\nfunction getPageCategory() {\r\n\t//return window.pageContext.title || \"Content\"; ###### this throws product name\r\n\tswitch(window.Resources.PAGE_CATEGORY)\t{\r\n\tcase 'product-showincategory':\r\n\t\treturn \"Product Page\";\r\n\t\tbreak;\r\n\tcase 'product-show':\r\n\t\treturn \"Product Page\";\r\n\t\tbreak;\r\n\tcase 'search-show':\r\n\t\treturn \"Category Page\";\r\n\t\tbreak;\r\n\tcase 'home-show':\r\n\t\treturn \"Home Page\"\r\n\t\tbreak;\r\n\tcase 'cart-show':\r\n\t\treturn \"Cart Page\"\r\n\t\tbreak;\r\n\tcase 'cart-submitform':\r\n\t\treturn \"Cart Page\"\r\n\t\tbreak;\r\n\tcase 'cart-addtowishlist':\r\n\t\treturn \"Cart Page\"\r\n\t\tbreak;\r\n\tcase 'customerservice-contactus':\r\n\t\treturn \"Contact Customer Care\"\r\n\t\tbreak;\r\n\tcase 'customerservice-concierge':\r\n\t\treturn \"Ask An Expert\"\r\n\t\tbreak;\r\n\tcase 'account-startregister':\r\n\t\treturn \"Account Creation\"\r\n\t\tbreak;\r\n\tcase 'account-editprofile' :\r\n\t\treturn \"My Account\"\r\n\t\tbreak;\r\n\tcase 'address-list':\r\n\t\treturn \"My Account\"\r\n\t\tbreak;\r\n\tcase 'paymentinstruments-list':\r\n\t\treturn \"My Account\"\r\n\t\tbreak;\r\n\tcase 'wishlist-show':\r\n\t\treturn \"My Account\"\r\n\t\tbreak;\r\n\tcase 'order-history':\r\n\t\treturn \"My Account\"\r\n\t\tbreak;\r\n\tcase 'orderreplenishment-show':\r\n\t\treturn \"My Account\"\r\n\t\tbreak;\r\n\tcase 'login-show':\r\n\t\treturn \"Account Registration\"\r\n\t\tbreak;\r\n\tcase 'coshipping-start':\r\n\t\treturn \"Checkout\"\r\n\t\tbreak;\r\n\tcase 'coshipping-singleshipping':\r\n\t\treturn \"Checkout\"\r\n\t\tbreak;\r\n\tcase 'cobilling-start':\r\n\t\treturn \"Checkout\"\r\n\t\tbreak;\r\n\tcase 'cobilling-billing':\r\n\t\treturn \"Checkout\"\r\n\t\tbreak;\r\n\tcase 'search-showcontent':\r\n\t\treturn \"Site Search\"\r\n\t\tbreak;\r\n\tcase 'giftcert-purchase':\r\n\t\treturn \"Gift Card Page\"\r\n\t\tbreak;\r\n\tcase 'cocustomer-loginform':\r\n\t\treturn \"Customer Login\";\r\n\t\tbreak;\r\n\tcase 'default-start':\r\n\t\treturn \"Home Page\";\r\n\t\tbreak;\r\n\tcase 'search-brandify':\r\n\t\treturn \"Store Locator Page\";\r\n\t\tbreak;\r\n\tdefault:\r\n\t\treturn \"Content\";\r\n\t\tbreak;\r\n\t}\r\n}\r\n// Specific for checkout and cart page only\r\nfunction couponsubcategory(){\r\n\tswitch(window.Resources.PAGE_CATEGORY){\r\n\tcase 'cart-show':\r\n\t\treturn \"Cart\"\r\n\t\tbreak;\r\n\tcase 'coshipping-start':\r\n\t\treturn \"Shipping\"\r\n\t\tbreak;\r\n\tcase 'coshipping-singleshipping':\r\n\t\treturn \"Payment\"\r\n\t\tbreak;\r\n\tcase 'cobilling-start':\r\n\t\treturn \"Payment\"\r\n\t\tbreak;\r\n\tcase 'cobilling-removegiftcertificate':\r\n\t\treturn \"Payment\"\r\n\t\tbreak;\r\n\tcase 'cobilling-billing':\r\n\t\treturn \"Review\"\r\n\t\tbreak;\r\n\tcase 'account-editprofile' :\r\n\t\treturn \"Profile\"\r\n\t\tbreak;\r\n\tcase 'address-list':\r\n\t\treturn \"Addresses\"\r\n\t\tbreak;\r\n\tcase 'paymentinstruments-list':\r\n\t\treturn \"Payment Methods\"\r\n\t\tbreak;\r\n\tcase 'wishlist-show':\r\n\t\treturn \"Saved For Later\"\r\n\t\tbreak;\r\n\tcase 'order-history':\r\n\t\treturn \"Order History\"\r\n\t\tbreak;\r\n\tcase 'orderreplenishment-show':\r\n\t\treturn \"Replenishment\"\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nfunction isMobile() {\r\n\treturn $(window).width() <= 640;\r\n}\r\n//Specific for PDP\r\nfunction getProductName()\t{\r\n\treturn $(\".product-detail .product-name\").text().trim();\r\n}\r\n//Specific for PDP\r\nfunction getProductBrand() {\r\n\treturn \"The Ginza\"; //$(\".product-detail .product-brand\").text();\r\n}\r\n//Specific for PDP\r\nfunction getProductID()\t{\r\n\treturn $(\"#pid\").val();\r\n}\r\n//Specific for PDP\r\nfunction getProductCategory() {\r\n\treturn $(\".breadcrumb\").find(\".breadcrumb-element:eq(1)\").text().trim();\r\n}\r\n//Specific for PDP\r\nfunction getProductsubCategory() {\r\n\treturn $(\".breadcrumb\").find(\".breadcrumb-element:eq(2)\").text().trim();\r\n}\r\n// Specific for PDP\r\nfunction getProductsubsubCategory() {\r\n\treturn $(\".breadcrumb\").find(\".breadcrumb-element:eq(3)\").text().trim();\r\n}\r\n// Specific for PDP\r\nfunction getProductOrederType() {\r\n\tvar replen = $(\".replenishmentCycle\").val();\r\n\tif(replen>0){\r\n\t\treturn \"Replenishment\"\r\n\t} else {\r\n\t\treturn \"Regular\"\r\n\t}\r\n\r\n}\r\n\r\nfunction getPageSubcategory() {\r\n\treturn window.pageContext.title || \"Content\";\r\n}\r\n\r\nfunction getLanguage() {\r\n\tvar lang = window.User.locale;\r\n\tif (lang.indexOf(\"\\\\u005f\")) {\r\n\t\tlang = lang.replace(\"\\\\u005f\", \"_\");\r\n\t}\r\n\r\n\tif (lang.indexOf(\"en_JP\") >= 0) {\r\n\t\treturn \"English\";\r\n\t} else if (lang.indexOf(\"zh_CN\") >= 0) {\r\n\t\treturn \"Simplified Chinese\";\r\n\t} else if (lang.indexOf(\"zh_TW\") >= 0) {\r\n\t\treturn \"Traditional Chinese\";\r\n\t} else if (lang.indexOf(\"ja_JP\") >= 0) {\r\n\t\treturn \"Japanese\";\r\n\t} else {\r\n\t\treturn lang;\r\n\t}\r\n}\r\n\r\n// page-specific: Cart, Checkout\r\nfunction getPageError() {\r\n\tvar $errorMsg = $(\".error-form\");\r\n\tif ($errorMsg.length === 0) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\treturn $errorMsg.html().trim();\r\n}\r\n\r\nfunction getActiveSortingRule() {\r\n\tvar httpParams = util.getQueryStringParams(window.location.href);\r\n\tvar sortParam = httpParams[\"srule\"];\r\n\r\n\tif (!sortParam) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn sortParam.split(\"-\").map(function (w) {\r\n\t\treturn w[0].toUpperCase() + w.substr(1);\r\n\t}).join(\" \");\r\n}\r\n\r\nfunction pushToDataLayer(o) {\r\n\twindow.dataLayer = window.dataLayer || [];\r\n\twindow.dataLayer.push(util.filterObj(o));\r\n\t//alert(JSON.stringify(util.filterObj(o)));\r\n}\r\n\r\nfunction isScrolledIntoView(elem)\r\n{\r\n\tvar docViewTop = $(window).scrollTop();\r\n\tvar docViewBottom = docViewTop + $(window).height() - 150;\r\n\tvar elemTop = $(elem).offset().top;\r\n\treturn ((elemTop <= docViewBottom) && (elemTop >= docViewTop));\r\n}\r\n\r\nfunction getpage(){\r\n\t var url = window.location.href;\r\n\t var splittedurl = url.split(\"?\");\r\n\t var page = splittedurl[0].split(\"/\");\r\n\t return page[page.length-1]\r\n}\r\n//page-specific: PLP\r\nfunction getRefinementsFromURL() {\r\n\tvar str = \"\";\r\n\tif(window.location.href.split(\"?\").length > 1){\r\n\t\tvar urlparam;\r\n\t\tif(window.location.href.split(\"?\")[1].indexOf(\"&\")>-1){\r\n\t\t\turlparam = window.location.href.split(\"?\")[1].split(\"&\");\r\n\t\t\tvar length = urlparam.length;\r\n\t\t\tvar prefnval,prefnkey,prefvval,prefvkey;\r\n\t\t\tfor(var i =0;i -1){\r\n\t\t\t\t prefnkey = urlparam[i].split(\"=\")[0];\r\n\t\t\t\t prefnval = urlparam[i].split(\"=\")[1];\r\n\t\t\t\t console.log(prefnkey);\r\n\t\t\t\t var num = prefnkey.charAt(5);\r\n\t\t\t\t for(var a =0;a 0) {\r\n\t\t\t\tvar quantity = Number($(\".quantity select\").val());\r\n\t\t\t\tvar currentId = \"#\" + $(this).parents('.product-tile').attr('id');\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"productRecommendation\",\r\n\t\t\t\t\t\"websiteCountry\": getCountry(),\r\n\t\t\t\t\t\"language\": getLanguage(),\r\n\t\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\t\"productId\": $(currentId + \" .js_addtocart\").data(\"pid\"),\r\n\t\t\t\t\t\"productCategory\": $(currentId + \" .js_addtocart\").data(\"subsubcategory\"),\r\n\t\t\t\t\t\"productName\": $(currentId + \" .name-link .product-name\").text().trim()\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t// Recommendation eelistclick in homepage,pdp,cart\r\n\t\t\tif ($(this).parents(\"#recommendations\").length > 0) {\r\n\t \tvar currentId = \"#\" + $(this).parents('.product-tile').attr('id');\r\n\t\t\t\tvar index = $(this).parents(\".product-tile\").index(\"#recommendations .slick-active .product-tile\") + 1;\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"eeListClick\",\r\n\t\t\t\t\t\"websiteCountry\": getCountry(),\r\n\t\t\t\t\t\"language\": getLanguage(),\r\n\t\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\t'products': [{\r\n\t\t\t\t\t\"list\" : \"All\",\r\n\t\t\t\t\t\"listType\" : \"we recommend\",\r\n\t\t\t\t\t\"listName\": prodData.product[0].listName,\r\n\t\t\t\t\t\"position\": index,\r\n\t\t\t\t\t\"id\": $(currentId + \" .js_addtocart\").data(\"pid\"),\r\n\t\t\t\t\t\"category\": $(currentId + \" .js_addtocart\").data(\"subsubcategory\"),\r\n\t\t\t\t\t\"price\": $(currentId + \" .js_addtocart\").data(\"price\"),\r\n\t\t\t\t\t\"name\": $(currentId + \" .name-link .product-name\").text().trim(),\r\n\t\t\t\t\t\"brand\": getProductBrand(),\r\n\t\t\t\t\t\"quantity\": \"\",\r\n\t\t\t\t\t\"size\": \"\",\r\n\t\t\t\t\t\"productOutOfStock\": $(currentId + \" .js_addtocart\").data(\"instock\"),\r\n\t\t\t\t\t\"productType\": \"Product\"}]\r\n\t\t\t\t})\r\n\t\t\t\tsessionStorage.setItem('listType',prodData.product[0].listType);\r\n\t\t\t\tsessionStorage.setItem('listName',prodData.product[0].listName);\r\n\t\t\t}\r\n\t\t\t// bestseller eelistclick in homepage\r\n\t\t\tif ($(this).parents(\".pi .slick-active .product-tile\").length > 0) {\r\n\t\t\t\tvar currentId = \"#\" + $(this).parents('.product-tile').attr('id');\r\n\t\t\t\tvar index = $(this).parents(\".product-tile\").index(\".pi .slick-active .product-tile\") + 1;\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"eeListClick\",\r\n\t\t\t\t\t\"websiteCountry\": getCountry(),\r\n\t\t\t\t\t\"language\": getLanguage(),\r\n\t\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\t'products': [{\r\n\t\t\t\t\t\"list\" : \"All\",\r\n\t\t\t\t\t\"listType\" : \"Homepage product carrousel\",\r\n\t\t\t\t\t\"listName\": prodData.product[0].listName,\r\n\t\t\t\t\t\"position\": index,\r\n\t\t\t\t\t\"id\": $(currentId + \" .js_addtocart\").data(\"pid\"),\r\n\t\t\t\t\t\"category\": $(currentId + \" .js_addtocart\").data(\"subsubcategory\"),\r\n\t\t\t\t\t\"price\": $(currentId + \" .js_addtocart\").data(\"price\"),\r\n\t\t\t\t\t\"name\": $(currentId + \" .name-link .product-name\").text().trim(),\r\n\t\t\t\t\t\"brand\": getProductBrand(),\r\n\t\t\t\t\t\"quantity\": \"\",\r\n\t\t\t\t\t\"size\": \"\",\r\n\t\t\t\t\t\"productOutOfStock\": $(currentId + \" .js_addtocart\").data(\"instock\"),\r\n\t\t\t\t\t\"productType\": \"Product\"}]\r\n\t\t\t\t})\r\n\t\t\t\tsessionStorage.setItem('listType',prodData.product[0].listType);\r\n\t\t\t\tsessionStorage.setItem('listName',prodData.product[0].listName);\r\n\t\t\t}\r\n\t\t\t// Recently viewed eelistclick in homepage\r\n\t\t\tif ($(this).parents(\".recently-viewed\").length > 0) {\r\n\t\t\t\tvar currentId = \"#\" + $(this).parents('.product-tile').attr('id');\r\n\t\t\t\tvar index = $(this).parents(\".product-tile\").index(\".recently-viewed .slick-active .product-tile\") + 1;\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"eeListClick\",\r\n\t\t\t\t\t\"websiteCountry\": getCountry(),\r\n\t\t\t\t\t\"language\": getLanguage(),\r\n\t\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\t'products': [{\r\n\t\t\t\t\t\"list\" : \"All\",\r\n\t\t\t\t\t\"listType\" : \"Recently viewed\",\r\n\t\t\t\t\t\"listName\": prodData.product[0].listName,\r\n\t\t\t\t\t\"position\": index,\r\n\t\t\t\t\t\"id\": $(currentId + \" .js_addtocart\").data(\"pid\"),\r\n\t\t\t\t\t\"category\": $(currentId + \" .js_addtocart\").data(\"subsubcategory\"),\r\n\t\t\t\t\t\"price\": $(currentId + \" .js_addtocart\").data(\"price\"),\r\n\t\t\t\t\t\"name\": $(currentId + \" .name-link .product-name\").text().trim(),\r\n\t\t\t\t\t\"brand\": getProductBrand(),\r\n\t\t\t\t\t\"quantity\": \"\",\r\n\t\t\t\t\t\"size\": \"\",\r\n\t\t\t\t\t\"productOutOfStock\": $(currentId + \" .js_addtocart\").data(\"instock\"),\r\n\t\t\t\t\t\"productType\": \"Product\"}]\r\n\t\t\t\t})\r\n\t\t\t\tsessionStorage.setItem('listType',prodData.product[0].listType);\r\n\t\t\t\t sessionStorage.setItem('listName',prodData.product[0].listName);\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// newsletter in navigation;\r\n\t\t.on(\"clicknewsletter\", function (e, data) {\r\n\t\t\t\t pushToDataLayer({\r\n\t\t\t\t\t\"event\": \"newsletterSubscription\",\r\n\t\t\t\t\t\"siteLocation\": data.siteloc,\r\n\t\t\t\t\t\"pageSubCategory\": getPageCategory() == \"My Account\" ? getProductsubCategory():\"\",\r\n\t\t\t\t\t\"pageCategory\": getPageCategory()\r\n\t\t\t\t\t});\r\n\t\t })\r\n\r\n\r\n\t\t// click ask question in pdp\r\n\t\t.on(\"click\",\".bv-ask-question\",\tfunction (e) {\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\tpage:getpage(),\r\n\t\t\t\t\"event\": \"askQuestion\",\r\n\t\t\t\tproductCategory:getProductCategory(),\r\n\t\t\t\tpageSubCategory:\"Ask a Question\",\r\n\t\t\t\tproductName:getProductName(),\r\n\t\t\t\tpageCategory:\"Product Page\"\r\n\t\t\t});\r\n\t\t})\r\n\r\n\t\t// Scroll on reviews in pdp\r\n\t\t.on(\"scroll\", function() {\r\n\t\t\t if ($(\".bv-section-summary\").length) {\r\n\t\t\t\tif (isScrolledIntoView(\".bv-section-summary\") && unbind < 1) {\r\n\t\t\t\t\tunbind = 1;\r\n\t\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\t\tpage: getpage(),\r\n\t\t\t\t\t\t\tevent: \"productReviewsView\",\r\n\t\t\t\t\t\t\tproductCategory: getProductCategory(),\r\n\t\t\t\t\t\t\tpageSubCategory: \"Reviews\",\r\n\t\t\t\t\t\t\tproductName:getProductName(),\r\n\t\t\t\t\t\t\tpageCategory: \"Product Page\"\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t }\r\n\r\n\t\t\t // for recommendation in pdp and cart, Best Seller and Recently Viewed in Homepage\r\n\t\t\t if ($(\".pi .carousel-recommendations\").length > 0 || $(\".cross-sell .carousel-recommendations\").length > 0 ) {\r\n\t\t\t\t if (isScrolledIntoView(\".carousel-recommendations\") && unbindcarousel < 1) {\r\n\t\t\t\t\t unbindcarousel = 1;\r\n\t\t\t\t\t pushToDataLayer({\r\n\t\t\t\t\t\t\t\"currencyCode\": window.User.currencyCode,\r\n\t\t\t\t\t\t\t\"eeAction\": \"eeListView\",\r\n\t\t\t\t\t\t\t\"event\" : \"eeListView\",\r\n\t\t\t\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\t\t\t\"products\":window.forpageload.product});\r\n\t\t\t\t }\r\n\t\t\t }\r\n\r\n\t\t})\r\n\r\n\t\t// Click on Reviews in PDP\r\n\t\t.on(\"click\", \".bv-inline-histogram-ratings-star-container\", function () {\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\tpage: getpage(),\r\n\t\t\t\tevent: \"productReviewsView\",\r\n\t\t\t\tproductCategory: getProductCategory(),\r\n\t\t\t\tpageSubCategory: \"Reviews\",\r\n\t\t\t\tproductName:getProductName(),\r\n\t\t\t\tpageCategory: \"Product Page\"\r\n\t\t\t});\r\n\t\t})\r\n\r\n\t\t// Check balance giftcard in gift card page\r\n\t\t.on('click', \"#CheckBalanceButton\", function(){\r\n\t\t\tif($(\"#dwfrm_giftcert_balance_giftCertID\").val() != \"\" && $(\"#dwfrm_giftcert_balance_giftCertPIN\").val() != \"\"){\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"giftCard\",\r\n\t\t\t\t\t\"pageSubCategory\": \"Gift Card\",\r\n\t\t\t\t\t\"pageCategory\": \"My Account\"\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// Check balance giftcard in checkout page\r\n\t\t.on('click', \".modal-body .gift-cert-balance-submit #check-giftcert-modal\", function(e){\r\n\t\t\tif($(\".modal-body .gift-card-number #dwfrm_billing_giftCertCode\").val() != \"\" && $(\".modal-body .gift-card-pin #dwfrm_giftcert_balance_giftCertPIN\").val() != \"\"){\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"giftCard\",\r\n\t\t\t\t\t\"pageSubCategory\": \"Payment\",\r\n\t\t\t\t\t\"pageCategory\": \"Checkout\"\r\n\t\t\t\t\t});\r\n\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// Submit ask a question\r\n\t\t.on('click', \".bv-submission-section button:contains('Post Question')\" , function(e){\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"page\": getpage(),\r\n\t\t\t\t\t\"event\": \"submitQuestion\",\r\n\t\t\t\t\t\"productCategory\": getProductCategory(),\r\n\t\t\t\t\t\"question\": $(\"#bv-textarea-field-questionsummary\").val(),\r\n\t\t\t\t\t\"productName\": getProductName(),\r\n\t\t\t\t\t\"pageSubCategory\": \"Ask a Question\",\r\n\t\t\t\t\t\"pageCategory\": getPageCategory()\r\n\t\t\t\t\t});\r\n\t\t})\r\n\r\n\t\t// remove from cart\r\n\t\t.on('click', \".button-text.not-underline\", function (e) {\r\n\t\t\tvar index = $(this).parents(\".cart-row\").index();\r\n\t\t\tvar country = getCountry();\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\t\"event\": \"removeFromCart\",\r\n\t\t\t\t\"websiteCountry\": getCountry(),\r\n\t\t\t\t\"language\": getLanguage(),\r\n\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\"currencyCode\": window.Resources.CURRENCY,\r\n\t\t\t\t'products': [{\r\n\t\t\t\t\"id\": basketConfirmation.productLineItems[index-1].id,\r\n\t\t\t\t\"category\": basketConfirmation.productLineItems[index-1].subCategory,\r\n\t\t\t\t\"price\": $(this).data(\"price\").replace(/\\.0$/, \"\"),\r\n\t\t\t\t\"productOutOfStock\": basketConfirmation.productLineItems[index-1].productOutOfStock,\r\n\t\t\t\t\"name\": basketConfirmation.productLineItems[index-1].name,\r\n\t\t\t\t\"brand\": getProductBrand(),\r\n\t\t\t\t\"quantity\": basketConfirmation.productLineItems[index-1].quantity,\r\n\t\t\t\t\"size\": basketConfirmation.productLineItems[index-1].size,\r\n\t\t\t\t\"variant\": $(this).data(\"size\") ? $(this).data(\"size\") : \"null\",\r\n\t\t\t\t\"productType\": basketConfirmation.productLineItems[index-1].productType}]\r\n\t\t\t})\r\n\t\t})\r\n\r\n\t\t// click full ingredients in pdp\r\n\t\t.on('click', \".accordion-item.is-active #composition-label\", function(e) {\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\t\"event\": \"productInteraction\",\r\n\t\t\t\t\"productCategory\": productCache.subsubcategory,\r\n\t\t\t\t\"productName\": getProductName(),\r\n\t\t\t\t\"websiteCountry\": getCountry(),\r\n\t\t\t\t\"language\": getLanguage(),\r\n\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\"productId\": getProductID(),\r\n\t\t\t\t\"interactionType\" : \"View Full Product Ingredients\"\r\n\t\t\t})\r\n\t\t})\r\n\r\n\t\t// tracking change on image in\r\n\t\t.on(\"clickproductthumbnail\",function(){\r\n\t\t\tif (window.productCache) {\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"productInteraction\",\r\n\t\t\t\t\t\"productCategory\": productCache.subsubcategory,\r\n\t\t\t\t\t\"productName\": getProductName(),\r\n\t\t\t\t\t\"websiteCountry\": getCountry(),\r\n\t\t\t\t\t\"language\": getLanguage(),\r\n\t\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\t\"productId\": getProductID(),\r\n\t\t\t\t\t\"interactionType\" : \"Image Change\"\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// click slick arrow in pdp\r\n\t\t.on(\"click\", \".product-images.product-slide-large .slick-arrow\",function(){\r\n\t\t\tif (window.productCache) {\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"productInteraction\",\r\n\t\t\t\t\t\"productCategory\": productCache.subsubcategory,\r\n\t\t\t\t\t\"productName\": getProductName(),\r\n\t\t\t\t\t\"websiteCountry\": getCountry(),\r\n\t\t\t\t\t\"language\": getLanguage(),\r\n\t\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\t\"productId\": getProductID(),\r\n\t\t\t\t\t\"interactionType\" : \"Image Change\"\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t.on(\"click\", \".cart-promo-approaching\", function(){\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\t\"event\": \"eePromoClick\",\r\n\t\t\t\t\"pageSubCategory\": \"Internal marketing\",\r\n\t\t\t\t\"pageCategory\": \"Cart Page\",\r\n\t\t\t\t'promotions': [{\r\n\t\t\t\t\"position\": \"Cart\",\r\n\t\t\t\t\"id\": $(\".cart-promo-approaching\").data(\"promoid\"),\r\n\t\t\t\t\"creative\": \"Cart-Banner\",\r\n\t\t\t\t\"name\": $(\".cart-promo-approaching\").data(\"promoname\").trim()\r\n\t\t\t\t}]\r\n\t\t\t})\r\n\t\t})\r\n\r\n\t\t.on(\"click\", \".cart-coupon-code #add-coupon\", function () {\r\n\t\t\tlocalStorage.removeItem('couponvalidation');\r\n\t\t})\r\n\r\n\t\t// track share button on PDP\r\n\t\t.on(\"click\", \".social-sharing-container .share-icon\", function() {\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\t\"socialAction\": \"Share\",\r\n\t\t\t\t\"event\": \"socialShare\",\r\n\t\t\t\t\"siteLocation\": \"product page\",\r\n\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\"socialNetwork\": $(this).data(\"share\")\r\n\t\t\t\t})\r\n\r\n\t\t})\r\n\r\n\t\t// Track Follow button on Footer\r\n\t\t.on(\"click\", \".social-links a\", function() {\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\t\"socialAction\": \"Follow\",\r\n\t\t\t\t\"event\": \"socialFollow\",\r\n\t\t\t\t\"siteLocation\": \"footer\",\r\n\t\t\t\t\"pageCategory\": getPageCategory(),\r\n\t\t\t\t\"socialNetwork\": $(this).data(\"follow\")\r\n\t\t\t\t})\r\n\t\t})\r\n\r\n\t\t// click email hyper link in navigation\r\n\t\t.on('click','.emailcsr-nav', function(){\r\n\t\t\tif(window.Resources.PAGE_CATEGORY == \"page-show\"){\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"contactRequest\",\r\n\t\t\t\t\t\"contactType\": \"Email\",\r\n\t\t\t\t\t\"siteLocation\": \"Header\",\r\n\t\t\t\t\t//\"pageSubCategory\": couponsubcategory(),\r\n\t\t\t\t\t\"pageCategory\": getProductCategory()\r\n\t\t\t\t\t});\r\n\r\n\t\t\t}else{\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"contactRequest\",\r\n\t\t\t\t\t\"contactType\": \"Email\",\r\n\t\t\t\t\t\"siteLocation\": \"Header\",\r\n\t\t\t\t\t\"pageSubCategory\": window.Resources.PAGE_CATEGORY==\"cart-show\" ? \"\" :couponsubcategory(),\r\n\t\t\t\t\t\"pageCategory\": getPageCategory()\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t})\r\n\t\t// Click email link in the customer care\r\n\t\t.on(\"click\",\".content-asset a:contains('customerservice@shiseidousa.com')\",function(){\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\t\"event\": \"contactRequest\",\r\n\t\t\t\t\"contactType\": \"Email\",\r\n\t\t\t\t\"siteLocation\": window.Resources.PAGE_CATEGORY==\"cart-show\" ? \"Right Nav\":\"Body\",\r\n\t\t\t\t//\"pageSubCategory\": couponsubcategory(),\r\n\t\t\t\t\"pageCategory\": window.Resources.PAGE_CATEGORY==\"cart-show\" ? getPageCategory(): getProductCategory()\r\n\t\t\t\t});\r\n\t\t})\r\n\r\n\t\t.on(\"gtmcontactus\",function(){\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\t\"event\": \"contactRequest\",\r\n\t\t\t\t\"contactType\": \"Contact Customer Care Submission\",\r\n\t\t\t\t\"siteLocation\": \"Body\",\r\n\t\t\t\t\"pageCategory\": getPageCategory()\r\n\t\t\t\t});\r\n\t\t})\r\n\t\t.on(\"askanexpert\",function(){\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\t\"event\": \"contactRequest\",\r\n\t\t\t\t\"contactType\": \"Ask An Expert Submission\",\r\n\t\t\t\t\"siteLocation\": \"Body\",\r\n\t\t\t\t\"pageSubCategory\": couponsubcategory(),\r\n\t\t\t\t\"pageCategory\": \"Ask An Expert\"\r\n\t\t\t});\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".LPMcontainer\",function(){\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\t\"event\": \"contactRequest\",\r\n\t\t\t\t\"contactType\": \"Live Chat\",\r\n\t\t\t\t\"siteLocation\": getPageCategory()==\"Checkout\" ? \"Header\": \"Body\",\r\n\t\t\t\t\"pageSubCategory\":couponsubcategory(),\r\n\t\t\t\t\"pageCategory\": getPageCategory()\r\n\t\t\t});\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".LPMimage\",function(){\r\n\t\t\tvar id = $(this).attr(\"id\");\r\n\t\t\tvar chk = id.charAt(id.length - 1)\r\n\t\t\tif(chk == 1){\r\n\t\t\t\tpushToDataLayer({\r\n\t\t\t\t\t\"event\": \"contactRequest\",\r\n\t\t\t\t\t\"contactType\": \"Live Chat\",\r\n\t\t\t\t\t\"siteLocation\": \"Pop-up\",\r\n\t\t\t\t\t\"pageSubCategory\":couponsubcategory(),\r\n\t\t\t\t\t\"pageCategory\": getPageCategory()\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".footer-container .products ul li:nth-child(4)\",function(){\r\n\t\t\tpushToDataLayer({\r\n\t\t\t\t\"event\": \"contactRequest\",\r\n\t\t\t\t\"contactType\": \"Phone\",\r\n\t\t\t\t\"siteLocation\": \"Footer\",\r\n\t\t\t\t\"pageSubCategory\":window.Resources.PAGE_CATEGORY==\"cart-show\" ? \"\" :couponsubcategory(),\r\n\t\t\t\t\"pageCategory\": getPageCategory()\r\n\t\t\t});\r\n\t\t})\r\n\r\n\t\t// click on recommendation\r\n\t\t.on(\"click\",\".recommendation-item\",function(){\r\n\t\t\tif(getPageCategory()== \"Product Page\"){\r\n\t\t\t\tsessionStorage.setItem('listType', \"Recommended Product List\");\r\n\t\t\t\tsessionStorage.setItem('listName', \"Product Page\");\r\n\t\t\t}else if(getPageCategory()== \"Home Page\"){\r\n\t\t\t\tsessionStorage.setItem('listType', \"Recently Viewed List\");\r\n\t\t\t\tsessionStorage.setItem('listName', \"Home Page\");\r\n\t\t\t}\r\n\r\n\t\t})\r\n\r\n\r\n\t\t.on(\"click\",\".catalog-link\",function(e){\r\n\t\t\t if(navctr==true){\r\n\t\t\t\t gtmNavData = $(this).text().trim();\r\n\t\t\t\t sessionStorage.setItem(\"navlink\",gtmNavData);\r\n\t\t\t\t sessionStorage.setItem(\"menuloc\",\"topmenu\");\r\n\t\t\t\t util.setCookie('navdata',gtmNavData,.20);\r\n\t\t\t\t navctr = false;\r\n\t\t\t }\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".main-nav .has-sub-menu a\",function(e){\r\n\t\t\tif(navctr==true){\r\n\t\t\t\tgtmNavData = $(this).text().trim();\r\n\t\t\t\tsessionStorage.setItem(\"navlink\",gtmNavData);\r\n\t\t\t\tsessionStorage.setItem(\"menuloc\",\"topmenu\");\r\n\t\t\t\tutil.setCookie('navdata',gtmNavData,.20);\r\n\t\t\t\tnavctr = false;\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".refinement-header\",function(e){\r\n\t\t\tgtmNavData = $(this).text().trim();\r\n\t\t\tsessionStorage.setItem(\"navlink\",gtmNavData);\r\n\t\t\tsessionStorage.setItem(\"menuloc\",\"leftmenu\");\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".refinement-link\",function(e){\r\n\t\t\tgtmNavData = $(this).text().trim();\r\n\t\t\tsessionStorage.setItem(\"navlink\",gtmNavData);\r\n\t\t\tsessionStorage.setItem(\"menuloc\",\"leftmenu\");\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".breadcrumb-element\",function(e){\r\n\t\t\tgtmNavData = $(this).text().trim();\r\n\t\t\tsessionStorage.setItem(\"breadcrumbs\",gtmNavData);\r\n\t\t\tsessionStorage.setItem(\"menuloc\",\"leftmenu\");\r\n\t\t})\r\n\r\n\t\t.on(\"change\",\"#quantity\",function(e){\r\n\t\t\tif(getPageCategory() == \"Cart Page\"){\r\n\t\t\t\tif($(\".edit-modal\").length > 0){\r\n\t\t\t\t\tsessionStorage.setItem(\"cartupdate\",\"1\");\r\n\t\t\t\t}else{\r\n\t\t\t\t\tsessionStorage.setItem(\"productUpdate\",\"1\");\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t})\r\n\r\n\t\t.on(\"change\",\".quantity-select\",function(e){\r\n\t\t\tif(window.Resources.PAGE_CATEGORY == \"wishlist-show\"){\r\n\t\t\t\tsessionStorage.setItem(\"productUpdate\",\"1\");\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".account-left-nav li a\",function(e){\r\n\t\t\tgtmNavData = $(this).text().trim();\r\n\t\t\tsessionStorage.setItem(\"navlink\",gtmNavData);\r\n\t\t\tsessionStorage.setItem(\"menuloc\",\"leftmenu\");\r\n\t\t})\r\n\r\n\t\t// Remove uservalidation attribute for userlogin validation\r\n\t\t.on('click', \".user-logout\", function (e) {\r\n\t\t\tlocalStorage.removeItem('uservalidation');\r\n\t\t})\r\n\r\n\t\t.on(\"change\",\"#va-color\",function(){\r\n\t\t\tif(getPageCategory() == \"Cart Page\"){\r\n\t\t\t\tsessionStorage.setItem(\"cartupdate\",\"1\");\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".close-button\",function(){\r\n\t\t\tif(getPageCategory() == \"Cart Page\"){\r\n\t\t\t\tsessionStorage.setItem(\"cartupdate\",\"\");\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\"#save-for-later\",function(){\r\n\t\t\tif(getPageCategory() == \"Cart Page\"){\r\n\t\t\t\tsessionStorage.setItem(\"cartupdate\",\"\");\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\"#pdp-swatches .selectable\",function(){\r\n\t\t\tif(getPageCategory() == \"Cart Page\"){\r\n\t\t\t\tif(!$(this).hasClass(\"selected\")){\r\n\t\t\t\t\tsessionStorage.setItem(\"cartupdate\",\"1\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".search-suggestion-wrapper .hit\",function(){\r\n\t\t\tgtmNavData = $(this).text().trim();\r\n\t\t\tsessionStorage.setItem(\"navlink\",gtmNavData.replace(/\\s\\s+/g, ' '));\r\n\t\t\tsessionStorage.setItem(\"menuloc\",\"site search pop-in\");\r\n\t\t})\r\n\r\n\t\t.on(\"click\",\".search-suggestion-wrapper .product-suggestion\",function(){\r\n\t\t\tgtmNavData = $(this).text().trim();\r\n\t\t\tvar rep = gtmNavData.replace(/\\n/g,\" \");\r\n\t\t\tsessionStorage.setItem(\"navlink\",rep.replace(/ +/g,\" \"));\r\n\t\t\tsessionStorage.setItem(\"menuloc\",\"site search pop-in\");\r\n\t\t})\r\n\r\n\t\t// PLP click in list\r\n\t\t.on(\"click\", \"#search-result-items .gtmindex .thumb-link\", function(){\r\n\t\t\teeListClick($(this));\r\n\t\t})\r\n\r\n\t\t// PLP click in list\r\n\t\t.on(\"click\", \"#search-result-items .gtmindex .name-link\", function(){\r\n\t\t\teeListClick($(this));\r\n\t\t})\r\n\r\n\t\t// click on viewmore button\r\n\t\t.on(\"plpviewmore\",function(e){\r\n\t\t\tif(getPageCategory() == \"Category Page\"){\r\n\t\t\t\tif(prodholder && typeof productData.product != undefined){\r\n\t\t\t\t\tif(productData.page>1){\r\n\t\t\t\t\t\tprodholder = prodholder.concat(productData.product);\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tprodholder = prodholder[0].concat(productData.product);\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\tfor(var i=0;i0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,x),(0,b.default)(w,x.once),w},O=function(){w=(0,h.default)(),j()},_=function(){w.forEach(function(e,t){e.node.removeAttribute(\"data-aos\"),e.node.removeAttribute(\"data-aos-easing\"),e.node.removeAttribute(\"data-aos-duration\"),e.node.removeAttribute(\"data-aos-delay\")})},S=function(e){return e===!0||\"mobile\"===e&&p.default.mobile()||\"phone\"===e&&p.default.phone()||\"tablet\"===e&&p.default.tablet()||\"function\"==typeof e&&e()===!0},z=function(e){x=i(x,e),w=(0,h.default)();var t=document.all&&!window.atob;return S(x.disable)||t?_():(document.querySelector(\"body\").setAttribute(\"data-aos-easing\",x.easing),document.querySelector(\"body\").setAttribute(\"data-aos-duration\",x.duration),document.querySelector(\"body\").setAttribute(\"data-aos-delay\",x.delay),\"DOMContentLoaded\"===x.startEvent&&[\"complete\",\"interactive\"].indexOf(document.readyState)>-1?j(!0):\"load\"===x.startEvent?window.addEventListener(x.startEvent,function(){j(!0)}):document.addEventListener(x.startEvent,function(){j(!0)}),window.addEventListener(\"resize\",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener(\"orientationchange\",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener(\"scroll\",(0,u.default)(function(){(0,b.default)(w,x.once)},x.throttleDelay)),x.disableMutationObserver||(0,d.default)(\"[data-aos]\",O),w)};e.exports={init:z,refresh:j,refreshHard:O}},function(e,t){},,,,,function(e,t){(function(t){\"use strict\";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(s,t),_?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=O();return c(e)?d(e):void(h=setTimeout(s,a(e)))}function d(e){return h=void 0,z&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),o(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,k=0,_=!1,S=!1,z=!0;if(\"function\"!=typeof e)throw new TypeError(f);return t=u(t)||0,i(n)&&(_=!!n.leading,S=\"maxWait\"in n,y=S?x(u(n.maxWait)||0,t):y,z=\"trailing\"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if(\"function\"!=typeof e)throw new TypeError(f);return i(o)&&(r=\"leading\"in o?!!o.leading:r,a=\"trailing\"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t=\"undefined\"==typeof e?\"undefined\":c(e);return!!e&&(\"object\"==t||\"function\"==t)}function r(e){return!!e&&\"object\"==(\"undefined\"==typeof e?\"undefined\":c(e))}function a(e){return\"symbol\"==(\"undefined\"==typeof e?\"undefined\":c(e))||r(e)&&k.call(e)==d}function u(e){if(\"number\"==typeof e)return e;if(a(e))return s;if(i(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=e.replace(l,\"\");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?s:+e}var c=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},f=\"Expected a function\",s=NaN,d=\"[object Symbol]\",l=/^\\s+|\\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y=\"object\"==(\"undefined\"==typeof t?\"undefined\":c(t))&&t&&t.Object===Object&&t,g=\"object\"==(\"undefined\"==typeof self?\"undefined\":c(self))&&self&&self.Object===Object&&self,h=y||g||Function(\"return this\")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){\"use strict\";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(s,t),_?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function f(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=j();return f(e)?d(e):void(h=setTimeout(s,u(e)))}function d(e){return h=void 0,z&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=f(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),i(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,O=0,_=!1,S=!1,z=!0;if(\"function\"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(_=!!n.leading,S=\"maxWait\"in n,y=S?k(a(n.maxWait)||0,t):y,z=\"trailing\"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e){var t=\"undefined\"==typeof e?\"undefined\":u(e);return!!e&&(\"object\"==t||\"function\"==t)}function i(e){return!!e&&\"object\"==(\"undefined\"==typeof e?\"undefined\":u(e))}function r(e){return\"symbol\"==(\"undefined\"==typeof e?\"undefined\":u(e))||i(e)&&w.call(e)==s}function a(e){if(\"number\"==typeof e)return e;if(r(e))return f;if(o(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=e.replace(d,\"\");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?f:+e}var u=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},c=\"Expected a function\",f=NaN,s=\"[object Symbol]\",d=/^\\s+|\\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v=\"object\"==(\"undefined\"==typeof t?\"undefined\":u(t))&&t&&t.Object===Object&&t,y=\"object\"==(\"undefined\"==typeof self?\"undefined\":u(self))&&self&&self.Object===Object&&self,g=v||y||Function(\"return this\")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){\"use strict\";function n(e,t){var n=window.document,r=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,a=new r(o);i=t,a.observe(n.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function o(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),n=Array.prototype.slice.call(e.removedNodes),o=t.concat(n).filter(function(e){return e.hasAttribute&&e.hasAttribute(\"data-aos\")}).length;o&&i()})}Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){};t.default=n},function(e,t){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(){return navigator.userAgent||navigator.vendor||window.opera||\"\"}Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(e,t){for(var n=0;ne.position?e.node.classList.add(\"aos-animate\"):\"undefined\"!=typeof o&&(\"false\"===o||!n&&\"true\"!==o)&&e.node.classList.remove(\"aos-animate\")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){\"use strict\";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add(\"aos-init\"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){\"use strict\";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute(\"data-aos-offset\"),anchor:e.getAttribute(\"data-aos-anchor\"),anchorPlacement:e.getAttribute(\"data-aos-anchor-placement\")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case\"top-bottom\":break;case\"center-bottom\":n+=e.offsetHeight/2;break;case\"bottom-bottom\":n+=e.offsetHeight;break;case\"top-center\":n+=i/2;break;case\"bottom-center\":n+=i/2+e.offsetHeight;break;case\"center-center\":n+=i/2+e.offsetHeight/2;break;case\"top-top\":n+=i;break;case\"bottom-top\":n+=e.offsetHeight+i;break;case\"center-top\":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-(\"BODY\"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-(\"BODY\"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(e){return e=e||document.querySelectorAll(\"[data-aos]\"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])});\n},{}],8:[function(require,module,exports){\n'use strict';\r\n\r\nvar analytics = require('./analytics'),\r\n countries = require('./countries'),\r\n dialog = require('./dialog'),\r\n quickview = require(\"./quickview\"),\r\n minicart = require('./minicart'),\r\n page = require('./page'),\r\n rating = require('./rating'),\r\n searchsuggest = require('./searchsuggest'),\r\n tooltip = require('./tooltip'),\r\n util = require('./util'),\r\n validator = require('./validator'),\r\n slick = require('./slick'),\r\n animation = require('./aos'),\r\n tls = require('./tls'),\r\n video = require(\"./video\"),\r\n headerMenu = require('./header-menu'),\r\n footerSelector = require('./footer-selector'),\r\n newsletter = require('./newsletter'),\r\n orderreplenishment = require('./order-replenishment'),\r\n pdpredesign = require('./pdpredesign'),\r\n inputEntry = require('./input-entry'),\r\n producttile = require('./product-tile'),\r\n afterpay = require('./afterpay'),\r\n removeScreenOverlay = require('./drawerControl');\r\n\r\nconst EventNames = require('./constants/EventNames');\r\n//if jQuery has not been loaded, load from google cdn\r\nif (!window.jQuery) {\r\n var s = document.createElement('script');\r\n\r\n s.setAttribute('src', 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js');\r\n s.setAttribute('type', 'text/javascript');\r\n\r\n document.getElementsByTagName('head')[0].appendChild(s);\r\n}\r\n\r\nrequire('./jquery-ext')();\r\nrequire('./cookieprivacy')();\r\nrequire('./captcha')();\r\n\r\nfunction initializeEvents() {\r\n var controlKeys = ['8', '13', '46', '45', '36', '35', '38', '37', '40', '39'];\r\n\r\n $('body')\r\n .on('keydown', 'textarea[data-character-limit]', function(e) {\r\n var text = $.trim($(this).val()),\r\n charsLimit = $(this).data('character-limit'),\r\n charsUsed = text.length;\r\n\r\n if ((charsUsed >= charsLimit) && (controlKeys.indexOf(e.which.toString()) < 0)) {\r\n e.preventDefault();\r\n }\r\n })\r\n .on('change keyup mouseup', 'textarea[data-character-limit]', function() {\r\n var text = $(this).val(),\r\n charsLimit = $(this).data('character-limit'),\r\n charsUsed = text.length,\r\n charsRemain = charsLimit - charsUsed;\r\n\r\n if (charsRemain < 0) {\r\n $(this).val(text.slice(0, charsRemain));\r\n charsRemain = 0;\r\n }\r\n\r\n $(this).closest('.field-wrapper').find('.char-remain-count').html(charsRemain);\r\n\r\n });\r\n\r\n /**\r\n * initialize search suggestions, pending the value of the site preference(enhancedSearchSuggestions)\r\n * this will either init the legacy(false) or the beta versions(true) of the the search suggest feature.\r\n * */\r\n var $searchContainer = $('.utility-nav .header-search');\r\n\r\n searchsuggest.init($searchContainer, Resources.SIMPLE_SEARCH);\r\n\r\n // add show/hide navigation elements\r\n $('.secondary-navigation .toggle').on(\"click\", function() {\r\n $(this).toggleClass('expanded').next('ul').toggle();\r\n });\r\n\r\n // add generic toggle functionality\r\n $('.toggle').next('.toggle-content').hide();\r\n $('.toggle').on(\"click\", function() {\r\n $(this).toggleClass('expanded').next('.toggle-content').toggle();\r\n });\r\n\r\n // subscribe email box\r\n var $subscribeEmail = $('.subscribe-email');\r\n\r\n if ($subscribeEmail.length > 0) {\r\n $subscribeEmail.on(\"focus\", function() {\r\n var val = $(this.val());\r\n\r\n if (val.length > 0 && val !== Resources.SUBSCRIBE_EMAIL_DEFAULT) {\r\n return; // do not animate when contains non-default value\r\n }\r\n\r\n $(this).animate({\r\n color: '#999999'\r\n }, 500, 'linear', function() {\r\n $(this).val('').css('color', '#333333');\r\n });\r\n }).on(\"blur\", function() {\r\n var val = $.trim($(this.val()));\r\n\r\n if (val.length > 0) {\r\n return; // do not animate when contains value\r\n }\r\n\r\n $(this).val(Resources.SUBSCRIBE_EMAIL_DEFAULT)\r\n .css('color', '#999999')\r\n .animate({\r\n color: '#333333'\r\n }, 500, 'linear');\r\n });\r\n }\r\n\r\n if (SitePreferences.MOTIONPOINT_ENABLED) {\r\n\r\n $('#chooseLanguage').on('click', function(e) {\r\n e.preventDefault();\r\n\r\n var script = document.createElement('script');\r\n\r\n //MP.SrcUrl = unescape('mp_js_orgin_url'); - commented out per MotionPoint\r\n MP.UrlLang = 'mp_js_current_lang';\r\n MP.oSite = decodeURIComponent('mp_js_origin_baseUrl');\r\n MP.tSite = decodeURIComponent('mp_js_translated_baseUrl');\r\n\r\n MP.init();\r\n\r\n script.src = 'https://shiseidoamericas.mpeasylink.com/mpel/mpel_chooser.js';\r\n\r\n document.body.appendChild(script);\r\n\r\n return false;\r\n });\r\n\r\n }\r\n\r\n $('.privacy-policy').on('click', function(e) {\r\n e.preventDefault();\r\n\r\n dialog.open({\r\n url: $(e.target).attr('href'),\r\n options: {\r\n height: 600\r\n }\r\n });\r\n });\r\n\r\n if ($('.order-confirmation-details').length) {\r\n sessionStorage.removeItem('isGift');\r\n sessionStorage.removeItem('giftMessage');\r\n }\r\n\r\n var url = Urls.passwordReset;\r\n\r\n if ($('.reset-password-link').length) {\r\n if (location.protocol === 'https:') {\r\n url = Urls.securePasswordReset;\r\n }\r\n\r\n $('.reset-password-link').each(function () {\r\n $(this).find('a').attr('href', url);\r\n });\r\n }\r\n\r\n if ($('.user-recognized').length) {\r\n if (location.protocol === 'https:') {\r\n url = Urls.securePasswordReset;\r\n }\r\n\r\n $('.user-recognized').find('a').attr('href', url);\r\n }\r\n\r\n // checkout checkout minicart on right side event handling\r\n addSummaryScrollbar();\r\n producttile.globalQuickView();\r\n \r\n $(document).on(EventNames.TRIGGER_CLICK_ORDER_DETAIL, function () {\r\n $('.header-detail-order').on('click', function(e) {\r\n var viewDetailOrder = $(this).parent().find('button.show-detail-order');\r\n if (viewDetailOrder.length > 0) {\r\n viewDetailOrder.trigger('click');\r\n }\r\n });\r\n })\r\n \r\n $('.search-pagination').on('click','#view-more-landing', buttonClickCategoryLandingPage);\r\n $('.search-pagination').on('click','#view-all-landing', buttonClickCategoryLandingPage);\r\n \r\n $('.search-pagination').on('click','#view-more-landing-search', buttonClickCategoryLandingPage);\r\n $('.search-pagination').on('click','#view-all-landing-search', buttonClickCategoryLandingPage);\r\n}\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Adds class ('js') to html for css targeting and loads js specific styles.\r\n */\r\nfunction initializeDom() {\r\n // add class to html for css targeting\r\n $('html').addClass('js');\r\n\r\n if (SitePreferences.LISTING_INFINITE_SCROLL) {\r\n $('html').addClass('infinite-scroll');\r\n }\r\n\r\n // load js specific styles\r\n util.limitCharacters();\r\n}\r\n\r\nfunction backToTopHandler() {\r\n $(document).on('scroll', function() {\r\n if ($(window).scrollTop() > 100) {\r\n $('.scroll-top-wrapper').addClass('show');\r\n } else {\r\n $('.scroll-top-wrapper').removeClass('show');\r\n }\r\n });\r\n\r\n $('.scroll-top-wrapper').on('click', scrollToTop);\r\n}\r\n\r\nfunction scrollToTop(e) {\r\n e.preventDefault();\r\n var verticalOffset = typeof(verticalOffset) != 'undefined' ? verticalOffset : 0;\r\n var element = $('body');\r\n var offset = element.offset();\r\n var offsetTop = offset.top;\r\n\r\n $('html, body').animate({\r\n scrollTop: offsetTop\r\n }, 500, 'linear');\r\n}\r\n\r\n// Minimize header and make it stick to the top\r\nfunction minimizedHeaderHandler() {\r\n checkScrolledTop();\r\n\r\n $(window).on(\"scroll\", function() {\r\n checkScrolledTop();\r\n });\r\n}\r\n\r\n// Sticky header on scroll back to top\r\nvar iScrollPos = 0;\r\nvar threashHold = 0;\r\nif($('#header-top').find('#homepage-hero').length > 0) {\r\n threashHold = $('#header-top').find('#homepage-hero').find('.hero-slide').find('img')[0].clientHeight;\r\n}\r\nelse {\r\n threashHold = $('#main').offset().top;\r\n}\r\n\r\nfunction checkScrolledTop(){\r\n var iCurScrollPos = $(window).scrollTop();\r\n var $stickyHeader = $('#minimized-header-container');\r\n\r\n if (iCurScrollPos > iScrollPos && !($('.nav-open').length === 1)) { //scroll down\r\n if(iCurScrollPos > threashHold){ //reached position to slide header up.\r\n if($(window).scrollTop() > 115 && !($('#wrapper').hasClass('sticky-header'))){\r\n $('#wrapper').addClass('sticky-header');\r\n }\r\n }\r\n }\r\n\r\n if(iCurScrollPos < iScrollPos){ //scroll up\r\n if($('#header-top').length === 1 && $(window).innerWidth() >= 768){\r\n if(iCurScrollPos > threashHold){\r\n if($stickyHeader.css('position')!='fixed'){\r\n $stickyHeader.addClass('fix-menu');\r\n }\r\n }\r\n\r\n if(iCurScrollPos < threashHold){\r\n if($stickyHeader.css('position')!='absolute'){\r\n $stickyHeader.removeClass('fix-menu');\r\n }\r\n }\r\n }\r\n else {\r\n if ($('#header-top').length > 0) {\r\n var offsetTop = $('#header-top').offset().top;\r\n if ($(window).scrollTop() > offsetTop) {\r\n $('.header-top-outer').css('position', 'fixed');\r\n $('.user-bag').css('position', 'fixed');\r\n if ($('.header-promotion').length) {\r\n $stickyHeader.removeClass('has-header-promotion');\r\n }\r\n }\r\n else {\r\n $('.header-top-outer').css('position', 'relative');\r\n $('.user-bag').css('position', 'absolute');\r\n if ($('.header-promotion').length) {\r\n $stickyHeader.addClass('has-header-promotion');\r\n }\r\n }\r\n }\r\n }\r\n if($('#wrapper').hasClass('sticky-header')){\r\n $('#wrapper').removeClass('sticky-header');\r\n }\r\n }\r\n iScrollPos = iCurScrollPos;\r\n}\r\n\r\nfunction responsiveMegaMenu() {\r\n var $dropdowns = $('.level-1 li.has-sub-menu');\r\n\r\n $dropdowns.on('keydown', function(e) {\r\n var $this = $(this);\r\n\r\n if ( e.keyCode === 13 ) {\r\n\r\n if (!$this.hasClass('hover')) {\r\n e.preventDefault();\r\n\r\n $dropdowns.removeClass('hover');\r\n $this.addClass('hover');\r\n\r\n }\r\n }\r\n\r\n if ( e.keyCode === 32 ) {\r\n e.preventDefault();\r\n $dropdowns.removeClass('hover');\r\n }\r\n });\r\n\r\n\r\n $dropdowns.on(\"mouseenter\", function() {\r\n var $this = $(this);\r\n if ($this.prop('hoverTimeout')) {\r\n $this.prop('hoverTimeout', clearTimeout($this.prop('hoverTimeout')));\r\n }\r\n $this.prop('hoverIntent', setTimeout(function () {\r\n $this.addClass('hover');\r\n }, 200));\r\n }).on(\"mouseleave\", function() {\r\n var $this = $(this);\r\n if ($this.prop('hoverIntent')) {\r\n $this.prop('hoverIntent', clearTimeout($this.prop('hoverIntent')));\r\n }\r\n $this.prop('hoverTimeout', setTimeout(function () {\r\n $this.removeClass('hover');\r\n }, 200));\r\n });\r\n\r\n if ('ontouchstart' in document.documentElement && window.innerWidth >= 640 ) {\r\n\r\n $dropdowns.each(function () {\r\n var $this = $(this);\r\n\r\n this.addEventListener('touchstart', function (e) {\r\n if (e.touches.length === 1) {\r\n e.stopPropagation();\r\n\r\n if (!$this.hasClass('hover')) {\r\n if (e.target === this || e.target.parentNode === this) {\r\n e.preventDefault();\r\n }\r\n\r\n $dropdowns.removeClass('hover');\r\n $this.addClass('hover');\r\n\r\n document.addEventListener('touchstart', function closeDropdown(e) {\r\n e.stopPropagation();\r\n\r\n $this.removeClass('hover');\r\n document.removeEventListener('touchstart', closeDropdown);\r\n });\r\n }\r\n }\r\n }, false);\r\n });\r\n }\r\n\r\n $('a.no-link, span.category-header').on('click', function(e){\r\n if (window.innerWidth < 640) {\r\n $(this).next($('.menu-item-toggle')).trigger('click');\r\n } else {\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n var ogMenuHeight = $('ul.level-1').height();\r\n // main menu toggle\r\n $('.menu-toggle').on('click', function() {\r\n $('#wrapper').toggleClass('menu-active');\r\n ogMenuHeight = $('ul.level-1').height();\r\n });\r\n\r\n $('.main-nav li .menu-item-toggle').on('click', function(e) {\r\n e.preventDefault();\r\n\r\n var $parentLi = $(e.target).closest('li');\r\n var menuHeight = $parentLi.find('.sub-level-wrapper').height();\r\n\r\n if (ogMenuHeight <= menuHeight) {\r\n $('ul.level-1').css('height', menuHeight);\r\n }\r\n\r\n $parentLi.siblings('li').removeClass('active').find('.menu-item-toggle');\r\n $parentLi.toggleClass('active');\r\n\r\n $(e.target).toggleClass('active');\r\n });\r\n\r\n $('.mobile-menu-back').on('click', function() {\r\n\r\n var $closestActiveMenu = $(this).closest('.active')\r\n var prevMenuHeight = $closestActiveMenu.parent().parent().height();\r\n\r\n $closestActiveMenu.removeClass('active');\r\n\r\n if (ogMenuHeight <= prevMenuHeight) {\r\n $('ul.level-1').css('height', prevMenuHeight);\r\n }\r\n\r\n });\r\n\r\n // my function\r\n\r\n /**\r\n * onclick bar icon on mobile, show the navigation overlay\r\n */\r\n $('#nav-icon').click(function(){\r\n if(!($(this).hasClass('open') && $('#navigation').hasClass('active'))){\r\n removeScreenOverlay.init();\r\n $('html').addClass('nav-open');\r\n }\r\n else {\r\n $('html').removeClass('nav-open');\r\n }\r\n $(this).toggleClass('open');\r\n $('#navigation').toggleClass('active');\r\n });\r\n\r\n /**\r\n * show search popup\r\n */\r\n $('#show-search').on('click', function(){\r\n $('#search').addClass('active');\r\n $('.search-language').css('z-index', 20);\r\n });\r\n\r\n $('#close-search').on('click', function(){\r\n $('#search').removeClass('active');\r\n $('.search-language').css('z-index', 50);\r\n });\r\n \r\n /**\r\n * onclick user icon to show the Sign in popup\r\n */\r\n $('#account-info').on('click', function(){\r\n removeScreenOverlay.init();\r\n $('.bubble').toggleClass('active');\r\n if (window.innerWidth < 640) {\r\n $('html').addClass('nav-open');\r\n }\r\n });\r\n\r\n $('#close-login').on('click', function(){\r\n $('.bubble').toggleClass('active');\r\n if (window.innerWidth < 640) {\r\n $('html').removeClass('nav-open');\r\n }\r\n });\r\n\r\n $('.search-page').find('input[name=\"q\"]').attr('placeholder', Resources.SEARCHDIFF);\r\n\r\n /**\r\n * menu navigation: hover level 2 will show items of level 3 corresponding\r\n */\r\n $('.language-dropdown').find('li').each(function(){\r\n $(this).click(function(){\r\n $('.language-dropdown').find('li').removeClass('active');\r\n $(this).addClass('active');\r\n });\r\n });\r\n\r\n $('.icon-link').click(function(){\r\n $(this).parent().toggleClass('active');\r\n $(this).toggleClass('active');\r\n $(this).siblings('.icon-link').toggleClass('active');\r\n });\r\n\r\nif ($('.header-promotion').length) {\r\n $('#minimized-header-container').addClass('has-header-promotion');\r\n}\r\n\r\n /**\r\n * animation fadeup homepage\r\n */\r\n if ($('.pt_storefront').length || window.innerWidth > 767) {\r\n animation.init({\r\n offset: 0,\r\n duration: 500,\r\n delay: 0,\r\n once: true\r\n });\r\n }\r\n\r\n /**\r\n * close toast notification\r\n */\r\n $('.toast__close').click(function(e){\r\n e.preventDefault();\r\n var parent = $(this).parent('.toast');\r\n parent.fadeOut(\"slow\", function() {\r\n $(this).remove();\r\n });\r\n });\r\n\r\n /* --- handle gift message at shipping page --- */\r\n\r\n if($('.b-giftmessage').length > 0) {\r\n var form = '.checkout-shipping',\r\n selector = 'input[name=dwfrm_singleshipping_shippingAddress_isGift]',\r\n $giftmess = $('.b-giftwrapmessage'),\r\n $giftmessValue = $('input[name=dwfrm_singleshipping_shippingAddress_giftMessage]'),\r\n chk_value;\r\n chk_value = $(selector + ':checked', form).val();\r\n check_giftmess(chk_value);\r\n }\r\n\r\n $(selector, form).on('change', function() {\r\n chk_value = this.value;\r\n check_giftmess(chk_value);\r\n });\r\n\r\n function check_giftmess(value) {\r\n if(value === 'true') {\r\n $giftmess.show(300);\r\n $giftmessValue.addClass(\"required\");\r\n }\r\n else {\r\n $giftmess.hide(300);\r\n $giftmessValue.removeClass(\"required\");\r\n }\r\n }\r\n\r\n /* --- handle radio button (CREDIT CARD) for shipping page --- */\r\n $('#creditcard-mask').on('click', function() {\r\n $('#is-CREDIT_CARD').prop('checked', true);\r\n $('.cvs-payment-methods-item').find('input[name=dwfrm_convenience_convenienceStore]').prop('checked', false);\r\n $('select[name*=\"dwfrm_billing_paymentMethods_creditCard\"],input[name*=\"dwfrm_billing_paymentMethods_creditCard\"]').removeClass(\"ignore\");\r\n });\r\n\r\n $('.cate-level-2').find('li').each(function() {\r\n if($(this).hasClass('isBetween')) {\r\n $(this).parent('.cate-level-2').addClass('hasContentAssets');\r\n }\r\n });\r\n\r\n /**\r\n * Preload flyout on hover to prevent flicker on reveal\r\n */\r\n if ($(window).width() >= 768) {\r\n var $mainNav = $('.main-nav');\r\n $mainNav.one('mouseenter', function () {\r\n $mainNav.find('.lazyload').addClass('lazypreload');\r\n });\r\n }\r\n\r\n\r\n $('.user-account').on('click', function(e) {\r\n e.preventDefault();\r\n\r\n $(this).parent('.user-info').toggleClass('active');\r\n });\r\n\r\n $('button#cancelOrder').click(function() {\r\n $(this).prop('disabled', true).addClass('loading');\r\n $('button[name$=\"_orders_cancel_confirm\"]').trigger('click');\r\n return true;\r\n });\r\n}\r\n\r\nfunction searchMenuEvent(){\r\n // Search for mobile view\r\n $('.quick-access-menu [title=\"Search\"]').on('click', function(e) {\r\n e.preventDefault();\r\n\r\n $('.header-search').slideToggle(200);\r\n });\r\n\r\n // show the search button when the user switches to desktop view\r\n $(window).on(\"resize\", function(e){\r\n if(window.innerWidth > 639 ){\r\n $('.header-search').show();\r\n }\r\n });\r\n}\r\n\r\n//add class for scrollbar on miniline summary\r\nfunction addSummaryScrollbar () {\r\n var itemCount = $('.pt_checkout .checkout-mini-cart .accordion-content .mini-cart-product').length;\r\n\r\n if (itemCount > 4) {\r\n $('.checkout-mini-cart .accordion-content').addClass('scroll-items');\r\n }\r\n}\r\n\r\nfunction playVideoHandler() {\r\n var MAIN_VIDEO_SELECTOR = \".main-video\";\r\n var CAROUSEL_VIDEO_SELECTOR = \".modal-video\";\r\n $(document)\r\n // main video (inline)\r\n .on(\"click\", MAIN_VIDEO_SELECTOR, function () {\r\n var $this = $(this);\r\n\r\n var $inlineEle = $this.parent(\"div\"),\r\n videoId = $this.data(\"video-id\");\r\n\r\n video.playInline($inlineEle, videoId);\r\n })\r\n\r\n // carousel videos (launched in modal)\r\n .on(\"click\", CAROUSEL_VIDEO_SELECTOR, function () {\r\n var videoId = $(this).data(\"video-id\");\r\n\r\n video.playInModal(videoId);\r\n });\r\n}\r\n\r\n\r\n\r\nfunction resetFooterError () {\r\n\r\n if ($('.store-locator-form .field-button-container div').hasClass('error')) {\r\n $('.store-locator-form .field-button-container div').removeClass('error');\r\n $('.store-locator-form .field-button-container .error-message').remove();\r\n }\r\n}\r\n\r\nfunction buttonClickCategoryLandingPage() {\r\n // getting the hidden div, which is the placeholder for the next page\r\n var targetEl = $(this);\r\n var searchResultItems, searchResultBlock, paginationButtons, gridUrl;\r\n var loadingPlaceHolder = targetEl.closest('.pagination-buttons').find('.infinite-scroll-placeholder');\r\n paginationButtons = targetEl.closest('.pagination-buttons');\r\n gridUrl = targetEl.attr('data-grid-url');\r\n searchResultItems = targetEl.closest('#search-result-items');\r\n searchResultBlock = targetEl.closest('.search-representative-result-items');\r\n if (targetEl.closest('.listcontent').length > 0) {\r\n searchResultItems = targetEl.closest('.folder-content-list');\r\n searchResultBlock = targetEl.closest('.search-result-content-items');\r\n }\r\n \r\n if (loadingPlaceHolder.length === 1) {\r\n loadingPlaceHolder.attr('data-loading-state', 'loading');\r\n loadingPlaceHolder.addClass('infinite-scroll-loading');\r\n\r\n // named wrapper function, which can either be called, if cache is hit, or ajax repsonse is received\r\n var fillEndlessScrollChunk = function (html) {\r\n loadingPlaceHolder.removeClass('infinite-scroll-loading');\r\n loadingPlaceHolder.attr('data-loading-state', 'loaded');\r\n \r\n if (targetEl.attr('id') == 'view-more-landing') {\r\n searchResultBlock.append(html);\r\n searchResultBlock.find(\".tiles-container .column\").appendTo(searchResultItems);\r\n\r\n } else if (targetEl.attr('id') == 'view-all-landing'){\r\n searchResultBlock.html(html);\r\n\r\n } else if (targetEl.attr('id') == 'view-more-landing-search') {\r\n searchResultBlock.append(html);\r\n searchResultBlock.find(\".tutorial-detail-link\").appendTo(searchResultItems);\r\n } else if (targetEl.attr('id') == 'view-all-landing-search') {\r\n searchResultBlock.html(html);\r\n }\r\n // rebind the View More event\r\n $('.search-pagination').off('click','#view-more-landing-search').on('click','#view-more-landing-search', buttonClickCategoryLandingPage);\r\n $('.search-pagination').off('click','#view-all-landing-search').on('click','#view-all-landing-search', buttonClickCategoryLandingPage);\r\n $('.search-pagination').off('click','#view-more-landing').on('click','#view-more-landing', buttonClickCategoryLandingPage);\r\n $('.search-pagination').off('click','#view-all-landing').on('click','#view-all-landing', buttonClickCategoryLandingPage);\r\n\r\n checkLimitCharacter.init({\r\n outerElem: '.tutorial-detail-link',\r\n innerElem: '.content-description',\r\n limit: 160\r\n });\r\n \r\n checkLimitCharacter.init({\r\n outerElem: '.tiles-container .gtmindex',\r\n innerElem: '.short-desc.limited',\r\n limit: 60\r\n });\r\n checkLimitCharacter.init({\r\n outerElem: '.wishlist-item',\r\n innerElem: '.short-desc.limited',\r\n limit: window.innerWidth > 767 ? 60 : 19\r\n });\r\n };\r\n\r\n // old condition for caching was `'sessionStorage' in window && sessionStorage[\"scroll-cache_\" + gridUrl]`\r\n // it was removed to temporarily address RAP-2649\r\n\r\n $.ajax({\r\n type: 'GET',\r\n dataType: 'html',\r\n url: gridUrl,\r\n success: function (response) {\r\n // put response into cache\r\n try {\r\n sessionStorage['scroll-cache_' + gridUrl] = response;\r\n } catch (e) {\r\n // nothing to catch in case of out of memory of session storage\r\n // it will fall back to load via ajax\r\n }\r\n // update UI\r\n paginationButtons.remove();\r\n fillEndlessScrollChunk(response);\r\n producttile.init();\r\n }\r\n });\r\n }\r\n}\r\n\r\nvar pages = {\r\n account: require('./pages/account'),\r\n login: require('./login'),\r\n cart: require('./pages/cart'),\r\n checkout: require('./pages/checkout'),\r\n singlepagecheckout: require('./pages/singlepagecheckout'),\r\n compare: require('./pages/compare'),\r\n product: require('./pages/product'),\r\n registry: require('./pages/registry'),\r\n orderconfirmation: require('./pages/order-confirm'),\r\n search: require('./pages/search'),\r\n tutorial: require('./pages/tutorial'),\r\n storefront: require('./pages/storefront'),\r\n wishlist: require('./pages/wishlist'),\r\n storelocator: require('./pages/storelocator'),\r\n checkorder: require('./pages/checkorder'),\r\n content: require('./pages/content'),\r\n promotionlanding: require('./pages/promotionlanding'),\r\n error: require('./pages/error')\r\n};\r\n\r\nvar checkLimitCharacter = require('./limitCharacter');\r\n\r\nvar app = {\r\n init: function() {\r\n\r\n $(document).foundation();\r\n\r\n if (document.cookie.length === 0) {\r\n $('
').addClass('browser-compatibility-alert').append($('

').addClass('browser-error').html(Resources.COOKIES_DISABLED)).appendTo('#browser-check');\r\n }\r\n\r\n initializeDom();\r\n initializeEvents();\r\n backToTopHandler();\r\n minimizedHeaderHandler();\r\n resetFooterError();\r\n responsiveMegaMenu();\r\n searchMenuEvent();\r\n\r\n // init specific global components\r\n analytics.init();\r\n countries.init();\r\n tooltip.init();\r\n minicart.init();\r\n validator.init();\r\n orderreplenishment.init();\r\n rating.init();\r\n slick.init();\r\n headerMenu.init();\r\n video.init();\r\n checkLimitCharacter.init({\r\n outerElem: '.tutorial-detail-link',\r\n innerElem: '.content-description',\r\n limit: 160\r\n });\r\n checkLimitCharacter.init({\r\n outerElem: '.tiles-container .gtmindex',\r\n innerElem: '.short-desc.limited',\r\n limit: 60\r\n });\r\n checkLimitCharacter.init({\r\n outerElem: '.wishlist-item',\r\n innerElem: '.short-desc.limited',\r\n limit: window.innerWidth > 767 ? 60 : 19\r\n });\r\n //checkoutLogin.init();\r\n\r\n if (SitePreferences.IS_MARKET_MAPPING_ENABLED) {\r\n footerSelector.languageSelector();\r\n footerSelector.countrySelector();\r\n }\r\n newsletter.newsletterHeader();\r\n newsletter.isNewsletterEnabled();\r\n inputEntry.entry();\r\n playVideoHandler();\r\n pdpredesign.init();\r\n\r\n if (SitePreferences.AFTERPAY_ENABLED) {\r\n afterpay.init();\r\n }\r\n\r\n // execute page specific initializations\r\n $.extend(page, window.pageContext);\r\n\r\n var ns = page.ns;\r\n\r\n if (ns && pages[ns] && pages[ns].init) {\r\n pages[ns].init();\r\n }\r\n\r\n // Check TLS status if indicated by site preference\r\n if (SitePreferences.CHECK_TLS === true) {\r\n tls.getUserAgent();\r\n }\r\n util.autoSuggestionAddressField();\r\n $(document).trigger(EventNames.TRIGGER_CLICK_ORDER_DETAIL);\r\n }\r\n};\r\n\r\n//general extension functions\r\n(function() {\r\n String.format = function() {\r\n var s = arguments[0];\r\n var i, len = arguments.length - 1;\r\n\r\n for (i = 0; i < len; i++) {\r\n var reg = new RegExp('\\\\{' + i + '\\\\}', 'gm');\r\n\r\n s = s.replace(reg, arguments[i + 1]);\r\n }\r\n\r\n return s;\r\n };\r\n})();\r\n\r\n// initialize app\r\n$(function() {\r\n app.init();\r\n});\r\n$(window).on(\"load\", function(){\r\n util.renderGoogleInvisibleReCaptchaFunc();\r\n});\r\n// expose global app obj for 3rd party integrations\r\nwindow.app = {\r\n quickView: quickview,\r\n minicart: minicart,\r\n user: window.User,\r\n SCemailUrl: window.Urls.SCemailUrl,\r\n Product: {},\r\n tagmanager: analytics.tagmanager,\r\n gtmInternalPromotion: analytics.gtmInternalPromotion\r\n};\r\n\r\n// expose global saveURL to support legacy Composed integration\r\nwindow.saveURL = window.Urls.saveConsultationURL;\r\n// summary scroll bar global scope\r\nwindow.addSummaryScrollbar = addSummaryScrollbar;\r\nwindow.scrollToTop = scrollToTop;\n},{\"./afterpay\":4,\"./analytics\":6,\"./aos\":7,\"./captcha\":10,\"./constants/EventNames\":12,\"./cookieprivacy\":13,\"./countries\":14,\"./dialog\":16,\"./drawerControl\":17,\"./footer-selector\":18,\"./header-menu\":22,\"./input-entry\":23,\"./jquery-ext\":24,\"./limitCharacter\":25,\"./login\":26,\"./minicart\":27,\"./newsletter\":29,\"./order-replenishment\":30,\"./page\":31,\"./pages/account\":32,\"./pages/cart\":33,\"./pages/checkorder\":34,\"./pages/checkout\":39,\"./pages/compare\":43,\"./pages/content\":44,\"./pages/error\":46,\"./pages/order-confirm\":47,\"./pages/product\":52,\"./pages/promotionlanding\":57,\"./pages/registry\":58,\"./pages/search\":59,\"./pages/singlepagecheckout\":64,\"./pages/storefront\":68,\"./pages/storelocator\":69,\"./pages/tutorial\":70,\"./pages/wishlist\":71,\"./pdpredesign\":72,\"./product-tile\":74,\"./quickview\":77,\"./rating\":78,\"./searchsuggest\":80,\"./slick\":81,\"./tls\":85,\"./tooltip\":86,\"./util\":87,\"./validator\":88,\"./video\":89}],9:[function(require,module,exports){\n'use strict';\r\n\r\nvar dialog = require('./dialog'),\r\n page = require('./page'),\r\n util = require('./util'),\r\n modal = require('./modal').global;\r\n\r\nvar selectedList = [];\r\nvar maxItems = 1;\r\nvar bliUUID = '';\r\n\r\n/**\r\n * @private\r\n * @function\r\n * description Gets a list of bonus products related to a promoted product\r\n */\r\nfunction getBonusProducts() {\r\n var bonusproducts = [];\r\n\r\n var i, len;\r\n for (i = 0, len = selectedList.length; i < len; i++) {\r\n var p = {\r\n pid: selectedList[i].pid,\r\n qty: selectedList[i].qty,\r\n options: {}\r\n };\r\n var a, alen, bp = selectedList[i];\r\n if (bp.options) {\r\n for (a = 0, alen = bp.options.length; a < alen; a++) {\r\n var opt = bp.options[a];\r\n p.options = {optionName:opt.name, optionValue:opt.value};\r\n }\r\n }\r\n bonusproducts.push({product:p});\r\n }\r\n return {bonusproducts: bonusproducts};\r\n}\r\n\r\nvar selectedItemTemplate = function (data) {\r\n var attributes = '';\r\n for (var attrID in data.attributes) {\r\n var attr = data.attributes[attrID];\r\n attributes += '

  • \\n';\r\n attributes += '' + attr.displayName + ': ';\r\n attributes += '' + attr.displayValue + '\\n';\r\n attributes += '
  • ';\r\n }\r\n attributes += '
  • \\n';\r\n attributes += 'Qty: ';\r\n attributes += '' + data.qty + '';\r\n return [\r\n '
  • ',\r\n '',\r\n '
    ' + data.name + '
    ',\r\n '
      ',\r\n attributes,\r\n '
        ',\r\n '
      • '\r\n ].join('\\n');\r\n};\r\n\r\n// hide swatches that are not selected or not part of a Product Variation Group\r\nvar hideSwatches = function () {\r\n $('.bonus-product-item:not([data-producttype=\"master\"]) .swatches li').not('.selected').not('.variation-group-value').hide();\r\n // prevent unselecting the selected variant\r\n $('.bonus-product-item .swatches .selected').on('click', function () {\r\n return false;\r\n });\r\n};\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Updates the summary page with the selected bonus product\r\n */\r\nfunction updateSummary() {\r\n var $bonusProductList = $('#bonus-product-list');\r\n if (!selectedList.length) {\r\n $bonusProductList.find('li.selected-bonus-item').remove();\r\n } else {\r\n var ulList = $bonusProductList.find('ul.selected-bonus-items').first();\r\n var i, len;\r\n for (i = 0, len = selectedList.length; i < len; i++) {\r\n var item = selectedList[i];\r\n var li = selectedItemTemplate(item);\r\n $(li).appendTo(ulList);\r\n }\r\n }\r\n\r\n // get remaining item count\r\n var remain = maxItems - selectedList.length;\r\n $bonusProductList.find('.bonus-items-available').text(remain);\r\n if (remain <= 0) {\r\n $bonusProductList.find('.select-bonus-item').attr('disabled', 'disabled');\r\n } else {\r\n $bonusProductList.find('.select-bonus-item').removeAttr('disabled');\r\n }\r\n}\r\n\r\nfunction initializeGrid () {\r\n var $bonusProduct = $('#bonus-product-dialog'),\r\n $bonusProductList = $('#bonus-product-list'),\r\n bliData = $bonusProductList.data('line-item-detail');\r\n maxItems = bliData.maxItems;\r\n bliUUID = bliData.uuid;\r\n\r\n if (bliData.itemCount >= maxItems) {\r\n $bonusProductList.find('.select-bonus-item').attr('disabled', 'disabled');\r\n }\r\n\r\n var cartItems = $bonusProductList.find('.selected-bonus-item');\r\n cartItems.each(function () {\r\n var ci = $(this);\r\n var product = {\r\n uuid: ci.data('uuid'),\r\n pid: ci.data('pid'),\r\n qty: ci.find('.item-qty').text(),\r\n name: ci.find('.item-name').html(),\r\n attributes: {}\r\n };\r\n var attributes = ci.find('ul.item-attributes li');\r\n attributes.each(function () {\r\n var li = $(this);\r\n product.attributes[li.data('attributeId')] = {\r\n displayName:li.children('.display-name').html(),\r\n displayValue:li.children('.display-value').html()\r\n };\r\n });\r\n selectedList.push(product);\r\n });\r\n\r\n $bonusProductList.on('click', '.bonus-product-item a[href].swatchanchor', function (e) {\r\n e.preventDefault();\r\n var url = this.href,\r\n $this = $(this);\r\n url = util.appendParamsToUrl(url, {\r\n 'source': 'bonus',\r\n 'format': 'ajax'\r\n });\r\n $.ajax({\r\n url: url,\r\n success: function (response) {\r\n $this.closest('.bonus-product-item').empty().html(response);\r\n hideSwatches();\r\n }\r\n });\r\n })\r\n .on('change', '.input-text', function () {\r\n $bonusProductList.find('.select-bonus-item').removeAttr('disabled');\r\n $(this).closest('.bonus-product-form').find('.quantity-error').text('');\r\n })\r\n .on('click', '.select-bonus-item', function (e) {\r\n e.preventDefault();\r\n if (selectedList.length >= maxItems) {\r\n $bonusProductList.find('.select-bonus-item').attr('disabled', 'disabled');\r\n $bonusProductList.find('.bonus-items-available').text('0');\r\n return;\r\n }\r\n\r\n var form = $(this).closest('.bonus-product-form'),\r\n detail = $(this).closest('.product-detail'),\r\n uuid = form.find('input[name=\"productUUID\"]').val(),\r\n qtyVal = form.find('input[name=\"Quantity\"]').val(),\r\n qty = (isNaN(qtyVal)) ? 1 : (+qtyVal);\r\n\r\n if (qty > maxItems) {\r\n $bonusProductList.find('.select-bonus-item').attr('disabled', 'disabled');\r\n form.find('.quantity-error').text(Resources.BONUS_PRODUCT_TOOMANY);\r\n return;\r\n }\r\n\r\n var product = {\r\n uuid: uuid,\r\n pid: form.find('input[name=\"pid\"]').val(),\r\n qty: qty,\r\n name: detail.find('.product-name').text(),\r\n attributes: detail.find('.product-variations').data('attributes'),\r\n options: []\r\n };\r\n\r\n var optionSelects = form.find('.product-option');\r\n\r\n optionSelects.each(function () {\r\n product.options.push({\r\n name: this.name,\r\n value: $(this).val(),\r\n display: $(this).children(':selected').first().html()\r\n });\r\n });\r\n selectedList.push(product);\r\n updateSummary();\r\n })\r\n .on('click', '.remove-link', function (e) {\r\n e.preventDefault();\r\n var container = $(this).closest('.selected-bonus-item');\r\n if (!container.data('uuid')) { return; }\r\n\r\n var uuid = container.data('uuid');\r\n var i, len = selectedList.length;\r\n for (i = 0; i < len; i++) {\r\n if (selectedList[i].uuid === uuid) {\r\n selectedList.splice(i, 1);\r\n break;\r\n }\r\n }\r\n updateSummary();\r\n })\r\n .on('click', '.add-to-cart-bonus', function (e) {\r\n e.preventDefault();\r\n var url = util.appendParamsToUrl(Urls.addBonusProduct, {bonusDiscountLineItemUUID: bliUUID});\r\n var bonusProducts = getBonusProducts();\r\n if (bonusProducts.bonusproducts[0].product.qty > maxItems) {\r\n bonusProducts.bonusproducts[0].product.qty = maxItems;\r\n }\r\n // make the server call\r\n $.ajax({\r\n type: 'POST',\r\n dataType: 'json',\r\n cache: false,\r\n contentType: 'application/json',\r\n url: url,\r\n data: JSON.stringify(bonusProducts)\r\n })\r\n .done(function () {\r\n // success\r\n page.refresh();\r\n })\r\n .fail(function (xhr, textStatus) {\r\n // failed\r\n if (textStatus === 'parsererror') {\r\n window.alert(Resources.BAD_RESPONSE);\r\n } else {\r\n window.alert(Resources.SERVER_CONNECTION_ERROR);\r\n }\r\n })\r\n .always(function () {\r\n $bonusProduct.dialog('close');\r\n });\r\n })\r\n .on('click', '#more-bonus-products', function (e) {\r\n e.preventDefault();\r\n var uuid = $('#bonus-product-list').data().lineItemDetail.uuid;\r\n\r\n //get the next page of choice of bonus products\r\n var lineItemDetail = JSON.parse($('#bonus-product-list').attr('data-line-item-detail'));\r\n lineItemDetail.pageStart = lineItemDetail.pageStart + lineItemDetail.pageSize;\r\n $('#bonus-product-list').attr('data-line-item-detail', JSON.stringify(lineItemDetail));\r\n\r\n var url = util.appendParamsToUrl(Urls.getBonusProducts, {\r\n bonusDiscountLineItemUUID: uuid,\r\n format: 'ajax',\r\n lazyLoad: 'true',\r\n pageStart: lineItemDetail.pageStart,\r\n pageSize: $('#bonus-product-list').data().lineItemDetail.pageSize,\r\n bonusProductsTotal: $('#bonus-product-list').data().lineItemDetail.bpTotal\r\n });\r\n\r\n $.ajax({\r\n type: 'GET',\r\n cache: false,\r\n contentType: 'application/json',\r\n url: url\r\n })\r\n .done(function (data) {\r\n //add the new page to DOM and remove 'More' link if it is the last page of results\r\n $('#more-bonus-products').before(data);\r\n if ((lineItemDetail.pageStart + lineItemDetail.pageSize) >= $('#bonus-product-list').data().lineItemDetail.bpTotal) {\r\n $('#more-bonus-products').remove();\r\n }\r\n })\r\n .fail(function (xhr, textStatus) {\r\n if (textStatus === 'parsererror') {\r\n window.alert(Resources.BAD_RESPONSE);\r\n } else {\r\n window.alert(Resources.SERVER_CONNECTION_ERROR);\r\n }\r\n });\r\n });\r\n}\r\n\r\nvar bonusProductsView = {\r\n /**\r\n * @function\r\n * @description Open the list of bonus products selection dialog\r\n */\r\n show: function (url) {\r\n var $bonusProduct = $('#bonus-product-dialog');\r\n // create the dialog\r\n dialog.open({\r\n target: $bonusProduct,\r\n url: url,\r\n options: {\r\n width: 795,\r\n title: Resources.BONUS_PRODUCTS\r\n },\r\n callback: function () {\r\n initializeGrid();\r\n hideSwatches();\r\n }\r\n });\r\n },\r\n /**\r\n * @function\r\n * @description Open bonus product promo prompt dialog\r\n */\r\n loadBonusOption: function () {\r\n var self = this,\r\n bonusDiscountContainer = document.querySelector('.bonus-discount-container');\r\n if (!bonusDiscountContainer) { return; }\r\n\r\n // get the html from minicart, then trash it\r\n var bonusDiscountContainerHtml = bonusDiscountContainer.outerHTML;\r\n bonusDiscountContainer.parentNode.removeChild(bonusDiscountContainer);\r\n\r\n dialog.open({\r\n html: bonusDiscountContainerHtml,\r\n options: {\r\n width: 'auto',\r\n title: Resources.BONUS_PRODUCT,\r\n dialogClass: 'bonus-eligibility-modal',\r\n buttons: [{\r\n text: Resources.SELECT_BONUS_PRODUCTS,\r\n click: function () {\r\n var uuid = $('.bonus-product-promo').data('lineitemid'),\r\n url = util.appendParamsToUrl(Urls.showBonusProducts, {\r\n bonusDiscountLineItemUUID: uuid,\r\n source: 'bonus',\r\n format: 'ajax',\r\n lazyLoad: 'false',\r\n pageStart: 0,\r\n pageSize: 0,\r\n bonusProductsTotal: -1\r\n });\r\n $(this).dialog('close');\r\n //self.show(url);\r\n modal.addCustomClass('bonus-item-modal');\r\n modal.renderByUrl(url);\r\n }\r\n }, {\r\n text: Resources.NO_THANKS,\r\n click: function () {\r\n $(this).dialog('close');\r\n }\r\n }]\r\n },\r\n callback: function () {\r\n // show hide promo details\r\n $('.show-promo-details').on('click', function () {\r\n $('.promo-details').toggleClass('visible');\r\n });\r\n }\r\n });\r\n },\r\n\r\n hasBonusOptions: function () {\r\n \treturn ($(\".bonus-discount-container\").length > 0);\r\n }\r\n};\r\n\r\nmodule.exports = bonusProductsView;\r\n\n},{\"./dialog\":16,\"./modal\":28,\"./page\":31,\"./util\":87}],10:[function(require,module,exports){\n'use strict';\r\n\r\nvar dialog = require('./dialog');\r\nvar util = require('./util');\r\nvar SessionAttributes = window.SessionAttributes;\r\n\r\n/**\r\n * @function captcha Used to display/control the scrim containing the simulated captcha code\r\n **/\r\nmodule.exports = function () {\r\n /**\r\n * if the session.privacy.ratelimited element is present then show the notification\r\n * NOTE: You will probably want to replace this with a call to an actual CAPTCHA system to replace the simple one here\r\n */\r\n if (SessionAttributes.SHOW_CAPTCHA) {\r\n dialog.open({\r\n html: '

        ' + Resources.ARE_YOU_HUMAN + '

        ',\r\n options: {\r\n closeOnEscape: false,\r\n dialogClass: 'no-close',\r\n buttons: [{\r\n text: Resources.OK,\r\n click: function () {\r\n var url = util.appendParamsToUrl(Urls.rateLimiterReset, {format: 'ajax'});\r\n $.ajax({\r\n url: url\r\n });\r\n $(this).dialog('close');\r\n }\r\n }]\r\n }\r\n });\r\n }\r\n};\r\n\n},{\"./dialog\":16,\"./util\":87}],11:[function(require,module,exports){\n'use strict';\r\n\r\nvar page = require('./page'),\r\n util = require('./util'),\r\n TPromise = require('promise');\r\n\r\nvar _currentCategory = '',\r\n MAX_ACTIVE = 6;\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Verifies the number of elements in the compare container and updates it with sequential classes for ui targeting\r\n */\r\nfunction refreshContainer() {\r\n var $compareContainer = $('.compare-items');\r\n var $compareItems = $compareContainer.find('.compare-item');\r\n var numActive = $compareItems.filter('.active').length;\r\n\r\n if (numActive < 2) {\r\n $('#compare-items-button').attr('disabled', 'disabled');\r\n } else {\r\n $('#compare-items-button').removeAttr('disabled');\r\n }\r\n\r\n $compareContainer.toggle(numActive > 0);\r\n}\r\n/**\r\n * @private\r\n * @function\r\n * @description Adds an item to the compare container and refreshes it\r\n */\r\nfunction addToList(data) {\r\n // get the first compare-item not currently active\r\n var $item = $('.compare-items .compare-item').not('.active').first(),\r\n $productTile = $('#' + data.uuid);\r\n\r\n if ($item.length === 0) {\r\n if ($productTile.length > 0) {\r\n $productTile.find('.compare-check')[0].checked = false;\r\n }\r\n window.alert(Resources.COMPARE_ADD_FAIL);\r\n return;\r\n }\r\n\r\n // if already added somehow, return\r\n if ($('[data-uuid=\"' + data.uuid + '\"]').length > 0) {\r\n return;\r\n }\r\n // set as active item\r\n $item.addClass('active')\r\n .attr('data-uuid', data.uuid)\r\n .attr('data-itemid', data.itemid)\r\n .data('uuid', data.uuid)\r\n .data('itemid', data.itemid)\r\n .append($(data.img).clone().addClass('compare-item-image'));\r\n}\r\n/**\r\n * @private\r\n * @function\r\n * description Removes an item from the compare container and refreshes it\r\n */\r\nfunction removeFromList($item) {\r\n if ($item.length === 0) { return; }\r\n // remove class, data and id from item\r\n $item.removeClass('active')\r\n .removeAttr('data-uuid')\r\n .removeAttr('data-itemid')\r\n .data('uuid', '')\r\n .data('itemid', '')\r\n // remove the image\r\n .find('.compare-item-image').remove();\r\n}\r\n\r\nfunction addProductAjax(args) {\r\n var promise = new TPromise(function (resolve, reject) {\r\n $.ajax({\r\n url: Urls.compareAdd,\r\n data: {\r\n pid: args.itemid,\r\n category: _currentCategory\r\n },\r\n dataType: 'json'\r\n }).done(function (response) {\r\n if (!response || !response.success) {\r\n reject(new Error(Resources.COMPARE_ADD_FAIL));\r\n } else {\r\n resolve(response);\r\n }\r\n }).fail(function (jqxhr, status, err) {\r\n reject(new Error(err));\r\n });\r\n });\r\n return promise;\r\n}\r\n\r\nfunction removeProductAjax(args) {\r\n var promise = new TPromise(function (resolve, reject) {\r\n $.ajax({\r\n url: Urls.compareRemove,\r\n data: {\r\n pid: args.itemid,\r\n category: _currentCategory\r\n },\r\n dataType: 'json'\r\n }).done(function (response) {\r\n if (!response || !response.success) {\r\n reject(new Error(Resources.COMPARE_REMOVE_FAIL));\r\n } else {\r\n resolve(response);\r\n }\r\n }).fail(function (jqxhr, status, err) {\r\n reject(new Error(err));\r\n });\r\n });\r\n return promise;\r\n}\r\n\r\nfunction shiftImages() {\r\n return new TPromise(function (resolve) {\r\n var $items = $('.compare-items .compare-item');\r\n $items.each(function (i, item) {\r\n var $item = $(item);\r\n // last item\r\n if (i === $items.length - 1) {\r\n return removeFromList($item);\r\n }\r\n var $next = $items.eq(i + 1);\r\n if ($next.hasClass('active')) {\r\n // remove its own image\r\n $next.find('.compare-item-image').detach().appendTo($item);\r\n $item.addClass('active')\r\n .attr('data-uuid', $next.data('uuid'))\r\n .attr('data-itemid', $next.data('itemid'))\r\n .data('uuid', $next.data('uuid'))\r\n .data('itemid', $next.data('itemid'));\r\n }\r\n });\r\n resolve();\r\n });\r\n}\r\n\r\n/**\r\n * @function\r\n * @description Adds product to the compare table\r\n */\r\nfunction addProduct(args) {\r\n var promise;\r\n var $items = $('.compare-items .compare-item');\r\n var $cb = $(args.cb);\r\n var numActive = $items.filter('.active').length;\r\n if (numActive === MAX_ACTIVE) {\r\n if (!window.confirm(Resources.COMPARE_CONFIRMATION)) {\r\n $cb[0].checked = false;\r\n return;\r\n }\r\n\r\n // remove product using id\r\n var $firstItem = $items.first();\r\n promise = removeItem($firstItem).then(function () {\r\n return shiftImages();\r\n });\r\n } else {\r\n promise = TPromise.resolve(0);\r\n }\r\n return promise.then(function () {\r\n return addProductAjax(args).then(function () {\r\n addToList(args);\r\n if ($cb && $cb.length > 0) { $cb[0].checked = true; }\r\n refreshContainer();\r\n });\r\n }).then(null, function () {\r\n if ($cb && $cb.length > 0) { $cb[0].checked = false; }\r\n });\r\n}\r\n\r\n/**\r\n * @function\r\n * @description Removes product from the compare table\r\n * @param {object} args - the arguments object should have the following properties: itemid, uuid and cb (checkbox)\r\n */\r\nfunction removeProduct(args) {\r\n var $cb = args.cb ? $(args.cb) : null;\r\n return removeProductAjax(args).then(function () {\r\n var $item = $('[data-uuid=\"' + args.uuid + '\"]');\r\n removeFromList($item);\r\n if ($cb && $cb.length > 0) { $cb[0].checked = false; }\r\n refreshContainer();\r\n }, function () {\r\n if ($cb && $cb.length > 0) { $cb[0].checked = true; }\r\n });\r\n}\r\n\r\nfunction removeItem($item) {\r\n var uuid = $item.data('uuid'),\r\n $productTile = $('#' + uuid);\r\n return removeProduct({\r\n itemid: $item.data('itemid'),\r\n uuid: uuid,\r\n cb: ($productTile.length === 0) ? null : $productTile.find('.compare-check')\r\n });\r\n}\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Initializes the DOM-Object of the compare container\r\n */\r\nfunction initializeDom() {\r\n var $compareContainer = $('.compare-items');\r\n _currentCategory = $compareContainer.data('category') || '';\r\n var $active = $compareContainer.find('.compare-item').filter('.active');\r\n $active.each(function () {\r\n var $productTile = $('#' + $(this).data('uuid'));\r\n if ($productTile.length === 0) {return;}\r\n $productTile.find('.compare-check')[0].checked = true;\r\n });\r\n // set container state\r\n refreshContainer();\r\n}\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Initializes the events on the compare container\r\n */\r\nfunction initializeEvents() {\r\n // add event to buttons to remove products\r\n $('.compare-item').on('click', '.compare-item-remove', function () {\r\n removeItem($(this).closest('.compare-item'));\r\n });\r\n\r\n // Button to go to compare page\r\n $('#compare-items-button').on('click', function () {\r\n page.redirect(util.appendParamToURL(Urls.compareShow, 'category', _currentCategory));\r\n });\r\n\r\n // Button to clear all compared items\r\n // rely on refreshContainer to take care of hiding the container\r\n $('#clear-compared-items').on('click', function () {\r\n $('.compare-items .active').each(function () {\r\n removeItem($(this));\r\n });\r\n });\r\n}\r\n\r\nexports.init = function () {\r\n initializeDom();\r\n initializeEvents();\r\n};\r\n\r\nexports.addProduct = addProduct;\r\nexports.removeProduct = removeProduct;\r\n\n},{\"./page\":31,\"./util\":87,\"promise\":118}],12:[function(require,module,exports){\nmodule.exports = {\r\n VALIDATOR_CUSTOM_INITIALIZE: 'VALIDATOR_CUSTOM_INITIALIZE',\r\n TRIGGER_CLICK_ORDER_DETAIL: 'TRIGGER_CLICK_ORDER_DETAIL'\r\n}\n},{}],13:[function(require,module,exports){\n'use strict';\r\n\r\nvar dialog = require('./dialog');\r\n\r\n/**\r\n * @function cookieprivacy Used to display/control the scrim containing the cookie privacy code\r\n **/\r\nmodule.exports = function () {\r\n /**\r\n * If we have not accepted cookies AND we're not on the Privacy Policy page, then show the notification\r\n * NOTE: You will probably want to adjust the Privacy Page test to match your site's specific privacy / cookie page\r\n */\r\n if (SitePreferences.COOKIE_HINT === true && document.cookie.indexOf('dw_cookies_accepted') < 0) {\r\n // check for privacy policy page\r\n if ($('.privacy-policy').length === 0) {\r\n dialog.open({\r\n url: Urls.cookieHint,\r\n options: {\r\n closeOnEscape: false,\r\n dialogClass: 'no-close',\r\n buttons: [{\r\n text: Resources.I_AGREE,\r\n click: function () {\r\n $(this).dialog('close');\r\n enableCookies();\r\n }\r\n }]\r\n }\r\n });\r\n }\r\n } else {\r\n // Otherwise, we don't need to show the asset, just enable the cookies\r\n enableCookies();\r\n }\r\n\r\n function enableCookies() {\r\n if (document.cookie.indexOf('dw=1') < 0) {\r\n document.cookie = 'dw=1; path=/';\r\n }\r\n if (document.cookie.indexOf('dw_cookies_accepted') < 0) {\r\n document.cookie = 'dw_cookies_accepted=1; path=/';\r\n }\r\n }\r\n};\r\n\n},{\"./dialog\":16}],14:[function(require,module,exports){\n'use strict';\r\nvar util = require('./util');\r\n\r\nexports.init = function init () {\r\n $('.country-selector .current-country').on('click', function () {\r\n $('.country-selector .selector').toggleClass('active');\r\n $(this).toggleClass('selector-active');\r\n });\r\n // set currency first before reload\r\n $('.country-selector .selector .locale').on('click', function (e) {\r\n e.preventDefault();\r\n var url = this.href;\r\n var currency = this.getAttribute('data-currency');\r\n $.ajax({\r\n dataType: 'json',\r\n url: Urls.setSessionCurrency,\r\n data: {\r\n format: 'ajax',\r\n currencyMnemonic: currency\r\n }\r\n })\r\n .done(function (response) {\r\n if (!response.success) {\r\n throw new Error('Unable to set currency');\r\n }\r\n window.location.href = url;\r\n });\r\n });\r\n\r\n $(document).ready(function() {\r\n var COOKIE_LANGUAGE = 'language';\r\n var durationCookie = 30 * 24 * 60;\r\n\r\n $('.language .language-dropdown li a').on('click', function () {\r\n var selectedLanguage = $(this).data('locale');\r\n console.log(selectedLanguage);\r\n util.setCookie(COOKIE_LANGUAGE, selectedLanguage, durationCookie);\r\n });\r\n });\r\n};\r\n\n},{\"./util\":87}],15:[function(require,module,exports){\nvar $cache = {};\r\nvar util = require('./util');\r\n\r\nfunction initializeCache(params) {\r\n $cache.wrapper = $(params && params.hasOwnProperty('wrapper') ? params.wrapper : '#wrapper'),\r\n $cache.ccNumber = $cache.wrapper.find('input[name*=\"_number\"]');\r\n $cache.cvn = $cache.wrapper.find('input[name*=\"_cvn\"]');\r\n $cache.ccTypeSelect = $cache.wrapper.find('select[name$=\"_type\"]');\r\n $cache.ccImageCtnr = $cache.wrapper.find('.card-images-list-container');\r\n $cache.ccNumberRow = $cache.wrapper.find('.form-row.cc-number');\r\n $cache.defaultCCType = 'Visa';\r\n $cache.ccTypeRegex = {\r\n Amex: /^3[47][0-9]{13}$/,\r\n Diners: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,\r\n JCB: /(^3[0-9]{15}$)|(^(2131|1800)[0-9]{11}$)/,\r\n Master: /^5[1-5][0-9]{14}$/,\r\n Visa: /^4[0-9]{12}(?:[0-9]{3})?$/\r\n };\r\n}\r\n\r\nfunction initializeEvents() {\r\n $cache.ccNumber.on('keyup', function() {\r\n updateCCType();\r\n });\r\n}\r\n\r\n/**\r\n * @function\r\n * @description returns credit card type by credit card number\r\n */\r\nfunction getCCType(ccNumber) {\r\n var creditCardType = '';\r\n ccNumber = util.replaceTwoByteToOneByteNumber(ccNumber).replace(/\\s+/g, '');\r\n for (var ccType in $cache.ccTypeRegex) {\r\n var regex = $cache.ccTypeRegex[ccType];\r\n if (regex.test(ccNumber)) {\r\n creditCardType = ccType;\r\n return creditCardType;\r\n }\r\n }\r\n return creditCardType;\r\n}\r\n\r\n/**\r\n * @function\r\n * @description sets credit card type\r\n */\r\nfunction setCCType(ccType) {\r\n var length = 3;\r\n\r\n if (ccType && $cache.ccTypeSelect.find('option[value$=\"' + ccType + '\"]').length > 0) {\r\n // Set value to hidden select\r\n $cache.ccTypeSelect.val(ccType);\r\n\r\n // Show card image\r\n $cache.ccImageCtnr.find('.card-image-container').removeClass('selected');\r\n $cache.ccImageCtnr.find('.card-image-container.card-image-' + ccType).addClass('selected');\r\n\r\n // Update cvn minlength and maxlength\r\n if (ccType === 'Amex') {\r\n length = 4;\r\n } \r\n\r\n } else {\r\n $cache.ccTypeSelect.val($cache.defaultCCType);\r\n $cache.ccImageCtnr.find('.card-image-container').removeClass('selected');\r\n }\r\n\r\n $cache.cvn.attr('minlength', length).attr('maxlength', length);\r\n $cache.cvn && $cache.cvn.val($cache.cvn.val().substr(0, length));\r\n}\r\n\r\n/**\r\n * @function\r\n * @description updates credit card type field basing on credit card number fireld value\r\n */\r\nfunction updateCCType() {\r\n if ($cache.ccNumber.length === 0) {\r\n return;\r\n }\r\n var ccNumber = $cache.ccNumber.val() || '',\r\n ccType = getCCType(ccNumber);\r\n\r\n setCCType(ccType);\r\n}\r\n\r\nvar creditCardValidator = {\r\n init: function(params) {\r\n initializeCache(params);\r\n initializeEvents();\r\n\r\n if ($cache.ccImageCtnr.length > 0 && $cache.ccNumberRow.length > 0) {\r\n $cache.ccNumberRow.find('.field-wrapper').append($cache.ccImageCtnr);\r\n }\r\n\r\n $cache.wrapper.find('.form-row.required.error').find('input').on('focusout', function() {\r\n var parent = $(this).parents('.form-row');\r\n if (parent.hasClass('error')) {\r\n parent.removeClass('error');\r\n parent.find('.form-caption.error-message').removeClass('error-message').empty();\r\n }\r\n });\r\n\r\n $cache.wrapper.find('.required.error select').on('change', function() {\r\n var parent = $(this).parents('.exp-date');\r\n parent.removeClass('error');\r\n parent.find('.form-caption.error-message').removeClass('error-message').empty();\r\n });\r\n\r\n /**\r\n * re-validate expiration date of credit card\r\n */\r\n $('select[name*=\"expiration_month\"]').change(function () {\r\n $('select[name*=\"expiration_year\"]').blur();\r\n });\r\n }\r\n};\r\n\r\nmodule.exports = creditCardValidator;\r\n\n},{\"./util\":87}],16:[function(require,module,exports){\n'use strict';\r\n\r\nvar ajax = require('./ajax'),\r\n util = require('./util'),\r\n _ = require('lodash'),\r\n imagesLoaded = require('imagesloaded');\r\n\r\nvar dialog = {\r\n /**\r\n * @function\r\n * @description Appends a dialog to a given container (target)\r\n * @param {Object} params params.target can be an id selector or an jquery object\r\n */\r\n create: function (params) {\r\n var $target, id;\r\n var className = params.className ? params.className : '';\r\n\r\n if (_.isString(params.target)) {\r\n if (params.target.charAt(0) === '#') {\r\n $target = $(params.target);\r\n } else {\r\n $target = $('#' + params.target);\r\n }\r\n } else if (params.target instanceof jQuery) {\r\n $target = params.target;\r\n } else {\r\n $target = $('#dialog-container');\r\n }\r\n\r\n // if no element found, create one\r\n if ($target.length === 0) {\r\n if ($target.selector && $target.selector.charAt(0) === '#') {\r\n id = $target.selector.substr(1);\r\n $target = $('
        ').attr('id', id).addClass('dialog-content ' + className).appendTo('body');\r\n }\r\n }\r\n\r\n // create the dialog\r\n this.$container = $target;\r\n this.$container.dialog(_.merge({}, this.settings, params.options || {}));\r\n },\r\n /**\r\n * @function\r\n * @description Opens a dialog using the given url (params.url) or html (params.html)\r\n * @param {Object} params\r\n * @param {Object} params.url should contain the url\r\n * @param {String} params.html contains the html of the dialog content\r\n */\r\n open: function (params) {\r\n // close any open dialog\r\n this.close();\r\n this.create(params);\r\n this.replace(params);\r\n },\r\n /**\r\n * @description populate the dialog with html content, then open it\r\n **/\r\n openWithContent: function (params) {\r\n var content, position, callback;\r\n\r\n if (!this.$container) { return; }\r\n content = params.content || params.html;\r\n if (!content) { return; }\r\n this.$container.empty().html(content);\r\n if (!this.$container.dialog('isOpen')) {\r\n this.$container.dialog('open');\r\n }\r\n\r\n if (params.options) {\r\n position = params.options.position;\r\n }\r\n if (!position) {\r\n position = this.settings.position;\r\n }\r\n imagesLoaded(this.$container).on('done', function () {\r\n this.$container.dialog('option', 'position', position);\r\n }.bind(this));\r\n\r\n callback = (typeof params.callback === 'function') ? params.callback : function () {};\r\n callback();\r\n },\r\n /**\r\n * @description Replace the content of current dialog\r\n * @param {object} params\r\n * @param {string} params.url - If the url property is provided, an ajax call is performed to get the content to replace\r\n * @param {string} params.html - If no url property is provided, use html provided to replace\r\n */\r\n replace: function (params) {\r\n if (!this.$container) {\r\n return;\r\n }\r\n if (params.url) {\r\n params.url = util.appendParamToURL(params.url, 'format', 'ajax');\r\n ajax.load({\r\n url: params.url,\r\n data: params.data,\r\n callback: function (response) {\r\n params.content = response;\r\n this.openWithContent(params);\r\n }.bind(this)\r\n });\r\n } else if (params.html) {\r\n this.openWithContent(params);\r\n }\r\n },\r\n /**\r\n * @function\r\n * @description Closes the dialog\r\n */\r\n close: function () {\r\n if (!this.$container) {\r\n return;\r\n }\r\n this.$container.dialog('close');\r\n },\r\n exists: function () {\r\n return this.$container && (this.$container.length > 0);\r\n },\r\n isActive: function () {\r\n return this.exists() && (this.$container.children.length > 0);\r\n },\r\n settings: {\r\n autoOpen: false,\r\n height: 'auto',\r\n modal: true,\r\n overlay: {\r\n opacity: 0.5,\r\n background: 'black'\r\n },\r\n resizable: false,\r\n title: '',\r\n width: '800',\r\n close: function () {\r\n $(this).dialog('close');\r\n },\r\n position: {\r\n my: 'center',\r\n at: 'center',\r\n of: window,\r\n collision: 'flipfit'\r\n }\r\n }\r\n};\r\n\r\nmodule.exports = dialog;\r\n\n},{\"./ajax\":5,\"./util\":87,\"imagesloaded\":115,\"lodash\":116}],17:[function(require,module,exports){\nvar removeScreenOverlay = {\r\n\tinit: function() {\r\n $('#nav-icon').removeClass('open');\r\n $('#navigation').removeClass('active');\r\n\t\t$('.bubble').removeClass('active');\r\n\t\t$('.mini-cart-content').removeClass('active');\r\n\t}\r\n}\r\nmodule.exports = removeScreenOverlay;\n},{}],18:[function(require,module,exports){\n'use strict';\r\n\r\nvar util = require('./util');\r\n\r\nfunction countrySelector() {\r\n\r\n $('.countries-selector').on('change', function(e) {\r\n e.preventDefault();\r\n\r\n var countrySelected = $(this).find(':selected').text().toLowerCase();\r\n if (countrySelected == 'us' || countrySelected == 'united states') {\r\n \treturn false;\r\n }\r\n\r\n \r\n var countryUrl = (countrySelected.indexOf('other') >= 0) ? Urls.countrySelectorUrl : $(this).find(':selected').val();\r\n \r\n if(window.open(countryUrl, '_blank') == null) {\r\n \tdocument.location.href = countryUrl;\r\n }\r\n });\r\n \r\n\t if($('.country-selector-wrapper').length > 0){\r\n\t \t\r\n\t \tvar popup = new Foundation.Reveal($('#country-selector-container'));\r\n\t \tpopup.open();\r\n\t \t\r\n\t \t$('.shopnow-button').on('click', function(){\r\n\t \t\tif($(this).closest('#country-selector-container').find('.selectcountry.popup').val() != ''){\r\n\t \t\t\tlocation = $(this).closest('#country-selector-container').find('.selectcountry.popup').val();\r\n\t \t\t}\r\n\t \t});\r\n\t \t \r\n\t \t\r\n\t \t$('#country-selector-container').find('.close-button').on(\"click\", function (e) {\r\n\t \t\tvar element = e.currentTarget;\r\n\t \tvar marketID = element.dataset.market;\r\n\t \tvar lifetime = element.dataset.countrycookieliftime;\r\n\t \r\n\t \tutil.setCookie('nars_emea-preferredSite', marketID, lifetime);\r\n\t \t})\r\n\t }\r\n}\r\n\r\nfunction languageSelector() {\r\n\tif($('#language-selector-popup').length > 0) {\r\n\t\tvar popupdata = $('#language-selector-popup');\r\n\t\t\r\n\t\tvar popup = new Foundation.Reveal(popupdata);\r\n\r\n\t\tpopup.open();\r\n\t}\r\n}\r\n\r\nexports.countrySelector = countrySelector;\r\nexports.languageSelector = languageSelector;\n},{\"./util\":87}],19:[function(require,module,exports){\n'use strict';\r\n\r\nvar ajax = require('./ajax'),\r\n util = require('./util');\r\n/**\r\n * @function\r\n * @description Load details to a given gift certificate\r\n * @param {String} id The ID of the gift certificate\r\n * @param {Function} callback A function to called\r\n */\r\nexports.checkBalance = function (id, pin, callback) {\r\n // load gift certificate details\r\n ajax.getJson({\r\n url: util.appendParamsToUrl(Urls.giftCardCheckBalance, { 'giftCertCode': id, 'giftCertPIN': pin }),\r\n callback: callback\r\n });\r\n};\r\n\n},{\"./ajax\":5,\"./util\":87}],20:[function(require,module,exports){\n'use strict';\r\n\r\nvar util = require('./util');\r\nvar giftcert = require('./giftcert');\r\nvar modal = require('./modal').global;\r\nvar validator = require('./validator');\r\n\r\nfunction updateCart () {\r\n $('#AddToBasketButton').on('click', function () {\r\n $('#GiftCertificateForm').trigger(\"submit\");\r\n });\r\n}\r\n\r\nexports.init = function () {\r\n $('.gift-cert-edit').on('click', function (e) {\r\n e.preventDefault();\r\n\r\n modal.addCustomClass('edit-modal quickview-modal');\r\n modal.renderByUrl($(this).attr('href'));\r\n modal.setCallback(function () {\r\n updateCart();\r\n giftcert.init();\r\n util.limitCharacters();\r\n validator.initForm('form#GiftCertificateForm');\r\n });\r\n });\r\n}\n},{\"./giftcert\":21,\"./modal\":28,\"./util\":87,\"./validator\":88}],21:[function(require,module,exports){\n'use strict';\r\n\r\nvar ajax = require('./ajax'),\r\n minicart = require('./minicart'),\r\n util = require('./util');\r\n\r\nvar setAddToCartHandler = function (e) {\r\n e.preventDefault();\r\n if ($(\".termsandconditions\").hasClass(\"error\")) {\r\n \treturn false;\r\n } \r\n \r\n setGiftCard();\r\n \r\n if($('#GiftCertificateForm').length > 0 && !$('#GiftCertificateForm').valid()){ \r\n return false;\r\n }\r\n var widgetOpt;\r\n if( util.getGoogleRecaptchaEnableStatus('GiftCertificateForm') == true && SitePreferences.RECAPTCHA_SITE_KEY != null && typeof grecaptcha == 'object'){ \t \t\r\n \ttry {\r\n \t\twidgetOpt= util.getGoogleRecaptchaWidgetOptionNum('GiftCertificateForm');\r\n \t\tif( grecaptcha.getResponse(widgetOpt) == '' ){\r\n \t\te.preventDefault();\r\n \t\te.stopPropagation();\r\n \t\tgrecaptcha.execute(widgetOpt);\r\n \t\treturn;\r\n \t}\r\n \t}\r\n \tcatch(err) {\r\n \t console.log(err.message); \t \r\n \t}\r\n \t\r\n }\r\n \r\n var form = $(this).closest('form');\r\n var options = {\r\n url: util.ajaxUrl(form.attr('action')),\r\n method: 'POST',\r\n cache: false,\r\n data: form.serialize()\r\n };\r\n\r\n $.ajax(options).done(function (response) { \t\r\n \tif(response.success == false){ \t\t\r\n \t\treturn window.alert(response.invalidErrMsg); \t\t\r\n \t} else if (response.success) {\r\n \t\tif( util.getGoogleRecaptchaEnableStatus('GiftCertificateForm') == true && widgetOpt!=undefined) {\r\n \t util.resettingGoogleInvRecaptcha(widgetOpt, 'GiftCertificateForm');\r\n \t\t}\r\n ajax.load({\r\n url: Urls.minicartGC,\r\n data: {\r\n lineItemId: response.result.lineItemId\r\n },\r\n callback: function (response) {\r\n minicart.show(response);\r\n form.find('input:not([name=csrf_token]),textarea').val('');\r\n setGiftCard(); \r\n }\r\n });\r\n\r\n if (response.result.device === 'mobile') {\r\n var popup = new Foundation.Reveal($('#giftcertpurchase-notification'));\r\n\r\n popup.open();\r\n\r\n setTimeout(function () {\r\n popup.close();\r\n }, 3000);\r\n form[0].reset();\r\n }\r\n }else if(response.error){\r\n \tvar urls = Urls.navigateToCSRFFailed;\r\n \twindow.location.href = urls;\r\n }\r\n }).fail(function (xhr, textStatus) {\r\n // failed\r\n if (textStatus === 'parsererror') {\r\n return window.alert(Resources.BAD_RESPONSE);\r\n }\r\n\r\n window.alert(Resources.SERVER_CONNECTION_ERROR);\r\n });\r\n};\r\n\r\nfunction initializeEvents() {\r\n $('.gift-templates li').on('click', function (e) {\r\n e.preventDefault();\r\n\r\n $('.gift-templates li').removeClass('active');\r\n $(this).addClass('active');\r\n\r\n setGiftCard();\r\n });\r\n\r\n $('.gift-templates select').on(\"change\", function () {\r\n var imageSource = $(this).find('option:selected').val();\r\n var imageAlt = $(this).find('option:selected').text();\r\n\r\n $('.gift-templates li.active').removeClass('active');\r\n $('.gift-templates li:has(img[alt=\"' + imageAlt + '\"])').addClass('active');\r\n\r\n setGiftCardImage(imageSource);\r\n setGiftCardName(imageAlt);\r\n });\r\n}\r\n\r\nfunction setGiftCard() {\r\n var imageSource = $('.gift-templates li.active').find('img').attr('src') || $('.img-source input').val();\r\n var imageAlt = $('.gift-templates li.active').find('img').attr('alt') || $('.img-alt input').val();\r\n\r\n $('.gift-templates select').val(imageSource);\r\n $('.gift-templates li:has(img[alt=\"' + imageAlt + '\"])').addClass('active');\r\n\r\n setGiftCardImage(imageSource);\r\n setGiftCardName(imageAlt);\r\n}\r\n\r\nfunction setGiftCardImage(imageSource) {\r\n $('.img-preview').html('');\r\n $('#GiftCertificateForm .img-source input').val(imageSource);\r\n}\r\n\r\nfunction setGiftCardName (imageAlt) {\r\n $('.gift-templates strong').text(imageAlt);\r\n $('#GiftCertificateForm .img-alt input').val(imageAlt);\r\n}\r\n\r\nexports.init = function () {\r\n $('#AddToBasketButton').on('click', setAddToCartHandler);\r\n\r\n if ($('.gift-check-balance').length) {\r\n $('.gift-templates li').first().addClass('active');\r\n }\r\n\r\n initializeEvents();\r\n \r\n if ($('#giftcertrecaptcha').length > 0) {\r\n //util.renderGoogleInvRecaptcha(\"giftcertrecaptcha\",\"#AddToBasketButton\",\"GiftCertificateForm\");\r\n }\r\n if ($('#giftcertcheckbalance').length > 0) {\r\n //util.renderGoogleInvRecaptcha(\"giftcertcheckbalance\",\"#CheckBalanceButton\",\"gcBalanceCheckForm\");\r\n }\r\n};\r\n\n},{\"./ajax\":5,\"./minicart\":27,\"./util\":87}],22:[function(require,module,exports){\n'use strict';\r\n\r\nexports.init = function () {\r\n\t$('.menu-utility-user .contact, .menu-utility-user .newsletter').on(\"mouseenter\", function() {\r\n\t\t$(this).find('.menu-utility-content').show();\r\n }).on(\"mouseleave\", function() {\r\n \t$(this).find('.menu-utility-content').hide();\r\n });\r\n\t\r\n\t// 'tap' doesn't work as expected so using touchstart instead\r\n\t$(document).on('touchstart',function(e){\r\n\t\t// the tapped element\r\n\t\tvar $target = $(e.target);\r\n\t\t\r\n\t\t// check if it's not the menu or the dropdown itself\r\n\t\tif($target.closest('.dropdown-menu').length == 0){\r\n\t\t\t// check if some dropdown menu is open, otherwise foundation will return an error \r\n\t\t\tif($('.dropdown-pane.is-open').length){\r\n\t\t\t\t$('.dropdown-pane.is-open').foundation('close');\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\t$('a.utility-link').on(\"click\", function(evt) {\r\n\t\tevt.preventDefault();\r\n\t});\r\n\r\n\t// overwrite foundation Enter key event \r\n\t$('.menu-utility-user input').each(function(i, input){\r\n\t\tvar $input = $(input);\r\n\t\t\r\n\t\t// overwrite only on input type text, email and password\r\n\t\tif($input.attr('type') == 'text' \r\n\t\t\t|| $input.attr('type') == 'email' \r\n\t\t\t\t|| $input.attr('type') == 'password'){\r\n\t\t\t\r\n\t\t\t$input.on(\"keydown\", function(e) {\r\n\t\t\t\tFoundation.Keyboard.handleKey(e, \"DropdownMenu\", {\t\t\r\n\t\t\t\t\tsubmit: function () {\r\n\t\t\t\t\t\tvar $form = $input.closest('form');\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// simulate blur event to check if it has error or not\r\n\t\t\t\t\t\t$input.trigger(\"blur\");\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// prevent submit if there are errors\r\n\t\t\t\t\t\tif($form.find('span.error').length == 0){\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// $form.submit() doesn't work on login so it has to be this *sigh*\r\n\t\t\t\t\t\t\t$form.find('button[type=\"submit\"]').trigger(\"click\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\t\t\r\n\t});\r\n\r\n}\r\nFoundation.Keyboard.register(\"DropdownMenu\", {\r\n\t\"ENTER\": 'submit'\r\n});\r\n\n},{}],23:[function(require,module,exports){\n'use strict';\r\n\r\nfunction entry () {\r\n $(document).on('keyup blur', '.cart-coupon-code input', function () {\r\n var inputEntry = $(this).val();\r\n if (inputEntry && inputEntry.trim().length) {\r\n return $(this).siblings('button').prop('disabled', false);\r\n }\r\n\r\n $(this).siblings('button').prop('disabled', true);\r\n });\r\n}\r\n\r\nexports.entry = entry;\n},{}],24:[function(require,module,exports){\n'use strict';\r\n// jQuery extensions\r\n\r\nmodule.exports = function () {\r\n // params\r\n // toggleClass - required\r\n // triggerSelector - optional. the selector for the element that triggers the event handler. defaults to the child elements of the list.\r\n // eventName - optional. defaults to 'click'\r\n $.fn.toggledList = function (options) {\r\n if (!options.toggleClass) { return this; }\r\n var list = this;\r\n return list.on(options.eventName || 'click', options.triggerSelector || list.children(), function (e) {\r\n e.preventDefault();\r\n var classTarget = options.triggerSelector ? $(this).parent() : $(this);\r\n classTarget.toggleClass(options.toggleClass);\r\n // execute callback if exists\r\n if (options.callback) {options.callback();}\r\n });\r\n };\r\n\r\n $.fn.syncHeight = function () {\r\n var arr = $.makeArray(this);\r\n arr.sort(function (a, b) {\r\n return $(a).height() - $(b).height();\r\n });\r\n return this.height($(arr[arr.length - 1]).height());\r\n };\r\n};\r\n\n},{}],25:[function(require,module,exports){\n/* --- handle limit Character --- */\r\nvar checkLimitCharacter = {\r\n init: function (e) {\r\n var o = e.outerElem,\r\n i = e.innerElem,\r\n l = e.limit;\r\n if ($(o).length > 0 && $(i).length > 0) {\r\n $(o).each(function() {\r\n var $selector = $(this).find(i);\r\n if ($selector.length > 0) {\r\n var charCount = $selector.html();\r\n if (charCount.length > l) {\r\n $selector.html(charCount.substr(0, l) + '...');\r\n }\r\n }\r\n });\r\n }\r\n }\r\n}\r\n\r\nmodule.exports = checkLimitCharacter;\n},{}],26:[function(require,module,exports){\n'use strict';\r\n\r\nvar dialog = require('./dialog'),\r\n page = require('./page'),\r\n util = require('./util'),\r\n validator = require('./validator'),\r\n customaddress = require('./pages/customaddress');\r\n\r\nvar login = {\r\n /**\r\n * @private\r\n * @function\r\n * @description init events for the loginPage\r\n */\r\n init: function () {\r\n //o-auth binding for which icon is clicked\r\n $('.oAuthIcon').on('click', function () {\r\n $('#OAuthProvider').val(this.id);\r\n });\r\n\r\n\r\n //toggle the value of the rememberme checkbox\r\n $('#dwfrm_login_rememberme').on('change', function () {\r\n if ($('#dwfrm_login_rememberme').attr('checked')) {\r\n $('#rememberme').val('true');\r\n } else {\r\n $('#rememberme').val('false');\r\n }\r\n });\r\n if ($('#loginrecaptcha').length > 0) {\r\n util.renderGoogleInvRecaptcha(\"loginrecaptcha\",\"#login\",\"dwfrm_login\")\r\n }\r\n customaddress.init();\r\n }\r\n}\r\n\r\n//Reset Password\r\n$('.password-reset').on('click', function (e) {\r\n e.preventDefault();\r\n\r\n if ($('#sign-in-dropdown').length) {\r\n $('#sign-in-dropdown').foundation('close');\r\n }\r\n\r\n var page = require('./page'),\r\n util = require('./util'),\r\n validator = require('./validator'),\r\n customaddress = require('./pages/customaddress'),\r\n modal = require('./modal').global;\r\n\r\n modal.events.onOpen(function () {\r\n validator.init();\r\n var $requestPasswordForm = $('[name$=\"_requestpassword\"]');\r\n var $submit = $requestPasswordForm.find('[name$=\"_requestpassword_send\"]');\r\n $($submit).on('click', function (e) {\r\n if (!$requestPasswordForm.valid()) {\r\n return;\r\n }\r\n e.preventDefault();\r\n var data = $requestPasswordForm.serialize();\r\n // add form action to data\r\n data += '&' + $submit.attr('name') + '=';\r\n // make sure the server knows this is an ajax request\r\n if (data.indexOf('ajax') === -1) {\r\n data += '&format=ajax';\r\n }\r\n $.ajax({\r\n type: 'POST',\r\n url: $requestPasswordForm.attr('action'),\r\n data: data,\r\n success: function (response) {\r\n if (typeof response === 'object' &&\r\n !response.success &&\r\n response.error === 'CSRF Token Mismatch') {\r\n page.redirect(Urls.csrffailed);\r\n } else if (typeof response === 'string') {\r\n modal.renderContent(response);\r\n }\r\n },\r\n failure: function () {\r\n modal.renderContent('

        ' + Resources.SERVER_ERROR + '

        ');\r\n }\r\n });\r\n });\r\n });\r\n modal.addCustomClass('password-reset-step1');\r\n modal.renderByUrl($(e.target).attr('href'));\r\n});\r\n\r\nmodule.exports = login;\r\n\r\n///Login Greetings\r\nif (window.User.isCustomerAuthenticated != false || window.User.isRegistered == true) {\r\n var myDate = new Date();\r\n var hrs = myDate.getHours();\r\n var mins = myDate.getMinutes();\r\n var time;\r\n var greeting;\r\n\r\n mins = ('0' + mins).slice(-2);\r\n time = hrs + mins;\r\n time = Number(time);\r\n\r\n if (time >= 300 && time <= 1159) {\r\n greeting = window.Resources.GREETINGS_MORNING;\r\n } else if (time >= 1200 && time <= 1700) {\r\n greeting = window.Resources.GREETINGS_AFTERNOON;\r\n } else {\r\n greeting = window.Resources.GREETINGS_EVENING;\r\n }\r\n\r\n $('#login-greetings').text(greeting);\r\n $('.menu-greeting #login-greetings').text(greeting);\r\n}\n},{\"./dialog\":16,\"./modal\":28,\"./page\":31,\"./pages/customaddress\":45,\"./util\":87,\"./validator\":88}],27:[function(require,module,exports){\n'use strict';\r\n\r\nvar util = require('./util'),\r\n bonusProductsView = require('./bonus-products-view'),\r\n samples = require('./samples'),\r\n removeScreenOverlay = require('./drawerControl'),\r\n modal = require('./modal').global,\r\n analytics = require('./analytics');\r\n\r\nvar timer = {\r\n id: null,\r\n clear: function () {\r\n if (this.id) {\r\n window.clearTimeout(this.id);\r\n delete this.id;\r\n }\r\n },\r\n start: function (duration, callback) {\r\n this.id = setTimeout(callback, duration);\r\n }\r\n};\r\n\r\nvar minicart = {\r\n init: function () {\r\n this.$el = $('#mini-cart');\r\n this.$content = this.$el.find('.mini-cart-content');\r\n this.$btnClose = this.$el.find('#minicart-close');\r\n\r\n if (!util.isMobile()) {\r\n // events\r\n this.$el.find('.mini-cart-total').on('mouseenter', function () {\r\n if (this.$content.not(':visible')) {\r\n this.slide();\r\n }\r\n }.bind(this));\r\n\r\n this.$content.on('mouseenter', function () {\r\n timer.clear();\r\n }).on('mouseleave', function () {\r\n timer.clear();\r\n timer.start(200, this.close.bind(this));\r\n }.bind(this));\r\n } else {\r\n this.$el.find('.mini-cart-total').on('click', function (e) {\r\n e.preventDefault();\r\n removeScreenOverlay.init();\r\n $('html').removeClass('nav-open');\r\n if (this.$content.not(':visible')) {\r\n this.slide();\r\n }\r\n }.bind(this));\r\n }\r\n\r\n this.$btnClose.on('click', function(e) {\r\n e.preventDefault();\r\n this.$content.removeClass('active');\r\n this.$content.attr('aria-expanded', false);\r\n }.bind(this));\r\n },\r\n\r\n addProduct: function (data) {\r\n var show = this.show.bind(this);\r\n var promise = require('promise');\r\n var currentId = data.currentId;\r\n return new promise(function (resolve, reject) {\r\n if (data.hasOwnProperty(\"pid\") === false) {\r\n return reject();\r\n }\r\n\r\n var data_json = {\r\n \"format\": \"ajax\",\r\n \"pid\": encodeURIComponent(data.pid),\r\n \"Quantity\": data.hasOwnProperty(\"Quantity\") ? data.Quantity : \"1\",\r\n };\r\n\r\n if ($('#csrf_token') && $('#csrf_token').length === 1) {\r\n var csrfTokenVal = $('#csrf_token').val();\r\n var csrfTokenKey = $('#csrf_token').prop('name');\r\n data_json[csrfTokenKey] = csrfTokenVal;\r\n }\r\n\r\n $.post(util.appendParamsToUrl(Urls.addProduct, data_json), function (data) {\r\n if (data.success === false) {\r\n modal.addCustomClass('normal-modal');\r\n modal.renderContent(data.error);\r\n return reject(data.error);\r\n }\r\n\r\n analytics.initAddToCartFromPLP(currentId);\r\n\r\n show(data);\r\n resolve();\r\n }).fail(function (err) {\r\n reject(err.error);\r\n });\r\n });\r\n },\r\n\r\n addAllToWishlistFromContent: function (pids) {\r\n return window.location.href = Urls.addAllFromContent\r\n + \"?pid=\" + pids.join(\":1,\") // pass qty of one\r\n + \"&cid=\" + window.contentAssetID\r\n + \"&hashparam=\" + window.location.hash.split('#')[1];\r\n },\r\n\r\n addAllProducts: function (pids, to) {\r\n if (!pids || pids.length === 0) {\r\n return;\r\n }\r\n\r\n var isWishlist = (to && to.toLowerCase() === \"wishlist\");\r\n if (isWishlist && !window.User.isCustomerAuthenticated) {\r\n if (window.contentAssetID) {\r\n return this.addAllToWishlistFromContent(pids);\r\n } else {\r\n var footerURL = $('footer') ? $('footer').data('url') : null;\r\n window.location = util.appendParamToURL(Urls.showLogin, 'original', footerURL);\r\n return;\r\n }\r\n }\r\n\r\n var show = this.show.bind(this);\r\n var urlName = Urls.addMultipleProducts;\r\n\r\n if (isWishlist) {\r\n urlName = Urls.wishlistAddAll.split(window.location.hostname)[1];\r\n }\r\n\r\n $.post(util.appendParamsToUrl(urlName, {\r\n format: 'ajax',\r\n pid: pids\r\n }), function (data) {\r\n if (isWishlist) {\r\n \tvar redirectLocation = util.appendParamsToUrl( window.location.href, { \"recadd\" : \"yes\" } )\r\n window.location.href = redirectLocation;\r\n return;\r\n }\r\n\r\n if (data) {\r\n show(data);\r\n }\r\n });\r\n },\r\n\r\n /**\r\n * @function\r\n * @description Shows the given content in the mini cart\r\n * @param {String} A HTML string with the content which will be shown\r\n */\r\n show: function (html) {\r\n \t// re-fetch mini-cart object\r\n \tif (!this.$el) {\r\n \t\tthis.$el = $('#mini-cart');\r\n \t}\r\n\r\n this.$el.html(html);\r\n this.init();\r\n this.slide();\r\n\r\n // identify if we can show the sample overlay\r\n var canShowSamples = false;\r\n $(document).find('#mini-cart input[name=\"eligible-for-sample\"]').each(function() {\r\n \tif (!canShowSamples && $(this).val() == 'true') {\r\n \t\tcanShowSamples = true;\r\n \t}\r\n });\r\n\r\n if ((bonusProductsView.hasBonusOptions() === false && samples.canShowSelection())\r\n \t\t&& canShowSamples) {\r\n \tsetTimeout(function() {\r\n samples.showSelection();\r\n }, 1000);\r\n\r\n }\r\n\r\n bonusProductsView.loadBonusOption();\r\n },\r\n /**\r\n * @function\r\n * @description Slides down and show the contents of the mini cart\r\n */\r\n slide: function () {\r\n timer.clear();\r\n // show the item\r\n this.$content.addClass('active');\r\n this.$content.attr('aria-expanded', true);\r\n // after a time out automatically close it\r\n timer.start(6000, this.close.bind(this));\r\n },\r\n /**\r\n * @function\r\n * @description Closes the mini cart with given delay\r\n * @param {Number} delay The delay in milliseconds\r\n */\r\n close: function (delay) {\r\n timer.clear();\r\n this.$content.removeClass('active');\r\n this.$content.attr('aria-expanded', false);\r\n }\r\n};\r\n\r\nmodule.exports = minicart;\r\n\n},{\"./analytics\":6,\"./bonus-products-view\":9,\"./drawerControl\":17,\"./modal\":28,\"./samples\":79,\"./util\":87,\"promise\":118}],28:[function(require,module,exports){\nvar util = require('./util');\r\n\r\nfunction Modal(modalCntr, modalBody, option) {\r\n this.$cntr = $(modalCntr);\r\n this.$body = $(modalBody);\r\n \r\n if($.isEmptyObject(option) === false){\r\n \tthis.modal = new Foundation.Reveal($(modalCntr), option);\r\n } else {\r\n \tthis.modal = new Foundation.Reveal($(modalCntr));\r\n }\r\n this.callbackFn = null;\r\n\r\n this.events = {\r\n onOpen: function (cb) {\r\n $(document).off('open.zf.reveal').on('open.zf.reveal', function () {\r\n cb();\r\n $(document).off('open.zf.reveal');\r\n });\r\n },\r\n\r\n onClose: function (cb) {\r\n $(document).off('closed.zf.reveal').on('closed.zf.reveal', function () {\r\n cb();\r\n $(document).off('closed.zf.reveal');\r\n });\r\n }\r\n };\r\n}\r\n\r\nModal.prototype.open = function () {\r\n this.modal.open();\r\n};\r\n\r\nModal.prototype.close = function () {\r\n this.modal.close();\r\n};\r\n\r\nModal.prototype.restoreDefaultClass = function () {\r\n\tthis.$cntr.removeAttr('class');\r\n\tthis.$cntr.attr('class','reveal');\r\n};\r\n\r\nModal.prototype.addCustomClass = function(customClass){\r\n\tthis.restoreDefaultClass();\r\n\tthis.$cntr.addClass(customClass);\r\n};\r\n\r\nModal.prototype.setContent = function (content) {\r\n return this.$body.html(content);\r\n};\r\n\r\nModal.prototype.renderContent = function(content, type) {\r\n var classType = type || '';\r\n\r\n this.$body.html('
        ' + content + '
        ');\r\n this.modal.open();\r\n\r\n if(typeof this.callbackFn === 'function') {\r\n \tthis.callbackFn();\r\n \tthis.callbackFn = null; // clear after each use\r\n }\r\n};\r\n\r\nModal.prototype.renderByUrl = function (contentUrl) {\r\n return $.get(util.appendParamToURL(contentUrl, 'format', 'ajax')).done(this.renderContent.bind(this));\r\n};\r\n\r\nModal.prototype.setCallback = function (cb) {\r\n\tthis.callbackFn = cb;\r\n};\r\n\r\nmodule.exports.global = new Modal(\"#modal-cntr\", \".modal-body\", {}); // global modal\r\nmodule.exports.create = function (modalCntr, modalBody, option) {\r\n return new Modal(modalCntr, modalBody, option);\r\n};\n},{\"./util\":87}],29:[function(require,module,exports){\n'use strict';\r\n\r\nvar util = require('./util'),\r\n\tvalidator = require('./validator'),\r\n modal = require('./modal').global;\r\n\r\n\r\nfunction showNewsletterModal() {\r\n modal.events.onClose(function () {\r\n var shouldDisplayNewsletter = [siteId, 'shouldDisplayNewsletter'].join('-');\r\n util.setCookie(shouldDisplayNewsletter, false, 10);\r\n });\r\n\r\n modal.renderByUrl(Urls.showFullNewsletterForm)\r\n .done(function (response) {\r\n modal.addCustomClass('newsletter-signup-modal');\r\n\r\n $('.modal-content button').prop('disabled', true);\r\n $('.modal-content button').css('color', '#FFFFFF');\r\n \r\n if( window.User.isCustomerAuthenticated ){\r\n \tvar fname = $('.newsletterpopup-data').attr('data-fname');//$('.news-letter-form input[name=\"newsletterfname\"]').val();\r\n\t\t\t\tvar lname = $('.newsletterpopup-data').attr('data-lname');//$('.news-letter-form input[name=\"newsletterlname\"]').val();\r\n \t$('.modal-content input[name=\"newsletterfname\"]').val(fname).prop( \"disabled\", true );\r\n \t$('.modal-content input[name=\"newsletterlname\"]').val(lname).prop( \"disabled\", true );;\r\n\r\n }\r\n\r\n validator.initForm('.newsletter-signup-modal form');\r\n });\r\n}\r\n\r\nfunction isNewsletterEnabled() {\r\n $('.register-newsletter').removeClass('hide');\r\n $('.newsletter-success').addClass('hide');\r\n\r\n if (!enableNewsletter) {\r\n return;\r\n }\r\n\r\n var hasViewedNewsletter = [siteId, 'hasViewedNewsletter'].join('-');\r\n var isViewedNewsletterValid = util.getCookieSelector(hasViewedNewsletter);\r\n\r\n if (isViewedNewsletterValid === 'true') {\r\n return;\r\n }\r\n\r\n var shouldDisplayNewsletter = [siteId, 'shouldDisplayNewsletter'].join('-');\r\n var isDisplayedNewsletterValid = util.getCookieSelector(shouldDisplayNewsletter);\r\n\r\n if (isDisplayedNewsletterValid === 'false') {\r\n return;\r\n }\r\n\r\n util.setCookie(hasViewedNewsletter, false, newsletterCookieDuration);\r\n util.setCookie(shouldDisplayNewsletter, true, newsletterCookieDuration);\r\n if ($('#newsletterrecaptcha').length > 0) {\r\n //util.renderGoogleInvRecaptcha(\"newsletterrecaptcha\",\"#headernewslettersubmit\", \"headerNewsLetter\");\r\n }\r\n\r\n setNewsletterCounterCookie();\r\n signUpEventListener();\r\n}\r\n\r\nfunction setNewsletterCounterCookie() {\r\n var pageViewCount = [siteId, 'pageViewCount'].join('-');\r\n var isCookieValid = util.getCookieSelector(pageViewCount);\r\n var counterCookie = Number(isCookieValid);\r\n\r\n if (!isCookieValid) {\r\n counterCookie = 0;\r\n } else {\r\n counterCookie += 1;\r\n }\r\n\r\n util.setCookie(pageViewCount, counterCookie, newsletterCookieDuration);\r\n\r\n var shouldDisplayNewsletter = [siteId, 'shouldDisplayNewsletter'].join('-');\r\n var isDisplayedNewsletterValid = util.getCookieSelector(shouldDisplayNewsletter);\r\n\r\n if (counterCookie >= pageViewsToNewsletter && isDisplayedNewsletterValid === 'true') {\r\n showNewsletterModal();\r\n }\r\n}\r\n\r\nfunction signUpEventListener() {\r\n $(document)\r\n .on('submit', '.modal-content .news-letter-form', function (e) {\r\n e.preventDefault();\r\n\r\n var emailAddress = $('.modal-content input.email').val();\r\n var fname = $('.modal-content input[name=\"newsletterfname\"]').val();\r\n var lname = $('.modal-content input[name=\"newsletterlname\"]').val();\r\n validateNewsletterEmail(true, emailAddress, fname, lname);\r\n })\r\n\r\n .on('keyup blur', '.modal-content input.email', function (e) {\r\n var emailAddress = $(this).val();\r\n\r\n $('.modal-content button').prop('disabled', false);\r\n $('.modal-content button').css('color', '');\r\n\r\n if (!emailAddress.length) {\r\n $('.modal-content button').prop('disabled', true);\r\n $('.modal-content button').css('color', '#FFFFFF');\r\n }\r\n });\r\n}\r\n\r\nfunction newsletterHeader() {\r\n $(document).on('submit', '.newsletter-content .news-letter-form', function (e) {\r\n e.preventDefault();\r\n\r\n var emailAddress = $('.news-letter-form input.email').val();\r\n var fname = $('.news-letter-form input[name=\"newsletterfname\"]').val();\r\n var lname = $('.news-letter-form input[name=\"newsletterlname\"]').val();\r\n validateNewsletterEmail(false, emailAddress, fname, lname);\r\n });\r\n}\r\n\r\nfunction validateNewsletterEmail(isModal, emailAddress, fname, lname) {\r\n var validateClass = '.news-letter-form';\r\n\r\n if (isModal) {\r\n validateClass = '.modal-content';\r\n }\r\n\r\n $(validateClass + ' input').removeAttr('aria-invalid');\r\n $(validateClass + ' input').removeAttr('aria-describedby');\r\n $(validateClass + ' input').removeAttr('class');\r\n $(validateClass + ' span').remove();\r\n\r\n if (!util.validateEmail(emailAddress)) {\r\n var errorMessage;\r\n\r\n if (isModal) {\r\n errorMessage = [\r\n '',\r\n Resources.VALIDATE_EMAIL,\r\n ''\r\n ].join('');\r\n\r\n $(validateClass + ' .promotions-container').after(errorMessage);\r\n $(validateClass + ' button').prop('disabled', true);\r\n } else {\r\n errorMessage = [\r\n '',\r\n Resources.VALIDATE_EMAIL,\r\n ''\r\n ].join('');\r\n\r\n $(validateClass + ' input').before(errorMessage);\r\n }\r\n }\r\n\r\n var postData = ['dwfrm_newsletter_email=', emailAddress].join('');\r\n var formAction = $('.newsletter-container form').attr('action');\r\n \r\n if($('.newsletter-container form').length > 0){\r\n \t$.ajax({\r\n type: 'POST',\r\n url: formAction,\r\n async: false,\r\n data: postData,\r\n success: function(textStatus) {\r\n $('.register-newsletter').addClass('hide');\r\n $('.newsletter-success').removeClass('hide');\r\n $('.newsletter-success').addClass('show');\r\n $('.newsletter-success .registered-email').html(emailAddress);\r\n if(window.universal_variable !== undefined && !window.universal_variable.user.hasOwnProperty('user_id')){\r\n \twindow.universal_variable.user.email = emailAddress;\r\n }\r\n }\r\n });\r\n }\r\n var formSerliazeData;\r\n if (isModal) {\r\n setHasViewedNewsletterCookie(true);\r\n formSerliazeData = $('#modalNewsLetter').serialize();\r\n } else {\r\n \tformSerliazeData = $('#headerNewsLetter').serialize();\r\n }\r\n \r\n if($('.news-letter-form').length > 0){\r\n var sourceValue = isModal ? 'modal' : 'header';\r\n \t$.ajax({\r\n type: 'POST',\r\n url: $('.news-letter-form').attr('action'),\r\n async: false,\r\n data: formSerliazeData +'&email='+ emailAddress +'&source='+sourceValue+'&fname='+fname+'&lname='+lname,\r\n success: function (response) {\r\n \tif(typeof response.success != \"undefined\" && response.success==false){\r\n \t\tif (isModal) {\r\n\t modal.renderContent(response.error);\r\n\t modal.addCustomClass('newsletter-signup-modal');\r\n\t $(document).trigger(\"clicknewsletter\",{\"siteloc\":\"pop-up\"});\r\n\t } else {\r\n\t $('.newsletter-content').html(response.error);\r\n\t $(document).trigger(\"clicknewsletter\",{\"siteloc\":\"navbar\"});\r\n\t }\r\n \t}else{\r\n\t if (isModal) {\r\n\t modal.renderContent(response);\r\n\t modal.addCustomClass('newsletter-signup-modal');\r\n\t $(document).trigger(\"clicknewsletter\",{\"siteloc\":\"pop-up\"});\r\n\t } else {\r\n\t $('.newsletter-content').html(response);\r\n\t $(document).trigger(\"clicknewsletter\",{\"siteloc\":\"navbar\"});\r\n\t }\r\n\t if(window.universal_variable !== undefined && !window.universal_variable.user.hasOwnProperty('user_id')){\r\n\t \twindow.universal_variable.user.email = emailAddress;\r\n\t }\r\n \t}\r\n }\r\n });\r\n }\r\n \r\n}\r\n\r\nfunction setHasViewedNewsletterCookie(val) {\r\n var hasViewedNewsletter = [siteId, 'hasViewedNewsletter'].join('-');\r\n util.setCookie(hasViewedNewsletter, val, newsletterCookieDuration);\r\n}\r\n\r\nexports.isNewsletterEnabled = isNewsletterEnabled;\r\nexports.newsletterHeader = newsletterHeader;\n},{\"./modal\":28,\"./util\":87,\"./validator\":88}],30:[function(require,module,exports){\n'use strict';\r\n\r\nvar modal = require('./modal').global, \r\n\tutil = require('./util');\r\n\r\nexports.init = function init() {\r\n\r\n//On Change Select in PDP\r\n$(\".replenishmentCycle\").on(\"change\", function() {\r\n\tvar footerURL = window.location.href;\r\n\tvar selection = $(this).val();\r\n\r\n\tif ( window.User.isCustomerAuthenticated == false && selection!= 0) { \r\n\t\t$( \".replenishmentCycle\" ).val(\"0\");\r\n\r\n\t\t// render content to modal by url\r\n\t\tmodal.renderByUrl(Urls.replenishmentLogin);\r\n\t\tmodal.setCallback(function(){\r\n\t\t\t$(\".modal-btn-signin\").on(\"click\", \r\n\t\t\t\t\tfunction() {\r\n\t\t\t\t\t\tvar urlLink = util.appendParamToURL(Urls.showLogin,\r\n\t\t\t\t\t\t\t\t'original', footerURL);\r\n\t\t\t\t\t\twindow.location = util.appendParamToURL(urlLink,\r\n\t\t\t\t\t\t\t\t'replenishment', selection);\r\n\t\t\t\t\t});\r\n\t\t\t\r\n\t\t\t$(\".modal-btn-register\").on(\"click\", function() {\r\n\t\t\t\twindow.location = Urls.showCreateAccount;\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t$( \".modal-btn-signin\" ).on(\"click\", function() {\r\n\t\tvar urlLink = util.appendParamToURL(Urls.showLogin, 'original', footerURL);\r\n\t\twindow.location = util.appendParamToURL(urlLink, 'replenishment', selection);\r\n\t});\r\n\r\n\t$( \".modal-btn-register\" ).on(\"click\", function() {\r\n\t\twindow.location = Urls.showCreateAccount;\r\n\t});\t\r\n});\r\n\r\n//Update the Order replenishment suggestion based on product variant sizeVariations\t\r\n$(\"input[name=size]\").on(\"click\", function(){\t\t\r\n\t//Get the recommendation from the input data-isreplenishable\r\n\tvar replennumber = this.getAttribute('data-isreplenishable');\r\n\t\t\t\t\t\r\n\t//Construct the replenishment message\r\n\tvar replenmsg = \"\";\r\n\tif(replennumber !== null && replennumber > 0){\r\n\t\tvar message = Resources.RECOMMENDED_REPLENISHMENT;\r\n\t\r\n\t\treplenmsg += message;\r\n\t\treplenmsg += replennumber;\t\t\t\r\n\t\treplenmsg += \" \";\r\n\t\treplenmsg += replennumber > 1 ? \"${spanPlural}\" : \"${span}\";\r\n\t\treplenmsg += \".\";\r\n\t}\t\t\r\n\t\r\n\t//Assign it to replenreccomendation\r\n\t$(\"#replenrecommendation\").text(replenmsg);\r\n});\r\n\r\n//My Account Replenishment Update Button\r\n$( \".replenishmentupdate\" ).on(\"click\", function(e) {\r\n\te.preventDefault();\r\n\tvar href = $(this).attr('href');\r\n\tvar uuid = getQueryValue(\"rid\", href);\r\n\tvar rdays = $(\".\" + uuid.substring(0,26) + \"_days\").val();\r\n\tvar replenishmentQuantity = $(\".\" + uuid.substring(0,26) + \"_quantity\").val();\r\n\tvar updateReplenishment = href + \"&rdays=\" + rdays + \"&qty=\" + replenishmentQuantity;\r\n\twindow.location = updateReplenishment;\r\n\t\r\n});\r\n\r\n//My Account Replenishment Cancel Button\r\n$( \".replenishmentcancel\" ).on(\"click\", function(e) {\r\n e.preventDefault();\r\n var href = $(this).attr('href');\r\n var popup = new Foundation.Reveal($('#cancel-replenishment'));\r\n popup.open();\r\n \r\n $( \".modal-btn-confirm\" ).on(\"click\", function() {\r\n window.location = href;\r\n });\r\n \r\n $( \".modal-btn-keep\" ).on(\"click\", function() {\r\n popup.close();\r\n });\r\n});\r\n\r\n// Gets the query string value if it exists, returns null if it does not.\r\n// Example: getQueryValue(\"reset\") will return the value true if the URL is http://www.domain.com?reset=true\r\nfunction getQueryValue(str,href) \r\n{\r\n\t/*var queryString = window.location.search.substring(1);*/\r\n\tvar queryString = href\r\n\tvar queries = queryString.split(\"?\");\r\n\tfor (var i=0;i\").attr({type:\"hidden\", name:\"format\", value:\"ajax\"}).appendTo(form);\r\n\r\n $form.on('click', '.apply-button', function (e) {\r\n /****\r\n * e.preventDefault();\r\n * if (!$form.valid()) {\r\n * return false;\r\n * }\r\n * var url = util.appendParamToURL($form.attr('action'), 'format', 'ajax');\r\n * var applyName = $form.find('.apply-button').attr('name');\r\n * var options = {\r\n * url: url,\r\n * data: $form.serialize() + '&' + applyName + '=x',\r\n * type: 'POST'\r\n * };\r\n * $.ajax(options).done(function (data) {\r\n * if (typeof(data) !== 'string') {\r\n * if (data.success) {\r\n * dialog.close();\r\n * page.refresh();\r\n * } else if (data.error) {\r\n * page.redirect(Urls.csrffailed);\r\n * } else {\r\n * window.alert(data.message);\r\n * return false;\r\n * }\r\n * } else {\r\n * $('#dialog-container').html(data);\r\n * account.init();\r\n * tooltip.init();\r\n * }\r\n * });\r\n ****/\r\n })\r\n .on('click', '.cancel-button, .close-button', function (e) {\r\n e.preventDefault();\r\n dialog.close();\r\n })\r\n .on('click', '.delete-button', function (e) {\r\n e.preventDefault();\r\n if (window.confirm(String.format(Resources.CONFIRM_DELETE, Resources.TITLE_ADDRESS))) {\r\n var url = util.appendParamsToUrl(Urls.deleteAddress, {\r\n AddressID: $form.find('#addressid').val(),\r\n format: 'ajax'\r\n });\r\n $.ajax({\r\n url: url,\r\n method: 'POST',\r\n dataType: 'json'\r\n }).done(function (data) {\r\n if (data.status.toLowerCase() === 'ok') {\r\n dialog.close();\r\n page.refresh();\r\n } else if (data.message.length > 0) {\r\n window.alert(data.message);\r\n return false;\r\n } else {\r\n dialog.close();\r\n page.refresh();\r\n }\r\n });\r\n }\r\n });\r\n}\r\n/**\r\n * @private\r\n * @function\r\n * @description Toggles the list of Orders\r\n */\r\nfunction toggleFullOrder() {\r\n $('.order-items')\r\n .find('li.hidden:first')\r\n .prev('li')\r\n .append('View All')\r\n .children('.toggle')\r\n .on(\"click\", function () {\r\n $(this).parent().siblings('li.hidden').show();\r\n $(this).remove();\r\n });\r\n}\r\n/**\r\n * @private\r\n * @function\r\n * @description Binds the events on the address form (edit, create, delete)\r\n */\r\nfunction initAddressEvents() {\r\n var addresses = $('#addresses');\r\n if (addresses.length === 0) {\r\n return;\r\n }\r\n\r\n addresses.on('click', '.address-edit, .address-create', function (e) {\r\n e.preventDefault();\r\n dialog.open({\r\n url: this.href,\r\n options: {\r\n open: initializeAddressForm\r\n }\r\n });\r\n }).on('click', '.delete', function (e) {\r\n e.preventDefault();\r\n if (window.confirm(String.format(Resources.CONFIRM_DELETE, Resources.TITLE_ADDRESS))) {\r\n $.ajax({\r\n url: util.appendParamToURL($(this).attr('href'), 'format', 'ajax'),\r\n dataType: 'json'\r\n }).done(function (data) {\r\n if (data.status.toLowerCase() === 'ok') {\r\n page.redirect(Urls.addressesList);\r\n } else if (data.message.length > 0) {\r\n window.alert(data.message);\r\n } else {\r\n page.refresh();\r\n }\r\n });\r\n }\r\n });\r\n}\r\n/**\r\n * @private\r\n * @function\r\n * @description Binds the events of the payment methods list (delete card)\r\n */\r\nfunction initPaymentEvents() {\r\n $('.hide-newcard').on('click', function () {\r\n $(this).closest('#b-newpaymentmethod').toggleClass(\"not-active\");\r\n });\r\n\r\n $('.add-card').on('click', function (e) {\r\n e.preventDefault();\r\n dialog.open({\r\n url: $(e.target).attr('href'),\r\n options: {\r\n open: initializePaymentForm\r\n }\r\n });\r\n });\r\n\r\n if ($(\"#CreditCardForm\").is(\":visible\")) {\r\n creditCardTypeDetector();\r\n validator.initForm('form[id$=\"CreditCardForm\"]');\r\n\r\n }\r\n\r\n $(document).on(\"click\", \".credit-card-create\", function (evt) {\r\n modal.events.onOpen(function () {\r\n creditCardTypeDetector();\r\n validator.initForm('form[id$=\"CreditCardForm\"]');\r\n creditCardValidator.init({\r\n wrapper: '.medium.add-credit-card form[id$=\"CreditCardForm\"]'\r\n });\r\n });\r\n modal.addCustomClass('medium add-credit-card')\r\n modal.renderByUrl(Urls.myaccountAddCreditCard);\r\n modal.setCallback(cardValidation.init);\r\n });\r\n\r\n $(document).on(\"submit\", \"div.add-credit-card #CreditCardForm\", function(evt) {\r\n evt.preventDefault();\r\n\r\n var $form = $(this);\r\n var $formDataError = $('.error-form');\r\n\r\n $.ajax({\r\n url: util.appendParamToURL($form.attr('action'), 'format', 'ajax'),\r\n data: $form.serialize() + '&' + $form.find('#applyBtn').attr('name') + '=x',\r\n type: 'POST'\r\n }).done(function(data) {\r\n if (!data) {\r\n $formDataError.html(Resources.BAD_RESPONSE);\r\n return false;\r\n }\r\n\r\n if (data.length) {\r\n modal.setContent(data);\r\n validator.init();\r\n creditCardValidator.init({\r\n wrapper: '.medium.add-credit-card form[id$=\"CreditCardForm\"]'\r\n });\r\n $('input[id*=\"newcreditcard_number\"]').val('');\r\n $('input[id*=\"newcreditcard_number\"]').focus();\r\n $('input[id*=\"newcreditcard_cvn\"]').val('');\r\n return;\r\n }\r\n\r\n if (!location.assign(Urls.paymentsList)) {\r\n window.location.href = Urls.paymentsList;\r\n }\r\n });\r\n });\r\n\r\n $('form.remove-card-form button.delete').on('click', function (e) {\r\n e.preventDefault();\r\n var $button = $(this);\r\n var $form = $button.closest('form.remove-card-form');\r\n var popup = new Foundation.Reveal($('#remove-card'));\r\n popup.open();\r\n\r\n //Yes button\r\n $(\".cardDelete-modal-btn-ok\").unbind();\r\n $(\".cardDelete-modal-btn-ok\").on(\"click\", function () {\r\n popup.close();\r\n\r\n $('').attr({\r\n type: 'hidden',\r\n name: $button.attr('name'),\r\n value: $button.attr('value') || 'delete card'\r\n }).appendTo($form);\r\n var data = $form.serialize();\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: $form.attr('action'),\r\n data: data\r\n })\r\n .done(function () {\r\n page.redirect(Urls.paymentsList);\r\n });\r\n });\r\n\r\n //No button\r\n $(\".cardDelete-modal-btn-cancel\").unbind();\r\n $(\".cardDelete-modal-btn-cancel\").on(\"click\", function () {\r\n popup.close();\r\n });\r\n });\r\n\r\n}\r\n\r\nfunction initializePaymentForm() {\r\n $('#CreditCardForm').on('click', '.cancel-button', function (e) {\r\n e.preventDefault();\r\n dialog.close();\r\n });\r\n}\r\n\r\nfunction mobileAccountMenu() {\r\n var pageContainer = $('#main');\r\n var primaryContent = $('#primary');\r\n var primaryContentHeight = $('#primary').outerHeight();\r\n var mobileNav = $('#secondary');\r\n var accountText = $('.account-text');\r\n var currentUrl = window.location.href;\r\n var cleanUrl = currentUrl.split('?')[0];\r\n\r\n $('.account-nav-asset a[href=\"' + cleanUrl + '\"]').addClass('active-menu');\r\n\r\n $('.account-nav-asset a').not('.accordion-title').on('click', function (e) {\r\n e.preventDefault();\r\n var url = $(this).attr('href');\r\n\r\n if (url != cleanUrl) {\r\n window.location = url;\r\n } else {\r\n mobileNav.css('min-height', primaryContentHeight);\r\n pageContainer.addClass('content-show');\r\n hideLastBreadcrumbForMyAccount(false);\r\n\r\n }\r\n });\r\n\r\n $('.back-to-account-btn a').on('click', function (e) {\r\n e.preventDefault();\r\n pageContainer.removeClass('content-show');\r\n mobileNav.css('min-height', 0);\r\n hideLastBreadcrumbForMyAccount(true);\r\n\r\n\r\n });\r\n}\r\n\r\n/*\r\n * To hide the last breadcrumb on mobile devices on My Account page as a part of UI change.\r\n * @param : hide ( Boolean )\r\n *\r\n * \"noAfter\" class is used to hide the >>(arrow) in breadcrumb.\r\n * It hides :after pseudo class.\r\n * Pseudo classes are not supported in JQuery or JS as they are not part of DOM.\r\n * So we added a css to hide the pseudos via adding a class.\r\n */\r\n\r\nfunction hideLastBreadcrumbForMyAccount(hide) {\r\n\r\n var breadCrumbs = ($(\".breadcrumb-element\").length > 0) ? $(\".breadcrumb-element\") : null;\r\n var secondLastBreadCrumb = 2; //Default set as 2 as per current length of breadcrumbs\r\n\r\n\r\n if (breadCrumbs === null) {\r\n return;\r\n } else {\r\n //If breadCrumb length increases in future\r\n secondLastBreadCrumb = breadCrumbs.length - 1;\r\n }\r\n\r\n if (hide) {\r\n $(\".breadcrumb-element:last\").hide();\r\n $(\".breadcrumb-element:nth-last-child(\" + secondLastBreadCrumb + \")\").addClass(\"noafter\");\r\n } else {\r\n $(\".breadcrumb-element:last\").show();\r\n $(\".breadcrumb-element:nth-last-child(\" + secondLastBreadCrumb + \")\").removeClass(\"noafter\");\r\n }\r\n}\r\n\r\n\r\n\r\nfunction registerAccountEvents() {\r\n // get the field elements\r\n var $gender = $('.registration-box #dwfrm_profile_customer_gender');\r\n var $newsletterCB = $('.registration-box #dwfrm_profile_customer_addtoemaillist');\r\n\r\n $gender.on('change', function (e) {\r\n $(this).closest('form').find('button[type=\"submit\"]').prop('disabled', false);\r\n });\r\n $newsletterCB.on('change', function (e) {\r\n $(this).closest('form').find('button[type=\"submit\"]').prop('disabled', false);\r\n });\r\n if ($('#registrationrecaptcha').length > 0) {\r\n util.renderGoogleInvRecaptcha('registrationrecaptcha', '#registrationSubmitButton', 'RegistrationForm');\r\n }\r\n\r\n}\r\n\r\n//Removes 'PO Box shipping is not available' caption from address1 field if preference is true\r\nfunction removePOBoxCaption() {\r\n\r\n if (SitePreferences.ENABLE_POBOX_ADDRESS) {\r\n var $addressOne = $('input[name$=\"_address1\"]');\r\n $addressOne.closest(\".form-row\").find(\".form-caption\").text('');\r\n var $addressTwo = $('input[name$=\"_address2\"]');\r\n $addressTwo.closest(\".form-row\").find(\".form-caption\").text('');\r\n }\r\n}\r\n\r\nfunction addressEvents() {\r\n $(document).on(\"click\", \".address-create\", function (evt) {\r\n modal.addCustomClass('edit-add-address');\r\n var _YubinBango = typeof (YubinBango) !== 'undefined' && YubinBango ? YubinBango : '';\r\n modal.events.onOpen(function () {\r\n // customaddress.init();\r\n if (_YubinBango) {\r\n new _YubinBango.MicroformatDom();\r\n }\r\n validator.initForm('form[id=\"EditAddressForm\"]');\r\n removePOBoxCaption();\r\n initCleanAutoFill.init();\r\n });\r\n\r\n modal.renderByUrl(Urls.checkoutAddAccountAddress);\r\n });\r\n\r\n $(document).on(\"click\", \".address-edit\", function (evt) {\r\n var element = document.getElementById(evt.currentTarget.id);\r\n var addressID = element.dataset.addressId;\r\n var url = Urls.checkoutEditAccountAddress + addressID;\r\n\r\n modal.setCallback(function () {\r\n initCleanAutoFill.init();\r\n });\r\n var _YubinBango = typeof (YubinBango) !== 'undefined' && YubinBango ? YubinBango : '';\r\n modal.events.onOpen(function () {\r\n if (_YubinBango) {\r\n new _YubinBango.MicroformatDom();\r\n }\r\n validator.initForm('form[id$=\"EditAddressForm\"]');\r\n removePOBoxCaption();\r\n });\r\n modal.addCustomClass('edit-add-address');\r\n modal.renderByUrl(url);\r\n });\r\n\r\n var href;\r\n $(document).on('click', '.address-delete', function (e) {\r\n e.preventDefault();\r\n href = $(this).attr('href');\r\n var popup = new Foundation.Reveal($('#remove-address'));\r\n popup.open();\r\n //No button\r\n $(\".addressDelete-modal-btn-cancel\").on(\"click\", function () {\r\n popup.close();\r\n });\r\n });\r\n\r\n //Yes button\r\n $(\".addressDelete-modal-btn-ok\").on(\"click\", function() {\r\n var data_json = {};\r\n\r\n if ($('#csrf_token') && $('#csrf_token').length === 1) {\r\n var csrfTokenVal = $('#csrf_token').val();\r\n var csrfTokenKey = $('#csrf_token').prop('name');\r\n data_json[csrfTokenKey] = csrfTokenVal;\r\n }\r\n $.ajax({\r\n type: 'POST',\r\n url: util.appendParamToURL(href, 'format', 'ajax'),\r\n dataType: 'json',\r\n data: data_json,\r\n }).done(function(data) {\r\n page.refresh();\r\n });\r\n });\r\n\r\n $(document).on('click', '.address-make-default', function (e) {\r\n e.preventDefault();\r\n var href = $(this).attr('href');\r\n var data_json = {};\r\n\r\n if ($('#csrf_token') && $('#csrf_token').length === 1) {\r\n var csrfTokenVal = $('#csrf_token').val();\r\n var csrfTokenKey = $('#csrf_token').prop('name');\r\n data_json[csrfTokenKey] = csrfTokenVal;\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: util.appendParamToURL(href, 'format', 'ajax'),\r\n data: data_json,\r\n }).done(function (data) {\r\n page.refresh();\r\n });\r\n });\r\n\r\n $(document).on(\"click\", \".show-hanatsubaki-modal\", function (e) {\r\n e.preventDefault();\r\n var $hanatsubakiContent = $(\"#hanatsubaki-modal\");\r\n modal.addCustomClass('normal-modal');\r\n modal.renderContent($hanatsubakiContent.html());\r\n });\r\n}\r\n\r\nfunction enableCountryField(status) {\r\n var countryField = $('select[id$=\"billing_billingAddress_addressFields_country\"]');\r\n if (status) {\r\n countryField.prop('disabled', false);\r\n } else {\r\n countryField.prop('disabled', true);\r\n }\r\n}\r\n\r\nfunction initContactUs() {\r\n var registrationForm = $('form#ContactUSForm');\r\n\r\n $(document).on('click', 'button#sendBtn', function (e) {\r\n e.preventDefault();\r\n $.ajax({\r\n url: util.appendParamToURL(Urls.customerServiceSubmit, 'format', 'ajax'),\r\n data: registrationForm.serialize(),\r\n method: 'POST'\r\n })\r\n .done(function (response) {\r\n if (response.status) {\r\n var popup = new Foundation.Reveal($('#customer-contact-us-modal'));\r\n //Window height minus 80px, which sets the modal to fit inside the device's screen\r\n var windowHeight = window.innerHeight - 130;\r\n\r\n popup.$element.children('.modal-body').css('max-height', windowHeight);\r\n popup.open();\r\n $(document).trigger(\"gtmcontactus\");\r\n clearContactUsForm(response.status);\r\n registrationForm[0].reset();\r\n } else if (response.status == false) {\r\n clearContactUsForm(response.status);\r\n } else {\r\n clearContactUsForm(response.status);\r\n }\r\n });\r\n });\r\n /**\r\n * Re-validate contact us form when country is changed\r\n */\r\n registrationForm.find('select.country').change(function() {\r\n registrationForm.find('.form-row.required').find('input, select, textarea').blur();\r\n });\r\n}\r\n\r\n/**\r\n * Clear contact us form\r\n */\r\nfunction clearContactUsForm(status) {\r\n let widgetOpt = util.getGoogleRecaptchaWidgetOptionNum('ContactUSForm');\r\n if (util.getGoogleRecaptchaEnableStatus('ContactUSForm') == true && widgetOpt != undefined) {\r\n util.resettingGoogleInvRecaptcha(widgetOpt, 'ContactUSForm');\r\n }\r\n if (status !== undefined && status !== null && status) {\r\n $('.error-form.gicErrorMessage').hide();\r\n $('input[name$=\"_contactus_firstname\"]').val('');\r\n $('input[name$=\"_contactus_lastname\"]').val('');\r\n $('input[name$=\"_contactus_email\"]').val('');\r\n $('input[name$=\"_contactus_phone\"]').val('');\r\n $('input[name$=\"_contactus_ordernumber\"]').val('');\r\n $('textarea[name$=\"_contactus_comment\"]').val('');\r\n //$('form#RegistrationForm button[type=\"submit\"]').prop('disabled', true);\r\n } else if (status !== undefined && status !== null && status == false) {\r\n $('.error-form.gicErrorMessage').attr('style', 'display: block !important');\r\n } else {\r\n $('.error-form.gicErrorMessage').hide();\r\n }\r\n}\r\n\r\nfunction enableDisableSubmitButton(el) {\r\n var $saveBtn = $(el).closest('form').find('button[type=\"submit\"]');\r\n\r\n var hasError = $saveBtn.closest('form').find('span.error');\r\n if (hasError.length) {\r\n // $saveBtn.prop('disabled', true);\r\n } else {\r\n $saveBtn.prop('disabled', false);\r\n }\r\n}\r\n\r\nfunction setGender() {\r\n var gender = $('.gender select').data('gender');\r\n\r\n $('.gender select').val(gender);\r\n}\r\n\r\nfunction getBirthday(birthmonth, dob, birthyear) {\r\n var birthday = [\r\n birthmonth,\r\n '/',\r\n dob,\r\n '/',\r\n birthyear\r\n ].join('');\r\n\r\n if (birthday === '00/00/' || birthday === '0/0/') {\r\n birthday = '';\r\n\r\n $('.birthmonth select').val('00');\r\n $('.dob select').val('00');\r\n }\r\n\r\n $('.birthday input').val(birthday);\r\n}\r\n\r\nfunction setBirthday() {\r\n var birthmonth = ('0' + $('.birthmonth select').data('birthmonth')).slice(-2) || Number('00');\r\n var dob = ('0' + $('.dob select').data('dob')).slice(-2) || Number('00');\r\n var birthyear = $('.birthyear input').data('birthyear');\r\n\r\n $('.birthmonth select').val(birthmonth);\r\n $('.dob select').val(dob);\r\n $('.birthyear input').val(birthyear);\r\n\r\n getBirthday(birthmonth, dob, birthyear);\r\n}\r\n\r\nfunction setNewBirthday(birthmonth, dob, birthyear) {\r\n var monthField = $('.birthmonth select');\r\n var dayField = $('.dob select');\r\n var yearField = $('.birthyear input');\r\n\r\n var month = ~~birthmonth ? birthmonth : '';\r\n var day = ~~dob ? dob : '';\r\n var year = ~~birthyear ? birthyear : '';\r\n\r\n monthField.siblings('.error').remove();\r\n monthField.removeClass('-error-pad');\r\n dayField.removeClass('-error-pad');\r\n yearField.removeClass('-error-pad');\r\n\r\n if (month || day || year) {\r\n var now = new Date();\r\n var birthday = new Date(birthyear, birthmonth - 1, dob, 0, 0, 0, 0);\r\n var dateRegex = /^(?=\\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\\x20|$))|(?:2[0-8]|1\\d|0?[1-9]))([-.\\/])(?:1[012]|0?[1-9])\\1(?:1[6-9]|[2-9]\\d)?\\d\\d(?:(?=\\x20\\d)\\x20|$))?(((0?[1-9]|1[012])(:[0-5]\\d){0,2}(\\x20[AP]M))|([01]\\d|2[0-3])(:[0-5]\\d){1,2})?$/;\r\n var formattedDate = [day, '-', month, '-', year].join('');\r\n var validDate = dateRegex.test(formattedDate);\r\n\r\n if (!month.match(/^[\\d]{1,2}$/) ||\r\n !day.match(/^[\\d]{1,2}$/) ||\r\n !year.match(/^[\\d]{4}$/) ||\r\n !birthday.getTime() ||\r\n now.getTime() <= birthday.getTime() ||\r\n !validDate) {\r\n\r\n $('' + Resources.INVALID_BIRTHDAY + '').insertBefore(monthField);\r\n monthField.addClass('-error-pad');\r\n dayField.addClass('-error-pad');\r\n yearField.addClass('-error-pad');\r\n }\r\n }\r\n\r\n getBirthday(birthmonth, dob, birthyear);\r\n\r\n var hasError = $('#profile-save-changes').closest('form').find('span.error');\r\n\r\n if (hasError.length) {\r\n $('#profile-save-changes').prop('disabled', true);\r\n } else {\r\n $('#profile-save-changes').prop('disabled', false);\r\n }\r\n}\r\n\r\nfunction updateBirthday() {\r\n var birthday = $('.birthday input').val();\r\n var birthmonth = $('.birthmonth select').val();\r\n var dob = $('.dob select').val();\r\n var birthyear = $('.birthyear input').val();\r\n\r\n $('.birthmonth select').on(\"change\", function () {\r\n birthmonth = $(this).val();\r\n setNewBirthday(birthmonth, dob, birthyear);\r\n });\r\n\r\n $('.dob select').on(\"change\", function () {\r\n dob = $(this).val();\r\n setNewBirthday(birthmonth, dob, birthyear);\r\n });\r\n\r\n $('.birthyear input').on('keydown blur', function () {\r\n birthyear = $(this).val();\r\n\r\n setNewBirthday(birthmonth, dob, birthyear);\r\n })\r\n}\r\n\r\nfunction creditCardTypeDetector(options) {\r\n\r\n // the regular expressions check for possible matches as you type, hence the OR operators based on the number of chars\r\n // Visa\r\n var visa_regex = new RegExp('^4[0-9]{0,15}$'),\r\n\r\n // MasterCard\r\n mastercard_regex = new RegExp('^5$|^5[1-5][0-9]{0,14}$'),\r\n\r\n // American Express\r\n amex_regex = new RegExp('^3$|^3[47][0-9]{0,13}$'),\r\n\r\n //Discover\r\n discover_regex = new RegExp('^6[05]$|^601[1]?$|^65[0-9][0-9]?$|^6(?:011|5[0-9]{2})[0-9]{0,12}$'),\r\n\r\n //JCB\r\n unionpay_regex = new RegExp('^62[0-9]{0,14}$|^645[0-9]{0,13}$|^65[0-9]{0,14}$');\r\n\r\n $('.cc-number input').focusout(function (e) {\r\n var cur_val = $(this).val();\r\n\r\n //Commenting this out since the event is handled on focusout\r\n // if ( cur_val.length == 16 ) {\r\n // e.preventDefault();\r\n // return;\r\n // }\r\n\r\n var $ccNumberContain = $(this).parents('.cc-number');\r\n\r\n // get rid of spaces and dashes before using the regular expression\r\n cur_val = cur_val.replace(/ /g, '').replace(/-/g, '');\r\n\r\n var $creditCard = $('[data-method=\"CREDIT_CARD\"]');\r\n\r\n // checks per each, as their could be multiple hits\r\n if (cur_val.match(visa_regex)) {\r\n $ccNumberContain.addClass('is_visa');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Visa\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_visa');\r\n }\r\n\r\n if (cur_val.match(mastercard_regex)) {\r\n $ccNumberContain.addClass('is_mastercard');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"MasterCard\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_mastercard');\r\n }\r\n\r\n if (cur_val.match(amex_regex)) {\r\n $ccNumberContain.addClass('is_amex');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Amex\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_amex');\r\n }\r\n\r\n if (cur_val.match(discover_regex)) {\r\n $ccNumberContain.addClass('is_discover');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Discover\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_discover');\r\n }\r\n\r\n if (cur_val.match(unionpay_regex)) {\r\n $ccNumberContain.addClass('is_unionpay');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Union\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_unionpay');\r\n }\r\n\r\n // if nothing is a hit we add a class to fade them all out\r\n if (cur_val != '' && !cur_val.match(visa_regex) && !cur_val.match(mastercard_regex) &&\r\n !cur_val.match(amex_regex) && !cur_val.match(discover_regex) && !cur_val.match(unionpay_regex)) {\r\n $ccNumberContain.addClass('is_nothing');\r\n } else {\r\n $ccNumberContain.removeClass('is_nothing');\r\n }\r\n });\r\n\r\n};\r\n\r\nfunction scrollToPasswordChange() {\r\n if ($('.b-password-change .password-changed').length > 0) {\r\n $('.account-left-nav .active-menu').trigger(\"click\");\r\n $([document.documentElement, document.body]).animate({\r\n scrollTop: $(\"#ChangePasswordForm\").offset().top\r\n }, 800);\r\n }\r\n}\r\n\r\nfunction showPopupDetail() {\r\n $(document).on('click', '.js_giftproductdetail' , function(e) {\r\n e.preventDefault();\r\n\r\n var url = Urls.productExchangeDetail;\r\n url = util.appendParamToURL(url, 'format', 'ajax');\r\n var pid = $(this).data('pid');\r\n var originURL = location.href;\r\n var data = {\r\n pid: pid,\r\n originURL: originURL\r\n };\r\n\r\n $.ajax({\r\n type: 'GET',\r\n url: url,\r\n dataType: 'html',\r\n data: data,\r\n success: function (response) {\r\n if (typeof response === 'object' && !response.isUserAuthenticated) {\r\n var redirectURL = response.redirectURL;\r\n location.href = redirectURL;\r\n } else if (typeof response === 'string') {\r\n modal.addCustomClass('normal-modal giftproductdetail-modal');\r\n modal.renderContent(response);\r\n }\r\n },\r\n failure: function () {\r\n modal.addCustomClass('normal-modal');\r\n modal.renderContent(Resources.SERVER_ERROR);\r\n }\r\n });\r\n });\r\n}\r\n\r\nfunction hidePersonalNumberForOverseasCustomer () {\r\n $(document).on('change', 'select[id$=\"_addressFields_country\"]' , function() {\r\n var countryCode = $(this).val();\r\n var personalNumberElement = $('div.personal-number');\r\n countryCode.toUpperCase() === 'JP' ? personalNumberElement.addClass('hidden') : personalNumberElement.removeClass('hidden');\r\n })\r\n $('select[id$=\"_addressFields_country\"]').trigger('change');\r\n}\r\n\r\nfunction unsubscribe() {\r\n var questionnaire = $('input[name$=\"_unsubscribe_questionnaire\"]').val();\r\n var reasonConfirm = $('.unsubscribe-confirm').find('.reason-confirm');\r\n\r\n $('input[name$=\"questionnaire[]\"]').each(function() {\r\n $(this).on('change', function () {\r\n setValueQuestionnaireToHiddenField();\r\n var questionnaireToValidate = $('input[name$=\"_unsubscribe_questionnaire\"]').val();\r\n if (questionnaireToValidate) {\r\n reasonConfirm.addClass('hidden');\r\n } else {\r\n reasonConfirm.removeClass('hidden');\r\n }\r\n });\r\n });\r\n\r\n if (questionnaire) {\r\n $('input[name$=\"questionnaire[]\"]').each(function() {\r\n if (questionnaire.indexOf($(this).val()) > -1) {\r\n $(this).prop('checked', true).attr('checked', true);\r\n }\r\n });\r\n }\r\n\r\n function setValueQuestionnaireToHiddenField() {\r\n var currentQuestionnaire = [];\r\n var questionnaireElement = $('input[name$=\"_unsubscribe_questionnaire\"]');\r\n var questionnaireField = $('.questionnaire-field');\r\n\r\n $('input:checked[name$=\"questionnaire[]\"]').each(function () {\r\n currentQuestionnaire.push($(this).val());\r\n });\r\n\r\n if (questionnaireField.find(questionnaireElement).is(':checked').length === 0) {\r\n currentQuestionnaire = [];\r\n }\r\n\r\n questionnaireElement.val(currentQuestionnaire.join(','));\r\n };\r\n\r\n $('.unsubscribe-confirm').on('click', '.btn-unsubscribe-popup', function(e) {\r\n e.preventDefault();\r\n setValueQuestionnaireToHiddenField();\r\n if ($('input[name$=\"_unsubscribe_questionnaire\"]').val()) {\r\n reasonConfirm.addClass('hidden');\r\n modal.renderByUrl(Urls.unsubscribePopup);\r\n } else {\r\n reasonConfirm.removeClass('hidden');\r\n }\r\n });\r\n\r\n $(document).on('click', '.unsubscribe-popup #close-cancel-confirm', function(e){\r\n e.preventDefault();\r\n dialog.close();\r\n });\r\n}\r\n\r\nfunction handlePaymentList () {\r\n function setValueSecretToHiddenField(cardSeq, deleteUrl, typeCard, nameCard, expired) {\r\n var $form = $('.payment.payment-popup').find('form');\r\n $form.find('input[name=\"cardSeq\"]').val(cardSeq);\r\n $form.find('.type-card').text(typeCard);\r\n $form.find('.name-card').text(nameCard);\r\n $form.find('.expired-card').text(expired);\r\n $form.attr(\"action\", deleteUrl);\r\n };\r\n\r\n $('.account-edit').on('click','button.delete', function (e) {\r\n e.preventDefault();\r\n var $form = $(this).parent('form');\r\n var cardSeq = $form.find('input[name=\"cardSeq\"]').val();\r\n var actionUrl = $(this).closest('form').attr('action');\r\n var deleteUrl = actionUrl + '?page=EditProfile';\r\n var $info = $(this).closest('.creditcard-tile-inner').find('.cc-details');\r\n var typeCard = $info.find('.cc-number').text();\r\n var nameCard = $info.find('.cc-owner').text();\r\n var expired = $info.find('.cc-exp').text();\r\n var ajaxUrl = Urls.confirmDeleteCardPopup;\r\n\r\n $.ajax({\r\n url: ajaxUrl,\r\n method: 'GET',\r\n dataType: 'html'\r\n }).done (function (data) {\r\n modal.events.onOpen(function() {\r\n setValueSecretToHiddenField(cardSeq, deleteUrl, typeCard, nameCard, expired);\r\n })\r\n modal.addCustomClass('normal-modal remove-card');\r\n modal.renderContent(data);\r\n });\r\n return;\r\n\r\n });\r\n $(document).on('click', '#submit-delete-card', function(e){\r\n e.preventDefault();\r\n var applyName = $(this).attr('name');\r\n var data = $('.payment.payment-popup').find('form').serialize();\r\n\r\n var ajaxUrl = Urls.confirmDeleteCard;\r\n $.ajax({\r\n type: 'POST',\r\n data: data + '&' + applyName + '=x',\r\n url: util.appendParamToURL(ajaxUrl, 'format', 'ajax')\r\n })\r\n .done(function (result) {\r\n if('OK' == result.status){\r\n $('.remove-card').foundation('close');\r\n page.refresh();\r\n } else {\r\n $('.error-message').text(result.message);\r\n $('.error-message').removeClass('hide');\r\n return;\r\n }\r\n })\r\n .error(function (result) {\r\n $('.remove-card').foundation('close');\r\n page.refresh();\r\n })\r\n });\r\n\r\n $(document).on('click', '#close-cancel-confirm', function(e){\r\n e.preventDefault();\r\n $('.remove-card').foundation('close');\r\n });\r\n\r\n creditCardValidator.init({\r\n wrapper: '#wrapper .account-edit form[id$=\"CreditCardForm\"]'\r\n });\r\n}\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Binds the events of the order, address and payment pages\r\n */\r\nfunction initializeEvents() {\r\n cardValidation.init();\r\n // customaddress.init();\r\n toggleFullOrder();\r\n //initAddressEvents();\r\n initPaymentEvents();\r\n login.init();\r\n accountSelectDate.init();\r\n accountPersonalData.init();\r\n registerAccountEvents();\r\n addressEvents();\r\n initContactUs();\r\n mobileAccountMenu();\r\n setGender();\r\n setBirthday();\r\n updateBirthday();\r\n search.viewMore();\r\n scrollToPasswordChange();\r\n showPopupDetail();\r\n unsubscribe();\r\n handlePaymentList();\r\n initCleanAutoFill.init();\r\n hidePersonalNumberForOverseasCustomer();\r\n}\r\n\r\n\r\nvar account = {\r\n init: function () {\r\n initializeEvents();\r\n giftcert.init();\r\n },\r\n initCartLogin: function () {\r\n login.init();\r\n },\r\n initMobileMenu: function () {\r\n mobileAccountMenu();\r\n }\r\n};\r\n\r\nmodule.exports = account;\n},{\"../account-select-date\":1,\"../account-validate-dob\":2,\"../address-book\":3,\"../credit-card-validator\":15,\"../dialog\":16,\"../giftcert\":21,\"../login\":26,\"../modal\":28,\"../page\":31,\"../tooltip\":86,\"../util\":87,\"../validator\":88,\"./checkout/card-validation\":37,\"./customaddress\":45,\"./search\":59}],33:[function(require,module,exports){\n'use strict';\r\n\r\nvar account = require('./account'),\r\n bonusProductsView = require('../bonus-products-view'),\r\n quickview = require('../quickview'),\r\n images = require('./product/image'),\r\n variant = require('./product/variant'),\r\n giftShipping = require('./checkout/shipping'),\r\n recommendations = require('./product/recommendations'),\r\n cartStoreInventory = require('../storeinventory/cart'),\r\n modal = require('../modal').global,\r\n samples = require('../samples'),\r\n giftCert = require('../giftcert-modal'),\r\n login = require('./checkout/login'),\r\n util = require('../util');\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Binds events to the cart page (edit item's details, bonus item's actions, coupon code entry)\r\n */\r\nfunction initializeEvents() {\r\n $('#cart-table').on('click', '.item-edit-details a', function (e) {\r\n e.preventDefault();\r\n quickview.show({\r\n url: e.target.href,\r\n source: 'cart',\r\n callback: function() {\r\n variant();\r\n renderThumbnails();\r\n }\r\n });\r\n })\r\n .on('click', '.bonus-item-actions a, .item-details .bonusproducts a', function (e) {\r\n e.preventDefault();\r\n bonusProductsView.show(this.href);\r\n });\r\n\r\n // override enter key for coupon code entry\r\n $('input[name$=\"_couponCode\"]').on('keydown', function (e) {\r\n if (e.which === 13 && $(this).val().length === 0) { return false; }\r\n });\r\n\r\n //to prevent multiple submissions of the form when removing a product from the cart\r\n var removeItemEvent = false;\r\n $('button[name$=\"deleteProduct\"]').on('click', function (e) {\r\n if (removeItemEvent) {\r\n e.preventDefault();\r\n } else {\r\n removeItemEvent = true;\r\n }\r\n });\r\n\r\n\r\n // product level bonus modal\r\n $('div.bonus-item-promo').on('click', 'a.select-bonus', function (e) {\r\n e.preventDefault();\r\n\r\n var urlToRender = $(this).attr('href');\r\n if (urlToRender) {\r\n modal.addCustomClass('bonus-item-modal');\r\n modal.renderByUrl(urlToRender);\r\n }\r\n });\r\n\r\n $(document).on('click', 'a#selectsample', function(e){\r\n samples.showSelectionInCart();\r\n })\r\n .on('click', 'a#pointexchangeproduct', function(){\r\n samples.showPointExchangeInCart();\r\n })\r\n .on('click', '.paypal-container a', function(e) {\r\n e.preventDefault();\r\n\r\n var cartCheckoutForm = $('.cart-action-checkout');\r\n if (cartCheckoutForm.length > 0) {\r\n cartCheckoutForm.attr('action', Urls.cartPaypalCheckout);\r\n cartCheckoutForm.trigger(\"submit\");\r\n }\r\n });\r\n \r\n // Add to Wishlist and Add to Gift Registry links behaviors\r\n $(document.body).on('click', '.save-for-later-cart', function () {\r\n \tif( $('.pdpForm:visible').length > 0 ){\r\n \t\tvar data = util.getQueryStringParams($('.pdpForm').serialize());\r\n \t\tvar url = util.appendParamsToUrl(this.href, data);\r\n \t}else{\r\n \t\tvar data = $(this).parents(\".quantity-column\").find(\".quantity-select\").val();\r\n \t var url = util.appendParamToURL(this.href, \"Quantity\", data);\r\n \t}\r\n\r\n \tthis.setAttribute('href', url);\r\n });\r\n}\r\n\r\nfunction renderThumbnails(){\r\n if($('#thumbnails').length > 0){\r\n $('#thumbnails').empty(); // clear the list\r\n images(); // populate the thumbnails\r\n }\r\n};\r\n\r\nfunction isGift () {\r\n var isGift = (sessionStorage.getItem('isGift') === 'true');\r\n var isGiftName = [\r\n $('#cart-items-form').attr('name'),\r\n 'isGift'\r\n ].join('_');\r\n\r\n $('#checkout-form .is-gift').val(isGift);\r\n $('#checkout-form .is-gift').attr('name', isGiftName);\r\n $('.gift-container .input-checkbox').attr('checked', isGift);\r\n $('.gift-container .input-checkbox').on(\"change\", function () {\r\n isGift = $(this).is(':checked');\r\n\r\n if (!isGift) {\r\n $('.gift-container .input-textarea').val('');\r\n $('#checkout-form .gift-message').val('');\r\n $('#checkout-form button').prop('disabled', false);// Added by ADe to enable Checkout button\r\n $('.third-party-container').css('opacity',1);\r\n $('.third-party-container').css('pointer-events','all');\r\n //Ade\r\n if ($('.gift-message-textarea span.error:visible').length > 0) {\r\n $('.gift-message-textarea span.error').remove();\r\n }\r\n sessionStorage.removeItem('isGift');\r\n sessionStorage.removeItem('giftMessage');\r\n } else {\r\n $('.gift-container .input-textarea').trigger(\"keyup\");\r\n sessionStorage.setItem('isGift', isGift);\r\n }\r\n\r\n $('#checkout-form .is-gift').val(isGift);\r\n });\r\n}\r\n\r\nfunction giftMessage () {\r\n var giftMessage = sessionStorage.getItem('giftMessage') ? sessionStorage.getItem('giftMessage') : '';\r\n var giftMessageName = [\r\n $('#cart-items-form').attr('name'),\r\n 'giftMessage'\r\n ].join('_');\r\n\r\n $('#checkout-form .gift-message').val(giftMessage);\r\n $('#checkout-form .gift-message').attr('name', giftMessageName);\r\n $('.gift-container .input-textarea').val(giftMessage);\r\n $('.gift-container .input-textarea').on('keyup', function () {\r\n giftMessage = $(this).val().trim();\r\n\r\n if (giftMessage === '' || util.validateMessage(giftMessage)) {\r\n $('#checkout-form .gift-message').val(giftMessage);\r\n $('.gift-message-textarea .form-caption').removeClass('error-message');\r\n $('.gift-message-textarea .form-caption').empty();\r\n $('#checkout-form button').prop('disabled', false);\r\n $('.third-party-container').css('opacity',1);\r\n $('.third-party-container').css('pointer-events','all');\r\n sessionStorage.setItem('giftMessage', giftMessage);\r\n } else {\r\n $('.gift-message-textarea .form-caption').addClass('error-message');\r\n $('.gift-message-textarea .form-caption').text('Invalid message');\r\n $('#checkout-form button').prop('disabled', true);\r\n $('.third-party-container').css('opacity',0.5);\r\n $('.third-party-container').css('pointer-events','none');\r\n }\r\n });\r\n}\r\n\r\nfunction couponCodeEvent () {\r\n $('.cart-coupon-code input').on('keydown', function (e) {\r\n if (e.which === 13) {\r\n e.preventDefault();\r\n $('#add-coupon').on(\"click\");\r\n }\r\n })\r\n}\r\n\r\nfunction updateCart () {\r\n $('.item-quantity select').on(\"change\", function () {\r\n $('#cart-items-form').trigger(\"submit\");\r\n });\r\n}\r\n\r\nfunction cartCount () {\r\n if ($('.cart-empty').length) {\r\n sessionStorage.removeItem('isGift');\r\n sessionStorage.removeItem('giftMessage');\r\n }\r\n}\r\n\r\nexports.init = function () {\r\n login.init();\r\n initializeEvents();\r\n recommendations();\r\n isGift();\r\n giftMessage();\r\n updateCart();\r\n couponCodeEvent();\r\n cartCount();\r\n giftShipping.init();\r\n giftCert.init();\r\n\r\n if (SitePreferences.STORE_PICKUP) {\r\n cartStoreInventory.init();\r\n }\r\n\r\n account.initCartLogin();\r\n};\r\n\n},{\"../bonus-products-view\":9,\"../giftcert-modal\":20,\"../modal\":28,\"../quickview\":77,\"../samples\":79,\"../storeinventory/cart\":82,\"../util\":87,\"./account\":32,\"./checkout/login\":40,\"./checkout/shipping\":42,\"./product/image\":51,\"./product/recommendations\":54,\"./product/variant\":56}],34:[function(require,module,exports){\n'use strict';\r\n\r\nvar formPrepare = require('./checkout/formPrepare'),\r\n\tvalidator = require('../validator');\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Validates if check order form is filled out before enabling button\r\n */\r\nfunction initializeEvents() {\r\n\tvalidator.initForm('form[id$=\"ordertrack\"]');\r\n}\r\n\r\nexports.init = function () {\r\n initializeEvents();\r\n\r\n}\r\n\n},{\"../validator\":88,\"./checkout/formPrepare\":38}],35:[function(require,module,exports){\n'use strict';\r\n\r\nvar util = require('../../util');\r\nvar shipping = require('./shipping');\r\n\r\n/**\r\n * @function\r\n * @description Selects the first address from the list of addresses\r\n */\r\nexports.init = function () {\r\n var $form = $('.address');\r\n // select address from list\r\n $('select[name$=\"_addressList\"]', $form).on('change', function () {\r\n var selected = $(this).children(':selected').first();\r\n var selectedAddress = $(selected).data('address');\r\n if (!selectedAddress) { return; }\r\n util.fillAddressFields(selectedAddress, $form);\r\n shipping.updateShippingMethodList();\r\n // re-validate the form\r\n $form.validate().form();\r\n });\r\n};\r\n\n},{\"../../util\":87,\"./shipping\":42}],36:[function(require,module,exports){\n'use strict';\r\n\r\nvar ajax = require('../../ajax'),\r\n formPrepare = require('./formPrepare'),\r\n progress = require('../../progress'),\r\n giftcard = require('../../giftcard'),\r\n util = require('../../util'),\r\n page = require('../../page'),\r\n modal = require('../../modal').global,\r\n cardValidation = require('./card-validation'),\r\n validator = require('../../validator'),\r\n creditCardValidator = require('../../credit-card-validator'),\r\n customaddress = require('../customaddress'),\r\n initCleanAutoFill = require('../../address-book');\r\n\r\nvar $cache;\r\n\r\n/**\r\n * @function\r\n * @description Changes the payment method form depending on the passed paymentMethodID\r\n * @param {String} paymentMethodID the ID of the payment method, to which the payment method form should be changed to\r\n */\r\nfunction updatePaymentMethod(paymentMethodID) {\r\n var $paymentMethods = $('.payment-method');\r\n //$paymentMethods.removeClass('payment-method-expanded');\r\n\r\n var dataMethod = paymentMethodID;\r\n if (paymentMethodID == 'SA_SILENTPOST') {\r\n dataMethod = 'CREDIT_CARD';\r\n }\r\n\r\n var $selectedPaymentMethod = $paymentMethods.filter('[data-method=\"' + dataMethod + '\"]');\r\n if ($selectedPaymentMethod.length === 0) {\r\n $selectedPaymentMethod = $('[data-method=\"Custom\"]');\r\n }\r\n\r\n if (paymentMethodID == \"VISA_CHECKOUT\") {\r\n $(\".continue-place-order\").hide();\r\n $(\".visacheckoutbutton\").show();\r\n } else if (paymentMethodID == \"PAYPAL\" || paymentMethodID == \"PAYPAL_CREDIT\") {\r\n $(\"#billingAgreementCheckbox\").attr('checked', false);\r\n $(\".continue-place-order\").hide();\r\n } else if (paymentMethodID == \"AFTERPAY_PBI\" || paymentMethodID == \"GMO_PAYMENT_ALIPAY\" || paymentMethodID == \"GMO_PAYMENT_UNION\" || paymentMethodID == \"NO_PAYMENT\" || paymentMethodID==\"GMO_PAYMENT_CVS\") {\r\n if ($(\"#dwfrm_billing\").length > 0) {\r\n $(\"#dwfrm_billing\").validate().resetForm();\r\n if ($(\"#dwfrm_billing\").validate().numberOfInvalids() > 0) {\r\n $(\"#dwfrm_billing\").validate().invalid = {};\r\n }\r\n $('select[name*=\"dwfrm_billing_paymentMethods_creditCard\"],input[name*=\"dwfrm_billing_paymentMethods_creditCard\"]').addClass(\"ignore\");\r\n $('.creditcard-tile').removeClass('selected')\r\n }\r\n } else if (paymentMethodID == \"CREDIT_CARD\") {\r\n $('select[name*=\"dwfrm_billing_paymentMethods_creditCard\"],input[name*=\"dwfrm_billing_paymentMethods_creditCard\"]').removeClass(\"ignore\");\r\n if ($(\"#dwfrm_billing\").length > 0)\r\n $(\"#dwfrm_billing\").validate().resetForm();\r\n } else {\r\n $(\".continue-place-order\").show();\r\n $(\".visacheckoutbutton\").hide();\r\n }\r\n\r\n if (paymentMethodID == \"CREDIT_CARD\" || paymentMethodID == \"SA_SILENTPOST\") {\r\n $(\".spsavecard\").show();\r\n } else if ((paymentMethodID == \"SA_REDIRECT\" || paymentMethodID == \"SA_IFRAME\") && SitePreferences.TOKENIZATION_ENABLED) {\r\n $(\".spsavecard\").show();\r\n } else {\r\n $(\".spsavecard\").hide();\r\n }\r\n\r\n //$selectedPaymentMethod.addClass('payment-method-expanded');\r\n\r\n // ensure checkbox of payment method is checked\r\n $('input[name$=\"_selectedPaymentMethodID\"]').prop('checked', false);\r\n $('input[value=' + paymentMethodID + ']').prop('checked', 'checked');\r\n //$('input[name$=\"_selectedPaymentMethodID\"]').val(paymentMethodID);\r\n\r\n}\r\n\r\nfunction creditCardTypeDetector(options) {\r\n\r\n // the regular expressions check for possible matches as you type, hence the OR operators based on the number of chars\r\n // Visa\r\n var visa_regex = new RegExp('^4[0-9]{0,15}$'),\r\n\r\n // MasterCard\r\n mastercard_regex = new RegExp('^5$|^5[1-5][0-9]{0,14}$'),\r\n\r\n // American Express\r\n amex_regex = new RegExp('^3$|^3[47][0-9]{0,13}$'),\r\n\r\n //Discover\r\n discover_regex = new RegExp('^6[05]$|^601[1]?$|^65[0-9][0-9]?$|^6(?:011|5[0-9]{2})[0-9]{0,12}$'),\r\n\r\n //JCB\r\n unionpay_regex = new RegExp('^62[0-9]{0,14}$|^645[0-9]{0,13}$|^65[0-9]{0,14}$');\r\n\r\n $('.cc-number input').focusout(function(e) {\r\n var cur_val = $(this).val();\r\n\r\n //Commenting this out since the event is handled on focusout\r\n // if ( cur_val.length == 16 ) {\r\n // e.preventDefault();\r\n // return;\r\n // }\r\n var $ccNumberContain = $(this).parents('.cc-number');\r\n\r\n var piCardType = '';\r\n // get rid of spaces and dashes before using the regular expression\r\n cur_val = cur_val.replace(/ /g, '').replace(/-/g, '');\r\n\r\n var $creditCard = $('[data-method=\"CREDIT_CARD\"]');\r\n\r\n // checks per each, as their could be multiple hits\r\n if (cur_val.match(visa_regex)) {\r\n piCardType = 'visa';\r\n $ccNumberContain.addClass('is_visa');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Visa\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_visa');\r\n }\r\n\r\n if (cur_val.match(mastercard_regex)) {\r\n piCardType = 'mastercard';\r\n $ccNumberContain.addClass('is_mastercard');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"MasterCard\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_mastercard');\r\n }\r\n\r\n if (cur_val.match(amex_regex)) {\r\n piCardType = 'amex';\r\n $ccNumberContain.addClass('is_amex');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Amex\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_amex');\r\n }\r\n\r\n if (cur_val.match(discover_regex)) {\r\n piCardType = 'discover';\r\n $ccNumberContain.addClass('is_discover');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Discover\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_discover');\r\n }\r\n\r\n if (cur_val.match(unionpay_regex)) {\r\n piCardType = 'unionpay';\r\n $ccNumberContain.addClass('is_unionpay');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Union\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_unionpay');\r\n }\r\n\r\n // if nothing is a hit we add a class to fade them all out\r\n if (cur_val != '' && !cur_val.match(visa_regex) && !cur_val.match(mastercard_regex) &&\r\n !cur_val.match(amex_regex) && !cur_val.match(discover_regex) && !cur_val.match(unionpay_regex)) {\r\n $ccNumberContain.addClass('is_nothing');\r\n } else {\r\n $ccNumberContain.removeClass('is_nothing');\r\n }\r\n });\r\n\r\n};\r\n\r\nfunction checkGiftCert() {\r\n var $balance = $('div#gift-card-balance-form .balance');\r\n var $error = $('div#gift-card-balance-form .balance-error');\r\n var $giftCode = $('div#gift-card-balance-form input[name$=\"_giftCertCode\"]');\r\n var $giftPin = $('div#gift-card-balance-form input[name$=\"_giftCertPIN\"]');\r\n\r\n $error.html('');\r\n $balance.html('');\r\n if ($giftCode.val().length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_INVALID);\r\n return;\r\n } else if ($giftCode.val().length !== 0 && $giftPin.val().length === 0) {\r\n $error.html(Resources.GIFT_CARD_PIN_INVALID);\r\n return;\r\n } else if ($giftCode.val().length === 0 && $giftPin.val().length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_PIN_INVALID);\r\n return;\r\n }\r\n\r\n giftcard.checkBalance($giftCode.val(), $giftPin.val(), function(data) {\r\n if (data && data.error) {\r\n return $error.html(data.error);\r\n }\r\n\r\n if (!data || !data.giftCertificate) {\r\n $error.html(Resources.GIFT_CARD_CODE_PIN_INVALID);\r\n return;\r\n }\r\n\r\n if (!data || !data.giftCertificate) {\r\n $balance.html(Resources.GIFT_CERT_INVALID).removeClass('success').addClass('error');\r\n return;\r\n }\r\n\r\n $balance.html(Resources.GIFT_CERT_CURRENT_BALANCE + ' ' + data.giftCertificate.balance);\r\n\r\n $giftCode.attr('disabled', \"true\");\r\n $giftPin.attr('disabled', \"true\");\r\n $('button#check-giftcert-modal').addClass('hide');\r\n $('button#add-giftcert-modal').removeClass('hide');\r\n $('button#new-giftcert-modal').removeClass('hide');\r\n });\r\n};\r\n\r\nfunction applyGiftCert() {\r\n var $error = $('div#gift-card-balance-form .balance-error');\r\n var $giftCode = $('div#gift-card-balance-form input[name$=\"_giftCertCode\"]');\r\n var $giftPin = $('div#gift-card-balance-form input[name$=\"_giftCertPIN\"]');\r\n\r\n $error.html('');\r\n if ($giftCode.val().length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_INVALID);\r\n return;\r\n }\r\n /*else if ($giftCode.val().length !== 0 && $giftPin.val().length === 0) {\r\n $error.html(Resources.GIFT_CARD_PIN_INVALID);\r\n return;\r\n } else if ($giftCode.val().length === 0 && $giftPin.val().length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_PIN_INVALID);\r\n return;\r\n }*/\r\n\r\n var url = util.appendParamsToUrl(Urls.redeemGiftCert, {\r\n giftCertCode: $giftCode.val(),\r\n giftCertPIN: $giftPin.val(),\r\n format: 'ajax'\r\n });\r\n $.getJSON(url, function(data) {\r\n var fail = false;\r\n var msg = '';\r\n if (!data) {\r\n msg = Resources.BAD_RESPONSE;\r\n fail = true;\r\n } else if (!data.success) {\r\n msg = data.message.split('<').join('<').split('>').join('>');\r\n fail = true;\r\n }\r\n if (fail) {\r\n $error.html(msg);\r\n return;\r\n } else {\r\n window.location.assign(Urls.billing);\r\n }\r\n });\r\n};\r\n\r\nfunction initCache() {\r\n $cache = {};\r\n\r\n $cache.checkoutForm = $(\".checkout-billing\");\r\n $cache.selectedCardIdInput = $cache.checkoutForm.find('input[name$=\"_selectedCardID\"]');\r\n}\r\n\r\nfunction initCreditCardForm() {\r\n $cache.checkoutForm.find('input[name$=\"_selectedCardID\"]').val('');\r\n $cache.checkoutForm.find('input[name*=\"_number\"]').val('');\r\n $cache.checkoutForm.find('select[name*=\"_month\"]').val('').trigger(\"change\");\r\n $cache.checkoutForm.find('select[name*=\"_year\"]').val('').trigger(\"change\");\r\n $cache.checkoutForm.find('input[name*=\"_owner\"]').val('');\r\n\r\n var $ccContainer = $cache.checkoutForm.find(\".payment-method\").filter(function() {\r\n return $(this).data(\"method\") == \"CREDIT_CARD\";\r\n });\r\n\r\n $ccContainer.find('input[name*=\"_number\"]').on('change', function(e) {\r\n $cache.checkoutForm.find('input[name$=\"_selectedCardID\"]').val('');\r\n });\r\n $ccContainer.find('input[name$=\"_owner\"]').on('change', function(e) {\r\n $cache.checkoutForm.find('input[name$=\"_selectedCardID\"]').val('');\r\n });\r\n\r\n $ccContainer.find('select[name*=\"expiration\"]').on('change', function(e) {\r\n $cache.checkoutForm.find('input[name$=\"_selectedCardID\"]').val('');\r\n\r\n var selectedPaymentMethodID = $('input[name$=\"_selectedPaymentMethodID\"]:checked').val();\r\n var cardNumber = $cache.checkoutForm.find('input[name*=\"_number\"]').val();\r\n if (cardNumber.indexOf('****') != -1 && selectedPaymentMethodID == 'SA_SILENTPOST') {\r\n $cache.checkoutForm.find('input[name*=\"_number\"]').val('');\r\n }\r\n });\r\n}\r\n\r\nfunction setSelectedCardID(uuid) {\r\n $cache.selectedCardIdInput.val(uuid);\r\n}\r\n\r\nfunction clearSelectedCardID() {\r\n $cache.selectedCardIdInput.val('');\r\n}\r\n\r\nfunction setCCType(ccType) {\r\n $cache.checkoutForm.find('input[name$=\"_type\"]').val(ccType);\r\n}\r\n\r\nfunction enableCountryField(status) {\r\n var countryField = $('select[id$=\"billing_billingAddress_addressFields_country\"]');\r\n if (status) {\r\n countryField.prop('disabled', false);\r\n } else {\r\n countryField.prop('disabled', true);\r\n }\r\n}\r\n\r\nfunction addCVNEvent() {\r\n $('input[name$=\"creditCard_cvn\"]').on('keydown', function(e) {\r\n if (e.key.toString().match(/[\\d]/) ||\r\n $.inArray(e.keyCode, [8, 9, 13, 46, 33, 34, 35, 36, 37, 38, 39, 40]) >= 0) {\r\n // do nothing\r\n } else {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n });\r\n}\r\n\r\nfunction initGiftCardBalance() {\r\n var $checkoutForm = $('.checkout-billing');\r\n var $addGiftCert = $('#add-giftcert');\r\n var $giftCertCode = $('input[name$=\"_giftCertCode\"]');\r\n var $giftCertPin = $('input[name$=\"_giftCertPIN\"]');\r\n var $addCoupon = $('#add-coupon');\r\n var $couponCode = $('input[name$=\"_couponCode\"]');\r\n\r\n // Check Balance button is clicked in Check Balance Modal\r\n $(document).off('click', 'button#check-giftcert-modal');\r\n $(document).on('click', 'button#check-giftcert-modal', function(e) {\r\n e.preventDefault();\r\n checkGiftCert();\r\n });\r\n\r\n // Check Another Card button is clicked in Check Balance Modal\r\n $(document).off('click', 'button#new-giftcert-modal');\r\n $(document).on('click', 'button#new-giftcert-modal', function(e) {\r\n var $balance = $('div#gift-card-balance-form .balance');\r\n var $error = $('div#gift-card-balance-form .balance-error');\r\n var $giftCode = $('div#gift-card-balance-form input[name$=\"_giftCertCode\"]');\r\n var $giftPin = $('div#gift-card-balance-form input[name$=\"_giftCertPIN\"]');\r\n\r\n $balance.html('');\r\n $error.html('');\r\n $giftCode.val(null).prop('disabled', false);\r\n $giftPin.val(null).prop('disabled', false);\r\n\r\n $('button#add-giftcert-modal').addClass('hide');\r\n $('button#new-giftcert-modal').addClass('hide');\r\n $('button#check-giftcert-modal').removeClass('hide');\r\n });\r\n\r\n // Apply button is clicked in Check Balance Modal\r\n $(document).off('click', 'button#add-giftcert-modal');\r\n $(document).on('click', 'button#add-giftcert-modal', function(e) {\r\n e.preventDefault();\r\n applyGiftCert();\r\n });\r\n\r\n $addGiftCert.off();\r\n $addGiftCert.on('click', function(e) {\r\n e.preventDefault();\r\n var code = $giftCertCode.val();\r\n var pin = $giftCertPin.val();\r\n //var $error = $checkoutForm.find('.giftcert-error');\r\n var $error = $checkoutForm.find('.apply-error');\r\n\r\n // clear all errors\r\n $(this).closest('form').find('span.error').remove();\r\n\r\n $error.html('');\r\n if (code.length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_INVALID);\r\n return;\r\n } else if (code.length !== 0 && pin.length === 0) {\r\n $error.html(Resources.GIFT_CARD_PIN_INVALID);\r\n return;\r\n } else if (code.length === 0 && pin.length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_PIN_INVALID);\r\n return;\r\n }\r\n\r\n var url = util.appendParamsToUrl(Urls.redeemGiftCert, {\r\n giftCertCode: code,\r\n giftCertPIN: pin,\r\n format: 'ajax'\r\n });\r\n $.getJSON(url, function(data) {\r\n var fail = false;\r\n var msg = '';\r\n if (!data) {\r\n msg = Resources.BAD_RESPONSE;\r\n fail = true;\r\n } else if (!data.success) {\r\n msg = data.message.split('<').join('<').split('>').join('>');\r\n fail = true;\r\n }\r\n if (fail) {\r\n $error.html(msg);\r\n return;\r\n } else {\r\n window.location.assign(Urls.billing);\r\n }\r\n });\r\n });\r\n\r\n $giftCertCode.off();\r\n $giftCertCode.on('keydown', function(e) {\r\n if (e.which === 13) {\r\n e.preventDefault();\r\n $addGiftCert.trigger(\"click\");\r\n }\r\n });\r\n}\r\n\r\n//Removes 'PO Box shipping is not available' caption from address1 field if preference is true\r\nfunction removePOBoxCaption() {\r\n\r\n if (SitePreferences.ENABLE_POBOX_ADDRESS) {\r\n var $addressOne = $('input[name$=\"_address1\"]');\r\n $addressOne.closest(\".form-row\").find(\".form-caption\").text('');\r\n var $addressTwo = $('input[name$=\"_address2\"]');\r\n $addressTwo.closest(\".form-row\").find(\".form-caption\").text('');\r\n }\r\n}\r\n\r\n/**\r\n * Set User's shipping default submitted address to be setting\r\n * as default billing address on Billing column.\r\n * We have set by getting the SAMEASSHIPPING forms submitted value on\r\n * Billing Continue submit(Continue To Review) of SFCC form framework.\r\n * */\r\nfunction setDefaultMPCSameAsShippingAddressCheckbox() {\r\n let $sameAsShippingAdrs = $('#secondary .mpcBillingAdresSameAsShippingAdrs');\r\n let $sameAsShippingAddressChk = $('input#same-as-shipping');\r\n if ($sameAsShippingAdrs.length > 0) {\r\n let billingAddresSameAsShippingadrs = $sameAsShippingAdrs.attr('data-mpc-sameasshippingaddress');\r\n if (billingAddresSameAsShippingadrs !== undefined && billingAddresSameAsShippingadrs == 'true') {\r\n $sameAsShippingAddressChk.prop('checked', true);\r\n $sameAsShippingAddressChk.trigger('change');\r\n } else {\r\n $sameAsShippingAddressChk.prop('checked', false);\r\n }\r\n }\r\n}\r\n\r\nfunction check_cvs() {\r\n if($('input[name=dwfrm_billing_paymentMethods_selectedPaymentMethodID][value=GMO_PAYMENT_CVS]').is(\":checked\")) {\r\n $('input[name=dwfrm_convenience_convenienceStore]').addClass('required');\r\n $('.gmo_payment_cvs.form-row').addClass('required');\r\n $('.payment-notice').addClass('has-validation');\r\n }\r\n else {\r\n $('input[name=dwfrm_convenience_convenienceStore]').removeClass('required error');\r\n $('.gmo_payment_cvs.form-row').removeClass('required');\r\n $('.payment-notice').removeClass('has-validation');\r\n }\r\n}\r\n\r\n/**\r\n * @function\r\n * @description loads billing address, Gift Certificates, Coupon and Payment methods\r\n */\r\nexports.init = function() {\r\n cardValidation.init();\r\n customaddress.init();\r\n initCache();\r\n initCreditCardForm();\r\n initGiftCardBalance();\r\n initCleanAutoFill.init();\r\n check_cvs();\r\n\r\n var $selectPaymentMethod = $('.selectable-payment-method-options');\r\n var selectedPaymentMethod = $selectPaymentMethod.find('input[name=\"dwfrm_billing_paymentMethods_selectedPaymentMethodID\"]:checked').val();\r\n\r\n validator.initForm('form[id$=\"billing\"]');\r\n removePOBoxCaption();\r\n\r\n function toggleBillingAddressFields(visible) {\r\n if (window.User.isCustomerAuthenticated == false) {\r\n $('.checkout-billing').find('.set-default-cb').hide();\r\n }\r\n }\r\n\r\n $(document).on('change', '#dwfrm_billing_billingAddress_addressFields_country, #dwfrm_billingaddress_country', function() {\r\n toggleBillingAddressFields();\r\n });\r\n $('input#same-as-shipping').on('change', function() {\r\n var sameascheckbox = $(this);\r\n\r\n if (sameascheckbox.is(\":checked\")) {\r\n $('.saved-addresses.select-billing-address').addClass('hide');\r\n $('.saved-addresses.default-billing-address').removeClass('hide');\r\n\r\n $('#dwfrm_billing_billingAddress_addressFields_firstName').val($('#dwfrm_billing_billingAddress_addressFields_firstName').attr('data-firstname'));\r\n $('#dwfrm_billing_billingAddress_addressFields_lastName').val($('#dwfrm_billing_billingAddress_addressFields_lastName').attr('data-lastname'));\r\n $('#dwfrm_billing_billingAddress_addressFields_address1').val($('#dwfrm_billing_billingAddress_addressFields_address1').attr('data-address1'));\r\n $('#dwfrm_billing_billingAddress_addressFields_address2').val($('#dwfrm_billing_billingAddress_addressFields_address2').attr('data-address2'));\r\n $('#dwfrm_billing_billingAddress_addressFields_city').val($('#dwfrm_billing_billingAddress_addressFields_city').attr('data-city'));\r\n $('#dwfrm_billing_billingAddress_addressFields_city').val($('#dwfrm_billing_billingAddress_addressFields_city').attr('data-city'));\r\n $('#dwfrm_billing_billingAddress_addressFields_postal').val($('#dwfrm_billing_billingAddress_addressFields_postal').attr('data-postal'));\r\n $('#dwfrm_billing_billingAddress_addressFields_country').val($('#dwfrm_billing_billingAddress_addressFields_country').attr('data-country'));\r\n $('#dwfrm_billing_billingAddress_addressFields_states_state').val($('#dwfrm_billing_billingAddress_addressFields_states_state').attr('data-state'));\r\n $('#dwfrm_billing_billingAddress_addressFields_phone').val($('#dwfrm_billing_billingAddress_addressFields_phone').attr('data-phone'));\r\n sameascheckbox.val('true');\r\n toggleBillingAddressFields(true);\r\n\r\n var selectedShipping = $('div.default-billing-address div.address-tile');\r\n if (selectedShipping) {\r\n selectedShipping.removeClass('selected');\r\n selectedShipping.removeClass('default');\r\n selectedShipping.trigger('click');\r\n }\r\n\r\n //$(this).submit();\r\n } else {\r\n $('.saved-addresses.default-billing-address').addClass('hide');\r\n $('.saved-addresses.select-billing-address').removeClass('hide');\r\n\r\n var prefAddress = $('div.select-billing-address div.address-tile');\r\n if (prefAddress) {\r\n prefAddress.removeClass('selected');\r\n prefAddress.removeClass('default');\r\n prefAddress.trigger('click');\r\n }\r\n\r\n sameascheckbox.val('false');\r\n toggleBillingAddressFields();\r\n }\r\n });\r\n\r\n // default payment method to 'CREDIT_CARD'\r\n updatePaymentMethod((selectedPaymentMethod) ? selectedPaymentMethod : 'CREDIT_CARD');\r\n $selectPaymentMethod.on('click', 'input[name=\"dwfrm_billing_paymentMethods_selectedPaymentMethodID\"]', function() {\r\n updatePaymentMethod($(this).val());\r\n });\r\n\r\n $('.gift-card-form-toggle').on('click', function(e) {\r\n e.preventDefault();\r\n\r\n var $giftCardForm = $('.gift-card-form');\r\n var $giftCardCheckLink = $('.check-gift-card');\r\n\r\n $giftCardForm.slideDown().removeClass('rolledup');\r\n $giftCardCheckLink.removeClass('hide');\r\n $(this).addClass('hide');\r\n initGiftCardBalance();\r\n\r\n $('.gift-card-form input[name$=\"_giftCertCode\"], .gift-card-form input[name$=\"_giftCertPIN\"]').on('blur', function(e) {\r\n var $this = $(this);\r\n $this.siblings('span.error').remove();\r\n $this.removeClass('error');\r\n $('#add-giftcert').prop('disabled', false);\r\n $('.gift-card-form .apply-error').html('');\r\n\r\n if ($this.val() && !$this.val().trim().match(/^[a-z0-9]+$/i)) {\r\n $('' + $this.attr('data-required-text') + '').insertBefore($this);\r\n $this.addClass('error');\r\n }\r\n\r\n if ($('.gift-card-form span.error').length > 0) {\r\n // $('#add-giftcert').prop('disabled',true);\r\n }\r\n });\r\n\r\n });\r\n\r\n var $giftCardCheckModal = $('#gift-card-balance-modal').detach();\r\n $('.check-gift-card').on('click', function(e) {\r\n modal.events.onOpen(function() {\r\n initGiftCardBalance();\r\n\r\n $('.gift-card-balance-modal input[name$=\"_giftCertCode\"], .gift-card-balance-modal input[name$=\"_giftCertPIN\"]').on('blur', function(e) {\r\n var $this = $(this);\r\n $this.siblings('span.error').remove();\r\n $this.removeClass('error');\r\n $('.gift-card-balance-modal button#check-giftcert-modal').prop('disabled', false);\r\n $('.gift-card-balance-modal .balance-error').html('');\r\n\r\n if ($this.val() && !$this.val().trim().match(/^[a-z0-9]+$/i)) {\r\n $('' + $this.attr('data-required-text') + '').insertBefore($this);\r\n $this.addClass('error');\r\n }\r\n\r\n if ($('.gift-card-balance-modal span.error').length > 0) {\r\n // $('.gift-card-balance-modal button#check-giftcert-modal').prop('disabled',true);\r\n }\r\n });\r\n });\r\n modal.restoreDefaultClass();\r\n modal.addCustomClass('gift-card-balance-modal');\r\n modal.renderContent($giftCardCheckModal.html());\r\n });\r\n\r\n\r\n creditCardTypeDetector();\r\n\r\n\r\n $(document).on(\"click\", \".credit-card-create\", function(evt) {\r\n modal.events.onOpen(function() {\r\n creditCardTypeDetector();\r\n validator.initForm('form[id$=\"CreditCardForm\"]');\r\n creditCardValidator.init({\r\n wrapper: '.medium.add-credit-card form[id$=\"CreditCardForm\"]'\r\n });\r\n });\r\n modal.restoreDefaultClass();\r\n modal.addCustomClass('medium add-credit-card');\r\n modal.renderByUrl(Urls.checkoutAddCreditCard);\r\n modal.setCallback(cardValidation.init);\r\n });\r\n\r\n $('.payment-method-item').each(function() {\r\n $(this).find('input[name=dwfrm_billing_paymentMethods_selectedPaymentMethodID]').on('change', function(e) {\r\n $('.cvs-payment-methods-item').find('input[name=dwfrm_convenience_convenienceStore]').prop('checked', false);\r\n if($('.creditcard-tile').length > 0){\r\n clearSelectedCardID();\r\n $('.creditcard-tile').removeClass(\"selected\");\r\n }\r\n check_cvs();\r\n });\r\n });\r\n\r\n $('.cvs-payment-methods-item').each(function() {\r\n $(this).on('change', function() {\r\n $('input[name=dwfrm_billing_paymentMethods_selectedPaymentMethodID][value=GMO_PAYMENT_CVS]').prop('checked', true);\r\n if($('.creditcard-tile').length > 0){\r\n $('.creditcard-tile').removeClass(\"selected\");\r\n return;\r\n }\r\n if ($(\"#dwfrm_billing\").length > 0) {\r\n $(\"#dwfrm_billing\").validate().resetForm();\r\n if ($(\"#dwfrm_billing\").validate().numberOfInvalids() > 0) {\r\n $(\"#dwfrm_billing\").validate().invalid = {};\r\n }\r\n $('select[name*=\"dwfrm_billing_paymentMethods_creditCard\"],input[name*=\"dwfrm_billing_paymentMethods_creditCard\"]').addClass(\"ignore\");\r\n }\r\n });\r\n });\r\n\r\n $(document).on(\"submit\", \"#CreditCardForm\", function(evt) {\r\n evt.preventDefault();\r\n\r\n var $form = $(this);\r\n var $formDataError = $('.form-data-error');\r\n var url = $form.attr('action');\r\n var selectedPaymentMethodID = $('input[name$=\"_selectedPaymentMethodID\"]');\r\n\r\n if (selectedPaymentMethodID && selectedPaymentMethodID.length > 0) {\r\n var selectedPaymentMethodIDName = selectedPaymentMethodID.prop('name') || '';\r\n var selectedPaymentMethodIDVal = selectedPaymentMethodID.val() || '';\r\n if (selectedPaymentMethodIDVal) {\r\n url = util.appendParamToURL(url, selectedPaymentMethodIDName, selectedPaymentMethodIDVal);\r\n }\r\n }\r\n\r\n var selectedCardID = $('input[name$=\"_selectedCardID\"]');\r\n\r\n if (selectedCardID && selectedCardID.length > 0) {\r\n var selectedCardIDName = selectedCardID.prop('name') || '';\r\n var selectedCardIDVal = selectedCardID.val() || '';\r\n if (selectedCardIDVal) {\r\n url = util.appendParamToURL(url, selectedCardIDName, selectedCardIDVal);\r\n }\r\n }\r\n\r\n $.ajax({\r\n url: util.appendParamToURL(url, 'format', 'ajax'),\r\n data: $form.serialize() + '&' + $form.find('#add-card-submit-billing').attr('name') + '=x',\r\n type: 'POST'\r\n }).done(function(data) {\r\n if (!data) {\r\n $formDataError.html(Resources.BAD_RESPONSE);\r\n return false;\r\n }\r\n\r\n if (data.length) {\r\n modal.setContent(data);\r\n validator.initForm('form[id$=\"CreditCardForm\"]');\r\n creditCardValidator.init({\r\n wrapper: '.medium.add-credit-card form[id$=\"CreditCardForm\"]'\r\n });\r\n $('input[id*=\"newcreditcard_number\"]').val('');\r\n $('input[id*=\"newcreditcard_number\"]').focus();\r\n $('input[id*=\"newcreditcard_cvn\"]').val('');\r\n return;\r\n }\r\n\r\n if (!location.assign(Urls.billing)) {\r\n window.location.href = Urls.billing;\r\n }\r\n });\r\n });\r\n\r\n $(document).on(\"click\", \".credit-card-edit\", function(evt) {\r\n var element = document.getElementById(evt.currentTarget.id);\r\n var creditcardPositin = element.dataset.creditcardPosition;\r\n var url = Urls.checkoutEditCreditCard + creditcardPositin;\r\n\r\n modal.restoreDefaultClass();\r\n modal.events.onOpen(function() {\r\n $('.cc-number input').prop('disabled', true);\r\n validator.initForm('form[id$=\"CreditCardForm\"]');\r\n });\r\n modal.addCustomClass('small edit-credit-card');\r\n modal.renderByUrl(url);\r\n\r\n });\r\n\r\n //select credit card tile\r\n $(document).on('click', '.creditcard-tile', function(evt) {\r\n var $this = $(this);\r\n $('#is-CREDIT_CARD').prop('checked', true);\r\n $('.cvs-payment-methods-item').find('input[name=dwfrm_convenience_convenienceStore]').prop('checked', false);\r\n var ccType = $this.find('.creditcard-tile-inner .cc-number').attr('data-cctype');\r\n\r\n if ($(this).is('.selected, .default')) {\r\n return false;\r\n } else {\r\n $('.creditcard-tile').each(function() {\r\n $(this).removeClass('selected');\r\n $(this).removeClass('default');\r\n });\r\n\r\n $this.addClass('selected');\r\n setSelectedCardID($this.data(\"uuid\"));\r\n setCCType(ccType);\r\n check_cvs();\r\n }\r\n\r\n });\r\n //added for custom validation for multiple card CVN validation for register customer\r\n if ($('.payment-list.customerPCLDetails').length > 0) {\r\n $('.clientsite-cardcvnvalid-error').hide();\r\n $(document).on('keyup blur focusout keypress', 'input.regcustpclCVN', function(e) {\r\n var cardCvnLength = $(this).val().length;\r\n var cvnMinLen = $(this).attr('data-min-length');\r\n var cvnMaxLen = $(this).attr('data-max-length');\r\n if (cardCvnLength < cvnMinLen || cardCvnLength > cvnMaxLen) {\r\n displayCVNErrorMessage('show');\r\n } else if (cardCvnLength == cvnMinLen || cardCvnLength == cvnMaxLen) {\r\n displayCVNErrorMessage();\r\n } else {\r\n displayCVNErrorMessage();\r\n }\r\n });\r\n var $billingCheckoutForm = $('.checkout-billing');\r\n if ($billingCheckoutForm.find('button[name $= \"billing_save\"]').length > 0) {\r\n $billingCheckoutForm.find('button[name $= \"billing_save\"]').on('click', function() {\r\n var cardCVNMinLen = $('.creditcard-tile.selected input.regcustpclCVN').attr('data-min-length');\r\n var cardCVNMaxLen = $('.creditcard-tile.selected input.regcustpclCVN').attr('data-max-length');\r\n cardCVNMinLen = (cardCVNMinLen !== undefined && cardCVNMinLen !== '') ? cardCVNMinLen : 0;\r\n cardCVNMaxLen = (cardCVNMaxLen !== undefined && cardCVNMaxLen !== '') ? cardCVNMaxLen : 0;\r\n $('.clientsite-cardcvnvalid-error').hide();\r\n if ($('input[name=dwfrm_billing_paymentMethods_selectedPaymentMethodID]:checked').val() == 'CREDIT_CARD') {\r\n if ($('#dwfrm_billing_paymentMethods_creditCard_cvn').is(':visible') == true || $('.creditcard-tile').hasClass('selected')) {\r\n var cvnobj = $('#dwfrm_billing_paymentMethods_creditCard_cvn').val();\r\n let cvnObjLen = (cvnobj !== '' && cvnobj !== undefined && cvnobj != null) ? cvnobj.length : 0;\r\n if ((cvnObjLen == 0 && cvnobj == '') || cvnObjLen < cardCVNMinLen || cvnObjLen > cardCVNMaxLen) {\r\n $('#dwfrm_billing_paymentMethods_creditCard_cvn').trigger(\"focus\");\r\n displayCVNErrorMessage('show');\r\n return false;\r\n } else {\r\n displayCVNErrorMessage();\r\n return true;\r\n }\r\n } else {\r\n $('.clientsite-cardcvnvalid-error').removeClass('hide');\r\n $('.error-form.clientsite-cardcvnvalid-error').show();\r\n $('.scroll-top-inner').trigger('click');\r\n return false;\r\n }\r\n } else {\r\n displayCVNErrorMessage();\r\n $('.clientsite-cardcvnvalid-error').hide();\r\n return true;\r\n }\r\n });\r\n }\r\n\r\n function displayCVNErrorMessage(display) {\r\n if (display !== undefined && display != '' && display == 'show') {\r\n $('.creditcard-tile.selected .cvnvalidationerror.errorshow.error').show();\r\n $('.creditcard-tile.selected .cvnvalidationerror.errorshow.error').html(Resources.VALIDATE_CVN);\r\n } else {\r\n $('.creditcard-tile.selected .cvnvalidationerror.errorshow.error').html('');\r\n $('.creditcard-tile.selected .cvnvalidationerror.errorshow.error').hide();\r\n }\r\n }\r\n }\r\n\r\n $(\"#dwfrm_billing\").on(\"submit\", function() {\r\n var $sameasshippingObj = $('input[name=dwfrm_billing_billingAddress_sameasshipping]');\r\n if ($sameasshippingObj.is(':checked')) {\r\n $sameasshippingObj.val(true);\r\n } else {\r\n $sameasshippingObj.val(false);\r\n }\r\n\r\n var paymentSelected = $('input[name=dwfrm_billing_paymentMethods_selectedPaymentMethodID]:checked');\r\n $('.error-form.clientsite-cardcvnvalid-error').hide();\r\n if (paymentSelected.length === 0) {\r\n $('.clientsite-cardcvnvalid-error').removeClass('hide');\r\n $('.error-form.clientsite-cardcvnvalid-error').show();\r\n $('.scroll-top-inner').trigger('click');\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n $(document).on(\"click\", \".address-create\", function(evt) {\r\n modal.setCallback(function() {\r\n toggleBillingAddressFields(false);\r\n });\r\n\r\n modal.restoreDefaultClass();\r\n modal.addCustomClass('edit-add-address');\r\n var _YubinBango = typeof (YubinBango) !== 'undefined' && YubinBango ? YubinBango : '';\r\n modal.events.onOpen(function() {\r\n if (_YubinBango) {\r\n new _YubinBango.MicroformatDom();\r\n }\r\n validator.initForm('form[id$=\"EditAddressForm\"]');\r\n removePOBoxCaption();\r\n });\r\n\r\n modal.renderByUrl(Urls.checkoutAddBillingAddress);\r\n });\r\n\r\n $(document).on(\"click\", \".address-edit\", function(evt) {\r\n var element = document.getElementById(evt.currentTarget.id);\r\n var addressID = element.dataset.addressId;\r\n var addressCode = element.dataset.addressCode;\r\n var url = Urls.checkoutEditBillingAddress + addressID;\r\n modal.setCallback(function() {\r\n toggleBillingAddressFields(true);\r\n });\r\n modal.restoreDefaultClass();\r\n var _YubinBango = typeof (YubinBango) !== 'undefined' && YubinBango ? YubinBango : '';\r\n modal.events.onOpen(function() {\r\n if (_YubinBango) {\r\n new _YubinBango.MicroformatDom();\r\n }\r\n validator.initForm('form#EditAddressForm');\r\n removePOBoxCaption();\r\n initCleanAutoFill.init();\r\n });\r\n modal.addCustomClass('edit-add-address');\r\n modal.renderByUrl(url);\r\n });\r\n\r\n var href;\r\n $(document).on('click', '.address-delete', function(e) {\r\n e.preventDefault();\r\n href = $(this).attr('href');\r\n var popup = new Foundation.Reveal($('#remove-address'));\r\n popup.open();\r\n //No button\r\n $(\".addressDelete-modal-btn-cancel\").on(\"click\", function() {\r\n popup.close();\r\n });\r\n });\r\n\r\n //Yes button\r\n $(\".addressDelete-modal-btn-ok\").on(\"click\", function() {\r\n var data_json = {};\r\n\r\n if ($('#csrf_token') && $('#csrf_token').length === 1) {\r\n var csrfTokenVal = $('#csrf_token').val();\r\n var csrfTokenKey = $('#csrf_token').prop('name');\r\n data_json[csrfTokenKey] = csrfTokenVal;\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: util.appendParamToURL(href, 'format', 'ajax'),\r\n dataType: 'json',\r\n data: data_json,\r\n }).done(function(data) {\r\n page.refresh();\r\n });\r\n });\r\n\r\n $(document).on('click', '.address-list .address-tile', function(evt) {\r\n\r\n if ($(this).is('.selected, .default') || evt.target.nodeName == 'A') {\r\n return false;\r\n } else {\r\n $('.address-list .address-tile').each(function() {\r\n $(this).removeClass('selected');\r\n $(this).removeClass('default');\r\n });\r\n\r\n $(this).addClass('selected');\r\n\r\n var element = document.getElementById(evt.currentTarget.id);\r\n\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n var addressID = element.dataset.addressId;\r\n var sameAsShipping = $('#same-as-shipping').is(':checked');\r\n\r\n var url = util.appendParamsToUrl(Urls.updateBillingAddressDetails, {\r\n addressID: addressID,\r\n sameAsShipping: sameAsShipping\r\n //format: 'ajax'\r\n });\r\n progress.show($('.billing-address-section.billing-step-item'));\r\n $.ajax({\r\n url: url,\r\n type: 'GET',\r\n success: function(result) {\r\n //alert(result);\r\n progress.hide();\r\n }\r\n });\r\n\r\n\r\n }\r\n\r\n });\r\n\r\n $('.order-summary-footer form').on(\"submit\", function() {\r\n $('#summary-place-order').prop('disabled', true).addClass('loading');\r\n return true;\r\n });\r\n setDefaultMPCSameAsShippingAddressCheckbox();\r\n\r\n if ($('input#same-as-shipping').length > 0 && $('input#same-as-shipping').is(\":checked\")) {\r\n $(document).find('div.default-billing-address div.address-tile').each(function(ind, evt) {\r\n $(this).removeClass('selected');\r\n $(this).removeClass('default');\r\n $(this).trigger('click');\r\n });\r\n } else {\r\n var reSelectTile = $('div.select-billing-address div.address-tile.selected');\r\n reSelectTile.removeClass('selected');\r\n reSelectTile.removeClass('default');\r\n reSelectTile.trigger('click');\r\n }\r\n\r\n // trigger click event for selected by default cc (to manually trigger cc code)\r\n var selectedCC = $('div.payment-method div.creditcard-tile.selected');\r\n if (selectedCC) {\r\n selectedCC.removeClass('selected').trigger(\"click\");\r\n }\r\n\r\n // maximize order checkout summary dropdown\r\n util.maximizeCheckoutSummary();\r\n\r\n // trigger only for non-registered users\r\n if (window.User.isCustomerAuthenticated == false) {\r\n $('input[name$=\"_creditCard_cvn\"], input[name$=\"_creditCard_owner\"]').on('change', function() {\r\n $('select[name$=\"_creditCard_expiration_month\"]').trigger('change');\r\n $('select[name$=\"_creditCard_expiration_month\"]').trigger('change');\r\n });\r\n $('.checkout-billing').find('.set-default-cb').hide();\r\n }\r\n\r\n /* point exchange */\r\n $(function() {\r\n if($('[id=point-redeem-01]').prop('checked')){\r\n $('#point-tile-box-02').removeClass(\"selected\");\r\n $('#point-tile-box-01').addClass(\"selected\");\r\n $('#js-order-point').hide();\r\n $('#isRadioPointExchange').val(false);\r\n $('.point-tile-use-button-part').prop(\"disabled\", true);\r\n $('.point-tile-button-all').prop(\"disabled\", true);\r\n } else if ($('[id=point-redeem-02]').prop('checked')) {\r\n $('#point-tile-box-01').removeClass(\"selected\");\r\n $('#point-tile-box-02').addClass(\"selected\");\r\n $('#js-order-point').show();\r\n $('#isRadioPointExchange').val(true);\r\n $('.point-tile-use-button-part').prop(\"disabled\", false);\r\n $('.point-tile-button-all').prop(\"disabled\", false);\r\n }\r\n $('[name=\"point-redeem\"]:radio').change( function() {\r\n if($('[id=point-redeem-01]').prop('checked')){\r\n $('#point-tile-box-02').removeClass(\"selected\");\r\n $('#point-tile-box-01').addClass(\"selected\");\r\n $('#js-order-point').hide();\r\n $('#isRadioPointExchange').val(false);\r\n $('.point-tile-use-button-part').prop(\"disabled\", true);\r\n $('.point-tile-button-all').prop(\"disabled\", true);\r\n } else if ($('[id=point-redeem-02]').prop('checked')) {\r\n $('#point-tile-box-01').removeClass(\"selected\");\r\n $('#point-tile-box-02').addClass(\"selected\");\r\n $('#js-order-point').show();\r\n $('#isRadioPointExchange').val(true);\r\n $('.point-tile-use-button-part').prop(\"disabled\", false);\r\n $('.point-tile-button-all').prop(\"disabled\", false);\r\n }\r\n });\r\n });\r\n\r\n util.renderGoogleInvRecaptcha(\"billingrecaptcha\", \"#dwfrm_billing_save\", \"dwfrm_billing\")\r\n\r\n creditCardValidator.init({\r\n wrapper: '#wrapper form[id$=\"billing\"]'\r\n });\r\n\r\n $('[name=\"point-redeem\"]:radio').change( function() {\r\n if($('[id=point-redeem-01]').prop('checked')){\r\n var url = util.appendParamsToUrl(Urls.ressetTmpUsePoint);\r\n $.ajax({\r\n url: url,\r\n type: 'POST',\r\n success: function(result) {\r\n window.location.href = Urls.billing;\r\n // page.refresh();\r\n }\r\n });\r\n } else if ($('[id=point-redeem-02]').prop('checked')) {\r\n return false;\r\n }\r\n });\r\n}\r\n\n},{\"../../address-book\":3,\"../../ajax\":5,\"../../credit-card-validator\":15,\"../../giftcard\":19,\"../../modal\":28,\"../../page\":31,\"../../progress\":75,\"../../util\":87,\"../../validator\":88,\"../customaddress\":45,\"./card-validation\":37,\"./formPrepare\":38}],37:[function(require,module,exports){\n'use strict';\r\n\r\n// https://gist.github.com/ShirtlessKirk/2134376\r\n\r\nvar luhnCheck = (function (arr) {\r\n return function (ccNum) {\r\n var len = ccNum.length;\r\n var bit = 1;\r\n var sum = 0;\r\n var val;\r\n\r\n while (len) {\r\n val = parseInt(ccNum.charAt(--len), 10);\r\n sum += (bit ^= 1) ? arr[val] : val;\r\n }\r\n\r\n return sum && sum % 10 === 0;\r\n };\r\n}([0, 2, 4, 6, 8, 1, 3, 5, 7, 9]));\r\n\r\nvar cvvCheck = function (cvv) {\r\n return /^[0-9]{3,4}$/.test(cvv); \r\n};\r\n\r\nvar initCardExpiry = function(){\r\n\tvar ccSave = $('#CreditCardForm #applyBtn');\r\n\tccSave.on('click', function(e){\r\n\t\tvalidateCardExpiry(this, true);\r\n\t});\r\n\t\r\n\t$('.card-expiry.month, .card-expiry.year').on('change blur', function(){\r\n\t\tvalidateCardExpiry(this);\r\n\t});\r\n};\r\n\r\nvar validateCardExpiry = function(el, checkEmpty){\r\n\t// need to declare specifically in order not to confuse with other forms with similar inputs\r\n\tvar $this = $(el);\r\n\tvar $month = $this.closest('form').find('.card-expiry.month');\r\n\tvar $year = $this.closest('form').find('.card-expiry.year');\r\n\tvar $submit = $this.closest('form').find('button[type=\"submit\"]');\r\n\tvar hasError = false;\r\n\t\r\n\tvar now = new Date();\r\n\tvar nowMonth = now.getMonth() + 1; \r\n\tvar nowYear = now.getFullYear();\r\n\t\r\n\t$month.siblings('span.error').remove();\r\n\t$year.siblings('span.error').remove(); //-- Ade CG-4\r\n\t$month.removeClass('error');\r\n\t$year.removeClass('error');\r\n\t$submit.prop('disabled', false);\r\n\t\r\n\t// validate only on form submit\r\n\t/*if(checkEmpty && (!$month.val() || !$year.val())){\r\n\t\t$('' + Resources.INVALID_CARDEXPIRY + '').insertBefore($month);\r\n\t\thasError = true;*/\r\n\tif(checkEmpty) {\r\n\t\tif (!$month.val()){\r\n\t\t\t$('' + Resources.INVALID_CARDEXPIRY + '').insertBefore($month);\r\n\t\t\thasError = true;\r\n\t\t}\r\n\t\tif (!$year.val()){\r\n\t\t\t$('' + Resources.INVALID_CARDEXPIRY + '').insertBefore($year);\r\n\t\t\thasError = true;\r\n\t\t}\r\n\t// validate only if month and year has value, otherwise, ignore\r\n\t} else if($month.val() && $year.val()){\r\n\t\tif ($year.val() < nowYear) {\r\n\t\t\t$('' + Resources.VALIDATE_CARDEXPIRY + '').insertBefore($year);\r\n\t\t\thasError = true;\r\n\t\t} else if ($month.val() < nowMonth && $year.val() == nowYear) {\r\n\t\t\t$('' + Resources.VALIDATE_CARDEXPIRY + '').insertBefore($month);\r\n\t\t\thasError = true;\r\n\t\t}\r\n\t}\r\n\t\r\n\t// highlight inputs if expiry has error \r\n\tif(hasError){\r\n\t\t$month.addClass('error');\r\n\t\t$year.addClass('error');\r\n\t}\r\n\t\r\n\t// disable button if there are errors -- // change by ticket shi-5388\r\n\tif($this.closest('form').find('span.error').length > 0){\r\n\t\t$submit.prop('disabled', true);\r\n\t}\r\n};\r\n\r\nexports.init = function () {\r\n\tinitCardExpiry();\r\n}\n},{}],38:[function(require,module,exports){\n'use strict';\r\n\r\nvar _ = require('lodash');\r\n\r\nvar hasEmptyRequired = function () {\r\n // filter out only the visible fields\r\n var requiredValues = this.$requiredInputs.filter(':visible').map(function () {\r\n return $(this).val();\r\n });\r\n return _(requiredValues).contains('');\r\n};\r\n\r\nvar validateForm = function () {\r\n\tvar _self = this;\r\n // only validate form when all required fields are filled to avoid\r\n // throwing errors on empty form\r\n if (!this.validator) {\r\n return;\r\n }\r\n \r\n // wait for the form to show before validating.. this applies to modals\r\n this.timer = setInterval(function(){ \r\n \tif(_self.$form.is(':visible')) {\r\n \t\tif (_self.$form.find('span.error:visible, .error-form:visible').length == 0) { //!_self.hasEmptyRequired() &&\r\n \t\t\t_self.$continue.prop('disabled', false);\r\n \t\t} else {\r\n \t\t\t_self.$continue.prop('disabled', true);\r\n \t\t}\r\n \t\tclearInterval(_self.timer);\r\n \t}\r\n }, 100);\r\n \r\n};\r\n\r\nvar validateEl = function (e) {\r\n if ($(e.target).val() === '') {\r\n this.$continue.prop('disabled', true);\r\n } else {\r\n // enable continue button on last required field that is valid\r\n // only validate single field\r\n if (!this.hasEmptyRequired()) { \r\n this.$continue.prop('disabled', false);\r\n } else {\r\n this.$continue.prop('disabled', true);\r\n }\r\n }\r\n};\r\n\r\nvar checkValue = function(repopulateRequiredFields, e) {\r\n\tvar $el = $(e.target);\r\n\tvar attr = $el.attr('clear-on-error');\r\n\t\r\n\t// check for new required fields (e.g. changing US -> CH in address)\r\n\tif(repopulateRequiredFields){\r\n\t\tthis.$requiredInputs = this.$form.find('input.required');\r\n\t}\r\n\t\r\n\t// remove any error message residue from previous validation\r\n if (this.$form.find('.-error-pad').length == 0) {\r\n $el.siblings('span.error').remove();\r\n }\r\n\t\r\n if (this.validator.element($el) \r\n \t\t&& this.$form.find('span.error:visible').length == 0) {\r\n this.$continue.prop('disabled', false);\r\n } else {\r\n// this.$continue.prop('disabled', true);\r\n \r\n // clear the value if input has error\r\n if(typeof attr !== typeof undefined && attr !== false) $el.val('');\r\n }\r\n};\r\n\r\nvar submitForm = function(e) {\r\n this.$form.find('input').trigger(\"blur\");\r\n this.$form.find('select').trigger(\"blur\");\r\n\r\n if (this.$continue.hasClass('password-ignore')) {\r\n if ($(\".form-row.username .field-wrapper span.error\").length) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n } else if(this.validator.numberOfInvalids() > 0 || this.$form.data('submitting') == true){\r\n// \tthis.$continue.prop('disabled', true);\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n // Execute Google Recaptcha once validation is completed.\r\n var util = require('../../util');\r\n if (util.getGoogleRecaptchaEnableStatus(this.$form.attr('id')) == true) { \t \r\n util.callingGoogleReCaptchaOnFormSubmitORAJAXCall(e, this.$form.attr('id'));\r\n }\r\n \r\n // adding this to prevent multiple submission of forms\r\n if(this.$form.attr('multiple-submission') === 'false'){\r\n \tthis.$form.data('submitting', true);\r\n }\r\n \r\n /* if( SitePreferences.ENABLE_SINGLE_PAGE_CHECKOUT && $(\"#singlepagecheckouthidden\").length > 0 ){\r\n\t e.preventDefault();\r\n\t e.stopPropagation();\r\n\t return;\r\n }*/\r\n};\r\n\r\nvar init = function (opts, settings) {\r\n if (!opts.formSelector || !opts.continueSelector) {\r\n throw new Error('Missing form and continue action selectors.');\r\n }\r\n this.$form = $(opts.formSelector);\r\n this.$continue = $(opts.continueSelector); \r\n this.validator = settings? this.$form.validate(settings) : this.$form.validate();\r\n this.$allInputs = $('input, textarea', this.$form);\r\n this.$allSelect = $('select', this.$form);\r\n this.$requiredInputs = this.$form.find('input.required');\r\n// this.validateForm();\r\n \r\n \r\n this.$allInputs.on('keyup', $.proxy(this.checkValue, this, false)); \r\n this.$allSelect.on('blur', $.proxy(this.checkValue, this, true));\r\n /*Below code is for only Single page checkout handler*/\r\n if(SitePreferences.ENABLE_SINGLE_PAGE_CHECKOUT && SitePreferences.IS_QAS_AUTO_SUGGESTION_ENABLE && $('.spc-checkoutdiv.spcGuestUser .spc-shipping.active #dwfrm_singleshipping_shippingAddress').length > 0) {\r\n \t // start listening for only single page checkout\r\n this.$requiredInputs.on('change', $.proxy(this.validateEl, this));\r\n this.$requiredInputs.on('keydown', $.proxy(this.validateEl, this));\r\n this.$requiredInputs.on('keypress', $.proxy(this.validateEl, this));\r\n }\r\n this.$continue.on('click', $.proxy(this.submitForm, this));\r\n\t// [life-hack:5079] needed to trigger onclick since blur prevents the form from submitting\r\n if(this.$continue.attr('mousesubmit') === 'true'){\r\n \tthis.$continue.on('mousedown', $.proxy(function(e){ this.$continue.trigger(\"click\"); }, this));\r\n }\r\n};\r\n\r\nvar formPrepare = function(){\r\n\treturn {\r\n\t\t$form: null,\r\n\t\t$continue: null,\r\n\t\t$allInputs: null,\r\n\t\t$allSelect: null,\r\n\t\t$requiredInputs: null, \r\n\t\tvalidator: null,\r\n\t\tinit: init,\r\n\t\ttimer: null,\r\n\t\thasEmptyRequired: hasEmptyRequired,\r\n\t\tcheckValue: checkValue,\r\n\t\tvalidateForm: validateForm,\r\n\t\tsubmitForm: submitForm,\r\n\t\tvalidateEl: validateEl\r\n\t}\r\n}\r\n\r\nmodule.exports = formPrepare;\r\n\n},{\"../../util\":87,\"lodash\":116}],39:[function(require,module,exports){\n'use strict';\r\n\r\nvar address = require('./address'),\r\n billing = require('./billing'),\r\n multiship = require('./multiship'),\r\n shipping = require('./shipping');\r\n\r\n/**\r\n * @function Initializes the page events depending on the checkout stage (shipping/billing)\r\n */\r\nexports.init = function () {\r\n address.init();\r\n if ($('.checkout-shipping').length > 0) {\r\n shipping.init();\r\n } else if ($('.checkout-multi-shipping').length > 0) {\r\n multiship.init();\r\n } else {\r\n billing.init();\r\n }\r\n\r\n //if on the order review page and there are products that are not available diable the submit order button\r\n if ($('.order-summary-footer').length > 0) {\r\n if ($('.notavailable').length > 0) {\r\n $('.order-summary-footer .submit-order .button-fancy-large').attr('disabled', 'disabled');\r\n }\r\n }\r\n};\r\n\n},{\"./address\":35,\"./billing\":36,\"./multiship\":41,\"./shipping\":42}],40:[function(require,module,exports){\n'use strict';\r\n\r\n/**\r\n * @function\r\n * @description Enable/disable button depending if input has value\r\n */\r\nexports.init = function () {\r\n var $emailInput = $('.checkoutlogin input[type=\"email\"]');\r\n var $emailButton = $('.checkoutlogin button');\r\n $emailInput.on('keyup', function(e){\r\n \t if($emailInput.val().length){\r\n \t \t$emailButton.prop('disabled', false);\r\n \t } else {\r\n// \t \t$emailButton.prop('disabled', true);\r\n \t }\r\n });\r\n};\r\n\n},{}],41:[function(require,module,exports){\n'use strict';\r\n\r\nvar address = require('./address'),\r\n formPrepare = require('./formPrepare'),\r\n dialog = require('../../dialog'),\r\n util = require('../../util'),\r\n validator = require('../../validator');\r\n\r\n/**\r\n * @function\r\n * @description Initializes gift message box for multiship shipping, the message box starts off as hidden and this will display it if the radio button is checked to yes, also added event handler to listen for when a radio button is pressed to display the message box\r\n */\r\nfunction initMultiGiftMessageBox() {\r\n $.each($('.item-list'), function () {\r\n var $this = $(this);\r\n var $giftMessage = $this.find('.gift-message-text');\r\n\r\n //handle initial load\r\n $giftMessage.toggleClass('hidden', $('input[name$=\"_isGift\"]:checked', this).val() !== 'true');\r\n\r\n //set event listeners\r\n $this.on('change', function () {\r\n $giftMessage.toggleClass('hidden', $('input[name$=\"_isGift\"]:checked', this).val() !== 'true');\r\n });\r\n });\r\n}\r\n\r\n\r\n/**\r\n * @function\r\n * @description capture add edit adddress form events\r\n */\r\nfunction addEditAddress(target) {\r\n var $addressForm = $('form[name$=\"multishipping_editAddress\"]'),\r\n $addressDropdown = $addressForm.find('select[name$=_addressList]'),\r\n $addressList = $addressForm.find('.address-list'),\r\n add = true,\r\n originalUUID,\r\n resetOptionValue = false,\r\n selectedAddressUUID = $(target).parent().siblings('.select-address').val();\r\n\r\n $addressDropdown.on('change', function (e) {\r\n e.preventDefault();\r\n\r\n var selectedAddress = $addressList.find('select').val();\r\n if (selectedAddress !== 'newAddress') {\r\n selectedAddress = $.grep($addressList.data('addresses'), function (add) {\r\n return add.UUID === selectedAddress;\r\n })[0];\r\n add = false;\r\n resetOptionValue = false;\r\n // proceed to fill the form with the selected address\r\n util.fillAddressFields(selectedAddress, $addressForm);\r\n } else if (selectedAddress === 'newAddress') {\r\n add = true;\r\n resetOptionValue = true;\r\n $addressForm.find('.input-text, .input-select').val('');\r\n } else {\r\n //reset the form if the value of the option is not a UUID\r\n $addressForm.find('.input-text, .input-select').val('');\r\n }\r\n });\r\n\r\n $addressForm.on('click', '.cancel', function (e) {\r\n e.preventDefault();\r\n dialog.close();\r\n });\r\n\r\n $addressForm.on('submit', function (e) {\r\n e.preventDefault();\r\n if (!$addressForm.valid()) {\r\n return false;\r\n }\r\n\r\n $.getJSON(Urls.addEditAddress, $addressForm.serialize(), function (response) {\r\n if (!response.success) {\r\n $('#multiaddresserror').html(Resources.COULD_NOT_SAVE_ADDRESS);\r\n return;\r\n }\r\n $('#multiaddresserror').toggleClass('hidden', response.success);\r\n\r\n var address = response.address,\r\n $shippingAddress = $(target).closest('.shippingaddress'),\r\n $select = $shippingAddress.find('.select-address'),\r\n $selected = $select.find('option:selected'),\r\n newOption = '';\r\n dialog.close();\r\n\r\n if (address.UUID !== originalUUID) {\r\n resetOptionValue = true;\r\n }\r\n\r\n if (add) {\r\n $('.shippingaddress select').removeClass('no-option').append(newOption);\r\n $('.no-address').hide();\r\n } else {\r\n $('.shippingaddress select').find('option[value=\"' + address.UUID + '\"]').html(newOption);\r\n }\r\n // if there's no previously selected option, select it\r\n if ($selected.length === 0 || $selected.val() === '' || resetOptionValue) {\r\n $select.find('option[value=\"' + address.UUID + '\"]').prop('selected', 'selected').trigger('change');\r\n }\r\n });\r\n });\r\n\r\n //preserve the uuid of the option for the hop up form\r\n if (selectedAddressUUID) {\r\n //update the form with selected address\r\n $addressList.find('option').each(function () {\r\n //check the values of the options\r\n if ($(this).attr('value') === selectedAddressUUID) {\r\n $(this).prop('selected', 'selected');\r\n $addressDropdown.trigger('change');\r\n }\r\n });\r\n originalUUID = selectedAddressUUID;\r\n }\r\n\r\n validator.init();\r\n}\r\n\r\n/**\r\n * @function\r\n * @description shows gift message box in multiship, and if the page is the multi shipping address page it will call initmultishipshipaddress() to initialize the form\r\n */\r\nexports.init = function () {\r\n initMultiGiftMessageBox();\r\n if ($('.cart-row .shippingaddress .select-address').length > 0) {\r\n \tvalidator.initForm('form[id$=\"multishipping_addressSelection\"]');\r\n }\r\n $('.edit-address').on('click', 'span', function (e) {\r\n dialog.open({url: this.attributes.href.value, options: {open: function () {\r\n address.init();\r\n addEditAddress(e.target);\r\n }}});\r\n });\r\n};\r\n\n},{\"../../dialog\":16,\"../../util\":87,\"../../validator\":88,\"./address\":35,\"./formPrepare\":38}],42:[function(require,module,exports){\n'use strict';\r\n\r\nvar ajax = require('../../ajax'),\r\n progress = require('../../progress'),\r\n tooltip = require('../../tooltip'),\r\n util = require('../../util'),\r\n validator = require('../../validator'),\r\n page = require('../../page'),\r\n modal = require('../../modal').global,\r\n addressVerificationSvc = require('../../qas'),\r\n customaddress = require('../customaddress'),\r\n initCleanAutoFill = require('../../address-book');\r\n\r\nvar $cache, shippingMethods;\r\n\r\nfunction initCache() {\r\n var $formEle = $('form[id$=\"_shippingAddress\"]');\r\n $cache = {\r\n addrForm: {\r\n address1: $formEle.find('input[name$=\"_address1\"]'),\r\n address2: $formEle.find('input[name$=\"_address2\"]'),\r\n countryCode: $formEle.find('select[id$=\"_country\"]'),\r\n stateCode: $formEle.find('select[id$=\"_state\"]'),\r\n postalCode: $formEle.find('input[name$=\"_postal\"]'),\r\n city: $formEle.find('input[name$=\"_city\"]')\r\n }\r\n };\r\n}\r\n\r\n// Removes 'PO Box shipping is not available' caption from address1 field if preference is true\r\nfunction removePOBoxCaption(){\r\n\r\n if (SitePreferences.ENABLE_POBOX_ADDRESS){\r\n \tvar $addressOne = $('input[name$=\"_address1\"]');\r\n \t$addressOne.closest(\".form-row\").find(\".form-caption\").text('');\r\n \tvar $addressTwo = $('input[name$=\"_address2\"]');\r\n \t$addressTwo.closest(\".form-row\").find(\".form-caption\").text('');\r\n }\r\n}\r\n\r\nfunction initEvents() {\r\n var href;\r\n $(document)\r\n // create address link\r\n .on(\"click\", \".address-create\", function (evt) {\r\n modal.addCustomClass('edit-add-address');\r\n var _YubinBango = typeof (YubinBango) !== 'undefined' && YubinBango ? YubinBango : '';\r\n modal.events.onOpen(function() {\r\n if (_YubinBango) {\r\n new _YubinBango.MicroformatDom();\r\n }\r\n validator.initForm('form[id=\"EditAddressForm\"]');\r\n addressVerificationSvc.init();\r\n removePOBoxCaption();\r\n initCleanAutoFill.init();\r\n $('.country').trigger('change');\r\n });\r\n\r\n modal.renderByUrl(Urls.checkoutAddAddress);\r\n })\r\n\r\n // edit address link\r\n .on(\"click\", \".address-edit\", function (evt) {\r\n var $this = $(this);\r\n var addressID = $this.data('addressId');\r\n\r\n modal.addCustomClass('edit-add-address');\r\n var _YubinBango = typeof (YubinBango) !== 'undefined' && YubinBango ? YubinBango : '';\r\n modal.events.onOpen(function() {\r\n if (_YubinBango) {\r\n new _YubinBango.MicroformatDom();\r\n }\r\n validator.initForm('form[id=\"EditAddressForm\"]');\r\n\r\n var setDefaultCheckbox = $('input[id$=\"_setdefault\"]');\r\n if (setDefaultCheckbox.prop('checked')) {\r\n setDefaultCheckbox.attr('disabled', 'true');\r\n }\r\n\r\n addressVerificationSvc.init();\r\n removePOBoxCaption();\r\n initCleanAutoFill.init();\r\n $('.country').trigger('change');\r\n });\r\n\r\n modal.renderByUrl(Urls.checkoutEditAddress + addressID);\r\n })\r\n\r\n .on('click', '.address-delete', function (e) {\r\n e.preventDefault();\r\n href = $(this).attr('href');\r\n var popup = new Foundation.Reveal($('#remove-address'));\r\n popup.open();\r\n //No button\r\n $(\".addressDelete-modal-btn-cancel\").on(\"click\", function () {\r\n popup.close();\r\n });\r\n })\r\n\r\n //Yes button\r\n .on(\"click\", \".addressDelete-modal-btn-ok\", function (e) {\r\n var data_json = {};\r\n\r\n if ($('#csrf_token') && $('#csrf_token').length === 1) {\r\n var csrfTokenVal = $('#csrf_token').val();\r\n var csrfTokenKey = $('#csrf_token').prop('name');\r\n data_json[csrfTokenKey] = csrfTokenVal;\r\n }\r\n $.ajax({\r\n type: 'POST',\r\n url: util.appendParamToURL(href, 'format', 'ajax'),\r\n dataType: 'json',\r\n data: data_json,\r\n }).done(function (data) {\r\n page.refresh();\r\n });\r\n })\r\n\r\n .on(\"click\", \".address-make-default\", function (e) {\r\n e.preventDefault();\r\n var href = $(this).attr('href');\r\n var data_json = {};\r\n\r\n if ($('#csrf_token') && $('#csrf_token').length === 1) {\r\n var csrfTokenVal = $('#csrf_token').val();\r\n var csrfTokenKey = $('#csrf_token').prop('name');\r\n data_json[csrfTokenKey] = csrfTokenVal;\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: util.appendParamToURL(href, 'format', 'ajax'),\r\n data: data_json,\r\n }).done(function (data) {\r\n page.refresh();\r\n });\r\n })\r\n\r\n // authenticated user address change\r\n .on('click', '.address-list .address-tile', function (evt) {\r\n if ($(this).is('.selected, .default') || evt.target.nodeName == 'A') {\r\n return false;\r\n }\r\n\r\n $('.address-list .address-tile').each(function() {\r\n $(this).removeClass('selected');\r\n $(this).removeClass('default');\r\n });\r\n\r\n $(this).addClass('selected');\r\n\r\n var element = document.getElementById(evt.currentTarget.id);\r\n var addressID = element.dataset.addressId;\r\n\r\n // update address; on success update shipping method list\r\n $.get(Urls.updateAddressDetails, { addressID: addressID }, function (response) {\r\n updateShippingMethodList();\r\n });\r\n renderTemplateFollowCountry();\r\n checkSelectedAddress();\r\n });\r\n\r\n // guest user address change\r\n var timer = null;\r\n $('form[id$=\"_shippingAddress\"]').on('change', 'input[name$=\"_addressFields_address1\"], input[name$=\"_addressFields_address2\"], select[name$=\"_addressFields_states_state\"], input[name$=\"_addressFields_city\"], input[name$=\"_addressFields_postal\"]', function () {\r\n if (!validateAddrForm()) {\r\n return;\r\n }\r\n\r\n if (timer) {\r\n window.clearTimeout(timer);\r\n }\r\n\r\n timer = window.setTimeout(function () {\r\n $.post(Urls.setShippingAddressDetails, $('form[id$=\"_singleshipping_shippingAddress\"]').serialize(), function (result) {\r\n updateShippingMethodList();\r\n });\r\n }, 200);\r\n });\r\n\r\n $('form[id$=\"_shippingAddress\"]').on('change', 'select[name$=\"_shippingaddress_country\"]', renderTemplateFollowCountry);\r\n $('input[name$=\"_shippingAddress_isGift\"]').on('click', giftMessageBox);\r\n $('input[name$=\"_cart_isGift\"]').on('click', giftMessageBox);\r\n}\r\n\r\n/**\r\n * @function\r\n * @description Initializes gift message box, if shipment is gift\r\n */\r\nfunction giftMessageBox() {\r\n // show gift message box, if shipment is gift\r\n $('.gift-message-text').toggleClass('hidden', $('input[name$=\"_shippingAddress_isGift\"]:checked').val() !== 'true');\r\n $('.complimentary-gift-container').toggleClass('hidden, hide', $('input[name$=\"_cart_isGift\"]:checked').val() !== 'true');\r\n}\r\n\r\n/**\r\n * @function\r\n * @description updates the order summary based on a possibly recalculated basket after a shipping promotion has been applied\r\n */\r\nfunction updateSummary() {\r\n var $summary = $('#secondary.summary');\r\n var couponError;\r\n\r\n if ($('.cart-coupon-code .error').length) {\r\n couponError = $('.cart-coupon-code .error').clone();\r\n }\r\n\r\n var showmsg = \"none\";\r\n if ($('.cart-coupon-code .success').length > 0) {\r\n \tshowmsg = \"show\";\r\n }\r\n\r\n // indicate progress\r\n progress.show($summary);\r\n\r\n // load the updated summary area\r\n $summary.load(Urls.summaryRefreshURL+\"?showmsg=\"+showmsg, function () {\r\n // hide edit shipping method link\r\n $summary.fadeIn('fast');\r\n\r\n // checkout checkout minicart on right side event handling\r\n addSummaryScrollbar();\r\n\r\n $summary.find('.checkout-mini-cart .minishipment .header a').hide();\r\n $summary.find('.order-totals-table .order-shipping .label a').hide();\r\n $('.cart-coupon-code').append(couponError);\r\n util.maximizeCheckoutSummary();\r\n\r\n $(\".checkout-mini-cart .accordion\").foundation();\r\n isCanShipToChina();\r\n });\r\n}\r\n\r\nfunction getAddressFromTile() {\r\n var $selectedAddress = $(\".address-tile.selected address\");\r\n\r\n return {\r\n address1: $selectedAddress.data(\"address-one\"),\r\n address2: $selectedAddress.data(\"address-two\") || \"\",\r\n countryCode: $selectedAddress.data(\"country-code\"),\r\n stateCode: $selectedAddress.data(\"state-code\"),\r\n postalCode: $selectedAddress.data(\"postal-code\"),\r\n city: $selectedAddress.data(\"city\")\r\n };\r\n}\r\n\r\nfunction getAddressFromForm() {\r\n return {\r\n address1: $cache.addrForm.address1.val(),\r\n address2: $cache.addrForm.address2.val(),\r\n countryCode: $cache.addrForm.countryCode.val(),\r\n stateCode: $cache.addrForm.stateCode.val(),\r\n postalCode: $cache.addrForm.postalCode.val(),\r\n city: $cache.addrForm.city.val()\r\n };\r\n}\r\n/**\r\n * @function\r\n * @description Helper method which constructs a URL for an AJAX request using the\r\n * entered address information as URL request parameters.\r\n */\r\nfunction getShippingMethodURL(url, extraParams) {\r\n var $form = $('form[id$=\"_shippingAddress\"]');\r\n var params = User.isCustomerAuthenticated ? $form.find('.address-tile').length > 0 ? getAddressFromTile() : getAddressFromForm() : getAddressFromForm();\r\n return util.appendParamsToUrl(url, $.extend(params, extraParams));\r\n}\r\n\r\n/**\r\n * @function\r\n * @description selects a shipping method for the default shipment and updates the summary section on the right hand side\r\n * @param\r\n */\r\nfunction selectShippingMethod(shippingMethodID) {\r\n // nothing entered\r\n if (!shippingMethodID) {\r\n return;\r\n }\r\n // attempt to set shipping method\r\n var url = getShippingMethodURL(Urls.selectShippingMethodsList, {shippingMethodID: shippingMethodID});\r\n ajax.getJson({\r\n url: url,\r\n callback: function (data) {\r\n updateSummary();\r\n if (!data || !data.shippingMethodID) {\r\n window.alert('Couldn\\'t select shipping method.');\r\n return false;\r\n }\r\n // display promotion in UI and update the summary section,\r\n // if some promotions were applied\r\n $('.shippingpromotions').empty();\r\n\r\n\r\n // if (data.shippingPriceAdjustments && data.shippingPriceAdjustments.length > 0) {\r\n // var len = data.shippingPriceAdjustments.length;\r\n // for (var i=0; i < len; i++) {\r\n // var spa = data.shippingPriceAdjustments[i];\r\n // }\r\n // }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * @function\r\n * @description Make an AJAX request to the server to retrieve the list of applicable shipping methods\r\n * based on the merchandise in the cart and the currently entered shipping address\r\n * (the address may be only partially entered). If the list of applicable shipping methods\r\n * has changed because new address information has been entered, then issue another AJAX\r\n * request which updates the currently selected shipping method (if needed) and also updates\r\n * the UI.\r\n */\r\nfunction updateShippingMethodList() {\r\n var $shippingMethodList = $('#shipping-method-list');\r\n if (!$shippingMethodList || $shippingMethodList.length === 0) { return; }\r\n var url = getShippingMethodURL(Urls.shippingMethodsJSON);\r\n ajax.getJson({\r\n url: url,\r\n callback: function (data) {\r\n if (!data) {\r\n window.alert('Couldn\\'t get list of applicable shipping methods.');\r\n return false;\r\n }\r\n\r\n // shipping methods remain unchanged; update summary as selected method may/may not change\r\n if (shippingMethods && shippingMethods.toString() === data.toString()) {\r\n updateSummary();\r\n return true;\r\n }\r\n\r\n // We need to update the UI. The list has changed.\r\n // Cache the array of returned shipping methods.\r\n shippingMethods = data;\r\n // indicate progress\r\n progress.show($shippingMethodList);\r\n\r\n // load the shipping method form\r\n var smlUrl = getShippingMethodURL(Urls.shippingMethodsList);\r\n $shippingMethodList.load(smlUrl, function () {\r\n $shippingMethodList.fadeIn('fast');\r\n // rebind the radio buttons onclick function to a handler.\r\n $shippingMethodList.find('[name$=\"_shippingMethodID\"]').on(\"click\", function () {\r\n selectShippingMethod($(this).val());\r\n });\r\n\r\n // update the summary\r\n updateSummary();\r\n progress.hide();\r\n tooltip.init();\r\n //if nothing is selected in the shipping methods select the first one\r\n if ($shippingMethodList.find('.input-radio:checked').length === 0) {\r\n $shippingMethodList.find('.input-radio:first').prop('checked', 'checked');\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\nfunction isCanShipToChina() {\r\n var url = Urls.isCanShipToChina;\r\n $.ajax({\r\n type: 'POST',\r\n dataType: 'json',\r\n url: url\r\n })\r\n .done(function (response) {\r\n if (response.status) {\r\n $('.error.isCanShipToChina').addClass('hide');\r\n } else {\r\n $('.error.isCanShipToChina').removeClass('hide');\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Check there is an address selected, if not, disable the continue button\r\n * */\r\nfunction checkSelectedAddress(){\r\n\tvar $form = $('form[id$=\"_shippingAddress\"]');\r\n\tvar $submit = $form.find('button[type=\"submit\"]');\r\n\r\n\t// enable the submit button if there are no shipping card\r\n\t// if there are, user must have at least 1 selected shipping card for the button to be enabled\r\n\tif($form.find('.address-tile').length == 0 || $form.find('.address-tile.selected').length){\r\n\t\t$submit.prop('disabled', false);\r\n\t} else {\r\n\t\t$submit.prop('disabled', true);\r\n\t}\r\n}\r\n\r\nfunction renderTemplateFollowCountry () {\r\n var $form = $('form[id$=\"_shippingAddress\"]');\r\n var params = User.isCustomerAuthenticated ? $form.find('.address-tile').length > 0 ? getAddressFromTile() : getAddressFromForm() : getAddressFromForm();\r\n var countryCode = params.countryCode.toLowerCase();\r\n\r\n check_countryCode(countryCode);\r\n}\r\n\r\nfunction chk_emptyAddress() {\r\n if($('.no-address-items').length > 0) {\r\n var countryCode = $('select[name=dwfrm_singleshipping_shippingAddress_addressFields_country]').val();\r\n check_countryCode(countryCode);\r\n initCleanAutoFill.init();\r\n $('select[name=dwfrm_singleshipping_shippingAddress_addressFields_country]').change(function() {\r\n countryCode = $(this).val();\r\n check_countryCode(countryCode)\r\n });\r\n }\r\n}\r\n\r\nfunction check_countryCode(countryCode) {\r\n if (countryCode.toLowerCase() === 'jp') {\r\n //show shipping time, hide and empty personal number\r\n $('div.shipping-time').removeClass('hidden');\r\n $('div.personal-number').addClass('hidden');\r\n $('input[name=dwfrm_singleshipping_shippingAddress_isGiftWrapping]').attr('disabled', false);\r\n $('.gitf-service').find('.form-row').first().removeClass('fade-6');\r\n $('.personal-number').find('.form-row').removeClass('required');\r\n $('input[name=dwfrm_singleshipping_personalNumber]').removeClass('required personalnumberid');\r\n $('.shipping-time').find('.form-row').addClass('required');\r\n $('input[name=dwfrm_singleshipping_shippingAddress_deliverytime]').addClass('required');\r\n } else {\r\n //show personal number, hide and choose undefine shipping time, choose gift wrapping\r\n $('div.shipping-time').addClass('hidden');\r\n $('div.personal-number').removeClass('hidden');\r\n $('.gitf-service input.isgiftwrapping:first-child').addClass('disabled');\r\n $('.gitf-service input.isgiftwrapping:nth-child(2)').addClass('disabled');\r\n $('input[name=dwfrm_singleshipping_shippingAddress_isGiftWrapping]').attr('disabled', true);\r\n $('#dwfrm_singleshipping_shippingAddress_isGiftWrapping_true').prop('checked', true);\r\n $('.gitf-service').find('.form-row').first().addClass('fade-6');\r\n $('.personal-number').find('.form-row').addClass('required');\r\n $('input[name=dwfrm_singleshipping_personalNumber]').addClass('required personalnumberid');\r\n $('.shipping-time').find('.form-row').removeClass('required');\r\n $('input[name=dwfrm_singleshipping_shippingAddress_deliverytime]').removeClass('required');\r\n }\r\n}\r\n\r\nfunction validateAddrForm() {\r\n var addr = getAddressFromForm();\r\n return addr.address1 && addr.city && addr.postalCode && addr.stateCode && addr.countryCode;\r\n}\r\n\r\nfunction initCouponCodeField() {\r\n $('.cart-coupon-code input').on('keydown', function (e) {\r\n \tvar couponCode = $('.cart-coupon-code input').val(); \r\n if (couponCode == '') {\r\n $('#add-coupon').prop('disabled', true);\r\n } else {\r\n $('#add-coupon').prop('disabled', false);\r\n }\r\n \r\n if (e.which === 13) {\r\n e.preventDefault();\r\n $('#add-coupon').trigger(\"click\");\r\n }\r\n })\r\n}\r\n\r\nexports.init = function () {\r\n initCache();\r\n initEvents();\r\n customaddress.init();\r\n addressVerificationSvc.init();\r\n\r\n if (window.User.isCustomerAuthenticated == false) {\r\n $('.checkout-shipping').find('.set-default-cb').hide();\r\n }\r\n removePOBoxCaption();\r\n\tvalidator.initForm('form[name$=\"shippingAddress_save\"]');\r\n\r\n\r\n giftMessageBox();\r\n updateShippingMethodList();\r\n initCouponCodeField(); \r\n\r\n chk_emptyAddress();\r\n\r\n $(document).find('div.address-list div.address-tile').each(function() {\r\n if ($(this).hasClass('default') || $(this).hasClass('selected') || $(this).hasClass('address-default')) {\r\n $(this).removeClass('selected');\r\n $(this).removeClass('default');\r\n\r\n \t $(this).trigger(\"click\");\r\n }\r\n });\r\n\r\n checkSelectedAddress();\r\n\r\n};\r\n\r\nexports.updateShippingMethodList = updateShippingMethodList;\r\n\n},{\"../../address-book\":3,\"../../ajax\":5,\"../../modal\":28,\"../../page\":31,\"../../progress\":75,\"../../qas\":76,\"../../tooltip\":86,\"../../util\":87,\"../../validator\":88,\"../customaddress\":45}],43:[function(require,module,exports){\n'use strict';\r\n\r\nvar addProductToCart = require('./product/addToCart'),\r\n ajax = require('../ajax'),\r\n page = require('../page'),\r\n productTile = require('../product-tile'),\r\n quickview = require('../quickview');\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Binds the click events to the remove-link and quick-view button\r\n */\r\nfunction initializeEvents() {\r\n $('#compare-table').on('click', '.remove-link', function (e) {\r\n e.preventDefault();\r\n ajax.getJson({\r\n url: this.href,\r\n callback: function () {\r\n page.refresh();\r\n }\r\n });\r\n })\r\n .on('click', '.open-quick-view', function (e) {\r\n e.preventDefault();\r\n var url = $(this).closest('.product').find('.thumb-link').attr('href');\r\n quickview.show({\r\n url: url,\r\n source: 'quickview'\r\n });\r\n });\r\n\r\n $('#compare-category-list').on('change', function () {\r\n $(this).closest('form').trigger(\"submit\");\r\n });\r\n}\r\n\r\nexports.init = function () {\r\n productTile.init();\r\n initializeEvents();\r\n addProductToCart();\r\n};\r\n\n},{\"../ajax\":5,\"../page\":31,\"../product-tile\":74,\"../quickview\":77,\"./product/addToCart\":48}],44:[function(require,module,exports){\n'use strict';\r\n\r\nvar util = require('../util');\r\n\r\nfunction initializeEvents() {\r\n\t$(document)\r\n\r\n\t\t// mobile navigation\r\n\t\t.on('change', '.promotion-nav-select select', function (e) {\r\n\t\t\tvar newUrl = $(this).find(\"option:selected\").val();\r\n\r\n\t\t\tif (newUrl) {\r\n\t\t\t\twindow.location.href = newUrl;\r\n\t\t\t}\r\n\t\t});\r\n\r\n // concierge form events\r\n var conciergeForm = $('form[id$=\"_beautyconsultant\"]');\r\n if (conciergeForm.length > 0) {\r\n // secure concierge access\r\n /*if (location && location.protocol === 'http:') {\r\n window.location.href = Urls.secureConciergeForm;\r\n }*/\r\n\r\n var successShown = false;\r\n conciergeForm.on('click', 'button#sendBtn', function(e) {\r\n e.preventDefault();\r\n\r\n $.ajax({\r\n url: util.appendParamToURL(Urls.customerServiceSubmit, 'source', 'concierge'),\r\n data: conciergeForm.serialize(),\r\n method: 'POST'\r\n }).done(function (response) {\r\n var conciergeModal = $('#concierge-modal');\r\n if (response && response.success && conciergeModal.length > 0) {\r\n // show success modal\r\n successShown = true;\r\n var popup = new Foundation.Reveal(conciergeModal);\r\n //Window height minus 80px, which sets the modal to fit inside the device's screen\r\n var windowHeight = window.innerHeight - 130;\r\n\r\n popup.$element.children('.modal-body').css('max-height', windowHeight);\t\r\n popup.open();\r\n\r\n // trigger ga\r\n window.history.pushState(\"\", \"\", Urls.conciergeForm);\r\n $(document).trigger(\"askanexpert\");\r\n }\r\n });\r\n });\r\n\r\n $(document).on('click', '.reveal-overlay', function () {\r\n // trigger redirect when concierge overlay is closed\r\n if (successShown && $(this).css('display') == 'none') {\r\n successShown = false;\r\n window.location.href = Urls.secureConciergeForm;\r\n }\r\n });\r\n }\r\n}\r\n\r\nmodule.exports.init = function () {\r\n\tinitializeEvents();\r\n};\n},{\"../util\":87}],45:[function(require,module,exports){\n'use strict';\r\n\r\nvar util = require('../util');\r\n\r\nfunction initializeEvents() {\r\n $(document)\r\n // change country\r\n .on(\"change\", \".country \", function (evt) {\r\n var currentCountry = $(this).val();\r\n var $postal = $('input[name$=\"_postal\"]');\r\n if (currentCountry == 'JP') {\r\n toggleClassYubinBango(true);\r\n $postal.attr('maxlength', '7');\r\n $('[name$=\"_phone\"]').attr('minlength', '10').attr('maxlength', '13');\r\n } else {\r\n toggleClassYubinBango(false);\r\n if ($postal.val() && $postal.val().length > 6) {\r\n $postal.val($postal.val().slice(0, 6))\r\n }\r\n $postal.attr('maxlength', '6');\r\n $('[name$=\"_phone\"]').attr('minlength', '10').attr('maxlength', '14');\r\n }\r\n loadStatesList(currentCountry);\r\n\r\n })\r\n .on(\"keyup focusout\", \".p-postal-code\", function (evt) {\r\n var postalCode = $('.p-postal-code').val();\r\n var country = $('.country').val();\r\n if (country == 'JP' && postalCode.length >= 7) {\r\n if ($('.p-region').val()) {\r\n $('.p-region').blur();\r\n }\r\n if ($('.p-locality').val()) {\r\n $('.p-locality').blur();\r\n }\r\n if ($('.p-street-address').val()) {\r\n $('.p-street-address').blur();\r\n }\r\n }\r\n })\r\n .on(\"submit\", \"form#EditAddressForm\", function (evt) {\r\n evt.preventDefault();\r\n var applyName = $(this).find('button.apply-button').attr('name');\r\n var url = util.ajaxUrl($(this).attr('action'));\r\n var data = $(this).serialize();\r\n $.ajax({\r\n type: 'post',\r\n data: data + '&' + applyName + '=x',\r\n dataType: 'json',\r\n url: url\r\n }).done(function (res) {\r\n if (res.success) {\r\n window.location.href = res.urlRedirect;\r\n } else {\r\n $('#AddressForm span.form-error-message').html(res.message);\r\n $('.modal-body').animate({scrollTop: 0}, 200, 'linear');\r\n }\r\n });\r\n });\r\n\r\n $('.country').trigger(\"change\");\r\n\r\n}\r\n\r\nfunction toggleClassYubinBango(turnOn) {\r\n if (turnOn) {\r\n $('.state').addClass('p-region');\r\n $('.city').addClass('p-locality');\r\n $('.address1').addClass('p-street-address');\r\n } else {\r\n $('.state').removeClass('p-region');\r\n $('.city').removeClass('p-locality');\r\n $('.address1').removeClass('p-street-address');\r\n }\r\n}\r\n\r\nfunction loadStatesList(currentCountry) {\r\n if (currentCountry) {\r\n var statesSelectListContent = $('select[name*=\"states_state\"]');\r\n var url = Urls.getStatesList + '?country=' + currentCountry;\r\n $.get(url, function (response) {\r\n if (response.success) {\r\n var states = response.states;\r\n var html = '';\r\n var selectedState = statesSelectListContent.find('option:selected').val() || '';\r\n\r\n for (var i = 0; i < states.length; i++) {\r\n var state = states[i];\r\n var selected = (selectedState == state.value) ? 'selected=\"selected\"' : '';\r\n html += ''\r\n }\r\n statesSelectListContent.html(html);\r\n }\r\n });\r\n }\r\n}\r\n\r\nexports.init = function () {\r\n initializeEvents();\r\n};\r\n\r\nexports.loadStatesList = loadStatesList;\n},{\"../util\":87}],46:[function(require,module,exports){\n'use strict';\r\n\r\nvar util = require('../util');\r\n\r\n\r\n\r\nvar errorpages = {\r\n\t\t\r\n\tinit: function () {\r\n\t\t\r\n\t}\r\n\t\t\r\n};\r\n\r\n$(function() {\r\n\tvar $carousel = $('.carousel-recommendations').not('.slick-initialized');\r\n\tvar isHomepage = $('.pt_storefront').length > 0;\r\n\tif (!$carousel || $carousel.length === 0 || $carousel.children().length === 0) {\r\n\treturn;\r\n}\r\n\t$carousel.slick({\r\n\t\tinfinite: true,\r\n\t\tslidesToShow: isHomepage > 0 ? 3 : 4,\r\n\t\tslidesToScroll: 1,\r\n\t\tslide: 'li',\r\n\t\tdots: isHomepage ? false : true,\r\n\t\tresponsive: [\r\n\t\t{\r\n\t\t\tbreakpoint: 600,\r\n\t\t\tsettings: {\r\n\t\t\t\tslidesToShow: 3,\r\n\t\t\t\tslidesToScroll: 3,\r\n\t\t\t\tinfinite: true,\r\n\t\t\t\tdots: true,\r\n\t\t\t\tarrows: true,\r\n\t\t\t}\r\n\t\t},\r\n\t\t{\r\n\t\t\tbreakpoint: 480,\r\n\t\t\tsettings: {\r\n\t\t\t\tslidesToShow: isHomepage > 0 ? 1 : 2,\r\n\t\t\t\tslidesToScroll: 1,\r\n\t\t\t\tinfinite: true,\r\n\t\t\t\tarrows: true,\r\n\t\t\t\tdots: true\r\n\t\t\t}\r\n\t\t}\r\n\t\t]\r\n\t});\r\n});\r\n\r\nmodule.exports = errorpages;\n},{\"../util\":87}],47:[function(require,module,exports){\n'use strict';\r\n\r\nvar recommendations = require('./product/recommendations');\r\n\r\nexports.init = function () {\r\n\tif ($('.pt_order-confirmation').length) {\r\n\t\trecommendations();\r\n\t} else {\r\n\t\treturn;\r\n\t}\r\n};\n},{\"./product/recommendations\":54}],48:[function(require,module,exports){\n'use strict';\r\n\r\nvar minicart = require('../../minicart'),\r\n page = require('../../page'),\r\n util = require('../../util'),\r\n modal = require('../../modal').global,\r\n Promise = require('promise'),\r\n _ = require('lodash'),\r\n analytics = require('../../analytics');\r\n\r\n/**\r\n * @description set addToCart error message\r\n * @param {String} msg\r\n */\r\nvar timer;\r\nvar setAddToCartError = function (msg) {\r\n var $errEle = $(\"#a2c-error\");\r\n $errEle.html(msg).show();\r\n\r\n // if(timer) {\r\n // clearTimeout(timer);\r\n // }\r\n\r\n // timer = setTimeout(function () {\r\n // \t$errEle.hide();\r\n // }, 1500);\r\n};\r\n\r\n/**\r\n * @description Make the AJAX request to add an item to cart\r\n * @param {Element} form The form element that contains the item quantity and ID data\r\n * @returns {Promise}\r\n */\r\nvar addItemToCart = function (form) {\r\n var $form = $(form);\r\n\r\n return Promise.resolve($.ajax({\r\n type: 'POST',\r\n url: util.ajaxUrl(Urls.addProduct),\r\n data: $form.serialize()\r\n })).then(function (response) {\r\n // handle error in the response\r\n if (response.error) {\r\n setAddToCartError(response.error);\r\n throw new Error(response.error);\r\n return false;\r\n }\r\n\r\n return response;\r\n });\r\n};\r\n\r\n/**\r\n * @description Handler to handle the add to cart event\r\n */\r\nvar addToCart = function (e) {\r\n e.preventDefault();\r\n var $form = $(this).closest('form');\r\n\r\n addItemToCart($form).then(function (response) {\r\n var $uuid = $form.find('input[name=\"uuid\"]');\r\n if ($uuid.length > 0 && $uuid.val().length > 0) {\r\n page.refresh();\r\n } else {\r\n // do not close quickview if adding individual item that is part of product set\r\n // @TODO should notify the user some other way that the add action has completed successfully\r\n //if (!$(this).hasClass('sub-product-item')) {\r\n $(\".quickview-modal .close-button\").trigger(\"click\");\r\n //dialog.close();\r\n //}\r\n analytics.initAddToCartFromPDP();\r\n $(document).trigger(\"gtadd-to-cart\");\r\n minicart.show(response);\r\n }\r\n }.bind(this));\r\n};\r\n\r\n/**\r\n * @description Handler to handle the add all items to cart event\r\n */\r\nvar addAllTo = function (e) {\r\n e.preventDefault();\r\n\r\n var pidData = formatPidDataFromEles($('.product-set-list').find('form'));\r\n minicart.addAllProducts(pidData, e.data.to);\r\n $(\".quickview-modal .close-button\").trigger(\"click\");\r\n};\r\n\r\n// Accepts jQuery selector of n elements containing data attr storing pid\r\n// Returns formatted pid data required for addAllProducts request (ex. 'pidA:1,pidB:1,pidN:1')\r\n// To fetch qty, searches for qty dropdown or defaults to 1\r\nfunction formatPidDataFromEles($selector) {\r\n return $selector.toArray().map(function (ele) {\r\n var $ele = $(ele),\r\n pid = $ele.data('pid'),\r\n qty = $ele.find('select[name=\"Quantity\"]').length ? $ele.find('select[name=\"Quantity\"]').val() : 1;\r\n\r\n return pid + \":\" + qty;\r\n }).join(',');\r\n}\r\n\r\n/**\r\n * @function\r\n * @description Binds the click event to a given target for the add-to-cart handling\r\n */\r\nmodule.exports = function () {\r\n $('.add-to-cart[disabled]').attr('title', $('.availability-msg').text());\r\n $('#add-all-to-cart').on('click', {to: 'Cart'}, addAllTo);\r\n $('.product-form-actions .product-set-wishlist').on('click', {to: 'Wishlist'}, addAllTo);\r\n};\r\n\r\n/**\r\n * duplicated add-to-cart from export above - endorse for re-factoring\r\n * reason for duplication : sometimes add to bag/cart script won't trigger/execute\r\n */\r\n$(document).on('click', '.product-detail .add-to-cart', addToCart);\r\n$(document).on('click', '#add-all-to-cart', {to: 'Cart'}, addAllTo);\r\n$(document).on('click', 'button#samples-add-to-cart', addSamplesToCart);\r\n\r\n$(document).on('click', '.product-tile-wrapper', sampleTileSelect);\r\n\r\n$(document).on('click', 'button#exchange-gifts-add-to-cart', addExchangeGiftsToCart);\r\n\r\n$(document).on('click', 'button#add-to-cart-gifts', addExchangeGiftsToCart);\r\n\r\n$(document).on('click', 'button#exchange-gifts-add-to-confirm', addExchangeGiftsToConfirm);\r\n\r\n$(document).on('click', 'button#add-to-confirm-my-page', addExchangeGiftsToConfirmMyPage);\r\n\r\n\r\n$(document).on('change', 'select[name=\"quantity\"]', addQuantity);\r\n\r\n$(document).on('click', '.reveal.sample-selection .close-button', function (e) {\r\n scrollToTop(e);\r\n});\r\n$(\"form.multi-select-form\").on('submit', function (e) {\r\n e.preventDefault();\r\n\r\n var pidData = formatPidDataFromEles($(this).find('button.multiselect[value=\"selected\"]'));\r\n minicart.addAllProducts(pidData, 'Cart');\r\n});\r\n$(document).off('click', '.js_addtocart').on('click', '.js_addtocart', globalAddtoCart);\r\n\r\nfunction sampleTileSelect(e) {\r\n e.preventDefault();\r\n\r\n var $this = $(this);\r\n var $btn = $this.find('button.multiselect');\r\n var $multiSelectForm = $this.parents('form');\r\n var $thresholdInput = $multiSelectForm.find('input#pids');\r\n\r\n var selectedCount = $multiSelectForm.find('button[value=\"selected\"]').length;\r\n var limitCount = $thresholdInput.data('limit');\r\n\r\n if ($('#sampleserror')) {\r\n $('#sampleserror').html(null);\r\n }\r\n\r\n // do checking to compare if limit is met\r\n var btnIsSelected = $btn.val() == 'selected';\r\n\r\n if (btnIsSelected || selectedCount < limitCount) {\r\n // toggle val/text\r\n $btn.toggleClass('outline');\r\n $btn.val(btnIsSelected ? 'selectable' : 'selected');\r\n $btn.html(btnIsSelected ? $btn.data('select') : $btn.data('selected'));\r\n } else if ($('#sampleserror')) { // cap reached, report error\r\n $('#sampleserror').html($(\"input#pids\").data('error'));\r\n\r\n $('.modal-body').animate({\r\n scrollTop: 0\r\n }, 200);\r\n }\r\n\r\n var selectedProductList = [];\r\n var enableAddToBag = true;\r\n\r\n // fetch all items that are selected\r\n $multiSelectForm.find('button[value=\"selected\"]').each(function(index, item) {\r\n selectedProductList.push($(item).data('pid'));\r\n enableAddToBag = true;\r\n });\r\n\r\n // store all selected products to hidden input\r\n $thresholdInput.val(selectedProductList);\r\n if (selectedProductList === undefined || selectedProductList.length == 0) {\r\n enableAddToBag = false;\r\n }\r\n\r\n // update selected counter\r\n var selectedCount = parseInt(selectedProductList.length);\r\n var selectedLimit = parseInt($thresholdInput.data('count'));\r\n $(\"span#sample-count\").html((selectedCount <= selectedLimit ? selectedCount : selectedLimit));\r\n\r\n // enable \"Add to Bag\" button\r\n var cartButton = $thresholdInput.data('button');\r\n if (enableAddToBag) {\r\n $('button#' + cartButton).prop('disabled', false);\r\n } else {\r\n $('button#' + cartButton).attr('disabled', 'true');\r\n }\r\n}\r\n\r\nfunction addSamplesToCart(e) {\r\n e.preventDefault();\r\n\r\n var url = util.toAbsoluteUrl($(this).data('action'));\r\n\r\n var data = {\r\n pid: $(this).parents('form').find(\"input#pids\").val()\r\n };\r\n var $form = $(this).parents('form');\r\n var csrfToken = $form.find('input[name=\"csrf_token\"]');\r\n if (csrfToken && csrfToken.length === 1) {\r\n var csrfTokenVal = csrfToken.val();\r\n var csrfTokenKey = csrfToken.prop('name');\r\n data[csrfTokenKey] = csrfTokenVal;\r\n }\r\n\r\n $.ajax({\r\n url: util.appendParamToURL(url, 'format', 'ajax'),\r\n data: data,\r\n method: 'POST'\r\n }).done(function (response) {\r\n if ($('#samples-add-to-cart').data('redirect')) {\r\n window.location.assign(Urls.cartShow);\r\n } else {\r\n minicart.show(response);\r\n }\r\n });\r\n}\r\n\r\nfunction globalAddtoCart(e) {\r\n e.preventDefault();\r\n var $this = $(this),\r\n $wrapper = $this.closest('.product-tile'),\r\n pid = typeof $this.data('pid') !== 'undefined' ? $this.data('pid') : $wrapper.find('a.selected').data('pid'),\r\n currentId = \"#\" + $(this).parents('.product-tile').attr('id'),\r\n data = {\r\n pid: pid || '',\r\n currentId: currentId || ''\r\n };\r\n minicart.addProduct(data);\r\n}\r\n\r\nfunction addQuantity(e) {\r\n e.preventDefault();\r\n\r\n var val = $(this).val();\r\n var $this = $(this);\r\n\r\n $this.parents('.exchange-gift-product').find('button').data('quantity', val);\r\n exchangeGiftsTileSelect($this);\r\n}\r\n\r\nfunction addExchangeGiftsToConfirm(e) {\r\n e.preventDefault();\r\n var url = Urls.showExchangeGiftsConfirmInCart;\r\n var $form = $(this).parents('form');\r\n var csrfToken = $form.find('input[name=\"csrf_token\"]');\r\n var originURL = location.href;\r\n var data = {\r\n pid: $(this).parents('form').find(\"input#pids\").val(),\r\n originURL: originURL\r\n };\r\n\r\n if (csrfToken && csrfToken.length === 1) {\r\n var csrfTokenVal = csrfToken.val();\r\n var csrfTokenKey = csrfToken.prop('name');\r\n data[csrfTokenKey] = csrfTokenVal;\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: util.appendParamToURL(url, 'format', 'ajax'),\r\n data: data,\r\n success: function(response) {\r\n if (typeof response === 'object' && !response.success && response.error === 'CSRF Token Mismatch') {\r\n page.redirect(Urls.csrffailed);\r\n } else if (typeof response === 'object' && !response.isUserAuthenticated) {\r\n var redirectURL = response.redirectURL;\r\n location.href = redirectURL;\r\n } else if (typeof response === 'string') {\r\n modal.renderContent(response, 'pointexchange-confirm');\r\n }\r\n },\r\n failure: function() {\r\n modal.addCustomClass('normal-modal');\r\n modal.renderContent(Resources.SERVER_ERROR);\r\n }\r\n });\r\n}\r\n\r\nfunction addExchangeGiftsToConfirmMyPage(e) {\r\n e.preventDefault();\r\n\r\n var url = Urls.showExchangeGiftsConfirmInCart;\r\n var $form = $('form.pdpForm.pointexchange-selection');\r\n var csrfToken = $form.find('input[name=\"csrf_token\"]');\r\n\r\n var originURL = location.href;\r\n var data = {\r\n pid: $(this).parents('form').find(\"input#pids\").val(),\r\n originURL: originURL\r\n };\r\n\r\n if (csrfToken && csrfToken.length === 1) {\r\n var csrfTokenVal = csrfToken.val();\r\n var csrfTokenKey = csrfToken.prop('name');\r\n data[csrfTokenKey] = csrfTokenVal;\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: util.appendParamToURL(url, 'format', 'ajax'),\r\n data: data,\r\n success: function(response) {\r\n if (typeof response === 'object' && !response.success && response.error === 'CSRF Token Mismatch') {\r\n page.redirect(Urls.csrffailed);\r\n } else if (typeof response === 'object' && !response.isUserAuthenticated) {\r\n var redirectURL = response.redirectURL;\r\n location.href = redirectURL;\r\n } else if (typeof response === 'string') {\r\n $('.show-content-add-to-cart-my-page').html(response);\r\n }\r\n },\r\n failure: function() {\r\n modal.addCustomClass('normal-modal');\r\n modal.renderContent(Resources.SERVER_ERROR);\r\n }\r\n });\r\n\r\n $([document.documentElement, document.body]).animate({\r\n scrollTop: $(\".pointexchange-confirm\").offset().top\r\n }, 200);\r\n}\r\n\r\nfunction addExchangeGiftsToCart(e) {\r\n e.preventDefault();\r\n\r\n var url = util.toAbsoluteUrl($(this).data('action'));\r\n var csrfToken = $(this).parent().find('input[name=\"csrf_token\"]');\r\n var originURL = location.href;\r\n\r\n var data = {\r\n pid: $(this).parent().find(\"input#pids\").val(),\r\n originURL: originURL\r\n };\r\n\r\n if (csrfToken && csrfToken.length === 1) {\r\n var csrfTokenVal = csrfToken.val();\r\n var csrfTokenKey = csrfToken.prop('name');\r\n data[csrfTokenKey] = csrfTokenVal;\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: util.appendParamToURL(url, 'format', 'ajax'),\r\n data: data,\r\n success: function(response) {\r\n if (typeof response === 'object' && !response.success && response.error === 'CSRF Token Mismatch') {\r\n page.redirect(Urls.csrffailed);\r\n } else if (typeof response === 'object' && !response.isUserAuthenticated) {\r\n var redirectURL = response.redirectURL;\r\n location.href = redirectURL;\r\n } else if (typeof response === 'string') {\r\n window.location.assign(Urls.cartShow);\r\n }\r\n },\r\n failure: function() {\r\n modal.addCustomClass('normal-modal');\r\n modal.renderContent(Resources.SERVER_ERROR);\r\n }\r\n });\r\n}\r\n\r\nfunction exchangeGiftsTileSelect(el) {\r\n\r\n\r\n var $this = el.closest(\".exchange-gift-product\");\r\n var $btn = $this.find('button.multiselect');\r\n var $multiSelectForm = $this.parents('form');\r\n var $thresholdInput = $multiSelectForm.find('input#pids');\r\n var $btnAdd = $('#add-to-confirm-my-page');\r\n\r\n // do checking to compare if limit is met\r\n var btnIsSelected = $btn.data('quantity') == 0;\r\n\r\n // toggle val/text\r\n\r\n $btn.val(btnIsSelected ? 'selectable' : 'selected');\r\n\r\n\r\n\r\n var selectedProductList = [];\r\n var enableAddToBag = false;\r\n\r\n // fetch all items that are selected\r\n $multiSelectForm.find('button[value=\"selected\"]').each(function (index, item) {\r\n selectedProductList.push('{\"name\":\"' + $(item).data('pid') + '\";\"quantity\":\"' + $(item).data('quantity') + '\";\"point\":\"' + $(item).data('point') + '\"}');\r\n enableAddToBag = true;\r\n });\r\n\r\n // store all selected products to hidden input\r\n $thresholdInput.val(selectedProductList);\r\n var cartButton = $thresholdInput.data('button');\r\n if (enableAddToBag) {\r\n $('button#' + cartButton).prop('disabled', false);\r\n $btnAdd.prop('disabled', false);\r\n } else {\r\n $('button#' + cartButton).attr('disabled', 'true');\r\n $btnAdd.prop('disabled', true);\r\n }\r\n}\n},{\"../../analytics\":6,\"../../minicart\":27,\"../../modal\":28,\"../../page\":31,\"../../util\":87,\"lodash\":116,\"promise\":118}],49:[function(require,module,exports){\n'use strict';\r\n\r\nvar ajax = require('../../ajax'),\r\n util = require('../../util');\r\n\r\nvar updateContainer = function (data) {\r\n var $availabilityMsg = $('#pdpMain .availability .availability-msg');\r\n var message; // this should be lexically scoped, when `let` is supported (ES6)\r\n if (!data) {\r\n $availabilityMsg.html(Resources.ITEM_STATUS_NOTAVAILABLE);\r\n return;\r\n }\r\n $availabilityMsg.empty();\r\n // Look through levels ... if msg is not empty, then create span el\r\n if (data.levels.IN_STOCK > 0) {\r\n if (data.levels.PREORDER === 0 && data.levels.BACKORDER === 0 && data.levels.NOT_AVAILABLE === 0) {\r\n // Just in stock\r\n message = Resources.IN_STOCK;\r\n } else {\r\n // In stock with conditions ...\r\n message = data.inStockMsg;\r\n }\r\n $availabilityMsg.append('

        ' + message + '

        ');\r\n }\r\n if (data.levels.PREORDER > 0) {\r\n if (data.levels.IN_STOCK === 0 && data.levels.BACKORDER === 0 && data.levels.NOT_AVAILABLE === 0) {\r\n message = Resources.PREORDER;\r\n } else {\r\n message = data.preOrderMsg;\r\n }\r\n $availabilityMsg.append('

        ' + message + '

        ');\r\n }\r\n if (data.levels.BACKORDER > 0) {\r\n if (data.levels.IN_STOCK === 0 && data.levels.PREORDER === 0 && data.levels.NOT_AVAILABLE === 0) {\r\n message = Resources.BACKORDER;\r\n } else {\r\n message = data.backOrderMsg;\r\n }\r\n $availabilityMsg.append('

        ' + message + '

        ');\r\n }\r\n if (data.inStockDate !== '') {\r\n $availabilityMsg.append('

        ' + String.format(Resources.IN_STOCK_DATE, data.inStockDate) + '

        ');\r\n }\r\n if (data.levels.NOT_AVAILABLE > 0) {\r\n if (data.levels.PREORDER === 0 && data.levels.BACKORDER === 0 && data.levels.IN_STOCK === 0) {\r\n message = Resources.NOT_AVAILABLE;\r\n } else {\r\n message = Resources.REMAIN_NOT_AVAILABLE;\r\n }\r\n $availabilityMsg.append('

        ' + message + '

        ');\r\n }\r\n};\r\n\r\nvar getAvailability = function () {\r\n ajax.getJson({\r\n url: util.appendParamsToUrl(Urls.getAvailability, {\r\n pid: $('#pid').val(),\r\n Quantity: $(this).val()\r\n }),\r\n callback: updateContainer\r\n });\r\n};\r\n\r\nmodule.exports = function () {\r\n $('#pdpMain').on('change', '.pdpForm input[name=\"Quantity\"]', getAvailability);\r\n};\r\n\n},{\"../../ajax\":5,\"../../util\":87}],50:[function(require,module,exports){\n\r\nfunction initializeEvents() {\r\n\t$('.video-carousel').slick({\r\n\t\tdots: true,\r\n\t\tinfinite: false,\r\n\t\tslidesToShow: 3,\r\n\t\tslidesToScroll: 1,\r\n\t\tresponsive: [\r\n\t\t\t{\r\n\t\t\tbreakpoint: 480,\r\n\t\t\tsettings: 'unslick'\r\n\t\t\t}\r\n\t\t]\r\n\t});\r\n}\r\n\r\nmodule.exports = {\r\n\tinit: function () {\r\n\t\tinitializeEvents();\r\n\t}\r\n};\n},{}],51:[function(require,module,exports){\n'use strict';\r\nvar dialog = require('../../dialog');\r\nvar modal = require('../../modal').global;\r\nvar util = require('../../util');\r\nvar qs = require('qs');\r\nvar url = require('url');\r\nvar _ = require('lodash');\r\nvar video = require(\"../../video\");\r\nvar CarouselQuickview = require ('../../product-tile-carousel');\r\n\r\nvar zoomMediaQuery = matchMedia('(min-width: 960px)');\r\n\r\n/**\r\n * @description Enables the zoom viewer on the product detail page\r\n * @param zmq {Media Query List}\r\n */\r\nfunction loadZoom (zmq) {\r\n /* --- re-handle zoom function for multi large image (slide show), old-function zoom only use for 1 large image --- */\r\n $('#pdpMain').find('.blk_main-image').each(function(){\r\n var $imgZoom = $(this).find('.main-image'),\r\n hiresUrl;\r\n if (!zmq) {\r\n zmq = zoomMediaQuery;\r\n }\r\n if ($imgZoom.length === 0 || dialog.isActive() || util.isMobile() || !zoomMediaQuery.matches) {\r\n // remove zoom\r\n $imgZoom.trigger('zoom.destroy');\r\n return;\r\n }\r\n\r\n hiresUrl = $imgZoom.attr('href');\r\n \r\n if (hiresUrl && hiresUrl !== 'null' && hiresUrl.indexOf('noimagelarge') === -1 && zoomMediaQuery.matches) {\r\n $imgZoom.zoom({\r\n url: hiresUrl\r\n });\r\n }\r\n });\r\n\r\n $('#pdpMain .main-image').on(\"click\", function (e) {\r\n \te.preventDefault();\r\n });\r\n}\r\n\r\n\r\nzoomMediaQuery.addListener(loadZoom);\r\n\r\nfunction getProductImageURL(viewType) {\r\n var pid = $(\"span[itemprop='productID']\").data(\"pid\");\r\n return util.appendParamsToUrl(Urls.getProductImages, { \"pid\": pid, \"sz\": viewType });\r\n}\r\n\r\nfunction lazyLoadThumbnails() {\r\n var viewType = util.isMobile() ? \"large\" : \"icon\";\r\n var thumbnailProductImageURL = getProductImageURL(viewType);\r\n\r\n $.get(thumbnailProductImageURL).done(function (res) {\r\n $(\"#thumbnails\").html(res);\r\n\r\n var thumbnailImageCount = $(\".pt_product-details #thumbnails li\").length;\r\n if (thumbnailImageCount == 0) {\r\n return false;\r\n } else if (thumbnailImageCount > 1) {\r\n CarouselQuickview.init();\r\n }\r\n });\r\n}\r\n\r\nfunction initThumbnailCarousel() {\r\n $('#thumbnails ul').slick({\r\n dots: false,\r\n infinite: true,\r\n arrows: true,\r\n vertical: true,\r\n slidesToShow: 4,\r\n slidesToScroll: 1,\r\n focusOnSelect: true\r\n });\r\n}\r\n\r\nfunction initMainImageCarousel() {\r\n $('#thumbnails ul').slick({\r\n dots: true,\r\n vertical: false,\r\n infinite: true,\r\n arrows: false,\r\n centerMode: false,\r\n slidesToShow: 1,\r\n focusOnSelect: true\r\n });\r\n}\r\n\r\n/**\r\n * @description Sets the main image attributes and the href for the surrounding tag\r\n * @param {Object} atts Object with url, alt, title and hires properties\r\n */\r\nfunction setMainImage(atts,zoomimg) {\r\n updatePinButton(atts.url);\r\n updateFacebookButton(atts.url);\r\n if (!dialog.isActive() && !util.isMobile()) {\r\n $('.product-slide-large .slick-current .main-image').find('img').attr('src', zoomimg);\r\n }\r\n}\r\n\r\nfunction updatePinButton(imageUrl) {\r\n var pinButton = document.querySelector('.share-icon[data-share=pinterest]');\r\n\r\n if (!pinButton) {\r\n return;\r\n }\r\n var newUrl = imageUrl;\r\n if (!imageUrl) {\r\n if ($('#pdpMain .primary-image').length > 0 && ($('#pdpMain .primary-image').attr('src') || $('#pdpMain .primary-image').attr('data-src'))) {\r\n newUrl = document.querySelector('#pdpMain .primary-image').getAttribute('src') || document.querySelector('#pdpMain .primary-image').getAttribute('data-src')\r\n } else {\r\n newUrl = '';\r\n }\r\n }\r\n var href = url.parse(pinButton.href);\r\n var query = qs.parse(href.query);\r\n \r\n var smShareURL;\r\n if ($('.share-icons.allsm-shareurl').length > 0) {\r\n \tsmShareURL = $('.share-icons.allsm-shareurl').attr('data-share-targeturl');\r\n }\r\n smShareURL = (smShareURL != undefined && smShareURL!= null && smShareURL!= '')? smShareURL : window.location.href;\r\n \r\n query.media = url.resolve(smShareURL, newUrl);\r\n query.url = smShareURL;\r\n var newHref = url.format(_.extend({}, href, {\r\n query: query, // query is only used if search is absent\r\n search: qs.stringify(query)\r\n }));\r\n pinButton.href = newHref;\r\n}\r\n\r\nfunction updateFacebookButton(imageUrl) {\r\n var facebookButton = document.querySelector('.share-icon[data-share=facebook]');\r\n\r\n if (!facebookButton) {\r\n return;\r\n }\r\n var newUrl = imageUrl;\r\n if (!imageUrl) {\r\n if ($('#pdpMain .primary-image').length > 0 && ($('#pdpMain .primary-image').attr('src') || $('#pdpMain .primary-image').attr('data-src'))) {\r\n newUrl = document.querySelector('#pdpMain .primary-image').getAttribute('src') || document.querySelector('#pdpMain .primary-image').getAttribute('data-src')\r\n } else {\r\n newUrl = '';\r\n }\r\n }\r\n \r\n var smShareURL;\r\n if ($('.share-icons.allsm-shareurl').length > 0) {\r\n \tsmShareURL = $('.share-icons.allsm-shareurl').attr('data-share-targeturl');\r\n }\r\n smShareURL = (smShareURL != undefined && smShareURL!= null && smShareURL!= '')? smShareURL : window.location.href;\r\n \r\n var href = url.parse(facebookButton.href);\r\n \r\n var query = qs.parse(href.query); \r\n query.picture = url.resolve(smShareURL, newUrl);\r\n \r\n query.u = smShareURL;\r\n \r\n var newHref = url.format(_.extend({}, href, {\r\n query: query, // query is only used if search is absent\r\n search: qs.stringify(query)\r\n }));\r\n \r\n facebookButton.href = newHref;\r\n}\r\n\r\n/* @module image\r\n * @description this module handles the primary image viewer on PDP\r\n **/\r\n\r\n/**\r\n * @description by default, this function sets up zoom and event handler for thumbnail click\r\n **/\r\nmodule.exports = function () {\r\n if (dialog.isActive() || util.isMobile()) {\r\n $('#pdpMain .main-image').removeAttr('href');\r\n }\r\n updatePinButton();\r\n updateFacebookButton();\r\n lazyLoadThumbnails();\r\n loadZoom();\r\n \r\n // handle product thumbnail click event\r\n $(\"#thumbnails\").on('click', '.productthumbnail', function () {\r\n var $that = $(this);\r\n if(!$that.hasClass(\"selected\")){\r\n \t$(document).trigger(\"clickproductthumbnail\");\r\n }\r\n\r\n $(\"#thumbnails\").find('.productthumbnail.selected').removeClass('selected');\r\n $that.addClass('selected');\r\n });\r\n\r\n $(document).on('click', '.image-zoom', function (evt) {\r\n evt.preventDefault();\r\n var viewType = \"zoom\";\r\n // var thumbnailProductImageURL = getSingleProductImageURL(viewType);\r\n // modal.renderByUrl(thumbnailProductImageURL);\r\n\r\n var zoomImageUrl = null;\r\n if($('.productthumbnail').length > 1) {\r\n \tzoomImageUrl = $('.productthumbnail.slick-current').data('zoomimg');\r\n } else {\r\n \t// for only one thumbnail, select that one image\r\n \tzoomImageUrl = $($('.productthumbnail')[0]).data('zoomimg');\r\n }\r\n\r\n modal.renderContent('');\r\n\r\n modal.addCustomClass('productImageZoom');\r\n\r\n });\r\n \r\n // handle product thumbnail click event CG-361\r\n $(\".product-thumbnails\").on('mouseenter', '.productthumbnail.product-image-thumbnail', function () {\r\n \t$(document).trigger(\"pdpinteraction\",{\"interactionType\":\"Change Image\"});\r\n var $that = $(this);\r\n $(\".product-thumbnails\").find('.productthumbnail.selected').removeClass('selected');\r\n $that.addClass('selected');\r\n setMainImage($that.data('lgimg'),$that.data('zoomimg'));\r\n\r\n $('.image-zoom').attr('href', $that.data('zoomimg'));\r\n if( !($(this).hasClass('video-thumbnail-image')) ){\r\n \t\tvar mainImageDiv = $('#thumbnails').siblings(\".main-image\");\r\n \t\tmainImageDiv.find('#alt-video').attr('src','');\r\n \t\t$('.product-image').show();\r\n \t\t$('#alt-video').hide();\r\n \t\t\r\n \t}\r\n });\r\n //CG-361 Add video or GIF to PDP\r\n $(\"body\").on(\"click touchstart mouseenter\",\".productthumbnail.video-thumbnail-image\", function(e){\r\n \tlet $altVideo = $('#alt-video'); \r\n\t\te.preventDefault();\r\n\t\tvar mainImageDiv = $('#thumbnails').siblings(\".main-image\");\r\n\t\t$altVideo.fadeIn();\r\n\t\tvar altVideoID = $(this).attr('data-videourl');\r\n\t\t$altVideo.attr('src',altVideoID + \"&autoplay=1\");\r\n\t\t$('.product-image').hide();\r\n\r\n });\r\n \r\n //CG-361 Add video or GIF to PDP\r\n $(\"body\").on(\"mouseup touchstart\", function(e){\r\n\t var quickviewModalContainer = $(\".quickview-modal\");\r\n\t // if the target of the click isn't the container\r\n\t if (!quickviewModalContainer.is(e.target)){\r\n\t \tvar videourl = $(\".quickview-modal #alt-video\").attr('src');\r\n\t \tif(!videourl){\r\n\t \t\tvideourl = $(\".quickview-modal #alt-video-small\").attr('src');\r\n\t \t} \r\n\t \tif(!videourl){\r\n\t \t videourl = $(\"#primary #alt-video-small\").attr('src');\r\n\t \t}\r\n\t \tif(videourl){\r\n\t\t \tvar newurl = videourl.replace(\"autoplay=1\", \"autoplay=0\");\t \r\n\t\t \t$(\"#primary #alt-video\").attr('src', newurl);\r\n\t\t \tif (window.matchMedia(\"(min-width: 767px)\").matches) {\r\n\t\t \t\t$(\".quickview-modal #alt-video\").attr('src', newurl);\r\n\t\t } else{\r\n\t\t \t$(\".quickview-modal #alt-video-small\").attr('src', newurl);\r\n\t\t \t$(\"#primary #alt-video-small\").attr('src', newurl);\r\n\t\t }\r\n\t \t}\r\n\t }\r\n\t}); \r\n \r\n //CG-361 Add video or GIF to PDP\r\n video.init(function () {\r\n $(document).on('afterChange', '.slick-slider.slider-main-image', function(event, slick, currentSlide) {\r\n resetVideoPlayer();\r\n setVideoPlayer( $(this).find(\".slide\").eq(currentSlide) );\r\n });\r\n });\r\n \r\n};\r\n\r\n//CG-361 Add video or GIF to PDP\r\nfunction setVideoPlayer($slide) {\r\n var videoID = $('.product-video', $slide).attr(\"data-videoid\");\r\n if(!videoID) {return;}\r\n\r\n var $player = $(\"#videoplayer_pdp\");\r\n if(!$player.length) {\r\n $slide.find(\".product-video .video-wrapper\").html('
        ');\r\n }\r\n else {\r\n $slide.find(\".product-video .video-wrapper\").html(\"\").append( $player.remove() );\r\n }\r\n videoplayer = video.playInline($(\"#videoplayer_pdp\"), videoID);\r\n}\r\n\r\n//CG-361 Add video or GIF to PDP\r\nfunction resetVideoPlayer() {\r\n if(videoplayer) {\r\n videoplayer.destroy();\r\n videoplayer = null;\r\n }\r\n}\r\n\r\nmodule.exports.loadZoom = loadZoom;\r\nmodule.exports.setMainImage = setMainImage;\r\nmodule.exports.lazyLoadThumbnails = lazyLoadThumbnails;\r\nmodule.exports.resetVideoPlayer = resetVideoPlayer;\r\nmodule.exports.setVideoPlayer = setVideoPlayer;\n},{\"../../dialog\":16,\"../../modal\":28,\"../../product-tile-carousel\":73,\"../../util\":87,\"../../video\":89,\"lodash\":116,\"qs\":128,\"url\":134}],52:[function(require,module,exports){\n'use strict';\r\n\r\nvar dialog = require('../../dialog'),\r\n\tmodal = require('../../modal').global,\r\n productStoreInventory = require('../../storeinventory/product'),\r\n util = require('../../util'),\r\n addToCart = require('./addToCart'),\r\n availability = require('./availability'),\r\n image = require('./image'),\r\n //productNav = require('./productNav'),\r\n howToSection = require('./howToSection'),\r\n productSet = require('./productSet'),\r\n recommendations = require('./recommendations'),\r\n socialShareIcons = require('./socialShareIcons'),\r\n variant = require('./variant'),\r\n wishlistCustom = require('../../wishlist.custom');\r\n\r\n/**\r\n * @description Initialize product detail page with reviews, recommendation and product navigation.\r\n */\r\n\r\n\r\nfunction initializeDom() {\r\n //productNav();\r\n recommendations();\r\n}\r\n\r\n\r\n/**\r\n * @description Initialize event handlers on product detail page\r\n */\r\nfunction initializeEvents() {\r\n var $pdpMain = $('#pdpMain');\r\n\r\n addToCart();\r\n availability();\r\n variant();\r\n image();\r\n howToSection.init();\r\n productSet();\r\n socialShareIcons();\r\n if (SitePreferences.STORE_PICKUP) {\r\n productStoreInventory.init();\r\n }\r\n\r\n // Add to Wishlist and Add to Gift Registry links behaviors\r\n $pdpMain.on('click', '[data-action=\"gift-registry\"]', function () {\r\n var data = util.getQueryStringParams($('.pdpForm').serialize());\r\n if (data.cartAction) {\r\n delete data.cartAction;\r\n }\r\n var url = util.appendParamsToUrl(this.href, data);\r\n this.setAttribute('href', url);\r\n });\r\n\r\n // product options\r\n $pdpMain.on('change', '.product-options select', function () {\r\n var salesPrice = $pdpMain.find('.product-add-to-cart .price-sales');\r\n var selectedItem = $(this).children().filter(':selected').first();\r\n salesPrice.text(selectedItem.data('combined'));\r\n });\r\n\r\n // prevent default behavior of thumbnail link and add this Button\r\n $pdpMain.on('click', '.thumbnail-link, .unselectable a', function (e) {\r\n e.preventDefault();\r\n });\r\n\r\n\r\n $('.full-ingredients').on('click', function(e){\r\n e.preventDefault();\r\n var $this = $(this);\r\n var $fullIngredientList = $('.full-ingredients-list');\r\n var contentUrl = $this.attr('href');\r\n\r\n if ($fullIngredientList.length ) {\r\n $this.toggleClass('show-list');\r\n\r\n } else {\r\n $.get(util.appendParamToURL(contentUrl, 'format', 'ajax')).done( function(content) {\r\n $('
        ' + content + '
        ').insertAfter($this);\r\n });\r\n $this.toggleClass('show-list');\r\n }\r\n\r\n\r\n\r\n });\r\n\r\n $pdpMain.on('click', '.close', function(e){\r\n e.preventDefault();\r\n $('.full-ingredients.show-list').removeClass('show-list');\r\n });\r\n\r\n\r\n if ($('.product-set-actions').length) {\r\n var $productForms = $('.product-set-list').find('form').toArray();\r\n var pids = $productForms.map(function (formEle) {\r\n return $(formEle).data('pid');\r\n }).join(',');\r\n\r\n $.post(util.appendParamsToUrl(Urls.wishlistIsSavedForLater, {\r\n pid: pids\r\n }), function (data) {\r\n if (data === 'false') {\r\n $('.product-form-actions .product-set-wishlist').removeClass('hide');\r\n $('.product-form-actions .remove-product-set-from-wishlist').addClass('hide');\r\n } else {\r\n $('.product-form-actions .product-set-wishlist').addClass('hide');\r\n $('.product-form-actions .remove-product-set-from-wishlist').removeClass('hide');\r\n }\r\n });\r\n\r\n $('.remove-product-set-from-wishlist').on('click', function (e) {\r\n e.preventDefault();\r\n\r\n $.post(util.appendParamsToUrl(Urls.wishlistRemoveAll, {\r\n pid: pids\r\n }), function () {\r\n window.location.href = window.location.href;\r\n })\r\n });\r\n }\r\n\r\n $('.size-chart-link a').on('click', function (e) {\r\n e.preventDefault();\r\n dialog.open({\r\n url: $(e.target).attr('href')\r\n });\r\n });\r\n\r\n $('.accordion-toggle').on('click', function(e) {\r\n e.preventDefault();\r\n var $toggleFor = $(this).attr('href');\r\n var $toggleHeight = $('.accordion-toggle').outerHeight();\r\n var $stickyHeader = $('.sticky-header').outerHeight();\r\n\r\n var totalOffset = $toggleHeight + $stickyHeader;\r\n\r\n if ( $(this).hasClass('is-open') ) {\r\n $(this).removeClass('is-open');\r\n $($toggleFor).removeClass('is-open').slideUp();\r\n return false;\r\n } else {\r\n var accordionToggle = $('.accordion-toggle.is-open');\r\n var accordionContent = $('.pdp-content-section.is-open');\r\n\r\n // $(document).find(accordionToggle).removeClass('is-open');\r\n // $(document).find(accordionContent).removeClass('is-open').slideUp(100);\r\n\r\n $(this).toggleClass('is-open');\r\n $($toggleFor).toggleClass('is-open').slideDown(function() {\r\n $('html, body').animate({\r\n scrollTop: $(this).offset().top - totalOffset\r\n }, 400);\r\n });\r\n }\r\n\r\n if ($(this).attr('id') == 'rec-toggle') {\r\n $('.carousel-recommendations.slick-slider').slick('refresh');\r\n }\r\n });\r\n wishlistCustom.handleWishlist();\r\n}\r\n\r\n\r\n\r\nvar product = {\r\n initializeEvents: initializeEvents,\r\n init: function () {\r\n initializeDom();\r\n initializeEvents();\r\n }\r\n};\r\n\r\nmodule.exports = product;\r\n\n},{\"../../dialog\":16,\"../../modal\":28,\"../../storeinventory/product\":84,\"../../util\":87,\"../../wishlist.custom\":90,\"./addToCart\":48,\"./availability\":49,\"./howToSection\":50,\"./image\":51,\"./productSet\":53,\"./recommendations\":54,\"./socialShareIcons\":55,\"./variant\":56}],53:[function(require,module,exports){\n'use strict';\r\n\r\nvar ajax = require('../../ajax'),\r\n tooltip = require('../../tooltip'),\r\n util = require('../../util');\r\n\r\nmodule.exports = function () {\r\n var $addToCart = $('#add-to-cart'),\r\n $addAllToCart = $('#add-all-to-cart'),\r\n $productSetList = $('#product-set-list');\r\n\r\n var updateAddToCartButtons = function () {\r\n if ($productSetList.find('.add-to-cart[disabled]').length > 0) {\r\n $addAllToCart.attr('disabled', 'disabled');\r\n // product set does not have an add-to-cart button, but product bundle does\r\n $addToCart.attr('disabled', 'disabled');\r\n } else {\r\n $addAllToCart.removeAttr('disabled');\r\n $addToCart.removeAttr('disabled');\r\n }\r\n };\r\n\r\n if ($productSetList.length > 0) {\r\n updateAddToCartButtons();\r\n }\r\n // click on swatch for product set\r\n $productSetList.on('click', '.product-set-item .swatchanchor', function (e) {\r\n e.preventDefault();\r\n var url = Urls.getSetItem + this.search;\r\n var $container = $(this).closest('.product-set-item');\r\n var qty = $container.find('form input[name=\"Quantity\"]').first().val();\r\n\r\n ajax.load({\r\n url: util.appendParamToURL(url, 'Quantity', isNaN(qty) ? '1' : qty),\r\n target: $container,\r\n callback: function () {\r\n updateAddToCartButtons();\r\n tooltip.init();\r\n }\r\n });\r\n });\r\n\r\n $productSetList.on('change', '.product-set-item .variation-select', function (e) {\r\n e.preventDefault();\r\n\r\n var $selectedVariantOption = $(this).find(\"option:selected\");\r\n if($selectedVariantOption.length === 0 || !$selectedVariantOption.val()) {\r\n return;\r\n }\r\n\r\n var url = Urls.getSetItem + \"?\" + util.getQueryString($selectedVariantOption.val());\r\n var $container = $(this).closest('.product-set-item');\r\n var qty = $container.find('select[name=\"Quantity\"] option:selected').val();\r\n\r\n ajax.load({\r\n url: util.appendParamToURL(url, 'Quantity', isNaN(qty) ? '1' : qty),\r\n target: $container,\r\n callback: function () {\r\n updateAddToCartButtons();\r\n tooltip.init();\r\n }\r\n });\r\n });\r\n if (screen.width > 640) {\r\n\t $(window).on(\"load\", function() {\r\n\t \t$('#pdpMain').find('#BVRRSummaryContainer .bv-rating-stars-container').off().on('click', function (e) {\r\n\t \t\te.preventDefault();\r\n\t \t\te.stopPropagation();\r\n\t \t\t$(\".tabs-title:nth-child(1)\").removeClass(\"is-active\");\r\n\t \t\t$(\".tabs-title:nth-child(2)\").addClass(\"is-active\");\r\n\t \t\t$(\"#questions\").removeClass(\"is-active\");\r\n\t \t\t$(\"#reviews\").addClass(\"is-active\").stop(true, true);\r\n\t \t\t$('html, body').stop( true, true ).animate({\r\n\t \t scrollTop: $(\"#bazaarvoice-tabs\").offset().top-150\r\n\t \t }, 1000);\r\n\t \t});\r\n\t });\r\n }\r\n};\r\n\r\n$(document).on('click', '.bv-popup-in .bv-read-review', function() {\r\n\t$(\".tabs-title:nth-child(1)\").removeClass(\"is-active\");\r\n\t$(\".tabs-title:nth-child(2)\").addClass(\"is-active\");\r\n\t$(\"#questions\").removeClass(\"is-active\");\r\n\t$(\"#reviews\").addClass(\"is-active\");\r\n\te.preventDefault();\r\n\te.stopPropagation();\r\n\t$('html, body').stop( true, true ).animate({\r\n scrollTop: $(\"#bazaarvoice-tabs\").offset().top-150\r\n }, 1000);\r\n});\r\n\r\n\r\n\r\n\n},{\"../../ajax\":5,\"../../tooltip\":86,\"../../util\":87}],54:[function(require,module,exports){\n'use strict';\r\n\r\n/**\r\n * @description Creates product recommendation carousel using Slick carousel\r\n **/\r\nmodule.exports = function () {\r\n var $carousel = $('.carousel-recommendations').not('.slick-initialized');\r\n if (!$carousel || $carousel.length === 0 || $carousel.children().length === 0) {\r\n return;\r\n }\r\n $carousel.slick({\r\n infinite: true,\r\n slidesToShow: 3,\r\n slidesToScroll: 3,\r\n slide: 'li',\r\n dots: true,\r\n responsive: [\r\n {\r\n \t breakpoint: 600,\r\n \t settings: {\r\n \t slidesToShow: 3,\r\n \t slidesToScroll: 3,\r\n \t infinite: true,\r\n \t dots: true\r\n \t }\r\n },\r\n {\r\n \t breakpoint: 480,\r\n settings: {\r\n \tslidesToShow: 1,\r\n \t slidesToScroll: 1,\r\n \t infinite: true,\r\n \t arrows: false,\r\n \t dots: true\r\n }\r\n }\r\n ]\r\n });\r\n\r\n};\r\n\n},{}],55:[function(require,module,exports){\nmodule.exports = function socialShareIcons() {\r\n $('.social-share-trigger').on('click', function() {\r\n $(this).parent().toggleClass('animate');\r\n\r\n if ( !Foundation.MediaQuery.atLeast('medium') ) {\r\n $('#wrapper').toggleClass('overlay');\r\n };\r\n\r\n });\r\n\r\n $('.social-modal-close').on('click', function(){\r\n $(this).parent().removeClass('animate');\r\n $('#wrapper').removeClass('overlay');\r\n });\r\n};\n},{}],56:[function(require,module,exports){\n'use strict';\r\n\r\nvar ajax = require('../../ajax'),\r\n image = require('./image'),\r\n progress = require('../../progress'),\r\n productStoreInventory = require('../../storeinventory/product'),\r\n socialShareIcons = require('./socialShareIcons'),\r\n util = require('../../util'),\r\n wishlistCustom = require('../../wishlist.custom'),\r\n CarouselQuickview = require('../../product-tile-carousel');\r\n\r\n/**\r\n * @description update product content with new variant from href, load new content to #product-content panel\r\n * @param {String} href - url of the new product variant\r\n **/\r\nfunction pdpMobileSwatchesCarousel() {\r\n \r\n}\r\n\r\nfunction updateContent(href, currentElem, isPDPQV) {\r\n var $pdpForm = $('#modal-content').find('.pdpForm');\r\n var targetDiv = $('#modal-content').find('#product-content');\r\n var $primaryDiv = currentElem.parents('#pdpMain').parent().hasClass('primary-content');\r\n var qty = $pdpForm.find('select[name=\"Quantity\"] option:selected').val();\r\n var activeTab = currentElem.parents('.product-variation-swatch-lists').find('.shade-filter-tabs li.is-active').index();\r\n var isPDPQV = isPDPQV || 0;\r\n if($primaryDiv){\r\n \t$pdpForm = $('#primary').find('.pdpForm');\r\n \ttargetDiv = $('#primary').find('#product-content');\r\n }\r\n \r\n var params = {\r\n Quantity: isNaN(qty) ? '1' : qty,\r\n format: 'ajax',\r\n productlistid: $pdpForm.find('input[name=\"productlistid\"]').first().val()\r\n };\r\n \r\n ajax.load({\r\n url: util.appendParamsToUrl(href, params),\r\n target: targetDiv,\r\n callback: function () {\r\n \tif(isPDPQV > 0){\r\n \t\tselectedColorNameDesc('pdp-quickview');\r\n \t} else {\r\n \t\tselectedColorNameDesc();\r\n \t}\r\n if (SitePreferences.STORE_PICKUP) {\r\n productStoreInventory.init();\r\n }\r\n \r\n var wishlistProd = window.User.wishlistProducts;\r\n \t\t$(\".pdp-wishlist-icon\").each(function(){\r\n \t\t\t\tvar _this = $(this);\r\n \t\t\t\tvar currEle = _this.attr('data-element-pid');\r\n \t\t\t\tif(window.User.wishlistProducts != null && wishlistProd.indexOf(currEle) >= 0){\r\n \t\t\t\t\t_this.addClass(\"pdp-active-wishlist\");\r\n \t\t\t\t}\r\n \t\t\t});\t\r\n \t\tif($primaryDiv){\r\n \t\t\timage();\r\n \t\t\t$(document).trigger(\"pdpshadechangeevent\",{\"currrentElem\":\"#primary\"});\r\n \t\t} else {\r\n \t\t\timage('pdp-quickview');\r\n \t\t\t$(document).trigger(\"pdpshadechangeevent\",{\"currrentElem\":\"#modal-content\"});\r\n \t\t}\r\n \t\t\r\n pdpMobileSwatchesCarousel();\r\n $(document).trigger(\"gtvariationchange\");\r\n socialShareIcons();\r\n if($primaryDiv){\r\n\t $('.shade-filter-tabs li').removeClass('is-active');\r\n\t $('.shade-filter-tabs li').eq(activeTab).trigger(\"click\");\r\n } else {\r\n \t$('#modal-content').find('.shade-filter-tabs li').removeClass('is-active');\r\n \t$('#modal-content').find('.shade-filter-tabs li').eq(activeTab).trigger(\"click\");\r\n }\r\n if($('#questions-label').length > 0){\r\n \t$('#questions-label').parent().trigger(\"click\");\r\n }\r\n $(document).foundation();\r\n wishlistCustom.handleWishlist();\r\n CarouselQuickview.init();\r\n }\r\n });\r\n}\r\n\r\nfunction updateSetContent($ele, href) {\r\n var $productSetItemCtnr = $ele.parents(\".product-set-item\"),\r\n qty = $productSetItemCtnr.find('form select[name=\"Quantity\"]').val();\r\n\r\n progress.show($productSetItemCtnr);\r\n\r\n $.get(util.appendParamsToUrl(href, {\r\n Quantity: isNaN(qty) ? '1' : qty,\r\n format: \"ajax\",\r\n setproduct: true\r\n })).done(function (html) {\r\n \tvar isPDPQV = $(this).parents('#modal-content');\r\n \tif(isPDPQV.length > 0){\r\n \t\tselectedColorNameDesc('pdp-quickview');\r\n \t} else {\r\n \t\tselectedColorNameDesc();\r\n \t}\r\n $productSetItemCtnr.html(html);\r\n image();\r\n socialShareIcons();\r\n pdpMobileSwatchesCarousel();\r\n $(document).foundation();\r\n wishlistCustom.handleWishlist();\r\n CarouselQuickview.init();\r\n });\r\n}\r\n\r\nfunction selectedColorNameDesc(containerClass){\r\n\tvar selectedColor = $('.filter-variation-select option:selected').html(); \r\n\tvar selectedColorDesc = $('.pdp-main-redesign .color-desc').html(); \r\n\t\r\n\tif(containerClass == 'pdp-quickview'){\r\n\t selectedColor = $('#modal-content .filter-variation-select option:selected').html(); \r\n\t\tselectedColorDesc = $('#modal-content .pdp-main-redesign .color-desc').html();\r\n\t\t$('#modal-content #selected-color').html(selectedColor);\r\n\t\t$('#modal-content #selected-color-desc').html(selectedColorDesc);\r\n\t} else {\r\n\t\t$('#selected-color').html(selectedColor);\r\n\t\t$('#selected-color-desc').html(selectedColorDesc);\r\n\t\t\r\n\t\tvar persSelectedColor = $('.miniproduct-actions .variation-select option:selected').attr('style');\r\n\t\t$('.selected-color-img').attr('style',persSelectedColor);\r\n\t\t\r\n\t\tvar persSelectedColor = $('.miniproduct-actions .variation-select option:selected').html(); \r\n\t\t$('#pers-selected-color').html(persSelectedColor);\r\n\t}\r\n}\r\n\r\nmodule.exports = function () {\r\n var $pdpMain = $('#pdpMain');\r\n\r\n // // hover on swatch - should update main image with swatch image\r\n // $pdpMain.on('mouseenter mouseleave', '.swatchanchor', function () {\r\n // var largeImg = $(this).data('lgimg'),\r\n // $imgZoom = $pdpMain.find('.image-zoom'),\r\n // $mainImage = $pdpMain.find('.primary-image');\r\n\r\n // if (!largeImg) {\r\n // return;\r\n // }\r\n\r\n // // store the old data from main image for mouseleave handler\r\n // $(this).data('lgimg', {\r\n // hires: $imgZoom.attr('href'),\r\n // url: $mainImage.attr('src'),\r\n // alt: $mainImage.attr('alt'),\r\n // title: $mainImage.attr('title')\r\n // });\r\n\r\n // // set the main image\r\n // image.setMainImage($(this).data('lgimg'));\r\n // });\r\n\r\n $(\"body\").on('click', '#pdpMain #product-content .swatchanchor', function (e) {\r\n e.preventDefault();\r\n if ($(this).parents(\"#pdp-swatches\").hasClass('color')) {\r\n \t\t$(document).trigger(\"pdpinteraction\",{\"interactionType\":\"Change Color\"});\r\n }\r\n updateContent(this.href, $(this), $(this).parents('#modal-content').length);\r\n }).on('change', '#pdpMain #product-content .variation-select', function () {\r\n var img = $(this).closest('ul').find('#pdp-swatches .swatchanchor:has(img[alt=\"' + $(this).val() +'\"])');\r\n var href = img.closest('a').attr('href');\r\n\r\n if ($(this).attr(\"id\") == 'va-color') {\r\n \t\t$(document).trigger(\"pdpinteraction\",{\"interactionType\":\"Change Color\"});\r\n \t}\r\n \r\n var $selectedVariantOption = $(this).find(\"option:selected\");\r\n if($selectedVariantOption.length === 0 || !$selectedVariantOption.val()) {\r\n return;\r\n }\r\n \r\n updateContent(href, $(this), $(this).parents('#modal-content').length);\r\n });\r\n\r\n $(\"body\").on('click', '#pdpMain #product-set .swatchanchor', function (e) {\r\n e.preventDefault();\r\n\r\n updateSetContent($(this), $(this).attr(\"href\"));\r\n }).on('change', '#pdpMain #product-set .variation-select', function () {\r\n var img = $(this).closest('ul').find('#pdp-swatches .swatchanchor:has(img[alt=\"' + $(this).val() +'\"])');\r\n var href = img.closest('a').attr('href');\r\n\r\n updateSetContent($(this), href);\r\n });\r\n\r\n pdpMobileSwatchesCarousel();\r\n};\n},{\"../../ajax\":5,\"../../product-tile-carousel\":73,\"../../progress\":75,\"../../storeinventory/product\":84,\"../../util\":87,\"../../wishlist.custom\":90,\"./image\":51,\"./socialShareIcons\":55}],57:[function(require,module,exports){\n'use strict';\r\nvar util = require('../util');\r\n\r\nvar $cache;\r\n\r\nfunction initializeCache() {\r\n\t$cache = {};\r\n\t$cache['errorMsg'] = $('#promotion-landing-container .landing-error');\r\n}\r\n\r\nfunction initializeEvents() {\r\n\t$(document)\r\n\t\t.on('submit', '#PromoLandingForm', function (e) {\r\n\t\t\tvar httpParams = util.getQueryStringParams(util.getQueryString(window.location.href));\r\n\t\t\t$('').appendTo(e.target);\r\n\t\t})\r\n\r\n\t\t.on('focus', '#PromoLandingForm input', function () {\r\n\t\t\t$cache.errorMsg.hide();\r\n\t\t});\r\n}\r\n\r\nmodule.exports.init = function () {\r\n\tinitializeCache();\r\n\tinitializeEvents();\r\n\r\n\tif (window.location.href.indexOf('error') > -1) {\r\n\t\t$cache.errorMsg.show();\r\n\t}\r\n\tif (window.couponCode) {\r\n\t\t$(\"#promo-code\").text(window.couponCode);\r\n\t}\r\n};\n},{\"../util\":87}],58:[function(require,module,exports){\n'use strict';\r\n\r\nvar addProductToCart = require('./product/addToCart'),\r\n ajax = require('../ajax'),\r\n login = require('../login'),\r\n quickview = require('../quickview'),\r\n util = require('../util');\r\n\r\n/**\r\n * @function\r\n * @description Loads address details to a given address and fills the address form\r\n * @param {String} addressID The ID of the address to which data will be loaded\r\n */\r\nfunction populateForm(addressID, $form) {\r\n // load address details\r\n var url = Urls.giftRegAdd + addressID;\r\n ajax.getJson({\r\n url: url,\r\n callback: function (data) {\r\n if (!data || !data.address) {\r\n window.alert(Resources.REG_ADDR_ERROR);\r\n return false;\r\n }\r\n // fill the form\r\n $form.find('[name$=\"_addressid\"]').val(data.address.ID);\r\n $form.find('[name$=\"_firstname\"]').val(data.address.firstName);\r\n $form.find('[name$=\"_lastname\"]').val(data.address.lastName);\r\n $form.find('[name$=\"_address1\"]').val(data.address.address1);\r\n $form.find('[name$=\"_address2\"]').val(data.address.address2);\r\n $form.find('[name$=\"_city\"]').val(data.address.city);\r\n $form.find('[name$=\"_country\"]').val(data.address.countryCode).trigger('change');\r\n $form.find('[name$=\"_postal\"]').val(data.address.postalCode);\r\n $form.find('[name$=\"_state\"]').val(data.address.stateCode);\r\n $form.find('[name$=\"_phone\"]').val(data.address.phone);\r\n // $form.parent('form').validate().form();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Initializes events for the gift registration\r\n */\r\nfunction initializeEvents() {\r\n var $eventAddressForm = $('form[name$=\"_giftregistry\"]'),\r\n $beforeAddress = $eventAddressForm.find('fieldset[name=\"address-before\"]'),\r\n $afterAddress = $eventAddressForm.find('fieldset[name=\"address-after\"]');\r\n\r\n $('.usepreevent').on('click', function () {\r\n // filter out storefront toolkit\r\n $(':input', $beforeAddress).not('[id^=\"ext\"]').not('select[name$=\"_addressBeforeList\"]').each(function () {\r\n var fieldName = $(this).attr('name'),\r\n $afterField = $afterAddress.find('[name=\"' + fieldName.replace('Before', 'After') + '\"]');\r\n $afterField.val($(this).val()).trigger('change');\r\n });\r\n });\r\n $eventAddressForm.on('change', 'select[name$=\"_addressBeforeList\"]', function () {\r\n var addressID = $(this).val();\r\n if (addressID.length === 0) { return; }\r\n populateForm(addressID, $beforeAddress);\r\n })\r\n .on('change', 'select[name$=\"_addressAfterList\"]', function () {\r\n var addressID = $(this).val();\r\n if (addressID.length === 0) { return; }\r\n populateForm(addressID, $afterAddress);\r\n });\r\n\r\n $('.item-list').on('click', '.item-edit-details a', function (e) {\r\n e.preventDefault();\r\n var productListID = $('input[name=productListID]').val();\r\n quickview.show({\r\n url: e.target.href,\r\n source: 'giftregistry',\r\n productlistid: productListID\r\n });\r\n });\r\n}\r\n\r\nexports.init = function () {\r\n initializeEvents();\r\n addProductToCart();\r\n login.init();\r\n util.setDeleteConfirmation('.item-list', String.format(Resources.CONFIRM_DELETE, Resources.TITLE_GIFTREGISTRY));\r\n};\r\n\n},{\"../ajax\":5,\"../login\":26,\"../quickview\":77,\"../util\":87,\"./product/addToCart\":48}],59:[function(require,module,exports){\n'use strict';\r\n\r\nvar compareWidget = require('../compare-widget'),\r\n productTile = require('../product-tile'),\r\n progress = require('../progress'),\r\n video = require(\"../video\"),\r\n util = require('../util');\r\n\r\nconst EventNames = require('../constants/EventNames');\r\n\r\nfunction copyBottomResultHitsToTop() {\r\n $(\"#results-hits-top\").html($(\"#results-hits-bottom .results-hits\").html());\r\n}\r\n\r\nfunction viewMoreClick() {\r\n // getting the hidden div, which is the placeholder for the next page\r\n var loadingPlaceHolder = $('.infinite-scroll-placeholder[data-loading-state=\"unloaded\"]');\r\n // get url hidden in DOM\r\n var gridUrl = loadingPlaceHolder.attr('data-grid-url');\r\n\r\n if (loadingPlaceHolder.length === 1 && util.elementInViewport(loadingPlaceHolder.get(0), 250)) {\r\n // switch state to 'loading'\r\n // - switches state, so the above selector is only matching once\r\n // - shows loading indicator\r\n loadingPlaceHolder.attr('data-loading-state', 'loading');\r\n loadingPlaceHolder.addClass('infinite-scroll-loading');\r\n\r\n\r\n // named wrapper function, which can either be called, if cache is hit, or ajax repsonse is received\r\n var fillEndlessScrollChunk = function (html) {\r\n loadingPlaceHolder.removeClass('infinite-scroll-loading');\r\n loadingPlaceHolder.attr('data-loading-state', 'loaded');\r\n $('div.search-result-content').append(html);\r\n\r\n // move all product tiles up to search grid to prevent arbitrary breaklines\r\n $(\".tiles-container .column\").appendTo(\"#search-result-items\");\r\n\r\n // rebind the View More event\r\n $(\"#view-more\").off();\r\n $(\"#view-more\").on(\"click\", viewMoreClick);\r\n };\r\n\r\n // old condition for caching was `'sessionStorage' in window && sessionStorage[\"scroll-cache_\" + gridUrl]`\r\n // it was removed to temporarily address RAP-2649\r\n\r\n $.ajax({\r\n type: 'GET',\r\n dataType: 'html',\r\n url: gridUrl,\r\n success: function (response) {\r\n // put response into cache\r\n try {\r\n sessionStorage['scroll-cache_' + gridUrl] = response;\r\n } catch (e) {\r\n // nothing to catch in case of out of memory of session storage\r\n // it will fall back to load via ajax\r\n }\r\n // update UI\r\n $(\"#view-more\").remove();\r\n $(\"#view-all\").remove();\r\n $(\".results-hits\").remove();\r\n fillEndlessScrollChunk(response);\r\n copyBottomResultHitsToTop();\r\n productTile.init();\r\n $(document).trigger(\"plpviewmore\");\r\n $(document).trigger(EventNames.TRIGGER_CLICK_ORDER_DETAIL);\r\n \r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description replaces breadcrumbs, lefthand nav and product listing with ajax and puts a loading indicator over the product listing\r\n */\r\nfunction updateProductListing(url) {\r\n if (!url || url === window.location.href) {\r\n return;\r\n }\r\n progress.show($('.search-result-content'));\r\n $('#main').load(util.appendParamToURL(url, 'format', 'ajax'), function () {\r\n compareWidget.init();\r\n productTile.init();\r\n progress.hide();\r\n displayLHSRMSlideAccodianIcon();\r\n history.pushState(undefined, '', url);\r\n });\r\n}\r\n\r\nfunction excludeCompoundAttributeRefinements(refineUrl) {\r\n var newUrl = refineUrl;\r\n\r\n var params = util.getQueryStringParams(refineUrl);\r\n Object.keys(params).forEach(function (paramName) {\r\n if (paramName.indexOf('prefv') === -1) {\r\n return;\r\n }\r\n\r\n var splitParam = params[paramName].split(\"|\");\r\n newUrl = util.updateQueryStringParam(newUrl, paramName, splitParam[splitParam.length - 1]);\r\n });\r\n\r\n return newUrl;\r\n}\r\n\r\n/**\r\n * @private\r\n * @function\r\n * @description Initializes events for the following elements:
        \r\n *

        refinement blocks

        \r\n *

        updating grid: refinements, pagination, breadcrumb

        \r\n *

        item click

        \r\n *

        sorting changes

        \r\n */\r\nfunction initializeEvents() {\r\n var $main = $('#main');\r\n // compare checked\r\n $main.on('click', 'input[type=\"checkbox\"].compare-check', function () {\r\n var cb = $(this);\r\n var tile = cb.closest('.product-tile');\r\n\r\n var func = this.checked ? compareWidget.addProduct : compareWidget.removeProduct;\r\n var itemImg = tile.find('.product-image a img').first();\r\n func({\r\n itemid: tile.data('itemid'),\r\n uuid: tile[0].id,\r\n img: itemImg,\r\n cb: cb\r\n });\r\n\r\n });\r\n\r\n // handle events for updating grid\r\n $main.on('click', '.refinements a, .pagination a, .breadcrumb-refinement-value a', function (e) {\r\n // don't intercept for category and folder refinements, as well as unselectable\r\n if ($(this).parents('.category-refinement').length > 0 || $(this).parents('.folder-refinement').length > 0 || $(this).parent().hasClass('unselectable')) {\r\n return;\r\n }\r\n e.preventDefault();\r\n updateProductListing(this.href);\r\n });\r\n\r\n // handle sorting change\r\n $main.on('change', '.sort-by select', function (e) {\r\n e.preventDefault();\r\n updateProductListing($(this).find('option:selected').val());\r\n })\r\n .on('change', '.items-per-page select', function () {\r\n var refineUrl = $(this).find('option:selected').val();\r\n if (refineUrl === 'INFINITE_SCROLL') {\r\n $('html').addClass('infinite-scroll').removeClass('disable-infinite-scroll');\r\n } else {\r\n $('html').addClass('disable-infinite-scroll').removeClass('infinite-scroll');\r\n updateProductListing(refineUrl);\r\n }\r\n });\r\n\r\n //handle refinement change\r\n $main.on('change', '.top-filter select', function (e) {\r\n e.preventDefault();\r\n\r\n var refineUrl = $(this).find('option:selected').val();\r\n if (refineUrl.indexOf('prefv') > -1) {\r\n refineUrl = excludeCompoundAttributeRefinements(refineUrl);\r\n }\r\n\r\n updateProductListing(refineUrl);\r\n })\r\n .on('change', '.items-per-page select', function() {\r\n \t\tvar refineUrl = $(this).find('option:selected').val();\r\n \t\t$('html').addClass('disable-infinite-scroll').removeClass('infinite-scroll');\r\n \t\tupdateProductListing(refineUrl);\r\n\t});\r\n\r\n\r\n\r\n $('.category-tab-links select').on('change', function(e){\r\n \tvar $selected = $(this).find(\":selected\");\r\n \tvar link = $selected.attr('href');\r\n\r\n \tif(link){\r\n \t\twindow.location.href = link;\r\n \t}\r\n });\r\n\r\n}\r\n\r\n/**\r\n * Below function for expanding Left side Refinement Icons for\r\n * PLP and search Pages.\r\n * */\r\nfunction displayLHSRMSlideAccodianIcon(){\r\n\tvar $accordionToggle = $('.refinements .accordion-arrow');\r\n\r\n $accordionToggle.on('click', function(evt) { \r\n evt.preventDefault();\r\n $(this).next($('#category-level-2')).slideToggle(); \r\n $(this).parent($('li')).toggleClass('expanded');\r\n });\r\n}\r\n\r\nexports.init = function () {\r\n\r\n video.init(function () {\r\n initializeEvents();\r\n });\r\n\r\n compareWidget.init();\r\n //$(\"#view-more\").on(\"click\", viewMoreClick);\r\n\r\n $(document).on(\"click\", \"#view-more\", viewMoreClick);\r\n //$('#filter1-submit').on(\"click\", function() {\r\n //\t$('#filter1').val('0');\r\n //});\r\n productTile.init();\r\n initializeEvents();\r\n\r\n // content navigation title link\r\n $('.nav.content-navigation .accordion-title span').on('click', function() {\r\n \twindow.location = $(this).data('url');\r\n });\r\n\r\n // content navigation dropdown redirect\r\n $('.nav.content-navigation select').on('change', function() {\r\n \twindow.location = $(this).val();\r\n });\r\n\r\n displayLHSRMSlideAccodianIcon();\r\n\r\n\r\n};\r\nexports.viewMore = function() {\r\n\t$(document).on(\"click\", \"#view-more\", viewMoreClick);\r\n};\n},{\"../compare-widget\":11,\"../constants/EventNames\":12,\"../product-tile\":74,\"../progress\":75,\"../util\":87,\"../video\":89}],60:[function(require,module,exports){\narguments[4][35][0].apply(exports,arguments)\n},{\"../../util\":87,\"./shipping\":66,\"dup\":35}],61:[function(require,module,exports){\n'use strict';\r\n/**\r\n * We have created SPC JS file for handling all Singlepage checkout AJAX events along with required events\r\n * and we have followed the Site Genesis coding standard to complete the Single pageCheckout Flow.\r\n * we have used abbreviated from single page checkout short name is SPC.\r\n * a) we are using $.get method to render the form HTML structure dynamically into DIV.\r\n * b) $.post method is used to send the data to server for all single page checkout form submit functionality. \r\n * c) On AJAX event success call added the HTML content to DIV of specific column.\r\n * List of important function to achieve billing functionality for single page checkout.\r\n * 1) initBillingColumnCache()\r\n * 2) updatePaymentMethod()- Existing payment method\r\n * 3) creditCardTypeDetector() - Detecting the credit card type.\r\n * 4) updateBillingColumn() - Updating the billing column\r\n * 5) spcBillingColumnEvents() - All events for Billing payment column\r\n * 6) selectDefaultSavedCreditCard() - displaying default credit card\r\n * 7) spcAddPromoCouponCode() - Adding promotion coupon code on order summary column \r\n * */ \r\nvar ajax = require('../../ajax'),\r\n giftcard = require('../../giftcard'),\r\n util = require('../../util'),\r\n modal = require('../../modal').global,\r\n cardValidation = require('./card-validation'),\r\n validator = require('../../validator'),\r\n spccybcustom = require('./spccybcustom'),\r\n analytics = require('../../analytics');\r\n\r\nvar $cache = {};\r\nvar SessionAttributesStep = window.SessionAttributes;\r\n\r\nfunction initBillingColumnCache() {\r\n $cache.checkoutForm = $(\".checkout-billing\");\r\n $cache.selectedCardIdInput = $cache.checkoutForm.find('input[name$=\"_selectedCardID\"]');\r\n $cache.billingcol = $('#spcBilling.spc-billing .spc-column');\r\n $cache.summarycol = $('#spcSummary.spc-summary .spc-column');\r\n $cache.billingSubmitBtn = $('#dwfrm_billing_save');\r\n $cache.summarySubmitBtn = $('.spcSummaryPageSubmitBtn');\r\n}\r\n\r\n/**\r\n * @function\r\n * @description Changes the payment method form depending on the passed paymentMethodID\r\n * @param {String} paymentMethodID the ID of the payment method, to which the payment method form should be changed to\r\n */\r\nfunction updatePaymentMethod(paymentMethodID) {\r\n var $paymentMethods = $('.payment-method');\r\n //$paymentMethods.removeClass('payment-method-expanded');\r\n\r\n var dataMethod = paymentMethodID;\r\n if (paymentMethodID == 'SA_SILENTPOST') {\r\n dataMethod = 'CREDIT_CARD';\r\n }\r\n\r\n var $selectedPaymentMethod = $paymentMethods.filter('[data-method=\"' + dataMethod + '\"]');\r\n if ($selectedPaymentMethod.length === 0) {\r\n $selectedPaymentMethod = $('[data-method=\"Custom\"]');\r\n }\r\n\r\n\r\n if (paymentMethodID == \"VISA_CHECKOUT\") {\r\n $(\".continue-place-order\").hide();\r\n $(\".visacheckoutbutton\").show();\r\n } else if (paymentMethodID == \"PAYPAL\" || paymentMethodID == \"PAYPAL_CREDIT\") {\r\n $(\"#billingAgreementCheckbox\").attr('checked', false);\r\n $(\".continue-place-order\").hide();\r\n } else if (paymentMethodID == \"AFTERPAY_PBI\") {\r\n if ($(\"#dwfrm_billing\").length > 0) {\r\n $(\"#dwfrm_billing\").validate().resetForm();\r\n if ($(\"#dwfrm_billing\").validate().numberOfInvalids() > 0) {\r\n $(\"#dwfrm_billing\").validate().invalid = {};\r\n }\r\n $('select[name*=\"dwfrm_billing_paymentMethods_creditCard\"],input[name*=\"dwfrm_billing_paymentMethods_creditCard\"]').addClass(\"ignore\");\r\n }\r\n } else if (paymentMethodID == \"CREDIT_CARD\") {\r\n $('select[name*=\"dwfrm_billing_paymentMethods_creditCard\"],input[name*=\"dwfrm_billing_paymentMethods_creditCard\"]').removeClass(\"ignore\");\r\n if ($(\"#dwfrm_billing\").length > 0)\r\n $(\"#dwfrm_billing\").validate().resetForm();\r\n } else {\r\n $(\".continue-place-order\").show();\r\n $(\".visacheckoutbutton\").hide();\r\n }\r\n\r\n\r\n if (paymentMethodID == \"CREDIT_CARD\" || paymentMethodID == \"SA_SILENTPOST\") {\r\n $(\".spsavecard\").show();\r\n } else if ((paymentMethodID == \"SA_REDIRECT\" || paymentMethodID == \"SA_IFRAME\") && SitePreferences.TOKENIZATION_ENABLED) {\r\n $(\".spsavecard\").show();\r\n } else {\r\n $(\".spsavecard\").hide();\r\n }\r\n\r\n //$selectedPaymentMethod.addClass('payment-method-expanded');\r\n\r\n // ensure checkbox of payment method is checked\r\n $('input[name$=\"_selectedPaymentMethodID\"]').removeAttr('checked');\r\n $('input[value=' + paymentMethodID + ']').prop('checked', 'checked');\r\n //$('input[name$=\"_selectedPaymentMethodID\"]').val(paymentMethodID);\r\n\r\n}\r\n/**\r\n * By this function is detecting the credit card type(Eg:- Visa,JCB,Union Pay, American express card etc...).\r\n * This event fires on focus out event of card number field.\r\n * */\r\nfunction creditCardTypeDetector(options) {\r\n // the regular expressions check for possible matches as you type, hence the OR operators based on the number of chars\r\n // Visa\r\n var visa_regex = new RegExp('^4[0-9]{0,15}$'),\r\n\r\n // MasterCard\r\n mastercard_regex = new RegExp('^5$|^5[1-5][0-9]{0,14}$'),\r\n\r\n // American Express\r\n amex_regex = new RegExp('^3$|^3[47][0-9]{0,13}$'),\r\n\r\n //Discover\r\n discover_regex = new RegExp('^6[05]$|^601[1]?$|^65[0-9][0-9]?$|^6(?:011|5[0-9]{2})[0-9]{0,12}$'),\r\n\r\n //JCB\r\n unionpay_regex = new RegExp('^62[0-9]{0,14}$|^645[0-9]{0,13}$|^65[0-9]{0,14}$');\r\n\r\n $(document).on('focusout', '.spc-billing .cc-number input', function(e) {\r\n var cur_val = $(this).val();\r\n\r\n var piCardType = '';\r\n var $ccNumberContain = $(this).parents('.cc-number');\r\n\r\n // get rid of spaces and dashes before using the regular expression\r\n cur_val = cur_val.replace(/ /g, '').replace(/-/g, '');\r\n\r\n var $creditCard = $('[data-method=\"CREDIT_CARD\"]');\r\n\r\n // checks per each, as their could be multiple hits\r\n if (cur_val.match(visa_regex)) {\r\n piCardType = 'visa';\r\n $ccNumberContain.addClass('is_visa');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Visa\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_visa');\r\n }\r\n\r\n if (cur_val.match(mastercard_regex)) {\r\n piCardType = 'mastercard';\r\n $ccNumberContain.addClass('is_mastercard');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"MasterCard\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_mastercard');\r\n }\r\n\r\n if (cur_val.match(amex_regex)) {\r\n piCardType = 'amex';\r\n $ccNumberContain.addClass('is_amex');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Amex\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_amex');\r\n }\r\n\r\n if (cur_val.match(discover_regex)) {\r\n piCardType = 'discover';\r\n $ccNumberContain.addClass('is_discover');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Discover\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_discover');\r\n }\r\n\r\n if (cur_val.match(unionpay_regex)) {\r\n piCardType = 'unionpay';\r\n $ccNumberContain.addClass('is_unionpay');\r\n $creditCard.find('input[name$=\"_type\"]').val(\"Union\").trigger('change');\r\n } else {\r\n $ccNumberContain.removeClass('is_unionpay');\r\n }\r\n\r\n // if nothing is a hit we add a class to fade them all out\r\n if (cur_val != '' && !cur_val.match(visa_regex) && !cur_val.match(mastercard_regex) &&\r\n !cur_val.match(amex_regex) && !cur_val.match(discover_regex) && !cur_val.match(unionpay_regex)) {\r\n $ccNumberContain.addClass('is_nothing');\r\n } else {\r\n $ccNumberContain.removeClass('is_nothing');\r\n }\r\n\r\n if ($('.cvn').length > 0) {\r\n var setCVVCardLength = util.setCheckoutPaymentCardCVVLength(piCardType);\r\n var cvnMaxLength = setCVVCardLength.maxLength;\r\n var cvnMinLength = setCVVCardLength.minLength;\r\n $('.cvn').attr('minlength', cvnMinLength);\r\n $('.cvn').attr('maxlength', cvnMaxLength);\r\n }\r\n });\r\n\r\n};\r\n/**\r\n * Below function for Giftcertificate Modal Balance Checking functionality.\r\n * spcModalCheckAnotherCard :- Handled the functionality for adding another card checking button on modal form.\r\n * spcGCModalBalanceCheck :- It handles the balance checking for Gift card Modal form.\r\n * spcApplyGiftCertModal :- It is used for to Apply Gift card to basket from Gift Card Modal form.\r\n ***/\r\nfunction spcModalCheckAnotherCard($giftCode, $giftPin) {\r\n var $balance = $('div#gift-card-balance-form .balance');\r\n var $error = $('div#gift-card-balance-form .balance-error');\r\n\r\n $balance.html('');\r\n $error.html('');\r\n $giftCode.val(null).prop('disabled', false);\r\n $giftPin.val(null).prop('disabled', false);\r\n\r\n $('button.checkBalanceGiftCertModal').removeClass('hide');\r\n $('button.gcModalCheckAnotherCard').addClass('hide');\r\n $('button.applyGiftCertModal').addClass('hide');\r\n}\r\n\r\nfunction spcGCModalBalanceCheck($giftCode, $giftPin) {\r\n var $balance = $('div#gift-card-balance-form .balance');\r\n var $error = $('div#gift-card-balance-form .balance-error');\r\n\r\n $error.html('');\r\n $balance.html('');\r\n if ($giftCode.val().length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_INVALID);\r\n return;\r\n } else if ($giftCode.val().length !== 0 && $giftPin.val().length === 0) {\r\n $error.html(Resources.GIFT_CARD_PIN_INVALID);\r\n return;\r\n } else if ($giftCode.val().length === 0 && $giftPin.val().length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_PIN_INVALID);\r\n return;\r\n }\r\n\r\n giftcard.checkBalance($giftCode.val(), $giftPin.val(), function(data) {\r\n if (data && data.error) {\r\n return $error.html(data.error);\r\n }\r\n\r\n if (!data || !data.giftCertificate) {\r\n $error.html(Resources.GIFT_CARD_CODE_PIN_INVALID);\r\n return;\r\n }\r\n\r\n if (!data || !data.giftCertificate) {\r\n $balance.html(Resources.GIFT_CERT_INVALID).removeClass('success').addClass('error');\r\n return;\r\n }\r\n\r\n $balance.html(Resources.GIFT_CERT_CURRENT_BALANCE + ' ' + data.giftCertificate.balance);\r\n\r\n $giftCode.attr('disabled', \"true\");\r\n $giftPin.attr('disabled', \"true\");\r\n $('button.checkBalanceGiftCertModal').addClass('hide');\r\n $('button.gcModalCheckAnotherCard').removeClass('hide');\r\n $('button.applyGiftCertModal').removeClass('hide');\r\n });\r\n};\r\n\r\nfunction spcApplyGiftCertModal($giftCode, $giftPin) {\r\n var $error = $('div#gift-card-balance-form .balance-error');\r\n $error.html('');\r\n if ($giftCode.val().length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_INVALID);\r\n return;\r\n }\r\n\r\n var url = util.appendParamsToUrl(Urls.spcApplyGiftcertificate, {\r\n giftCertCode: $giftCode.val(),\r\n giftCertPIN: $giftPin.val(),\r\n format: 'ajax'\r\n });\r\n $.getJSON(url, function(data) {\r\n var fail = false;\r\n var msg = '';\r\n if (!data) {\r\n msg = Resources.BAD_RESPONSE;\r\n fail = true;\r\n } else if (!data.success) {\r\n msg = data.message;\r\n fail = true;\r\n }\r\n if (fail) {\r\n $error.html(msg);\r\n return;\r\n } else {\r\n clearGiftCertForm();\r\n $('.close-button').trigger('click');\r\n $(document).foundation();\r\n updateBillingColumn();\r\n return false;\r\n }\r\n });\r\n};\r\n/**\r\n * Initializing the Billing Column Credit Card form for Payment.\r\n * */\r\nfunction initCreditCardForm() {\r\n $cache.checkoutForm.find('input[name$=\"_selectedCardID\"]').val('');\r\n $cache.checkoutForm.find('input[name*=\"_number\"]').val('');\r\n $cache.checkoutForm.find('select[name*=\"_month\"]').val('').trigger(\"change\");\r\n $cache.checkoutForm.find('select[name*=\"_year\"]').val('').trigger(\"change\");\r\n $cache.checkoutForm.find('input[name*=\"_owner\"]').val('');\r\n\r\n var $ccContainer = $cache.checkoutForm.find(\".payment-method\").filter(function() {\r\n return $(this).data(\"method\") == \"CREDIT_CARD\";\r\n });\r\n\r\n $ccContainer.find('input[name*=\"_number\"]').on('change', function(e) {\r\n $cache.checkoutForm.find('input[name$=\"_selectedCardID\"]').val('');\r\n });\r\n $ccContainer.find('input[name$=\"_owner\"]').on('change', function(e) {\r\n $cache.checkoutForm.find('input[name$=\"_selectedCardID\"]').val('');\r\n });\r\n\r\n $ccContainer.find('select[name*=\"expiration\"]').on('change', function(e) {\r\n $cache.checkoutForm.find('input[name$=\"_selectedCardID\"]').val('');\r\n\r\n var selectedPaymentMethodID = $('input[name$=\"_selectedPaymentMethodID\"]:checked').val();\r\n var cardNumber = $cache.checkoutForm.find('input[name*=\"_number\"]').val();\r\n if (cardNumber.indexOf('****') != -1 && selectedPaymentMethodID == 'SA_SILENTPOST') {\r\n $cache.checkoutForm.find('input[name*=\"_number\"]').val('');\r\n }\r\n });\r\n}\r\n/**\r\n * Setting the default selected credit card ID for Register users.\r\n * */\r\nfunction setSelectedCardID(uuid) {\r\n $cache.selectedCardIdInput.val(uuid);\r\n}\r\n/**\r\n * We are handling the disability functionality for Billing Edit address\r\n * section. Disabled the Country field for register user on Edit event of billing address form. \r\n * */\r\nfunction enableCountryField(status) {\r\n var countryField = $('select[id$=\"billing_billingAddress_addressFields_country\"]');\r\n if (status) {\r\n countryField.prop('disabled', false);\r\n } else {\r\n countryField.prop('disabled', true);\r\n }\r\n}\r\n/**\r\n * Added events for Credit Card CVN field.\r\n * */\r\nfunction addCVNEvent() {\r\n $('input[name$=\"creditCard_cvn\"]').on('keydown', function(e) {\r\n if (e.key.toString().match(/[\\d]/) ||\r\n $.inArray(e.keyCode, [8, 9, 13, 46, 33, 34, 35, 36, 37, 38, 39, 40]) >= 0) {\r\n // do nothing\r\n } else {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n });\r\n}\r\n/**\r\n * Initializing the Gift Card functionality for Billing column Gift card payment methods.\r\n * */\r\nfunction initGiftCardBalance() {\r\n var $checkoutForm = $('.checkout-billing');\r\n var $addGiftCert = $('#spcAddGiftCert');\r\n var $giftCertCode = $('input[name$=\"_giftCertCode\"]');\r\n var $giftCertPin = $('input[name$=\"_giftCertPIN\"]');\r\n\r\n $addGiftCert.off();\r\n $addGiftCert.on('click', function(e) {\r\n e.preventDefault();\r\n var code = $giftCertCode.val();\r\n var pin = $giftCertPin.val();\r\n var $error = $checkoutForm.find('.spc-apply-error');\r\n\r\n // clear all errors\r\n $(this).closest('form').find('span.error').remove();\r\n\r\n $error.html('');\r\n if (code.length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_INVALID);\r\n return;\r\n } else if (code.length !== 0 && pin.length === 0) {\r\n $error.html(Resources.GIFT_CARD_PIN_INVALID);\r\n return;\r\n } else if (code.length === 0 && pin.length === 0) {\r\n $error.html(Resources.GIFT_CARD_CODE_PIN_INVALID);\r\n return;\r\n }\r\n\r\n var url = util.appendParamsToUrl(Urls.spcApplyGiftcertificate, {\r\n giftCertCode: code,\r\n giftCertPIN: pin,\r\n format: 'ajax'\r\n });\r\n $.getJSON(url, function(data) {\r\n var fail = false;\r\n var msg = '';\r\n if (!data) {\r\n msg = Resources.BAD_RESPONSE;\r\n fail = true;\r\n } else if (!data.success) {\r\n msg = data.message;\r\n fail = true;\r\n }\r\n if (fail) {\r\n $error.html(msg);\r\n return;\r\n } else {\r\n updateBillingColumn();\r\n $(document).foundation();\r\n }\r\n });\r\n });\r\n\r\n $giftCertCode.off();\r\n $giftCertCode.on('keydown', function(e) {\r\n if (e.which === 13) {\r\n e.preventDefault();\r\n $addGiftCert.trigger(\"click\");\r\n }\r\n });\r\n}\r\n\r\n//Removes 'PO Box shipping is not available' caption from address1 field if preference is true\r\nfunction removePOBoxCaption() {\r\n if (SitePreferences.ENABLE_POBOX_ADDRESS) {\r\n var $addressOne = $('input[name$=\"_address1\"]');\r\n $addressOne.closest(\".form-row\").find(\".form-caption\").text('');\r\n \tvar $addressTwo = $('input[name$=\"_address2\"]');\r\n \t$addressTwo.closest(\".form-row\").find(\".form-caption\").text('');\r\n }\r\n}\r\n\r\n/**\r\n * On the basis of country(US , China...etc) we are displaying the form field.\r\n * */\r\nfunction toggleBillingAddressFields(visible) {\r\n if (visible == true) {\r\n $('.spc-billing .country-dependent').each(function() {\r\n $(this).show();\r\n });\r\n } else {\r\n $('.spc-billing .country-dependent').each(function() {\r\n $(this).hide();\r\n });\r\n }\r\n\r\n if (window.User.isCustomerAuthenticated == false) {\r\n $('.checkout-billing').find('.set-default-cb').hide();\r\n }\r\n}\r\n/**\r\n * We are replacing the Billing column HTML structure on success of AJAX event call.\r\n * To avoid the page refresh we are replacing the HTML structure of Billing column section.\r\n * We have used this function(updateBillingColumn) for these are the AJAX events (Giftcertificate, Add new credit card\r\n * and the edit billing address)\r\n * */\r\nfunction updateBillingColumn(params) { \r\n let billingColURL = Urls.billing; \r\n if (params !== null && params !== undefined && params.OnlyGCInCart == 'true') {\r\n \tbillingColURL = util.appendParamToURL(billingColURL, 'onlyGCInCart', params.OnlyGCInCart);\r\n } \r\n $.get(billingColURL, function(data) {\r\n $cache.billingcol.html(data);\r\n $(document).foundation();\r\n spccybcustom.init();\r\n cardValidation.init();\r\n removeSelectedUserSavedPamentMethods();\r\n settingDefaultPaymentMethodOnAjaxLoad();\r\n validator.init();\r\n return false;\r\n });\r\n}\r\n/**\r\n * Below function will avoid rendering 2 forms to be visible at the same time on Billing column edit address.\r\n */\r\nfunction hideShowBillingAddressForm(currentevt, action) {\r\n $('.address-tile').show();\r\n if (currentevt && action == 'add') {\r\n $('.billing-edit-form-ajax').html('');\r\n currentevt.hide();\r\n } else if (currentevt && action == 'edit') {\r\n $('.billing-edit-form-ajax').removeClass('edit-spcbilling-address-ajax');\r\n currentevt.closest('.address-tile').hide();\r\n $('.spc-billing .spc-billing-address-create').hide();\r\n $('.spc-billing-address-form-ajax, .billing-edit-form-ajax').html('');\r\n } else {\r\n $('.billing-edit-form-ajax').removeClass('edit-spcbilling-address-ajax');\r\n $('.spc-billing-address-form-ajax, .billing-edit-form-ajax').html('');\r\n $('.spc-billing .spc-billing-address-create').hide();\r\n }\r\n}\r\n/**\r\n * Handling hide and show functionality for error message on form.\r\n * */\r\nfunction showORHideSubmitErrorFunction(show, msg) {\r\n if (show == true) {\r\n $('.spcbilling-submit-error').html(msg);\r\n $('.spcbilling-submit-error').removeClass('hide').show();\r\n } else {\r\n $('.spcbilling-submit-error').html('');\r\n $('.spcbilling-submit-error').hide();\r\n }\r\n}\r\n/**\r\n * Removing the selected credit card of Register user.\r\n * */\r\nfunction removeSelectedUserSavedPamentMethods() {\r\n $(document).find('div.payment-method div.creditcard-tile.selected').removeClass('selected').trigger('click');\r\n}\r\n/**\r\n * Handling the different Action event for Credit Card form\r\n * */\r\nfunction hideShowBillingCreditCardForm(currentevt, action) {\r\n if (currentevt && action == 'add') {\r\n currentevt.hide();\r\n } else {\r\n $('.spc-credit-card-create-ajax-form').html('');\r\n $(\".spc-credit-card-create\").show();\r\n }\r\n}\r\n/**\r\n * Toggle the same as shipping address section on Billing column.\r\n * */\r\nfunction toggleUnCheckShippingingAddressFields(billingAddressSec, visible) {\r\n if (visible == true) {\r\n billingAddressSec.find('.country-dependent').each(function() {\r\n $(this).show();\r\n });\r\n } else {\r\n billingAddressSec.find('.country-dependent').each(function() {\r\n $(this).hide();\r\n });\r\n }\r\n\r\n if (window.User.isCustomerAuthenticated == false) {\r\n $('.checkout-billing').find('.set-default-cb').hide();\r\n }\r\n}\r\n/**\r\n * Setting the selected credit card ID for Register users.\r\n * */\r\nfunction closeAllOpenFormOnBillingSection() {\r\n if ($('.subtitle.SPCCardForm-continer-close').length > 0) {\r\n $('.subtitle.SPCCardForm-continer-close').trigger('click');\r\n }\r\n if ($('.close-gift-form').length > 0) {\r\n $('.close-gift-form').trigger('click');\r\n }\r\n hideShowBillingAddressForm();\r\n}\r\n/**\r\n * Clearing the Gift certificate form Input field value and error message.\r\n * */\r\nfunction clearGiftCertForm(formType) {\r\n if (formType == 'gcform') {\r\n $('.checkout-billing').find('.spc-apply-error').html('');\r\n $('.checkout-billing').find('.spcGiftCertID .spc-gc-alphanumeric').val('');\r\n $('.checkout-billing').find('.spcGiftCertPin .spc-gc-alphanumeric').val('');\r\n } else {\r\n $('.modal-content .gift-card-number').find('.alphanumeric').val('');\r\n $('.modal-content .gift-card-pin').find('.alphanumeric').val('');\r\n }\r\n\r\n}\r\n/**\r\n * Focusing the page on top DIV section of Single page Checkout flow on javascript\r\n * Event call functionality(Eg:- click, submit, etc...).\r\n * */\r\nfunction scrollToTopSection() {\r\n $('.scroll-top-inner').trigger('click');\r\n}\r\n/**\r\n * We are updating the order total on TOP div section\r\n * in Order Review Column.\r\n * */\r\nfunction updateOrderTotalSec() {\r\n if ($('.review-total-amt').length > 0) {\r\n $('.review-total-amt').html($('.order-value').text());\r\n }\r\n}\r\n/**\r\n * Edit button in the payment summary\r\n */\r\nfunction editPaymentSummary() {\r\n\t$(document).on('click', '.edit-btn.payment-summary-edit', function(e) {\r\n\t\tutil.singlePageNextCheckoutStep(3);\r\n\t\t$('html, body').stop( true, true ).animate({\r\n\t scrollTop: $(\".SPCBillingPageSec\").offset().top\r\n\t }, 1000);\r\n\t});\r\n}\r\n/**\r\n * We are hiding the unnecessary error message on Single Page Checkout \r\n * Review Column.\r\n * */\r\nfunction hidingCouponCodeErrorMsgDIV() {\r\n var i = 0;\r\n $('.spc-applycoupon-error').each(function() {\r\n i = ++i;\r\n if (i > 1) {\r\n $(this).remove();\r\n }\r\n });\r\n}\r\n/**\r\n * Below function for adding coupon code at Summary section on SinglePageCheckout flow.\r\n * */\r\nfunction spcAddPromoCouponCode() {\r\n var spcStep = $('.spcCheckoutSteps').val();\r\n spcStep = (spcStep !== undefined && spcStep > 1) ? spcStep : 1;\r\n\r\n $(document).on('click', '.spc-summary #add-coupon.spcAddCouponBtn', function(e) {\r\n e.preventDefault();\r\n var form = $(this).closest('form');\r\n var formaction = Urls.spcApplyCouponCode;\r\n var formSer = $('form[id=\"CheckoutAddPromocode\"]');\r\n var formData = formSer.serialize();\r\n $.post(formaction, formData)\r\n .done(function(data) {\r\n $(document).foundation();\r\n if (data.success == false) {\r\n spcStep = data.steps;\r\n util.setSpcCheckoutSteps(spcStep);\r\n util.singlePageNextCheckoutStep(spcStep);\r\n hidingCouponCodeErrorMsgDIV();\r\n $('.spc-applycoupon-error').html(data.message);\r\n } else if (data.success == true) { //shipping section is not complete\r\n spcStep = data.steps;\r\n $('.spc-applycoupon-error').html('');\r\n $(this).val('');\r\n util.setSpcCheckoutSteps(spcStep);\r\n util.singlePageNextCheckoutStep(spcStep);\r\n updateOrderTotalSec();\r\n require('./shipping').ShippingUpdateSummary();\r\n scrollToTopSection();\r\n }\r\n\r\n return false;\r\n });\r\n });\r\n}\r\n/**\r\n * SinglePageCheckout Billing Form Submit section.\r\n * \r\n * */\r\nfunction spcBillingColumnEvents() {\r\n /**\r\n * Below function for register user save card payment methods and on click of Payment methods text filed\r\n * checked the validation.\r\n * */\r\n $(document).on('keyup blur focusout keypress', '.spc-billing input.regcustpclCVN', function(e) {\r\n var cardCvnLength = $(this).val().length;\r\n var cvnMinLen = $(this).attr('data-min-length');\r\n var cvnMaxLen = $(this).attr('data-max-length');\r\n if (cardCvnLength < cvnMinLen || cardCvnLength > cvnMaxLen) {\r\n util.displayCVNErrorMessage('show');\r\n } else if (cardCvnLength == cvnMinLen || cardCvnLength == cvnMaxLen) {\r\n util.displayCVNErrorMessage();\r\n } else {\r\n util.displayCVNErrorMessage();\r\n }\r\n })\r\n //checkout steps \r\n .on('click', '.button-checkoutstep', function() {\r\n \tvar currentValue = $(this);\r\n $(this).hide();\r\n $('.checkout-progress-container .step').addClass('section-overlay').removeClass('active');\r\n $(this).closest('.step').removeClass('section-overlay').addClass('active');\r\n require('./shipping').scrollActiveSection(currentValue);\r\n })\r\n //giftcard form closing section\r\n .on('click', '.spc-billing .close-gift-form', function(e) {\r\n var $giftCardForm = $('.gift-card-form');\r\n var $giftCardCheckLink = $('.check-gift-card.checkGiftCardBalanceLink');\r\n $giftCardForm.slideUp().addClass('rolledup');\r\n $giftCardCheckLink.addClass('hide');\r\n clearGiftCertForm('gcform');\r\n $('.gift-card-form-toggle').removeClass('hide');\r\n })\r\n //Expanding gift-card-form-toggle\r\n .on('click', '.spc-billing .gift-card-form-toggle', function(e) { //click on Add GiftCard link\r\n e.preventDefault();\r\n var $giftCardForm = $('.gift-card-form');\r\n var $giftCardCheckLink = $('.check-gift-card.checkGiftCardBalanceLink');\r\n\r\n $giftCardForm.slideDown().removeClass('rolledup');\r\n $giftCardCheckLink.removeClass('hide');\r\n $(this).addClass('hide');\r\n initGiftCardBalance();\r\n\r\n $('.gift-card-form input[name$=\"_giftCertCode\"], .gift-card-form input[name$=\"_giftCertPIN\"]').on('blur', function(e) {\r\n var $this = $(this);\r\n $this.siblings('span.error').remove();\r\n $this.removeClass('error');\r\n $('#spcAddGiftCert').prop('disabled', false);\r\n $('.gift-card-form .apply-error').html('');\r\n\r\n if ($this.val() && !$this.val().trim().match(/^[a-z0-9]+$/i)) {\r\n $('' + $this.attr('data-required-text') + '').insertBefore($this);\r\n $this.addClass('error');\r\n }\r\n\r\n if ($('.gift-card-form span.error').length > 0) {\r\n $('#spcAddGiftCert').prop('disabled', true);\r\n }\r\n });\r\n clearGiftCertForm('gcform');\r\n })\r\n /**\r\n * Below function for Same as shipping address check box field on Billing Column address section.\r\n * */\r\n .on('change', '.spc-billing .spc-billing-address .same-shippingaddress input#shipping-address-checked', function(evt) {\r\n var sameascheckbox = $(this);\r\n var billingAdrsSec = $('.spc-billing .spc-billing-address');\r\n\r\n if (sameascheckbox.is(\":checked\")) {\r\n billingAdrsSec.find('.saved-addresses.select-billing-address').addClass('hide');\r\n billingAdrsSec.find('.saved-addresses.default-billing-address').removeClass('hide');\r\n\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_firstName').val($('#dwfrm_billing_billingAddress_addressFields_firstName').attr('data-firstname'));\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_lastName').val($('#dwfrm_billing_billingAddress_addressFields_lastName').attr('data-lastname'));\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_address1').val($('#dwfrm_billing_billingAddress_addressFields_address1').attr('data-address1'));\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_address2').val($('#dwfrm_billing_billingAddress_addressFields_address2').attr('data-address2'));\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_city').val($('#dwfrm_billing_billingAddress_addressFields_city').attr('data-city'));\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_city').val($('#dwfrm_billing_billingAddress_addressFields_city').attr('data-city'));\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_postal').val($('#dwfrm_billing_billingAddress_addressFields_postal').attr('data-postal'));\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_country').val($('#dwfrm_billing_billingAddress_addressFields_country').attr('data-country'));\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_states_state').val($('#dwfrm_billing_billingAddress_addressFields_states_state').attr('data-state'));\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_phone').val($('#dwfrm_billing_billingAddress_addressFields_phone').attr('data-phone'));\r\n sameascheckbox.val('true');\r\n var currentEvent = evt.currentTarget;\r\n hideShowBillingAddressForm($(currentEvent), 'edit');\r\n billingAdrsSec.find(\".flag-show-hide\").fadeIn();\r\n toggleUnCheckShippingingAddressFields(billingAdrsSec, true);\r\n\r\n // for logged-in users with address, reselect default shipping address\r\n // if customer chooses to use the shipping address as their billing address\r\n var selectedShipping = $('div.address-tile.address-default');\r\n if (selectedShipping) {\r\n selectedShipping.removeClass('selected');\r\n selectedShipping.removeClass('default');\r\n selectedShipping.trigger(\"click\");\r\n }\r\n\r\n } else {\r\n billingAdrsSec.find('.saved-addresses.default-billing-address').addClass('hide');\r\n billingAdrsSec.find('.saved-addresses.select-billing-address').removeClass('hide');\r\n\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_address1').val('');\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_address2').val('');\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_city').val('');\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_postal').val('');\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_phone').val('');\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_postcode').val('');\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_province').val('');\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_states_state').val('');\r\n\r\n billingAdrsSec.find(\".flag-show-hide\").fadeOut(); //this is related with selection of country field and displaying the fields w.r.t. country \t \r\n\r\n billingAdrsSec.find('#dwfrm_billing_billingAddress_addressFields_country').val('');\r\n sameascheckbox.val('false');\r\n\r\n toggleUnCheckShippingingAddressFields(billingAdrsSec, false);\r\n }\r\n }).on('click', '.spc-billing .spc-show-allsaved-cards', function() {\r\n /**\r\n * On click of Show-All-Saved-Credit-Cards link then it will display all related cards to user. \r\n * */\r\n $('.spc-billing .creditcard-tile').removeClass('hide');\r\n $(this).addClass('hide');\r\n $(this).closest('.spc-selectable-pament-options').find('.hide-saved-card').removeClass('hide');\r\n }).on('click', '.hide-saved-card' , function(){\r\n\t\t\t var container = $(this).closest('.spc-selectable-pament-options');\r\n\t\t\t $(container).find('.spc-show-allsaved-cards').removeClass('hide');\r\n\t\t\t $(container).find('.creditcard-tile').addClass('hide');\r\n\t\t\t $(container).find('.creditcard-tile.selected').removeClass('hide');\r\n\t\t\t $(this).addClass('hide');\r\n\t\t })\r\n /**\r\n * Add Credit Card Section for Register USER. \r\n * */\r\n .on('click', '.spc-billing .spc-credit-card-create', function(evt) {\r\n evt.stopPropagation();\r\n var currentEvent = evt.currentTarget;\r\n hideShowBillingCreditCardForm($(currentEvent), 'add');\r\n var formInsertDiv = $(\".spc-credit-card-create-ajax-form\");\r\n\r\n $.get(util.appendParamToURL(Urls.spcShowCreditCardForm, 'format', 'ajax'), function(data) {\r\n formInsertDiv.html(data);\r\n formInsertDiv.addClass('spc-billing-creditcard-form');\r\n validator.initForm('form[id=\"SPCCreditCardForm\"]');\r\n cardValidation.init();\r\n });\r\n })\r\n /**\r\n * Add Credit Card Section form events. \r\n * */\r\n .on('click', 'button.spcCreditCardCreateBtn', function(e) {\r\n e.preventDefault();\r\n var form = $('form[id=\"SPCCreditCardForm\"]');\r\n var formaction = Urls.spcPaymentInstrumentSubmit;\r\n form.validate();\r\n if (!$('#SPCCreditCardForm').valid()) {\r\n util.formFieldFocusOnError(form);\r\n return false;\r\n }\r\n var formData = form.serialize() + \"&format=ajax&dwfrm_paymentinstruments_creditcards_create=Apply\";\r\n $.post(formaction, formData)\r\n .done(function(data) {\r\n if (data.success == true) {\r\n $('.spcbillingCC-submit-error').hide();\r\n hideShowBillingCreditCardForm();\r\n updateBillingColumn(data);\r\n } else {\r\n $('.spcbillingCC-submit-error').removeClass('hide').show().html(data.InvalidErr);\r\n return false;\r\n }\r\n });\r\n return false;\r\n })\r\n //Close the New Credit Card section\r\n .on('click', '.spc-billing .SPCCardForm-continer-close', function(evt) {\r\n hideShowBillingCreditCardForm();\r\n })\r\n .on('click', '.spc-billing .spc-billing-address-create', function(evt) {\r\n evt.stopPropagation();\r\n var currentEvent = evt.currentTarget;\r\n hideShowBillingAddressForm($(currentEvent), 'add');\r\n var formInsertDiv = $(\".spc-billing-address-form-ajax\");\r\n $(this).addClass('view-billing-form');\r\n\r\n if ($(this).hasClass('view-billing-form')) {\r\n $('.spc-billing-address-create').hide();\r\n $('.spc-billing-address-form-ajax').show();\r\n }\r\n\r\n $.get(util.appendParamToURL(Urls.checkoutSPCAddBillingAddress, 'format', 'ajax'), function(data) {\r\n formInsertDiv.html(data);\r\n formInsertDiv.addClass('spc-billing-address-form');\r\n var submitHandler = function() {\r\n var form = $('form[id=\"SPCBillingEditAddressForm\"]');\r\n var formSer = form.serialize() + \"&format=ajax&from=billing\";\r\n $.post(Urls.addUpdateAddress, formSer)\r\n .done(function(data) {\r\n $cache.billingcol.html(data);\r\n });\r\n\r\n return false;\r\n };\r\n\r\n validator.initForm('form[id=\"SPCBillingEditAddressForm\"]', submitHandler);\r\n //addressVerificationSvc.init();\r\n removePOBoxCaption();\r\n });\r\n })\r\n // edit billing address link\r\n .on(\"click\", \".spc-billing .address-tile .spc-billingaddress-edit\", function(evt) {\r\n var currentEvent = evt.currentTarget;\r\n hideShowBillingAddressForm($(currentEvent), 'edit');\r\n\r\n var element = document.getElementById(evt.currentTarget.id);\r\n var addressID = element.dataset.addressId;\r\n var addressCode = element.dataset.addressCode;\r\n var url = Urls.spcEditBillingAddress + addressID;\r\n var formInsertDiv = $('.spc-billing-address-form-ajax-' + addressID);\r\n $.get(url, function(data) {\r\n formInsertDiv.html(data);\r\n formInsertDiv.addClass('edit-spcbilling-address-ajax');\r\n enableCountryField(false);\r\n var submitHandler = function() {\r\n var form = $('form[id=\"SPCBillingEditAddressForm\"]');\r\n var formSer = form.serialize() + \"&format=ajax&from=billing&dwfrm_profile_address_edit=Apply\";\r\n $.post(Urls.addUpdateAddress, formSer)\r\n .done(function(data) {\r\n $cache.billingcol.html(data);\r\n removeSelectedUserSavedPamentMethods();\r\n spccybcustom.init();\r\n });\r\n return false;\r\n };\r\n\r\n validator.initForm('form[id=\"SPCBillingEditAddressForm\"]', submitHandler);\r\n removePOBoxCaption();\r\n var setDefaultCheckbox = $('input[id$=\"_setdefault\"]');\r\n if (setDefaultCheckbox.prop('checked')) {\r\n setDefaultCheckbox.attr('disabled', 'true');\r\n }\r\n });\r\n\r\n })\r\n .on('click', '.back-button, .sp-add-address-title', function(evt) {\r\n hideShowBillingAddressForm();\r\n })\r\n .on('click', '.edit_address_form .back-button, .addbillingaddress-title', function(evt) {\r\n $('.spc-billing .spc-billing-address-create').removeClass('view-billing-form');\r\n $('.spc-billing-address-form-ajax').hide();\r\n $('.spc-billing-address-create').hide();\r\n })\r\n .on('click', '.spc-billing .address-list .address-tile', function(evt) {\r\n if ($(this).is('.selected, .default') || evt.target.nodeName == 'A') {\r\n return false;\r\n } else {\r\n $('.address-list .address-tile').each(function() {\r\n $(this).removeClass('selected');\r\n $(this).removeClass('default');\r\n });\r\n\r\n $(this).addClass('selected');\r\n\r\n var element = document.getElementById(evt.currentTarget.id);\r\n if (element) {\r\n var addressID = element.dataset.addressId;\r\n\r\n var url = util.appendParamsToUrl(Urls.updateBillingAddressDetails, {\r\n addressID: addressID,\r\n //format: 'ajax'\r\n });\r\n $.ajax({\r\n url: url,\r\n type: 'GET',\r\n success: function(result) {\r\n //alert(result);\r\n }\r\n });\r\n }\r\n\r\n }\r\n })\r\n /**\r\n * Add Credit Card Section for Register USER. \r\n * */\r\n .on(\"click\", \".spc-billing .spc-cc-section\", function(evt) {\r\n $('.spc-cc-title').toggleClass('spc-cc-expanded');\r\n $('.creditcard-form-container').slideToggle();\r\n cardValidation.init();\r\n validator.init();\r\n evt.stopImmediatePropagation();\r\n return false;\r\n })\r\n /**\r\n * Function for removing the applied gift certificate from Cart.\r\n * */\r\n .on('click', '.spc-billing .spcRemoveGC.remove', function(e) {\r\n e.preventDefault();\r\n var code = $(this).attr('data-gccode');\r\n var $error = $(this).parents('.appliedGCToCart').children('.spc-remove-apply-error');\r\n $error.html('');\r\n\r\n if (code.length === 0 || code == undefined) {\r\n $error.html(Resources.GIFT_CARD_CODE_INVALID);\r\n return;\r\n }\r\n\r\n var url = util.appendParamsToUrl(Urls.spcRemoveAppliedGC, {\r\n giftCertificateID: code,\r\n format: 'ajax'\r\n });\r\n\r\n $.getJSON(url, function(data) {\r\n if (data.success) {\r\n $error.html('');\r\n updateBillingColumn();\r\n } else if (!data.success) {\r\n $error.html(data.message);\r\n } else {\r\n $error.html(Resources.BAD_RESPONSE);\r\n }\r\n return false;\r\n });\r\n })\r\n /**\r\n * Open the modal popup form to provide the balance check option\r\n * on modal popup.\r\n * */\r\n .on('click', '.spc-billing .checkGiftCardBalanceLink', function(evt) {\r\n modal.events.onOpen(function() {\r\n validator.initForm('form[id$=\"spcGCModalForm\"]');\r\n $('.gift-card-number .input-text.spcModalGCNum').val(null);\r\n $('.gift-card-pin .input-text.spcModalGCPINNum').val(null);\r\n });\r\n modal.restoreDefaultClass();\r\n modal.renderByUrl(Urls.spcBalanceCheckModalForm);\r\n modal.addCustomClass('gift-card-balance-modal spcGiftCardBalanceModal');\r\n })\r\n /**\r\n * Checking Gift Card balance for GC card on Modal Popup form \r\n * */\r\n .on('click', '.checkBalanceGiftCertModal', function(e) {\r\n e.preventDefault();\r\n var $giftCode = $('.gift-card-number .input-text.spcModalGCNum');\r\n var $giftPin = $('.gift-card-pin .input-text.spcModalGCPINNum');\r\n spcGCModalBalanceCheck($giftCode, $giftPin);\r\n return false;\r\n })\r\n /**\r\n * Checking Gift Card balance for another card on Modal Popup form.\r\n * */\r\n .on('click', '.gcModalCheckAnotherCard', function(evt) {\r\n var $giftCode = $('.gift-card-number .input-text.spcModalGCNum');\r\n var $giftPin = $('.gift-card-pin .input-text.spcModalGCPINNum');\r\n spcModalCheckAnotherCard($giftCode, $giftPin);\r\n return false;\r\n })\r\n /**\r\n * Below function for adding Gift Certificate form Giftcard Modal Popup functionality.\r\n * */\r\n .on('click', '.applyGiftCertModal', function(evt) {\r\n evt.preventDefault();\r\n var $error = $('div#gift-card-balance-form .balance-error');\r\n $error.html('');\r\n var $giftCode = $('.gift-card-number .input-text.spcModalGCNum');\r\n var $giftPin = $('.gift-card-pin .input-text.spcModalGCPINNum');\r\n if ($giftCode.val() !== undefined && $giftPin.val() !== undefined) {\r\n spcApplyGiftCertModal($giftCode, $giftPin);\r\n } else {\r\n $error.html(Resources.GIFT_CARD_CODE_INVALID);\r\n }\r\n return false;\r\n })\r\n /**\r\n * Below function for adding click action to edit button for \r\n * Order-Summary column section on SinglePageCheckout flow.\r\n * */\r\n .on('click', '.spc-summary .spc-mini-cart-link-cart', function() {\r\n var btnHrefAttr = $(this).attr('href');\r\n btnHrefAttr = (btnHrefAttr !== undefined && btnHrefAttr !== '') ? btnHrefAttr : Urls.cartShow;\r\n window.location = btnHrefAttr;\r\n });\r\n} //spcBillingColumnEvents\r\n/**\r\n * Iterating the Saved User credit cards and on Payment section page load we are selecting or focusing\r\n * the card for register user only.\r\n * */\r\nfunction selectDefaultSavedCreditCard() {\r\n //select credit card tile for register user\r\n $(document).on('click', '.spc-billing .creditcard-tile', function(evt) {\r\n var $this = $(this);\r\n var piCardTypeVal = $this.find('.creditcard-tile-inner .cc-number').attr('data-cctype');\r\n piCardTypeVal = (piCardTypeVal != undefined && piCardTypeVal != '' && piCardTypeVal != null) ? piCardTypeVal : '';\r\n var setCVVCardLength = util.setCheckoutPaymentCardCVVLength(piCardTypeVal);\r\n var cvnMaxLength = (setCVVCardLength != undefined) ? setCVVCardLength.maxLength : 4;\r\n var cvnMinLength = (setCVVCardLength != undefined) ? setCVVCardLength.minLength : 3;\r\n var ccEdit = $this.find('.credit-card-edit');\r\n var fauxCVNInput = '
        ';\r\n var CVNInput = '';\r\n\r\n if (evt.target == ccEdit[0]) {\r\n return;\r\n }\r\n\r\n if ($(this).is('.selected, .default')) {\r\n return false;\r\n } else {\r\n $('.creditcard-tile').each(function() {\r\n $(this).removeClass('selected');\r\n $(this).removeClass('default');\r\n $(this).find('.saved-cvn').addClass('disabled');\r\n $(this).find('.saved-cvn input').replaceWith(fauxCVNInput);\r\n });\r\n \r\n $(this).closest('.payment-list').find('.creditcard-tile').addClass('hide');\r\n \t$(this).closest('.payment-list').find('.show-allsaved-cards').removeClass('hide');\r\n if (!$('show-allsaved-cards').hasClass('hide')) {\r\n \t\t$(this).closest('.spc-selectable-pament-options').find('.hide-saved-card').addClass('hide');\r\n \t}\r\n $this.addClass('selected').removeClass('hide');\r\n $this.find('.cvn-input').removeClass('disabled');\r\n $this.find('.saved-cvn .cvn-input').replaceWith(CVNInput);\r\n $this.find('.saved-cvn input').trigger(\"focus\");\r\n\r\n $('.creditcard-tile .cvnvalidationerror').removeClass('errorshow').addClass('errorhide');\r\n $('.creditcard-tile .cvnvalidationerror.errorhide').html('');\r\n $('.creditcard-tile').each(function() {\r\n if ($(this).hasClass('selected')) {\r\n $('.creditcard-tile.selected .cvnvalidationerror').removeClass('errorhide').addClass('errorshow');\r\n }\r\n });\r\n\r\n var element = document.getElementById(evt.currentTarget.id);\r\n\r\n var creditcardPosition = element.dataset.creditcardPosition;\r\n\r\n var url = util.appendParamsToUrl(Urls.checkoutCreditCardSelection, {\r\n position: creditcardPosition,\r\n });\r\n $.ajax({\r\n url: url,\r\n type: 'GET',\r\n success: function(result) {}\r\n });\r\n\r\n setSelectedCardID($this.data(\"uuid\"));\r\n addCVNEvent();\r\n }\r\n\r\n });\r\n cardValidation.init();\r\n initCreditCardForm();\r\n validator.init();\r\n validator.initForm('form[id$=\"billing\"]');\r\n //trigger click event for selected by default cc on Page load of payment section(to manually trigger cc code)\r\n var selectedCC = $('div.payment-method div.creditcard-tile.selected');\r\n if (selectedCC && SessionAttributesStep.SPC_CHKOUTSTEPS > 2) {\r\n selectedCC.removeClass('selected').trigger(\"click\");\r\n }\r\n}\r\n/**\r\n * This function(spcBillingColumnContinueToSubmitBtn) is responsible for submitting the events for Single page checkout Billing column\r\n * section. Once it is successfully submitted then we will render on OrderReview column.\r\n * We have handle the form submit functionality through AJAX event.\r\n * */\r\nfunction spcBillingColumnContinueToSubmitBtn() {\r\n $(document).on('click', '#dwfrm_billing_save.spcBillingContinueBtn', function(e) {\r\n e.preventDefault();\r\n var form = $(this).closest('form');\r\n var formID = form.attr('id');\r\n var formaction = Urls.spcBillingSubmit;\r\n var formSer = $('form[id=\"' + formID + '\"]');\r\n var formData = formSer.serialize();\r\n closeAllOpenFormOnBillingSection();\r\n\r\n if ($('input[name=dwfrm_billing_paymentMethods_selectedPaymentMethodID]:checked').val() == 'CREDIT_CARD' &&\r\n ($('.spcCustomerPCLDetails').length > 0 || $('.creditcard-form-container').length > 0)) {\r\n form.validate();\r\n var cardCVNMinLen = $('.creditcard-tile.selected input.regcustpclCVN').attr('data-min-length');\r\n var cardCVNMaxLen = $('.creditcard-tile.selected input.regcustpclCVN').attr('data-max-length');\r\n cardCVNMinLen = (cardCVNMinLen !== undefined && cardCVNMinLen !== '') ? cardCVNMinLen : 0;\r\n cardCVNMaxLen = (cardCVNMaxLen !== undefined && cardCVNMaxLen !== '') ? cardCVNMaxLen : 0;\r\n\r\n if (!form.valid()) {\r\n util.formFieldFocusOnError(form);\r\n return false;\r\n }\r\n\r\n if ($('#dwfrm_billing_paymentMethods_creditCard_cvn').is(':visible') == true) {\r\n var cvnobj = $('#dwfrm_billing_paymentMethods_creditCard_cvn').val();\r\n let cvnObjLen = (cvnobj !== '' && cvnobj !== undefined && cvnobj != null) ? cvnobj.length : 0;\r\n if ((cvnObjLen == 0 && cvnobj == '') || cvnObjLen < cardCVNMinLen || cvnObjLen > cardCVNMaxLen && $('input.regcustpclCVN').length > 0) {\r\n $('#dwfrm_billing_paymentMethods_creditCard_cvn').trigger(\"focus\");\r\n util.displayCVNErrorMessage('show');\r\n return false;\r\n } else {\r\n util.displayCVNErrorMessage();\r\n $.post(formaction, formData)\r\n .done(function(data) {\r\n if (data.success == false) {\r\n showORHideSubmitErrorFunction(true, data.BillingError);\r\n var currentPos = $('.spcbilling-payment-sec').offset().top;\r\n require('./card-validation').scrollToPos(currentPos);\r\n } else {\r\n showORHideSubmitErrorFunction(false, '');\r\n util.setSpcCheckoutSteps(4);\r\n $cache.summarycol.html(data);\r\n $(document).foundation();\r\n util.singlePageNextCheckoutStep(4);\r\n if ($('.spc-orderconfirmation-div').hasClass('guest-user')) {\r\n \tmaskCardNumber();\r\n } \r\n require('./shipping').scrollActiveSection(form);\r\n }\r\n // calling GA event for next checkout step [Review]\r\n analytics.initSPCReviewEvent();\r\n });\r\n return false;\r\n }\r\n } else {\r\n showORHideSubmitErrorFunction(true, Resources.SPC_INVALID_PAYMENTINF);\r\n removeSelectedUserSavedPamentMethods();\r\n if ($('.sub-title.spc-cc-title.spc-cc-section').length > 0) {\r\n $('.sub-title.spc-cc-title.spc-cc-section').trigger('click');\r\n if (!form.valid()) {\r\n util.formFieldFocusOnError(form);\r\n return false;\r\n }\r\n }\r\n scrollToTopSection();\r\n return false;\r\n }\r\n\r\n } else if ($('input[name=dwfrm_billing_paymentMethods_selectedPaymentMethodID]:checked').val() == 'AFTERPAY_PBI') {\r\n $('#' + formID).attr('action', formaction).trigger(\"submit\");\r\n } else {\r\n $.post(formaction, formData)\r\n .done(function(data) {\r\n util.setSpcCheckoutSteps(4);\r\n util.singlePageNextCheckoutStep(4);\r\n $cache.summarycol.html(data);\r\n $(document).foundation();\r\n if ($('.spc-orderconfirmation-div').hasClass('guest-user')) {\r\n \tmaskCardNumber();\r\n } \r\n require('./shipping').scrollActiveSection(form);\r\n });\r\n //Calling GA tagging event\r\n analytics.initSPCReviewEvent();\r\n return false;\r\n }\r\n });\r\n}\r\n/**\r\n * Card Number Converted as MASK number(*********7891) for entered \r\n * card number on text field by customer.\r\n * */\r\nfunction maskCardNumber() {\r\n\tvar cardNumber = $('.form-row.cc-number input'),\r\n\t\tcardValue = cardNumber.val(),\r\n\t\tcardLength = cardValue.length,\r\n\t\teditLength = cardLength - 4,\r\n\t\thiddenValue = '*',\r\n\t\tslice1 = cardValue.slice(0,editLength-1),\r\n\t\tslice2 = cardValue.slice(editLength,cardLength),\r\n\t\thiddenValueFix = '',\r\n\t\tmaskCard='';\r\n\tfor(var i=0;i 0 && $('input#shipping-address-checked').is(\":checked\")) ||\r\n $('div.address-list div.address-tile.selected').length <= 0) {\r\n $(document).find('.spc-billing div.address-list div.address-tile').each(function(ind, evt) {\r\n if ($(this).hasClass('default') || $(this).hasClass('selected') || $(this).hasClass('address-default')) {\r\n $(this).removeClass('selected');\r\n $(this).removeClass('default');\r\n\r\n $(this).trigger(\"click\");\r\n }\r\n });\r\n } else if ($('input#shipping-address-checked').length == 0 && $('div.address-list div.address-tile.selected').length > 0) { \t\r\n // if no physical product to ship, re-select tile to properly assign billing address\r\n var reSelectTile = $('.spc-billing div.address-list div.address-tile.selected');\r\n //commented the below line to retain back address selection upon continue from shipping to billing section.\r\n //reSelectTile.removeClass('selected');\r\n reSelectTile.removeClass('default');\r\n reSelectTile.trigger(\"click\");\r\n }\r\n}\r\n/**\r\n * Set User's shipping default submitted address to be setting\r\n * as default billing address on Billing column. \r\n * We have set by getting the SAMEASSHIPPING forms submitted value on \r\n * Billing Continue submit(Continue To Review) of SFCC form framework.\r\n * */\r\nfunction setDefaultBillingColCheckbox() {\r\n\tlet $sameAsShippingAdrs = $('.spc-summary .SPCSummaryPageSec #secondary .spcBillColSameAsShippingAddress');\r\n\tlet $sameAsShippingAddressChk = $('.spc-billing .spc-billing-address .same-shippingaddress input#shipping-address-checked');\r\n\tif ($sameAsShippingAdrs.length > 0) {\r\n\t\tlet billingAddresSameAsShippingadrs = $sameAsShippingAdrs.attr('data-sameasshipping-address');\t \r\n\t if (billingAddresSameAsShippingadrs !== undefined && billingAddresSameAsShippingadrs == 'true') {\r\n\t \t$sameAsShippingAddressChk.prop('checked', true);\r\n\t $sameAsShippingAddressChk.trigger('change');\r\n\t } else {\r\n\t \t$sameAsShippingAddressChk.prop('checked', false);\r\n\t } \t\r\n\t}\r\n\t\r\n\t// trigger only for non-registered users\r\n if (window.User.isCustomerAuthenticated == false) {\r\n $('input[name$=\"_creditCard_cvn\"], input[name$=\"_creditCard_owner\"]').on('change', function() {\r\n $('select[name$=\"_creditCard_expiration_month\"]').trigger('change');\r\n $('select[name$=\"_creditCard_expiration_month\"]').trigger('change');\r\n });\r\n $('.checkout-billing').find('.set-default-cb').hide();\r\n }\r\n}\r\n/**\r\n * As we have multiple payment methods on our Global core we are setting\r\n * the payment methods on Page load or on ajax call page load.\r\n * */\r\nfunction settingDefaultPaymentMethodOnAjaxLoad() {\r\n\tvar $selectPaymentMethod = $(document).find('.selectable-payment-method-options');\r\n var selectedPaymentMethod = $selectPaymentMethod.find(':checked').val();\r\n\t // default payment method to 'CREDIT_CARD'\r\n updatePaymentMethod((selectedPaymentMethod) ? selectedPaymentMethod : 'CREDIT_CARD');\r\n $selectPaymentMethod.on('click', 'input[type=\"radio\"]', function() {\r\n \tupdatePaymentMethod($(this).val());\r\n });\r\n}\r\n/**\r\n * Loading Billing column data on Shipping column when user submit's the shipping form\r\n * successfully on ContinueToPayment Button click action by user.\r\n * */\r\nfunction initializeBillingColumnData() {\r\n\tselectDefaultSavedCreditCard();\r\n\tsetBillingAdrsSameAaShippingAddressCheckbox();\r\n\tsetDefaultBillingColCheckbox();\r\n\tsettingDefaultPaymentMethodOnAjaxLoad();\r\n}\r\n\r\n/**\r\n * @function\r\n * @description loads billing address, Gift Certificates, Coupon and Payment methods\r\n */\r\nexports.init = function() {\r\n if ($('.spc-container').length > 0) {\r\n \teditPaymentSummary();\r\n initBillingColumnCache();\r\n cardValidation.init();\r\n initCreditCardForm();\r\n initGiftCardBalance();\r\n\r\n var $selectPaymentMethod = $(document).find('.selectable-payment-method-options');\r\n var selectedPaymentMethod = $selectPaymentMethod.find(':checked').val();\r\n validator.initForm('form[id$=\"billing\"]');\r\n removePOBoxCaption();\r\n selectDefaultSavedCreditCard();\r\n spcBillingColumnEvents();\r\n spcBillingColumnContinueToSubmitBtn();\r\n\r\n $(document).on('change', '.spc-billing #dwfrm_billing_billingAddress_addressFields_country, .spc-billing #dwfrm_billingaddress_country', function() {\r\n var selectContry = $(this).val();\r\n if (selectContry == '') {\r\n toggleBillingAddressFields();\r\n } else if (selectContry == 'us') {\r\n toggleBillingAddressFields(true);\r\n $('.spc-billing .us-fields').show();\r\n $('.spc-billing .us-fields input').each(function() {\r\n $(this).addClass('required');\r\n });\r\n\r\n $('.spc-billing .cn-fields').hide();\r\n $('.spc-billing .cn-fields input').each(function() {\r\n $(this).removeClass('required');\r\n });\r\n } else {\r\n toggleBillingAddressFields(true);\r\n $(\".spc-billing .cn-fields\").show().css({\r\n \"display\": \"flex\"\r\n });\r\n $('.spc-billing .cn-fields input').each(function() {\r\n $(this).addClass('required');\r\n });\r\n\r\n $('.spc-billing .us-fields').hide();\r\n $('.spc-billing .us-fields input').each(function() {\r\n $(this).removeClass('required');\r\n });\r\n }\r\n });\r\n\r\n settingDefaultPaymentMethodOnAjaxLoad();\r\n creditCardTypeDetector();\r\n\r\n $('.order-summary-footer form').on(\"submit\", function() {\r\n $('#summary-place-order').prop('disabled', true).addClass('loading');\r\n return true;\r\n }); \r\n setBillingAdrsSameAaShippingAddressCheckbox();\r\n setDefaultBillingColCheckbox();\r\n \r\n // maximize order checkout summary dropdown\r\n util.maximizeCheckoutSummary();\r\n\r\n util.renderGoogleInvRecaptcha(\"billingrecaptcha\", \"#dwfrm_billing_save\", \"dwfrm_billing\");\r\n }\r\n $(document).on('click','.spcSummaryPageSubmitBtn', function() {\r\n \t$(this).addClass('loading');\r\n \t$('#spcSummaryPageForm').on(\"submit\", function() {\r\n \t\t $('#summary-place-order').prop('disabled', true).addClass('loading');\r\n \t\t return true;\r\n \t});\r\n });\r\n if ($('.SPCSummaryPageSec').find('.error-form').length>0) {\r\n \t//$('.spcSummaryPageSubmitBtn').removeAttr('disabled');\r\n \t$('.spcSummaryPageSubmitBtn').prop('disabled', false);\r\n\t\t$('.spcSummaryPageSubmitBtn').removeClass('loading');\r\n\t}\r\n \r\n}\r\nexports.SPCAddPromoCouponCode = spcAddPromoCouponCode;\r\nexports.spcSelectDefaultSavedCreditCard = selectDefaultSavedCreditCard;\r\nexports.loadBillingColData = initializeBillingColumnData;\n},{\"../../ajax\":5,\"../../analytics\":6,\"../../giftcard\":19,\"../../modal\":28,\"../../util\":87,\"../../validator\":88,\"./card-validation\":62,\"./shipping\":66,\"./spccybcustom\":67}],62:[function(require,module,exports){\n'use strict';\r\n\r\n// https://gist.github.com/ShirtlessKirk/2134376\r\n\r\nvar luhnCheck = (function (arr) {\r\n return function (ccNum) {\r\n var len = ccNum.length;\r\n var bit = 1;\r\n var sum = 0;\r\n var val;\r\n\r\n while (len) {\r\n val = parseInt(ccNum.charAt(--len), 10);\r\n sum += (bit ^= 1) ? arr[val] : val;\r\n }\r\n\r\n return sum && sum % 10 === 0;\r\n };\r\n}([0, 2, 4, 6, 8, 1, 3, 5, 7, 9]));\r\n\r\nvar cvvCheck = function (cvv) {\r\n return /^[0-9]{3,4}$/.test(cvv); \r\n};\r\n\r\nvar initCardExpiry = function(){\r\n\tvar ccSave = $('#CreditCardForm #applyBtn');\r\n\tccSave.on('click', function(e){\r\n\t\tvalidateCardExpiry(this, true);\r\n\t});\r\n\t\r\n\t$('.card-expiry.month, .card-expiry.year').on('change blur', function(){\r\n\t\tvalidateCardExpiry(this);\r\n\t});\r\n};\r\n\r\nvar validateCardExpiry = function(el, checkEmpty){\r\n\t// need to declare specifically in order not to confuse with other forms with similar inputs\r\n\tvar $this = $(el);\r\n\tvar $month = $this.closest('form').find('.card-expiry.month');\r\n\tvar $year = $this.closest('form').find('.card-expiry.year');\r\n\tvar $submit = $this.closest('form').find('button[type=\"submit\"]');\r\n\tvar hasError = false;\r\n\t\r\n\tvar now = new Date();\r\n\tvar nowMonth = now.getMonth() + 1; \r\n\tvar nowYear = now.getFullYear();\r\n\t\r\n\t$month.siblings('span.error').remove();\r\n\t$year.siblings('span.error').remove(); //-- Ade CG-4\r\n\t$month.removeClass('error');\r\n\t$year.removeClass('error');\r\n\t$submit.prop('disabled', false);\r\n\t\r\n\t// validate only on form submit\r\n\t/*if(checkEmpty && (!$month.val() || !$year.val())){\r\n\t\t$('' + Resources.INVALID_CARDEXPIRY + '').insertBefore($month);\r\n\t\thasError = true;*/\r\n\tif(checkEmpty) {\r\n\t\tif (!$month.val()){\r\n\t\t\t$('' + Resources.INVALID_CARDEXPIRY + '').insertBefore($month);\r\n\t\t\thasError = true;\r\n\t\t}\r\n\t\tif (!$year.val()){\r\n\t\t\t$('' + Resources.INVALID_CARDEXPIRY + '').insertBefore($year);\r\n\t\t\thasError = true;\r\n\t\t}\r\n\t// validate only if month and year has value, otherwise, ignore\r\n\t} else if($month.val() && $year.val()){\r\n\t\tif ($year.val() < nowYear) {\r\n\t\t\t$('' + Resources.VALIDATE_CARDEXPIRY + '').insertBefore($year);\r\n\t\t\thasError = true;\r\n\t\t} else if ($month.val() < nowMonth && $year.val() == nowYear) {\r\n\t\t\t$('' + Resources.VALIDATE_CARDEXPIRY + '').insertBefore($month);\r\n\t\t\thasError = true;\r\n\t\t}\r\n\t}\r\n\t\r\n\t// highlight inputs if expiry has error \r\n\tif(hasError){\r\n\t\t$month.addClass('error');\r\n\t\t$year.addClass('error');\r\n\t}\r\n\t\r\n\t// disable button if there are errors -- // change by ticket shi-5388\r\n\tif($this.closest('form').find('span.error').length > 0){\r\n\t\t$submit.prop('disabled', true);\r\n\t\tvar currentValue = $this.closest('form').offset().top;\r\n\t\tscrollToPos(currentValue);\r\n\t}\r\n};\r\n\r\nfunction scrollToPos(pos) {\r\n $('html, body').animate({\r\n scrollTop: pos\r\n }, 800);\r\n}\r\n\r\nexports.init = function () {\r\n\tinitCardExpiry();\r\n}\r\n\r\nexports.scrollToPos = scrollToPos;\n},{}],63:[function(require,module,exports){\n'use strict';\r\n\r\nvar _ = require('lodash');\r\n\r\nvar hasEmptyRequired = function () {\r\n // filter out only the visible fields\r\n var requiredValues = this.$requiredInputs.filter(':visible').map(function () {\r\n return $(this).val();\r\n });\r\n return _(requiredValues).contains('');\r\n};\r\n\r\nvar validateForm = function () {\r\n\tvar _self = this;\r\n // only validate form when all required fields are filled to avoid\r\n // throwing errors on empty form\r\n if (!this.validator) {\r\n return;\r\n }\r\n \r\n // wait for the form to show before validating.. this applies to modals\r\n this.timer = setInterval(function(){ \r\n \tif(_self.$form.is(':visible')) {\r\n \t\tif (_self.$form.find('span.error:visible, .error-form:visible').length == 0) { //!_self.hasEmptyRequired() &&\r\n \t\t\t_self.$continue.prop('disabled', false);\r\n \t\t} else {\r\n \t\t\t_self.$continue.prop('disabled', true);\r\n \t\t}\r\n \t\tclearInterval(_self.timer);\r\n \t}\r\n }, 100);\r\n \r\n};\r\n\r\nvar validateEl = function (e) {\r\n if ($(e.target).val() === '') {\r\n this.$continue.prop('disabled', true);\r\n } else {\r\n // enable continue button on last required field that is valid\r\n // only validate single field\r\n if (!this.hasEmptyRequired()) { \r\n this.$continue.prop('disabled', false);\r\n } else {\r\n this.$continue.prop('disabled', true);\r\n }\r\n }\r\n};\r\n\r\nvar checkValue = function(repopulateRequiredFields, e) {\r\n\tvar $el = $(e.target);\r\n\tvar attr = $el.attr('clear-on-error');\r\n\t\r\n\t// check for new required fields (e.g. changing US -> CH in address)\r\n\tif(repopulateRequiredFields){\r\n\t\tthis.$requiredInputs = this.$form.find('input.required');\r\n\t}\r\n\t\r\n\t// remove any error message residue from previous validation\r\n if (this.$form.find('.-error-pad').length == 0) {\r\n $el.siblings('span.error').remove();\r\n }\r\n\t\r\n if (this.validator.element($el) \r\n \t\t&& this.$form.find('span.error:visible').length == 0) {\r\n this.$continue.prop('disabled', false);\r\n } else {\r\n// this.$continue.prop('disabled', true);\r\n \r\n // clear the value if input has error\r\n if(typeof attr !== typeof undefined && attr !== false) $el.val('');\r\n }\r\n};\r\n\r\nvar submitForm = function(e) {\r\n this.$form.find('input').trigger(\"blur\");\r\n this.$form.find('select').trigger(\"blur\");\r\n\r\n if (this.$continue.hasClass('password-ignore')) {\r\n if ($(\".form-row.username .field-wrapper span.error\").length) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n } else if(this.validator.numberOfInvalids() > 0 || this.$form.data('submitting') == true){\r\n// \tthis.$continue.prop('disabled', true);\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n // Execute Google Recaptcha once validation is completed.\r\n var util = require('../../util');\r\n if (util.getGoogleRecaptchaEnableStatus(this.$form.attr('id')) == true) { \t \r\n util.callingGoogleReCaptchaOnFormSubmitORAJAXCall(e, this.$form.attr('id'));\r\n } \r\n \r\n // adding this to prevent multiple submission of forms\r\n if(this.$form.attr('multiple-submission') === 'false'){\r\n \tthis.$form.data('submitting', true);\r\n }\r\n};\r\n\r\nvar init = function (opts, settings) {\r\n if (!opts.formSelector || !opts.continueSelector) {\r\n throw new Error('Missing form and continue action selectors.');\r\n }\r\n this.$form = $(opts.formSelector);\r\n this.$continue = $(opts.continueSelector); \r\n this.validator = settings? this.$form.validate(settings) : this.$form.validate();\r\n this.$allInputs = $('input, textarea', this.$form);\r\n this.$allSelect = $('select', this.$form);\r\n this.$requiredInputs = this.$form.find('input.required');\r\n// this.validateForm();\r\n \r\n // start listening\r\n// this.$requiredInputs.on('change', $.proxy(this.validateEl, this));\r\n this.$allInputs.on('keyup', $.proxy(this.checkValue, this, false)); \r\n this.$allSelect.on('blur', $.proxy(this.checkValue, this, true));\r\n this.$continue.on('click', $.proxy(this.submitForm, this));\r\n\t// [life-hack:5079] needed to trigger onclick since blur prevents the form from submitting\r\n if(this.$continue.attr('mousesubmit') === 'true'){\r\n \tthis.$continue.on('mousedown', $.proxy(function(e){ this.$continue.trigger(\"click\"); }, this));\r\n }\r\n};\r\n\r\nvar formPrepare = function(){\r\n\treturn {\r\n\t\t$form: null,\r\n\t\t$continue: null,\r\n\t\t$allInputs: null,\r\n\t\t$allSelect: null,\r\n\t\t$requiredInputs: null, \r\n\t\tvalidator: null,\r\n\t\tinit: init,\r\n\t\ttimer: null,\r\n\t\thasEmptyRequired: hasEmptyRequired,\r\n\t\tcheckValue: checkValue,\r\n\t\tvalidateForm: validateForm,\r\n\t\tsubmitForm: submitForm,\r\n\t\tvalidateEl: validateEl\r\n\t}\r\n}\r\n\r\nmodule.exports = formPrepare;\r\n\n},{\"../../util\":87,\"lodash\":116}],64:[function(require,module,exports){\n'use strict';\r\n\r\nvar address = require('./address'),\r\n billing = require('./billing'),\r\n multiship = require('./multiship'),\r\n ajax = require('../../ajax'),\r\n util = require('../../util'),\r\n shipping = require('./shipping');\r\n \r\n\r\n/**\r\n * @function Initializes the page events depending on the checkout stage (shipping/billing)\r\n */\r\nexports.init = function () {\r\n initTabs();\r\n address.init();\r\n shipping.init();\r\n billing.init();\r\n hideShowAddressTiles();\t \r\n billing.SPCAddPromoCouponCode();\r\n util.isMacOS();\r\n util.isApplePayPresent();\r\n util.autoSuggestionAddressField('spc');\r\n};\r\n\r\n/*\r\n * This method sets an active class to the element once one of the tab is clicked.\r\n * */\r\nfunction initTabs(){\r\n\tif($('.spc-container').length > 0) {\r\n\t var spcStepsVal= (window.SessionAttributes.SPC_CHKOUTSTEPS >0)? window.SessionAttributes.SPC_CHKOUTSTEPS: 1;\r\n\t util.singlePageNextCheckoutStep(spcStepsVal);\r\n\t}\r\n}\r\n\r\nfunction hideShowAddressTiles(){\t\r\n\t $(document).on(\"click\", \".showmoreaddresses\", function(){\r\n\t\t var addresstype = '.spc-'+$(this).data('addresstype');\r\n\t\t $(addresstype + \" .address-tile\").removeClass(\"hide\");\r\n\t\t $(this).addClass(\"hide\");\r\n\t });\r\n}\n},{\"../../ajax\":5,\"../../util\":87,\"./address\":60,\"./billing\":61,\"./multiship\":65,\"./shipping\":66}],65:[function(require,module,exports){\narguments[4][41][0].apply(exports,arguments)\n},{\"../../dialog\":16,\"../../util\":87,\"../../validator\":88,\"./address\":60,\"./formPrepare\":63,\"dup\":41}],66:[function(require,module,exports){\n'use strict';\r\n/**\r\n * We have created SPC JS file for handling all shipping related functionality for Single page checkout flow by using AJAX call.\r\n * and we have followed Site Genesis coding standard to complete the Single page Checkout Flow.\r\n * we have used abbreviated from single page checkout short name is SPC.\r\n * a) we are using $.get method to render the form html structure dynamically into DIV.\r\n * b) $.post method is used to send the data server for all single page checkout form submit functionality. \r\n * c) On AJAX event success call added the HTMl content to DIV of specific column. \r\n * Some important useful functions are used to achieve the SHIPPING column functionality.\r\n * 1) initCache() - Initializing the cache for Shipping column\r\n * 2) removePOBoxCaption() - Removing PO Box shipping code if it is not available\r\n * 3) initEvents() - Initializing the events for Shipping column \r\n * 4) giftMessageBox() - for Gift message\r\n * 5) updateSummary() - Refreshing the Summary section\r\n * 6) shippingContinueToCheckoutEvent()- Handled the Shipping form submit functionality\r\n * 7) init() - to initiate the default events ot functions.\r\n * */\r\nvar ajax = require('../../ajax'),\r\n progress = require('../../progress'),\r\n tooltip = require('../../tooltip'),\r\n util = require('../../util'),\r\n validator = require('../../validator'),\r\n modal = require('../../modal').global,\r\n billing = require('./billing'),\r\n addressVerificationSvc = require('../../qas'),\r\n spccybcustom = require('./spccybcustom'),\r\n analytics = require('../../analytics');\r\n\r\nvar $cache, shippingMethods;\r\n/**\r\n * Initialize the cache for shipping page.\r\n * */\r\nfunction initCache() {\r\n var $formEle = $('form[id$=\"_shippingAddress\"]');\r\n $cache = {\r\n addrForm: {\r\n address1: $formEle.find('input[name$=\"_address1\"]'),\r\n address2: $formEle.find('input[name$=\"_address2\"]'),\r\n countryCode: $formEle.find('select[id$=\"_country\"]'),\r\n stateCode: $formEle.find('select[id$=\"_state\"]'),\r\n postalCode: $formEle.find('input[name$=\"_postal\"]'),\r\n city: $formEle.find('input[name$=\"_city\"]')\r\n },\r\n main: $('#main'),\r\n primary: $('#primary'),\r\n secondary: $('#secondary'),\r\n shippingcol: $('.spc-shipping .spc-column'),\r\n billingcol: $('.spc-billing .spc-column')\r\n };\r\n};\r\n\r\n// Removes 'PO Box shipping is not available' caption from address1 field if preference is true\r\nfunction removePOBoxCaption() {\r\n if (SitePreferences.ENABLE_POBOX_ADDRESS) {\r\n var $addressOne = $('input[name$=\"_address1\"]');\r\n $addressOne.closest(\".form-row\").find(\".form-caption\").text('');\r\n \tvar $addressTwo = $('input[name$=\"_address2\"]');\r\n \t$addressTwo.closest(\".form-row\").find(\".form-caption\").text('');\r\n }\r\n}\r\n/**\r\n * We have written the function for shipping column related events.\r\n * Below function is for creating Address event and edit address section.\r\n * */\r\nfunction initEvents() {\r\n // create New address link\r\n $(document).on('click', '.spc-shipping .address-create-spc', function(evt) {\r\n evt.stopPropagation();\r\n var currentEvent = evt.currentTarget;\r\n hideshowaddressform($(currentEvent), 'add');\r\n var formInsertDiv = $(\".address-form-ajax\");\r\n $.get(util.appendParamToURL(Urls.spcAddShippingAddress, 'format', 'ajax'), function(data) {\r\n formInsertDiv.html(data);\r\n var submitHandler = function() {\r\n var form = $('form[id=\"EditAddressForm\"]');\r\n $.post(Urls.addUpdateAddress, form.serialize())\r\n .done(function(data) {\r\n $cache.shippingcol.html(data);\r\n iterateShippingAddressTile();\r\n shippingContinueToCheckoutEvent();\r\n displaySaveAddressMessage();\r\n });\r\n return false;\r\n };\r\n\r\n validator.initForm('form[id=\"EditAddressForm\"]', submitHandler);\r\n addressVerificationSvc.init();\r\n removePOBoxCaption();\r\n util.autoSuggestionAddressField('spc');\r\n });\r\n })\r\n // edit address link for register user\r\n .on('click', '.spc-shipping .address-tile .address-edit-spc', function(evt) {\r\n var currentEvent = evt.currentTarget;\r\n hideshowaddressform($(currentEvent), 'edit');\r\n\r\n var element = document.getElementById(evt.currentTarget.id);\r\n var addressID = element.dataset.addressId;\r\n var addressCode = element.dataset.addressCode;\r\n var url = Urls.spcEditShippingAddress + addressID;\r\n var $this = $(this);\r\n var addressID = $this.data('addressId');\r\n var formInsertDiv = $('.address-form-ajax-' + addressID);\r\n $('.edit-add-address').show();\r\n $.get(url, function(data) {\r\n formInsertDiv.html(data);\r\n var submitHandler = function() {\r\n var form = $('form[id=\"EditAddressForm\"]');\r\n $.post(Urls.addUpdateAddress, form.serialize())\r\n .done(function(data) {\r\n $cache.shippingcol.html(data);\r\n iterateShippingAddressTile();\r\n shippingContinueToCheckoutEvent();\r\n displaySaveAddressMessage();\r\n });\r\n return false;\r\n };\r\n\r\n validator.initForm('form[id=\"EditAddressForm\"]', submitHandler);\r\n addressVerificationSvc.init();\r\n removePOBoxCaption();\r\n util.autoSuggestionAddressField('spc');\r\n var setDefaultCheckbox = $('input[id$=\"_setdefault\"]');\r\n if (setDefaultCheckbox.prop('checked')) {\r\n setDefaultCheckbox.attr('disabled', 'true');\r\n }\r\n });\r\n\r\n })\r\n .on('click', '.back-button, .sp-add-address-title, .sp-add-address-title', function(evt) {\r\n hideshowaddressform();\r\n })\r\n // authenticated user address change\r\n .on('click', '.spc-shipping .address-list .address-tile', function(evt) {\r\n if ($(this).is('.selected, .default') || evt.target.nodeName == 'A') {\r\n \tif ($(this).closest('.saved-addresses').find('.showmoreaddresses').hasClass('hide')) {\r\n \t$(this).closest('.address-list').find('.address-tile').not(\".selected\").addClass('hide');\r\n \t$(this).closest('.saved-addresses').find('.showmoreaddresses').removeClass('hide');\r\n } \r\n \treturn false;\r\n }\r\n $('.address-list .address-tile').each(function() {\r\n $(this).removeClass('selected');\r\n $(this).removeClass('default');\r\n $(this).find('.icon-checkmark').addClass('hide')\r\n });\r\n if ($(this).closest('.saved-addresses').find('.showmoreaddresses').hasClass('hide')) {\r\n \t$(this).closest('.address-list').find('.address-tile').addClass('hide');\r\n \t$(this).closest('.saved-addresses').find('.showmoreaddresses').removeClass('hide');\r\n } \r\n $(this).addClass('selected').removeClass('hide');\r\n $(this).find('.icon-checkmark').removeClass('hide');\r\n\r\n var element = document.getElementById(evt.currentTarget.id);\r\n if (element) {\r\n var addressID = element.dataset.addressId;\r\n // update address; on success update shipping method list\r\n $.get(Urls.updateAddressDetails, {\r\n addressID: addressID\r\n }, function(response) {\r\n updateShippingMethodList();\r\n });\r\n }\r\n checkSelectedAddress();\r\n })\r\n /**\r\n * Accordion functionality goes on below\r\n * */\r\n .on('click', '.spc-shipping-default .sp-accordion-arrow', function(event) {\r\n event.preventDefault();\r\n if ($('.shipping-options-section').hasClass('show-shipping')) {\r\n $('.shipping-options-section').hide();\r\n $('.icon-chevron-thin-left.icon-chevron-right').css({\r\n 'transform': 'rotate(360deg)'\r\n });\r\n } else {\r\n $('.shipping-options-section').show();\r\n $('.icon-chevron-thin-left.icon-chevron-right').css({\r\n 'transform': 'rotate(90deg)'\r\n });\r\n }\r\n $('.shipping-options-section').toggleClass('show-shipping');\r\n });\r\n\r\n // guest user address change\r\n var timer = null;\r\n $('form[id$=\"_shippingAddress\"]').on('change', 'input[name$=\"_addressFields_address1\"], input[name$=\"_addressFields_address2\"], select[name$=\"_addressFields_states_state\"], input[name$=\"_addressFields_city\"], input[name$=\"_addressFields_postal\"]', function() {\r\n if (!validateAddrForm()) {\r\n return;\r\n }\r\n\r\n if (timer) {\r\n window.clearTimeout(timer);\r\n }\r\n\r\n timer = window.setTimeout(function() {\r\n $.post(Urls.setShippingAddressDetails, $('form[id$=\"_singleshipping_shippingAddress\"]').serialize(), function(result) {\r\n updateShippingMethodList();\r\n });\r\n }, 200);\r\n });\r\n\r\n $('input[name$=\"_shippingAddress_isGift\"]').on('click', giftMessageBox);\r\n $('input[name$=\"_cart_isGift\"]').on('click', giftMessageBox);\r\n\r\n}\r\n\r\n/**\r\n * @function\r\n * @description Initializes gift message box, if shipment is gift\r\n */\r\nfunction giftMessageBox() {\r\n // show gift message box, if shipment is gift\r\n $('.gift-message-text').toggleClass('hidden', $('input[name$=\"_shippingAddress_isGift\"]:checked').val() !== 'true');\r\n $('.complimentary-gift-container').toggleClass('hidden, hide', $('input[name$=\"_cart_isGift\"]:checked').val() !== 'true');\r\n}\r\n\r\n/**\r\n * this will show shipping address save message \r\n */\r\nfunction displaySaveAddressMessage() {\r\n\t var i = $('.saved-address-message').removeClass('hide'),\r\n scrollTop = $('.spc-shipping').offset().top;\r\n $(\"html, body\").animate({ scrollTop:scrollTop }, \"slow\"); \r\n i.fadeIn();\r\n setTimeout(function(){ i.fadeOut(); }, 3000); \r\n}\r\n\r\n\r\n/**\r\n * this will avoid 2 forms to be visible at the same time.\r\n */\r\n\r\nfunction hideshowaddressform(currentevt, action) {\r\n\tvar $submit = $('#dwfrm_singleshipping_shippingAddress button[value=\"Continue\"]');\r\n $('.address-tile').show();\r\n util.autoSuggestionAddressField('spc');\r\n if (currentevt && action == 'add') {\r\n $('.edit-form-ajax').html('');\r\n currentevt.hide();\r\n } else if (currentevt && action == 'edit') {\r\n currentevt.closest('.address-tile').hide();\r\n $('.spc-shipping .address-create-spc').show();\r\n $('.address-form-ajax, .edit-form-ajax').html('');\r\n } else {\r\n $('.address-form-ajax, .edit-form-ajax').html('');\r\n $('.spc-shipping .address-create-spc').show();\r\n $submit.prop('disabled', false);\r\n }\r\n}\r\n\r\n/**\r\n * @function\r\n * @description updates the order summary based on a possibly recalculated basket after a shipping promotion has been applied\r\n */\r\nfunction updateSummary() {\r\n var $summary = $('#secondary.summary');\r\n var couponError;\r\n\r\n if ($('.cart-coupon-code .error').length) {\r\n couponError = $('.cart-coupon-code .error').clone();\r\n }\r\n\r\n var showmsg = \"none\";\r\n if ($('.cart-coupon-code .success').length > 0) {\r\n showmsg = \"show\";\r\n }\r\n\r\n // indicate progress\r\n progress.show($('.checkout-progress-container'));\r\n\r\n // load the updated summary area\r\n $summary.load(Urls.spcSummaryRefreshURL + \"?showmsg=\" + showmsg, function() {\r\n // hide edit shipping method link\r\n $summary.fadeIn('fast');\r\n\r\n // checkout checkout minicart on right side event handling\r\n addSummaryScrollbar();\r\n\r\n $summary.find('.checkout-mini-cart .minishipment .header a').hide();\r\n $summary.find('.order-totals-table .order-shipping .label a').hide();\r\n $('.cart-coupon-code').append(couponError);\r\n util.maximizeCheckoutSummary();\r\n if ($('.review-total-amt').length > 0) {\r\n $('.review-total-amt').html($('.order-value').text());\r\n }\r\n\r\n $(\".checkout-mini-cart .accordion\").foundation();\r\n $(\".shipping-options-section\").hide();\r\n progress.hide();\r\n });\r\n}\r\n/**\r\n * Return Selected Address from Shipping Address tile.\r\n * */\r\nfunction getAddressFromTile() {\r\n var $selectedAddress = $(\".address-tile.selected address\");\r\n\r\n return {\r\n address1: $selectedAddress.data(\"address-one\"),\r\n address2: $selectedAddress.data(\"address-two\") || \"\",\r\n countryCode: $selectedAddress.data(\"country-code\"),\r\n stateCode: $selectedAddress.data(\"state-code\"),\r\n postalCode: $selectedAddress.data(\"postal-code\"),\r\n city: $selectedAddress.data(\"city\")\r\n };\r\n}\r\n/**\r\n * Get address form details from Dom Element\r\n * */\r\nfunction getAddressFromForm() {\r\n return {\r\n address1: $cache.addrForm.address1.val(),\r\n address2: $cache.addrForm.address2.val(),\r\n countryCode: $cache.addrForm.countryCode.val(),\r\n stateCode: $cache.addrForm.stateCode.val(),\r\n postalCode: $cache.addrForm.postalCode.val(),\r\n city: $cache.addrForm.city.val()\r\n };\r\n}\r\n/**\r\n * @function\r\n * @description Helper method which constructs a URL for an AJAX request using the\r\n * entered address information as URL request parameters.\r\n */\r\nfunction getShippingMethodURL(url, extraParams) {\r\n var params = User.isCustomerAuthenticated ? getAddressFromTile() : getAddressFromForm();\r\n return util.appendParamsToUrl(url, $.extend(params, extraParams));\r\n}\r\n\r\n/**\r\n * @function\r\n * @description selects a shipping method for the default shipment and updates the summary section on the right hand side\r\n * @param\r\n */\r\nfunction selectShippingMethod(shippingMethodID) {\r\n // nothing entered\r\n if (!shippingMethodID) {\r\n return;\r\n }\r\n // attempt to set shipping method\r\n var url = getShippingMethodURL(Urls.selectShippingMethodsList, {\r\n shippingMethodID: shippingMethodID\r\n });\r\n ajax.getJson({\r\n url: url,\r\n callback: function(data) {\r\n updateSummary();\r\n if (!data || !data.shippingMethodID) {\r\n window.alert('Couldn\\'t select shipping method.');\r\n return false;\r\n }\r\n // display promotion in UI and update the summary section,\r\n // if some promotions were applied\r\n $('.shippingpromotions').empty();\r\n $('.spc-spping-selection-list li .shipping-name i').addClass('hide')\r\n $('.spc-spping-selection-list li[data-value=' + $('#shippingMethodSelect').val() + '] .shipping-name i').removeClass('hide');\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * @function\r\n * @description Make an AJAX request to the server to retrieve the list of applicable shipping methods\r\n * based on the merchandise in the cart and the currently entered shipping address\r\n * (the address may be only partially entered). If the list of applicable shipping methods\r\n * has changed because new address information has been entered, then issue another AJAX\r\n * request which updates the currently selected shipping method (if needed) and also updates\r\n * the UI.\r\n */\r\nfunction updateShippingMethodList() {\r\n var $shippingMethodList = $('#shipping-method-list');\r\n if (!$shippingMethodList || $shippingMethodList.length === 0) {\r\n return;\r\n }\r\n \r\n var url = getShippingMethodURL(Urls.shippingMethodsJSON);\r\n ajax.getJson({\r\n url: url,\r\n callback: function(data) {\r\n if (!data) {\r\n window.alert('Couldn\\'t get list of applicable shipping methods.');\r\n return false;\r\n }\r\n\r\n // shipping methods remain unchanged; update summary as selected method may/may not change\r\n if (shippingMethods && shippingMethods.toString() === data.toString()) {\r\n updateSummary();\r\n return true;\r\n }\r\n\r\n // We need to update the UI. The list has changed.\r\n // Cache the array of returned shipping methods.\r\n shippingMethods = data;\r\n // indicate progress\r\n //progress.show($shippingMethodList);\r\n progress.show($('.checkout-progress-container'));\r\n // load the shipping method form\r\n var smlUrl = getShippingMethodURL(Urls.spcShippingMethodsList);\r\n $shippingMethodList.load(smlUrl, function() {\r\n $shippingMethodList.fadeIn('fast');\r\n // rebind the radio buttons onclick function to a handler.\r\n $shippingMethodList.find('[name$=\"_shippingMethodID\"]').on(\"click\", function() {\r\n if (!$(this).closest('.shipping-method').hasClass('spc-shipping-default')) {\r\n selectShippingMethod($(this).val());\r\n $('.icon-chevron-thin-left.icon-chevron-right').css({\r\n 'transform': 'rotate(360deg)'\r\n });\r\n $(\".shipping-options-section\").removeClass(\"show-shipping\");\r\n }\r\n });\r\n\r\n // update the summary\r\n updateSummary();\r\n progress.hide();\r\n tooltip.init();\r\n //if nothing is selected in the shipping methods select the first one\r\n if ($shippingMethodList.find('.input-radio:checked').length === 0) {\r\n $shippingMethodList.find('.input-radio:first').prop('checked', 'checked');\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Check there is an address selected, if not, disable the continue button\r\n * */\r\nfunction checkSelectedAddress() {\r\n var $form = $('form[id$=\"_shippingAddress\"]');\r\n var $submit = $form.find('button[type=\"submit\"]');\r\n\r\n // enable the submit button if there are no shipping card\r\n // if there are, user must have at least 1 selected shipping card for the button to be enabled\r\n if ($form.find('.address-tile').length == 0 || $form.find('.address-tile.selected').length) {\r\n $submit.prop('disabled', false);\r\n } else {\r\n $submit.prop('disabled', true);\r\n }\r\n}\r\n/**\r\n * Return the the Validated address form from getAddressFromFormFunction.\r\n * */\r\nfunction validateAddrForm() {\r\n var addr = getAddressFromForm();\r\n return addr.address1 && addr.city && addr.postalCode && addr.stateCode && addr.countryCode;\r\n}\r\n/**\r\n * Applying Coupon field to Checkout flow.\r\n * */\r\nfunction initCouponCodeField() {\r\n\r\n $('.cart-coupon-code input').on('keydown', function(e) {\r\n var couponCode = $('.cart-coupon-code input').val();\r\n if (couponCode == '') {\r\n $('#add-coupon').prop('disabled', true);\r\n } else {\r\n $('#add-coupon').prop('disabled', false);\r\n }\r\n\r\n if (e.which === 13) {\r\n e.preventDefault();\r\n $('#add-coupon').trigger(\"click\");\r\n }\r\n })\r\n}\r\n/**\r\n * Below function for Shipping column submit function and we will render on\r\n * billing column section(shippingContinueToCheckoutEvent).\r\n * Below mentioned parameter(\"&dwfrm_singleshipping_shippingAddress_save=Continue\") is require to send server \r\n * because with this parameter the SFCC form submit action is achieved at server side level by AJAX call.\r\n * */\r\nfunction shippingContinueToCheckoutEvent() {\r\n $cache.primary.find('form#dwfrm_singleshipping_shippingAddress').on('submit', function(e) {\r\n e.preventDefault();\r\n $('.sp-add-address-title').trigger('click'); \r\n var $restrictedProd = $('.spc-restricted-proderr'); \r\n $restrictedProd.html('');\r\n var form = $('form[id=\"dwfrm_singleshipping_shippingAddress\"]');\r\n addressVerificationSvc.init();\r\n form.validate();\r\n updateSummary();\r\n if (!form.valid()) {\r\n util.formFieldFocusOnError(form);\r\n return false;\r\n }\r\n /***\r\n * Below parameter is require because with this parameter the SFCC form submit action is achieved.\r\n */\r\n var formData = form.serialize() + \"&dwfrm_singleshipping_shippingAddress_save=Continue\";\r\n $.post(Urls.spcSingleShipping, formData)\r\n .done(function(data) {\r\n if (data.success == false) {\r\n $restrictedProd.html(data.ShippingError);\r\n } else {\r\n $restrictedProd.html('');\r\n util.setSpcCheckoutSteps(3);\r\n util.singlePageNextCheckoutStep(3);\r\n $cache.billingcol.html(data);\r\n billing.loadBillingColData(); \r\n spccybcustom.init();\r\n scrollActiveSection(form);\r\n util.isApplePayPresent();\r\n }\r\n //calling GA event for next checkout step.\r\n \t analytics.initSPCBillingEvent(); \r\n });\r\n return false;\r\n });\r\n \r\n $cache.primary.find('#dwfrm_singleshipping_shippingAddress button[type=\"submit\"]').on('click' , function() {\r\n \tvar $submit = $(this);\r\n\t\tif($submit.closest('form').find('span.error').length > 0){\r\n\t\t\t$submit.prop('disabled', true);\r\n\t\t\tvar currentPos = $('.SPCShippingPageSec').offset().top;\r\n\t\t\trequire('./card-validation').scrollToPos(currentPos);\r\n\t\t} else {\r\n\t\t\t$submit.prop('disabled', false);\r\n\t\t}\r\n });\r\n}\r\n/**\r\n * Iterate the shipping address section and removing the default selected option\r\n * in Address tile for shipping section. Firing the trigger click event to select the default address. \r\n * */\r\nfunction iterateShippingAddressTile(){\r\n\t$(document).find('.spc-shipping div.address-list div.address-tile').each(function() {\r\n\t if ($(this).hasClass('default') || $(this).hasClass('selected') || $(this).hasClass('address-default')) {\r\n\t $(this).removeClass('selected');\r\n\t $(this).removeClass('default');\r\n\t\r\n\t $(this).trigger(\"click\");\r\n\t }\r\n\t});\r\n}\r\n\r\nfunction scrollActiveSection(currentBtn) {\r\n\tif ($(window).width()<=766){\r\n\t\tvar steps = currentBtn.closest('.checkout-progress-container').find('.step.active'),\r\n\t\t\ttopValue = steps.offset().top;\r\n\t\t$('html, body').animate({\r\n\t\t\tscrollTop: topValue\r\n\t\t}, 800);\r\n\t}\r\n}\r\n/**\r\n * Initializes the all Shipping page events.\r\n * */\r\nexports.init = function() {\r\n if ($('.spc-container .spc-shipping').length > 0) {\r\n initCache();\r\n initEvents();\r\n shippingContinueToCheckoutEvent();\r\n util.singlePageNextCheckoutStep(window.SessionAttributes.SPC_CHKOUTSTEPS);\r\n util.selectbox();\r\n addressVerificationSvc.init();\r\n\r\n if (window.User.isCustomerAuthenticated == false) {\r\n $('.checkout-shipping').find('.set-default-cb').hide();\r\n }\r\n removePOBoxCaption();\r\n validator.initForm('form[name$=\"shippingAddress_save\"]');\r\n //$(document).find('.checkoutShippingAddress').find('input[id$=\"_address1\"]').attr(\"autocomplete\", \"nope\");\r\n giftMessageBox();\r\n //updateShippingMethodList();\r\n initCouponCodeField();\r\n iterateShippingAddressTile();\r\n \r\n $(document).on('change', '.shippingMethodSelect', function() {\r\n selectShippingMethod($(this).val());\r\n });\r\n checkSelectedAddress();\r\n }\r\n};\r\n\r\nexports.updateShippingMethodList = updateShippingMethodList;\r\nexports.ShippingUpdateSummary = updateSummary;\r\nexports.scrollActiveSection = scrollActiveSection;\n},{\"../../ajax\":5,\"../../analytics\":6,\"../../modal\":28,\"../../progress\":75,\"../../qas\":76,\"../../tooltip\":86,\"../../util\":87,\"../../validator\":88,\"./billing\":61,\"./card-validation\":62,\"./spccybcustom\":67}],67:[function(require,module,exports){\n'use strict';\r\n/**\r\n * We have made this JS file for Singlepage Checkout flow only.\r\n * We made it for including the Paypal Smart Pay button on AJAX call.\r\n * */\r\nexports.init = function() {\r\n\tif ($('.spc-container').length > 0) {\t\r\n\t\t$(\"#generic-form-submit\").on('submit',function(e){\r\n\t\t\tvar validator = $(this).validate();\r\n\t\t\tif(validator.form())\r\n\t\t\t\treturn true;\r\n\t\t\telse\r\n\t\t\t\treturn false;\r\n\t\t}); \t\r\n\t\t\r\n\t // for Alipay Intermediate\r\n\t\tif($(\"body\").hasClass(\"cyb_alipayintermediate\"))\r\n\t\t{\r\n\t\t\tvar loaded = false;\r\n\t\t\tsetTimeout(function(){\r\n\t\t\t\tdocument.RedirectForm.submit();\r\n\t\t\t\tloaded = true;\r\n\t\t\t},1000);\t\r\n\t\t}\r\n\t\r\n\t// For FingerPrint Unit testing \r\n\t\tif($(\"body\").hasClass(\"cyb_testfingerprintRedirect\"))\r\n\t\t{\r\n\t\t\tvar url_loc = document.getElementById(\"URl_redirect\").value;\r\n\t\t\tsetTimeout(function(){location.href=url_loc} , 1000); \r\n\t\t}\r\n\t\t\r\n\t\t// For Payerauth during checkout \r\n\t\tif($(\"div\").hasClass(\"payerauth\"))\r\n\t\t{\t\r\n\t\t\tdocument.PAInfoForm.submit();\r\n\t\t}\t\r\n\t\t// For payerauth during Credit card \r\n\t\tif($(\"body\").hasClass(\"cyb_payerauthenticationredirect\"))\r\n\t\t{\tdocument.RedirectForm.submit();\r\n\t\t\t\r\n\t\t}\t\r\n\t\t// For payerauth during Unit testing \r\n\t\tif($(\"body\").hasClass(\"cyb_unitTest_payerauth\"))\r\n\t\t{\t\r\n\t\t\tdocument.RedirectForm.submit();\r\n\t\t\t\r\n\t\t}\t\r\n\t\t// For payer auth during Unit testing \r\n\t\tif($(\"div\").hasClass(\"cyb_unitTest_payerauthsubmit\"))\r\n\t\t{\t\r\n\t\t\tdocument.PAInfoForm.submit();\r\n\t\t\t\r\n\t\t}\t\t\r\n\t\t// For Secure Acceptance Redirect \r\n\t\tif($(\"body\").hasClass(\"cyb_sa_redirect\"))\r\n\t\t{\t\r\n\t\t\tvar url_loc = document.getElementById(\"redirect_url_sa\").value;\r\n\t\t\twindow.top.location.replace(url_loc);\r\n\t\t\t\r\n\t\t}\r\n\t\t// For Secure Acceptance Iframe \r\n\t\tif($(\"div\").hasClass(\"SecureAcceptance_IFRAME\"))\r\n\t\t{\t\r\n\t\t\tvar url_loc = document.getElementById(\"sa_iframeURL\").value;\r\n\t\t\t$(\".SecureAcceptance_IFRAME\").append('