(function ($, Drupal, drupalSettings) { "use strict"; Drupal.behaviors.SegmentAnalyticsEvents = { attach: function (context, settings) { // Check to see if globally defined Segment is available. if (analytics) { // Segment is enabled, so carry on and create the events got all matching elements. $('[data-analytics]').once('coh-segment-analytics-init').each(function () { // Save the element reference. var element = $(this); // Decode the analytics JSON from the data attribute. var events = JSON.parse($(this).attr('data-analytics')); // Loop through this attribute object, creating an event for each entry. events.forEach(function (event) { if (!event) {return}; var action = event.eventAction; var category = event.eventCategory; var label = event.eventLabel; var value = event.eventValue; if (!action && (!category || !label || !value)) {return}; if (event.trigger === 'click') { analytics.trackLink(element, action, { category: category, label: label, value: value }); } else if (event.trigger === 'load') { analytics.track(action, { category: category, label: label, value: value }); } else { element.bind(event.trigger, function (e, inView) { // inview trigger fired, but element left the viewport. if (e.type === 'inview' && !inView) { return; } analytics.track(action, { category: category, label: label, value: value }); }); } }); }); // Attach to videos $('video').once('segment-analytics-init').each(function () { // Save the element reference. var element = $(this); let src = element.attr('src'); let name = element.attr('data-analytics-name') || src; var player = element[0].player; let media = player && player.media; if (player && media) { media.addEventListener('canplay', function (e) { // if (media.youTubeApi) { // var ytAnalytics = new analytics.plugins.YouTubeAnalytics(media.youTubeApi, 'Google-API-Key'); // ytAnalytics.initialize(); // } media.addEventListener('play', function (event) { let target = event.detail.target; if (target && typeof analytics !== 'undefined') { target._trackedProgress = getVideoProgress(target); analytics.track('Video Started', { category: 'Video', name: name, label: name, video_src: src, video_progress: target._trackedProgress }); } }, false); media.addEventListener('pause', function (event) { let target = event.detail.target; if (target && typeof analytics !== 'undefined') { target._trackedProgress = getVideoProgress(target); analytics.track('Video Stopped', { category: 'Video', name: name, label: name, video_src: src, video_progress: target._trackedProgress }); } }, false); media.addEventListener('ended', function (event) { let target = event.detail.target; if (target && typeof analytics !== 'undefined') { target._trackedProgress = getVideoProgress(target); analytics.track('Video Stopped', { category: 'Video', name: name, label: name, video_src: src, video_progress: target._trackedProgress }); } }, false); media.addEventListener('timeupdate', function (event) { let target = event.detail.target; if (target && typeof analytics !== 'undefined') { let currentProgress = getVideoProgress(target); if (target._trackedProgress === undefined || target._trackedProgress !== currentProgress) { target._trackedProgress = currentProgress; analytics.track('Video Viewed', { category: 'Video', name: name, label: name, video_src: src, video_progress: target._trackedProgress }); } } }, false); }, false); } }); } // Segment not available, so warn. else { console.warn('Segment is not available, but Segment events have been defined.'); } } }; function getVideoProgress(target) { let progress = 0; try { let duration = target.getDuration(); let currentTime = target.getCurrentTime(); progress = (Math.floor((currentTime / duration) * 10) * 10) / 100; } catch (err) {} return progress; } })(jQuery, Drupal, drupalSettings);