libdo

Untitled

Sep 24th, 2017
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*global $, $TB */
  2.  
  3. // Scrape inpage cart
  4. var scrapeInPageCart = function () {
  5. try {
  6. var root = jQuery('#basketOverlayContent');
  7.  
  8. store.cart = {
  9. p: [],
  10. qty: 0,
  11. curr: store.curr
  12. };
  13.  
  14. root.find('#orderTableX tbody:eq(0) tr:even').each(function () {
  15. var item = {}, elt = jQuery(this);
  16.  
  17. try {
  18. item.n = $TB.get_text(elt.find('p')[0], true);
  19. item.img_tn = (elt.find('img.basketProductImage')[0] || {}).src;
  20. item.prid = $TB.get_text(elt.find('p')[2], true);
  21. item.sku = item.prid;
  22. } catch(e) {
  23. }
  24.  
  25. try {
  26. item.curr = store.curr;
  27.  
  28. item.qty = $TB.get_value_from_text(elt.find('.basketQtyInput').val());
  29.  
  30. item.uv = $TB.get_value_from_text($TB.get_text(elt.find('.numberFont:first'), true));
  31. item.up = $TB.format_currency(item.uv, item.curr);
  32. } catch(e) {
  33. }
  34.  
  35. try {
  36. if(item.prid) {
  37. store.cart.qty += item.qty;
  38. store.cart.p.push(item);
  39. }
  40. } catch(e) {
  41. }
  42.  
  43. });
  44.  
  45. store.cart.cv = $TB.get_value_from_text($TB.get_text(root.find('.orderTotalDetailValue.numberFont')[0], true));
  46. store.cart.cp = $TB.format_currency(store.cart.cv, store.curr);
  47.  
  48. jQuery(document).ajaxStop(function () {
  49. var currentCV = store.cart ? store.cart.cv : 0;
  50.  
  51. updateInPageCart();
  52.  
  53. if(store.cart.cv !== currentCV) {
  54. $TB.sendBeacon();
  55. }
  56. });
  57. } catch(e) {
  58. }
  59.  
  60. };
  61.  
  62. var updateInPageCart = function () {
  63. try {
  64. $TB.Scheduler.waitfor(function () {
  65. return jQuery('#basketOverlayContent').css('display') === 'block'
  66. }, function () {
  67. store.ptyp = PAGE_TYPE.CART_INPAGE;
  68. scrapeInPageCart();
  69. $TB.sendBeacon();
  70. }, {
  71. interval: 150,
  72. limit: 25
  73. });
  74. } catch(e) {
  75. }
  76. };
  77.  
  78. var getPridFromU = function (u) {
  79.  
  80. //Should return the product id (item.prid) or null if not found, given the URL for a product.
  81. try {
  82. var r = /\/invt\/([^\/]*)\//ig;
  83. var m = r.exec(u);
  84. if(m && m.length === 2) {
  85. return m[1];
  86. }
  87. } catch(e) {
  88. }
  89. return null;
  90.  
  91. };
  92.  
  93. store.typ = EVENT_TYPE.PAGE_VIEW;
  94. store.ptyp = PAGE_TYPE.OTHER;
  95.  
  96. //{{CURRENCIES}}
  97.  
  98. store.curr = 'GBP';
  99.  
  100. var is_cart = function () {
  101.  
  102. try {
  103. if($TB.oneof(store.doc.u, ['/basket'])) {
  104. store.ptyp = PAGE_TYPE.CART;
  105. return $('#content');
  106. }
  107. } catch(e) {
  108. }
  109. };
  110.  
  111. var is_product_details = function () {
  112.  
  113. try {
  114. if($TB.oneof(store.doc.u, ['/product/'])) {
  115. store.ptyp = PAGE_TYPE.PRODUCT_BROWSE;
  116. return $('body');
  117. }
  118. } catch(e) {
  119. }
  120. };
  121.  
  122. var is_product_list = function () {
  123.  
  124. try {
  125. if($TB.oneof(store.doc.u, ['/shop/'])) {
  126. store.ptyp = PAGE_TYPE.PRODUCT_LIST;
  127. return $('#content');
  128. }
  129. } catch(e) {
  130. }
  131. };
  132.  
  133. var is_login = function () {
  134.  
  135. try {
  136. if($TB.oneof(store.doc.u, ['/account'])) {
  137. store.ptyp = PAGE_TYPE.LOGIN;
  138. return $('#content');
  139. }
  140. } catch(e) {
  141. }
  142.  
  143. };
  144.  
  145. var is_purchase_complete = function () {
  146.  
  147. try {
  148. if($TB.oneof(store.doc.u, ['/checkout/customer/complete'])) {
  149. store.ptyp = PAGE_TYPE.CHECKOUT_THANKS;
  150. return true;
  151. }
  152. } catch(e) {
  153. }
  154.  
  155. };
  156.  
  157. var is_signup = function () {
  158.  
  159. try {
  160. if($TB.oneof(store.doc.u, ['/register'])) {
  161. store.ptyp = PAGE_TYPE.REGISTER;
  162. return $('#content');
  163. }
  164. } catch(e) {
  165. }
  166.  
  167. };
  168.  
  169. var is_checkout = function () {
  170.  
  171. try {
  172. if($TB.oneof(store.doc.u, ['/payment'])) {
  173. store.ptyp = PAGE_TYPE.CHECKOUT;
  174. return $('#content');
  175. }
  176. } catch(e) {
  177. }
  178.  
  179. };
  180.  
  181. var base = is_product_list() || is_purchase_complete() || is_cart() || is_product_details() || is_checkout() || is_signup() || is_login();
  182.  
  183. var details = {
  184.  
  185. pl: function (root) {
  186.  
  187. store.p = [];
  188.  
  189. root.find('.departmentProduct').each(function (index) {
  190. var item = {};
  191.  
  192. try {
  193. item.prid = window.dataLayer[1].ProductID[index];
  194. item.sku = item.prid;
  195. } catch(e) {
  196. }
  197.  
  198. try {
  199. var breadcrumbs = root.find('.breadcrumbs a:not(:first)');
  200. if(breadcrumbs.length) {
  201. item.cat = item.cat || [];
  202. breadcrumbs.each(function () {
  203. item.cat.push($TB.get_text(this, true));
  204. });
  205. }
  206. } catch(e) {
  207. }
  208.  
  209. try {
  210. item.promo = item.promo || {};
  211. item.promo.clearance = $TB.oneof(store.doc.u, ['/clearance']);
  212. } catch(e) {
  213. }
  214.  
  215. store.p.push(item);
  216. });
  217. },
  218.  
  219. //PRODUCT
  220. pb: function (root) {
  221. store.p = [];
  222.  
  223. var item = {ex: {}};
  224.  
  225. try {
  226. var canonical = jQuery('link[rel="canonical"]');
  227. if(canonical.length) {
  228. item.u = (canonical[0] || {}).href;
  229. } else {
  230. item.u = store.doc.u;
  231. }
  232. item.n = $TB.get_text(root.find('#productTitle'), true);
  233.  
  234. if(store.doc.u.split("//")[1].split(".")[0] !== "m") {
  235. item.img = root.find('#thumbnails #image1 a').data('zoomImage');
  236. item.ex.img2 = root.find('#thumbnails #image2 a').data('zoomImage');
  237. }
  238.  
  239. //Sets description and adds a space after every full stop.
  240. item.desc = $TB.get_text(root.find('[itemprop="description"], .infoContent'), true).replace(/\.(\S)/g, '. $1');
  241.  
  242. } catch(e) {
  243. }
  244.  
  245. try {
  246. item.prid = window.dataLayer[0].product_sku || window.dataLayer[0].product_id;
  247. item.sku = item.prid;
  248. } catch(e) {
  249. }
  250.  
  251. try {
  252. item.curr = store.curr;
  253. item.uv = $TB.get_value_from_text($TB.get_text(root.find('#webPrice, #ourPrice'), true));
  254. item.up = $TB.format_currency(item.uv, item.curr);
  255.  
  256. if(root.find('#highStPrice').length) {
  257. item.ruv = $TB.get_value_from_text($TB.get_text(root.find('#highStPrice'), true));
  258. item.rup = $TB.format_currency(item.ruv, item.curr);
  259. } else {
  260. item.ruv = item.uv;
  261. item.rup = item.up;
  262. }
  263. } catch(e) {
  264. }
  265.  
  266. try {
  267. item.cat = [];
  268.  
  269. item.cat.push({
  270. g: 'half-price',
  271. n: item.ruv > item.uv * 2,
  272. r: true
  273. });
  274.  
  275. item.ex.productId = root.find('input#productId').val();
  276.  
  277. if(root.find('.rating-stats[itemprop="aggregateRating"]').length) {
  278. item.reviews = item.reviews || {};
  279. item.reviews.rating = $TB.get_value_from_text($TB.get_text(root.find('span[itemprop="ratingValue"]'), true));
  280. item.reviews.ratingCount = $TB.get_value_from_text($TB.get_text(root.find('span[itemprop="reviewCount"]'), true));
  281. }
  282. } catch(e) {
  283. }
  284. try {
  285. if(root.find('#productStatus p:contains(IN STOCK), #productStatus span:contains(In Stock)').length) {
  286. item.stock = 1;
  287. } else {
  288. item.stock = 0;
  289. }
  290. } catch(e) {
  291. }
  292.  
  293. try {
  294. for(var i = 0; i < jQuery('[itemprop="additionalProperty"]').length; i++) {
  295.  
  296. var name = jQuery('[itemprop="additionalProperty"]:eq(' + i + ') meta[itemprop="name"]')[0].content.replace(/\s+/g, '_').toLowerCase();
  297. item.ex.suitability = item.ex.suitability || {};
  298.  
  299. item.ex.suitability[name] = {};
  300. item.ex.suitability[name]['value'] = jQuery('[itemprop="additionalProperty"]:eq(' + i + ') meta[itemprop="value"]')[0].content;
  301. item.ex.suitability[name]['image'] = jQuery('[itemprop="additionalProperty"]:eq(' + i + ') img')[0].src;
  302.  
  303. }
  304. } catch(e) {
  305. }
  306.  
  307. jQuery(document).on('click', '.addToBasket', function () {
  308. updateInPageCart();
  309. });
  310.  
  311. if(item.prid !== "7804") {
  312. store.p.push(item);
  313. }
  314. },
  315.  
  316. //CART
  317. ca: function (root) {
  318. var captureCart = function () {
  319. store.cart = {
  320. p: [],
  321. qty: 0,
  322. curr: store.curr
  323. };
  324.  
  325. //Capture cart data,
  326. root.find('#basketShopping tbody:first > tr, #basket .basketProduct').each(function (index) {
  327.  
  328. var item = {}, elt = $(this);
  329.  
  330. try {
  331. item.n = $TB.get_text(elt.find('.productTitle'), true, " - ")[0];
  332.  
  333. if(store.doc.u.split("//")[1].split(".")[0] !== "m") {
  334. item.img_tn = (elt.find('img')[0] || {}).src;
  335. }
  336. } catch(e) {
  337. }
  338.  
  339. try {
  340. item.prid = window.dataLayer[1].ProductID[index].id;
  341. item.sku = item.prid;
  342. } catch(e) {
  343. }
  344.  
  345. try {
  346. item.curr = store.curr;
  347.  
  348. item.qty = Number(elt.find(".basketQtyInput, .productQuantityAmount input").val());
  349.  
  350. item.uv = window.dataLayer[1].ProductID[index].price;
  351. item.up = $TB.format_currency(item.uv, item.curr);
  352.  
  353. } catch(e) {
  354. }
  355.  
  356. try {
  357. store.cart.qty += item.qty;
  358. } catch(e) {
  359. }
  360.  
  361. // Santoku knife purposefully removed from capture
  362. // https://www.procook.co.uk/product/procook-professional-x50-santoku-knife-18cm-7inch-promo
  363.  
  364. if(item.prid !== "7804") {
  365. store.cart.p.push(item);
  366. }
  367. });
  368.  
  369. store.cart.ex = store.cart.ex || {};
  370.  
  371. var prices = jQuery('.orderTotalDetailValue');
  372.  
  373. store.cart.ex.delivery = $TB.get_text(prices[1]) === "FREE" ? 0 : $TB.get_value_from_text($TB.get_text(prices[1]), true);
  374. store.cart.ex.total = $TB.get_value_from_text($TB.get_text(prices[2]), true);
  375.  
  376. store.cart.cv = $TB.get_value_from_text($TB.get_text(prices[0]), true);
  377. store.cart.cp = $TB.format_currency(store.cart.cv, store.curr);
  378. };
  379.  
  380. captureCart();
  381.  
  382. jQuery(document).ajaxStop(function () {
  383. var currentCV = store.cart ? store.cart.cv : 0;
  384.  
  385. captureCart();
  386.  
  387. if(store.cart.cv !== currentCV) {
  388. $TB.sendBeacon();
  389. }
  390. });
  391.  
  392. $TB.getExtraSlotQSOptions = function () {
  393. var prid = [];
  394. for(var i = 0; i < store.cart.p.length; i++) {
  395. prid.push(store.cart.p[i].prid);
  396. }
  397. return {prid: prid.join('||')};
  398. };
  399. },
  400.  
  401. //LOGIN
  402. lo: function (root) {
  403. try {
  404.  
  405. $TB.fieldListener('e', root.find('#email'), {
  406. email_field: true,
  407. immediate: true
  408. });
  409. } catch(e) {
  410. }
  411. },
  412.  
  413. //REGISTER
  414. re: function (root) {
  415. try {
  416.  
  417. $TB.fieldListener('e', root.find('#email'), {
  418. email_field: true,
  419. immediate: true
  420. });
  421. $TB.fieldListener('fn', root.find('#firstname'));
  422. $TB.fieldListener('ln', root.find('#lastname'));
  423.  
  424. } catch(e) {
  425. }
  426. },
  427.  
  428. //CHECKOUT
  429. co: function () {
  430. try {
  431.  
  432. $TB.fieldListener('e', jQuery('#email'), {
  433. email_field: true,
  434. immediate: true
  435. });
  436.  
  437. } catch(e) {
  438. }
  439. },
  440.  
  441. //PURCHASE COMPLETE
  442. pc: function (root) {
  443.  
  444. store.co = {};
  445. try {
  446. var onum = root.find('.ordernumber');
  447. if(onum.length) {
  448. store.co.o_num = $TB.get_text(onum, true);
  449. }
  450.  
  451. } catch(e) {
  452. }
  453. }
  454. };
  455.  
  456. switch(store.ptyp) {
  457. case PAGE_TYPE.PRODUCT_LIST:
  458. details.pl(base);
  459. break;
  460. case PAGE_TYPE.PRODUCT_BROWSE:
  461. details.pb(base);
  462. break;
  463. case PAGE_TYPE.CART:
  464. details.ca(base);
  465. break;
  466. case PAGE_TYPE.LOGIN:
  467. details.lo(base);
  468. break;
  469. case PAGE_TYPE.REGISTER:
  470. details.re(base);
  471. break;
  472. case PAGE_TYPE.CHECKOUT:
  473. details.co(base);
  474. break;
  475. case PAGE_TYPE.CHECKOUT_THANKS:
  476. details.pc(base);
  477. break;
  478. }
  479.  
  480. // Email captures
  481. try {
  482. $TB.fieldListener('e', jQuery('#signUp, #registerEmail, #email'), {
  483. email_field: true,
  484. immediate: true
  485. });
  486. } catch(e) {
  487. }
  488.  
  489. // Newsletter Login page
  490. try {
  491. $TB.fieldListener('e', jQuery('#signUpFooter'), {
  492. email_field: true,
  493. immediate: true
  494. });
  495. } catch(e) {
  496. }
Add Comment
Please, Sign In to add comment