- // omnitureHelper.js
- // version : 0.0.1
- // author : Patrick Gidich
- // license : MIT
- // https://github.com/simnova/OmnitureHelper
-
- /*jslint indent:2, nomen: true, browser:true, plusplus:true, todo:true */
- (function ($, _) {
- "use strict";
-
- var s, //alias to local variable name
- _events,
- _commerceVariables, //eVar
- _insightVariables, //sProp
- reservedEventNames = [ //TODO:check for the usage of these
- "prodView", // productViews
- "scOpen", // Open / Initialize a new shopping cart
- "scAdd", // Add item(s) to the shopping cart
- "scRemove", // Remove item(s) from the shopping cart
- "scView", // View shopping cart
- "scCheckout", // Beginning of the checkout process
- "purchase" // Completion of a purchase (order)
- ],
- reservedSpropNames = [ //TODO:check for the usage of these
- "campaign",
- "state",
- "zip",
- "events",
- ""
- ];
-
- /**
- * OmnitureHelper - a microlibrary for omniture tagging.
- *
- * @class OmnitureHelper
- * @constructor
- * @param events {object} (id,name) array of all events that will be used.
- * @param commerceVariables {object} (id,name) array of all commerce variables that will be used.
- * @param insightVariables {object} (id,name) array of all insight variables that will be used.
- */
- function OmnitureHelper(events, commerceVariables, insightVariables) {
- _events = events;
- _commerceVariables = commerceVariables; //eVar
- _insightVariables = insightVariables; //sProp
- window.s = window.s || {};
- s = window.s;
- _ = window._ || {};
- $ = window.$ || {};
- }
-
- // Private Methods
- function findCommerceVariableId(commerceVariableName) {
- var id;
- try {
- id = _.find(_commerceVariables, function (variable) { return variable.name === commerceVariableName; }).id;
- } catch (e) {
- throw {
- name: "Invalid Argument Exception",
- message: "Parameter: 'commerceVariableName' with value :'" + commerceVariableName + "' not found in commerce variable array"
- };
- }
- return id;
- }
-
- function findInsightVariableId(insightVariableName) {
- var id;
- try {
- id = _.find(_insightVariables, function (variable) { return variable.name === insightVariableName; }).id;
- } catch (e) {
- throw {
- name: "Invalid Argument Exception",
- message: "Parameter: 'insightVariableName' with value :'" + insightVariableName + "' not found in insight variable array"
- };
- }
- return id;
- }
-
- function findEventId(eventName) {
- var id;
- try {
- id = _.find(_events, function (eventElement) { return eventElement.name === eventName; }).id;
- } catch (e) {
- throw {
- name: "Invalid Argument Exception",
- message: "Parameter: 'eventName' with value :'" + eventName + "' not found in event array"
- };
- }
- return id;
- }
-
- // Public Methods
- OmnitureHelper.prototype = {
-
- /**
- * Clears Variables, Page Name and Events. Useful to be used before setting values in a method
- *
- * @method clearVariablesAndEvents
- */
- clearVariablesAndEvents: function () {
- this.setPageName("");
- this.clearCommerceVariables();
- this.clearInsightVariables();
- this.clearEvents();
- },
-
- /**
- * Clears Every Commerce Variable.
- *
- * @method clearCommerceVariables
- */
- clearCommerceVariables: function () {
- var value,
- i;
- for (i = 1; i < 100; i++) {
- value = s["eVar" + i];
- if (value !== undefined) {
- s["eVar" + i] = "";
- }
- }
- },
-
- /**
- * Lists Every Commerce Variable with a Value.
- *
- * @method commerceVariablesWithValues
- */
- commerceVariablesWithValues: function () {
- var commerceVariableList = [],
- i,
- value;
- for (i = 1; i < 100; i++) {
- value = s["eVar" + i];
- // using jquery trim since older browsers don't have trim built in (ie8 etc)
- if (value !== undefined && $.trim(value) !== "") {
- commerceVariableList.push("eVar" + i);
- }
- }
- return commerceVariableList;
- },
-
- /**
- * Clears Every Insight Variable
- *
- * @method clearInsightVariables
- */
- clearInsightVariables: function () {
- var value,
- i;
- for (i = 1; i < 100; i++) {
- value = s["prop" + i];
- if (value !== undefined) {
- s["prop" + i] = "";
- }
- }
- },
-
- /**
- * Lists Every Insight Variable with a Value.
- *
- * @method insightVariablesWithValues
- */
- insightVariablesWithValues: function () {
- var commerceVariableList = [],
- i,
- value;
- for (i = 1; i < 100; i++) {
- value = s["prop" + i];
- // using jquery trim since older browsers don't have trim built in (ie8 etc)
- if (value !== undefined && $.trim(value) !== "") {
- commerceVariableList.push("prop" + i);
- }
- }
- return commerceVariableList;
- },
-
- /**
- * Set Page Name
- *
- * @method setPageName
- * @param pageName {string} The Name of the Page.
- */
- setPageName: function (pageName) {
- s.pageName = pageName; //max 100 bytes
- },
-
- /**
- * Set Page Url
- *
- * @method setPageUrl
- * @param url {string} The Url To Set.
- */
- setPageUrl: function (url) {
- s.pageURL = url;
- },
-
- /**
- * Set Channel
- *
- * @method setChannel
- * @param channelName {string} The Channel Name.
- */
- setChannel: function (channelName) {
- s.channel = channelName;
- },
-
- /**
- * Used only to designate a 404 Page Not Found Error Page.
- *
- * @method setErrorPage
- */
- setErrorPage: function () {
- s.pageType = "errorPage";
- },
-
- /**
- * Fire Event (s.events) adds another event to the list of events.
- *
- * @method fireEvent
- * @param eventName {string} The key of the event to be added
- */
- fireEvent: function (eventName) {
- //s.events = _;
- //return;
- var eventId = findEventId(eventName);
- if (s.events) { s.events += ",event" + eventId; } else { s.events = "event" + eventId; }
- },
-
- /**
- * Clear Events (s.events) removes all events.
- *
- * @method fireEvent
- */
- clearEvents: function () {
- s.events = "";
- },
-
- /**
- * Increment Commerce Variable (s.eVar)
- *
- * @method incrementCommerceCounterValue
- * @param variableName {string} The key associated with the eVar number that is to be incremented.
- */
- incrementCommerceCounterValue: function (eVarName) {
- var eVarId = findCommerceVariableId(eVarName);
- s["eVar" + eVarId] = isNaN(s["eVar" + eVarId]) ? 1 : s["eVar" + eVarId] + 1;
- },
-
- /**
- * Set Commerce Variable (s.eVar)
- *
- * @method setCommerceVariable
- * @param variableName {string} The key associated with the eVar number that is to be set.
- * @param value {string} The value that is to be recorded.
- */
- setCommerceVariable: function (variableName, value) {
- var variableId = findCommerceVariableId(variableName);
- s["eVar" + variableId] = value;
- },
-
- /**
- * Set Insight Variable (s.prop)
- *
- * @method setInsightVariable
- * @param variableName {string} The key associated with the prop number that is to be set.
- * @param value {string} The value that is to be recorded.
- */
- setInsightVariable: function (variableName, value) {
- var variableId = findInsightVariableId(variableName);
- s["prop" + variableId] = value;
- },
-
- /**
- * used to track evars / props with associated page info.
- *
- * @method trackVirtualPageView
- */
- trackVirtualPageView: function () {
- var fn = s.t;
- fn.call(window.s);
- },
-
- /**
- * used to track evars / props WITHOUT associated page info.
- *
- * @method saveValues
- * @param thisvar {object} this
- */
- saveValues: function (thisvar) {
- //make sure we handle null values
- s.linkTrackEvents = s.linkTrackEvents || "";
- s.linkTrackVars = s.linkTrackVars || "";
- s.events = s.events || "";
-
- var fn = s.tl,
- linkType = 'o', // Custom Link
- linkName = 'action',
- variableOverrides = null,
- doneAction = null, // we're not using
- //note all events and variables that have values
- activeCommerceVariables = this.commerceVariablesWithValues(), // evars
- activeInsightVariables = this.insightVariablesWithValues(), // props
- activeEvents = s.events.split(","), // events
- linkTrackEventArray = s.linkTrackEvents.split(","),
- linkTrackVarArray = s.linkTrackVars.split(",");
-
- // force omniture to save values we have set.
- // See #2 in link below:
- // http://blogs.adobe.com/digitalmarketing/analytics/top-five-javascript-implementation-gotchas/
- s.linkTrackEvents = _.chain(_.union(linkTrackEventArray, activeEvents)).uniq().without("").value().join();
- s.linkTrackVars = _.chain(_.union(linkTrackVarArray, activeCommerceVariables, activeInsightVariables, ["events"])).without("").value().join();
-
- //fn.call(window.s, thisvar, linkType, linkName, variableOverrides);
- fn.call(window.s, thisvar, linkType, linkName);
- },
-
- /**
- * used to track exit link.
- *
- * @method saveValues
- * @param thisvar {object} this
- * @param linkName {string} the url or some other decription of where the user is going..
- */
- saveExitLink: function (thisvar, linkName) {
- var fn = s.tl,
- linkType = 'e', // Exit Link
- variableOverrides = null,
- doneAction = null; // we're not using
- fn.call(window.s, thisvar, linkType, linkName, variableOverrides);
- }
-
- };
-
-
- // AMD / RequireJS
- if (window !== undefined
- && window.define !== undefined
- && window.define.amd !== undefined) {
- window.define(['jquery', 'lodash', 'omniture'], function ($, _) {
- return OmnitureHelper;
- });
- } else { // included directly via <script> tag
- window.OmnitureHelper = OmnitureHelper;
- }
-
- }());
-