jam-cloud/web/app/assets/javascripts/ga.js

311 lines
9.0 KiB
JavaScript

/**
* Common utility functions.
*/
(function(context,$) {
"use strict";
context.JK = context.JK || {};
var logger = context.JK.logger;
// types
var registrationTypes = {
native : "Native",
facebook : "Facebook"
};
var sessionCreationTypes = {
create : "Create",
join : "Join"
};
var sessionQualityTypes = {
good : "Good",
poor : "Poor"
};
var invitationTypes = {
email : "Email",
facebook : "Facebook",
google : "Google"
};
var friendConnectTypes = {
request : "Request",
accept : "Accept"
};
var recordingActions = {
make : "Make",
share : "Share"
};
var recordingShareTypes = {
facebook : "Facebook",
syndicationWidget : "SyndWidget",
syndicationUrl: "SyndURL"
};
var recordingPlayActions = {
website : "Website",
client : "Client",
facebook : "Facebook",
syndicationWidget : "SyndWidget",
syndicationUrl: "SyndURL"
};
var sessionPlayActions = {
website : "Website",
client : "Client",
facebook : "Facebook",
syndicationWidget : "SyndWidget",
syndicationUrl: "SyndURL"
};
var userLabels = {
registeredUser : "RegisteredUser",
visitor: "Visitor"
};
var bandActions = {
create : "Create",
join : "Join",
session : "Session",
recording : "Recording"
};
var jkSocialTargets = {
musician : 'Musician',
band : 'Band',
fan : 'Fan',
recording : 'Recording',
session : 'Session'
};
var categories = {
register : "Register",
download : "DownloadClient",
audioTest : "AudioTest",
sessionCount : "SessionCount",
sessionMusicians : "SessionMusicians",
sessionQuality : "SessionQuality",
invite : "Invite",
findSession : "FindSession",
friendConnect : "Connect",
recording : "Recording",
recordingPlay : "RecordingPlay",
sessionPlay : "SessionPlay",
band : "Band",
jkLike : 'jkLike',
jkFollow : 'jkFollow',
jkFavorite : 'jkFavorite',
jkComment : 'jkComment'
};
function translatePlatformForGA(platform) {
assertOneOf(platform, context.JK.OS);
if(platform == context.JK.OS.WIN32) {
return "Windows";
}
if(platform == context.JK.OS.OSX) {
return "Mac";
}
if(platform == context.JK.OS.UNIX) {
return "Unix";
}
}
function assertBoolean(value) {
if(typeof value != 'boolean') {
throw "value is not a boolean: " + JSON.stringify(value);
}
}
function assertNumber(value) {
if(typeof value != 'number') {
throw "value is not a number: " + JSON.stringify(value);
}
}
function assertOneOf(enumValue, enums){
var found = false;
for (var key in enums) {
if (enumValue == enums[key]) {
found = true;
break;
}
}
if(!found) {
throw "unable to find enum: " + enumValue + " in: " + JSON.stringify(enums);
}
}
function trackRegister(asMusician, registrationType) {
assertBoolean(asMusician);
assertOneOf(registrationType, registrationTypes);
var action = asMusician ? "Musician" : "Fan";
context.ga('send', 'event', categories.register, action, registrationType);
}
function trackDownload(platform) {
var normalizedPlatform = translatePlatformForGA(platform);
context.ga('send', 'event', categories.download, normalizedPlatform);
}
function trackFTUECompletion(state, platform) {
var normalizedPlatform = translatePlatformForGA(platform);
context.ga('send', 'event', categories.audioTest, state, normalizedPlatform);
}
function trackSessionCount(musicianAccess, fanAccess, invitationCount) {
assertBoolean(musicianAccess);
assertBoolean(fanAccess);
assertNumber(invitationCount);
var gaMusicianAccess = musicianAccess ? "MusicianPublic" : "MusicianPrivate";
var gaFanAccess = fanAccess ? "FanPublic" : "FanPrivate";
context.ga('send', 'event', categories.sessionCount, gaMusicianAccess, gaFanAccess, invitationCount);
}
function trackSessionMusicians(joinOrCreate) {
assertOneOf(joinOrCreate, sessionCreationTypes);
context.ga('send', 'event', categories.sessionMusicians, joinOrCreate);
}
function trackSessionQuality(goodOrPoor) {
assertOneOf(goodOrPoor, sessionQualityTypes);
context.ga('send', 'event', categories.sessionQuality, goodOrPoor);
}
function trackServiceInvitations(invitationType, numInvited) {
assertOneOf(invitationType, invitationTypes);
assertNumber(numInvited);
context.ga('send', 'event', categories.invite, invitationType, numInvited);
}
function trackFindSessions(numSessionsFound) {
assertNumber(numSessionsFound);
var sessionCountRollup = "n/a";
if(numSessionsFound === 0) {
sessionCountRollup = "0";
}
else if(numSessionsFound >= 1 && numSessionsFound <= 5) {
sessionCountRollup = "1-5";
}
else if(numSessionsFound >= 6 && numSessionsFound <= 10) {
sessionCountRollup = "6-10";
}
else {
sessionCountRollup = "10+";
}
context.ga('send', 'event', categories.findSession, sessionCountRollup, numSessionsFound);
}
// if you want to pass in no title, either omit it from the arg list when u invoke virtualPageView, or pass in undefined, NOT null
function virtualPageView(page, title) {
context.ga('send', 'pageview', {
'page': page,
'title': title
});
}
function trackFriendConnect(friendConnectType) {
assertOneOf(friendConnectType, friendConnectTypes);
context.ga('send', 'event', categories.friendConnect, friendConnectType);
}
// when someone keeps a recording
function trackMakeRecording() {
context.ga('send', 'event', categories.recording, recordingActions.make);
}
// when someone shares a recording
function trackShareRecording(shareType) {
assertOneOf(shareType, recordingShareTypes);
context.ga('send', 'event', categories.recording, recordingActions.share, shareType);
}
function _defaultPlayAction() {
return !window.jamClient || ((typeof(FakeJamClient)!='undefined') && window.jamClient === FakeJamClient) ? 'Website' : 'Client';
}
// when someone plays a recording
function trackRecordingPlay(recordingAction) {
if (!recordingAction) {
recordingAction = _defaultPlayAction();
}
assertOneOf(recordingAction, recordingPlayActions);
var label = JK.currentUserId ? userLabels.registeredUser : userLabels.visitor;
context.ga('send', 'event', categories.recordingPlay, recordingAction, label);
}
// when someone plays a live session broadcast
function trackSessionPlay(recordingAction) {
if (!recordingAction) {
recordingAction = _defaultPlayAction();
}
assertOneOf(recordingAction, sessionPlayActions);
var label = JK.currentUserId ? userLabels.registeredUser : userLabels.visitor;
context.ga('send', 'event', categories.sessionPlay, recordingAction, label);
}
function trackBand(bandAction) {
assertOneOf(bandAction, bandActions);
context.ga('send', 'event', categories.band, bandAction);
}
function trackJKSocial(category, target) {
assertOneOf(category, categories);
assertOneOf(target, jkSocialTargets);
context.ga('send', 'event', category, target);
}
var GA = {};
GA.Categories = categories;
GA.SessionCreationTypes = sessionCreationTypes;
GA.SessionQualityTypes = sessionQualityTypes;
GA.InvitationTypes = invitationTypes;
GA.FriendConnectTypes = friendConnectTypes;
GA.RecordingActions = recordingActions;
GA.BandActions = bandActions;
GA.JKSocialTargets = jkSocialTargets;
GA.trackRegister = trackRegister;
GA.trackDownload = trackDownload;
GA.trackFTUECompletion = trackFTUECompletion;
GA.trackSessionCount = trackSessionCount;
GA.trackSessionMusicians = trackSessionMusicians;
GA.trackSessionQuality = trackSessionQuality;
GA.trackServiceInvitations = trackServiceInvitations;
GA.trackFindSessions = trackFindSessions;
GA.virtualPageView = virtualPageView;
GA.trackFriendConnect = trackFriendConnect;
GA.trackMakeRecording = trackMakeRecording;
GA.trackShareRecording = trackShareRecording;
GA.trackRecordingPlay = trackRecordingPlay;
GA.trackSessionPlay = trackSessionPlay;
GA.trackBand = trackBand;
GA.trackJKSocial = trackJKSocial;
context.JK.GA = GA;
})(window,jQuery);