/** * 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);