{"version":3,"file":"default/js/search.js","mappings":";;;;;;;;;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,KAAK;;AAEL;AACA;AACA,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,oBAAoB,gCAAgC;AACpD;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA,4BAA4B;AAC5B,yBAAyB;AACzB,uBAAuB;AACvB,2BAA2B;AAC3B,wBAAwB;AACxB,uBAAuB;AACvB,6BAA6B;AAC7B,wBAAwB;AACxB,wBAAwB;AACxB,uBAAuB;AACvB,6BAA6B;;;;;;;;;;;;AClZhB;;AAEb,MAAM,cAAc,EAAE,mBAAO,CAAC,+GAA6B;AAC3D,UAAU,mBAAO,CAAC,2EAAQ;;AAE1B;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,uDAAuD;AAC/E;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,mDAAmD;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;;;;;;;;;;;;ACtPa;;AAEb;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,eAAe,iBAAiB;AAChG;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA,UAAU,QAAQ;AAClB,UAAU,QAAQ;AAClB,UAAU,QAAQ;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;;AAEA,kDAAkD,QAAQ;AAC1D;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC1Fa;;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;AACb,WAAW,mBAAO,CAAC,4FAAQ;AAC3B,kBAAkB,mBAAO,CAAC,6GAAqB;;AAE/C;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,aAAa,QAAQ;AACrB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,eAAe;AAC3B;AACA;AACA;;AAEA;AACA;;AAEA,aAAa;AACb;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C,mCAAmC;;AAEhF;AACA,6CAA6C,wCAAwC;;AAErF;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;ACxMa;;AAEb;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;UCZA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;;;;;ACtBa;;AAEb,qBAAqB,mBAAO,CAAC,uFAAW;;AAExC;AACA,mBAAmB,mBAAO,CAAC,8FAAiB;AAC5C,mBAAmB,mBAAO,CAAC,iHAAwB;AACnD,CAAC","sources":["webpack://sfra-startup-kit/./cartridges/app_ahumada/cartridge/client/default/js/gtm.js","webpack://sfra-startup-kit/./cartridges/app_ahumada/cartridge/client/default/js/search/search.js","webpack://sfra-startup-kit/./cartridges/app_ahumada/cartridge/client/default/js/utils/popoverUtils.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/product/quickView.js","webpack://sfra-startup-kit/./cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack://sfra-startup-kit/webpack/bootstrap","webpack://sfra-startup-kit/./cartridges/app_ahumada/cartridge/client/default/js/search.js"],"sourcesContent":["let currencyCode = $(\".gtm-data\").attr(\"data-currency\");\n\n// triggers page_view event\nfunction pageViewEvent() {\n    const $gtmData = $(\".gtm-data\");\n    let userType = $gtmData.attr(\"data-customer\") === \"true\" ? \"Registered\" : \"Guest\";\n    let language = $gtmData.attr(\"data-language\").toUpperCase();\n    let pageTitle = document.title;\n    let pageLocation = window.location.href;\n    let userID = $gtmData.attr(\"data-customer-id\") ? $gtmData.attr(\"data-customer-id\") : \"\";\n    window.dataLayer &&\n    window.dataLayer.push({\n        \"event\": \"page_view\",\n        \"user_id\": userID,\n        \"user_type\": userType,\n        \"site_language\": language,\n        \"page_title\": pageTitle,\n        \"page_location\": pageLocation\n    });\n}\n\n// triggers select_item event\nfunction selectItem(element) {\n    const $productTile = $(element);\n    let productID = $productTile.attr(\"data-pid\");\n    let productBrand = $productTile.find(\".product-tile-brand .link\").text().trim();\n    let productName = $productTile.find(\".pdp-link .link\").text().trim();\n    let productPrice = Number($productTile.find(\".price .value\").text().trim().substring(1).replace(\".\", \"\"));\n    let productCategoryList = $productTile.attr(\"data-categories\").split(\",\");\n\n    let item = {\n        \"item_name\": productName,\n        \"item_id\": productID,\n        \"price\": productPrice,\n        \"item_brand\": productBrand,\n        \"quantity\": 1,\n        \"index\": 0\n    };\n\n    let newItem = appendCategories(item, productCategoryList);\n\n    window.dataLayer &&\n    window.dataLayer.push({\n        \"event\": \"select_item\",\n        \"ecommerce\": {\n            \"currency\": currencyCode,\n            \"value\": productPrice,\n            \"items\": [newItem]\n        }\n    });\n}\n\n// triggers view_item event\nfunction viewItem() {\n    const $product = $(\".product-detail\");\n    const $productDetails = $product.find(\".product-details-section\");\n    let productID = $product.attr(\"data-pid\");\n    let productBrand = $productDetails.find(\".brand\").text().trim() || $productDetails.find(\".manufacturer-name\").text().trim();\n    let productName = $productDetails.find(\".product-name\").text().trim();\n    let productPrice = Number($productDetails.find(\".sales .value\").text().trim().substring(1).replace(\".\", \"\"));\n    let productCategoryList = $productDetails.find(\".gtm-categories\").text().trim().split(\",\");\n    let item = {\n        \"item_name\": productName,\n        \"item_id\": productID,\n        \"price\": productPrice,\n        \"item_brand\": productBrand,\n        \"quantity\": 1,\n        \"index\": 0\n    };\n\n    let newItem = appendCategories(item, productCategoryList);\n\n    window.dataLayer &&\n    window.dataLayer.push({\n        \"event\": \"view_item\",\n        \"ecommerce\": {\n            \"currency\": currencyCode,\n            \"value\": productPrice,\n            \"items\": [newItem]\n        }\n    });\n}\n\n// triggers view_item_list event\nfunction viewItemList(element, startValue) {\n    const $productTile = startValue ? $(element).find(\".product-tile:gt(\" + startValue + \")\") : $(element).find(\".product-tile\");\n    const batchSize = 20;\n    var objects = [];\n\n    $productTile.each(function (index) {\n        let productID = $(this).attr(\"data-pid\");\n        let productBrand = $(this).find(\".product-tile-brand .link\").text().trim();\n        let productName = $(this).find(\".pdp-link .link\").text().trim();\n        let productPrice = Number($(this).find(\".price .value\").first().text().trim().substring(1).replace(\".\", \"\"));\n\n        const item = {\n            \"item_name\": productName,\n            \"item_id\": productID,\n            \"price\": productPrice,\n            \"brand\": productBrand,\n            \"quantity\": 1,\n            \"index\": index\n        };\n\n        let productCategoryList = $(this).attr(\"data-categories\").split(\",\");\n        let newItem = appendCategories(item, productCategoryList);\n\n        objects.push(newItem);\n\n        if (objects.length === batchSize) {\n            window.dataLayer.push({ ecommerce: null });\n            window.dataLayer.push({\n                \"event\": \"view_item_list\",\n                \"ecommerce\": {\n                    \"currency\": currencyCode,\n                    \"items\": objects\n                }\n            });\n            objects = [];\n        }\n    });\n\n    if (objects.length > 0) {\n        window.dataLayer &&\n        window.dataLayer.push({ ecommerce: null });\n        window.dataLayer.push({\n            \"event\": \"view_item_list\",\n            \"ecommerce\": {\n                \"currency\": currencyCode,\n                \"items\": objects\n            }\n        });\n    }\n}\n\n// triggers add_to_cart event\nfunction addToCart(element, productType, quantity, isMinicart) {\n    const $product = $(element);\n    const $productDetails = $product.find(\".product-details-section\");\n    let productID, productBrand, productName, productPrice, productQuantity, productCategoryList, totalValue;\n    switch (productType) {\n        case \"ahumadaFamilyProductPromotion\":\n            productID = $product.data(\"data-pid\");\n            productBrand = $product.data(\"product-brand\");\n            productName = $product.data(\"product-name\");\n            productPrice = Number($product.data(\"product-price\"));\n            productQuantity = 1;\n            productCategoryList = $product.data(\"categories\").split(\",\");\n            totalValue = productPrice;\n            break;\n        case \"tile\":\n            productID = $product.attr(\"data-pid\");\n            productBrand = $product.find(\".product-tile-brand .link\").text().trim();\n            productName = $product.find(\".pdp-link .link\").text().trim();\n            productPrice = Number($product.find(\".price .value\").text().trim().substring(1).replace(\".\", \"\"));\n            productQuantity = 1;\n            productCategoryList = $product.attr(\"data-categories\").split(\",\");\n            totalValue = productPrice;\n            break;\n        case \"detail\":\n            productID = $product.attr(\"data-pid\");\n            productBrand = $productDetails.find(\".brand\").text().trim() || $productDetails.find(\".manufacturer-name\").text().trim();\n            productName = $productDetails.find(\".product-name\").text().trim();\n            productPrice = Number($productDetails.find(\".sales .value\").text().trim().substring(1).replace(\".\", \"\"));\n            productQuantity = Number($productDetails.find(\".quantity-select\").val());\n            productCategoryList = $productDetails.find(\".gtm-categories\").text().trim().split(\",\");\n            totalValue = productPrice * productQuantity;\n            break;\n        case \"cart\":\n            if (isMinicart) {\n                productID = $product.attr(\"data-pid\");\n                productBrand = $product.attr(\"data-brand\");\n                productName = $product.find(\".line-item-name span\").text().trim();\n                productPrice = Number($product.find(\".sales .value\").text().trim().substring(1).replace(\".\", \"\"));\n                productCategoryList = $product.attr(\"data-categories\").split(\",\");\n            } else {\n                productID = $product.attr(\"data-pid\");\n                productBrand = $product.attr(\"data-brand\");\n                productName = $product.find(\".line-item-product-name\").text().trim();\n                productPrice = Number($product.find(\".sales .value\").text().trim().substring(1).replace(\".\", \"\"));\n                productCategoryList = $product.attr(\"data-categories\").split(\",\");\n            }\n            productQuantity = Number(quantity);\n            totalValue = productPrice * productQuantity;\n            break;\n        default:\n            break;\n    }\n    let item = {\n        \"item_name\": productName,\n        \"item_id\": productID,\n        \"price\": productPrice,\n        \"item_brand\": productBrand,\n        \"quantity\": productQuantity,\n        \"index\": 0\n    };\n\n    let newItem = appendCategories(item, productCategoryList);\n\n    window.dataLayer &&\n    window.dataLayer.push({\n        \"event\": \"add_to_cart\",\n        \"ecommerce\": {\n            \"currency\": currencyCode,\n            \"value\": totalValue,\n            \"items\": [newItem]\n        }\n    });\n}\n\n// triggers add_to_cart event\nfunction removeFromCart(element, quantity, isMinicart) {\n    const $product = $(element);\n    let productID, productBrand, productName, productPrice, productQuantity, productCategoryList, totalValue;\n    if (isMinicart) {\n        productID = $product.attr(\"data-pid\");\n        productBrand = $product.attr(\"data-brand\");\n        productName = $product.find(\".line-item-name span\").text().trim();\n        productPrice = Number($product.find(\".sales .value\").text().trim().substring(1).replace(\".\", \"\"));\n        productCategoryList = $product.attr(\"data-categories\").split(\",\");\n    } else {\n        productID = $product.attr(\"data-pid\");\n        productBrand = $product.attr(\"data-brand\");\n        productName = $product.find(\".line-item-product-name\").text().trim();\n        productPrice = Number($product.find(\".sales .value\").text().trim().substring(1).replace(\".\", \"\"));\n        productCategoryList = $product.attr(\"data-categories\").split(\",\");\n    }\n    productQuantity = Number(quantity);\n    totalValue = productPrice * productQuantity;\n\n    let item = {\n        \"item_name\": productName,\n        \"item_id\": productID,\n        \"price\": productPrice,\n        \"item_brand\": productBrand,\n        \"quantity\": productQuantity,\n        \"index\": 0\n    };\n\n    let newItem = appendCategories(item, productCategoryList);\n\n    window.dataLayer &&\n    window.dataLayer.push({\n        \"event\": \"remove_from_cart\",\n        \"ecommerce\": {\n            \"currency\": currencyCode,\n            \"value\": totalValue,\n            \"items\": [newItem]\n        }\n    });\n}\n\n// triggers view_cart event\nfunction viewCart() {\n    const $products = $(\".product-info\");\n    const basketValue = Number($(\".grand-total\").text().trim().substring(1).replace(\".\", \"\"));\n    var objects = [];\n\n    if ($products.length) {\n        $products.each(function (index) {\n            let productID = $(this).attr(\"data-pid\");\n            let productBrand = $(this).attr(\"data-brand\");\n            let productName = $(this).find(\".line-item-product-name\").text().trim();\n            let productPrice = Number($(this).find(\".sales .value\").text().trim().substring(1).replace(\".\", \"\"));\n            let productCategoryList = $(this).attr(\"data-categories\").split(\",\");\n            let productQuantity = Number($(this).find(\".quantity.custom-select\").val());\n\n            const item = {\n                \"item_name\": productName,\n                \"item_id\": productID,\n                \"price\": productPrice,\n                \"brand\": productBrand,\n                \"quantity\": productQuantity,\n                \"index\": index\n            };\n\n            let newItem = appendCategories(item, productCategoryList);\n            objects.push(newItem);\n        });\n\n        window.dataLayer &&\n        window.dataLayer.push({\n            \"event\": \"view_cart\",\n            \"ecommerce\": {\n                \"currency\": currencyCode,\n                \"value\": basketValue,\n                \"items\": objects\n            }\n        });\n    }\n}\n\n// Used to trigger begin_checkout, add_shipping_info and add_payment_info event\nfunction checkoutEvents(label) {\n    const $products = $(\".product-summary-block .product-line-item\");\n    const basketValue = Number($(\".grand-total-sum\").first().text().trim().substring(1).replace(\".\", \"\"));\n    var objects = [];\n\n    $products.each(function (index) {\n        let productID = $(this).attr(\"data-pid\");\n        let productBrand = $(this).attr(\"data-brand\");\n        let productName = $(this).find(\".line-item-name span\").text().trim();\n        let productPrice = Number($(this).find(\".sales .value\").text().trim().substring(1).replace(\".\", \"\") || $(this).find(\".price .value\").text().trim().substring(1).replace(\".\", \"\"));\n        let productCategoryList = $(this).attr(\"data-categories\").split(\",\");\n        let productQuantity = Number($(this).find(\".qty-card-quantity-count\").text().trim());\n\n        const item = {\n            \"item_name\": productName,\n            \"item_id\": productID,\n            \"price\": productPrice,\n            \"brand\": productBrand,\n            \"quantity\": productQuantity,\n            \"index\": index\n        };\n\n        let newItem = appendCategories(item, productCategoryList);\n        objects.push(newItem);\n    });\n\n    var ecommerceObject = {\n        \"currency\": currencyCode,\n        \"value\": basketValue,\n        \"items\": objects\n    };\n\n    switch (label) {\n        case \"add_shipping_info\":\n            ecommerceObject[\"shipping_tier\"] = $(\".shipping-method-block .delivery-type-container.active\").first().find(\".custom-control-label\").text().trim();\n            break;\n        case \"add_payment_info\":\n            ecommerceObject[\"payment_type\"] = $(\".ahumada-custom-radio.selected\").first().closest(\".payment-methos-accordion-header\").attr(\"id\");\n            break;\n        case \"purchase\":\n            ecommerceObject[\"transaction_id\"] = $(\".summary-details.order-number\").text().trim();\n            ecommerceObject[\"shipping\"] = $(\".shipping-method-title\").text().trim();\n            ecommerceObject[\"payment\"] = $(\".credit-card-type span\").text().trim();\n            break;\n        default:\n            break;\n    }\n\n    window.dataLayer &&\n    window.dataLayer.push({\n        \"event\": label,\n        \"ecommerce\": ecommerceObject\n    });\n}\n\n// triggers sign_up event\nfunction gtmSignUp() {\n    window.dataLayer &&\n    window.dataLayer.push({\n        \"event\": \"sign_up\",\n        \"method\": \"Email\"\n    });\n}\n\n// triggers sign_up event\nfunction gtmLogin() {\n    window.dataLayer &&\n    window.dataLayer.push({\n        \"event\": \"login\",\n        \"method\": \"Email\"\n    });\n}\n\n// triggers search event\nfunction gtmSearch() {\n    const resultsCount = $(\".search-result-count\").attr(\"data-results-count\");\n    const searchQuery = $(\".search-result-for\").attr(\"data-search-query\");\n\n    window.dataLayer &&\n    window.dataLayer.push({\n        \"event\": \"search\",\n        \"search_term\": searchQuery,\n        \"search_results\": Number(resultsCount)\n    });\n}\n\n// adds the categories to the item object\nfunction appendCategories(item, productCategoryList) {\n    for (let j = 0; j < productCategoryList.length; j++) {\n        if (j === 0) {\n            item.item_category = productCategoryList[j];\n        } else {\n            item[\"item_category\" + (j + 1)] = productCategoryList[j].replace(/'/g, \"\");\n        }\n    }\n\n    return item;\n}\n\nmodule.exports.pageViewEvent = pageViewEvent;\nmodule.exports.selectItem = selectItem;\nmodule.exports.viewItem = viewItem;\nmodule.exports.viewItemList = viewItemList;\nmodule.exports.addToCart = addToCart;\nmodule.exports.viewCart = viewCart;\nmodule.exports.removeFromCart = removeFromCart;\nmodule.exports.gtmSearch = gtmSearch;\nmodule.exports.gtmSignUp = gtmSignUp;\nmodule.exports.gtmLogin = gtmLogin;\nmodule.exports.checkoutEvents = checkoutEvents;\n","\"use strict\";\n\nvar { initPopover } = require(\"../../js/utils/popoverUtils\");\nvar gtm = require(\"../gtm\");\n\n/**\n * Update DOM elements with Ajax results\n *\n * @param {Object} $results - jQuery DOM element\n * @param {string} selector - DOM element to look up in the $results\n * @return {undefined}\n */\nfunction updateDom($results, selector) {\n    var $updates = $results.find(selector);\n    $(selector).empty().html($updates.html());\n}\n\n/**\n * Keep refinement panes expanded/collapsed after Ajax refresh\n *\n * @param {Object} $results - jQuery DOM element\n * @return {undefined}\n */\nfunction handleRefinements($results) {\n    $(\".refinement.active\").each(function () {\n        $(this).removeClass(\"active\");\n        var activeDiv = $results.find(\".\" + $(this)[0].className.replace(/ /g, \".\"));\n        activeDiv.addClass(\"active\");\n        activeDiv.find(\"button.title\").attr(\"aria-expanded\", \"true\");\n    });\n\n    updateDom($results, \".refinements\");\n    initPopover();\n}\n\n/**\n * Parse Ajax results and updated select DOM elements\n *\n * @param {string} response - Ajax response HTML code\n * @return {undefined}\n */\nfunction parseResults(response) {\n    var $results = $(response);\n    var specialHandlers = {\n        \".refinements\": handleRefinements\n    };\n\n    // Update DOM elements that do not require special handling\n    [\n        \".grid-header\",\n        \".header-bar\",\n        \".header.page-title\",\n        \".product-grid\",\n        \".show-more:not(.show-more-related)\",\n        \".filter-bar\",\n        \".sort-order-container\"\n    ].forEach(function (selector) {\n        updateDom($results, selector);\n    });\n\n    Object.keys(specialHandlers).forEach(function (selector) {\n        specialHandlers[selector]($results);\n    });\n}\n\n/**\n * This function retrieves another page of content to display in the content search grid\n * @param {JQuery} $element - the jquery element that has the click event attached\n * @param {JQuery} $target - the jquery element that will receive the response\n * @return {undefined}\n */\nfunction getContent($element, $target) {\n    var showMoreUrl = $element.data(\"url\");\n    $.spinner().start();\n    $.ajax({\n        url: showMoreUrl,\n        method: \"GET\",\n        success: function (response) {\n            $target.append(response);\n            $.spinner().stop();\n        },\n        error: function () {\n            $.spinner().stop();\n        }\n    });\n}\n\n/**\n * Update sort option URLs from Ajax response\n *\n * @param {string} response - Ajax response HTML code\n * @return {undefined}\n */\nfunction updateSortOptions(response) {\n    var $tempDom = $(\"<div>\").append($(response));\n    var sortOptions = $tempDom.find(\".grid-footer\").data(\"sort-options\").options;\n    sortOptions.forEach(function (option) {\n        $(\"option.\" + option.id).val(option.url);\n    });\n}\n\nmodule.exports = {\n    filter: function () {\n        // Display refinements bar when Menu icon clicked\n        $(\".container\").on(\"click\", \"button.filter-results\", function () {\n            $(\".refinement-bar, .modal-background\").show();\n            $(\".refinement-bar\").siblings().attr(\"aria-hidden\", true);\n            $(\".refinement-bar\").closest(\".row\").siblings().attr(\"aria-hidden\", true);\n            $(\".refinement-bar\").closest(\".tab-pane.active\").siblings().attr(\"aria-hidden\", true);\n            $(\".refinement-bar\").closest(\".container.search-results\").siblings().attr(\"aria-hidden\", true);\n            $(\".refinement-bar .close\").focus();\n        });\n    },\n\n    closeRefinements: function () {\n        // Refinements close button\n        $(\".container\").on(\"click\", \".refinement-bar button.close, .modal-background\", function () {\n            $(\".refinement-bar, .modal-background\").hide();\n            $(\".refinement-bar\").siblings().attr(\"aria-hidden\", false);\n            $(\".refinement-bar\").closest(\".row\").siblings().attr(\"aria-hidden\", false);\n            $(\".refinement-bar\").closest(\".tab-pane.active\").siblings().attr(\"aria-hidden\", false);\n            $(\".refinement-bar\").closest(\".container.search-results\").siblings().attr(\"aria-hidden\", false);\n            $(\".btn.filter-results\").focus();\n        });\n    },\n\n    resize: function () {\n        // Close refinement bar and hide modal background if user resizes browser\n        $(window).resize(function () {\n            $(\".refinement-bar, .modal-background\").hide();\n            $(\".refinement-bar\").siblings().attr(\"aria-hidden\", false);\n            $(\".refinement-bar\").closest(\".row\").siblings().attr(\"aria-hidden\", false);\n            $(\".refinement-bar\").closest(\".tab-pane.active\").siblings().attr(\"aria-hidden\", false);\n            $(\".refinement-bar\").closest(\".container.search-results\").siblings().attr(\"aria-hidden\", false);\n        });\n    },\n\n    sort: function () {\n        // Handle sort order menu selection\n        $(\".container\").on(\"change\", \"[name=sort-order]\", function (e) {\n            e.preventDefault();\n\n            $.spinner().start();\n            $(this).trigger(\"search:sort\", this.value);\n            $.ajax({\n                url: this.value,\n                data: { selectedUrl: this.value, showRelatedProductGrid: true },\n                method: \"GET\",\n                success: function (response) {\n                    $(\".product-grid\").empty().html(response);\n                    initPopover();\n                    $.spinner().stop();\n                },\n                error: function () {\n                    $.spinner().stop();\n                }\n            });\n        });\n    },\n\n    showMore: function () {\n        // Show more products\n        $(\".container\").on(\"click\", \".show-more button\", function (e) {\n            e.stopPropagation();\n            e.preventDefault();\n\n            var showMoreUrl = $(this).data(\"url\");\n            const isRelatedSearchShowMore = $(this).data(\"related\");\n            const $gridSelector = isRelatedSearchShowMore\n                ? $(\".grid-footer-related\")\n                : $(\".grid-footer:not(.grid-footer-related)\");\n\n            $.spinner().start();\n            $(this).trigger(\"search:showMore\", e);\n            $.ajax({\n                url: showMoreUrl,\n                data: { selectedUrl: showMoreUrl, isRelatedSearchShowMore },\n                method: \"GET\",\n                success: function (response) {\n                    $gridSelector.replaceWith(response);\n                    var url = new URL(showMoreUrl);\n                    var searchParams = new URLSearchParams(url.search);\n                    if (searchParams.get(\"start\")) {\n                        var startValue = Number(searchParams.get(\"start\")) - 1;\n                        gtm.viewItemList($(\".product-grid\"), startValue);\n                    }\n                    if (!isRelatedSearchShowMore) {\n                        updateSortOptions(response);\n                    }\n                    initPopover();\n                    $.spinner().stop();\n                },\n                error: function () {\n                    $.spinner().stop();\n                }\n            });\n        });\n    },\n\n    applyFilter: function () {\n        // Handle refinement value selection and reset click\n        $(\".container\").on(\n            \"click\",\n            \".refinements li button, .refinement-bar button.reset, .filter-value button, .swatch-filter button\",\n            function (e) {\n                e.preventDefault();\n                e.stopPropagation();\n\n                $.spinner().start();\n                $(this).trigger(\"search:filter\", e);\n                var attributeId = \"#\" + $(this).find(\"span\").last().attr(\"id\");\n                $.ajax({\n                    url: $(this).data(\"href\"),\n                    data: {\n                        page: $(\".grid-footer\").data(\"page-number\"),\n                        selectedUrl: $(this).data(\"href\")\n                    },\n                    method: \"GET\",\n                    success: function (response) {\n                        parseResults(response);\n                        $.spinner().stop();\n                        $(attributeId).parent(\"button\").focus();\n                    },\n                    error: function () {\n                        $.spinner().stop();\n                        $(attributeId).parent(\"button\").focus();\n                    }\n                });\n            });\n    },\n\n    showContentTab: function () {\n        // Display content results from the search\n        $(\".container\").on(\"click\", \".content-search\", function () {\n            if ($(\"#content-search-results\").html() === \"\") {\n                getContent($(this), $(\"#content-search-results\"));\n            }\n        });\n\n        // Display the next page of content results from the search\n        $(\".container\").on(\"click\", \".show-more-content button\", function () {\n            getContent($(this), $(\"#content-search-results\"));\n            $(\".show-more-content\").remove();\n        });\n    },\n    initPopover\n};\n","\"use strict\";\n\n/**\n* Checks if the device is a touch screen\n* @returns {boolean} - true if the device is a touch screen, false otherwise\n*/\nfunction isTouchScreen() {\n    return ((\"ontouchstart\" in window) ||\n        (navigator.maxTouchPoints > 0) ||\n        (navigator.msMaxTouchPoints > 0));\n}\n\n/**\n* Generates a template for the popover\n* @returns {string} - The template for the popover\n*/\nfunction popoverTemplate() {\n    return `<div class=\"popover\" role=\"tooltip\">\n                <div class=\"arrow\"></div>\n                <h3 class=\"popover-header\"></h3>\n                <div class=\"popover-body\"></div>\n            </div>`;\n}\n\n/**\n* Closes the popover when clicking outside of it\n*/\nfunction closePopoverOnClickOutside() {\n    $(document).on(\"click\", function (e) {\n        $(\"[data-toggle='popover'],[data-original-title]\").each(function () {\n            var $this = $(this);\n            // the \"is\" for buttons that trigger popups\n            // the \"has\" for icons within a button that triggers a popup\n            if (!$this.is(e.target) && $this.has(e.target).length === 0 && $(\".popover\").has(e.target).length === 0) {\n                (($this.popover(\"hide\").data(\"bs.popover\") || {}).inState || {}).click = false; // fix for BS 3.3.6\n            }\n        });\n    });\n}\n\n/**\n* Initializes the badges popover\n* @param {Object} popoverTrigger - the trigger element for the popover\n* @param {Object} popoverTemplateContent - the template content for the popover\n* @param {Object} commonConfig - the common configuration for the popover\n*/\nfunction initPopover() {\n    const commonConfig = {\n        template: popoverTemplate(),\n        container: \"body\",\n        html: true\n    };\n\n    $(\".js-popover\").each(function () {\n        const $currentPopover = $(this);\n        const customBoundarySelector = $($currentPopover.data(\"custom-boundary\"))[0] || \"viewport\";\n        const container = $currentPopover.data(\"container\") || \"body\";\n        const placement = $currentPopover.data(\"placement\") || \"top\";\n        const hasImage = /<img/.test($currentPopover.data(\"content\"));\n        const offset = $currentPopover.data(\"popover-offset\") || 0;\n\n        $currentPopover.popover({\n            ...commonConfig,\n            trigger: isTouchScreen() ? \"click\" : \"hover\",\n            boundary: customBoundarySelector,\n            container: container,\n            placement: placement,\n            offset: offset\n        });\n\n        // Prevents image flickering on popover\n        if (hasImage) {\n            $currentPopover.popover(\"show\").popover(\"hide\");\n        }\n\n        $currentPopover.on(\"shown.bs.popover\", ({ target }) => {\n            // This piece of code gets the connected popover (the \"tip\" is the popover element)\n            const openedPopover = $(target).data(\"bs.popover\").tip;\n            $(openedPopover).popover(\"update\");\n        });\n    });\n\n    // If it\"s a touch screen, close the popover when clicking outside of it\n    if (isTouchScreen()) {\n        closePopoverOnClickOutside();\n    }\n}\n\nmodule.exports = {\n    initPopover\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 = '<li><div>' + response.resources.info_selectforstock + '</div></li>';\n    } else {\n        availabilityMessages.forEach(function (message) {\n            availabilityValue += '<li><div>' + message + '</div></li>';\n        });\n    }\n\n    $($productContainer).trigger('product:updateAvailability', {\n        product: response.product,\n        $productContainer: $productContainer,\n        message: availabilityValue,\n        resources: response.resources\n    });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n    if (!attributes) {\n        return '';\n    }\n\n    var html = '';\n\n    attributes.forEach(function (attributeGroup) {\n        if (attributeGroup.ID === 'mainAttributes') {\n            attributeGroup.attributes.forEach(function (attribute) {\n                html += '<div class=\"attribute-values\">' + attribute.label + ': '\n                    + attribute.value + '</div>';\n            });\n        }\n    });\n\n    return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n    $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n    var carousel = $productContainer.find('.carousel');\n    $(carousel).carousel('dispose');\n    var carouselId = $(carousel).attr('id');\n    $(carousel).empty().append('<ol class=\"carousel-indicators\"></ol><div class=\"carousel-inner\" role=\"listbox\"></div><a class=\"carousel-control-prev\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"prev\"><span class=\"fa icon-prev\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('prev') + '</span></a><a class=\"carousel-control-next\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"next\"><span class=\"fa icon-next\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('next') + '</span></a>');\n    for (var i = 0; i < imgs.length; i++) {\n        $('<div class=\"carousel-item\"><img src=\"' + imgs[i].url + '\" class=\"d-block img-fluid\" alt=\"' + imgs[i].alt + ' image number ' + parseInt(imgs[i].index, 10) + '\" title=\"' + imgs[i].title + '\" itemprop=\"image\" /></div>').appendTo($(carousel).find('.carousel-inner'));\n        $('<li data-target=\"#' + carouselId + '\" data-slide-to=\"' + i + '\" class=\"\"></li>').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 '<option value=\"' + quantity.value + '\"  data-url=\"' + quantity.url + '\"' +\n                selected + '>' + quantity.value + '</option>';\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 = $('<div>').append($.parseHTML(html));\n\n    var body = $html.find('.choice-of-bonus-product');\n    var footer = $html.find('.modal-footer').children();\n\n    return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n    $('.modal-body').spinner().start();\n\n    if ($('#chooseBonusProductModal').length !== 0) {\n        $('#chooseBonusProductModal').remove();\n    }\n    var bonusUrl;\n    if (data.bonusChoiceRuleBased) {\n        bonusUrl = data.showProductsUrlRuleBased;\n    } else {\n        bonusUrl = data.showProductsUrlListBased;\n    }\n\n    var htmlString = '<!-- Modal -->'\n        + '<div class=\"modal fade\" id=\"chooseBonusProductModal\" tabindex=\"-1\" role=\"dialog\">'\n        + '<span class=\"enter-message sr-only\" ></span>'\n        + '<div class=\"modal-dialog choose-bonus-product-dialog\" '\n        + 'data-total-qty=\"' + data.maxBonusItems + '\"'\n        + 'data-UUID=\"' + data.uuid + '\"'\n        + 'data-pliUUID=\"' + data.pliUUID + '\"'\n        + 'data-addToCartUrl=\"' + data.addToCartUrl + '\"'\n        + 'data-pageStart=\"0\"'\n        + 'data-pageSize=\"' + data.pageSize + '\"'\n        + 'data-moreURL=\"' + data.showProductsUrlRuleBased + '\"'\n        + 'data-bonusChoiceRuleBased=\"' + data.bonusChoiceRuleBased + '\">'\n        + '<!-- Modal content-->'\n        + '<div class=\"modal-content\">'\n        + '<div class=\"modal-header\">'\n        + '    <span class=\"\">' + data.labels.selectprods + '</span>'\n        + '    <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n        + '        <span aria-hidden=\"true\">&times;</span>'\n        + '        <span class=\"sr-only\"> </span>'\n        + '    </button>'\n        + '</div>'\n        + '<div class=\"modal-body\"></div>'\n        + '<div class=\"modal-footer\"></div>'\n        + '</div>'\n        + '</div>'\n        + '</div>';\n    $('body').append(htmlString);\n    $('.modal-body').spinner().start();\n\n    $.ajax({\n        url: bonusUrl,\n        method: 'GET',\n        dataType: 'json',\n        success: function (response) {\n            var parsedHtml = parseHtml(response.renderedTemplate);\n            $('#chooseBonusProductModal .modal-body').empty();\n            $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n            $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n            $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n            $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n            $('#chooseBonusProductModal').modal('show');\n            $.spinner().stop();\n        },\n        error: function () {\n            $.spinner().stop();\n        }\n    });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n    $('.minicart').trigger('count:update', response);\n    var messageType = response.error ? 'alert-danger' : 'alert-success';\n    // show add to cart toast\n    if (response.newBonusDiscountLineItem\n        && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n        chooseBonusProducts(response.newBonusDiscountLineItem);\n    } else {\n        if ($('.add-to-cart-messages').length === 0) {\n            $('body').append(\n                '<div class=\"add-to-cart-messages\"></div>'\n            );\n        }\n\n        $('.add-to-cart-messages').append(\n            '<div class=\"alert ' + messageType + ' add-to-basket-alert text-center\" role=\"alert\">'\n            + response.message\n            + '</div>'\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                + '<div class=\"selected-pid row\" '\n                + 'data-pid=\"' + pid + '\"'\n                + 'data-qty=\"' + submittedQty + '\"'\n                + 'data-optionID=\"' + (optionID || '') + '\"'\n                + 'data-option-selected-value=\"' + (valueId || '') + '\"'\n                + '>'\n                + '<div class=\"col-sm-11 col-9 bonus-product-name\" >'\n                + $choiceOfBonusProduct.find('.product-name').html()\n                + '</div>'\n                + '<div class=\"col-1\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div>'\n                + '</div>'\n                ;\n                $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n                $('.pre-cart-products').html(totalQty);\n                $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n            } else {\n                $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n            }\n        });\n    },\n    removeBonusProduct: function () {\n        $(document).on('click', '.selected-pid', function () {\n            $(this).remove();\n            var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n            var count = 0;\n            if ($selected.length) {\n                $selected.each(function () {\n                    count += parseInt($(this).data('qty'), 10);\n                });\n            }\n\n            $('.pre-cart-products').html(count);\n            $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n        });\n    },\n    enableBonusProductSelection: function () {\n        $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n            $('button.select-bonus-product', response.$productContainer).attr('disabled',\n                (!response.product.readyToOrder || !response.product.available));\n            var pid = response.product.id;\n            $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n        });\n    },\n    showMoreBonusProducts: function () {\n        $(document).on('click', '.show-more-bonus-products', function () {\n            var url = $(this).data('url');\n            $('.modal-content').spinner().start();\n            $.ajax({\n                url: url,\n                method: 'GET',\n                success: function (html) {\n                    var parsedHtml = parseHtml(html);\n                    $('.modal-body').append(parsedHtml.body);\n                    $('.show-more-bonus-products:first').remove();\n                    $('.modal-content').spinner().stop();\n                },\n                error: function () {\n                    $('.modal-content').spinner().stop();\n                }\n            });\n        });\n    },\n    addBonusProductsToCart: function () {\n        $(document).on('click', '.add-bonus-products', function () {\n            var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n            var queryString = '?pids=';\n            var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n            var pidsObject = {\n                bonusProducts: []\n            };\n\n            $.each($readyToOrderBonusProducts, function () {\n                var qtyOption =\n                    parseInt($(this)\n                        .data('qty'), 10);\n\n                var option = null;\n                if (qtyOption > 0) {\n                    if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n                        option = {};\n                        option.optionId = $(this).data('optionid');\n                        option.productId = $(this).data('pid');\n                        option.selectedValueId = $(this).data('option-selected-value');\n                    }\n                    pidsObject.bonusProducts.push({\n                        pid: $(this).data('pid'),\n                        qty: qtyOption,\n                        options: [option]\n                    });\n                    pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n                }\n            });\n            queryString += JSON.stringify(pidsObject);\n            queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n            queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n            $.spinner().start();\n            $.ajax({\n                url: url + queryString,\n                method: 'POST',\n                success: function (data) {\n                    $.spinner().stop();\n                    if (data.error) {\n                        $('#chooseBonusProductModal').modal('hide');\n                        if ($('.add-to-cart-messages').length === 0) {\n                            $('body').append('<div class=\"add-to-cart-messages\"></div>');\n                        }\n                        $('.add-to-cart-messages').append(\n                            '<div class=\"alert alert-danger add-to-basket-alert text-center\"'\n                            + ' role=\"alert\">'\n                            + data.errorMessage + '</div>'\n                        );\n                        setTimeout(function () {\n                            $('.add-to-basket-alert').remove();\n                        }, 3000);\n                    } else {\n                        $('.configure-bonus-product-attributes').html(data);\n                        $('.bonus-products-step2').removeClass('hidden-xl-down');\n                        $('#chooseBonusProductModal').modal('hide');\n\n                        if ($('.add-to-cart-messages').length === 0) {\n                            $('body').append('<div class=\"add-to-cart-messages\"></div>');\n                        }\n                        $('.minicart-quantity').html(data.totalQty);\n                        $('.add-to-cart-messages').append(\n                            '<div class=\"alert alert-success add-to-basket-alert text-center\"'\n                            + ' role=\"alert\">'\n                            + data.msgSuccess + '</div>'\n                        );\n                        setTimeout(function () {\n                            $('.add-to-basket-alert').remove();\n                            if ($('.cart-page').length) {\n                                location.reload();\n                            }\n                        }, 1500);\n                    }\n                },\n                error: function () {\n                    $.spinner().stop();\n                }\n            });\n        });\n    },\n\n    getPidValue: getPidValue,\n    getQuantitySelected: getQuantitySelected,\n    miniCartReportingUrl: miniCartReportingUrl\n};\n","'use strict';\nvar base = require('./base');\nvar focusHelper = require('../components/focus');\n\n/**\n * Generates the modal window on the first call.\n *\n */\nfunction getModalHtmlElement() {\n    if ($('#quickViewModal').length !== 0) {\n        $('#quickViewModal').remove();\n    }\n    var htmlString = '<!-- Modal -->'\n        + '<div class=\"modal fade\" id=\"quickViewModal\" role=\"dialog\">'\n        + '<span class=\"enter-message sr-only\" ></span>'\n        + '<div class=\"modal-dialog quick-view-dialog\">'\n        + '<!-- Modal content-->'\n        + '<div class=\"modal-content\">'\n        + '<div class=\"modal-header\">'\n        + '    <a class=\"full-pdp-link\" href=\"\"></a>'\n        + '    <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n        + '        <span aria-hidden=\"true\">&times;</span>'\n        + '        <span class=\"sr-only\"> </span>'\n        + '    </button>'\n        + '</div>'\n        + '<div class=\"modal-body\"></div>'\n        + '<div class=\"modal-footer\"></div>'\n        + '</div>'\n        + '</div>'\n        + '</div>';\n    $('body').append(htmlString);\n}\n\n/**\n * @typedef {Object} QuickViewHtml\n * @property {string} body - Main Quick View body\n * @property {string} footer - Quick View footer content\n */\n\n/**\n * Parse HTML code in Ajax response\n *\n * @param {string} html - Rendered HTML from quickview template\n * @return {QuickViewHtml} - QuickView content components\n */\nfunction parseHtml(html) {\n    var $html = $('<div>').append($.parseHTML(html));\n\n    var body = $html.find('.product-quickview');\n    var footer = $html.find('.modal-footer').children();\n\n    return { body: body, footer: footer };\n}\n\n/**\n * replaces the content in the modal window on for the selected product variation.\n * @param {string} selectedValueUrl - url to be used to retrieve a new product model\n */\nfunction fillModalElement(selectedValueUrl) {\n    $('.modal-body').spinner().start();\n    $.ajax({\n        url: selectedValueUrl,\n        method: 'GET',\n        dataType: 'json',\n        success: function (data) {\n            var parsedHtml = parseHtml(data.renderedTemplate);\n\n            $('.modal-body').empty();\n            $('.modal-body').html(parsedHtml.body);\n            $('.modal-footer').html(parsedHtml.footer);\n            $('.full-pdp-link').text(data.quickViewFullDetailMsg);\n            $('#quickViewModal .full-pdp-link').attr('href', data.productUrl);\n            $('#quickViewModal .size-chart').attr('href', data.productUrl);\n            $('#quickViewModal .modal-header .close .sr-only').text(data.closeButtonText);\n            $('#quickViewModal .enter-message').text(data.enterDialogMessage);\n            $('#quickViewModal').modal('show');\n            $('body').trigger('quickview:ready');\n\n            $.spinner().stop();\n        },\n        error: function () {\n            $.spinner().stop();\n        }\n    });\n}\n\nmodule.exports = {\n    showQuickview: function () {\n        $('body').on('click', '.quickview', function (e) {\n            e.preventDefault();\n            var selectedValueUrl = $(this).closest('a.quickview').attr('href');\n            $(e.target).trigger('quickview:show');\n            getModalHtmlElement();\n            fillModalElement(selectedValueUrl);\n        });\n    },\n    focusQuickview: function () {\n        $('body').on('shown.bs.modal', '#quickViewModal', function () {\n            $('#quickViewModal .close').focus();\n        });\n    },\n    trapQuickviewFocus: function () {\n        $('body').on('keydown', '#quickViewModal', function (e) {\n            var focusParams = {\n                event: e,\n                containerSelector: '#quickViewModal',\n                firstElementSelector: '.full-pdp-link',\n                lastElementSelector: '.add-to-cart-global',\n                nextToLastElementSelector: '.modal-footer .quantity-select'\n            };\n            focusHelper.setTabNextFocus(focusParams);\n        });\n    },\n    availability: base.availability,\n    addToCart: base.addToCart,\n    showSpinner: function () {\n        $('body').on('product:beforeAddToCart', function (e, data) {\n            $(data).closest('.modal-content').spinner().start();\n        });\n    },\n    hideDialog: function () {\n        $('body').on('product:afterAddToCart', function () {\n            $('#quickViewModal').modal('hide');\n        });\n    },\n    beforeUpdateAttribute: function () {\n        $('body').on('product:beforeAttributeSelect', function () {\n            $('.modal.show .modal-content').spinner().start();\n        });\n    },\n    updateAttribute: function () {\n        $('body').on('product:afterAttributeSelect', function (e, response) {\n            if ($('.modal.show .product-quickview>.bundle-items').length) {\n                $('.modal.show').find(response.container).data('pid', response.data.product.id);\n                $('.modal.show').find(response.container)\n                    .find('.product-id').text(response.data.product.id);\n            } else if ($('.set-items').length) {\n                response.container.find('.product-id').text(response.data.product.id);\n            } else {\n                $('.modal.show .product-quickview').data('pid', response.data.product.id);\n                $('.modal.show .full-pdp-link')\n                    .attr('href', response.data.product.selectedProductUrl);\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            // update global add to cart (single products, bundles)\n            var dialog = $(response.$productContainer)\n                .closest('.quick-view-dialog');\n\n            $('.add-to-cart-global', dialog).attr('disabled',\n                !$('.global-availability', dialog).data('ready-to-order')\n                || !$('.global-availability', dialog).data('available')\n            );\n        });\n    },\n    updateAvailability: function () {\n        $('body').on('product:updateAvailability', function (e, response) {\n            // bundle individual products\n            $('.product-availability', response.$productContainer)\n                .data('ready-to-order', response.product.readyToOrder)\n                .data('available', response.product.available)\n                .find('.availability-msg')\n                .empty()\n                .html(response.message);\n\n\n            var dialog = $(response.$productContainer)\n                .closest('.quick-view-dialog');\n\n            if ($('.product-availability', dialog).length) {\n                // bundle all products\n                var allAvailable = $('.product-availability', dialog).toArray()\n                    .every(function (item) { return $(item).data('available'); });\n\n                var allReady = $('.product-availability', dialog).toArray()\n                    .every(function (item) { return $(item).data('ready-to-order'); });\n\n                $('.global-availability', dialog)\n                    .data('ready-to-order', allReady)\n                    .data('available', allAvailable);\n\n                $('.global-availability .availability-msg', dialog).empty()\n                    .html(allReady ? response.message : response.resources.info_selectforstock);\n            } else {\n                // single product\n                $('.global-availability', dialog)\n                    .data('ready-to-order', response.product.readyToOrder)\n                    .data('available', response.product.available)\n                    .find('.availability-msg')\n                    .empty()\n                    .html(response.message);\n            }\n        });\n    }\n};\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","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","\"use strict\";\n\nvar processInclude = require(\"base/util\");\n\n$(document).ready(function () {\n    processInclude(require(\"./search/search\"));\n    processInclude(require(\"base/product/quickView\"));\n});\n"],"names":[],"sourceRoot":""}