{"version":3,"file":"default/js/productDetail.js","mappings":";;;;;;;;;;AAAA;AACa;;;AAGb;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;;;;;;;;;;;;AC/DA;AACa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,sBAAsB;AACpC;;AAEA;AACA;AACA;AACA,WAAW,yBAAyB;AACpC,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8CAA8C,WAAW,EAAE,mBAAmB;AAC9E;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,cAAc,qDAAqD;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;;AAEA,aAAa;AACb;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA,WAAW,kBAAkB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,qCAAqC;AACrC,+CAA+C;AAC/C;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,cAAc;AACd;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,yBAAyB;AACzB,sBAAsB;AACtB;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;;;;;;;;;;;;ACx5Ba;AACb,WAAW,mBAAO,CAAC,wFAAQ;;AAE3B;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,6CAA6C,mCAAmC;;AAEhF;AACA,6CAA6C,wCAAwC;;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;;;;;;;;;;;;ACnJa;;AAEb,WAAW,mBAAO,CAAC,wFAAQ;AAC3B,aAAa,mBAAO,CAAC,4FAAU;;AAE/B,+BAA+B,kBAAkB;;AAEjD;;;;;;;;;;;;ACPa;;AAEb,mBAAO,CAAC,qDAAO;;AAEf,oBAAoB,mBAAO,CAAC,2GAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gEAAgE;;AAEhE;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;;;;;;;;;;;ACvGA;AACA;AACA;;AAEA;AACA,4CAA4C,qBAAqB;AACjE;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACXa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClCa;AACb,kBAAkB,mBAAO,CAAC,6GAAqB;;AAE/C;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,sBAAsB;AACpC;;AAEA;AACA;AACA;AACA,WAAW,yBAAyB;AACpC,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,cAAc,qDAAqD;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;;AAEA,aAAa;AACb;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;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,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA,WAAW,kBAAkB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;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,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;;;;;;;;;;;AC/0BA;AACa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,SAAS;;AAET;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;;AAET;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,aAAa;AACxB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB,2DAA2D;;AAE3D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;ACvQa;;AAEb;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;ACZa;;AAEb,WAAW,mBAAO,CAAC,uGAAmB;;AAEtC;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;;;;;;;;;;;;ACjFa;;AAEb,mBAAmB,mBAAO,CAAC,iIAAgC;;AAE3D;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,uDAAuD,sBAAsB;AAC7E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA,aAAa;;AAEb;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB,uDAAuD;AACvD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;ACpRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,oBAAoB,6BAA6B,4BAA4B,sDAAsD,SAAS,sMAAsM,wBAAwB,cAAc,gBAAgB,cAAc,sHAAsH,kIAAkI,kCAAkC,cAAc,+BAA+B,OAAO,kHAAkH,cAAc,MAAM,6GAA6G,mEAAmE,GAAG,qBAAqB,mCAAmC,mCAAmC,wBAAwB,yIAAyI,eAAe,iCAAiC,WAAW,mBAAmB,EAAE,iBAAiB,QAAQ,qNAAqN,iBAAiB,SAAS,eAAe,eAAe,cAAc,kCAAkC,sSAAsS,iBAAiB,SAAS,eAAe,4EAA4E,iBAAiB,mLAAmL,cAAc,qEAAqE,eAAe,yCAAyC,gBAAgB,yBAAyB,2PAA2P,iBAAiB,oDAAoD,sDAAsD,0EAA0E,yBAAyB,UAAU,iCAAiC,qCAAqC,MAAM,sCAAsC,MAAM,wCAAwC,MAAM,+CAA+C,oBAAoB,8JAA8J,0BAA0B,QAAQ,uOAAuO,2BAA2B,+VAA+V,QAAQ,QAAQ,6IAA6I,gDAAgD,2EAA2E,8BAA8B,4HAA4H,UAAU,uFAAuF,sCAAsC,4DAA4D,mIAAmI,iCAAiC,qHAAqH,0CAA0C,yJAAyJ,8CAA8C,MAAM,oCAAoC,MAAM,qCAAqC,MAAM,sCAAsC,MAAM,wCAAwC,MAAM,+CAA+C,gYAAgY,wCAAwC,0HAA0H,2BAA2B,6QAA6Q,wCAAwC,sNAAsN,wCAAwC,UAAU,wCAAwC,SAAS,2BAA2B,qIAAqI,sEAAsE,cAAc,SAAS,+MAA+M,0CAA0C,MAAM,4CAA4C,eAAe,EAAE,MAAM,iCAAiC,+HAA+H,UAAU,SAAS,UAAU,SAAS,UAAU,6BAA6B,UAAU,iEAAiE,+EAA+E,MAAM,wEAAwE,MAAM,yEAAyE,MAAM,6CAA6C,MAAM,8CAA8C,OAAO,aAAa,2BAA2B,6GAA6G,8MAA8M,8BAA8B,SAAS,UAAU,SAAS,UAAU,4CAA4C,UAAU,oEAAoE,UAAU,4JAA4J,2CAA2C,WAAW,kNAAkN,sGAAsG,EAAE,2BAA2B,kCAAkC,gBAAgB,mKAAmK,iBAAiB,SAAS,eAAe,2BAA2B,8BAA8B,wBAAwB,+BAA+B,0BAA0B,gCAAgC,yBAAyB,8BAA8B,2BAA2B,6CAA6C,0BAA0B,0BAA0B,mBAAmB,GAAG,6BAA6B,8CAA8C,2BAA2B,0BAA0B,4BAA4B,4BAA4B,uBAAuB,sBAAsB,2WAA2W,oEAAoE,kCAAkC,yBAAyB,gBAAgB,2BAA2B,wKAAwK,KAAK,QAAQ,yBAAyB,6BAA6B,YAAY,mBAAmB,QAAQ,KAAK,mBAAmB,OAAO,iCAAiC,0BAA0B,iBAAiB,cAAc,4NAA4N,8FAA8F,uDAAuD,WAAW,GAAG,yDAAyD,qKAAqK,kNAAkN,cAAc,wFAAwF,QAAQ,kBAAkB,iCAAiC,8BAA8B,sBAAsB,wBAAwB,8DAA8D,eAAe,+CAA+C,iCAAiC,8DAA8D,eAAe,kEAAkE,EAAE,2BAA2B,SAAS,8DAA8D,eAAe,+CAA+C,EAAE,0EAA0E,uBAAuB,6hBAA6hB;;;;;;UCPzmZ;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;;;;;;ACtBA;;AAEa;;AAEb,uBAAuB,mBAAO,CAAC,uFAAW;;AAE1C;AACA,mBAAmB,mBAAO,CAAC,sGAAmB;AAC9C,mBAAmB,mBAAO,CAAC,0GAAqB;AAChD,mBAAmB,mBAAO,CAAC,sJAAkD;AAC7E,mBAAmB,mBAAO,CAAC,sIAA0C;AACrE,mBAAmB,mBAAO,CAAC,kHAAyB;AACpD,CAAC","sources":["webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/components/swatchHide.js","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/product/base.js","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/product/detail.js","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/product/details.js","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/product/initXZoom.js","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/utils/breakpoints.js","webpack://sfra-startup-kit/./cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack://sfra-startup-kit/./cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack://sfra-startup-kit/./cartridges/app_storefront_base/cartridge/client/default/js/storeLocator/storeLocator.js","webpack://sfra-startup-kit/./cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack://sfra-startup-kit/./cartridges/plugin_giftregistry/cartridge/client/default/js/product/giftRegistry.js","webpack://sfra-startup-kit/./cartridges/plugin_instorepickup/cartridge/client/default/js/product/pdpInstoreInventory.js","webpack://sfra-startup-kit/./node_modules/xzoom/dist/xzoom.min.js","webpack://sfra-startup-kit/webpack/bootstrap","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/productDetail.js"],"sourcesContent":["/* eslint-disable no-undef */\n\"use strict\";\n\n\n// Call the function to set up the hover effect\n$(document).ready(function () {\n checkPdpSwatchImages();\n});\n\nfunction checkPdpSwatchImages() {\n // Select all PDP tiles that contain swatches\n const pdpTiles = document.querySelectorAll(\".pdp-attributes\");\n\n pdpTiles.forEach(tile => {\n // Select all swatches within the current tile\n const swatches = tile.querySelectorAll(\".color-attribute\");\n\n swatches.forEach(swatch => {\n const img = swatch.querySelector(\"img\");\n if (img) {\n // Add an event listener for the error event\n img.addEventListener(\"error\", function () {\n checkImageStatus(img.src, function (is404) {\n if (is404) {\n swatch.classList.add(\"d-none\");\n }\n });\n });\n\n // Check if the image is already broken after it has loaded\n img.addEventListener(\"load\", function () {\n if (!img.complete || img.naturalWidth === 0) {\n checkImageStatus(img.src, function (is404) {\n if (is404) {\n swatch.classList.add(\"d-none\");\n }\n });\n }\n });\n\n // If the image is already loaded and broken, hide the swatch\n if (img.complete && img.naturalWidth === 0) {\n checkImageStatus(img.src, function (is404) {\n if (is404) {\n swatch.classList.add(\"d-none\");\n }\n });\n }\n } else {\n swatch.classList.add(\"d-none\");\n }\n });\n });\n}\n\nfunction checkImageStatus(url, callback) {\n fetch(url)\n .then(response => {\n callback(response.status === 404);\n })\n .catch(() => {\n callback(true);\n });\n}\n","/* eslint-disable no-undef */\n\"use strict\";\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() || $($el).data(\"pid\");\n } else {\n pid = $(\".product-detail:not(\\\".bundle-item\\\")\").data(\"pid\");\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n var quantitySelected;\n if ($el && $(\".set-items\").length) {\n quantitySelected = $($el).closest(\".product-detail\").find(\".quantity-select\");\n } else if ($el && $(\".product-bundle\").length) {\n var quantitySelectedModal = $($el).closest(\".modal-footer\").find(\".quantity-select\");\n var quantitySelectedPDP = $($el).closest(\".bundle-footer\").find(\".quantity-select\");\n if (quantitySelectedModal.val() === undefined) {\n quantitySelected = quantitySelectedPDP;\n } else {\n quantitySelected = quantitySelectedModal;\n }\n } else {\n quantitySelected = $(\".quantity-select\");\n }\n return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find(\"[data-attr=\\\"\" + attr.id + \"\\\"] [data-attr-value=\\\"\" +\n attrValue.value + \"\\\"]\");\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass(\"selected\");\n $attrValue.siblings(\".selected-assistive-text\").text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass(\"selected\");\n $attrValue.siblings(\".selected-assistive-text\").empty();\n }\n\n if (attrValue.url) {\n $swatchButton.attr(\"data-url\", attrValue.url);\n } else {\n $swatchButton.removeAttr(\"data-url\");\n }\n\n // Disable if not selectable\n $attrValue.removeClass(\"selectable unselectable\");\n\n $attrValue.addClass(attrValue.selectable ? \"selectable\" : \"unselectable\");\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n var $attr = \"[data-attr=\\\"\" + attr.id + \"\\\"]\";\n var $defaultOption = $productContainer.find($attr + \" .select-\" + attr.id + \" option:first\");\n $defaultOption.attr(\"value\", attr.resetUrl);\n\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + \" [data-attr-value=\\\"\" + attrValue.value + \"\\\"]\");\n $attrValue.attr(\"value\", attrValue.url)\n .removeAttr(\"disabled\");\n\n if (!attrValue.selectable) {\n $attrValue.attr(\"disabled\", true);\n }\n });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = [\"color\"];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n processNonSwatchValues(attr, $productContainer);\n }\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = \"\";\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = \"
  • \" + response.resources.info_selectforstock + \"
  • \";\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += \"
  • \" + message + \"
  • \";\n });\n }\n\n $($productContainer).trigger(\"product:updateAvailability\", {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return \"\";\n }\n\n var html = \"\";\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === \"mainAttributes\") {\n attributeGroup.attributes.forEach(function (attribute) {\n html += \"
    \" + attribute.label + \": \"\n + attribute.value + \"
    \";\n });\n }\n });\n\n return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n// Update options\n $productContainer.find(\".product-options\").empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n var carousel = $productContainer.find(\".carousel\");\n $(carousel).carousel(\"dispose\");\n var carouselId = $(carousel).attr(\"id\");\n $(carousel).empty().append(\"
      \" + $(carousel).data(\"prev\") + \"\" + $(carousel).data(\"next\") + \"\");\n for (var i = 0; i < imgs.length; i++) {\n $(\"
      \\\"\"
      \").appendTo($(carousel).find(\".carousel-inner\"));\n $(\"
    1. \").appendTo($(carousel).find(\".carousel-indicators\"));\n }\n $($(carousel).find(\".carousel-item\")).first().addClass(\"active\");\n $($(carousel).find(\".carousel-indicators > li\")).first().addClass(\"active\");\n if (imgs.length === 1) {\n $($(carousel).find(\".carousel-indicators, a[class^=\\\"carousel-control-\\\"]\")).detach();\n }\n $(carousel).carousel();\n $($(carousel).find(\".carousel-indicators\")).attr(\"aria-hidden\", true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n var isChoiceOfBonusProducts =\n $productContainer.parents(\".bonus-selection\").length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === \"variant\";\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent(\".bonus-product-item\")\n .data(\"pid\", response.product.id);\n\n $productContainer.parent(\".bonus-product-item\")\n .data(\"ready-to-order\", response.product.readyToOrder);\n }\n }\n\n // Update primary images\n var primaryImageUrls = response.product.images.large;\n createCarousel(primaryImageUrls, $productContainer);\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $(\".prices .price\", $productContainer).length\n ? $(\".prices .price\", $productContainer)\n : $(\".prices .price\");\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update promotions\n $productContainer.find(\".promotions\").empty().html(response.product.promotionsHtml);\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find(\".select-bonus-product\");\n $selectButton.trigger(\"bonusproduct:updateSelectButton\", {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $(\"button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global\").trigger(\"product:updateAddToCart\", {\n product: response.product, $productContainer: $productContainer\n }).trigger(\"product:statusUpdate\", response.product);\n }\n\n // Update attributes\n $productContainer.find(\".main-attributes\").empty()\n .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n if ($productContainer.parent(\".bonus-product-item\").length <= 0) {\n var selectedQuantity = quantities.find(function (quantity) {\n return quantity.selected;\n });\n var optionsHtml = \"\";\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\nfunction updateLabel(data) {\n const colorLabel = document.getElementById(\"colorLabel\");\n const labelText = colorLabel.getAttribute(\"data-label-text\");\n const variationAttributes = data.product.variationAttributes;\n\n for (const attribute of variationAttributes) {\n if (attribute.attributeId === \"color\") {\n $(\".color-attribute\").removeClass(\"selected\");\n for (const value of attribute.values) {\n if (value.selected) {\n colorLabel.innerHTML = `${labelText} ${value.displayValue}`;\n $(\"img[data-attr-value=\\\"\" + value.id + \"\\\"]\").parent().addClass(\"selected\");\n return; // Exit the function once the label is updated\n }\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) {\n if (selectedValueUrl) {\n $(\"body\").trigger(\"product:beforeAttributeSelect\",\n { url: selectedValueUrl, container: $productContainer });\n\n $.ajax({\n url: selectedValueUrl,\n method: \"GET\",\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.optionsHtml, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $(\"body\").trigger(\"product:afterAttributeSelect\",\n { data: data, container: $productContainer });\n $.spinner().stop();\n // Update the label with the selected value\n updateLabel(data);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $(\".add-to-cart-url\").val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $(\"
      \").append($.parseHTML(html));\n\n var body = $html.find(\".choice-of-bonus-product\");\n var footer = $html.find(\".modal-footer\").children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = \"
      \"\n + \"\"\n + \"
      \"\n + \"
      \"\n + \" \" + data.labels.selectprods + \"\"\n + \" \"\n + \"
      \"\n + \"
      \"\n + \"
      \"\n + \"
      \"\n + \"
      \";\n $(\".uuid-\" + data.pliUUID + \" .bonus-selection\").replaceWith(htmlString);\n var $bonusSelection = $(\".uuid-\" + data.pliUUID + \" .bonus-selection\");\n\n $.ajax({\n url: bonusUrl,\n method: \"GET\",\n dataType: \"json\",\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $(\".uuid-\" + data.pliUUID + \" .bundled-line-item\").hide();\n $(\".uuid-\" + data.pliUUID + \" .bonus-product-button\").hide();\n $bonusSelection.find(\".body\").html(parsedHtml.body);\n $bonusSelection.find(\".footer\").html(parsedHtml.footer);\n updateSelectButtonStatus();\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n $(\".minicart\").trigger(\"count:update\", response);\n var messageType = response.error ? \"alert-danger\" : \"alert-success\";\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n if ($(\".add-to-cart-messages\").length === 0) {\n $(\"body\").append(\n \"
      \"\n );\n }\n\n $(\".add-to-cart-messages\").append(\n \"
      \"\n + response.message\n + \"
      \"\n );\n\n setTimeout(function () {\n $(\".add-to-basket-alert\").remove();\n }, 5000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $(\".bundle-item\").each(function () {\n childProducts.push({\n pid: $(this).find(\".product-id\").text(),\n quantity: parseInt($(this).find(\"label.quantity\").data(\"quantity\"), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find(\".product-option\")\n .map(function () {\n var $elOption = $(this).find(\".options-select\");\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find(\"option[value=\\\"\" + urlValue + \"\\\"]\")\n .data(\"value-id\");\n return {\n optionId: $(this).data(\"option-id\"),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: \"GET\",\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\nfunction updateSelectButtonStatus() {\n var $selected = $(\".bonus-selection .selected-bonus-products .selected-pid\");\n var count = 0;\n if ($selected.length) {\n $(\"button.select-bonus-product\").removeClass(\"d-none\");\n $(\"button.selected-bonus-product\").addClass(\"d-none\");\n\n $selected.each(function () {\n count += parseInt($(this).data(\"qty\"), 10);\n let pid = $(this).data(\"pid\");\n $(\"button.select-bonus-product[data-pid=\\\"\" + pid + \"\\\"]\").addClass(\"d-none\");\n $(\"button.selected-bonus-product[data-pid=\\\"\" +pid + \"\\\"]\").removeClass(\"d-none\");\n });\n }\n var maxPids = $(\".bonus-selection\").data(\"total-qty\");\n\n if (count >= maxPids) {\n $(\"button.select-bonus-product:not([data-ignore])\").attr(\"disabled\", \"disabled\");\n } else {\n $(\"button.select-bonus-product:not([data-ignore])\").removeAttr(\"disabled\");\n }\n}\n\nsetTimeout(function () {\n var colorDiv = $(\"div[data-attr=\\\"color\\\"]\");\n var pdpAttributesDiv = colorDiv.find(\".pdp-attributes\");\n var selectableButton = pdpAttributesDiv.find(\"button.color-attribute .selectable\").first().parent();\n\n if (selectableButton.length > 0) {\n pdpAttributesDiv.find(\"button.color-attribute\").removeClass(\"selected\");\n selectableButton[0].click(); // Trigger the click event\n selectableButton.addClass(\"selected\"); // Add the class to the jQuery object\n }\n}, 10);\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n\n focusChooseBonusProductModal: function () {\n $(\"body\").on(\"shown.bs.modal\", \"#chooseBonusProductModal\", function () {\n $(\"#chooseBonusProductModal\").siblings().attr(\"aria-hidden\", \"true\");\n $(\"#chooseBonusProductModal .close\").focus();\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $(\"body\").on(\"hidden.bs.modal\", \"#chooseBonusProductModal\", function () {\n $(\"#chooseBonusProductModal\").siblings().attr(\"aria-hidden\", \"false\");\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $(\"body\").on(\"keydown\", \"#chooseBonusProductModal\", function (e) {\n var focusParams = {\n event: e,\n containerSelector: \"#chooseBonusProductModal\",\n firstElementSelector: \".close\",\n lastElementSelector: \".add-bonus-products\"\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n colorAttribute: function () {\n $(document).on(\"click\", \"[data-attr=\\\"color\\\"] button\", function (e) {\n e.preventDefault();\n\n if ($(this).attr(\"disabled\")) {\n return;\n }\n var $productContainer = $(this).closest(\".set-item\");\n if (!$productContainer.length) {\n $productContainer = $(this).closest(\".product-detail\");\n }\n\n attributeSelect($(this).attr(\"data-url\"), $productContainer);\n });\n },\n\n selectAttribute: function () {\n $(document).on(\"change\", \"select[class*=\\\"select-\\\"], .options-select\", function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest(\".set-item\");\n if (!$productContainer.length) {\n $productContainer = $(this).closest(\".product-detail\");\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n });\n },\n\n availability: function () {\n $(document).on(\"change\", \".quantity-select\", function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest(\".product-detail\");\n if (!$productContainer.length) {\n $productContainer = $(this).closest(\".modal-content\").find(\".product-quickview\");\n }\n\n if ($(\".bundle-items\", $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find(\"option:selected\").data(\"url\"),\n $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).on(\"click\", \"button.add-to-cart, button.add-to-cart-global\", function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n\n $(\"body\").trigger(\"product:beforeAddToCart\", this);\n\n if ($(\".set-items\").length && $(this).hasClass(\"add-to-cart-global\")) {\n setPids = [];\n\n $(\".product-detail\").each(function () {\n if (!$(this).hasClass(\"product-set-detail\")) {\n setPids.push({\n pid: $(this).data(\"pid\"),\n qty: $(this).find(\".quantity-select\").val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest(\".product-detail\");\n if (!$productContainer.length) {\n $productContainer = $(this).closest(\".quick-view-dialog\").find(\".product-detail\");\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this))\n };\n\n if (!$(\".bundle-item\").length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger(\"updateAddToCartFormData\", form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: \"POST\",\n data: form,\n success: function (data) {\n handlePostCartAdd(data);\n $(\"body\").trigger(\"product:afterAddToCart\", data);\n $.spinner().stop();\n miniCartReportingUrl(data.reportingURL);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on(\"click\", \".select-bonus-product\", function () {\n var $choiceOfBonusProduct = $(this).parents(\".choice-of-bonus-product\");\n var pid = $(this).data(\"pid\");\n var maxPids = $(\".bonus-selection\").data(\"total-qty\");\n var submittedQty = parseInt($choiceOfBonusProduct.find(\".bonus-quantity-select\").val(), 10);\n var totalQty = 0;\n $.each($(\".bonus-selection .selected-bonus-products .selected-pid\"), function () {\n totalQty += $(this).data(\"qty\");\n });\n totalQty += submittedQty;\n var optionID = $choiceOfBonusProduct.find(\".product-option\").data(\"option-id\");\n var valueId = $choiceOfBonusProduct.find(\".options-select option:selected\").data(\"valueId\");\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml = \"\"\n + \"
      \"\n + \"
      \"\n + $choiceOfBonusProduct.find(\".product-name\").html()\n + \"
      \"\n + \"
      \"\n + \"
      \"\n ;\n $(\".bonus-selection .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 updateSelectButtonStatus();\n });\n },\n removeBonusProduct: function () {\n $(document).on(\"click\", \".selected-bonus-product\", function () {\n var $selected = $(\".bonus-selection .selected-bonus-products .selected-pid\");\n var count = 0;\n if ($selected.length) {\n $selected.each(function (index) {\n var $item = $($selected[index]);\n if ($item.data(\"pid\") === $(this).data(\"pid\")) {\n $item.remove();\n return;\n }\n count += parseInt($item.data(\"qty\"), 10);\n });\n }\n\n $(\".pre-cart-products\").html(count);\n $(\".selected-bonus-products .bonus-summary\").removeClass(\"alert-danger\");\n $(this).addClass(\"d-none\");\n $(this).siblings(\".select-bonus-product\").removeClass(\"d-none\");\n updateSelectButtonStatus();\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 $(document).on(\"change\", \".bonus-quantity-select\", function () {\n var qty = parseInt($(this).val(), 10);\n var $parent = $(this).parents(\".bonus-product-item\");\n var pid = $parent.data(\"pid\");\n var $selected = $(\".bonus-selection .selected-bonus-products .selected-pid\");\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n if ($selected.data(\"pid\") !== pid) {\n count += parseInt($(this).data(\"qty\"), 10);\n }\n });\n }\n var maxPids = $(\".bonus-selection\").data(\"total-qty\");\n\n if (qty + count <= maxPids) {\n $parent.find(\"button.select-bonus-product:not([data-ignore])\").removeAttr(\"disabled\");\n } else {\n $parent.find(\"button.select-bonus-product:not([data-ignore])\").attr(\"disabled\", \"disabled\");\n }\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 = $(\".bonus-selection .selected-pid\");\n var queryString = \"?pids=\";\n var url = $(\".bonus-selection\").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=\" + $(\".bonus-selection\").data(\"uuid\");\n queryString = queryString + \"&pliuuid=\" + $(\".bonus-selection\").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 if ($(\".add-to-cart-messages\").length === 0) {\n $(\"body\").append(\"
      \");\n }\n $(\".add-to-cart-messages\").append(\n \"
      \"\n + data.errorMessage + \"
      \"\n );\n setTimeout(function () {\n $(\".add-to-basket-alert\").remove();\n }, 3000);\n } else {\n $(\".configure-bonus-product-attributes\").html(data);\n $(\".bonus-products-step2\").removeClass(\"hidden-xl-down\");\n $(\".bonus-selection\").empty();\n\n if ($(\".add-to-cart-messages\").length === 0) {\n $(\"body\").append(\"
      \");\n }\n $(\".minicart-quantity\").html(data.totalQty);\n $(\".add-to-cart-messages\").append(\n \"
      \"\n + data.msgSuccess + \"
      \"\n );\n setTimeout(function () {\n $(\".add-to-basket-alert\").remove();\n if ($(\".cart-page\").length) {\n location.reload();\n }\n }, 1500);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n miniCartReportingUrl: miniCartReportingUrl\n};\n","\"use strict\";\nvar base = require(\"./base\");\n\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\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 || $(\".product-set-detail\").eq(0)) {\n response.container.data(\"pid\", response.data.product.id);\n response.container.find(\".product-id\").text(response.data.product.id);\n } else {\n $(\".product-id\").text(response.data.product.id);\n $(\".product-detail:not(\\\".bundle-item\\\")\").data(\"pid\", response.data.product.id);\n }\n });\n },\n updateAddToCart: function () {\n $(\"body\").on(\"product:updateAddToCart\", function (e, response) {\n // update local add to cart (for sets)\n $(\"button.add-to-cart\", response.$productContainer).attr(\"disabled\",\n (!response.product.readyToOrder || !response.product.available));\n\n var enable = $(\".product-availability\").toArray().every(function (item) {\n return $(item).data(\"available\") && $(item).data(\"ready-to-order\");\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 = $(\"\");\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 focusChooseBonusProductModal: base.focusChooseBonusProductModal()\n};\n","\"use strict\";\n\nvar base = require(\"./base\");\nvar detail = require(\"./detail\");\n\nvar exportDetails = $.extend({}, base, detail, {});\n\nmodule.exports = exportDetails;\n","\"use strict\";\n\nrequire(\"xzoom\");\n\nconst breakpoints = require(\"../utils/breakpoints\");\nvar xzoomOptions = {\n position: \"lens\",\n lens: \"transparent\",\n lensShape: \"circle\",\n defaultScale: \"-1\",\n zoomWidth: 400,\n zoomHeight: 400\n};\n\n/**\n * Initialize zoom functionality\n *\n * @param {Object} item - item with image inside\n */\nfunction initializeXZoom(item) {\n var image = item.find(\".active .img-fluid\");\n var xoriginalURL = image.attr(\"src\");\n\n image.addClass(\"xzoom\").attr(\"xoriginal\", xoriginalURL);\n image.parent().addClass(\"xzoom-wrapper\");\n\n if (!breakpoints.isLargeBreakpoint()) {\n xzoomOptions.position = \"right\";\n }\n\n image.xzoom(xzoomOptions);\n\n // set each instance\n var instance = image.data(\"xzoom\");\n\n instance.eventclick = function (element) {\n if (!breakpoints.isLargeBreakpoint() && $(\".xzoom-preview .xzoom-close\").length === 0) {\n var $zoomPreview = $(element).find(\".xzoom-preview\");\n\n // get the dimensions of the wrapper\n var zoomPreviewWidth = $zoomPreview.width();\n var zoomPreviewHeight = $zoomPreview.height();\n\n // get the dimensions of the scroll\n var zoomPreviewScrollWidth = $zoomPreview.get(0).scrollWidth;\n var zoomPreviewScrollHeight =$zoomPreview.get(0).scrollHeight;\n\n // calculate the middle of the scroll\n var zoomPreviewScrollLeft = (zoomPreviewScrollWidth - zoomPreviewWidth) / 2;\n var zoomPreviewScrollRight = (zoomPreviewScrollHeight - zoomPreviewHeight) / 2;\n\n // position the scroll to the middle vertically and horizontally\n $zoomPreview.scrollLeft(zoomPreviewScrollLeft).scrollTop(zoomPreviewScrollRight);\n\n // append the close button\n $(element).append(\"×\");\n\n // add action to the close button\n $(element).on(\"click\", \".xzoom-close\", function () {\n instance.closezoom();\n });\n }\n };\n\n instance.eventscroll = function (element) {\n element.off('mousewheel DOMMouseScroll');\n };\n}\n\n/**\n * Zoom functionality for image carousel\n *\n * @param {Object} carousel - image carousel\n */\nfunction zoomCarouselImage(carousel) {\n initializeXZoom(carousel);\n\n carousel.on(\"slide.bs.carousel\", function () {\n $(this).find(\".active .img-fluid\").attr(\"xoriginal\", \"\");\n });\n\n carousel.on(\"slid.bs.carousel\", function () {\n initializeXZoom($(this));\n });\n}\n\nmodule.exports = {\n xZoomInit: function () {\n var $carousel = $(\".primary-images .carousel\");\n\n $carousel.each(function () {\n var $item = $(this);\n\n zoomCarouselImage($item);\n });\n },\n onVariationUpdate: function () {\n $(\"body\").on(\"product:afterAttributeSelect\", function (e, response) {\n var $carousel = response.container;\n\n zoomCarouselImage($carousel);\n });\n }\n};\n","const breakpointDefs = {\n large: 1200\n};\n\nfunction isLargeBreakpoint() {\n return window.matchMedia(`(min-width: ${breakpointDefs.large}px)`).matches;\n}\n\nmodule.exports = {\n breakpointDefs,\n isLargeBreakpoint\n};\n","'use strict';\n\nmodule.exports = {\n setTabNextFocus: function (focusParams) {\n var KEYCODE_TAB = 9;\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n if (!isTabPressed) {\n return;\n }\n\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n if ($('.product-quickview.product-set').length > 0) {\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n lastFocusableEl = linkElements[linkElements.length - 1];\n }\n }\n\n if (focusParams.event.shiftKey) /* shift + tab */ {\n if ($(':focus').is(firstFocusableEl)) {\n lastFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n } else /* tab */ {\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n firstFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n }\n }\n};\n","'use strict';\nvar focusHelper = require('../components/focus');\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n var quantitySelected;\n if ($el && $('.set-items').length) {\n quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n } else if ($el && $('.product-bundle').length) {\n var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n if (quantitySelectedModal.val() === undefined) {\n quantitySelected = quantitySelectedPDP;\n } else {\n quantitySelected = quantitySelectedModal;\n }\n } else {\n quantitySelected = $('.quantity-select');\n }\n return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n attrValue.value + '\"]');\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n if (attrValue.url) {\n $swatchButton.attr('data-url', attrValue.url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url)\n .removeAttr('disabled');\n\n if (!attrValue.selectable) {\n $attrValue.attr('disabled', true);\n }\n });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n processNonSwatchValues(attr, $productContainer);\n }\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = '
    2. ' + response.resources.info_selectforstock + '
    3. ';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '
    4. ' + message + '
    5. ';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '
      ' + attribute.label + ': '\n + attribute.value + '
      ';\n });\n }\n });\n\n return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n var carousel = $productContainer.find('.carousel');\n $(carousel).carousel('dispose');\n var carouselId = $(carousel).attr('id');\n $(carousel).empty().append('
        ' + $(carousel).data('prev') + '' + $(carousel).data('next') + '');\n for (var i = 0; i < imgs.length; i++) {\n $('
        \"'
        ').appendTo($(carousel).find('.carousel-inner'));\n $('
      1. ').appendTo($(carousel).find('.carousel-indicators'));\n }\n $($(carousel).find('.carousel-item')).first().addClass('active');\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n var isChoiceOfBonusProducts =\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n // Update primary images\n var primaryImageUrls = response.product.images.large;\n createCarousel(primaryImageUrls, $productContainer);\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update promotions\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n if ($productContainer.parent('.bonus-product-item').length <= 0) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '';\n }).join('');\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect',\n { url: selectedValueUrl, container: $productContainer });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.optionsHtml, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer });\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('
        ').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body').spinner().start();\n\n if ($('#chooseBonusProductModal').length !== 0) {\n $('#chooseBonusProductModal').remove();\n }\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = ''\n + '
        '\n + ''\n + '
        '\n + ''\n + '
        '\n + '
        '\n + ' ' + data.labels.selectprods + ''\n + ' '\n + '
        '\n + '
        '\n + '
        '\n + '
        '\n + '
        '\n + '
        ';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $('#chooseBonusProductModal .modal-body').empty();\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append(\n '
        '\n );\n }\n\n $('.add-to-cart-messages').append(\n '
        '\n + response.message\n + '
        '\n );\n\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: 'GET',\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n\n focusChooseBonusProductModal: function () {\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n $('#chooseBonusProductModal .close').focus();\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#chooseBonusProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.add-bonus-products'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n colorAttribute: function () {\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n e.preventDefault();\n\n if ($(this).attr('disabled')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n\n attributeSelect($(this).attr('data-url'), $productContainer);\n });\n },\n\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').text(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this))\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n miniCartReportingUrl(data.reportingURL);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $(this).data('pid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n totalQty += submittedQty;\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml = ''\n + '
        '\n + '
        '\n + $choiceOfBonusProduct.find('.product-name').html()\n + '
        '\n + '
        '\n + '
        '\n ;\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n },\n removeBonusProduct: function () {\n $(document).on('click', '.selected-pid', function () {\n $(this).remove();\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n count += parseInt($(this).data('qty'), 10);\n });\n }\n\n $('.pre-cart-products').html(count);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n });\n },\n enableBonusProductSelection: function () {\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n var pid = response.product.id;\n $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n });\n },\n showMoreBonusProducts: function () {\n $(document).on('click', '.show-more-bonus-products', function () {\n var url = $(this).data('url');\n $('.modal-content').spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('.modal-body').append(parsedHtml.body);\n $('.show-more-bonus-products:first').remove();\n $('.modal-content').spinner().stop();\n },\n error: function () {\n $('.modal-content').spinner().stop();\n }\n });\n });\n },\n addBonusProductsToCart: function () {\n $(document).on('click', '.add-bonus-products', function () {\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n var queryString = '?pids=';\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n var pidsObject = {\n bonusProducts: []\n };\n\n $.each($readyToOrderBonusProducts, function () {\n var qtyOption =\n parseInt($(this)\n .data('qty'), 10);\n\n var option = null;\n if (qtyOption > 0) {\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n option = {};\n option.optionId = $(this).data('optionid');\n option.productId = $(this).data('pid');\n option.selectedValueId = $(this).data('option-selected-value');\n }\n pidsObject.bonusProducts.push({\n pid: $(this).data('pid'),\n qty: qtyOption,\n options: [option]\n });\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n }\n });\n queryString += JSON.stringify(pidsObject);\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n success: function (data) {\n $.spinner().stop();\n if (data.error) {\n $('#chooseBonusProductModal').modal('hide');\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
        ');\n }\n $('.add-to-cart-messages').append(\n '
        '\n + data.errorMessage + '
        '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 3000);\n } else {\n $('.configure-bonus-product-attributes').html(data);\n $('.bonus-products-step2').removeClass('hidden-xl-down');\n $('#chooseBonusProductModal').modal('hide');\n\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
        ');\n }\n $('.minicart-quantity').html(data.totalQty);\n $('.add-to-cart-messages').append(\n '
        '\n + data.msgSuccess + '
        '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n if ($('.cart-page').length) {\n location.reload();\n }\n }, 1500);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n miniCartReportingUrl: miniCartReportingUrl\n};\n","/* globals google */\n'use strict';\n\n/**\n * appends params to a url\n * @param {string} url - Original url\n * @param {Object} params - Parameters to append\n * @returns {string} result url with appended parameters\n */\nfunction appendToUrl(url, params) {\n var newUrl = url;\n newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(params).map(function (key) {\n return key + '=' + encodeURIComponent(params[key]);\n }).join('&');\n\n return newUrl;\n}\n\n/**\n * Uses google maps api to render a map\n */\nfunction maps() {\n var map;\n var infowindow = new google.maps.InfoWindow();\n\n // Init U.S. Map in the center of the viewport\n var latlng = new google.maps.LatLng(37.09024, -95.712891);\n var mapOptions = {\n scrollwheel: false,\n zoom: 4,\n center: latlng\n };\n\n map = new google.maps.Map($('.map-canvas')[0], mapOptions);\n var mapdiv = $('.map-canvas').attr('data-locations');\n\n mapdiv = JSON.parse(mapdiv);\n\n var bounds = new google.maps.LatLngBounds();\n\n // Customized google map marker icon with svg format\n var markerImg = {\n path: 'M13.5,30.1460153 L16.8554555,25.5 L20.0024287,25.5 C23.039087,25.5 25.5,' +\n '23.0388955 25.5,20.0024287 L25.5,5.99757128 C25.5,2.96091298 23.0388955,0.5 ' +\n '20.0024287,0.5 L5.99757128,0.5 C2.96091298,0.5 0.5,2.96110446 0.5,5.99757128 ' +\n 'L0.5,20.0024287 C0.5,23.039087 2.96110446,25.5 5.99757128,25.5 L10.1445445,' +\n '25.5 L13.5,30.1460153 Z',\n fillColor: '#0070d2',\n fillOpacity: 1,\n scale: 1.1,\n strokeColor: 'white',\n strokeWeight: 1,\n anchor: new google.maps.Point(13, 30),\n labelOrigin: new google.maps.Point(12, 12)\n };\n\n Object.keys(mapdiv).forEach(function (key) {\n var item = mapdiv[key];\n var lable = parseInt(key, 10) + 1;\n var storeLocation = new google.maps.LatLng(item.latitude, item.longitude);\n var marker = new google.maps.Marker({\n position: storeLocation,\n map: map,\n title: item.name,\n icon: markerImg,\n label: { text: lable.toString(), color: 'white', fontSize: '16px' }\n });\n\n marker.addListener('click', function () {\n infowindow.setOptions({\n content: item.infoWindowHtml\n });\n infowindow.open(map, marker);\n });\n\n // Create a minimum bound based on a set of storeLocations\n bounds.extend(marker.position);\n });\n // Fit the all the store marks in the center of a minimum bounds when any store has been found.\n if (mapdiv && mapdiv.length !== 0) {\n map.fitBounds(bounds);\n }\n}\n\n/**\n * Renders the results of the search and updates the map\n * @param {Object} data - Response from the server\n */\nfunction updateStoresResults(data) {\n var $resultsDiv = $('.results');\n var $mapDiv = $('.map-canvas');\n var hasResults = data.stores.length > 0;\n\n if (!hasResults) {\n $('.store-locator-no-results').show();\n } else {\n $('.store-locator-no-results').hide();\n }\n\n $resultsDiv.empty()\n .data('has-results', hasResults)\n .data('radius', data.radius)\n .data('search-key', data.searchKey);\n\n $mapDiv.attr('data-locations', data.locations);\n\n if ($mapDiv.data('has-google-api')) {\n maps();\n } else {\n $('.store-locator-no-apiKey').show();\n }\n\n if (data.storesResultsHtml) {\n $resultsDiv.append(data.storesResultsHtml);\n }\n}\n\n/**\n * Search for stores with new zip code\n * @param {HTMLElement} element - the target html element\n * @returns {boolean} false to prevent default event\n */\nfunction search(element) {\n var dialog = element.closest('.in-store-inventory-dialog');\n var spinner = dialog.length ? dialog.spinner() : $.spinner();\n spinner.start();\n var $form = element.closest('.store-locator');\n var radius = $('.results').data('radius');\n var url = $form.attr('action');\n var urlParams = { radius: radius };\n\n var payload = $form.is('form') ? $form.serialize() : { postalCode: $form.find('[name=\"postalCode\"]').val() };\n\n url = appendToUrl(url, urlParams);\n\n $.ajax({\n url: url,\n type: $form.attr('method'),\n data: payload,\n dataType: 'json',\n success: function (data) {\n spinner.stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n }\n });\n return false;\n}\n\nmodule.exports = {\n init: function () {\n if ($('.map-canvas').data('has-google-api')) {\n maps();\n } else {\n $('.store-locator-no-apiKey').show();\n }\n\n if (!$('.results').data('has-results')) {\n $('.store-locator-no-results').show();\n }\n },\n\n detectLocation: function () {\n // clicking on detect location.\n $('.detect-location').on('click', function () {\n $.spinner().start();\n if (!navigator.geolocation) {\n $.spinner().stop();\n return;\n }\n\n navigator.geolocation.getCurrentPosition(function (position) {\n var $detectLocationButton = $('.detect-location');\n var url = $detectLocationButton.data('action');\n var radius = $('.results').data('radius');\n var urlParams = {\n radius: radius,\n lat: position.coords.latitude,\n long: position.coords.longitude\n };\n\n url = appendToUrl(url, urlParams);\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $.spinner().stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n }\n });\n });\n });\n },\n\n search: function () {\n $('.store-locator-container form.store-locator').submit(function (e) {\n e.preventDefault();\n search($(this));\n });\n $('.store-locator-container .btn-storelocator-search[type=\"button\"]').click(function (e) {\n e.preventDefault();\n search($(this));\n });\n },\n\n changeRadius: function () {\n $('.store-locator-container .radius').change(function () {\n var radius = $(this).val();\n var searchKeys = $('.results').data('search-key');\n var url = $(this).data('action-url');\n var urlParams = {};\n\n if (searchKeys.postalCode) {\n urlParams = {\n radius: radius,\n postalCode: searchKeys.postalCode\n };\n } else if (searchKeys.lat && searchKeys.long) {\n urlParams = {\n radius: radius,\n lat: searchKeys.lat,\n long: searchKeys.long\n };\n }\n\n url = appendToUrl(url, urlParams);\n var dialog = $(this).closest('.in-store-inventory-dialog');\n var spinner = dialog.length ? dialog.spinner() : $.spinner();\n spinner.start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n spinner.stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n }\n });\n });\n },\n selectStore: function () {\n $('.store-locator-container').on('click', '.select-store', (function (e) {\n e.preventDefault();\n var selectedStore = $(':checked', '.results-card .results');\n var data = {\n storeID: selectedStore.val(),\n searchRadius: $('#radius').val(),\n searchPostalCode: $('.results').data('search-key').postalCode,\n storeDetailsHtml: selectedStore.siblings('label').find('.store-details').html(),\n event: e\n };\n\n $('body').trigger('store:selected', data);\n }));\n },\n updateSelectStoreButton: function () {\n $('body').on('change', '.select-store-input', (function () {\n $('.select-store').prop('disabled', false);\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\";\n\nvar base = require(\"base/product/base\");\n\n/**\n * Displays the message returned in the response\n * @param {string} data - data returned from the server's ajax call\n */\nfunction displayMessage(data) {\n var status;\n if (!data.error) {\n status = \"alert-success\";\n } else {\n status = \"alert-danger\";\n }\n\n if ($(\".add-to-registry-message\").length === 0) {\n $(\"body\").append(\"
        \");\n }\n $(\".add-to-registry-message\").append(\n \"
        \" + data.msg + \"
        \"\n );\n\n setTimeout(function () {\n $(\".add-to-registry-message\").remove();\n }, 5000);\n}\n\nmodule.exports = {\n updateAddToRegistry: function () {\n $(\"body\").on(\"product:updateAddToCart\", function (e, response) {\n $(\"button.add-to-gift-registry\", response.$productContainer).attr(\n \"disabled\",\n (!response.product.readyToOrder || !response.product.available)\n );\n });\n },\n\n updateGiftRegistryURLQuantity: function () {\n $(\"body\").on(\"product:afterAttributeSelect\", function (e, response) {\n $(\".add-to-gift-registry\", response.container).data(\"href\", response.data.product.giftRegistryLink);\n });\n },\n\n addToGiftRegistry: function () {\n $(\".add-to-gift-registry\").on(\"click\", function (e) {\n e.preventDefault();\n var element = $(this);\n var url = element.data(\"href\");\n\n $.spinner().start();\n\n var args = {\n pid: base.getPidValue($(this)),\n qty: base.getQuantitySelected($(this)),\n prodSetPid: $(\".product-set-detail\").data(\"pid\") || \"\"\n };\n\n var encodedArgs = encodeURIComponent(JSON.stringify(args));\n\n $.ajax({\n url: url,\n type: \"get\",\n data: { args: encodedArgs },\n dataType: \"json\",\n success: function (data) {\n if (data.redirectUrl) {\n window.location.href = data.redirectUrl;\n } else {\n displayMessage(data, element);\n }\n\n $.spinner().stop();\n },\n error: function (err) {\n $.spinner().stop();\n window.location.href = err.responseJSON.redirectUrl;\n }\n });\n });\n }\n};\n","\"use strict\";\n\nvar storeLocator = require(\"base/storeLocator/storeLocator\");\n\n/**\n * Restores Quantity Selector to its original state.\n * @param {HTMLElement} $quantitySelect - The Quantity Select Element\n */\nfunction restoreQuantityOptions($quantitySelect) {\n var originalHTML = $quantitySelect.data(\"originalHTML\");\n if (originalHTML) {\n $quantitySelect.html(originalHTML);\n }\n}\n\n/**\n * Sets the data attribute of Quantity Selector to save its original state.\n * @param {HTMLElement} $quantitySelect - The Quantity Select Element\n */\nfunction setOriginalQuantitySelect($quantitySelect) {\n if (!$quantitySelect.data(\"originalHTML\")) {\n $quantitySelect.data(\"originalHTML\", $quantitySelect.html());\n } // If it's already there, don't re-set it\n}\n\n/**\n * Updates the Quantity Selector based on the In Store Quantity.\n * @param {string} quantitySelector - Quantity Selector\n * @param {string} quantityOptionSelector - Quantity Option Selector\n * @param {number} productAtsValue - Inventory in the selected store\n */\nfunction updateQOptions(quantitySelector, quantityOptionSelector, productAtsValue) {\n var selectedQuantity = $(quantitySelector).val();\n restoreQuantityOptions($(quantitySelector));\n for (var i = $(quantityOptionSelector).length - 1; i >= productAtsValue; i--) {\n $(quantityOptionSelector).eq(i).remove();\n }\n $(quantitySelector + \" option[value=\\\"\" + selectedQuantity + \"\\\"]\").attr(\"selected\", \"selected\");\n}\n\n/**\n * Generates the modal window on the first call.\n */\nfunction getModalHtmlElement() {\n if ($(\"#inStoreInventoryModal\").length !== 0) {\n $(\"#inStoreInventoryModal\").remove();\n }\n var htmlString = \"\"\n + \"
        \"\n + \"
        \"\n + \"\"\n + \"
        \"\n + \"
        \"\n + \" \"\n + \"
        \"\n + \"
        \"\n + \"
        \"\n + \"
        \"\n + \"
        \"\n + \"
        \";\n $(\"body\").append(htmlString);\n $(\"#inStoreInventoryModal\").modal(\"show\");\n}\n\n/**\n * Replaces the content in the modal window with find stores components and\n * the result store list.\n * @param {string} pid - The product ID to search for\n * @param {number} quantity - Number of products to search inventory for\n * @param {number} selectedPostalCode - The postal code to search for inventory\n * @param {number} selectedRadius - The radius to search for inventory\n */\nfunction fillModalElement(pid, quantity, selectedPostalCode, selectedRadius) {\n var requestData = {\n products: pid + \":\" + quantity\n };\n\n if (selectedRadius) {\n requestData.radius = selectedRadius;\n }\n\n if (selectedPostalCode) {\n requestData.postalCode = selectedPostalCode;\n }\n\n $(\"#inStoreInventoryModal\").spinner().start();\n $.ajax({\n url: $(\".btn-get-in-store-inventory\").data(\"action-url\"),\n data: requestData,\n method: \"GET\",\n success: function (response) {\n $(\".modal-body\").empty();\n $(\".modal-body\").html(response.storesResultsHtml);\n storeLocator.search();\n storeLocator.changeRadius();\n storeLocator.selectStore();\n storeLocator.updateSelectStoreButton();\n\n $(\".btn-storelocator-search\").attr(\"data-search-pid\", pid);\n\n if (selectedRadius) {\n $(\"#radius\").val(selectedRadius);\n }\n\n if (selectedPostalCode) {\n $(\"#store-postal-code\").val(selectedPostalCode);\n }\n\n if (!$(\".results\").data(\"has-results\")) {\n $(\".store-locator-no-results\").show();\n }\n\n $(\"#inStoreInventoryModal\").modal(\"show\");\n $(\"#inStoreInventoryModal\").spinner().stop();\n },\n error: function () {\n $(\"#inStoreInventoryModal\").spinner().stop();\n }\n });\n}\n\n/**\n * Remove the selected store.\n * @param {HTMLElement} $container - the target html element\n */\nfunction deselectStore($container) {\n var storeElement = $($container).find(\".selected-store-with-inventory\");\n $(storeElement).find(\".card-body\").empty();\n $(storeElement).addClass(\"display-none\");\n $($container).find(\".btn-get-in-store-inventory\").show();\n $($container).find(\".quantity-select\").removeData(\"originalHTML\");\n}\n\n/**\n * Update quantity options. Only display quantity options that are available for the store.\n * @param {sring} searchPID - The product ID of the selected product.\n * @param {number} storeId - The store ID selected for in store pickup.\n */\nfunction updateQuantityOptions(searchPID, storeId) {\n var selectorPrefix = \".product-detail[data-pid=\\\"\" + searchPID + \"\\\"]\";\n var productIdSelector = selectorPrefix + \" .product-id\";\n var quantitySelector = selectorPrefix + \" .quantity-select\";\n var quantityOptionSelector = quantitySelector + \" option\";\n\n setOriginalQuantitySelect($(quantitySelector));\n\n var requestData = {\n pid: $(productIdSelector).text(),\n quantitySelected: $(quantitySelector).val(),\n storeId: storeId\n };\n\n $.ajax({\n url: $(\".btn-get-in-store-inventory\").data(\"ats-action-url\"),\n data: requestData,\n method: \"GET\",\n success: function (response) {\n // Update Quantity dropdown, Remove quantity greater than inventory\n var productAtsValue = response.atsValue;\n var availabilityValue = \"\";\n\n var $productContainer = $(\".product-detail[data-pid=\\\"\" + searchPID + \"\\\"]\");\n\n if (!response.product.readyToOrder) {\n availabilityValue = \"
        \" + response.resources.info_selectforstock + \"
        \";\n } else {\n response.product.messages.forEach(function (message) {\n availabilityValue += \"
        \" + message + \"
        \";\n });\n }\n\n $($productContainer).trigger(\"product:updateAvailability\", {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n\n $(\"button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global\").trigger(\"product:updateAddToCart\", {\n product: response.product, $productContainer: $productContainer\n });\n\n updateQOptions(quantitySelector, quantityOptionSelector, productAtsValue);\n }\n });\n}\n\nmodule.exports = {\n updateSelectStore: function () {\n $(\"body\").on(\"product:updateAddToCart\", function (e, response) {\n $(\".btn-get-in-store-inventory\", response.$productContainer).attr(\n \"disabled\",\n (!response.product.readyToOrder || !response.product.available\n || !response.product.availableForInStorePickup)\n );\n });\n },\n removeSelectedStoreOnAttributeChange: function () {\n $(\"body\").on(\"product:afterAttributeSelect\", function (e, response) {\n response.container.attr(\"data-pid\", response.data.product.id);\n deselectStore(response.container);\n });\n },\n updateAddToCartFormData: function () {\n $(\"body\").on(\"updateAddToCartFormData\", function (e, form) {\n if (form.pidsObj) {\n var pidsObj = JSON.parse(form.pidsObj);\n pidsObj.forEach(function (product) {\n var storeElement = $(\".product-detail[data-pid=\\\"\"\n + product.pid\n + \"\\\"]\").find(\".store-name\");\n product.storeId = $(storeElement).length// eslint-disable-line no-param-reassign\n ? $(storeElement).attr(\"data-store-id\")\n : null;\n });\n\n form.pidsObj = JSON.stringify(pidsObj);// eslint-disable-line no-param-reassign\n }\n\n var storeElement = $(\".product-detail[data-pid=\\\"\"\n + form.pid\n + \"\\\"]\");\n\n if ($(storeElement).length) {\n form.storeId = $(storeElement).find('.store-name') // eslint-disable-line\n .attr(\"data-store-id\");\n }\n });\n },\n showInStoreInventory: function () {\n $(\".btn-get-in-store-inventory\").on(\"click\", function (e) {\n var pid = $(this).closest(\".product-detail\").attr(\"data-pid\");\n var quantity = $(this).closest(\".product-detail\").find(\".quantity-select\").val();\n getModalHtmlElement();\n fillModalElement(pid, quantity);\n e.stopPropagation();\n });\n },\n removeStoreSelection: function () {\n $(\"body\").on(\"click\", \"#remove-store-selection\", (function () {\n deselectStore($(this).closest(\".product-detail\"));\n $(document).trigger(\"store:afterRemoveStoreSelection\", $(this).closest(\".product-detail\").find(\".quantity-select\"));\n }));\n },\n selectStoreWithInventory: function () {\n $(\"body\").on(\"store:selected\", function (e, data) {\n var searchPID = $(\".btn-storelocator-search\").attr(\"data-search-pid\");\n var storeElement = $(\".product-detail[data-pid=\\\"\" + searchPID + \"\\\"]\");\n $(storeElement).find(\".selected-store-with-inventory .card-body\").empty();\n $(storeElement).find(\".selected-store-with-inventory .card-body\").append(data.storeDetailsHtml);\n $(storeElement).find(\".store-name\").attr(\"data-store-id\", data.storeID);\n $(storeElement).find(\".selected-store-with-inventory\").removeClass(\"display-none\");\n\n var $changeStoreButton = $(storeElement).find(\".change-store\");\n $($changeStoreButton).data(\"postal\", data.searchPostalCode);\n $($changeStoreButton).data(\"radius\", data.searchRadius);\n\n $(storeElement).find(\".btn-get-in-store-inventory\").hide();\n\n updateQuantityOptions(searchPID, data.storeID);\n\n $(\"#inStoreInventoryModal\").modal(\"hide\");\n $(\"#inStoreInventoryModal\").remove();\n });\n },\n changeStore: function () {\n $(\"body\").on(\"click\", \".change-store\", (function () {\n var pid = $(this).closest(\".product-detail\").attr(\"data-pid\");\n var quantity = $(this).closest(\".product-detail\").find(\".quantity-select\").val();\n getModalHtmlElement();\n fillModalElement(pid, quantity, $(this).data(\"postal\"), $(this).data(\"radius\"));\n }));\n }\n};\n","/*!-----------------------------------------------------\n * xZoom v1.0.15\n * (c) 2013 by Azat Ahmedov & Elman Guseynov\n * https://github.com/payalord\n * https://dribbble.com/elmanvebs\n * Apache License 2.0\n *------------------------------------------------------*/\nfunction detect_old_ie(){if(/MSIE (\\d+\\.\\d+);/.test(navigator.userAgent)){var o=new Number(RegExp.$1);return!(9<=o)&&(8<=o||(7<=o||(6<=o||(5<=o||void 0))))}return!1}window.requestAnimFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(o){window.setTimeout(o,20)},function(Ao){function n(s,o){this.xzoom=!0;var t,a,p,l,r,e,n,d,i,c,h,f,u,v,m,g,w,x,b,z,y,C,k,O,M,A,S,H,W,F,I,T,X,Y,R,q,E,L,D,Z,_,j,N,Q,$,B,G,J,K,P,U,V=this,oo={},to=(new Array,new Array),eo=0,io=0,so=0,no=0,ao=0,po=0,lo=0,ro=0,co=0,ho=0,fo=0,uo=0,vo=0,mo=detect_old_ie(),go=/MSIE (\\d+\\.\\d+);/.test(navigator.userAgent),wo=\"\";function xo(){var o=document.documentElement;return{left:(window.pageXOffset||o.scrollLeft)-(o.clientLeft||0),top:(window.pageYOffset||o.scrollTop)-(o.clientTop||0)}}function bo(){var o;\"circle\"==V.options.lensShape&&\"lens\"==V.options.position&&(o=((M=A=Math.max(M,A))+2*Math.max(F,W))/2,k.css({\"-moz-border-radius\":o,\"-webkit-border-radius\":o,\"border-radius\":o}))}function zo(o,t,e,i){\"lens\"==V.options.position?(C.css({top:-(t-n)*T+A/2,left:-(o-d)*I+M/2}),V.options.bg&&(k.css({\"background-image\":\"url(\"+C.attr(\"src\")+\")\",\"background-repeat\":\"no-repeat\",\"background-position\":-(o-d)*I+M/2+\"px \"+(-(t-n)*T+A/2)+\"px\"}),e&&i&&k.css({\"background-size\":e+\"px \"+i+\"px\"}))):C.css({top:-H*T,left:-S*I})}function yo(o,t){var e,i;1<(so=so<-1?-1:so)&&(so=1),X
        \"),\"\"!=V.options.sourceClass&&m.addClass(V.options.sourceClass),m.css(\"position\",\"absolute\"),x=Ao(\"
        \"),\"\"!=V.options.loadingClass&&x.addClass(V.options.loadingClass),x.css(\"position\",\"absolute\"),g=Ao('
        '),m.append(x),w=Ao(\"
        \"),\"\"!=V.options.zoomClass&&\"fullscreen\"!=V.options.position&&w.addClass(V.options.zoomClass),w.css({position:\"absolute\",overflow:\"hidden\",opacity:1}),V.options.title&&\"\"!=wo&&(N=Ao(\"
        \"),j=Ao(\"
        \"),N.css({position:\"absolute\",opacity:1}),V.options.titleClass&&j.addClass(V.options.titleClass),j.html(\"\"+wo+\"\"),N.append(j),V.options.fadeIn&&N.css({opacity:0})),k=Ao(\"
        \"),\"\"!=V.options.lensClass&&k.addClass(V.options.lensClass),k.css({position:\"absolute\",overflow:\"hidden\"}),V.options.lens&&(lenstint=Ao(\"
        \"),lenstint.css({position:\"absolute\",background:V.options.lens,opacity:V.options.lensOpacity,width:\"100%\",height:\"100%\",top:0,left:0,\"z-index\":9999}),k.append(lenstint)),function(){switch(p=\"fullscreen\"==V.options.position?(a=Ao(window).width(),Ao(window).height()):(a=s.width(),s.height()),x.css({top:p/2-x.height()/2,left:a/2-x.width()/2}),(e=V.options.rootOutput||\"fullscreen\"==V.options.position?s.offset():s.position()).top=Math.round(e.top),e.left=Math.round(e.left),V.options.position){case\"fullscreen\":n=xo().top,d=xo().left,c=i=0;break;case\"inside\":n=e.top,d=e.left,c=i=0;break;case\"top\":n=e.top,d=e.left,i=n-r,c=d;break;case\"left\":n=e.top,d=e.left,i=n,c=d-l;break;case\"bottom\":n=e.top,d=e.left,i=n+p,c=d;break;case\"right\":default:n=e.top,d=e.left,i=n,c=d+a}n-=m.outerHeight()/2,d-=m.outerWidth()/2,\"#\"==V.options.position.substr(0,1)?oo=Ao(V.options.position):oo.length=0,0==oo.length&&\"inside\"!=V.options.position&&\"fullscreen\"!=V.options.position?(V.options.adaptive&&B&&G||(B=a,G=p),l=\"auto\"==V.options.zoomWidth?a:V.options.zoomWidth,r=\"auto\"==V.options.zoomHeight?p:V.options.zoomHeight,i+=V.options.Yoffset,c+=V.options.Xoffset,w.css({width:l+\"px\",height:r+\"px\",top:i,left:c}),\"lens\"!=V.options.position&&t.append(w)):\"inside\"==V.options.position||\"fullscreen\"==V.options.position?(l=a,r=p,w.css({width:l+\"px\",height:r+\"px\"}),m.append(w)):(l=oo.width(),r=oo.height(),V.options.rootOutput?(i=oo.offset().top,c=oo.offset().left,t.append(w)):(i=oo.position().top,c=oo.position().left,oo.parent().append(w)),i+=(oo.outerHeight()-r-w.outerHeight())/2,c+=(oo.outerWidth()-l-w.outerWidth())/2,w.css({width:l+\"px\",height:r+\"px\",top:i,left:c})),V.options.title&&\"\"!=wo&&(\"inside\"==V.options.position||\"lens\"==V.options.position||\"fullscreen\"==V.options.position?(h=i,f=c,m.append(N)):(h=i+(w.outerHeight()-r)/2,f=c+(w.outerWidth()-l)/2,t.append(N)),N.css({width:l+\"px\",height:r+\"px\",top:h,left:f})),m.css({width:a+\"px\",height:p+\"px\",top:n,left:d}),g.css({width:a+\"px\",height:p+\"px\"}),V.options.tint&&\"inside\"!=V.options.position&&\"fullscreen\"!=V.options.position?g.css(\"background-color\",V.options.tint):mo&&g.css({\"background-image\":\"url(\"+s.attr(\"src\")+\")\",\"background-color\":\"#fff\"}),y=new Image;var o=\"\";switch(go&&(o=\"?r=\"+(new Date).getTime()),y.src=s.attr(\"xoriginal\")+o,(C=Ao(y)).css(\"position\",\"absolute\"),(y=new Image).src=s.attr(\"src\"),(O=Ao(y)).css(\"position\",\"absolute\"),O.width(a),V.options.position){case\"fullscreen\":case\"inside\":w.append(C);break;case\"lens\":k.append(C),V.options.bg&&C.css({display:\"none\"});break;default:w.append(C),k.append(O)}}(),\"inside\"!=V.options.position&&\"fullscreen\"!=V.options.position?((V.options.tint||mo)&&m.append(g),V.options.fadeIn&&(g.css({opacity:0}),k.css({opacity:0}),w.css({opacity:0}))):V.options.fadeIn&&w.css({opacity:0}),t.append(m),V.eventmove(m),V.eventleave(m),V.options.position){case\"inside\":i-=(w.outerHeight()-w.height())/2,c-=(w.outerWidth()-w.width())/2;break;case\"top\":i-=w.outerHeight()-w.height(),c-=(w.outerWidth()-w.width())/2;break;case\"left\":i-=(w.outerHeight()-w.height())/2,c-=w.outerWidth()-w.width();break;case\"bottom\":c-=(w.outerWidth()-w.width())/2;break;case\"right\":i-=(w.outerHeight()-w.height())/2}w.css({top:i,left:c}),C.xon(\"load\",function(o){if(x.remove(),!V.options.openOnSmall&&(C.width()