{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack:///./cartridges/app_storefront_cln/cartridge/client/default/js/product/base.js","webpack:///./cartridges/app_storefront_cln/cartridge/client/default/js/product/tile.js","webpack:///./cartridges/app_storefront_t2pay/cartridge/client/default/js/cart/cart.js"],"names":[],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;AClFa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AClCa;AACb,kBAAkB,mBAAO,CAAC,6GAAqB;;AAE/C;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc,qBAAqB;AACnC;;AAEA;AACA;AACA;AACA,WAAW,wBAAwB;AACnC,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA,WAAW,kBAAkB;AAC7B,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA,aAAa,sDAAsD;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2CAA2C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA,YAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;;AAEA,YAAY;AACZ;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;;;;;;;;;;;;AC/0Ba;AACb,kBAAkB,mBAAO,CAAC,+GAAuB;;AAEjD;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,cAAc,qBAAqB;AACnC;;AAEA;AACA;AACA;AACA,WAAW,wBAAwB;AACnC,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA,WAAW,kBAAkB;AAC7B,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA,aAAa,sDAAsD;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2CAA2C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA,YAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;;AAEA,YAAY;AACZ;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;;;;;;;;;;;;ACr1Ba;AACb,WAAW,mBAAO,CAAC,2FAAQ;;AAE3B;AACA;AACA,E;;;;;;;;;;;;ACLa;;AAEb,WAAW,mBAAO,CAAC,uGAAmB;AACtC,kBAAkB,mBAAO,CAAC,+GAAuB;AACjD,WAAW,mBAAO,CAAC,0GAAuB;;AAE1C;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iG;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qBAAqB;AACrB,wF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iG;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qBAAqB;AACrB,wF;AACA;AACA;AACA;;AAEA,aAAa;AACb;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;;AAGA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB,aAAa,YAAY;AACzB;AACA,iCAAiC;AACjC,qCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA,YAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;;AAEA,YAAY;AACZ;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA,uBAAuB,4BAA4B;AACnD;AACA,uB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,+C;AACA,SAAS;AACT,8D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,uCAAuC,kCAAkC;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0D;AACA,a;AACA;;AAEA,wD;AACA;AACA;AACA,S;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS;;AAET,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8D;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL,qE;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,wCAAwC,kCAAkC,EAAE;;AAE5E;AACA,wCAAwC,uCAAuC,EAAE;;AAEjF;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;;AAGL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,WAAW;AACX;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uD;AACA,a;AACA,0D;AACA,SAAS;AACT;AACA;AACA,kC;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,+BAA+B,uBAAuB;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK;;AAEL;AACA;AACA;AACA,mE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA,8B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,E;AACb,QAAQ;AACR,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,eAAe;AACf,sG;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,eAAe;AACf,sG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mBAAmB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,iB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,mBAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,mB;AACA;AACA;;AAEA,SAAS;AACT;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,KAAK;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8C;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,uFAAuF,mEAAmE;AAC1J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,iD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAmB;AAClD;AACA;AACA;AACA,qB;AACA;AACA,+BAA+B,mBAAmB;AAClD;AACA;AACA;AACA,qB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,8G;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,+BAA+B,qBAAqB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,a;AACA;AACA;AACA;AACA;AACA,+BAA+B,yBAAyB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,+BAA+B,qBAAqB;AACpD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC,yBAAyB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uD;AACA;AACA;AACA,+F;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD,qBAAqB;AACxE;AACA,uDAAuD,6BAA6B;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD,qBAAqB;AACxE;AACA,uDAAuD,0BAA0B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mDAAmD,yBAAyB;AAC5E;AACA,uDAAuD,wBAAwB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2C;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;AAEN,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;;;AAIL;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,0DAA0D,KAAK;AAC/D,kCAAkC,oCAAoC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6FAA6F,oBAAoB,aAAa;AAC9H;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E","file":"default/js/cart/cart.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./cartridges/app_storefront_t2pay/cartridge/client/default/js/cart/cart.js\");\n","'use strict';\n\nmodule.exports = {\n setTabNextFocus: function (focusParams) {\n var KEYCODE_TAB = 9;\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n if (!isTabPressed) {\n return;\n }\n\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n if ($('.product-quickview.product-set').length > 0) {\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n lastFocusableEl = linkElements[linkElements.length - 1];\n }\n }\n\n if (focusParams.event.shiftKey) /* shift + tab */ {\n if ($(':focus').is(firstFocusableEl)) {\n lastFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n } else /* tab */ {\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n firstFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n }\n }\n};\n","'use strict';\nvar focusHelper = require('../components/focus');\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n var quantitySelected;\n if ($el && $('.set-items').length) {\n quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n } else if ($el && $('.product-bundle').length) {\n var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n if (quantitySelectedModal.val() === undefined) {\n quantitySelected = quantitySelectedPDP;\n } else {\n quantitySelected = quantitySelectedModal;\n }\n } else {\n quantitySelected = $('.quantity-select');\n }\n return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n attrValue.value + '\"]');\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n if (attrValue.url) {\n $swatchButton.attr('data-url', attrValue.url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url)\n .removeAttr('disabled');\n\n if (!attrValue.selectable) {\n $attrValue.attr('disabled', true);\n }\n });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n processNonSwatchValues(attr, $productContainer);\n }\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = '
  • ' + response.resources.info_selectforstock + '
  • ';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '
  • ' + message + '
  • ';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '
    ' + attribute.label + ': '\n + attribute.value + '
    ';\n });\n }\n });\n\n return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n var carousel = $productContainer.find('.carousel');\n $(carousel).carousel('dispose');\n var carouselId = $(carousel).attr('id');\n $(carousel).empty().append('
      ' + $(carousel).data('prev') + '' + $(carousel).data('next') + '');\n for (var i = 0; i < imgs.length; i++) {\n $('
      \"'
      ').appendTo($(carousel).find('.carousel-inner'));\n $('
    1. ').appendTo($(carousel).find('.carousel-indicators'));\n }\n $($(carousel).find('.carousel-item')).first().addClass('active');\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n var isChoiceOfBonusProducts =\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n // Update primary images\n var primaryImageUrls = response.product.images.large;\n createCarousel(primaryImageUrls, $productContainer);\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update promotions\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n if ($productContainer.parent('.bonus-product-item').length <= 0) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '';\n }).join('');\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect',\n { url: selectedValueUrl, container: $productContainer });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.optionsHtml, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer });\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('
      ').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body').spinner().start();\n\n if ($('#chooseBonusProductModal').length !== 0) {\n $('#chooseBonusProductModal').remove();\n }\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = ''\n + '
      '\n + ''\n + '
      '\n + ''\n + '
      '\n + '
      '\n + ' ' + data.labels.selectprods + ''\n + ' '\n + '
      '\n + '
      '\n + '
      '\n + '
      '\n + '
      '\n + '
      ';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $('#chooseBonusProductModal .modal-body').empty();\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append(\n '
      '\n );\n }\n\n $('.add-to-cart-messages').append(\n '
      '\n + response.message\n + '
      '\n );\n\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: 'GET',\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n\n focusChooseBonusProductModal: function () {\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n $('#chooseBonusProductModal .close').focus();\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#chooseBonusProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.add-bonus-products'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n colorAttribute: function () {\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n e.preventDefault();\n\n if ($(this).attr('disabled')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n\n attributeSelect($(this).attr('data-url'), $productContainer);\n });\n },\n\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').text(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this))\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n miniCartReportingUrl(data.reportingURL);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $(this).data('pid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n totalQty += submittedQty;\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml = ''\n + '
      '\n + '
      '\n + $choiceOfBonusProduct.find('.product-name').html()\n + '
      '\n + '
      '\n + '
      '\n ;\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n },\n removeBonusProduct: function () {\n $(document).on('click', '.selected-pid', function () {\n $(this).remove();\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n count += parseInt($(this).data('qty'), 10);\n });\n }\n\n $('.pre-cart-products').html(count);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n });\n },\n enableBonusProductSelection: function () {\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n var pid = response.product.id;\n $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n });\n },\n showMoreBonusProducts: function () {\n $(document).on('click', '.show-more-bonus-products', function () {\n var url = $(this).data('url');\n $('.modal-content').spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('.modal-body').append(parsedHtml.body);\n $('.show-more-bonus-products:first').remove();\n $('.modal-content').spinner().stop();\n },\n error: function () {\n $('.modal-content').spinner().stop();\n }\n });\n });\n },\n addBonusProductsToCart: function () {\n $(document).on('click', '.add-bonus-products', function () {\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n var queryString = '?pids=';\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n var pidsObject = {\n bonusProducts: []\n };\n\n $.each($readyToOrderBonusProducts, function () {\n var qtyOption =\n parseInt($(this)\n .data('qty'), 10);\n\n var option = null;\n if (qtyOption > 0) {\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n option = {};\n option.optionId = $(this).data('optionid');\n option.productId = $(this).data('pid');\n option.selectedValueId = $(this).data('option-selected-value');\n }\n pidsObject.bonusProducts.push({\n pid: $(this).data('pid'),\n qty: qtyOption,\n options: [option]\n });\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n }\n });\n queryString += JSON.stringify(pidsObject);\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n success: function (data) {\n $.spinner().stop();\n if (data.error) {\n $('#chooseBonusProductModal').modal('hide');\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
      ');\n }\n $('.add-to-cart-messages').append(\n '
      '\n + data.errorMessage + '
      '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 3000);\n } else {\n $('.configure-bonus-product-attributes').html(data);\n $('.bonus-products-step2').removeClass('hidden-xl-down');\n $('#chooseBonusProductModal').modal('hide');\n\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
      ');\n }\n $('.minicart-quantity').html(data.totalQty);\n $('.add-to-cart-messages').append(\n '
      '\n + data.msgSuccess + '
      '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n if ($('.cart-page').length) {\n location.reload();\n }\n }, 1500);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n miniCartReportingUrl: miniCartReportingUrl\n};\n","'use strict';\nvar focusHelper = require('base/components/focus');\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $($el).data('pid');\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n var quantitySelected;\n if ($el && $('.set-items').length) {\n quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n } else if ($el && $('.product-bundle').length) {\n var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n if (quantitySelectedModal.val() === undefined) {\n quantitySelected = quantitySelectedPDP;\n } else {\n quantitySelected = quantitySelectedModal;\n }\n } else {\n quantitySelected = $('.quantity-select');\n }\n return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n attrValue.value + '\"]');\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n if (attrValue.url) {\n $swatchButton.attr('data-url', attrValue.url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url)\n .removeAttr('disabled');\n\n if (!attrValue.selectable) {\n $attrValue.attr('disabled', true);\n }\n });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n processNonSwatchValues(attr, $productContainer);\n }\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = '
    2. ' + response.resources.info_selectforstock + '
    3. ';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '
    4. ' + message + '
    5. ';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '
      ' + attribute.label + ': '\n + attribute.value + '
      ';\n });\n }\n });\n\n return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n var carousel = $productContainer.find('.carousel');\n // $(carousel).carousel('dispose');\n var carouselId = $(carousel).attr('id');\n $(carousel).empty().append('
        ' + $(carousel).data('prev') + '' + $(carousel).data('next') + '');\n for (var i = 0; i < imgs.length; i++) {\n $('
        \"'
        ').appendTo($(carousel).find('.carousel-inner'));\n $('
      1. ').appendTo($(carousel).find('.carousel-indicators'));\n }\n $($(carousel).find('.carousel-item')).first().addClass('active');\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n var isChoiceOfBonusProducts =\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n // Update primary images\n var primaryImageUrls = response.product.images.large;\n // createCarousel(primaryImageUrls, $productContainer);\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update promotions\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n if ($productContainer.parent('.bonus-product-item').length <= 0) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '';\n }).join('');\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect',\n { url: selectedValueUrl, container: $productContainer });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.optionsHtml, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer });\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl($el) {\n return $el.parent().find('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('
        ').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body').spinner().start();\n\n if ($('#chooseBonusProductModal').length !== 0) {\n $('#chooseBonusProductModal').remove();\n }\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = ''\n + '
        '\n + ''\n + '
        '\n + ''\n + '
        '\n + '
        '\n + ' ' + data.labels.selectprods + ''\n + ' '\n + '
        '\n + '
        '\n + '
        '\n + '
        '\n + '
        '\n + '
        ';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $('#chooseBonusProductModal .modal-body').empty();\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append(\n '
        '\n );\n }\n\n $('.add-to-cart-messages').append(\n '
        '\n + response.message\n + '
        '\n );\n\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: 'GET',\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n\n focusChooseBonusProductModal: function () {\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n $('#chooseBonusProductModal .close').focus();\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#chooseBonusProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.add-bonus-products'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n colorAttribute: function () {\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n e.preventDefault();\n\n if ($(this).attr('disabled')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n\n attributeSelect($(this).attr('data-url'), $productContainer);\n });\n },\n\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).off('click').on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').text(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl($(this));\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this))\n };\n \n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n if(form.quantity > 100 || form.quantity < 1){\n $(\"#error-max-quantities\").modal('show');\n $.spinner().stop();\n }\n else{\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n handlePostCartAdd(data);\n $(\".succesful_msg .tick_msg\").html(data.message);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n miniCartReportingUrl(data.reportingURL);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $(this).data('pid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n totalQty += submittedQty;\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml = ''\n + '
        '\n + '
        '\n + $choiceOfBonusProduct.find('.product-name').html()\n + '
        '\n + '
        '\n + '
        '\n ;\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n },\n removeBonusProduct: function () {\n $(document).on('click', '.selected-pid', function () {\n $(this).remove();\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n count += parseInt($(this).data('qty'), 10);\n });\n }\n\n $('.pre-cart-products').html(count);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n });\n },\n enableBonusProductSelection: function () {\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n var pid = response.product.id;\n $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n });\n },\n showMoreBonusProducts: function () {\n $(document).on('click', '.show-more-bonus-products', function () {\n var url = $(this).data('url');\n $('.modal-content').spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('.modal-body').append(parsedHtml.body);\n $('.show-more-bonus-products:first').remove();\n $('.modal-content').spinner().stop();\n },\n error: function () {\n $('.modal-content').spinner().stop();\n }\n });\n });\n },\n addBonusProductsToCart: function () {\n $(document).on('click', '.add-bonus-products', function () {\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n var queryString = '?pids=';\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n var pidsObject = {\n bonusProducts: []\n };\n\n $.each($readyToOrderBonusProducts, function () {\n var qtyOption =\n parseInt($(this)\n .data('qty'), 10);\n\n var option = null;\n if (qtyOption > 0) {\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n option = {};\n option.optionId = $(this).data('optionid');\n option.productId = $(this).data('pid');\n option.selectedValueId = $(this).data('option-selected-value');\n }\n pidsObject.bonusProducts.push({\n pid: $(this).data('pid'),\n qty: qtyOption,\n options: [option]\n });\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n }\n });\n queryString += JSON.stringify(pidsObject);\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n success: function (data) {\n $.spinner().stop();\n if (data.error) {\n $('#chooseBonusProductModal').modal('hide');\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
        ');\n }\n $('.add-to-cart-messages').append(\n '
        '\n + data.errorMessage + '
        '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 3000);\n } else {\n $('.configure-bonus-product-attributes').html(data);\n $('.bonus-products-step2').removeClass('hidden-xl-down');\n $('#chooseBonusProductModal').modal('hide');\n\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
        ');\n }\n $('.minicart-quantity').html(data.totalQty);\n $('.add-to-cart-messages').append(\n '
        '\n + data.msgSuccess + '
        '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n if ($('.cart-page').length) {\n location.reload();\n }\n }, 1500);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n miniCartReportingUrl: miniCartReportingUrl\n};\n","'use strict';\nvar base = require('./base');\n\nmodule.exports = {\n addToCart: base.addToCart\n};","'use strict';\n\nvar base = require('base/product/base');\nvar focusHelper = require('base/components/focus');\nvar tile = require('base_cln/product/tile');\n\n/**\n * appends params to a url\n * @param {string} url - Original url\n * @param {Object} params - Parameters to append\n * @returns {string} result url with appended parameters\n */\nfunction appendToUrl(url, params) {\n var newUrl = url;\n newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(params).map(function (key) {\n return key + '=' + encodeURIComponent(params[key]);\n }).join('&');\n\n return newUrl;\n}\n\n/**\n * Checks whether the basket is valid. if invalid displays error message and disables\n * checkout button\n * @param {Object} data - AJAX response from the server\n */\nfunction validateBasket(data) {\n if (data.valid.error) {\n if (data.valid.message) {\n var errorHtml = '
        ' +\n '' + data.valid.message + '
        ';\n\n $('.cart-error').append(errorHtml);\n } else {\n $('.cart').empty().append('
        ' +\n '
        ' +\n '

        ' + data.resources.emptyCartMsg + '

        ' +\n '
        ' +\n '
        '\n );\n $('.number-of-items').empty().append(data.resources.numberOfItems);\n $('.minicart-quantity').empty().append(data.numItems);\n if (data.numItems == 0 || data.numItems == 1) {\n $('.minicart-link').attr({\n 'aria-label': data.resources.minicartCountOfItem,\n title: data.resources.minicartCountOfItem\n });\n } else {\n $('.minicart-link').attr({\n 'aria-label': data.resources.minicartCountOfItems,\n title: data.resources.minicartCountOfItems\n });\n }\n $('.minicart .popover').empty();\n $('.minicart .popover').removeClass('show');\n }\n\n $('.checkout-btn').addClass('disabled');\n } else {\n $('.checkout-btn').removeClass('disabled');\n }\n}\n\n/**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} data - AJAX response from the server\n */\nfunction updateCartTotals(data) {\n $('.number-of-items').empty().append(data.resources.numberOfItems);\n $('.summary-subtotal-items').empty().append(data.resources.numberOfItems);\n $('.shipping-cost').empty().append(data.totals.totalShippingCost);\n $('.tax-total').empty().append(data.totals.totalTax);\n $('.clcCount').empty().append(data.totals.clcCount);\n $('.totalNetPrice').empty().append(data.totals.totalNetPrice);\n $('.sub-total').empty().append(data.totals.subTotal);\n $('.minicart-quantity').empty().append(data.numItems);\n if (data.numItems == 0 || data.numItems == 1) {\n $('.minicart-link').attr({\n 'aria-label': data.resources.minicartCountOfItem,\n title: data.resources.minicartCountOfItem\n });\n } else {\n $('.minicart-link').attr({\n 'aria-label': data.resources.minicartCountOfItems,\n title: data.resources.minicartCountOfItems\n });\n }\n\n if (data.totals.shippingLevelDiscountTotal.value > 0) {\n $('.shipping-discount').removeClass('hide-shipping-discount');\n $('.shipping-discount-total').empty().append('- ' +\n data.totals.shippingLevelDiscountTotal.formatted);\n } else {\n $('.shipping-discount').addClass('hide-shipping-discount');\n }\n $('.promotion-information').addClass('hide-order-discount');\n // For Cart Level Discount\n if (data.totals.discounts != null) {\n let cartDiscount = 0;\n if (data.totals.discounts[0] != null && data.totals.discounts[0].lineItemText != null){\n $('.promotion-name').text(data.totals.discounts[0].lineItemText);\n $('.applied-promotion-discount').text(data.totals.discounts[0].price);\n $('.promotion-information').removeClass('hide-order-discount');\n } else if (data.totals.discounts[1] != null && data.totals.discounts[1].lineItemText != null) {\n $('.promotion-name').text(data.totals.discounts[1].lineItemText);\n $('.applied-promotion-discount').text(data.totals.discounts[1].price);\n $('.promotion-information').removeClass('hide-order-discount');\n cartDiscount = Number(data.totals.discounts[1].price.substring(2));\n } else {\n $('.promotion-information').addClass('hide-order-discount');\n cartDiscount = -1;\n }\n if (data.totals.discounts[0] != null && data.totals.discounts[0].type === 'coupon' && data.totals.discounts[0].applied === true\n && ((cartDiscount == -1 && data.totals.orderLevelDiscountTotal.value > 0) || (cartDiscount > 0 && data.totals.orderLevelDiscountTotal.value > cartDiscount))\n ) {\n \n $('.order-discount').removeClass('hide-order-discount');\n $('.order-discount-total').empty()\n .append('-' + data.totals.orderLevelDiscountTotal.formatted);\n } else {\n $('.order-discount').addClass('hide-order-discount');\n }\n \n } else {\n $('.order-discount').addClass('hide-order-discount');\n $('.promotion-information').addClass('hide-order-discount');\n }\n\n data.items.forEach(function (item) {\n if (data.totals.orderLevelDiscountTotal.value > 0) {\n $('.coupons-and-promos').empty().append(data.totals.discountsHtml);\n }\n if (item.renderedPromotions) {\n $('.item-' + item.UUID).empty().append(item.renderedPromotions);\n } else {\n $('.item-' + item.UUID).empty();\n }\n if (item.renderedLearnersForm.prdType === 'cml') {\n if (item.quantity == 1) {\n $('.purchase-license-' + item.UUID).addClass('d-none');\n } else if (item.quantity > 1 && $('.purchase-license-' + item.UUID).hasClass('d-none')) {\n $('.purchase-license-' + item.UUID).removeClass('d-none');\n }\n }\n $('.uuid-' + item.UUID + ' .unit-price').empty().append(item.renderedPrice);\n $('.line-item-price-' + item.UUID + ' .unit-price').empty().append(item.renderedPrice);\n $('.item-total-' + item.UUID).empty().append(item.priceTotal.renderedPrice);\n if ($('.instance-type').val() !== 'DIGITAL' && $('.instance-type').val() !== 'INST_TYP_PRIV') {\n $('.line-item-learnersform-' + item.UUID).empty().append(item.renderedLearnersForm.renderedLearnersForm);\n }\n });\n}\n\n/**\n * Updates the availability of a product line item\n * @param {Object} data - AJAX response from the server\n * @param {string} uuid - The uuid of the product line item to update\n */\nfunction updateIlt(data, $lineItem) {\n\n data.items.forEach(function (item) {\n var $lineItemId=$lineItem ;\n if (item.renderedLearnersForm.prdType === 'Ilt' && (item.UUID === $lineItem) ) {\n var $itemId=\"uuid-\" + $lineItem ;\n var $currentLineItem = $('.'+$itemId);\n var availabilityCount = $currentLineItem.find($('.avail-count')).val();\n var waitlistCount = $currentLineItem.find($('.wait-count')).val();\n var sumOfAvailWait = $currentLineItem.find($('.availwait-count')).val();\n if (item.quantity <= availabilityCount) {\n $currentLineItem.find($('.avilable-waitlist-msg-' + item.UUID)).empty();\n $currentLineItem.find($('.avilable-msg-' + item.UUID)).addClass('avail-count').removeClass('waitlist-count');\n $currentLineItem.find($('.ilt-waitlist')).hide();\n if( $currentLineItem.find('.recipient_link span.avail-count').length >=1 ) {\n $currentLineItem.find('.recipient_link span.avail-count').remove();\n } else {\n $currentLineItem.find('.recipient_link span.avail-count').empty();\n }\n\n if( $currentLineItem.find('.recipient_link span.waitlist-count').length >=1 ) {\n $currentLineItem.find('.recipient_link span.avail-count').remove();\n } else {\n $currentLineItem.find('.recipient_link span.avail-count').empty();\n }\n $currentLineItem.find('.recipient_link span.waitlist-count').empty();\n $currentLineItem.find($('.info-icon.availCount')).hide();\n $currentLineItem.find($('.eol-msg')).hide();\n if(item.quantity == 1) {\n if($currentLineItem.find('.recipient_link span.info-edit').length <= 1) {\n $currentLineItem.find('.recipient_link').find('.info-edit').show();\n } else {\n $currentLineItem.find('.recipient_link').find('.info-edit:first').hide(); \n }\n } else {\n if($currentLineItem.find('.recipient_link span.info-save').length <= 1) {\n $currentLineItem.find('.recipient_link').find('.info-save').show();\n } else {\n $currentLineItem.find('.recipient_link').find('.info-save').show(); \n $currentLineItem.find('.recipient_link').find('.info-save:first').hide();\n }\n }\n if( $currentLineItem.find('.recipient_link .down-arrow').length == 2 ) {\n $currentLineItem.find('.recipient_link .down-arrow').removeClass('d-none');\n $currentLineItem.find('.recipient_link .down-arrow').first().addClass('d-none')\n } else {\n $currentLineItem.find('.recipient_link .down-arrow').removeClass('d-none').attr('style','');\n }\n $(\".info-icon.waitlistCount.waitlistCount\").addClass('d-none');\n $currentLineItem.find('.row.description').removeClass('disabled');\n $currentLineItem.find('.value.content').removeClass('d-none');\n \n } else if (item.quantity > availabilityCount && waitlistCount > 0 && item.quantity <= sumOfAvailWait) {\n if( $currentLineItem.find('.recipient_link span.avail-count').length <= 1 ) {\n $currentLineItem.find('.recipient_link span.avail-count').remove();\n $currentLineItem.find('.recipient_link').prepend(''+data.resources.waitlistAvailable +'');\n }\n if ($currentLineItem.find('.recipient_link .info-icon.availCount').length > 1 ) {\n $currentLineItem.find('.recipient_link .info-icon.availCount:first').remove();\n }\n $currentLineItem.find('.recipient_link').find('.info-icon.availCount').removeClass('d-none');\n $currentLineItem.find('.recipient_link').find('.waitlist-count').addClass('d-none');\n $currentLineItem.find('.recipient_link').find('.info-icon.waitlistCount').addClass('d-none');\n $currentLineItem.find('.info-icon.availCount').show();\n $currentLineItem.find($('.avilable-msg-' + item.UUID)).addClass('waitlist-count').removeClass('avail-count');\n $currentLineItem.find($('.ilt-waitlist')).show();\n $currentLineItem.find($('.eol-msg')).show();\n $currentLineItem.find('.value.content').removeClass('d-none');\n $currentLineItem.find('.row.description').removeClass('disabled');\n if( $currentLineItem.find('.recipient_link .down-arrow').length == 2 ) {\n $currentLineItem.find('.recipient_link .down-arrow').removeClass('d-none');\n $currentLineItem.find('.recipient_link .down-arrow').first().addClass('d-none')\n } else {\n $currentLineItem.find('.recipient_link .down-arrow').removeClass('d-none').attr('style','');\n }\n if(item.quantity == 1) {\n if($currentLineItem.find('.recipient_link span.info-edit').length <= 1) {\n $currentLineItem.find('.recipient_link').find('.info-edit').show();\n } else {\n $currentLineItem.find('.recipient_link').find('.info-edit:first').hide(); \n }\n } else {\n if($currentLineItem.find('.recipient_link span.info-save').length <= 1) {\n $currentLineItem.find('.recipient_link').find('.info-save').show();\n } else {\n $currentLineItem.find('.recipient_link').find('.info-save').show(); \n $currentLineItem.find('.recipient_link').find('.info-save:first').hide();\n }\n }\n \n } else if (item.quantity > sumOfAvailWait || waitlistCount == 0) {\n if( $currentLineItem.find('.recipient_link span.avail-count').length <= 1 ) {\n $currentLineItem.find('.recipient_link span.avail-count').remove();\n if( $currentLineItem.find('.recipient_link span.waitlist-count').length < 1 ){\n $currentLineItem.find('.recipient_link').prepend(''+data.resources.waitlistUnavailable +'');\n } else {\n $currentLineItem.find('.recipient_link span.waitlist-count').html(data.resources.waitlistUnavailable).removeClass('d-none');\n }\n }\n if ($currentLineItem.find('.recipient_link .info-icon.waitlistCount').length > 1 ) {\n $currentLineItem.find('.recipient_link .info-icon.waitlistCount:first').remove();\n }\n $currentLineItem.find('.recipient_link').find('.info-icon.waitlistCount').removeClass('d-none');\n $currentLineItem.find('.recipient_link').find('.info-save').hide();\n $currentLineItem.find('.recipient_link').find('i').addClass('d-none');\n $currentLineItem.find('.info-icon.availCount').hide();\n $currentLineItem.find('.value.content').addClass('d-none');\n $currentLineItem.find($('.avilable-msg-' + item.UUID)).addClass('waitlist-count').removeClass('avail-count');\n $currentLineItem.find('.row.description').addClass('disabled');\n }\n }\n });\n}\n\n/**\n * Updates the availability of a product line item\n * @param {Object} data - AJAX response from the server\n * @param {string} uuid - The uuid of the product line item to update\n */\n function updateQtyChange(data, $lineItem) {\n data.items.forEach(function (item) {\n if (item.UUID === $lineItem) {\n var $itemId=\"uuid-\" + $lineItem ;\n var $currentLineItem = $('.'+$itemId);\n var availabilityCount = parseInt(($('input.avail-count')).val());\n if (item.quantity > availabilityCount) {\n $('.no-avialale-seats').removeClass('d-none');\n $('.avail-count span').addClass('maindatory');\n $('.learnerValidation').addClass('d-none');\n $('.line-item-course-details').addClass('d-none');\n } else {\n $('.no-avialale-seats').addClass('d-none');\n $('.avail-count span').removeClass('maindatory');\n $('.learnerValidation').removeClass('d-none');\n $('.line-item-course-details').removeClass('d-none');\n }\n }\n });\n}\n\n\n/**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} message - Error message to display\n */\nfunction createErrorNotification(message) {\n var errorHtml = '
        ' +\n '' + message + '
        ';\n $('.cart-error').html(errorHtml);\n \n}\n\n/**\n * re-renders the approaching discount messages\n * @param {Object} approachingDiscounts - updated approaching discounts for the cart\n */\nfunction updateApproachingDiscounts(approachingDiscounts) {\n var html = '';\n $('.approaching-discounts').empty();\n if (approachingDiscounts.length > 0) {\n approachingDiscounts.forEach(function (item) {\n html += '
        '\n + item.discountMsg + '
        ';\n });\n }\n $('.approaching-discounts').append(html);\n}\n\n/**\n * Updates the availability of a product line item\n * @param {Object} data - AJAX response from the server\n * @param {string} uuid - The uuid of the product line item to update\n */\nfunction updateAvailability(data, uuid) {\n var lineItem;\n var messages = '';\n\n for (var i = 0; i < data.items.length; i++) {\n if (data.items[i].UUID === uuid) {\n lineItem = data.items[i];\n break;\n }\n }\n\n if (lineItem != null) {\n $('.availability-' + lineItem.UUID).empty();\n\n if (lineItem.availability) {\n if (lineItem.availability.messages) {\n lineItem.availability.messages.forEach(function (message) {\n messages += '

        ' + message + '

        ';\n });\n }\n\n if (lineItem.availability.inStockDate) {\n messages += '

        '\n + lineItem.availability.inStockDate\n + '

        ';\n }\n }\n\n $('.availability-' + lineItem.UUID).html(messages);\n }\n}\n\n/**\n * Finds an element in the array that matches search parameter\n * @param {array} array - array of items to search\n * @param {function} match - function that takes an element and returns a boolean indicating if the match is made\n * @returns {Object|null} - returns an element of the array that matched the query.\n */\nfunction findItem(array, match) { // eslint-disable-line no-unused-vars\n for (var i = 0, l = array.length; i < l; i++) {\n if (match.call(this, array[i])) {\n return array[i];\n }\n }\n return null;\n}\n\n/**\n * Updates details of a product line item\n * @param {Object} data - AJAX response from the server\n * @param {string} uuid - The uuid of the product line item to update\n */\nfunction updateProductDetails(data, uuid) {\n $('.card.product-info.uuid-' + uuid).replaceWith(data.renderedTemplate);\n}\n\n/**\n * Generates the modal window on the first call.\n *\n */\nfunction getModalHtmlElement() {\n if ($('#editProductModal').length !== 0) {\n $('#editProductModal').remove();\n }\n var htmlString = ''\n + '
        '\n + ''\n + '
        '\n + ''\n + '
        '\n + '
        '\n + ' '\n + '
        '\n + '
        '\n + '
        '\n + '
        '\n + '
        '\n + '
        ';\n $('body').append(htmlString);\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('
        ').append($.parseHTML(html));\n\n var body = $html.find('.product-quickview');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * replaces the content in the modal window for product variation to be edited.\n * @param {string} editProductUrl - url to be used to retrieve a new product model\n */\nfunction fillModalElement(editProductUrl) {\n $('.modal-body').spinner().start();\n $.ajax({\n url: editProductUrl,\n method: 'GET',\n dataType: 'json',\n success: function (data) {\n var parsedHtml = parseHtml(data.renderedTemplate);\n\n $('#editProductModal .modal-body').empty();\n $('#editProductModal .modal-body').html(parsedHtml.body);\n $('#editProductModal .modal-footer').html(parsedHtml.footer);\n $('#editProductModal .modal-header .close .sr-only').text(data.closeButtonText);\n $('#editProductModal .enter-message').text(data.enterDialogMessage);\n $('#editProductModal').modal('show');\n $('body').trigger('editproductmodal:ready');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * replace content of modal\n * @param {string} actionUrl - url to be used to remove product\n * @param {string} productID - pid\n * @param {string} productName - product name\n * @param {string} uuid - uuid\n */\nfunction confirmDelete(actionUrl, productID, productName, uuid) {\n var $deleteConfirmBtn = $('.cart-delete-confirmation-btn');\n var $productToRemoveSpan = $('.product-to-remove');\n\n $deleteConfirmBtn.data('pid', productID);\n $deleteConfirmBtn.data('action', actionUrl);\n $deleteConfirmBtn.data('uuid', uuid);\n\n $productToRemoveSpan.empty().append(productName);\n}\n\n/**\n * @param {string} eolUrl - url to check the availablility of eol products in the cart\n*/\nfunction getEOLMessage(eolUrl, redirectUrl) {\n var url = eolUrl\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n if (data.countEOLProduct > 0) {\n if (data.countEOLProduct == 1) {\n $('.eolwrapper .modal-title').text(data.popupHeading);\n } else {\n $('.eolwrapper .modal-title').text(\"\");\n }\n $('.eolwrapper .modal-body').text(data.popupBody);\n \n $('.eolwrapper').modal({\n show: true,\n backdrop: 'static',\n keyboard: false\n });\n $('body').css('padding-right','0px');\n $('body').removeClass('modal-open');\n } else {\n window.location.href = redirectUrl;\n }\n },\n error: function (err) {\n window.location.href = redirectUrl;\n }\n });\n}\n\n/**\n * @param {string} blockUrl - url to trigger the Seat Block API\n*/\nfunction callSeatBlockAPI (blockUrl, seatBlockInput) {\n var sum = 0;\n var learnerResArray = [];\n var errorResArray = [];\n var result = {};\n var seatBlockSuccess = true;\n var seatBlockInputArray = JSON.parse(seatBlockInput);\n for (var i=0; i < seatBlockInputArray.length; i++) {\n var seatBlockInput = seatBlockInputArray[i];\n var pid = seatBlockInput.pid;\n var individualArray = JSON.parse(seatBlockInput.learnerObj);\n sum = sum + individualArray.length;\n for (var j = 0; j < individualArray.length; j++) {\n var learnerDataObj = individualArray[j]\n var req = { \n pid : pid,\n learnerObj : JSON.stringify(learnerDataObj)\n };\n $.ajax({\n url: blockUrl,\n type: 'post',\n async: false,\n dataType: 'json',\n data : req,\n success: function (data) {\n if (!data.success) {\n errorResArray.push(data.errorMsg);\n } else {\n learnerResArray.push(data.userdetail);\n //window.location.href = redirectUrl;\n } \n },\n error: function (err) {\n result.success = false;\n result.errorMsg = err.responseJSON.message;\n return;\n }\n });\n /* if (sum != learnerResArray.length) {\n seatBlockSuccess = false;\n break;\n }*/\n }\n if (sum != learnerResArray.length) {\n seatBlockSuccess = false;\n break;\n }\n }\n\n if (seatBlockSuccess) {\n result.success = true;\n result.resArray = learnerResArray;\n } else {\n result.success = false;\n if(errorResArray.length > 0){\n result.errorMsg = errorResArray[0]; \n }else{\n result.errorMsg = 'Seat Block Validation Failed!'; \n }\n }\n return result;\n}\n\nmodule.exports = function () {\n $('body').on('click', '.remove-product', function (e) {\n e.preventDefault();\n\n var actionUrl = $(this).data('action');\n var productID = $(this).data('pid');\n var productName = $(this).data('name');\n var uuid = $(this).data('uuid');\n confirmDelete(actionUrl, productID, productName, uuid);\n });\n\n $('body').on('afterRemoveFromCart', function (e, data) {\n e.preventDefault();\n confirmDelete(data.actionUrl, data.productID, data.productName, data.uuid);\n });\n\n $('.optional-promo').click(function (e) {\n e.preventDefault();\n $('.promo-code-form').toggle();\n });\n\n $('body').on('click', '.cart-delete-confirmation-btn', function (e) {\n e.preventDefault();\n\n var productID = $(this).data('pid');\n var url = $(this).data('action');\n var uuid = $(this).data('uuid');\n var urlParams = {\n pid: productID,\n uuid: uuid\n };\n\n url = appendToUrl(url, urlParams);\n\n $('body > .modal-backdrop').remove();\n\n $.spinner().start();\n\n $('body').trigger('cart:beforeUpdate');\n var formData = $('input[name=learnerEmail]');\n var formDataCCSI = $('input[name=learnerCCSI]');\n\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n if (data.basket.items.length === 0) {\n location.reload();\n } else {\n if (data.toBeDeletedUUIDs && data.toBeDeletedUUIDs.length > 0) {\n for (var i = 0; i < data.toBeDeletedUUIDs.length; i++) {\n $('.uuid-' + data.toBeDeletedUUIDs[i]).remove();\n }\n }\n $('.uuid-' + uuid).remove();\n if (!data.basket.hasBonusProduct) {\n $('.bonus-product').remove();\n }\n $('.coupons-and-promos').empty().append(data.basket.totals.discountsHtml);\n updateCartTotals(data.basket);\n updateApproachingDiscounts(data.basket.approachingDiscounts);\n $('body').trigger('setShippingMethodSelection', data.basket);\n validateBasket(data.basket);\n }\n\n $('body').trigger('cart:update', data);\n setFieldsData(formData, formDataCCSI);\n checkForInvalid(data.basket);\n allFieldsValid();\n $.spinner().stop();\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n setFieldsData(formData, formDataCCSI);\n checkForInvalid(data.basket);\n updateFormTitle(uuid);\n }\n });\n });\n\n $('body').on('change', '.quantity-form > select.quantity,.quantity-form > input[type=\"number\"].quantity', function (e) {\n e.preventDefault();\n var preSelectQty = $(this).data('pre-select-qty');\n var quantity = $(this).val();\n var productID = $(this).data('pid');\n var url = $(this).data('action');\n var uuid = $(this).data('uuid');\n var $lineItem= $(this).parent().closest('.product-info').data('uuid');\n var productQtyLimit = $('.product-qty-limit').length > 0 ? Number($('.product-qty-limit').val()) : 100;\n $(this).parent().closest('.product-info').find('.non-cml-product').addClass('d-none');\n\n if($(this).data('producttype') === 'INST_TYP_PRIV'){\n if( quantity !== parseInt($(this).data('cemaxqty'))){\n quantity = parseInt($(this).data('cemaxqty'));\n //$(\"#error-cemax-quantities\").modal('show'); \n } \n }\n\n if(quantity > productQtyLimit || quantity < 1){ \n $(\"#error-max-quantities\").modal('show');\n quantity = parseInt(preSelectQty);\n } \n\n var urlParams = {\n pid: productID,\n quantity: quantity,\n uuid: uuid\n };\n url = appendToUrl(url, urlParams);\n $(this).parents('.card').spinner().start();\n\n $('body').trigger('cart:beforeUpdate');\n var formData = $('input[name=learnerEmail]');\n var formDataCCSI = $('input[name=learnerCCSI]');\n\n $.ajax({\n url: url,\n type: 'get',\n context: this,\n dataType: 'json',\n success: function (data) {\n $('.quantity[data-uuid=\"' + uuid + '\"]').val(quantity);\n $('.coupons-and-promos').empty().append(data.totals.discountsHtml);\n updateCartTotals(data);\n updateApproachingDiscounts(data.approachingDiscounts);\n updateAvailability(data, uuid);\n //updateIlt(data, $lineItem);\n if ($('.instance-type').val() != 'DIGITAL' \n && $('.instance-type').val() != 'cml' \n && $('.instance-type').val() != 'IK') {\n updateQtyChange(data, $lineItem);\n }\n validateBasket(data);\n $(this).data('pre-select-qty', quantity);\n if ( quantity > 1) {\n $(\".checkout-btn\").addClass('disabled');\n }\n $('body').trigger('cart:update', data);\n var $currentLineItem=$(this).parent().closest('.product-info').find('.learnerValidation');\n var $currentPurchase = $currentLineItem.find('.purchase-license-checkbox');\n var $isPurchaseClicked = $currentPurchase.find('label').hasClass('checked');\n var defaultEmail = $currentLineItem.find('.purchase-license-checkbox input').data('email');\n if ($isPurchaseClicked) {\n $currentLineItem.find('input.learners-email').each(function (i) {\n $(this).val(defaultEmail);\n $(this).attr(\"disabled\", \"true\");\n if($(this).hasClass('is-invalid')) {\n $(this).removeClass('is-invalid');\n $(this).parent().find('.invalid-feedback').html(\"\");\n }\n });\n }\n $.spinner().stop();\n if ($(this).parents('.product-info').hasClass('bonus-product-line-item') && $('.cart-page').length) {\n location.reload();\n }\n if($('.product-subtype').val() == 'ICP' && $('.acronym').val() == 'ICP') {\n if(quantity == 1) {\n $('span.single').text('');\n $('span.single').text(data.resources.icpuseremail);\n }\n }\n else if ($('.instance-type').val() != 'DIGITAL') {\n if(quantity > 1) {\n $('span.single').text('');\n $('span.single').text(data.resources.student1email);\n } else {\n $('span.single').text('');\n $('span.single').text(data.resources.studentemail)\n }\n }\n else\n {\n $('span.single').text('');\n $('span.single').text(data.resources.addlearners);\n }\n setFieldsData(formData, formDataCCSI);\n updateFormTitle(uuid);\n checkForInvalid(data);\n allFieldsValid();\n learnerInputField();\n \n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $(this).val(parseInt(preSelectQty, 10));\n $.spinner().stop();\n }\n setFieldsData(formData, formDataCCSI);\n updateFormTitle(uuid);\n checkForInvalid(data);\n }\n \n });\n \n });\n\n $('.shippingMethods').change(function () {\n var url = $(this).attr('data-actionUrl');\n var urlParams = {\n methodID: $(this).find(':selected').attr('data-shipping-id')\n };\n // url = appendToUrl(url, urlParams);\n\n $('.totals').spinner().start();\n $('body').trigger('cart:beforeShippingMethodSelected');\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: urlParams,\n success: function (data) {\n if (data.error) {\n window.location.href = data.redirectUrl;\n } else {\n $('.coupons-and-promos').empty().append(data.totals.discountsHtml);\n updateCartTotals(data);\n updateApproachingDiscounts(data.approachingDiscounts);\n validateBasket(data);\n }\n\n $('body').trigger('cart:shippingMethodSelected', data);\n $.spinner().stop();\n },\n error: function (err) {\n if (err.redirectUrl) {\n window.location.href = err.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n }\n });\n });\n\n $('.promo-code-form').submit(function (e) {\n e.preventDefault();\n $.spinner().start();\n $('.coupon-missing-error').hide();\n $('.coupon-error-message').empty();\n if (!$('.coupon-code-field').val()) {\n $('.promo-code-form .form-control').addClass('is-invalid');\n $('.promo-code-form .form-control').attr('aria-describedby', 'missingCouponCode');\n $('.coupon-missing-error').show();\n $.spinner().stop();\n return false;\n }\n var $form = $('.promo-code-form');\n $('.promo-code-form .form-control').removeClass('is-invalid');\n $('.coupon-error-message').empty();\n $('body').trigger('promotion:beforeUpdate');\n var formData = $('input[name=learnerEmail]');\n var formDataCCSI = $('input[name=learnerCCSI]');\n\n $.ajax({\n url: $form.attr('action'),\n type: 'GET',\n dataType: 'json',\n data: $form.serialize(),\n success: function (data) {\n if (data.error) {\n $('.promo-code-form .form-control').addClass('is-invalid');\n $('.promo-code-form .form-control').attr('aria-describedby', 'invalidCouponCode');\n $('.coupon-error-message').empty().append(data.errorMessage);\n $('body').trigger('promotion:error', data);\n } else {\n $('.coupons-and-promos').empty().append(data.totals.discountsHtml);\n updateCartTotals(data);\n updateApproachingDiscounts(data.approachingDiscounts);\n validateBasket(data);\n $('body').trigger('promotion:success', data);\n $(\".promo-code-form\").addClass('d-none');\n setFieldsData(formData, formDataCCSI);\n checkForInvalid(data);\n allFieldsValid();\n }\n $('.coupon-code-field').val('');\n $.spinner().stop();\n },\n error: function (err) {\n $('body').trigger('promotion:error', err);\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.errorMessage);\n $.spinner().stop();\n }\n setFieldsData(formData, formDataCCSI);\n checkForInvalid(data);\n }\n });\n return false;\n });\n\n $('body').on('click', '.remove-coupon', function (e) {\n e.preventDefault();\n\n var couponCode = $(this).data('code');\n var uuid = $(this).data('uuid');\n var $deleteConfirmBtn = $('.delete-coupon-confirmation-btn');\n var $productToRemoveSpan = $('.coupon-to-remove');\n\n $deleteConfirmBtn.data('uuid', uuid);\n $deleteConfirmBtn.data('code', couponCode);\n\n $productToRemoveSpan.empty().append(couponCode);\n $(\".promo-code-form\").removeClass('d-none');\n });\n\n $('body').on('click', '.delete-coupon-confirmation-btn', function (e) {\n e.preventDefault();\n\n var url = $(this).data('action');\n var uuid = $(this).data('uuid');\n var couponCode = $(this).data('code');\n var urlParams = {\n code: couponCode,\n uuid: uuid\n };\n\n url = appendToUrl(url, urlParams);\n\n $('body > .modal-backdrop').remove();\n var formData = $('input[name=learnerEmail]');\n var formDataCCSI = $('input[name=learnerCCSI]');\n\n $.spinner().start();\n $('body').trigger('promotion:beforeUpdate');\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $('.coupon-uuid-' + uuid).remove();\n updateCartTotals(data);\n updateApproachingDiscounts(data.approachingDiscounts);\n validateBasket(data);\n $.spinner().stop();\n setFieldsData(formData, formDataCCSI);\n checkForInvalid(data);\n allFieldsValid();\n $(\".promo-code-form\").removeClass('d-none');\n $('body').trigger('promotion:success', data);\n $('.bdm-apply-button').removeAttr('disabled'); \n },\n error: function (err) {\n $('body').trigger('promotion:error', err);\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n setFieldsData(formData, formDataCCSI);\n checkForInvalid(data);\n }\n });\n $('.discount-select').val(0);\n $('#bdmApproverEmail').val('');\n $('#bdmNotes').val('');\n $('.bdm-approver').addClass('d-none');\n $('.bdm-notes').addClass('d-none');\n });\n $('body').on('click', '.cart-page .bonus-product-button', function () {\n $.spinner().start();\n $(this).addClass('launched-modal');\n $.ajax({\n url: $(this).data('url'),\n method: 'GET',\n dataType: 'json',\n success: function (data) {\n base.methods.editBonusProducts(data);\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').remove();\n $('.modal-backdrop').remove();\n $('body').removeClass('modal-open');\n\n if ($('.cart-page').length) {\n $('.launched-modal .btn-outline-primary').trigger('focus');\n $('.launched-modal').removeClass('launched-modal');\n } else {\n $('.product-detail .add-to-cart').focus();\n }\n });\n\n $('body').on('click', '.cart-page .product-edit .edit, .cart-page .bundle-edit .edit', function (e) {\n e.preventDefault();\n\n var editProductUrl = $(this).attr('href');\n getModalHtmlElement();\n fillModalElement(editProductUrl);\n });\n\n $('body').on('shown.bs.modal', '#editProductModal', function () {\n $('#editProductModal').siblings().attr('aria-hidden', 'true');\n $('#editProductModal .close').focus();\n });\n\n $('body').on('hidden.bs.modal', '#editProductModal', function () {\n $('#editProductModal').siblings().attr('aria-hidden', 'false');\n });\n\n $('body').on('keydown', '#editProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#editProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.update-cart-product-global',\n nextToLastElementSelector: '.modal-footer .quantity-select'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n\n $('body').on('product:updateAddToCart', function (e, response) {\n // update global add to cart (single products, bundles)\n var dialog = $(response.$productContainer)\n .closest('.quick-view-dialog');\n\n $('.update-cart-product-global', dialog).attr('disabled',\n !$('.global-availability', dialog).data('ready-to-order')\n || !$('.global-availability', dialog).data('available')\n );\n });\n\n $(document).on(\"keydown\", \".learnerValidation\", function(event) { \n return event.key != \"Enter\";\n });\n\n $('body').on('keyup', '#couponCode', function () {\n if ($(this).val().length != 0) {\n $(':input[type=\"submit\"]').prop('disabled', false);\n }\n else {\n $(':input[type=\"submit\"]').prop('disabled', true);\n }\n });\n\n // discunt value onChange enable apply button if input already has value\n $('#bdmDiscount').on('change', function() {\n if($(\"#bdmExpansionId\").val()) {\n $(':input[type=\"submit\"]').prop('disabled', false);\n }\n });\n\n $('body').on('product:updateAvailability', function (e, response) {\n // bundle individual products\n $('.product-availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);\n\n\n var dialog = $(response.$productContainer)\n .closest('.quick-view-dialog');\n\n if ($('.product-availability', dialog).length) {\n // bundle all products\n var allAvailable = $('.product-availability', dialog).toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability', dialog).toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability', dialog)\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg', dialog).empty()\n .html(allReady ? response.message : response.resources.info_selectforstock);\n } else {\n // single product\n $('.global-availability', dialog)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);\n }\n });\n\n $('body').on('product:afterAttributeSelect', function (e, response) {\n if ($('.modal.show .product-quickview .bundle-items').length) {\n $('.modal.show').find(response.container).data('pid', response.data.product.id);\n $('.modal.show').find(response.container).find('.product-id').text(response.data.product.id);\n } else {\n $('.modal.show .product-quickview').data('pid', response.data.product.id);\n }\n });\n\n $('body').on('change', '.quantity-select', function () {\n var selectedQuantity = $(this).val();\n $('.modal.show .update-cart-url').data('selected-quantity', selectedQuantity);\n });\n\n $('body').on('change', '.options-select', function () {\n var selectedOptionValueId = $(this).children('option:selected').data('value-id');\n $('.modal.show .update-cart-url').data('selected-option', selectedOptionValueId);\n });\n\n\n $(\".recipient_link\").click(function () {\n if (!($(this).next().hasClass('d-none'))) {\n $('.server-down-msg').addClass('d-none');\n }\n $(this).find($(\".down-arrow\")).toggleClass(\"rotate-up\");\n });\n\n //BDM input validation\n // Restricts input for the set of matched elements to the given inputFilter function.\n (function($) {\n $.fn.inputFilter = function(inputFilter) {\n return this.on(\"input keydown keyup mousedown mouseup select contextmenu drop\", function() {\n if (inputFilter(this.value)) {\n this.oldValue = this.value;\n this.oldSelectionStart = this.selectionStart;\n this.oldSelectionEnd = this.selectionEnd;\n } else if (this.hasOwnProperty(\"oldValue\")) {\n this.value = this.oldValue;\n this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);\n } else {\n this.value = \"\";\n }\n });\n };\n }(jQuery));\n \n $(\"#bdmExpansionId\").inputFilter(function(value) {\n var lblError = $(this).next('.invalid-feedback');\n var alphaNumExp = /^[A-Za-z0-9]*$/;\n var email = value;\n if (email == '') {\n if($('.bdm-apply-button').prop('disabled')) {\n $(this).addClass('is-invalid');\n lblError.html('Expansion ID Required'); \n } \n $('.bdm-apply-button').attr('disabled', true); \n } else {\n if((alphaNumExp.test(value))) {\n $('.bdm-apply-button').removeAttr('disabled');\n lblError.html(''); \n $(this).removeClass('is-invalid');\n }\n }\n return alphaNumExp.test(value);\n });\n\n // subscription date validation for digital products\n $(document).ready(function () {\n $('#subscriptionDate').on('change', function() {\n var inputDate = new Date($('#subscriptionDate').val()+ 'T00:00:00Z');\n var currentDate = new Date();\n currentDate.setUTCHours(0, 0, 0, 0);\n if (inputDate < currentDate.getTime()) {\n $('.subscription-date').removeClass('d-none');\n $('.checkout-btn').addClass('disabled');\n return false;\n } else {\n $('.subscription-date').addClass('d-none');\n $('.checkout-btn').removeClass('disabled');\n }\n });\n });\n\n //learners input field on cart\n $(document).ready(function () {\n var count = $('#inputContainer div.input').length;;\n \n if ($('.instance-type').val() == 'DIGITAL')\n {\n $('.returnUrl').removeClass('d-block');\n $('.returnUrl').hide();\n }\n if ($('input.quantity').val() == 1) {\n $('.addBtn').hide();\n } else {\n $('.addBtn').show();\n }\n\n if (count == 1) {\n $('.removeBtn').hide();\n }\n else\n {\n $('.removeBtn').show();\n }\n\n // to add input field\n $(document).on(\"click\", \".addBtn\", function () {\n var maxInputs = $('input.quantity').val();\n var count = $('#inputContainer div.input').length;\n if (count < maxInputs) {\n count++;\n\n var classID= Number($(this).closest(\"div\").attr('data-val'))+1;\n var inputId = \"learner-form-email\" + classID;\n $(this).closest(\"div\").after('
        ');\n $(this).hide();\n var destination = $(\"#\" + inputId);\n var attributes = $('#learner-form-email-contactEmail').prop(\"attributes\");\n\n for (var i = 0; i < attributes.length; i++) {\n\n var a = attributes[i];\n if (a.name != 'value' && a.name != 'id') {\n destination.attr(a.name, a.value);\n }\n }\n $(destination).removeClass('contactAdmin');\n $(destination).addClass('digital-learner');\n \n $('#inputContainer div:first-child').find('.removeBtn').css(\"display\", \"inline-block\");\n var formData = $('input[name=learnerEmail]');\n var formDataCCSI = $('input[name=learnerCCSI]');\n setFieldsData(formData, formDataCCSI);\n }\n if (count == maxInputs) {\n $('.addBtn').hide();\n }\n else\n {\n $('#inputContainer div:last-child').find('.addBtn.edithidden').css(\"display\", \"inline-block\");\n }\n });\n //to Remove input \n $(document).on(\"click\", \".removeBtn\", function () {\n var count = $('#inputContainer div.input').length;\n if (count > 0) {\n $(this).closest(\"div\").remove();\n count--;\n $('#inputContainer div:last-child').find('.addBtn').hide();\n $('#inputContainer div:last-child').find('.addBtn.edithidden').css(\"display\", \"inline-block\");\n $('#inputContainer div:first-child').find('.removeBtn').css(\"display\", \"inline-block\");\n }\n if ($('#inputContainer div').length <= 2) {\n $('#inputContainer div:first-child').find('.removeBtn').hide();\n }\n });\n\n });\n \n //quanity change function for learner field \n function learnerInputField() {\n var maxquantity = $('input.quantity').val();\n var inputcontainer = $('#inputContainer div.input').length;\n var counter = inputcontainer;\n while (counter > maxquantity) {\n $('#inputContainer div.input').last().remove();\n counter--;\n }\n if (counter == maxquantity) {\n $('.addBtn').hide();\n } else {\n $('#inputContainer div:last-child').find('.addBtn').hide();\n $('#inputContainer div:last-child').find('.addBtn.edithidden').css(\"display\", \"inline-block\");\n }\n if (maxquantity == 1) {\n $('.removeBtn').hide();\n }\n }\n // toggle learners tab\n $(document).on(\"click\", \".learners-tab\", function () {\n $(this).parent().siblings('#inputContainer').find('.input').toggle();\n $(this).siblings('.down-arrow').toggleClass('rotate-up');\n\n });\n\t\n //sticky procced to checkout\n $( document ).ready(function() {\n if ($('.page').data('action') == \"Cart-Show\") {\n if ($('#checkout-btn').hasClass('checkout-continue')) { \n $(\"#footercontent\").addClass(\"sticyBtn\");\n }\n else{\n $(\"#footercontent\").addClass(\"nt-stickyBtn\");\n }\n }\n });\n\n //Bundled Items more less logic\n $( document ).ready(function() {\n var bundleItemsInfo = $('.bundled-items');\n\n $(bundleItemsInfo).each(function (i) {\n $(this).find('.items:gt(2)').hide();\n\n var itemsLoop = $(this).find('.items').length;\n if (itemsLoop > 3) {\n $('.show_bundle.more').show();\n } else {\n $('.show_bundle').hide();\n }\n });\n\n $('.show_bundle').click(function () {\n $(this).parent().find('.items:gt(2)').toggle('slide');\n $(this).parent().find('.more, .less').toggle();\n });\n });\n\n //Checking purchase license option when returning from checkout page\n $( document ).ready(function() {\n setTimeout(function(){ \n $( \".card.product-info\" ).each(function( index ) {\n if(($(this).find('.purchase-license-checkbox').hasClass('cmlForSelf'))) {\n $(this).find('.purchase-license-checkbox .cln-checkbox').trigger('click');\n $(this).find('.purchase-license-checkbox label').removeClass('unChecked');\n $(this).find('.purchase-license-checkbox label').addClass('checked');\n }\n }); \n }, 1000);\n });\n\n //for validating all fields and enabling the proceed to checkout button\n function allFieldsValid () {\n var enableCheckout = true;\n var learnerCCSI = true;\n //var allFields = $('input[name=learnerEmail]:not(.digital-learner)');\n var allFields = $('input[name=learnerEmail]');\n $(allFields).each(function (i) {\n var value = $(this).val();\n var defaultValue = $(this).prop('defaultValue');\n if (defaultValue.length != 0 && (value.length == 0 || value == \"\" || ($(this).hasClass('is-invalid')))) {\n if ((value.length == 0 || value == \"\")) {\n if (!$(this).hasClass('digital-learner')) {\n if (!($(this).hasClass('is-invalid'))) {\n $(this).next('.invalid-feedback').html('Email Required');\n $(this).addClass('is-invalid');\n }\n }\n } \n if (($(this).hasClass('is-invalid'))) {\n enableCheckout = false;\n return true;\n }\n }\n });\n var learnerEmails=$('input[name=learnerCCSI]');\n $(learnerEmails).each(function (i) {\n var value = $(this).val();\n if (value.length == 0 || value == \"\" || ($(this).hasClass('is-invalid'))) {\n learnerCCSI = false;\n return true;\n }\n });\n if (enableCheckout && learnerCCSI) {\n if ($('.no-avialale-seats').hasClass('d-none')) {\n $(\".checkout-btn\").removeClass('disabled');\n }\n } else {\n $(\".checkout-btn\").addClass('disabled');\n }\n }\n function updateFormTitle (uuid) {\n //Updating the Learners form title\n var $currentLineItem = $('.line-item-learnersform-' + uuid).parent().closest('.product-info').find('.learnerValidation');\n var empty = false;\n $currentLineItem.find('input.learners-email').each(function(i) {\n var value = $(this).val();\n if (value.length == 0 || value == \"\" ) {\n empty = true;\n return true;\n }\n });\n if (empty == true) {\n $currentLineItem.find($('.info-edit')).addClass(\"d-none\");\n if($currentLineItem.find($('.info-save')).length == 1 ) {\n $currentLineItem.find($('.info-save')).addClass(\"d-lock\").removeClass('d-none');\n } else {\n $currentLineItem.find($('.info-save')).eq(1).addClass(\"d-lock\").removeClass('d-none'); \n }\n } else {\n $currentLineItem.find($('.info-save')).addClass(\"d-none\");\n if($currentLineItem.find($('.info-edit')).length == 1 ) {\n $currentLineItem.find($('.info-edit')).addClass(\"d-lock\").removeClass('d-none');\n } else {\n $currentLineItem.find($('.info-edit')).eq(1).addClass(\"d-lock\").removeClass('d-none'); \n }\n }\n var learners = $currentLineItem.find('input.learners-email').not('.contactAdmin');\n var learnersCount = learners.length;\n var firstLearner = learners[0].value;\n var duplicateEmailFound = false;\n var isCml= $currentLineItem.hasClass('cmlProduct');\n if (learnersCount > 1) {\n for (var y = 1; y < learnersCount; y++) {\n if (learners[y].value != '' && firstLearner == learners[y].value) {\n duplicateEmailFound = true;\n if(!isCml) {\n learners[y].classList.add(\"is-invalid\");\n }\n break;\n } \n }\n }\n if (!isCml && duplicateEmailFound) {\n $currentLineItem.find('.non-cml-product').removeClass('d-none');\n }\n }\n function checkForInvalid(data) {\n data.items.forEach(function (item) {\n //Updating the productLine invalid errors if the form has duplicates emails for non cml products\n var $currentLineItem = $('.line-item-learnersform-' + item.UUID).parent().closest('.product-info').find('.learnerValidation');\n var learners = $currentLineItem.find('input.learners-email').not('.contactAdmin');\n var learnersCount = learners.length;\n var firstLearner = learners[0].value;\n var duplicateEmailFound = false;\n var isCml= $currentLineItem.hasClass('cmlProduct');\n if (learnersCount > 1) {\n for (var y = 1; y < learnersCount; y++) {\n if (learners[y].value != '' && firstLearner == learners[y].value) {\n duplicateEmailFound = true;\n if(!isCml) {\n learners[y].classList.add(\"is-invalid\");\n }\n break;\n } \n }\n }\n \n });\n }\n\n //closing alert error pop ups'\n $(document).on('click', '.alert-danger button', function (){\n $(this).parent().removeClass('show');\n })\n\n // custom validation code for product line item \n $(document).on('focusin', '.learners-email', function () {\n if ($(this).hasClass('focused-out')) {\n $(this).removeClass('focused-out');\n }\n })\n $(document).on('focusout', '.learners-email', function () {\n if (!$(this).hasClass('focused-out')) {\n var email = $(this).val();\n var productSubType = $('.product-subtype').val();\n var $current = $(this);\n var $restricDomainErr= $(\".restric-domain-error\");\n var inavlidMsg=$(\".inavlid-cco-email-msg\").text();\n var invaliddigitallearnersMsg=$(\".invalid-digital-learner-email-msg\").text();\n $current.parent().find('.invalid-feedback').html(\"\");\n $(this).addClass('focused-out');\n var lblError = $(this).next('.invalid-feedback');\n lblError.innerHTML = '';\n var expr = /^[\\w.%+-\\.'']+@[\\w.'\\-]+.[\\w]{2,15}$/;\n var pattern = $current.attr('pattern');\n if (pattern != null) {\n expr = new RegExp(pattern);\n }\n var isDigitalLearner = false;\n // restrict the cisco domain user - CLNSB2C-1823\n var ciscoDomain = [ \"cisco.com\" ];\n var domainName = email.split('@'); \n var isCEProduct = false;\n \n\n if($('#isCEProductTypePRV').length > 0)\n isCEProduct = true;\n\n //verify if the input text box is the digital learner \n if($(this).hasClass('digital-learner'))\n isDigitalLearner = true;\n \n if( isCEProduct && !isDigitalLearner && (ciscoDomain.indexOf(domainName[1]) >= 0) ) {\n $restricDomainErr.removeClass(\"d-none\");\n $('.checkout-btn').addClass('disabled');\n return;\n } else {\n $restricDomainErr.addClass(\"d-none\");\n }\n\n if (!expr.test(email) && email.length!=0 && !$current.hasClass('learner-ccsi')) {\n $(this).addClass('is-invalid');\n if(isDigitalLearner) {\n $(this).css('margin-bottom','20px').next('.invalid-feedback').css({'width':'250px', 'position':'absolute','bottom':'0px','left':'0px'});\n lblError.html(invaliddigitallearnersMsg);\n }\n else{\n if(productSubType == 'ICP'){\n lblError.html(invaliddigitallearnersMsg);\n }\n else {\n lblError.html(inavlidMsg);\n }\n }\n }\n else {\n $(this).removeClass('is-invalid').css('margin-bottom','0px')\n lblError.html('');\n }\n\n if (email == ''&& !isDigitalLearner) {\n $(this).addClass('is-invalid');\n if(!$current.hasClass('learner-ccsi')) {\n lblError.html('Email Required');\n } else {\n lblError.html('CCSI required'); \n }\n }\n\n var empty = false;\n var $form = $(this).closest('.learnerValidation');\n var duplicateEmail = false;\n var currentId = $(this).attr('id');\n \n var learners = $form.find('input.learners-email');\n var learnersCount = learners.length;\n var firstLearner = learners[0].value;\n var differentEmailPresent = false;\n var duplicateEmailFound = false;\n if (learnersCount > 1) {\n for (var z = 1; z < learnersCount; z++) {\n if (learners[z].value != '' && firstLearner != learners[z].value) {\n differentEmailPresent = true;\n break;\n } \n }\n for (var y = 1; y < learnersCount; y++) {\n if (learners[y].value != '' && firstLearner == learners[y].value) {\n duplicateEmailFound = true;\n break;\n } \n }\n }\n if(!$current.hasClass('contactAdmin')) //Condition Added to ignore the contactadmin for DuplicateEmail validation\n {\n $form.find('input.learners-email').not('input.learners-email.contactAdmin').each(function(i) {\n var value = $(this).val();\n var isCml= $form.hasClass('cmlProduct');\n if (value.length == 0 || value == \"\" || ($(this).hasClass('is-invalid'))) {\n empty = true;\n return true;\n } else if (!isCml && ($(this).val() == $current.val() && $(this).attr('id') != currentId)) {\n duplicateEmail = true;\n var $emailDuplicate = $form.data('duplicate-email');\n $current.addClass('is-invalid');\n $current.parent().closest('.learnerValidation').find('.non-cml-product').removeClass('d-none');\n return true;\n } else if (isCml) {\n if (duplicateEmailFound && differentEmailPresent) {\n duplicateEmail = true;\n var $emailDuplicate = $form.data('duplicate-email');\n $current.addClass('is-invalid');\n $current.parent().closest('.learnerValidation').find('.non-cml-product').removeClass('d-none');\n return true;\n } else if (!duplicateEmailFound && ($(this).val() == $current.val() && $(this).attr('id') != currentId)) {\n duplicateEmail = true;\n var $emailDuplicate = $form.data('duplicate-email');\n $current.addClass('is-invalid');\n $current.parent().closest('.learnerValidation').find('.non-cml-product').removeClass('d-none');\n return true;\n } else if (!differentEmailPresent && ($(this).val() != $current.val() && $(this).attr('id') != currentId)) {\n duplicateEmail = true;\n var $emailDuplicate = $form.data('duplicate-email');\n $current.addClass('is-invalid');\n if(!$form.find('.is-invalid').length){\n $current.parent().closest('.learnerValidation').find('.non-cml-product').removeClass('d-none');\n }\n \n return true;\n }\n } else {\n return true;\n }\n \n });\n }\n allFieldsValid();\n if (empty == false) {\n if(!duplicateEmail) {\n $current.parent().closest('.learnerValidation').find('.non-cml-product').addClass('d-none');\n }\n $form.find($('.info-save')).addClass(\"d-none\");\n if($form.find($('.info-edit')).length == 1 ) {\n $form.find($('.info-edit')).addClass(\"d-lock\").removeClass('d-none');\n } else {\n $form.find($('.info-edit')).eq(1).addClass(\"d-lock\").removeClass('d-none').attr('style',''); \n }\n }\n\n // adding css for the CE message being too long CLNSB2C-1802\n var reqEmailErr = $('.req-email-error');\n\n if(reqEmailErr.hasClass(\"req-email-ce\")){\n reqEmailErr.removeClass(\"req-email-ce\");\n }\n }\n });\n\n //handling purchase license option and filling the email with default account email\n $('body').on(\"click\", \".learnerValidation .purchase-license-checkbox\", function (evt) {\n evt.stopPropagation();\n var defaultEmail = $(this).find('input').data('email');\n var $label = $(this).find('label');\n var $siblingForm = $(this).closest('.learnerValidation');\n if ($(this).find('input').prop('checked')) {\n\n $label.removeClass('unChecked');\n $label.addClass('checked');\n $siblingForm.find('input.learners-email').each(function (i) {\n $(this).val(defaultEmail);\n $(this).attr(\"disabled\", \"true\");\n if($(this).hasClass('is-invalid')) {\n $(this).removeClass('is-invalid');\n $(this).parent().find('.invalid-feedback').html(\"\");\n }\n });\n allFieldsValid();\n $siblingForm.find($('.recipient_link')).trigger('click');\n $siblingForm.find($('.info-save')).addClass(\"d-none\");\n $siblingForm.find($('.info-edit')).addClass(\"d-lock\").removeClass('d-none');\n } else {\n $label.removeClass('checked');\n $label.addClass('unChecked');\n $siblingForm.find($('.non-cml-product')).addClass(\"d-none\");\n $siblingForm.find('input.learners-email').each(function (i) {\n $(this).removeAttr(\"disabled\");\n if (i > 0) {\n $(this).val(\"\");\n }\n });\n allFieldsValid();\n $siblingForm.find($('.recipient_link')).trigger('click');\n $siblingForm.find($('.info-save')).removeClass(\"d-none\");\n $siblingForm.find($('.info-edit')).addClass(\"d-none\").removeClass('d-block');\n }\n });\n\n //Setting fields data when ajax call happening\n function setFieldsData(formData, formDataCCSI) {\n var formDataArray = [];\n var formObj = {};\n if(formData.length > 0){\n for (var i = 0; i < formData.length; i++) {;\n formObj = {\n email: formData[i].value,\n lineItemId: formData[i].dataset.uuid,\n fieldId: formData[i].id\n };\n formDataArray.push(formObj);\n }\n } \n if (formDataCCSI.length > 0) {\n //For ICP Product fetch CCSI fields\n var formDataCCSIArray = [];\n var formCCSIObj = {};\n for (var j = 0; j < formDataCCSI.length; j++) {\n var CCSIField = formDataCCSI[j];\n var fieldId=formDataCCSI[j].id ;\n var lineItemId= formDataCCSI[j].dataset.uuid ;\n var CCSIEmailField = CCSIField.closest('.request-lineItemForm-body').getElementsByClassName('learners-email')[0];\n formCCSIObj = {\n ccsi: CCSIField.value,\n ccsiEmail: CCSIEmailField.value,\n lineItemId: lineItemId,\n fieldId: fieldId\n };\n formDataCCSIArray.push(formCCSIObj);\n }\n }\n $.each(formDataArray, function( key, value ) {\n $('.uuid-' + formDataArray[key].lineItemId + \" \" + 'input').each(function() {\n if( $(this).attr('id') == formDataArray[key].fieldId ) {\n $(this).val(formDataArray[key].email);\n }\n });\n }\n );\n\n $.each(formDataCCSIArray, function( key, value ) {\n $('.uuid-' + formDataCCSIArray[key].lineItemId + \" \" + 'input').each(function() {\n if( $(this).attr('id') == formDataCCSIArray[key].fieldId ) {\n if($(this).attr('name') == 'learnerEmail') {\n $(this).val(formDataCCSIArray[key].ccsiEmail);\n } else {\n $(this).val(formDataCCSIArray[key].ccsi);\n }\n }\n });\n }\n );\n \n }\n\n $('.checkout-btn').on('click', function (e) {\n e.preventDefault();\n var $form = $(this);\n var redirectUrl = $form.attr('href');\n var url = $form.attr('data-action');\n var eolUrl = $form.attr('data-eolUrl');\n var blockUrl = $form.attr('data-block');\n var $expansionID = $('#bdmExpansionId');\n var $bdmExpansionErr = $('.bdm-expansionId-error');\n var isBDMUser = $('#isBdmUser');\n var instanceType = $('#instanceType');\n var productSubType = $('.product-subtype').val();\n var acronym = $('.acronym').val();\n\n // bdm subscription start date validation\n var inputVal = $('#subscriptionDate').val();\n if ((inputVal == '' || !inputVal) && ($('.instance-type').val() == 'DIGITAL')) {\n \t$('.subscription-date-bdm').removeClass('d-none');\n $('.checkout-btn').addClass('disabled');\n return false;\n }\n\n // For all BDM user expansion ID is mandatory. \n if( isBDMUser.val() == 'true') {\n if($expansionID.val().length === 0) {\n $bdmExpansionErr.removeClass('d-none');\n return;\n } else {\n $bdmExpansionErr.addClass('d-none');\n }\n }\n\n var validForCheckout = validateForCheckout();\n if (!validForCheckout) {\n $('.checkout-btn').addClass('disabled');\n return false;\n }\n \n if (url) {\n var formDataArray = [];\n var formObj = {};\n var formData = $('input[name=learnerEmail]');\n if(formData.length > 0){\n\t \tvar formExpansionId = $('input[name=ciscouser]');\n var expansionIDPresent = false;\n \n if(formExpansionId.length > 0 && formExpansionId.length == 1){\n var expansionID = formExpansionId[0].value;\n var expansionIDPresent = true;\n }\n var formDataCCSI = $('input[name=learnerCCSI]');\n var ccsiPresent = false;\n \n for (var i = 0; i < formData.length; i++) {;\n formObj = {\n email: formData[i].value,\n lineItemId: formData[i].dataset.uuid\n };\n formDataArray.push(formObj);\n }\n \n if (formDataCCSI.length > 0) {\n //For ICP Product fetch CCSI fields\n ccsiPresent = true;\n var formDataCCSIArray = [];\n var formCCSIObj = {};\n for (var j = 0; j < formDataCCSI.length; j++) {\n var CCSIField = formDataCCSI[j];\n var CCSIEmailField = CCSIField.closest('.request-lineItemForm-body').getElementsByClassName('learners-email')[0];\n formCCSIObj = {\n ccsi: CCSIField.value,\n ccsiEmail: CCSIEmailField.value,\n lineItemId: CCSIField.dataset.uuid\n };\n formDataCCSIArray.push(formCCSIObj);\n }\n }\n \n var urlParams = {};\n if (ccsiPresent) {\n urlParams = {\n formDataArray: JSON.stringify(formDataArray),\n formDataCCSIArray: JSON.stringify(formDataCCSIArray),\n ccsiPresent: ccsiPresent,\n expansionIDPresent : expansionIDPresent\n };\n if (expansionIDPresent) {\n urlParams.expansionID = expansionID;\n }\n\t\t } else if(expansionIDPresent){\n urlParams = {\n formDataArray: JSON.stringify(formDataArray),\n ccsiPresent: ccsiPresent,\n expansionID : expansionID,\n expansionIDPresent : expansionIDPresent\n \n };\n } else {\n urlParams = {\n formDataArray: JSON.stringify(formDataArray),\n ccsiPresent: ccsiPresent,\n\t\t\t expansionIDPresent : expansionIDPresent\n \n };\n }\n var formsubscriptionStartDate=$('input[name=subscriptionDate]');\n if (formsubscriptionStartDate.length == 0) {\n urlParams.subscriptionStartDate=''; \t\n }\n if(formsubscriptionStartDate.length > 0){\n urlParams.subscriptionStartDate=$('input[name=subscriptionDate]')[0].value; \n urlParams.digitalProduct =true;\n }\n\n if(productSubType == 'ICP' && acronym == 'ICP'){\n urlParams.isICP =true;\n }\n \n url = appendToUrl(url, urlParams);\n var inavlidMsgCCO=$(\".inavlid-cco-email-msg\").text();\n var invalidICPMessage=$(\".invalid-icp-email-msg\").text();\n var invalidAccountMessage=$(\".invalid-digital-learner-email-msg\").text();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n data: $('[name$=\"csrf_token\"]').serialize(),\n success: function (data) {\n if (!data.success) {\n if (data.hasOwnProperty('errorMessage')) {\n $('.error-msg').text(data.errorMessage);\n $('.error-msg').removeClass('d-none');\n }\n else{\n $('.server-down-msg').removeClass('d-none');\n }\n } else {\n var response = data.response;\n var learnersValidated = response.learnersValidated;\n if (!learnersValidated) {\n $(\".checkout-btn\").addClass('disabled');\n var invalidEmails = response.invalidEmails;\n var icpInvalidEmails = response.icpInvalidEmails;\n\n if (icpInvalidEmails != null && icpInvalidEmails.length > 0) {\n for (var i = 0; i < formData.length; i++) {\n var email = formData[i].value.toLowerCase();\n for (var j = 0; j < icpInvalidEmails.length; j++) {\n if (email == icpInvalidEmails[j].toLowerCase()) {\n if(productSubType == 'ICP' && acronym == 'ICP'){\n formData[i].classList.add('is-invalid');\n formData[i].nextElementSibling.innerHTML = invalidICPMessage ;\n }\n break;\n }\n }\n }\n }\n \n if (invalidEmails != null && invalidEmails.length > 0) {\n for (var i = 0; i < formData.length; i++) {\n var email = formData[i].value.toLowerCase();\n for (var j = 0; j < invalidEmails.length; j++) {\n if (email == invalidEmails[j].toLowerCase()) {\n if(productSubType == 'ICP' && acronym == 'ICP'){\n formData[i].classList.add('is-invalid');\n formData[i].nextElementSibling.innerHTML = invalidAccountMessage ;\n }\n else {\n formData[i].classList.add('is-invalid');\n formData[i].nextElementSibling.innerHTML = inavlidMsgCCO ;\n }\n break;\n }\n }\n }\n }\n\n // adding css for the CE message being too long CLNSB2C-1802\n $('.req-email-error').addClass(\"req-email-ce\");\n $('.invalid-feedback').css(\"background-color\", \"#f9f9f9\");\n var invalidCCSI = response.invalidCCSI;\n if (invalidCCSI != null && invalidCCSI.length > 0) {\n for (var i = 0; i < formDataCCSI.length; i++) {\n var CCSIID = formDataCCSI[i].value;\n for (var j = 0; j < invalidCCSI.length; j++) {\n if (CCSIID == invalidCCSI[j]) {\n formDataCCSI[i].classList.add('is-invalid');\n formDataCCSI[i].nextElementSibling.innerHTML = 'Invalid CCSI ID';\n break;\n }\n }\n }\n }\n } else {\n // if no invalid emails and the data is saved\n //Call the EOL function\n if (blockUrl && $(document).find('.avail-count').length > 0) {\n if (response.seatBlockInput != null) {\n var seatBlockInput = response.seatBlockInput;\n var seatBlockResponse = callSeatBlockAPI(blockUrl, seatBlockInput);\n if (seatBlockResponse.success) {\n //Success flow of Seat Block Call\n if (eolUrl) {\n getEOLMessage(eolUrl, redirectUrl);\n } else {\n window.location.href = redirectUrl;\n }\n } else {\n createErrorNotification(seatBlockResponse.errorMsg);\n }\n }\n } else {\n //seat block is not applicable\n if (eolUrl) {\n getEOLMessage(eolUrl, redirectUrl);\n } else {\n window.location.href = redirectUrl;\n }\n }\n }\n }\n },\n error: function (err) {\n }\n });\n }else{\n window.location.href = redirectUrl;\n }\n } else {\n window.location.href = redirectUrl;\n }\n return false;\n });\n\n $('body').on('keyup', '#bdmExpansionId', function (e) {\n var $bdmExpansionErr = $('.bdm-expansionId-error');\n if($(this).val().length > 0){\n $bdmExpansionErr.addClass('d-none');\n }\n });\n\t\n $('body').on('click', '.update-cart-product-global', function (e) {\n e.preventDefault();\n\n var updateProductUrl = $(this).closest('.cart-and-ipay').find('.update-cart-url').val();\n var selectedQuantity = $(this).closest('.cart-and-ipay').find('.update-cart-url').data('selected-quantity');\n var selectedOptionValueId = $(this).closest('.cart-and-ipay').find('.update-cart-url').data('selected-option');\n var uuid = $(this).closest('.cart-and-ipay').find('.update-cart-url').data('uuid');\n\n var form = {\n uuid: uuid,\n pid: base.getPidValue($(this)),\n quantity: selectedQuantity,\n selectedOptionValueId: selectedOptionValueId\n };\n\n $(this).parents('.card').spinner().start();\n\n $('body').trigger('cart:beforeUpdate');\n\n if (updateProductUrl) {\n $.ajax({\n url: updateProductUrl,\n type: 'post',\n context: this,\n data: form,\n dataType: 'json',\n success: function (data) {\n $('#editProductModal').modal('hide');\n\n $('.coupons-and-promos').empty().append(data.cartModel.totals.discountsHtml);\n updateCartTotals(data.cartModel);\n updateApproachingDiscounts(data.cartModel.approachingDiscounts);\n updateAvailability(data.cartModel, uuid);\n updateProductDetails(data, uuid);\n\n if (data.uuidToBeDeleted) {\n $('.uuid-' + data.uuidToBeDeleted).remove();\n }\n\n validateBasket(data.cartModel);\n\n $('body').trigger('cart:update', data);\n\n $.spinner().stop();\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n }\n });\n }\n });\n\n // Add to cart from recommendation section\n $('body').on('click', '.cart-recomendations .add-to-cart', function (e) {\n tile.addToCart();\n setTimeout(function () {\n location.reload();\n }, 500);\n });\n\n $('.iltclose').on('click' , function () {\n \t$(this).closest('.valid-cart-error').remove();\n });\n \n $('.bdm-apply-button').on('click', function (e) {\n \te.preventDefault();\n \t$('.bdm-info .error').text('')\n \tvar expansionId = $('#bdmExpansionId').val();\n \tvar discount = $('#bdmDiscount').val();\n \tif (discount == '0.00' || discount == '0') {\n \t\treturn;\n \t}\n \tvar url = $(this).data('action');\n var formData = $('input[name=learnerEmail]');\n var formDataCCSI = $('input[name=learnerCCSI]');\n var isPreSalesBdm = $('#isBDMPreSales').val();\n var isBDMCanApplyDiscount = $('#isBDMCanApplyDiscount').val();\n var isILTAdmin = $('#isILTAdmin').val();\n \tvar bdmInfo = {};\n \n \tbdmInfo[\"expansionId\"] = expansionId;\n \tbdmInfo[\"discount\"] = discount;\n \tbdmInfo[\"bdmApprover\"] = $('#bdmApproverEmail').val();;\n \tbdmInfo[\"bdmNotes\"] = $('#bdmNotes').val();\n bdmInfo[\"isPreSalesBdm\"] = isPreSalesBdm;\n bdmInfo[\"isBDMCanApplyDiscount\"] = isBDMCanApplyDiscount;\n \tbdmInfo[\"isILTAdmin\"] = isILTAdmin;\n \t$.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: bdmInfo,\n success: function (data) {\n \tif (data.error) {\n $('.bdm-info .error').text(data.errorMessage);\n $('.coupons-and-promos').addClass('d-none');\n updateCartTotals(data); \t\t\n \t} else {\n $('.coupons-and-promos').removeClass('d-none');\n \t\t$('.coupons-and-promos').empty().append(data.totals.discountsHtml);\n updateCartTotals(data);\n updateApproachingDiscounts(data.approachingDiscounts);\n\n validateBasket(data);\n setFieldsData(formData, formDataCCSI);\n checkForInvalid(data);\n allFieldsValid();\n\n $('body').trigger('cart:update', data);\n $('.bdm-apply-button').attr('disabled', true);\n \t}\n }\n \t});\n \t\n });\n\n $('.discount-select').blur(function() {\n var amt = parseFloat(this.value);\n $(this).val(amt.toFixed(2));\n });\n \n $('body').on('keyup input', '.discount-select', function (e) {\n \te.preventDefault();\n \n \tvar selectedDiscount = $(this).val();\n \n \tvar threshold = $(this).data('threshold');\n var dicountValue = parseFloat(selectedDiscount);\n var $discountError = $('.discount-error');\n if ((parseFloat(selectedDiscount) > parseFloat(threshold)) && isILTAdmin.value == 'true') {\n $('.bdm-approver').removeClass('d-none');\n $('.bdm-notes').removeClass('d-none');\n \t} else {\n \t\t$('.bdm-approver').addClass('d-none');\n \t\t$('.bdm-notes').addClass('d-none');\n \t}\n \n // check for the discount value 0 to 100\n if(dicountValue > 100){\n $discountError.removeClass('d-none');\n $('.bdm-approver').addClass('d-none');\n $('.bdm-notes').addClass('d-none');\n } else {\n $discountError.addClass('d-none');\n }\n \n \t$('.bdm-info .error').text('')\n });\n $(document).ready(function () {\n if ($('.instance-type').val() == 'INST_TYP_PRIV') {\n \n // Check if BDMErrorMessage has a value\n if ($('input.BDMMismatchErrorMessage').val()) {\n // Create an error notification with the BDMErrorMessage value\n createErrorNotification($('input.BDMMismatchErrorMessage').val());\n\n // // Disable the checkout button\n $('.checkout-btn').addClass('disabled');\n }\n else if ($('.quantity-form > select.quantity').val() > 0) {\n $('.quantity-form > .quantity').trigger('change');\n }\n }\n });\n\n \n\n /**\n * Validates a checkout form on the client-side.\n * Checks if all required fields are filled out and if the email addresses entered are valid.\n * Restricts the use of cisco email domains for customer Admin field only for Digital products\n * @returns {boolean} - Boolean value indicating if the form is valid or not.\n */\n function validateForCheckout() {\n var isValid = true;\n var allFields = $('input[name=learnerEmail]:not(.digital-learner)');\n $(allFields).each(function (i) {\n var value = $(this).val();\n if (value.length == 0 || value == \"\" || ($(this).hasClass('is-invalid'))) {\n if (!$(this).hasClass('digital-learner')) {\n if (!($(this).hasClass('is-invalid'))) {\n $(this).next('.invalid-feedback').html('Email Required');\n $(this).addClass('is-invalid');\n }\n }\n if ($(this).hasClass('is-invalid')) {\n isValid = false;\n return true;\n }\n } else {\n //verify if the input text box is the digital learner\n var isCEProduct = $('#isCEProductTypePRV').length > 0 ? true : false;\n if (isCEProduct) {\n // restrict the cisco domain user for contactAdmin field- CLNSB2C-1823\n var ciscoDomain = [ \"cisco.com\" ];\n var domainName = value.split('@');\n var $restrictDomainErr = $(this).siblings('.restric-domain-error');\n if (ciscoDomain.indexOf(domainName[1]) >= 0 && $restrictDomainErr.length > 0) {\n $restrictDomainErr.removeClass(\"d-none\");\n $(this).addClass('is-invalid');\n isValid = false;\n return true;\n }\n }\n }\n });\n if (isValid) {\n //Client side validation for Digital lineitem's learner fields \n if (($('.instance-type').val() == 'DIGITAL')) {\n var digitalLearners = $('.digital-learner');\n var validDigitalLearner = true;\n var expr = /^[\\w.%+-\\.'']+@[\\w.'\\-]+.[\\w]{2,15}$/;\n for (var dindex=0; dindex <= digitalLearners.length-1; dindex++) {\n var value = digitalLearners[dindex].value;\n var pattern = digitalLearners[dindex].pattern;\n if (pattern != null) {\n expr = new RegExp(pattern);\n }\n if (value != '' && value.length != 0 && !expr.test(value)) {\n if (!(digitalLearners[dindex].classList.contains('is-invalid'))) {\n var invaliddigitallearnersMsg=$(\".invalid-digital-learner-email-msg\").text();\n digitalLearners[dindex].classList.add('is-invalid');\n digitalLearners[dindex].style = 'margin-bottom: 20px';\n digitalLearners[dindex].nextElementSibling.innerHTML = invaliddigitallearnersMsg;\n digitalLearners[dindex].nextElementSibling.style = 'width: 250px; position: absolute; bottom: 0px; left: 0px';\n }\n isValid = false;\n break;\n \n }\n }\n }\n }\n \n return isValid;\n }\n\n \n\n base.selectAttribute();\n base.colorAttribute();\n base.removeBonusProduct();\n base.selectBonusProduct();\n base.enableBonusProductSelection();\n base.showMoreBonusProducts();\n base.addBonusProductsToCart();\n base.focusChooseBonusProductModal();\n base.trapChooseBonusProductModalFocus();\n base.onClosingChooseBonusProductModal();\n};"],"sourceRoot":""}