Untitled
unknown
javascript
a year ago
6.6 kB
4
Indexable
<script type="text/javascript" id="gtm-wistia-tracking">
; (function(document, window, config) {
'use strict';
config = cleanConfig(config);
var _wq = window._wq = window._wq || [];
var handle = getHandler(config.syntax);
var f, s;
_wq.push({
id: '_all',
onReady: listenTo
});
if (isUndefined_(window.Wistia)) {
f = document.getElementsByTagName('script')[0];
s = document.createElement('script');
s.src = '//fast.wistia.net/assets/external/E-v1.js';
s.async = true;
f.parentNode.insertBefore(s, f);
}
function listenTo(video) {
var percentages = config._track.percentages;
var eventNameDict = {
'play': 'play',
'pause': 'pause',
'complete': 'end'
};
var cache = {};
forEach_(['play', 'complete'], function(key) {
if (config.events[key]) {
video.bind(eventNameDict[key], function() {
handle(key, video);
});
}
});
if (config.events.Pause) {
video.bind('pause', function() {
if (video.percentWatched() !== 1) handle('pause', video);
});
}
if (percentages) {
video.bind('secondchange', function(s) {
var percentage = video.percentWatched();
var key;
for (key in percentages) {
if (percentage >= percentages[key] && !cache[key]) {
cache[key] = true;
handle(key, video);
}
}
});
}
}
function cleanConfig(config) {
config = extend_({}, {
events: {
'play': true,
'pause': true,
'complete': true
},
percentages: {
each: [],
every: []
}
}, config);
var key;
var vals;
forEach_(['each', 'every'], function(setting) {
var vals = config.percentages[setting];
if (!isArray_(vals)) vals = [vals];
if (vals) config.percentages[setting] = map_(vals, Number);
});
var points = [].concat(config.percentages.each);
if (config.percentages.every) {
forEach_(config.percentages.every, function(val) {
var n = 100 / val;
var every = [];
var i;
for (i = 1; i < n; i++) every.push(val * i);
points = points.concat(filter_(every, function(val) {
return val > 0.0 && val < 100.0;
}));
});
}
var percentages = reduce_(points, function(prev, curr) {
prev[curr + '%'] = curr / 100.0;
return prev;
}, {});
config._track = {
percentages: percentages
};
return config;
}
function getHandler(syntax) {
syntax = syntax || {};
var gtmGlobal = syntax.name || 'dataLayer';
var uaGlobal = syntax.name || window.GoogleAnalyticsObject || 'ga';
var clGlobal = '_gaq';
var dataLayer;
var handlers = {
'gtm': function(state, video) {
var vidAction;
var vidPercent;
if (state.indexOf('%') > -1) {
vidAction = 'progress';
vidPercent = state;
} else {
vidAction = state;
vidPercent = undefined;
}
dataLayer.push({
event: 'wistia_video',
video_provider: 'wistia',
video_action: vidAction,
video_percent: vidPercent,
video_title: video.name().toLowerCase(),
video_url: document.location.origin + document.location.pathname + '?' + video.hashedId()
});
},
'cl': function(state, video) {
window[clGlobal].push(['_trackEvent', 'Videos', state, video.name()]);
},
'ua': function(state, video) {
window[uaGlobal]('send', 'event', 'Videos', state, video.name());
}
};
switch(syntax.type) {
case 'gtm':
dataLayer = window[gtmGlobal] = window[gtmGlobal] || [];
break;
case 'ua':
window[uaGlobal] = window[uaGlobal] || function() {
(window[uaGlobal].q = window[uaGlobal].q || []).push(arguments);
};
window[uaGlobal].l = +new Date();
break;
case 'cl':
window[clGlobal] = window[clGlobal] || [];
break;
default:
if (!isUndefined_(window[gtmGlobal])) {
syntax.type = 'gtm';
dataLayer = window[gtmGlobal] = window[gtmGlobal] || [];
} else if (uaGlobal&& !isUndefined_(window[uaGlobal])) {
syntax.type = 'ua';
} else if (!isUndefined_(window[clGlobal]) && !isUndefined_(window[clGlobal].push)) {
syntax.type = 'cl';
}
break;
}
return handlers[syntax.type];
}
function extend_() {
var args = [].slice.call(arguments);
var dst = args.shift();
var src;
var key;
var i;
for (i = 0; i < args.length; i++) {
src = args[i];
for (key in src) {
dst[key] = src[key];
}
}
return dst;
}
function isArray_(o) {
if (Array.isArray_) return Array.isArray_(o);
return Object.prototype.toString.call(o) === '[object Array]';
}
function forEach_(arr, fn) {
if (Array.prototype.forEach_) return arr.forEach.call(arr, fn);
var i;
for (i = 0; i < arr.length; i++) {
fn.call(window, arr[i], i, arr);
}
}
function map_(arr, fn) {
if (Array.prototype.map_) return arr.map.call(arr, fn);
var newArr = [];
forEach_(arr, function(el, ind, arr) {
newArr.push(fn.call(window, el, ind, arr));
});
return newArr;
}
function filter_(arr, fn) {
if (Array.prototype.filter) return arr.filter.call(arr, fn);
var newArr = [];
forEach_(arr, function(el, ind, arr) {
if (fn.call(window, el, ind, arr)) newArr.push(el);
});
return newArr;
}
function reduce_(arr, fn, init) {
if (Array.prototype.reduce) return arr.reduce.call(arr, fn, init);
var result = init;
var el;
var i;
for (i = 0; i < arr.length; i++) {
el = arr[i];
result = fn.call(window, result, el, arr, i);
}
return result;
}
function isUndefined_(thing) {
return typeof thing === 'undefined';
}
})(document, window, {
'events': {
'play': true,
'pause': true,
'complete': true
},
'percentages': {
'every': 25,
'each': []
}
});
</script>Editor is loading...
Leave a Comment