{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///../codebase/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///../codebase/storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack:///../codebase/tecnifibre/cartridges/app_storefront_tcf/cartridge/client/default/js/product/base.js","webpack:///../codebase/tecnifibre/cartridges/app_storefront_tcf/cartridge/client/default/js/product/detail.js","webpack:///../codebase/tecnifibre/cartridges/app_storefront_tcf/cartridge/client/default/js/product/informationsProduct.js","webpack:///../codebase/tecnifibre/cartridges/app_storefront_tcf/cartridge/client/default/js/product/product.js","webpack:///../codebase/tecnifibre/cartridges/app_storefront_tcf/cartridge/client/default/js/productDetail.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;;AAEb;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;;ACZa;AACb,kBAAkB,mBAAO,CAAC,2JAAuB;AACjD;;AAEA;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;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;;AAEA;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,oC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8DAA8D,WAAW;AACzE;AACA;AACA,8DAA8D,WAAW;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,qEAAqE,WAAW;AAChF;AACA;AACA,qEAAqE,WAAW;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,W;AACA;;AAEA;;AAEA;AACA,uBAAuB,iBAAiB;AACxC;AACA,oCAAoC,WAAW,mBAAmB,EAAE;AACpE,gCAAgC,YAAY,mCAAmC,YAAY,gBAAgB,4BAA4B;AACvI;AACA;;AAEA;AACA;AACA,gCAAgC,YAAY,qEAAqE;AACjH;AACA;AACA;AACA;AACA,gCAAgC,YAAY,qEAAqE;AACjH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP,K;AACA;;;;;AAKA;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;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6HAA6H,0BAA0B;AACvJ;;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,sE;AACA,mD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,2CAA2C;AAC9D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB,GAAG,0DAA0D,qBAAqB,cAAc,iBAAiB,uBAAuB,oBAAoB,4BAA4B;AAC7M,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,qCAAqC,0DAA0D;AAC/F,6DAA6D,oBAAoB,uBAAuB,WAAW,cAAc;AACjI,0BAA0B;AAC1B;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,G;;AAEA;AACA,mBAAmB,2CAA2C;AAC9D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,sFAAsF,aAAa,GAAG,gBAAgB;AACtH,mDAAmD,6BAA6B;AAChF,qDAAqD,6BAA6B;AAClF,oDAAoD,uEAAuE,qBAAqB,4BAA4B;AAC5K,+DAA+D,uBAAuB;AACtF,0FAA0F,aAAa,GAAG,gBAAgB,gBAAgB,+BAA+B;AACzK,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL,G;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA,uBAAuB,eAAe;AACtC;AACA,oEAAoE,cAAc;;AAElF,yCAAyC,EAAE,IAAI,QAAQ,GAAG,WAAW,GAAG,EAAE;AAC1E;AACA;;AAEA;AACA;AACA,0CAA0C,YAAY;AACtD;;AAEA;AACA;AACA,0CAA0C,WAAW;AACrD;;AAEA;AACA,UAAU;AACV;AACA,cAAc,uHAAuH;AACrI,+BAA+B,gBAAgB;AAC/C,kCAAkC,OAAO,GAAG,gBAAgB;AAC5D,cAAc;AACd,+BAA+B,gBAAgB;AAC/C,4BAA4B,OAAO;AACnC;AACA,cAAc;AACd;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA,wC;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS,E;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,sDAAsD;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,wBAAwB;AACnE,6CAA6C,iCAAiC;AAC9E,8CAA8C,uCAAuC;AACrF,iDAAiD,0CAA0C;AAC3F,8CAA8C,2BAA2B;AACzE,gDAAgD,yCAAyC;AACzF,gCAAgC;AAChC;AACA;AACA,oBAAoB;AACpB;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;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;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4D;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,kBAAkB;AAC5D;AACA;AACA;AACA;AACA,oC;AACA,4C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA,yBAAyB;;AAEzB;;AAEA,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;;;;;;;;;;;;;ACl0Ca;AACb,WAAW,mBAAO,CAAC,gHAAQ;AAC3B,qBAAqB,mBAAO,CAAC,mIAAW;AACxC,eAAe,mBAAO,CAAC,8IAAuB;;;;AAI9C;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,0C;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA,wC;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,SAAS,E;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,4CAA4C,kCAAkC,EAAE;;AAEhF;AACA,4CAA4C,uCAAuC,EAAE;;AAErF;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA,a;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,S;;AAEA;AACA;AACA;AACA,8C;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,aAAa;AACb;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA,CAAC;;;AAGD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sEAAsE,UAAU;AAChF,4BAA4B,SAAS;AACrC;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,sEAAsE,UAAU;AAChF,4BAA4B,SAAS;AACrC;AACA;AACA;AACA,SAAS;AACT;AACA,CAAC;;AAED;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;;;AAGD;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,C;;;;;;;;;;;;ACjnBa;;;AAGb;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;;;AAGD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,0DAA0D,QAAQ;;AAElE;;AAEA,oEAAoE,WAAW,oEAAoE,UAAU,iBAAiB,iBAAiB,WAAW,oBAAoB;;AAE9N;AACA,KAAK;AACL,CAAC;;AAED;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,0DAA0D,QAAQ;;AAElE;;AAEA,oEAAoE,WAAW,oEAAoE,UAAU,iBAAiB,iBAAiB,WAAW,oBAAoB;;AAE9N;AACA,KAAK;AACL,CAAC;;;;;;;;;;;;;AC3IY;;AAEb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,yDAAyD;;AAEzD;AACA;AACA,6BAA6B;;AAE7B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA,SAAS;AACT,wDAAwD;AACxD;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;ACxIa;;AAEb,qBAAqB,mBAAO,CAAC,mIAAW;;AAExC;AACA;AACA,uBAAuB,mBAAO,CAAC,4HAAkB;AACjD,uBAAuB,mBAAO,CAAC,8HAAmB;AAClD,KAAK;AACL,CAAC","file":"default/js/productDetail.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 = \"../codebase/tecnifibre/cartridges/app_storefront_tcf/cartridge/client/default/js/productDetail.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';\n\nmodule.exports = function (include) {\n    if (typeof include === 'function') {\n        include();\n    } else if (typeof include === 'object') {\n        Object.keys(include).forEach(function (key) {\n            if (typeof include[key] === 'function') {\n                include[key]();\n            }\n        });\n    }\n};\n","'use strict';\nvar focusHelper = require('base/components/focus');\nwindow.cart = {};\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    // console.log(\"Get Quantity Selected on element \" + $el);\n    var quantitySelected;\n    var _quantitySelector = '.quantity-select';\n    if ($el && $('.set-items').length) {\n        quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n    } else if ($el && $('.product-bundle').length) {\n        if ($('.js-b2b-quantity-select').length > 0) {\n            _quantitySelector = '.js-b2b-quantity-select';\n        }\n        var quantitySelectedModal = $($el).closest('.modal-footer').find(_quantitySelector);\n        var quantitySelectedPDP = $($el).closest('.bundle-footer').find(_quantitySelector);\n        if (quantitySelectedModal.val() === undefined) {\n            quantitySelected = quantitySelectedPDP;\n        } else {\n            quantitySelected = quantitySelectedModal;\n        }\n    } else {\n        if ($('.js-b2b-quantity-select').length > 0) {\n            _quantitySelector = '.js-b2b-quantity-select';\n        }\n        quantitySelected = $(_quantitySelector);\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    var _quantitiesSelected = getQuantitySelector($el);\n    var _variantQuantities;\n    var _productVariants = $el.data('variants');\n    if (window.customer.isB2B === true && _productVariants) {\n        _variantQuantities = [];\n        _quantitiesSelected.each(function(idx, _select) {\n            var _attrValue = $(_select).attr('data-attr-value');\n            var _attrID = $(_select).attr('data-attr-id');\n            var productOption = $(_select).find('option:eq(0)');\n            if (productOption.length > 0){\n                var productOptionUrl = $(_select).find('option:eq(0)').attr('data-url');\n                if (productOptionUrl){\n                    var productID = productOptionUrl.substring(\n                        productOptionUrl.indexOf(\"pid=\") + 4, \n                        productOptionUrl.lastIndexOf(\"&quantity\")\n                    );\n                    if (productID) {\n                        var _value = productID + '|' + _attrID + '|' + _attrValue +  '|' + $(_select).val();\n                        _variantQuantities.push(_value);\n                    }\n                }\n            }\n        });\n    } else {\n        _variantQuantities = _quantitiesSelected.val();\n    }\n\n    return _variantQuantities;\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 = '<li><div>' + response.resources.info_selectforstock + '</div></li>';\n    } else {\n        availabilityMessages.forEach(function (message) {\n            availabilityValue += '<li><div>' + message + '</div></li>';\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 += '<div class=\"attribute-values\">' + attribute.label + ': '\n                    + attribute.value + '</div>';\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\n    if ($(window).width() > 840) {\n    $(carousel).empty().append(`\n        <div class=\"product-view-carousel\">\n            <div class=\"carousel-inner\" role=\"listbox\">\n                <div class=\"carousel-product-arrows-zoom\">\n                    <a class=\"carousel-control-prev\" href=\"#${carouselId}\" role=\"button\" data-slide=\"prev\">\n                        <span class=\"carousel-icon-prev\" aria-hidden=\"true\"></span>\n                    </a>\n                    <a class=\"carousel-control-next\" href=\"#${carouselId}\" role=\"button\" data-slide=\"next\">\n                        <span class=\"carousel-icon-next\" aria-hidden=\"true\"></span>\n                    </a>\n                    <span class=\"zoom zoom-icon-js\">\n                        <span class=\"icon-zoom\"></span>\n                    </span>\n                </div>\n            </div>\n            <ol class=\"carousel-indicators liste-inline\" aria-hidden=\"true\"></ol>\n        </div>\n    `);\n    } else {\n        $(carousel).empty().append(`\n            <div class=\"product-view-carousel\">\n                <div class=\"carousel-inner\" role=\"listbox\"></div>\n                <ol class=\"carousel-indicators liste-inline\" aria-hidden=\"true\"></ol>\n                <div class=\"carousel-product-arrows-zoom\">\n                    <a class=\"carousel-control-prev d-none\" href=\"#${carouselId}\" role=\"button\" data-slide=\"prev\">\n                        <span class=\"carousel-icon-prev\" aria-hidden=\"true\"></span>\n                    </a>\n                    <a class=\"carousel-control-next d-none\" href=\"#${carouselId}\" role=\"button\" data-slide=\"next\">\n                        <span class=\"carousel-icon-next\" aria-hidden=\"true\"></span>\n                    </a>\n                    <span class=\"zoom d-none\">\n                        <span class=\"icon-zoom\"></span>\n                    </span>\n                </div>\n            </div>\n        `); \n    }\n\n    var li = \"\", itemZoom = \"\",itemZoomLarge = \"\";\n\n    if (imgs.length > 0) {\n        for (var i = 0; i < imgs.length; i++) {\n            li += `\n                <li data-target=\"#${carouselId}\" data-slide-to=\"${i}\" class=\"\">\n                    <img src=\"${imgs[i].url}\" class=\"d-block img-fluid\" alt=\"${imgs[i].alt} image number ${parseInt(imgs[i].index, 10)}\" itemprop=\"image\" />\n                </li>\n            `;\n\n            itemZoom += `\n                <div class=\"carousel-item zoom zoom-icon-js\">\n                    <img src=\"${imgs[i].url}\" itemprop=\"image\" width=\"500\" height=\"500\" style=\"user-select: none;\" />\n                </div>\n            `;\n            itemZoomLarge += `\n                <div class=\"carousel-item js-carousel-item\">\n                    <img src=\"${imgs[i].url}\" itemprop=\"image\" width=\"500\" height=\"500\" style=\"user-select: none;\" />\n                </div>\n            `;\n        }\n    }\n\n    $(carousel).find('.carousel-indicators').append(li);\n    $(carousel).find('.carousel-inner').append(itemZoom);\n    $('.js-carousel-inner').empty().append(itemZoomLarge);\n\n    $($(carousel).find('.carousel-item')).first().addClass('active');\n    $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n\n    if (imgs.length === 1) {\n        $(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]').remove();\n    }\n\n    $(carousel).carousel();\n    $(carousel).find('.carousel-indicators').attr('aria-hidden', true);\n\n    if ($(window).width() > 992) {\n        $('.zoom').zoom();\n    }\n\n    if ($(window).width() > 992) {\n      function toggleCarouselArrows() {\n        var $carousel = $(\".product-view-carousel\");\n        var itemCarousel = $carousel.find(\".carousel-item\");\n        var $indicators = $carousel.find(\".carousel-indicators li\");\n        var $prevArrow = $carousel.find(\".carousel-control-prev\");\n        var $nextArrow = $carousel.find(\".carousel-control-next\");\n\n        if (itemCarousel.length == 1) {\n          $prevArrow.removeClass(\"d-flex\").addClass(\"arrow-disabled\");\n          $nextArrow.removeClass(\"d-flex\").addClass(\"arrow-disabled\");\n        } else {\n          $prevArrow.removeClass(\"arrow-disabled\").addClass(\"d-flex\");\n          $nextArrow.removeClass(\"arrow-disabled\").addClass(\"d-flex\");\n\n          if ($indicators.first().hasClass(\"active\")) {\n            $prevArrow.removeClass(\"d-flex\").addClass(\"arrow-disabled\");\n          } else {\n            $prevArrow.removeClass(\"arrow-disabled\").addClass(\"d-flex\");\n          }\n\n          if ($indicators.last().hasClass(\"active\")) {\n            $nextArrow.removeClass(\"d-flex\").addClass(\"arrow-disabled\");\n          } else {\n            $nextArrow.removeClass(\"arrow-disabled\").addClass(\"d-flex\");\n          }\n        }\n      }\n\n      toggleCarouselArrows();\n      $(\".carousel-product-arrows-zoom a\").on(\"click\", function () {\n        setTimeout(toggleCarouselArrows, 500);\n      });\n\n      $(\".carousel-indicators li\").on(\"click\", function () {\n        setTimeout(toggleCarouselArrows, 500);\n      });\n    }  \n}\n\n\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    // console.log(\"product container :: \" + $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    if (response.product.discount>0) {\n        $('.prices.tec-bar-price .price-with-discount').append(`<span class=\"discount-container hide\"><span class=\"value\">-${response.product.discount}%</span></span>`);\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, attrObject) {\n    if ($productContainer.parent('.bonus-product-item').length <= 0) {  \n        if ($('.size-field.selected').length > 0) {          \n            var optionsHtml = quantities.map(function (quantity) {\n                var selected = quantity.selected ? ' selected ' : '';\n                return '<option value=\"' + quantity.value + '\"  data-url=\"' + quantity.url + '\"' +\n                    selected + '>' + quantity.value + '</option>';\n            }).join('');\n            if (window.customer.isB2B === false) {\n                // console.log(\"Pass trough B2C quantity update\");\n                getQuantitySelector($productContainer).empty().html(optionsHtml);\n            } else {\n                // console.log(\"Pass trough B2B quantity update\");\n                var selectSelector = \"select_quantity_\" + attrObject.id + \"_\" + attrObject.value;\n                \n                var quantityContainer = $('#' + selectSelector).parent('div');\n                $('#' + selectSelector).empty().html(optionsHtml);\n\n            }\n        }\n    }\n}\n\nfunction renderSizesView(sizeValues) {\n    for (let i = 0; i < sizeValues.variationAttributes.length; i++) {\n      const Attribute = sizeValues.variationAttributes[i];\n  \n      if (Attribute.attributeId === \"TEC_size\") {\n            $(\".select-all-size\").empty();\n            let htmlButton = \"\";\n            let htmlOption = \"\";\n\n            $.each(Attribute.values, function (index, attrValue) {\n                htmlButton += `\n                <div class=\"sizes-container\">\n                    <span class=\"size-field ${\n                    attrValue.selected && attrValue.selectable ? \"selected\" : \"\"\n                    } ${attrValue.selectable ? \"selectable\" : \"size-unselectable\"}\" data-attr-value=\"${attrValue.url}\" data-size-id=${attrValue.displayValue} data-product-id=\"${attrValue.quantitInStock.ID}\">\n                        ${attrValue.displayValue}\n                    </span>\n                </div>\n                `;\n                htmlOption += `\n                    <option class=\"${attrValue.selectable ? \"selectable\" : \"size-unselectable\"}\" ${\n                        attrValue.selected ? \"selected\" : \"\"} data-attr-value=\"${attrValue.displayValue}\" value=\"${attrValue.url}\">\n                        ${attrValue.displayValue}\n                    </option>\n                `;\n            });\n    \n            $(\".select-all-size\").html(htmlButton);\n            $(\"select.select-size\").html(htmlOption);\n            break;\n      }\n    }\n    var errorMessage = $('.size-error-message');\n    errorMessage.css('display', 'none');\n  }  \n\n  function renderQuantity(sizeValues) {\n    for (let i = 0; i < sizeValues.variationAttributes.length; i++) {\n      const Attribute = sizeValues.variationAttributes[i];\n  \n      if (Attribute.attributeId === \"TEC_size\") {\n            $(\".selectAllSizeB2B\").empty();\n            let B2bHtmlButton = \"\";\n\n            $.each(Attribute.values, function (index, attrValue) {\n                B2bHtmlButton += `\n                    <div class=\"d-flex justify-content-between align-items-center var-tec\">\n                        <div class=\"tec-var-stock js-availability-message-container-${attrValue.id}-${attrValue.value} align-items-center d-flex item\"\n                            data-text-available=\"${attrValue.quantitInStock.msg}\"\n                            data-text-unavailable=\"${attrValue.quantitInStock.msg}\">\n                            <div class=\"size-text ${attrValue.selectable ? \"b2b-size-selectable\" : \"b2b-size-unselectable\"}\" data-product-id=\"${attrValue.quantitInStock.ID}\">\n                                <span class=\"b2b-label-size\">${attrValue.displayValue}</span><br> \n                                <small class=\"availability-text js-availability-message-${attrValue.id}-${attrValue.value}\" data-stock=\"${attrValue.quantitInStock.stock}\">\n                                    ${attrValue.quantitInStock.msg}\n                                </small>\n                            </div>\n                        </div>\n                        <div class=\"tec-var-qunt quantity item\">\n                            <div class=\"size-selector-container b2b-customer\">\n                                ${generateStockOptions(attrValue.quantitInStock.stock,attrValue)}\n                            </div>\n                        </div> \n                    </div>\n                `;\n            });\n            $(\".selectAllSizeB2B\").html(B2bHtmlButton);\n      }\n    }\n    var errorMessage = $('.size-error-message');\n    errorMessage.css('display', 'none');\n\n    $('.size-selector-container').each(function () {\n        const $select = $(this).find('select');\n        $select.on('focusin', function(e) {\n            e.preventDefault();\n                $(this).addClass('focused');\n            })\n            .on('focusout', function(e) {\n                e.preventDefault();\n                    $(this).removeClass('focused');\n                });\n\n        $(this).find('.plus-btn').on('click', function () {\n            if ($select.prop('selectedIndex') < $select.find('option').length - 1) {\n                $select.prop('selectedIndex', $select.prop('selectedIndex') + 1).trigger('change');\n            }\n        });\n\n        $(this).find('.minus-btn').on('click', function () {\n            if ($select.prop('selectedIndex') > 0) {\n                $select.prop('selectedIndex', $select.prop('selectedIndex') - 1).trigger('change');\n            }\n        });\n    });\n  } \n\n  function generateStockOptions(stock, attrValue, productType) {\n    let options = '';\n    var attrId = $('.tec-qunt-b2b').data('attr-id');\n    if (!attrValue.selectable || !attrValue.listequanti || attrValue.listequanti.length === 0) {\n        options += `<option value=\"0\">0</option>`;\n    } else {\n        const maxStock = Math.min(stock, 50);\n\n        for (let i = 0; i <= maxStock; i++) {\n            const isSelected = attrValue.listequanti.includes(i) && attrValue.selectedQuantity === i ? 'selected' : '';\n            const urlData = productType !== 'bundle' ? `data-url=\"${attrValue.url}\"` : '';\n\n            options += `<option value=\"${i}\" ${urlData} ${isSelected}>${i}</option>`;\n        }\n    }\n    \n    const minusButton = $('.info-product').length > 0 ? `\n        <button type=\"button\" class=\"d-block d-sm-none quantity-btn minus-btn\">\n            <img class=\"d-lg-none\" src=\"${minusImgUrl}\" alt=\"Minus\" />\n        </button>` : '';\n\n    const plusButton = $('.info-product').length > 0 ? `\n        <button type=\"button\" class=\"d-block d-sm-none quantity-btn plus-btn\">\n            <img class=\"d-lg-none\" src=\"${plusImgUrl}\" alt=\"Plus\" />\n        </button>` : '';\n\n    return `\n        ${minusButton}\n        <select class=\"size-selector custom-select quantity-select form-control js-b2b-quantity-select \n            ${attrValue.listequanti && attrValue.listequanti.length === 1 && attrValue.listequanti[0] === 0 ? 'disabled-select' : ''}\"\n            name=\"quantities[${attrValue.index}]\"\n            id=\"select_quantity_${attrId}_${attrValue.value}\" \n            ${!attrValue.selectable ? 'disabled' : ''}\n            data-attr-value=\"${attrValue.value}\"\n            data-attr-id=\"${attrId}\" \n            data-available=\"true\">\n            ${options}\n        </select>\n        ${plusButton}\n        `;\n}\n\nfunction quickViewRender() {\n    if (window.customer.isB2B) {\n        var quantitySelector = $('.b2b-customer:not(.b2c-customer) .quantity-select');\n        if ($(\".js-b2b-quantity-select:not(.disabled-select)\").length > 0 && $('.js-b2b-quantity-select').val() == \"0\") {\n            $('.add-to-cart-global .label-select-size').removeClass('d-none').addClass('d-block');\n            $('.add-to-cart-global .label-add-to-cart').removeClass('d-block').addClass('d-none');\n            $('.label-select-size').parents('.add-to-cart-global').removeClass('btn-primary').addClass('btn-blue disabled-btn');\n        } else {\n            $('.add-to-cart-global .label-add-to-cart').removeClass('d-none').addClass('d-block');\n            $('.add-to-cart-global .label-select-size').removeClass('d-block').addClass('d-none');\n            $('.label-add-to-cart').parents('.add-to-cart-global').removeClass('btn-blue disabled-btn').addClass('btn-primary');\n        }\n        $('.js-b2b-quantity-select:not(.disabled-select)').on('change', function () {\n            var selectedValue = $(this).val();\n        \n            if (selectedValue !== \"0\") { \n                $('.add-to-cart-global .label-add-to-cart').removeClass('d-none').addClass('d-block');\n                $('.add-to-cart-global .label-select-size').removeClass('d-block').addClass('d-none');\n                $('.label-add-to-cart').parents('.add-to-cart-global').removeClass('btn-blue disabled-btn').addClass('btn-primary');\n            } else {\n                $('.add-to-cart-global').find('.label-select-size').removeClass('d-none').addClass('d-block');\n                $('.add-to-cart-global').find('.label-add-to-cart').removeClass('d-block').addClass('d-none');\n                $('.add-to-cart-global').removeClass('btn-primary').addClass('btn-blue disabled-btn');\n            }\n        });    \n\n        $('.js-b2b-quantity-select:not(.disabled-select)').each(function () {\n            if ($(this).val() !== \"0\") {\n                $('.add-to-cart-global .label-add-to-cart').removeClass('d-none').addClass('d-block');\n                $('.add-to-cart-global .label-select-size').removeClass('d-block').addClass('d-none');\n                $('.label-add-to-cart').parents('.add-to-cart-global').removeClass('btn-blue disabled-btn').addClass('btn-primary');\n            }\n        });\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, $target) {\n    if($productContainer.prevObject.attr('name')=='sort-order'){\n        return;\n    }\n\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                // dataLayerPushOld({\n                //     'event': 'productClick',\n                //     'ecommerce': {\n                //         'click': {\n                //             'products': [{\n                //                 'id': \"{\" + data.product.id + \"}\",\n                //                 'name': \"{\" + data.product.productName + \"}\",\n                //                 'price': \"{\" + data.product.price.sales.value + \"}\",\n                //                 'category': \"{\" + data.product.productData.category + \"}\",\n                //                 'brand': \"{\" + data.product.brand + \"}\",\n                //                 'variant': \"{\" + data.product.productData.variant + \"}\"\n                //             }]\n                //         }\n                //     }\n                // });\n                if (data.product.variationAttributes) {\n                    var selectedSize = $('.size-field.selected').data('size-id');\n                    renderSizesView(data.product); // Passer la couleur sélectionnée\n                    var NewSelectedSize = $('.size-field.selected').data('size-id');\n                    if (!window.customer.isB2B) {\n                        if ($target === 'color') {\n                            if ($('.size-field.selected').length > 0) {\n                                if (selectedSize != NewSelectedSize) {\n                                    $('.size-field.selected').removeClass('selected');\n                                    $(\"select.quantity-select\").html('<option value=\"0\">0</option>');\n                                }\n                            } else {\n                                if (selectedSize != NewSelectedSize) {\n                                    $(\"select.quantity-select\").html('<option value=\"0\">0</option>');\n                                }\n                            }\n                        }\n                    }\n                }\n                handleVariantResponse(data, $productContainer);\n                updateOptions(data.product.optionsHtml, $productContainer);\n                // if B2B pass attr ID & value as extra param to update product ID input field corresponding to selected variant value \n                if (window.customer.isB2B  && $target != 'color') {\n                    updateQuantities(data.product.quantities, $productContainer, {\n                        id: $target.attr('data-attr-id'),\n                        value: $target.attr('data-attr-value')\n                    });\n                    $('body').trigger('product:afterAttributeSelect', {\n                        data: data,\n                        container: $productContainer,\n                        attribute: {\n                            id: $target.attr('data-attr-id'),\n                            value: $target.attr('data-attr-value')\n                        }\n                    });\n                } else {\n                    updateQuantities(data.product.quantities, $productContainer);\n                    $('body').trigger('product:afterAttributeSelect', {\n                        data: data,\n                        container: $productContainer\n                    });\n                }\n                if (window.customer.isB2B  && $target === 'color') {\n                    renderQuantity(data.product);\n                    $('.quantity-select').select2({\n                        minimumResultsForSearch: -1,\n                    }).on('select2:open', () => {\n                        $(\".select2-container--default\").addClass('select2-b2b-quantity');\n                    });\n                    quickViewRender();\n                }\n                if ($('.size-unselectable.size-field').length > 0 ) {\n                    $('.show-back-in-stock').addClass('d-lg-block').removeClass('d-none');\n                } else {\n                    $('.show-back-in-stock').addClass('d-none').removeClass('d-lg-block');\n                }\n                if ($('.size-field.selected').length === 0 && $('.size-field').length > 0) {\n                    $(\"select.quantity-select\").html('<option value=\"0\">0</option>');\n                }\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 = $('<div>').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 = '<!-- Modal -->'\n        + '<div class=\"modal fade\" id=\"chooseBonusProductModal\" tabindex=\"-1\" role=\"dialog\">'\n        + '<span class=\"enter-message sr-only\" ></span>'\n        + '<div class=\"modal-dialog choose-bonus-product-dialog\" '\n        + 'data-total-qty=\"' + data.maxBonusItems + '\"'\n        + 'data-UUID=\"' + data.uuid + '\"'\n        + 'data-pliUUID=\"' + data.pliUUID + '\"'\n        + 'data-addToCartUrl=\"' + data.addToCartUrl + '\"'\n        + 'data-pageStart=\"0\"'\n        + 'data-pageSize=\"' + data.pageSize + '\"'\n        + 'data-moreURL=\"' + data.showProductsUrlRuleBased + '\"'\n        + 'data-bonusChoiceRuleBased=\"' + data.bonusChoiceRuleBased + '\">'\n        + '<!-- Modal content-->'\n        + '<div class=\"modal-content\">'\n        + '<div class=\"modal-header\">'\n        + '    <span class=\"\">' + data.labels.selectprods + '</span>'\n        + '    <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n        + '        <span aria-hidden=\"true\">&times;</span>'\n        + '        <span class=\"sr-only\"> </span>'\n        + '    </button>'\n        + '</div>'\n        + '<div class=\"modal-body\"></div>'\n        + '<div class=\"modal-footer\"></div>'\n        + '</div>'\n        + '</div>'\n        + '</div>';\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 if (response.stockError && response.unavailableProducts) {\n            unavailableProducts.forEach(function(idx, product){\n            var quantityInputID = \"quantities_\" + product.attribute.id + '_' + product.attribute.value;\n            $('input#' + quantityInputID).val(product.variant.id);\n            var _availableTxt = $('.js-availability-message-container-' + product.attribute.id + '-' + product.attribute.value ).attr('data-text-available');\n            var _unavailableTxt = $('.js-availability-message-container-' + product.attribute.id + '-' + product.attribute.value ).attr('data-text-unavailable');\n            var $txtContainer = $('.js-availability-message-' + product.attribute.id + '-' + product.attribute.value) ;\n            var $quantitySelect = $('#select_quantity_'  + product.attribute.id  + '_' +  product.attribute.value);\n            if (product.variant.available === true && product.variant.readyToOrder) {\n                $txtContainer.empty().text(_availableTxt);\n                $quantitySelect.data('available', true);\n            } else {\n                $txtContainer.empty().text(_unavailableTxt);\n                $quantitySelect.data('available', false);\n            }\n            updateQuantities(data.product.quantities, $productContainer, {\n                id: product.attribute.id,\n                value: product.attribute.value\n            });\n        });\n    } else {\n        if ($('.add-to-cart-messages').length === 0) {\n            $('body').append(\n                '<div class=\"add-to-cart-messages\"></div>'\n            );\n        }\n        \n        $('html, body').animate({\n            scrollTop: $('html').offset().top\n        }, 300);\n\n        setTimeout(function () {\n            $('.minicart').trigger('focusin');\n        },500);\n\n        setTimeout(function () {\n           $('.minicart .popover').removeClass('show');\n        },3500)\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, 'color');\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            // TEC-61 : do not control stock when selecting quantity for a variant (B2B case)\n            /* if ($(this).hasClass('js-b2b-quantity-select')) {\n                return false;\n            } */\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\n                attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n                    $productContainer, $(e.currentTarget));\n            }\n        });\n    },\n\n    addToCart: function () {\n        $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function (event) {\n         \n            var addToCartUrl;\n            var pid;\n            var pidsObj;\n            var setPids;\n\n            var $productContainer = $(this).closest('.product-detail');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n            }\n            var errorMessage = $productContainer.find('.size-error-message')[0],\n                sizeSelector = $productContainer.find('.custom-select.form-control.select-TEC_size')[0];\n            if(sizeSelector && errorMessage) {\n\n                var $variationContainer = $('.product-desc');\n                if ($(\".size-field.selected\").length == 0) {\n                    if (window.innerWidth < 544) {\n                        $('html, body').animate({\n                            scrollTop: $variationContainer.offset().top\n                        }, 500);\n                    }\n                    errorMessage.style.display = 'block';\n                    event.preventDefault();\n                    return;\n                } else {\n                    errorMessage.style.display = 'none';\n                }\n            }\n            if ($(this).hasClass('disabled-btn')) {\n                return\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            window.cart.pid = pid;\n\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            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            // TEC-90\n            var _quantitySelected = getQuantitySelected($(this));\n            var form = {\n                pid: pid,\n                pidsObj: pidsObj,\n                childProducts: getChildProducts(),\n            };\n            var _productVariants =$(this).data('variants');\n            // TEC-90\n            if (window.customer.isB2B && _productVariants) { \n                form.quantities = _quantitySelected.join(',');\n            } else {\n                form.quantity = _quantitySelected;\n            }\n\n            if (!$('.bundle-item').length) {\n                form.options = getOptions($productContainer);\n            }\n\n            $(this).trigger('updateAddToCartFormData', form);\n\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                        var productDataLayer = JSON.parse(data.productDataLayer);\n                        dataLayerPushOld({ ecommerce: null });\n                        dataLayerPushOld({\n                          'event': 'addToCart',\n                          'ecommerce': {\n                            'currencyCode': productDataLayer.currency,\n                            'add': {                                \n                              'products': [{                        \n                                'name': productDataLayer.name,\n                                'id': productDataLayer.id,\n                                'price': productDataLayer.price,\n                                'brand': productDataLayer.brand,\n                                'category': productDataLayer.category,\n                                'variant': productDataLayer.variant,\n                                'quantity': productDataLayer.quantity\n                               }]\n                            }\n                          }\n                        });\n\n                        dataLayerPush(data.gaDatalayer.addToCartEvent)\n\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                + '<div class=\"selected-pid row\" '\n                + 'data-pid=\"' + pid + '\"'\n                + 'data-qty=\"' + submittedQty + '\"'\n                + 'data-optionID=\"' + (optionID || '') + '\"'\n                + 'data-option-selected-value=\"' + (valueId || '') + '\"'\n                + '>'\n                + '<div class=\"col-sm-11 col-9 bonus-product-name\" >'\n                + $choiceOfBonusProduct.find('.product-name').html()\n                + '</div>'\n                + '<div class=\"col-1\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div>'\n                + '</div>'\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('<div class=\"add-to-cart-messages\"></div>');\n                        }\n                        $('.add-to-cart-messages').append(\n                            '<div class=\"alert alert-danger add-to-basket-alert text-center\"'\n                            + ' role=\"alert\">'\n                            + data.errorMessage + '</div>'\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('<div class=\"add-to-cart-messages\"></div>');\n                        }\n                        $('.minicart-quantity').html(data.totalQty);\n                        $('.add-to-cart-messages').append(\n                            '<div class=\"alert alert-success add-to-basket-alert text-center\"'\n                            + ' role=\"alert\">'\n                            + data.msgSuccess + '</div>'\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');\nvar processInclude = require('base/util');\nprocessInclude(require('./informationsProduct'));\n\n\n\n/**\n * Enable/disable UI elements\n * @param {boolean} enableOrDisable - true or false\n */\nfunction updateAddToCartEnableDisableOtherElements(enableOrDisable) {\n    $('button.add-to-cart-global').attr('disabled', enableOrDisable);\n}\n\n\nfunction SizeSelected() {\n    if (!window.customer.isB2B) {\n        var quantitySelector = $('.b2b-customer.b2c-customer .quantity-select');\n        if ($(\".size-field.selected\").length > 0) {\n            $('.add-to-cart .label-add-to-cart').removeClass('d-none').addClass('d-block');\n            $('.add-to-cart .label-select-size').removeClass('d-block').addClass('d-none');\n            $('.label-add-to-cart').parents('.add-to-cart').removeClass('btn-blue disabled-btn').addClass('btn-primary');\n        } else {\n            $('.add-to-cart .label-select-size').removeClass('d-none').addClass('d-block');\n            $('.add-to-cart .label-add-to-cart').removeClass('d-block').addClass('d-none');\n            $('.label-select-size').parents('.add-to-cart').removeClass('btn-primary').addClass('btn-blue disabled-btn');\n        }\n\n        if ($(\".size-field.selectable\").length == 0) {\n            $('.add-to-cart .label-add-to-cart').removeClass('d-none').addClass('d-block');\n            $('.add-to-cart .label-select-size').removeClass('d-block').addClass('d-none');\n            $('.label-add-to-cart').parents('.add-to-cart').removeClass('btn-blue disabled-btn').addClass('btn-primary disabled-btn');\n        }\n\n        if ($('.add-to-cart').parents('.attributes').find('.variation-container').hasClass('no-size')) {\n            $('.add-to-cart .label-add-to-cart').removeClass('d-none').addClass('d-block');\n            $('.add-to-cart .label-select-size').removeClass('d-block').addClass('d-none');\n            $('.label-add-to-cart').parents('.add-to-cart').removeClass('btn-blue disabled-btn').addClass('btn-primary');\n        }\n\n        if ($('.size-field').length > 0) { \n            if ($('.size-field.selected').length === 0) {\n                quantitySelector.prop('disabled', true).addClass('btn-qt-disabled');\n                $('.quantity-btn').addClass('btn-qt-disabled');\n            } else {\n                quantitySelector.prop('disabled', false).removeClass('btn-qt-disabled');\n                $('.quantity-btn').removeClass('btn-qt-disabled');\n            }\n        }\n        \n    } else {\n        var quantitySelector = $('.b2b-customer:not(.b2c-customer) .quantity-select');\n        if ($(\".js-b2b-quantity-select:not(.disabled-select)\").length > 0 && $('.js-b2b-quantity-select').val() == \"0\") {\n            $('.add-to-cart .label-select-size').removeClass('d-none').addClass('d-block');\n            $('.add-to-cart .label-add-to-cart').removeClass('d-block').addClass('d-none');\n            $('.label-select-size').parents('.add-to-cart').removeClass('btn-primary').addClass('btn-blue disabled-btn');\n        } else {\n            $('.add-to-cart .label-add-to-cart').removeClass('d-none').addClass('d-block');\n            $('.add-to-cart .label-select-size').removeClass('d-block').addClass('d-none');\n            $('.label-add-to-cart').parents('.add-to-cart').removeClass('btn-blue disabled-btn').addClass('btn-primary');\n        }\n        $('.js-b2b-quantity-select:not(.disabled-select)').on('change', function () {\n            var selectedValue = $(this).val();\n        \n            if (selectedValue !== \"0\") { \n                $('.add-to-cart .label-add-to-cart').removeClass('d-none').addClass('d-block');\n                $('.add-to-cart .label-select-size').removeClass('d-block').addClass('d-none');\n                $('.label-add-to-cart').parents('.add-to-cart').removeClass('btn-blue disabled-btn').addClass('btn-primary');\n            } else {\n                $(this).closest('.add-to-cart').find('.label-select-size').removeClass('d-none').addClass('d-block');\n                $(this).closest('.add-to-cart').find('.label-add-to-cart').removeClass('d-block').addClass('d-none');\n                $(this).closest('.add-to-cart').removeClass('btn-primary').addClass('btn-blue disabled-btn');\n            }\n        \n            var allZero = $('.js-b2b-quantity-select:not(.disabled-select)').toArray().every(function (select) {\n                return $(select).val() === \"0\";\n            });\n        \n            if (allZero) {\n                $('.add-to-cart .label-select-size').removeClass('d-none').addClass('d-block');\n                $('.add-to-cart .label-add-to-cart').removeClass('d-block').addClass('d-none');\n                $('.label-select-size').parents('.add-to-cart').removeClass('btn-primary').addClass('btn-blue disabled-btn');\n            }\n        });    \n\n        $('.js-b2b-quantity-select:not(.disabled-select)').each(function () {\n            if ($(this).val() !== \"0\") {\n                $('.add-to-cart .label-add-to-cart').removeClass('d-none').addClass('d-block');\n                $('.add-to-cart .label-select-size').removeClass('d-block').addClass('d-none');\n                $('.label-add-to-cart').parents('.add-to-cart').removeClass('btn-blue disabled-btn').addClass('btn-primary');\n            }\n        });\n    }\n}\nSizeSelected();\n\nmodule.exports = {\n    methods: {\n        updateAddToCartEnableDisableOtherElements: updateAddToCartEnableDisableOtherElements\n    },\n\n    availability: base.availability,\n\n    addToCart: base.addToCart,\n\n    updateAttributesAndDetails: function () {\n        $('body').on('product:statusUpdate', function (e, data) {\n            var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\n\n            $productContainer.find('.description-and-detail .product-attributes')\n                .empty()\n                .html(data.attributesHtml);\n\n            if (data.shortDescription) {\n                $productContainer.find('.description-and-detail .description')\n                    .removeClass('hidden-xl-down');\n                $productContainer.find('.description-and-detail .description .content')\n                    .empty()\n                    .html(data.shortDescription);\n            } else {\n                $productContainer.find('.description-and-detail .description')\n                    .addClass('hidden-xl-down');\n            }\n\n            if (data.longDescription) {\n                $productContainer.find('.description-and-detail .details')\n                    .removeClass('hidden-xl-down');\n                $productContainer.find('.description-and-detail .details .content')\n                    .empty()\n                    .html(data.longDescription);\n            } else {\n                $productContainer.find('.description-and-detail .details')\n                    .addClass('hidden-xl-down');\n            }\n        });\n    },\n\n    showSpinner: function () {\n        $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\n            $.spinner().start();\n        });\n    },\n    updateAttribute: function () {\n        $('body').on('product:afterAttributeSelect', function (e, response) {\n            if ($('.product-detail>.bundle-items').length) {\n                response.container.data('pid', response.data.product.id);\n                response.container.find('.product-id').text(response.data.product.id);\n            } else if ($('.product-set-detail').eq(0)) {\n                if (!window.customer.isB2B || !response.attribute) {\n                    response.container.data('pid', response.data.product.id);\n                    response.container.find('.product-id').text(response.data.product.id);\n                } else {\n                    var quantityInputID = \"quantities_\" + response.attribute.id + '_' + response.attribute.value;\n                    $('input#' + quantityInputID).val(response.data.product.id);\n                    var _availableTxt = $('.js-availability-message-container-' + response.attribute.id + '-' + response.attribute.value).attr('data-text-available');\n                    var _unavailableTxt = $('.js-availability-message-container-' + response.attribute.id + '-' + response.attribute.value).attr('data-text-unavailable');\n                    var $txtContainer = $('.js-availability-message-' + response.attribute.id + '-' + response.attribute.value) ;\n                    var $quantitySelect = $('#select_quantity_'  + response.attribute.id + '_' +  response.attribute.value);\n                    if (response.data.product.available === true && response.data.product.readyToOrder) {\n                        $txtContainer.empty().text(_availableTxt);\n                        $quantitySelect.data('available', true);\n                    } else {\n                        $txtContainer.empty().text(_unavailableTxt);\n                        $quantitySelect.data('available', false);\n                    }\n                }\n            } else {\n                $('.product-id').text(response.data.product.id);\n                $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\n            }\n            SizeSelected();\n        });\n        $(document).on(\"click\",\".size-field\", function(event) {\n            var $productContainer = $(this).closest('.product-detail');\n            var errorMessage = $productContainer.find('.size-error-message');\n            $(this).parents('.sizes-container-block').find('.select-size').val($(this).data(\"attr-value\")).trigger('change');\n            $(\".size-field\").removeClass(\"selected\");\n            $(this).addClass(\"selected\");\n            $('.quantity-select').removeClass('btn-qt-disabled');\n            $('.quantity-btn').removeClass('btn-qt-disabled');\n            $('.quantity-select').removeAttr('disabled');\n            errorMessage.css('display', 'none');\n        });\n    },\n    updateAddToCart: function () {\n        $('body').on('product:updateAddToCart', function (e, response) {\n\n            if (!window.customer.isB2B) {\n                // update local add to cart (for sets)\n                $('button.add-to-cart', response.$productContainer)\n                    .toggleClass('disabled-btn', (!response.product.readyToOrder || !response.product.available));\n                var enable = $('.product-availability').toArray().every(function (item) {\n                    return $(item).data('available') && $(item).data('ready-to-order');\n                });\n            } else {\n                // update local add to cart (for sets)\n                $('button.add-to-cart', response.$productContainer)\n                    .toggleClass('disabled-btn', (!response.product.readyToOrder || !response.product.available));\n                var enable = $('.js-b2b-quantity-select').toArray().every(function (item) {\n                    return $(item).data('available');\n\n                });\n            }\n            module.exports.methods.updateAddToCartEnableDisableOtherElements(!enable);\n        });\n    },\n    updateAvailability: function () {\n        $('body').on('product:updateAvailability', function (e, response) {\n            $('div.availability', response.$productContainer)\n                .data('ready-to-order', response.product.readyToOrder)\n                .data('available', response.product.available);\n\n            $('.availability-msg', response.$productContainer)\n                .empty().html(response.message);\n\n            if ($('.global-availability').length) {\n                var allAvailable = $('.product-availability').toArray()\n                    .every(function (item) { return $(item).data('available'); });\n\n                var allReady = $('.product-availability').toArray()\n                    .every(function (item) { return $(item).data('ready-to-order'); });\n\n                $('.global-availability')\n                    .data('ready-to-order', allReady)\n                    .data('available', allAvailable);\n\n                $('.global-availability .availability-msg').empty()\n                    .html(allReady ? response.message : response.resources.info_selectforstock);\n            }\n        });\n    },\n    sizeChart: function () {\n        $('.size-chart a').on('click', function (e) {\n            e.preventDefault();\n            var url = $(this).attr('href');\n            var $prodSizeChart = $(this).closest('.size-chart').find('.size-chart-collapsible');\n            if ($prodSizeChart.is(':empty')) {\n                $.ajax({\n                    url: url,\n                    type: 'get',\n                    dataType: 'json',\n                    success: function (data) {\n                        $prodSizeChart.append(data.content);\n                    }\n                });\n            }\n            $prodSizeChart.toggleClass('active');\n        });\n\n        var $sizeChart = $('.size-chart-collapsible');\n        $('body').on('click touchstart', function (e) {\n            if ($('.size-chart').has(e.target).length <= 0) {\n                $sizeChart.removeClass('active');\n            }\n        });\n    },\n    copyProductLink: function () {\n        $('body').on('click', '#fa-link', function () {\n            event.preventDefault();\n            var $temp = $('<input>');\n            $('body').append($temp);\n            $temp.val($('#shareUrl').val()).select();\n            document.execCommand('copy');\n            $temp.remove();\n            $('.copy-link-message').attr('role', 'alert');\n            $('.copy-link-message').removeClass('d-none');\n            setTimeout(function () {\n                $('.copy-link-message').addClass('d-none');\n            }, 3000);\n        });\n    },\n\n    DOMContentLoaded: function() {\n        var sizeSelector = $('.custom-select.select-TEC_size');\n        var quantitySelector = $('.quantity-select');\n        var addToCartButton = $('.add-to-cart');\n        var errorMessage = $('.size-error-message');\n        if (!window.customer.isB2B) {\n            if (errorMessage.length && sizeSelector.length) {\n                function checkSizeSelection(event) {\n                    if ($('.size-field.selected').length === 0) {\n                        event.preventDefault();\n                        errorMessage.css('display', 'block');\n                        quantitySelector.prop('disabled', true).addClass('btn-qt-disabled');\n                        $('.quantity-btn').addClass('btn-qt-disabled');\n                    } else {\n                        errorMessage.css('display', 'none');\n                        quantitySelector.prop('disabled', false).removeClass('btn-qt-disabled');\n                        $('.quantity-btn').removeClass('btn-qt-disabled');\n                    }\n                }\n            \n                sizeSelector.on('change', function () {\n                    if ($('.size-field.selected').length === 0) {\n                        errorMessage.css('display', 'none');\n                        quantitySelector.prop('disabled', false).removeClass('btn-qt-disabled');\n                        $('.quantity-btn').removeClass('btn-qt-disabled');\n                    }\n                });\n            \n                quantitySelector.on('click', checkSizeSelection);\n                addToCartButton.on('click', checkSizeSelection);\n            }        \n        } else {\n            function checkSizeSelectionb2b(event) {\n                var allZero = true;\n                event.preventDefault();\n                if ($('.js-b2b-quantity-select:not(:disabled)').length > 0) {\n                    $('.js-b2b-quantity-select:not(:disabled)').each(function () {\n                        if ($(this).val() !== '0') {\n                            allZero = false;\n                            return false;\n                        }\n                    });\n    \n                    var errorMessage = $('.size-error-message');\n                    if (allZero) {\n                        errorMessage.css('display', 'block');\n                    } else {\n                        errorMessage.css('display', 'none');\n                    }\n                }\n            }\n            addToCartButton.on('click', checkSizeSelectionb2b);\n        } \n\n        $('.quantity-btn').on('click', function (event) {\n            var quantitySelector = $('.quantity-select');\n            var errorMessage = $('.size-error-message');\n            if ($('.size-field').length > 0) { \n                if ($('.size-field.selected').length === 0) {\n                    event.preventDefault();\n                    errorMessage.css('display', 'block');\n                    quantitySelector.addClass('btn-qt-disabled');\n                    $('.quantity-btn').addClass('btn-qt-disabled');\n                } else {\n                    errorMessage.css('display', 'none');\n                    quantitySelector.removeClass('btn-qt-disabled');\n                    $('.quantity-btn').removeClass('btn-qt-disabled');\n                }\n            }\n        });\n        \n\n        $('.size-selector-container').each(function () {\n            const $select = $(this).find('select');\n            $select.on('focusin', function(e) {\n                e.preventDefault();\n                    $(this).addClass('focused');\n                })\n                .on('focusout', function(e) {\n                    e.preventDefault();\n                        $(this).removeClass('focused');\n                    });\n\n            $(this).find('.plus-btn').on('click', function () {\n                if ($select.prop('selectedIndex') < $select.find('option').length - 1) {\n                    $select.prop('selectedIndex', $select.prop('selectedIndex') + 1).trigger('change');\n                }\n            });\n\n            $(this).find('.minus-btn').on('click', function () {\n                if ($select.prop('selectedIndex') > 0) {\n                    $select.prop('selectedIndex', $select.prop('selectedIndex') - 1).trigger('change');\n                }\n            });\n        });\n    },\n\n    focusChooseBonusProductModal: base.focusChooseBonusProductModal()\n};\n\n$('.lien-complet').on('click', function(e) {\n    e.preventDefault();\n\n    var $header = $('header');\n    var $target = $('.informations-Product');\n\n    if ($target.length) {\n\n        var headerHeight = $header.outerHeight() || 0;\n\n        if ($(window).width() > 992) {\n            $('html, body').animate({\n                scrollTop: $target.offset().top - headerHeight\n            }, 800);\n        } else {\n            $('html, body').animate({\n                scrollTop: $target.offset().top\n            }, 800);\n        }\n    }\n});\n\nvar $ctaButton = $('.add-to-cart-scroll');\nvar $stickyBar = $('.sticky-bar-product');\nvar $header = $('header');\n\nfunction isPartiallyVisible($el) {\n    var winTop = $(window).scrollTop();\n    var elTop = $el.offset().top;\n    var headerHeight = $header.outerHeight();\n    return !(elTop >= winTop + headerHeight);\n}\n\nfunction toggleStickyBar() {\n    if ($(window).width() > 1024) {\n        if (isPartiallyVisible($ctaButton)) {\n            $stickyBar.fadeIn();\n        } else {\n            $stickyBar.fadeOut();\n        }\n    } else {\n        $stickyBar.hide();\n    }\n}\n\n$(window).on('scroll', toggleStickyBar);\n$(window).on('resize', toggleStickyBar);\n\n$(document).on('click', '.sticky-bar-product .add-to-cart', function (event) {\n    var $productContainer = $(this).closest('.product-detail');\n    var $errorMessage = $productContainer.find('.size-error-message');\n    var $variationContainer = $('.info-product');\n\n    if ($('.size-field.selected').length === 0) {\n        if (window.innerWidth > 544) {\n            $('html, body').animate({\n                scrollTop: $variationContainer.offset().top\n            }, 500);\n        }\n        $errorMessage.css('display', 'block');\n        event.preventDefault();\n        return;\n    } else {\n        $errorMessage.css('display', 'none');\n    }\n});\n\n$(document).on('click', '.zoom-icon-js', function (event) {\n    event.preventDefault();\n    let currentIndexPosition = parseInt($('.carousel-indicators li.active').attr('data-slide-to')) || 0;\n    openModal(currentIndexPosition);\n})\n\nfunction openModal(currentIndex) {\n    const $imagesPrimary = $('#imageGalleryModal .carousel-item');\n    const $imagesModal = $('#imageGalleryModal .js-carousel-item');\n    const $currentImageElement = $('#currentImage');\n    const $totalImagesElement = $('#totalImages');\n    const $prevButton = $('#prevImage');\n    const $nextButton = $('#nextImage');\n    const totalImages = $imagesModal.length;\n\n    $totalImagesElement.text(totalImages);\n\n    const updateGallery = () => {\n        $imagesPrimary.removeClass('active').eq(currentIndex).addClass('active');\n        $('.carousel-indicators li').removeClass('active').eq(currentIndex).addClass('active');\n        $('.pdpCarousel .carousel-inner').removeClass('active').eq(currentIndex).addClass('active');\n        $('.js-pdp-carousel').find('.carousel-item').removeClass('active').eq(currentIndex).addClass('active');\n        $imagesModal.removeClass('active').eq(currentIndex).addClass('active');\n        $currentImageElement.text(currentIndex + 1);\n        $prevButton.toggleClass('d-none', currentIndex === 0);\n        $nextButton.toggleClass('d-none', currentIndex === totalImages - 1);\n    };\n\n    $prevButton.on('click', () => {\n        if (currentIndex > 0) {\n            currentIndex--;\n            updateGallery();\n        }\n    });\n\n    $nextButton.on('click', () => {\n        if (currentIndex < totalImages - 1) {\n            currentIndex++;\n            updateGallery();\n        }\n    });\n\n    $imagesPrimary.on('click', function () {\n        currentIndex = $imagesPrimary.index(this);\n        updateGallery();\n    });\n    \n    updateGallery();\n    $('#imageGalleryModal').modal('show');\n}\n\nfunction resetForm() {\n    $('.tec-backinstock-size input[name=\"variantIds\"]').prop('checked', false);\n    $('.error-email-message').addClass('d-none');\n    $('.alert-send-email-bis').addClass(\"d-none\");\n    $('#email').val('');\n}\n\n$('.add-to-back-in-stock').on('click', function (e) {\n    e.preventDefault();\n\n    $('.error-email-message').addClass('d-none');\n    $('.control-form-email').removeClass('error');\n    $('.alert-send-email-bis').addClass(\"d-none\");\n\n    let isValid = true;\n\n    const sizeSelected = $('.tec-backinstock-size input[name=\"variantIds\"]:checked').length > 0;\n    if (!sizeSelected) {\n        $('.tec-backinstock-container .error-email-message').removeClass('d-none');\n        isValid = false;\n\n        if ($('.tec-backinstock-size input[name=\"variantIds\"]').length === 0) {\n            isValid = true;\n        }\n    }\n\n    const emailInput = $('#email').val().trim();\n    const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n    if (!emailInput || !emailRegex.test(emailInput)) {\n        $('.tec-mail-alerte + .error-email-message').removeClass('d-none');\n        $('.control-form-email').addClass('error');\n        isValid = false;\n    }\n\n    if (isValid) {\n        const formData = $('.back-in-stock-form').serialize();\n        const actionUrl = $('.back-in-stock-form').attr('action');\n\n        $.ajax({\n            url: actionUrl,\n            type: 'POST',\n            data: formData,\n            success: function (response) {\n                if(response.success) {\n                    $('.alert-send-email-bis').alert();\n                    $('.alert-send-email-bis').removeClass(\"d-none\");\n                }\n            },\n            error: function () {\n                alert('Une erreur s\\'est produite. Veuillez réessayer.');\n            }\n        });\n    }\n});\n\n\n$(document).on('click', '.subscribe-back-in-stock', function (event) {\n    if (!window.customer.isB2B) {\n        $('.tec-backinstock-size').empty();\n\n        $('.select-all-size .size-unselectable').each(function() {\n            var dataValue = $(this).data('product-id');\n            var sizeText = $(this).text().trim();\n            var newLabel = `\n                <label class=\"size-option\">\n                    <input type=\"checkbox\" name=\"variantIds\" value=\"${dataValue}\">\n                    <span>${sizeText}</span>\n                </label>\n            `;\n            $('.tec-backinstock-size').append(newLabel);\n        });\n    } else {\n        $('.tec-backinstock-size').empty();\n\n        $('.b2b-customer .b2b-size-unselectable').each(function() {\n            var dataValue = $(this).data('product-id');\n            var sizeText = $(this).find('.b2b-label-size').text().trim();\n            var newLabel = `\n                <label class=\"size-option\">\n                    <input type=\"checkbox\" name=\"variantIds\" value=\"${dataValue}\">\n                    <span>${sizeText}</span>\n                </label>\n            `;\n            $('.tec-backinstock-size').append(newLabel);\n        });\n    }\n});\n\nfunction toggleSubscribeBackInStockB2b() {\n    if ($('.b2b-size-unselectable').length > 0 ) {\n        $('.show-back-in-stock-b2b').addClass('d-lg-block').removeClass('d-none');\n    } else {\n        $('.show-back-in-stock-b2b').addClass('d-none').removeClass('d-lg-block');\n    }\n}\n\ntoggleSubscribeBackInStockB2b();\n\n$('.size-field').on('click', function() {\n    toggleSubscribeBackInStockB2b();\n});\n\nfunction toggleSubscribeBackInStock() {\n    if ($('.size-unselectable.size-field').length > 0 ) {\n        $('.show-back-in-stock').addClass('d-lg-block').removeClass('d-none');\n    } else {\n        $('.show-back-in-stock').addClass('d-none').removeClass('d-lg-block');\n    }\n}\n\ntoggleSubscribeBackInStock();\n\n$('.size-field').on('click', function() {\n    toggleSubscribeBackInStock();\n});\n\n$(document).on('click', '#cartIconBtn', function (event) {\n    $('#backInStockAlert').modal('hide');\n    resetForm();\n});\n\n\n$('.js-close-success-message').on('click', function () {\n    $('#backinstock-success-message').modal('hide');\n});\n\n$('.tec-badge span').each(function() {\n    if ($(this).text().trim() !== '') {\n        $(this).closest('.tec-badge').addClass('badge-exist');\n    }\n});\n\nif ($('.size-field.selected').length === 0 && $('.size-field').length > 0) {\n    $(\"select.quantity-select\").html('<option value=\"0\">0</option>');\n}","'use strict';\n\n\n$(document).ready(function () {\n    const $tabs = $('.tab');\n    const $contents = $('.content-onglet');\n    const $containerInfo = $('.tabs').parents('.product-info');\n\n    var tabCount = $('.product-info .tab').length;\n\n    if ($(window).width() > 840) {\n\n        if (tabCount === 1) {\n            $('.product-info .tab').css('width', '100%');\n        } else if (tabCount === 2) {\n            $('.product-info .tab').css('width', '50%');\n        } else if (tabCount === 3) {\n            $('.product-info .tab:first-child').css('width', '33%');\n            $('.product-info .tab:nth-child(2)').css('width', '34%');\n            $('.product-info .tab:last-child').css('width', '33%');\n        } else if (tabCount === 4) {\n            $('.product-info .tab').css('width', '25%');\n        }\n    }\n\n    // Vérifier le nombre d'onglets visibles\n    if ($tabs.length <= 1) {\n        // Si un seul onglet ou moins, masquer la barre d'onglets\n        $tabs.parents('.tabs-wrapper').removeClass('d-flex').addClass('d-none');\n    } else {\n        // Initialiser le premier onglet actif\n        $('.tabs .tab').first().addClass('show-first');\n        $('.tab-content .content-onglet').first().addClass('first-content-show');\n        $('.show-first').addClass('active');\n        $('.first-content-show').addClass('active fade in').show();\n        $tabs.parents('.tabs-wrapper').removeClass('d-none').addClass('d-flex');\n\n        // Gérer le clic sur les onglets\n        $tabs.on('click', function () {\n            const $tab = $(this);\n            const targetId = $tab.data('tab');\n\n            if ($tab.hasClass('active')) return;\n\n            $tabs.removeClass('active');\n            $tab.addClass('active');\n\n            $contents.filter('.active').removeClass('active').fadeOut(50, function () {\n                $('#' + targetId)\n                    .addClass('active')\n                    .fadeIn(100);\n            });\n            $contents.filter('.active').removeClass('fade in').fadeOut(100, function () {\n                $('#' + targetId)\n                    .addClass('fade in')\n                    .fadeIn(100);\n            });\n            if ($(window).width() < 840) {\n                setTimeout(function () {\n                    $(\".informations-Product .videos\").slick({\n                        slidesToShow: 2,\n                        slidesToScroll: 1,\n                        infinite: true,\n                        dots: true,\n                        arrows: false,\n                        responsive: [\n                            {\n                                breakpoint: 840,\n                                settings: {\n                                    slidesToShow: 1,\n                                    infinite: true\n                                }\n                            }\n                        ]\n                    });\n                }, 200);\n            }\n        });\n    }\n\n    var $buttonShowMore = $containerInfo.data('show-more');\n    var $buttonShowLess = $containerInfo.data('show-less');\n\n    $('.text-block .slide-read-more').expander({\n        slicePoint: 500,\n        expandText: $buttonShowMore,\n        userCollapseText: $buttonShowLess,\n        expandEffect: 'slideDown',\n        collapseEffect: 'slideUp',\n        expandSpeed: 0,\n        collapseSpeed: 0\n    });\n});\n\n\n$(\".videos .info-videos a\").each(function () {\n    $(this).on(\"click\", function (e) {\n        e.preventDefault();\n\n        var titleVideo = $(this).find(\".title-video\").text();\n        var linkVideo = $(this).attr(\"href\");\n\n        var videoId = linkVideo.split(\"v=\")[1];\n        var ampersandPosition = videoId.indexOf(\"&\");\n        if (ampersandPosition !== -1) {\n            videoId = videoId.substring(0, ampersandPosition);\n        }\n\n        var iframeLink = `https://www.youtube.com/embed/${videoId}`;\n\n        $(\".show-video-info .modal-body .title-video\").html(titleVideo);\n\n        var contentVideo = `<iframe width=\"536\" height=\"302\" src=\"${iframeLink}\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>`;\n\n        $(\".show-video-info .modal-body .iframe-video\").empty().html(contentVideo);\n    });\n});\n\n$('.videos').on('init reInit afterChange', function () {\n    $(\".videos .info-videos a\").off(\"click\").on(\"click\", function (e) {\n        e.preventDefault();\n\n        var titleVideo = $(this).find(\".title-video\").text();\n        var linkVideo = $(this).attr(\"href\");\n\n        var videoId = linkVideo.split(\"v=\")[1];\n        var ampersandPosition = videoId.indexOf(\"&\");\n        if (ampersandPosition !== -1) {\n            videoId = videoId.substring(0, ampersandPosition);\n        }\n\n        var iframeLink = `https://www.youtube.com/embed/${videoId}`;\n\n        $(\".show-video-info .modal-body .title-video\").html(titleVideo);\n\n        var contentVideo = `<iframe width=\"536\" height=\"302\" src=\"${iframeLink}\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>`;\n\n        $(\".show-video-info .modal-body .iframe-video\").empty().html(contentVideo);\n    });\n});\n","\"use strict\";\n\nmodule.exports = {\n  productInfo: function () {\n    if ($(window).width() > 840) {\n      var $sizesContainer = $(\".select-all-size .sizes-container\");\n      var $toggleButton = $(\"#toggle-sizes\");\n\n      // Vérifier le nombre d'éléments\n      if ($sizesContainer.length <= 8) {\n        $toggleButton.addClass(\"d-none\");\n      } else {\n        $toggleButton.removeClass(\"d-none\").addClass(\"d-block\");\n      }\n\n      // Créer un conteneur pour les éléments restants\n      var $extraContainer = $('<div class=\"select-all-size\"></div>');\n      $sizesContainer.slice(8).appendTo($extraContainer); // Déplacer les éléments dans la nouvelle div\n\n      // Insérer le conteneur avant le bouton\n      $extraContainer.insertBefore($toggleButton);\n      $extraContainer.hide(); // Masquer par défaut\n\n      var isExpanded = false;\n\n      // Obtenir les textes des boutons\n      var $buttonShowMore = $toggleButton.data(\"show-more\");\n      var $buttonShowLess = $toggleButton.data(\"show-less\");\n\n      // Gérer le clic sur le bouton\n      $toggleButton.on(\"click\", function () {\n        if (!isExpanded) {\n          $extraContainer.stop(true, true).slideDown(300); // Afficher tous les éléments restants\n          $(this).text($buttonShowLess);\n        } else {\n          $extraContainer.stop(true, true).slideUp(300); // Cacher tous les éléments restants\n          $(this).text($buttonShowMore);\n        }\n        isExpanded = !isExpanded;\n      });\n\n      var heightProduct = $(\n        \".product-view-carousel .carousel-inner\"\n      ).outerHeight();\n      $(\".product-view-carousel .carousel-indicators\").css({\n        \"max-height\": heightProduct,\n        \"overflow-y\": \"scroll\",\n      });\n\n      $(\".product-view-carousel .carousel-indicators\").css({\n        \"-ms-overflow-style\": \"none\",\n        \"scrollbar-width\": \"none\",\n      });\n\n      $(\".product-view-carousel .carousel-indicators::-webkit-scrollbar\").css({\n        display: \"none\",\n      });\n    }\n\n    function toggleCarouselArrows() {\n      var $carousel = $(\".product-view-carousel\");\n      var itemCarousel = $carousel.find(\".carousel-item\");\n      var $indicators = $carousel.find(\".carousel-indicators li\");\n      var $prevArrow = $carousel.find(\".carousel-control-prev\");\n      var $nextArrow = $carousel.find(\".carousel-control-next\");\n\n      if (itemCarousel.length == 1) {\n        $prevArrow.removeClass(\"d-flex\").addClass(\"arrow-disabled\");\n        $nextArrow.removeClass(\"d-flex\").addClass(\"arrow-disabled\");\n      } else {\n        $prevArrow.removeClass(\"arrow-disabled\").addClass(\"d-flex\");\n        $nextArrow.removeClass(\"arrow-disabled\").addClass(\"d-flex\");\n\n        if ($indicators.first().hasClass(\"active\")) {\n          $prevArrow.removeClass(\"d-flex\").addClass(\"arrow-disabled\");\n        } else {\n          $prevArrow.removeClass(\"arrow-disabled\").addClass(\"d-flex\");\n        }\n\n        if ($indicators.last().hasClass(\"active\")) {\n          $nextArrow.removeClass(\"d-flex\").addClass(\"arrow-disabled\");\n        } else {\n          $nextArrow.removeClass(\"arrow-disabled\").addClass(\"d-flex\");\n        }\n      }\n    }\n\n    toggleCarouselArrows();\n\n    $(\".carousel-product-arrows-zoom a\").on(\"click\", function () {\n      setTimeout(toggleCarouselArrows, 500);\n    });\n\n    $(\".carousel-indicators li\").on(\"click\", function () {\n      setTimeout(toggleCarouselArrows, 500);\n    });\n\n    var selectedColor = $(\".color-attribute.selected\").data(\"color-selected\");\n    $(\".label-size .color-selected\").empty().text(selectedColor);\n    $(\".label-size .selected-label\").removeClass(\"d-none\");\n\n    $(document).on(\"click\", \".color-attribute\", function () {\n      var selectedColor = $(this).data(\"color-selected\");\n\n      $(\".label-size .color-selected\").empty().text(selectedColor);\n\n      $(\".label-size .selected-label\").removeClass(\"d-none\");\n\n      $(\".color-attribute\").removeClass(\"selected\").prop(\"disabled\", false);\n      $(this).addClass(\"selected\").prop(\"disabled\", true);\n    });\n\n    $(\".color-attribute\").prop(\"disabled\", false);\n    $(\".color-attribute.selected\").prop(\"disabled\", true);\n\n    var viewSize = $(window).width();\n    if(viewSize > 769) {\n      var heightOfHeader = $('header').outerHeight();\n      var heightbreadCrumb = $('.breadcrumb').outerHeight();\n      var $firstChildBlock = $('.tec-detail .first-part-scrolling-pdp');\n  \n      $firstChildBlock.css('top',(heightOfHeader + heightbreadCrumb) + 'px');\n  \n      var $childBlock = $('.tec-detail .second-part-scrolling-pdp');\n      var childHeight = $childBlock.outerHeight(true);\n    }\n\n    if ($('.size-unselectable.size-field').length > 0 ) {\n      $('.show-back-in-stock').addClass('d-lg-block').removeClass('d-none');\n    } else {\n      $('.show-back-in-stock').addClass('d-none').removeClass('d-lg-block');\n    }\n  }\n};\n\n// Appeler la fonction directement\nmodule.exports.productInfo();\n","'use strict';\n\nvar processInclude = require('base/util');\n\n(function ($) {\n    $(document).ready(function () {\n        processInclude(require('./product/detail'));\n        processInclude(require('./product/product'));\n    });\n})(jQuery);\n\n"],"sourceRoot":""}