{"version":3,"file":"default/js/eGiftCard.js","mappings":";;;;;;;;;;AAAa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClHa;;AAEb;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACrDa;;AAEb,6BAA6B,mBAAO,CAAC,oJAA0B;AAC/D,uBAAuB,mBAAO,CAAC,oHAAwB;AACvD,gCAAgC,mBAAO,CAAC,gKAAuC;;AAE/E,mCAAmC,mBAAO,CAAC,oKAAyC;;AAEpF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,SAAS,eAAe,4BAA4B;AACjE,KAAK,aAAa;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA,6BAA6B;AAC7B;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;AChVa;;AAEb;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;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,qBAAqB;AACrB;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC1Ga;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,wCAAwC,mBAAO,CAAC,8KAA8C;AAC9F,uBAAuB,mBAAO,CAAC,4IAA6B;AAC5D,gCAAgC,mBAAO,CAAC,gKAAuC;AAC/E,qCAAqC,mBAAO,CAAC,wKAA2C;;AAExF;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,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC7Ea;;AAEb,uBAAuB,mBAAO,CAAC,oHAAwB;;AAEvD;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA,aAAa;;AAEb;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClIa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;;;;;;;;;;AC/Ba;AACb;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACjLa;;AAEb;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA,sCAAsC;;AAEtC;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA,sCAAsC;;AAEtC;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxDa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,uBAAuB,mBAAO,CAAC,mIAAoB;AACnD,kCAAkC,mBAAO,CAAC,wKAA2C;;AAErF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClPa;;AAEb,gCAAgC,mBAAO,CAAC,gKAAuC;;AAE/E;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACzBa;;AAEb;AACA;;AAEA;AACA,aAAa,mBAAO,CAAC,gGAAc;AACnC,sBAAsB,mBAAO,CAAC,yIAA4B;;AAE1D;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC/Da;;AAEb;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA,iBAAiB,mBAAO,CAAC,gGAAc;AACvC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACzEa;AACb;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA,aAAa;AACb;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,gCAAgC;AAC1F;AACA,qDAAqD,kBAAkB;AACvE;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,SAAS,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,qDAAqD,OAAO;;AAE5D;;AAEA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;;AAEA;AACA;;AAEA,qBAAqB,mBAAO,CAAC,wGAAgB;AAC7C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA,6CAA6C;;AAE7C;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,gBAAgB,mBAAO,CAAC,4JAA0C;AAClE,eAAe,mBAAO,CAAC,wJAAwC;AAC/D,mBAAmB,mBAAO,CAAC,wKAAgD;AAC3E,qBAAqB,mBAAO,CAAC,4KAAkD;AAC/E,aAAa,mBAAO,CAAC,gJAAoC;AACzD,kBAAkB,mBAAO,CAAC,8IAAmC;AAC7D;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChBa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,iCAAiC,mBAAO,CAAC,4JAAuC;;AAEhF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACnCa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvEa;;AAEb;AACA,aAAa,mBAAO,CAAC,gGAAc;AACnC,oBAAoB,mBAAO,CAAC,+HAA0B;AACtD,gBAAgB,mBAAO,CAAC,uHAAsB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC3Da;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,WAAW,YAAY;AACvB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,YAAY;AACvB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,YAAY;AACvB;AACA;AACA,mBAAmB;;AAEnB;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC9Ea;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,oBAAoB,mBAAO,CAAC,sHAAiB;AAC7C,sBAAsB,mBAAO,CAAC,0HAAmB;;AAEjD;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,YAAY;AACvB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChNA,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC7Ha;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,kBAAkB,mBAAO,CAAC,6HAAwB;;AAElD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACnDa;;AAEb;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,uHAAuH;AACvH;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC7Fa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,wBAAwB,mBAAO,CAAC,mJAAmC;;AAEnE;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B,MAAM;AAChC,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpLA;AACA;AACA;;AAEa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA,kBAAkB;AAClB;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,4BAA4B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;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,qBAAqB;AACrB;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;ACrVA;AACA;AACA;AACA;AACa;AACb;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC/CA;AACA;AACA;;AAEa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChBA;AACA;AACA;;AAEa;;AAEb,qBAAqB,mBAAO,CAAC,qHAAoB;;AAEjD;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,aAAa;AACb;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,kBAAkB;AAClB;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;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;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;;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;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;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;;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;AACA;AACA;AACA,qBAAqB;AACrB;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;ACjgBA;AACA;AACA;;AAEa;;AAEb;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;;;;;;;;;;;AC5HA;AACA;AACA;AACa;;AAEb,qBAAqB,mBAAO,CAAC,qHAAoB;AACjD,eAAe,mBAAO,CAAC,2HAAuB;AAC9C,+BAA+B,mBAAO,CAAC,oPAAwH;;;AAG/J;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA,sCAAsC,gCAAgC,KAAK,oEAAoE;AAC/I;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;;AAEA,yDAAyD;AACzD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;;;;;;;;;;;AC17BA;AACA,IAAI,KAAyC;AAC7C,IAAI,iCAAO,EAAE,mCAAE;AACf;AACA,KAAK;AAAA,kGAAC,GAAG,CAGsD;AAC/D,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,yBAAyB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,6BAA6B,gEAAgE;AAC7F;AACA;AACA;AACA,CAAC;;;;;;UCzGD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;;;;;;ACtBA;AACA;AACA;;AAEa;;AAEb;AACA;AACA;AACA,wBAAwB,mBAAO,CAAC,iHAAuB;AACvD,mBAAmB,mBAAO,CAAC,2GAAoB;AAC/C,uBAAuB,mBAAO,CAAC,mHAAwB;AACvD,uBAAuB,mBAAO,CAAC,mHAAwB;;AAEvD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL,CAAC;;;;;;;;ACrBD,mBAAO,CAAC,yEAAe,IAAI","sources":["webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/helpers/applePayHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/braintreeGeneral.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/braintreesdk/braintreeCreditCardModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/braintreesdk/braintreeCreditCardSDK.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/components/creditCardSessionAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/components/creditCardVaultManagerModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/braintreeCreditCardSdkHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/creditCardFormFieldsHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/creditCardHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/creditCardPaymentProcessingHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/creditCardSessionAccountHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/components/googlePaySessionAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/helpers/googlePayHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/helper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/loaderHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalSessionAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalSessionAccountHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/components/srcSessionAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/helpers/srcButtonHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/helpers/srcHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/helpers/srcListHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/components/venmoSessionAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/errorhandler/venmoErrorHandler.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/helpers/venmoHelper.js","webpack://sfra-startup-kit/./cartridges/int_egiftcard_sfra/cartridge/client/default/js/eGiftCard/egCart.js","webpack://sfra-startup-kit/./cartridges/int_egiftcard_sfra/cartridge/client/default/js/eGiftCard/egFormValidation.js","webpack://sfra-startup-kit/./cartridges/int_egiftcard_sfra/cartridge/client/default/js/eGiftCard/egInputSanitization.js","webpack://sfra-startup-kit/./cartridges/int_egiftcard_sfra/cartridge/client/default/js/eGiftCard/egRegistry.js","webpack://sfra-startup-kit/./cartridges/int_egiftcard_sfra/cartridge/client/default/js/eGiftCard/egWishlist.js","webpack://sfra-startup-kit/./cartridges/int_egiftcard_sfra/cartridge/client/default/js/eGiftCard/egiftcard.js","webpack://sfra-startup-kit/./node_modules/svg4everybody/dist/svg4everybody.js","webpack://sfra-startup-kit/webpack/bootstrap","webpack://sfra-startup-kit/./cartridges/int_egiftcard_sfra/cartridge/client/default/js/eGiftCard.js","webpack://sfra-startup-kit/./node_modules/svg-spritemap-webpack-plugin/svg4everybody-helper.js"],"sourcesContent":["'use strict';\n\nvar helper = require('../../helper');\n\nvar $applePayButton = document.querySelector('.js_braintree_applepay_button');\nvar $applepayDataMethod = document.querySelector('.payment-options[role=tablist] .nav-item[data-method-id=\"DW_APPLE_PAY\"]');\nvar $phoneField = document.querySelector('.contact-info-block [name=dwfrm_billing_contactInfoFields_phone]');\n\n/**\n * Returns Braintree Apple Pay configs\n * @returns {Object} Braintree Apple Pay configs\n */\nfunction getBraintreeApplePayConfigs() {\n var braintreeApplePayButtonConfigs = null;\n\n try {\n braintreeApplePayButtonConfigs = JSON.parse(document.querySelector('.js_braintree_applepay_button').getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeApplePayButtonConfigs;\n }\n\n return braintreeApplePayButtonConfigs;\n}\n\n/**\n * Sets device data from 'data collector' to corresponding input field\n * @param {Object} fraudDataPayload Froud payload data\n */\n\nfunction setApplePayDeviceData(fraudDataPayload) {\n var $braintreeApplePayDeviceData = document.querySelector('input[name=braintreeApplePayDeviceDataInput]');\n\n if (fraudDataPayload.deviceData) {\n $braintreeApplePayDeviceData.value = fraudDataPayload.deviceData;\n }\n}\n\n/**\n * Sets shipping data from 'data collector' to corresponding input field\n * @param {Object} shippingAddressPayload Shipping Address payload data\n */\n\nfunction setApplePayShippingAddress(shippingAddressPayload) {\n var $braintreeApplePayShippingAddress = $('input[name=braintreeApplePayShippingAddress]');\n\n if (shippingAddressPayload) {\n $braintreeApplePayShippingAddress.val(JSON.stringify(shippingAddressPayload));\n $braintreeApplePayShippingAddress.trigger('change');\n }\n}\n\n/**\n * Shows Apple Pay button\n */\nfunction showApplePayButton() {\n $applePayButton.style.display = 'block';\n\n if ($applepayDataMethod) {\n $applepayDataMethod.style.display = 'block';\n }\n}\n\n/**\n * Hides Apple Pay tab on the Checkout/Billing page\n */\nfunction hideApplePayTab() {\n $applePayButton.style.display = 'none';\n if ($applepayDataMethod) {\n $applepayDataMethod.style.display = 'none';\n }\n}\n\n/**\n * Marks Apple Pay button as disabled\n */\nfunction makeApplePayButtonDisabled() {\n $applePayButton.classList.add('js_braintree_applepay_button_disabled');\n}\n\n/**\n * Remove session Apple Pay nonce\n */\nfunction removeSessionNonce() {\n document.querySelector('#braintreeApplePayNonce').value = '';\n document.querySelector('#braintreeApplePayDeviceData').value = '';\n}\n\n/**\n * Validates required billing form fields\n * @returns {boolean} Whether billing form fields are valid\n */\nfunction isBilligFiledsValid() {\n return helper.isValidInputField($phoneField);\n}\n\n/**\n * Depends of the 'data-paypal-is-hide-continue-button' hides or shows continue button on the Billing Page\n */\nfunction toggleContinueButtonOnBillingPage() {\n var applePayContent = document.querySelector('.js_braintree_applepayContent');\n\n helper.continueButtonToggle(applePayContent.getAttribute('data-paypal-is-hide-continue-button'));\n}\n\nmodule.exports = {\n getBraintreeApplePayConfigs,\n setApplePayDeviceData,\n showApplePayButton,\n makeApplePayButtonDisabled,\n removeSessionNonce,\n isBilligFiledsValid,\n hideApplePayTab,\n toggleContinueButtonOnBillingPage,\n setApplePayShippingAddress\n};\n","'use strict';\n\n/* global braintree $ */\n\n/**\n * Create Braintree Client Instance from Client Token\n * @param {string} clientToken Braintree client token\n * @returns {Promise} returns promise with Braintree Client Instance\n */\nfunction createClientInstance(clientToken) {\n return braintree.client.create({\n authorization: clientToken\n });\n}\n\n/**\n * Fraud data generation\n * @param {Promise} btClientInstancePromise Promise with Client Instance\n * @returns {Promise} returns promise with fraud data\n */\nfunction collectFraudData(btClientInstancePromise) {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n return braintree.dataCollector.create({\n client: btClientInstance,\n kount: true\n });\n });\n}\n\n/**\n * Get array with Braintree Customer Payment Mehtods by Personalized Client Instance\n * @param {Promise} btClientInstancePromise Promise with Client Instance\n * @returns {array} array with Braintree Customer Payment Mehtod (if any) in opposite case empty array will be returned\n */\nfunction getBtCustomerPaymentMethods(btClientInstancePromise) {\n return btClientInstancePromise\n .then(function (clientInstance) {\n return braintree.vaultManager.create({\n client: clientInstance\n });\n })\n .then(function (vaultManager) {\n return vaultManager.fetchPaymentMethods({\n defaultFirst: true\n });\n });\n}\n\nmodule.exports = {\n createClientInstance,\n collectFraudData,\n getBtCustomerPaymentMethods\n};\n","'use strict';\n\nvar braintreeCreditCardSDK = require('./braintreeCreditCardSDK');\nvar braintreeGeneral = require('../../braintreeGeneral');\nvar creditCardFormFieldHelper = require('../helpers/creditCardFormFieldsHelper');\n\nvar braintreeCreditCardSdkHelper = require('../helpers/braintreeCreditCardSdkHelper');\n\n/* global Promise braintree $ */\n\n// global variables\nvar hostedFieldsInstance;\nvar btClientInstancePromise;\nvar orderData;\nvar sitePrefs = {};\n\n/**\n * Init Braintree Credit Card model\n * @param {Promise} braintreeClientInstancePromise Braintreee client instance promise\n * @param {boolean} isSkip3dSecureLiabilityResult 'BRAINTREE_3DSecure_Skip_Client_Validation_Result' site preference value\n * @param {boolean} is3dSecureEnabled 'BRAINTREE_3DSecure_Enabled' site preference value\n * @param {bollean} isFraudToolsEnabled Is fraud tools enabled value\n */\nfunction init(braintreeClientInstancePromise, isSkip3dSecureLiabilityResult, is3dSecureEnabled, isFraudToolsEnabled) {\n braintreeCreditCardSDK.init(braintreeClientInstancePromise);\n\n btClientInstancePromise = braintreeClientInstancePromise;\n sitePrefs = {\n isSkip3dSecureLiabilityResult: isSkip3dSecureLiabilityResult,\n is3dSecureEnabled: is3dSecureEnabled,\n isFraudToolsEnabled: isFraudToolsEnabled\n };\n}\n\n\n/**\n * Gets required additional shipping info for 3ds\n *\n * @param {Object} orderAddress - User's shipping address\n * @returns {Object} an object with required fields\n */\n\nfunction getShippingAdditionalInfo(orderAddress) {\n var shippingData = {\n workPhoneNumber: orderAddress.phone,\n shippingGivenName: orderAddress.recipientName.split(' ').slice(0, -1).join(' '),\n shippingSurname: orderAddress.recipientName.split(' ').slice(-1).join(' '),\n shippingPhone: orderAddress.phone,\n shippingAddress: {\n streetAddress: orderAddress.line1,\n extendedAddress: orderAddress.line2,\n locality: orderAddress.city,\n region: orderAddress.state,\n postalCode: orderAddress.postalCode,\n countryCodeAlpha2: orderAddress.countryCode\n }\n };\n\n delete shippingData.shippingAddress.region;\n\n var address1 = shippingData.shippingAddress.streetAddress;\n if (address1.length > 50) {\n if (!shippingData.shippingAddress.extendedAddress) {\n shippingData.shippingAddress.streetAddress = address1.substr(0, 50);\n shippingData.shippingAddress.extendedAddress = address1.substr(50, 50);\n } else {\n var allAddress = shippingData.shippingAddress.streetAddress + ' ' + shippingData.shippingAddress.extendedAddress;\n shippingData.shippingAddress.streetAddress = allAddress.substr(0, 50);\n shippingData.shippingAddress.extendedAddress = allAddress.substr(50, 50);\n }\n }\n\n return shippingData;\n}\n\n/**\n * Updates Order data on Checkout\n */\nfunction updateOrderData() {\n return new Promise(function(resolve, reject) {\n $.ajax({\n url: document.querySelector('.js_braintree_getOrderInfoUrl').value + '?qwe=2344',\n type: 'get',\n dataType: 'json',\n success: function (data) {\n data.shippingAdditionalInfo = data.shippingAddress ? getShippingAdditionalInfo(data.shippingAddress) : null;\n orderData = data;\n resolve();\n },\n error: function () {\n window.location.reload();\n reject();\n }\n });\n });\n}\n\n/**\n * Returns fraud data from dataCollector payload\n * @returns {Object} Payload with fraud data\n */\nfunction collectFraudData() {\n var response;\n\n if (sitePrefs && sitePrefs.isFraudToolsEnabled) {\n response = braintreeGeneral.collectFraudData(btClientInstancePromise);\n } else {\n response = Promise.resolve({\n customMessage: 'Fraud Data collection isn\\t enabled via Custom Site Preference'\n });\n }\n\n return response;\n}\n\n/**\n * Inits Credit Card hosted fields\n * @returns {Object} Hosted Fields instance\n */\nfunction initCreditCardFields() {\n var hostedFieldsParams = null;\n var styles = creditCardFormFieldHelper.getHostedFieldsStyles();\n var configs = creditCardFormFieldHelper.getHostedFieldsConfig();\n\n hostedFieldsParams = {\n styles,\n configs\n };\n\n return braintreeCreditCardSDK.createHostedFields(hostedFieldsParams)\n .then(function (hfInstance) {\n // init hosted fields instance globaly\n hostedFieldsInstance = hfInstance;\n\n return hfInstance;\n });\n}\n\n/**\n * Creates Credit Card hosted fields\n */\nfunction clearHostedFields() {\n braintreeCreditCardSDK.clearHostedFields(hostedFieldsInstance);\n}\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * Tokenizes previouselly filled hosted Credit Card fields and returns a nonce payload\n * @returns {Promise} Promise with { error: false, result: 'ok'} inside in case of positive response and\n * { error: true} in case of negative (reject, case)\n */\nfunction tokenize(isCheckoutPage) {\n var tokenizationOptions;\n\n // \"Hosted Field Instance\" validation\n if (!hostedFieldsInstance) {\n return Promise.reject({\n customError: '\"hostedFieldsInstance\" is not define. Tokenization can\\'t be done'\n });\n }\n\n if (isCheckoutPage) {\n // Pull billing address from Storefront. Passed data will be tokenized and sent to Braintree\n tokenizationOptions = braintreeCreditCardSdkHelper.createTokenizationOptions();\n } else {\n tokenizationOptions = {};\n }\n\n return braintreeCreditCardSDK.tokenize(hostedFieldsInstance, tokenizationOptions)\n .then(function (payload) {\n return {\n btTokenizePayload: payload\n };\n });\n}\n\n/**\n * Launch the 3D Secure login flow, returning a nonce payload.\n * @param {string} nonce Payment method nonce\n * @param {string} bin Payment method bin\n * @param {number} amount Total amount\n * @param {string} email Email\n * @param {Object} billingData Object with Credit Card billing data\n * @param {Object} shippingAdditionalInfo Object with shipping info\n * @param {Object} btTokenizePayload Tokenize payload\n * @returns {Object} Object with nonce payload or custom error\n */\nfunction apply3dSecureValidation(nonce, bin, amount, email, billingData, shippingAdditionalInfo, btTokenizePayload) {\n return braintreeCreditCardSDK.apply3dSecureValidation(nonce, bin, amount, email, billingData, shippingAdditionalInfo)\n .then(function (payload) {\n if (payload.liabilityShifted || sitePrefs.isSkip3dSecureLiabilityResult) {\n // \"Nonce\" is changed after successful 3DS validation. We need this line to store the last \"nonce\" value\n if (btTokenizePayload) {\n // For stored card use case we don't need this param\n btTokenizePayload.nonce = payload.nonce;\n }\n\n return {\n threeDSecureDataValidationPayload: payload,\n btTokenizePayload: btTokenizePayload\n };\n }\n\n // Case when buyer \"canceled\" 3DS window\n return Promise.reject({\n customError: '3DS popup was canceled by buyer'\n });\n });\n}\n\n/**\n * Process the new Credit Card\n * @param {string} email Email\n * @param {Object} billingData Object with Credit Card billing data\n * @param {boolean} isCheckoutPage Is checkout flow flag\n * @returns {Object} Object with nonce payload or custom error\n */\nfunction processNewCard(email, billingData, isCheckoutPage) {\n var is3dSecureDisabled = sitePrefs && !sitePrefs.is3dSecureEnabled;\n var orderAmount = orderData.amount;\n var shippingAdditionalInfo = orderData.shippingAdditionalInfo;\n var nonce = null;\n var bin = null;\n var result = null;\n\n result = tokenize(isCheckoutPage);\n\n if (!is3dSecureDisabled) {\n result = result\n .then(function (payload) {\n nonce = payload.btTokenizePayload.nonce;\n bin = payload.btTokenizePayload.details ? payload.btTokenizePayload.details.bin : '';\n\n return apply3dSecureValidation(\n nonce,\n bin,\n orderAmount,\n email,\n billingData,\n shippingAdditionalInfo,\n payload.btTokenizePayload\n );\n });\n }\n\n return result;\n}\n\n/**\n * Process the stored Credit Card\n * @param {string} email Email\n * @param {Object} billingData Object with Credit Card billing data\n * @param {string} nonce Payment method nonce\n * @param {string} bin Payment method bin\n * @returns {Object} Object with nonce payload or custom error\n */\nfunction processStoredCard(email, billingData, nonce, bin) {\n var orderAmount = orderData.amount;\n var shippingAdditionalInfo = orderData.shippingAdditionalInfo;\n var is3dSecureDisabled = sitePrefs && !sitePrefs.is3dSecureEnabled;\n var result = null;\n\n // Case when we have a nonce, it is the case when buyer use stored credit card\n // otherwise, it is the case when buyer use new credit card\n if (is3dSecureDisabled) {\n result = Promise.resolve({\n nonce,\n email,\n bin\n });\n } else {\n result = apply3dSecureValidation(\n nonce,\n bin,\n orderAmount,\n email,\n billingData,\n shippingAdditionalInfo\n );\n }\n\n return result;\n}\n\n/**\n * In case of session card we can do nothing since the nonce, 3ds, hosted fields validation already was passed\n * @returns {Promise} return Promise with success data\n */\nfunction processSessionCard() {\n return Promise.resolve({});\n}\n\n/**\n * Checks whether the basket is valid\n * @param {string} errorMessage Error message\n * @returns {Object} response object\n */\nfunction isBasketDataValid(errorMessage) {\n var response = {\n error: false,\n customErrorMessage: ''\n };\n\n if (!orderData || orderData.amount === 0) {\n response.error = true;\n response.customErrorMessage = errorMessage;\n }\n\n return response;\n}\n\n/**\n * Get BT client instance which is used currently in the model\n * @returns {Promise} BT client instance promise\n */\nfunction getClientInstancePromise() {\n return btClientInstancePromise;\n}\n\nmodule.exports = {\n init,\n // \"tokenize\" or \"processNewCard\", or \"processStoredCard\", or \"clearHostedFields\"\n // can be called only after excution of \"initCreditCardFields\"\n tokenize,\n initCreditCardFields,\n processNewCard,\n processStoredCard,\n processSessionCard,\n clearHostedFields,\n getClientInstancePromise,\n\n // \"isBasketDataValid\" can be called only after calling of \"updateOrderData\"\n isBasketDataValid,\n updateOrderData,\n\n collectFraudData\n};\n","'use strict';\n\n/* global braintreeUtils braintree $ */\n\nvar btClientInstancePromise;\n\n/**\n * Returns a promise that resolves with the HostedFields instance.\n * @param {Object} hostedFieldsParams Object of hosted fieds parameters\n * @returns {Object} Object with hosted field parameters\n */\nfunction createHostedFields(hostedFieldsParams) {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n return braintree.hostedFields.create({\n client: btClientInstance,\n styles: hostedFieldsParams.styles,\n fields: hostedFieldsParams.configs,\n options: {\n enableCORS: true\n }\n });\n });\n}\n\n/**\n * Launch the 3D Secure login flow, returning a nonce payload.\n * @param {string} nonce Payment method nonce\n * @param {string} bin Payment method bin\n * @param {number} amount Total amount\n * @param {string} email Email\n * @param {Object} billingData Object with Credit Card billing data\n * @param {Object} shippingAdditionalInfo Object with Credit Card shipping info\n * @returns {Object} 3DS instance\n */\nfunction apply3dSecureValidation(nonce, bin, amount, email, billingData, shippingAdditionalInfo) {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n return braintree.threeDSecure.create({\n client: btClientInstance,\n version: 2\n })\n .then(function (threeDSecure) {\n return threeDSecure.verifyCard({\n amount: amount,\n nonce: nonce,\n bin: bin || '',\n email: email,\n challengeRequested: true,\n billingAddress: {\n givenName: billingData.firstName,\n surname: billingData.lastName,\n phoneNumber: billingData.phone,\n streetAddress: billingData.address1,\n extendedAddress: billingData.address2,\n locality: billingData.city,\n region: billingData.stateCode,\n postalCode: billingData.postalCode,\n countryCodeAlpha2: billingData.country\n },\n additionalInformation: shippingAdditionalInfo,\n onLookupComplete: function (data, next) {\n next();\n }\n });\n });\n });\n}\n\n/**\n * Tokenizes a Credit Card and returns a nonce payload.\n * @param {HostedFileds} hfInstance Hosted fieled instance\n * @param {Object} tokenizationOptions Credit Card tokenization option\n * @returns {Promise} A promise that resolves with a tokenizePayload.\n */\nfunction tokenize(hfInstance, tokenizationOptions) {\n var tokenizeOption = tokenizationOptions || {};\n\n return hfInstance.tokenize(tokenizeOption);\n}\n\n/**\n * Clear the value of the field\n * @param {HostedFileds} hfInstance Hosted fieled instance\n */\nfunction clearHostedFields(hfInstance) {\n hfInstance.clear('cardholderName');\n hfInstance.clear('number');\n hfInstance.clear('cvv');\n hfInstance.clear('expirationDate');\n}\n\n/**\n *\n * @param {Promise} braintreeClientInstancePromise Braintree Credit Card instance promise\n */\nfunction init(braintreeClientInstancePromise) {\n btClientInstancePromise = braintreeClientInstancePromise;\n}\n\nmodule.exports = {\n init,\n createHostedFields,\n apply3dSecureValidation,\n tokenize,\n clearHostedFields\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar creditCardPaymentProcessingHelper = require('../helpers/creditCardPaymentProcessingHelper');\nvar creditCardHelper = require('../helpers/creditCardHelper');\nvar creditCardFormFieldHelper = require('../helpers/creditCardFormFieldsHelper');\nvar creditCardSessionAccountHelper = require('../helpers/creditCardSessionAccountHelper');\n\n/*\n Update Session account\n**/\nfunction clearSessionAccount(sessionOption) {\n sessionOption.selected = false;\n sessionOption.classList.add('used-creditcard-account-hide');\n sessionOption.classList.remove('used-creditcard-account');\n sessionOption.text = '';\n sessionOption.setAttribute('data-session-account', false);\n sessionOption.setAttribute('data-owner', false);\n sessionOption.setAttribute('data-expiration', false);\n sessionOption.setAttribute('data-number', false);\n sessionOption.setAttribute('data-nonce', false);\n sessionOption.setAttribute('data-type', false);\n sessionOption.setAttribute('data-save-card', false);\n}\n\n/**\n * Remove Credit Card session account\n */\nfunction removeSessionNonce() {\n var defaultCreditCard = helper.getOptionByDataDefault('#braintreeCreditCardList');\n var creditCardFieldstoDisplay = creditCardFormFieldHelper.getCCFieldsToDisplay();\n var creditCardFieldsAsArray = creditCardFormFieldHelper.getCCFields().asArray;\n var sessionOption = helper.getSessionAccountOption({\n querySelector: '#braintreeCreditCardList',\n id: 'braintreeSessionCreditAccount'\n });\n\n if (!sessionOption) {\n return;\n }\n\n var sessionLastFour = sessionOption.getAttribute('data-last-four');\n var sessionType = sessionOption.getAttribute('data-type').toLowerCase();\n\n clearSessionAccount(sessionOption);\n\n // Handles case when stored and session credit card have the same type and last four digest\n // Makes visable already stored Credit Card in Credit Card List\n creditCardPaymentProcessingHelper.showAlreadyStoredCard(\n sessionLastFour,\n sessionType\n );\n\n creditCardSessionAccountHelper.clearCreditCardFields();\n creditCardSessionAccountHelper.clearCreditCardNonceField();\n\n if (defaultCreditCard) {\n defaultCreditCard.selected = true;\n\n creditCardFormFieldHelper.setCreditCardFieldsToDisplay(defaultCreditCard, creditCardFieldstoDisplay.asObject);\n\n // Uncheck Save Credit Card checkbox\n creditCardHelper.saveCreditCard(false);\n creditCardHelper.hideSaveCreditCardBlock(true);\n } else {\n creditCardFormFieldHelper.hideCardElements(creditCardFieldstoDisplay.asArray);\n creditCardFormFieldHelper.showCardElements(creditCardFieldsAsArray);\n\n // Hides 'Select a Credit Card block' on the Billing Page\n var ccAccount = document.querySelector('.form-group.braintree_used_creditcard_account');\n ccAccount.classList.remove('used-creditcard-account');\n ccAccount.classList.add('used-creditcard-account-hide');\n }\n}\n\nmodule.exports = {\n removeSessionNonce\n};\n","'use strict';\n\nvar braintreeGeneral = require('../../braintreeGeneral');\n\n/**\n * Constructor of VaultMgr model\n * @param {Promise} personalizedClientTokenPromise BT clietn instance promise\n */\nfunction CreditCardVaultManagerModel(personalizedClientTokenPromise) {\n this.customerPaymentMethodsFromVaultPromise = braintreeGeneral.getBtCustomerPaymentMethods(personalizedClientTokenPromise);\n}\n\n/**\n * Ger specific payment methods from VaultMgr (both CC and VisaCheckout cards)\n * @param {Promise} customerPaymentMethodsFromVaultPromise Promise with payment methods of buyer taken from VaultMgr\n * @returns {Promise} Promise with array of Cards\n */\nfunction getCardsFromVaultMgrPromise(customerPaymentMethodsFromVaultPromise) {\n return customerPaymentMethodsFromVaultPromise\n .then(function (vaultMgrPaymentMethods) {\n var cardPmArray = [];\n\n vaultMgrPaymentMethods.forEach(function (paymentMethod) {\n var isCardType = paymentMethod.type === 'CreditCard' || paymentMethod.type === 'VisaCheckoutCard';\n\n if (isCardType) {\n cardPmArray.push(paymentMethod);\n }\n });\n\n return cardPmArray;\n });\n}\n\n/**\n * Find CC by data within VaultMgr\n * @param {Promise} customerPaymentMethodsFromVaultPromise Array with Payment Methods from VaultMgr\n * @param {string} lastFour Last four credit card digits\n * @param {string} cardType Credit Card type (Visa, Mastercard)\n * @returns {Promise} Promise with found Credit Card\n */\nfunction getCardFromVaultMgrByData(customerPaymentMethodsFromVaultPromise, lastFour, cardType) {\n return customerPaymentMethodsFromVaultPromise\n .then(function (vaultMgrPaymentMethods) {\n return vaultMgrPaymentMethods.find(function (paymentMethod) {\n var isCardType = paymentMethod.type === 'CreditCard' || paymentMethod.type === 'VisaCheckoutCard';\n var pmDetails = paymentMethod.details;\n\n return isCardType && pmDetails.cardType.toLowerCase() === cardType && pmDetails.lastFour === lastFour;\n });\n });\n}\n\n/**\n * Function which look for CC by passed data inside Storefront CC list\n * @param {Array} storefrontCardList Array with CC from Storefront\n * @param {string} lastFour Last four credit card digits\n * @param {string} cardType Credit Card type (Visa, Mastercard)\n * @returns {Promise} Promise with found credit card\n */\nfunction getCardFromStorefrontByData(storefrontCardList, lastFour, cardType) {\n return storefrontCardList.find(function (storedStorefrontCard) {\n return storedStorefrontCard.lastFour.toString() === lastFour.toString() &&\n storedStorefrontCard.cardType.toLocaleLowerCase() === cardType.toLocaleLowerCase();\n });\n}\n\n/**\n * Check is CC exists on the Storefront but not in the Vault\n * @param {Array} storefrontCardList Array with CC from storefront\n * @returns {Promise} Promise with true/false. True in case if CC exists on the Storefront but not in the Vault\n */\nCreditCardVaultManagerModel.prototype.getCardsWhichAreNotInVault = function (storefrontCardList) {\n return getCardsFromVaultMgrPromise(this.customerPaymentMethodsFromVaultPromise)\n .then(function (cardPaymentMethods) {\n var arrayOfNotInVaultCards = [];\n\n storefrontCardList.forEach(function (storefrontCard) {\n var sfCardType = storefrontCard.cardType.toLocaleLowerCase();\n var sfLastFour = storefrontCard.lastFour.toString();\n var foundCard = cardPaymentMethods.find(function (vaultMgrCard) {\n var pmDetails = vaultMgrCard.details;\n\n return pmDetails.cardType.toLocaleLowerCase() === sfCardType && pmDetails.lastFour === sfLastFour;\n });\n\n if (!foundCard) {\n arrayOfNotInVaultCards.push(storefrontCard);\n }\n });\n\n return arrayOfNotInVaultCards;\n });\n};\n\n/**\n * Check is CC exists on the Storefront and in the Vault\n * @param {Array} storefrontCardList Array with CC from Storefront\n * @param {string} lastFour Last four credit card digits which buyer wants to add\n * @param {string} cardType Credit Card type (Visa, Mastercard) which buyer wants to add\n * @returns {Promise} Promise with true/fase. True in case if CC is exists in the Vault and on the Storefront\n */\nCreditCardVaultManagerModel.prototype.isCreditCardExistOnStorefrontAndVault = function (storefrontCardList, lastFour, cardType) {\n var storefrontCard = getCardFromStorefrontByData(storefrontCardList, lastFour, cardType);\n var vaultMgrCardPromise = getCardFromVaultMgrByData(\n this.customerPaymentMethodsFromVaultPromise,\n lastFour,\n cardType\n );\n\n return vaultMgrCardPromise\n .then(function (cardFromVaultMgr) {\n return cardFromVaultMgr && storefrontCard;\n });\n};\n\n/**\n * Return CC from VaultManager by passed data\n * @param {string} lastFour Last four credit card digits\n * @param {string} cardType Credit Card type (Visa, Mastercard)\n * @returns {Promise} Promise with nonce or empty string\n */\nCreditCardVaultManagerModel.prototype.getNonceByCardData = function (lastFour, cardType) {\n return getCardFromVaultMgrByData(\n this.customerPaymentMethodsFromVaultPromise,\n lastFour,\n cardType\n );\n};\n\nmodule.exports = CreditCardVaultManagerModel;\n","'use strict';\n\nvar helper = require('../../helper');\n\n/**\n * Creates tokenization options for 'tokenize' function.\n * @returns {Object} Object with tokenization options.\n */\nfunction createTokenizationOptions() {\n var billingData = helper.getBillingAddressFormValues();\n\n return {\n billingAddress: {\n firstName: billingData.firstName,\n lastName: billingData.lastName,\n streetAddress: billingData.address1.split('%20').join(' '),\n extendedAddress: billingData.address2 ? billingData.address2.split('%20').join(' ') : billingData.address2,\n locality: billingData.city.includes('%20') ? billingData.city.split('%20').join(' ') : billingData.city,\n region: billingData.stateCode,\n postalCode: billingData.postalCode,\n countryCodeAlpha2: billingData.country.includes('$20') ? billingData.country.split('%20').join(' ') : billingData.country\n }\n },\n {\n cardholderName: document.querySelector('#braintreeCardOwner').value\n };\n}\n\n\nmodule.exports = {\n createTokenizationOptions\n};\n","'use strict';\n// This file is about form fields manipulations.\n\n/**\n * Returns an object contains an object and an array of credit card fields to Display\n * @returns {Object} Object\n */\nfunction getCCFieldsToDisplay() {\n var $cardOwnerToDisplay = document.querySelector('#braintreeCardOwnerToDisplay');\n var $cardNumberToDisplay = document.querySelector('#braintreeCardNumberToDisplay');\n var $cardCvvToDisplay = document.querySelector('#braintreeCvvToDisplay');\n var $cardExpirationToDisplay = document.querySelector('#braintreeExpirationToDisplay');\n\n var ccToDisplayFieldsAsObject = {\n cardOwnerToDisplay: $cardOwnerToDisplay,\n cardNumberToDisplay: $cardNumberToDisplay,\n cardCvvToDisplay: $cardCvvToDisplay,\n cardExpirationToDisplay: $cardExpirationToDisplay\n };\n var ccToDisplayFieldsAsArray = Object.values(ccToDisplayFieldsAsObject);\n\n return {\n asObject: ccToDisplayFieldsAsObject,\n asArray: ccToDisplayFieldsAsArray\n };\n}\n\n/**\n * Returns an object contains an object and an array of credit card fields\n * @returns {Object} Object\n */\nfunction getCCFields() {\n var $braintreeCardOwner = document.querySelector('#braintreeCardOwner');\n var $braintreeExpirationDate = document.querySelector('#braintreeExpirationDate');\n var $braintreeCardNumber = document.querySelector('#braintreeCardNumber');\n var $braintreeCvv = document.querySelector('#braintreeCvv');\n\n var ccFieldsAsObject = {\n braintreeCardOwner: $braintreeCardOwner,\n braintreeExpirationDate: $braintreeExpirationDate,\n braintreeCardNumber: $braintreeCardNumber,\n braintreeCvv: $braintreeCvv\n };\n var ccFieldsAsArray = Object.values(ccFieldsAsObject);\n\n return {\n asObject: ccFieldsAsObject,\n asArray: ccFieldsAsArray\n };\n}\n\n/**\n * Returns braintreeCreditCardNonce container\n * @returns {Object} Input element\n */\nfunction getCreditCardNonceFieldContainer() {\n return document.querySelector('#braintreeCreditCardNonce');\n}\n\n/**\n * Returns braintreeCreditCardList container\n * @returns {Object} Select element\n */\nfunction getCreditCardListContainer() {\n return document.querySelector('#braintreeCreditCardList');\n}\n\n/**\n * Sets Credit Card field to display\n * @param {Object} selectedCard The values of fields to be set\n * @param {Object} cacheCardFields Object of elements contain credit cards fields to display\n */\nfunction setCreditCardFieldsToDisplay(selectedCard, cacheCardFields) {\n var cartNumber = selectedCard.dataset.number;\n\n cacheCardFields.cardNumberToDisplay.innerHTML = cartNumber;\n cacheCardFields.cardCvvToDisplay.innerHTML = '***';\n cacheCardFields.cardExpirationToDisplay.innerHTML = selectedCard.dataset.expiration;\n cacheCardFields.cardOwnerToDisplay.innerHTML = selectedCard.dataset.owner;\n\n document.querySelector('#braintreeCardType').value = selectedCard.dataset.type;\n document.querySelector('#braintreeCardMaskNumber').value = cartNumber;\n}\n\n/**\n * Sets Credit Card fileds on the Billing Page\n * @param {Object} selectedCard The values of fields to be set\n * @param {Object} cacheCardFields Object of elements contain credit cards fields\n */\nfunction setCardFields(selectedCard, cacheCardFields) {\n cacheCardFields.cardNumberToDisplay.innerHTML = selectedCard['data-number'].value;\n cacheCardFields.cardCvvToDisplay.innerHTML = '***';\n cacheCardFields.cardExpirationToDisplay.innerHTML = selectedCard['data-expiration'].value;\n cacheCardFields.cardOwnerToDisplay.innerHTML = selectedCard['data-owner'].value;\n\n document.querySelector('#braintreeCardType').value = selectedCard['data-type'].value;\n document.querySelector('#braintreeCardMaskNumber').value = selectedCard['data-number'].value;\n}\n\n/**\n * Shows Credit Card fileds on the Billing Page\n * @param {Array} cardFields Array of credit card fileds\n */\nfunction showCardElements(cardFields) {\n cardFields.forEach(function (el) {\n el.style.display = '';\n });\n}\n\n/**\n * Hides Credit Card fileds on the Billing Page\n * @param {Array} cardFields Array of Credit Card fileds\n */\nfunction hideCardElements(cardFields) {\n cardFields.forEach(function (el) {\n el.style.display = 'none';\n });\n}\n\n/**\n * Returns Credit Card hosted fileds styles\n * @returns {Object} Object of styles\n */\nfunction getHostedFieldsStyles() {\n return {\n input: {\n 'font-size': 'inherit',\n color: '#b7802a',\n padding: '6px 15px'\n },\n ':focus': {\n color: 'blue'\n },\n '.valid': {\n color: 'green'\n },\n '.cardholderName.valid': {\n color: 'black'\n },\n '.invalid': {\n color: 'red'\n }\n };\n}\n\n/**\n * Returns Credit Card hosted fields configs\n * @returns {Object} Object of configs\n */\nfunction getHostedFieldsConfig() {\n return {\n cardholderName: {\n selector: '#braintreeCardOwner'\n },\n number: {\n selector: '#braintreeCardNumber'\n },\n cvv: {\n selector: '#braintreeCvv'\n },\n expirationDate: {\n selector: '#braintreeExpirationDate'\n }\n };\n}\n\nmodule.exports = {\n getCCFieldsToDisplay,\n getCCFields,\n getCreditCardNonceFieldContainer,\n getCreditCardListContainer,\n showCardElements,\n hideCardElements,\n setCreditCardFieldsToDisplay,\n setCardFields,\n getHostedFieldsStyles,\n getHostedFieldsConfig\n};\n","'use strict';\n\n/**\n * Uncheck Save Credit Card checkbox\n * @param {boolean} save true/false\n */\nfunction saveCreditCard(save) {\n var isSave = save ? true : false; // eslint-disable-line\n\n document.querySelector('#braintreeSaveCreditCard').checked = isSave;\n}\n\n/**\n * Hides or Display 'braintreeSaveCardContainer' container\n * @param {boolean} hide true/false\n */\nfunction hideSaveCreditCardBlock(hide) {\n var isHide = hide ? true : false; // eslint-disable-line\n\n document.querySelector('#braintreeSaveCardContainer').style.display = isHide ? 'none' : 'block';\n}\n\n/**\n * Returns Braintree Credit Card configs\n * @returns {Object} Braintree Credit Card configs\n */\nfunction getCheckoutBraintreeCreditCardConfigs() {\n var braintreeCreditCardFieldsConfigs = null;\n\n try {\n braintreeCreditCardFieldsConfigs = JSON.parse(document.querySelector('.js_braintree_creditCardFields').getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeCreditCardFieldsConfigs;\n }\n\n return braintreeCreditCardFieldsConfigs;\n}\n\n/**\n * Converts Credit Card type to one style: first letter in upper case\n * to make session card type look like saved CC type\n * ex: MasterCard -> Mastercard\n * @param {string} type Card type\n * @returns {string} Converted card type\n */\nfunction convertCreditCardType(type) {\n var cardType = type.toLowerCase();\n\n return cardType.replace(/_/g, ' ').replace(cardType.charAt(0), (cardType.charAt(0)).toUpperCase());\n}\n\nmodule.exports = {\n getCheckoutBraintreeCreditCardConfigs,\n saveCreditCard,\n hideSaveCreditCardBlock,\n convertCreditCardType\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar creditCardHelper = require('./creditCardHelper');\nvar CreditCardVaultManagerModel = require('../components/creditCardVaultManagerModel');\n\n/**\n * Displays stores Credit Cards list on the Billing Page\n */\nfunction displayStoredCreditCardList() {\n var $creditCardAccount = document.querySelector('.form-group.braintree_used_creditcard_account');\n\n $creditCardAccount.classList.remove('used-creditcard-account-hide');\n $creditCardAccount.classList.add('used-creditcard-account');\n}\n\n/**\n * Fills the Credit Card form hidden inputs with payload data\n * @param {Object} braintreeResponse Object contains the data of new payment method\n */\nfunction fillCreditCardFormWithPayloadData(braintreeResponse) {\n var btResponse = braintreeResponse.btTokenizePayload;\n var $creditCardFieldsCardNumber = document.querySelector('input[name=dwfrm_billing_creditCardFields_cardNumber]');\n\n if (btResponse) {\n var btResponseDetails = btResponse.details;\n\n document.querySelector('#braintreeCardType').value = creditCardHelper.convertCreditCardType(btResponseDetails.cardType);\n document.querySelector('#braintreeCardMaskNumber').value = '************' + btResponseDetails.lastFour;\n document.querySelector('#braintreeCardExpirationMonth').value = btResponseDetails.expirationMonth;\n document.querySelector('#braintreeCardExpirationYear').value = btResponseDetails.expirationYear.substr(2);\n document.querySelector('#braintreeCardHolder').value = btResponseDetails.cardholderName;\n\n if ($creditCardFieldsCardNumber) {\n $creditCardFieldsCardNumber.value = '************' + btResponseDetails.lastFour;\n }\n\n document.querySelector('input[name=braintreePaymentMethodNonce]').value = btResponse.nonce;\n }\n}\n\n/**\n * Fills the session Credit Card form inputs with payload data\n * @param {Object} braintreeResponse Object contains the data of new payment method\n */\nfunction fillSessionCreditCardFormWithPayloadData(braintreeResponse) {\n var btResponse = braintreeResponse.btTokenizePayload;\n var usedCreditCardAccount = Boolean(document.querySelector('.form-group.braintree_used_creditcard_account'));\n\n if (usedCreditCardAccount && btResponse) {\n var btResponseDetails = btResponse.details;\n var $sessionCreditCard = document.querySelector('#braintreeSessionCreditAccount');\n\n // Fields filling for displaying session card fields to the buyer\n document.querySelector('#braintreeCardOwnerToDisplay').textContent = btResponseDetails.cardholderName;\n document.querySelector('#braintreeCardNumberToDisplay').textContent = '************' + btResponseDetails.lastFour;\n document.querySelector('#braintreeCvvToDisplay').textContent = '***';\n document.querySelector('#braintreeExpirationToDisplay').textContent = btResponseDetails.expirationMonth + '/' + btResponseDetails.expirationYear.substr(2);\n\n // Fields filling for displaying session card option value\n $sessionCreditCard.textContent = $sessionCreditCard.getAttribute('data-type') + ' ' +\n $sessionCreditCard.getAttribute('data-number') + ' ' +\n $sessionCreditCard.getAttribute('data-expiration') + ' ' +\n $sessionCreditCard.getAttribute('data-owner');\n }\n}\n\n/**\n * Filling of session card attributes for using them in business logic (client/server)\n * @param {Object} braintreeResponse Tokenize payload from braintree\n */\nfunction setSessionCreditCardDataAttributes(braintreeResponse) {\n var btResponse = braintreeResponse.btTokenizePayload;\n var btResponseDetails = btResponse.details;\n var $sessionCreditCard = document.querySelector('#braintreeSessionCreditAccount');\n var isSavedCard = document.querySelector('#braintreeSaveCreditCard') ? document.querySelector('#braintreeSaveCreditCard').checked : false;\n\n $sessionCreditCard.classList.remove('used-creditcard-account-hide');\n $sessionCreditCard.setAttribute('data-number', '************' + btResponseDetails.lastFour);\n $sessionCreditCard.setAttribute('data-expiration', btResponseDetails.expirationMonth + '/' + btResponseDetails.expirationYear.substr(2));\n $sessionCreditCard.setAttribute('data-type', creditCardHelper.convertCreditCardType(btResponseDetails.cardType));\n $sessionCreditCard.setAttribute('data-last-four', btResponseDetails.lastFour);\n $sessionCreditCard.setAttribute('data-owner', btResponseDetails.cardholderName);\n $sessionCreditCard.setAttribute('data-nonce', btResponse.nonce);\n $sessionCreditCard.setAttribute('data-session-account', true);\n $sessionCreditCard.setAttribute('data-save-card', isSavedCard);\n}\n\n/**\n * Marks a session Credit Card account as selected\n */\nfunction markAsSelectedSessionAccount() {\n var $newCCAccount = document.getElementById('newCardAccount');\n var $sessionCreditCard = document.querySelector('#braintreeSessionCreditAccount');\n\n $newCCAccount.removeAttribute('selected');\n $sessionCreditCard.selected = true;\n}\n\n/**\n * Returns a Credit Card flow ID from selector\n * @param {Object} $creditCardList Selector contained the Credit Card flow ID\n * @returns {string} Credit Card flow ID\n */\nfunction getCreditCardFlowID($creditCardList) {\n var selectedOptionValue = $creditCardList.value;\n var selectedOption = null;\n var creditCardFlowID = null;\n\n var newCardID = 'newcard';\n var sessionCardID = 'sessioncard';\n var storedCardID = 'js_stored_card';\n\n switch (selectedOptionValue) {\n case newCardID:\n creditCardFlowID = newCardID;\n break;\n\n case sessionCardID:\n creditCardFlowID = sessionCardID;\n break;\n\n default:\n selectedOption = helper.getSelectedOption($creditCardList);\n\n if (selectedOption.classList.contains(storedCardID)) {\n creditCardFlowID = storedCardID;\n }\n break;\n }\n\n return creditCardFlowID;\n}\n\n/**\n * Returns object with nonce related to stored card\n * @param {Promise} clientInstancePromise Client instance promise\n * @param {Object} $creditCardList Selector with needed data\n * @returns {Object} Response object\n */\nfunction getNonceFromStoredCard(clientInstancePromise, $creditCardList) {\n var CreditCardVaultManagerModelInstance = new CreditCardVaultManagerModel(clientInstancePromise);\n var $selectedOption = helper.getSelectedOption($creditCardList);\n var cardType = $selectedOption.getAttribute('data-type').toLowerCase();\n var lastFour = $selectedOption.getAttribute('data-last-four').toString();\n\n return CreditCardVaultManagerModelInstance.getNonceByCardData(lastFour, cardType);\n}\n\n/**\n * Fills 3DS data\n * @param {Object} threeDSecureDataValidationPayload 3DS information about the card\n */\nfunction fill3DsData(threeDSecureDataValidationPayload) {\n var $braintreeIs3dSecureRequired = document.querySelector('#braintreeIs3dSecureRequired');\n\n if (threeDSecureDataValidationPayload && threeDSecureDataValidationPayload.liabilityShifted) {\n $braintreeIs3dSecureRequired.value = 'true';\n }\n}\n\n/**\n * Returns whether Credit Card tab is active on the Billing Page\n * @returns {boolean} true/false\n */\nfunction isActiveCreditCardTab() {\n return document\n .querySelector('.payment-options[role=tablist] a[data-toggle=\"tab\"][href=\"#creditcard-content\"]')\n .classList\n .contains('active');\n}\n\n/**\n * Get stored card by last four digits and card type\n * @param {string} lastFour Last four card digits\n * @param {string} cardType Card type\n * @returns {Object} Jquery object of found stored card\n */\nfunction getStoredCardByData(lastFour, cardType) {\n var $foundCard;\n\n $('.js_stored_card').each(function (_, $el) {\n var $card = $($el);\n var storedCardType = $card.data('type').toLowerCase();\n var storedCardLastFour = $card.data('last-four').toString();\n\n if (storedCardType === cardType && storedCardLastFour === lastFour) {\n $foundCard = $card;\n }\n });\n\n return $foundCard;\n}\n\n/**\n * Hide already stored card by last four digits and card type\n * @param {string} lastFour Last four card digits\n * @param {string} cardType Card type\n * @returns {boolean} true in case if stored card with provided params (lastFour, cardType) was found\n */\nfunction hideAlreadyStoredCard(lastFour, cardType) {\n var $storedCard = getStoredCardByData(lastFour, cardType);\n var flag = false;\n\n if ($storedCard) {\n $storedCard.hide();\n flag = true;\n }\n\n return flag;\n}\n\n/**\n * Shows already stored card by last four digits and card type\n * @param {string} lastFour Last four card digits\n * @param {string} cardType Card type\n * @returns {boolean} true in case if stored card with provided params (lastFour, cardType) was found\n */\nfunction showAlreadyStoredCard(lastFour, cardType) {\n var $storedCard = getStoredCardByData(lastFour, cardType);\n var flag = false;\n\n if ($storedCard) {\n $storedCard.show();\n flag = true;\n }\n\n return flag;\n}\n\nmodule.exports = {\n displayStoredCreditCardList,\n fillCreditCardFormWithPayloadData,\n fillSessionCreditCardFormWithPayloadData,\n setSessionCreditCardDataAttributes,\n markAsSelectedSessionAccount,\n getCreditCardFlowID,\n getNonceFromStoredCard,\n fill3DsData,\n isActiveCreditCardTab,\n hideAlreadyStoredCard,\n showAlreadyStoredCard\n};\n","'use strict';\n\nvar creditCardFormFieldHelper = require('../helpers/creditCardFormFieldsHelper');\n\n/**\n * Clears Credit Card fields of session account\n */\nfunction clearCreditCardFields() {\n var creditCardFieldsArray = creditCardFormFieldHelper.getCCFields().asArray;\n\n creditCardFieldsArray.forEach(function (el) {\n el.value = '';\n });\n}\n\n/**\n * Clears Credit Card nonce of session account\n */\nfunction clearCreditCardNonceField() {\n document.querySelector('#braintreeCreditCardNonce').value = '';\n}\n\nmodule.exports = {\n clearCreditCardFields,\n clearCreditCardNonceField\n};\n","'use strict';\n\nvar $googlepayButton = document.querySelector('.js_braintree_googlepay_button');\nvar $googlepayContent = document.querySelector('.js_braintree_googlepayContent');\n\n// Helpers\nvar helper = require('../../helper');\nvar googlePayHelper = require('../helpers/googlePayHelper');\n\n/**\n * Shows session Google Pay account on the Billing Page\n * @param {string} cardDescription Session card description\n */\nfunction showGooglepayAccount(cardDescription) {\n var $newGPAccount = document.getElementById('newGPAccount');\n var $gpAccount = document.querySelector('.form-group.braintree_used_googlepay_account');\n var $sessionAccount = document.querySelector('#sessionGPAccount');\n\n $newGPAccount.removeAttribute('selected');\n\n // Sets new session account\n $sessionAccount.classList.remove('used-googlepay-account-hide');\n $sessionAccount.classList.add('used-googlepay-account');\n $sessionAccount.text = cardDescription;\n $sessionAccount.selected = true;\n $sessionAccount.setAttribute('data-session-account', 'true');\n\n $gpAccount.classList.remove('used-googlepay-account-hide');\n $gpAccount.classList.add('used-googlepay-account');\n\n $googlepayButton.style.display = 'none';\n $googlepayContent.setAttribute('data-paypal-is-hide-continue-button', false);\n helper.continueButtonToggle(false);\n}\n\n/*\n Remove method was used and change appearance of Google Pay tab\n**/\nfunction removeSessionNonce() {\n var $gpAccount = document.querySelector('.form-group.braintree_used_googlepay_account');\n $gpAccount.classList.remove('used-googlepay-account');\n $gpAccount.classList.add('used-googlepay-account-hide');\n\n var $sessionAccount = document.querySelector('#sessionGPAccount');\n $sessionAccount.classList.add('used-googlepay-account-hide');\n $sessionAccount.classList.remove('used-googlepay-account');\n $sessionAccount.value = '';\n $sessionAccount.text = '';\n $sessionAccount.setAttribute('data-session-account', false);\n $sessionAccount.setAttribute('data-save', false);\n\n document.querySelector('#braintreeGooglePayNonce').value = '';\n document.querySelector('#braintreeGooglePayBillingAddress').value = '';\n document.querySelector('#braintreeGooglepayPaymentType').value = '';\n document.querySelector('#braintreeGooglePayDeviceData').value = '';\n\n document.querySelector('#newGPAccount').selected = true;\n googlePayHelper.googlePayContentTabHandler(false);\n}\n\nmodule.exports = {\n showGooglepayAccount,\n removeSessionNonce\n};\n","'use strict';\n\n/**\n * Returns Braintree Google Pay configs\n * @returns {Object} Braintree Google Pay configs\n */\nfunction getBraintreeGooglePayConfigs() {\n var braintreeGooglePayButtonConfigs = null;\n\n try {\n braintreeGooglePayButtonConfigs = JSON.parse(document.querySelector('.js_braintree_googlepay_button').getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeGooglePayButtonConfigs;\n }\n\n return braintreeGooglePayButtonConfigs;\n}\n\n/**\n * Sets device data from 'data collector' to corresponding input field\n * @param {Object} fraudDataPayload Froud payload data\n */\nfunction setGooglePayDeviceData(fraudDataPayload) {\n var $braintreeGooglePayDeviceData = document.querySelector('#braintreeGooglePayDeviceData');\n\n if (fraudDataPayload.deviceData) {\n $braintreeGooglePayDeviceData.value = fraudDataPayload.deviceData;\n }\n}\n\n/**\n * Handles all behavior related to the Google Pay content tab\n * @param {boolean} isActiveGooglePayTab Whether Google Pay tab is active\n */\nfunction googlePayContentTabHandler(isActiveGooglePayTab) {\n var helper = require('../../helper');\n var $btGooglepayAccountsList = document.querySelector('#braintreeGooglepayAccountsList');\n var $googlepayButton = document.querySelector('.js_braintree_googlepay_button');\n var $googlepayContent = document.querySelector('.js_braintree_googlepayContent');\n\n if ($btGooglepayAccountsList.value === 'newaccount') {\n $googlepayButton.style.display = 'block';\n\n if (isActiveGooglePayTab) {\n helper.continueButtonToggle(true);\n }\n\n $googlepayContent.setAttribute('data-paypal-is-hide-continue-button', true);\n } else {\n $googlepayButton.style.display = 'none';\n helper.continueButtonToggle(false);\n $googlepayContent.setAttribute('data-paypal-is-hide-continue-button', false);\n }\n}\n\n/**\n * Triggers the Google Pay tab if Google Pay session account uses\n * @param {Object} googlePayConfigs Google Pay config object\n */\nfunction triggerGooglePayTab(googlePayConfigs) {\n var sessionPaymentMethodId = googlePayConfigs.sessionPaymentMethodId;\n var $googlePayTab = $('.googlepay-tab');\n\n if (sessionPaymentMethodId === 'GooglePay') {\n $googlePayTab.click();\n }\n}\n\nmodule.exports = {\n getBraintreeGooglePayConfigs,\n setGooglePayDeviceData,\n googlePayContentTabHandler,\n triggerGooglePayTab\n};\n","'use strict';\nvar $continueButton = document.querySelector('button.submit-payment');\n\n/**\n * Init the event in order to update the cart grant total price\n */\nfunction initCartUpdateEvent() {\n var $grantTotal = document.querySelector('.grand-total');\n\n if ($grantTotal) {\n var currentGrantTotalValue = $grantTotal.textContent;\n\n $('body').on('cart:update', function () {\n var newGrantTotalValue = $grantTotal.textContent;\n\n if (newGrantTotalValue !== '' && newGrantTotalValue !== currentGrantTotalValue) {\n currentGrantTotalValue = newGrantTotalValue;\n var updateCartTotals = document.createEvent('Event');\n updateCartTotals.initEvent('updateCartTotals', true, true);\n\n document.querySelector('body').addEventListener('updateCartTotals', function () {\n 'braintree:updateCartTotals';\n }, false);\n document.querySelector('body').dispatchEvent(updateCartTotals);\n }\n });\n }\n}\n\n/**\n * Depends on the value flag, sets style.display to the $continueButton\n * @param {boolean} flag Boolean value\n * @returns {void}\n */\nfunction continueButtonToggle(flag) {\n var stage = window.location.hash.substring(1);\n\n if (stage === 'placeOrder' || stage === 'shipping' || stage === null || stage === '') {\n return;\n }\n\n $continueButton.style.display = flag ? 'none' : '';\n}\n\n/**\n * Handles payment method tab changing\n * @param {Object} currentTab Choosen payment method tab\n */\nfunction paymentMethodChangeHandle(currentTab) {\n document.querySelectorAll('.payment-options[role=tablist] a[data-toggle=\"tab\"]').forEach(function (el) {\n var $tabContent = document.querySelector(el.getAttribute('href'));\n\n if (el === currentTab) {\n $tabContent.querySelectorAll('input, textarea, select').forEach(function (tab) {\n tab.removeAttribute('disabled', 'disabled');\n });\n $tabContent.querySelectorAll('select.no-disable').forEach(function (tab) {\n tab.setAttribute('disabled', 'disabled');\n });\n continueButtonToggle(JSON.parse($tabContent.getAttribute('data-paypal-is-hide-continue-button')));\n } else {\n $tabContent.querySelectorAll('input, textarea, select').forEach(function (tab) {\n tab.setAttribute('disabled', 'disabled');\n });\n }\n });\n}\n\n/**\n * Return payment method name in lovercase\n * @param {string} paymentMethodName Payment method name\n * @returns {string} Paymnet method name\n */\nfunction getPaymentMethodToLowerCase(paymentMethodName) {\n var paymentMethod = paymentMethodName.split('_');\n if (paymentMethod.length === 1) {\n return paymentMethodName;\n }\n paymentMethod.forEach(function (element, index) {\n paymentMethod[index] = element.charAt(0) + element.slice(1).toLocaleLowerCase();\n });\n return paymentMethod[1] ?\n paymentMethod[0] + ' ' + paymentMethod[1] :\n paymentMethod[0];\n}\n\n/**\n * Updates checkout view\n * @param {Object} e Event object\n * @param {Object} data Data object\n */\nfunction updateCheckoutView(e, data) {\n var $paymentSummary = document.querySelector('.summary-details .braintree-payment-details');\n var htmlToAppend = '';\n var order = data.order;\n var payment = order.billing.payment;\n\n if (payment && payment.selectedPaymentInstruments\n && payment.selectedPaymentInstruments.length > 0) {\n var selectedPaymentInstrument = payment.selectedPaymentInstruments[0];\n var paymnetMethodId = selectedPaymentInstrument.paymentMethod;\n\n if (paymnetMethodId === 'CREDIT_CARD') {\n htmlToAppend += '
' + selectedPaymentInstrument.type + '
';\n } else {\n htmlToAppend += '
' + getPaymentMethodToLowerCase(paymnetMethodId) + '
';\n }\n\n if (selectedPaymentInstrument.maskedCreditCardNumber) {\n htmlToAppend += '
' + selectedPaymentInstrument.maskedCreditCardNumber + '
';\n var text = $('.js-expiration-text').val();\n htmlToAppend += '
' + text + \" \" + selectedPaymentInstrument.expirationMonth+'/'+selectedPaymentInstrument.expirationYear + '
';\n }\n if (paymnetMethodId === 'PayPal') {\n htmlToAppend += '
' + selectedPaymentInstrument.braintreePaypalEmail + '
';\n }\n if (paymnetMethodId === 'Venmo') {\n htmlToAppend += '
' + selectedPaymentInstrument.braintreeVenmoUserId + '
';\n }\n if (selectedPaymentInstrument.type && selectedPaymentInstrument.paymentMethod !== 'CREDIT_CARD') {\n htmlToAppend += '
' + selectedPaymentInstrument.type + '
';\n }\n htmlToAppend += '
' + order.priceTotal.charAt(0) + selectedPaymentInstrument.amount + '
';\n }\n\n if ($paymentSummary) {\n $paymentSummary.innerHTML = htmlToAppend;\n }\n}\n\n/**\n * Validates whether input field is valid\n * @param {Object} field Input filed\n * @returns {boolean} true/false\n */\nfunction isValidInputField(field) {\n if (!field.checkValidity()) {\n if (!field.classList.contains('is-invalid')) {\n field.classList.add('is-invalid');\n }\n return false;\n }\n if (field.checkValidity() && field.classList.contains('is-invalid')) {\n field.classList.remove('is-invalid');\n }\n return true;\n}\n/*\n Adding *active* line to the tab-content class in a case if it isn't already active\n Use case: customer checkout from Cart (page) and\n (under the place Order page) hit the 'edit' button\n**/\nfunction updatePaymentMethodTab() {\n let paymentMethodName = document.querySelectorAll('[data-braintree-payment-method]')[0].dataset.braintreePaymentMethod;\n let content = document.querySelector(`.js_braintree_${paymentMethodName.toLowerCase()}Content`).classList.contains('active');\n if (!content) {\n document.querySelectorAll(`[data-method-id=${paymentMethodName}]`)[0].children[0].click();\n }\n}\n\n/**\n * Gets Billing Address Form Values\n *\n * @returns {Object} with Billing Address\n */\nfunction getBillingAddressFormValues() {\n return $('#dwfrm_billing').serialize().split('&')\n .map(function (el) {\n return el.split('=');\n })\n .reduce(function (accumulator, item) {\n var elem = item[0].lastIndexOf('_');\n if (elem < 0) {\n accumulator[item[0]] = item[1];\n } else {\n elem = item[0].substring(elem + 1);\n accumulator[elem] = item[1];\n }\n return accumulator;\n }, {});\n\n delete billingData.stateCode;\n\n var address1 = billingData.address1;\n if (address1.length > 50) {\n if (!billingData.address2) {\n billingData.address1 = address1.substr(0, 50);\n billingData.address2 = address1.substr(50, 50);\n } else {\n var allAddress = billingData.address1 + billingData.address2;\n billingData.address1 = allAddress.substr(0, 50);\n billingData.address2 = allAddress.substr(50, 50);\n }\n }\n\n return billingData;\n}\n\n/**\n * Gets Nonce depending on payment method name\n *\n * @param {string} paymentMethodName - payment method name\n * @returns {boolean} nonce exist\n */\n\nfunction isNonceExist(paymentMethodName) {\n // Payment method name\n var pmName = paymentMethodName;\n\n // Сhange 'CREDIT_CARD' to 'CreditCard' in order to get braintreewCreditCardNonce input\n if (paymentMethodName === 'CREDIT_CARD') {\n pmName = 'CreditCard';\n }\n\n var $nonce = document.querySelector(`#braintree${pmName}Nonce`);\n\n if (!$nonce) return false;\n\n var nonceValue = $nonce.value;\n var $tab = document.querySelector(`.${pmName.toLowerCase()}-tab`);\n var isActiveTab;\n if ($tab) {\n isActiveTab = $tab.classList.contains('active');\n }\n\n return !isActiveTab && nonceValue;\n}\n\nvar loaderInstance = require('./loaderHelper');\nvar accountsLoader;\n\nfunction removeBtPayment(e) {\n let target = e.target;\n var $loaderContainter = document.querySelector('#' + target.getAttribute('data-loader'));\n accountsLoader = loaderInstance($loaderContainter);\n accountsLoader.show();\n\n $.get(target.getAttribute('data-url') + '?UUID=' + target.getAttribute('data-id'))\n .then((data => {\n $('#uuid-' + data.UUID).remove();\n if (data.newDefaultAccount) {\n document.querySelector('#uuid-' + data.newDefaultAccount + ' span').style.fontWeight = 'bold';\n document.querySelector('#uuid-' + data.newDefaultAccount + ' button.braintree-make-default-card').style.display = 'none';\n }\n $('body').trigger('cart:update');\n accountsLoader.hide();\n }))\n .fail(() => {\n location.reload();\n accountsLoader.hide();\n });\n}\n\n/**\n * Create formData from fields data\n *\n * @param {Object} paymentFields fields data values\n * @param {Object} fieldsData fields data values\n * @returns {Object} cart billing form data\n */\nfunction createPaymentFormData(paymentFields, fieldsData) {\n var paymentFieldsParsed;\n\n if (typeof paymentFields === 'object') {\n paymentFieldsParsed = paymentFields;\n } else {\n paymentFieldsParsed = JSON.parse(paymentFields);\n }\n\n return Object.entries(paymentFieldsParsed).reduce(function (formData, entry) {\n const [key, field] = entry;\n if (typeof field === 'object') {\n formData.append(field.name, fieldsData && fieldsData[key] !== null ? fieldsData[key] : field.value);\n }\n return formData;\n }, new FormData());\n}\n\nfunction setDefaultProperty(params) {\n return $.get(params.url + '?UUID=' + params.id + '&pmID=' + params.paymentMethodID)\n .then((data) => {\n document.querySelector('#uuid-' + data.newDefaultProperty + ' span').style.fontWeight = 'bold';\n document.querySelector('.braintree-make-default-card.uuid-' + data.newDefaultProperty).style.display = 'none';\n document.querySelector('#uuid-' + data.toRemoveDefaultProperty + ' span').style.fontWeight = 'normal';\n document.querySelector('.braintree-make-default-card.uuid-' + data.toRemoveDefaultProperty).style.display = 'inline';\n params.loader.hide();\n })\n .fail(() => {\n params.loader.hide();\n });\n}\n\n/**\n * Checks authenticated customer, account list for default Payment Method\n *\n * @param {string} selector - querySelector\n * @returns {Object} default data attribute or null\n */\nfunction getOptionByDataDefault(selector) {\n if (!document.querySelector(selector)) { return null; }\n\n return Array.apply(null, document.querySelector(selector).options).find(function (el) {\n return el.getAttribute('data-default') ? JSON.parse(el.getAttribute('data-default')) : null;\n });\n}\n\n/**\n * Checks authenticated customer, account list for session Account\n *\n * @param {Object} params querySelector + el.id\n * @returns {Object} session account object\n */\nfunction getSessionAccountOption(params) {\n return Array.apply(null, document.querySelector(params.querySelector).options).find(function (el) {\n return el.id === params.id && JSON.parse(el.getAttribute('data-session-account'));\n });\n}\n\n/**\n * This method is called to remove active session account but just in case\n * if tab of currently active session payment isn't active (buyer submited another payment method)\n * @returns {function}function call\n */\nfunction removeActiveSessionPayment() {\n const activePaymentMethods = [];\n document.querySelectorAll('.payment-options[role=tablist] li').forEach(function (el) {\n activePaymentMethods.push(el.dataset.methodId);\n });\n var helpers = {\n PayPal: require('./paypal/components/payPalSessionAccount'),\n Venmo: require('./venmo/components/venmoSessionAccount'),\n GooglePay: require('./googlepay/components/googlePaySessionAccount'),\n CREDIT_CARD: require('./creditcard/components/creditCardSessionAccount'),\n SRC: require('./src/components/srcSessionAccount'),\n ApplePay: require('./applepay/helpers/applePayHelper')\n };\n var activePM = activePaymentMethods.find(function (el) {\n return isNonceExist(el);\n });\n if (activePM) {\n return helpers[activePM].removeSessionNonce();\n }\n}\n\nfunction showCartErrorMsg(message) {\n $('.checkout-btn').addClass('disabled');\n $('.cart-error').append(\n `
\n \n ${message}\n
`\n );\n window.scrollTo(0, 0);\n}\n\n/**\n * Update Checkout Billing form values\n *\n * @param {Object} billingData fields data values\n */\nfunction updateBillingFormValues(billingData) {\n var $billingFormFields = document.querySelectorAll('.billing-address select, .billing-address input, .contact-info-block input');\n\n $billingFormFields.forEach(function (el) {\n if (billingData[el.name]) {\n el.value = billingData[el.name];\n }\n });\n}\n\n/**\n * Returns selected option from select container\n * @param {Object} $selectContainer Select container\n * @returns {Object} Selected option\n */\nfunction getSelectedOption($selectContainer) {\n var selectedOptionIndex = $selectContainer.selectedIndex;\n var selectedOption = $selectContainer.options[selectedOptionIndex];\n\n return selectedOption;\n}\n\n/**\n * Returns payment field data to be send on backend\n * @param {Object} addressData Address data to be set\n * @param {string} paymentMethodName Payment method name\n * @returns {Object} payment data\n */\nfunction getPaymentFieldsData(addressData, paymentMethodName) {\n return {\n firstName: addressData.firstName,\n lastName: addressData.lastName,\n address1: addressData.streetAddress,\n address2: addressData.extendedAddress || '',\n city: addressData.locality,\n postalCode: addressData.postalCode,\n stateCode: addressData.stateCode || addressData.region,\n country: addressData.countryCodeAlpha2,\n phone: addressData.phone,\n paymentMethod: paymentMethodName\n };\n}\n\nfunction getUpdatedStoreFrontBillingData(billingAddress) {\n var storeFrontBillingData = JSON.parse(document.querySelector('.braintree-billing-payment-wrap').getAttribute('data-billing-form-fields-names'));\n\n storeFrontBillingData.dwfrm_billing_addressFields_firstName = billingAddress.firstName;\n storeFrontBillingData.dwfrm_billing_addressFields_lastName = billingAddress.lastName;\n storeFrontBillingData.dwfrm_billing_addressFields_address1 = billingAddress.streetAddress;\n storeFrontBillingData.dwfrm_billing_addressFields_address2 = billingAddress.extendedAddress || '';\n storeFrontBillingData.dwfrm_billing_addressFields_city = billingAddress.locality;\n storeFrontBillingData.dwfrm_billing_addressFields_postalCode = billingAddress.postalCode;\n storeFrontBillingData.dwfrm_billing_addressFields_states_stateCode = billingAddress.stateCode || billingAddress.region;\n storeFrontBillingData.dwfrm_billing_addressFields_country = billingAddress.countryCodeAlpha2;\n storeFrontBillingData.dwfrm_billing_contactInfoFields_phone = billingAddress.phone;\n\n return storeFrontBillingData;\n}\n\nmodule.exports = {\n initCartUpdateEvent,\n paymentMethodChangeHandle,\n continueButtonToggle,\n updateCheckoutView,\n isValidInputField,\n updatePaymentMethodTab,\n getBillingAddressFormValues,\n removeBtPayment,\n createPaymentFormData,\n isNonceExist,\n setDefaultProperty,\n getOptionByDataDefault,\n removeActiveSessionPayment,\n getSessionAccountOption,\n showCartErrorMsg,\n updateBillingFormValues,\n getSelectedOption,\n getPaymentFieldsData,\n getUpdatedStoreFrontBillingData\n};\n","\nmodule.exports = function (containerElement) {\n if (!containerElement) {\n // eslint-disable-next-line no-console\n console.error('Braintree: No container for showing loaders');\n }\n function Constructor() {\n this.containerEl = containerElement;\n }\n Constructor.prototype.show = function () {\n this.containerEl.style.display = 'block';\n };\n Constructor.prototype.hide = function () {\n this.containerEl.style.display = 'none';\n };\n return new Constructor();\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar payPalSessionAccountHelper = require('../helpers/payPalSessionAccountHelper');\n\n/**\n * Function which remove session nonce and related to the session account data\n */\nfunction removeSessionNonce() {\n var $braintreePayPalNonce = document.querySelector('#braintreePayPalNonce');\n var $braintreePaypalAccount = document.querySelector('#braintreePaypalAccount');\n\n var sessionOption = helper.getSessionAccountOption({\n querySelector: '#braintreePaypalAccountsList',\n id: 'braintreePaypalAccount'\n });\n\n if (sessionOption) {\n $braintreePayPalNonce.value = '';\n $braintreePaypalAccount.selected = false;\n\n sessionOption.classList.add('used-paypal-account-hide');\n sessionOption.classList.remove('used-paypal-account');\n sessionOption.value = '';\n sessionOption.text = '';\n sessionOption.setAttribute('data-session-account', false);\n sessionOption.setAttribute('data-save', false);\n\n // Handles a behavior inside PayPal tab, when session PayPal account was deleted\n payPalSessionAccountHelper.handlePaypalTabBehavior();\n }\n}\n\nmodule.exports = {\n removeSessionNonce\n};\n","'use strict';\n\nvar helper = require('../../helper');\n\nvar $btSavePaypalAccountContainer = document.querySelector('#braintreeSavePaypalAccountContainer');\nvar $paypalContent = document.querySelector('.js_braintree_paypalContent');\nvar $btPayPalBillingButton = document.querySelector('.js_braintree_paypal_billing_button');\n\n/**\n * Hides PayPal Smart Button functionality inside PayPal tab\n */\nfunction hidePaypalSmartButtonFunctionality() {\n $btSavePaypalAccountContainer.style.display = 'none';\n $btPayPalBillingButton.style.display = 'none';\n $paypalContent.setAttribute('data-paypal-is-hide-continue-button', false);\n}\n\n/**\n * Shows PayPal Smart Button functionality inside PayPal tab\n */\nfunction showPaypalSmartButtonFunctionality() {\n $btPayPalBillingButton.style.display = 'block';\n $paypalContent.setAttribute('data-paypal-is-hide-continue-button', true);\n}\n\n/**\n * Handles a behavior inside PayPal tab, when session PayPal account was deleted\n */\nfunction handlePaypalTabBehavior() {\n var $payPalAccountList = document.querySelector('#braintreePaypalAccountsList');\n var $defaultOption = helper.getOptionByDataDefault('#braintreePaypalAccountsList');\n var $selectedOption = helper.getSelectedOption($payPalAccountList);\n var isSelectedPaypalAccount = $selectedOption.value !== 'newaccount';\n var paypalButtonConfigs = JSON.parse($btPayPalBillingButton.getAttribute('data-braintree-config'));\n var isChangePmButton = paypalButtonConfigs.changePMButtonEnabled;\n\n // Case when buyer selected another PM (CC,GP..)\n if ($defaultOption && !isSelectedPaypalAccount) {\n // Shows ChangePM button if buyer has already saved PP account and ChangePM button is enabled\n if (isChangePmButton) {\n $btSavePaypalAccountContainer.style.display = 'block';\n\n showPaypalSmartButtonFunctionality();\n // Shows default PayPal account\n } else {\n $defaultOption.selected = true;\n\n hidePaypalSmartButtonFunctionality();\n }\n // Case when buyer selected PayPal account from paypalAccountList\n } else if (isSelectedPaypalAccount) {\n hidePaypalSmartButtonFunctionality();\n // Case when buyer does not have saved PayPal account\n } else {\n var $btUsedPayPalAccount = document.querySelector('.form-group.braintree_used_paypal_account');\n\n $btUsedPayPalAccount.classList.remove('used-paypal-account');\n $btUsedPayPalAccount.classList.add('used-paypal-account-hide');\n\n showPaypalSmartButtonFunctionality();\n }\n\n [].forEach.call($payPalAccountList, function (el) {\n if (el.style.display === 'none') el.style.display = 'block';\n });\n}\n\nmodule.exports = {\n handlePaypalTabBehavior,\n hidePaypalSmartButtonFunctionality,\n showPaypalSmartButtonFunctionality\n};\n","'use strict';\n\n// Helpers\nvar helper = require('../../helper');\nvar srcListHelper = require('../helpers/srcListHelper');\nvar srcHelper = require('../helpers/srcHelper');\n\nvar $srcSessionAccount = document.querySelector('#sessionSrcAccount');\nvar $srcButton = document.querySelector('.js_braintree_src_button');\nvar $accountListBlock = document.querySelector('.braintree_used_src_account');\nvar $srcCardDescription = document.querySelector('#braintreeSrcCardDescription');\nvar $braintreeSrcCardType = document.querySelector('#braintreeSrcCardType');\nvar $braintreeSrcLastFourDigits = document.querySelector('#braintreeSrcLastFourDigits');\nvar $braintreeSrcCreditCardNumber = document.querySelector('#braintreeSrcCreditCardNumber');\n/**\n * Shows used session account(card) in dropdown and handles checkout view\n * @param {Object} srcPayload payload with card data from tokenization\n */\nfunction showSrcSessionAccount(srcPayload) {\n // description of used card(ex. Visa ending in 1111)\n var cardDescription = srcPayload.details.cardType + ' ' + srcPayload.description;\n\n $srcSessionAccount.value = cardDescription;\n $srcSessionAccount.text = cardDescription;\n $srcCardDescription.value = cardDescription;\n $srcSessionAccount.selected = true;\n $accountListBlock.style.display = 'block';\n $srcButton.style.display = 'none';\n\n // Inputs required for identifying already saved cards\n $braintreeSrcCardType.value = srcPayload.details.cardType;\n $braintreeSrcLastFourDigits.value = srcPayload.details.lastFour;\n $braintreeSrcCreditCardNumber.value = '************' + srcPayload.details.lastFour;\n\n srcListHelper.handleSaveSrcAccountCheckbox($srcSessionAccount, true);\n srcListHelper.setIsHideContinueButtonAttr(false);\n helper.continueButtonToggle(false);\n}\n\n/*\n* Removes method was used and changes appearance of SRC tab\n**/\nfunction removeSessionNonce() {\n $srcSessionAccount.value = '';\n $srcSessionAccount.text = '';\n $accountListBlock.style.display = 'none';\n $srcSessionAccount.setAttribute('data-save', false);\n\n document.querySelector('#braintreeSRCNonce').value = '';\n document.querySelector('#braintreeSrcBillingAddress').value = '';\n document.querySelector('#braintreeSrcCardDescription').value = '';\n document.querySelector('#newSrcAccount').selected = true;\n\n srcHelper.srcContentTabHandler(false);\n}\n\nmodule.exports = {\n showSrcSessionAccount,\n removeSessionNonce\n};\n","'use strict';\n\n/**\n * Shows a zero amount SRC button and hides a normal SRC button\n */\nfunction showZeroAmountSrcButton() {\n $('.v-button-zero-amount').show();\n $('.v-button').hide();\n}\n\n/**\n * Hides a zero amount SRC button and show a normal SRC button\n */\nfunction hideZeroAmountSrcButton() {\n $('.v-button-zero-amount').hide();\n $('.v-button').show();\n}\n\n/**\n * Handles whether show or hide zero amount SRC button\n * @param {number} totalAmount Total amount of order\n */\nfunction handleZeroAmountButtonVisibility(totalAmount) {\n if (totalAmount === 0) {\n showZeroAmountSrcButton();\n } else {\n hideZeroAmountSrcButton();\n }\n}\n\n/**\n * Adds event listener to the zero amount button on the Cart Page\n * @param {DOMElement} $zeroAmountButton DOM element of zero amount SRC button\n * @param {Object} errorHandlingModel Checkout error handling model\n */\nfunction addZeroAmountButtonEventListenerOnCart($zeroAmountButton, errorHandlingModel) {\n $zeroAmountButton.addEventListener('click', () => {\n errorHandlingModel.hideError();\n errorHandlingModel.showZeroAmountOnCart();\n });\n}\n\n/**\n * Adds event listener to the zero amount SRC button on the Checkout Page\n * @param {DOMElement} $zeroAmountButton DOM element of zero amount SRC button\n * @param {Object} errorHandlingModel Checkout error handling model\n */\nfunction addZeroAmountButtonEventListenerOnCheckout($zeroAmountButton, errorHandlingModel) {\n $zeroAmountButton.addEventListener('click', () => {\n errorHandlingModel.hideError();\n errorHandlingModel.showZeroAmountOnCheckout();\n });\n}\n\n/**\n * Creates a mutation obserber for total amount element\n * @param {DOMElement} totalAmountElement DOM Element that includes the total cost\n */\nfunction initTotalAmountElementObserver(totalAmountElement) {\n var config = { attributes: true, childList: true, subtree: true };\n\n var observer = new MutationObserver((element) => {\n var totalAmount = Number.parseFloat(element[0].target.textContent.slice(1));\n\n // Handles whether show or hide zero amount SRC button\n handleZeroAmountButtonVisibility(totalAmount);\n });\n\n observer.observe(totalAmountElement, config);\n}\n\nmodule.exports = {\n initTotalAmountElementObserver: initTotalAmountElementObserver,\n addZeroAmountButtonEventListenerOnCheckout: addZeroAmountButtonEventListenerOnCheckout,\n addZeroAmountButtonEventListenerOnCart: addZeroAmountButtonEventListenerOnCart,\n hideZeroAmountSrcButton: hideZeroAmountSrcButton,\n showZeroAmountSrcButton: showZeroAmountSrcButton,\n handleZeroAmountButtonVisibility: handleZeroAmountButtonVisibility\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar srcListHelper = require('./srcListHelper');\nvar srcButtonHelper = require('./srcButtonHelper');\n\n/**\n * Returns Braintree SRC configs\n * @returns {Object} Braintree SRC configs\n */\nfunction getBraintreeSRCButtonConfigs() {\n var braintreeSrcButtonConfigs = null;\n var $srcButton = document.querySelector('.js_braintree_src_button') || document.querySelector('.js_braintree_src_account_button');\n\n try {\n braintreeSrcButtonConfigs = JSON.parse($srcButton.getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeSrcButtonConfigs;\n }\n\n return braintreeSrcButtonConfigs;\n}\n\n/**\n * Returns stringified SRC shipping address\n * @param {Object} shippingData SRC shipping\n * @returns {string} stringified shipping address\n */\nfunction createSrcShippingAddressData(shippingData) {\n var shippingAddress = {};\n shippingAddress.recipientName = shippingData.firstName + ' ' + shippingData.lastName;\n shippingAddress.phone = shippingData.phoneNumber;\n shippingAddress.countryCodeAlpha2 = shippingData.countryCode;\n shippingAddress.streetAddress = shippingData.streetAddress;\n shippingAddress.extendedAddress = shippingData.extendedAddress;\n shippingAddress.locality = shippingData.locality;\n shippingAddress.region = shippingData.region;\n shippingAddress.postalCode = shippingData.postalCode;\n\n return JSON.stringify(shippingAddress);\n}\n\n/**\n * Returns stringified SRC billing address\n * @param {Object} billingData SRC billing\n * @param {Object} userData user data with email\n * @returns {string} stringified billing address\n */\nfunction createSrcBillingAddress(billingData, userData) {\n var srcBillingAddress = {};\n srcBillingAddress.recipientName = billingData.firstName + ' ' + billingData.lastName;\n srcBillingAddress.phone = billingData.phoneNumber;\n srcBillingAddress.countryCodeAlpha2 = billingData.countryCode;\n srcBillingAddress.streetAddress = billingData.streetAddress;\n srcBillingAddress.extendedAddress = billingData.streetAddress;\n srcBillingAddress.locality = billingData.locality;\n srcBillingAddress.region = billingData.region;\n srcBillingAddress.postalCode = billingData.postalCode;\n srcBillingAddress.email = userData.userEmail;\n\n return JSON.stringify(srcBillingAddress);\n}\n\n/**\n * Creates SRC checkout form data\n * @param {Object} srcCheckoutFormData SRC form data\n * @param {Object} srcResponseData payload from SRC\n * @returns {Object} SRC Checkout Form with appended SRC data\n */\nfunction createSrcCheckoutFormData(srcCheckoutFormData, srcResponseData) {\n var csrfToken = document.querySelector('.braintree-cart-buttons-wrap #csrf_token');\n\n var cardDescription = srcResponseData.details.cardType + ' ' + srcResponseData.description;\n var deviceData = document.querySelector('input[name=braintreeSrcDeviceDataInput]').value;\n var shippingAddressData = createSrcShippingAddressData(srcResponseData.shippingAddress);\n\n srcCheckoutFormData.append(csrfToken.name, csrfToken.value);\n srcCheckoutFormData.append('braintreeSrcNonce', srcResponseData.nonce);\n srcCheckoutFormData.append('braintreeSrcDeviceDataInput', deviceData);\n srcCheckoutFormData.append('braintreeSrcShippingAddress', shippingAddressData || '{}');\n srcCheckoutFormData.append('braintreeSrcCardDescription', cardDescription);\n srcCheckoutFormData.append('braintreeSrcCardType', srcResponseData.details.cardType);\n srcCheckoutFormData.append('braintreeSrcCreditCardNumber', '************' + srcResponseData.details.lastFour);\n\n return srcCheckoutFormData;\n}\n\n/**\n * Creates SRC form data\n * @param {Object} responseData data received after SRC tokenize\n * @param {string} paymentMethodName SRC payment method name\n * @returns {Object} SRC payment form data\n */\nfunction createSrcFormData(responseData, paymentMethodName) {\n var srcData = {};\n var checkoutFormFields = document.querySelector('.braintree-cart-buttons-wrap').getAttribute('data-checkout-form-fields');\n\n srcData.firstName = responseData.userData.userFirstName;\n srcData.lastName = responseData.userData.userLastName;\n srcData.address1 = responseData.billingAddress.streetAddress;\n srcData.address2 = responseData.billingAddress.extendedAddress || '';\n srcData.city = responseData.billingAddress.locality;\n srcData.postalCode = responseData.billingAddress.postalCode;\n srcData.stateCode = responseData.billingAddress.region;\n srcData.country = responseData.billingAddress.countryCode;\n srcData.email = responseData.userData.userEmail;\n srcData.phone = responseData.billingAddress.phoneNumber;\n srcData.paymentMethod = paymentMethodName;\n\n return helper.createPaymentFormData(checkoutFormFields, srcData);\n}\n\n/**\n * Updates Storefront billing data form with SRC data\n * @param {Object} srcBillingData SRC billing address data/phone/email\n */\nfunction updateStorefrontBillingData(srcBillingData) {\n var storefrontBillingData = JSON.parse(document.querySelector('.braintree-billing-payment-wrap').getAttribute('data-billing-form-fields-names'));\n storefrontBillingData.dwfrm_billing_addressFields_firstName = srcBillingData.firstName;\n storefrontBillingData.dwfrm_billing_addressFields_lastName = srcBillingData.lastName;\n storefrontBillingData.dwfrm_billing_addressFields_address1 = srcBillingData.streetAddress;\n storefrontBillingData.dwfrm_billing_addressFields_address2 = srcBillingData.extendedAddress || '';\n storefrontBillingData.dwfrm_billing_addressFields_city = srcBillingData.locality;\n storefrontBillingData.dwfrm_billing_addressFields_postalCode = srcBillingData.postalCode;\n storefrontBillingData.dwfrm_billing_addressFields_states_stateCode = srcBillingData.region;\n storefrontBillingData.dwfrm_billing_addressFields_country = srcBillingData.countryCode;\n storefrontBillingData.dwfrm_billing_contactInfoFields_email = srcBillingData.email;\n storefrontBillingData.dwfrm_billing_contactInfoFields_phone = srcBillingData.phoneNumber;\n\n helper.updateBillingFormValues(storefrontBillingData);\n}\n\n/**\n * Handles all behavior related to the src content tab\n * SRC list (dropdown) change - actions for new/session account showing\n * @param {bollean} isSrcTabActive Whether Src tab is active\n */\nfunction srcContentTabHandler(isSrcTabActive) {\n var $srcAccountList = document.querySelector('#braintreeSrcAccountsList');\n var srcOptionId = $srcAccountList.value;\n var $srcButton = document.querySelector('.js_braintree_src_button');\n var $srcZeroAmountButton = document.querySelector('.braintree-billingpage-src-button-zero-amount');\n var $alertInfo = document.querySelector('.billingAddressInfoAlert');\n var $srcSessionAccount = document.querySelector('#sessionSrcAccount');\n\n switch (srcOptionId) {\n case 'newaccount':\n $srcButton.style.display = 'block';\n $srcZeroAmountButton.style.display = 'block';\n $alertInfo.style.display = 'block';\n\n if (isSrcTabActive) {\n helper.continueButtonToggle(true);\n }\n\n srcListHelper.setIsHideContinueButtonAttr(true);\n // Case when registered user and vaulting is enabled\n srcListHelper.handleSaveSrcAccountCheckbox($srcSessionAccount, true);\n break;\n default:\n $srcButton.style.display = 'none';\n $srcZeroAmountButton.style.display = 'none';\n $alertInfo.style.display = 'none';\n\n helper.continueButtonToggle(false);\n srcListHelper.setIsHideContinueButtonAttr(false);\n // Case when registered user and vaulting is enabled\n srcListHelper.handleSaveSrcAccountCheckbox($srcSessionAccount, JSON.parse($srcSessionAccount.getAttribute('data-save')));\n }\n}\n\n/**\n * Treats the behavior of the SRC button in the SRC tab based on the total cost\n * Shows/hides the required SRC button if the total value is/isn't 0\n * @param {DOMElement} totalAmountElement DOM Element that includes the total cost\n * @param {Object} errorHandlingModel ErrorHandling cart or checkout model\n */\nfunction zeroAmountSrcButtonBehavior(totalAmountElement, errorHandlingModel) {\n var $braintreeCartZeroAmountSrcButton = document.querySelector('.braintree-cart-src-button-zero-amount');\n var $braintreeBillingPageZeroAmountSrcButton = document.querySelector('.braintree-billingpage-src-button-zero-amount');\n var totalAmount = Number.parseFloat(totalAmountElement.textContent.slice(1));\n\n // Add event listener for cart zero amount button\n if ($braintreeCartZeroAmountSrcButton) {\n srcButtonHelper.addZeroAmountButtonEventListenerOnCart($braintreeCartZeroAmountSrcButton, errorHandlingModel);\n }\n\n // Add event listener for checkout zero amount button\n if ($braintreeBillingPageZeroAmountSrcButton) {\n srcButtonHelper.addZeroAmountButtonEventListenerOnCheckout($braintreeBillingPageZeroAmountSrcButton, errorHandlingModel);\n }\n\n // Handles whether show or hide zero amount button\n srcButtonHelper.handleZeroAmountButtonVisibility(totalAmount);\n\n // Creates a mutation obserber for total amount element\n srcButtonHelper.initTotalAmountElementObserver(totalAmountElement);\n}\n\nmodule.exports = {\n getBraintreeSRCButtonConfigs,\n createSrcShippingAddressData,\n createSrcBillingAddress,\n createSrcFormData,\n updateStorefrontBillingData,\n srcContentTabHandler,\n createSrcCheckoutFormData,\n zeroAmountSrcButtonBehavior\n};\n","var helper = require('../../helper');\n\nvar $srcAccountList = document.querySelector('#braintreeSrcAccountsList');\nvar $srcButton = document.querySelector('.js_braintree_src_button');\nvar $accoutnListBlock = document.querySelector('.braintree_used_src_account');\nvar $alertInfo = document.querySelector('.billingAddressInfoAlert');\nvar $saveSRCAccountCheckbox = document.querySelector('#braintreeSaveSRCAccount');\nvar $saveSRCAccountCheckboxContainter = document.querySelector('#braintreeSaveSRCContainer');\n\n/**\n * Sets value to data-paypal-is-hide-continue-button attribute\n * @param {boolean} value true/false\n */\nfunction setIsHideContinueButtonAttr(value) {\n var $srcContent = document.querySelector('.js_braintree_srcContent');\n\n $srcContent.setAttribute('data-paypal-is-hide-continue-button', value);\n}\n\n/**\n * Handles actions based on selected value in SRC dropdown for checkout view\n */\nfunction srsListStateHandler() {\n var srcOptionId = $srcAccountList.value;\n switch (srcOptionId) {\n case 'newaccount':\n\n if ($alertInfo) {\n $alertInfo.style.display = 'block';\n }\n\n $accoutnListBlock.style.display = 'none';\n break;\n default:\n $srcButton.style.display = 'none';\n\n if ($alertInfo) {\n $alertInfo.style.display = 'none';\n }\n\n helper.continueButtonToggle(false);\n setIsHideContinueButtonAttr(false);\n }\n}\n\n/**\n * Get stored card by card type and last four digits\n * @param {string} cardType card type\n * @param {string} lastFour last four card digits\n * @returns {Object} jquery object of found stored card\n */\nfunction getStoredCardByData(cardType, lastFour) {\n var $foundCard;\n\n $('.js_stored_card').each(function (_, $el) {\n var $card = $($el);\n var storedCardType = $card.data('type').replace(/\\s/g, '').toLowerCase();\n var storedCardLastFour = $card.data('last-four').toString();\n\n if (storedCardType === cardType && storedCardLastFour === lastFour) {\n $foundCard = $card;\n }\n });\n\n return $foundCard;\n}\n\n/**\n * Checks whether SRC session card is already stored\n * @param {string} cardType card type\n * @param {string} lastFour last four card digits\n * @returns {boolean} \"true/false\" value whether session card is already stored\n */\nfunction isSessionCardAlreadyStored(cardType, lastFour) {\n var $storedCard = getStoredCardByData(cardType, lastFour);\n var flag = false;\n\n if ($storedCard) {\n flag = true;\n }\n\n return flag;\n}\n\n/**\n * Sets value to \"Save SRC account\" checkbox\n * @param {Element} srcSessionAccount element from which we recognize session account existence\n * @param {boolean} value true/false\n */\nfunction handleSaveSrcAccountCheckbox(srcSessionAccount, value) {\n var isSrcSessionCardExist = srcSessionAccount.value !== '';\n var isAddNewOptionSelected = $srcAccountList.value === 'newaccount';\n\n if ($saveSRCAccountCheckbox) {\n // In case if session account exists and is chosen in dropdown\n // we check whether used SRC card is already stored\n // if card is already stored \"save\" checkbox is hidden and unchecked\n if (isSrcSessionCardExist && !isAddNewOptionSelected) {\n var $braintreeSrcCardType = document.querySelector('#braintreeSrcCardType');\n var $braintreeSrcLastFourDigits = document.querySelector('#braintreeSrcLastFourDigits');\n var sessionCardType = $braintreeSrcCardType.value;\n var sessionCardLastFour = $braintreeSrcLastFourDigits.value;\n sessionCardType = sessionCardType.replace(/\\s/g, '').toLowerCase();\n\n var isSrcSessionCardAlreadyStored = isSessionCardAlreadyStored(sessionCardType, sessionCardLastFour);\n\n if (isSrcSessionCardAlreadyStored) {\n $saveSRCAccountCheckbox.checked = false;\n $saveSRCAccountCheckboxContainter.style.display = 'none';\n }\n\n return;\n }\n // In case if session card does not exist/user chooses option \"Add New\"\n // or session card is not stored yet\n // checkbox is checked and shown\n $saveSRCAccountCheckboxContainter.style.display = 'block';\n $saveSRCAccountCheckbox.checked = value;\n }\n}\n\nmodule.exports = {\n setIsHideContinueButtonAttr,\n srsListStateHandler,\n handleSaveSrcAccountCheckbox\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar venmoHelper = require('../helpers/venmoHelper');\n\nvar $venmoButton = document.querySelector('.js_braintree_venmo_button');\nvar $braintreeVenmoSessionAccount = document.getElementById('braintreeVenmoAccount');\nvar $venmoAccountBlock = document.querySelector('.js_braintree_used_venmo_account');\nvar $braintreeVenmoUserId = document.querySelector('#braintreeVenmoUserId');\n\n/**\n * Handles showing Venmo session account\n */\nfunction showVenmoAccount() {\n var btVenmoAccountsList = document.querySelector('#braintreeVenmoAccountsList');\n\n if (!btVenmoAccountsList) {\n $venmoAccountBlock.classList.remove('used-venmo-account-hide');\n $braintreeVenmoSessionAccount.options[0].text = $braintreeVenmoUserId.value;\n }\n\n $venmoButton.style.display = 'none';\n\n helper.continueButtonToggle(false);\n}\n\n/**\n * Removes method was used and change appearance of Venmo tab\n */\nfunction removeSessionNonce() {\n var defaultOption = helper.getOptionByDataDefault('#braintreeVenmoAccountsList');\n var braintreeVenmoNonce = document.querySelector('#braintreeVenmoNonce');\n var braintreeVenmoBilling = document.querySelector('#braintreeVenmoBilling');\n\n if (defaultOption) {\n defaultOption.selected = true;\n\n venmoHelper.venmoContentTabHandler();\n } else {\n $venmoAccountBlock.classList.remove('used-venmo-account');\n $venmoAccountBlock.classList.add('used-venmo-account-hide');\n $venmoButton.style.display = 'block';\n }\n\n braintreeVenmoNonce.value = '';\n braintreeVenmoBilling.value = '';\n}\n\nmodule.exports = {\n showVenmoAccount,\n removeSessionNonce\n};\n","'use strict';\n\nvar $addVenmoAccountBtn = document.querySelector('.add-venmo-account');\nvar $venmoAccountWrapper = document.querySelector('.js_braintree_accountVenmoButton_wrapper');\nvar $venmoErrorContainer = document.querySelector('#venmoAccountErrorContainer');\n\n/**\n * Shows error on the Account Page and hides Venmo block in case when browser is not supported\n * @param {Object} braintreeVenmoConfig Braintree Venmo config\n */\nfunction handleNoBrowserSupportErrorOnAccount(braintreeVenmoConfig) {\n $addVenmoAccountBtn.style.display = 'none';\n $venmoAccountWrapper.style.display = 'block';\n document.querySelector('#venmoAccountErrorContainer').textContent = braintreeVenmoConfig.messages.VENMO_BROWSER_NOT_SUPPORTED;\n\n [].slice.call($venmoAccountWrapper.children).forEach(function (item) {\n if (!item.classList.contains('error')) {\n item.style.display = 'none';\n }\n });\n}\n\n/**\n * Hides Venmo tab on the Billing Page - in case when browser is not supported\n */\nfunction hideVenmoTab() {\n document.querySelector('.js_braintree_venmo_button').parentElement.firstElementChild.style.display = 'none';\n document.querySelector('.payment-options[role=tablist] .nav-item[data-method-id=\"Venmo\"]').style.display = 'none'; // Remove the venmo select payment method radiobutton\n}\n\n/**\n * Handles error flows in case when browser is not supported for Billing/Account Pages\n * @param {Object} braintreeVenmoConfig Braintree Venmo config\n */\nfunction handleNoBrowserSupport(braintreeVenmoConfig) {\n if ($venmoAccountWrapper) {\n handleNoBrowserSupportErrorOnAccount(braintreeVenmoConfig);\n } else {\n hideVenmoTab();\n }\n}\n\n/**\n * Shows error container and passed error message\n * @param {string} error error text\n */\nfunction showVenmoError(error) {\n $venmoErrorContainer.style.display = 'block';\n $venmoErrorContainer.textContent = error;\n}\n\n/**\n * Hides error container and clear existing error\n */\nfunction clearVenmoError() {\n $venmoErrorContainer.textContent = '';\n $venmoErrorContainer.style.display = 'none';\n}\n\n/**\n * Show checkout error message on top of the page\n * @param {string} message Error message\n */\nfunction showCheckoutErrorMsg(message) {\n document.querySelector('.error-message-text').textContent = '';\n document.querySelector('.error-message').style.display = 'block';\n document.querySelector('.error-message-text').append(message);\n\n window.scrollTo(0, 0);\n}\n\n/**\n * Inits Venmo error handler components\n * @param {Element} $venmoButton Venmo button element\n */\nfunction init($venmoButton) {\n // For account page flow error container already exist\n var isVenmoErrorContainerExists = Boolean($venmoErrorContainer);\n\n // For the Billing Page we create error containter\n if (!isVenmoErrorContainerExists) {\n $venmoErrorContainer = document.createElement('div');\n $venmoErrorContainer.className = 'venmo-error';\n $venmoButton.parentNode.insertBefore($venmoErrorContainer, $venmoButton.nextSibling);\n }\n}\n\nmodule.exports = {\n init,\n handleNoBrowserSupport,\n showVenmoError,\n clearVenmoError,\n showCheckoutErrorMsg\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar venmoErrorHandler = require('../errorhandler/venmoErrorHandler');\n\nvar $addVenmoAccountBtn = document.querySelector('.add-venmo-account');\nvar $venmoAccountWrapper = document.querySelector('.js_braintree_accountVenmoButton_wrapper');\n\n/**\n * Returns Braintree Venmo configs\n * @returns {Object} Braintree Venmo configs\n */\nfunction getBraintreeVenmoButtonConfigs() {\n var braintreeVenmoButtonConfigs = null;\n var $venmoButton = document.querySelector('.js_braintree_venmo_button') || document.querySelector('.js_braintree_accountVenmoButton');\n\n try {\n braintreeVenmoButtonConfigs = JSON.parse($venmoButton.getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeVenmoButtonConfigs;\n }\n\n return braintreeVenmoButtonConfigs;\n}\n\n/**\n * Creates loader container on the Billing page\n * @param {Element} $target Venmo button target for which loader container is created\n * @returns {Element} created loader container element\n */\nfunction createLoaderContainter($target) {\n var $loaderContainter = document.createElement('div');\n\n $loaderContainter.className = 'venmo-braintree-loader';\n\n helper.continueButtonToggle(true);\n\n return $target.parentNode.insertBefore($loaderContainter, $target);\n}\n\n\n/**\n * Updates the billing address form values within saved billing\n * @param {Object} billingAddress billing address\n */\nfunction updateBillingAddressFormValues(billingAddress) {\n var form = $('form[name=dwfrm_billing]');\n var inputNames = ['firstName', 'lastName', 'address1', 'address2', 'city', 'postalCode', 'country'];\n\n if (!form) {\n return;\n }\n\n $.each(inputNames, function (index, value) {\n $(`input[name$=_${value}]`, form).val(decodeURIComponent(billingAddress[value]));\n });\n\n $('select[name$=_stateCode],input[name$=_stateCode]', form)\n .val(billingAddress.stateCode);\n}\n\n/**\n * Shows Venmo button on the Account Page and hides \"add new\" button\n */\nfunction showVenmoAccountBtn() {\n $addVenmoAccountBtn.style.display = 'none';\n $venmoAccountWrapper.style.display = 'block';\n}\n\n/**\n * Hides Venmo button on the Account Page and shows \"add new\" button\n */\nfunction hideVenmoAccountBtn() {\n $addVenmoAccountBtn.style.display = 'block';\n $venmoAccountWrapper.style.display = 'none';\n}\n\n/**\n * Saves Venmo device (risk) data to hidden input\n * @param {string} deviceData Venmo device (risk) data\n */\nfunction setVenmoDeviceData(deviceData) {\n var $braintreeVenmoDeviceData = document.querySelector('#braintreeVenmoDeviceData');\n\n if ($braintreeVenmoDeviceData) {\n $braintreeVenmoDeviceData.value = deviceData;\n }\n}\n\n/**\n * Checks billing form on the Billing Page\n * If billing form is valid, saves/updates billing address to input\n * If not valid (possible case: empty email) - add error class to email input\n * @returns {boolean} billing form check result value\n */\nfunction checkBillingForm() {\n var $billingForm = document.querySelector('.card-body [id=dwfrm_billing]');\n var $venmoBillingInput = document.querySelector('#braintreeVenmoBilling');\n\n if ($billingForm.checkValidity()) {\n /**\n * Setting current customer Billing address to form\n * For the case when SFCC redirects customer from payment stage to shipping stage\n * after successful Venmo app response\n */\n $venmoBillingInput.value = JSON.stringify(helper.getBillingAddressFormValues());\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Checks zero amount on the Billing Page\n * If amount is zero Venmo pop-up is closed and appropriate error is shown\n * If amount is acceptable by Venmo user could proceed through pop-up\n * @returns {boolean} zero amount check result value\n */\nfunction checkZeroAmount() {\n var $venmoButton = document.querySelector('.js_braintree_venmo_button');\n var venmoButtonConfig = JSON.parse($venmoButton.getAttribute('data-braintree-config'));\n var amount = venmoButtonConfig.options.amount;\n\n if (amount === 0) {\n var errorMessage = venmoButtonConfig.messages.VENMO_ZERO_AMOUNT_ERROR;\n\n venmoErrorHandler.showCheckoutErrorMsg(errorMessage);\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Handles all behavior related to the Venmo content tab\n */\nfunction venmoContentTabHandler() {\n var $btVenmoAccountsList = document.querySelector('#braintreeVenmoAccountsList');\n var $saveVenmoAccountCheckboxContainer = document.querySelector('#braintreeSaveVenmoAccountContainer');\n var $saveVenmoAccountCheckbox = document.querySelector('#braintreeSaveVenmoAccount');\n var $venmoButton = document.querySelector('.js_braintree_venmo_button');\n var $venmoContent = document.querySelector('.js_braintree_venmoContent');\n var venmoOptionId = $btVenmoAccountsList.value;\n\n switch (venmoOptionId) {\n // Case when option \"new account\" is selected in dropdown\n case 'newaccount':\n $venmoButton.style.display = 'block';\n\n helper.continueButtonToggle(true);\n $venmoContent.setAttribute('data-paypal-is-hide-continue-button', true);\n\n break;\n // Case when saved account is selected in dropdown\n default:\n $venmoButton.style.display = 'none';\n\n helper.continueButtonToggle(false);\n $venmoContent.setAttribute('data-paypal-is-hide-continue-button', false);\n // Case when registered user and vaulting is enabled\n if ($saveVenmoAccountCheckboxContainer) {\n $saveVenmoAccountCheckbox.checked = false;\n $saveVenmoAccountCheckboxContainer.style.display = 'none';\n }\n }\n}\n\n\nmodule.exports = {\n getBraintreeVenmoButtonConfigs,\n createLoaderContainter,\n updateBillingAddressFormValues,\n showVenmoAccountBtn,\n hideVenmoAccountBtn,\n setVenmoDeviceData,\n checkBillingForm,\n checkZeroAmount,\n venmoContentTabHandler\n};\n","/**\n * Property of OSF GLOBAL SERVICES INC. , an OSF Digital company. OSF remains the sole owner of all right, title and interest in the software. Do not copy, sell, reverse engineer or otherwise attempt to derive or obtain information about the functioning, manufacture or operation therein.\n */\n\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 ? \"&\" : \"?\") +\n Object.keys(params)\n .map(function (key) {\n return key + \"=\" + encodeURIComponent(params[key]);\n })\n .join(\"&\");\n\n return newUrl;\n}\n\n/**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} data - AJAX response from the server\n */\nfunction updateCartTotals(data) {\n $(\".number-of-items\").empty().append(data.resources.numberOfItems);\n $(\".shipping-cost\").empty().append(data.totals.totalShippingCost);\n $(\".tax-total\").empty().append(data.totals.totalTax);\n $(\".grand-total\").empty().append(data.totals.grandTotal);\n $(\".sub-total\").empty().append(data.totals.subTotal);\n $(\".minicart-quantity\").empty().append(data.numItems);\n $(\".minicart-link\").attr({\n \"aria-label\": data.resources.minicartCountOfItems,\n title: data.resources.minicartCountOfItems\n });\n if (data.totals.orderLevelDiscountTotal.value > 0) {\n $(\".order-discount\").removeClass(\"hide-order-discount\");\n $(\".order-discount-total\")\n .empty()\n .append(\"- \" + data.totals.orderLevelDiscountTotal.formatted);\n } else {\n $(\".order-discount\").addClass(\"hide-order-discount\");\n }\n\n if (data.totals.shippingLevelDiscountTotal.value > 0) {\n $(\".shipping-discount\").removeClass(\"hide-shipping-discount\");\n $(\".shipping-discount-total\")\n .empty()\n .append(\n \"- \" + data.totals.shippingLevelDiscountTotal.formatted\n );\n } else {\n $(\".shipping-discount\").addClass(\"hide-shipping-discount\");\n }\n\n data.items.forEach(function (item) {\n if (item.renderedPromotions) {\n $(\".item-\" + item.UUID)\n .empty()\n .append(item.renderedPromotions);\n }\n if (item.priceTotal && item.priceTotal.renderedPrice) {\n $(\".item-total-\" + item.UUID)\n .empty()\n .append(item.priceTotal.renderedPrice);\n }\n });\n}\n\n/**\n * re-renders the approaching discount messages\n * @param {Object} approachingDiscounts - updated approaching discounts for the cart\n */\nfunction updateApproachingDiscounts(approachingDiscounts) {\n var html = \"\";\n $(\".approaching-discounts\").empty();\n if (approachingDiscounts.length > 0) {\n approachingDiscounts.forEach(function (item) {\n html += \"
\" +\n item.discountMsg +\n \"
\";\n });\n }\n $(\".approaching-discounts\").append(html);\n}\n\n/**\n * Checks whether the basket is valid. if invalid displays error message and disables\n * checkout button\n * @param {Object} data - AJAX response from the server\n */\nfunction validateBasket(data) {\n var $cartError = $(\".cart-error\");\n var $cart = $(\".cart\");\n var $numberOfItems = $(\".number-of-items\");\n var $minicartQuantity = $(\".minicart-quantity\");\n var $minicartLink = $(\".minicart-link\");\n var $minicartPopover = $(\".minicart .popover\");\n var $checkoutBtn = $(\".checkout-btn\");\n var $buyseparatelyBannerInCart = $(\".buyseparately-banner[data-incartpage='true']\");\n var $jsBraintreeApplepayButtonsWrap = $(\".js_braintree_applepayButtonsWrap\");\n\n if (data.valid.error) {\n if (data.valid.message) {\n var errorHtml = `
\n \n ${data.valid.message}\n
`;\n\n $cartError.append(errorHtml);\n } else {\n $cart.empty().append(`\n
\n
\n

${data.resources.emptyCartMsg}

\n
\n
\n `);\n $numberOfItems.empty().append(data.resources.numberOfItems);\n $minicartQuantity.empty().append(data.numItems);\n $minicartLink.attr({\n \"aria-label\": data.resources.minicartCountOfItems,\n title: data.resources.minicartCountOfItems\n });\n $minicartPopover.empty().removeClass(\"show\");\n }\n\n $checkoutBtn.addClass(\"disabled\");\n } else {\n $checkoutBtn.toggleClass(\"disabled\", data.isMixedBasketGV);\n }\n\n if ($buyseparatelyBannerInCart.length) {\n if (data.isMixedBasketGV) {\n $buyseparatelyBannerInCart.slideDown();\n } else {\n $buyseparatelyBannerInCart.slideUp();\n }\n }\n if ($jsBraintreeApplepayButtonsWrap.length) {\n $jsBraintreeApplepayButtonsWrap.toggleClass(\"disabled\", data.isMixedBasketGV);\n }\n}\n\n/**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} message - Error message to display\n */\nfunction createErrorNotification(message) {\n var errorHtml = \"
\" +\n \"\" +\n message +\n \"
\";\n\n $(\".cart-error\").append(errorHtml);\n}\n\nmodule.exports = function () {\n $(\"body\").on(\"click\", \".remove-giftcertificate\", function (e) {\n e.preventDefault();\n var $this = $(this);\n var actionUrl = $this.data(\"action\");\n var uuid = $this.data(\"uuid\");\n var $deleteConfirmBtn = $(\".delete-giftcertificate-confirmation-btn\");\n $deleteConfirmBtn.data(\"uuid\", uuid);\n $deleteConfirmBtn.data(\"action\", actionUrl);\n var $minicart = $(\".minicart .popover\");\n if ($minicart.hasClass(\"show\")) {\n $minicart.removeClass(\"show\");\n }\n });\n\n $(\"body\").off(\"click\", \".delete-giftcertificate-confirmation-btn\");\n\n $(\"body\").on(\"click\", \".delete-giftcertificate-confirmation-btn\", function (e) {\n e.preventDefault();\n var $this = $(this);\n var url = $this.data(\"action\");\n var uuid = $this.data(\"uuid\");\n var urlParams = {\n uuid: uuid\n };\n url = appendToUrl(url, urlParams);\n $(\"body > .modal-backdrop\").remove();\n $.spinner().start();\n $.ajax({\n url: url,\n type: \"get\",\n dataType: \"json\",\n success: function (data) {\n if (\n data.items.length === 0 && data.giftcertificates.length === 0\n ) {\n $(\".cart\")\n .empty()\n .append(\n \"
\" +\n \"
\" +\n \"

\" +\n data.resources.emptyCartMsg +\n \"

\" +\n \"
\" +\n \"
\"\n );\n var $minicart = $(\".minicart\");\n var $minicartPopover = $minicart.find(\".popover\");\n\n $(\".number-of-items\")\n .empty()\n .append(data.resources.numberOfItems);\n $(\".minicart-quantity\").empty().append(data.numItems);\n $minicartPopover.empty().removeClass(\"show\");\n $(\"body\").removeClass(\"modal-open\");\n $(\"html\").removeClass(\"veiled\");\n } else {\n $(\".uuid-\" + uuid).remove();\n $(\".coupons-and-promos\")\n .empty()\n .append(data.totals.discountsHtml);\n updateCartTotals(data);\n updateApproachingDiscounts(data.approachingDiscounts);\n $(\"body\").trigger(\"setShippingMethodSelection\", data);\n validateBasket(data);\n }\n $.spinner().stop();\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n }\n });\n });\n\n $(\"body\").off(\"click\", \".cart-delete-confirmation-btn\");\n\n $(\"body\").on(\"click\", \".cart-delete-confirmation-btn\", function (e) {\n e.preventDefault();\n\n var productID = $(this).data(\"pid\");\n var url = $(this).data(\"action\");\n var uuid = $(this).data(\"uuid\");\n var relatedproduct = $(this).data(\"relatedproduct\");\n var urlParams = {\n pid: productID,\n uuid: uuid\n };\n\n if (relatedproduct) {\n urlParams.relatedproduct = relatedproduct;\n }\n\n url = appendToUrl(url, urlParams);\n\n $(\"body > .modal-backdrop\").remove();\n\n $.spinner().start();\n\n $(\"body\").trigger(\"cart:beforeUpdate\");\n\n $.ajax({\n url: url,\n type: \"get\",\n dataType: \"json\",\n success: function (data) {\n if (\n data.basket.items.length === 0 && data.basket.giftcertificates.length === 0\n ) {\n $(\".cart\")\n .empty()\n .append(\n \"
\" +\n \"
\" +\n \"

\" +\n data.basket.resources.emptyCartMsg +\n \"

\" +\n \"
\" +\n \"
\"\n );\n $(\".number-of-items\")\n .empty()\n .append(data.basket.resources.numberOfItems);\n $(\".minicart-quantity\")\n .empty()\n .append(data.basket.numItems);\n $(\".minicart-link\").attr({\n \"aria-label\": data.basket.resources.minicartCountOfItems,\n title: data.basket.resources.minicartCountOfItems\n });\n $(\".minicart .popover\").empty();\n $(\".minicart .popover\").removeClass(\"show\");\n $(\"body\").removeClass(\"modal-open\");\n $(\"html\").removeClass(\"veiled\");\n } else {\n if (\n data.toBeDeletedUUIDs && data.toBeDeletedUUIDs.length > 0\n ) {\n for (let i = 0; i < data.toBeDeletedUUIDs.length; i += 1) {\n $(\".uuid-\" + data.toBeDeletedUUIDs[i]).remove();\n }\n }\n $(\".uuid-\" + uuid).remove();\n if (!data.basket.hasBonusProduct) {\n $(\".bonus-product\").remove();\n }\n $(\".coupons-and-promos\")\n .empty()\n .append(data.basket.totals.discountsHtml);\n updateCartTotals(data.basket);\n updateApproachingDiscounts(\n data.basket.approachingDiscounts\n );\n $(\"body\").trigger(\n \"setShippingMethodSelection\",\n data.basket\n );\n validateBasket(data.basket);\n if (data.basket.giftcertificates.length === data.basket.numItems) {\n $(\".cart-shipping-item\").fadeOut(500);\n $(\".shipping-cost-block\").fadeOut(500);\n }\n }\n\n $(\"body\").trigger(\"cart:update\");\n\n $.spinner().stop();\n }\n });\n });\n};\n","/**\r\n * Property of OSF GLOBAL SERVICES INC. , an OSF Digital company. OSF remains the sole owner of all right, title and interest in the software. Do not copy, sell, reverse engineer or otherwise attempt to derive or obtain information about the functioning, manufacture or operation therein.\r\n */\r\n\r\n\"use strict\";\r\n/* global $ */\r\n\r\n/**\r\n * Remove all validation. Should be called every time before revalidating form\r\n * @param {element} form - Form to be cleared\r\n * @returns {void}\r\n */\r\nfunction clearFormErrors(form) {\r\n $(form).find(\".form-control.is-invalid\").removeClass(\"is-invalid\");\r\n}\r\n\r\nmodule.exports = function (formElement, payload) {\r\n // clear form validation first\r\n clearFormErrors(formElement);\r\n $(\".alert\", formElement).remove();\r\n\r\n if (typeof payload === \"object\" && payload.fields) {\r\n Object.keys(payload.fields).forEach(function (key) {\r\n if (payload.fields[key]) {\r\n var feedbackElement = $(formElement).find(\"[name=\\\"\" + key + \"\\\"]\")\r\n .parent()\r\n .children(\".invalid-feedback\");\r\n\r\n if (feedbackElement.length > 0) {\r\n if (Array.isArray(payload[key])) {\r\n feedbackElement.html(payload.fields[key].join(\"
\"));\r\n } else {\r\n feedbackElement.html(payload.fields[key]);\r\n }\r\n feedbackElement.siblings(\".form-control\").addClass(\"is-invalid\");\r\n }\r\n }\r\n });\r\n }\r\n if (payload && payload.error) {\r\n var form = $(formElement).prop(\"tagName\") === \"FORM\"\r\n ? $(formElement)\r\n : $(formElement).parents(\"form\");\r\n\r\n form.prepend(\"
\"\r\n + payload.error.join(\"
\") + \"
\");\r\n }\r\n};\r\n","/**\n * Property of OSF GLOBAL SERVICES INC. , an OSF Digital company. OSF remains the sole owner of all right, title and interest in the software. Do not copy, sell, reverse engineer or otherwise attempt to derive or obtain information about the functioning, manufacture or operation therein.\n */\n\n\"use strict\";\n\n/**\n * Sanitize the input string\n * @param {string} input - The input string\n * @returns {string} - The sanitized string\n */\nmodule.exports = function (input) {\n if (input && typeof input === \"string\") {\n return input.replace(/[&<>\"'/]/g, \"\");\n }\n return input;\n};\n","/**\n * Property of OSF GLOBAL SERVICES INC. , an OSF Digital company. OSF remains the sole owner of all right, title and interest in the software. Do not copy, sell, reverse engineer or otherwise attempt to derive or obtain information about the functioning, manufacture or operation therein.\n */\n\n\"use strict\";\n\nvar formValidation = require(\"./egFormValidation\");\n\n/**\n * @param {Object} $elementAppendTo - The element to append error html to\n * @param {string} msg - The error message\n * display error message if remove gift registry failed\n */\nfunction displayErrorMessage($elementAppendTo, msg) {\n if ($(\".remove-gift-registry-error-messages\").length === 0) {\n $elementAppendTo.append(\n \"
\"\n );\n }\n $(\".remove-gift-registry-error-messages\").append(\n \"
\"\n + msg\n + \"
\"\n );\n\n setTimeout(function () {\n $(\".remove-gift-registry-error-messages\").remove();\n }, 3000);\n}\n\n/**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} message - Error message to display\n */\nfunction createErrorNotification(message) {\n var errorHtml = \"
\"\n + \"\" + message + \"
\";\n $(\".cart-error\").append(errorHtml);\n}\n\nmodule.exports = function () {\n $(\"body\").off(\"click\", \".remove-item-from-gift-registry\");\n $(\"body\").on(\n \"click\",\n \".remove-item-from-gift-registry\",\n function (e) {\n e.preventDefault();\n\n $(\".gr-item-cards\").spinner().start();\n var url = $(this).data(\"url\");\n\n $.ajax({\n url: url,\n type: \"get\",\n dataType: \"json\",\n data: {},\n success: function (data) {\n $(\".uuid-\" + data.UUID).remove();\n if (data.listIsEmpty && $(\"#add-items\").length === 0) {\n var html = \"
\"\n + \"\"\n + data.addNewItemText\n + \"
\";\n $(\"#eventInfo\").append(html);\n $(\".clear-list-btn\").addClass(\"d-none\");\n }\n\n if (data.renderHTML) {\n $(\".gr-item-cards .card\")\n .add(\".more-gr-list-items\")\n .remove();\n $(\".gr-item-cards\").append(data.renderHTML);\n }\n\n if ($(\".registry-gift-certificate\").length === 0) {\n $(\".add-giftcert-to-giftregistry\").removeClass(\n \"d-none\"\n );\n }\n\n $(\".gr-item-cards\").spinner().stop();\n },\n error: function (error) {\n if (error.responseJSON.redirectUrl) {\n window.location.href = error.responseJSON.redirectUrl;\n } else {\n var $elToAppend = $(\".gr-item-cards\");\n $elToAppend.spinner().stop();\n var msg = $elToAppend.data(\"error-msg\");\n displayErrorMessage($elToAppend, msg);\n }\n }\n });\n }\n );\n\n $(\"body\").off(\"click\", \".gift-registry-clear-list-confirmation-btn\");\n $(\"body\").on(\n \"click\",\n \".gift-registry-clear-list-confirmation-btn\",\n function (e) {\n e.preventDefault();\n var $elToAppend = $(\".gr-item-cards\");\n $elToAppend.spinner().start();\n var url = $(this).data(\"action\");\n\n $.ajax({\n url: url,\n type: \"get\",\n dataType: \"json\",\n success: function (data) {\n if (data.listIsEmpty) {\n $elToAppend.empty();\n $(\".add-items-to-gift-registry\").removeClass(\"d-none\");\n $(\".clear-list-btn\").addClass(\"d-none\");\n $(\".add-giftcert-to-giftregistry\").removeClass(\n \"d-none\"\n );\n $elToAppend.spinner().stop();\n $(\".modal-backdrop\").remove();\n $(\"body\")\n .removeClass(\"modal-open\")\n .css(\"padding-right\", \"0px\");\n }\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $elToAppend.spinner().stop();\n }\n }\n });\n }\n );\n\n $(\"body\").off(\"click\", \"#registryInfo .card button.edit\");\n $(\"body\").on(\"click\", \"#registryInfo .card button.edit\", function () {\n $(this).parents(\"form\");\n var $form = $(this).parents(\".card-body\").find(\"form\");\n var formData = $form.serialize();\n var url = $(\"#registryInfo\").data(\"edit-url\");\n var formToReset = $form.find(\".eventFormType\").val();\n var registryID = $(\"#registryInfo\").data(\"id\");\n var $eventSummary = $(this)\n .parents(\".card-body\")\n .find(\".event-summary\");\n var $editForm = $(this).parents(\".card-body\").find(\".edit-form\");\n var $editLink = $(this)\n .parents(\".card\")\n .find(\".card-header .edit-button\");\n formData = formData + \"®istryID=\" + registryID;\n var addressID;\n var addressUUID;\n if (formToReset === \"preEvent\" || formToReset === \"postEvent\") {\n addressID = $editForm.find(\".grAddressSelector\").val();\n addressUUID = $editForm\n .find(\".grAddressSelector\")\n .find(\":selected\")\n .data(\"uuid\");\n formData = formData + \"&addressID=\"\n + addressID\n + \"&addressUUID=\"\n + addressUUID;\n }\n $.spinner().start();\n $.ajax({\n url: url,\n type: \"POST\",\n dataType: \"json\",\n data: formData,\n success: function (response) {\n if (Object.keys(response.fields).length > 0) {\n formValidation($form, response);\n } else {\n $editForm.find(\".invalid-feedback\").html(\"\");\n $editForm.find(\".is-invalid\").removeClass(\"is-invalid\");\n $eventSummary.removeClass(\"d-none\");\n $editForm.addClass(\"d-none\");\n $editLink.removeClass(\"d-none\");\n switch (formToReset) {\n case \"event\":\n $(\".event-name-summary\").html(\n response.data.eventName\n );\n $(\".event-name\").html(response.data.eventName);\n $(\".event-country-summary\").html(\n response.data.eventCountry\n );\n $(\".event-date-summary\").html(\n response.data.eventDate\n );\n $(\".event-state-summary\").html(\n response.data.eventState\n );\n $(\".event-city-summary\").html(\n response.data.eventCity\n );\n break;\n case \"registrant\":\n $(\n \".registrant-summary .registrant-role-summary\"\n ).html(response.data.role);\n $(\n \".registrant-summary .registrant-first-name-summary\"\n ).html(response.data.firstName);\n $(\n \".registrant-summary .registrant-last-name-summary\"\n ).html(response.data.lastName);\n $(\n \".registrant-summary .registrant-email-summary\"\n ).html(response.data.email);\n break;\n case \"coRegistrant\":\n $(\n \".co-registrant-summary .registrant-role-summary\"\n ).html(response.data.role);\n $(\n \".co-registrant-summary .registrant-first-name-summary\"\n ).html(response.data.firstName);\n $(\n \".co-registrant-summary .registrant-last-name-summary\"\n ).html(response.data.lastName);\n $(\n \".co-registrant-summary .registrant-email-summary\"\n ).html(response.data.email);\n break;\n case \"preEvent\":\n $(\n \".pre-event-shipping-summary .address-tittle-summary\"\n ).html(response.data.id);\n $(\".pre-event-shipping-summary .fname\").html(\n response.data.firstName\n );\n $(\".pre-event-shipping-summary .lname\").html(\n response.data.lastName\n );\n $(\n \".pre-event-shipping-summary .summary-addr-1\"\n ).html(response.data.address1);\n $(\n \".pre-event-shipping-summary .summary-addr-2\"\n ).html(response.data.address2);\n $(\".pre-event-shipping-summary .city\").html(\n response.data.city\n );\n $(\".pre-event-shipping-summary .zip\").html(\n response.data.postalCode\n );\n $(\".pre-event-shipping-summary .state\").html(\n response.data.stateCode\n );\n $(\".pre-event-shipping-summary .phone\").html(\n response.data.phone\n );\n $(\n \".pre-event-shipping-summary .address-tittle-summary\"\n ).html(response.data.id);\n break;\n case \"postEvent\":\n $(\n \".post-event-shipping-summary .address-tittle-summary\"\n ).html(response.data.id);\n $(\".post-event-shipping-summary .fname\").html(\n response.data.firstName\n );\n $(\".post-event-shipping-summary .lname\").html(\n response.data.lastName\n );\n $(\n \".post-event-shipping-summary .summary-addr-1\"\n ).html(response.data.address1);\n $(\n \".post-event-shipping-summary .summary-addr-2\"\n ).html(response.data.address2);\n $(\".post-event-shipping-summary .city\").html(\n response.data.city\n );\n $(\".post-event-shipping-summary .zip\").html(\n response.data.postalCode\n );\n $(\".post-event-shipping-summary .state\").html(\n response.data.stateCode\n );\n $(\".post-event-shipping-summary .phone\").html(\n response.data.phone\n );\n $(\n \".post-event-shipping-summary .address-tittle-summary\"\n ).html(response.data.id);\n break;\n // no default\n }\n }\n\n if (formToReset === \"postEvent\" || formToReset === \"preEvent\") {\n $(\".grAddressSelector option\").each(function () {\n if ($(this).data(\"uuid\") === response.addressUUID) {\n if ($(this).is(\":selected\")) {\n var $thisForm = $(this).parents(\"form\");\n $thisForm\n .find(\".addressID\")\n .val(\n response.editedAddress.address.addressId\n );\n $thisForm\n .find(\".firstName\")\n .val(\n response.editedAddress.address.firstName\n );\n $thisForm\n .find(\".lastName\")\n .val(\n response.editedAddress.address.lastName\n );\n $thisForm\n .find(\".address1\")\n .val(\n response.editedAddress.address.address1\n );\n $thisForm\n .find(\".address2\")\n .val(\n response.editedAddress.address.address2\n );\n $thisForm\n .find(\".city_address\")\n .val(response.editedAddress.address.city);\n $thisForm\n .find(\".postalCode\")\n .val(\n response.editedAddress.address\n .postalCode\n );\n $thisForm\n .find(\".phone_address\")\n .val(response.editedAddress.address.phone);\n $thisForm\n .find(\".stateCode\")\n .val(\n response.editedAddress.address.stateCode\n );\n $thisForm\n .find(\".country\")\n .val(\n response.editedAddress.address\n .countryCode.value\n );\n $thisForm\n .find(\".is-invalid\")\n .removeClass(\"is-invalid\");\n $thisForm.find(\".invalid-feedback\").html(\"\");\n\n var $thisSummary = $thisForm\n .parents(\".card\")\n .find(\".event-summary\");\n $thisSummary\n .find(\".address-tittle-summary\")\n .html(response.editedAddress.address.ID);\n $thisSummary\n .find(\".fname\")\n .html(\n response.editedAddress.address.firstName\n );\n $thisSummary\n .find(\".lname\")\n .html(\n response.editedAddress.address.lastName\n );\n $thisSummary\n .find(\".summary-addr-1\")\n .html(\n response.editedAddress.address.address1\n );\n $thisSummary\n .find(\".summary-addr-2\")\n .html(\n response.editedAddress.address.address2\n );\n $thisSummary\n .find(\".state\")\n .html(\n response.editedAddress.address.stateCode\n );\n $thisSummary\n .find(\".city\")\n .html(response.editedAddress.address.city);\n $thisSummary\n .find(\".zip\")\n .html(\n response.editedAddress.address\n .postalCode\n );\n $thisSummary\n .find(\".phone\")\n .html(response.editedAddress.address.phone);\n }\n\n $(this).data(\n \"address-title\",\n response.editedAddress.address.ID\n );\n $(this).data(\n \"first-name\",\n response.editedAddress.address.firstName\n );\n $(this).data(\n \"last-name\",\n response.editedAddress.address.lastName\n );\n $(this).data(\n \"address1\",\n response.editedAddress.address.address1\n );\n $(this).data(\n \"address2\",\n response.editedAddress.address.address2\n );\n $(this).data(\n \"city\",\n response.editedAddress.address.city\n );\n $(this).data(\n \"postal-code\",\n response.editedAddress.address.postalCode\n );\n $(this).data(\n \"phone\",\n response.editedAddress.address.phone\n );\n $(this).data(\n \"state-code\",\n response.editedAddress.address.stateCode\n );\n $(this).data(\n \"country-code\",\n response.editedAddress.address.countryCode.value\n );\n $(this).val(response.editedAddress.address.ID);\n $(this).html(response.editedAddressLabel);\n }\n });\n }\n if (response.newAddress) {\n var uuidToRemove = response.editedAddress.UUID;\n $(\".grAddressSelector\").each(function () {\n $(this)\n .find(\"[data-uuid=\\\"\" + uuidToRemove + \"\\\"]\")\n .remove();\n var optionString = \"\";\n $(this).append(optionString);\n });\n $form\n .find(\".grAddressSelector\")\n .val(response.editedAddress.address.ID);\n }\n $form.parents(\".card\").removeClass(\"add-post-event-address\");\n $form.parents(\".card\").removeClass(\"add-co-registrant\");\n $form.parents(\".card\").find(\".event-add-button\").remove();\n $.spinner().stop();\n },\n error: function (error) {\n if (error.responseJSON.redirectUrl) {\n window.location.href = error.responseJSON.redirectUrl;\n }\n\n $.spinner().stop();\n }\n });\n });\n};\n","/**\n * Property of OSF GLOBAL SERVICES INC. , an OSF Digital company. OSF remains the sole owner of all right, title and interest in the software. Do not copy, sell, reverse engineer or otherwise attempt to derive or obtain information about the functioning, manufacture or operation therein.\n */\n\n\"use strict\";\n\n/**\n * @param {Object} $elementAppendTo - The element to append error html to\n * @param {string} msg - The error message\n * display error message if remove gift registry failed\n */\nfunction displayErrorMessage($elementAppendTo, msg) {\n if ($(\".remove-gift-registry-error-messages\").length === 0) {\n $elementAppendTo.append(\n \"
\"\n );\n }\n $(\".remove-gift-registry-error-messages\").append(\n \"
\"\n + msg + \"
\"\n );\n\n setTimeout(function () {\n $(\".remove-gift-registry-error-messages\").remove();\n }, 3000);\n}\n\n/**\n * Display error message if remove gift registry failed\n * @param {number} pageNumber pageNumer\n * @param {number} spinner spinner\n * @param {number} focusElementSelector focusElementSelector\n */\nfunction renderNewPageOfItems(pageNumber, spinner, focusElementSelector) {\n var publicView = $(\".wishlistItemCardsData\").data(\"public-view\");\n var listUUID = $(\".wishlistItemCardsData\").data(\"uuid\");\n var url = $(\".wishlistItemCardsData\").data(\"href\");\n if (spinner) {\n $.spinner().start();\n }\n var scrollPosition = document.documentElement.scrollTop;\n var newPageNumber = pageNumber + 1;\n $.ajax({\n url: url,\n method: \"get\",\n data: {\n pageNumber: newPageNumber, // NOSONAR\n publicView: publicView,\n id: listUUID\n }\n })\n .done(function (data) {\n $(\".wishlistItemCards\").empty();\n $(\"body .wishlistItemCards\").append(data);\n\n if (focusElementSelector) {\n $(focusElementSelector).focus();\n } else {\n document.documentElement.scrollTop = scrollPosition;\n }\n })\n .fail(function () {\n $(\".more-wl-items\").remove();\n });\n $.spinner().stop();\n}\n\nmodule.exports = function () {\n // removeFromWishlist\n $(\"body\").off(\"click\", \".more-wl-results\");\n $(\"body\").on(\"click\", \".more-wl-results\", function () {\n var firstName = $(this).data(\"search-fname\");\n var lastName = $(this).data(\"search-lname\");\n var pageNumber = $(this).data(\"page-number\");\n var uuids = [];\n $(\".wl-hit\").each(function () {\n uuids.push($(this).find(\"a\").data(\"id\"));\n });\n var url = $(this).data(\"url\");\n $.spinner().start();\n pageNumber += 1;\n $.ajax({\n url: url,\n method: \"get\",\n data: {\n firstName: firstName,\n lastName: lastName,\n uuids: JSON.stringify(uuids),\n pageNumber: pageNumber // NOSONAR\n },\n success: function (data) {\n if (data.results.changedList) {\n $(\".wl-hits .wl-hit\").remove();\n }\n $(\"#result-count\").html(data.results.totalString);\n data.results.hits.forEach(function (hit) {\n var divString = \"
\"\n + \"
\"\n + hit.firstName + \" \" + hit.lastName\n + \"
\"\n + \"
\"\n + \"\" + hit.urlText\n + \"
\"\n + \"
\"\n + hit.email + \"
\";\n $(\".wl-hits\").append(divString);\n });\n if (data.results.showMore) {\n $(\".find-another-wl .more-wl-results\").data(\n \"page-number\",\n data.results.pageNumber\n );\n } else {\n $(\".find-another-wl .more-wl-results\").remove();\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n};\n","/**\n * Property of OSF GLOBAL SERVICES INC. , an OSF Digital company. OSF remains the sole owner of all right, title and interest in the software. Do not copy, sell, reverse engineer or otherwise attempt to derive or obtain information about the functioning, manufacture or operation therein.\n */\n\"use strict\";\n\nvar formValidation = require(\"./egFormValidation\");\nvar sanitize = require(\"./egInputSanitization\");\nvar braintreeCreditCardModel = require(\"../../../../../../int_braintree/cartridge/client/default/js/braintree/creditcard/braintreesdk/braintreeCreditCardModel\");\n\n\nmodule.exports = function () {\n var $body = $(\"body\");\n\n $(\"#GiftCertificateForm\").submit(function (e) {\n e.preventDefault();\n });\n\n /**\n * @description Handles the visibility of the V12 tab based on the value of the \"showGiftCardGroup\" input.\n */\n function handleV12TabVisibility() {\n var $showGiftCardGroup = $(\"input[name='showGiftCardGroup']\");\n var v12Tab = $(\".js-nav-item-v12\");\n if (v12Tab.length) {\n if ($showGiftCardGroup.val()) {\n v12Tab.fadeOut(500);\n var $paymentInformation = $(\".payment-information\");\n // If selected payment instrument was V12 one, select credit-card after disabling V12\n if ($paymentInformation.attr(\"data-payment-method-id\").match(new RegExp(/^V12.*$/))) {\n $(\"li.nav-item[data-method-id='CREDIT_CARD'] > a\").click();\n }\n } else {\n v12Tab.fadeIn(500);\n }\n }\n }\n\n /**\n * Handles the visibility of the Klarna tab based on the validity of the Klarna payment method.\n * @param {boolean} klarnaValid - Whether the Klarna payment method is valid or not.\n */\n function handleKlarnaTabVisibility(klarnaValid) {\n var klarnaMainContainer = $(\".klarna-main-container\");\n if (klarnaMainContainer.length) {\n if (!klarnaValid) {\n klarnaMainContainer.fadeOut(500);\n var $paymentInformation = $(\".payment-information\");\n // If selected payment instrument was klarna one, select credit-card after disabling klarna\n if ($paymentInformation.attr(\"data-payment-method-id\").match(new RegExp(/^klarna.*$/))) {\n $(\"li.nav-item[data-method-id='CREDIT_CARD'] > a\").click();\n }\n } else {\n klarnaMainContainer.fadeIn(500);\n }\n }\n }\n\n /**\n * @description Handles the visibility of the gift certificate form tab based on the state of the checkbox.\n * @param {Object} checkbox - The checkbox element that triggers the visibility change.\n */\n function handleGiftCertificateFormTabVisibility(checkbox) {\n let giftCertifcateTab = $(\"#GiftCertificateForm-Tab\");\n if (checkbox.is(\":checked\")) {\n giftCertifcateTab.fadeIn(500);\n } else {\n giftCertifcateTab.fadeOut(500);\n }\n }\n\n /**\n * @description hide/show credit credit card section if gift certificate is applied\n */\n function hideCardCheckout() {\n var $creditCardForm = $(\".credit-card-form-cart\");\n var $userPayment = $(\".user-payment-instruments\");\n var $cardPlaceOrderButton = $(\".submit-payment\");\n var $giftCardPlaceOrderButton = $(\".submit-payment-gift-cert-only\");\n var $addAnotherGiftCardButton = $(\".add-another-gift-card\");\n var $giftCertificateInputGroup = $(\".gift-certificate-input-group\");\n\n if ($(\".success.giftcert-pi\").length > 0) {\n var addedGiftCertificate = $(\".success.giftcert-pi\")\n .last()\n .data(\"gcpiTotal\");\n var totalCartPrice = $(\".success.giftcert-pi\").data(\"totalPrice\");\n\n if (addedGiftCertificate === totalCartPrice) {\n $creditCardForm.addClass(\"d-none\");\n $userPayment.addClass(\"d-none\");\n $giftCardPlaceOrderButton.show();\n $cardPlaceOrderButton.hide();\n $addAnotherGiftCardButton.addClass(\"d-none\");\n $giftCertificateInputGroup.addClass(\"d-none\");\n } else {\n $creditCardForm.removeClass(\"d-none\");\n $userPayment.removeClass(\"d-none\");\n $giftCardPlaceOrderButton.hide();\n $cardPlaceOrderButton.show();\n $addAnotherGiftCardButton.removeClass(\"d-none\");\n $giftCertificateInputGroup.removeClass(\"d-none\");\n }\n } else {\n $creditCardForm.removeClass(\"d-none\");\n $userPayment.removeClass(\"d-none\");\n $giftCardPlaceOrderButton.hide();\n $cardPlaceOrderButton.show();\n $giftCertificateInputGroup.removeClass(\"d-none\");\n }\n }\n\n /**\n * @description hide/show gift certificate section on checkout\n * @param {string} amountOfGCs - amount\n */\n function giftCertificateCheckout(amountOfGCs) {\n var $giftCertCode = $(\".gift-certificate-checkout\");\n var $giftCertMax = $(\".gift-certificate-maximum\");\n\n if (amountOfGCs && $(\".success.giftcert-pi\").length === amountOfGCs) {\n $giftCertCode.addClass(\"d-none\");\n $giftCertMax.removeClass(\"d-none\");\n } else {\n $giftCertCode.removeClass(\"d-none\");\n $giftCertMax.addClass(\"d-none\");\n }\n }\n\n /**\n * display the notification after the customer has pressed the \"Add to Cart\" button for gift certificates\n * @param {string} response - ajax response from clicking the add to cart button\n */\n function showNotificationGiftCertificate(response) {\n if ($(\".add-to-cart-messages\").length === 0) {\n $(\"body\").append(\"
\");\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 * @description This function validates the gift certificate purchase form on the client side.\n * @returns {boolean} true if the form is valid, false otherwise\n */\n function validateGiftCertPurchaseFormOnClientSide() {\n var recipient = $(\"#recipient\");\n var recipientEmail = $(\"#recipientEmail\");\n var amount = $(\"#amount\");\n var valid = true;\n\n if (!recipient.val() || !recipientEmail.val() || !amount.val()) {\n valid = false;\n }\n\n return valid;\n }\n\n /**\n * Displays a message based on the data received from the server.\n * @returns {void}\n */\n function updateWishListUI(RemoveGiftCertificateURL) {\n var $addBtn = $(\".add-giftcert-to-wish-list\");\n var $removeBtn = $(\".remove-giftcert-from-wish-list\");\n $.spinner().stop();\n var oldWishlishlLength = $(\".wishlist-quantity\").html();\n oldWishlishlLength = parseInt(oldWishlishlLength, 10);\n\n if ($addBtn.hasClass(\"d-none\")) {\n $removeBtn.addClass(\"d-none\");\n $addBtn.removeClass(\"d-none\");\n $(\".wishlist-quantity\").html(oldWishlishlLength - 1);\n } else {\n $addBtn.addClass(\"d-none\");\n $removeBtn.removeClass(\"d-none\");\n $(\".wishlist-quantity\").html(oldWishlishlLength + 1);\n // Update Remove GiftCert URL\n if (RemoveGiftCertificateURL) {\n var $RemoveGiftCertificateURL = $(\"input[name='RemoveGiftCertificateURL']\");\n $RemoveGiftCertificateURL.val(RemoveGiftCertificateURL);\n }\n }\n }\n\n $body.on(\"click\", \".giftcert-purchase-btn\", function (e) {\n $(\"body\").trigger(\"effect:Ripple\", {\n button: $(this),\n event: e\n });\n\n if (!validateGiftCertPurchaseFormOnClientSide()) {\n return;\n }\n\n var $form = $(this).closest(\"form\");\n var url = $form.attr(\"action\");\n $(\"#giftcertificate-generalerror\").type = \"hidden\";\n $form.spinner().start();\n $.ajax({\n url: url,\n type: \"POST\",\n dataType: \"json\",\n cache: false,\n data: $form.serialize()\n })\n .done(function (data) {\n $form.spinner().stop();\n if (!data.success) {\n if (data.GeneralError) {\n $(\"#giftcertificate-generalerror\").type = \"text\";\n $(\"#giftcertificate-generalerror\").value = data.GeneralError;\n } else {\n formValidation($form, data);\n }\n } else {\n if (data.showBuyseparatelyBanner) {\n var $buyseparatelybanner = $(\".buyseparately-banner\");\n if ($buyseparatelybanner.css(\"display\") === \"none\" && $buyseparatelybanner.find(\"div.content-asset\").length !== 0) {\n $buyseparatelybanner.slideDown(\"slow\", function () {\n $buyseparatelybanner.delay(5000).slideUp(\"slow\");\n });\n }\n }\n\n if (!$(\".giftcert-purchase-btn\").data(\"update\")) {\n $form.each(function () {\n this.reset();\n });\n\n $(\".js-preview-value\").html($(\"#amount\").val());\n $(\".js-preview-from\").html($(\"#from\").val());\n $(\".js-preview-to\").html($(\"#recipient\").val());\n $(\".js-preview-message\").html($(\"#message\").val());\n } else {\n window.location.href = $(\".giftcert-purchase-btn\").data(\n \"cartpage\"\n );\n }\n $(\".minicart\").trigger(\"count:update\", data);\n $(\"body\").trigger(\"cart:update\");\n var minicartTime = $(\".minicart-total\").attr(\"data-minicartshowtime\");\n if (minicartTime) {\n $(\".minicart\").trigger(\"open\");\n setTimeout(function () {\n $(\".minicart .popover\").removeClass(\"show\");\n }, minicartTime);\n }\n showNotificationGiftCertificate(data);\n updateRemainingCharsForMessageInput();\n }\n })\n .fail(function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n $form.spinner().stop();\n });\n });\n\n $(\"#GiftCertificateBalanceForm\").submit(function (e) {\n e.preventDefault();\n });\n\n /**\n * egPayCheck\n */\n function egPayCheck() {\n var addedGiftCertificate = $(\".success.giftcert-pi\")\n .last()\n .data(\"gcpiTotal\");\n var totalCartPrice = $(\".success.giftcert-pi\").data(\"totalPrice\");\n var cvvCode = $(\n \".saved-payment-instrument.\" +\n \"selected-payment .saved-payment-security-code\"\n );\n if (addedGiftCertificate && (addedGiftCertificate === totalCartPrice)) {\n cvvCode.val(\" \");\n } else {\n cvvCode.val(\"\");\n }\n }\n egPayCheck();\n\n $(\"#add-giftcert\").on(\"click\", function () {\n var url = $(this).data(\"url\");\n var $invalidFeedback = $(\".invalid-feedback-checkout\");\n\n $.ajax({\n url: url,\n type: \"GET\",\n cache: false\n })\n .done(function (data) {\n //braintreeCreditCardModel.updateOrderData();\n $invalidFeedback.empty();\n $(\".invalid-feedback\").empty();\n $(\".gift-cert-balance-value\").empty();\n if (!data.status) {\n $(\"#giftcerts-applied\").html(data);\n egPayCheck();\n hideCardCheckout();\n giftCertificateCheckout(data.amountOfGCs);\n $(\".gift-certificate-input-group\").addClass(\"d-none\");\n $(\".gift-card-balance\").addClass(\"d-none\");\n } else {\n $invalidFeedback.html(data.message);\n $(\".gift-card-balance\").addClass(\"d-none\");\n }\n handleV12TabVisibility();\n $(\"body\").trigger(\"checkout:updateOrderData\");\n })\n .fail(function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n handleV12TabVisibility();\n $(\"body\").trigger(\"checkout:updateOrderData\");\n });\n });\n\n $(\"#giftcerts-applied\").on(\"click\", \".remove-checkout-gc\", function (e) {\n e.preventDefault();\n var url = $(this).attr(\"href\");\n url += $(this).attr(\"id\").split(\"-\")[1];\n $.ajax({\n url: url,\n type: \"GET\",\n cache: false\n })\n .done(function (data) {\n if (!data.status) {\n $(\"#giftcerts-applied\").html(data);\n egPayCheck();\n hideCardCheckout();\n giftCertificateCheckout();\n $(\"#giftCertCode\").removeClass(\"is-invalid\");\n $(\".invalid-feedback-checkout\").empty();\n }\n handleV12TabVisibility();\n $(\"body\").trigger(\"checkout:updateOrderData\");\n // else handle errors\n })\n .fail(function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n handleV12TabVisibility();\n $(\"body\").trigger(\"checkout:updateOrderData\");\n });\n });\n\n /**\n * @function\n * @description Validate the check balance form on the client side\n * @return {boolean} - True if the form is valid, false otherwise\n */\n function validateCheckBalanceFormOnClientSide($invalidFeedback) {\n var giftcertID = $(\"#giftCertID\");\n // Alphanumeric regular expression pattern\n const alphaNumericPattern = /^[a-zA-Z0-9_.-]*$/;\n if (!giftcertID.val()) {\n $invalidFeedback.html(window.egift_resources.fieldisrequired);\n return false;\n } else if (!alphaNumericPattern.test(giftcertID.val())) {\n $invalidFeedback.html(window.egift_resources.notfound);\n return false;\n }\n return true;\n }\n\n var giftCardArray = [];\n\n $body.on(\"click\", \".gc-check-balance-button\", function () {\n var $invalidFeedback = $(\"#GiftCertificateBalanceForm > .form-group > .invalid-feedback\");\n var checkBalanceContainer = $(\".check-balance-container\");\n\n $invalidFeedback.empty();\n checkBalanceContainer.empty();\n if (!validateCheckBalanceFormOnClientSide($invalidFeedback)) {\n return;\n }\n\n var $form = $(this).closest(\"form\");\n var url = $form.attr(\"action\");\n $form.spinner().start();\n $.ajax({\n url: url,\n type: \"POST\",\n dataType: \"json\",\n cache: false,\n data: $form.serialize()\n })\n .done(function (data) {\n $form.spinner().stop();\n if (!data.success) {\n formValidation($form, data);\n let errorMsg = data.ErrorMsg || data.fields.dwfrm_giftcert_balance_giftCertID;\n if (errorMsg) {\n $invalidFeedback.html(errorMsg);\n }\n } else {\n var contentHtml = \"\";\n\n var isDuplicate = false;\n giftCardArray.forEach(element => {\n if (element.giftcode === data.maskedGiftCertCode) {\n isDuplicate = true;\n }\n });\n\n if (!isDuplicate) {\n giftCardArray.push({\n img: data.imgSmallPNG,\n amount: data.value,\n giftcode: data.maskedGiftCertCode,\n expDate: data.expDate,\n isExpired: data.isExpired\n });\n }\n\n contentHtml += `\n
\n \n ${window.egift_resources.balance} ${(data.isExpired ? window.egift_resources.notavailable : data.value)}\n \n
`;\n\n checkBalanceContainer.html(contentHtml);\n }\n })\n .fail(function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n $form.spinner().stop();\n });\n });\n\n $body.on(\"click\", \".add-giftcert-to-wish-list\", function (e) {\n var url = $(this).data(\"url\");\n $.spinner().start();\n $.ajax({\n url: url,\n type: \"POST\",\n cache: false\n })\n .done(function (response) {\n $.spinner().stop();\n updateWishListUI(response.RemoveGiftCertificateURL);\n $(\"body\").trigger(\"effect:Ripple\", {\n button: $(\"button.remove-giftcert-from-wish-list\"),\n event: e\n });\n })\n .fail(function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n $.spinner().stop();\n });\n });\n\n $body.on(\"click\", \".remove-giftcert-from-wish-list\", function (e) {\n var url = $(\"input[name='RemoveGiftCertificateURL']\").val();\n $.spinner().start();\n $.ajax({\n url: url,\n type: \"GET\",\n cache: false\n })\n .done(function () {\n $.spinner().stop();\n updateWishListUI();\n $(\"body\").trigger(\"effect:Ripple\", {\n button: $(\"button.add-giftcert-to-wish-list\"),\n event: e\n });\n })\n .fail(function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n $.spinner().stop();\n });\n });\n\n $body.on(\"click\", \".gc-check-balance-button-billing\", function () {\n var $invalidFeedback = $(\".invalid-feedback-checkout\");\n var $giftCardBalance = $(\".gift-card-balance\");\n\n $giftCardBalance.addClass(\"d-none\");\n $invalidFeedback.empty();\n if (!validateCheckBalanceFormOnClientSide($invalidFeedback)) {\n return;\n }\n var url = $(this).data(\"url\");\n const $form = $(this).closest(\"form\");\n $.spinner().start();\n $.ajax({\n url: url,\n type: \"POST\",\n dataType: \"json\",\n cache: false,\n data: $form.serialize()\n })\n .done(function (data) {\n var $giftCertBalanceValue = $giftCardBalance.find(\".gift-cert-balance-value\");\n $giftCertBalanceValue.empty();\n $.spinner().stop();\n if (!data.success) {\n $giftCardBalance.addClass(\"d-none\");\n formValidation($form, data);\n let errorMsg = data.ErrorMsg || data.fields.dwfrm_giftcert_balance_giftCertID;\n if (errorMsg) {\n $invalidFeedback.html(errorMsg);\n $giftCardBalance.addClass(\"d-none\");\n }\n } else {\n $giftCardBalance.removeClass(\"d-none\");\n $giftCertBalanceValue.html(\"\" + data.value);\n var $RedeemGiftCertificateJsonURL = $(\"input[name='RedeemGiftCertificateJsonURL'\").val();\n var $applyButton = $giftCardBalance.find(\"#add-giftcert\");\n $applyButton.data(\"url\", $RedeemGiftCertificateJsonURL + data.maskedGiftCertCode);\n }\n })\n .fail(function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n $.spinner().stop();\n });\n });\n\n $body.on(\"click\", \".checkout-select-egiftcard\", function () {\n var id = $(this).data(\"id\");\n var $invalidFeedback = $(\".invalid-feedback-checkout\");\n var url = $(this).data(\"url\");\n url += id;\n $.spinner().start();\n $.ajax({\n url: url,\n type: \"GET\",\n cache: false\n })\n .done(function (data) {\n $.spinner().stop();\n $(\".gift-card-balance-message\").addClass(\"d-none\");\n $(\".invalid-feedback\").empty();\n $(\".gift-cert-balance-value\").empty();\n if (!data.status) {\n $(\"#giftcerts-applied\").html(data);\n egPayCheck();\n hideCardCheckout();\n giftCertificateCheckout();\n } else {\n $invalidFeedback.html(data.message);\n }\n })\n .fail(function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n $.spinner().stop();\n });\n });\n\n /**\n * @description hide/show gift certificate input if have a gift certificate in cart\n */\n function hideGiftCertificateInput() {\n if ($(\".gift-certificate__tile\").length > 0) {\n $(\"#GiftCertificateForm\").addClass(\"d-none\");\n }\n }\n\n $body.on(\"click\", \".add-giftcert-to-giftregistry\", function () {\n var url = $(this).data(\"url\");\n $.spinner().start();\n $.ajax({\n url: url,\n type: \"POST\",\n cache: false\n })\n .done(function (data) {\n var $clearBtn = $(\".clear-list-btn\");\n\n if ($clearBtn.hasClass(\"d-none\")) {\n $clearBtn.removeClass(\"d-none\");\n }\n\n $(\".add-items-to-gift-registry\").remove();\n $(\".add-giftcert-to-giftregistry\").addClass(\"d-none\");\n $(\".giftregistry-itemlist\").html(data);\n $.spinner().stop();\n })\n .fail(function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n $.spinner().stop();\n });\n });\n /**\n * @description hide/show gift certificate account\n */\n function giftCertificateAccount() {\n var $showMoreGiftCert = $(\".show-more-giftcert\");\n var $showMoreGiftCertBtn = $(\".show-more-giftcert-btn\");\n var addCard = $(\"#addGiftCardByNumber\");\n\n if ($showMoreGiftCert.length > 0) {\n $showMoreGiftCert.addClass(\"d-none\");\n $showMoreGiftCertBtn.removeClass(\"d-none\");\n }\n\n $showMoreGiftCertBtn.click(function () {\n $showMoreGiftCert.toggle();\n if ($(this).text() === \"View all\") {\n $(this).text(\"View all\");\n } else {\n $(this).text(\"View less\");\n }\n });\n\n $(\"#addGiftCardByNumber\").on(\"click\", function () {\n var inputCardNumber = $(\"#input-add-by-giftcard-number\").val();\n var url = addCard.data(\"url\");\n var result = $(\".add-giftcard-by-number__result\");\n\n if (!inputCardNumber) {\n result.html(window.egift_resources.giftcardnumberemptyerror);\n result.css(\"display\", \"block\");\n return;\n }\n\n $.ajax({\n url: url,\n type: \"GET\",\n cache: false,\n data: {\n giftCertID: inputCardNumber\n }\n }).done(function (data) {\n result.show();\n if (data.success === true) {\n result.html(window.egift_resources.giftcardadded);\n result.css(\"color\", \"#4bb543\");\n setTimeout(window.location.reload(), 300);\n } else {\n result.html(data.message);\n }\n });\n });\n }\n /**\n * @description show cards carousel\n */\n function cardsCarousel() {\n $(\".gift-certificate-cart__carousel\").slick({\n dots: true,\n centerMode: true,\n slidesToShow: 3,\n infinite: false,\n variableWidth: true\n });\n\n // set correct slide when edit card\n var slideIndexToShow = parseInt(\n $(\".js-show-current-slide\").data(\"slickIndex\"),\n 10\n );\n $(\".gift-certificate-cart__carousel\").slick(\n \"slickGoTo\",\n slideIndexToShow,\n true\n );\n }\n /**\n * @description apply cart to input\n */\n function applyCartToInput() {\n var currentImgSrc = $(\n \".gift-certificate-cart__carousel .slick-current img\"\n ).attr(\"src\");\n\n // set preview-card img on load\n $(\".js-preview-card img\").attr(\"src\", currentImgSrc);\n\n $(\".gift-certificate-cart__carousel\").on(\"afterChange\", function () {\n currentImgSrc = $(\n \".gift-certificate-cart__carousel .slick-current img\"\n ).attr(\"src\");\n\n // get string path and cut size with extention\n var currentSrc = currentImgSrc.split(\"-\").pop();\n var stringSrc = currentImgSrc.replace(\"-\" + currentSrc, \"\");\n\n // add sizes and extentions\n var bigPng = stringSrc + \"-big.png\";\n var smallPng = stringSrc + \"-small.png\";\n var bigSvg = stringSrc + \"-big.svg\";\n var smallSvg = stringSrc + \"-small.svg\";\n\n // apply path to input's value\n $(\"#imgSmallSVG\").val(smallSvg);\n $(\"#imgSmallPNG\").val(smallPng);\n $(\"#imgBigSVG\").val(bigSvg);\n $(\"#imgBigPNG\").val(bigPng);\n\n // change preview-card img\n $(\".js-preview-card img\").attr(\"src\", currentImgSrc);\n });\n }\n\n /**\n * Updates the remaining characters count for a message input field.\n *\n * @function\n * @name updateRemainingCharsForMessageInput\n * @memberof global\n *\n * @returns {void}\n */\n function updateRemainingCharsForMessageInput(inputMessage) {\n let remainingChars = $(\"#messageRemainingChars\");\n let charLength = 0;\n if (inputMessage && inputMessage.length) {\n charLength = inputMessage.val().length;\n }\n let limit = 150;\n remainingChars.text(limit - charLength);\n }\n\n /**\n * @description preset amount buttons\n */\n function presetAmountButtons() {\n // set preselected value if present\n if ($(\"#amount\").val()) {\n $(\".js-preset-amount-value\").html(\n ($(\".preset-amount-btns__btn\").data(\"currency\") ?\n $(\".preset-amount-btns__btn\").data(\"currency\") :\n \"\") + $(\"#amount\").val()\n );\n }\n\n // Listen preset buttons\n $(\".preset-amount-btns__btn\").on(\"click\", function () {\n // set default style to all buttons\n $(\".preset-amount-btns__btn\").each((i, item) => {\n $(item).css({\n \"background-color\": \"#fff\",\n color: \"#333\"\n });\n });\n // set color style to clicked button\n $(this).css({\n \"background-color\": \"#00a1e0\",\n color: \"#fff\"\n });\n\n // assign value to \"Value\" and form input\n $(\".js-preset-amount-value\").html(\n ($(this).data(\"currency\") ? $(this).data(\"currency\") : \"\") +\n $(this).data(\"value\")\n );\n $(\"#amount\").val($(this).data(\"value\"));\n\n // Change preview section value\n $(\".js-preview-value\").html(\n ($(this).data(\"currency\") ? $(this).data(\"currency\") : \"\") +\n $(this).data(\"value\")\n );\n });\n\n $(\".js-another-value-btn\").on(\"click\", function () {\n $(\"#amount\").focus();\n });\n\n // set preview amount value on load\n if ($(\"#amount\").val()) {\n $(\".js-preview-value\").html(\n ($(\".js-preset-amount-btn\").data(\"currency\") ?\n $(\".js-preset-amount-btn\").data(\"currency\") :\n \"\") + $(\"#amount\").val()\n );\n }\n\n /* Don't allow any input to amount except integer */\n $(\"#amount\").on(\"keydown\", function (event) {\n // Allow: backspace, delete, tab, escape, enter, Ctrl+C, Ctrl+V\n if ($.inArray(event.key, [\"Backspace\", \"Delete\", \"Tab\", \"Escape\", \"Enter\", \"c\", \"v\", \"x\"]) !== -1 ||\n // Allow: Ctrl+A\n (event.key == \"a\" && event.ctrlKey === true) ||\n // Allow: home, end, left, right\n (event.key == \"Home\" || event.key == \"End\" || event.key == \"ArrowLeft\" || event.key == \"ArrowRight\")) {\n // let it happen, don't do anything\n return;\n }\n // Ensure that it is a number and stop the keypress\n if ((event.shiftKey || (event.key < \"0\" || event.key > \"9\")) && (event.key < \"NumPad0\" || event.key > \"NumPad9\")) {\n event.preventDefault();\n }\n });\n\n\n // Listen amount input keydown\n $(\"#amount\").on(\"keyup change\", function () {\n\n /* If there are any non-digits in the input; remove them */\n let regEx = /[^0-9]/g;\n if (regEx.test($(this).val())) {\n $(this).val($(this).val().replace(regEx, \"\"));\n }\n\n $(\".preset-amount-btns__btn\").each((i, item) => {\n $(item).css({\n \"background-color\": \"#fff\",\n color: \"#333\"\n });\n });\n $(\".js-another-value-btn\").css({\n \"background-color\": \"#00a1e0\",\n color: \"#fff\"\n });\n $(\".js-preset-amount-value\").html(\n ($(\".js-preset-amount-btn\").data(\"currency\") ?\n $(\".js-preset-amount-btn\").data(\"currency\") :\n \"\") + $(this).val()\n );\n\n // Delete currency symbol if no value\n if ($(this).val() === \"\") {\n setTimeout(() => {\n $(\".js-preview-value\").html(\"\");\n $(\".js-preset-amount-value, .js-preview-value\").html(\"\");\n }, 0);\n }\n\n // Change preview section value\n $(\".js-preview-value\").html(\n ($(\".js-preset-amount-btn\").data(\"currency\") ?\n $(\".js-preset-amount-btn\").data(\"currency\") :\n \"\") + $(this).val()\n );\n });\n\n var prevValue;\n $(\"#message\").on(\"input\", function () {\n var $this = $(this);\n var pattern = /^[a-zA-Z0-9\\s]*$/;\n var hasError = !$this.val().match(pattern);\n if (hasError) {\n $this.val(prevValue);\n } else {\n updateRemainingCharsForMessageInput($(this));\n prevValue = $this.val();\n }\n });\n }\n /**\n * @description preview the gift card\n */\n function giftCardPreview() {\n var name = $(\"#from\");\n var message = $(\"#message\");\n var to = $(\"#recipient\");\n\n // set preview data on load\n $(\".js-preview-from\").text(name.val());\n $(\".js-preview-message\").text(message.val());\n $(\".js-preview-to\").text(to.val());\n\n $(document).on(\"keyup\", \"#from, #message, #recipient\", function () {\n $(\".js-preview-from\").text(sanitize(name.val()));\n $(\".js-preview-message\").text(sanitize(message.val()));\n $(\".js-preview-to\").text(sanitize(to.val()));\n });\n }\n\n giftCertificateCheckout();\n hideGiftCertificateInput();\n giftCertificateAccount();\n if ($(\".gift-certificate-cart__carousel\").length > 0) {\n cardsCarousel();\n }\n applyCartToInput();\n presetAmountButtons();\n giftCardPreview();\n\n var $showGiftCardGroup = $(\"input[name='showGiftCardGroup']\");\n if ($showGiftCardGroup.val()) {\n $(\"#show-giftcertifcate-form\").prop(\"checked\", \"true\");\n $(\".gift-certificate-input-group\").addClass(\"d-none\");\n handleV12TabVisibility();\n }\n handleGiftCertificateFormTabVisibility($(\"#show-giftcertifcate-form\"));\n $(\"#show-giftcertifcate-form\").change(function () {\n handleGiftCertificateFormTabVisibility($(this));\n });\n\n /* Check if there are already redeemed Gift Card, show Gift Card section */\n\n $(document).on(\"click\", \".add-another-gift-card\", function () {\n $(\"#giftCertID\").val(\"\");\n $(\".gift-certificate-input-group\").removeClass(\"d-none\");\n });\n\n $(document).ready(function () {\n updateRemainingCharsForMessageInput($(\"#message\"));\n var $giftCertificateInputGroup = $(\".gift-certificate-input-group\");\n if ($giftCertificateInputGroup && $giftCertificateInputGroup.length) {\n var giftCerdInput = $giftCertificateInputGroup.find(\"#giftCertID\");\n giftCerdInput.val(\"\");\n }\n });\n\n $(document).on(\"input\", \"#giftCertID\", function () {\n var $input = $(this);\n $input.val($input.val().toUpperCase());\n var $button = $(\".gc-check-balance-button\");\n\n if ($(\".gc-check-balance-button-billing\").length > 0) {\n $button = $(\".gc-check-balance-button-billing\");\n }\n\n // Check if the input has a value\n if ($input.val().trim() !== \"\") {\n // If it has a value, change the button color to black and set font-weight to bold\n $button.css({\n \"color\": \"black\",\n \"font-weight\": \"bold\"\n });\n } else {\n // If it doesn't have a value, reset the button color and font-weight\n $button.css({\n \"color\": \"\",\n \"font-weight\": \"\"\n });\n }\n });\n\n $body.on(\"checkout:handleKlarnaTabVisibility\", function (e, klarnaValid) {\n handleKlarnaTabVisibility(klarnaValid);\n });\n};\n","!function(root, factory) {\n \"function\" == typeof define && define.amd ? // AMD. Register as an anonymous module unless amdModuleId is set\n define([], function() {\n return root.svg4everybody = factory();\n }) : \"object\" == typeof module && module.exports ? // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory() : root.svg4everybody = factory();\n}(this, function() {\n /*! svg4everybody v2.1.9 | github.com/jonathantneal/svg4everybody */\n function embed(parent, svg, target) {\n // if the target exists\n if (target) {\n // create a document fragment to hold the contents of the target\n var fragment = document.createDocumentFragment(), viewBox = !svg.hasAttribute(\"viewBox\") && target.getAttribute(\"viewBox\");\n // conditionally set the viewBox on the svg\n viewBox && svg.setAttribute(\"viewBox\", viewBox);\n // copy the contents of the clone into the fragment\n for (// clone the target\n var clone = target.cloneNode(!0); clone.childNodes.length; ) {\n fragment.appendChild(clone.firstChild);\n }\n // append the fragment into the svg\n parent.appendChild(fragment);\n }\n }\n function loadreadystatechange(xhr) {\n // listen to changes in the request\n xhr.onreadystatechange = function() {\n // if the request is ready\n if (4 === xhr.readyState) {\n // get the cached html document\n var cachedDocument = xhr._cachedDocument;\n // ensure the cached html document based on the xhr response\n cachedDocument || (cachedDocument = xhr._cachedDocument = document.implementation.createHTMLDocument(\"\"), \n cachedDocument.body.innerHTML = xhr.responseText, xhr._cachedTarget = {}), // clear the xhr embeds list and embed each item\n xhr._embeds.splice(0).map(function(item) {\n // get the cached target\n var target = xhr._cachedTarget[item.id];\n // ensure the cached target\n target || (target = xhr._cachedTarget[item.id] = cachedDocument.getElementById(item.id)), \n // embed the target into the svg\n embed(item.parent, item.svg, target);\n });\n }\n }, // test the ready state change immediately\n xhr.onreadystatechange();\n }\n function svg4everybody(rawopts) {\n function oninterval() {\n // while the index exists in the live collection\n for (// get the cached index\n var index = 0; index < uses.length; ) {\n // get the current \n var use = uses[index], parent = use.parentNode, svg = getSVGAncestor(parent), src = use.getAttribute(\"xlink:href\") || use.getAttribute(\"href\");\n if (!src && opts.attributeName && (src = use.getAttribute(opts.attributeName)), \n svg && src) {\n if (polyfill) {\n if (!opts.validate || opts.validate(src, svg, use)) {\n // remove the element\n parent.removeChild(use);\n // parse the src and get the url and id\n var srcSplit = src.split(\"#\"), url = srcSplit.shift(), id = srcSplit.join(\"#\");\n // if the link is external\n if (url.length) {\n // get the cached xhr request\n var xhr = requests[url];\n // ensure the xhr request exists\n xhr || (xhr = requests[url] = new XMLHttpRequest(), xhr.open(\"GET\", url), xhr.send(), \n xhr._embeds = []), // add the svg and id as an item to the xhr embeds list\n xhr._embeds.push({\n parent: parent,\n svg: svg,\n id: id\n }), // prepare the xhr ready state change event\n loadreadystatechange(xhr);\n } else {\n // embed the local id into the svg\n embed(parent, svg, document.getElementById(id));\n }\n } else {\n // increase the index when the previous value was not \"valid\"\n ++index, ++numberOfSvgUseElementsToBypass;\n }\n }\n } else {\n // increase the index when the previous value was not \"valid\"\n ++index;\n }\n }\n // continue the interval\n (!uses.length || uses.length - numberOfSvgUseElementsToBypass > 0) && requestAnimationFrame(oninterval, 67);\n }\n var polyfill, opts = Object(rawopts), newerIEUA = /\\bTrident\\/[567]\\b|\\bMSIE (?:9|10)\\.0\\b/, webkitUA = /\\bAppleWebKit\\/(\\d+)\\b/, olderEdgeUA = /\\bEdge\\/12\\.(\\d+)\\b/, edgeUA = /\\bEdge\\/.(\\d+)\\b/, inIframe = window.top !== window.self;\n polyfill = \"polyfill\" in opts ? opts.polyfill : newerIEUA.test(navigator.userAgent) || (navigator.userAgent.match(olderEdgeUA) || [])[1] < 10547 || (navigator.userAgent.match(webkitUA) || [])[1] < 537 || edgeUA.test(navigator.userAgent) && inIframe;\n // create xhr requests object\n var requests = {}, requestAnimationFrame = window.requestAnimationFrame || setTimeout, uses = document.getElementsByTagName(\"use\"), numberOfSvgUseElementsToBypass = 0;\n // conditionally start the interval if the polyfill is active\n polyfill && oninterval();\n }\n function getSVGAncestor(node) {\n for (var svg = node; \"svg\" !== svg.nodeName.toLowerCase() && (svg = svg.parentNode); ) {}\n return svg;\n }\n return svg4everybody;\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].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Property of OSF GLOBAL SERVICES INC. , an OSF Digital company. OSF remains the sole owner of all right, title and interest in the software. Do not copy, sell, reverse engineer or otherwise attempt to derive or obtain information about the functioning, manufacture or operation therein.\n */\n\n\"use strict\";\n\n/* global */\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n (function ($) {\n var eGiftCard = require(\"./eGiftCard/egiftcard\");\n var cart = require(\"./eGiftCard/egCart\");\n var wishlist = require(\"./eGiftCard/egWishlist\");\n var registry = require(\"./eGiftCard/egRegistry\");\n\n $(document).ready(function () {\n eGiftCard();\n cart();\n wishlist();\n registry();\n });\n }(window.jQuery));\n});\n","require('svg4everybody')({});\n"],"names":[],"sourceRoot":""}