Advertisement
Guest User

Untitled

a guest
Nov 16th, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.06 KB | None | 0 0
  1. (function($, APP, undefined) {
  2.  
  3. APP.Helpers.GTM = {
  4. data: {},
  5. debug: APP.GTM.debug || false,
  6. };
  7.  
  8. /**
  9. * Проверяет загружен ли GTM
  10. * @return boolean
  11. */
  12. APP.Helpers.GTM.isActive = function() {
  13. window.dataLayer = window.dataLayer || [];
  14.  
  15. var isInited = dataLayer
  16. .filter(function(value){
  17. return value.event == 'gtm.js'
  18. })
  19. .length > 0;
  20. var isReady = dataLayer
  21. .filter(function(value){
  22. return value.event == 'gtm.dom'
  23. })
  24. .length > 0;
  25.  
  26. return (isInited && isReady);
  27. };
  28.  
  29. /**
  30. * Парсит элемент промоблока
  31. * @param $el
  32. */
  33. APP.Helpers.GTM.getPromotion = function($el) {
  34. return {
  35. 'id': $el.data('id'),
  36. 'name': $el.data('name'),
  37. 'creative': $el.attr('href'),
  38. 'position': $el.data('position')
  39. };
  40. };
  41.  
  42. /**
  43. * Проверяет отображаемые промо блоки и отправляет события по ним
  44. * + вешает событие для проверки изменения размера экрана для повторной проверки
  45. */
  46. APP.Helpers.GTM.checkPromoViewBlock = function($block) {
  47. if( !$block.data('promoViewSended') && $block.is(':visible') ) {
  48. $block.data('promoViewSended', true);
  49. var promotions = [];
  50. $block.find('.js-gtm-promoView--element').each(function(){
  51. promotions.push( APP.Helpers.GTM.getPromotion($(this)) );
  52. });
  53. APP.Helpers.GTM.promoView(promotions);
  54. } else if( !$block.data('promoViewInited') ){
  55. APP.Helpers.onResize(function() {
  56. APP.Helpers.GTM.checkPromoViewBlock($block)
  57. });
  58. }
  59. $block.data('promoViewInited', true);
  60. };
  61.  
  62. /**
  63. * Обработчик клика на промоблок
  64. */
  65. APP.Helpers.GTM.handlerPromoClick = function(el, ev) {
  66. ev.preventDefault();
  67. var $el = $(el);
  68. var data = {};
  69. data.promotion = APP.Helpers.GTM.getPromotion($el);
  70. data.callback = function() {
  71. document.location = $el.attr('href');
  72. }
  73.  
  74. APP.Helpers.GTM.promoClick(data);
  75. };
  76.  
  77. /**
  78. * Отправка данных в GTM
  79. */
  80. APP.Helpers.GTM.push = function(data) {
  81. if( !data )
  82. return;
  83.  
  84. // GTM как то умудряется запускать eventCallback даже если его основной скрипт вырезан блокировщиком рекламы
  85. // из-за этого он запускается дважды (см конец данной функции),
  86. // поэтому добавил очистку callback, для предотвращения двойного запуска
  87. // w1serg
  88. if( data.eventCallback ) {
  89. var oldEventCallback = data.eventCallback;
  90. data.eventCallback = function() {
  91. oldEventCallback();
  92. oldEventCallback = function() {};
  93. };
  94. // Задержка до запуска callback, вне зависимости от успешности отправки в GTM
  95. data.eventTimeout = 2000;
  96. }
  97.  
  98. var err = false;
  99. try {
  100. if( !dataLayer )
  101. window.dataLayer = [];
  102. dataLayer.push(data);
  103. } catch (err) {
  104. // console.log(err);
  105. }
  106.  
  107. // Если не загружен GTM – возможно он блокирован и не загрузится вовсе
  108. // Если ошибка
  109. // Если есть callback
  110. // Cразу запускаем callback
  111. if(
  112. (err !== false || !APP.Helpers.GTM.isActive())
  113. && data.eventCallback
  114. ) {
  115. data.eventCallback();
  116. }
  117. };
  118.  
  119. /**
  120. * Событие отправки формы
  121. */
  122. APP.Helpers.GTM.formSent = function(data) {
  123. data.page = data.page || window.location.href;
  124. APP.Helpers.GTM.push({
  125. 'event': 'отправка формы',
  126. 'formSent': data
  127. });
  128. };
  129.  
  130. /**
  131. * Событие открытия окна
  132. */
  133. APP.Helpers.GTM.windowOpened = function(data) {
  134. data.page = data.page || window.location.href;
  135. APP.Helpers.GTM.push({
  136. 'event': 'раскрытие окна формы',
  137. 'windowOpened': data
  138. });
  139. };
  140.  
  141. /**
  142. * Событие оформления зазаза: новый шаг заказа
  143. * все параметры передаются через один объект data = {step: '', products: [{}], callback: function(){} }
  144. *
  145. * @param step номер этапа
  146. * @param products [{ 'name': 'Triblend Android T-Shirt', 'id': '12345', 'price': '15.25', 'brand': 'Google', 'category': 'Apparel', 'variant': 'Gray', 'quantity': 1 }]
  147. * @param callback событие для выполнения после отправки
  148. */
  149. APP.Helpers.GTM.orderSetState = function(data) {
  150. if( !data || !data.step || !data.products ) {
  151. if( data && data.callback ) {
  152. data.callback();
  153. }
  154. return false;
  155. }
  156. var actionField = {'step': data.step};
  157. if( data.step == 1 && !data.option ) {
  158. data.option = APP.Helpers.getNamePage();
  159. }
  160. if( data.option ) {
  161. actionField.option = data.option;
  162. }
  163.  
  164. if( APP.Helpers.GTM.debug ) {
  165. alert("event: checkout\n\nStep: " + data.step + "\nProduct count: " + data.products.length);
  166. }
  167.  
  168. APP.Helpers.GTM.push({
  169. 'event': 'checkout',
  170. 'ecommerce': {
  171. 'checkout': {
  172. 'actionField': actionField,
  173. 'products': data.products
  174. }
  175. },
  176. 'eventCallback': function() {
  177. if( data.callback )
  178. data.callback();
  179. }
  180. });
  181. };
  182.  
  183. /**
  184. * Событие выбора способа оплаты
  185. *
  186. * @param data данные для отправки
  187. */
  188. APP.Helpers.GTM.getCheckoutOptionParams = function(data) {
  189. if (!data || !data.step || !data.paymentName ) {
  190. return false;
  191. }
  192.  
  193. var actionField = {
  194. 'step': data.step,
  195. 'option': data.paymentName,
  196. };
  197.  
  198. return {
  199. 'ecommerce': {
  200. 'checkout_option': {
  201. 'actionField': actionField
  202. }
  203. }
  204. };
  205. };
  206.  
  207. /**
  208. * Событие оплаты заказа
  209. * все параметры передаются через один объект data = {id: 'T12345', total: '2411', shipping: '140', products: [{}], callback: function(){} }
  210. *
  211. * @param step номер этапа
  212. * @param products [{ 'name': 'Triblend Android T-Shirt', 'id': '12345', 'price': '15.25', 'brand': 'Google', 'category': 'Apparel', 'variant': 'Gray', 'quantity': 1 }]
  213. * @param callback событие для выполнения после отправки
  214. */
  215. APP.Helpers.GTM.orderSetPurchase = function(data) {
  216. if( !data || !data.id || !data.products || !data.total || !data.shipping ) {
  217. return false;
  218. }
  219. var actionField = {
  220. 'id': data.id,
  221. 'revenue': data.total,
  222. 'shipping': data.shipping,
  223. };
  224.  
  225. if( APP.Helpers.GTM.debug ) {
  226. alert("event: purchase\n\nTotal: " + data.total);
  227. }
  228.  
  229. APP.Helpers.GTM.push({
  230. 'event': 'purchase',
  231. 'ecommerce': {
  232. 'purchase': {
  233. 'actionField': actionField,
  234. 'products': data.products
  235. }
  236. },
  237. 'eventCallback': function() {
  238. if( data.callback )
  239. data.callback();
  240. }
  241. });
  242. };
  243.  
  244. /**
  245. * Событие просмотра промоблока
  246. * @param array promotions
  247. */
  248. APP.Helpers.GTM.promoView = function(promotions) {
  249. APP.Helpers.GTM.push({
  250. 'event': 'promotionView',
  251. 'ecommerce': {
  252. 'promoView': {
  253. 'promotions': promotions
  254. }
  255. }
  256. });
  257. };
  258.  
  259. /**
  260. * Событие клика на промоблок
  261. * все параметры передаются через один объект data = {promotion: {}, callback: function(){} }
  262. * @param object promotion
  263. * @param function callback
  264. */
  265. APP.Helpers.GTM.promoClick = function(data) {
  266. data.callback = data.callback || function(){};
  267. APP.Helpers.GTM.push({
  268. 'event': 'promotionClick',
  269. 'ecommerce': {
  270. 'promoClick': {
  271. 'promotions': [data.promotion]
  272. }
  273. },
  274. 'eventCallback': data.callback
  275. });
  276. };
  277.  
  278. /**
  279. * Событие добавления к сравнению. data = {name: '', place: ''}
  280. *
  281. * @param data
  282. */
  283. APP.Helpers.GTM.compareAdd = function(data) {
  284. APP.Helpers.GTM.push({
  285. event: 'сравнение товаров',
  286. compareItems: {
  287. type: 'добавление к сравнению',
  288. place: data.place,
  289. item: data.name
  290. }
  291. });
  292. };
  293.  
  294. /**
  295. * Событие удаления из сравнения. data = {name: '', place: ''}
  296. *
  297. * @param data
  298. */
  299. APP.Helpers.GTM.compareRemove = function(data) {
  300. APP.Helpers.GTM.push({
  301. event: 'сравнение товаров',
  302. compareItems: {
  303. type: 'удаление из сравнения',
  304. item: data.name
  305. }
  306. });
  307. };
  308.  
  309. /**
  310. * Возвращает объект со списком товаров, переданным Helper::echoGtmProductList
  311. *
  312. * @param $container
  313. * @return object
  314. */
  315. APP.Helpers.GTM.parseProductList = function($container) {
  316. return $container.data('products');
  317. };
  318.  
  319. /**
  320. * Функционал для работы с нумерацией внутри списка товаров
  321. * NB: Функция вызывает себя при определении, см замыкание
  322. *
  323. * @return object
  324. */
  325. APP.Helpers.GTM.position = function() {
  326. var module = {};
  327. var lists = {};
  328.  
  329. module.getNext = function(listName) {
  330. if( !lists[listName] ) {
  331. lists[listName] = 0;
  332. }
  333. lists[listName]++;
  334.  
  335. return lists[listName];
  336. }
  337.  
  338. module.setCurrent = function(listName, offset) {
  339. lists[listName] = offset;
  340. }
  341.  
  342. return module;
  343. }();
  344.  
  345. /**
  346. * Контейнер для данных по товарам
  347. * NB: Функция вызывает себя при определении, см замыкание
  348. *
  349. * @return object
  350. */
  351. APP.Helpers.GTM.products = function() {
  352. var module = {};
  353. var list = {};
  354. var generalList = 'general';
  355.  
  356. module.add = function(products, listName) {
  357. products.forEach(function(item) {
  358. listName = listName || item['list'] || generalList;
  359. if( !list[ listName ] ) {
  360. list[ listName ] = {};
  361. }
  362. list[ listName ][ item['id'] ] = item;
  363. });
  364. };
  365.  
  366. module.get = function(id, listName) {
  367. var product = false;
  368. listName = listName || generalList;
  369.  
  370. if( list[ listName ] && list[ listName ][ id ] ) {
  371. product = $.extend({}, list[ listName ][ id ]);
  372. }
  373. return product;
  374. };
  375.  
  376. module.getArray = function() {
  377. return list;
  378. };
  379.  
  380. return module;
  381. }();
  382.  
  383. /**
  384. * Проверяет контейнер на наличие блоков со списками товаров
  385. * + отправляет для каждого из них событие в GTM
  386. *
  387. * @param $container
  388. */
  389. APP.Helpers.GTM.initProductImpressions = function($container) {
  390.  
  391. var $lists = $container.find('.js-product-list[data-type=impressions]');
  392. if( $lists.length > 0 ) {
  393. $lists.each(function() {
  394. $list = $(this);
  395. // Инициализировать можно только один раз
  396. if( $list.data('product-impressions-status') == 'inited' ) {
  397. return;
  398. }
  399. $list.data('product-impressions-status', 'inited');
  400.  
  401. var products = APP.Helpers.GTM.parseProductList($list);
  402. var currency = $list.data('currency');
  403. var listName = $list.data('list-name');
  404. var offset = $list.data('offset'); // Должен учитывать отсутствие параметра - считаем по факту, либо 0 - обнуляем принудительно каждый раз
  405.  
  406. if( products && products.length > 0 && currency && listName ) {
  407. // Дополняем данные для товаров
  408. if( typeof offset !== 'undefined' ) {
  409. APP.Helpers.GTM.position.setCurrent(listName, offset);
  410. }
  411.  
  412. products.map(function(val) {
  413. val['position'] = APP.Helpers.GTM.position.getNext(listName)
  414. val['list'] = listName;
  415. return val;
  416. });
  417.  
  418. // Сохраняем для дальнейшего использования при кликах
  419. APP.Helpers.GTM.products.add(products);
  420.  
  421. // Отправим сразу как только покажется на экране
  422. APP.Helpers.whenVisibleCallback($list.parent(), function() {
  423. APP.Helpers.GTM.sendProductImpressions(currency, products, listName, offset);
  424. });
  425. }
  426. });
  427. }
  428. };
  429.  
  430. /**
  431. * Отправляет данные по списками товаров в GTM
  432. *
  433. * @param string currency Валюта товаров
  434. * @param array products Список товаров
  435. */
  436. APP.Helpers.GTM.sendProductImpressions = function(currency, products, listName, offset) {
  437. if( APP.Helpers.GTM.debug ) {
  438. alert("event: productView\n\nList: " + listName + "\nProduct count: " + products.length);
  439. }
  440.  
  441. APP.Helpers.GTM.push({
  442. 'event': 'productView',
  443. 'ecommerce': {
  444. 'currencyCode': currency,
  445. 'impressions': products
  446. }
  447. });
  448. };
  449.  
  450. /**
  451. * Обработчик для отправки Product Click
  452. *
  453. * @param el
  454. * @param ev
  455. */
  456. APP.Helpers.GTM.handlerProductClick = function(el, ev) {
  457. var $el = $(el);
  458. var itemData = APP.Helpers.GTM.getItemDataByEl($el);
  459. if( itemData === false || !itemData.productId || !itemData.gtmListName ) {
  460. return;
  461. }
  462.  
  463. ev.preventDefault();
  464.  
  465. var callback = function() {
  466. if( APP.Helpers.GTM.debug ) {
  467. var debugGo = confirm('Goto: ' + $el.attr('href'));
  468. }
  469.  
  470. if( !APP.Helpers.GTM.debug || debugGo )
  471. {
  472. document.location = $el.attr('href');
  473. }
  474. }
  475. var product = APP.Helpers.GTM.products.get( itemData.productId, itemData.gtmListName );
  476.  
  477. if( !product )
  478. {
  479. callback();
  480. }
  481. else
  482. {
  483. if( APP.Helpers.GTM.debug ) {
  484. var dataProduct = '';
  485. $.each(product, function(index, value) {
  486. dataProduct += "\n" + index + ": " + value;
  487. });
  488. alert("event: productClick\n" + dataProduct);
  489. }
  490.  
  491. APP.Helpers.GTM.push({
  492. 'event': 'productClick',
  493. 'ecommerce': {
  494. 'click': {
  495. 'actionField': {'list': product.list},
  496. 'products': [product]
  497. }
  498. },
  499. 'eventCallback': callback
  500. });
  501. }
  502. };
  503.  
  504. /**
  505. * Обработчик для открытия быстрого просмотра
  506. * Вызывается в APP.Controls.ProductQuickViewButton
  507. * @param $el
  508. * @param ev
  509. */
  510. APP.Helpers.GTM.handlerProductQuickView = function($el, ev) {
  511. var itemData = APP.Helpers.GTM.getItemDataByEl($el);
  512. if( itemData === false || !itemData.productId || !itemData.gtmListName ) {
  513. return;
  514. }
  515. var product = APP.Helpers.GTM.products.get( itemData.productId, itemData.gtmListName );
  516.  
  517. if( product )
  518. {
  519. if( APP.Helpers.GTM.debug ) {
  520. var dataProduct = '';
  521. $.each(product, function(index, value) {
  522. dataProduct += "\n" + index + ": " + value;
  523. });
  524. alert("event: productQuickViewWindowOpened\n" + dataProduct);
  525. }
  526.  
  527. APP.Helpers.GTM.products.add([product], 'productQuickView');
  528.  
  529. APP.Helpers.GTM.push({
  530. 'event': 'productQuickViewWindowOpened',
  531. 'ecommerce': {
  532. 'currencyCode': product.currency,
  533. 'detail': {
  534. 'actionField': {'list': product.list},
  535. 'products': [product]
  536. }
  537. }
  538. });
  539. }
  540. };
  541.  
  542. /**
  543. * Возвращает данные по товару
  544. * @param $el
  545. * @return object
  546. */
  547. APP.Helpers.GTM.getItemDataByEl = function($el) {
  548. var $item = $el.closest('[data-gtm-product-id]');
  549. if( $item.length > 0 )
  550. {
  551. var data = {
  552. 'productId': $item.data('gtm-product-id'),
  553. 'gtmListName': $item.data('gtm-list-name')
  554. };
  555.  
  556. return data;
  557. }
  558.  
  559. return false;
  560. };
  561.  
  562. /**
  563. * Обертка для инициализации всего функционала GTM относящегося к спискам товаров
  564. * @param $context
  565. */
  566. APP.Helpers.GTM.initProductList = function($context) {
  567. // Product Impressions
  568. APP.Helpers.GTM.initProductImpressions($context);
  569.  
  570. // Product Click
  571. APP.Helpers.GTM.initProductClick($context);
  572. };
  573.  
  574. /**
  575. * Обертка для инициализации отслеживания перехода на карточку товара
  576. * @param $context
  577. */
  578. APP.Helpers.GTM.initProductClick = function($context) {
  579. $context.find('.js-gtm-product-link').each(function () {
  580. $(this).on('click', function(ev) {
  581. APP.Helpers.GTM.handlerProductClick(this, ev);
  582. });
  583. });
  584. };
  585.  
  586. /**
  587. * Обертка для инициализации всего функционала GTM относящегося к детальной карточке товара
  588. * @param context
  589. */
  590. APP.Helpers.GTM.initProductDetail = function($context) {
  591. // Send event
  592. $context.find('.js-product-list[data-type=product-detail]').each(function()
  593. {
  594. $product = $(this);
  595. var products = APP.Helpers.GTM.parseProductList($product);
  596. if( products.length > 0 )
  597. {
  598. var listName = $product.data('list-name');
  599. products.map(function(val) {
  600. val['list'] = listName;
  601. return val;
  602. });
  603.  
  604. // Сохраняем для дальнейшего использования при кликах
  605. APP.Helpers.GTM.products.add(products);
  606.  
  607. if( APP.Helpers.GTM.debug ) {
  608. var dataProduct = '';
  609. $.each(products[0], function(index, value) {
  610. dataProduct += "\n" + index + ": " + value;
  611. });
  612. alert("event: productDetailView\n" + dataProduct);
  613. }
  614.  
  615. APP.Helpers.GTM.push({
  616. 'event': 'productDetailView',
  617. 'ecommerce': {
  618. 'actionField': {'list': listName},
  619. 'detail': {
  620. 'products': products
  621. }
  622. }
  623. });
  624. }
  625. });
  626. };
  627.  
  628. /**
  629. * Обработчик для действий с корзиной
  630. * @param $el
  631. * @param type remove|other
  632. * @param data
  633. */
  634. APP.Helpers.GTM.handlerProductBasketAction = function ($el, type, data) {
  635. var itemData = APP.Helpers.GTM.getItemDataByEl($el);
  636. // listName может отсутствовать, т.к. используется не только в списках, но и на детальной странице и пр.
  637. if( itemData === false || !itemData.productId ) {
  638. return;
  639. }
  640.  
  641. var product = APP.Helpers.GTM.products.get( itemData.productId, itemData.gtmListName );
  642.  
  643. if( product )
  644. {
  645. var ecomerceData = {};
  646.  
  647. if( type == 'remove' ) {
  648. var event = 'removeFromCart';
  649. var type = 'remove';
  650.  
  651. if( data['quantity'] ) {
  652. product['quantity'] = data['quantity'];
  653. }
  654.  
  655. if( !product['quantity'] ) {
  656. var basketItem = APP.Basket.getItemByProductId(itemData.productId);
  657. if( basketItem ) {
  658. product['quantity'] = basketItem['quantity'];
  659. }
  660. }
  661. } else {
  662. var event = 'addToCart';
  663. var type = 'add';
  664. ecomerceData['currencyCode'] = product.currency;
  665.  
  666. if( data['quantity'] ) {
  667. product['quantity'] = data['quantity'];
  668. }
  669. if( !product['quantity'] ) {
  670. product['quantity'] = 1;
  671. }
  672. }
  673.  
  674. ecomerceData[type] = {'products': [product]};
  675.  
  676. if( APP.Helpers.GTM.debug ) {
  677. var dataProduct = '';
  678. $.each(product, function(index, value) {
  679. dataProduct += "\n" + index + ": " + value;
  680. });
  681. alert("event: " + event + "\n" + dataProduct);
  682. }
  683.  
  684. APP.Helpers.GTM.push({
  685. 'event': event,
  686. 'ecommerce': ecomerceData
  687. });
  688. }
  689. };
  690.  
  691. /**
  692. * Обработчик для события изменения количества товара в корзине
  693. * @param $el
  694. * @param data
  695. */
  696. APP.Helpers.GTM.handlerBasketChange = function($el, data) {
  697. var type = false;
  698. var diff = 0;
  699.  
  700. var itemId = data["BASKET_ITEM_ID"];
  701. var quantityNew = data["QUANTITY"];
  702. var action = data["ACTION"];
  703.  
  704. var fromOld = action == 'restoreItem';
  705.  
  706. var item = APP.Basket.getItemById(itemId, fromOld);
  707.  
  708. if( item )
  709. {
  710. var quantityOld = item.quantity;
  711. switch (action) {
  712. case 'recalculate':
  713. diff = quantityNew - quantityOld;
  714. if( diff > 0 )
  715. {
  716. type = 'add';
  717. }
  718. else if( diff < 0 )
  719. {
  720. type = 'remove';
  721. }
  722. break;
  723. case 'deleteItem':
  724. diff = quantityOld;
  725. type = 'remove';
  726. break;
  727. case 'restoreItem':
  728. diff = quantityOld;
  729. type = 'add';
  730. }
  731. }
  732.  
  733. if( type ) {
  734. APP.Helpers.GTM.handlerProductBasketAction($el, type, {'quantity': Math.abs(diff)});
  735. }
  736. };
  737.  
  738. /**
  739. * Передаем значение подсказки по которой кликнул пользователь
  740. * @param value
  741. */
  742. APP.Helpers.GTM.clickSearchHint = function(value) {
  743.  
  744. if( APP.Helpers.GTM.debug ) {
  745. alert("event: searchHintsClick" + "\n\nsearchHint: " + value);
  746. }
  747.  
  748. APP.Helpers.GTM.push({
  749. 'searchHint': value,
  750. 'event': 'searchHintsClick'
  751. });
  752. };
  753.  
  754. /**
  755. * Передаем данные об изменении формы
  756. */
  757. APP.Helpers.GTM.formChange = function (formName, params) {
  758.  
  759. var result = {
  760. event: 'UX',
  761. form: formName,
  762. };
  763.  
  764. $.extend(true, result, params);
  765.  
  766. if (APP.Helpers.GTM.debug) {
  767. var debugParams = '';
  768. $.each(result, function (index, value) {
  769. debugParams += "\n" + index + ": " + value;
  770. });
  771. alert("event: formChange\n" + debugParams);
  772. }
  773.  
  774. APP.Helpers.GTM.push(result);
  775. };
  776.  
  777. /**
  778. * Передаем данные при загрузки формы (предустановленные значения)
  779. */
  780. APP.Helpers.GTM.formInit = function (formName, fields) {
  781.  
  782. var common = {
  783. event: 'UX',
  784. form: formName,
  785. nonInteraction: 1
  786. };
  787.  
  788. fields = fields.map(function(field) {
  789. return $.extend(true, [], common, field);
  790. });
  791.  
  792. if (APP.Helpers.GTM.debug) {
  793. var debugParams = "\n[";
  794. var outerIndex = 0;
  795. $.each(fields, function (index, field) {
  796. debugParams += outerIndex++ > 0 ? ",\n{" : "{";
  797. var innerIndex = 0;
  798. for (var name in field) {
  799. if (field.hasOwnProperty(name)) {
  800. debugParams += (innerIndex++ > 0 ? " | " : "") + name + ": " + field[name];
  801. }
  802. }
  803. debugParams += "}";
  804. });
  805. debugParams += "]";
  806. alert("event: formInit\n" + debugParams);
  807. }
  808.  
  809. APP.Helpers.GTM.push(fields);
  810. };
  811.  
  812. APP.Helpers.GTM.formSubmit = function (formName, isValid, callback, ecommerceParams) {
  813.  
  814. var result = {
  815. event: 'UX',
  816. form: formName,
  817. action: 'submit',
  818. valid: isValid ? 1 : 0,
  819. eventCallback: callback || false
  820. };
  821.  
  822. if (ecommerceParams) {
  823. ecommerceParams = APP.Helpers.GTM.getCheckoutOptionParams(ecommerceParams);
  824. if (ecommerceParams) {
  825. $.extend(true, result, ecommerceParams);
  826. }
  827. }
  828.  
  829. if (APP.Helpers.GTM.debug) {
  830. var debugParams = '';
  831. $.each(result, function (index, value) {
  832. debugParams += "\n" + index + ": " + value;
  833. });
  834. alert("event: formSubmit\n" + debugParams);
  835. }
  836.  
  837. APP.Helpers.GTM.push(result);
  838. };
  839.  
  840. })(jQuery, window.APP);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement